Reading am MQTT2_device kann nicht gesetzt werden

Begonnen von didi-fritz, 08 Dezember 2021, 08:32:25

Vorheriges Thema - Nächstes Thema

didi-fritz

Hallo

ich habe ein funktionierendes MQTT2_device "BrunnenWasserZaehler" (esp8266, tasmota)

Internals:
   CFGFN     
   CID        brunnen
   DEF        brunnen
   DEVICETOPIC BrunnenWasserZaehler
   FUUID      61af9966-f33f-2a7c-6cc4-b5206a9bdea997f3
   IODev      mqttServer
   LASTInputDev mqttServer
   MSGCNT     972
   NAME       BrunnenWasserZaehler
   NR         1961
   STATE      290.28 l ( 122352 )
   TYPE       MQTT2_DEVICE
   mqttServer_CONN mqttServer_10.0.0.163_55885
   mqttServer_MSGCNT 972
   mqttServer_TIME 2021-12-08 08:12:19
   OLDREADINGS:
   READINGS:
     2021-12-08 08:12:19   COUNTER_C1      122352
     2021-12-08 07:44:04   Time            2021-12-08T07:44:04
     2021-12-08 08:12:19   liter           290.28
     2021-12-08 08:12:19   literPerMin     0.00
   helper:
     _98_statistics BrunnenWasserZaehlerStatDev
Attributes:
   autocreate 0
   comment    421.5 impulse = 1 liter
   event-min-interval .*:3600
   event-on-change-reading COUNTER_C1,.tmp_literPerMin,literPerMin,liter
   group      Wasser
   icon       measure_water_meter
   readingList brunnen:tele/tasmota_CE94EE/LWT:.* { json2nameValue($EVENT) }
brunnen:tele/tasmota_CE94EE/INFO1:.* { json2nameValue($EVENT) }
brunnen:tele/tasmota_CE94EE/INFO2:.* { json2nameValue($EVENT) }
brunnen:tele/tasmota_CE94EE/SENSOR:.* { json2nameValue($EVENT) }
   room       Technik-Wasser
   stateFormat liter l ( COUNTER_C1 )
   timestamp-on-change-reading .*
   userReadings .tmp_literPerMin:COUNTER_C1:.* differential {ReadingsVal($NAME,"COUNTER_C1",0)/421.5*60;;},
statLiter:dummy:.* {"versuch, das reading upgedatebar zu machen";;},
literPerMin:.tmp_literPerMin:.* {sprintf("%.2f",ReadingsVal($NAME,".tmp_literPerMin",0));;},
liter:COUNTER_C1:.* {sprintf("%.2f",ReadingsVal($NAME,"COUNTER_C1",0)/421.5);;}
   verbose    5


nun möchte ich mit dem statistics-device "BrunnenWasserZaehlerStatDev" ein reading ("statLiter") am MQTT2_device setzen.

Internals:
   CFGFN     
   DEF        BrunnenWasserZaehler
   DEV_REGEXP BrunnenWasserZaehler
   FUUID      61af9b0d-f33f-2a7c-0a3c-d2cd24415ab54fdc
   NAME       BrunnenWasserZaehlerStatDev
   NOTIFYDEV  global,BrunnenWasserZaehler
   NR         2032
   NTFY_ORDER 10-BrunnenWasserZaehlerStatDev
   PREFIX     stat
   STATE      Updated stats for: BrunnenWasserZaehler
   TYPE       statistics
   OLDREADINGS:
   READINGS:
     2021-12-07 19:36:02   monitoredDevicesMQTT2_DEVICE BrunnenWasserZaehler
     2021-12-08 07:59:55   nextPeriodChangeCalc 2021-12-08 08:59:55
     2021-12-08 08:17:49   state           Updated stats for: BrunnenWasserZaehler
   fhem:
     modulVersion $Date: 2019-12-24 00:07:57 +0100 (Tue, 24 Dec 2019) $
     nextPeriodChangeTime 1638950395
Attributes:
   deltaReadings liter
   event-min-interval .*:3600
   event-on-change-reading .*
   group      Wasser
   icon       rc_HELP
   ignoreDefaultAssignments 1
   room       Technik-Wasser
   singularReadings BrunnenWasserZaehler:liter:Delta:(Hour|Day|Month|Year)
   verbose    5


