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;; }
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.
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.
Warum rechnet eigentlich nicht die MCU?
Geht doch einfacher, wenn gleich die gewünschten Einheiten versendet werden....
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.
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.
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) }
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
Es klappt - danke !
Es macht wenig Sinn auf beide Readings zu triggern, fällt mir gerade auf...
Dann nur der erste oder zweite Trigger, oder keiner von beiden?
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!).