Hi,
also, fangen wir ganz langsam und vorne an:
Auf deiner CCU2? läuft HPCL bzw. die ExecEngine, richtig? (Muss ja, hast ja die Version 3.19...)
Das ganze "Reboot-Geraffel" braucht es nur in der WebUI, wenn die CCU gerade neu startet, läuft noch kein HPCL, und wenn HPCL dann startet, und je nach dem, wie es konfiguriert ist, dann werden vielleicht auch alle Geräte durch die ExecEngine abgefragt, und dann kann es wirklich vorkommen, das Objekte, die auf Empfang oder Änderung getriggert sind, auslösen.
Toby hat das auch schon angesprochen, meine CCU2 lief schon 370 Tage am Stück durch, Neustarts mache ich normalerweise nur wegen Firmwareupdates, allerdings aktualisiere ich die Homeputer-Zusatzsoftware auf der Zentrale "manuell", dann geht es ohne Neustart der Zentrale.
Ich knalle Dir jetzt einfach mal "unkommentiert" mein Code für einen Drehgriff rein, der im Prinzip genau das macht, was Du willst (es ist aber auch noch ein Teil Rolladensteuerung mit drin), außer das die Heizperiodenprüfung fehlt. Wenn Du Englisch kannst, verstehst Du ihn, und kannst evtl. auch auf die deutschen Befehle kommen, Falls Du dich komplett verlierst, es geht bei "Warnung:" los..., mail. hat mit Email zu tun, syslog. ist mein Textlogger, m_SendPushover. hat mit dem Versenden von Pushover zu tun,
Code: Alles auswählen
//! ============================================================
//! OBJEKT DG_Fenster_Gaestezimmer
//! ============================================================
//! OBJEKT-TYP : Fenstergriff
//! BEZEICHNUNG : DG_Fenster_Gaestezimmer
//! STARTWERT :
//! ------------------------------------------------------------
//! AUSFÜHRUNGSINTERVALL : nein
//! AUSFÜHRUNG BEI EINGABE : nein
//! AUSFÜHRUNG BEI EMPFANG : ja
//! AUSFÜHRUNG BEI ÄNDERUNG : nein
//! ------------------------------------------------------------
//! KONF.:ALLV=0/MAV=3
//!
//! ============================================================
//! VARIABLENDEFINITIONEN
//! ============================================================
//! NAME TYP STARTWERT
//! ------------------------------------------------------------
//! strDelayed Zeichen
//! drgAlterStatus Fenstergriff
//! strSelfMove Zeichen
//! zeitTemp Zeit
//! lngTimedOut Zahl 0
//! zeitLastPing Zeit
//! zeitTimeOutStart Zeit
//! arrLastEvents Zeichen 0<<
//! zeitLastBatterie Zeit
//! strButtonPos Zeichen
//! strLocation Zeichen
//! strSide Zeichen
//! lngHygBeiOpen Zahl 0
//! sngTempBeiOpen Zahl 0,0
//! strPushDevices Zeichen
if RS_OG_Gaeste.lngDebug > 0 or comerror(RS_OG_Gaeste) then
// ins Syslog schreiben
syslog.optNoWrite := 1
syslog.strMessage := "DG_Fenster_Gaestezimmer alter Zustand -" +drgAlterStatus+"-, neuer Zustand -"+DG_Fenster_Gaestezimmer+"-"
syslog.strMessage := syslog.strMessage + ", Delayed -"+strDelayed+"-"
syslog.strMessage := syslog.strMessage + ", SelfMove -"+strSelfMove+"-"
syslog.strMessage := syslog.strMessage + ", RS_OG_Gaeste -"+RS_OG_Gaeste+"-"
syslog.strMessage := syslog.strMessage + ", vRS_OG_Gaeste.zeitWartetBis -"+vRS_OG_Gaeste.zeitWartetBis+"-"
syslog.strMessage := syslog.strMessage + ", RS_OG_Gaeste.strStatus -"+RS_OG_Gaeste.strStatus+"-"
syslog.strMessage := syslog.strMessage + ", RS_OG_Gaeste.lngInhibit -"+RS_OG_Gaeste.lngInhibit+"-"
call syslog
endif
// lngTimedOut wird auf 1 gesetzt, wenn eine Meldung des Sensors ausbleibt und dies vom System erkannt wird
// Dies wird normalerweise erst nach ca. 24h vom System erkannt
if lngTimedOut<>0 then
lngTimedOut := 0
// ins Syslog schreiben
syslog.strMessage := "DG_Fenster_Gaestezimmer wieder da nach " + stoppuhr(zeitLastPing) + ", letzte Meldung war am " + zeitLastPing
call syslog
// eMail versenden
mail.strSubject := "DG_Fenster_Gaestezimmer wieder da nach " + stoppuhr(zeitLastPing)
mail.strTo := settings.Email
mail.strMessage := "DG_Fenster_Gaestezimmer wieder da nach " + stoppuhr(zeitLastPing)
mail.strMessage := mail.strMessage + "<<Letzte Meldung war am: " + zeitLastPing
mail.strMessage := mail.strMessage + "<<TimeOut wurde erkannt: " + zeitTimeOutStart
mail.strMessage := mail.strMessage + "<<Letzter Status vor Timeout: " + drgAlterStatus
mail.strMessage := mail.strMessage + "<<Jetzt empfangener Status : " + DG_Fenster_Gaestezimmer
mail.strMessage := mail.strMessage + "<<"
mail.strMessage := mail.strMessage + "<<Delayed -"+strDelayed+"-"
mail.strMessage := mail.strMessage + "<<SelfMove -"+strSelfMove+"-"
mail.strMessage := mail.strMessage + "<<RS_OG_Gaeste -"+RS_OG_Gaeste+"-"
mail.strMessage := mail.strMessage + "<<vRS_OG_Gaeste.zeitWartetBis -"+vRS_OG_Gaeste.zeitWartetBis+"-"
mail.strMessage := mail.strMessage + "<<RS_OG_Gaeste.strStatus -"+RS_OG_Gaeste.strStatus+"-"
call mail
endif
startwatch zeitLastPing
if DG_Fenster_Gaestezimmer = drgAlterStatus then
return
endif
// Alten Wert speichern
drgAlterStatus:= DG_Fenster_Gaestezimmer
// homestatus-Display updaten, falls eine Button-Position vorgegeben wurde
if strButtonPos<>"" then
call dm_DG_Fenster_Gaestezimmer
endif
// Wenn der gekoppelte Rolladen gerade verfährt (Status Moving) gibt das undefinierte Zustände, nix machen!!!
// Problem:
// Fenster wurde morgens zum Lüften geöffnet während der Rolladen gerade beim Hochfahren ist, nach dem Schließen der Türe fährt der Rolladen herunter...
// Mögliche Zustände:
// 1. Rolladen öffnet automatisch, Türe war geschlossen und wird geöffnet gekippt
// 2. Rolladen öffnet automatisch, Türe ist nicht geschlossen. Bei Offen müsste Rollo eigentlich schon oben sein, bei gekippt wäre möglich
// 3. Rolladen schließt automatisch, Türe war geschlossen und wird geöffnet gekippt
// 4. Rolladen schließt automatisch, Türe war nicht geschlossen. Eigentlich nicht möglich, soll die Steuerung gerade verhindern!
if RS_OG_Gaeste.strStatus = "Moving" then
// springe an die Marke:
goto Warnung
endif
// ///////////////////////////////////////////////////
// Historie der letzten Änderungen im Array aufheben
// Element dem Array zufügen, vorne anhängen
fArrAddElementFirst.strSource := "DG_Fenster_Gaestezimmer"
fArrAddElementFirst.strDelimiter := "<<"
fArrAddElementFirst.strElemIn := DG_Fenster_Gaestezimmer.ct +" "+DG_Fenster_Gaestezimmer
fArrAddElementFirst.strArrayIn := arrLastEvents
// Funktion aufrufen
call fArrAddElementFirst
// Anzahl der Elemente im Array begrenzen
fArrLimitSizeTo.strSource := "DG_Fenster_Gaestezimmer"
fArrLimitSizeTo.strDelimiter := "<<"
fArrLimitSizeTo.lngMaxSize := 9
fArrLimitSizeTo.strArrayIn := fArrAddElementFirst.strArrayReturn
// Funktion aufrufen
call fArrLimitSizeTo
// neues Array abholen
arrLastEvents := fArrLimitSizeTo.strArrayReturn
if (DG_Fenster_Gaestezimmer = "verriegelt" or DG_Fenster_Gaestezimmer = "gekippt") and RS_OG_Gaeste.lngInhibit > 0 then
if RS_OG_Gaeste.lngDebug > 0 or comerror(RS_OG_Gaeste) then
// ins Syslog schreiben
Syslog.optNoWrite := 1
syslog.strMessage := "DG_Fenster_Gaestezimmer: Drehgriff ist "+DG_Fenster_Gaestezimmer+", INHIBIT bei RS_OG_Gaeste gesetzt, lösche INHIBIT"
call syslog
endif
RS_OG_Gaeste.lngInhibit := 2
m_InhibitRS_OG_Gaeste.uhrDelay := "00:00:05"
// Makro in die Ausführungsschlange stellen
run m_InhibitRS_OG_Gaeste
endif
if DG_Fenster_Gaestezimmer = "offen" and RS_OG_Gaeste.lngInhibit = 0 then
if RS_OG_Gaeste.lngDebug > 0 or comerror(RS_OG_Gaeste) then
// ins Syslog schreiben
Syslog.optNoWrite := 1
syslog.strMessage := "DG_Fenster_Gaestezimmer: Drehgriff ist "+DG_Fenster_Gaestezimmer+", INHIBIT bei RS_OG_Gaeste ist nicht gesetzt, setze INHIBIT"
call syslog
endif
RS_OG_Gaeste.lngInhibit := 3
m_InhibitRS_OG_Gaeste.uhrDelay := "00:00:05"
// Makro in die Ausführungsschlange stellen
run m_InhibitRS_OG_Gaeste
endif
// ///////////////////////////////////////////////////
// Verhinderte Rolladenbewegungen nachholen
startwatch zeitTemp
// Hysterese-Zeit ausrechnen, es macht keinen Sinn, denn Rolladen 5 Min vor der automatischen Öffnung runterzufahren, damit er dann wieder geöffnet wird
zeitTemp := zeitTemp + "0:30:00"
// Türe ist jetzt gekippt, nachdem eine automatische Rolladenbewegung verhindert wurde, Rolladen auf dreiviertel fahren
// Nur wenn Rolladenbetriebsart für Runter ist <> Aus!
if DG_Fenster_Gaestezimmer = "gekippt" and strDelayed <> "" and swRBRRS_OG_Gaeste<>"Aus" then
if vRS_OG_Gaeste.zeitWartetBis < zeitTemp then
if RS_OG_Gaeste.lngDebug > 0 or comerror(RS_OG_Gaeste) then
// ins Syslog schreiben
Syslog.optNoWrite := 1
syslog.strMessage := "DG_Fenster_Gaestezimmer hat Delayed -"+strDelayed+"- für RS_OG_Gaeste gesetzt, fahre jetzt den Rolladen nach dreiviertel"
call syslog
endif
RS_OG_Gaeste := "dreiviertel"
// Keine Änderung bei Selfmove oder Delayed
return
else
if RS_OG_Gaeste.lngDebug > 0 or comerror(RS_OG_Gaeste) then
// ins Syslog schreiben
Syslog.optNoWrite := 1
syslog.strMessage := "DG_Fenster_Gaestezimmer hat Delayed -"+strDelayed+"- für RS_OG_Gaeste gesetzt, mache aber nichts, zeitWartetBis ist "+vRS_OG_Gaeste.zeitWartetBis
call syslog
endif
strDelayed := ""
return
endif
endif
// Türe ist jetzt verriegelt, nachdem eine automatische Rolladenbewegung verhindert wurde, Rolladenbewegung nachholen
if DG_Fenster_Gaestezimmer = "verriegelt" and strDelayed <> "" and swRBRRS_OG_Gaeste<>"Aus" then
if vRS_OG_Gaeste.zeitWartetBis < zeitTemp then
if RS_OG_Gaeste.lngDebug > 0 or comerror(RS_OG_Gaeste) then
// ins Syslog schreiben
Syslog.optNoWrite := 1
syslog.strMessage := "DG_Fenster_Gaestezimmer hat Delayed für RS_OG_Gaeste gesetzt, fahre jetzt den Rolladen nach "+strDelayed
call syslog
endif
RS_OG_Gaeste := strDelayed
else
if RS_OG_Gaeste.lngDebug > 0 or comerror(RS_OG_Gaeste) then
// ins Syslog schreiben
Syslog.optNoWrite := 1
syslog.strMessage := "DG_Fenster_Gaestezimmer hat Delayed -"+strDelayed+"- für RS_OG_Gaeste gesetzt, mache aber nichts, zeitWartetBis ist "+vRS_OG_Gaeste.zeitWartetBis
call syslog
endif
endif
strDelayed := ""
strSelfMove := ""
// springe an die Marke:
goto Warnung
endif
// Ende Delayed-Fälle
// ///////////////////////////////////////////////////
// Spontane Rolladenbewegungen durch den Drehgriff
// Nur wenn Rolladenbetriebsart für Runter ist <> Aus!
if DG_Fenster_Gaestezimmer = "verriegelt" und strSelfMove <> "" und swRBRRS_OG_Gaeste <> "Aus" then
startwatch zeitTemp
if zeitTemp < vRS_OG_Gaeste.zeitWartetBis then
// Rolladen wartet auf eine Bewegung
// Hysterese-Zeit ausrechnen, es macht keinen Sinn, denn Rolladen 5 Min vor der automatischen Öffnung runterzufahren, damit er dann wieder geöffnet wird
zeitTemp := zeitTemp + "0:30:00"
if vRS_OG_Gaeste.zeitWartetBis < zeitTemp then
if RS_OG_Gaeste.lngDebug > 0 or comerror(RS_OG_Gaeste) then
// ins Syslog schreiben
Syslog.optNoWrite := 1
syslog.strMessage := "DG_Fenster_Gaestezimmer hat SelfMove für RS_OG_Gaeste gesetzt, fahre jetzt aber wegen Hysterese den Rolladen nicht, lösche SelfMove und Delayed!"
call syslog
endif
strDelayed := ""
strSelfMove := ""
// springe an die Marke:
goto Warnung
endif
endif
if RS_OG_Gaeste.lngDebug > 0 then
// ins Syslog schreiben
syslog.strMessage := "DG_Fenster_Gaestezimmer hat SelfMove für RS_OG_Gaeste gesetzt, fahre jetzt den Rolladen wieder nach "+strSelfMove
call syslog
endif
RS_OG_Gaeste := strSelfMove
strSelfMove := ""
// springe an die Marke:
goto Warnung
endif
if DG_Fenster_Gaestezimmer = "gekippt" und RS_OG_Gaeste = "oben" und strSelfMove = "unten" und swRBRRS_OG_Gaeste<>"Aus" then
// Sollte nur vorkommen, wenn Rollo vom Drehgriff hochfahren wurde und jetzt auf gekippt steht
if RS_OG_Gaeste.lngDebug > 0 or comerror(RS_OG_Gaeste) then
// ins Syslog schreiben
syslog.optNoWrite := 1
syslog.strMessage := "DG_Fenster_Gaestezimmer wurde gekippt, fahre jetzt RS_OG_Gaeste von oben nach dreiviertel"
call syslog
endif
RS_OG_Gaeste := "dreiviertel"
// SelfMove stehen lassen
// springe an die Marke:
goto Warnung
endif
if DG_Fenster_Gaestezimmer = "gekippt" und RS_OG_Gaeste = "unten" und swRBHRS_OG_Gaeste<>"Aus" then
if RS_OG_Gaeste.lngDebug > 0 or comerror(RS_OG_Gaeste) then
// ins Syslog schreiben
syslog.optNoWrite := 1
syslog.strMessage := "DG_Fenster_Gaestezimmer wurde gekippt, fahre jetzt RS_OG_Gaeste von unten nach dreiviertel"
call syslog
endif
strSelfMove := "unten"
RS_OG_Gaeste := "dreiviertel"
// springe an die Marke:
goto Warnung
endif
// Egal wie Selfmove/Delayed steht, wenn der Rollo auf dreiviertel steht und die Türe wird geöffnet, Rollo hoch!
// wenn DG_Fenster_Gaestezimmer = "offen" und RS_OG_Gaeste = "dreiviertel" und strSelfMove = "unten" then
if DG_Fenster_Gaestezimmer = "offen" und RS_OG_Gaeste = "dreiviertel" und swRBHRS_OG_Gaeste<>"Aus" then
if RS_OG_Gaeste.lngDebug > 0 or comerror(RS_OG_Gaeste) then
// ins Syslog schreiben
syslog.optNoWrite := 1
syslog.strMessage := "DG_Fenster_Gaestezimmer wurde geöffnet, fahre jetzt RS_OG_Gaeste von dreiviertel nach oben"
call syslog
endif
RS_OG_Gaeste := "oben"
// SelfMove/delayed stehen lassen
// springe an die Marke:
goto Warnung
endif
//wenn DG_Fenster_Gaestezimmer = "offen" und RS_OG_Gaeste = "unten" then
if DG_Fenster_Gaestezimmer = "offen" und RS_OG_Gaeste = "unten" und swRBHRS_OG_Gaeste<>"Aus" then
if RS_OG_Gaeste.lngDebug > 0 or comerror(RS_OG_Gaeste) then
// ins Syslog schreiben
syslog.optNoWrite := 1
syslog.strMessage := "DG_Fenster_Gaestezimmer wurde geöffnet, fahre jetzt RS_OG_Gaeste von unten nach oben"
call syslog
endif
strSelfMove := "unten"
RS_OG_Gaeste := "oben"
// springe an die Marke:
goto Warnung
endif
Warnung:
if DG_Fenster_Gaestezimmer = "offen" and strlen(strPushDevices)>1 then
// -> ist im Master-Makro... Warnung:
if TS_Norden <= 10 then
if stopwatch(zeitLastPing)<10 then
sngTempBeiOpen := WT_Gaestezimmer.Temperatur
lngHygBeiOpen := WT_Gaestezimmer.Luftfeuchtigkeit
endif
wait "00:10:00"
temp.lngVar1 := stopwatch(zeitLastPing)
temp.lngVar1 := temp.lngVar1 / 60
// Sprache auf einem HomeStatus-Display ausgeben
dm_Say.strDisplays := "3,5"
dm_Say.strText := "Fenster im Gästezimmer steht seit " + temp.lngVar1 + " Minuten offen. "
dm_Say.strText := dm_Say.strText + "Zeit, das Ding langsam wieder zu schließen. "
temp.strTemp := replace(TS_Norden,".",",")
dm_Say.strText := dm_Say.strText + "Im Norden sind es zur Zeit " + temp.strTemp + " Grad Aussentemperatur. "
temp.sngVar10 := sngTempBeiOpen - WT_Gaestezimmer.Temperatur
if temp.sngVar10 > 0 then
dm_Say.strText := dm_Say.strText + "Die Raumtemperatur ist um " + temp.sngVar10 + " Grad auf "+WT_Gaestezimmer.Temperatur+" Grad gesunken. "
else
if temp.sngVar10 < 0 then
temp.sngVar10 := temp.sngVar10 * -1
temp.strTemp := replace(temp.sngVar10,".",",")
dm_Say.strText := dm_Say.strText + "Die Raumtemperatur ist um " + temp.strTemp + " Grad auf "+replace(WT_Gaestezimmer.Temperatur,".",",")+" Grad gestiegen. "
endif
endif
temp.lngVar1 := lngHygBeiOpen - WT_Gaestezimmer.Luftfeuchtigkeit
if temp.lngVar1 > 0 then
dm_Say.strText := dm_Say.strText + "Die relative Luftfeuchtigkeit ist um " + temp.lngVar1 + " Prozent auf " + WT_Gaestezimmer.Luftfeuchtigkeit + " Prozent gesunken. "
else
if temp.lngVar1 > 0 then
temp.lngVar1 := temp.lngVar1 * -1
dm_Say.strText := dm_Say.strText + "Die relative Luftfeuchtigkeit ist um " + temp.lngVar1 + " Prozent auf " + WT_Gaestezimmer.Luftfeuchtigkeit + " Prozent gestiegen. "
endif
endif
// In die Ausführungswarteschlange stellen
run dm_Say
// Pushovernachricht versenden
m_SendPushover.strAppToken := const.AppTokenInfo
m_SendPushover.strUserToken := const.UserTokenCS
temp.lngVar1 := stopwatch(zeitLastPing)
temp.lngVar1 := temp.lngVar1 / 60
m_SendPushover.strTitle := "Fenster im Gästezimmer steht seit " + temp.lngVar1 + " Minuten offen."
m_SendPushover.strMessage := "Zeit, das Ding langsam wieder zu zumachen..."
temp.strTemp := replace(TS_Norden,".",",")
m_SendPushover.strMessage := m_SendPushover.strMessage + "<<Im Norden sind es zur Zeit " + temp.strTemp + " Grad Aussentemperatur..."
temp.sngVar10 := sngTempBeiOpen - WT_Gaestezimmer.Temperatur
if temp.sngVar10 > 0 then
m_SendPushover.strMessage := m_SendPushover.strMessage + "<<Die Raumtemperatur ist um " + replace(temp.sngVar10,".",",") + " Grad auf "+replace(WT_Gaestezimmer.Temperatur,".",",")+" Grad gesunken. "
else
if temp.sngVar10 < 0 then
temp.sngVar10 := temp.sngVar10 * -1
m_SendPushover.strMessage := m_SendPushover.strMessage + "<<Die Raumtemperatur ist um " + replace(temp.sngVar10,".",",") + " Grad auf "+replace(WT_Gaestezimmer.Temperatur,".",",")+" Grad gestiegen. "
endif
endif
temp.lngVar1 := lngHygBeiOpen - WT_Gaestezimmer.Luftfeuchtigkeit
if temp.lngVar1 > 0 then
m_SendPushover.strMessage := m_SendPushover.strMessage + "<<Die relative Luftfeuchtigkeit ist um " + temp.lngVar1 + " Prozent auf " + WT_Gaestezimmer.Luftfeuchtigkeit + " Prozent gesunken. "
else
if temp.lngVar1 > 0 then
temp.lngVar1 := temp.lngVar1 * -1
m_SendPushover.strMessage := m_SendPushover.strMessage + "<<Die relative Luftfeuchtigkeit ist um " + temp.lngVar1 + " Prozent auf " + WT_Gaestezimmer.Luftfeuchtigkeit + " Prozent gestiegen. "
endif
endif
if temp.lngVar1 > 30 or (TS_Norden <=0 and temp.lngVar1 > 15) then
m_SendPushover.lngPriority := 2
// Nur für Priority 2
m_SendPushover.lngExpire := 90
m_SendPushover.lngRetry := 30
// Sounds: bike, bugle (+), cashregister, classical, cosmic, falling, gamelan, incoming, intermission, magic, mechanical, pianobar, siren (+), spacealarm, tugboat (+)
// Long-Sound: alien, climb, persistent (++), echo, updown (++)
// Silent: none
m_SendPushover.strDevice := strPushDevices
m_SendPushover.strSound := "persistent"
else
m_SendPushover.lngPriority := 1
// Nur für Priority 2
// m_SendPushover.lngExpire := 900
// m_SendPushover.lngRetry := 30
// Sounds: bike, bugle (+), cashregister, classical, cosmic, falling, gamelan, incoming, intermission, magic, mechanical, pianobar, siren (+), spacealarm, tugboat (+)
// Long-Sound: alien, climb, persistent (++), echo, updown (++)
// Silent: none
m_SendPushover.strDevice := "galaxynexus"
m_SendPushover.strSound := "cashregister"
endif
call m_SendPushover
// springe an die Marke:
goto Warnung
else
// Falls es jetzt noch nicht zu kalt ist, vielleicht wird es das ja später noch...
wait "00:10:00"
goto Warnung
endif
endif
Ende:
Der Familienvater