Zeitschalt Rule aber wie ?

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Benutzeravatar
PeterA
Beiträge: 1106
Answers: 13
Registriert: 8. Feb 2019 12:12

Zeitschalt Rule aber wie ?

Beitrag von PeterA »

Hallo zusammen,
nachdem, mit der tollen Unterstützung hier von Euch, meine Berechnungs und Luefter Rules wunderbar funktionieren
geht es an die nächste Rule mit der dann die Steuerung unserer Lüftungsanlage komplett über den OpenHab laufen kann!

Es gibt noch eine Zeitschaltuhr Funktion in der Anlage. Hier kann ich, wenn ich das denn möchte, ein komplexes Wochenprogramm mit mehreren Schaltzeiten pro Tag fahren. Was ich aber so komplex nicht nutze.
Im Grunde betreibe ich die Lüftung so:
In der kalten Jahreszeit von 06.00Uhr bis 23.30Uhr auf der kleinsten Lüfterstufe (1). und von 23.30 bis 06.00 Uhr Aus (LüfterStufe 0).
Nachts ist die Lüftung aus damit die Luft im Gebäude nicht zu Trocken wird.
In der warmen Jahreszeit betreibe ich die Lüftungsanlage so: von 06.00 bis 23.30Uhr auf Lüfterstufe (2) und von 23.30Uhr bis 06:00Uhr auf LüfterStufe (1).
Jetzt habe ich schon viel über die "Zeitschaltuhr" in Openhab gelesen, und gesehen das so eine Zeitschaltuhr mit Menü und Einstellen der Zeiten nicht so easy (zumindest für mich) sein wird.
Vermutlich muss ich das über die TimeCron Funktion versuchen zu lösen.
So stelle ich mir das vor:
In der UI kann ich die Timerfunktion Aktivieren/Deaktivieren, und ich kann verschiedene Zeitprogramme auswählen.
Vielleicht bekommen wir das ja hier zusammen hin :)

Viele Grüße

Peter
- OpenHab 2.4
#PWRUP

madmike
Beiträge: 278
Answers: 0
Registriert: 15. Apr 2018 17:09

Re: Zeitschalt Rule aber wie ?

Beitrag von madmike »

Hallo Peter,
ich habe etwas ähnliches laufen, vielleicht kannst du damit was anfangen.
Ich habe einen Wecker realisiert der variable Zeiten zum Ausschalten einer Lampe setzt.
Das wäre vielleicht ein Ansatz.
Hier meine Einträge:
Wecker Items:

Code: Alles auswählen

 Switch Deko_WECKER      "Abschalt-Timer"         <siren>
Number Deko_WECKER_H    "Auszeit Stunde [%s]"    <time>
Number Deko_WECKER_M    "Auszeit Minute [%s]"    <time>
Wecker rules:

Code: Alles auswählen

 var Timer Deko = null
 
rule "Wecker Deko"
    when
        Time cron "0 * * * * ?"
    then
	if (Deko_WECKER.state == ON) {
		var sollMinute = (Deko_WECKER_M.state as DecimalType).intValue
		var sollStunde = (Deko_WECKER_H.state as DecimalType).intValue
 
		if (sollMinute == now.getMinuteOfHour && sollStunde == now.getHourOfDay) {

		   DekoMaren.sendCommand(OFF)
		
		}
	}
end
Sitemap:

