S0-Zähler über MQTT abfragen

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Antworten
andorianju
Beiträge: 17
Registriert: 21. Dez 2016 18:29
Answers: 0

S0-Zähler über MQTT abfragen

Beitrag von andorianju »

Hallo,

ich habe ein Problem mit dem Auslesen von Zählerwerten über einen mqtt-broker. Ich nutze OH 2.5.12 und den mosquitto -broker in einer Suse-Linux-VM. Den broker nutze ich auch zum schalten von sonoff-scchaltern. Nun habe ich den So-Zähler installiert und bis zum broker kommen die Daten auch an (Kann ich mit MQTT.fx sehen). Ich habe erst einmal nur ein item angelegt:

Code: Alles auswählen

String  WLANAdapterS01    "WLAN S0-Adapter 1"      { mqtt="<[mosquitto:S0Counter/tele/SENSOR:state:default]" }
Aber hier kommt leider nichts an. Stecke leider nicht so tief in der Materie und bin oft auf erfolgreiches kopieren von Beispielen und herum-probieren angewiesen. Was mache ich falsch?

Gruß Andreas

Benutzeravatar
sihui
Beiträge: 1827
Registriert: 11. Apr 2018 19:03
Answers: 21

Re: S0-Zähler über MQTT abfragen

Beitrag von sihui »

andorianju hat geschrieben: 15. Apr 2021 17:24 Was mache ich falsch?
Du gibst leider zu wenig Informationen um das erkennen zu können.
Welche openHAB Version nutzt du? Welche MQTT Binding Version?
Deine Binding Definition ist von einem MQTT1 Binding, das gibt es schon lange nicht mehr.
Wenn du openHAB2 nutzt kannst du theoretisch noch das MQTT1 Binding nutzen, ist aber nicht zu empfehlen.
Wenn du openHAB3 nutzt gibt es nur noch das neue MQTT Binding, da brauchst du dann ein Broker Thing (eine Bridge), ein generisches Thing, und für das generische Thing brauchst du Channel und Items, die beides miteinander verknüpfen.

https://www.openhab.org/addons/bindings/mqtt.generic/
https://www.openhab.org/addons/bindings/mqtt/

Außerdem gibt meistens die S0 Schnittstelle eine Zahl als Number aus, und keinen String.
openHAB3 mit Zwave, Alexa, ESPEasy, MQTT, Logitech Harmony, Philips HUE und ZigBee Hardware auf Proxmox VE.

andorianju
Beiträge: 17
Registriert: 21. Dez 2016 18:29
Answers: 0

Re: S0-Zähler über MQTT abfragen

Beitrag von andorianju »

Hallo sihui,

danke für Deine Antwort. Ich nutze OpenHAB 2.5.12 und das entsprechende MQTT-Binding (2.5.12). Ich habe die Definition aus einem Beispiel-Listing des Lieferanten (CMatic) übernommen. Das ist wahrscheinlich auch das Problem. Der Zähler hat vier S0-Schnittstellen und liefert die Werte tatsächlich in einem String.

Code: Alles auswählen

{"Time":"2021-04-15T18:07:15","COUNTER":{"C1":15447,"C2":619,"C3":0,"C4":0}}
Ich habe eine Bridge im System, da ich damit ja erfolgreich ein Sonoff 4-Kanal-Switch bdiene. Ich versuche dann mal alles über PaperUI zu definieren. Die Migration zu OH3 habe ich bisher gescheut, da ich eine sehr umfangreiche Installation habe und mit dem neuen Konzept noch nicht ganz Warm bin. Alles zu seiner Zeit.

Benutzeravatar
sihui
Beiträge: 1827
Registriert: 11. Apr 2018 19:03
Answers: 21

Re: S0-Zähler über MQTT abfragen

Beitrag von sihui »

andorianju hat geschrieben: 15. Apr 2021 18:08 und das entsprechende MQTT-Binding (2.5.12).
Okay, dann wäre die kurze Variante:

