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!
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.
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)
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.
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
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.
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
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}
@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.
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.
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.
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.*");
wenn es darum geht, auf den Namen der devices zu selektieren, ist das Ganze noch einfacher
my @checkDev = devspec2array("192.168.*");
@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.
Das Kommando "save" kann überall verwendet werden. Damit wäre ich allerdings vorsichtig.
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.
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.
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)
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.