Homematic Meldungen als Push Nachricht via Pushover an das Smartphone schicken

Homematic Meldungen als Push Nachricht via Pushover an das Smartphone schicken

Das Monitoring von Smart Home Systemen unglaublich wichtig ist, hat mittlerweile so ziemlich jeder mitbekommen. Wer beispielsweise Homematic als Alarmanlage verwendet, wird bestimmt schon auf die Idee gekommen sein, sich Nachrichten an das Handy schicken zu lassen. Läuft eine Automatisierung daneben, wird man darüber informiert. Ich werde in diesem Tutorial erklären, wie auf der CCU2 eine Push-Nachricht via Pushover an ein Smartphone versendet werden kann. Für bessere Zuverlässigkeit werde ich in diesem Artikel den CUx Daemon einsetzen (auf der CCU2). 

„Pushover makes it easy to get real-time notifications on your Android, iPhone, iPad, and Desktop (Pebble, Android Wear, and Apple watches, too!)“

Vorteile von Pushover

  • Einrichtung des Dienstes ist sehr einfacher
  • Beim Versand der Nachrichten, kann aus einem vordefinierten Pool an Sounds gewählt werden.
  • Versand an mehrere Geräte/Benutzer ganz einfach über den Webdienst konfigurierbar. Anpassungen am Homematic Skript sind nicht nötig.
  • Versand an bestimmte Geräte.
  • Konfiguration sogenannter „Quiet Hours„, in denen man nicht genervt werden will.
  • Festlegung einer Nachrichtenpriorität möglich.
  • Priorität „Emergency“ ignoriert die „Quiet Hour“ und schickt die Nachricht in vordefinierten Intervallen erneut an das Handy (z. B. 3 Stunden lang wird alle 30 Sekunden eine Nachricht geschickt). Die Nachricht muss vom User bestätigt werden, damit das Smartphone Ruhe gibt.
  • Jeder User erhält eine E-Mail-Adresse, die per Push an die App weitergeleitet wird. Somit lassen sich sehr einfach auch andere Systeme einbinden.
  • Wird von vielen anderen Webdiensten unterstützt (z.B. IFTTT).

Was kostet Pushover und wie ist es limitiert?

Der Dienst selbst ist kostenlos, wenn Du nicht mit mehr als 7.500 Nachrichten im Monat rechnest. Diese Menge sollte für Privatanwender vollkommen ausreichen. Wenn Du doch mehr brauchst, gibt es dafür gestaffelte Preise. Das größte Paket bietet 50.000 Nachrichten pro Monat und kostet 225$. Allerdings ist der Client kostenpflichtig, wenn auch nicht teuer. Alle verfügbaren Clients können 7 Tage kostenfrei getestet werden, danach kostet jede App einmalig jeweils 4,99$. Keine horrende Summe für eine ordentliche Leistung.

Einrichten des Pushover Accounts

Um Pushover nutzen zu können, muss ein Konto unter https://pushover.net/login eingerichtet werden. Nach der erfolgreichen Anmeldung auf der Webseite von Pushover, bekommst du automatisch einen 30-stelligen Benutzerschlüssel zugewiesen, mit welchem dich Applikationen identifizieren und dir Mitteilungen senden können. Diesen Benutzerschlüssel (User Key) benötigen wir später im Skript. Du solltest den Schlüssen weitestgehend geheim halten. Weitestgehend, weil Pushover die Möglichkeit bietet, die Benutzergruppen anzulegen. Wenn eine Nachricht an eine Gruppe geschickt wird, bekommen automatisch alle Benutzer in der Gruppe die Nachricht.

Zusätzlich wird mindestens eine Client-App benötigt, welche für Android, iOS und Windows zur Verfügung steht. Es gibt hier keine Limitierung für Anzahl der Geräte. Nach der Installation kann der Client mit deinem Account verknüpft werden.

Über die Weboberfläche können dann Anwendungen angelegt werden. Jede Anwendung bekommt ihren eigenen API-Schlüssel. Diese Daten, user key und api token, stellen zusammen mit der Mitteilung an sich das Minimum für einen Nachrichtenversand dar. Wir können mit dem Code loslegen. Als Nächstes muss noch eine neue Anwendung hinzugefügt werden, bzw. ein API Token erstellt werden. Dieser API Token wird auch später im Skript benötigt (!). Ein Klick auf „Apps & Plugins“ öffnet die App Verwaltung. Ein weiterer Klick auf „Create a New Application / API Token“ erzeugt den Token.

