Lebenszeichen überwachen, actiondetector

Begonnen von ThorstenH, 15 Januar 2015, 21:17:40

Vorheriges Thema - Nächstes Thema

ThorstenH

hallo,

Ich möchte die Lebenszeichen von meinen devices überwachen. Immer wenn eine gewisse Zeit kein Signal kommt, soll fhem mir eine Mail schicken. Das funktioniert inzwischen ganz gut.

Jetzt kommt immer mal wieder ein "unknown" State. Den würde ich gerne ignorieren und

...eine Mail schicken, wenn der State im actiondetector für ein Device auf dead springt
...eine Mail schicken, wenn der State im actiondetector für ein Device von dead auf alive springt.

Wenn der State z. B. von unknown auf alive springt, will ich keine Mail versenden.

Wie bekomme ich das hin? Kann man auf den vorherigen Wert einer Variablen (%EVTPART1) zugreifen? Oder erst bei einer bestimmten Änderung von/auf triggern?

Mein aktueller notify code:
ActionDetector:status_.* {
  if ("%EVTPART1" eq "dead") {
    system("/volume1/addons/fhem/bin/sendmail.sh", "Dead device (%EVTPART0)", "Ein Device meldet sich nicht mehr: %EVENT");
  } else {
    if ("%EVTPART1" eq "alive") {
      system("/volume1/addons/fhem/bin/sendmail.sh", "Alive device (%EVTPART0)", "Ein Device hat sich zurueckgemeldet: %EVENT");
    } else {
      system("/volume1/addons/fhem/bin/sendmail.sh", "Unexpected device state (%EVTPART0)", "Ein Device hat einen unerwarteten state gemeldet: %EVENT");
    }
  }
}


wmr72

#1
attr Actiondetector event-on-change-reading .*

Danach werden Events nur noch für Zustandsänderungen generiert, das müsste wenn ich Dich richtig verstanden habe das sein was Du willst.

EDIT: das hilft natürlich nicht, ich hab überlesen dass du unknown->alive ignorieren willst, sorry.

betateilchen

Ich würde das einfach über HMinfo lösen, da gibt es einen event, sobald ein Device als "dead" erkannt wird. Und man kann einfach auslesen, um welches Gerät es sich handelt.

(Dass ich mal HMinfo empfehlen würde, hätte ich auch nie gedacht...)

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

ThorstenH

Ja genau, ich möchte genau bei diesen beiden events eine mail bekommen.

Zu HMInfo: ich habe dieses virtuelle device schon mal angelegt. Bietet das denn auch wirklich für beides eine Lösung?:

Zitat...eine Mail schicken, wenn der State im actiondetector für ein Device auf dead springt
...eine Mail schicken, wenn der State im actiondetector für ein Device von dead auf alive springt.

Ich müsste mich da neu einlesen, daher würde ich gerne vorher wissen, wenn die zweite mail damit nicht machbar ist.

frank

ZitatIch müsste mich da neu einlesen, daher würde ich gerne vorher wissen, wenn die zweite mail damit nicht machbar ist.
lesen bildet, kann somit nie unnötig sein. hminfo bietet sehr viel mehr.

grundsätzlich brauchst du einen speicher, der dir den letzten zustand speichert, da dich gewisse übergänge nicht interessieren. die mail musst du dann in abhängigkeit vom letzten und aktuellen zustand senden. so wie du das möchtest. einen speicher kannst du mit einem dummy oder über ein zusätzliches reading mit setreading realisieren. eventuell kann man das auch über hminfo oder doif. alle möglichkeiten sind aufwändig, da man sich bei so einem speziellen fall genau einlesen muss. probieren geht über studieren.
FHEM: 6.0(SVN) => Pi3(buster)
IO: CUL433|CUL868|HMLAN|HMUSB2|HMUART
CUL_HM: CC-TC|CC-VD|SEC-SD|SEC-SC|SEC-RHS|Sw1PBU-FM|Sw1-FM|Dim1TPBU-FM|Dim1T-FM|ES-PMSw1-Pl
IT: ITZ500|ITT1500|ITR1500|GRR3500
WebUI [HMdeviceTools.js (hm.js)]: https://forum.fhem.de/index.php/topic,106959.0.html

peterk_de

#5
Ich mache das der Einfachheit halber auch über den ActionDetector, da dich ja nur die Änderungen interessieren, und HMInfo event-on-change-reading nicht sauber unterstützt (es generiert Events, die man für den folgenden Ansatz zusätzlich unterdrücken müsste, wie schon erwähnt über einen DUMMY, das war mir zu aufwendig - ich hatte dazu auch eine längere Diskussion dazu ...)

Aber mit dem Actiondetector geht das prima:


