Berechnungen in userReading

Begonnen von yvl, 01 September 2019, 06:49:44

Vorheriges Thema - Nächstes Thema

yvl

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.
Gruß
Yves

CoolTux

Gib mal bitte noch ein list vom Device
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

yvl

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)) }
}
Gruß
Yves

CoolTux

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.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

Wzut

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.
Maintainer der Module: MAX, MPD, UbiquitiMP, UbiquitiOut, SIP, BEOK, readingsWatcher

yvl

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 ..
Gruß
Yves

Svenergy

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

Wzut

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 .....
Maintainer der Module: MAX, MPD, UbiquitiMP, UbiquitiOut, SIP, BEOK, readingsWatcher

Svenergy

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