Hysterese um einen Wert erstellen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
kiaralle
User
Beiträge: 68
Registriert: Donnerstag 19. August 2021, 19:11

Hallo,

ich hätte da mal wieder ein Problemchen.

Ich ermittele Messwerte (wert_xy).
Diese schalten dann ein Relais am Raspberry.
Damit ich etwas Ruhe in den Verlauf bekomme nicht bei jeder kurzzeitigen Abweichung sofort dan Schaltzustand der Relais ändere, bilde ich über statistics.mean(wert_xy) meine Mittelwerte.
wert_xy ist eine Liste in den zum Start 100 Nullen stehen. Das pendelt sich fix ein und funktioniert.

Mein Problem ist nun folgendes.

Code: Alles auswählen

    if ppv1_master_act >= int(slave_setup[0]) and vpv1_master_act >= int(slave_setup[1]) or summ_insel >= int(slave_setup[2]):
        GPIO.output(slave_invert, relais_ein)
        master_solo = 0
    else:
        GPIO.output(slave_invert, relais_aus)
        master_solo = 1

ppv1_master_act und vpv1_master_act sind meine Mittelwerte.
slave_setup[0] bis [2] sind die Vorgaben.

Gibt es eine Möglichkeit bei diesen Werten (ppv1_master_act und vpv1_master_act ) eine Hysterese zu integrieren, oder sollte ich einfach eine zeitlich Hysterese einbauen.
Habe beobachtet, daß diese Werte immer wieder eng an der Vorgabe liegen und das Relais ständig wild schaltet.

Ihr habt ja immer so schöne Ideen welche meinen Horizont erweitern.

Gruß Ralf
kiaralle
User
Beiträge: 68
Registriert: Donnerstag 19. August 2021, 19:11

Hab es erst einmal so gelöst.
wird wohl nicht einfacher und schöner gehen.

Code: Alles auswählen

    if ppv1_master_act >= int(slave_setup[0]) + int(slave_setup_hys[0]) and vpv1_master_act >= int(slave_setup[1]) + slave_setup_hys[1] or summ_insel >= int(slave_setup[2]):
        GPIO.output(slave_invert, relais_ein)
        master_solo = 0
    elif ppv1_master_act <= int(slave_setup[0]) - int(slave_setup_hys[0]) and vpv1_master_act <= int(slave_setup[1]) - int(slave_setup_hys[0]) or summ_insel >= int(slave_setup[2]):
        GPIO.output(slave_invert, relais_aus)
        master_solo = 1
    else:
        GPIO.output(slave_invert, relais_aus)
        master_solo = 1
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

Ja, das ist der Weg, wie man verhindert, dass das Relais ständig schaltet.
Die ganzen int-Aufrufe sollten überflüssig sein, zumal Du den Aufruf ja einmal vergessen hast, und es trotzdem funktioniert.
Der else-Block muß weg, weil Du ja sonst doch keinen Threshold hast.
Der Wert von master_solo sollte wohl True oder False sein.
Die Prüfung auf summ_insel sieht komisch aus, weil die in beiden if-Zweigen gleich ist.
Klarer wäre also:

Code: Alles auswählen

if summ_insel >= slave_setup[2]:
    # immer einschalten ?
    GPIO.output(slave_invert, relais_ein)
    master_solo = False
elif (ppv1_master_act >= slave_setup[0] + slave_setup_hys[0]
    and vpv1_master_act >= slave_setup[1] + slave_setup_hys[1])
    GPIO.output(slave_invert, relais_ein)
    master_solo = False
elif (ppv1_master_act <= slave_setup[0] - slave_setup_hys[0]
    and vpv1_master_act <= slave_setup[1] - slave_setup_hys[1])
    GPIO.output(slave_invert, relais_aus)
    master_solo = True
kiaralle
User
Beiträge: 68
Registriert: Donnerstag 19. August 2021, 19:11

Hi Sirius3,
die int() brauche ich, weil sonnst meckert.
Hatte ich nur vergessen.
Mus mal schauen ob ich die oben bereits integrieren kann.
Ich lese die Vorgabe-Werte aus einer CVS und die sind doch String.

Code: Alles auswählen

slave_setup = inverter_setup[1]
slave_setup_hys = inverter_setup[2]
Könnte ich das machen?
Ich teste mal

Code: Alles auswählen

slave_setup = int(inverter_setup[1])
slave_setup_hys = int(inverter_setup[2])

kiaralle
User
Beiträge: 68
Registriert: Donnerstag 19. August 2021, 19:11

TypeError: int() argument must be a string, a bytes-like object or a number, not 'list'

Funktioniert also so nicht.
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

Anscheinend ist ja slave_setup eine Liste, also muß wohl inverter_setup[1] auch eine Liste sein. Also mußt Du auf jedes Listenelement int anwenden.
Bei der Gelegenheit könntest Du auch gleich bessere Variablennamen finden und die kryptischen Indices loswerden.
Benutzeravatar
__blackjack__
User
Beiträge: 13117
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@kiaralle: Funktioniert wenn man das *einmal* nach dem einlesen macht, und nicht *jedes mal* wenn man den Zahlwert braucht immer wieder die gleichen Zeichenketten in die gleichen Zahlen umwandelt.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
kiaralle
User
Beiträge: 68
Registriert: Donnerstag 19. August 2021, 19:11

@__blackjack__

werd ich wohl angehen müssen. Sonst schaue ich in ein paar Monaten wieder was ich hier eigentlich so verzapft habe :-)
Antworten