Seite 1 von 1

Motion nach x mal umschalten

Verfasst: 12. Feb 2022 08:36
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?

Re: Motion nach x mal umschalten

Verfasst: 12. Feb 2022 21:48
von udo1toni
So, wie Deine Rule programmiert ist, geht das Licht ja auf jeden Fall zwischendrin aus. Soll das so sein?

Re: Motion nach x mal umschalten

Verfasst: 13. Feb 2022 09:48
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.

Re: Motion nach x mal umschalten

Verfasst: 13. Feb 2022 14:35
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.

Re: Motion nach x mal umschalten

Verfasst: 14. Feb 2022 18:43
von HiG
Super :idea: Danke schön. Ich werde das mal probieren