ActionDetector: notify auf Statusmeldungen testen

Begonnen von ThorstenH, 11 Januar 2015, 14:10:02

Vorheriges Thema - Nächstes Thema

ThorstenH

Hallo,

ich habe ein notify erstellt, dass mir bei Statusänderungen der peers des ActionDetectors eine email schicken soll:
Internals:
   DEF        ActionDetector:status_.* {
  Log 1, "2: $EVTPART2";
  if ("$EVTPART2" eq "dead") {
    system("/volume1/addons/fhem/bin/sendmail.sh", "Dead device ($EVTPART1)", "Ein Device meldet sich nicht mehr: $EVENT");
  } else {
    if ("$EVTPART2" eq "alive") {
      system("/volume1/addons/fhem/bin/sendmail.sh", "Alive device ($EVTPART1)", "Ein Device hat sich zurueckgemeldet: $EVENT");
    } else {
      system("/volume1/addons/fhem/bin/sendmail.sh", "Unexpected device state ($EVTPART1)", "Ein Device hat einen unerwarteten state gemeldet: $EVENT");
    }
  }
}
   NAME       notify_actiondetector_status
   NOTIFYDEV  ActionDetector
   NR         136
   NTFY_ORDER 50-notify_actiondetector_status_dead
   REGEXP     ActionDetector:status_.*
   STATE      2015-01-11 13:57:13
   TYPE       notify
Attributes:
   room       Test

Um nicht 28 Stunden warten zu müssen, bis ein Türkontakt sein alive sendet oder nicht mehr sendet: kann ich das notify irgendwie manuell anstossen bzw. testen?

Folgenden habe ich versucht:
trigger ActionDetector status_threestatesensor_test: dead
Das funktioniert so weit (status wird aktualisiert), aber das notify wird scheinbar nicht ausgelöst.

Danke
Thorsten

frank

versuche als regex folgendes:

ActionDetector.status_.*

oder

ActionDetector.*dead.*

im log erscheint nichts? auch nicht mit verbose 4 oder 5 vom notify?
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

martinp876

{readingsSingleUpdate($defs{ActionDetector},"status_h_FstH","dead",1)}

wobei status_h_FstH natürlich status_<myEntity> ist.

Beachte auch die Sammlung von Events in HMInfo. Emails konnten auch bei anderen Ereignissen sinnvoll sein.

ThorstenH

Danke für die Antworten!

@frank:
Alles ausprobiert, keine Änderung. Auch nichts in verbose:5.

@Martin:
Das habe ich ausgeführt:
{readingsSingleUpdate($defs{ActionDetector},"status_threestatesensor_test","dead",1)}

Führt zu dem hier im Log:
2015-01-11 21:42:50.770 CUL_HM ActionDetector status_threestatesensor_test: dead

Aber: keine email und kein Eintrag im Log in der Art "2: $EVTPART2".

Das ist übrigens der gleiche Effekt, als wenn ich folgendes ausführe:
trigger ActionDetector status_threestatesensor_test: dead

Nur dass bei "readingsSingleUpdate" die Anzahl der "dead" devices im ActionDetector "state" nicht hochgezählt wird. Aber das nur nebenbei.

stromer-12

FHEM (SVN) auf RPi1B mit HMser | ESPLink
FHEM (SVN) virtuell mit HMLAN | HMUSB | CUL

ThorstenH

Ich habe jetzt %EVTPART1 verwendet:

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


So wird das notify dann auch ausgeführt. Allerdings stimmt da noch etwas nicht. Ich bekomme immer die mail mit dem Betreff "Unexpected device state(XXX)", wobei XXX der Wert ist, den ich mit Martins Befehl simuliert habe (alive oder dead).

Im Log steht auch immer:

2015.01.12 19:54:34.403 1: EVTPART0 =  %EVTPART0; EVTPART1 =  %EVTPART1; EVTPART2 =  %EVTPART2

Ich hätte gedacht, dass im Log die Werte von %EVTPART1, nicht der "Text" "%EVTPART1".

Komischerweise funktioniert das $EVTPART1 in der mail, bzw. dem "system()" Aufruf. Aber sobald ich $EVTPART1 irgendwoanders im ntify verwende, wird selbiges erst gar nicht ausgeführt.

Was mache ich denn falsch?

stromer-12

FHEM (SVN) auf RPi1B mit HMser | ESPLink
FHEM (SVN) virtuell mit HMLAN | HMUSB | CUL

