FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: tomspatz am 11 April 2021, 16:32:01

Titel: alter eines Readings
Beitrag von: tomspatz am 11 April 2021, 16:32:01
ich würde gerne ein Konstrukt bauen welches das Alter des Battereie Readings aller devices abfragt.
Es gibt jaschüne Beispiele z.B. mit DOIF oder auch watchdog die auf events triggern aber ich möchte halt auf das Alter des jeweiligen Readings auswerten.

Also wenn das reading  battery älter ist wie 36 Stunden -> dann

Ich habe schon mit einigen Suchbegiffen geschaut abe komme irgendwie nicht weiter. Bitte um anstupser.  :-[
Titel: Antw:alter eines Readings
Beitrag von: JoWiemann am 11 April 2021, 16:56:57
Kurz gesucht und das gefunden: https://forum.fhem.de/index.php?topic=50783.0

Grüße Jörg
Titel: Antw:alter eines Readings
Beitrag von: MadMax-FHEM am 11 April 2021, 17:30:18
Also wenn es dir reicht zyklisch abzufragen, ob bestimmte Readings länger nicht mehr aktualisiert wurden, dann hier mal was ich täglich um 17:00 bzgl. ZWave Batterie-Devices laufen lasse (ein Reagieren ist ja schwer weil es kommt ja eben kein Event ;)  ):


sub my_CheckZWaveDevices()
{
  my @ZWaveDevices = devspec2array("TYPE=ZWave");
  my $ActDevice = "na";
  my $WakeupInterval = 65535;

  # loop through all ZWave-Devices
  foreach $ActDevice (@ZWaveDevices)
  {
    if(AttrVal($ActDevice, "disable", "0") eq "1")
    {
      Log3(undef, 1, "my_CheckZWaveDevices Device $ActDevice disabled.");
      next;
    }
 
    # check if the Device has wakeupReport available (Battery-Device)
#    if(ReadingsVal($ActDevice, "wakeupReport", "na") ne "na")
    if(ReadingsVal($ActDevice, "wakeup", "na") ne "na")
    {
      $WakeupInterval = ReadingsNum($ActDevice, "wakeupReport", 65535);
#      if(ReadingsAge($ActDevice, "wakeup", 3 * $WakeupInterval) > 2 * $WakeupInterval)
      if((ReadingsAge($ActDevice, "wakeup", $WakeupInterval) > 2 * $WakeupInterval) && (ReadingsAge($ActDevice, "battery", $WakeupInterval) > 2 * $WakeupInterval))
      {
        Log3(undef, 1, "my_CheckZWaveDevices     Device $ActDevice is dead!");
        fhem("set $myTelegramBot message $ActDevice is dead!");
      }
    }
    else
    {
      Log3(undef, 1, "my_CheckZWaveDevices Device $ActDevice ignored.");
    }

    Log3(undef, 1, "my_CheckZWaveDevices     ActDevice: $ActDevice       WakeupInterval: $WakeupInterval");
  }
}


Da sich ZWave Batterie-Geräte (im Standard) meist nur ca. 1x am Tag melden reicht mir die einmalige Abfrage am Tag um 17:00 durch ein at.

Ich lasse mir zunächst alle ZWave Devices geben, dann schaue ich ob welche disabled sind (manche Geräte nutze ich nicht immer) und dann "frage" ich das Device wie die "Meldeeinstellungen" sind und schaue, ob das Reading älter als 2x dieses Interval ist.

Wenn ja: Nachricht, wenn nein: alles gut.

Gruß, Joachim
Titel: Antw:alter eines Readings
Beitrag von: Sany am 11 April 2021, 17:54:09
ich nutze das hier:
https://fhem.de/commandref.html#readingsWatcher (https://fhem.de/commandref.html#readingsWatcher)

funktioniert prima und ist, glaube ich, genau was Du suchst.
Es erzeugt im jeweiligen Device ein Reading, was sowas wie alive/dead annehmen kann. Das nutzt Du dann um ein DOIF/notify zu triggern um z.B. eine Pushmessage zu schicken.

Viel Erfolg!