Warnung, wenn Fenster zu lange offen sind bzw. gelüftet wird

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

Moderator: Co-Administratoren

nibblersrevenge
Beiträge: 27
Registriert: 08.10.2014, 09:38

Warnung, wenn Fenster zu lange offen sind bzw. gelüftet wird

Beitrag von nibblersrevenge » 08.10.2014, 13:35

EDIT:
CLICK: Hier ist eine Schnellanleitung mit allen Scripten Schrit für Schritt





Das folgende Script schlägt auf dem Smartphone Alarm, wenn Fenster länger als z.B. 15 Minuten geöffnet ist.
Ich verwende dafür http://www.NotifyMyAndroid.com was bis zu 5 Nachrichten pro Tag kostenlos ist und für beliebig viele Nachrichten nur einmalig 3,88€ kostet.
Für die 3,88€ wird dann aber auch meine ganze Familie benachrichtigt, da die App mit einem Login auf beliebig vielen Androids parallel installiert werden kann.
Das Script kann sehr leicht auf andere Dienste wie Prowl(IOS) oder SMS-Benachrichtigung umgestellt werden, da als "Warnung" nur eine spezielle URL aufgerufen wird.

Das Script läuft bei mir 1 Mal pro Minute.
Es prüft dann, welche Fenster offen sind und speichert die Zeit in einer Systemvariablen.
Sollte ein Fenster länger als 900 Sekunden (15 Minuten) offen stehen, so wird eine Nachricht mit Fensternamen und Öffnungszeit abgesetzt.
Diese Nachricht kommt dann jede Minute, bis das Fenster geschlossen wird.

Notwendig sind nur ein paar wenige Einstellungen:
1. Favoritenliste, in der alle Fenster- und Drehgriffkontakte gespeichert werden. Bei mir : Fav_Fenster
2. Eine Systemvariable, in der die benötigten Infos gespeichert werden. Bei mir : OpenWindowArr
3. Eine Registrierung bei http://www.NotifyMyAndroid.com und dort einen neuen API-Key erstellen. Bei mir: ####Hier den API-Key von NotifyMyAndroid eingeben####
4. Die App NotifyMyAndroid muss natürlich auf dem Smartphone installiert werden :lol:

Wer möchte, kann die maximale Lüftungsdauer abhängig von der Außentemperatur machen.
Hierfür muss zusätzlich eine Systemvariable AussenTemperatur erstellt werden in der eine Zahl steht.
Siehe mein Beitrag: http://homematic-forum.de/forum/viewtop ... 93#p171893

Alle weiteren Einstellungen können erst mal übernommen werden und später beliebig angepasst werden.

Code: Alles auswählen

!--------------------------------------------------!
!--------Grundeinstellungen------------------------!
!--------------------------------------------------!
string FavoritenNameFensterkontakte ='Fav_Fenster';   ! Favoritenliste in der alle relevanten Fenster- und Drehgriffkontakte gespeichert werden
string SystemVariableFensterInfo    ='OpenWindowArr'; ! Systemvariable, in der gespeichert wird, wann welches Fenster geöffnet wurde

!--------------------------------------------------!
!---------NotifyMyAndroid Einstellungen------------!
!--------------------------------------------------!
string NotifyMyAndroidApiKey='####Hier den API-Key von NotifyMyAndroid eingeben####';   
integer NotifyMyAndroidMsgPriority=2;                             !Höchste Priorität = 2 Niedrigste Priorität = -2
string NotifyMyAndroidMsgApplication='FensterAlarm';              ! Einstellung erst mal so lassen und später ändern!                 
string NotifyMyAndroidMsgDescription='15Min_FensterTimeout';      ! Einstellung erst mal so lassen und später ändern!   


!--------------------------------------------------!
!---------Timeout Einstellungen--------------------!
!--------------------------------------------------!
integer maxSecondsOpenWindow        =900;             ! In Sekunden: Danach wird Alarm ausgelöst

