Hallo,
ich Rätsel gerade an einem userReading rum, und komme da nicht weiter...
D_COUNTER_C3 difference { ReadingsVal("MQTT.zaehler2","COUNTER_C3",0)},
D_COUNTER_C4 difference { ReadingsVal("MQTT.zaehler2","COUNTER_C4",0)},
COUNTER_ABS { ReadingsVal("MQTT.zaehler2","D_COUNTER_C4",0) - ReadingsVal("MQTT.zaehler2","D_COUNTER_C3",0) },
COUNTER_C5 {
if (ReadingsVal("MQTT.zaehler2","COUNTER_ABS",0) < 0) {
(OldReadingsVal("MQTT.zaehler2","COUNTER_C5",0) - ReadingsVal("MQTT.zaehler2","COUNTER_ABS",0)) }
},
COUNTER_C6 {
if (ReadingsVal("MQTT.zaehler2","COUNTER_ABS",0) > 0) {
(OldReadingsVal("MQTT.zaehler2","COUNTER_C6",0) + ReadingsVal("MQTT.zaehler2","COUNTER_ABS",0)) }
}
die Werte für COUNTER_C5 und C6 werden nicht addiert sondern enthalten dann jeweils nur den Wert von COUNTER_ABS...
weis jemand warum das so ist ?
Gruß Yves.
Gib mal bitte noch ein list vom Device
Hallo,
sieht so aus:
Internals:
CID zaehler2
DEF zaehler2
DEVICETOPIC MQTT.zaehler2
FUUID 5d6a6ed7-f33f-75de-797e-53bbe5c63f22331b
IODev mqtt
LASTInputDev mqtt
MSGCNT 1116
NAME MQTT.zaehler2
NR 643
STATE C1: 59 Wh
C2: 265 Wh
C3: 470 Wh
C4: 4037 Wh
TYPE MQTT2_DEVICE
mqtt_MSGCNT 1116
mqtt_TIME 2019-09-01 07:41:37
OLDREADINGS:
READINGS:
2019-09-01 07:41:37 COUNTER_ABS 6
2019-09-01 07:41:37 COUNTER_C1 59
2019-09-01 07:41:37 COUNTER_C2 265
2019-09-01 07:41:37 COUNTER_C3 470
2019-09-01 07:41:37 COUNTER_C4 4037
2019-09-01 07:41:37 COUNTER_C5
2019-09-01 07:41:37 COUNTER_C6 6
2019-09-01 06:40:35 C_COUNTER_C5
2019-09-01 06:40:35 C_COUNTER_C6 3
2019-09-01 07:41:37 D_COUNTER_C3 4
2019-09-01 07:41:37 D_COUNTER_C4 10
2019-09-01 07:41:37 Heap 15
2019-09-01 06:06:14 LWT Online
2019-09-01 07:41:37 LoadAvg 19
2019-09-01 06:06:14 POWER
2019-09-01 07:41:37 Sleep 50
2019-09-01 07:41:37 SleepMode Dynamic
2019-09-01 07:41:37 Time 2019-09-01T06:41:37
2019-09-01 07:41:37 Uptime 0T16:43:46
2019-09-01 07:41:37 Wifi_AP 1
2019-09-01 07:41:37 Wifi_BSSId 7C:FF:4D:FE:4B:E4
2019-09-01 07:41:37 Wifi_Channel 6
2019-09-01 07:41:37 Wifi_Downtime 0T00:00:19
2019-09-01 07:41:37 Wifi_LinkCount 5
2019-09-01 07:41:37 Wifi_RSSI 56
2019-09-01 07:41:37 Wifi_SSId AirPort
Attributes:
IODev mqtt
readingList zaehler2:zaehler2/tele/LWT:.* LWT
zaehler2:zaehler2/cmnd/POWER:.* POWER
zaehler2:zaehler2/tele/INFO1:.* { json2nameValue($EVENT) }
zaehler2:zaehler2/tele/INFO2:.* { json2nameValue($EVENT) }
zaehler2:zaehler2/tele/INFO3:.* { json2nameValue($EVENT) }
zaehler2:zaehler2/tele/STATE:.* { json2nameValue($EVENT) }
zaehler2:zaehler2/tele/SENSOR:.* { json2nameValue($EVENT) }
zaehler2:zaehler2/stat/RESULT:.* { json2nameValue($EVENT) }
room hidden
stateFormat C1: COUNTER_C1 Wh
C2: COUNTER_C2 Wh
C3: COUNTER_C3 Wh
C4: COUNTER_C4 Wh
userReadings D_COUNTER_C3 difference { ReadingsVal("MQTT.zaehler2","COUNTER_C3",0)},
D_COUNTER_C4 difference { ReadingsVal("MQTT.zaehler2","COUNTER_C4",0)},
COUNTER_ABS { ReadingsVal("MQTT.zaehler2","D_COUNTER_C4",0) - ReadingsVal("MQTT.zaehler2","D_COUNTER_C3",0) },
COUNTER_C5 {
if (ReadingsVal("MQTT.zaehler2","COUNTER_ABS",0) < 0) {
(OldReadingsVal("MQTT.zaehler2","COUNTER_C5",0) - ReadingsVal("MQTT.zaehler2","COUNTER_ABS",0)) }
},
COUNTER_C6 {
if (ReadingsVal("MQTT.zaehler2","COUNTER_ABS",0) > 0) {
(OldReadingsVal("MQTT.zaehler2","COUNTER_C6",0) + ReadingsVal("MQTT.zaehler2","COUNTER_ABS",0)) }
}
Du verwendest OldReadingsVal aber ich sehe kein passendes gesetztes Attribut. Und ich würde die RegEx für die Trigger der jeweiligen userreadings enger setzen. Immer auf das Reading triggern welches Du dann auslesen willst.
Die Frage ist auch ob an der Stelle wirklich OldReadingsVal benötigt wird, ich würde da auch RaedingsVal nehmen, da ja innerhalb der Klammer das Userreading eh noch den alten Wert hat :)
und noch ein Tipp : verwende statt ReadingsVal("MQTT.zaehler2" ReadingsVal($name wenn das Reading aus dem eigenen Device stammt,
das spart Tipparbeit, überlebt Geräteumbennenung und erleichtert das kopieren auf andere Geräte.
Hallo,
hmm schade das ich nicht weis warum es jetzt geht ..
.D_COUNTER_C3 difference { ReadingsVal($name,"COUNTER_C3",0)},
.D_COUNTER_C4 difference { ReadingsVal($name,"COUNTER_C4",0)},
.COUNTER_ABS { ReadingsVal($name,".D_COUNTER_C4",0) - ReadingsVal($name,".D_COUNTER_C3",0) },
COUNTER_C5 {
if (ReadingsVal($name,".COUNTER_ABS",0) < 0) {
(ReadingsVal($name,"COUNTER_C5",0) - ReadingsVal($name,".COUNTER_ABS",0)) }
else {ReadingsVal($name,"COUNTER_C5",0)}
},
COUNTER_C6 {
if (ReadingsVal($name,".COUNTER_ABS",0) > 0) {
(ReadingsVal($name,"COUNTER_C6",0) + ReadingsVal($name,".COUNTER_ABS",0)) }
else {ReadingsVal($name,"COUNTER_C6",0)}
}
so hatte ich das auch schon mal ... sollte es wirklich nur am ReadingsVal("MQTT.zaehler2" ReadingsVal($name liegen ...
Vielen Dank auf jeden Fall ..
fehlt da nicht der return value?
wenn ich es richtig verstanden habe wird das user reading mit einem Wert befüllt, der irgendwo entsteht oder ausgelesen wird.
im Sinne von: testreading { ReadingsVal("testdevice", "state", "")} - das ReadingsVal gibt als return value den ausgelesenen Wert zurück
Bei dir wird ein Wert in der Klammer berechnet, ein Wert der sich jeweils aus den einzelnen Readings ergibt, nur weis die Klammer nicht was sie mit dem Wert machen soll.
ich denke eine Änderung alá:
COUNTER_C5 {
my $ergebnis;;
if (ReadingsVal($name,".COUNTER_ABS",0) < 0) {
$ergebnis = (ReadingsVal($name,"COUNTER_C5",0) - ReadingsVal($name,".COUNTER_ABS",0)) }
else {$ergebnis = ReadingsVal($name,"COUNTER_C5",0)};;
$ergebnis;; #als Rückgabewert
},
die Syntax ist ungeprüft, habe ie Struktur aber schon bei einer ähnlichen Aufgabe shon mal gebraucht.
Grüße Sven
Zitat von: Svenergy am 05 September 2019, 23:31:13
fehlt da nicht der return value?
nein, probiere es aus. Dein ganzes $ergebnis ist überflüssig, viel wichtiger bei userReadings ist IMHO einen gescheiten Trigger zu definieren.
Hat CoolTux bereits angesprochen aber yvl hat es ignoriert .....
danke für die Info, gut zu wissen.
ich hätte schwören können, dass in einigen Beispielen hier im Forum mit return xxxx nach Veränderung der Readings gearbeitet wurde in den userReadings ;) Kommt aber sicher immer auf den Spezialfall an.
Grüße Sven