Zeitsteuerung

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Antworten
ubi
Beiträge: 7
Registriert: 3. Sep 2019 13:27
Answers: 0

Zeitsteuerung

Beitrag von ubi »

Hallo Leute,

ich möchte gerne, dass meine Batterien zeitabhängig Strom einspeisen.
dazu habe ich eine Rule erstellt.

dieser zeilencode:

Code: Alles auswählen

if (now.getHour() < 24 && now.getHour() > 18) 
sollte mir zwischen 19 und 24 Uhr meinen Wechselrichter einstellen.
jedoch wird diese Rule unabhängig vom eingetragenem Zeitfenster immer ausgelöst. Sprich mit jedem Update vom Item.
Weiß jemand was ich da falsch mache?

openhab 3.2 M2
Hier kompletter code:



Code: Alles auswählen

rule "Steuerung Einspeisung 19-24 Uhr"
when Item epvoltBatterie received update  
then

var BatV = (epvoltBatterie.state as DecimalType)
if (now.getHour() < 24 && now.getHour() > 18)

 Thread::sleep(1000)
    if (BatV >= 23) {sendCommand(SMI260_MaxPowerset, 61) }
    else if ((BatV <= 24) && (BatV >= 23.2)) {sendCommand(SMI260_MaxPowerset, 40) }
 
    else if (BatV <= 23.1) {sendCommand(SMI260_MaxPowerset, 0) }
  
       
end


rule "Steuerung Einspeisung 1-9 Uhr"
when Item epvoltBatterie received update  
then
var BatV = (epvoltBatterie.state as DecimalType)
if (now.getHour() < 9 && now.getHour() > 1)

  Thread::sleep(1000)
    if (BatV >= 23) {sendCommand(SMI260_MaxPowerset, 59) }
    else if ((BatV <= 24) && (BatV >= 23.2)) {sendCommand(SMI260_MaxPowerset, 40) }

    else if (BatV <= 23.1) {sendCommand(SMI260_MaxPowerset, 0) }
 


end

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

Re: Zeitsteuerung

Beitrag von udo1toni »

Das ist kein Wunder. :) Du hast keine Klammern gesetzt.
Eine bedingte Verzweigung wirkt exakt auf den nächsten Befehl. Das wäre bei Deinen Rules jeweils der Befehl Thread::sleep(1000) (warum ist der überhaupt eingebaut?)

Außerdem hast Du einen Logikfehler bei der Betrachtung der Grenzwerte. Aber ich fange vielleicht noch weiter vorne an...
Erst mal solltest Du keine zwei Rules verwenden, die identische Trigger nutzen. Stattdessen erledigst Du alles in einer Rule.
.getHour liefert die Stunde einer Digitalanzeige. Schau Dir eine Digitaluhr an, Du wirst feststellen, dass die Stunde die Zahlen 0 bis 23 anzeigt, aber niemals die 24. Eine Abfrage auf getHour < 24 ist also immer wahr und kann somit entfallen. In der zweiten Rule prüfst Du auf getHour > 1. Wir erinnern uns, .getHour liefert die Stunde der Digitalanzeige, > 1 bedeutet also ab 2 Uhr.
Dann die Prüfung von BatV. Zunächst prüfst Du auf >=23, danach auf <=24 & >=23.2 (das ist für alle Werte über 23.2 schon mit der 1. Bedingung erfüllt) und zum Schluss auf <=23.1 (das beinhaltet Werte, die ebenfalls schon mit der 1. Bedingung abgedeckt sind.
Ich vermute, Du wolltest eigentlich auf >=24 testen. Aber Immer darauf achten, dass bei solchen Betrachtungen abgeschlossene und eindeutige Zahlenräume entstehen, also nicht in einer Bedingung auf >=24 und in der nächsten auf <=24 testen, denn dann sind für den Wert 24 beide Bedingungen gültig.

Wenn man die Logik in der Berechnung etwas ändert, kann man die Rule effizienter bauen:

Code: Alles auswählen

rule "Steuerung Einspeisung"
when
    Item epvoltBatterie received update  
then
    val BatV = if(epvoltBatterie.state instanceof Number) (epvoltBatterie.state as Number).floatValue else 0
    if(BatV == 0) {
        logWarn("epvolt","keine gültige Spannung gemessen: {} Abbruch!",epvoltBatterie.state)
        return;
    }
    var soll = 0
    if (BatV >= 23.2) soll = 40
    if (BatV >= 24) {
        if(now.getHour > 18) 
            soll = 61
        else if(now.getHour < 9 && now.getHour > 0)
            soll = 59
    }
    if((now.getHour > 0 && now.getHour < 9) || (now.getHour>18))
        if(SMI260_MaxPowerset.state as Number != soll)
            SMI260_MaxPowerset.sendCommand(soll)
end
Die erste Zeile in der Rule sorgt dafür, dass es keine Fehlermeldung gibt, falls das Item keinen gültigen Wert liefert. Die darauffolgenden Zeilen erzeugen dann im Falle eines Falles selbst eine Meldung und beenden die Rule.
Erst danach wird der gesuchte Wert bestimmt. Dabei ist 0 der Default Wert. Ist die Batteriespannung über der ersten Grenze, wird ein Soll von 40 gesetzt. Ist die Batteriespannung über 24, so wird das Soll abhängig von der Uhrzeit auf 61 oder auf 59 gesetzt.
Zum Schluss wird, falls einer der beiden Zeiträume zutrifft der Zustand des Items abgefragt, und falls dieser vom Soll abweicht, wird das Soll gesetzt.
Die Rule verhält sich ähnlich (aber nicht exakt) wie Deine Rules. Sie ändert das Item nur innerhalb der vorgegeben Zeiträume, allerdings tut sie das nur, falls es auch notwendig ist (das ist die Abweichung).
openHAB4.3.5 stable in einem Debian-Container (bookworm) (Proxmox 8.4.1, LXC), mit openHABian eingerichtet

ubi
Beiträge: 7
Registriert: 3. Sep 2019 13:27
Answers: 0

Re: Zeitsteuerung (gelöst)

Beitrag von ubi »

Vielen Dank Udo,
das funktioniert einwandfrei.
Ich glaube den Thread::sleep :1000 hatte ich eingebaut um zu sehen welches der 2 Rules zuerst triggert ( bei der 2ten Rule dann Thread::sleep: 5000.) oder ob da noch was dazwischen kommt.
Aber jetzt ist ja klar, dass die beiden keine Auswirkungen hatten wenn die Bedingung ohne Klammern sich nur auf den nächsten Befehl auswirkt.

Antworten