!--- Wenn es eine SystemVariable AussenTemperatur gibt, Sekunden automatisch anpassen.
!--- Falls die SystemVariable AussenTemperatur nicht vorhanden ist, 
!--- gilt die oben definierte Zeit maxSecondsOpenWindow

var AussenTemperatur=dom.GetObject('AussenTemperatur');
if(AussenTemperatur.Count()){
    real Temperatur1=AussenTemperatur.Variable();
    if(Temperatur1>19){
        !---Bei mehr als 19Grad darf auch beliebig lange gelüftet werden!
        quit;
    }
    else{
        if(Temperatur1>15){ 
            !---Bei mehr als 15Grad darf 15 Minuten gelüftet werden!
            maxSecondsOpenWindow=900;
        }else{            
            if(Temperatur1>8){ 
                !---Bei mehr als 8Grad darf 10 Minuten gelüftet werden!
                maxSecondsOpenWindow=600;
            }else{
                !---Bei weniger als 8Grad darf nur 5 Minuten gelüftet werden!
                maxSecondsOpenWindow=300; 
            }
        }
    }
}
WriteLine(maxSecondsOpenWindow);


!---Die Möglichkeiten Infos zu speichern sind begrenzt. Deswegen benötigen 
!---wir 2 Trennzeichen, die nicht im Namen der Fensterkontakte vorkommen dürfen.
string SplitValue1='$';                               ! Max 1 Zeichen - Wird aus Namen des Fensterkontakts entfernt
string SplitValue2='%';                               ! Max 1 Zeichen - Wird aus Namen des Fensterkontakts entfernt

integer offeneFenster = 0; 
string newString='';
string itemID;
string item1;
string itemTMP='';
string OpenWindowWarnList='';

var myFavorites = dom.GetObject(FavoritenNameFensterkontakte);
var OpenWindowArr=dom.GetObject(SystemVariableFensterInfo);
var tNow=system.Date('%F %X').ToTime().ToInteger();




foreach(itemID, myFavorites .EnumUsedIDs()) {
    var item = dom.GetObject(itemID);
    if (item.IsTypeOf(OT_CHANNEL)) {
        var device = dom.GetObject(item.Device());
        ! HM-Sec-SC   Tuerfensterkontakte         
        ! HM-Sec-SC-2 Tuerfensterkontakte 2 - Offensichtlich gibt es jetzt eine Version mit -2
        ! HM-Sec-RHS  Fenster-Drehgriffsensoren         
        if ((device.HssType() == "HM-Sec-SC") ||   
            (device.HssType() == "HM-Sec-SC-2") ||
            (device.HssType() == "HM-Sec-RHS")) {
            
            boolean notFound=true;
            integer newTime=0;
            if(item.State() > 0){offeneFenster =offeneFenster +1;}
            foreach(item1,OpenWindowArr.Variable().Split(SplitValue2)){
                if(notFound){
                    if(item1.StrValueByIndex(SplitValue1,0)==itemID){

                        notFound=false;
                        if(item.State() > 0){                        
                            if( item1.StrValueByIndex(SplitValue1,1)=='0'){
                                newTime=tNow; 
                            }else {
                                newTime=item1.StrValueByIndex(SplitValue1,1).ToInteger();   
                                if((tNow - newTime) > maxSecondsOpenWindow){
                                    if(OpenWindowWarnList.Length()>0){OpenWindowWarnList= OpenWindowWarnList+SplitValue2;}
                                    
                                    string itemName='';
                                    string itemName1='';
                                    foreach(itemTMP,item.Name().Split(SplitValue1)){itemName1=itemName1+itemTMP;}
                                    foreach(itemTMP,itemName1.Split(SplitValue2)){itemName=itemName+itemTMP;}

                                    OpenWindowWarnList=OpenWindowWarnList+ itemID + SplitValue1 +(tNow - newTime).ToString()+ SplitValue1+ itemName;
                                }
                            }
                        }else{
                            newTime=0;
                        }
                    }
                }
            }
            if(newString.Length()>0){
                newString = newString + SplitValue2;
            }
            newString = newString + itemID + SplitValue1 + newTime;            
        }
    }
}

