Seite 1 von 1

Howto - Regenmeldungen bei offenen Fenstern (per zPNP)

Verfasst: 26.07.2021, 18:22
von dtp
Hi,

insbesondere, wenn man Parkett- oder Teppichboden hat, sollte man Fenster bei Regen besser schließen, um Schäden zu vermeiden. ich habe mir mal ein kleines Skript für Meldungen bei Regen und offenen Fenstern geschrieben, das auf meinen HmIP-Wettersensor reagiert. Das Skript wird mit folgendem Programm ausgelöst und nutzt das zPNP zum Senden von Push-Nachrichten:
2021-07-26_18h08_46.png
Sprich, sobald es bei einer bestimmten Windgeschwindigkeit anfängt zu regnen und mindestens eines bzw. eine der aufgeführten Fenster bzw. Türen gekippt oder geöffnet ist, wird das Programm getriggert und löst das nachfolgende Skript aus.

Code: Alles auswählen

! Meldung Fenster/Türen schließen bei Regen
! Version 3.2, Autor: dtp

! +++++ Auslöseschwellen +++++
real rainVolMin = 0.3; ! Mindestregenmenge in mm
real heavyRainVolMin = 1.2; ! Mindestregenmenge in mm bei Starkregen (unabhängig vom Wind)
real windSpeedMin = 10.0; ! Mindestwindgeschwindigkeit in km/h

! +++++ Berücksichtigung von Rollläden +++++
string blindsIndicator = "Rollladen"; ! Charakteristische Bezeichnung der Beschattungsgeräte (" " für keine)
integer blindValueMax = 30; ! erlaubte Maximalbehanghöhe in % zur Verhinderung einer Auslösung

! +++++ Liste der zu berücksichtigenden Räume je nach Himmelsrichtung (Zeilen mit "\t" trennen; Räume mit " | " trennen) +++++
! 1. Zeile: Nordost, Ost, Südost (22.5° bis 157.5°)
! 2. Zeile: Südost, Süd, Südwest (112.5° bis 247.5°)
! 3. Zeile: Südwest, West, Nordwest (202.5° bis 337.5°)
! 4. Zeile: Nordwest, Nord, Nordost (292.5° bis 67.5°)
string roomsList = "\t
                    DG Schlafzimmer | OG Zimmer Lina | OG Büro | EG Wohnzimmer | UG Büro/Gästezimmer\t
                    OG Zimmer Lina\t
                    DG Bad | OG Zimmer Jona | OG Bad | EG Küche | EG Gäste-WC | UG Keller";

! +++++ Datenkanal des Wettersensors +++++
string channel = "DG Dach Wettersensor Daten";

! +++++ Verschluss-Gewerk +++++
string trade = "Verschluss";

! +++++ 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; string roomsListWind; string room; string sound; string fontColor;
string closureName; string blindChannelsList; string blindChannel; string blindName;
object closure;
integer prio;
real rainVol; real windSpeed; real windDir; real blindValueActual;

! +++++ Aktuelle Regenmenge berechnen sowie Windgeschwindigkeit und -richtung auslesen +++++
rainVol = (dom.GetObject(ID_CHANNELS).Get(channel)).DPByHssDP("RAIN_COUNTER").Value() - (dom.GetObject(ID_CHANNELS).Get(channel)).DPByHssDP("RAIN_COUNTER").LastValue();
windSpeed = (dom.GetObject(ID_CHANNELS).Get(channel)).DPByHssDP("WIND_SPEED").Value();
if((dom.GetObject(ID_CHANNELS).Get(channel)).DPByHssDP("WIND_DIR")){
  windDir = (dom.GetObject(ID_CHANNELS).Get(channel)).DPByHssDP("WIND_DIR").Value();
}
elseif((dom.GetObject(ID_CHANNELS).Get(channel)).DPByHssDP("WIND_DIRECTION")){
  windDir = (dom.GetObject(ID_CHANNELS).Get(channel)).DPByHssDP("WIND_DIRECTION").Value();
}

