FHEM Forum

FHEM => Automatisierung => DOIF => Thema gestartet von: heikoh81 am 01 Dezember 2018, 17:31:03

Titel: DOIF: Aktion auslösen bei error im DOIF (IO::Socket::INET: connect: timeout)
Beitrag von: heikoh81 am 01 Dezember 2018, 17:31:03
Hallo zusammen,

ich habe mehrere TP-Link WiFi-Steckdosen HS100 im Einsatz, die ich mit einem ganz einfachen DOIF schalte.

([PollinGarage:"on"])
##cmd_1
(set TPLink1 on)
DOELSEIF ([PollinGarage:"off"])
##cmd_2
(set TPLink1 off)
DOELSE ()
##cmd_3


Die WLAN-Versorgung ist sehr gut, trotzdem kommt es alle paar Tage an einer oder mehreren Steckdosen vermutlich genau in dem Moment, wenn ich den Befehl sende, zu einem Fehler.
Führe ich den Befehl kurz danach manuell über einen Dummy nochmals aus, klappt es direkt.

Im DOIF habe ich eine Fehlermeldung:
error: set TPLink1 on: Couldn't connect to 192.168.178.191:9999: IO::Socket::INET: connect: timeout

Meine Frage:
Wie müsste ich das DOIF erweitern, dass bei genau dieser error-Meldung der jeweilige Befehl z.B. nach 60 Sekunden ein- oder mehrmals wiederholt wird - irgendwann wird es dann schon klappen.
repeatcmd & repeatsame sind mir bekannt und auch im Einsatz.
Aber wie muss ich das DOIF gestalten, dass bei Auftreten eines error im DOIF dies ausgelöst wird?
Könnte man die error-Meldung auch ganz konkret auf den oben gezeigten error-Text filtern?
Dann könnte ich nämlich auch ganz einfach on/off unterscheiden.
Bzw. dann könnte ich einfach 2 weitere DOELSEIF-Zeilen machen, die durch die error-Meldung getriggert werden.

Viele Grüße,
Heiko
Titel: Antw:DOIF: Aktion auslösen bei error im DOIF (IO::Socket::INET: connect: timeout)
Beitrag von: Ellert am 01 Dezember 2018, 23:56:06
Du könntest auf z.B. auf [$SELF:"error: set TPLink1 on"] triggern und den Befehl mit wait verzögern.
Titel: Antw:DOIF: Aktion auslösen bei error im DOIF (IO::Socket::INET: connect: timeout)
Beitrag von: heikoh81 am 02 Dezember 2018, 17:02:24
Danke für die schnelle Antwort.
Habe das gleich mal eingebaut.

Allerdings liefert das DOIF dann sofort:
e_di_PollinGarage_events
wait_timer: no timer,Device: di_PollinGarage,e_di_PollinGarage_events: wait_timer: no timer,Device: di_PollinGarage,e_di_PollinGarage_events: wait_timer: no timer,Device: di_PollinGarage,e_di_PollinGarage_events: wait_timer: no timer,Device: di_PollinGarage


Viele Grüße,
Heiko
Titel: Antw:DOIF: Aktion auslösen bei error im DOIF (IO::Socket::INET: connect: timeout)
Beitrag von: heikoh81 am 02 Dezember 2018, 21:48:55
Ich habe mein DOIF jetzt so umgebaut:

([PollinGarage:"on"])
##cmd_1
(set TPLink1 on)
DOELSEIF ([PollinGarage:"off"])
##cmd_2
(set TPLink1 off)
DOELSEIF ([$SELF:"on: Couldn"])
##cmd_3
(set TPLink1 on)
({DebianMail('mail@xyz.de','TPLink1 on Fehlerwiederholung $DEVICE','siehe Betreff')})
DOELSEIF ([$SELF:"off: Couldn"])
##cmd_4
(set TPLink1 off)
({DebianMail('mail@xyz.de','TPLink1 off Fehlerwiederholung $DEVICE','siehe Betreff')})
DOELSE ()
##cmd_5



Begründung:
"error: set TPLink1 on"
ist nicht der Suchtext, sondern mit error: meinte ich das reading des DOIF!

Funktioniert denn der : im Suchstring
[$SELF:"off: Couldn"]
Titel: Antw:DOIF: Aktion auslösen bei error im DOIF (IO::Socket::INET: connect: timeout)
Beitrag von: Ellert am 02 Dezember 2018, 23:08:23
Da das DOIF sich selbst triggern soll, musst Du auch das Attribut selftrigger setzen.

Du kanst auf alles Triggern, was im Eventmonitor als Event angezeigt wird, wenn der reguläre Ausdruck, den Du verwendest, dazu passt.
Titel: Antw:DOIF: Aktion auslösen bei error im DOIF (IO::Socket::INET: connect: timeout)
Beitrag von: heikoh81 am 03 Dezember 2018, 20:20:04
Also
führt dazu, dass das DOIF in cmd_5 jede Sekunde ausgeführt wird.

Es sollte natürlich nur selftriggern, wenn es auf Fehler läuft.
Wie geht es richtig?
Titel: Antw:DOIF: Aktion auslösen bei error im DOIF (IO::Socket::INET: connect: timeout)
Beitrag von: Damian am 03 Dezember 2018, 20:58:31
Ich würde persönlich selftrigger meiden und das "Beobachten" des error-Readings von außen mit einem separaten DOIF vornehmen.
Titel: Antw:DOIF: Aktion auslösen bei error im DOIF (IO::Socket::INET: connect: timeout)
Beitrag von: heikoh81 am 03 Dezember 2018, 22:05:46
Ok, ich habe die 2 neuen Zeilen jetzt einfach mal in ein eigenes DOIF ausgelagert:


([di_TPLink1Aktor:"on: Couldn"])
##cmd_1
(set TPLink1 on)
({DebianMail('mail@xyz.de','TPLink1 on Fehlerwiederholung $DEVICE','siehe Betreff')})
DOELSEIF ([di_TPLink1Aktor:"off: Couldn"])
##cmd_2
(set TPLink1 off)
({DebianMail('mail@xyz.de','TPLink1 off Fehlerwiederholung $DEVICE','siehe Betreff')})
DOELSE ()
##cmd_3