DOIF auf eine DeviceList triggern

Begonnen von bismosa, 15 November 2022, 15:55:02

Vorheriges Thema - Nächstes Thema

bismosa

Hallo!

Ich bin gerade dabei ein etwas komplexeres (Perl) DOIF umzusetzen. Hier geht es darum, eine Fehlerliste für meine Devices aufzubereiten für die Anzeige in FTUI (3).
Ich möchte um 18:00 meine Devices prüfen, ob diese über einen längeren Zeitraum keinen Statuswechsel mehr hatten:
DeviceNotReachable{
[18:00];
my @Devs=();
push @Devs, (split(",",([?@:"^Fenster_":state:ReadingsAge($name,"state",0) > 86400])));
push @Devs, (split(",",([?@:"^Water_":state:ReadingsAge($name,"state",0) > 604800])));
set_Reading("ErrorDevices", join(",",@Devs),1);
....
}

Soweit habe ich es hinbekommen.
Nun möchte ich aber auch den Fehler wieder löschen, wenn ein Device das in der Liste "ErrorDevices" gelistet ist wieder einen Status übermittelt.
Lässt sich das irgendwie umsetzen, das ich nicht auf alle Devices prüfen muss? Ich habe ja bereits im Reading "ErrorDevices" eine Liste mit Geräten, die den Fehlerstatus haben.
"Manuell" habe ich es bisher so:

if ("$DEVICE" ne ""){
if (!(get_Reading("ErrorDevices") =~ m/$DEVICE/)){
return;
}
}

Vielleicht ist dies auch der richtige Weg? Wenn ich es bisher richtig verstanden habe, habe ich keine Chance auf eine Änderung des ReadingsAge zu triggern?


Btw: Ist es eigentlich beim Perl-Doif mit dieser Schreibweise möglich eine Und-Bedingung einzubauen? Bisher wird immer getriggert:
((["^Fenster_"]) and (ReadingsVal("$SELF","Error_Fenster_Count",0)))

Gruß
Bismosa
1x nanoCUL 433MHz (SlowRF Intertechno) für Fenstersensoren
1x nanoCUL 868Mhz für MAX (9x HT 1xWT)
1x ZigBee CUL
Weiteres: Squeezebox server, Kindle Display, ESP8266, Löterfahrung, ...

rabehd

Ich überwache Device mit dem Modul readingsWatcher.
Auch funktionierende Lösungen kann man hinterfragen.

Damian

Zitat von: bismosa am 15 November 2022, 15:55:02
Hallo!

Ich bin gerade dabei ein etwas komplexeres (Perl) DOIF umzusetzen. Hier geht es darum, eine Fehlerliste für meine Devices aufzubereiten für die Anzeige in FTUI (3).
Ich möchte um 18:00 meine Devices prüfen, ob diese über einen längeren Zeitraum keinen Statuswechsel mehr hatten:
DeviceNotReachable{
[18:00];
my @Devs=();
push @Devs, (split(",",([?@:"^Fenster_":state:ReadingsAge($name,"state",0) > 86400])));
push @Devs, (split(",",([?@:"^Water_":state:ReadingsAge($name,"state",0) > 604800])));
set_Reading("ErrorDevices", join(",",@Devs),1);
....
}

Soweit habe ich es hinbekommen.
Nun möchte ich aber auch den Fehler wieder löschen, wenn ein Device das in der Liste "ErrorDevices" gelistet ist wieder einen Status übermittelt.
Lässt sich das irgendwie umsetzen, das ich nicht auf alle Devices prüfen muss? Ich habe ja bereits im Reading "ErrorDevices" eine Liste mit Geräten, die den Fehlerstatus haben.
"Manuell" habe ich es bisher so:

if ("$DEVICE" ne ""){
if (!(get_Reading("ErrorDevices") =~ m/$DEVICE/)){
return;
}
}

Vielleicht ist dies auch der richtige Weg? Wenn ich es bisher richtig verstanden habe, habe ich keine Chance auf eine Änderung des ReadingsAge zu triggern?


Btw: Ist es eigentlich beim Perl-Doif mit dieser Schreibweise möglich eine Und-Bedingung einzubauen? Bisher wird immer getriggert:
((["^Fenster_"]) and (ReadingsVal("$SELF","Error_Fenster_Count",0)))

Gruß
Bismosa

Wenn du das Fragezeichen rausnehmen würdes, dann würde dein Splitbefehl auf jedes Event von z. B. ^Fenster_ reagieren.

Die Frage ist nur: Will man das? Denn dann wird jedes mal das gesamte System geprüft.

Du könntest auch im Stundentakt abfragen.

Und auch die letzte if-Abfrage geht.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

bismosa

Hallo!

Zitat von: Damian am 15 November 2022, 16:43:53
Wenn du das Fragezeichen rausnehmen würdes, dann würde dein Splitbefehl auf jedes Event von z. B. ^Fenster_ reagieren.

Die Frage ist nur: Will man das? Denn dann wird jedes mal das gesamte System geprüft.
Gerade deswegen habe ich das Fragezeichen drin. Ich möchte eigentlich nicht auf jedes Event reagieren um die Systemlast so gering wie möglich zu halten.

Um nicht auf alle Events zu reagieren könnte ich mir auch in FTUI einen Button einbauen. Dann wird einfach erneut geprüft.
Oder ich erfasse die Anzahl...nur wenn ein entsprechendes Device dabei ist, wird wieder auf alle Devices reagiert. Ich vermute allerdings, das ich dann mit:

Zitat von: bismosa am 15 November 2022, 15:55:02
Btw: Ist es eigentlich beim Perl-Doif mit dieser Schreibweise möglich eine Und-Bedingung einzubauen? Bisher wird immer getriggert:
((["^Fenster_"]) and (ReadingsVal("$SELF","Error_Fenster_Count",0)))
nicht weiter komme?

Ich dachte nur, das ich vielleicht eine Möglichkeit übersehen habe, wie ich auf eine Devicelist reagieren könnte.

Gruß
Bismosa
1x nanoCUL 433MHz (SlowRF Intertechno) für Fenstersensoren
1x nanoCUL 868Mhz für MAX (9x HT 1xWT)
1x ZigBee CUL
Weiteres: Squeezebox server, Kindle Display, ESP8266, Löterfahrung, ...

Damian

Du musst schon Kompromisse eingehen. Wenn Aktualität dann auch mehr Last.

Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF