Rule zwischen zwei Zeiten

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

mach
Beiträge: 14
Registriert: 10. Dez 2019 13:47
Answers: 0

Rule zwischen zwei Zeiten

Beitrag von mach »

Hallo zusammen,
ich habe einen Kühlschrank dem ich gerne einen Eco Modus zuweisen möchte
von abends 21:00 bis morgens 09:00 soll jeweils zwischen viertel nach und halb geschaut werden ob die aktuelle Leitung des Kühlschrankes
unter einem bestimmten Wert ist. In diesem Fall läuft der Kompressor nicht.
Dann soll der Kühlschrank einfach abgeschaltet werden.
Jeweils zur vollen Stunde wird er wieder eingeschaltet und läuft dann mindestens 15min.
Um viertel nach soll die Regel wieder greifen.

Meine Fragen:
- Die Variable aktuelle_zeit enthält nie einen Wert, was mache ich falsch
- würde diese Regel überhaupt so funktionieren?

Code: Alles auswählen

rule "Kühlschrank AUS Mo-DO & SO"
when
    Time cron "0 15 21 ? * MON,TUE,WED,THU,SUN *" or
    Time cron "0 15 22 ? * MON,TUE,WED,THU,SUN *" or
    Time cron "0 15 23 ? * MON,TUE,WED,THU,SUN *" or
    Time cron "0 15 0 ? * MON,TUE,WED,THU,SUN *" or
    Time cron "0 15 1 ? * MON,TUE,WED,THU,SUN *" or
    Time cron "0 15 2 ? * MON,TUE,WED,THU,SUN *" or
    Time cron "0 15 3 ? * MON,TUE,WED,THU,SUN *" or
    Time cron "0 15 4 ? * MON,TUE,WED,THU,SUN *" or
    Time cron "0 15 5 ? * MON,TUE,WED,THU,SUN *" or
    Time cron "0 15 6 ? * MON,TUE,WED,THU,SUN *" or
    Time cron "0 15 7 ? * MON,TUE,WED,THU,SUN *" or
    Time cron "0 15 8 ? * MON,TUE,WED,THU,SUN *" or
    Time cron "0 15 9 ? * MON,TUE,WED,THU,SUN *" 
then
    var Integer iTime = 0
    if(KuehlModus.state instanceof Number) {
        iTime = (KuehlModus.state as Number).intValue
        }
    if(iTime == 2){
      
        var aktuelle_zeit = regel_startzeit.getHour() * 60 + regel_startzeit.getMinute()
        if (aktuelle_zeit >= 9*60+15 && aktuelle_zeit <= 9*60+30){

            if ((Steckdose_Leistung.state as Number).doubleValue < 50){
                SteckdoseKuehl_Betrieb.sendCommand(OFF)
            }  
        }
    }
 end      
 

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

Re: Rule zwischen zwei Zeiten

Beitrag von udo1toni »

Es geht mal mit dem Trigger los...

Code: Alles auswählen

Time cron "0 15 0-9,21-23 ? * 1-4,7" // Sonntags bis Donnerstags zur 1. Viertelstunde von 21:15 - 09:15 Uhr
macht das gleiche :)

Du könntest die Liste auch ausschreiben, also 0,1,2,3,4,5,6,7,8,9,21,22,23, eben so wie bei den Wochentagen, aber die kompakte Form nimmt dann doch erheblich weniger Platz ein.
Das Jahr ist optional, das Sternchen am Ende kannst Du Dir also sparen.