Code: Alles auswählen

 Text label="Maren's Zimmer" icon=woman_2 {
        Frame label="Deko-Timer" {
			Switch   item=Deko_WECKER        mappings=[ON="Timer an", OFF="Timer aus"]
			Setpoint item=Deko_WECKER_H      minValue=0 maxValue=23 step=1
			Setpoint item=Deko_WECKER_M      minValue=0 maxValue=59 step=1
        }
Ich kann damit zum einen einen Wecker Minutengenau setzen und zum anderen den Wecker entsprechen abschalten wenn ich Ihn nicht benötige.
Vielleicht konnte ich Dir damit helfen, als Ansatz zu Deiner spezifischen Lösung.
mfg
Madmike

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

Re: Zeitschalt Rule aber wie ?

Beitrag von udo1toni »

Man kann sich natürlich Steuerelemente für Zeitschaltuhren basteln, sollte sich aber vorher überlegen, warum man das tut.
  • Wer soll die Schaltzeiten einstellen?
  • Wie oft werden die Schaltzeiten geändert?
  • Warum werden die Schaltzeiten geändert?
Wenn wir ehrlich sind, ist die erste Frage meist mit "ich" zu beantworten.
Eine Rules Datei zu öffnen und dort die Time cron Expression anzupassen ist eine Sache weniger Sekunden, die Entwicklung einer Oberfläche dauert meist Stunden -> lohnt nicht.
Wenn es tatsächlich jemand anders ist, der die Schaltzeiten ändert: Es gibt das calDav Binding, mit dem man beliebige iCal-basierte Kalender (z.B. Google Calendar) auswerten und mit Schaltereignissen reagieren kann.
Es ist simpel, einen Kalender für ausgewählte Personen mit schreibberechtigung freizugeben.
Es ist einfach, wiederkehrende Termine einzutragen.
Die Oberfläche ist im Zweifel gewohnt - oder die Person wird so an eine Terminführung über den Online Kalender herangeführt... ;)

Die zweite Frage ist oft mit "zwei bis vier mal im Jahr" zu beantworten, und in diesem Zusammenhang auch die dritte Frage: "weil sich jahreszeitlich bedingt der Rahmen geändert hat".

Was letztlich bedeutet, dass man mehrfach im Jahr manuell in die Steuerung eingreift, weil eine Wochenschaltuhr nicht intelligent genug ist.
Time cron Ausdrücke können um Monate ergänzt werden, so dass man tatsächlich zu Rules kommen kann, die jegliche Eingriffe unnötig machen.

Allerdings ist auch eine Jahresschaltuhr nur bedingt tauglich, da sich auch hier ab und zu Verschiebungen ergeben. Sinnvoller wäre es also, die Zeitsteuerung mit Wetterdaten zu koppeln, z.B. die Luftfeuchte und Temperatur zu messen (außen + innen) und die Anlage entsprechend zu steuern, oder auch die Wettervorhersage zu nutzen.

Die letzte Variante ist natürlich erheblich aufwändiger zu realisieren als ein kleiner Satz Time cron Ausdrücke und passende Regeln, sollte aber als Ziel im Auge behalten werden, auch wenn man "provisorisch" für die nächsten Jahre Time cron einsetzt.

Noch ein Wort zu Zeitschaltuhren, die über die UI gesteuert werden: Ein möglicher Anwendungsfall wäre bei mir, Weckzeiten festzulegen, weil ich im Wechsel-Schichtdienst arbeite.
Was ich aber keinesfalls machen wöllte ;), wäre Minuten und Stunden exakt auszuwählen.
Stattdessen wäre dann eine überschaubare Liste mit den Namen meiner Dienste (vielleicht ergänzt mit der konkreten Schaltzeit im Klartext) in der UI hinterlegt, eine Auswahlliste mit (größenordnungsmäßig) 5 bis 10 verschiedenen Einträgen, fertig.
Allerdings stehen meine Dienste in einem online Kalender, wenn, dann würde ich den abgreifen. Ich habe aber ganz klassische Reisewecker auf meinem Nachttisch (zwei)...
Man sollte sich immer darüber im Klaren sein, dass bestimmte Bedienkonzepte nur aus den Gegebenheiten entstehen - früher gab es die Zeischaltuhren mit Ring und "Zähnchen", ausreichend um all 10 Minuten zu schalten, einfaches Konzept, und es gibt Heizungshersteller, die einen hohen Programieraufwand treiben, um genau diese Bedienung in einer UI abzubilden. Umgekehrt ist es aber auch meist nicht notwendig, minutengenau zu schalten. Wenn es minutengenau sein muss, ist dann nicht sekundengenau besser? Und warum wählt man dann doch nur XX:00 XX:15 XX:30 XX:45 als Schaltzeiten aus?
openHAB4.3.5 stable in einem Debian-Container (bookworm) (Proxmox 8.4.1, LXC), mit openHABian eingerichtet

