Howto - zentrales Push-Nachrichten-Programm (zPNP) V4.1

Problemlösungen und Hinweise von allgemeinem Interesse zur Haussteuerung mit HomeMatic

Moderator: Co-Administratoren

dtp
Beiträge: 8242
Registriert: 21.09.2012, 08:09
Wohnort: Stuttgart
Hat sich bedankt: 63 Mal
Danksagung erhalten: 187 Mal

Howto - zentrales Push-Nachrichten-Programm (zPNP) V4.1

Beitrag von dtp » 16.08.2015, 13:16

Einleitung

Motivation

Die nachfolgende Anleitung soll dazu dienen, Push-Nachrichten, die durch unterschiedliche WebUI-Programme bzw. -Skripte erzeugt wurden, durch ein zentrales Programm wahlweise mit den Push-Diensten

Pushover (iOS, Android sowie als Desktop-Variante für Safari, Chrome oder Firefox),
Pushsafer (iOS, Android, Windows Mobile, Windows Desktop sowie Chrome, Firefox) und/oder
Telegram (nahezu alle aktuellen OS)

zu verschicken. Im Folgenden werden das zentrale Push-Nachrichten-Programm kurz als zPNP und die darin enthaltenen zentralen Push-Nachrichten-Skripte als zPNS-Po, zPNS-Ps und zPNS-Tg bezeichnet.

Prowl und Pushalot werden nicht mehr unterstützt.

Warum das Ganze? Nun, hier mal eine Auflistung der Vorteile gegenüber dem Aufrufen der Push-Dienste in einzelnen Programmen und Skripten.
  • Die Änderung von API-Keys muss nur noch an einer einzigen Stelle vorgenommen werden.
  • Automatische UTF-8-Konvertierung von Sonderzeichen, Umlauten und Leerzeichen in den zPNS-xx.
  • Deutliche Vereinfachung der das zPNP aufrufenden Skripte mit entsprechend vereinheitlichter Struktur.
  • Zentrale Nutzerverwaltung für den Fall, dass Push-Nachrichten an mehrere Empfänger verschickt werden sollen.
  • Möglichkeit zum Versenden bestimmter Push-Nachrichten an einzelne Empfänger (nicht bei Priorität 2).
  • Kontrolle darüber, welche Empfänger Push-Nachrichten ab welcher Prio empfangen sollen.
  • Möglichkeit zur Auswahl einzelner Push-Dienste für unterschiedliche Ereignisse.
  • Möglichkeit zur generellen Deaktivierung von Push-Nachrichten mit einer Priorität < 2.
  • Möglichkeit zur Unterbindung identischer Push-Nachrichten innerhalb eines definierbaren Zeitfensters (nicht bei Priorität 2).
  • Möglichkeit zum Bilderversand.
Hinweise

  • Bitte auf alle Fälle vermeiden, den Inhalt von Systemvariablen auf der WebUI-Startseite anzuzeigen, wenn diese HTML-Tags enthalten.
  • Wer Bedenken hinsichtlich der Verwendung von Leerzeichen, Umlauten oder Sonderzeichen in Systemvariablen-Namen hat, der sollte die Namen entsprechend ändern. Auf meiner CCU hatte ich damit in den zurückliegenden Jahren noch nie irgendwelche Probleme. Es kann aber natürlich z.B. diverse Addons für die CCU geben, die damit Probleme haben. Keine Probleme gab es bisher mit den folgenden Addons: SSH-keydir, Programmedrucken CCU2, XML-API und CUx-Deamon.
  • Systemvariablen, die nicht benutzt werden, sollten in WebUI auch nicht angelegt sein.


Voraussetzungen

Zusatzsoftware

Auf der CCU muss CUxD installiert und das Gerät "CUxD.CUX2801001:1.CMD_EXEC" eingerichtet sein. Hier eine Kurzanleitung zur Einrichtung des CUxD-Geräts:
  1. Unter CUxD-Gerätetyp das Gerät "(28) System-Exec" auswählen und den Rest am besten unverändert lassen (Seriennummer: 1, etc.).
  2. Anschließend auf "Gerät auf CCU erzeugen!" klicken.
  3. Danach in WebUI in den Posteingang für neue Geräte gehen und den neuen Gerätetyp bestätigen.
  4. Zur Sicherheit CCU neu booten.
Weitere Informationen zum Thema findet ihr an dieser Stelle. Wer mag, kann dem Gerätetyp unter Geräte auch noch einen neuen Namen geben. Bei mir heißt er z.B. "CCU CUxD Exec" bzw. der entsprechende Kanal 1 "CCU CUxD Exec 1". Das ist aber nicht notwendig. Man kann den Eintrag auch unverändert lassen, da der Aufruf stets mit dom.GetObject("CUxD.CUX2801001:1.CMD_EXEC") erfolgt, also unabhängig vom vergebenen WebUI-Namen ist.

Das zPNP

Das zPNP selbst ist sehr trivial. Bei mir enthält es im "Wenn"-Zweig lediglich eine Abfrage über den Status der CCU. Diese Abfrage kann man theoretisch aber auch weglassen. Grundsätzlich empfehle ich jedoch, kein Programm oder besser noch keinen Programmzweig auf der CCU ohne Bedingung zu erstellen, weil dieses dann bei jedem Neustart der CCU ausgeführt wird.

Der Name des zPNP ("CCU PRG Push-Nachrichten") ist sehr wichtig, weil er in den aufrufenden Skripten verwendet wird. Natürlich kann dieser auch individuell gewählt werden. Aber dazu später mehr. Die von mir gewählte Nomenklatur basiert auf der Einrichtung meiner eigenen CCU. Und dort habe ich z.B. sämtlichen Programmen den Zusatz "PRG", sämtlichen Systemvariablen den Zusatz "SV" und sämtlichen virtuellen Schaltern den Zusatz "VT" verpasst. Somit kann ich einem Gerät und einer dazu gehörenden Systemvariablen ansonsten identische Namen geben. Aber dies nur am Rand.
zPNP.png
Unter "Aktivität" sind die gewünschten zPNS-xx sowie ein kleines, aber zwingend erforderliches Skript zum Setzen der Systemvariablen "CCU SV Push Text Ref" einzufügen.

Systemvariablen

Die benötigten Systemvariablen werden automatisch erzeugt, sofern nicht vorhanden. Die Namen der Systemvariablen können in den zPNS-xx nach eigenen Wünschen angepasst werden. Der Einfachheit halber gehe ich von den im nachfolgenden Code-Block des zPNS-xx verwendeten Namen aus.

Code: Alles auswählen

! +++++ Namen der zwingend benötigten Systemvariablen +++++
string svPushText = "CCU SV Push Text"; ! Text der aktuell zu übertragenden Push-Nachricht, Voreinstellung: "CCU SV Push Text"
string svPushTextRef = "CCU SV Push Text Ref"; ! Text der vorherigen Push-Nachricht als Referenz, Voreinstellung: "CCU SV Push Text Ref"

! +++++ Namen der optionalen Systemvariablen (auf "" setzen, wenn nicht benötigt) +++++
string svPushPrio = "CCU SV Push Prio"; ! Prioritäten der Push-Nachrichten, Voreinstellung: "CCU SV Push Prio"
string svPushService = "CCU SV Push Dienst"; ! Push-Dienste, Voreinstellung: "CCU SV Push Dienst"
string svPushUserList = ""; ! Empfängerlist für die Push-Nachrichten (z.B. "CCU SV Push Empfängerliste"), Voreinstellung: "" 
string svPushImage = ""; ! Link auf ein anzufügendes Bild (z.B. "CCU SV Push Bild"), Voreinstellung: ""
Ganz wichtig ist, dass für svPushText, svPushTextRef, svPushPrio, svPushService, svPushUserList und svPushImage in allen Skripten jeweils immer dieselben Namen eingetragen sind! svPushImage hat jedoch nur für Pushover, Pushsafer und Telegram Bedeutung.

Zwingend erforderlich für den Betrieb des zPNPs sind die beiden Systemvariablen "CCU SV Push Text" und "CCU SV Push Text Ref". "CCU SV Push Text" enthält den aktuell zu übertragenden Textinhalt der Push-Nachricht. "CCU SV Push Test Ref" dient als Referenz und ist wichtig für die Möglichkeit zur zeitweisen Sperrung identischer Push-Nachrichten. Auch dazu später mehr.
zPNP_Systemvariablen.png
Um das zPNP mit mehreren Push-Diensten betreiben und möglichst variabel steuern zu können, empfiehlt sich die zusätzliche Einrichtung der Systemvariablen "CCU SV Push Prio" und "CCU SV Push Dienst".

Die seit Version 4.0 neu eingeführte, optionale Systemvariable "CCU SV Push Empfängerliste" ermöglicht nun das Versenden einzelner Push-Nachrichten gezielt an bestimmte Empfänger. ACHTUNG: Die Empfängernamen dürfen keine Leerzeichen enthalten, weil diese zur Trennung der Empfängerschlüssel dienen und entsprechend vom zPNS-xx abgefragt werden!

Damit die Systemvariablen automatisch erzeugt werden, muss das zPNP einmal per Klick auf den Start-Button unter "Status und Bedienung | Programme" ausgeführt werden. Dies bitte auch durchführen, wenn eine Systemvariable neu angelegt werden soll, weil sie vorher noch nicht genutzt wurde oder weil sie gelöscht wurde.

