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:
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();
}
}
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:
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.