OldReadings liefert keinen Wert

Begonnen von Dodger, 20 Dezember 2021, 07:38:20

Vorheriges Thema - Nächstes Thema

Dodger

Hallo,

ich möchte gerne für eine Status-Abfrage mit dem Wert des vorherigen Readings arbeiten.
Dafür habe ich in meinem Device das Attribut "oldreading" mit dem gewünschten Reading gefüllt:
attr FritzBox_Status oldreadings tam1_newMsg

Meine Erwartung wäre nun, dass oldreadings quasi bei jedem lesen des Readings auf den vorherigen Wert gesetzt wird.
Wenn ich die Beispiele hier im Forum korrekt interpretiere, dann sollte in einem List des Devices ein Bereich "OldReadings" auftauchen.
Das passiert bei mir leider nicht.
Ich habe auch keine Fehler im Log-File.

Wird das OldReadings nur dann befüllt, wenn sich der Wert des zu "überwachenden" Attributes ändert?

Gruß
Dodger

MadMax-FHEM

#1
Wo ist das list des Devices?

Woher hast du das mit der Liste von OldReadings?

Du kannst mittels OldReadingsVal etc. den "alten Wert" abfragen...

EDIT:
Zitat von: commandref
oldreadings
Dieses Attribut enthält eine durch Kommata getrennte Liste von Readings. regex sind erlaubt. Für jedes Reading aus der Liste speichert FHEM intern den vorherigen Wert wenn sich das Reading ändert. Zum Zugriff auf die Werte gibt es die OldReadings.* Routinen.

Was willst du denn tun/erreichen?

Und es geht um Readings, nicht um Attribute!

Gruß, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

Dodger

Die Info über das Verhalten habe ich aus diesem Post: https://forum.fhem.de/index.php?topic=91003.0
hier taucht das OldReadings im List des devices auf:
ZitatInternals:
   NAME       d_autoBliKitchen
   NR         134
   STATE      1
   TYPE       dummy
   OLDREADINGS:
     2018-09-09 22:08:28   state           1
   READINGS:
     2018-07-07 20:21:44   altitude_min    10
     2018-07-07 20:21:23   azimuth_max     280
Der Teil fehlt bei mir im list.
Allerdings wird mir bei Eingabe von
{OldReadingsNum('FritzBox_Status','tam1_newMsg',0)}
zumindest ein Rückgabewert geliefert.
Scheint also zu funktionieren, auch wenn das "Kapitel" "OLDREADINGS" nicht im List auftaucht.

Das List kann ich erst heute abend liefern, wenn ich wieder zu Hause bin.

Gruß
Dodger

MadMax-FHEM

Zitat von: Dodger am 20 Dezember 2021, 09:15:40
Die Info über das Verhalten habe ich aus diesem Post: https://forum.fhem.de/index.php?topic=91003.0
hier taucht das OldReadings im List des devices auf:Der Teil fehlt bei mir im list.

...

Scheint also zu funktionieren, auch wenn das "Kapitel" "OLDREADINGS" nicht im List auftaucht.

Ich weiß immer noch nicht wovon du sprichst?

Es gibt keinen Eintrag von OldReadings im list...
...also auch in dem verlinkten Beitrag komnnte ich nichts finden.

Poste doch mal den Ausschnitt, den du meinst...


Zitat von: Dodger am 20 Dezember 2021, 09:15:40
Allerdings wird mir bei Eingabe von
{OldReadingsNum('FritzBox_Status','tam1_newMsg',0)}
zumindest ein Rückgabewert geliefert.

Mehr gibt es auch nicht...
Siehe commandref...
(bzw. kenne ich auch nicht mehr und ist bei mir auch nicht mehr vorhanden, also die Möglichkeit alte Werte abzufragen bzw. halt den letzten vor dem aktuellen / Achtung: wenn der letzte Wert "derselbe" war wie der aktuelle siehst du auch keinen Unterschied! -> event-on-change-reading usw.)

Gruß, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

Dodger

Also, was ich gerne machen möchte:
In der Fritzbox gibt es einen Wert, der die Anzahl der neuen Nachrichten auf dem Anrufbeantworter anzeigt.
Ich hätte nun gerne eine Push- Nachricht,  sobald sich dieser Wert verändert.
Daher wollte ich den Wert des neuen Reading mit dem Oldrrading vergleichen und wenn die Änderung größer 1 ist die Nachricht versenden.
Leider enthält Oldreading offensichtlich nicht den Wert des vorherigen readings sondern den Wert vor der letzten Änderung.
Beispiel:
Reading1: 0
Old: 0
Reading2: 1
Old: 0
Reading3: 1
Old: 0 ----> hier hätte ich erwartet, dass Old auf 1 geht
Reading4: 2
Old: 1
Reading 1-4 sind das gleiche Reading nur andere Zeitpunkte.
Der Vergleich Reading > Old triggern nun leider bei 2, 3 und 4, sollte aber nur bei 2 und 4 ansprechen.
Jetzt verständlich?

