[gelöst] Readingwert auf Änderung überwachen

Begonnen von Wolle02, 16 Januar 2024, 11:04:15

Vorheriges Thema - Nächstes Thema

Wolle02

Hallo zusammen, vielleicht sehe ich den Wald vor lauter Bäumen nicht, aber gibt es eine Möglichkeit den Wert eines Readings auf Änderungen zu überwachen? Eigentlich dachte ich, dass der ReadingsWatcher mir hier helfen könnte, aber der prüft nur auf die Änderung des Zeitstempels des Readings und nicht auf den Readingwert selber.

Hintergrund ist ein HTTPMOD-Device, das mir regelmäßig Daten aus einer Datenbank ausliest; sprich der Zeitstempel ändert sich regelmäßig auch wenn sich der Wert des Readings nicht ändert.
Event-on-change-reading habe ich gesetzt, hilft aber leider auch nicht weiter.

rabehd

Zitat von: Wolle02 am 16 Januar 2024, 11:04:15Event-on-change-reading habe ich gesetzt, hilft aber leider auch nicht weiter.
Wieso nicht?
Was soll denn bei welcher Änderung passieren?
Auch funktionierende Lösungen kann man hinterfragen.

juemuc

Schon Mal ein notify getestet?
Am besten über den Eventmonitor anlegen.

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).

Wolle02

Ein notify reagiert ja auf Events, das erzeugt wird, wenn sich etwas ändert. Ich möchte aber gerne darauf reagieren, dass sich nichts ändert. In dem Fall werden ja auch keine Events erzeugt. Deshalb kam ich auf die Idee mit dem ReadingsWatcher. Das funktioniert aber nicht, weil die Zeitstempel regelmäßig aktualisiert werden.

Icinger

timestamp-on-change-reading
Dieses Attribut enthält eine durch Kommata getrennte Liste von Readings. Wenn gesetzt, werden die gelisteten Readings nicht aktualisiert (oder angelegt) wenn durch ein ebenfalls gesetztes event-on-change-reading für dieses Reading kein Ereignis erzeugen würde.

lg, Stefan
Verwende deine Zeit nicht mit Erklärungen. Die Menschen hören (lesen) nur, was sie hören (lesen) wollen. (c) Paulo Coelho

Otto123

Zitat von: Wolle02 am 17 Januar 2024, 06:00:39Ein notify reagiert ja auf Events, das erzeugt wird, wenn sich etwas ändert. Ich möchte aber gerne darauf reagieren, dass sich nichts ändert. In dem Fall werden ja auch keine Events erzeugt.
Jedes setzen eines Readings erzeugt einen Event, egal ob sich was ändert. Es sei denn, man hat die Events (wie Du offenbar) mit event-on-change-reading verhindert.

Du schreibst aber Eingangs, Du willst ermitteln ob sich was ändert, jetzt schreibst Du, Du willst reagieren wenn sich nicht ändert. Dafür wäre ein watchdog gut, aber nur wenn Du die Events wieder zulässt.
Also entferne event-on-change-reading
Mach den Eventmonitor auf und filtere die Events des Devices.
Markiere die Zeile mit dem reading wo Du reagieren willst und lass Dir ein watchdog erzeugen.
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Wolle02

#6
Ja, beim nachträglichen Lesen habe ich das tatsächlich etwas missverständlich geschrieben. Ich hab gedacht durch den Bezug auf den ReadingsWatscher würde sich das erklären, weil der ja dafür da ist zu überwachen, wenn sich Readings eben nicht mehr ändern. Sorry dafür.

Ich habe das event-on-change-readings jetzt entfernt. Jetzt kommen zwar alle 10 Minuten Events, wenn das HTTPMOD Daten aus der Datenbank liest, aber das bringt mich ja leider nicht weiter, weil die Events ja auch dann kommen, wenn der Wert eines Readings sich nicht ändert, weil halt in der Datenbank kein neuer Wert drinsteht.

Sprich ich bräuchte eine Lösung für das Problem auf das Nichtändern eines Readings zu reagieren, obwohl Events kommen. Deshalb hatte ich event-on-change-Reading gesetzt, damit eben keine Events mehr kommen, weil ich dachte, dass dann der ReadingsWatcher das Nichtändern erkennt. Das tut er aber leider nicht, weil sich der Timestamp ändert egal ob ein Event kommt oder nicht.
Verwirrend, ich weiß :-)