OpenWindowArr.Variable(newString);
!Wer möchte, kann die Liste der offenen Fenster in 
!einer Systemvariable speichern um sie evtl. anderweitig zu nutzen
dom.GetObject('OpenWindowWarnList').Variable(OpenWindowWarnList);



if(OpenWindowWarnList.Length()>0){   
    
    string msgEvent='';

    foreach(itemTMP,OpenWindowWarnList.Split(SplitValue2)){
        newTime=itemTMP.StrValueByIndex(SplitValue1,1).ToInteger(); 
        string xName=itemTMP.StrValueByIndex(SplitValue1,2); 
        msgEvent = msgEvent +  xName+ ' - ' + ((newTime/60).ToInteger()+1).ToString()+' Minuten;';
    }
    
    
    string urlEncodeEvent='';
    string urlEncodeEvent1='';
    foreach(itemTMP,msgEvent.Split(' ')){if (urlEncodeEvent1.Length()>0){urlEncodeEvent1=urlEncodeEvent1+'%20';}urlEncodeEvent1=urlEncodeEvent1+itemTMP;}
    foreach(itemTMP,urlEncodeEvent1.Split('&')){if (urlEncodeEvent.Length()>0){urlEncodeEvent=urlEncodeEvent+'%26';}urlEncodeEvent=urlEncodeEvent+itemTMP;}
   
    string urlEncodeDescription='';
    string urlEncodeDescription1='';
    foreach(itemTMP,NotifyMyAndroidMsgDescription.Split(' ')){if (urlEncodeDescription1.Length()>0){urlEncodeDescription1=urlEncodeDescription1+'%20';}urlEncodeDescription1=urlEncodeDescription1+itemTMP;}
    foreach(itemTMP,urlEncodeDescription1.Split('&')){if (urlEncodeDescription.Length()>0){urlEncodeDescription=urlEncodeDescription+'%26';}urlEncodeDescription=urlEncodeDescription+itemTMP;}
 
    string urlEncodeApplication='';
    string urlEncodeApplication1='';
    foreach(itemTMP,NotifyMyAndroidMsgApplication.Split(' ')){if (urlEncodeApplication1.Length()>0){urlEncodeApplication1=urlEncodeApplication1+'%20';}urlEncodeApplication1=urlEncodeApplication1+itemTMP;}
    foreach(itemTMP,urlEncodeApplication1.Split('&')){if (urlEncodeApplication.Length()>0){urlEncodeApplication=urlEncodeApplication+'%26';}urlEncodeApplication=urlEncodeApplication+itemTMP;}


    string url = 'http://www.notifymyandroid.com/publicapi/notify' + 
                       '?apikey=' + NotifyMyAndroidApiKey +
                       '&application='+ urlEncodeApplication +
                       '&event='+ urlEncodeEvent  + 
                       '&description=' + urlEncodeDescription+ 
                       '&priority=' + NotifyMyAndroidMsgPriority;

    string stderr;
    string stdout;

    system.Exec("wget -q -O - "#url, &stdout, &stderr);
}

Zuletzt geändert von nibblersrevenge am 10.12.2014, 09:14, insgesamt 2-mal geändert.

Benutzeravatar
Homie
Beiträge: 111
Registriert: 24.09.2012, 19:43

Re: Warnung, wenn Fenster zu lange offen sind bzw. gelüftet

Beitrag von Homie » 13.10.2014, 08:05

Schöne Umsetzung!

So etwas ähnlich schwebt mir auch vor. Ich glaube ich werde dein Script an meinen Bedarf anpassen.

Danke!
CCU2 steuert 90 Kanäle in 62 Geräten

nibblersrevenge
Beiträge: 27
Registriert: 08.10.2014, 09:38

Re: Warnung, wenn Fenster zu lange offen sind bzw. gelüftet

Beitrag von nibblersrevenge » 15.10.2014, 08:38

Homie hat geschrieben:Schöne Umsetzung!

So etwas ähnlich schwebt mir auch vor. Ich glaube ich werde dein Script an meinen Bedarf anpassen.

Danke!
Danke für die Blumen.
Das funktioniert so zwar ganz gut.
Ich bin jetzt aber dabei auf Warnung durch MP3 Funk-Türgong umzustellen und trenne auch die Benachrichtigung vom Rest.
So kann ich bei FensterAufZu die Liste aktualisieren und muss dann nur in einem anderen Alle60SekundenScript nachschauen was wie lange offen ist und welchge AussenTemperatur besteht.
Hat den Vorteil, dass ich in DashUI ebenfalls die Daten verwenden kann.

Hier Teil 1 wird ausgelöst bei Ereignis:
Bedingung wenn:
Geräteauswahl>Fensterkonakt1>Geschlossen>Bei Änderung auslösen
Oder
Geräteauswahl>Fensterkonakt2>Geschlossen>Bei Änderung auslösen
Oder
Geräteauswahl>Fensterkonakt3>Geschlossen>Bei Änderung auslösen
usw.

Code: Alles auswählen

!--------------------------------------------------!
!--------Grundeinstellungen------------------------!
!--------------------------------------------------!
string FavoritenNameFensterkontakte ='Fav_Fenster';   ! Favoritenliste in der alle relevanten Fenster- und Drehgriffkontakte gespeichert werden
string SystemVariableFensterInfo    ='OpenWindowArr2'; ! Systemvariable, in der gespeichert wird, wann welches Fenster geöffnet wurde
                                                                                    ! Eine Systemvariable OpenWindowWarnList wird u.a. für DashUI benötigt

!---Die Möglichkeiten Infos zu speichern sind begrenzt. Deswegen benötigen 
!---wir 2 Trennzeichen, die nicht im Namen der Fensterkontakte vorkommen dürfen.
string SplitValue1='$';                               ! Max 1 Zeichen - Wird aus Namen des Fensterkontakts entfernt
string SplitValue2='%';                               ! Max 1 Zeichen - Wird aus Namen des Fensterkontakts entfernt

integer offeneFenster = 0; 
string newString='';
string itemID;
string item1;
string itemTMP='';
string OpenWindowWarnList='';

var myFavorites = dom.GetObject(FavoritenNameFensterkontakte);
var OpenWindowArr2=dom.GetObject(SystemVariableFensterInfo);
var tNow=system.Date('%F %X').ToTime().ToInteger();
    



foreach(itemID, myFavorites .EnumUsedIDs()) {
    var item = dom.GetObject(itemID);
    if (item.IsTypeOf(OT_CHANNEL)) {
        var device = dom.GetObject(item.Device());
        ! HM-Sec-SC   Tuerfensterkontakte         
        ! HM-Sec-SC-2 Tuerfensterkontakte 2 - Offensichtlich gibt es jetzt eine Version mit -2
        ! HM-Sec-RHS  Fenster-Drehgriffsensoren         
        if ((device.HssType() == "HM-Sec-SC") ||   
            (device.HssType() == "HM-Sec-SC-2") ||
            (device.HssType() == "HM-Sec-RHS")) {
            string itemName='';
            string itemName1='';
            foreach(itemTMP,item.Name().Split(SplitValue1)){itemName1=itemName1+itemTMP;}
            foreach(itemTMP,itemName1.Split(SplitValue2)){itemName=itemName+itemTMP;}
            
            boolean notFound=true;
            integer newTime=0;
            if(item.State() > 0){offeneFenster =offeneFenster +1;}
            foreach(item1,OpenWindowArr2.Variable().Split(SplitValue2)){
                if(notFound){
                    if(item1.StrValueByIndex(SplitValue1,0)==itemID){
                        notFound=false;
                        if(item.State() > 0){                        
                            if( item1.StrValueByIndex(SplitValue1,1)=='0'){
                                newTime=tNow; 
                            }else {
                                newTime=item1.StrValueByIndex(SplitValue1,1).ToInteger();   
                            }
                        }else{
                            newTime=0;
                        }                        
                      !  if(newTime>0) {OpenWindowWarnList=OpenWindowWarnList+ itemName + ' ('+((tNow - newTime)/60).ToString() +' Minuten)<br/>';}
                    }
                }
            }
            if(newString.Length()>0){
                newString = newString + SplitValue2;
            }
            newString = newString + itemID + SplitValue1 + newTime.ToString()  +  SplitValue1 + itemName;            
          
        }
    }
}

OpenWindowArr2.Variable(newString);
dom.GetObject('OpenWindowWarnList').Variable(OpenWindowWarnList);

Benutzeravatar
Homie
Beiträge: 111
Registriert: 24.09.2012, 19:43

Re: Warnung, wenn Fenster zu lange offen sind bzw. gelüftet

Beitrag von Homie » 17.10.2014, 11:01

Auch nett.
Ich schreibe mit gerade ein Tool für mein Android Tablet um schicke Benachrichtigungen aufrufen zu lassen (als Overlay über bestehenden Apps inklusive Sprachausgabe usw.). Im Prinzip ähnlich wie der Home24 Mediaplayer, nur schicker.
Dein Script werde ich benutzen um eine entsprechende Warnung zu erzeugen...

Gesendet von meinem Nexus 10 mit Tapatalk
CCU2 steuert 90 Kanäle in 62 Geräten

Rhadamanthys
Beiträge: 22
Registriert: 26.11.2013, 22:18

Re: Warnung, wenn Fenster zu lange offen sind bzw. gelüftet

Beitrag von Rhadamanthys » 23.11.2014, 22:08

Kleiner Hinweis: das Setzen von Systemvariablen mit dp.Variable("Wert") funktioniert zwar, Zeitstempel und Protokoll werden aber nicht aktualisiert. Wer das braucht, verwendet besser dp.State("Wert")

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

Re: Warnung, wenn Fenster zu lange offen sind bzw. gelüftet

Beitrag von dtp » 25.11.2014, 10:10

Also ich würde mir ja für jedes meiner Fenster (ich habe mir überdies für jeden Raum eine Systemvariable definiert, die die Zustände mehrerer Fenster zu einem gemeinsamen Zustand zusammenfasst) einen CUxD-Timer einrichten, der nach einer Änderung des jeweiligen Fensterzustandes auf "offen" und ggf. auch auf "gekippt" gesetzt wird und dann nach Ablauf der voreingestellten Dauer über ein separates Programm eine Push-Nachricht triggert. Hätte aus meiner Sicht den Vorteil, dass man ein Programm nicht zyklisch alle ein bis zwei Minuten ausführen muss.

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.

Stimpy
Beiträge: 153
Registriert: 29.12.2012, 01:14

Re: Warnung, wenn Fenster zu lange offen sind bzw. gelüftet

Beitrag von Stimpy » 25.11.2014, 10:21

Wie hast du das gemacht?

nibblersrevenge
Beiträge: 27
Registriert: 08.10.2014, 09:38

Re: Warnung, wenn Fenster zu lange offen sind bzw. gelüftet

Beitrag von nibblersrevenge » 25.11.2014, 10:23

dtp hat geschrieben:Also ich würde mir ja für jedes meiner Fenster (ich habe mir überdies für jeden Raum eine Systemvariable definiert, die die Zustände mehrerer Fenster zu einem gemeinsamen Zustand zusammenfasst) einen CUxD-Timer einrichten, der nach einer Änderung des jeweiligen Fensterzustandes auf "offen" und ggf. auch auf "gekippt" gesetzt wird und dann nach Ablauf der voreingestellten Dauer über ein separates Programm eine Push-Nachricht triggert. Hätte aus meiner Sicht den Vorteil, dass man ein Programm nicht zyklisch alle ein bis zwei Minuten ausführen muss.
Hallo Thorsten,
viele Wege führen nach Rom.
Mit dem CUxD bin ich leider nicht vertraut und wie du Dich sicher erinnern kannst, ist die Zeit, die man am Anfang in Homematic reinsteckt extrem.
Warum nicht einmal die Minute ein Script ausführen?
Und wenn was funktioniert.... ;-)
Trotzdem bin ich gerne für Vorschläge offen!
Wie mach man das mit dem CUxD-Timer? und wie geht's dann weiter?

