Steuerung HM Thermostate nach Anwesenheit

Moderator: seppy

domjo75
Beiträge: 159
Registriert: 22. Jan 2019 11:10
Answers: 0

Steuerung HM Thermostate nach Anwesenheit

Beitrag von domjo75 »

Hallo,

ich möchte das Kinderzimmer meiner Tochter nur bei ihrer Anwesenheit heizen. Meine Kleine kommt alle 2 Wochenende und am darauffolgenden Mittwoch zu mir. Während ihrer Abwesenheit muss ja die Heizung nicht auf 21 Grad stehen, sondern kann auf 18 Grad runtergefahren werden.
Sobald sie zuhause ist, würde ich das Zimmer gerne Heizen.
Ich habe bereits versucht das mit dem Scheduler der CCU3 abzubilden. Scheinbar bin ich da aber zu blöd für. Die Default-Temperatur von 18 Grad wird irgendwie nicht überschrieben.
Ich habe so ein ähnliches Szenario mit meinem Büro. Immer wenn ich nicht im HomeOffice bin, setzt ich einen Eintrag in meinem Kalender und OH schaltet mein Thermostat auf Manuell 16 Grad. Nacht wird das Thermostat wieder auf AUTO gestellt und gut ist.
Das finde ich in dem Fall aber irgendwie unpraktisch.
Ich habe feste Zeiten, wann meine Tochter bei mir ist. Die könnte ich programmieren. Zusätzlich kann ich noch ihr Handy abfragen - Fritzbox MAC...

So richtig fällt mir nicht ein, wie ich das schön lösen kann. Vielleicht habt Ihr eine Idee?!

VG, Dominik

SRX
Beiträge: 58
Registriert: 15. Okt 2019 19:50
Answers: 0

Re: Steuerung HM Thermostate nach Anwesenheit

Beitrag von SRX »

Du hast die verschiedenen Ansätze bereits beschrieben.
Mobile ist so ein Ding, IPhones legen sich gerne mal schlafen, bzw. sind dann im Netz nicht erreichbar. Damit würde eine Lösung nicht sauber funktionieren.
Kalender ist sicher eine Möglichkeit, wenn er denn sauber gepflegt wird.
Ich gehe davon aus, dass Du das Thermostat bereits in OH integriert hast.
Dann benötigst Du nur noch eine Kalenderintegration
Aber initial kannst Du doch einen Schalter anlegen und bei "ON" die Temperatur auf die 21 Grad stellen. Das geht ja recht einfach.
Also über SET_POINT_TEMPERATURE
Im unten stehenden Beispiel gehe ich von einem Item Typ Switch "Tocheranwesend" und einem Item beim Channeltyp SET_POINT_TEMPERATURE "HMRadiatorTochter" aus

Beispiel:

Code: Alles auswählen

rule "Heizung Tochter"
when
 item Tochteranwesend changed
then
 if (Tochteranwesend .state == ON) {
  HMRadiatorTochter.sendCommand(21) 
  }
   if (Tochteranwesend .state == OFF) {
   HMRadiatorTochter.sendCommand(18)
   }
end

domjo75
Beiträge: 159
Registriert: 22. Jan 2019 11:10
Answers: 0

Re: Steuerung HM Thermostate nach Anwesenheit

Beitrag von domjo75 »

Hallo SRX,

das ist eigentlich eine sehr simple Umsetzung. Warum bin ich nicht darauf gekommen? Ich muss das mal ausprobieren. Ich glaube die HM-Thermostate überschreiben bei jedem Schaltvorgang die gesetzte Temperatur. Bei der Nachtabsenkung wäre das so gewünscht. Da sie ja immer über ein Wochenende bei mir ist, müsste ich im Prinzip den Schalter täglich bedienen.
Aber ich teste das mal... :D

SRX
Beiträge: 58
Registriert: 15. Okt 2019 19:50
Answers: 0

Re: Steuerung HM Thermostate nach Anwesenheit

Beitrag von SRX »

Ich kann momentan nicht sagen über welchen Channel von Automatik auf Manuell geschaltet werden kann. Damit würde die Nachabsenkung dann abgeschaltet Das müsste dann nur noch in die Regel mit rein

domjo75
Beiträge: 159
Registriert: 22. Jan 2019 11:10
Answers: 0

Re: Steuerung HM Thermostate nach Anwesenheit

Beitrag von domjo75 »

OK, das funktioniert schon mal.
Das setzen des AUTO bzw. MANU Modes ist relativ simple

KinderzimmerHeizung1_ManuMode.sendCommand(21)
KinderzimmerHeizung2_AutoMode.sendCommand(ON)

Im Prinzip ist das relevante Zeitfenster für den Heizbetrieb zwischen 9 - 17 Uhr
Ich habe das jetzt mal ganz stumpf so umgesetzt:

Code: Alles auswählen

rule "Klima - Kind SET MANU/AUTO"
when
	time cron "0 */15 * ? * *"