Benutzeravatar
PeterA
Beiträge: 1106
Answers: 13
Registriert: 8. Feb 2019 12:12

Re: Zeitschalt Rule aber wie ?

Beitrag von PeterA »

Hallo Udo,

du hast schon Recht, das muss kein Fancy Timer Ui gedöns werden.
Den Ansatz von Dir und Madmike finde ich am besten.
Eigentlich möchte ich maximal 3-4 Unterschiedliche Schaltzeiten haben.
So werde ich versuchen das umzusetzen.
- OpenHab 2.4
#PWRUP

Benutzeravatar
PeterA
Beiträge: 1106
Answers: 13
Registriert: 8. Feb 2019 12:12

Re: Zeitschalt Rule aber wie ?

Beitrag von PeterA »

So hab mal die Rule, zunächst um es zu Testen, erweitert.
Der erste Teil funktioniert. Der else if aber nicht...
Vermutlich hab ichs wieder mit den Klammern versemmelt. :/

Code: Alles auswählen

var Timer Deko = null
 
rule "Wecker Deko"
    when
        Time cron "0 * * * * ?" //Abfrage jede Minute
    then
	if (Deko_WECKER.state == ON) {
		var sollMinute = (Deko_WECKER_M.state as DecimalType).intValue
		var sollStunde = (Deko_WECKER_H.state as DecimalType).intValue
 
		if (sollMinute == now.getMinuteOfHour && sollStunde == now.getHourOfDay) {

		   DekoMaren.sendCommand(OFF)
		
		}
        else if (Deko_WECKER.state == OFF) {
            var sollMinute = (Deko_WECKER_Mo.state as DecimalType).intValue
            var sollStunde = (Deko_WECKER_Ho.state as DecimalType).intValue 
        
            if (sollMinute == now.getMinuteOfHour && sollStunde == now.getHourOfDay) {

		   DekoMaren.sendCommand(ON)
            }
       }   }

end
EDIT:
Nicht nur die Klammern waren es :oops:
Jetzt funktioniert es Grundsätzlich. Damit kann ich jetzt weiter Arbeiten!
Vielen Dank an madmike und udo

Code: Alles auswählen

var Timer Deko = null
 
rule "Wecker Deko"
when
    Time cron "0 * * * * ?" //Abfrage jede Minute
then
    if(Deko_WECKER.state != ON) return;  // wenn Schalter aus(nicht an) , keine Aktionen

    if (DekoMaren.state == ON) {
	var sollMinute = (Deko_WECKER_M.state as DecimalType).intValue
	var sollStunde = (Deko_WECKER_H.state as DecimalType).intValue
 
	    if (sollMinute == now.getMinuteOfHour && sollStunde == now.getHourOfDay) 
	    DekoMaren.sendCommand(OFF)
    }
	else if (DekoMaren.state == OFF) {
    var sollMinuteo = (Deko_WECKER_Mo.state as DecimalType).intValue
    var sollStundeo = (Deko_WECKER_Ho.state as DecimalType).intValue 
        
    if (sollMinuteo == now.getMinuteOfHour && sollStundeo == now.getHourOfDay) 
	DekoMaren.sendCommand(ON)

    }
end
- OpenHab 2.4
#PWRUP

Benutzeravatar
PeterA
Beiträge: 1106
Answers: 13
Registriert: 8. Feb 2019 12:12

Re: Zeitschalt Rule aber wie ?

Beitrag von PeterA »

So, habe jetzt die Rule auf meine Anlage angepasst.
Nun funktioniert die Rule nicht mehr??

Code: Alles auswählen

var Timer Deko = null

rule "Zeitschaltuhr Lüftung"
when
    Time cron "0 * * * * ?" //Abfrage jede Minute