Die Felder im Dialog „Create New Application“Plugin“ werden wie folgt ausgefüllt:

  • Name: Frei wählbar, es wird in der Weboberfläche und der App angezeigt.
  • Type: „Application“ wählen
  • Description: Freitext
  • URL: frei lassen
  • Icon: Optional kann ein Icon hochgeladen werden, das wird auch in der App angezeigt.
  • Dann noch die AGBs lesen und falls einverstanden, akzeptieren.

Nach dem Bestätigen, wird direkt der API Token angezeigt und kann jederzeit erneut über „Apps & Plugins“ aufgerufen werden. Er muss also nicht gesichert werden. Ich habe z. B. drei Apps erzeugt: HM Warnung, HM Mitteilung und HM Alarm, um die einzelnen Mitteilungen voneinander trennen zu können, ist aber nicht zwingend erforderlich. Im Homematic-Script kann anhand des API Tokens ausgewählt werden, an welche Apps die Nachricht versendet wird.

Somit haben wir jetzt den User Token und den API Token. Beide ändern sich nie und müssen geheim gehalten werden!

Konfiguration von „Quiet Hours

Sehr praktisch ist die Möglichkeit, sogenannte „quiet hours“ zu definieren. In diesen Zeiten wird der Client beim Empfang weder einen Ton abspielen, noch vibrieren. Ausnahme: durch eine hohe Priorität von Nachrichten kann man dies trotzdem umgehen. Somit verpasst du keine kritischen Mitteilungen. Um „quiet hours“ zu definieren, klickt ihr „Settings“ → „Edit Your Quiet Hours“.

Das Homematic Script

Das hier aufgeführte Skript basiert sich auf dieser Lösung. Ich habe das Skript ein wenig überarbeitet, dabei habe ich auch die Möglichkeit hinzugefügt, die Geräte auszuwählen, wo die Nachricht versendet wird. Außerdem wird der CUx-Daemon verwendet und soll dementsprechend auf der CCU2 installiert werden. Es soll auch ein Exec-Device mit der Seriennummer „1“ existieren. Falls es nicht der Fall sein sollte, eine Anleitung, wie der  CUx-Daemon installiert wird und wie Exec-Device eingerichtet wird, findet ihr hier. Falls die Seriennummer vom Exec-Device abweicht, muss das Skript entsprechend in der letzten Zeile angepasst werden.

Mit folgendem Skript wird die Nachricht versendet. Ihr müsst das Skript mit eigenen Daten ergänzen und in ein Homematic Programm kopieren.

!-------======== Pushover-Nachricht senden ========-------

!__Pushover Keys
string po_api_user="aaaaaaa";
string po_api_token="bbbbbb";
 
!__Nachricht
string po_title="Beispieltitel";
string po_message="Beispieltext";
string po_device="";	
string po_sound="none";
string po_priority="0";
string po_retry="30";
string po_expires="3600";

string po_request="/usr/local/addons/cuxd/curl -X POST -k -H \"Content-Type: application/x-www-form-urlencoded\" -d \"token=" # po_api_token # "&user=" # po_api_user;
if (po_device<>"") {
  po_request = po_request # "&device=" # po_device;
}

po_request = po_request # "&title=" # po_title # "&priority="# po_priority # "&sound=" # po_sound;

if (po_priority=="2") {
   po_request = po_request # "&retry="# po_retry # "&expire=" # po_expires;
}

po_request=po_request # "&message=" # po_message # "\" https://api.pushover.net/1/messages.json";

dom.GetObject("CUxD.CUX2801001:1.CMD_EXEC").State(po_request);

