MQTT-Werte trennen und darstellen

Begonnen von Knallfrosch, 30 März 2022, 17:13:06

Vorheriges Thema - Nächstes Thema

Knallfrosch

Hallo,

ich habe 2 Devices (ESP mit Tasmota) die mir Analogwerte per MQTT an FHEM übermitteln.

Zum einen dieses:

Internals:
   FUUID      5da6ce0e-f33f-a358-478f-4c84583c70ac3148
   IODev      myBroker
   NAME       Sonoff_Pow_Messung
   NR         269
   STATE      Leistung aktuell: 59.00 Watt <br> Ertrag Heute: 13.691 kWh <br> Ersparnis Heute:  3.63 EUR<br> Ertrag Gesamt: 1635.93 kWh <br> Ersparnis Gesamt: 433.68 EUR
   STILLDONETIME 0
   TYPE       MQTT_DEVICE
   READINGS:
     2022-03-30 17:04:58   ENERGY_ApparentPower 61
     2022-03-30 17:04:58   ENERGY_Current  0.256
     2022-03-30 17:04:58   ENERGY_Factor   0.97
     2022-03-30 17:04:58   ENERGY_Period   5
     2022-03-30 17:04:58   ENERGY_Power    59
     2022-03-30 17:04:58   ENERGY_ReactivePower 15
     2022-03-30 17:04:58   ENERGY_Today    13.691
     2022-03-30 17:04:58   ENERGY_Total    1635.927
     2022-03-30 17:04:58   ENERGY_TotalStartTime 2019-01-11T17:25:38
     2022-03-30 17:04:58   ENERGY_Voltage  239
     2022-03-30 17:04:58   ENERGY_Yesterday 0.672
     2022-03-30 17:04:58   Time            1970-01-01T00:40:32
     2022-03-30 17:04:58   sensor          {"Time":"1970-01-01T00:40:32","ENERGY":{"TotalStartTime":"2019-01-11T17:25:38","Total":1635.927,"Yesterday":0.672,"Today":13.691,"Period":5,"Power":59,"ApparentPower":61,"ReactivePower":15,"Factor":0.97,"Voltage":239,"Current":0.256}}
     2022-03-30 16:24:32   state           ON
     2022-03-30 17:04:58   transmission-state incoming publish received
   message_ids:
   publishSets:
     :
       topic      cmnd/Sonoff_Pow_Messung/POWER
       values:
         ON
         OFF
   sets:
     OFF       
     ON         
   subscribe:
     stat/Sonoff_Pow_Messung/STATUS
     tele/Sonoff_Pow_Messung/SENSOR
     stat/Sonoff_Pow_Messung/POWER
   subscribeExpr:
     ^stat\/Sonoff_Pow_Messung\/STATUS$
     ^tele\/Sonoff_Pow_Messung\/SENSOR$
     ^stat\/Sonoff_Pow_Messung\/POWER$
   subscribeQos:
     stat/Sonoff_Pow_Messung/POWER 0
     stat/Sonoff_Pow_Messung/STATUS 0
     tele/Sonoff_Pow_Messung/SENSOR 0
   subscribeReadings:
     stat/Sonoff_Pow_Messung/POWER:
       cmd       
       name       state
     stat/Sonoff_Pow_Messung/STATUS:
       cmd       
       name       Status
     tele/Sonoff_Pow_Messung/SENSOR:
       cmd       
       name       sensor
Attributes:
   IODev      myBroker
   devStateIcon ON:FS20.on:OFF OFF:FS20.off:ON
   group      2_Solar
   publishSet ON OFF cmnd/Sonoff_Pow_Messung/POWER
   room       Verbrauch
   stateFormat {sprintf

("Leistung aktuell: %.2f Watt <br> Ertrag Heute: %.3f kWh <br> Ersparnis Heute:  %.2f EUR<br> Ertrag Gesamt: %.2f kWh <br> Ersparnis Gesamt: %.2f EUR" ,

ReadingsVal("Sonoff_Pow_Messung","ENERGY_Power",0),
ReadingsVal("Sonoff_Pow_Messung","ENERGY_Today",0),
ReadingsVal("Sonoff_Pow_Messung","ENERGY_Today",0)*26.51/100,
ReadingsVal("Sonoff_Pow_Messung","ENERGY_Total",0),
ReadingsVal("Sonoff_Pow_Messung","ENERGY_Total",0)*26.51/100,

)
}

   subscribeReading_Status stat/Sonoff_Pow_Messung/STATUS
   subscribeReading_sensor tele/Sonoff_Pow_Messung/SENSOR
   subscribeReading_state stat/Sonoff_Pow_Messung/POWER
   userattr   subscribeReading_state subscribeReading_status


