Howto - Regenmeldungen bei offenen Fenstern (per zPNP)

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

Moderator: Co-Administratoren

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

Howto - Regenmeldungen bei offenen Fenstern (per zPNP)

Beitrag von dtp » 26.07.2021, 18:22

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.
Zuletzt geändert von dtp am 06.09.2021, 13:21, insgesamt 2-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.

Elektrogeist
Beiträge: 3
Registriert: 26.09.2020, 13:50
System: CCU
Wohnort: Aix-la-Chapelle
Hat sich bedankt: 5 Mal
Danksagung erhalten: 1 Mal

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

Beitrag von Elektrogeist » 04.09.2021, 18:16

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.";}
        }

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

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

Beitrag von dtp » 05.09.2021, 14:07

Klar. Danke. Ich wollte das eh schon mal angepasst haben. Wir waren aber in den letzten zwei Wochen im Urlaub.
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: 10655
Registriert: 21.09.2012, 08:09
System: CCU
Wohnort: Stuttgart
Hat sich bedankt: 320 Mal
Danksagung erhalten: 501 Mal

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

Beitrag von dtp » 06.09.2021, 13:21

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

Benutzeravatar
Baxxy
Beiträge: 10648
Registriert: 18.12.2018, 15:45
System: Alternative CCU (auf Basis OCCU)
Hat sich bedankt: 597 Mal
Danksagung erhalten: 2180 Mal

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

Beitrag von Baxxy » 06.09.2021, 14:07

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

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

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

Beitrag von dtp » 08.09.2021, 13:54

Danke Baxxy, hast du ggf. auch die zugehörigen Datenpunkte mit den entsprechenden Werten für offen und geschlossen?
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.

Benutzeravatar
Baxxy
Beiträge: 10648
Registriert: 18.12.2018, 15:45
System: Alternative CCU (auf Basis OCCU)
Hat sich bedankt: 597 Mal
Danksagung erhalten: 2180 Mal

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

Beitrag von Baxxy » 08.09.2021, 17:03

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

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

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

Beitrag von dtp » 09.09.2021, 09:31

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.

Antworten

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