Seit der Version 4.1 werden die optionalen Systemvariablen automatisch gelöscht, wenn diese nicht mehr gesetzt sind. Auf diese Weise kann sehr schnell ersichtlich werden, wenn jemand irrtümlich beim Update auf eine neue Version eine vorher gesetzte Systemvariable nicht mehr gesetzt hat.
Initialisierung_Systemvariablen.png
Die Systemvariable "CCU SV Push Prio" dient zum Setzen der Priorität der Push-Nachrichten. Pushover nutzt Prioritäten von -2 bis 2. Pushsafer und Telegram arbeiten eigentlich nicht mit Prioritäten. Bei Pushsafer kann man verschiedene Sounds, Icons, Titel und Vibrationen setzen. Bei Telegram lassen sich den Prioritäten entsprechende Bots definieren, die dann mit unterschiedlichen Sounds und/oder Icons auf Push-Nachrichten hinweisen. Zur einheitlichen Nutzung des zPNPs habe ich mich entschieden, auch für Pushsafer und Telegram die obigen Prioritäten zu verwenden.

Bei Pushsaver habe ich mich für folgende Werte für den Sound (s), die Vibration (v) und das Icon (i) entschieden:

Prio -2: s=0, v=1, i=4
Prio -1, 0: v=1, i=4
Prio 1: v=1, i=5
Prio 2: v=1, i=6

Für Telegram sollten gemäß den Erläuterungen in einem der nachfolgenden Postings entsprechende Bots angelegt werden. Zudem wird bei Prio -2 die Ausgabe von Tönen mit dem Parameter "disable_notification=1" unterbunden.

"CCU SV Push Dienst" erlaubt zum einen, gezielt einen bestimmten Push-Dienst in einem das zPNP aufrufenden Programm bzw. Skript auswählen zu können. Zum anderen kann die Systemvariable auch mit einer anderen App, wie z.B. pocketControl, auf "aus" gesetzt werden, um das Versenden von Push-Nachrichten generell zu unterdrücken. Hierbei gilt aber zu beachten, dass Push-Nachrichten der Priorität 2 (Alarm) niemals unterbunden werden. Mehr dazu in einem nachfolgenden Posting zum Aufruf des zPNP. "CCU SV Push Dienst" wird automatisch mit den Namen der Pushdienste in der Reihenfolge der zPNS-xx gemäß zPNP gefüllt, wobei die beiden ersten Einträge für "aus" und "alle" reserviert sind. Es spielt also keine Rolle, wie die zPNS-xx sortiert sind. Selbst später kann die Sortierung geändert werden, ohne dass es eine Einschränkung in der Funktionalität gibt. Das fangen die zPNS-xx automatisch auf.

Für Pushover und Pushsafer können noch jeweils zwei weitere Systemvariablen eingerichtet werden. "CCU SV Pushover Sound" bzw. "CCU SV Pushsafer Sound" erlaubt es, zwischen 15 (Pushover) bzw. 27 (Pushsafer) verschiedenen Sounds bei der Übertragung von Pushover- bzw. Pushsafer-Nachrichten zu wählen. Bei Prowl existieren lediglich fünf feste Benachrichtigungssounds, die direkt von der gesetzten Priorität abhängen und nur innerhalb der App definiert werden können. Pushalot bietet derzeit keine Auswahl von Sounds. Telegram ermöglicht, wie gesagt, die Verwendung unterschiedlicher Sounds in Abhängigkeit von den Bots oder auch von definierten Gruppen.

Mit den Systemvariablen "CCU SV Pushover Gerät" bzw. "CCU SV Pushsafer Gerät" hat man zudem die Möglichkeit, Pushover- bzw. Pushsafer-Nachrichten gezielt an ein unter pushover.net bzw. in der Pushsafer App definiertes Gerät (Device) zu senden.

Die Systemvariable "CCU SV Pushover Titel" erlaubt die Vergabe eine Titels für Pushover-Nachrichten.

Versand von Bildern

Seit Version 3.0 können neben Texten auch Bilder direkt über die CCU versendet werden. Dazu dient die optionale Systemvariable "CCU SV Push Bild", die wie die obigen Systemvariablen automatisch angelegt wird, wenn sie beim Aufruf des zPNP bzw. der zPNS-xx noch nicht angelegt war. In die Systemvariable "CCU SV Push Bild" wird mit dem aufrufenden Skript der Pfad inkl. Namen der zu übertragenden Bilddatei eingetragen. Wurde zum Beispiel eine Datei Bild.jpg in das tmp-Verzeichnis der CCU gespeichert, dann muss"CCU SV Push Bild" auf "/tmp/Bild.jpg" gesetzt werden. Es ist aber auch möglich, direkt Pfade auf eine Webcam oder dergleichen zu setzen.

Die zPNS-xx

Kommen wir zum wesentlichen Bestandteil des zPNP, den zPNS-xx. Es ist möglich, bis zu 100 Empfänger pro Push-Dienst zu definieren. Dazu gibt es eine so genannte Master-Liste, die die durch Leerzeichen getrennten Keys für jeden User enthalten. Jedem Key ist dabei ein Identifyer "Empfängerxx|" vorangetellt. Wenn man also nur einen Empfänger hat, trägt man jeweils nur einen Key "Empfänger1|+++key1+++" ein. Hat man zwei Empfänger, trägt man zwei Keys "Empfänger1|+++key1+++ Empfänger2|+++++key2+++++" ein, die durch ein Leerzeichen getrennt sind. Bei drei Empfängern sind es drei Keys und so weiter. Achtung, es darf nur ein einziges Leezeichen zwischen den Keys eingetragen sein. Hier mal ein Beispiel für Pushover mit drei Empfängern:

Code: Alles auswählen

! +++++ User-Daten +++++
! In den nachfolgenden Listen die User-Daten durch "Empfänger|" einleiten und durch EINEN Leerschritt voneinander trennen. 
string keyList = "Walter|<Walters_API_Schluessel> Frida|<Fridas_API_Schluessel> Elvira|<Elviras_API_Schluessel>"; ! API-Basisschlüssel. Beispiel: "Empfänger01|xxxxKey1xxxx Empfänger02|xxKey2xx"
string HMinfoList = "Walter|<Walters_HMinfo_API_Schluessel> Frida|<Fridas_HMinfo_API_Schluessel> Elvira|<Elviras_HMinfo_API_Schluessel>"; ! API-Schlüssel für Info-Meldungen. Beispiel: "Empfänger01|xxxxKey1xxxx Empfänger02|xxKey2xx"
string HMwarnungList = "Walter|<Walters_HMwarnung_API_Schluessel> Frida|<Fridas_HMwarnung_API_Schluessel> Elvira|<Elviras_HMwarnung_API_Schluessel>"; ! optionale API-Schlüssel für Warnmeldungen
string HMalarmList = ""; ! optionale API-Schlüssel für Alarmmeldungen
string prioMinList = "Frida|0 Elvira|1"; ! Prioritäten, ab der die User Nachrichten erhalten sollen. Beispiel: "Empfänger01|-2 Empfänger02|0"
Die Schlüssel-Angabe von Keys für HMwarnungList und HMalarmList ist optional. Wenn man nicht zwischen Info-, Warnungs- und Alarm-Meldungen unterscheiden möchte, lässt man HMwarnung_list und HMalarm_list einfach leer. Auch dürfen die Listen unterschiedlich viele Elemente in beliebiger Reihenfolge enthalten, da die Empfänger-Zuordnung über die Identifyer erfolgt. Hier mal ein Beispiel, was ebenfalls problemlos funktioniert:

Code: Alles auswählen

! +++++ User-Daten +++++
! In den nachfolgenden Listen die User-Daten durch "Empfänger|" einleiten und durch EINEN Leerschritt voneinander trennen. 
string keyList = "Walter|<Walters_API_Schluessel> Frida|<Fridas_API_Schluessel> Elvira|<Elviras_API_Schluessel>"; ! API-Basisschlüssel. Beispiel: "Empfänger01|xxxxKey1xxxx Empfänger02|xxKey2xx"
string HMinfoList = "Frida|<Fridas_HMinfo_API_Schluessel> Walter|<Walters_HMinfo_API_Schluessel> Elvira|<Elviras_HMinfo_API_Schluessel>"; ! API-Schlüssel für Info-Meldungen. Beispiel: "Empfänger01|xxxxKey1xxxx Empfänger02|xxKey2xx"
string HMwarnungList = "Walter|<Walters_HMwarnung_API_Schluessel> Frida|<Fridas_HMwarnung_API_Schluessel> Elvira|<Elviras_HMwarnung_API_Schluessel>"; ! optionale API-Schlüssel für Warnmeldungen
string HMalarmList = Elvira|<Elviras_HMwarnung_API_Schluessel>""; ! optionale API-Schlüssel für Alarmmeldungen
string prioMinList = "Frida|0 Elvira|1"; ! Prioritäten, ab der die User Nachrichten erhalten sollen. Beispiel: "Empfänger01|-2 Empfänger02|0"
Ausschlaggebend für die Empfänger-Definition ist immer die Master-Liste (erste Liste). Wenn z.B. HMwarnungList nur zwei und HMinfoList vier Keys enthält, werden für Empfänger3 und Empfänger4 die Warnmeldungen als Infomeldungen versendet. Definiert man für die Client-Listen (alle weiteren Listen) mehr oder andere Empfänger, als in der Master-Liste, werden diese Einträge ignoriert. Die Anzahl der Emfpänger definiert sich nur über die Keys in der Master-Liste. Sind die nachfolgenden Listen länger bzw. enthalten sie Identifyer, die in der Master-Liste nicht enthalten sind, werden diese Keys nicht berücksichtigt. Achtung: Keine Identifyer in einer Liste doppelt vergeben!