Gruß
Dodger

juemuc

Hallo Dodger,

warum nutzt Du dafür nicht einfach ein notify oder doif?

Viele Grüße
Jürgen
3x Sonos Play 1, 1x Sonos Arc + Sub, 1 Sonos-One, 1x Sonos Playbar
FB6690 + FB7490 mit 4x Dect 200 und 3 Dect-ULE-Thermostate,  raspberry3B+, HM Funkmodul HM-MOD-RPI-PCB, HM Klingelsensor HM-Sen-DB-PCB, HM (IP) Fensterkontakte und  Amazon Echo Dot,  piVCCU, pi OS (bookworm).

MadMax-FHEM

Zitat von: juemuc am 20 Dezember 2021, 20:22:27
Hallo Dodger,

warum nutzt Du dafür nicht einfach ein notify oder doif?

Viele Grüße
Jürgen

Ganz genau.
Dann noch event-on-change-reading und es kommt nur ein Event, wenn sich der Wert ändert (zumindest sollte das so)...

Gruß, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

Dodger

#7
Wie würde man das mit einem notify oder doif aufbauen?
Ich brauche doch den alten bzw. vorherigen Wert des readings um zu wissen, ob sich der Wert verändert hat....

event-on-change Reading gilt doch dann für das ganze device (Fritzbox), oder?
ZitatWird event-on-change-reading für ein einzelnes Reading gesetzt, werden zunächst alle übrigen Readings nicht mehr protokolliert, erzeugen also keine Events mehr.
Ich habe aber noch mehr readings aus diesem Device  die ich für andere Zwecke nutze.

MadMax-FHEM

#8
Zitat von: Dodger am 20 Dezember 2021, 20:43:33
Wie würde man das mit einem notify oder doif aufbauen?

Wie immer: Eventmonitor aufmachen (Filter setzen), auf das passende Event warten oder provozieren, die Zeile markieren und dann notify/DOIF/FileLog/... anlegen lassen. Anpassen und fertig.
https://wiki.fhem.de/wiki/Event_monitor


Zitat von: Dodger am 20 Dezember 2021, 20:43:33
Ich brauche doch den alten bzw. vorherigen Wert des readings um zu wissen, ob sich der Wert verändert hat....
Und nein, genau dazu ist ja event-on-change-reading da...


Zitat von: Dodger am 20 Dezember 2021, 20:43:33
event-on-change Reading gilt doch dann für das ganze device (Fritzbox), oder?
Ich habe aber noch mehr readings aus diesem Device  die ich für andere Zwecke nutze.

Dann doch einfach mal in der commandref nachlesen!

Und es heißt event-on-change-READING und nicht event-on-change-DEVICE ;)

Gruß, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

Dodger

Irgendwie steh ich auf dem Schlauch....
Ein Notify hab ich schon, Triggern ist das Reading tam1_newMsg.
Das bedeutet aber, dass das Notify mit jedem Lesevorgang der Fritzbox getriggert wird.
Wo setze ich das event-on-change?
Im Fritzbox device oder im Notify?
Das Notify soll eigentlich nur ausgeführt werden, wenn tam1_newMsg vom vorheriger Reading kleiner ist als vom aktuellen Reading...

MadMax-FHEM

Das event-on-change nat. dort wo das Reading ist: commandref/Wiki lesen hilft...

Poste doch mal ein list von der FB und vom notify in code Tags...

Wie setzt du den Wert zurück?
Immer zurück auf 0?
Du kannst doch im notify den alten Wert abfragen, dann halt wieder das Attribut oldreadings und zur Abfrage OldReadingsVal/OldReadingsNum...

Gruß, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

Dodger