Grüße,
Chris

Benutzeravatar
Roland M.
Beiträge: 9787
Registriert: 08.12.2012, 15:53
System: CCU
Wohnort: Graz, Österreich
Hat sich bedankt: 252 Mal
Danksagung erhalten: 1374 Mal

Re: Warnung, wenn Fenster zu lange offen sind bzw. gelüftet

Beitrag von Roland M. » 25.11.2014, 11:03

Hallo!

Also ich hab diese Aufgabenstellung ohne Timer gelöst und verwende die Ist-Temperatur vom Heizungsregler.

Code: Alles auswählen

WENN Temperatur < 19° (Auslösen auf Änderung)
UND  Fenster offen (nur prüfen)
DANN Meldung...
Hat den Vorteil, daß in der Übergangszeit länger gelüftet werden kann, als in der wirklich kalten Jahreszeit, wo der Luftaustausch dann auch schneller erfolgt.

Und wenn der Heizungsregler 19°C meldet, ist es im Badezimmer ohnehin schon knackig frisch... Werde wohl einmal 19,5°C versuchen.


Roland
Zur leichteren Hilfestellung bitte unbedingt beachten:
  • Bezeichnung (HM-... bzw. HmIP-...) der betroffenen Geräte angeben (nicht Artikelnummer)
  • Kurzbeschreibung des Soll-Zustandes (Was soll erreicht werden?)
  • Kurzbeschreibung des Ist-Zustandes (Was funktioniert nicht?)
  • Fehlermeldungen genau abschreiben, besser noch...
  • Screenshots von Programmen, Geräteeinstellungen und Fehlermeldungen (direkt als jpg/png) einstellen!