! ----- Liste der zu berücksichtigenden Räume je nach Windrichtung -----
if((windDir > 337.5) || (windDir <= 67.5)){
  roomsListWind = roomsList.StrValueByIndex("\t", 3);
  if((windDir > 22.5) && (windDir <= 67.5)){roomsListWind = roomsListWind#" | "#roomsList.StrValueByIndex("\t", 0);}
}
elseif((windDir > 67.5) && (windDir <= 157.5)){
  roomsListWind = roomsList.StrValueByIndex("\t", 0);
  if(windDir > 112.5){roomsListWind = roomsListWind#" | "#roomsList.StrValueByIndex("\t", 1);}
}
elseif((windDir > 157.5) && (windDir <= 247.5)){
  roomsListWind = roomsList.StrValueByIndex("\t", 1);
  if(windDir > 202.5){roomsListWind = roomsListWind#" | "#roomsList.StrValueByIndex("\t", 2);}
}
elseif((windDir > 247.5) && (windDir <= 337.5)){
  roomsListWind = roomsList.StrValueByIndex("\t", 2);
  if(windDir > 292.5){roomsListWind = roomsListWind#" | "#roomsList.StrValueByIndex("\t", 3);}
}

! ----- Umwandlung der Windrichtung in Himmelsrichtung -----
if((windDir < 22.5) || (windDir >= 337.5)){windDir = "Nord";}
elseif(windDir < 67.5){windDir = "Nordost";}
elseif(windDir < 112.5){windDir = "Ost";}
elseif(windDir < 157.5){windDir = "Südost";}
elseif(windDir < 202.5){windDir = "Süd";}
elseif(windDir < 247.5){windDir = "Südwest";}
elseif(windDir < 292.5){windDir = "West";}
elseif(windDir < 337.5){windDir = "Nordwest";}

! ----- Maximal erlaubte Beschattungshöhe begrenzen -----
if(blindValueMax > 100){blindValueMax = 100;}
elseif(blindValueMax < 0){blindValueMax = 0;}

! +++++ Auslesen der Fenster- und Türenzustände und Erzeugen einer Liste +++++
if(rainVol >= rainVolMin){
  foreach(index, dom.GetObject(ID_FUNCTIONS).Get(trade).EnumUsedIDs()){
    if(dom.GetObject(index).IsTypeOf(OT_CHANNEL)){
      closure = dom.GetObject(dom.GetObject(index).Device());
      closureName = closure.Name();

      ! ----- Abfragen der Behanghöhe etwaig vorhandener Beschattungsgeräte -----
      if(blindsIndicator){
        if(closureName.Contains("Fenster")){blindName = closureName.Replace("Fenster", blindsIndicator#" Fenster");}
        elseif(closureName.Contains("Terrassentür")){blindName = closureName.Replace("Terrassentür", blindsIndicator#" Terrassentür");}
        if(dom.GetObject(ID_DEVICES).Get(blindName)){
          blindChannelsList = (dom.GetObject(ID_DEVICES).Get(blindName)).Channels().EnumUsedNames();
          foreach(blindChannel, blindChannelsList){
            if((dom.GetObject(ID_CHANNELS).Get(blindChannel)).DPByHssDP("LEVEL")){
              blindValueActual = (dom.GetObject(ID_CHANNELS).Get(blindChannel)).DPByHssDP("LEVEL").Value();
              break;
            }
          }
        }
        else{blindName = "";}
      }
      else{blindValueActual = 1.0;}

      if(rainVol >= heavyRainVolMin){
        prio = 2; fontColor = "red"; sound = "siren";
        if((closure.HssType() == "HM-Sec-RHS") || (closure.HssType() == "HmIP-SRH")){
          if(dom.GetObject(index).DPByHssDP("STATE").Value() == 2){list = list#"\n- "#closureName#" offen.";}
          elseif(dom.GetObject(index).DPByHssDP("STATE").Value() == 1){list = list#"\n- "#closureName#" gekippt.";}
        }
	      elseif((closure.HssType() == "HM-Sec-SC") || (closure.HssType() == "HM-Sec-SC-2") || (closure.HssType() == "HM-Sec-SCo") || (closure.HssType() == "HMIP-SWDO")){
          if((dom.GetObject(index).DPByHssDP("STATE").Value() == 1) || (dom.GetObject(index).DPByHssDP("STATE").Value() == true)){
            list = list#"\n- "#closureName#" offen.";
          }
        }
        elseif(closure.HssType() == "HmIPW-FIO6"){
          if(dom.GetObject(index).DPByHssDP("STATE").Value() == true){
		        list = list#"\n- "#closureName#" offen.";
          }
        }
      }
      elseif((windSpeed >= windSpeedMin) && ((100.0 * blindValueActual).ToInteger() > blindValueMax)){
        prio = 1; fontColor = "orange"; sound = "alien";
        if(((closure.HssType() == "HM-Sec-RHS")) || (closure.HssType() == "HmIP-SRH")){
          if(dom.GetObject(index).DPByHssDP("STATE").Value() == 2){
            foreach(room, roomsListWind.Replace(" | ", "\t").Trim()){
              if(closureName.Contains(room)){
                if(blindName){list = list#"\n- "#closureName#" offen (Rollladen auf "#(100.0*blindValueActual).ToInteger()#" %).";}
                else{list = list#"\n- "#closureName#" offen.";}
              }
            }
          }
        }
        elseif((closure.HssType() == "HM-Sec-SC") || (closure.HssType() == "HM-Sec-SC-2") || (closure.HssType() == "HM-Sec-SCo") || (closure.HssType() == "HMIP-SWDO")){
          if((dom.GetObject(index).DPByHssDP("STATE").Value() == 1) || (dom.GetObject(index).DPByHssDP("STATE").Value() == true)){
            foreach(room, roomsListWind.Replace(" | ", "\t").Trim()){
              if(closureName.Contains(room)){
                if(blindName){list = list#"\n- "#closureName#" offen (Rollladen auf "#(100.0*blindValueActual).ToInteger()#" %).";}
                else{list = list#"\n- "#closureName#" offen.";}
              }
            }
          }
        }
        elseif(closure.HssType() == "HmIPW-FIO6"){
          if(dom.GetObject(index).DPByHssDP("STATE").Value() == true){
            foreach(room, roomsListWind.Replace(" | ", "\t").Trim()){
              if(closureName.Contains(room)){
                if(blindName){list = list#"\n- "#closureName#" offen (Rollladen auf "#(100.0*blindValueActual).ToInteger()#" %).";}
                else{list = list#"\n- "#closureName#" offen.";}
              }
            }
          }
        }
      }
    }
  }

  ! +++++ Erzeugen der Nachricht +++++
  if(list != ""){
    message = "<font color="#fontColor#">Achtung, "#rainVol.ToString(1)#" mm Regen bei "#windSpeed.ToString(0)#" km/h Wind aus Richtung "#windDir#". Fenster/Türen schließen!</font>";
    message = message#list;

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

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

    ! ----- zPNP ausführen -----
    (dom.GetObject(ID_SYSTEM_VARIABLES).Get(svPushText)).State(message);
    (dom.GetObject(ID_PROGRAMS).Get(zPNP)).ProgramExecute();
  }
}
In dem Skript wird zusätzlich noch die Windrichtung abgefragt, so dass nur diejenigen Fenster gemeldet werden, die bei Wind mit der eingestellten Mindestwindgeschwindigkeit ("windSpeedMin") und Regen mit der eingestellten Mindestregenmenge ("rainVolMin") aus der entsprechenden Windrichtung geöffnet sind. Zudem werden noch die Rollläden vor den Fenstern abgefragt, so dass auch nur die Fenster gemeldet werden, deren Rollläden oberhalb der zulässigen Maximalbehanghöhe ("blindValueMax") hochgefahren sind.

Bei Starkregen ("heavyRainVolMin") werden Windgeschwindigkeit und Windrichtung ignoriert und sowohl geöffnete als auch gekippte Fenster gemeldet.

Eine entsprechende Meldung über das zPNP sieht dann so aus:
2021-07-25 15-10-43.png
Aktuell ist das Skript noch auf die Fenstergriffsensoren begrenzt. Muss ich bei Zeiten mal ändern. Allerdings nutzen wir keine anderen Fenstersensoren. ;)

Auch werde ich wohl noch implementieren, dass ab einer bestimmten Windgeschwindigkeit gekippte Fenster gemeldet werden, wenn ein Rollladen davor über einer zweiten Maximalbehanghöhe steht.

Re: Howto - Regenmeldungen bei offenen Fenstern (per zPNP)

Verfasst: 04.09.2021, 18:16
von Elektrogeist
Ich hoffe ich darf das hier reinschreiben?

Durch folgende Änderung im Script funktioniert das Ganze mit den HM-Sec-SCo, da ich keine HmIP-SRH besitze habe ich sie kurzerhand auskommentiert.

Code: Alles auswählen

!      if(closure.HssType() == "HmIP-SRH"){
!        if(rainVol >= heavyRainVolMin){
!          prio = 2; fontColor = "red"; sound = "siren";
!          if(dom.GetObject(index).DPByHssDP("STATE").Value() == 2){list = list#"\n- "#closureName#" offen.";}
!          elseif(dom.GetObject(index).DPByHssDP("STATE").Value() == 1){list = list#"\n- "#closureName#" gekippt.";}
!        }
      if(closure.HssType() == "HM-Sec-SCo"){
        if(rainVol >= heavyRainVolMin){
          prio = 2; fontColor = "red"; sound = "siren";
          if(dom.GetObject(index).DPByHssDP("STATE").Value() == 2){list = list#"\n- "#closureName#" offen.";}
        }

Re: Howto - Regenmeldungen bei offenen Fenstern (per zPNP)

Verfasst: 05.09.2021, 14:07
von dtp
Klar. Danke. Ich wollte das eh schon mal angepasst haben. Wir waren aber in den letzten zwei Wochen im Urlaub.

Re: Howto - Regenmeldungen bei offenen Fenstern (per zPNP)

Verfasst: 06.09.2021, 13:21
von dtp
So,

hab jetzt mal Version 3.2 hochgeladen, die die folgenden Sensoren berücksichtigt:

HM-Sec-RHS, HmIP-SRH. HM-Sec-SC, HM-Sec-SC-2, HM-Sec-SCo, HMIP-SWDO, HmIPW-FIO6.

Beim HmIPW-FIO6 wird aber vermutlich nur der Name des Gesamtsensors angezeigt.

Re: Howto - Regenmeldungen bei offenen Fenstern (per zPNP)

Verfasst: 06.09.2021, 14:07
von Baxxy
dtp hat geschrieben:
06.09.2021, 13:21
die folgenden Sensoren berücksichtigt
Ich hätte da noch 2 im Angebot... :wink:
  • HmIP-SWDM-B2 (Lidl Version vom SWDM)
  • HmIP-SWDO-I
Grüße
Baxxy

Re: Howto - Regenmeldungen bei offenen Fenstern (per zPNP)

Verfasst: 08.09.2021, 13:54
von dtp
Danke Baxxy, hast du ggf. auch die zugehörigen Datenpunkte mit den entsprechenden Werten für offen und geschlossen?

Re: Howto - Regenmeldungen bei offenen Fenstern (per zPNP)

Verfasst: 08.09.2021, 17:03
von Baxxy
Hi,
die beiden sind quasi identisch zum normalen SWDO.
Also Datenpunkt "STATE" in Kanal:1 mit den (default-)Werten 0 = geschlossen / 1 = offen.

Grüße
Baxxy

Re: Howto - Regenmeldungen bei offenen Fenstern (per zPNP)

Verfasst: 09.09.2021, 09:31
von dtp
Danke.