Hauptmenü

alter eines Readings

Begonnen von tomspatz, 11 April 2021, 16:32:01

Vorheriges Thema - Nächstes Thema

tomspatz

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.  :-[

JoWiemann

Jörg Wiemann

Slave: RPi B+ mit 512 MB, COC (868 MHz), CUL V3 (433.92MHz SlowRF); FHEMduino, Aktuelles FHEM

Master: CubieTruck; Debian; Aktuelles FHEM

MadMax-FHEM

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

Sany

ich nutze das hier:
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!
fhem als LXC auf Proxmox auf einem minix Z100 , weitere LXC mit ZigBee2MQTT, MariaDB und Grafana. Homematic, FS20, mySensors, MQTT2, Tasmota, Shelly, Z-Wave  ....