Device(s) automatisch löschen?

Begonnen von curt, 14 Dezember 2018, 16:11:23

Vorheriges Thema - Nächstes Thema

curt

Hallo,

ich habe gelernt, wie man Devices mit Attributen vollautomatisch anlegt, hier: Geräte im Netz als Device.

Da Geräte im Netz auch mal wieder verschwinden, wäre es schön, wenn man Devices vollautomatisch löschen könnte. Also in der Art "48 Stunden kein Reading erneuert" (oder: "48 Stunden nicht erreichbar") -> Device wird automatisch gelöscht.

Das soll natürlich nur für eine bestimmte Gruppe von Devices gelten, natürlich nicht global - das muss ich auch irgendwie berücksichtigen.

Geht so etwas? Wenn ja: Wir kann ich das bewerkstelligen?

Herzlichen Dank!
RPI 4 - Jeelink HomeMatic Z-Wave

rudolfkoenig

Ich wuerde mit einem at einmal am Tag pruefen, ob es Geraete gibt, deren Readings nicht neuer als X Tage sind.
Dafuer wuerde ich eine Routine in 99_myUtils.pm schreiben.
Falls gefunden, dann CommandDelete(undef, $nameOfTheDevice) aufrufen.

betateilchen

Zitat von: rudolfkoenig am 14 Dezember 2018, 18:25:09
Falls gefunden, dann CommandDelete(undef, $nameOfTheDevice) aufrufen.

und danach sollte man noch irgendwie ein "save" ausführen  8)
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

curt

Bis zum "save" ist noch ein sehr-sehr weiter Weg, das habe ich ja nicht einmal bei dem automatischen Anlegen von Devices.

@rudolfkoenig s Hinweise habe ich gelesen. Es scheitert daran, dass ich es nicht kann.
RPI 4 - Jeelink HomeMatic Z-Wave

betateilchen

Beschreibung des Prinzips:


  • ein loop über den hash aller devices
  • in jedem device ein loop über alle readings und schauen, ob ein readingsAge() kleiner als 86400 (Sekunden pro Tag) ist
  • gibt es ein reading mit einem "jüngeren" Alter, ist das device aktuell, falls nicht, kann es weg
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

curt

Bitte bedenke, dass ich so etwas noch nie machte ...

Zitat von: betateilchen am 15 Dezember 2018, 00:30:38
ein loop über den hash aller devices

Eine Routine in 99_myUtils.pm macht das. Sie wird von "at kurz nach Mitternacht" aufgerufen. Ich habe zwar keine Ahnung, wie man diese Routine konkret programmiert - aber so erstmal richtig verstanden?

Wobei "jede Device" nicht richtig ist. Ich müsste auf "192" oder besser gleich auf "192.168" vorfiltern.

Zitat von: betateilchen am 15 Dezember 2018, 00:30:38
in jedem device ein loop über alle readings und schauen, ob ein readingsAge() kleiner als 86400 (Sekunden pro Tag) ist

Auch eine Routine in 99_myUtils.pm, aufgerufen von der ersten Routine.
Beide Routinen irgendwas mit "while" vermutlich.

readingsAge() ist mir gänzlich neu. Danke für den Hinweis.

Zitat von: betateilchen am 15 Dezember 2018, 00:30:38
gibt es ein reading mit einem "jüngeren" Alter, ist das device aktuell, falls nicht, kann es weg

Ja. Wie das rein gedanklich zu bewerkstelligen ist, ist mir einigermaßen klar. Es scheitert an der Umsetzung, da bin ich zu unerfahren. (Auch das automatisierte Erstellen von Devices ist als Grundkonstrukt nicht von mir. Das war ein Code-Schnipsel im Forum. Der Autor hat mir dann noch was gezeigt. Und ich habe das dann richtig aufgebohrt. Aber das aufbohren wäre nie gegangen ohne diese ersten Schritte.)

Danke für Deine Hilfe.
RPI 4 - Jeelink HomeMatic Z-Wave

CBSnake

Moin,

versuch es doch mal hiermit:

https://forum.fhem.de/index.php?topic=68765.0

Überwachen und Filtern macht das Modul und wenn du sicher bist nix falsches zu erwischen kannst die Löscherei einbauen ;-)

Grüße
Achim
FHEM auf Debian 10, HM-Wlan, JeeLink-Wlan, Wlanduino, ConBee, TP-Link Steckdose, GHoma Steckdosen, Shelly Steckdosen

betateilchen

#7
Zitat von: CBSnake am 15 Dezember 2018, 06:32:17
versuch es doch mal hiermit:

man braucht nicht für jeden Pups ein zusätzliches Modul...

Dieser Schnipsel gehört in die 99_myUtils.pm:



sub check_dead() {
  my $maxAge   = 86400;
  my @checkDev = devspec2array("TYPE=at");
  my $alive    = 0;
 
  foreach my $d (@checkDev){
    $alive = 0;
    foreach my $r (keys %{$defs{$d}{READINGS}}){
      my $age = ReadingsAge($d,$r,0);
      $alive = 1 if ($age < $maxAge);
      Debug "device: $d reading: $r age: $age";
    }
    Debug "delete $d" unless $alive;
#    CommandDelete(undef,$d) unless $alive;
  }
}