das statistics-device wird getriggert, aber im MQTT2_device wird das reading "statLiter" nicht erzeugt (einmal war es mit dem Wert 0 angelegt).

im Log sehe ich:
2021.12.08 08:20:49 4: MQTT2_DEVICE_Parse: BrunnenWasserZaehler tele/tasmota_CE94EE/SENSOR => { json2nameValue($EVENT) }
2021.12.08 08:20:49 5: statistics BrunnenWasserZaehlerStatDev: DoStatistics.446 Assigned reading 'liter' from attribute 'deltaReadings' to statistic type 2.
2021.12.08 08:20:49 4: statistics BrunnenWasserZaehlerStatDev: doStatisticDelta.703 Calculating delta statistics for 'BrunnenWasserZaehler:liter = 290.28'
2021.12.08 08:20:49 5: statistics BrunnenWasserZaehlerStatDev: doStatisticDelta.794 Set '.BrunnenWasserZaehler:liter'='LastValue: 290.28 ShowDate: 7 DecPlaces: 2'
2021.12.08 08:20:49 5: statistics BrunnenWasserZaehlerStatDev: doStatisticDelta.800 Set 'statLiter'='Hour: 0.00 Day: 0.00 Month: 0.00 Year: 0.00 (since:  )'
2021.12.08 08:20:49 5: statistics BrunnenWasserZaehlerStatDev: storeSingularReadings.1089 Set statLiterHour = 0.00
2021.12.08 08:20:49 5: statistics BrunnenWasserZaehlerStatDev: storeSingularReadings.1089 Set statLiterDay = 0.00
2021.12.08 08:20:49 5: statistics BrunnenWasserZaehlerStatDev: storeSingularReadings.1089 Set statLiterMonth = 0.00
2021.12.08 08:20:49 5: statistics BrunnenWasserZaehlerStatDev: storeSingularReadings.1089 Set statLiterYear = 0.00
2021.12.08 08:20:49 5: statistics BrunnenWasserZaehlerStatDev: Notify.296 Notification of 'BrunnenWasserZaehler' received. Update statistics.


nach längerem Debuggen habe ich versucht, mit "setreading  BrunnenWasserZaehler testreading test" ein neues Reading anzulegen, aber es wird nicht erzeugt. Versuche, es mit userreadings zu initialisieren, sind auch gescheitert.
ein bestehendes Reading (z.B. "literPerMin") kann jedoch mit setreading ohne Probleme überschrieben werden.


ich bin ratlos ...

Didi

rudolfkoenig

Zu den statistics Experimenten kann ich nichts sagen, aber dass ein setreading mit einem MQTT2_DEVICE nicht funktionieren soll finde ich sehr unwahrscheinlich, ich hatte gerade kein Problem bei Testen.

didi-fritz

funktioniert leider bei mir nicht
# nc 127.0.0.1 7072

FHEM> list BrunnenWasserZaehler
Internals:
   CFGFN
   CID        brunnen
   DEF        brunnen
   DEVICETOPIC BrunnenWasserZaehler
   FUUID      61af9966-f33f-2a7c-6cc4-b5206a9bdea997f3
   IODev      mqttServer
   LASTInputDev mqttServer
   MSGCNT     1072
   NAME       BrunnenWasserZaehler
   NR         1961
   STATE      297.56 l ( 125423 )
   TYPE       MQTT2_DEVICE
   mqttServer_CONN mqttServer_10.0.0.163_55885
   mqttServer_MSGCNT 1072
   mqttServer_TIME 2021-12-08 09:18:33
   OLDREADINGS:
   READINGS:
     2021-12-08 09:15:33   COUNTER_C1      125423
     2021-12-08 07:44:04   Time            2021-12-08T07:44:04
     2021-12-08 09:15:33   liter           297.56
     2021-12-08 09:15:33   literPerMin     0.40
   helper:
     _98_statistics BrunnenWasserZaehlerStatDev