Mit prioMinList definiert man die Prioritäten, ab denen die einzelnen Empfänger Push-Nachrichten erhalten sollen. Wird für einen Empfängerkein Wert definiert, erhält er automatisch sämtlich Push-Nachrigen aller Prioritäten. Tipp: Last hier den Identifyer "01|" weg, da der erste User am besten immer Push-Nachrichten aller Prioritäten empfangen können sollte. Es ist aber trotzdem möglich, ihn auf Wunsch zu definieren. Mit "01|0" würde User1 z.B. nur Push-Nachrichten ab der Priorität 0 erhalten.

Pushover - zPNS-Po
zPNS-Po41.hsc
(13.37 KiB) 79-mal heruntergeladen
Pushsafer - zPNS-Ps
zPNS-Ps41.hsc
(12.32 KiB) 19-mal heruntergeladen
Telegram - zPNS-Tg
zPNS-Tg41.hsc
(11.27 KiB) 71-mal heruntergeladen
Abschlussskript zum Setzen der Push-Nachrichten-Referenz (erforderlich)
SetPushTextRef40.hsc
(1.5 KiB) 207-mal heruntergeladen
Die drei Push-Dienste können einzeln oder in beliebiger Kombination genutzt werden. Sobald ein API-Schlüssel eingegeben wurde, wird der entsprechende Push-Dienst vorbehaltlich des Wertes der Systemvariablen "CCU SV Push Dienst" genutzt. Wird "CCU SV Push Dienst" nicht verwendet, gehen die eingebundenen zPNS-xx automatisch von ihrer Verwendung aus (default = 1 -> alle).

Überdies können noch verschiedene App- bzw. Bot-Tokens zur Unterscheidung von normalen Informationen (Prio -2, -1, 0), Warnungen (Prio 1) und Alarmmeldungen (Prio 2) eingerichtet und verwendet werden. Telegram bedingt die Verwendung von Bots, so dass hier nur einfach weitere API-Schlüssel für die zusätzlichen Bots hinzu kommen. Mehr dazu in einem der nachfolgenden Postings.

Updates der zPNS-xx

Wenn nicht explizit anders von mir erwähnt, zum Updaten am besten einfach alles unterhalb von

Code: Alles auswählen

! #####################################################################
! ##### ab hier bitte keine weiteren Einstellungen mehr vornehmen #####
! #####################################################################
aus den jeweiligen txt-Dateien per Copy & Paste in die auf der CCU installierten Skripte überschreiben und den Kopf mit den Keys darüber unverändert lassen.

HTML-Tags

Pushover und Telegram bieten die Möglichkeit zur Verwendung so genannter HTML-Tags. Damit lassen sich Textteile von Push-Nachrichten in der App z.B. farbig oder fett hervorheben. Ein Problem ist jedoch, dass Prowl, Pushalot und Pushsafer mit diesen HTML-Tags nichts anfangen können und Telegram den HTML-Tag "<font color=...>...</font>" nicht versteht. Pushsafer verwendet zum Hervorheben von Texten statt HTML- sogenannte BBCode-Tags. Die einzelnen zPNS-xx wandeln jedoch etwaig verwendete HTML-Color-Tags automatisch in für sie nutzbaren Code um.

So erzeugt das zPNS-Tg aus "<font color=orange>Dies</font> ist ein <font color=red>Test</font>." automatisch den String "<b>Dies</b> ist ein <b>Test</b>.", während das zPNS-Ps ihn in "Dies ist ein Test." wandelt. Das zPNS-Po lässt den String dagegen unverändert.

Unterbindung aufeinander folgender, identischer Push-Nachrichten

Die zPNS-xx enthalten noch eine weitere Variable, über die man den Versand von Push-Nachrichten beeinflussen kann. Mit "stopRepeat" definiert man einen Zeitraum, innerhalb dem keine identischen Push-Nachrichten gesendet werden sollen. Sobald eine andere Push-Nachricht gesendet wurde, beginnt diese Sperrzeit wieder von vorne. Ich habe diese Variable eingeführt, weil ich gelegentlich mit Push-Nachrichten eines prellenden Sabotage-Kontakts eines Fenster-Drehgriffkontakts bombadiert wurde. Auch kann man damit recht gut Push-Nachrichten über das zu häufige Betätigen der Haustürklingel oder dergleichen unterbinden. Standardmäßig ist "stopRepeat" auf 10 Sekunden gesetzt, kann aber auch beliebig variiert werden. Will man zum Beispiel die Funktion der zPNS-xx testen, sollte "stopRepeat" auf 0 oder einen entsprechend geringen Wert gesetzt werden.

Wichtig: Damit das Unterbinden funktioniert, muss am Ende des zPNP das oben erwähnte, kleine Skript zum Setzen der Systemvariablen "CCU SV Push Text Ref" angefügt werden.

Übrigens können für jedes zPNS-xx unabhängig voneinander unterschiedliche Sperrzeiten definiert werden. Dies nur zur Info, falls es mal jemand benötigen sollte.

Im nächsten Posting zeige ich Euch dann ein einfaches Beispiel zum Aufruf des zPNP in einem Skript.

Mögliche Gründe für ein Nichtfunktionieren
  • Die Systemvariable "CCU SV Push Dienst" steht noch auf "aus" oder auf dem falschen Push-Dienst. In dem Fall bitte "CCU SV Push Dienst" auf den gewünschten Push-Dienst einstellen.
  • Es wurden andere Systemvariablen-Namen als die Standardwerte verwendet und nicht entsprechend in den Skripten angepasst.
  • Es ist ein anderes CUxD-Gerät als "CUxD.CUX2801001:1.CMD_EXEC" definiert worden. In dem Fall im zPNS-xx das korrekte CUxD-Gerät einstellen.
  • Es wurden nicht überall die korrekten API-Schlüssel eingetragen. Insbesondere für Pushover müssen sich die API-Basisschlüssel in der Skriptvariablen "keyList" und die API-Schlüssel für die Anwendungen "HM...List" unterscheiden.
  • Es wurde vergessen, bei den API-Schlüsseln durchgehend die so genannten Identifyer "xx|" zu verwenden. Diese sind jedoch wichtig für die Zuordnung der Schlüssel zu den jeweiligen Usern. Selbst für einen einzigen User muss stets der Identifyer "01|" verwendet werden.
  • Die lokale Skriptvariable "stopRepeat" steht auf einem zu hohen Wert und unterdrückt das zeitnahe Hintereinandersenden identischer Push-Nachrichten. In dem Fall entweder "stopRepeat" auf 0 setzen oder zwei aufeinander folgende Push-Nachrichten unterschiedlichen Inhalts senden. Es genügt hier bereits ein geändertes Zeichen.
Beispiele für das zPNP aufrufende Skripte
  1. Servicemeldungen auf Grundlage des Allinclusive-Skripts von Alchy.
  2. Skripte für Strom-, Gas- und Wasserzähler.
  3. Zentrales Programm und Skript zur Steuerung von Beschattungsgeräten (Rollläden, Markisen, Raffstore, Jalousien, etc.).
  4. Alarmmeldung bei Auslösen eines Rauchmelders.
  5. Meldung unverschlossener Fenster und Türen bei Änderung auf Abwesenheit und in Abwesenheit.
  6. Meldungen von Briefkasten-Einwürfen und der Leerung des Briefkastens.
  7. Ausschalten von Verbrauchern bei Abwesenheit.
  8. Sturmwarnungen.
  9. Meldung einer fertigen Waschmaschine und eines fertigen Trockners mittels HM-ES-PMSw1-Pl.
  10. Meldung über einen offenen Tagesriegel (analog auch auf Fenster und Türen anwendbar).
Bis dann,

Thorsten

