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
Du könntest auf z.B. auf [$SELF:"error: set TPLink1 on"] triggern und den Befehl mit wait verzögern.
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
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
- do always
- repeatsame 0:0:5:5:0 ==> falls die Verbindung tatsächlich dauerhaft abgebrochen ist, soll nicht ewig versucht werden zu schalten
- wait 0:0:60,3:60,3:0
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"]
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.
Also
- attr selftrigger wait
- wait 1:1:60,3:60,3:1
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?
Ich würde persönlich selftrigger meiden und das "Beobachten" des error-Readings von außen mit einem separaten DOIF vornehmen.
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
- repeatsame 5:5:0
- [wait 60,3:60,3:0/li]