MQTT2_Device readingList mit Arithmetik

Begonnen von uwirt, 22 März 2025, 18:31:36

Vorheriges Thema - Nächstes Thema

uwirt

Ich lasse mir die Werte eines SmartMeters via Tasmota/json in einem  MQTT2_Device als readings darstellen. Das funktioniert auch bestens.
Nun möchte ich die readings, die in KWh und KW mit drei Kommastellen angezeigt werden, ohne Nachkomma und in Wh, bzw. in W darstellen - also im Prinzip den Wert mal Tausend multiplizieren.
Das kann ich auch indem ich zusätzlich ein userReadings erstelle (Beispiel für das reading SSM_1.7).
Die Frage ist nun ob ich das nicht direkt im readingList ein einem Wisch erledigt werden kann?

defmod MQTT_GPlug MQTT2_DEVICE gPlugM_251278
attr MQTT_GPlug DbLogExclude .*
attr MQTT_GPlug autocreate 0
attr MQTT_GPlug devStateStyle style="text-align:right"
attr MQTT_GPlug jsonMap SENSOR_z_Ei1:1.8.1\
SENSOR_z_Ei2:1.8.2\
SENSOR_z_Pi:1.7\
SENSOR_z_Q51:5.8.1\
SENSOR_z_Q52:5.8.2\
SENSOR_z_Q81:8.8.1\
SENSOR_z_Q82:8.8.2
attr MQTT_GPlug readingList tele/gPlugM_251278/SENSOR:.* { json2nameValue($EVENT, 'SENSOR_', $JSONMAP) }
attr MQTT_GPlug room MQTT2_DEVICE
attr MQTT_GPlug stateFormat Wirkleistung Bezug: 1.7 kW
attr MQTT_GPlug userReadings SSM_1.7 { ReadingsVal("MQTT_GPlug","1.7",0)*1000;; }

Hier noch das List:
Internals:
   CID        gPlugM_251278
   DEF        gPlugM_251278
   FUUID      67dc7e62-f33f-fd73-5b5c-2c269e19200212dd
   IODev      myBroker2
   LASTInputDev myBroker2
   MSGCNT     5049
   NAME       MQTT_GPlug
   NR         291
   STATE      Wirkleistung Bezug: 5.978 kW
   TYPE       MQTT2_DEVICE
   eventCount 5036
   myBroker2_CONN myBroker2_192.168.1.227_64137
   myBroker2_MSGCNT 5049
   myBroker2_TIME 2025-03-22 18:33:54
   JSONMAP:
     SENSOR_z_Ei1 1.8.1
     SENSOR_z_Ei2 1.8.2
     SENSOR_z_Pi 1.7
     SENSOR_z_Q51 5.8.1
     SENSOR_z_Q52 5.8.2
     SENSOR_z_Q81 8.8.1
     SENSOR_z_Q82 8.8.2
   OLDREADINGS:
   READINGS:
     2025-03-22 18:33:54   1.7             5.978
     2025-03-22 18:33:54   1.8.1           36894.848
     2025-03-22 18:33:54   1.8.2           18756.404
     2025-03-22 18:33:54   5.8.1           10531.589
     2025-03-22 18:33:54   5.8.2           5820.836
     2025-03-22 18:33:54   8.8.1           2111.272
     2025-03-22 18:33:54   8.8.2           1071.634
     2025-03-22 18:33:54   SENSOR_Time     2025-03-22T18:33:53
     2025-03-22 18:33:54   SENSOR_z_Ei     0.000
     2025-03-22 18:33:54   SENSOR_z_Eo     0.000
     2025-03-22 18:33:54   SENSOR_z_Eo1    0.000
     2025-03-22 18:33:54   SENSOR_z_Eo2    0.000
     2025-03-22 18:33:54   SENSOR_z_I1     0.000
     2025-03-22 18:33:54   SENSOR_z_I2     0.000
     2025-03-22 18:33:54   SENSOR_z_I3     0.000
     2025-03-22 18:33:54   SENSOR_z_Pi1    0.000
     2025-03-22 18:33:54   SENSOR_z_Pi2    0.000
     2025-03-22 18:33:54   SENSOR_z_Pi3    0.000
     2025-03-22 18:33:54   SENSOR_z_Po     0.000
     2025-03-22 18:33:54   SENSOR_z_Po1    0.000
     2025-03-22 18:33:54   SENSOR_z_Po2    0.000
     2025-03-22 18:33:54   SENSOR_z_Po3    0.000
     2025-03-22 18:33:54   SENSOR_z_Q5     0.000
     2025-03-22 18:33:54   SENSOR_z_Q6     0.000
     2025-03-22 18:33:54   SENSOR_z_Q61    0.001
     2025-03-22 18:33:54   SENSOR_z_Q62    0.000
     2025-03-22 18:33:54   SENSOR_z_Q7     0.000
     2025-03-22 18:33:54   SENSOR_z_Q71    0.000
     2025-03-22 18:33:54   SENSOR_z_Q72    0.000
     2025-03-22 18:33:54   SENSOR_z_Q8     0.000
     2025-03-22 18:33:54   SENSOR_z_SMid  
     2025-03-22 18:33:54   SENSOR_z_U1     0.000
     2025-03-22 18:33:54   SENSOR_z_U2     0.000
     2025-03-22 18:33:54   SENSOR_z_U3     0.000
     2025-03-22 18:33:54   SSM_1.7         5978
   hmccu:
Attributes:
   DbLogExclude .*
   autocreate 0
   devStateStyle style="text-align:right"
   jsonMap    SENSOR_z_Ei1:1.8.1
SENSOR_z_Ei2:1.8.2
SENSOR_z_Pi:1.7
SENSOR_z_Q51:5.8.1
SENSOR_z_Q52:5.8.2
SENSOR_z_Q81:8.8.1
SENSOR_z_Q82:8.8.2
   readingList tele/gPlugM_251278/SENSOR:.* { json2nameValue($EVENT, 'SENSOR_', $JSONMAP) }
   room       MQTT2_DEVICE
   stateFormat Wirkleistung Bezug: 1.7 kW
   userReadings SSM_1.7 { ReadingsVal("MQTT_GPlug","1.7",0)*1000;; }
FHEM / Ubuntu / fitlet2
HomeMatic: CCU3|HmIP-STHD|HmIP-PCBS|HmIP-PCBS2|HmIP-PCBS-BAT|HM-WDC7000|HM-WDS100-C6-O|HM-WDS40|HM-LC-Sw1-FM|HM-LC-RGBW-WM|HM-ES-PMSw1-Pl|HM-ES-TX-WM
NAS: DS218+|DS209j|DS216+II|DS412+
Devices: Panasonic Webcams|Withings|Gardena Smart|Tuya

rudolfkoenig

ZitatDie Frage ist nun ob ich das nicht direkt im readingList ein einem Wisch erledigt werden kann?
Klar geht das, z.Bsp. mit
readingList tele/gPlugM_251278/SENSOR:.* { my $h=json2nameValue($EVENT,'SENSOR_',$JSONMAP); $h->{"1.7"}*=1000; $h }Ob das schoener ist, sei hingestellt.

Off-Topic: zu Reading-Namen, die man nicht von einem Zahl unterscheiden kann, faellt mir nur "looking for trouble" ein.

uwirt

Danke für die rasche Antwort @rudolfkoenig.

Wie würde ich dann alle Werte in der readingList mit Tausend multiplizieren? Kann ich das aufs Mal oder muss ich es für jedes Reading einzeln umsetzen?

Off-Topic: es sind die offiziellen OBIS-Codes, die werde ich dann entsprechend eindeutig umbenennen wenns dann mal funktioniert.
FHEM / Ubuntu / fitlet2
HomeMatic: CCU3|HmIP-STHD|HmIP-PCBS|HmIP-PCBS2|HmIP-PCBS-BAT|HM-WDC7000|HM-WDS100-C6-O|HM-WDS40|HM-LC-Sw1-FM|HM-LC-RGBW-WM|HM-ES-PMSw1-Pl|HM-ES-TX-WM
NAS: DS218+|DS209j|DS216+II|DS412+
Devices: Panasonic Webcams|Withings|Gardena Smart|Tuya

Beta-User

Warum rechnet eigentlich nicht die MCU?

Geht doch einfacher, wenn gleich die gewünschten Einheiten versendet werden....
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

rudolfkoenig

ZitatWie würde ich dann alle Werte in der readingList mit Tausend multiplizieren?
readingList tele/gPlugM_251278/SENSOR:.* { my $h=json2nameValue($EVENT, 'SENSOR_', $JSONMAP);; foreach my $key (keys(%{$h})) { $h->{$key}*=1000 };; $h }Geht nur dann, wenn alle gelieferten Daten Zahlen sind.