Versionshistorie
  1. Version 1.0
    • Komplette Überarbeitung des bishirgen zPNS.
    • Einbindung der drei Push-Dienste Pushover, Prowl und Pushalot.
  2. Version 1.1
    • Überarbeitung des Prowl-Aufrufs
    • Entfernung der Möglichkeit zum Zurücksetzen bestimmter Systemvariablen (push_reset)
  3. Version 1.2
    • Hinzufügung von Telegram.
    • Aufteilung des zPNS in einzelne zPNS-xx (zPNS-Po, zPNS-Pl, zPNs-Pa, zPNS-Tg).
    • Umbenennung der Systemvariablen "CCU SV Push-Dienst" in "CCU SV Push Dienst".
    • Umbenennung der Systemvariablen "CCU SV Push Sound" in "CCU SV Push Pushover-Sound".
  4. Version 1.3
    • Neues Abschlussskript für das Setzen von "CCU SV Push Text Ref".
    • Reihenfolge und Anzahl der zPNS-xx innerhalb des zPNP nun beliebig.
    • Umbenennung der Systemvariablen "CCU SV Push Pushover-Sound" in "CCU SV Pushover Sound".
    • Möglichkeit zur Einbindung von Devices in Pushover und Einführung der optionalen Systemvariablen "CCU SV Pushover Gerät".
    • zPNS-xx 1.3.1: Deklaration der Variablen prio als Integer statt als String.
  5. Version 1.4
    • Senden von Push-Nachrichten der Prio 2 unabhängig von der Systemvariablen "CCU SV Push-Dienst".
    • Vermeidung der Unterdrückung identischer, aufeinander folgender Push-Nachrichten im Falle von Prio = 2.
    • Unterdückung von Sounds für Telegram im Falle von Prio = -2.
    • zPNS-xx 1.4.1: %-Zeichen als UTF-8-Code hinzugefügt.
    • zPNS-xx 1.4.2: Umwandlung UTF-8-Codes angepasst (Bugfix).
    • zPNS-xx 1.4.2: ²- und ³-Zeichen als UTF-8-Code hinzugefügt.
    • zPNS-xx 1.4.3: Einfügen von ".ToInteger()" bei der Prioabfrage (Bugfix). Danke an Alchy für den Hinweis.
    • zPNS-Tg 1.4.3.1: Ersetzen von "disable_notifications" durch "disable_notification" (Bugfix).
  6. Version 1.5
    • Neue, vereinfachte User-Verwaltung für sämtliche zPNS-xx.
    • Einführung von Pushsafer als neuen Push-Dienst.
  7. Version 1.6
    • Definition einer maximalen Nachrichtenlänge zum Sicherstellen des Sendens.
    • Umbenennung einiger lokaler Variablen.
  8. Version 2.0
    • Automatische Erstellung der Systemvariablen.
  9. Version 2.1
    • Einbindung der ".ToUTF8()"-Funktion zur Umwandlung von Sonderzeichen (erfordert mindestens WebUI 2.29.22).
    • Verwendung von "dom.GetObject(ID_xxx).Get(yyy)" statt "dom.GetObject(yyy)".
    • Automatisches, individuelles Umwandeln von HTML-Color-Tags in den einzelnen zPNS-xx (erfordert teilweise mindestens WebUI 2.29.22 wegen ".Replace()"-Funktion).
    • zPNS-Po 2.1.2: Unterstützung von Titeln inkl. UTF-8-Codes.
    • zPNS-Po 2.1.3: Automatisches Löschen von Titeln nach der Übertragung.
  10. Version 3.0
    • Unterstützung der Bildübertragung im zPNS-Po, zPNS-Ps und zPNS-Tg
  11. Version 3.1/2.2
    • alle zPNS-xx: Einbindung der ".UriEncode()"-Funktion zur Umwandlung von Sonderzeichen
    • zPNS-Po 3.1.1: Umwandlung des Farbstrings "orange" in den Farbcode "#ffa500" für Android-Geräte
  12. Version 4.0
    • Überarbeitete Nutzerverwaltung. Statt der zweistelligen Nummern als Indikatoren der API-Schlüssel können nun alphanumerische Folgen, also z.B. auch Namen verwendet werden. Dies ermöglicht zudem das Versenden von Push-Nachrichten an einzelne Nutzer. Die Verwendung der Devices unter Pushover bleibt davon unberührt.
    • In Version 4.0.1 wurde das curl-Verzeichnis von CUxD von "extra/curl" in "/usr/bin/curl" geändert. Damit sollte das zPNP auch mit der aktuellen Firmware der CCU2 laufen.
  13. Version 4.1
    • Automatisches Löschen der optionalen Systemvariablen, wenn diese nicht gesetzt sind.
Zuletzt geändert von dtp am 25.03.2020, 18:19, insgesamt 177-mal geändert.
CCU3 mit stets aktueller FW und den Addons "CUxD" und "Programmedrucken", ioBroker auf Synology DiskStation DS718+ im Docker-Container;
einige Projekte: zentrales Push-Nachrichten-Programm zPNP, DoorPi-Videotürsprechanlage, An- und Abwesenheitsdetektion per Haustürschloss, zentrales Programm zur Steuerung von Beschattungsgeräten zBSP.

dtp
Beiträge: 8242
Registriert: 21.09.2012, 08:09
Wohnort: Stuttgart
Hat sich bedankt: 63 Mal
Danksagung erhalten: 187 Mal

Re: Howto - ein erster Test des zPNP

Beitrag von dtp » 17.08.2015, 07:10

Um nun das zPNP zu testen, klickt bitte unter "Programme und Verknüpfungen > Programme" auf den Button "Skript testen" und gebt folgenden Zeilen ein:

Code: Alles auswählen

! Namen der verwendeten Systemvariablen
string svPushText = "CCU SV Push Text"; ! gem. zPNS-xx, obligatorisch

! Name des zentralen Push-Nachrichten-Programms
string zPNP = "CCU PRG Push-Nachrichten"; ! obligatorisch

! +++++ Erzeugen der Test-Nachricht +++++
string message = "<font color=orange>Dies</font> ist eine <font color=green>gewöhnliche</font> Test-Nachricht.";

! +++++ zPNP ausführen +++++
(dom.GetObject(ID_SYSTEM_VARIABLES).Get(svPushText)).State(message);
(dom.GetObject(ID_PROGRAMS).Get(zPNP)).ProgramExecute();

WriteLine("Nachricht gesendet");
Wollt ihr auch die Wirkung der Systemvariablen "CCU SV Push Dienst", "CCU SV Push Prio" und "CCU SV Push Pushover Sound" testen, so verwendet nachfolgendes Skript und ändert ggf. die String-Werte in ".State()".

Code: Alles auswählen

! Namen der verwendeten Systemvariablen
string svPushText = "CCU SV Push Text"; ! gem. zPNS-xx, obligatorisch
string svPushPrio = "CCU SV Push Prio"; ! gem. zPNS-xx, obligatorisch
string svPushService = "CCU SV Push Dienst"; ! gem. zPNS-xx, optional
string svPushoverSound = "CCU SV Pushover Sound"; ! gem. zPNS-Po, optional

! Name des zentralen Push-Nachrichten-Programms
string zPNP = "CCU PRG Push-Nachrichten"; ! obligatorisch

! +++++ Erzeugen der Test-Nachricht +++++
string message = "<font color=orange>Dies</font> ist eine <font color=green>gewöhnliche</font> Test-Nachricht.";

! +++++ Auswahl des Push-Dienstes +++++
if(dom.GetObject(ID_SYSTEM_VARIABLES).Get(svPushService)){(dom.GetObject(ID_SYSTEM_VARIABLES).Get(svPushService)).State("1");}

! +++++ Setzen der Priorität für die Push-Nachricht +++++
(dom.GetObject(ID_SYSTEM_VARIABLES).Get(svPushPrio)).State("0");

! +++++ Sound für Pushover-Nachricht +++++
if(dom.GetObject(ID_SYSTEM_VARIABLES).Get(svPushoverSound)){(dom.GetObject(ID_SYSTEM_VARIABLES).Get(svPushoverSound)).State("gamelan");}

! +++++ zPNP ausführen +++++
(dom.GetObject(ID_SYSTEM_VARIABLES).Get(svPushText)).State(message);
(dom.GetObject(ID_PROGRAMS).Get(zPNP)).ProgramExecute();

WriteLine("Nachricht gesendet");
"CCU SV Push Dienst" hat ja eigentlich die Werte "aus;alle;Pushover;Telegram;Pushsafer". Diese werden CCU-intern jedoch auf 0, 1, ..., 3 gesetzt. Sprich, wenn ihr nur Pushover nutzen wollt, obwohl ihr auch für Telegram und/oder Pushover entsprechende API-Keys vergeben habt, dann setzt "CCU SV Push Dienst" oben auf den Wert 2.

Um den Versand von Bildern zu testen, empfiehlt es sich, zunächst eine kleine Bilddatei (vorzugsweise < 500 KB) mit dem Namen "Bild.jpg" in das tmp-Verzeichnis der CCU zu kopieren. Danach könnt ihr dieses Bild dann mit dem folgenden Skript per Pushover oder Telegram versenden.

Code: Alles auswählen

! Namen der verwendeten Systemvariablen
string svPushText = "CCU SV Push Text"; ! gem. zPNS-xx, obligatorisch
string svPushImage = "CCU SV Push Bild"; ! Link auf ein anzufügendes Bild, default: ""

! Name des zentralen Push-Nachrichten-Programms
string zPNP = "CCU PRG Push-Nachrichten"; ! obligatorisch

! +++++ Erzeugen der Test-Nachricht +++++
string message = "Test-Nachricht mit <font color=green>angehängtem Bild</font>.";

! +++++ Verzeichnis auf der CCU, in dem das Bild gespeichert werden soll +++++
string image = "/tmp/Bild.jpg";

! +++++ zPNP ausführen +++++
(dom.GetObject(ID_SYSTEM_VARIABLES).Get(svPushText)).State(message);
(dom.GetObject(ID_SYSTEM_VARIABLES).Get(svPushImage)).State(image);
(dom.GetObject(ID_PROGRAMS).Get(zPNP)).ProgramExecute();

WriteLine("Nachricht gesendet!");