Dabei wird in die Variablen po_api_user der User Key aus dem ersten Schritt eingetragen. Die Variable po_api_token erhält den API Token aus dem zweiten Schritt. Also einfach das aaaa und bbbb ersetzen (ohne „“). In die Variable po_device könnt ihr die Gerätenamen eintragen, wo ihr die Nachricht versenden wolltet. Falls die Variable po_device lehr bleibt oder das Gerät unter den eingetragenen Namen nicht gefunden wird, wird die Nachricht an alle angemeldeten Geräte versendet. Mehrere Gerätenamen sollen kommagetrennt eingetragen werden, z. B. string po_device="meinandroidhandy,mein_iPhone";.

Nun kann direkt die Nachricht eingegeben werden, dazu einfach diesen Block im Skript anpassen:

!__Nachricht
string po_title="Beispieltitel";
string po_message="Beispieltext";
string po_sound="none";
string po_priority="0";

Ein wichtiger Hinweis noch: Der Text muss URL codiert werden, es betrifft vor allem die Umlaute, z. B. „ä“ wird durch „%C3%A4“ ersetzt. Eigentlich müssen auch die Leerzeichen durch ein „%20“ ersetzt werden, es funktioniert aber auch, wenn man das nicht macht. Ich habe dafür einen URL-Encoder gebastelt, den ihr gerne verwenden könnt. Einfach den Text eingeben und auf „Codieren“ klicken. Das Ergebnis dann in das Skript kopieren.

Text eingeben:

 

Erläuterungen zum Skript

Nachrichtenpriorität

Beim Versand einer Nachricht wird in der Variablen po_priority eine Priorität der Nachricht festgelegt. Standardmäßig haben die Nachrichten die normale Priorität (0). Nachrichten können mit verschiedenen Prioritäten gesendet werden, die eine Auswirkung auf die Darstellung der Nachricht beim Benutzer haben. Die Angabe der Nachrichtenpriorität hat aber keine Auswirkungen auf die Warteschlangen- bzw. Routingpriorität beim Pushover-Server und wirkt sich nur darauf aus, wie die Nachrichten bei den Clients angezeigt werden.

Einer Nachricht kann eine der folgende Prioritäten zugewiesen werden:

  • -2: niedrigste Priorität
    Nachrichten erzeugen keine Benachrichtigung auf dem Gerät. Unter iOS wird nur die Nummer am Anwendungsicon erhöht.
  • -1: niedrige Priorität
    Die Nachrichten erzeugen keinen Ton oder keine Vibration, generieren jedoch je nach Betriebssystem des Clients eine Popup / Scroll-Benachrichtigung. Nachrichten, die während der Ruhezeiten (quiet hours) eines Benutzers zugestellt werden, werden so angezeigt, als ob diese die niedrigste Priorität (-2) hätten.
  • 0: normale Priorität
    Die Nachrichten lösen den Ton und die Vibration aus und werden entsprechend den Geräteeinstellungen des Benutzers angezeigt. Unter iOS werden die Nachrichten oben auf dem Bildschirm oder als Dialog sowie im Notification-Center angezeigt. Unter Android wird die Nachricht oben auf dem Bildschirm angezeigt und erscheint zudem im Notification-Center. Nachrichten, die während der Ruhezeiten (quiet hours) eines Benutzers zugestellt werden, werden so angezeigt, als ob diese die niedrigste Priorität (-2) hätten.
  • 1: hohe Priorität
    Die Nachrichten werden immer einen Ton und Vibration erzeugen (wenn es am Gerät des Benutzers konfiguriert ist), unabhängig von den eingestellten  Ruhezeiten (quiet hours) eines Benutzers. Hohe Priorität sollte nur verwendet werden, wenn es notwendig und angemessen ist. Nachrichten mit hoher Priorität werden rot dargestellt:

Api message priority

  • 2: Nottfallpriorität
    Nachrichten mit der Notfallspriorität ähneln sich den Nachrichten mit hoher Priorität, die werden jedoch so lange angezeigt, bis diese Nachricht vom Benutzer bestätigt wird. Diese Priorität ist für Notfall- bzw. Bereitschaftssituationen konzipiert, bei denen es wichtig ist, dass eine Benachrichtigung dem Benutzer (oder allen Benutzern der Gruppe, an die die Nachricht gesendet wurde) wiederholt angezeigt wird, bis die bestätigt wird. Der erste Benutzer der Gruppe, der eine Nachricht bestätigt, bricht die Wiederholungen für alle anderen Benutzer der Gruppe ab.
    Um eine Benachrichtigung mit der Notfallspriorität zu senden, soll der Prioritätsparameter po_priority auf 2 gesetzt werden und die Wiederholungs- und Ablaufparameter po_retry und po_expires sollen definiert werden.

    • Der Parameter po_retry gibt an, wie oft (in Sekunden) der Pushover-Server die gleiche Benachrichtigung an Benutzer sendet. In einer Situation, in der sich der Benutzer in einer lauten Umgebung befindet oder schläft, kann die sich wiederholende Benachrichtigung (mit Ton und Vibration) dazu beitragen, seine Aufmerksamkeit zu erhalten. Die Zeit zwischen den Wiederholungen soll mindestens 30 Sekunden betragen.
    • Der Parameter po_expires gibt an, in wie viele Sekunden wird das Senden der Benachrichtigung wiederholt. Wenn die Benachrichtigung in der angegebenen Zeit (in Sekunden) nicht bestätigt wurde, wird die als „abgelaufen“ markiert und wird nicht mehr an den Benutzer gesendet. Es ist zu beachten, dass die Benachrichtigung dem Benutzer nach Ablauf weiter angezeigt wird, der Benutzer wird jedoch nicht zur Bestätigung aufgefordert. Dieser Parameter muss einen maximalen Wert von höchstens 10800 Sekunden (3 Stunden) haben.
    • Wenn zum Beispiel po_retry auf 30 und einen po_expires auf 3600 setzen, wird die Nachricht alle 30 Sekunden gesendet, bis die vom Benutzer zugestimmt wird, höchstens aber 1 Stunde.

Sounds

Benutzer können aus 21 verschiedenen Standardtönen wählen, der beim Empfang von Benachrichtigungen anstatt des standardmäßigen Pushover-Tons gespielt wird. Die Apps auf dem Gerät können aber die Tonwahl eines Benutzers für jede Benachrichtigung überschreiben. Beim Senden von Benachrichtigungen über die Pushover-API kann der po_sound Parameter auf einen der folgenden Werte gesetzt werden:

  • pushover – Pushover (default)
  • bike – Bike
  • bugle – Bugle
  • cashregister – Cash Register
  • classical – Classical
  • cosmic – Cosmic
  • falling – Falling
  • gamelan – Gamelan
  • incoming – Incoming
  • intermission – Intermission
  • magic – Magic
  • mechanical – Mechanical
  • pianobar – Piano Bar
  • siren – Siren
  • spacealarm – Space Alarm
  • tugboat – Tug Boat
  • alien – Alien Alarm (long)
  • climb – Climb (long)
  • persistent – Persistent (long)
  • echo – Pushover Echo (long)
  • updown – Up Down (long)
  • none – None (silent)

Standardmäßig wird der „pushover“-Sound abgespielt, dieser kann im Smartphone auch verändert werden. Über den po_sound-Parameter kann man jedoch ein vordefinierter Sound aus der oben der aufgeführten Tabelle abspielen lassen.

Einfache Anwendung des Skripts

Die Idee dahinten ist folgende: Wir erstellen die Systemvariablen, über die das Skript zum Versenden der Push-Mitteilungen konfiguriert wird. Das Programm zum Versenden einer Push-Nachricht wird ausgelöst, sobald die Variable [Pushover] Senden auf „senden“ geändert wird.

Folgende Variablen sollen erstellt werden:

Variablenname Typ Beschreibung Werte
[Pushover] Api User Werteliste Hier wird der Benutzer- / Gruppenschlüssel (User Key/Group Key) eintragen. Der ist im Pushover-Dashboard sichtbar, wenn ihr da einlogt. Wenn ihr mehrere Schlüssel habt, die dann semikolongetrennt eintragen. user_key1; user_key2; user_key3
[Pushover] Api Token Werteliste Api Token von euren Apps. Wenn ihr mehrere Apps habt, die Tokens dann semikolongetrennt eintragen. api1_token; api2_token; api3_token
[Pushover] Message Title Zeichenkette Titel der Nachricht, wenn leer, dann wird der Name eurer App als Titel verwendet
[Pushover] Message Text Zeichenkette Hier kann nachher beim Versenden der Text eurer Nachricht eingetragen werden
[Pushover] Device Zeichenkette Der Gerätename des bestimmten Geräts, um die Nachricht direkt an dieses Gerät zu senden, und nicht an alle Geräte des Benutzers (mehrere Geräte können durch ein Semikolon getrennt sein)
[Pushover] Sound Werteliste Der Name des Sounds aus dem Soundpool von Pushover, um die Standardtonwahl des Benutzers zu überschreiben pushover; bike; bugle; cashregister; classical; cosmic; falling; gamelan; incoming; intermission; magic; mechanical; pianobar; siren; spacealarm; tugboat; alien; climb; persistent; echo; updown; none
[Pushover] Priority Werteliste Über diese Variable kann die Priorität der Nachricht gesteuert werden -2; -1; 0; 1; 2
[Pushover] Retry Zahl Gibt an, wie oft (in Sekunden) der Pushover-Server die gleiche Benachrichtigung an Benutzer sendet
[Pushover] Expires Zahl gibt an, in wie viele Sekunden wird das Senden der Benachrichtigung wiederholt.
[Pushover] Senden Logikwert Trigger zum Senden der Nachricht. Die Nachricht wird gesendet, wenn der Wert der Variablen auf "senden" geändert wird. wahr = senden, falsch = gesendet

Im nächsten Schritt erstellen wir das folgende Programm:

Das Skript in das Programm kopieren:

!-------======== Pushover-Nachricht senden ========-------

string po_api_user=dom.GetObject("[Pushover] Api User").ValueList().StrValueByIndex(";", dom.GetObject("[Pushover] Api User").Value());
string po_api_token=dom.GetObject("[Pushover] Api Token").ValueList().StrValueByIndex(";", dom.GetObject("[Pushover] Api Token").Value());
string po_title=dom.GetObject("[Pushover] Message Title").Value();
string po_message=dom.GetObject("[Pushover] Message Text").Value();
string po_device=dom.GetObject("[Pushover] Device").Value();  
string po_sound=dom.GetObject("[Pushover] Sound").ValueList().StrValueByIndex(";", dom.GetObject("[Pushover] Sound").Value());
string po_priority=dom.GetObject("[Pushover] Priority").ValueList().StrValueByIndex(";", dom.GetObject("[Pushover] Priority").Value());
string po_retry=dom.GetObject("[Pushover] Retry").Value();
string po_expires=dom.GetObject("[Pushover] Expires").Value();
string po_request;
if(po_priority=="2") {
  po_request="/usr/local/addons/cuxd/curl -X POST -k -H \"Content-Type: application/x-www-form-urlencoded\" -d \"token=" # po_api_token # "&user=" # po_api_user # "&device=" # po_device # "&title=" # po_title # "&priority=" # po_priority # "&sound=" # po_sound # "&retry="# po_retry # "&expire=" # po_expires # "&message=" # po_message # "\" https://api.pushover.net/1/messages.json";
}
else {
  po_request="/usr/local/addons/cuxd/curl -X POST -k -H \"Content-Type: application/x-www-form-urlencoded\" -d \"token=" # po_api_token # "&user=" # po_api_user # "&device=" # po_device # "&title=" # po_title # "&priority=" # po_priority # "&sound=" # po_sound # "&message=" # po_message # "\" https://api.pushover.net/1/messages.json";
}
dom.GetObject("CUxD.CUX2801001:1.CMD_EXEC").State(po_request);

 

Nachdem das Skript abgearbeitet wird, werden alle Variablen in „Normalzustand“ gesetzt.

Um eine Benachrichtigung zu senden, müsst ihr nur bei der Variablen  [Pushover] Senden den Wert auf „senden“ ändern, das Programm wird somit ausgeführt. Vorher soll das Programm aber mithilfe der erstellten Variablen vorkonfiguriert werden. Wenn die Variable [Pushover] Device kein Wert enthält, wird die Benachrichtigung an alle eure Geräte versendet, die im Pushover-Dienst angemeldet sind. Wenn die Variable [Pushover] Message Title leer ist, wird als Titel der Nachricht die Benennung eurer App im Pushover-Dienst sein. Nach dem Senden werden alle Konfigurationsvariablen in den „Normalzustand“ zurückgesetzt. Der „Normalzustand“ kann im Programm definiert werden, indem die Werte der Variablen angepasst werden.

