FHEM Forum

FHEM => Sonstiges => Thema gestartet von: curt am 14 Dezember 2018, 16:11:23

Titel: Device(s) automatisch löschen?
Beitrag von: curt am 14 Dezember 2018, 16:11:23
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!
Titel: Antw:Device(s) automatisch löschen?
Beitrag von: rudolfkoenig am 14 Dezember 2018, 18:25:09
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.
Titel: Antw:Device(s) automatisch löschen?
Beitrag von: betateilchen am 14 Dezember 2018, 22:33:28
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)
Titel: Antw:Device(s) automatisch löschen?
Beitrag von: curt am 14 Dezember 2018, 22:42:43
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.
Titel: Antw:Device(s) automatisch löschen?
Beitrag von: betateilchen am 15 Dezember 2018, 00:30:38
Beschreibung des Prinzips:

Titel: Antw:Device(s) automatisch löschen?
Beitrag von: curt am 15 Dezember 2018, 00:44:15
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.
Titel: Antw:Device(s) automatisch löschen?
Beitrag von: CBSnake am 15 Dezember 2018, 06:32:17
Moin,

versuch es doch mal hiermit:

https://forum.fhem.de/index.php?topic=68765.0 (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
Titel: Antw:Device(s) automatisch löschen?
Beitrag von: betateilchen am 15 Dezember 2018, 14:46:35
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}
Titel: Antw:Device(s) automatisch löschen?
Beitrag von: curt am 16 Dezember 2018, 00:22:06
@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.
Titel: Antw:Device(s) automatisch löschen?
Beitrag von: betateilchen am 16 Dezember 2018, 00:57:14
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.
Titel: Antw:Device(s) automatisch löschen?
Beitrag von: curt am 16 Dezember 2018, 01:29:14
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.
Titel: Antw:Device(s) automatisch löschen?
Beitrag von: OdfFhem am 16 Dezember 2018, 07:27:56
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.*");
Titel: Antw:Device(s) automatisch löschen?
Beitrag von: betateilchen am 16 Dezember 2018, 12:29:08
wenn es darum geht, auf den Namen der devices zu selektieren, ist das Ganze noch einfacher



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

Titel: Antw:Device(s) automatisch löschen?
Beitrag von: curt am 17 Dezember 2018, 04:10:30
@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.
Titel: Antw:Device(s) automatisch löschen?
Beitrag von: marvin78 am 17 Dezember 2018, 06:27:39
Das Kommando "save" kann überall verwendet werden. Damit wäre ich allerdings vorsichtig.
Titel: Antw:Device(s) automatisch löschen?
Beitrag von: betateilchen am 17 Dezember 2018, 17:36:26
Zitat von: curt am 17 Dezember 2018, 04:10:30
Ich weiß lediglich nicht, was da das bessere Konzept ist.

Das bessere Konzept wäre, vorher nachzudenken :) Sorry - was für Deine Anwendung das "bessere" Konzept wäre, kann ich nicht beantworten, das hängt von Deinen konkreten Anforderungen ab. Aber wenn das Geräte sind, die eine IP haben, würde ich mal darüber nachdenken, ob ein presence auf diese devices nicht besser/zuverlässiger auszuwerten wäre.

Zitat von: curt am 17 Dezember 2018, 04:10:30
Offen ist auch noch #8: Geht automatisches "save"? Wie geht es? Will man das eigentlich?

Geht. Aber niemand will das wirklich. Ruckzuck ist die gesamte Konfiguration zerschossen.
Titel: Antw:Device(s) automatisch löschen?
Beitrag von: curt am 18 Dezember 2018, 03:24:49
Zitat von: marvin78 am 17 Dezember 2018, 06:27:39
Das Kommando "save" kann überall verwendet werden. Damit wäre ich allerdings vorsichtig.

Hab' verstanden.

Zitat von: betateilchen am 17 Dezember 2018, 17:36:26
Das bessere Konzept wäre, vorher nachzudenken :)

Ach naja ... ich bin ja nun auch schon drei Tage im Geschäft (meint: EDV/IT). Das Spiel ist seit Anbeginn immer gleich:

Kunde: Ich hätt' da gern.

Programmierer: Kein Problem, geht alles. Sag' an!

Kunde: Also ich hätte gern ...

Programmierer (unterbricht): Also daaaas geht nicht. Lerne mal was geht.

Kunde (verunsichert): Ähmm, was geht denn, darf ich das haben?

Programmierer: Also das geht und das geht und das.

Kunde (noch verunsicherter): Also ich könnte dies und das ja kombinieren und dann wird das ...?

Programmierer: Also sooo geht das aber nicht. Erstmal sage, was Du willst.

Sicherheitshalber @betateilchen
Nein, kein Angriff gegen Dich. Ich bin Dir sehr dankbar, Du hast mir sehr geholfen.
Ich beschrieb lediglich, was seit sicher 40 Jahren das eigentliche IT-Problem ist.
Titel: Antw:Device(s) automatisch löschen?
Beitrag von: betateilchen am 18 Dezember 2018, 09:55:14
Dann hast Du aber in den vergangenen 40 Jahren nicht sonderlich viel dazugelernt  8)

(sage ich einfach mal als jemand, der auch seit über 40 Jahren in dieser Branche unterwegs ist)
Titel: Antw:Device(s) automatisch löschen?
Beitrag von: curt am 23 Dezember 2018, 04:44:28
Ich tue mich sehr schwer mit einer Antwort.

Aus meiner Sicht hast Du nicht verstanden, was ich sagen wollte. Das wird an mir liegen, ich habe in #16 das Problem leider doch nicht darstellen können.

Egal. Du hast mir sehr geholfen. Wenn ich könnte, würde ich Dir meinen Papporden "Freundlicher Helfer des Tages" überreichen.

Ok, bei freundlich gibt es einen leichten Punktabzug, aber die Hilfe überwiegt das deutlich.

Ich wünsche Dir -und allen, die mir im Thread helfen wollten- frohe und gesegnete Weihnachten.