Bewegungsmelder - Timer

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Antworten
JPH
Beiträge: 14
Registriert: 20. Jun 2019 23:38

Bewegungsmelder - Timer

Beitrag von JPH »

Moin,

ich habe "eigentlich" eine sehr einfache und auch wahrscheinlich alltägliche Anforderung.

Ein Bewegungsmelder soll bei Bewegung Lampen einschalten
Nach 6 Minuten soll die Lampe wieder ausgestellt werden, es sei denn es gab weitere Bewegungen. Sollte es weitere Bewegungen geben, dann wird die Zeit einfach wieder verlängert und wieder auf 6 Minuten gestellt.

Code: Alles auswählen


var Elternbad_Timer = null


rule "Bewegungsmelder ElternBad"
   when 
      Item ElternBadBewegung received command ON 
   then	
   {
      LCNElternbad.sendCommand("ON")

      if	(Elternbad_Timer === null)	
      {
	      Elternbad_Timer = createTimer(now.plusSeconds(360)) 
         [| sendCommand (LCNElternbad, OFF) Elternbad_Timer = null]
	   }	
      else	
      { 
         Elternbad_Timer.reschedule(now.plusSeconds(360))	
      }

Leider erhalte ich bei dem Befehl: Elternbad_Timer.reschedule(now.plusSeconds(60)) folgende Fehlermeldung:

"message": "The method reschedule(DateTime) is undefined for the type Object" bei der Zeile Elternbad_Timer.reschedule(now.plusSeconds(360))

Hat jemand eine Erklärung? Oder ist der Ansatz vom Grundsatz schon falsch? Für eine Hilfe wäre ich sehr dankbar.

eiGelbGeek
Beiträge: 180
Registriert: 11. Aug 2019 06:39
Answers: 3

Re: Bewegungsmelder - Timer

Beitrag von eiGelbGeek »

Irgendwie fehlt da was an Code ..... und wofür ist die { nach then ?

Im Timer sitzt eine Klammer ) falsch

Versuche es mal so :-)

Code: Alles auswählen

var Elternbad_Timer = null

rule "Bewegungsmelder ElternBad"
when 
  Item ElternBadBewegung received command ON 
then	
  LCNElternbad.sendCommand("ON")
  if (Elternbad_Timer === null) {
    Elternbad_Timer = createTimer(now.plusMinutes(6)[|
      sendCommand (LCNElternbad, OFF) 
      Elternbad_Timer = null
    ])
  } else {
      Elternbad_Timer.reschedule(now.plusMinutes(6))
  }
end

JPH
Beiträge: 14
Registriert: 20. Jun 2019 23:38

Re: Bewegungsmelder - Timer

Beitrag von JPH »

Hm,

habe ich natürlich gleich umgesetzt..... :-)

Allerdings bekomme ich jetzt noch mehr Fehlermeldungen:
Elternbad_Timer = createTimer(now.plusMinutes(6)
--> "message": "Invalid number of arguments. The method createTimer(AbstractInstant, Procedure0) is not applicable for the arguments (DateTime)"
--> "message": "Invalid number of arguments. The method plusMinutes(int) is not applicable for the arguments (int,()=>Object)"

Elternbad_Timer.reschedule(now.plusMinutes(6))
--> "message": "The method reschedule(DateTime) is undefined for the type Object",

Es scheint irgendwie an der Variablenanlage zu liegen.

Benutzeravatar
KellerK1nd
Beiträge: 60
Registriert: 17. Jun 2019 16:45
Wohnort: Griesheim

Re: Bewegungsmelder - Timer

Beitrag von KellerK1nd »

Code: Alles auswählen

 var Timer Elternbad_Timer = null
So sollte die Variable aussehen.
openHAB 2.5.1 auf Debian Buster

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

Re: Bewegungsmelder - Timer

Beitrag von udo1toni »

Ein paar Hinweise hierzu:
  • Sollte LCNElternbad ein Switch Item sein, so solltest Du besser OnOffType verwenden (das heißt, weg mit den Anführungszeichen)
  • Bitte verwende bevorzugt die Methode Item.sendCommand(Befehl) anstatt der Action sendCommand(Item,Befehl)
    Die Action kann nur mit Strings umgehen (Objekte werden automatisch als String interpretiert, wenn dies möglich ist), sobald Du mit Primitives arbeitest, wird es zu Problemen kommen. Die Methode kann alle sinnvollen Datentypen verarbeiten (vom Itemtyp abhängig).
  • Timer.reschedule() funktioniert nur, solange der Timer noch nicht abgelaufen ist (bzw. solange das Lambda noch nicht ausgeführt wurde). Normalerweise sollte das kein Problem sein, man sollte das aber im Hinterkopf behalten, falls die Rules (insbesondere das Lambda) komplexer werden.
Eine Variante der Rule:

Code: Alles auswählen

var Timer Elternbad_Timer = null

rule "Bewegungsmelder ElternBad"
when 
    Item ElternBadBewegung received command ON 
then	
    LCNElternbad.sendCommand(ON)
    Elternbad_Timer?.cancel
    Elternbad_Timer = createTimer(now.plusMinutes(6), [|
        LCNElternbad.sendCommand(OFF) 
    ])
end
Der Timer wird gelöscht, falls er existiert und anschließend mit neuer Startzeit wieder angelegt. In diesem Fall spielt der Zustand der Variablen keine Rolle mehr.

JPH
Beiträge: 14
Registriert: 20. Jun 2019 23:38

Re: Bewegungsmelder - Timer

Beitrag von JPH »

Super! Klappt jetzt alles. Dankeschön

Antworten