Generic Thing anlegen für deinen S0 Zähler, mit der vorhandenen funktionierenden Bridge verbinden, ein String/Text Channel Type anlegen, als MQTT State Topic das aus mqtt.fx ausgelesene Topic eintragen, diesen Channel mit einem String Item verbinden und dann das Item auf einer Sitemap oder Page darstellen.

Um die verschiedenen Kanäle aus dem String auszulesen brauchst du dann noch eine Transformation. Diese muss dann für vier verschiedene Items für vier S0 Kanäle angelegt werden.
https://www.openhab.org/docs/configurat ... formations

Die Konfiguration aus deinem ersten Post ist somit falsch und unbrauchbar.

Good luck.
openHAB3 mit Zwave, Alexa, ESPEasy, MQTT, Logitech Harmony, Philips HUE und ZigBee Hardware auf Proxmox VE.

Benutzeravatar
udo1toni
Beiträge: 15271
Registriert: 11. Apr 2018 18:05
Answers: 245
Wohnort: Darmstadt

Re: S0-Zähler über MQTT abfragen

Beitrag von udo1toni »

Was mich ja immer fasziniert ;) wenn man schon eine funktionierende Anbindung hat (die logischerweise komplett anders konfiguriert wurde) warum merkt man dann nicht, dass die Konfiguration so ganz anders aussieht als beim funktionierenden Teil?
openHAB4.3.6 stable in einem Debian-Container (bookworm) (Proxmox 8.4.1, LXC), mit openHABian eingerichtet

andorianju
Beiträge: 17
Registriert: 21. Dez 2016 18:29
Answers: 0

Re: S0-Zähler über MQTT abfragen

Beitrag von andorianju »

Was mich ja immer fasziniert ;) wenn man schon eine funktionierende Anbindung hat (die logischerweise komplett anders konfiguriert wurde) warum merkt man dann nicht, dass die Konfiguration so ganz anders aussieht als beim funktionierenden Teil?
Entschuldige meine Unwissenheit. In der funktionierenden Variante schalte ich nur einen Sonoff-Schalter. In der neuen Variante möchte ich einen Zähler auslesen. Damit bin ich einigermaßen überfordert und habe erst einmal die vorgeschlagene (,wie ich jetzt weiß, veraltete) Konfiguration kopiert. Nun habe ich nach sihuis Hinweisen die items auch in PaperUI angelegt und ich bekomme die Zähler ausgelesen. Das Umrechnen der reinen Zählerwerte klappt dann wiederum nicht, weil wahrscheinlich auch hier nicht mehr funktionierende Funktionen benutzt wereden:

Code: Alles auswählen

rule "Regel zur Energiemessung durch WLAN-Adapter mit 4 x S0 -Schnittstellen"
when
    Item WLANAdapterS01 received update    // 4 neue Zählerimpulswerte pro Messintervall via WLAN-Adapter MQTT