-----------------------------------------------------------------------
1. CCU2 mit ~100 Geräten (in Umstellung auf RaspberryMatic-OVA auf Proxmox-Server)
2. CCU2 per VPN mit ~50 Geräten (geplant: RaspberryMatic auf Charly)
3. CCU2 per VPN mit ~40 Geräten (geplant: RaspberryMatic auf CCU3)
CCU1, Test-CCU2, Raspi 1 mit kleinem Funkmodul, RaspberryMatic als VM unter Proxmox, Access Point,...

nibblersrevenge
Beiträge: 27
Registriert: 08.10.2014, 09:38

Re: Warnung, wenn Fenster zu lange offen sind bzw. gelüftet

Beitrag von nibblersrevenge » 25.11.2014, 13:12

Hallo Roland,
mit dieser Logik läufst Du aber Gefahr, dass wenn der Heizkörper gerade offen war und sehr heiß ist, dass länger gelüftet werden kann wie wenn er eher kalt ist.
Er heizt ja dann die Umgebung noch etwas auf.
Bedeutet (ok-sehr einfach ausgedrückt), dass wenn viel geheizt wird kann auch viel gelüftet werden :-)

In meinem Script ist ja eine Koppelung an die Außentemperatur die ich mir für Berlin automatisch lade: http://homematic-forum.de/forum/viewtop ... 31&t=20599 .
In der Übergangszeit kann also auch länger gelüftet werden.

Chris

Antworten

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