Homematic: Push Nachricht bei niedrigem Batteriestand
Ich verwende Homematic schon seit einiger Zeit und habe etliche Geräte im ganzen Haus verteilt. Dabei sind sehr viele Unterputzgeräte, wie etwa Dimmer oder Schalter, doch es sind auch einige batteriebetriebene Geräte dabei. Je nachdem, wie häufig die Geräte senden und empfangen müssen, kann die Batterie bis zu 1,5 Jahre halten. Die Laufzeit der Batterien hat aber auch viel mit der Entfernung zur Basis CCU2 zu tun.
Ein Gerät, das weiter entfernt steht, muss durch Übertragungsfehler häufiger senden. Auch mein Haustürsensor wird wahrscheinlich öfter angesprochen als mein Sensor am Schlafzimmerfenster. Gerade bei Sensoren, die für wichtige Funktionen wie etwa einer Alarmanlage (Fenstersensor) genutzt werden, sollte daher vorher alarmieren, wenn sich die Batterielaufzeit dem Ende neigt. Natürlich werden diese Meldungen in der CCU2 gesammelt und dort auch angezeigt, doch hier schauen die wenigsten von Euch regelmäßig rein.
Die meisten Geräte besitzen eine Status-LED, doch auch diese ist bei vielen meiner Geräte nicht sichtbar, da ich die Sensoren unauffällig verbauen wollte. Doch wie bekomme ich jetzt mit, das eine Batterie ans Ende gekommen ist?
Ich verwende auch dafür die Push-Benachrichtigung auf mein iPhone. Wir haben Euch hier bereits erklärt, wie Ihr die Push-Funktion sehr einfach über den kostenlosen Dienst Telegram einbinden könnt.
Wenn Ihr dieses Tutorial bereits durchlaufen habt, muss in der CCU2 nur noch ein Programm angelegt werden, das auf diesen Dienst zugreift und bei Bedarf eine Push-Nachricht an Euer Handy absetzt.
So geht Ihr vor:
Um ein neues Programm zu erstellen klickt Ihr auf „Programme und Verknüpfungen“ dann auf „Programme & Zentralenverknüpfung“ und im unteren Feld auf den Button „Neu“.
Bei Bedingung wählen wir nun das Gerät aus, dass wir überwachen wollen. In diesem Beispiel verwende ich einen optischen Fenstersensor aus.
Nun wählen wir noch das Ereignis aus, auf welches getriggert werden soll. Hier kann direkt „Batterie leer“ ausgewählt werden. Im nächsten Feld wählen wir „bei Änderung auslösen“. So bekommen wir nur eine Push-Nachricht, wenn sich der Batterie-Status von unserem Sensor von gut nach Batterie wird schwach ändert. Diese Meldung taucht dann auch nur einmal auf, sodass Ihr nicht ständig von neuen Meldungen überschüttet werdet.
Nun müssen wir noch ein Ereignis auswählen, dass ausgeführt wird. Dazu gehen wir auf „Aktivität: Dann..“ und klicken auf das grüne Plus.
Hier wählen wir „Skript“ aus und klicken auf Skript erstellen.
Es öffnet sich nun ein neues Fenster, indem ein Skript eingefügt werden kann. Hier geht Ihr folgendes ein:
string stderr;
string stdout;
string url=“\“https://api.telegram.org/bot16XXXX329:AAE8l0fWzIfhVfaRrXXXXaNxrLBCZk/sendMessage?chat_id=238XXX8&text=Batterie leer vom Gerät Fenstersensor\““;
system.Exec(„wget –no-check-certificate -q -O – „#url, &stdout, &stderr);
Am besten Ihr kopiert einfach den Text oben und fügt ihn in das Fenster ein, damit das Skript auch funktioniert, müsst Ihr aber noch Eure Parameter, die Ihr aus dem Push-Tutorial bekommen habt einfügen.
Ihr müsst bei botXXXX Euren Bot einfügen, und bei chat_id Eure eigene ID eintragen. Den Text könnt Ihr anschließend frei gestalten.
Hier habe ich als Beispiel „Batterie leer vom Gerät Fenstersensor“ eingefügt. Ihr könnt aber auch jeden anderen beliebigen Text verwenden.
Nun sendet Euch Eure CCU2 eine Push-Benachrichtigung, wenn dieser Sensor leer wird. Leider muss der Vorgang für jeden Sensor wiederholt werden, den Ihr auf diese Weise überwachen wollt. Ich habe nur Sensoren damit ausgestattet, an denen ich die Status-LED nicht direkt einsehen kann.
Auf diese Art und Weise könnt Ihr aber auch andere Push-Nachrichten bei einem Ereignis absetzen.
Viel Spaß beim ausprobieren!
Hallo zusammen, ich weiß nicht, was ich falsch mache – sind meine ersten Versuche mit den Skripten bei Homematic / Raspberrymatic…
Wenn ich das Skript (copy&paste und die o.g. ids anpassen) fehlerprüfen möchte, kommt jedes mal folgender Fehler:
Skript:
string stderr;
string stdout;
string url=“\“https://api.telegram.org/bot16XXXX329:AAE8l0fWzIfhVfaRrXXXXaNxrLBCZk/sendMessage?chat_id=238XXX8&text=Batterie leer vom Gerät Fenstersensor\““;
system.Exec(„wget –no-check-certificate -q -O – „#url, &stdout, &stderr);
Fehler:
Error 1 at row 3 col 13 near ^\https://api.telegram.org/bot16XXXX329:AAE8l0fWzIfhVfaRrXXXXaNxrLBCZk/sendMessag
Parse following code failed:
string stderr;
string stdout;
string url=\https://api.telegram.org/bot16XXXX329:AAE8l0fWzIfhVfaRrXXXXaNxrLBCZk/sendMessage?chat_id=238XXX8&text=Batterie leer vom Gerät Fenstersensor\;
system.Exec(wget no-check-certificate -q -O #url, &stdout, &stderr);
PS: Der Fehler immer auf, egal, was ich anpasse etc. Mir ist aber aufgefallen, dass wenn ich die fertig angepasste URL (mit meiner Chat-ID und dem korrekten bot direkt in den Browser eingebe, die gewünschte Nachricht versandt wird, also ich die Chat-ID und den bot korrekt eingegeben habe.
Hallo Sebastian, ich habe noch die alten Rauchmelder im Einsatz HM-Sec-Sd die bieten den Batteriekanal nicht als abfrage an. Hast Du eine Idee wie ich eine Meldung bei Batterie leer bekommen kann.
Danke für Deine tolle Arbeit und schöne Grüße
frank
Hi Frank, ja geht mir leider auch so und werde dann immer schön Nachts mit piepen geweckt wegen dem Batteriestatus :( Bisher habe ich auch noch keine Idee, wie man das abfangen kann :(
Gruß, Markus
Hi,
kann man nicht per Script den Gerätenamen vom Auslöser gleich mitgeben?
Grüße
Manuel
Hallo,
dieser Beitrag ist zwar etwas „of topic“ aber da er zu Telegram und Push Nachrichten passt, wollte ich hier als Neuling mal meine Fragen los werden:
1. Ich höre immer wieder, daß Scripte mit System.exec zu CCU Abstürzen führen können. Daher empfehlen viele CCUXDaemon zu nutzen. Das ist bei dem Script oben nicht der Fall. Wird das Problem überschätzt?
2. Ich habe von einem ebenfalls sehr guten Forum von Christian Luetgens u.g. Programm übernommen, um mir Push Nachrichten von der CCU senden zu lassen. leider klappt das nur sporadisch und nicht zuverlässig. Ich kann leider nicht erkenne, wo der Fehler sitzt. Grundsätzlich sollte das Script die Systemvariable „Telegram“ auslesen und wenn diese gesetzt ist, diese pushen und dann wieder auf „0“ setzten.
Sieht jemand einen Fehler in dem Script?
! HomeMatic-Script
! TELEGRAM-FRAMEWORK
! http://www.christian-luetgens.de/homematic/telegram/telegramframework/T-Framework.htm
object o_msg = dom.GetObject („Telegram“);
if (o_msg.Value() != „“) {
string s_cmd = „wget –no-check-certificate –quiet -O /dev/null \“https://api.telegram.org/bot394582310:AAF8dlndVB4a-EKCLjdH6INH-TMXXXXXXXX/sendMessage?chat_id=XXXXXXX&text=“ # o_msg.Value() # „\““;
dom.GetObject(„CUxD.CUX2801004:2.CMD_EXEC“).State (s_cmd);
o_msg.State („“);
}
! Ende des Scripts
Hallo, erstmal ein Dickes Dankeschön für die tolle und Verständliche Ausführung hier!
Ein kleiner Punkt würde ich gerne mit allen Teilen, weil ich da gestern fast dran verzweifelt wäre: Beim Copy&Paste von dem Script bauen sich Fehler ein, wie die Anführungszeichen und die – Striche. Das sieht man auch im direkt Vergleich des Scripts und des Screenshots. Also hier Tip an alle: Genau checken, das alles so wie in dem Screenshot steht, dann klappt es auch mit dem Script!
VG
Ich habs modifiziert im Einsatz. Nutze eine Variable „@Message“, die ich in jedem Programm ggf. belege. Es gibt ein extra Programm was eben jene Variable überwacht und bei „Wenn @Message = „-“ bei Aktualiserung, dann nix, ansonsten HomeTAicScript zum pushen“. inkl. Sonderzeichenersetzung …
string message = dom.GetObject(„@Message“).State();
string messagefix = „“;
string index;
foreach(index, message.Split(„ä“)) { if (messagefix == „“) { messagefix = index; } else { messagefix = messagefix # „%C3%A4“ # index; } }
message = messagefix;
messagefix = „“;
foreach(index, message.Split(„Ä“)) { if (messagefix == „“) { messagefix = index; } else { messagefix = messagefix # „%C3%84“ # index; } }
message = messagefix;
messagefix = „“;
foreach(index, message.Split(„ö“)) { if (messagefix == „“) { messagefix = index; } else { messagefix = messagefix # „%C3%B6“ # index; } }
message = messagefix;
messagefix = „“;
foreach(index, message.Split(„Ö“)) { if (messagefix == „“) { messagefix = index; } else { messagefix = messagefix # „%C3%96“ # index; } }
message = messagefix;
messagefix = „“;
foreach(index, message.Split(„ü“)) { if (messagefix == „“) { messagefix = index; } else { messagefix = messagefix # „%C3%BC“ # index; } }
message = messagefix;
messagefix = „“;
foreach(index, message.Split(„Ü“)) { if (messagefix == „“) { messagefix = index; } else { messagefix = messagefix # „%C3%9C“ # index; } }
message = messagefix;
messagefix = „“;
foreach(index, message.Split(„/“)) { if (messagefix == „“) { messagefix = index; } else { messagefix = messagefix # „%2F“ # index; } }
message = messagefix;
messagefix = „“;
foreach(index, message.Split(„°“)) { if (messagefix == „“) { messagefix = index; } else { messagefix = messagefix # „%C2%B0“ # index; } }
message = messagefix;
messagefix = „“;
string stderr;
string stdout;
string url=“\“https://api.telegram.org/botXXXXXXXXX:XXXXX…XXXXXX/sendMessage?chat_id=xxxxxxxxxxxx&text=“#message#“\““;
system.Exec(„wget –no-check-certificate -q -O – „#url, &stdout, &stderr);
Hallo,
Umlaute müssen wie folgt codiert werden:
Ä wird ersetzt durch %C3%84
ä wird ersetzt durch %C3%A4
Ö wird ersetzt durch %C3%96
ö wird ersetzt durch %C3%B6
Ü wird ersetzt durch %C3%9C
ü wird ersetzt durch %C3%BC
Gruß Martin
Hallo.
Wollte das eben bei mir probieren. Leider zeigen meine batteriebetriebenen Geräte (Außen- und Innentermperatursensoren) gar nicht das mögliche Ereignis „Batterie leer“ an, wenn ich sie in einem Programm auswähle. Funktioniert das nicht bei allen batteriebetriebenen Geräten oder sind hierfür noch weitere (Vor)Einstellungen erforderlich?
Besten Dank für die Anleitungen.
Hallo Sebastian,
vielen Dank für diesen hilfreichen Tipp. Habe das bei mir ausprobiert und es funktioniert sehr gut.
Aber eine offene Frage bleibt: Sobald ich deutsche Umlaute in den Nachrichtentext einbaue, bekomme ich keine Push Nachricht mehr. Sonderzeichen wie : sind kein Problem.
Woran kann das liegen? Weil du hast in deinem Beispiel bei „Gerät“ einen Umlaut drin.
Danke für eine Antwort im Voraus.
Werner
Hallo Werner, das freut mich! Über diesen Fehler bin ich leider auch schon gestolpert. Umlaute sind leider ein kleines Problem. Diese müssen codiert werden, da sie sonst nicht verarbeitet werden können. Ich habe mir angewöhnt Umlaute daher nicht zu benutzen. Das Problem habe ich bereits mitPhilipp besprochen, wir veröffentlichen dazu in nächster Zeit einen Beitrag, wo wir die codierung von Umlauten beschreiben.
Danke für den Hinweis!