Variable für Fenster, Tür etc. offen seit X Minuten

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

Moderator: Co-Administratoren

dirk79
Beiträge: 19
Registriert: 08.11.2012, 21:44
Wohnort: Pforzheim

Re: Variable für Fenster, Tür etc. offen seit X Minuten

Beitrag von dirk79 » 08.11.2013, 17:56

schwind1975 hat geschrieben:Hi Dirk,

Danke für Deine Rückmeldung.
Also ich stelle mir das folgendermaßen vor (siehe Bild [Fenster offen seit])

Gibt es etwa die Info, bzw. das Feld schon ?
Das wäre natürlich am Besten.
fenster offen.jpg
Du hast doch in der Spalte "Letzte Aktualisierung" einen Zeitstempel stehen. Meines Wissens ist das die letzte Statusänderung. Wenn das Fenster also offen ist steht dort, seit wann das Fenster offen ist. Wenn es zu ist, seit wann es geschlossen ist.

Gruß
Dirk

alchy
Beiträge: 10765
Registriert: 24.02.2011, 01:34
System: CCU
Hat sich bedankt: 65 Mal
Danksagung erhalten: 675 Mal

Re: Variable für Fenster, Tür etc. offen seit X Minuten

Beitrag von alchy » 08.11.2013, 20:01

dirk79 hat geschrieben: Du hast doch in der Spalte "Letzte Aktualisierung" einen Zeitstempel stehen. Meines Wissens ist das die letzte Statusänderung. Wenn das Fenster also offen ist steht dort, seit wann das Fenster offen ist. Wenn es zu ist, seit wann es geschlossen ist.

Gruß
Dirk
So ist es, und das ist auch der Wert den LastTimestamp() ausliest.
Hab ich mal in Tipps und Tricks gepostet.
Wenn Du stattdessen die Minuten angezeigt haben willst, schon mal auf der 1. Seite hier gelesen ?

oder du lässt das ein Script ausrechnen. Systemzeit - letztes Öffen = Dauer

Alchy

Blacklist................... almost full
Ignoranz ist die Summe aller Maßnahmen die man ergreift, um bestehende Tatsachen nicht sehen zu müssen.

© Sandra Pulsfort (*1974)

Lies bitte die Logik von WebUI Programmen und die Tipps und Tricks für Anfänger.

Wichtig auch CUxD ersetzt System.exec. Die HM Script Doku (Downloadart Skripte) hilft auch weiter.
Zum Testen von Scripten den >> HomeMatic Script Executor << von Anli benutzen.

schwind1975
Beiträge: 79
Registriert: 28.10.2013, 09:04

Re: Variable für Fenster, Tür etc. offen seit X Minuten

Beitrag von schwind1975 » 09.11.2013, 14:14

Hallo Zusammen,

nochmals vielen Dank für Eure Hilfe.
Ich habe dies nun mit einer Systemvariable und dem Last Timestamp gelöst.
Ich benötige die Variable, da ich diese Info NICHT über das WebGui, sondern über PocketHM Control sehen möchte.
(Ich habe im Flur ein "altes" Ipad als "zentralen Steuerrechner" umfunktioniert und da ist das HM Pocket Programm einfach genial).

Nochmals Danke an Alle.

tunecase
Beiträge: 27
Registriert: 31.10.2012, 09:23

Re: Variable für Fenster, Tür etc. offen seit X Minuten

Beitrag von tunecase » 13.12.2013, 11:53

dirk79 hat geschrieben:So, jetzt ist mein erstes, eigenes Script endlich fertig. Gibt es freiwillige/wahnsinnige zum testen? :D
Hi dirk79!

Dein Script ist eine super Ausgangslage! Ich habe es noch um Fenster-Sensoren erweitert, die Temperaturüberwachung per Flag deaktivierbar gemacht und den Mailversand über einen Drittanbieter implementiert...

