Howto - zentrales Push-Nachrichten-Programm zPNP

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

Moderator: Co-Administratoren

al-79
Beiträge: 80
Registriert: 15.11.2016, 15:47
Wohnort: nähe Hannover
Hat sich bedankt: 1 Mal

Re: Howto - zentrales Push-Nachrichten-Programm (zPNP) V2.0

Beitrag von al-79 » 26.09.2017, 22:38

Okay - kein Stress...


Gesendet vom Mobiltelefon .... Rechtschreibfehler ggf. durch 'T9'
Grüße

al-79

--------------------------------------------
361 Kanäle in 84 Geräten und 32 CUxD-Kanäle in 2 CUxD-Geräten
--------------------------------------------

dtp
Beiträge: 10658
Registriert: 21.09.2012, 08:09
System: CCU
Wohnort: Stuttgart
Hat sich bedankt: 320 Mal
Danksagung erhalten: 501 Mal

Re: Howto - zentrales Push-Nachrichten-Programm (zPNP) V2.1

Beitrag von dtp » 29.09.2017, 08:25

EDIT: Problem hat sich erledigt. Der Startbeitrag konnte wieder editiert werden. Danke.

Leider kann ich meinen Startbeitrag im Moment nicht editieren, da ich stets eine Fehlermeldung der SQL-Datenbank erhalte.
2017-09-29_08h21_10.png
2017-09-29_08h21_10.png (8.56 KiB) 2556 mal betrachtet
Hat jemand einen Tipp für mich?

Gruß,

Thorsten
Zuletzt geändert von dtp am 02.10.2017, 07:32, insgesamt 1-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.

Cash
Beiträge: 1184
Registriert: 09.01.2016, 17:42
Wohnort: Sauerland
Hat sich bedankt: 1 Mal
Danksagung erhalten: 1 Mal

Re: Howto - zentrales Push-Nachrichten-Programm (zPNP) V2.1

Beitrag von Cash » 29.09.2017, 09:36

Einen Tipp habe ich nicht nur den Hinweis das es bei mir funktioniert...

dtp
Beiträge: 10658
Registriert: 21.09.2012, 08:09
System: CCU
Wohnort: Stuttgart
Hat sich bedankt: 320 Mal
Danksagung erhalten: 501 Mal

Re: Howto - zentrales Push-Nachrichten-Programm (zPNP) V2.1

Beitrag von dtp » 29.09.2017, 12:04

EDIT: Problem hat sich erledigt. Der Startbeitrag konnte wieder editiert werden. Danke.
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.

homie35
Beiträge: 2
Registriert: 03.10.2017, 19:45

Re: Howto - zentrales Push-Nachrichten-Programm (zPNP) V2.1

Beitrag von homie35 » 03.10.2017, 20:00

Hallo,

ich bin neu hier im Forum; lese allerdings schon seit drei Jahren fleissig mit :D

Telegram-Push lief bei mir vorher schon sehr gut. Allerdings gestückelt in einzelnen Programmen.

Habe heute zPNP v2.1 mit Telegram ausprobiert; was soll ich sagen: Super, funktioniert alles.
Bis ich einen zweiten User angelegt habe...
Leider bekommt immer nur die erste chat-ID eine Nachricht; Habe Testweise mal die ID-Positionen getauscht; dann geht die Nachricht an die andere Nummer; aber immer nur an die erste ID.
Prio ist bei beiden auf -2

CCU FW ist auf 2.29.22
Cux-D auf 1.11a

Habe ich was übersehen oder vergessen?

Hier mal das Script:

Code: Alles auswählen

! Push-Nachrichten per Telegram senden
! weitere Informationen unter http://homematic-forum.de/forum/viewtopic.php?f=31&t=26282
! Version 2.1, Autor: dtp
! ACHTUNG: Dieses Skript benötigt eine CCU-Firmware ab Version 2.29.22
   
! +++++ User-Daten +++++
! In den nachfolgenden Listen werden die User-Daten durch "xx|" eingeleitet und durch EINEN Leerschritt voneinander getrennt. 
string HMinfoList = "01|31xxxxx02:AAGxxxxxxxxxxxxxxxxxxxxxxxxxxxxbZA"; ! API-Schlüssel (Bot-Token) für Info-Meldungen. Beispiel: "01|xxxxKey1xxxx 02|xxKey2xx"
string HMwarnungList = ""; ! optionale API-Schlüssel (Bot-Token) für Warnmeldungen
string HMalarmList = ""; ! optionale API-Schlüssel (Bot-Token) für Alarmmeldungen
string chatIdList = "01|44xxxxx08 02|32xxxxx30"; ! Chat-IDs der User. Beispiel: "01|xxxxxxxxx 02|xxxxxxxxx"
string prioMinList = "01|-2 02|-2"; ! Prioritäten, ab der die User Nachrichten erhalten sollen. Beispiel: "01|-2 02|0"
     
