Howto - zentrales Push-Nachrichten-Programm zPNP

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

Moderator: Co-Administratoren

terne
Beiträge: 30
Registriert: 10.04.2017, 16:39
Hat sich bedankt: 3 Mal

Re: Howto - zentrales Push-Nachrichten-Programm (zPNP) V4.3

Beitrag von terne » 10.10.2020, 10:58

dtp hat geschrieben:
10.10.2020, 10:45
Nutzt du Android? Da gab es bisher nur Probleme mit der Umsetzung von orange.

Bei mir unter iOS und Windows (im Firefox) werden die Farben korrekt wiedergegeben.

Versuch's doch mal bitte ergänzend mit den folgenden beiden Codezeilen im zPNS-Po:

Code: Alles auswählen

    message = message.Replace("royalblue", "#4169e1");
    message = message.Replace("yellowgreen", "#9acd32");
oder teste das angefügte Skript.

zPNS-Po431.hsc
Hi,

ja nutze Android, und die beiden Zeilen helfen an dieser Stelle :)

Vielen Dank und Grüße
Raspimatic 3.61.7.20220226 -> RPI-RF-MOD auf HB-RF-USB-TK @ Poxmox 7.1.10 mit 258 Kanälen in 59 Geräten
ioBroker JS-Controler 4.0.15 Debian 11 @ Proxmox redis/redis
Weatherman v. WM2_22_2 / wiffi_pump4 v. 16

mrg13
Beiträge: 16
Registriert: 22.10.2017, 15:07
Danksagung erhalten: 1 Mal

Re: Howto - zentrales Push-Nachrichten-Programm (zPNP) V4.3

Beitrag von mrg13 » 25.10.2020, 12:26

Hi dtp,

ich nutze das zPNP und auch das zBSP schon einige Zeit. Bis jetzt hat das auch alles soweit gut funktioniert.
Dafür erstmal danke!
Jetzt habe ich beide Programme auf die neueste Version aktualisiert.
Wenn ich jetzt

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");
zum testen eingebe, bekomme ich die Nachricht insgesamt 8 mal.

Bild

Das hatte ich vorher nicht. Und auch mit den Zeichen...
Hab ich was falsch gemacht?

Danke schon mal und Grüße

mrg

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) V4.3

Beitrag von dtp » 26.10.2020, 15:35

Kann es sein, dass du das Skript mehrmals laufen hast? Könnte auch sein, dass du evtl. den Skriptcode nicht richtig kopiert hast. Schwer zu sagen, ohne dass du dein zPNS-xx und ggf. das zPNP hier zeigst.

Normalerweise sollte es keine derartigen Probleme geben. Zumindest habe ich noch nichts derartiges hier gelesen. Auch bei mir selbst funktioniert es soweit ohne Probleme.

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.

mrg13
Beiträge: 16
Registriert: 22.10.2017, 15:07
Danksagung erhalten: 1 Mal

Re: Howto - zentrales Push-Nachrichten-Programm (zPNP) V4.3

Beitrag von mrg13 » 26.10.2020, 16:31

nee habs nur einmal laufen.
Hier dann mal das zPNS

Code: Alles auswählen

! Push-Nachrichten per Pushover senden
! weitere Informationen unter http://homematic-forum.de/forum/viewtopic.php?f=31&t=26282
! Version 4.3.1, Autor: dtp
! Hinweis: nicht vorhandene Systemvariablen werden automatisch mit erstmaligem Aufruf dieses Skripts angelegt