Code: Alles auswählen

    !Achtung, das Script unterstützt nur einen HM-CC-TC pro Raum. Bei mehreren HM-CC-TC in einem Raum funktioniert das Script nicht einwandfrei
    !Erstellt von dirk79, erweitert von tunecase
    !Version vom 13.12.2013

    var myAssembly = dom.GetObject("Verschluß");          ! Name des Gewerks in dem die Fensterkontakte sind

    string textStart = "Das/Die ";                         ! Textbaustein: Anfang bei einem Fenster
    string textStartAlt = "Die Fenster und/oder Türen ";             ! Textbaustein: Anfang bei mehreren Fenstern
    string textSeparator = " und  ";                   ! Textbaustein: Verbindungswort bei mehreren Fenstern
    string textEnd = " Fenster/Tür ist offen";                ! Textbaustein: Ende bei einem Fenster
    string textEndAlt = " sind offen";                  ! Textbaustein: Ende bei mehreren Fenstern
    string textRemove = "HM-Sec-SC ";                  ! Zu entfernender Text am Beginn des Gerätenamens
    string textRemove2 = "HM-Sec-RHS ";                  ! Zu entfernender Text am Beginn des Gerätenamens

    integer tempWarn = 20;                           ! Temperatur, die im Raum unterschritten werden muss, dass eine Meldung ausgelöst wird
    integer tempWarnON = 1;	 		     ! Falls >0 wird die Temperatur überwacht, sonst nicht
    string timeWarn = "00:15";                       ! "hh:mm" (Std / Min immer zweistellig) Differenzzeit vom Fensteröffnen bis erinnert wird.

	string MailEmpfaenger = "me@you.com";
	string MailBetreff = "HomeMatic Fenster oder Tuer offen";
	string MailText;	

    !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    !!  Ab hier nichts mehr aendern  !!
    !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

    integer windowCount = 0;
    string textBody;
    string itemID;
    string roomTC_ID;
    integer textRemoveLength = textRemove.Length();
    integer textRemoveLength2 = textRemove2.Length();

    integer stunde = timeWarn.Substr(0, 2).ToInteger();
    integer minute = timeWarn.Substr(3, 2).ToInteger();
    integer timeWarnSec = (stunde * 3600) + (minute * 60);                                       
    time now = system.Date("%Y-%m-%d %H:%M:%S").ToTime();                                  ! Aktuelle Uhrzeit abfragen

    integer tempIST;                         ! Datenobjekt des TC für die Temperatur (Kanal 1)
    time window_timestamp;            ! Zeitstempel der Systemvariablen, die zuletzt geändert worden ist (Wert in Sekunden).
	
	integer maxdelta;

    if (dom.GetObject('Anwesenheit').State()) {      ! Prüfe auf Heizperiode und Anwesenheit

       foreach(itemID, myAssembly.EnumUsedIDs()) {
          var item = dom.GetObject(itemID);
                
          if (item.IsTypeOf(OT_CHANNEL)) {
             var device = dom.GetObject(item.Device());
      
             if ((device.HssType().Find("HM-Sec-SC") >= 0) || (device.HssType().Find("HM-Sec-RHS") >= 0)){
                
                if (item.State().ToInteger() >= 1){                                    ! Prüfe, ob das Fenster offen ist
                    var dpTimestamp = dom.GetObject("BidCos-RF." # device.Address() # ":1.STATE");
                    var chnTimestamp = dom.GetObject(dpTimestamp.Channel());
                    window_timestamp = dom.GetObject(chnTimestamp).LastTimestamp().ToTime();     ! Wann wurde das Fenster geöffnet?
                    ! WriteLine("Zeitpunkt des Oeffnens: " # window_timestamp.ToString());
                    integer delta = now.ToInteger() - window_timestamp.ToInteger();   ! Delta Fensteröffnung und Aktuelle Zeit
                    if (delta > maxdelta ) {
				 		maxdelta = delta;
				    }
				   
                    if (delta >= timeWarnSec) {                                       ! Prüfen ob das Fenster länger als Warnzeit geöffnet ist
                       var room = dom.GetObject(item).ChnRoom();                        ! Raum zum offenen Fenster abfragen
                       var roomTC = dom.GetObject(room);
                       
					   if (tempWarnON > 0) {	
							foreach(roomTC_ID, roomTC.EnumUsedIDs()) {                        ! Raumthermostate im Raum suchen und IST-Temperatur abfragen
								var itemTC = dom.GetObject(roomTC_ID);
							 
								if (itemTC.IsTypeOf(OT_CHANNEL)) {
									var deviceTC = dom.GetObject(itemTC.Device());
									
									if (deviceTC.HssType() == "HM-CC-TC") {
										var dp = dom.GetObject("BidCos-RF." # deviceTC.Address() # ":1.TEMPERATURE");
									}
								}
						}
                      
						tempIST = dp.State();
                      } 
					  
                      if ((tempWarnON==0) || (tempIST < tempWarn)) {       ! Text bauen, wenn die Raumtemperatur unter der Warntemperatur ist
                         string itemName = item.Name().ToString();
                         integer doRemove = itemName.Find(textRemove);
                      	 integer doRemove2 = itemName.Find(textRemove2);

                         if (doRemove >= 0) {
                            itemName = itemName.Substr(textRemoveLength, itemName.Length() - textRemoveLength);
                         }
                         if (doRemove2 >= 0) {
                            itemName = itemName.Substr(textRemoveLength2, itemName.Length() - textRemoveLength2);
                         }

                         if (windowCount > 0) {                              ! Prüfe ob schon ein offenes Fenster hinzugefügt wurde
                            textBody = textBody # textSeparator # "'" # itemName # "'";
                         } else {
                            textBody = "'" # itemName # "'";
                         }
                                  
                         windowCount = windowCount + 1;                        ! Addiere ein Fenster zum Zähler Achtung: Erst jetzt, da sonst das zählen nicht korrekt funktioniert
                      }
                   }
                }
             }
          }
       }
    }
       
    if (windowCount > 0){                                                   ! Wenn Fenster gezählt wurden, dann TTS senden

       if (windowCount == 1) {                                                ! In Abhängigkeit der gezählten Fenster den Text zusammensetzen
          string send=textStart # textBody # textEnd # ".";
       } else {
          string send=textStartAlt # textBody # textEndAlt # ".";
          }
		  
		integer maxdeltamin = maxdelta / 60;
		
		MailText = "Hallo!\r\n\r\n";
		MailText = MailText # send # "\r\n";	
		if (tempWarnON > 0) {
			MailText = MailText # "Die Temperatur im Raum unterschreitet jetzt " # tempWarn.ToString() # " Grad Celsius!\r\n";	
		}
		MailText = MailText # "\r\n";
		MailText = MailText # "Das laengste offene Fenster bzw. die laengste offene Tuer ist seit " # maxdeltamin.ToString() # " Minuten offen.\r\n";
		MailText = MailText # "Zeitpunkt: " # system.Date("%F %X") # "\r\n";
		
		!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
		!Mail versenden

		string stdout;
		string stderr;
		string teilstr;
		string sendmail = "";
		string sendbetreff = "";
		string mailto = "";

		foreach(teilstr, MailBetreff.Split(" ")) {
		sendbetreff = sendbetreff # "+" # teilstr;
		}
		foreach(teilstr, MailText.Split(" ")) {
		sendmail = sendmail # "+" # teilstr;
		}
		foreach(teilstr, MailEmpfaenger.Split(" ")) {
		mailto = mailto # "+" # teilstr;
		}
		system.Exec ("/bin/sh /etc/config/addons/mh/email.sh "# sendbetreff # " " # sendmail # " " # mailto, &stdout, &stderr);

		!ENDE Mail versenden
		!!!!!!!!!!!!!!!!!!!!!!!!!!!!!		
		
		!WriteLine(MailText);
    }
Beste Grüße
tunecase

blitzquick
Beiträge: 4
Registriert: 01.01.2014, 20:36

Re: Variable für Fenster, Tür etc. offen seit X Minuten

Beitrag von blitzquick » 01.01.2014, 20:46

Hallo Tunecase

Wo baue ich dieses Script ein?
Den ersten Eintrag von diesem Thread habe ich nachvollzogen und funktioniert.
Wie und wo muss ich nun Dein / Dirk's Script einsetzen.
Bleiben die beiden Programme?
Braucht es Systemvariablen?

Besten Dank für Deine Hinweise

Gruss blitzquick

olli79
Beiträge: 237
Registriert: 16.11.2013, 11:19
Hat sich bedankt: 13 Mal

Re: Variable für Fenster, Tür etc. offen seit X Minuten

Beitrag von olli79 » 21.01.2014, 11:32

Hatte den Beitrag nicht mehr gefunden, hier gehört es eigentlich rein:

Genau das versuche ich auch mit dem MP3 Gong zu programmieren, habe dazu drei Programme angelegt:

Das erste setzt eine Variable auf Null:

Bild

Das zweite prüft ob offen und setzt die Variable dann eine Minute Später +1
Bild

Das Script dazu sieht so aus:

Code: Alles auswählen

var fos = dom.GetObject("Garage.offen.seit"); 

if (dom.GetObject("Garage Neigungssensor").State() == true){
  fos.State(fos.Value() + 1);
}
Das dritte Programm sollte dann eigentliche auslösen:
Bild

Klappt nur leider so nicht, hat jemand eine Idee?
Auch nach X Jahren immer noch unwissend ;-)

DrTob
Beiträge: 3426
Registriert: 29.10.2010, 08:24
Danksagung erhalten: 5 Mal

Re: Variable für Fenster, Tür etc. offen seit X Minuten

Beitrag von DrTob » 21.01.2014, 13:12

Sieht auf den ersten Blick richtig aus (beim letzten Programm reicht "bei Änderung")
Was geht denn nicht?

olli79
Beiträge: 237
Registriert: 16.11.2013, 11:19
Hat sich bedankt: 13 Mal

Re: Variable für Fenster, Tür etc. offen seit X Minuten

Beitrag von olli79 » 21.01.2014, 13:17

Okay, hab ich übernommen. Er zählt nicht hoch und löst dementsprechend auch nicht aus.
Bei dem Script ist .....state()....richtig? Hatte dort auch schon state(auf) probiert. Blöd wenn man keine Ahnung hat :D

Danke
olli
Auch nach X Jahren immer noch unwissend ;-)

Benutzeravatar
Homoran
Beiträge: 8613
Registriert: 02.07.2013, 15:29
Wohnort: Köln
Danksagung erhalten: 4 Mal

Re: AW: Variable für Fenster, Tür etc. offen seit X Minuten

Beitrag von Homoran » 21.01.2014, 19:22

Wenn ich das richtig sehe, soll das zweite Programm hochzählen. Es wird auf Aktualisierung ausgelöst. Diese findet nur alle ca. 3 Minuten statt. Erst eine weitere Minute wird dann der Zähler hochgesetzt, und zwar um eine Minute. Die daraus redultierende Zahl kann unmöglich mit der Realität übereinstimmen.

Du brauchst ein Programm, dass in regelmässigen Abständen gestartet wird, dann den Status des Sensors überprüft, und anschliessend die Variable um den Wert des Intervalls hochzählt.

Gruß
Rainer

Gesendet von meinem GT-P1000 mit Tapatalk 2
Alle meine Hinweise sind auf eigene Gefahr umzusetzen. Immer einen Fachmann zu Rate ziehen!

DrTob
Beiträge: 3426
Registriert: 29.10.2010, 08:24
Danksagung erhalten: 5 Mal

Re: Variable für Fenster, Tür etc. offen seit X Minuten

Beitrag von DrTob » 21.01.2014, 20:23

Homoran hat geschrieben:Wenn ich das richtig sehe, soll das zweite Programm hochzählen. Es wird auf Aktualisierung ausgelöst. Diese findet nur alle ca. 3 Minuten statt. Erst eine weitere Minute wird dann der Zähler hochgesetzt, und zwar um eine Minute. Die daraus redultierende Zahl kann unmöglich mit der Realität übereinstimmen.

Du brauchst ein Programm, dass in regelmässigen Abständen gestartet wird, dann den Status des Sensors überprüft, und anschliessend die Variable um den Wert des Intervalls hochzählt.

Gruß
Rainer

Gesendet von meinem GT-P1000 mit Tapatalk 2
Wie kommst du zu der Annahme, das die Aktualisierung "nur ca. alle drei Minuten" stattfindet?

Antworten

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