Um Bilder mit Pushsafer zu versenden, ist es notwendig das entsprechende Bild vor dem Versand mit Base64 zu konvertieren. Dafür hat Pushsafer zum Beispiel einen entsprechenden Konverter verlinkt.

Wenn diese Tests erfolgreich waren, könnt ihr Euch zum Beispiel das Servicemeldungen-Skript installieren, das ich hier zur Verwendung mit dem zPNP erstellt habe.

Hinweis

Nach jedem Neustart der CCU werden Systemvariablen mit Wertelisten immer auf den jeweils ersten Eintrag gesetzt. Im vorliegenden Fall bedeutet dies, dass das Senden von Push-Nachrichten immer ausgeschaltet wäre. Ihr könnt dies wirkungsvoll vermeiden, wenn ihr ein Reboot-Programm verwendet, das bestimmte Systemvarialben nach einem Reboot der CCU auf definierte Werte setzt. Wie das geht, habe ich hier beschrieben. Und so sollte das entsprechende Programm aussehen, wobei ich die für "CCU SV Push Dienst" relevante Zeile rot umrandet habe:
CCU PRG Reboot.jpg


Gruß,

Thorsten
Zuletzt geändert von dtp am 25.03.2020, 18:24, insgesamt 22-mal geändert.
CCU3 mit stets aktueller FW und den Addons "CUxD" und "Programmedrucken", ioBroker auf Synology DiskStation DS718+ im Docker-Container;
einige Projekte: zentrales Push-Nachrichten-Programm zPNP, DoorPi-Videotürsprechanlage, An- und Abwesenheitsdetektion per Haustürschloss, zentrales Programm zur Steuerung von Beschattungsgeräten zBSP.

dtp
Beiträge: 8242
Registriert: 21.09.2012, 08:09
Wohnort: Stuttgart
Hat sich bedankt: 63 Mal
Danksagung erhalten: 187 Mal

Re: Howto - Push-Dienste einrichten

Beitrag von dtp » 17.08.2015, 07:52

Pushover
Pushover_Einrichtung.jpg
Für Pushover ist die entsprechend iOS- oder Android-App notwendig. Diese ist kostenpflichtig; dafür kann man sich dann aber auch sehr viele Push-Nachrichten pro Tag kostenfrei zusenden lassen. Ich persönlich bin noch nie an die Grenzen gestoßen. Unten im Bild erkennt man die drei von mir eingerichteten Tokens bzw. Applications, die ich je nach Priorität verwende. "HomeMatic" für Push-Nachrichten der Prioritäten -2, -1 und 0, "HomeMatic Warnung" für Push-Nachrichten der Prio 1 und "HomeMatic Alarm" für Push-Nachrichten der Prio 2. Die zugehörigen Icons entstammen übrigens diesem Beitrag. Man kann die Tokens auch für andere Pushover-User verwenden, ohne sie bei dem jeweiligen User neu einrichten zu müssen. Die Erfahrung zeigt aber, dass dies mitunter zu einer deutlichen Verzögerung führen kann. Daher empfehle ich, die App-Tokens für jeden User separat einzurichten.

Telgram

Für Telegram sei zunächst mal hierhin verwiesen. Da erfahrt ihr, wie ihr den Dienst und die Bots einrichten müsst.

Gruß,

Thorsten
Zuletzt geändert von dtp am 25.03.2020, 18:25, insgesamt 11-mal geändert.
CCU3 mit stets aktueller FW und den Addons "CUxD" und "Programmedrucken", ioBroker auf Synology DiskStation DS718+ im Docker-Container;
einige Projekte: zentrales Push-Nachrichten-Programm zPNP, DoorPi-Videotürsprechanlage, An- und Abwesenheitsdetektion per Haustürschloss, zentrales Programm zur Steuerung von Beschattungsgeräten zBSP.

dtp
Beiträge: 8242
Registriert: 21.09.2012, 08:09
Wohnort: Stuttgart
Hat sich bedankt: 63 Mal
Danksagung erhalten: 187 Mal

Re: Howto - Anzeige in den Apps

Beitrag von dtp » 26.08.2015, 08:56

So, und hier dann mal ein paar Ausgaben der Apps, jeweils mit den Prios -2, -1, 0, 1 und 2 von unten nach oben.

Pushover
Pushover.PNG
Gruß,

Thorsten
Zuletzt geändert von dtp am 25.03.2020, 18:25, insgesamt 4-mal geändert.
CCU3 mit stets aktueller FW und den Addons "CUxD" und "Programmedrucken", ioBroker auf Synology DiskStation DS718+ im Docker-Container;
einige Projekte: zentrales Push-Nachrichten-Programm zPNP, DoorPi-Videotürsprechanlage, An- und Abwesenheitsdetektion per Haustürschloss, zentrales Programm zur Steuerung von Beschattungsgeräten zBSP.

SMA
Beiträge: 95
Registriert: 16.04.2015, 13:28

Re: Howto - zentrales Programm für Push-Nachrichten

Beitrag von SMA » 28.08.2015, 00:17

EDIT: KANN GELÖSCHT WERDEN UM DTP'S BEITRÄGE ANEINANDER ZU REIHEN!!!
EDIT: KANN GELÖSCHT WERDEN UM DTP'S BEITRÄGE ANEINANDER ZU REIHEN!!!
EDIT: KANN GELÖSCHT WERDEN UM DTP'S BEITRÄGE ANEINANDER ZU REIHEN!!!
EDIT: KANN GELÖSCHT WERDEN UM DTP'S BEITRÄGE ANEINANDER ZU REIHEN!!!
Zuletzt geändert von SMA am 18.02.2016, 18:05, insgesamt 2-mal geändert.
Privat
1 Kanäle in 1 Geräten und 16 CUxD-Kanäle in 1 CUxD-Geräten:
1x CUX28, 1x HM-Sec-SCo


Ehemalig studentische Projektgruppe
Übersicht des Haus-Projekts (Neubau)
1x CCU2 (Untergeschoss/Stahlbau) || 2x LAN-Gateway (Erdgeschoss/Dachgeschoss)

527 Kanäle in 238 Geräten und 64 CUxD-Kanäle in 17 CUxD-Geräten:
9x HM-Sen-MDIR-O-2, 16x CUX90, 12x HM-LC-Sw2-FM, 18x HM-PB-6-WM55, 33x HM-Sec-SCo, 21x HM-Sec-SD, 19x HM-LC-Bl1PBU-FM, 24x HM-LC-Sw1PBU-FM, 16x HM-TC-IT-WM-W-EU, 19x HM-LC-Sw1-FM, 9x HM-PBI-4-FM, 3x HM-Sec-SD-Team, 1x HM-Sec-TiS, 10x HM-Sec-SC-2, 3x HM-CC-VG-1, 5x HM-Sec-MDIR-2, 2x HM-LC-Sw4-SM, 1x HM-Sen-Wa-Od, 5x HM-LC-RGBW-WM, 1x CUX28, 1x HM-Sen-EP, 3x HM-LC-Dim1T-FM, 1x HM-LC-Sw4-DR, 1x HM-LC-Dim1TPBU-FM, 2x HM-WDS10-TH-O, 1x HM-Sec-WDS-2, 2x HM-ES-PMSw1-Pl, 14x HMW-LC-Sw2-DR, 1x HM-WDS100-C6-O, 2x HMW-IO-12-Sw7-DR

Grisuli
Beiträge: 21
Registriert: 19.05.2015, 06:19

Re: Howto - zentrales Programm für Push-Nachrichten

Beitrag von Grisuli » 05.09.2015, 22:14

Hallo Thorsten,

ich habe jetzt nach deiner Beratung alles ans laufen gebracht und es funktioniert wunderbar. :D :lol:
Ich hätte aber noch eine Frage.

Ich habe in das Script noch eine vierte Pushover APP eingefügt und das funktioniert soweit auch, allerdings kann man die Pushover APP´s nur Anhand der Prio Einstellung unterscheiden. Ich habe bei mir noch eine APP Klingel angelegt und mit Prio 1 versehen, wenn nun die Klingel betätigt wird, geht HM Warnung und HM Klingel gleichzeitig los. Könnte man evtl. noch eine Möglichkeit einbauen die APP´s anhand des Namens auszuwählen und nicht mit der Priorität? Somit könnte man in dem Script verschiedenste APP´s ansprechen und hätte nochmehr möglichkeiten es zu verwenden.

Ich habe mal das geänderte Script angehangen, vielleicht habe ich auch einen Fehler gemacht.

VG Grisuli