! +++++ User-Daten +++++
! In den nachfolgenden Listen die User-Daten durch "xx|" einleiten und durch EINEN Leerschritt voneinander trennen. 
string keyList = "Empfänger01|xxxxxxxxx"; ! API-Basisschlüssel. Beispiel: "Empfänger01|xxxxKey1xxxx Empfänger02|xxKey2xx"
string HMinfoList = "Empfänger01|xxxxxxx"; ! API-Schlüssel für Info-Meldungen. Beispiel: "Empfänger01|xxxxKey1xxxx Empfänger02|xxKey2xx"
string HMwarnungList = ""; ! optionale API-Schlüssel für Warnmeldungen
string HMalarmList = ""; ! optionale API-Schlüssel für Alarmmeldungen
string prioMinList = "Empfänger01|-2"; ! Prioritäten, ab der die User Nachrichten erhalten sollen. Beispiel: "Empfänger01|-2 Empfänger02|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, 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: ""
string svPushoverSound = ""; ! Sound der Nachricht (z.B. "CCU SV Pushover Sound"), Voreinstellung: ""
string svPushoverTitle = ""; ! Titel der Nachricht (z.B. "CCU SV Pushover Titel"), Voreinstellung: "" 
string svPushoverDevice = ""; ! Pushover-Gerät (z.B. "CCU SV Pushover Gerät"), Voreinstellung: ""

! #####################################################################
! ##### ab hier bitte keine weiteren Einstellungen mehr vornehmen #####
! #####################################################################
 
! +++++ Deklaration weiterer Variablen +++++
string message; string key; string HMinfo; string HMwarnung; string HMalarm; string prioMin; 
string pushService = "alle"; string pushUserList = ""; string userStr; string seperator = "|";
string title = ""; string image = ""; string sound = "pushover"; string device = ""; string svName;
integer prio = 0; 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;Pushover"); svObject.ValueUnit(""); dom.RTUpdate(true);
  }
  else{
    if(svObject.ValueList().Find("Pushover") == -1){svObject.ValueList(svObject.ValueList() + ";Pushover");}
    pushService = svObject.ValueList().StrValueByIndex(";", svObject.Value());
  }
}

if(svPushUserList){
  svObject = dom.GetObject(ID_SYSTEM_VARIABLES).Get(svPushUserList);
  if(!svObject){   
    svObjectList = dom.GetObject(ID_SYSTEM_VARIABLES); svObject = dom.CreateObject(OT_VARDP); svObjectList.Add(svObject.ID());
    svObject.Name(svPushUserList); svObject.DPInfo("Empfängerliste für die Push-Nachrichten"); svObject.Internal(false); svObject.Visible(true);
    svObject.ValueType(ivtString); svObject.ValueSubType(istChar8859); svObject.ValueUnit(""); dom.RTUpdate(true);
  }
  else{pushUserList = svObject.Value();}
}
else{
  foreach(svName, dom.GetObject(ID_SYSTEM_VARIABLES).EnumUsedNames()){
    svObject = dom.GetObject(ID_SYSTEM_VARIABLES).Get(svName);
    if(svObject.DPInfo() == "Empfängerliste für die Push-Nachrichten"){dom.DeleteObject(svObject);}
  }
}

if(svPushImage){
  svObject = dom.GetObject(ID_SYSTEM_VARIABLES).Get(svPushImage);
  if(!svObject){
    svObjectList = dom.GetObject(ID_SYSTEM_VARIABLES); svObject = dom.CreateObject(OT_VARDP); svObjectList.Add(svObject.ID()); 
    svObject.Name(svPushImage); svObject.DPInfo("Link für ein zu sendendes Bild"); svObject.Internal(false); svObject.Visible(true); 
    svObject.ValueType(ivtString); svObject.ValueSubType(istChar8859); svObject.ValueUnit(""); dom.RTUpdate(true);
  }
  else{image = svObject.Value();}
}
else{
  foreach(svName, dom.GetObject(ID_SYSTEM_VARIABLES).EnumUsedNames()){
    svObject = dom.GetObject(ID_SYSTEM_VARIABLES).Get(svName);
    if(svObject.DPInfo() == "Link für ein zu sendendes Bild"){dom.DeleteObject(svObject);}
  }
}