Attributes:
   autocreate 0
   comment    421.5 impulse = 1 liter
   event-min-interval .*:3600
   event-on-change-reading COUNTER_C1,.tmp_literPerMin,literPerMin,liter
   group      Wasser
   icon       measure_water_meter
   readingList brunnen:tele/tasmota_CE94EE/LWT:.* { json2nameValue($EVENT) }
brunnen:tele/tasmota_CE94EE/INFO1:.* { json2nameValue($EVENT) }
brunnen:tele/tasmota_CE94EE/INFO2:.* { json2nameValue($EVENT) }
brunnen:tele/tasmota_CE94EE/SENSOR:.* { json2nameValue($EVENT) }
   room       Technik-Wasser
   stateFormat liter l ( COUNTER_C1 )
   timestamp-on-change-reading .*
   userReadings .tmp_literPerMin:COUNTER_C1:.* differential {ReadingsVal($NAME,"COUNTER_C1",0)/421.5*60;;},
statLiter:dummy:.* {"versuch, das reading updatebar zu machen";;},
literPerMin:.tmp_literPerMin:.* {sprintf("%.2f",ReadingsVal($NAME,".tmp_literPerMin",0));;},
liter:COUNTER_C1:.* {sprintf("%.2f",ReadingsVal($NAME,"COUNTER_C1",0)/421.5);;}
   verbose    2

FHEM>
FHEM>
FHEM> setreading BrunnenWasserZaehler testreading test
FHEM> setreading BrunnenWasserZaehler literPerMin 0.40000000000000000000000000
FHEM>
FHEM>
FHEM> list BrunnenWasserZaehler
Internals:
   CFGFN
   CID        brunnen
   DEF        brunnen
   DEVICETOPIC BrunnenWasserZaehler
   FUUID      61af9966-f33f-2a7c-6cc4-b5206a9bdea997f3
   IODev      mqttServer
   LASTInputDev mqttServer
   MSGCNT     1072
   NAME       BrunnenWasserZaehler
   NR         1961
   STATE      297.56 l ( 125423 )
   TYPE       MQTT2_DEVICE
   mqttServer_CONN mqttServer_10.0.0.163_55885
   mqttServer_MSGCNT 1072
   mqttServer_TIME 2021-12-08 09:18:33
   OLDREADINGS:
   READINGS:
     2021-12-08 09:15:33   COUNTER_C1      125423
     2021-12-08 07:44:04   Time            2021-12-08T07:44:04
     2021-12-08 09:15:33   liter           297.56
     2021-12-08 09:20:50   literPerMin     0.40000000000000000000000000
   helper:
     _98_statistics BrunnenWasserZaehlerStatDev
Attributes:
   autocreate 0
   comment    421.5 impulse = 1 liter
   event-min-interval .*:3600
   event-on-change-reading COUNTER_C1,.tmp_literPerMin,literPerMin,liter
   group      Wasser
   icon       measure_water_meter
   readingList brunnen:tele/tasmota_CE94EE/LWT:.* { json2nameValue($EVENT) }
brunnen:tele/tasmota_CE94EE/INFO1:.* { json2nameValue($EVENT) }
brunnen:tele/tasmota_CE94EE/INFO2:.* { json2nameValue($EVENT) }
brunnen:tele/tasmota_CE94EE/SENSOR:.* { json2nameValue($EVENT) }
   room       Technik-Wasser
   stateFormat liter l ( COUNTER_C1 )
   timestamp-on-change-reading .*
   userReadings .tmp_literPerMin:COUNTER_C1:.* differential {ReadingsVal($NAME,"COUNTER_C1",0)/421.5*60;;},
statLiter:dummy:.* {"versuch, das reading updatebar zu machen";;},
literPerMin:.tmp_literPerMin:.* {sprintf("%.2f",ReadingsVal($NAME,".tmp_literPerMin",0));;},
liter:COUNTER_C1:.* {sprintf("%.2f",ReadingsVal($NAME,"COUNTER_C1",0)/421.5);;}
   verbose    2

FHEM>


"testreading" fehlt,
"literPerMin" wurde geändert

rudolfkoenig

Ich lese und staune. Funktioniert das ohne statistics?
Ich gehe z.Zt. davon aus, dass das ein statistics Artefakt ist.

didi-fritz

nun hab ich es gefunden - reproduzierbare Ursache ist das Attribute "timestamp-on-change-reading .*" am MQTT2_DEVICE


ohne timestamp-on-change-reading  klappts:
Internals:
   CFGFN     
   CID        brunnen
   DEF        brunnen
   DEVICETOPIC BrunnenWasserZaehler
   FUUID      61b07fa4-f33f-2a7c-1cb6-4061762f711d2a9b
   IODev      mqttServer
   LASTInputDev mqttServer
   MSGCNT     39
   NAME       BrunnenWasserZaehler
   NR         1768
   STATE      310.76 l ( 130987 )
   TYPE       MQTT2_DEVICE
   mqttServer_CONN mqttServer_10.0.0.163_54243
   mqttServer_MSGCNT 39
   mqttServer_TIME 2021-12-08 11:15:32
   OLDREADINGS:
   READINGS:
     2021-12-08 11:15:32   COUNTER_C1      130987
     2021-12-08 11:15:32   Time            2021-12-08T11:15:32
     2021-12-08 11:12:32   liter           310.76
     2021-12-08 11:12:32   literPerMin     0.53
     2021-12-08 11:12:32   statLiter       Hour: 0.89 Day: 0.89 Month: 0.89 Year: 0.89 (since: 2021-12-08_11:11:14 )
   helper:
     _98_statistics BrunnenWasserZaehlerStatDev
Attributes:
   autocreate 0
   comment    421.5 impulse = 1 liter
   event-min-interval .*:3600
   event-on-change-reading COUNTER_C1,.tmp_literPerMin,literPerMin,liter
   group      Wasser
   icon       measure_water_meter
   readingList brunnen:tele/tasmota_CE94EE/LWT:.* { json2nameValue($EVENT) }
brunnen:tele/tasmota_CE94EE/INFO1:.* { json2nameValue($EVENT) }
brunnen:tele/tasmota_CE94EE/INFO2:.* { json2nameValue($EVENT) }
brunnen:tele/tasmota_CE94EE/SENSOR:.* { json2nameValue($EVENT) }
   room       Technik-Wasser
   stateFormat liter l ( COUNTER_C1 )
   userReadings .tmp_literPerMin:COUNTER_C1:.* differential {ReadingsVal($NAME,"COUNTER_C1",0)/421.5*60;;},
literPerMin:.tmp_literPerMin:.* {sprintf("%.2f",ReadingsVal($NAME,".tmp_literPerMin",0));;},
liter:COUNTER_C1:.* {sprintf("%.2f",ReadingsVal($NAME,"COUNTER_C1",0)/421.5);;}


kann mir da wer bitte den Zusammenhang erklären

TomLee

Das hab ich bei mir auch schon festgestellt gehabt, jetzt nicht mit setreading, aber mit gesetztem timestamp-on-change-reading werden keine neuen Readings vom Modul angelegt.

rudolfkoenig

Zitatohne timestamp-on-change-reading  klappts:
Ich tippe eher auf event-on-change-reading. Aus der Doku:
If set, only changes of the listed readings create events.

Ich frage mich, wieso "jeder" dieses Attribut setzen muss.
Ich komme seit 10+ Jahren sehr gut ohne die event-* Attribute klar.

didi-fritz

ich verwende beide Attribute gerne, da
- ich an hand des Timestamps schnell die Zeit der letzen Änderung sehe
- ich (meiner Meinung) die Eventlast reduziere


das "event-on-change-reading" steuert ja nur, ob events generiert werden oder nicht.
doku:Wenn gesetzt, erzeugen nur Veränderungen der gelisteten "readings" ein Ereignis. Wenn die aktualiserten Werte der gelisteten "readings" identisch sind, wird kein Ereignis generiert.

das "timestamp-on-change-reading" sollte beim schreiben von readings nur dann den timestamp updaten, wenn sich der wert geändert hat.
doku:Wenn gesetzt, werden die Zeitstempel der gelisteten "readings" nicht aktualisiert wenn durch ein ebenfalls gesetztes event-on-change-reading für dieses "reading" kein Ereignis erzeugen würde.