Bewegungsmelder läst sich nicht per zeiten Steuern nach Update auf OH4

Allgemeine Fragen zum Thema "Smart Home" und Entscheidungshilfen

Moderator: seppy

Antworten
ModjoMc06
Beiträge: 91
Registriert: 3. Jul 2018 06:28
Answers: 0

Bewegungsmelder läst sich nicht per zeiten Steuern nach Update auf OH4

Beitrag von ModjoMc06 »

Hallo Ihr lieben.

Ich hab seit ein paar tagen ein kleines Problem. Mit meinen Bewegungs melder per Rules.
Egal welche zeiten ich einstelle die Bewegungsmelder reagieren und Schalten das licht ein.

Villeicht kann mir jemand ein rat oder der gleichen geben wo der fehler liegen könnte

hier mal die Items von licht und Bewegungsmelder:

Code: Alles auswählen

Switch  GF_Hallway_Light        "Flurlicht"                             <light>           (GF_Hallway, gLight)        ["Lighting", "Switchable"] {channel="mqtt:topic:0e4ea3e4aa:e9e62a27b5:e9e62a27b5", alexa="Light.PowerState"}
Number  GF_Hallway_Motion       "Bewegungsmelder[MAP(esp-pir.map):%s]"  <motion>          (GF_Hallway, gMotion)       ["MotionDetector", "Lighting", "Switchable"]  {channel="deconz:presencesensor:00212E07874D:00158d0004499f8a010406:presence"}
Und hier ist der Script bzw die Rules:

Code: Alles auswählen

var Timer LightTimer = null

rule "GF_Hallway_Motion"
when
    Item GF_Hallway_Motion changed from 0 to 1
then
    if(GF_Hallway_Motion.state == ON)                                                 
        return;
    if((now.getHour > 3 && now.getHour < 9) || ( now.getHour > 21 && now.getHour < 0))   
        return;

    GF_Hallway_Light.sendCommand(ON)
    LightTimer = createTimer(now.plusMinutes(7), [ |
        GF_Hallway_Light.sendCommand(OFF) 
    ])
end

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

Re: Bewegungsmelder läst sich nicht per zeiten Steuern nach Update auf OH4

Beitrag von udo1toni »

Diese Rule hat noch nie so funktioniert, wie Du es Dir ausgedacht hast.

Code: Alles auswählen

when
    Item GF_Hallway_Motion changed from 0 to 1
Ist GF_Hallway_Motion ein Number Item? Nur dann kann dieses Item jemals 0 oder 1 als Wert enthalten (ok, ein String Item ginge auch noch)

Code: Alles auswählen

if(GF_Hallway_Motion.state == ON)
Also ist GF_Hallway_Motion ein Switch Item? Egal, denn zum Zeitpunkt des Triggers ist der Wert 1, also ist diese Bedingung nie erfüllt, egal wie auch immer das Item definiert ist.

Code: Alles auswählen

if((now.getHour > 3 && now.getHour < 9) || ( now.getHour > 21 && now.getHour < 0))
Der erste Teil geht noch klar:

Code: Alles auswählen

now.getHour > 3 && now.getHour < 9)
Die Zahl muss gößer 3 und kleiner 9 sein, also 4,5,6,7 oder 8
Dieser Teil:

Code: Alles auswählen

now.getHour > 21 && now.getHour < 0
ist niemals wahr, denn eine Zahl kann nicht gleichzeitig größer als 21 und kleiner als 0 sein. Noch dazu gibt es überhaupt keine Stunde kleiner als 0, der Zahlenraum von getHour ist 0 bis 23 (Integer), der Stundenteil einer herkömnmlichen Digitaluhr. Der zweite Teil der Bedingung ist also sinnlos, hat aber keine Auswirkungen, weil er mittels logischem ODER verknüpft ist.

Es bleibt also lediglich eine Bedingung, die die Rule zum Abbruch bewegen wird, falls sie denn jemals getriggert wird, und das ist der Zeitraum von
4:00:00 Uhr bis 8:59:59 Uhr.

Die Version von openHAB spielt hierbei aber keine Rolle (nur müsste man für Versionen vor openHAB3.0 halt statt getHour getHourOfDay schreiben)
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

ModjoMc06
Beiträge: 91
Registriert: 3. Jul 2018 06:28
Answers: 0

Re: Bewegungsmelder läst sich nicht per zeiten Steuern nach Update auf OH4

Beitrag von ModjoMc06 »

Hallo udo1toni,

Um deine frage zu beantworten der Items GF_Hallway_Motion ist Number in den Items kurz gesagt wenn bewegung erkannt wird 1 bei keiner bewegung 0

Code: Alles auswählen

Number  GF_Hallway_Motion 
Nun, ja vorher hatte ich es auch so gehabt

Code: Alles auswählen

if((now.getHour > 3 && now.getHour < 12) || ( now.getHour > 20 && now.getHour < 23))
aber ich hab die logik grade verstanden. nun weiß ich auch wo das Problem im allgemneinen war.
hatte mich nur gewundert in OH3 lief es ohne Probleme, aber ja klar ist auch unlogisch. das er dann auf dauer an ist.
Ist wohl von meinewr seite ein denk fehler

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

Re: Bewegungsmelder läst sich nicht per zeiten Steuern nach Update auf OH4

Beitrag von udo1toni »

Also dann eher so:

Code: Alles auswählen

var Timer LightTimer = null

rule "GF Hallway Motion"
when
    Item GF_Hallway_Motion changed from 0 to 1