Geht doch einfacher, wenn gleich die gewünschten Einheiten versendet werden....
Sehe ich auch so.

Otto123

Zitat von: uwirt am 22 März 2025, 20:44:59Off-Topic: es sind die offiziellen OBIS-Codes, die werde ich dann entsprechend eindeutig umbenennen wenns dann mal funktioniert.
Es gibt doch eine Script Bibliothek bei Tasmota für Smartmeter: https://tasmota.github.io/docs/Smart-Meter-Interface
Die üblichen Leser erledigen das alles direkt vor dem senden über MQTT.
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

uwirt

Nochmals etwas mit Rechnen: ich möchte zwei readings zusammenzählen und daraus ein neues reading machen. Das tut man wohl ganz einfach mit "userReadings":
SM_energy:SM_1.8.1,SM_1.8.2 { ReadingsNum("$name", "SM_1.8.1", 0) + ReadingsNum("$name", "SM_1.8.2", 0) }
Leider klappt das nicht.

Hier mein aktuelles List:
Internals:
   CID        gPlugM_251278
   DEF        gPlugM_251278
   FUUID      67dc7e62-f33f-fd73-5b5c-2c269e19200212dd
   IODev      myBroker2
   LASTInputDev myBroker2
   MSGCNT     66
   NAME       MQTT_GPlug
   NR         291
   STATE      Wirkleistung Bezug: 596 kW
   TYPE       MQTT2_DEVICE
   eventCount 66
   myBroker2_CONN myBroker2_192.168.1.225_61492
   myBroker2_MSGCNT 66
   myBroker2_TIME 2025-03-29 18:26:53
   JSONMAP:
     SENSOR_z_Ei 0
     SENSOR_z_Ei1 SM_1.8.1
     SENSOR_z_Ei2 SM_1.8.2
     SENSOR_z_Eo 0
     SENSOR_z_Eo1 0
     SENSOR_z_Eo2 0
     SENSOR_z_I1 0
     SENSOR_z_I2 0
     SENSOR_z_I3 0
     SENSOR_z_Pi SM_1.7
     SENSOR_z_Pi1 0
     SENSOR_z_Pi2 0
     SENSOR_z_Pi3 0
     SENSOR_z_Po 0
     SENSOR_z_Po1 0
     SENSOR_z_Po2 0
     SENSOR_z_Po3 0
     SENSOR_z_Q5 0
     SENSOR_z_Q51 SM_5.8.1
     SENSOR_z_Q52 SM_5.8.2
     SENSOR_z_Q6 0
     SENSOR_z_Q61 0
     SENSOR_z_Q62 0
     SENSOR_z_Q7 0
     SENSOR_z_Q71 0
     SENSOR_z_Q72 0
     SENSOR_z_Q8 0
     SENSOR_z_Q81 SM_8.8.1
     SENSOR_z_Q82 SM_8.8.2
     SENSOR_z_SMid 0
     SENSOR_z_U1 0
     SENSOR_z_U2 0
     SENSOR_z_U3 0
   READINGS:
     2025-03-29 18:15:09   IODev           myBroker2
     2025-03-29 18:26:53   SENSOR_Time     2025-03-29T18:26:53
     2025-03-29 18:26:53   SM_1.7          596
     2025-03-29 18:26:53   SM_1.8.1        37173605
     2025-03-29 18:26:53   SM_1.8.2        18918453
     2025-03-29 18:26:53   SM_5.8.1        10627526
     2025-03-29 18:26:53   SM_5.8.2        5880252
     2025-03-29 18:26:53   SM_8.8.1        2126251
     2025-03-29 18:26:53   SM_8.8.2        1078834
   hmccu:
Attributes:
   DbLogExclude .*
   autocreate 0
   devStateStyle style="text-align:right"
   event-on-change-reading .*
   event-on-update-reading .*
   jsonMap    SENSOR_z_Ei1:SM_1.8.1