Beispiel für das Senden eines Push-Nachricht bei einem Alarm:

Falls ihr nur einen User Key habt, braucht ihr die Variable [Pushover] Api User bei jedem Versenden der Nachricht angeben. Das Gleiche betrifft auch [Pushover] Api Token. Grundsätzlich müssen nur die Parameter konfiguriert werden, die vom „Normalzustand“ abweichen, z. B. [Pushover] Message Text. Nach jedem Senden der Nachricht werden alle Variablen in Normalzustand zurückgesetzt.

Fazit

Da Pushover ausschließlich auf den Versand von Push-Nachrichten ausgelegt ist, liefert der Dienst sehr gute Features. Insbesondere das Verwalten mehrerer Geräte und das Setzen von Prioritäten gefällt mir sehr gut. Somit kann sichergestellt werden, dass kritische Situationen nicht verpasst werden. Der Einsatz von CUxD trägt dabei deutlich zur Stabilität bei, daher sollte er verwendet werden.

Insgesamt kann man sich auf diesem Wege sehr komfortabel von Homematic benachrichtigen lassen, natürlich nur solange eine Internetverbindung besteht. Für wirklich kritische Situationen sollte man aber mehrere Benachrichtigungskanäle nutzen, anstatt auf nur einen Kanal zu vertrauen. Pushover kann man jedenfalls in Betracht ziehen, es kann eine sinnvolle Ergänzung oder Alternative sein. Wer komplett auf Nummer sicher gehen will und nicht dem Internetzugang vertrauen möchte, sollte zusätzlich über eine Innensirene nachdenken. Als Alarmanlage macht sie definitiv Sinn und in Kombination mit der Push Nachricht, ist man meiner Meinung nach sehr gut auf alle Situationen vorbereitet.

Dieser Beitrag hat 10 Kommentare

  1. Hey, habe alles nach der Anleitung gemacht, aber es wird leider keine Nachricht versendet. Ich kann das doch auch mit Geräten verknüpfen oder nicht? Wenn zb. Haustür geöffnet wird dann Push Nachricht?

    1. Hast du deinen Skript getestet? Funktioniert der Skript? Haben die Systemvariable korrekte Werte?
      Ja, man kann es auch mit Geräten verknüpfen. Sehe Bild oben, anstatt Systemzustand in Wenn-Bedingung einfach Gerät zum auslösen des Programms auswählen. Alles andere bleibt das gleiche.

      1. Kriege schon eine Fehlermeldung wenn ich das Script überprüfe. Kann ich die Fehlermeldung hier Posten?

        1. Error 1 at row 17 col 3 near ^ (po_device““) {
          po_request = po_request # „&device=“ # po_device;
          }

          po_req
          Parse following code failed:

          1. Das Skript habe ich bei mir getestet, ich bekomme keine Fehler. Ich glaube, in deinem Skript sind irgendwelche unzulässige Zeichen drin, die mitkopiert worden. Zum Beispiel deine Anführungszeichen sehen verdächtig aus.

  2. Kann ich Dir mein Script mal per Mail schicken? Damit Du evtl mal drüber schauen kannst.Finde den Fehler leider nicht. 🙁

    1. Ja, kannst du ruhig schicken. Mach es aber per Kontaktform.

    2. Ich habe mich tatsächlich im Skript vertippt. Der Fehler wurde behoben und das Skript wurde angepasst. Vielen Dank für die Rückmeldungen!!

  3. Hallo.
    Habe ein ähnliches Script. Leider funktioniert die selektive Sendung an ein bestimmtes gerät nicht.

    string po_title=“TestTESTTESTTEST“;
    string po_message=“Testnachricht“;
    string po_device=“Iphone7plus“;
    string po_sound=“spacealarm“;
    string po_priority=“1″;

    Hierbei wird immer an beide im Dashboard angemeldete Geräte Nachrichten verschickt. Wo kann der Fehler sein?

  4. Erledigt. Habe es mit zwei separaten Gruppen, im Pushover Account für die jeweiligen Geräte gelöst. Somit habe ich für jeden User ein Key.

Schreibe einen Kommentar

Menü schließen