then
    if(WAC350_Zeitschaltung.state != ON) return;  // wenn Schalter aus(nicht an) , $
    if (FanStandby_Switch.state == OFF) {
        var sollMinute = (WAC350_timer_H1.state as DecimalType).intValue
        var sollStunde = (WAC350_timer_M1.state as DecimalType).intValue

            if (sollMinute == now.getMinuteOfHour && sollStunde == now.getHourOfDay$            FanStandby_Switch.sendCommand(ON)
    }
        else if (FanStandby_Switch.state == ON) {
    var sollMinuteo = (WAC350_timer_H2.state as DecimalType).intValue
    var sollStundeo = (WAC350_timer_M2.state as DecimalType).intValue

    if (sollMinuteo == now.getMinuteOfHour && sollStundeo == now.getHourOfDay)
        FanStandby_Switch.sendCommand(OFF)

    }
end/code]
- OpenHab 2.4
#PWRUP

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

Re: Zeitschalt Rule aber wie ?

Beitrag von udo1toni »

Du möchtest die Rule nicht minütlich triggern lassen.

Code: Alles auswählen

rule "Zeitschaltung Lüftung Stufe 0"
when
    Time cron "0 30 23 * 10-12,1-3 ?" // vom 01. Oktober bis 31. März um 23:30:00 Uhr
then
    Lüfterstufe.sendCommand(0)
end

rule "Zeitschaltung Lüftung Stufe 1"
when
    Time cron "0 30 23 * 4-9 ?" or // vom 01. April bis 30. September um 23:30:00 Uhr
    Time cron "0 0 6 * 10-12,1-3 ?" // vom 01. Oktober bis 31. März um 6:00:00 Uhr
then
    Lüfterstufe.sendCommand(1)
end

rule "Zeitschaltung Lüftung Stufe 2"
when
    Time cron "0 0 6 * 4-9 ?"  // vom 01. April bis 30. September um 6:00:00 Uhr
then
    Lüfterstufe.sendCommand(2)
end
Alternativ könnte man auch mit zwei Rules auskommen, dann müsste man zu Beginn der Rules das Datum bestimmen und abhängig davon die Lüfterstufe wählen.
Man könnte aber auch ein Item "Sommer" definieren. Dann sähe die Rules z.B. so aus:

Code: Alles auswählen

rule "Zeitschaltung Lüftung niedrig"
when
    Time cron "0 30 23 * * ?" // um 23:30:00 Uhr
then
    val Number nStufe = if(Sommer.state == ON) 1 else 0
    Lüfterstufe.sendCommand(0 + nStufe)
end

rule "Zeitschaltung Lüftung hoch"
when
    Time cron "0 0 6 * * ?"  // um 6:00:00 Uhr
then
    val Number nStufe = if(Sommer.state == ON) 1 else 0
    Lüfterstufe.sendCommand(1 + nStufe)
end
Das Switch Item Sommer muss nun in der warmen Jahreszeit ON und in der kalten Jahreszeit OFF sein, das kann manuell oder automatisch über eine weitere Rule geschaltet werden. Vorteil gegenüber der ersten Variante ist, dass man so auch einfach ein bestimmtes Datum für Sommer/Winter Umschaltung wählen kann, z.B.

Code: Alles auswählen

Time cron "0 0 0 17 4 ?" // 17.4., genau 0:00 Uhr
openHAB4.3.5 stable in einem Debian-Container (bookworm) (Proxmox 8.4.1, LXC), mit openHABian eingerichtet

Benutzeravatar
PeterA
Beiträge: 1106
Answers: 13
Registriert: 8. Feb 2019 12:12

Re: Zeitschalt Rule aber wie ?

Beitrag von PeterA »

Hallo Udo,
wow auch ein Interessanter Ansatz, und auch eigentlich einfacher!
Könntest Du bitte trotzdem einmal schauen weshalb meine Rule (auf meine Anlage angepasst) jetzt nicht läuft ?

Code: Alles auswählen

var Timer Deko = null

rule "Zeitschaltuhr Lüftung"
when
    Time cron "0 * * * * ?" //Abfrage jede Minute