Was soll denn regel_startzeit sein? Ist das ein Item, welches Du angelegt hast? Aber da gäbe es kein getHour...
Die aktuelle Zeit (das ist letztlich die Startzeit der Rule, auf ein, zwei Millisekunden sollte es nicht ankommen) erhältst Du mit now().
Ab diesem Punkt gibt es massig Optionen, mit Zeiten zu rechnen. Du kannst den von Dir gewünschten Wert (Wieviele Minuten sind seit Mitternacht vergangen?) bequem so erhalten: (now.get(MINUTE_OF_DAY)

Was soll die Rule denn eigentlich überhaupt tun? Hier mal die Vereinfachungen Deiner Rule:

Code: Alles auswählen

rule "Kühlschrank AUS Mo-DO & SO"
when
    Time cron "0 15 0-9,21-23 ? * MON-THU,SUN"
then
    var Integer iTime = 0
    if(KuehlModus.state instanceof Number)
        iTime = (KuehlModus.state as Number).intValue
    if(iTime == 2){
        if ( now.get(MINUTE_OF_DAY) >= 9 * 60 + 15 && now.get(MINUTE_OF_DAY) <= 9 * 60 + 30){
            if ((Steckdose_Leistung.state as Number).doubleValue < 50){
                SteckdoseKuehl_Betrieb.sendCommand(OFF)
            }
        }
    }
end

// Vereinfacht 1:

rule "Kühlschrank AUS Mo-DO & SO"
when
    Time cron "0 15 0-9,21-23 ? * MON-THU,SUN"
then
    var Integer iTime = 0                                                                 // definiere Vaiable
    if(KuehlModus.state instanceof Number)                                                // Falls Status des Kühlmodus eine Zahl ist
        iTime = (KuehlModus.state as Number).intValue                                     // übernimm diesen in die Variable

    if(iTime != 2)                                                                        // Falls Kühlmodus nicht 2 ist
        return;                                                                           // beende die Rule

    if(!(now.get(MINUTE_OF_DAY) >= 9 * 60 + 15 && now.get(MINUTE_OF_DAY) <= 9 * 60 + 30)) // falls nicht zwischen 9:15 und 9:30
        return;                                                                           // beende die Rule

    if((Steckdose_Leistung.state as Number).doubleValue < 50)                             // Falls gemessene Leistung unter 50
        SteckdoseKuehl_Betrieb.sendCommand(OFF)                                           // Schalte Steckdose aus.
end

// Vereinfacht 2:

rule "Kühlschrank AUS Mo-DO & SO"
when
    Time cron "0 15 9 ? * MON-THU,SUN"
then
    var Integer iTime = 0                                                                 // definiere Vaiable
    if(KuehlModus.state instanceof Number)                                                // Falls Status des Kühlmodus eine Zahl ist
        iTime = (KuehlModus.state as Number).intValue                                     // übernimm diesen in die Variable

    if(iTime != 2)                                                                        // Falls Kühlmodus nicht 2 ist
        return;                                                                           // beende die Rule

    if((Steckdose_Leistung.state as Number).doubleValue < 50)                             // Falls gemessene Leistung unter 50
        SteckdoseKuehl_Betrieb.sendCommand(OFF)                                           // Schalte Steckdose aus.
end
Da Du innerhalb der Rule daraufs testest, dass es zwischen 9:15 und 9:30 Uhr sein muss, kannst Du die anderen Startzeitpunkte einfach weg lassen :)
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

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

Re: Rule zwischen zwei Zeiten

Beitrag von udo1toni »

Ach, gerade noch mal Dein Posting gelesen, ich muss vorher anfangen...

Rules haben Trigger. Im vorliegenden Fall ist dieser Trigger die Zeit. Ein Trigger ist immer ein Ereignis, niemals ein Zustand. Um 9:15:00 wird die Rule ausgelöst und wird exakt einmal ausgeführt. Danach ist die Rule fertig, bis das nächste Ereignis auftritt. (in diesem Fall an 21:15:00)

Du möchtest etwas völlig anderes haben:

Code: Alles auswählen

rule "Kühlschrank AUS Mo-DO & SO"
when
    Item Steckdose_Leistung changed
then
    if((newState as Number).floatValue > 50)               // Falls Leistungsaufnahme über 50
        return;                                            // beende die Rule

    var Integer iTime = 0                                  // definiere Variable
    if(KuehlModus.state instanceof Number)                 // Falls Status des Kühlmodus eine Zahl ist
        iTime = (KuehlModus.state as Number).intValue      // übernimm diesen in die Variable
    if(iTime != 2)                                         // Falls Kühlmodus nicht 2
        return;                                            // beende die Rule

    val iDay = now.getDayOfWeek.getValue
    if(iDay > 4 && iDay < 7)                               // Freitags und Samstags
        return;                                            // beende die Rule

    if(now.getHour > 9 && now.getHour < 21)                // zwischen 10 Uhr und 21 Uhr
        return;                                            // beende die Rule

    if(now.getMinute < 15 || now.getMinute > 29)           // vor Viertel nach und nach Hhalb
        return;                                            // beende die Rule

    if(SteckdoseKuehl_Betrieb.state != OFF)                // Falls Steckdose an
        SteckdoseKuehl_Betrieb.sendCommand(OFF)            // Schalte Steckdose aus.