Zitat von: curt am 15 Dezember 2018, 00:44:15
Wobei "jede Device" nicht richtig ist. Ich müsste auf "192" oder besser gleich auf "192.168" vorfiltern.

Dazu brauchst Du nur den Eintrag in devspec2array() im obigen Codeschnipsel anpassen.
Ebenso kannst Du das maximale Alter eines device dort anpassen, wo im Beispiel die 86400 steht.
Der tatsächliche Löschbefehl ist auskommentiert, stattdessen wird eine Debug Meldung ins Log geschrieben, wenn ein device zur Löschung ansteht. Das habe ich erstmal aus Sicherheitsgründen so gemacht, damit Du nicht irgendwann ein leeres FHEM hast :)
Für den Echtbetrieb musst Du den Löschbefehl natürlich noch aktivieren.

Zitat von: curt am 15 Dezember 2018, 00:44:15
Eine Routine in 99_myUtils.pm macht das. Sie wird von "at kurz nach Mitternacht" aufgerufen.

define at_check_dead at *00:01 {check_dead}
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

curt

@betateilchen
Danke für Deine Mühe und Deinen Langmut.

Zitat von: betateilchen am 15 Dezember 2018, 14:46:35
ZitatWobei "jede Device" nicht richtig ist. Ich müsste auf "192" oder besser gleich auf "192.168" vorfiltern
Dazu brauchst Du nur den Eintrag in devspec2array() im obigen Codeschnipsel anpassen.

Wäre es so richtig?

my @checkDev = devspec2array("TYPE=at":FILTER=device=192\.168");


Und dann hattest Du noch gesagt "save". Wäre es so richtig, eine Zeile unter Debug ...?

fhem ("save");
[code]


@CBSnake
Danke auch für Deine Antwort.
RPI 4 - Jeelink HomeMatic Z-Wave

betateilchen

Zitat von: curt am 16 Dezember 2018, 00:22:06
Wäre es so richtig?

das kann ich Dir erst dann beantworten, wenn Du irgendwann mal geschrieben hast, wonach Du die devices eigentlich selektieren willst.

Name? Typ? irgendwas anderes?

Wie man eine korrekte devspec definiert, ist in der commandref gut beschrieben.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

curt

Ich würde gern nach dem Namen selektieren.

Typische Device sieht so aus:

define 192.168.1.102 HTTPMOD http://192.168.1.102/wasmitJSON.txt 60


Ich würde gern auf den Namensanfang selektieren, also auf "192.168".

BTW: Ehe Du fragst: Dahinter steht eine Überwachung von Servern und allem, was irgendwie mit Linux spielt - aber nicht in Richtung Nagios. Ich habe doch keine Hochverfügbarkeitsrechenzentrum. Mir geht es um Fragen wie "oh, Updates liegen vor". Das ist zwar komplex. Aber den Teil habe ich in Griff. Und werde ihn gelegentlich auch im Forum der Kritik vorstellen.
RPI 4 - Jeelink HomeMatic Z-Wave

OdfFhem

Gib mal Folgendes in die FHEM-Kommandozeile ein:

list NAME=192.168.*

Mit \. könntest Du zwar noch den ersten Punkt maskieren, sollte aber in diesem Fall nicht notwendig sein, da es wahrscheinlich keine 192er-Devices ohne . gibt; der zweite Punkt darf allerdings auf keinen Fall maskiert werden.

Werden alle zu prüfenden FHEM-Devices angezeigt, kannst Du

my @checkDev = devspec2array("TYPE=at");

durch folgende Codezeile ersetzen

my @checkDev = devspec2array("NAME=192.168.*");

betateilchen

wenn es darum geht, auf den Namen der devices zu selektieren, ist das Ganze noch einfacher



my @checkDev = devspec2array("192.168.*");

-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

curt

@betateilchen
Issjacool. - Wenn ich in der Lage wäre, würde ich Dir den goldenen Papporden "Freundlicher Helfer des Tages" überreichen.

Leider fällt eine Konzeptschwäche meiner Konzeptidee auf, dazu muss ich ausholen:
NMAP geht über den Adressbereich und baut alles als Device, was da antwortet. Die IP-Device wird als

define 192.168.1.111 HTTPMOD http://192.168.127.111/schlauesJSON.txt 60

erstellt.

Nun hat aber nicht jeder meiner Server schon einen WebServer dabei, der das beantwortet. Und von Tablets und Handys (auch alle mit statischer IP) mal ganz zu schweigen, die werden das nie können.

Ergebnis des bisherigen Codes wäre, dass diese Devices rausgeknallt werden, obwohl sie eigentlich online sind, siehe:


2018.12.17 04:00:00 1: DEBUG>device: 192.168.127.111 reading: IP age: 365585
2018.12.17 04:00:00 1: DEBUG>delete 192.168.127.111


Richtig schlimm wäre das nicht: Sie werden ja mit gewissem Zeitverzug neu angelegt. - Ich weiß lediglich nicht, was da das bessere Konzept ist.

Offen ist auch noch #8: Geht automatisches "save"? Wie geht es? Will man das eigentlich?

@OdfFhem
Danke das Du mitliest.
RPI 4 - Jeelink HomeMatic Z-Wave

marvin78

Das Kommando "save" kann überall verwendet werden. Damit wäre ich allerdings vorsichtig.