then
    if(WAC350_Zeitschaltung.state != ON) return;  // wenn Schalter aus(nicht an) , $
    if (FanStandby_Switch.state == OFF) {
        var sollMinute = (WAC350_timer_H1.state as DecimalType).intValue
        var sollStunde = (WAC350_timer_M1.state as DecimalType).intValue

            if (sollMinute == now.getMinuteOfHour && sollStunde == now.getHourOfDay$            FanStandby_Switch.sendCommand(ON)
    }
        else if (FanStandby_Switch.state == ON) {
    var sollMinuteo = (WAC350_timer_H2.state as DecimalType).intValue
    var sollStundeo = (WAC350_timer_M2.state as DecimalType).intValue

    if (sollMinuteo == now.getMinuteOfHour && sollStundeo == now.getHourOfDay)
        FanStandby_Switch.sendCommand(OFF)

    }
end
- OpenHab 2.4
#PWRUP

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

Re: Zeitschalt Rule aber wie ?

Beitrag von udo1toni »

Weil da Tippfehler drin sind, bzw. Umbruchzeichen aus vi oder nano. Das hier sollte funktionieren, gesetzt den Fall, alle Items sind so vorhanden und vom passenden Typ:

Code: Alles auswählen

rule "Zeitschaltuhr Lüftung"
when
    Time cron "0 * * * * ?" //Abfrage jede Minute
then
    if(WAC350_Zeitschaltung.state != ON) return;  // wenn Schalter aus(nicht an)
    if (FanStandby_Switch.state == OFF) {
        var sollMinute = (WAC350_timer_H1.state as DecimalType).intValue
        var sollStunde = (WAC350_timer_M1.state as DecimalType).intValue
        if (sollMinute == now.getMinuteOfHour && sollStunde == now.getHourOfDay)
            FanStandby_Switch.sendCommand(ON)
    }
    else if (FanStandby_Switch.state == ON) {
        var sollMinuteo = (WAC350_timer_H2.state as DecimalType).intValue
        var sollStundeo = (WAC350_timer_M2.state as DecimalType).intValue
        if (sollMinuteo == now.getMinuteOfHour && sollStundeo == now.getHourOfDay)
            FanStandby_Switch.sendCommand(OFF)
    }
end
Wie erwähnt halte ich nichts davon, Zeitschaltuhren auf diese Art über die UI zu steuern, damit rettet man nur eine Krücke aus der Vergangenheit in die Gegenwart, ohne die Vorteile aktueller Technik zu nutzen.
Die Rule wird nur funktionieren, wenn alle Items, die angesprochen werden vorhanden und mit gültigen Werten gefüllt sind. Wenn openHAB frisch gestartet wird, ist ein Item sollMinute eventuell leer (selbst wenn es mit Persistence und restoreOnStartup arbeitet), was bedeutet, dass der Status nicht vom Typ DecimalType ist. Das Type Casting wird also scheitern, mit ca. 40 Zeilen Error Log, die Rule wird nicht weiter ausgeführt. Das Gleiche gilt für sollStunde, sollMinuteo und sollStundeo. Falls restoreOnStartup gesetzt ist, wird der letzte Status der Items beim Start gesetzt, es kann aber nicht garantiert werden, dass die rule zu diesem Zeitpunkt noch nicht gestartet wurde.
openHAB4.3.5 stable in einem Debian-Container (bookworm) (Proxmox 8.4.1, LXC), mit openHABian eingerichtet

Benutzeravatar
PeterA
Beiträge: 1106
Answers: 13
Registriert: 8. Feb 2019 12:12

Re: Zeitschalt Rule aber wie ?

Beitrag von PeterA »

Prima vielen Dank!
Edit:
Ich werd noch zu Hirsch! Die Rule läuft nicht.... KOTZ
Und was ist mit diesem "var Timer Deko = null" ?
Edit2:
Ok Udo... habs eingesehen. Das Funktioniert so nicht.
Denn der Timer ist ja "dumm" und weiss nicht in welchem Zustand die Anlage sich gerade befindet wenn ich mit der StandbyFunktion arbeite.
Das Time Cron Konzept über die LüfterStufe ist besser.
- OpenHab 2.4
#PWRUP

Antworten