system.actiondetector.*status_.* {
        my $device;
my $ev;
my $headline = "Systemwarnung";
my $priority = "0";
if($EVENT =~ m/.*status_(.*):\s(.*)/) {
  $device = AttrVal($1,"alias",$1);
  $ev = $2;
  if ($ev eq "unknown") {$ev = "Seit kurzem kein Kontakt zu $device!";$priority = "-1";}
  elsif ($ev eq "dead") {$ev = "Sensor $device länger ausgefallen!";}
  elsif ($ev eq "alive") {$ev = "Sensor $device online.";$priority = "-1";$headline = "Systemmeldung";}
  fhem("set system.pushover.default msg '$headline' '$ev' 'iPhone_Peter' $priority 'mechanical' ");
  fhem("set system.pushover.default msg '$headline' '$ev' 'iPad' $priority 'mechanical' ");
    }
}


Den Namen vom Actiondetector (Hier: system.actiondetector) und den Aufruf für die Notifizierung musst du dir natürlich noch entsprechend anpassen. Das Notify ersetzt auch den Devicenamen durch sein Alias, falls vorhanden.

Edit: Hups ich sehe gerade du willst den Übergang unknown -> alive ausfiltern, das tut das natürlich nicht. Ich habe aber die Erfahrung, dass wenn der status "unknown" ist, das Gerät i.d.R. genauso tot ist wie bei "dead", es kommt nur früher ne Meldung. Daher stört mich das nicht so.
FHEM auf Ubuntu-VM / 2xNUC Proxmox Cluster
UI: HomeKit, TabletUI, Grafana
IOdevs: 2xHueBridge, RaspiMatic-CCU, CUL868, 2xHarmonyHub, 6xRaspi-Roomnode mit CO2, VOC und lepresenced
Devices: 107xHomematic(IP), 96xPhilips Hue, 17xTECHEM, 12xBTLE, 8xSONOS, 2xHomeConnect, 1xShelly 3em, 1xNanoleaf ...

ThorstenH

Hallo,

Anfangs bekam ich für einige Fensterkontakte den State "unknown", daher dachte ich, das käme häufiger vor. Aber inzwischen geht mein Testkontakt immer direkt von alive auf dead und umgekehrt. Daher hat sich mein Problem erledigt. Ein Zugriff auf den vorherigen Wert einer Variable/readings usw. fände ich trotzdem cool.

Danke für den Support!

martinp876

unknown kommt, wenn FHEM seit Start kein lebenszeichen von device gesehen hat, die zeit seit start aber noch in der toleranz ist.
Es wird versucht, beim neustart die werte von vorher zu übernehmen. Daher gibt es nicht nach jedem neustart zu einem unknown. wohl aber, wenn man das statefile löscht.

Ein device, das sich erst nach 24h oder 3 Tagen melden muss kann schon einige Zeit auf unknown stehen. macht man ein getConfig (so das device darauf reagieren kann) wird der state auf alive gesetzt (wenn es sich meldet). Nicht aber auf dead, wenn es sich nicht meldet.

Mr. P

Hej folks,

habe gerade ein kleines Verständnisproblem und hoffe, ihr könnt mir weiterhelfen. :-)
Wenn ich über ein Notify am ActionDetector ein Event auslösen möchte, komme ich sichtlich nicht ohne weiters an den eigentlichen Gerätenamen, da dieser ja Teil von EventPart0 ist. Also: status_<DEVICENAME>:
Dadurch gelingt es mir auch nicht wirklich, den Alias des Geräts auszulesen oder weitere Tests mit Werten von dem Gerät durchzuführen.
Gibt es eine Möglichkeit, die sich mir gerade nicht erschließt, oder muss ich zwangsläufig mit Regex arbeiten und alle Zeichen nach dem ersten Unterstrich und vor dem letzte Zeichen herausfiltern, um an das gewünschte Ergebnis zu kommen?

Vielen Dank für eure Antworten! :-)
Greetz,
   Mr. P

martinp876

Wie waers mit get actionDetector listDevice dead

Mr. P

Zitat von: martinp876 am 03 April 2015, 20:49:56
Wie waers mit get actionDetector listDevice dead
Hej Martin,

danke für deine Antwort.
Womöglich hab ich gerade auch nur ein Brett vorm Kopf, aber inwiefern hilft mir das, um mir ein Notify zu bauen?
Oder hast du gemeint, sobald der ActionDetector ein Device als dead meldet, kann ich unter zu Hilfenahme des 'get' die entsprechende Liste ausgeben lassen?

Was ich gerne konkret machen möchte, wäre eine Benachrichtigung von dem entsprechenden Gerät zu versenden, sofern dieses die Spannung mitüberträgt und diese unter den Wert xy gesunken ist. Insofern ist die Liste nur bedingt brauchbar, als das nur ein Gerät drinnen stehen dürfte (oder ich müsste die Liste zerpflücken und durchiterieren).
Greetz,
   Mr. P