SENSOR_z_Ei2:SM_1.8.2
SENSOR_z_Pi:SM_1.7
SENSOR_z_Q51:SM_5.8.1
SENSOR_z_Q52:SM_5.8.2
SENSOR_z_Q81:SM_8.8.1
SENSOR_z_Q82:SM_8.8.2
SENSOR_z_Ei:0
SENSOR_z_Eo:0
SENSOR_z_Eo1:0
SENSOR_z_Eo2:0
SENSOR_z_I1:0
SENSOR_z_I2:0
SENSOR_z_I3:0
SENSOR_z_Pi1:0
SENSOR_z_Pi2:0
SENSOR_z_Pi3:0
SENSOR_z_Po:0
SENSOR_z_Po1:0
SENSOR_z_Po2:0
SENSOR_z_Po3:0
SENSOR_z_Q5:0
SENSOR_z_Q6:0
SENSOR_z_Q61:0
SENSOR_z_Q62:0
SENSOR_z_Q7:0
SENSOR_z_Q71:0
SENSOR_z_Q72:0
SENSOR_z_Q8:0
SENSOR_z_SMid:0
SENSOR_z_U1:0
SENSOR_z_U2:0
SENSOR_z_U3:0
   readingList tele/gPlugM_251278/SENSOR:.* {my $h = json2nameValue($EVENT, 'SENSOR_', $JSONMAP); my @readings_to_multiply = ("SM_1.7", "SM_1.8.1", "SM_1.8.2", "SM_5.8.1", "SM_5.8.2", "SM_8.8.1", "SM_8.8.2"); foreach my $reading (@readings_to_multiply) {if (exists $h->{$reading}) {$h->{$reading} *= 1000;}}return $h;}

   room       MQTT2_DEVICE
   stateFormat Wirkleistung Bezug: SM_1.7 kW
   userReadings SM_energy:SM_1.8.1,SM_1.8.2 { ReadingsNum("$name", "SM_1.8.1", 0) + ReadingsNum("$name", "SM_1.8.2", 0) }
FHEM / Ubuntu / fitlet2
HomeMatic: CCU3|HmIP-STHD|HmIP-PCBS|HmIP-PCBS2|HmIP-PCBS-BAT|HM-WDC7000|HM-WDS100-C6-O|HM-WDS40|HM-LC-Sw1-FM|HM-LC-RGBW-WM|HM-ES-PMSw1-Pl|HM-ES-TX-WM
NAS: DS218+|DS209j|DS216+II|DS412+
Devices: Panasonic Webcams|Withings|Gardena Smart|Tuya

TomLee

Hallo,

trigger ist laut commandref ein regex. Zusätzlich gibst nicht an auf welchen Wert getriggert werden soll.
Die Anführungszeichen um $name kann man sich sparen, wenn man möchte.


So sollte es klappen:

SM_energy:(SM_1.8.1|SM_1.8.2).* { ReadingsNum($name, "SM_1.8.1", 0) + ReadingsNum($name, "SM_1.8.2", 0) }
Gruß Thomas

uwirt

FHEM / Ubuntu / fitlet2
HomeMatic: CCU3|HmIP-STHD|HmIP-PCBS|HmIP-PCBS2|HmIP-PCBS-BAT|HM-WDC7000|HM-WDS100-C6-O|HM-WDS40|HM-LC-Sw1-FM|HM-LC-RGBW-WM|HM-ES-PMSw1-Pl|HM-ES-TX-WM
NAS: DS218+|DS209j|DS216+II|DS412+
Devices: Panasonic Webcams|Withings|Gardena Smart|Tuya

TomLee

Es macht wenig Sinn auf beide Readings zu triggern, fällt mir gerade auf...

uwirt

Dann nur der erste oder zweite Trigger, oder keiner von beiden?
FHEM / Ubuntu / fitlet2
HomeMatic: CCU3|HmIP-STHD|HmIP-PCBS|HmIP-PCBS2|HmIP-PCBS-BAT|HM-WDC7000|HM-WDS100-C6-O|HM-WDS40|HM-LC-Sw1-FM|HM-LC-RGBW-WM|HM-ES-PMSw1-Pl|HM-ES-TX-WM
NAS: DS218+|DS209j|DS216+II|DS412+
Devices: Panasonic Webcams|Withings|Gardena Smart|Tuya

Beta-User

Zitat von: uwirt am 07 April 2025, 15:05:32Dann nur der erste oder zweite Trigger, oder keiner von beiden?
Meine 2ct: Mache alle Berechnungen auf dem Tasmota-ESP und übermittle direkt die Ergebnisse. Sowohl das mit 1000 multiplizieren wie auch die Summenbildung. Zu letzterem nochmal der Link: https://tasmota.github.io/docs/Smart-Meter-Interface/#special-commands (gleich der erste Eintrag dort!).
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