if(svPushoverSound){
  svObject = dom.GetObject(ID_SYSTEM_VARIABLES).Get(svPushoverSound);
  if(!svObject){   
    svObjectList = dom.GetObject(ID_SYSTEM_VARIABLES); svObject = dom.CreateObject(OT_VARDP); svObjectList.Add(svObject.ID()); 
    svObject.Name(svPushoverSound); svObject.DPInfo("Sound der Pushover-Nachricht"); svObject.Internal(false); svObject.Visible(true); 
    svObject.ValueType(ivtString); svObject.ValueSubType(istChar8859); svObject.ValueUnit(""); dom.RTUpdate(true);
  }
  else{sound = svObject.Value();}
}
else{
  foreach(svName, dom.GetObject(ID_SYSTEM_VARIABLES).EnumUsedNames()){
    svObject = dom.GetObject(ID_SYSTEM_VARIABLES).Get(svName);
    if(svObject.DPInfo() == "Sound der Pushover-Nachricht"){dom.DeleteObject(svObject);}
  }
}

if(svPushoverTitle){
  svObject = dom.GetObject(ID_SYSTEM_VARIABLES).Get(svPushoverTitle);
  if(!svObject){   
    svObjectList = dom.GetObject(ID_SYSTEM_VARIABLES); svObject = dom.CreateObject(OT_VARDP); svObjectList.Add(svObject.ID());
    svObject.Name(svPushoverTitle); svObject.DPInfo("Titel der Pushover-Nachricht"); svObject.Internal(false); svObject.Visible(true);
    svObject.ValueType(ivtString); svObject.ValueSubType(istChar8859); svObject.ValueUnit(""); dom.RTUpdate(true);
  }
  else{title = svObject.Value();}
}
else{
  foreach(svName, dom.GetObject(ID_SYSTEM_VARIABLES).EnumUsedNames()){
    svObject = dom.GetObject(ID_SYSTEM_VARIABLES).Get(svName);
    if(svObject.DPInfo() == "Titel der Pushover-Nachricht"){dom.DeleteObject(svObject);}
  }
}

if(svPushoverDevice){
  svObject = dom.GetObject(ID_SYSTEM_VARIABLES).Get(svPushoverDevice);
  if(!svObject){   
    svObjectList = dom.GetObject(ID_SYSTEM_VARIABLES); svObject = dom.CreateObject(OT_VARDP); svObjectList.Add(svObject.ID()); 
    svObject.Name(svPushoverDevice); svObject.DPInfo("Gerät für Pushover-Nachricht"); svObject.Internal(false); svObject.Visible(true); 
    svObject.ValueType(ivtString); svObject.ValueSubType(istChar8859); svObject.ValueUnit(""); dom.RTUpdate(true);
  }
  else{device = svObject.Value();}
}
else{
  foreach(svName, dom.GetObject(ID_SYSTEM_VARIABLES).EnumUsedNames()){
    svObject = dom.GetObject(ID_SYSTEM_VARIABLES).Get(svName);
    if(svObject.DPInfo() == "Gerät für Pushover-Nachricht"){dom.DeleteObject(svObject);}
  }
}