then
    if((now.getHour > 3 && now.getHour < 9) || now.getHour > 21)  // von 4 Uhr bis 9 Uhr und ab 22 Uhr kein Licht
        return;

    GF_Hallway_Light.sendCommand(ON)
    LightTimer = createTimer(now.plusMinutes(7), [ |
        GF_Hallway_Light.sendCommand(OFF) 
    ])
end
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

ModjoMc06
Beiträge: 91
Registriert: 3. Jul 2018 06:28
Answers: 0

Re: Bewegungsmelder läst sich nicht per zeiten Steuern nach Update auf OH4

Beitrag von ModjoMc06 »

Ahhhh.. okay...
Ja nun sehe ich den allgemeinen Fehler den ich da gemacht haben.
Im Grunde sollte es so aus sehen da ich früh raus muss, also um 3 aufstehen muss. Das dann das Licht An geht also von 3uhr und bis 9 Uhr per Bewegung und dann abends von 21uhr bis 23 oder .. da zwischen sollte der bewegungsmelder nicht aktive sein. Da kann man ja auch seine Finger für nehmen.zum schalten der Lampen.

Und dein Ansatz ist schon sehr gut.

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

Re: Bewegungsmelder läst sich nicht per zeiten Steuern nach Update auf OH4

Beitrag von udo1toni »

Ah... dann ist die Logik quasi verkehrt herum...
statt

Code: Alles auswählen

    if((now.getHour > 3 && now.getHour < 9) || now.getHour > 21)  // von 4 Uhr bis 9 Uhr und ab 22 Uhr kein Licht
        return;
lieber

Code: Alles auswählen

    if((now.getHour < 3 || (now.getHour > 8 && now.getHour < 21) || now.getHour > 22 )  // ab 23 Uhr bis 3 Uhr und ab 9 Uhr bis 21 Uhr kein Licht
        return;
Also von 00:00:00 - 02:59:59, sowie von 09:00:00 - 20:59:59, sowie ab 23:00:00 Uhr wird die Rule über diese Bedingung abgebrochen.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

ModjoMc06
Beiträge: 91
Registriert: 3. Jul 2018 06:28
Answers: 0

Re: Bewegungsmelder läst sich nicht per zeiten Steuern nach Update auf OH4

Beitrag von ModjoMc06 »

Ah...

Jetzt verstehe ich die logik dahinter. Nun dann ist es auch kein wunder das dies nicht so lief.
Zb. bei 3Uhr Morgens bis 9uhr, lief die Rule 9:59:59 also 10. und so weiter.
jedoch was mich wunder war in OH3 lief der script zumindest die Rule von 3Uhr bis 9 Bewegung erkannt licht an ab 9 uhr war der Melder aus und man kann den Schalter betätigen. von 10Uhr bis 20Uhr und ab 20Uhr bzw. 21Uhr ging dann der Melder an bis ca 23Uhr. und nach also 0Uhr war ruhe
Lief aucvh ohne Probleme durch.

Und in OH4. liefen alle melder gegal welche zeiten sind auch dauer betrieb.
Aber jetzt ist es mir auch klar warum

Anstadt diese codezeile

Code: Alles auswählen

if((now.getHour > 3 && now.getHour < 9) || ( now.getHour > 21 && now.getHour < 0))   
        return;
hätte ich es so machen müssen:

Code: Alles auswählen

if((now.getHour < 3 || (now.getHour > 8 && now.getHour < 21) || now.getHour > 22 )  // ab 23 Uhr bis 3 Uhr und ab 9 Uhr bis 21 Uhr kein Licht
        return;
Ja. Einfehler im Script und so nen große auswirkung.

Danke dir Udo1toni.. für das verstehen einer Logik

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

Re: Bewegungsmelder läst sich nicht per zeiten Steuern nach Update auf OH4

Beitrag von udo1toni »

Ich denke nicht, dass die Rule von oben (bzw. die dort hinterlegte Bedingung) sich unter irgendeiner Version von openHAB anders verhalten wird.

Allerdings muss man bis einschließlich openHAB2.5.12 now.getHourOfDay (Joda Time) schreiben statt now.getHour (JavaTime), weil openHAB1 auf Java6 basierte und openHAB2 auf Java8.
In Java8 stand bereits JavaTime zur Verfügung, war aber noch nicht etabliert, weshalb man zunächst noch weiter Joda Time einsetzte.
Jedoch haben die Erschaffer von Joda Time selbst ihre Bibliothek als veraltet markiert und empfohlen, in neueren Java Versionen JavaTime zu verwenden.
Hint zu den Java Versionen: openHAB setzt immer die LTS Versionen ein. Neuere Java Versionen können eventuell funktionieren, meist hakt es aber an der einen oder anderen Stelle. Ältere als die angegebene Version (also z.B. Java17 für openHAB4) können oftmals openHAB noch nicht mal starten. Es ist also sehr empfehlenswert, sich sklavisch an die korrekte Hauptversion zu halten (das ist zum Erscheinungszeitpunkt einer openHAB Version auch immer die dann aktuelle LTS Version)

Wie dem auch sei, Bool'sche Logik macht vielen Leuten Knoten in die Hirnwindungen :) da hilft es immer, die Logik in ihre kleinsten Bestandteile zu zerlegen und in Ruhe drüber nachzudenken, notfalls mit Bleistift und Papier (indem man also eine kleine Tabelle mit den Logikzuständen pro möglichem Input aufmalt)
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

Antworten