Motion nach x mal umschalten

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Antworten
Benutzeravatar
HiG
Beiträge: 136
Registriert: 16. Jun 2021 13:39
Answers: 0

Motion nach x mal umschalten

Beitrag von HiG »

MoinZen

ich habe mir überlegt, das ich gerne einen Motion-Sensor in der Küche nach X Auslösungen in ein längeres Timeintervall umschalten möchte. Ziel ist es...das wenn man(n) in der Küche länger aktiv ist das Timer-Intervall auf 10 Minuten zu schalten, sonst auf 3. Die Prüfung soll sich nach y Mal wieder auf 3 zurückstellen. z.B. Erstauslösung -> 3 Min., nächste Auslösung ->3 Min., nächste Auslösung ->3 Min., nächste Auslösung ->10 Min., nächste Auslösung ->10 Min., nächste Auslösung ->3 Min., usw.

Aktuell schaltet der nach genau einer Auslösung und nach 3 Minuten aus

Was hab ich bisher (ja...sind viele logInfos drin)

Code: Alles auswählen

rule "Kueche_Bewegung_an"
when
   Item I_eg_ku_bs_01_oc changed to ON
then
  if (x_eg_ku_sz_01_sw.state==ON){
    logInfo("Kueche", "Lichtszene Kochen")
  } else if (x_eg_ku_sz_02_sw.state==ON){
    logInfo("Kueche", "Lichtszene Essen")
  } else if (x_eg_ku_sz_03_sw.state==ON){
    logInfo("Kueche", "Lichtszene Kaffee")
  } else {
    logInfo("Kueche", "Bewegung erkannt")
    if(sTageslicht.state==OFF){
      x_eg_ku_sz_05_sw.sendCommand(ON)
      logInfo("Kueche", "Abend")
      if(kitchenTimer === null) {
        logInfo("Kueche", "Warte 3 Minuten")
        kitchenTimer = createTimer(now.plusMinutes(3), [|
                                   kitchenTimer = null
                                   logInfo("Kueche", "Nach 3 Minuten")
                                   x_eg_ku_sz_05_sw.sendCommand(OFF)
                                   logInfo("Kueche", "Aus")
        ])
      }else {
        logInfo("Kueche", "tagsueber")
      }
    }
  }
end
Die unterschiedlichen Lichtszenen muss ich noch implementieren. Der Timer ist "global" definiert

Ich hab schon an

Code: Alles auswählen

bewegungTimer.reschedule(now.plusMinutes(timeoutMinutes ))
gedacht...aber keinen Plan wie ich

1. einen "globalen" Counter definieren kann (var Number counter=0 im Header der Rule klappt nicht)
2. wo ich das reschedule einbaue
3. wie ich diese Umschaltung hinbekomme. Evtl. mit 2 "globalen" Countern und 1 Boolean?!

Vielleicht habt ihr ja ein paar Ideen?

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

Re: Motion nach x mal umschalten

Beitrag von udo1toni »

So, wie Deine Rule programmiert ist, geht das Licht ja auf jeden Fall zwischendrin aus. Soll das so sein?
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

Benutzeravatar
HiG
Beiträge: 136
Registriert: 16. Jun 2021 13:39
Answers: 0

Re: Motion nach x mal umschalten

Beitrag von HiG »

Aktuell...ist das so. Wenn ich abends im Wohnzimmer sitze und nur mal nen Bier aus dem Kühlschrank hole...dann sol es schon nur kurz angehen.

Aber ich habe letztes Wochenende festgestellt....wenn man in der Küche sitzt und Spiele spielt...dann nervt es etwas wenn alle 3 Minuten das Licht ausgeht ;-) Deshalb möchte ich ja die Intervalle selbstveränderbar haben (und später evtl. noch von anderen Dingen abhängig).

Wie ich schon schrieb....globale Variable als Counter klappt nicht.

Ich hab in der Rule oben

Code: Alles auswählen

var Number count=0
definiert.

Wenn ich mir den Wert aber in der Rule über

Code: Alles auswählen

count=count+1
logInfo("Test",count.toString)
verändern und ausgeben lassen möchte...kommt

Code: Alles auswählen

 Cannot assign a value in null context.

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

Re: Motion nach x mal umschalten

Beitrag von udo1toni »

Nein, Du gehst falsch an das Problem heran :) Du musst die Rule nur so programmieren, dass das Licht nur dann ausgeht, wenn zwischendurch keine weiteren Trigger herein kommen.

Die Rule muss bei Bewegung prüfen, ob der Timer existiert und diesen gegebenenfalls zurücksetzen.

Hier mal eine Variation Deiner Rule, die besser funktionieren sollte:

Code: Alles auswählen

rule "Küche Bewegung an"
when
    Item I_eg_ku_bs_01_oc received update ON
then
    logInfo("Kueche", "Bewegung erkannt")
    if(x_eg_ku_sz_01_sw.state==ON){
        logInfo("Kueche", "Lichtszene Kochen")
        return;
    }
    if(x_eg_ku_sz_02_sw.state==ON){
        logInfo("Kueche", "Lichtszene Essen")
        return;
    }
    if(x_eg_ku_sz_03_sw.state==ON){
        logInfo("Kueche", "Lichtszene Kaffee")
        return;
    }
    if(sTageslicht.state==ON){
        logInfo("Kueche", "tagsüber")
        return;
    }
    logInfo("Kueche", "Abend")
    if(kitchenTimer === null) {
        x_eg_ku_sz_05_sw.sendCommand(ON)
        logInfo("Kueche", "Warte 3 Minuten")
        kitchenTimer = createTimer(now.plusMinutes(3), [|
            logInfo("Kueche", "Nach 3 Minuten")
            x_eg_ku_sz_05_sw.sendCommand(OFF)
            logInfo("Kueche", "Aus")
            kitchenTimer = null
        ])
    } else {
        kitchenTimer.reschedule(now.plusMinutes(3))
    }
end
Der Trigger "received update ON" ist hier der Trick, um die Rule bei jeder Erkennung von Bewegung zu triggern (also auch, falls der Melder zwischendurch kein OFF sendet).
Die Abbruchbedingungen habe ich etwas umgebaut, insbesondere die Abbruchbedingung für den Tag ist nach vorne gewandert. Da die Rule durch return; unmittelbar abbricht, kann man auf das else jeweils verzichten.
Das Licht muss nur eingeschaltet werden, wenn der Timer noch nicht existiert, denn ansonsten wurde das Licht ja schon eingeschaltet.
Falls der Timer existiert, wird der Zeitpunkt der Ausführung einfach verschoben.
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

Benutzeravatar
HiG
Beiträge: 136
Registriert: 16. Jun 2021 13:39
Answers: 0

Re: Motion nach x mal umschalten

Beitrag von HiG »

Super :idea: Danke schön. Ich werde das mal probieren

Antworten