! +++++ Dauer in Sekunden, innerhalb der keine identischen Push-Nachrichten gesendet werden sollen +++++
integer stopRepeat = 10;
     
! +++++ Namen der zwingend benötigten Systemvariablen +++++
string svPushText = "CCU SV Push Text"; ! Text der aktuell zu übertragenden Push-Nachricht
string svPushTextRef = "CCU SV Push Text Ref"; ! Text der vorherigen Push-Nachricht als Referenz

! +++++ Namen der optionalen Systemvariablen (auf "" setzen, wenn nicht benötigt) +++++
string svPushPrio = "CCU SV Push Prio"; ! Prioritäten der Push-Nachrichten (-2,-1,0,1,2), default: 0
string svPushService = "CCU SV Push Dienst"; ! Push-Dienste ("aus;alle;..."), default: alle

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

! +++++ Deklaration weiterer Variablen +++++
string message; string HMinfo; string HMwarnung; string HMalarm; 
string pushService = "alle"; string userStr; string chatId; string prioMin; 
integer prio = 0; integer userIndex; integer startIndex; integer diff; integer sendFlag = 1;
object svObject; object svObjectList;

! +++++ Systemvariablen erzeugen bzw. falls vorhanden, auslesen +++++
if(!svPushText){svPushText = "CCU SV Push Text";}
svObject = dom.GetObject(ID_SYSTEM_VARIABLES).Get(svPushText);
if(!svObject){
  svObjectList = dom.GetObject(ID_SYSTEM_VARIABLES); svObject = dom.CreateObject(OT_VARDP); svObjectList.Add(svObject.ID()); 
  svObject.Name(svPushText); svObject.DPInfo("Aktuelle Push-Nachricht"); svObject.Internal(false); svObject.Visible(true); 
  svObject.ValueType(ivtString); svObject.ValueSubType(istChar8859); svObject.ValueUnit(""); dom.RTUpdate(true);
}
else{message = svObject.Value();}

if(!svPushTextRef){svPushTextRef = "CCU SV Push Text Ref";}
svObject = dom.GetObject(ID_SYSTEM_VARIABLES).Get(svPushTextRef);
if(!svObject){   
  svObjectList = dom.GetObject(ID_SYSTEM_VARIABLES); svObject = dom.CreateObject(OT_VARDP); svObjectList.Add(svObject.ID());
  svObject.Name(svPushTextRef); svObject.DPInfo("Vorherige Push-Nachricht"); svObject.Internal(false); svObject.Visible(true);
  svObject.ValueType(ivtString); svObject.ValueSubType(istChar8859); svObject.ValueUnit(""); dom.RTUpdate(true);
}

if(svPushPrio){
  svObject = dom.GetObject(ID_SYSTEM_VARIABLES).Get(svPushPrio);
  if(!svObject){   
    svObjectList = dom.GetObject(ID_SYSTEM_VARIABLES); svObject = dom.CreateObject(OT_VARDP); svObjectList.Add(svObject.ID());
    svObject.Name(svPushPrio); svObject.DPInfo("Priorität der Push-Nachricht"); svObject.Internal(false); svObject.Visible(true);
    svObject.ValueType(ivtFloat); svObject.ValueSubType(istGeneric); svObject.ValueUnit(""); svObject.ValueMin(-2); svObject.ValueMax(2); dom.RTUpdate(true);
  }
  else{prio = svObject.Value().ToInteger(); if(prio == 2){stopRepeat = 0;}}
}

if(svPushService){
  svObject = dom.GetObject(ID_SYSTEM_VARIABLES).Get(svPushService);
  if(!svObject){   
    svObjectList = dom.GetObject(ID_SYSTEM_VARIABLES); svObject = dom.CreateObject(OT_VARDP); svObjectList.Add(svObject.ID());
    svObject.Name(svPushService); svObject.DPInfo("Auswahl des Push-Dienstes"); svObject.Internal(false); svObject.Visible(true);
    svObject.ValueType(ivtInteger); svObject.ValueSubType(istEnum); svObject.ValueList("aus;alle;Telegram"); svObject.ValueUnit(""); dom.RTUpdate(true);
  }
  else{
    if(svObject.ValueList().Find("Telegram") == -1){svObject.ValueList(svObject.ValueList() + ";Telegram");}
    pushService = svObject.ValueList().StrValueByIndex(";", svObject.Value());
  }
}