ThorstenH


stromer-12

bei mir liefert:
Log 3,"2fach-Taster NAME = %NAME; EVTPART = %EVTPART1";
2015.01.12 20:19:38 3: 2fach-Taster NAME = HM_PB_2_WM55_01_Btn_01; EVTPART = Short_232
FHEM (SVN) auf RPi1B mit HMser | ESPLink
FHEM (SVN) virtuell mit HMLAN | HMUSB | CUL

ThorstenH

Ich habe gerade noch einmal ein update gemacht.

fhem> version
# $Id: fhem.pl 7528 2015-01-11 18:23:31Z rudolfkoenig $
# $Id: 10_CUL_HM.pm 7513 2015-01-11 07:36:40Z martinp876 $
# $Id: 01_FHEMWEB.pm 7526 2015-01-11 17:50:56Z rudolfkoenig $
# $Id: 10_FS20.pm 7070 2014-11-27 12:45:34Z rudolfkoenig $
# $Id: 92_FileLog.pm 7496 2015-01-10 16:54:23Z rudolfkoenig $
# $Id: 00_HMLAN.pm 7331 2014-12-27 09:38:13Z martinp876 $
# $Id: 98_HMinfo.pm 7444 2015-01-05 12:30:34Z martinp876 $
# $Id: 99_My_HM_CC_TC.pm
# $Id: 99_SUNRISE_EL.pm 6765 2014-10-14 18:24:29Z rudolfkoenig $
# $Id: 98_SVG.pm 7514 2015-01-11 09:43:59Z rudolfkoenig $
# $Id: 99_Utils.pm 7528 2015-01-11 18:23:31Z rudolfkoenig $
# $Id: 90_at.pm 7496 2015-01-10 16:54:23Z rudolfkoenig $
# $Id: 98_autocreate.pm 6505 2014-09-06 12:24:48Z rudolfkoenig $
# $Id: 91_notify.pm 7260 2014-12-19 12:50:49Z rudolfkoenig $
# $Id: 98_telnet.pm 6611 2014-09-24 07:48:32Z rudolfkoenig $
# $Id: 91_watchdog.pm 7108 2014-12-01 08:11:34Z rudolfkoenig $


Aber keine Änderung. Vielleicht liefert der Actiondetector keine EVTPARTs? Viel mehr Unterschied sehe ich nicht... %NAME wird auch nicht ausgegeben.

stromer-12

Ich habe die gleichen Versionsstände.

ich habe mal bei mir eingefügt:

ActionDetector:status_.* {
  Log 1, "0: EVTPART0 =  %EVTPART0; EVTPART1 =  %EVTPART1; EVTPART2 =  %EVTPART2";
  if ("%EVTPART1" eq "dead") {
    Log 1, "1: EVTPART0 =  %EVTPART0; EVTPART1 =  %EVTPART1; EVTPART2 =  %EVTPART2";
  } else {
    if ("%EVTPART1" eq "alive") {
      Log 1, "2: EVTPART0 =  %EVTPART0; EVTPART1 =  %EVTPART1; EVTPART2 =  %EVTPART2";
    } else {
      Log 1, "3: EVTPART0 =  %EVTPART0; EVTPART1 =  %EVTPART1; EVTPART2 =  %EVTPART2";
    }
  }
}


anschliessend:
trigger ActionDetector status_threestatesensor_test: dead

ergibt Ausgabe:
2015.01.12 21:36:47 1: 0: EVTPART0 =  status_threestatesensor_test:; EVTPART1 =  dead; EVTPART2 =  %EVTPART2
2015.01.12 21:36:47 1: 1: EVTPART0 =  status_threestatesensor_test:; EVTPART1 =  dead; EVTPART2 =  %EVTPART2


und der event von Actiondetector selbst:
2015.01.12 21:38:40 1: 0: EVTPART0 =  status_CUL_HM_HM_LC_BL1_FM_1C7B62:; EVTPART1 =  alive; EVTPART2 =  %EVTPART2
2015.01.12 21:38:40 1: 2: EVTPART0 =  status_CUL_HM_HM_LC_BL1_FM_1C7B62:; EVTPART1 =  alive; EVTPART2 =  %EVTPART2

FHEM (SVN) auf RPi1B mit HMser | ESPLink
FHEM (SVN) virtuell mit HMLAN | HMUSB | CUL