! +++++ Push-Nachrichten erzeugen und versenden ++++
if((pushService == "alle") || (pushService.Contains("Pushover")) || (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 und URI -----
    message = message.ToUTF8().UriEncode(); title = title.ToUTF8().UriEncode();

    ! ----- Umwandlung Farbstrings in Farbcodes für Android-Kompatibilität -----
    message = message.Replace("orange", "#ffa500");
    message = message.Replace("royalblue", "#4169e1");
    message = message.Replace("yellowgreen", "#9acd32");

    ! ----- Absenden der Push-Nachrichten -----  
    foreach(key, keyList.Split(" ")){
      userStr = key.Substr(0, key.Find(seperator)+1).Trim();

      if((pushUserList.Contains(userStr.Substr(0, userStr.Length()-1))) || (pushUserList == "") || (prio == 2)){
        key = key.Replace(userStr, "").Trim();
        startIndex = HMinfoList.Find(userStr).ToInteger();
        if(startIndex != -1){
          HMinfo = HMinfoList.Substr(startIndex+userStr.Length(), HMinfoList.Length()-1);
          HMinfo = HMinfo.Substr(0, HMinfo.Find(" "));
        } else{HMinfo = "";}
        startIndex = HMwarnungList.Find(userStr).ToInteger();
        if(startIndex != -1){
          HMwarnung = HMwarnungList.Substr(startIndex+userStr.Length(), HMwarnungList.Length()-1);
          HMwarnung = HMwarnung.Substr(0, HMwarnung.Find(" "));
        } else{HMwarnung = HMinfo;}
        startIndex = HMalarmList.Find(userStr).ToInteger();
        if(startIndex != -1){
          HMalarm = HMalarmList.Substr(startIndex+userStr.Length(), HMalarmList.Length()-1);
          HMalarm = HMalarm.Substr(0, HMalarm.Find(" "));
        } else{HMalarm = HMinfo;}
        startIndex = prioMinList.Find(userStr).ToInteger();
        if(startIndex != -1){
          prioMin = prioMinList.Substr(startIndex+userStr.Length(), prioMinList.Length()-1);
          prioMin = prioMin.Substr(0, prioMin.Find(" "));
        } else{prioMin = -2;}
  
        if(prio >= prioMin){      
          ! ----- Informationsmeldungen -----
          if((prio == -2) || (prio == -1) || (prio == 0)){
            (dom.GetObject(ID_DATAPOINTS).Get("CUxD.CUX2801001:1.CMD_EXEC")).State("/usr/bin/curl -s -k -d token='"#HMinfo#"' -d user='"#key#"' -d device='"#device#"' -d title='"#title#"' -d message='"#message#"' -d priority='"#prio#"' -d sound='"#sound#"' -d html=1 https://api.pushover.net/1/messages.json");
          }
          ! ----- Warnmeldungen -----
          if(prio == 1){
            (dom.GetObject(ID_DATAPOINTS).Get("CUxD.CUX2801001:1.CMD_EXEC")).State("/usr/bin/curl -s -k -d token='"#HMwarnung#"' -d user='"#key#"' -d device='"#device#"' -d title='"#title#"' -d message='"#message#"' -d priority='"#prio#"' -d sound='"#sound#"' -d html=1 https://api.pushover.net/1/messages.json");
          }
          ! ----- Alarmmeldungen -----
          if(prio == 2){
            (dom.GetObject(ID_DATAPOINTS).Get("CUxD.CUX2801001:1.CMD_EXEC")).State("/usr/bin/curl -s -k -d token='"#HMalarm#"' -d user='"#key#"' -d device='"#device#"' -d title='"#title#"' -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");
          }
          ! Bild senden, falls vorhanden
          if(image){
            (dom.GetObject(ID_DATAPOINTS).Get("CUxD.CUX2801001:1.CMD_EXEC")).State("/usr/bin/curl -s -k -F token='"#HMinfo#"' -F user='"#key#"' -F device='"#device#"' -F title='"#title#"' -F message='"#image#"' -F attachment='@"#image#"' -F priority='-2' -F sound='none'  https://api.pushover.net/1/messages.json", pictDelay * 1000);
          }
        }
      }
    }
	
    ! ----- Zurücksetzen eines vergebenenen Titels -----
    if(title){(dom.GetObject(ID_SYSTEM_VARIABLES).Get(svPushoverTitle)).State("");}
  }
}
Ich habs auch schon nochmal kopiert auch ohne Erfolg...
Hab natürlich das alte Skript auch nicht gesichert... :cry:
Ich bekomme auch die Pushmails vom zBSP so oft hintereinander. Die hab ich ja nicht geändert.

Grüße

mrg13
Beiträge: 16
Registriert: 22.10.2017, 15:07
Danksagung erhalten: 1 Mal

Re: Howto - zentrales Push-Nachrichten-Programm (zPNP) V4.3

Beitrag von mrg13 » 26.10.2020, 20:21

So hab jetzt nochmal alles neu gemacht und mit nem anderen Editor geöffnet und daraus kopiert.
Jetzt funktioniert es wieder! :D

Trotzdem Danke!

Grüße
mrg

Shuo
Beiträge: 215
Registriert: 18.09.2014, 23:19
Danksagung erhalten: 6 Mal

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

Beitrag von Shuo » 08.11.2020, 22:00

dtp hat geschrieben:
03.09.2020, 16:52

Code: Alles auswählen

! Meldung Fenster/Türen schließen
! Version 2.7, Autor: dtp

! Gewerkname für die Türen- und Fenster-Sensoren
string trade = "Verschluss";

! Listen geöffneter und gekippter Fenster und Türen, die nicht berücksichtigt werden sollen (trennen mit "\t")
string exTiltList = ""; ! gekippte Fenster und Türen
string exOpenList = ""; ! geöffnete Fenster und Türen

! Schlüsselbegriffe von Fenstern und Türen mit Priorität 2 (trennen mit "\t")
string highPrioKeywordsList = "";

! 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 +++++
var device;
string index; string list = ""; string stateList = ""; string message; string highPrioKeyword; 
integer prio; integer prioMax = -2;

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

! +++++ Auslesen der Fenster- und Türenzustände und Erzeugen einer Liste +++++
foreach(index, dom.GetObject(ID_FUNCTIONS).Get(trade).EnumUsedIDs()){
  if(dom.GetObject(index).IsTypeOf(OT_CHANNEL)){
    device = dom.GetObject(dom.GetObject(index).Device());
    if(!exTiltList.Contains(device.Name())){
      if((device.HssType() == "HM-Sec-RHS") || (device.HssType() == "HmIP-SRH")){
        if(dom.GetObject(index).DPByHssDP("STATE").Value() == 1){
          list = list#"\n- "#(device.Channel()).Name()#"<font color=orange> gekippt</font>.";
          stateList = stateList#"\t"#dom.GetObject(index).DPByHssDP("STATE").Value();
        }
      }
    }
    if(!exOpenList.Contains(device.Name())){
      if((device.HssType() == "HM-Sec-RHS") || (device.HssType() == "HmIP-SRH")){
        if(dom.GetObject(index).DPByHssDP("STATE").Value() == 2){
          list = list#"\n- "#(device.Channel()).Name()#"<font color=red> offen</font>.";
          stateList = stateList#"\t"#dom.GetObject(index).DPByHssDP("STATE").Value();
        }
      }
      if((device.HssType() == "HM-Sec-SC") || (device.HssType() == "HM-Sec-SC-2") || (device.HssType() == "HM-Sec-SCo") || (device.HssType() == "HMIP-SWDO") || (device.HssType() == "HmIPW-FIO6")){
        if((dom.GetObject(index).DPByHssDP("STATE").Value() == 1) || (dom.GetObject(index).DPByHssDP("STATE").Value() == true)){
          list = list#"\n- "#(device.Channel()).Name()#"<font color=red> offen</font>.";
          stateList = stateList#"\t2";
        }
      }
    }
  }
}

! +++++ Setzen der Priorität in Abhängigkeit vom Zustand der Fenster und Türen sowie der Schlüsselbegriffe +++++
if(stateList.Contains("2")){
  foreach(highPrioKeyword, highPrioKeywordsList){
    if(list.Contains(highPrioKeyword)){prio = 2; if(prio >= prioMax){prioMax = prio;}} 
    else{prio = 1; if(prio >= prioMax){prioMax = prio;}}
  }
}
else{prio = "0"; if(prio >= prioMax){prioMax = prio;}}
(dom.GetObject(ID_SYSTEM_VARIABLES).Get(svPushPrio)).State(prioMax);

! +++++ Erzeugen der Nachricht +++++
if(prio == 2){message = "<font color=red>Achtung, Fenster/Türen schließen!</font>";}
else{message = "<font color=orange>Achtung, Fenster/Türen schließen!</font>";}

if(list != ""){
  message = message#list;
  
  ! +++++ zPNP ausführen +++++
  (dom.GetObject(ID_SYSTEM_VARIABLES).Get(svPushText)).State(message);
  (dom.GetObject(ID_PROGRAMS).Get(zPNP)).ProgramExecute();
}
Hi Thorsten, ich habe noch eine ältere Version erfolgreich am Laufen. Ich wollte jetzt auf diese Version umstellen. Ich unterscheide bei mir die Gewerke "Türe" und "Fenster". Und hab diese nicht als "Verschluss" definiert. Meinst Du das Skript könntest Du anpassen, dass man mehrere Gewerke mit einem Trennzeichen einbinden könnte?
Natürlich könnte ich für jedes Gewerk ein eigenes Skript schreiben, würde dann aber mehrere PushNachrichten bekommen.

Danke vorab

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) V4.3

Beitrag von dtp » 09.11.2020, 09:55

Versuch's mal damit:

Code: Alles auswählen

! Meldung Fenster/Türen schließen
! Version 2.8, Autor: dtp

! Liste der Gewerke für die Türen- und Fenster-Sensoren (trennen mit "\t")
string tradesList = "Türe\tFenster";

! Listen geöffneter und gekippter Fenster und Türen, die nicht berücksichtigt werden sollen (trennen mit "\t")
string exTiltList = ""; ! gekippte Fenster und Türen
string exOpenList = ""; ! geöffnete Fenster und Türen

! Schlüsselbegriffe von Fenstern und Türen mit Priorität 2 (trennen mit "\t")
string highPrioKeywordsList = "";

! 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 +++++
var device;
string trade; string index; string list = ""; string stateList = ""; string message; string highPrioKeyword; 
integer prio; integer prioMax = -2;

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

! +++++ Auslesen der Fenster- und Türenzustände und Erzeugen einer Liste +++++
foreach(trade, tradesList){
  foreach(index, dom.GetObject(ID_FUNCTIONS).Get(trade).EnumUsedIDs()){
    if(dom.GetObject(index).IsTypeOf(OT_CHANNEL)){
      device = dom.GetObject(dom.GetObject(index).Device());
      if(!exTiltList.Contains(device.Name())){
        if((device.HssType() == "HM-Sec-RHS") || (device.HssType() == "HmIP-SRH")){
          if(dom.GetObject(index).DPByHssDP("STATE").Value() == 1){
            list = list#"\n- "#(device.Channel()).Name()#"<font color=orange> gekippt</font>.";
            stateList = stateList#"\t"#dom.GetObject(index).DPByHssDP("STATE").Value();
          }
        }
      }
      if(!exOpenList.Contains(device.Name())){
        if((device.HssType() == "HM-Sec-RHS") || (device.HssType() == "HmIP-SRH")){
          if(dom.GetObject(index).DPByHssDP("STATE").Value() == 2){
            list = list#"\n- "#(device.Channel()).Name()#"<font color=red> offen</font>.";
            stateList = stateList#"\t"#dom.GetObject(index).DPByHssDP("STATE").Value();
          }
        }
        if((device.HssType() == "HM-Sec-SC") || (device.HssType() == "HM-Sec-SC-2") || (device.HssType() == "HM-Sec-SCo") || (device.HssType() == "HMIP-SWDO") || (device.HssType() == "HmIPW-FIO6")){
          if((dom.GetObject(index).DPByHssDP("STATE").Value() == 1) || (dom.GetObject(index).DPByHssDP("STATE").Value() == true)){
            list = list#"\n- "#(device.Channel()).Name()#"<font color=red> offen</font>.";
            stateList = stateList#"\t2";
          }
        }
      }
    }
  }
}

! +++++ Setzen der Priorität in Abhängigkeit vom Zustand der Fenster und Türen sowie der Schlüsselbegriffe +++++
if(stateList.Contains("2")){
  foreach(highPrioKeyword, highPrioKeywordsList){
    if(list.Contains(highPrioKeyword)){prio = 2; if(prio >= prioMax){prioMax = prio;}} 
    else{prio = 1; if(prio >= prioMax){prioMax = prio;}}
  }
}
else{prio = "0"; if(prio >= prioMax){prioMax = prio;}}
(dom.GetObject(ID_SYSTEM_VARIABLES).Get(svPushPrio)).State(prioMax);

! +++++ Erzeugen der Nachricht +++++
if(prio == 2){message = "<font color=red>Achtung, Fenster/Türen schließen!</font>";}
else{message = "<font color=orange>Achtung, Fenster/Türen schließen!</font>";}

if(list != ""){
  message = message#list;
  
  ! +++++ zPNP ausführen +++++
  (dom.GetObject(ID_SYSTEM_VARIABLES).Get(svPushText)).State(message);
  (dom.GetObject(ID_PROGRAMS).Get(zPNP)).ProgramExecute();
}
Hoffe, es funktioniert.

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.

Shuo
Beiträge: 215
Registriert: 18.09.2014, 23:19
Danksagung erhalten: 6 Mal

Re: Howto - zentrales Push-Nachrichten-Programm (zPNP) V4.3

Beitrag von Shuo » 09.11.2020, 11:59

Danke Thorsten!

Außer den Gewerken muss ich doch nichts eintragen, oder?
Irgendwie tut das nicht.
Ich habe eingetragen:

Code: Alles auswählen

string tradesList = "Fensterkontakt\tTürkontakt";
Die Liste scheint leer zu sein, obwohl ich eine Menge HM-Sec-SC-2 und HM-Sec-SCo Kontakte habe.

Eine Idee?

Code: Alles auswählen

WriteLine(dom.GetObject(ID_FUNCTIONS).Get("Türkontakt").EnumUsedIDs());
WriteLine(dom.GetObject(ID_FUNCTIONS).Get("Fensterkontakt").EnumUsedIDs());
gibt alle IDs zurück...

Code: Alles auswählen

3418	3281	4875
3046	2991	5508	4679	5657	5712	1420	5453	4734	5398	5040	3474	4930	4985	5555	5602	4828	4781	5357	5361	5365
Was ich auch noch probiert habe, ist die Anzahl der offenen Fenster zu Zählen mit:

Code: Alles auswählen

var i = dom.GetObject("Fensterkontakt"); 
    string itemID;
    integer anzFenster = 0;
    foreach(itemID, i.EnumUsedIDs())
    {
        var item = dom.GetObject(itemID);
        if (item.DPByHssDP("STATE").Value()) { anzFenster = anzFenster + 1; }
    }
WriteLine(anzFenster);
Das scheint auch zu funktioneren......

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) V4.3

Beitrag von dtp » 09.11.2020, 13:22

Das Skript war ein kleiner Schnellschuss von mir. Ich muss mir das dann heute Abend noch mal im Detail ansehen. Aktuell bin ich aber etwas im Stress, so dass ich nichts versprechen kann.
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.

Shuo
Beiträge: 215
Registriert: 18.09.2014, 23:19
Danksagung erhalten: 6 Mal

Re: Howto - zentrales Push-Nachrichten-Programm (zPNP) V4.3

Beitrag von Shuo » 09.11.2020, 13:33

vielen Dank vorab Thorsten.

Ich weiß ja nicht ob Du damit was anfangen kannst, aber version Version 2.5.3 funktioniert bei mir einwandfrei (bis auf das Problem mit nur einem Gewerk). Version 2.7 und aufwärts tut schon nicht mehr....

Antworten

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