Code: Alles auswählen

  ! Push-Nachrichten senden
    string APkey; string CPkey; string HMinfo; string HMwarnung; string HMalarm; string HMklingel; string push; string prio; string sound; string message; string newmessage; string messageindex;

    ! Pushover API-Schlüssel
    ! A
    APkey = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";

    ! C
    CPkey = "cccccccccccccccccccccccccccccccccccc";

    ! Pushover Tokens
    HMinfo = "xxxxxxxxxxxxxxxxxxxxxxxxx";
    HMwarnung = "xxxxxxxxxxxxxxxxxxxxxxxxx";
    HMalarm = "xxxxxxxxxxxxxxxxxxxxxxxxx";
    HMklingel = "xxxxxxxxxxxxxxxxxxxxxxxxx";

    ! Systemvariablen auslesen
    message = dom.GetObject("CCU SV Push Text").Variable();
    prio = dom.GetObject("CCU SV Push Prio").Variable();
    sound = dom.GetObject("CCU SV Push Sound").Variable();

    ! Umwandlung von Sonderzeichen in UTF-8-Codes

    ! Umwandlung Leerschritt in "%20"
    foreach(messageindex,message.Split(" "))
    {
      newmessage = newmessage+messageindex+"%20";
    }
    message = newmessage;
    newmessage = "";

    ! Umwandlung "Ä" in "%C3%84"
    foreach(messageindex,message.Split("Ä"))
    {
      newmessage = newmessage+messageindex+"%C3%84";
    }
    message = newmessage;
    newmessage = "";

    ! Umwandlung "Ö" in "%C3%96"
    foreach(messageindex,message.Split("Ö"))
    {
      newmessage = newmessage+messageindex+"%C3%96";
    }
    message = newmessage;
    newmessage = "";

    ! Umwandlung "Ü" in "%C3%9C"
    foreach(messageindex,message.Split("Ü"))
    {
      newmessage = newmessage+messageindex+"%C3%9C";
    }
    message = newmessage;
    newmessage = "";

    ! Umwandlung "ä" in "%C3%A4"
    foreach(messageindex,message.Split("ä"))
    {
      newmessage = newmessage+messageindex+"%C3%A4";
    }
    message = newmessage;
    newmessage = "";

    ! Umwandlung "ö" in "%C3%B6"
    foreach(messageindex,message.Split("ö"))
    {
      newmessage = newmessage+messageindex+"%C3%B6";
    }
    message = newmessage;
    newmessage = "";

    ! Umwandlung "ü" in "%C3%BC"
    foreach(messageindex,message.Split("ü"))
    {
      newmessage = newmessage+messageindex+"%C3%BC";
    }
    message = newmessage;
    newmessage = "";

    ! Umwandlung "ß" in "%C3%9F"
    foreach(messageindex,message.Split("ß"))
    {
      newmessage = newmessage+messageindex+"%C3%9F";
    }
    message = newmessage;
    newmessage = "";

    ! Umwandlung "°" in "%C2%B0"
    foreach(messageindex,message.Split("°"))
    {
      newmessage = newmessage+messageindex+"%C2%B0";
    }
    message = newmessage;
    newmessage = "";

    ! Kürzen der Nachricht um die jeweils am Ende angefügten Umwandlungscodes.
    message = message.Substr(0, message.Length()-51);

    ! Informationsmeldungen "HomeMatic"
    if((prio == -2) || (prio == -1) || (prio == 0))
    {
      push = dom.GetObject("CCU SV Push Info").Value();
      if(push == true)
      {
        ! Push-Nachricht an A senden
        dom.GetObject("CUxD.CUX2801001:1.CMD_EXEC").State("LD_LIBRARY_PATH=/usr/local/addons/cuxd /usr/local/addons/cuxd/curl -s -k -d token='"#HMinfo#"' -d user='"#APkey#"' -d message='"#message#"' -d priority='"#prio#"' -d sound='"#sound#"' -d html=1 https://api.pushover.net/1/messages.json");

        ! Push-Nachricht nur an C senden, wenn prio = 0
        if(prio == 0)
        {
          dom.GetObject("CUxD.CUX2801001:1.CMD_EXEC").State("LD_LIBRARY_PATH=/usr/local/addons/cuxd /usr/local/addons/cuxd/curl -s -k -d token='"#HMinfo#"' -d user='"#CPkey#"' -d message='"#message#"' -d priority='"#prio#"' -d sound='"#sound#"' -d html=1 https://api.pushover.net/1/messages.json");
        }
      }
    }

    ! Warnmeldungen "HomeMatic Warnung"
    if(prio == 1)
    {
      ! Push-Nachricht an A senden
      dom.GetObject("CUxD.CUX2801001:1.CMD_EXEC").State("LD_LIBRARY_PATH=/usr/local/addons/cuxd /usr/local/addons/cuxd/curl -s -k -d token='"#HMwarnung#"' -d user='"#APkey#"' -d message='"#message#"' -d priority='"#prio#"' -d sound='"#sound#"' -d html=1 https://api.pushover.net/1/messages.json");

      ! Push-Nachricht an C senden
      dom.GetObject("CUxD.CUX2801001:1.CMD_EXEC").State("LD_LIBRARY_PATH=/usr/local/addons/cuxd /usr/local/addons/cuxd/curl -s -k -d token='"#HMwarnung#"' -d user='"#CPkey#"' -d message='"#message#"' -d priority='"#prio#"' -d sound='"#sound#"' -d html=1 https://api.pushover.net/1/messages.json");
    }

    ! Alarmmeldungen "HomeMatic Alarm"
    if(prio == 2)
    {
      ! Push-Nachricht an A senden
      dom.GetObject("CUxD.CUX2801001:1.CMD_EXEC").State("LD_LIBRARY_PATH=/usr/local/addons/cuxd /usr/local/addons/cuxd/curl -s -k -d token='"#HMalarm#"' -d user='"#APkey#"' -d message='"#message#"' -d priority='"#prio#"' -d sound='"#sound#"' -d html=1 -d retry=30 -d expire=120 https://api.pushover.net/1/messages.json");

      ! Push-Nachricht an C senden
      dom.GetObject("CUxD.CUX2801001:1.CMD_EXEC").State("LD_LIBRARY_PATH=/usr/local/addons/cuxd /usr/local/addons/cuxd/curl -s -k -d token='"#HMalarm#"' -d user='"#CPkey#"' -d message='"#message#"' -d priority='"#prio#"' -d sound='"#sound#"' -d html=1 -d retry=30 -d expire=120 https://api.pushover.net/1/messages.json");
    }

  ! Alarmmeldungen "HomeMatic Klingel"
    if(prio == 1)
    {
      ! Push-Nachricht an A senden
      dom.GetObject("CUxD.CUX2801001:1.CMD_EXEC").State("LD_LIBRARY_PATH=/usr/local/addons/cuxd /usr/local/addons/cuxd/curl -s -k -d token='"#HMklingel#"' -d user='"#APkey#"' -d message='"#message#"' -d priority='"#prio#"' -d sound='"#sound#"' -d html=1 -d retry=30 -d expire=120 https://api.pushover.net/1/messages.json");

      ! Push-Nachricht an C senden
      dom.GetObject("CUxD.CUX2801001:1.CMD_EXEC").State("LD_LIBRARY_PATH=/usr/local/addons/cuxd /usr/local/addons/cuxd/curl -s -k -d token='"#HMklingel#"' -d user='"#CPkey#"' -d message='"#message#"' -d priority='"#prio#"' -d sound='"#sound#"' -d html=1 -d retry=30 -d expire=120 https://api.pushover.net/1/messages.json");
    }

    ! Push-Systemvariablen zurücksetzen
    dom.GetObject("CCU SV Push Text").Variable("");
    dom.GetObject("CCU SV Push Prio").Variable("");
    dom.GetObject("CCU SV Push Sound").Variable("");

dtp
Beiträge: 8242
Registriert: 21.09.2012, 08:09
Wohnort: Stuttgart
Hat sich bedankt: 63 Mal
Danksagung erhalten: 187 Mal

Howto - Rauchmelder

Beitrag von dtp » 11.09.2015, 10:56

Hier dann mal ein Beispiel für eine Meldung, die im Falle eines durch die Rauchmelder detektierten Brandes abgesetzt wird.

Code: Alles auswählen

! Meldung Rauch
! Version 2.4.3, Autor: dtp

! Namen der verwendeten Systemvariablen
string svPushText = "CCU SV Push Text"; ! gem. zPNS-xx, obligatorisch
string svPushPrio = "CCU SV Push Prio"; ! gem. zPNS-xx, obligatorisch
string svPushoverSound = "CCU SV Pushover Sound"; ! gem. zPNS-Po, optional

! Name des zentralen Push-Nachrichten-Programms
string zPNP = "CCU PRG Push-Nachrichten"; ! obligatorisch

! #####################################################################
! ##### ab hier bitte keine weiteren Einstellungen mehr vornehmen #####
! #####################################################################

! +++++ Deklaration weiterer Variablen +++++
string index; string list = ""; string message; 
var device;

! +++++ Setzen der Priorität für die Push-Nachricht +++++
(dom.GetObject(ID_SYSTEM_VARIABLES).Get(svPushPrio)).State("2");

! +++++ Sound für Pushover-Nachricht +++++
if(dom.GetObject(ID_SYSTEM_VARIABLES).Get(svPushoverSound)){(dom.GetObject(ID_SYSTEM_VARIABLES).Get(svPushoverSound)).State("persistent");}

! +++++ auslösende Rauchmelder ermitteln +++++
foreach(index, dom.GetObject(ID_FUNCTIONS).Get("Sicherheit").EnumUsedIDs()){
  if(dom.GetObject(index).IsTypeOf(OT_CHANNEL)){
    device = dom.GetObject(dom.GetObject(index).Device());
    if((device.HssType() == "HmIP-SWSD") || (device.HssType() == "HM-Sec-SD") || (device.HssType() == "HM-Sec-SD-2")){
      if(dom.GetObject(index).DPByHssDP("STATE").Value()){
        list=list#"\n- "#device.Name();
      }
    }
  }
}

! +++++ Erzeugen der Nachricht +++++
message = "<font color=red>Achtung, Rauch im Haus!</font>";
message = message#list;

! +++++ zPNP ausführen +++++
(dom.GetObject(ID_SYSTEM_VARIABLES).Get(svPushText)).State(message);
(dom.GetObject(ID_PROGRAMS).Get(zPNP)).ProgramExecute();
Und das zugehörige Programm:
Haus PRG Rauch.jpg
Die Systemvariable "CCU SV Status" dient lediglich dazu, dass das Programm beim Neustart der CCU nicht ausgeführt wird (siehe dazu meine Signatur).

Gruß,

Thorsten
Zuletzt geändert von dtp am 24.05.2019, 14:33, insgesamt 13-mal geändert.
CCU3 mit stets aktueller FW und den Addons "CUxD" und "Programmedrucken", ioBroker auf Synology DiskStation DS718+ im Docker-Container;
einige Projekte: zentrales Push-Nachrichten-Programm zPNP, DoorPi-Videotürsprechanlage, An- und Abwesenheitsdetektion per Haustürschloss, zentrales Programm zur Steuerung von Beschattungsgeräten zBSP.

dtp
Beiträge: 8242
Registriert: 21.09.2012, 08:09
Wohnort: Stuttgart
Hat sich bedankt: 63 Mal
Danksagung erhalten: 187 Mal

Howto - Ausschalten von Verbrauchern bei Abwesenheit

Beitrag von dtp » 14.12.2015, 19:24

Code: Alles auswählen

! Aktoren für bestimmte Gewerke ausschalten
! Version 2.4, Autor: dtp 

! ----- Listen der Gewerke (trennen mit "\t", alle Gewerke oder Räume: "alle") -----
string tradeList = "Licht\t
                    Verbraucher";  

! ----- Liste der Geräte, die nicht ausgeschaltet werden sollen (trennen mit "\t") -----
string exList = "DG Schlafzimmer Dimmer Kanal 2\t
                 EG Garage Licht\t
                 EG Flur Tablet Sender Wohnzimmer\t
                 EG Flur Tablet Schaltzustand Wohnzimmer\t
                 EG Flur Tablet Schalter Wohnzimmer\t
                 UG Büro Dimmer Kanal 2\t
                 UG HWR Waschmaschine Schalter\t
                 UG HWR Trockner Schalter"; 

! ----- Namen der verwendeten Systemvariablen -----
string svPushText = "CCU SV Push Text"; ! gem. zPNS-xx, obligatorisch
string svPushPrio = "CCU SV Push Prio"; ! gem. zPNS-xx, obligatorisch
string svPushoverSound = "CCU SV Pushover Sound"; ! gem. zPNS-Po, optional

! ----- Name des zentralen Push-Nachrichten-Programms -----
string zPNP = "CCU PRG Push-Nachrichten"; ! obligatorisch

! #####################################################################
! ##### ab hier bitte keine weiteren Einstellungen mehr vornehmen #####
! #####################################################################

! +++++ Deklaration weiterer Variablen +++++
string message; string list = ""; string trade; string channelName;

! +++++ Setzen der Priorität für die Push-Nachricht +++++
(dom.GetObject(ID_SYSTEM_VARIABLES).Get(svPushPrio)).State("-1");

! +++++ Sound für Pushover-Nachricht +++++
if(dom.GetObject(ID_SYSTEM_VARIABLES).Get(svPushoverSound)){(dom.GetObject(ID_SYSTEM_VARIABLES).Get(svPushoverSound)).State("none");}

! +++++ Skriptkern +++++
if(tradeList == "alle"){tradeList = dom.GetObject(ID_FUNCTIONS).EnumNames();}

foreach(trade, tradeList){
  trade = trade.Trim();
  if(dom.GetObject(ID_FUNCTIONS).Get(trade)){
    foreach(channelName, (dom.GetObject(ID_FUNCTIONS).Get(trade)).EnumUsedNames()){
      if(!exList.Contains(channelName)){
        if((dom.GetObject(ID_CHANNELS).Get(channelName)).DPByHssDP("STATE").Value()){
          (dom.GetObject(ID_CHANNELS).Get(channelName)).DPByHssDP("STATE").State(0); 
          list = list#"\n- "#channelName;
        }
        if((dom.GetObject(ID_CHANNELS).Get(channelName)).DPByHssDP("LEVEL").Value()){
          (dom.GetObject(ID_CHANNELS).Get(channelName)).DPByHssDP("LEVEL").State(0.0); 
          list = list#"\n- "#channelName;
        }
      }
    }
  }
}

! +++++ Erzeugen der Nachricht +++++
message = "Geräte-Kanäle wegen Abwesenheit ausgeschaltet!";

if(list != ""){
  message = message#list;

  ! +++++ zPNP ausführen +++++
  (dom.GetObject(ID_SYSTEM_VARIABLES).Get(svPushText)).State(message);
  (dom.GetObject(ID_PROGRAMS).Get(zPNP)).ProgramExecute();
}
2017-04-20_15h24_38.png
Das zugehörige Programm zum Setzen des 60-Sekunden-Timers.
2017-04-20_15h27_54.png
Zuletzt geändert von dtp am 02.02.2019, 09:59, insgesamt 13-mal geändert.
CCU3 mit stets aktueller FW und den Addons "CUxD" und "Programmedrucken", ioBroker auf Synology DiskStation DS718+ im Docker-Container;
einige Projekte: zentrales Push-Nachrichten-Programm zPNP, DoorPi-Videotürsprechanlage, An- und Abwesenheitsdetektion per Haustürschloss, zentrales Programm zur Steuerung von Beschattungsgeräten zBSP.

dtp
Beiträge: 8242
Registriert: 21.09.2012, 08:09
Wohnort: Stuttgart
Hat sich bedankt: 63 Mal
Danksagung erhalten: 187 Mal

Howto - Servicemeldungen 3.0

Beitrag von dtp » 15.12.2015, 07:15

Nachfolgend das von mir an das zPNP angepasste und überarbeitete Allinclusive-Skript von Alchy samt aufrufendem Programm.
Servicemeldungen305.hsc
(18.54 KiB) 78-mal heruntergeladen
CCU PRG Servicemeldungen.png
CCU PRG Servicemeldungen.png (24.19 KiB) 7944 mal betrachtet
Wie es in der Einleitung des "Servicemeldungen"-Skripts schon geschrieben steht, habe ich auf folgende Funktionalitäten von Alchys Allinclusive-Skript verzichtet: BLOCK, USE_SYSVAR, WITHTIME, GO.

Der Grund ist, dass man ja in den zPNS-xx eine Sperrzeit definieren kann, binnen der keine aufeinander folgenden, identischen Push-Nachrichten zugestellt werden sollen. Weiterhin erfolgt immer das Schreiben der Nachricht in die Systemvariable "CCU SV Push Text", so dass keine gesonderte Systemvariable mehr erforderlich ist. Und da die Push-Apps fast alle immer die Uhrzeit der zugestellten Nachricht anzeigen, braucht man diese ebenfalls nicht innerhalb der Nachricht zu übertragen.

Ansonsten habe ich das "Servicemeldungen"-Skript an meine Anforderungen bzgl. der Prios angepasst, um z.B. zu vermeiden, dass meine Frau die Servicemeldungen erhält. Zudem sind die Texte der Servicemeldungen etwas modifiziert worden.

In Version 3.0 wurde nun die Möglichkeit implementiert, bestimmte Geräte, Gerätetypen und/oder Meldungstypen auszuschließen. Dazu gibt es nun zwei lokale Variablen "exDevicesList" und "exDeviceTypesList".

"exDevicesList" wird in der Form "Gerät|Meldungstyp\t Gerät|Meldungstyp" befüllt, also z.B.

Code: Alles auswählen

string exDevicesList = "DG Dach Wettersensor|UNREACH\t
                        UG Büro Fenster|ERROR_SABOTAGE";
wenn man Kommunikationsstörungen des Wettersensors und Sabotage-Meldungen des Fensterkontakts unterdrücken möchte. Lässt man den Meldungstyl weg, so werden sämtliche Servicemeldungen eines Geräts unterdrückt.

"exDeviceTypesList" wird in der Form "Gerätetyp|Meldungstyp\t Gerätetyp|Meldungstyp" befüllt, also z.B.

Code: Alles auswählen

string exDevicesList = "HM-Sec-Key|UNREACH\t
                        HM-Sec-Key|ERROR_SABOTAGE";
wenn man generell von allen Fensterkontakten des "HM-Sec-Key" keine Kommunikationsstörungs- und Sabotagemeldungen erhalten möchte. Auch hier gilt, dass der Meldetyp optional ist. Lässt man ihn weg, werden sämtliche des Gerätetyps unterdrückt.

Weiterhin wurde in das Skript nun die Möglichkeit integriert, sich über die Beseitigung aller Servicemeldungen unterrichten zu lassen. Da das natürlich unsinnig wäre für die unterdrückten Meldungen, wurde eine Systemvariable "CCU SV Servicemeldungen Vorliste" eingeführt, die man unter der lokalen Variablen "svServicesListPrev" beliebig benennen kann. Diese Systemvariable wird automatische angelegt, wenn man das Skript erstmalig aufruft. Sie enthält eine Liste aller vorherigen Servicemeldungen außer den ausgeschlossenen. Die Verwendung der Systemvariablen "CCU SV Servicemeldungen Vorliste" ist optional. Nur wenn sie definiert wurde, erhält man Benachrichtigungen über die Beseitigung aller Servicemeldungen.

Batteriebetriebene HM- und HMIP-Geräte

Ich bin noch mal sämtliche aktuell verfügbaren HM- und HMIP-Batterie-Devices durchgegangen, um deren Batteriezustand zu erfassen
HM-HMIP-Bat.txt
(1.28 KiB) 320-mal heruntergeladen

Code: Alles auswählen

block9   = "HM-LC-Sw1-Ba-PCB|HM-LC-Sw4-PCB|HM-LC-Sw4-WM|HM-MOD-EM-8|HM-MOD-Re-8|HM-OU-CM-PCB|HM-Sen-RD-O|";
cr2016   = "HM-RC-4|HM-RC-4-B|HM-RC-Key3|HM-RC-Key3-B|HM-RC-P1|HM-RC-Sec3|HM-RC-Sec3-B|ZEL STG RM HS 4|";
cr2032   = "HM-PB-2-WM|HM-PB-4-WM|HM-PBI-4-FM|HM-SCI-3-FM|HM-Sec-TiS|HM-SwI-3-FM|";
lr14x2   = "HM-OU-CFM-TW|HM-Sec-Sir-WM|";
lr14x3   = "HmIP-MP3P|";
lr3x1    = "HM-RC-4-2|HM-RC-4-3|HM-RC-Key4-2|HM-RC-Key4-3|HM-RC-Sec4-2|HM-RC-Sec4-3|HM-Sec-RHS-2|HM-Sec-SCo|HmIP-KRC4|HmIP-KRCA|HmIP-RC8|HmIP-SRH|HmIP-SWDO|";
lr3x2    = "HM-Dis-WM55|HM-Dis-EP-WM55|HM-PB-2-WM55|HM-PB-2-WM55-2|HM-PB-6-WM55|HM-PBI-2-FM|HM-RC-8|HM-Sen-DB-PCB|HM-Sen-EP|HM-Sen-MDIR-SM|HM-Sen-MDIR-WM55|HM-TC-IT-WM-W-EU|HM-WDS30-T-O|HM-WDS30-OT2-SM|HmIP-STH|HmIP-STHD|HMIP-WRC2|HMIP-WRC6|HmIP-WT|HmIP-WTH|HmIP-WTH-2|HmIP-SAM|HmIP-SLO|HmIP-SWDO-I|HmIP-SMI55|HmIP-SCI|HmIP-WRCD|HmIP-DSD-PCB|HmIP-WRCR|HmIP-STV|";
lr3x3    = "HM-PB-4Dis-WM|HM-PB-4Dis-WM-2|HM-RC-Dis-H-x-EU|HM-Sen-LI-O|";
lr3x3a   = "HM-RC-19|HM-RC-19-B|HM-RC-12|HM-RC-12-B|HM-RC-12-W|";
lr44x2   = "HM-Sec-RHS|HM-Sec-SC|HM-Sec-SC2|HM-Sec-SC-2|";
lr6x2    = "HM-CC-RT-DN|HM-CC-VD|HM-CC-TC|HM-Dis-TD-T|HM-Sec-WDS|HM-Sec-WDS-2|HM-WDS10-TH-O|HM-WDS30-OT2-SM-2|HM-WDS40-TH-I|HM-WDS40-TH-I-2|HB-UW-Sen-THPL-I|HMIP-eTRV|HmIP-eTRV-2|HmIP-eTRV-C|HmIP-SMI|HmIP-SMO|HmIP-SMO-A|HmIP-SPI|HmIP-STHD|HmIP-SPDR|HmIP-SWD|eTRV-HmIP-B-UK|";
lr6x3    = "HM-Sec-MDIR|HM-Sec-MDIR-2|HM-Sec-Key|HM-Sec-Key-S|HM-Sec-Key-O|HM-Sec-SD|HM-Sen-MDIR|HM-Sen-MDIR-O|HM-Sen-MDIR-O-2|HM-Sen-Wa-Od|HM-WDS100-C6-O|HM-WDS100-C6-O-2|HmIP-ASIR|HmIP-ASIR-B1|HmIP-ASIR-O|HmIP-ASIR-2|HmIP-SWO-B|HmIP-SWO-PL";
lr6x4    = "HM-CCU-1|HM-ES-TX-WM|HM-WDC7000|";
fixed    = "HM-Sec-SD-2|HmIP-SWSD|HmIP-MIO16-PCB|HmIP-PCBS|HmIP-PCBS2|HmIP-PCBS-BAT|HmIP-MOD-RC8|HmIP-MOD-OC8|";
recharge = "HM-Sec-Win|HM-Sec-SFA-SM|";

Falls noch jemand ein Gerät findet, was nicht in der Liste ist, immer her damit!

Anzeige der Servicemeldungen in ioBroker vis

Die Servicemeldungen lassen sich übrigens recht einfach in vis anzeigen. Das sieht dann z.B. für eine Sabotagemeldung und nach ihrem Entfernen so aus:
vis_Servicemeldungen.gif
Dazu bedarf es lediglich eines kleinen Javaskripts.

Code: Alles auswählen

createState('vis.Servicemeldungen', 0, {
  type: 'string',
  read: true,
  write: true,
  desc: 'vis Servicemeldungen',
  def: ''
});

on("hm-rega.0.2093", function(obj){
  var message = obj.state.val;
  if(message.search("Servicemeldung") > 0){
    message = message.replace(/%0A/g, '<br>');
    setState("vis.Servicemeldungen", message);
    setState("vis.0.control.command", '{"instance": "*", "data": "08CCU", "command": "changeView"}');
  } 
});
Mit "vis.0.control.command" kann man automatisch auf den entsprechenden View (bei mir "08CCU") wechseln. Wer das nicht braucht, der löscht die Zeile einfach oder kommentiert sie aus. Der Datenpunkt "2093" ist die ISE_ID für die auf meiner CCU3 erstellte Systemvariable "CCU SV Push Text". Das Skript fragt bei Änderung dieser Systemvariablen den String "Servicemeldung" ab und zeigt im vis-Widget "basic - String (unescaped)" über das Objekt "javascript.0.vis.Servicemeldungen" alles an, was diesen String enthält.

Soll die Visualisierung z.B. drei Minutan nach einer neuen Servicemeldung und 30 Sekunden nach dem Verschwinden der letzten Servicemeldung automatisch wieder zur Startseite zurückkehren, dann einfach das nachfolgende Javaskript erstellten.

Code: Alles auswählen

var timer1 = null, timer2 = null;

on("vis.0.control.data", function(obj){
  if(obj.state.val === "iPad/08CCU"){
    if(getState("hm-rega.0.maintenance").val !== 0){
      if(timer1) clearTimeout(timer1);
      timer1 = setTimeout(function(){
        setState("vis.0.control.command", '{"instance": "*", "data": "01Haus", "command": "changeView"}');
      }, 3 * 60000); // autoamtische Rückkehr auf Homeview nach 3 Minuten
    }
    else{
      if(timer2) clearTimeout(timer2);
      timer2 = setTimeout(function(){
        setState("vis.0.control.command", '{"instance": "*", "data": "01Haus", "command": "changeView"}');
      }, 30 * 1000); // autoamtische Rückkehr auf Homeview nach 30 Sekunden
    }
  }
});
Der View-Name für die Servicemeldungen (im obigen Beispiel "iPad/08CCU") muss dann noch entpsrechend der Anzeige im Datenpunkt "vis.0.control.data" geändert werden. Zudem noch den Startview-Namen (im obigen Beispiel "01Haus") anpassen. Fertig.

Bis dann,

Thorsten
Zuletzt geändert von dtp am 07.03.2020, 17:10, insgesamt 75-mal geändert.
CCU3 mit stets aktueller FW und den Addons "CUxD" und "Programmedrucken", ioBroker auf Synology DiskStation DS718+ im Docker-Container;
einige Projekte: zentrales Push-Nachrichten-Programm zPNP, DoorPi-Videotürsprechanlage, An- und Abwesenheitsdetektion per Haustürschloss, zentrales Programm zur Steuerung von Beschattungsgeräten zBSP.

Gnadenloos
Beiträge: 1
Registriert: 26.12.2015, 09:12

Re: Howto - zentrales Programm für Push-Nachrichten

Beitrag von Gnadenloos » 26.12.2015, 09:18

Hallo,ich bin auch ein absoluter Newbie der sich mit Push Nachrichten auseinander setzt (wenn auch mit Programmiererfahrung, hoffe es hilft ;-). Mir ist der Aufbau und die Wirkungsweise nicht so ganz klar. Ich lese oftmals im www, dass User bestehende Prowl Probleme dadurch gelöst haben, dass sie sich auf mein-homatic (kostenpflichtig) angemeldet haben.

Die hier dargestellte Anleitung ist super, muss ich irgendwelche Dienste zum Einsatz freischalten?
Bitte Info und DANKE? Hoffe perspektivisch auch helfen zu können...
Zuletzt geändert von Gnadenloos am 26.12.2015, 20:53, insgesamt 1-mal geändert.

Antworten

Zurück zu „HomeMatic Tipps & Tricks - keine Fragen!“