Dort werden die übermittelten Analogwerte aus dem Reading sensor in einzelne Readings aufgetrennt: Energy_Power / Energy_Current usw.

Das funktioniert auch alles!

Nun wollte ich das gleiche mit dem weiteren Device machen.
Aber das klappt nicht.


Internals:
   CFGFN     
   FUUID      62446ae9-f33f-a358-8e56-8f4087bfe9f9ecea
   IODev      myBroker
   NAME       Lesekopf
   NR         456
   STATE      ???
   TYPE       MQTT_DEVICE
   READINGS:
     2022-03-30 17:07:31   Verbrauch       {"Time":"2022-03-30T16:07:31","Zaehler":{"Meter_Number":"0a014150410100e4ea24","ELZ_PV_1.8.0":39.0,"ELZ_PV_2.8.0":4.0}}
     2022-03-30 17:07:31   transmission-state incoming publish received
   message_ids:
   publishSets:
   sets:
               
   subscribe:
     tele/Lesekopf/SENSOR
   subscribeExpr:
     ^tele\/Lesekopf\/SENSOR$
   subscribeQos:
     tele/Lesekopf/SENSOR 0
   subscribeReadings:
     tele/Lesekopf/SENSOR:
       cmd       
       name       Verbrauch
Attributes:
   IODev      myBroker
   room       Verbrauch
   subscribeReading_Verbrauch tele/Lesekopf/SENSOR


Die Werte kommen zwar im Reading Verbrauch an.
Aber ich würde diese 3 Werte wie Zählernummer, Bezug und Einspeisung gerne als einzelne seperate Readings darstellen.


Und genau an diesem Punkt komme ich nicht weiter und finde keine Lösung.

Verstehe auch nicht, warum es bei meinem anderen Device funktioniert. Kann mich auch nicht erinnern das es da Probleme gab.



Vielen Dank für eure Hilfe.



Grüße
-FHEM auf Raspm B+ mit FHEM2FHEM auf einem weiteren Rasp B+
-LaCrosse über Jeelink-Clone und diverses HM über HM-USB.
-S0-Stromzähler und Reed-Gaszähler

Beta-User

Zitat von: Knallfrosch am 30 März 2022, 17:13:06
Verstehe auch nicht, warum es bei meinem anderen Device funktioniert. Kann mich auch nicht erinnern das es da Probleme gab.
Da du MQTT_DEVICE im Einsatz hast (und nicht MQTT2_DEVICE, in dem das Auspacken von JSON-Payloads automatisch geht), müßte es irgendwo ein expandJSON geben, das diesen Teil im (für den) anderen Teil übernimmt.

list TYPE=expandJSON
sollte alles vielleicht Passende anzeigen.
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

DetlefR

Hallo

Zitat
NAME       Sonoff_Pow_Messung
subscribeReading_sensor tele/Sonoff_Pow_Messung/SENSOR

Zitat
NAME       Lesekopf
subscribeReading_Verbrauch tele/Lesekopf/SENSOR

Mach es so wie Beta-User geschrieben hat. Suche nach expandJSON und passe es an, so dass es auch auf das zweite Device reagiert. Oder, benenne das zweite so um, dass expandJSON auch darauf reagiert. Find ich günstiger.

Knallfrosch

Hallo,

evtl. könnte mit diese Hilfe schon ausreichen.

list TYPE=expandJSON

ergibt:

Internals:
   DEF        Sonoff_Pow_Messung.*:.*:.{.*}
   FUUID      5da6ce0e-f33f-a358-8bff-e32a53a7442f1eb2
   NAME       ej3
   NOTIFYDEV  Sonoff_Pow_Messung.*
   NR         270
   NTFY_ORDER 50-ej3
   STATE      2022-03-30 19:05:28
   TYPE       expandJSON
   s_regexp   Sonoff_Pow_Messung.*:.*:.{.*}
   t_regexp   .*
   version    1.13
   READINGS:
     2022-03-30 16:33:07   state           active
   helper:
Attributes:
   room       Verbrauch



Glaube daraus kann ich mir was bauen, dass es dann auch auf das neue Device passt.
Werde ich mir mal morgen in Ruhe anschauen und mich nochmal melden.....entweder mit einer Erfolgsmeldung oder mit neuen Fragen.


Danke euch.


Grüße
-FHEM auf Raspm B+ mit FHEM2FHEM auf einem weiteren Rasp B+
-LaCrosse über Jeelink-Clone und diverses HM über HM-USB.
-S0-Stromzähler und Reed-Gaszähler

DetlefR


Quick and dirty.
Aus Sonoff_Pow_Messung.* wird (Lesekopf|Sonoff_Pow_Messung.*)

Besser ist es aber über eine vernünftige Namenskonvention für die Geräte nachzudenken. Das vereinfacht die Definition.

Beta-User

