Seite 1 von 2
MQTT - Wie nutzt openWB das genau?
Verfasst: So Apr 28, 2024 1:15 pm
von stefan_o
Hallo,
ich habe mich noch nie mit Mosquitto/MQTT beschäftigt und was ich dazu gelesen habe, scheint irgendwie nicht zu passen. Die openWB speichert die komplette Konfiguration darin? Aber das ist eigentlich ein Protokoll zum Austausch von Daten im IoT-Bereich?
So wie ich das verstanden habe, kann ein Gerät eine Nachricht an den Server senden, die über einen Pfad (topic?) adressiert wird, und alle Clients die diesen Pfad abonniert/subscribed haben bekommen die Nachricht. Das macht für mich irgendwie keinen Sinn, wie wird da eine Konfiguration gespeichert? Vor allem wie lese ich das aus wenn die sich nicht ändert? Was bedeutet "subscribed" genau, heißt das nichts anderes als ein Client verbindet sich mit dem Server und sagt "wenn auf /a/b/c was kommt informiere mich" und sobald der Client sich vom Server trennt ist diese "subcription" weg?
Zum Hintergrund: openWB kann leider nicht das PV-Laden mit Minimalstrom nachts abschalten. Die Idee ist einfach ein Hintergrunddienst zu starten, der die Konfiguration morgens/abends entsprechend ändert (z.B. mit Sonnenauf- bzw. untergang). Ich möchte da jetzt aber nicht einfach copy&paste irgendwelchen MQTT Code machen bis es irgendwie funktioniert, sondern sicherstellen das es sauber ist und nicht die MQTT-Datenbank(??) vollmüllt.
Kann mir jemand MQTT mal erläutern wie es von openWB genutzt wird? Gibt es eine Dokumentation über alle "topics" in der openWB? Gibt es eine Möglichkeit sich die MQTT-Datenbank anzeigen zu lassen bzw. in eine Textdatei zu schreiben (in der Konsole, nicht unbedingt im openWB-Interface)?
Viele Grüße
Stefan
Re: MQTT - Wie nutzt openWB das genau?
Verfasst: So Apr 28, 2024 1:28 pm
von Nasdero
Zu MQTT findest du sicher im Internet genaue Beschriebung wie es funioniert.
Ich z.B. schicke an "openWB/set/pv/7/get/power" die aktuelle PV Leistung aktive jede 4s hin. (die 7 ist mein Wechselrichter in der openWB)
Den Steckerstatu "aboniere" ich mit "openWB/chargepoint/5/get/plug_state", wenn sich der Status ändert, dann bekomme ich dann eine Meldung, MQTT schickt nur was raus, wenn sich was ändern, so sollte es sein. (Die 5 ist mein Ladepunkt)
Lade dir den mqtt explorer runter, gib dort die IP deiner openWB an und dann kannst du da schon einmal sehen was passiert. Es gibt auch ein Thema zu MQTT hier im Forum, eine Beschreibung gibt es da nicht für meines Wissens.
Du kannst auch nicht alle Werte beschreiben, viel sind "schreibgeschütz" damit du nicht die Konfig der openWB zerschießne kannst.
Ich beschreibe u.a. auch noch
viewtopic.php?p=107237#p107237
Re: MQTT - Wie nutzt openWB das genau?
Verfasst: So Apr 28, 2024 1:50 pm
von Gero
Ja, MQTT ist ein IoT-Ding. Aber andererseits kann man auch irgendwelche Datenpunkte drin speichern. Das macht die openWB zum Einen mit typischen IoT-Daten wie „verfügbarer Überschuss“ oder „Auto ist eingesteckt“ als auch mit seinen Konfigurationsdaten. Wenn du dich für irgendwelche Datenpunkte interssierst, abonnierst du sie und der Broker denkt an dich und schickt dir eine Message, wenn er sich ändert. Ist der Datenpunkt mit „retain“ gekennzeichnet, merkt sich der Broker auch den letzten Wert, um ihm Neuabonennten sofort zur Verfügung zu stellen.
Node Red ist ein ziemlich guter IoT-Verarbeiter. Damit kannst du ganz einfach den Mindeststrom beim PV-Laden nachts auf Null setzen.
viewtopic.php?t=4285
Re: MQTT - Wie nutzt openWB das genau?
Verfasst: So Apr 28, 2024 2:19 pm
von stefan_o
Gero hat geschrieben: ↑So Apr 28, 2024 1:50 pm
Node Red ist ein ziemlich guter IoT-Verarbeiter. Damit kannst du ganz einfach den Mindeststrom beim PV-Laden nachts auf Null setzen.
Alles was ich will ist ein kleines Python-Script direkt auf der openWB als Hintergrunddienst einrichten, das scheint mir das Gegenteil von "ganz einfach".
Nasdero hat geschrieben: ↑So Apr 28, 2024 1:28 pm
Lade dir den mqtt explorer runter, gib dort die IP deiner openWB an und dann kannst du da schon einmal sehen was passiert. Es gibt auch ein Thema zu MQTT hier im Forum, eine Beschreibung gibt es da nicht für meines Wissens.
Ok, so wie ich das verstehe: Ich müsste "openWB/chargepoint/get/power" abonieren um zu sehen ob aktuell geladen wird und "openWB/set/vehicle/template/charge_template/0/chargemode/pv_charging/min_current" setzen (wobei die 0 durch das entsprechende Ladeprofil ersetzt wird).
Kann das abonnieren den Server irgendwie vollmüllen wenn ich das wiederholt mache, oder ist das automatisch weg wenn sich der Client trennt? Für mich klingt "abonnieren" so dauerhaft/persistent
Re: MQTT - Wie nutzt openWB das genau?
Verfasst: So Apr 28, 2024 2:32 pm
von Gero
stefan_o hat geschrieben: ↑So Apr 28, 2024 2:19 pm
Gero hat geschrieben: ↑So Apr 28, 2024 1:50 pm
Node Red ist ein ziemlich guter IoT-Verarbeiter. Damit kannst du ganz einfach den Mindeststrom beim PV-Laden nachts auf Null setzen.
Alles was ich will ist ein kleines Python-Script direkt auf der openWB als Hintergrunddienst einrichten, das scheint mir das Gegenteil von "ganz einfach".
Das würde ich auch so sehen. Deshalb ja der Tipp mit dem node Red. Da ist es wirklich einfach.
Ok, so wie ich das verstehe: Ich müsste "openWB/chargepoint/get/power" abonieren um zu sehen ob aktuell geladen wird und "openWB/set/vehicle/template/charge_template/0/chargemode/pv_charging/min_current" setzen (wobei die 0 durch das entsprechende Ladeprofil ersetzt wird).
Du bräuchtest auch noch die Information „tag/nacht“ oder kuckst auf die seit x Minuten anliegende PV-leistung.
Kann das abonnieren den Server irgendwie vollmüllen wenn ich das wiederholt mache, oder ist das automatisch weg wenn sich der Client trennt? Für mich klingt "abonnieren" so dauerhaft/persistent
Das ist ja nun die Aufgabe des MQTT-Brokers, dafür ist er ja programmiert worden. Wenn der selbe Client zweimal das selbe abonniert, sollte das der Broker mitbekommen. Ausserdem schickt ein Client seinem Broker ein „Tschüss“, wenn er normal terminiert wird.
Re: MQTT - Wie nutzt openWB das genau?
Verfasst: So Apr 28, 2024 2:54 pm
von Nasdero
stefan_o hat geschrieben: ↑So Apr 28, 2024 2:19 pm
Ok, so wie ich das verstehe: Ich müsste "openWB/chargepoint/get/power" abonieren um zu sehen ob aktuell geladen wird und "openWB/set/vehicle/template/charge_template/0/chargemode/pv_charging/min_current" setzen (wobei die 0 durch das entsprechende Ladeprofil ersetzt wird).
"openWB/chargepoint/get/power" => keine Ahnung was da drin steht, Power über alle Ladepunkte?
"openWB/chargepoint/5/get/power" => Wirkleistung meines Ladepunkt.
"openWB/chargepoint/5/get/evse_current" => Ladestromvorgabe
https://smarthome-blogger.de/blog/tutor ... t-tutorial
Wir machen das über node-red, da wir eh das ganze Haus damit steuern. Wo läuft denn bei dir die openWB Software? Auf der openWB-series2? Da willst du dann das python script installieren?
Re: MQTT - Wie nutzt openWB das genau?
Verfasst: So Apr 28, 2024 4:31 pm
von stefan_o
Gero hat geschrieben: ↑So Apr 28, 2024 2:32 pm
Das würde ich auch so sehen. Deshalb ja der Tipp mit dem node Red. Da ist es wirklich einfach.
Und was wirft diese Entwicklungsumgebung nachher aus? Python?
Du bräuchtest auch noch die Information „tag/nacht“ oder kuckst auf die seit x Minuten anliegende PV-leistung.
Da habe ich das Paket suntime genommen, das kann Sonnenauf- bzw. untergang ausrechnen
Nasdero hat geschrieben: ↑So Apr 28, 2024 2:54 pm
Wir machen das über node-red, da wir eh das ganze Haus damit steuern. Wo läuft denn bei dir die openWB Software? Auf der openWB-series2? Da willst du dann das python script installieren?
Ja, direkt auf der openWB-series2.
Scheint auch zu funktionieren, schreibe noch eine systemd-unit und dann sollte das hoffentlich gehen:
Code: Alles auswählen
#!/usr/bin/env python3
import syslog
import time
from datetime import datetime, timedelta, timezone
from paho.mqtt import client as mqtt_client
from suntimes import SunTimes
#### config
# hier ortswerte eintragen
latitude = 51
longitude = 11
# welche ladeprofile gesetzt werden sollen
profiles = [ 0 ]
#### end config
mqtthost = "localhost"
mqttport = 1886
mqttclient = "pv-min-adjust"
min_current = None
charge_power = 0.0
client = None
def get_current_start_time() -> float:
now = datetime.now(timezone.utc)
now = now.replace(hour = 7, minute = 0, second = 0, microsecond = 0) # start at 7:00 UTC
return now.timestamp()
def get_current_end_time() -> float:
try:
sun = SunTimes(longitude, latitude)
now = datetime.now(timezone.utc)
ss = sun.setutc(now).replace(tzinfo=timezone.utc)
return ss.timestamp()
except Exception as ex:
syslog.syslog(syslog.LOG_NOTICE, "pv-min-adjust: Konnte Sonnenuntergang nicht ermitteln, setze 18 Uhr UTC: "+str(ex))
now = datetime.now(timezone.utc)
now = now.replace(hour = 18, minute = 0, second = 0, microsecond = 0)
return now.timestamp()
def connect_mqtt() -> mqtt_client:
FIRST_RECONNECT_DELAY = 1
RECONNECT_RATE = 2
MAX_RECONNECT_COUNT = 12
MAX_RECONNECT_DELAY = 60
def on_connect(client, userdata, flags, rc):
if rc != 0:
syslog.syslog(syslog.LOG_NOTICE, "pv-min-adjust: konnte nicht mit MQTT broker verbinden" +str(rc))
def on_disconnect(client, userdata, rc):
syslog.syslog(syslog.LOG_NOTICE, "pv-min-adjust: Disconnected with result code: "+str(rc))
reconnect_count, reconnect_delay = 0, FIRST_RECONNECT_DELAY
while reconnect_count < MAX_RECONNECT_COUNT:
syslog.syslog(syslog.LOG_NOTICE, "pv-min-adjust: Reconnecting in "+str(reconnect_delay)+" seconds...")
time.sleep(reconnect_delay)
try:
client.reconnect()
syslog.syslog(syslog.LOG_NOTICE, "pv-min-adjust: Reconnected successfully!")
return
except Exception as err:
syslog.syslog(syslog.LOG_NOTICE, "pv-min-adjust: "+str(err)+". Reconnect failed. Retrying...")
reconnect_delay *= RECONNECT_RATE
reconnect_delay = min(reconnect_delay, MAX_RECONNECT_DELAY)
reconnect_count += 1
syslog.syslog(syslog.LOG_NOTICE, "pv-min-adjust: Reconnect failed after "+str(reconnect_count)+" attempts. Exiting...")
client = mqtt_client.Client(mqttclient)
client.on_connect = on_connect
client.on_disconnect = on_disconnect
client.connect(mqtthost, mqttport)
return client
def reveice_msg(client, userdata, msg):
if msg.topic == "openWB/chargepoint/get/power":
charge_power = float(msg.payload.decode())
def set_min_current(c: int):
for p in profiles:
r = client.publish("openWB/set/vehicle/template/charge_template/"+str(p)+"/chargemode/pv_charging/min_current", c)
if r[0] == 0:
min_current = c
else:
syslog.syslog(syslog.LOG_NOTICE, "pv-min-adjust: Konnte Mindeststrom über MQTT nicht setzen")
client = connect_mqtt()
client.subscribe("openWB/chargepoint/get/power")
client.on_message = reveice_msg
client.loop_start()
while True:
try:
t_start = get_current_start_time()
t_end = get_current_end_time()
t_now = time.time()
if charge_power > 0.0 and t_now < t_end and min_current != 6:
set_min_current(6)
elif t_now > t_start and t_now < t_end and min_current != 6:
set_min_current(6)
elif t_now >= t_end and min_current != 0:
set_min_current(0)
time.sleep(120)
except Exception as err:
syslog.syslog(syslog.LOG_NOTICE, "pv-min-adjust: problem occured: "+str(err)+". Restarting...")
break
client.loop_stop()
systemd:
Code: Alles auswählen
[Unit]
Description=openWB PV charging minimum adjust
After=syslog.target network.target multi-user.target mosquitto.service
[Service]
ExecStart=/usr/local/bin/pv-min-adjust.py
User=openwb
Restart=on-failure
KillMode=mixed
[Install]
WantedBy=multi-user.target
Edit: Fehler im Skript korrigiert
Edit 2: Das suntime Paket funktioniert nicht zuverlässig, ersetzt durch suntimes, das funktioniert wesentlich besser
Re: MQTT - Wie nutzt openWB das genau?
Verfasst: So Apr 28, 2024 5:41 pm
von Gero
stefan_o hat geschrieben: ↑So Apr 28, 2024 4:31 pm
Und was wirft diese Entwicklungsumgebung nachher aus? Python?
Das ist keine Entwicklungsumgebung, das ist das runtime. Kuck‘ dir mal meinem verlinkten Artikel an. Wenn du magst, klick‘ ich dir morgen mal einen Flow (so heißen die Programme in node red)
Dadurch dass das das runtime ist, muss du dich auch nicht um systemd und sowas kümmern, damit da immer einer horcht ob was kommt. Das macht alles das runtime out-of-the-box.
Re: MQTT - Wie nutzt openWB das genau?
Verfasst: So Apr 28, 2024 8:14 pm
von stefan_o
Gero hat geschrieben: ↑So Apr 28, 2024 5:41 pm
stefan_o hat geschrieben: ↑So Apr 28, 2024 4:31 pm
Und was wirft diese Entwicklungsumgebung nachher aus? Python?
Das ist keine Entwicklungsumgebung, das ist das runtime. Kuck‘ dir mal meinem verlinkten Artikel an. Wenn du magst, klick‘ ich dir morgen mal einen Flow (so heißen die Programme in node red)
Dadurch dass das das runtime ist, muss du dich auch nicht um systemd und sowas kümmern, damit da immer einer horcht ob was kommt. Das macht alles das runtime out-of-the-box.
Aber die Runtime muss ja auch irgendwo laufen, ich weiß nicht ob die openWB mit dem RasPi 3 da genug Ressourcen hat und es auch zu keinen Konflikten bei den Abhängigkeiten kommt.
Für komplexere Anforderungen ist das sicher das Mittel der Wahl.
Re: MQTT - Wie nutzt openWB das genau?
Verfasst: Mo Apr 29, 2024 6:16 am
von Gero
Ja, das muss irgendwo laufen. Bei mir auf der homematic ccu. Bei anderen auf einem NAS oder direkt auf einem Raspi. Die meisten mit einer openWB kommen auch nicht an das Linux untendrunter dran. Es wurde hier auch schon einmal der Wunsch geäußert, bei der openWB auch ein node red mitzuliefern, aus dem aber bislang noch nicht geworden ist.