then

    // 4 Zählerimpulswerte aus MQTT-Nachricht filtern und speichern
    S0Zaehler11.postUpdate(transform("JSONPATH", "$.COUNTER.C1", WLANAdapterS01.state.toString))
    S0Zaehler12.postUpdate(transform("JSONPATH", "$.COUNTER.C2", WLANAdapterS01.state.toString))
    //S0Zaehler13.postUpdate(transform("JSONPATH", "$.COUNTER.C3", WLANAdapterS01.state.toString))
    //S0Zaehler14.postUpdate(transform("JSONPATH", "$.COUNTER.C4", WLANAdapterS01.state.toString))

    //  Leistung in Watt = (Delta der gemessene Zählerimpulse zwischen den letzten Messzeitpunkten / Messintervall Sec) * (1000 W * 3600 Sec / Zählerimpulse des Zählers für kWh)
    Leistung11.postUpdate((S0Zaehler11.deltaSince(now) as Number / Messintervall.state as Number) * (3600000 / Imp_kWh.state as Number))
    Leistung12.postUpdate((S0Zaehler12.deltaSince(now) as Number / Messintervall.state as Number) * (3600000 / Imp_kWh.state as Number))
    //Leistung13.postUpdate((S0Zaehler13.deltaSince(now) as Number / Messintervall.state as Number) * (3600000 / Imp_kWh.state as Number))
    //Leistung14.postUpdate((S0Zaehler14.deltaSince(now) as Number / Messintervall.state as Number) * (3600000 / Imp_kWh.state as Number))

    //  Energie in kWh = Energie + Delta der gemessene Zählerimpulse zwischen den letzten Messzeitpunkten * kWh / Zählerimpulse des Zählers für kWh
    Energie11.postUpdate(S0Zaehler11.state as Number / Imp_kWh.state as Number)
    Energie12.postUpdate(S0Zaehler12.state as Number / Imp_kWh.state as Number)
    //Energie13.postUpdate(S0Zaehler13.state as Number / Imp_kWh.state as Number)
    //Energie14.postUpdate(S0Zaehler14.state as Number / Imp_kWh.state as Number)

    //  Energie pro Tag (kWh)
    Energie11Day.postUpdate(Energie11.deltaSince(now.withTimeAtStartOfDay) as Number)
    Energie12Day.postUpdate(Energie12.deltaSince(now.withTimeAtStartOfDay) as Number)
    //Energie13Day.postUpdate(Energie13.deltaSince(now.withTimeAtStartOfDay) as Number)
    //Energie14Day.postUpdate(Energie14.deltaSince(now.withTimeAtStartOfDay) as Number)

end
die Items:

Code: Alles auswählen

Group     Energie             "Energie"
Number    Energie11           "Energie 11 (kWh)[%.3f kWh]"                    (Energie)
Number    Energie12           "Energie 12 (kWh)[%.3f kWh]"                    (Energie)
//Number    Energie13           "Energie 13 (kWh)[%.3f kWh]"                    (Energie)
//Number    Energie14           "Energie 14 (kWh)[%.3f kWh]"                    (Energie)

Group     EnergieDay          "Energie pro Tag"
Number    Energie11Day        "Energie 11 / Tag (kWh)[%.3f kWh]"              (EnergieDay)
Number    Energie12Day        "Energie 12 / Tag (kWh)[%.3f kWh]"              (EnergieDay)
//Number    Energie13Day        "Energie 13 / Tag (kWh)[%.3f kWh]"              (EnergieDay)
//Number    Energie14Day        "Energie 14 / Tag (kWh)[%.3f kWh]"              (EnergieDay)

Group     Leistung            "Leistung"
Number    Leistung11          "Leistung 11 (W)[%d W]"                         (Leistung)
Number    Leistung12          "Leistung 12 (W)[%d W]"                         (Leistung)
//Number    Leistung13          "Leistung 13 (W)[%d W]"                         (Leistung)
//Number    Leistung14          "Leistung 14 (W)[%d W]"                         (Leistung)

Group     EnergieZaehlerS0    "Alle S0-Zähler"
Number    S0Zaehler11         "S0-Zähler 11   [%d]"                           (EnergieZaehlerS0)
Number    S0Zaehler12         "S0-Zähler 12   [%d]"                           (EnergieZaehlerS0)
//Number    S0Zaehler13         "S0-Zähler 13   [%d]"                           (EnergieZaehlerS0)
//Number    S0Zaehler14         "S0-Zähler 14   [%d]"                           (EnergieZaehlerS0)

Number    Imp_kWh             "Zählerimpulse pro kWh [%d]"
Number    Messintervall       "Messintervall Sec. [%d]"                        // WLAN Adapter Konsolenkommando: Teleperiod 120 -> setzt Messintervall auf 120 Sekunden
Wäre nett, wenn ihr mir da auch auf die Sprünge helfen könntet.

Danke und Gruß
Andreas

Antworten