Telegram Nachricht per Watchdog an mehrere Empfänger

Begonnen von Unicorn, 01 Oktober 2017, 11:41:35

Vorheriges Thema - Nächstes Thema

Unicorn

Hallo zusammen,

um nach dem Öffnen eines Fensters nach einer gewissen Zeit eine Erinnerung über Telegram zu bekommen, dieses wieder zu schließen, habe ich einen Watchdog eingerichtet. Die Nachricht soll jeweils nur gesendet werden, wenn derjenige auch daheim ist. Dafür verwende ich das Presence-Modul.

define Fenster_timer watchdog FSensor.Fenster:open 00:05:00 FSensor.Fenster:closed {\
fhem("set MsgBot message Fenster schließen") if(Value("Phone1") eq "present" );;\
fhem("set MsgBot message @123456789 Fenster schließen") if(Value("Phone2") eq "present" );; }
attr AZ.Fenster_timer autoRestart 1
attr AZ.Fenster_timer regexp1WontReactivate 1


Phone1 ist dabei der defaultPeer, daher hier kein @.
Leider bekommt Phone2 aber nie eine Nachricht über den Watchdog. "set MsgBot message @123456789 Fenster schließen" über die Befehlsleiste von FHEM gesendet funktioniert. Auch wenn ich die beiden Befehle vertausche und dabei die Presence-Abfrage belasse, wird nur die Nachricht an den defaultPeer gesendet. Ebenso wenn ich die if-Abfrage weglasse. Es liegt also nicht an der Anwesenheit.

Was mache ich falsch?

PS: Ich weiß, nie die fhem.cfg direkt bearbeiten. Aber von dort hier rein kopieren macht den Code m.E. übersichtlicher ;-)

MKeY

#1
pass auf, 2 sachen:
1. wenn du fhem("code etc") schreibst, dann wird in der fhem python umgebung dein @12345678 als variable erwartet, die es nicht gibt. daher nachfolgende lösung
2. die if struktur solltest du dir noch einmal ansehen, da es nur wie in der nachfolgenden lösung (meiner meinung nach) gedacht ist:

define Fenster_timer watchdog FSensor.Fenster:open 00:05:00 FSensor.Fenster:closed {\
if(Value("Phone1") eq "present" ) {fhem("set MsgBot message Fenster schließen")} ;;\
if(Value("Phone2") eq "present" ) {fhem('set MsgBot message @123456789 Fenster schließen')} ;; }


alternativ auch möglich:

define Fenster_timer watchdog FSensor.Fenster:open 00:05:00 FSensor.Fenster:closed {\
if(Value("Phone1") eq "present" ) {fhem("set MsgBot message Fenster schließen")} ;;\
if(Value("Phone2") eq "present" ) {fhem("set MsgBot message " . '@123456789' . " Fenster schließen")} ;; }


ggf dein DEF des notifys posten und dann editier ich es dir, da dein auszug aus der cfg ggf fehleranfällig und schwer testbar durch mich ist :)
Wer Fehler findet, darf sie behalten!
RPi's, D1Mini
Homematic, Hue, Sonoff, Alexa, Xiaomi, ConBee
Prusa MK2.5, Prusa MK3S (MMU2S vorhanden, aber nervtötend)
Lowrider 2CNC

igami

Guck mal in dein Log, da steht bestimmt was bezüglich @123456789.
@ leitet in Perl ein array ein und muss daher mit einem \ maskiert werden.
Pi3 mit fhem.cfg + DbLog/logProxy
Komm vorbei zum FHEM Treffen im Kreis Gütersloh! Das nächste Mal im April 2020.

MAINTAINER: archetype, LuftdatenInfo, monitoring, msgDialog, Nmap, powerMap
ToDo: AVScene, FluxLED

JanHH

Zitat von: Unicorn am 01 Oktober 2017, 11:41:35

...
fhem("set MsgBot message @123456789 Fenster schließen") if(Value("Phone1") eq "present" );;\
...


Das @ leitet in Perl ein Array ein, wenn der String in doppelten Anführungszeichen (" ") interpoliert wird - genau wie ein $ eine skalare Variable einleitet und ein % einen Hash.
Entweder das @ als Literal kennzeichnen (escapen): \@123456789 oder einfacher den String ohne Interpolation übergeben, indem man statt " " einfache Anführungszeichen (Hochkomma) ' ' nimmt.
Möglicherweise musst du sogar beides tun, falls der String nach der Übergaben an fhem(...) noch einmal interpoliert wird.


Unicorn

#4
So, bin endlich mal dazu gekommen, Eure Vorschläge zu testen. Die Tips waren goldrichtig, nachdem ich "" durch '' ersetzt habe, klappt es.

Das "if" habe ich nach wie vor hinter der fhem-Anweisung, als ich es wie von MKeY vorgeschlagen nach vorne gestellt habe, bekam ich keine Nachrichten mehr. Warum, konnte ich nicht rausfinden, aber solage es läuft... Die Variante mit "if" hinter der Anweisung habe ich übrigens aus einem Beispiel übernommen. Eigentlich hätte ich es auch vor die Anweisung gestellt.

Danke für Eure Hilfe!


Noch eine Frage für eine Schönheitskorrektur:

Wenn das Fenster länger offen steht, kommen nach einer unbestimmten (variablen) Zeit erneute Nachrichten über Telegram. Wie kann ich vermeiden, dass das passiert? Ggf. wäre eher eine neue Nachricht nach einer fest definierten Zeit gut.

Würde es helfen, das Attribut AutoRestart rauszunehmen und den Watchdog stattdessen nach einer gewissen Zeit oder beim Schließen der Fenster neu zu aktivieren (wenn ich das richtig verstanden habe, geht das über "trigger Fenster_timer" ?