end
Die Rule startet, wenn die gemessene Leistung aktualisiert wurde.
Der Wert steht als implizite Variable zur Verfügung, weil der Trigger changed ist.
Falls die Leistung über 50 ist, bricht die Rule ab. (Wir nehmen die Prüfung der Messung vorweg, da dieser Wert ohnehin immer zur Verfügung steht.)
Der ausgewählte Kühlmodus wird geholt.
Falls der Kühlmodus nicht zwei ist, bricht die Rule ab.
Falls der Tag Freitag oder Samstag ist, bricht die Rule ab. (die lokale Konstante nur, um die Rule kompakt zu halten)
Falls die Stunde größer 9 und kleiner 21 ist, bricht die Rule ab.
Falls die Minute kleiner 15 oder größer 29 ist, bricht die Rule ab.
Zu diesem Zeitpunkt wissen wir, dass alle Abschaltbedingungen erfüllt sind. Falls also der Schaltaktor eingeschaltet ist, wird er abgeschaltet.

Die Reihenfolge der Anweisungen ist nicht ganz zufällig gewählt. Beispielsweise die Leistungsmessung ganz nach vorne zu nehmen, ist naheliegend, denn dieser Wert wurde schon ermittelt und steht ohne weitere Berechnungen zur Verfügung.
Alle anderen Werte müssen über extra Anfragen geholt werden, was im einzelnen nicht viel Zeit kostet, aber eben eventuell doch den einen oder anderen Taktzyklus spart.
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

mach
Beiträge: 14
Registriert: 10. Dez 2019 13:47
Answers: 0

Re: Rule zwischen zwei Zeiten

Beitrag von mach »

Super! Vielen Dank - genau das brauche ich:)

mad-mike
Beiträge: 491
Registriert: 6. Jan 2021 18:05
Answers: 3

Re: Rule zwischen zwei Zeiten

Beitrag von mad-mike »

Moin.

Warum macht man sowas??
Gruss mad-mike

openHABian 4.3.5 auf Raspberry Pi 4 Mod. b (8GB) ;)

mach
Beiträge: 14
Registriert: 10. Dez 2019 13:47
Answers: 0

Re: Rule zwischen zwei Zeiten

Beitrag von mach »

...um Energie zu sparen

mad-mike
Beiträge: 491
Registriert: 6. Jan 2021 18:05
Answers: 3

Re: Rule zwischen zwei Zeiten

Beitrag von mad-mike »

Kannst du das weiter erläutern?

Was lässt sich einsparen? Wie lässt sich da was sparen?

Sollte ich Mal "vorher-nachher" Messung starten?


Bin an sowas natürlich auch interessiert.
Gruss mad-mike

openHABian 4.3.5 auf Raspberry Pi 4 Mod. b (8GB) ;)

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

Re: Rule zwischen zwei Zeiten

Beitrag von udo1toni »

Ich denke, es kommt da sehr auf den Kühlschrank an :) und wie er aufgebaut ist. Grundsätzlich sollte der Temperaturerhalt weniger Energie kosten als die Temperatur erneut zu erreichen, weshalb ein Kühlschrank mit Invertertechnik einem einfachen Kompressor auch überlegen sein dürfte (Kühlleistung wird fließend geregelt, so dass der "Kompressor" durchläuft, aber mit verringerter Leistungsaufnahme).
Aber es mag Kühlschränke geben, die sich hier anders verhalten und bei denen ein bisschen größere Schwankung der Temperatur keinen starken Anstieg des Energiebedarfs zur Folge hat.
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

mach
Beiträge: 14
Registriert: 10. Dez 2019 13:47
Answers: 0

Re: Rule zwischen zwei Zeiten

Beitrag von mach »

Nun ja, der Kühlschrank ist ein Barkühlschrank mit Glastüren und einem Volumen von 200l und einer Umluftkühlung.
Vorteil: selbst große Mengen bekommt man schnell kalt - Nachteil: er verbraucht viel Strom ca. 2kWh/Tag (nachgemessen)

Durch diese Steuerung lasse ich die Temperatur nachts leicht ansteigen und erhoffe mir so eine Reduktion der Strombedarfs um eine kWh pro Tag.
Moderne Kühlschränke haben einen ECO Modus, der nichts anderes macht.
Ist halt ein Versuch - und die Herausforderung war erst dann ausschalten wenn der Kompressor nicht mehr läuft. So sollte kein Schaden entstehen.

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

Re: Rule zwischen zwei Zeiten

Beitrag von udo1toni »

Ja, das dürfte schon passen. Ich denke, die Glastüren sind nicht wirklich hilfreich beim Energie sparen :) auch wenn es fraglos wesentlich schicker aussieht als schnödes weiß.

Mein Kühlschrank benötigt momentan auch etwa 2 kWh pro Tag, im Winter etwa 1 kWh pro Tag. Allerdings handelt es sich dabei um ein Side-by-Side mit Eisbereiter, Wasserspender, Riesendisplay, viel Schnickschnack und Nutzinhalt 390 l/220 l
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

Antworten