Zitat von: DetlefR am 30 März 2022, 19:33:01
Quick and dirty.
Aus Sonoff_Pow_Messung.* wird (Lesekopf|Sonoff_Pow_Messung.*)
...das kann aber dazu führen, dass kein NOTIFYDEF ermittelt werden kann... (ungeprüft)

Außerdem ist da eine "unsecaped left brace"... => Perl-upgrade auf 5.32 => crash...?

Sauber und nachhaltig: Umstellung auf MQTT2_DEVICE ;) .
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

Knallfrosch

Hallo,

gut das ich hier nochmal reingeschaut habe, bevor ich mit dem basteln angefangen habe.

Also (auch wenn ich nicht so ganz verstehe warum) werde ich zumindest mal das neue Device (den Leskopf am Stromzähler) also MQTT2 definieren.


Das habe ich nun auch soweit gemacht.
Aber ich schaffe es nicht, die Daten mit dem neuen Device zu verbinden:

Viel ist es noch nicht:

Internals:
   CFGFN     
   DEVICETOPIC Zaehler_Lesekopf
   FUUID      6245bc75-f33f-a358-ac49-37eb31fb3ed9625c
   NAME       Zaehler_Lesekopf
   NR         613
   STATE      ???
   TYPE       MQTT2_DEVICE
Attributes:
   room       Verbrauch



In dem ursprunglichen MQTT-Device war das ja so gelöst:

subscribeReading_Verbrauch  tele/Lesekopf/SENSOR

Dieses Attribut gibt es ja bei MQTT2 nicht mehr.

Beim vermeintlich benötigten Attribut "ReadingsList" um die Werte darstellen zu können komme ich nicht weiter.

Kann mir da bitte jemand weiterhelfen?

Vielen Dank.


Grüße


-FHEM auf Raspm B+ mit FHEM2FHEM auf einem weiteren Rasp B+
-LaCrosse über Jeelink-Clone und diverses HM über HM-USB.
-S0-Stromzähler und Reed-Gaszähler

Beta-User

Vermutlich solltest du "autocreate" am MQTT2_CLIENT (den du vermutlich im Einsatz hast?) anschalten oder einen MQTT2_SERVER auf einem anderen Port definieren und dir das da mal anschauen, was FHEM dann macht. Kann aber sein, dass dich die Fülle erschlägt. Wenn nein, kannst du ja mal das attrTemplate für das "Sammeldevice" (MQTT2_DEVICE) austesten, dann kann es sein, dass relativ viel automatisch so erstellt wird, wie du das brauchst.

Prinzipiell bist du mit readingList auf der richtigen Spur.
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

Knallfrosch

Jeder Antwort folgen nochmal 5 neue Fragen. :-)

Aber machen mich auch auf Fehler aufmerksam.

MQTT2 habe ich natürlich noch nicht angelegt. Daran scheitert natürlich auch die "Verbindung" und Übermittlung der Daten. Soweit so klar.

Bisher läuft bei mir alles mit MQTT über den myBroker:

Internals:
   DEF        127.0.0.1:1883
   DeviceName 127.0.0.1:1883
   FD         95
   FUUID      5da6ce0e-f33f-a358-0817-d1a1748495b1b84a
   NAME       myBroker
   NOTIFYDEV  global
   NR         236
   NTFY_ORDER 50-myBroker
   PARTIAL   
   STATE      opened
   TYPE       MQTT
   buf       
   msgid      10
   ping_received 1
   timeout    60
   READINGS:
     2022-03-31 21:34:14   connection      active
     2022-03-30 16:33:09   state           opened
   messages:
Attributes:
   room       Interface



Kann ich nun einfach einen myBroker2 mit MQTT2 (z.B. Port 188) anlegen und parallel betreiben oder laufe ich Gefahr mir irgendwas durcheinander zu bringen?


Danke


Grüße
-FHEM auf Raspm B+ mit FHEM2FHEM auf einem weiteren Rasp B+
-LaCrosse über Jeelink-Clone und diverses HM über HM-USB.
-S0-Stromzähler und Reed-Gaszähler

Beta-User

Es gibt zur Frage "wie teste ich die MQTT2-Module" bereits einige Threads, die auch über die MQTT-Artikel im Wiki verlinkt sein sollten.

Kurzform:
"MQTT2" kannst du sowohl über einen externen Broker (mit MQTT2_CLIENT) oder über MQTT2_SERVER als IO-Modul haben.

Würde empfehlen, das mit MQTT2_SERVER zu versuchen, aber mit einem Port im "üblichen" Bereich, also z.B. 1884. Dahin muss dann aber auch alles senden, was du testen willst. Hier also die Einstellung auf dem ESP ändern, der im Topic "Sonoff_Pow_Messung" hat.
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files