ThorstenH

Tja, was soll ich sagen. Obwohl die $ Variablen in dem system Aufruf funktionieren MUSS ich sie durch % Variablen ersetzen, wenn ich sie gleichzeitig an anderen Stellen im Script verwenden will.

Also: alle $ Variablen durch % Variablen ersetzen und es funktioniert:
ActionDetector:status_.* {
  Log 1, "EVTPART0 =  %EVTPART0; EVTPART1 =  %EVTPART1 ; EVTPART2 =  %EVTPART2";
  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");
    }
  }
}


Da hat mich die Referenz total durcheinandergebracht, wo es heisst
ZitatIn der Anweisung von Notify kann das auslösende Ereignis (Event) genutzt werden:
Die Anweisung $EVENT wird das komplette Ereignis (Event) beinhalten, z.B. measured-temp: 21.7 (Celsius)
$EVTPART0,$EVTPART1,$EVTPART2,etc enthalten die durch Leerzeichen getrennten Teile des Events der Reihe nach (im Beispiel also $EVTPART0="measured-temp:", $EVTPART1="21.7", $EVTPART2="(Celsius)".
Diese Daten sind verfügbar als lokale Variablen in Perl, als Umgebungs-Variablen für Shell-Scripts, und werden als Text ausgetauscht in FHEM-Kommandos.
$NAME enthält den Namen des Ereignis auslösenden Gerätes, z.B. myFht
Achtung: Folgende Vorgehensweise ist abgekündigt und wird in einem zukünftigen Release von FHEM nicht mehr unterstützt. Wenn keine der oben genannten Variablen ($NAME/$EVENT/usw.) in der Anweisung gefunden wird, werden Platzhalter ersetzt.

Habe ich irgendwie falsch verstanden.

Danke für den Support!

stromer-12

Ne, ich habe mich durch EVTPART2 irritieren lassen.
Das erzeugt mit $EVENTPART bei nichtvorhanden sein eine Fehlermeldung.

In der Referenz steht auch im nächsten Absatz, das die Varialen mit % beginnen demnächst verschwinden.

Noch funktionieren beide, nur %Variable erzeugt bei nichtvorhandener Variable keinen Fehler.
FHEM (SVN) auf RPi1B mit HMser | ESPLink
FHEM (SVN) virtuell mit HMLAN | HMUSB | CUL

Strida

Sehr interessanter thread. Allerdings mit zwei Stolperfallen:
.) Es muss "$" verwendet werden.
.) "$EVTPART2" scheint es nicht mehr zu geben.

Bei mir funktioniert das obige Beispiel - adaptiert für Telegram - auf diese Art:

define Notify_ActionDetection notify ActionDetector:status_.* { \
Log 1, "ACTION: EVTPART0 = ".$EVTPART0." | EVTPART1 = ".$EVTPART1;; \
if( $EVTPART1 eq "dead" ) { \
fhem( "set teleBot message DEAD device: ".$EVTPART0 ) ;; \
} elsif ( $EVTPART1 eq "alive" ) { \
fhem( "set teleBot message ALIVE device: ".$EVTPART0 ) ;; \
} else { \
fhem( "set teleBot message ACTION\n device: ".$EVTPART0."\n State: ".$EVTPART1 ) ;; \
} \
}

wolfram

Guten Abend,

ich hänge mich hier mal rein, wenn auch alter Thread.
Gibt es eine Möglichkeit einen bestimmten Part NICHT auszugeben?

Hintergrund ist der, dass ich nicht genau weiß, wie lang mein Event ist. Allerdings möchte ich den ersten Part NICHT ausgeben.

Ich verwende ein notify um eine Benachrichtigung über den Senderwechsel zu bekommen, möchte aber nicht "CURRENTTITLE" ausgeben.

Mein notify sieht so aus:

define n_Senderwechsel notify VuPlus:currentTitle.* set lametric msg '$EVTPART1 $EVTPART2 $EVTPART3 $EVTPART4 $EVTPART5 $EVTPART6 $EVTPART7 $EVTPART8 $EVTPART9'


Nun war mein Gedanke, dass ich einfach einen Sack voll EVTPARTS definiere, leider werden die leeren als $EVTPARTx - x als Text ausgegeben. Ziel ist es also nur den Titel ohne $EVTPART0 auszugeben.

Hat jemand eine Idee?

viele Grüße
wolf