Icinger

Also ich würde trotzdem eine Kombi aus

event-on-change und
timestamp-on-change

nehmen und dann den readingsWatcher auf dieses Reading drauf ansetzen.

Damit solltest du eigentlich genau das erreichen, was ich so herauslesen :)

lg, Stefan
Verwende deine Zeit nicht mit Erklärungen. Die Menschen hören (lesen) nur, was sie hören (lesen) wollen. (c) Paulo Coelho

frank

httpmod selbst bietet auch werkzeuge zur überwachung an.
damit erkennt man allerdings nicht, ob die quelle (datenbank) noch neue werte sendet:

Zitatreplacing reading values when they have not been updated / the device did not respond

    If a device does not respond then the values stored in readings will keep the same and only their timestamp shows that they are outdated. If you want to modify reading values that have not been updated for a number of seconds, you can use the attributes
        (reading|get)[0-9]*(-[0-9]+)?MaxAge
        (reading|get)[0-9]*(-[0-9]+)?MaxAgeReplacementMode
        (reading|get)[0-9]*(-[0-9]+)?MaxAgeReplacement
    Every time the module tries to read from a device, it will also check if readings have not been updated for longer than the MaxAge attributes allow. If readings are outdated, the MaxAgeReplacementMode defines how the affected reading values should be replaced. MaxAgeReplacementMode can be text, reading, internal, expression or delete.
    MaxAge specifies the number of seconds that a reading should remain untouched before it is replaced.
    MaxAgeReplacement contains either a static text that is used as replacement value or a Perl expression that is evaluated to give the replacement value. This can be used for example to replace a temperature that has not bee updated for more than 5 minutes with the string "outdated - was 12":
        attr PM readingMaxAge 300
        attr PM readingMaxAgeReplacement "outdated - was " . $val
        attr PM readingMaxAgeReplacementMode expression The variable $val contains the value of the reading before it became outdated.
    If the mode is delete then the reading will be deleted if it has not been updated for the defined time.
    If you want to replace or delete a reading immediatley if a device doid not respond, simply set the maximum time to a number smaller than the update interval. Since the max age is checked after a HTTP request was either successful or it failed, the reading will always contain the read value or the replacement after a failed update.
FHEM: 6.0(SVN) => Pi3(buster)
IO: CUL433|CUL868|HMLAN|HMUSB2|HMUART
CUL_HM: CC-TC|CC-VD|SEC-SD|SEC-SC|SEC-RHS|Sw1PBU-FM|Sw1-FM|Dim1TPBU-FM|Dim1T-FM|ES-PMSw1-Pl
IT: ITZ500|ITT1500|ITR1500|GRR3500
WebUI [HMdeviceTools.js (hm.js)]: https://forum.fhem.de/index.php/topic,106959.0.html

Wolle02

Zitat von: Icinger am 17 Januar 2024, 08:29:02Also ich würde trotzdem eine Kombi aus

event-on-change und
timestamp-on-change

nehmen und dann den readingsWatcher auf dieses Reading drauf ansetzen.

Damit solltest du eigentlich genau das erreichen, was ich so herauslesen :)

lg, Stefan

Danke, die Kombo hab ich noch nicht probiert. Ich berichte nach.

Wolle02

#10
Zitat von: frank am 17 Januar 2024, 10:38:18httpmod selbst bietet auch werkzeuge zur überwachung an.
damit erkennt man allerdings nicht, ob die quelle (datenbank) noch neue werte sendet:


Danke, aber damit bin ich dann leider auch nicht weiter als mit dem ReadingsWatcher.
Aber das muss ich mir nochmal genauer durchlesen.

Wolle02

Zitat von: Icinger am 17 Januar 2024, 08:29:02Also ich würde trotzdem eine Kombi aus

event-on-change und
timestamp-on-change

nehmen und dann den readingsWatcher auf dieses Reading drauf ansetzen.

Damit solltest du eigentlich genau das erreichen, was ich so herauslesen :)

lg, Stefan

Hallo Stefan, das sieht sehr gut aus. Ich glaube das ist die Lösung; so generiert der ReadingsWatcher auch einen timeout.  :D
Vielen Dank für den Tip.

gruß
Wolle