@floycion:
Ich glaube jetzt hab ich die (eine) Lösung!
Meine Zeit wo ich mal was programmieren (musste) liegen 20 Jahre zurück, daher bitte um Entschuldigung, wenn das "falsch" oder "unschön" ist, aber zumindest bei mir scheint es so zu funktionieren:
Code: Alles auswählen
def on_message(client, userdata, msg):
global charging
global pluggedEvent
if (msg.topic == "openWB/chargepoint/7/get/charge_state"):
if (str(msg.payload.decode("utf-8")) == 'false'): # Stopped
log.info("Charging stopped")
charging = False
else:
log.info("Charging started")
charging = True
if (msg.topic == "openWB/chargepoint/7/get/plug_state"):
if (str(msg.payload.decode("utf-8")) == 'false'): # Unplugged
log.info("Unplugged")
pluggedEvent = 0
else:
log.info("Plugged")
pluggedEvent = 6
Zur Erklärung:
Ich habe erstmal versucht rauszufinden, was da vom MQTT kommt und dabei fiel mir auf, dass da nicht einfach nur false kommt, sondern eben b'false'
Habe dann rausgefunden, dass dieses b vorne für byte steht. Man muss also erstmal konvertieren. Das mache ich jetzt wie oben zu sehen mit decode("utf-8").
Das hab ich mir erstmal auch wieder ausgeben lassen und gesehen, dass nun wirklich nur noch false zurück kommt. Da dies in dem fall (nach meinem Verständnis) gar nix mit bool zu tun hat, sondern einfach nur ein Text (also String ist) muss man entsprechend mit str() arbeiten.
Bitte mal testen.
Anbei nochmal die vollständige evsoc.py
(Bitte dran denken ggfs die Ladepunkt ID wieder anzupassen)
Wenn das soweit klappt würde ich die Tage mal versuchen die Variablen (z.b. die Ladepunkt ID) auch noch in die config.yaml auszulagern, damit man auch künftig wieder nur noch die anpassen muss und nicht in der evsoc.py "rumpfuschen" muss.
P.S.:
Die Funktionsweise hab ich jetzt auch etwas besser verstanden (glaube ich):
Beim Start wird auf jeden Fall einmal der SOC versucht abzurufen. Wenn plug_state und charge_state false sind wird dann nicht mehr abgerufen.
Ist plug_state hingegen true (bzw einfach nur nicht false) wird pluggedEvent auf 6 gesetzt.
Im Anschluss wird wieder versucht den SOC anzurufen. Klappt das gehts weiter, klappt es nicht wird pluggedEvent um 1 reduziert.
So ist pluggedEvent nach ein paar Durchläufen dann 0 oder kleiner 0 und es werden keine Abfragen mehr gemacht.
Beginnt nun die Ladung wird charging auf True gesetzt und somit startet der Abruf des SOC wieder der nun (weil die Steuergeräte ja an gehen) funktioniert.
Vielleicht kann das ja jemand noch kommentieren.
P.P.S:
Ich hab das auch im Logging nochmal nachverfolgt. Mit der alten Version war "angeblich" charging immer true und daher ging der Abruf weiter, obwohl der pluggedEvent Wert runter ging.
Mit der Version jetzt hört er dann auf mit den Abrufen, sobald pluggedEvent <=0 ist
Bin also wirklich guter Dinge, dass das nun so passt.