martinp876

Der actiondetector meldet zyklisch. Du kannst bei change die liste der toten durch das get bekommen, dafuer ist es gedacht.
Du kannst aber auch auf das event triggern, das beim device kommt, welches tot ist.
Kann man auch bauen.

Mr. P

Zitat von: martinp876 am 03 April 2015, 21:05:27
Der actiondetector meldet zyklisch. Du kannst bei change die liste der toten durch das get bekommen, dafuer ist es gedacht.
Einfach zum Ausgeben einer Liste perfekt. Zum einfachen Weiterverarbeiten der einzelnen Geräte nicht soooo gut geeignet. :-)

Zitat von: martinp876 am 03 April 2015, 21:05:27
Du kannst aber auch auf das event triggern, das beim device kommt, welches tot ist.
Kann man auch bauen.
Wäre mein nächster Ansatz gewesen.
Wollte mir nur das Eintragen bei allen in Frage kommenden Geräten ersparen. Schließlich gibt es den Trigger vom ActionDetector ja schon.
Ich würd' mir den ActionDetector ja umbauen, aber ist ohne deine Unterstützung gerade einmal bis zum nächsten Update sinnvoll.

Du würdest nicht vielleicht ein paar ähnliche Änderungen wie diese in Erwägung ziehen (ist hier natürlich nur ein User-Attribut)?
--- /tmp/10_CUL_HM.pm 2015-03-25 12:26:25.178528707 +0100
+++ /usr/lib/fhem/FHEM/10_CUL_HM.pm 2015-04-04 01:52:05.328492889 +0200
@@ -6947,13 +6947,15 @@
   my @event;
   my ($cntUnkn,$cntAliv,$cntDead,$cnt_Off) =(0,0,0,0);
   my $autoTry = CUL_HM_getAttrInt($actName,"actAutoTry",0);
+  my $useDeviceNameOnly = AttrVal("ActionDetector","use-devicename-only",0);
   
   foreach my $devId (split(",",$peerIDs)){
     next if (!$devId);
     my $devName = CUL_HM_id2Name($devId);
     
     if(AttrVal($devName,"ignore",0)){
-      delete $actHash->{READINGS}{"status_".$devName};
+      if($useDeviceNameOnly eq 1) { delete $actHash->{READINGS}{$devName}; }
+      else { delete $actHash->{READINGS}{"status_".$devName}; }
       next;
     }
     
@@ -7013,7 +7015,8 @@
       $attr{$devName}{actStatus} = $state;
       Log3 $actHash,4,"Device ".$devName." is ".$state;
     }
-    push @event, "status_".$devName.":".$state;
+    if ($useDeviceNameOnly eq 1) { push @event, $devName." :".$state; }
+    else { push @event, "status_".$devName.":".$state; }
   }
   push @event, "state:"."alive:".$cntAliv
                        ." dead:".$cntDead
Greetz,
   Mr. P

martinp876

Du musst es nicht an jedem device eintragen, du kannst ein entity-unabhaengiges notify bauen. Einfach nur activity auswerten.
Deinen vorschlag sehe ich mir an

frank

Zitat von: Mr. P am 03 April 2015, 19:15:38
Hej folks,

habe gerade ein kleines Verständnisproblem und hoffe, ihr könnt mir weiterhelfen. :-)
Wenn ich über ein Notify am ActionDetector ein Event auslösen möchte, komme ich sichtlich nicht ohne weiters an den eigentlichen Gerätenamen, da dieser ja Teil von EventPart0 ist. Also: status_<DEVICENAME>:
Dadurch gelingt es mir auch nicht wirklich, den Alias des Geräts auszulesen oder weitere Tests mit Werten von dem Gerät durchzuführen.
Gibt es eine Möglichkeit, die sich mir gerade nicht erschließt, oder muss ich zwangsläufig mit Regex arbeiten und alle Zeichen nach dem ersten Unterstrich und vor dem letzte Zeichen herausfiltern, um an das gewünschte Ergebnis zu kommen?

Vielen Dank für eure Antworten! :-)

verstehe ich da was falsch, oder sollte das nicht zb so zu ermitteln sein (eine zeile für die fhem.cfg  :) ):
my $dev = $1 if($EVTPART0 =~ m/^status_(.*):$/);;\

FHEM: 6.0(SVN) => Pi3(buster)
IO: CUL433|CUL868|HMLAN|HMUSB2|HMUART
CUL_HM: CC-TC|CC-VD|SEC-SD|SEC-SC|SEC-RHS|Sw1PBU-FM|Sw1-FM|Dim1TPBU-FM|Dim1T-FM|ES-PMSw1-Pl
IT: ITZ500|ITT1500|ITR1500|GRR3500
WebUI [HMdeviceTools.js (hm.js)]: https://forum.fhem.de/index.php/topic,106959.0.html