then
	if(minuteOfDay >= 9 * 60 && minuteOfDay <= 17 * 60) {
    		if(Amelie_AT_Home_Klima.state == ON) {
        		KinderzimmerHeizung1_ManuMode.sendCommand(21)
        		KinderzimmerHeizung2_ManuMode.sendCommand(21)
        		logInfo("KLIMA - Kind SET", "Amelie Heizungen auf 21°C")
   		}
    		else {
        		KinderzimmerHeizung1_AutoMode.sendCommand(ON)
        		KinderzimmerHeizung2_AutoMode.sendCommand(ON)
        		logInfo("KLIMA - Kind SET", "Amelie Heizungen auf AUTO")
        	}
	}
	if(minuteOfDay >= 17 * 60 && minuteOfDay <= 9 * 60) {
    		KinderzimmerHeizung1_AutoMode.sendCommand(ON)
    		KinderzimmerHeizung2_AutoMode.sendCommand(ON)
    		logInfo("KLIMA - Kind SET", "Amelie Heizungen auf AUTO")
	}

Benutzeravatar
udo1toni
Beiträge: 13985
Registriert: 11. Apr 2018 18:05
Answers: 222
Wohnort: Darmstadt

Re: Steuerung HM Thermostate nach Anwesenheit

Beitrag von udo1toni »

Und wo kommt der Ausdruck minuteOfDay her? So (also ohne noch weiteres Drumherum) funktioniert das nicht!
Außerdem ist die letzte Bedingung nie erfüllt. Eine Zahl kann nicht gleichzeitig größer 17*60 und kleiner 9*60 sein.

Eher so:

Code: Alles auswählen

rule "Klima - Kind SET MANU/AUTO"
when
    time cron "0 0/15 * * * ?"                                          // viertelstündlich
then
    var bSoll = true                                                    // Default Manuell
    if(Amelie_AT_Home_Klima.state != ON)                                // Kind abwesend
        bSoll = false                                                   // also Automatik
    if(now.getHour < 9)                                                 // vor 9 Uhr
        bSoll = false                                                   // also Automatik
    if(now.getHour > 17)                                                // nach 18 Uhr
        bSoll = false                                                   // also Automatik

    var bAuto = true                                                    // Default Automatik aktiv
    if(KinderzimmerHeizung1_AutoMode.state != ON)                       // falls inaktiv
        bAuto = false                                                   // Automatik inaktiv

    if(bSoll && bAuto) {                                                // soll Manu, aber Auto
        KinderzimmerHeizung1_ManuMode.sendCommand(21)
        KinderzimmerHeizung2_ManuMode.sendCommand(21)
        KinderzimmerHeizung1_AutoMode.postUpdate(OFF)                   // Merke Zustand
        logInfo("heating", "Setze Heizungen Amelie auf manuell 21°C")
    }
    if(!bSoll && !bAuto) {                                             // soll Auto, aber Manu
        KinderzimmerHeizung1_AutoMode.sendCommang(ON)
        KinderzimmerHeizung2_AutoMode.sendCommang(ON)
        logInfo("heating", "Setze Heizungen Amelie auf Automatik")
    } 
end
Die Rule definiert eine lokale Variable vom Typ Boolean (weil der zugewiesene Wert ein Boolean Wert ist) und legt den Wert zunächst auf true fest.
Ist der Anwesenheitsschalter nicht ON, so wird die Variable auf false geändert.
Ist es vor 9 Uhr, wird die Variable auf false geändert.
Ist es nach 18 Uhr, wird die Variable auf false geändert.
Weiterhin wird der aktuelle Zustand (Auto/Manuell) über eines der Items abgefragt und in einer weiteren lokalen Boolean Variablen gespeichert.

Nun prüft die Rule, ob beide Variablen den gleichen Zustand haben (nur dann muss etwas geschaltet werden).
Die zusätzliche Zeile

Code: Alles auswählen

        KinderzimmerHeizung1_AutoMode.postUpdate(OFF)                   // Merke Zustand
dient nur als Merker für den nächsten Durchlauf. Falls der Zustand des Items KinderzimmerHeizung1_AutoMode beim Schalten auf Manuell von selbst auf OFF wechselt, kann die Zeile auch entfallen.

Noch eine kurze Anmerkung zu log-Befehlen (hier logInfo()): Der erste anzugebende String ist Teil des Loggernamens. Er sollte weder Leerzeichen noch Sonderzeichen enthalten und möglichst kurz sein. Über diesen Namen kann das Loggerverhalten gezielt gesteuert werden. Es geht ausdrücklich keinesfalls darum, damit irgendwelche Nachrichten zu übermitteln, diese Angabe ist lediglich die Quelle der Nachricht. Der Loggertext (also die ausgegebene Meldung) ist der zweite String, der beliebig lang gestaltet werden kann. Es bietet sich natürlich an, sich auch hier auf das Wesentliche zu beschränken, um ein übersichtliches Log zu behalten.
Du könntest z.B. alle log-Einträge von Rules, welche mit der Heizung zu tun haben mit dem Logger "heating" versenden. Wenn Du die Meldungen nicht sehen möchtest, gehst Du in die Karaf Konsole und gibst dort den Befehl