! +++++ Push-Nachrichten erzeugen und versenden ++++
if((pushService == "alle") || (pushService == "Telegram") || (prio == 2)){   
  ! ----- Vermeidung identischer Push-Nachrichten innerhalb stopRepeat Sekunden -----
  diff = (dom.GetObject(ID_SYSTEM_VARIABLES).Get(svPushText)).Timestamp().ToInteger() - (dom.GetObject(ID_SYSTEM_VARIABLES).Get(svPushTextRef)).Timestamp().ToInteger();
  if(diff < stopRepeat){
    if(message == (dom.GetObject(ID_SYSTEM_VARIABLES).Get(svPushTextRef)).Value()){sendFlag = 0;}
  }
  
  if(sendFlag == 1){
    ! ----- Abschneiden zu langer Push-Nachrichten, um das Senden sicherzustellen -----
    if(message.Length() > 980){message = message.Substr(0, 980)#"\nMaximale Nachrichtenlänge erreicht!";}

    ! ----- Umwandlung von Sonderzeichen gem. UTF-8 -----
    message = message.ToUTF8();

    ! ----- Umwandlung von HTML-Color-Tags in HMTL-Fettdruck-Tags -----
    message = message.Replace("</font>", "[/b]");
    while(message.Find("color=") > 0){
      message = message.Replace("<font color=" # message.Substr(message.Find("color=") + 6, message.Find(">") - message.Find("color=") + 5), "[b]");
    }
    message = message.Replace("[", "<"); message = message.Replace("]", ">"); 
    
    ! ----- Absenden der Push-Nachrichten -----
    foreach(HMinfo, HMinfoList.Split(" ")){
      ! Werte zuordnen
      userIndex = HMinfo.Substr(0, 2).ToInteger(); userStr = HMinfo.Substr(0, 3);
      HMinfo = HMinfo.Substr(3, HMinfo.Length()-3);
      startIndex = chatIdList.Find(userStr).ToInteger();
      if(startIndex != -1){
        chatId = chatIdList.Substr(startIndex+3, chatIdList.Length()-1);
        chatId = chatId.Substr(0, chatId.Find(" "));
      } else{quit;}
      startIndex = HMwarnungList.Find(userStr).ToInteger();
      if(startIndex != -1){
        HMwarnung = HMwarnungList.Substr(startIndex+3, HMwarnungList.Length()-1);
        HMwarnung = HMwarnung.Substr(0,HMwarnung.Find(" "));
      } else{HMwarnung = HMinfo;}
      startIndex = HMalarmList.Find(userStr).ToInteger();
      if(startIndex != -1){
        HMalarm = HMalarmList.Substr(startIndex+3, HMalarmList.Length()-1);
        HMalarm = HMalarm.Substr(0,HMalarm.Find(" "));
      } else{HMalarm = HMinfo;}
      startIndex = prioMinList.Find(userStr).ToInteger();
      if(startIndex != -1){
        prioMin = prioMinList.Substr(startIndex+3, prioMinList.Length()-1);
        prioMin = prioMin.Substr(0,prioMin.Find(" "));
      } else{prioMin = -2;}

      if(prio >= prioMin){
        ! Informationsmeldungen senden
        if(prio == -2){
          (dom.GetObject(ID_DATAPOINTS).Get("CUxD.CUX2801001:1.CMD_EXEC")).State("extra/curl -s -k https://api.telegram.org/bot"#HMinfo#"/sendMessage -d text='"#message#"' -d chat_id="#chatId#" -d parse_mode=html -d disable_notification=1");
        }
        if((prio == -1) || (prio == 0)){
          (dom.GetObject(ID_DATAPOINTS).Get("CUxD.CUX2801001:1.CMD_EXEC")).State("extra/curl -s -k https://api.telegram.org/bot"#HMinfo#"/sendMessage -d text='"#message#"' -d chat_id="#chatId#" -d parse_mode=html");
        }
        ! Warnmeldungen senden
        if(prio == 1){
          (dom.GetObject(ID_DATAPOINTS).Get("CUxD.CUX2801001:1.CMD_EXEC")).State("extra/curl -s -k https://api.telegram.org/bot"#HMwarnung#"/sendMessage -d text='"#message#"' -d chat_id="#chatId#" -d parse_mode=html");
        }
        ! Alarmmeldungen senden
        if(prio == 2){
          (dom.GetObject(ID_DATAPOINTS).Get("CUxD.CUX2801001:1.CMD_EXEC")).State("extra/curl -s -k https://api.telegram.org/bot"#HMalarm#"/sendMessage -d text='"#message#"' -d chat_id="#chatId#" -d parse_mode=html");
        }
      }
    }
  }
}
Besten Dank vorab
homie

dtp
Beiträge: 10658
Registriert: 21.09.2012, 08:09
System: CCU
Wohnort: Stuttgart
Hat sich bedankt: 320 Mal
Danksagung erhalten: 501 Mal

Re: Howto - zentrales Push-Nachrichten-Programm (zPNP) V2.1

Beitrag von dtp » 04.10.2017, 07:25

Hallo homie,

so kann das auch nicht gehen:

Code: Alles auswählen

string HMinfoList = "01|31xxxxx02:AAGxxxxxxxxxxxxxxxxxxxxxxxxxxxxbZA"; ! API-Schlüssel (Bot-Token) für Info-Meldungen. Beispiel: "01|xxxxKey1xxxx 02|xxKey2xx"
Du musst es schon so machen, wie es direkt dahinter beschrieben steht, also mit zusäztlichem Leerschritt und "02|" statt "02:":

Code: Alles auswählen

string HMinfoList = "01|31xxxxx 02|AAGxxxxxxxxxxxxxxxxxxxxxxxxxxxxbZA"; ! API-Schlüssel (Bot-Token) für Info-Meldungen. Beispiel: "01|xxxxKey1xxxx 02|xxKey2xx"
Ich zitiere mal aus dem Eingangsposting:
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 "xx|" vorangetellt. Wenn man also nur einen User hat, trägt man jeweils nur einen Key "01|+++key1+++" ein. Hat man zwei User, trägt man zwei Keys "01|+++key1+++ 02|+++++key2+++++" ein, die durch ein Leerzeichen getrennt sind. Bei drei Usern sind es drei Keys und so weiter. Achtung, es darf nur ein einziges Leezeichen zwischen den Keys eingetragen sein.
Gruß,

Thorsten
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.

homie35
Beiträge: 2
Registriert: 03.10.2017, 19:45

Re: Howto - zentrales Push-Nachrichten-Programm (zPNP) V2.1

Beitrag von homie35 » 04.10.2017, 08:43

Hi,

Sorry das war doof geschrieben, das ganze ist nur ein API-Key, habe nur zwischendurch die Zeichen nicht "ge-xt"...

Eigentlich sollte es so aussehen:

string HMinfoList = "01|31xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxbZA"; ! API-Schlüssel (Bot-Token) für Info-Meldungen. Beispiel: "01|xxxxKey1xxxx 02|xxKey2xx"

Und während ich das schreibe, bemerke ich, dass User 2 damit gar keinen Bot hat [emoji85]. Wollte alles mit einem Bot machen, habe aber übersehen für User 2 den API-Key einzutragen...

Vielen Dank für die schnelle Antwort.


Andere Frage: Wie stelle ich es an, dass nur ein bestimmter User benachrichtigt wird?
Z.B. die Fenster-Warnung nur an das Handy zu senden, welches als letztes das Haus verlässt.
Bei Pushover gibt es ja die SV "Gerät"
Für Telegram habe ich nichts derartiges gefunden...

Gruß Homie

dtp
Beiträge: 10658
Registriert: 21.09.2012, 08:09
System: CCU
Wohnort: Stuttgart
Hat sich bedankt: 320 Mal
Danksagung erhalten: 501 Mal

Re: Howto - zentrales Push-Nachrichten-Programm (zPNP) V2.1

Beitrag von dtp » 04.10.2017, 14:38

homie35 hat geschrieben: Für Telegram habe ich nichts derartiges gefunden...
Da gibt's auch bisher nichts. Müsste ich mir mal Gedanken zu machen. Man könnte z.B. in Abhängigkeit einer weiteren Systemvariablen die Prioritätenschwellen der User so ändern, dass nur einzelne von Ihnen eine Push-Nachricht bekommen. Das aber nur mal "aus der Hüfte geschossen". ;)
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.

Karlinho
Beiträge: 42
Registriert: 13.12.2016, 17:45

Re: Howto - zentrales Push-Nachrichten-Programm (zPNP) V2.1

Beitrag von Karlinho » 05.10.2017, 08:14

Hallo Thorsten,

kannst du mir evtl. Pushsafer Version 1.6 zur Verfügung stellen, weil ich noch mit Firmware 2.27.8 unterwegs bin.

Besten Dank

Gruß
Kai

dtp
Beiträge: 10658
Registriert: 21.09.2012, 08:09
System: CCU
Wohnort: Stuttgart
Hat sich bedankt: 320 Mal
Danksagung erhalten: 501 Mal

Re: Howto - zentrales Push-Nachrichten-Programm (zPNP) V2.1

Beitrag von dtp » 05.10.2017, 09:23

Hallo Kai,

hier noch die Version 1.6 der zPNS-xx
zPNS-Tg16.txt
(9.43 KiB) 60-mal heruntergeladen
zPNS-Ps16.txt
(8.81 KiB) 57-mal heruntergeladen
zPNS-Po16.txt
(9.15 KiB) 57-mal heruntergeladen
zPNS-Pl16.txt
(8.07 KiB) 51-mal heruntergeladen
zPNS-Pa16.txt
(9.26 KiB) 53-mal heruntergeladen
Gruß,

Thorsten
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.

Antworten

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