#11
hier die Lists von der Fritzbox (auf das Wesentliche reduziert) und dem Notify:
Internals:
   APICHECKED 1
   FUUID      619b7d3b-f33f-c598-4c64-8d454bd1a06d9cc2
   HOST       fritz.box
   INTERVAL   60
   LUAQUERY   1
   M3U_LOCAL  ./www/images/FritzBox_Status.m3u
   M3U_URL    http://192.168.1.86:8083/fhem/images/FritzBox_Status.m3u
   MODEL      FRITZ!Box 7590
   NAME       FritzBox_Status
   NR         122
   REMOTE     1
   SECPORT    49443
   STATE      WLAN: on gWLAN: off
   TELNET     0
   TR064      1
   TYPE       FRITZBOX
   WEBCM      0
   OLDREADINGS:
     2021-12-20 17:31:56   tam1_newMsg     0
   READINGS:
     2021-12-21 06:54:58   tam1            Anrufbeantworter
     2021-12-21 06:54:58   tam1_newMsg     1
     2021-12-21 06:54:58   tam1_oldMsg     16
     2021-12-21 06:54:58   tam1_state      on

   fhem:
     LOCAL      0
     definedHost undefined
     is_double_wlan 1
     lastHour   0
     modulVersion $Date: 2020-06-06 13:11:54 +0200 (Sat, 06 Jun 2020) $
     radioCount 40
     sid        513667ebc2e99113
     sidTime    1640066098
     610:
       brand      AVM
       id         1
       model      C4
       userId     1
   helper:
     TimerCmd   FritzBox_Status.Cmd
     TimerReadout FritzBox_Status.Readout
Attributes:
   INTERVAL   60
   boxUser    fritz9938
   oldreadings tam1_newMsg
   room       FritzBox


Internals:
   CFGFN     
   DEF        FritzBox_Status:tam1_newMsg:.* {if($EVTPART1 > OldReadingsNum('FritzBox_Status','tam1_newMsg', 0))
{fhem("set Push_Message message " .strftime("%H:%M",localtime). ": Neue Nachricht auf dem Anrufbeantworter | Telefon | Handy");
}}
   FUUID      61be40a1-f33f-c598-cc93-c431abb3730c5ba9
   NAME       push_AB
   NOTIFYDEV  FritzBox_Status
   NR         129222
   NTFY_ORDER 50-FritzBox_Status_notify_1
   REGEXP     FritzBox_Status:tam1_newMsg:.*
   STATE      inactive
   TRIGGERTIME 1640018276.31466
   TYPE       notify
   READINGS:
     2021-12-20 17:38:45   state           inactive
     2021-12-20 17:37:56   triggeredByDev  FritzBox_Status
     2021-12-20 17:37:56   triggeredByEvent tam1_newMsg: 1
Attributes:


natürlich steht das Notify auf "inactive" weil es ja nicht funktioniert.

Nochmal zum zeitlichen Ablauf:
die Readings in der FB werden alle 60 Sekunden aktualisiert. Aus diesen Readings werden mehrere Zustände abgeleitet (z.B. Anwesenheit über MAC Adressen).
Das Reading "tam_newMsg" gibt die Anzahl der neuen Meldungen auf dem Anrufbeantworter wieder.
Wenn dort neue Nachrichten dazukommen, möchte ich eine Push-Message bekommen.
Ob neue NAchrichten dazugekommen sind, kann man ermitteln indem man prüft, ob der neue Wert größer ist als der alte.

Das Problem mit OldReadings:
der Wert wird nicht mit jedem Auslesen (60s) aktualisiert sondern nur, wenn sich das echte Reading ändert.
Somit schlägt die Prüfung im Notify alle 60s an, da OldReading auf 0 steht und Reading auf 1.

Gruß
Dodger

rabehd

in der Fritzbox fehlt schon mal
attr FritzBox_Status event-on-change-reading tam1_newMsg

Im notify darauf reagieren.
Dort das oldreading abfragen und mit dem aktuellen Wert vergleichen.
Wenn aktuell größer als old, dann versende Deine Nachricht.

Auch funktionierende Lösungen kann man hinterfragen.

Dodger

wie schon gesagt:
ZitatWird event-on-change-reading für ein einzelnes Reading gesetzt, werden zunächst alle übrigen Readings nicht mehr protokolliert, erzeugen also keine Events mehr.

Ich brauche aber auch die anderen Readings, weil die auch notifys auslösen.
Die würden ja dann nicht mehr funktionieren, da keine Events mehr ausgelöst werden...

Dodger

ich habe mir jetzt über ein Dummy-device geholfen.
Finde ich zwar hässlich, funktioniert aber:
FritzBox_Status:tam1_newMsg:.* {if($EVTPART1 > ReadingsNum('tam1_newMsg_old','state', 0))
{fhem("set Push_Message message " .strftime("%H:%M",localtime). ": Neue Nachricht auf dem Anrufbeantworter | Telefon | Handy");
fhem("set tam1_newMsg_old $EVTPART1")}
else
{fhem("set tam1_newMsg_old $EVTPART1")}}