Code: Alles auswählen

log:set WARN org.openhab.core.model.script.heating
ein, dann werden die logInfo() Meldungen unterdrückt. logWarn() und logError() kommen aber weiterhin durch. logDebug() wird nur ausgegeben, wenn man das log-Level entsprechend auf DEBUG anhebt. Das Default Log Level ist INFO, man kann es auch auf DEFAULT setzen, womit es dann wieder vom übergeordneten Level (org.openhab.core.model.script) geerbt wird.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

domjo75
Beiträge: 159
Registriert: 22. Jan 2019 11:10
Answers: 0

Re: Steuerung HM Thermostate nach Anwesenheit

Beitrag von domjo75 »

Der Udo hat recht. Ich habe die IF Bedingung >= 17 * 60 && <= 9 * 60 einfach nur von oben geklaut und umgedreht. Aber es muss natürlich ein ODER sein.
minuteOfDay ist eine Variable die ich definiert habe. Die ist nur hier nicht mit aufgeführt. Ich bin im Büro, da komme ich an meine .Rules nicht ran und muss mir das so zusammenbauen.
val minuteOfDay = now.toLocalTime.getHour * 60 + now.toLocalTime.getMinute

Ich stelle immer wieder fest, dass der Udo einen ganz anderen Stil hat sowas zu aufzubauen.
Danke für die Anregung :)

Benutzeravatar
udo1toni
Beiträge: 13985
Registriert: 11. Apr 2018 18:05
Answers: 222
Wohnort: Darmstadt

Re: Steuerung HM Thermostate nach Anwesenheit

Beitrag von udo1toni »

domjo75 hat geschrieben: 26. Jan 2024 15:27 minuteOfDay ist eine Variable die ich definiert habe.

Code: Alles auswählen

val minuteOfDay = now.toLocalTime.getHour * 60 + now.toLocalTime.getMinute
Die Frage ist, wo Du diese Konstante definiert hast,
Wenn das eine globale Konstante ist (außerhalb von Rules definiert) dann ist der Wert konstant (selbst wenn Du es als globale Variable definierst), denn der globale Wert wird exakt einmalig zugewiesen, wenn die Datei gelesen wird.
domjo75 hat geschrieben: 26. Jan 2024 15:27 Ich stelle immer wieder fest, dass der Udo einen ganz anderen Stil hat sowas zu aufzubauen.
Ja :) den Stil habe ich mir im Laufe der Jahre abgeguckt.
Der Punkt ist, ein Zugriff auf Status ist immer mit einer Unsicherheit verbunden, und zwar, weil sich der Status jederzeit ändern kann. Deshalb ist es immer gut, den Status nach Möglichkeit einmalig während eines Durchlaufs einzusammeln (wenn es sich nicht vermeiden lässt, darauf zuzugreifen). Hier könnte man natürlich auch darauf verzichten, um den Preis, dass man viertelstündlich Schaltbefehle ausführen lässt, die im Grunde unnötig sind.
Eigentlich könnte man auch die Trigger anders gestalten:

Code: Alles auswählen

when
    Time cron "0 0 9,18 * * ?" or                   // Zeitpunkte an denen automatisch geschaltet wird
    Item KinderzimmerHeizung1_AutoMode changed      // Schalter wurde betätigt
then
Das spart dann noch mal etwas Rechenzeit.
Außerdem ist es "guter Stil" ;) die Teilaufgaben möglichst simpel zu gestalten. Hier geht es um einen Schaltbefehl, der von zwei Größen abhängt, das kann man mit einer länglichen Verknüpfung über mehrere Bedingungen erledigen, oder halt "einfach" :)
Selbst ohne die Dokumentation ist der Code so simpel, dass man nach kurzem Überlegen erfassen kann, was sich der Ersteller dabei gedacht hat :) das sollte immer ein Ziel bei der Programmierung sein (und trotzdem dokumentieren...)
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

SRX
Beiträge: 58
Registriert: 15. Okt 2019 19:50
Answers: 0

Re: Steuerung HM Thermostate nach Anwesenheit

Beitrag von SRX »

Alternativer Vorschlag
Warum hinterlegst Du nicht einen zweiten Wochenplan in der Homematic Zentrale für dieses Thermostat
Dann musst Du nur per Rule den Wochenplan umstellen
Der Kanal wäre channelTypeUID: homematic:HmIP-eTRV-2_1_ACTIVE_PROFILE

Damit hast Du auch das Problem mit der Nachtabsenkung erledigt

domjo75
Beiträge: 159
Registriert: 22. Jan 2019 11:10
Answers: 0

Re: Steuerung HM Thermostate nach Anwesenheit

Beitrag von domjo75 »

Hallo SRX,
Das war mein erster Ansatz. Da kam ich aber nicht weiter.
Wenn Du mir das erklären kannst, wäre das super.
😌

Antworten