Bewegungsmelder - Timer

Alle Infos und Tipps speziell zu openHAB 2

Moderatoren: seppy, udo1toni

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

Bewegungsmelder - Timer

Beitrag von JPH » 11. Okt 2019 15:19

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: 89
Registriert: 11. Aug 2019 06:39

Re: Bewegungsmelder - Timer

Beitrag von eiGelbGeek » 11. Okt 2019 17:54

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: 9
Registriert: 20. Jun 2019 23:38

Re: Bewegungsmelder - Timer

Beitrag von JPH » 11. Okt 2019 21:11

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.

KellerK1nd
Beiträge: 4
Registriert: 17. Jun 2019 16:45

Re: Bewegungsmelder - Timer

Beitrag von KellerK1nd » 11. Okt 2019 22:19

Code: Alles auswählen

 var Timer Elternbad_Timer = null
So sollte die Variable aussehen.

Benutzeravatar
udo1toni
Beiträge: 1788
Registriert: 11. Apr 2018 18:05
Wohnort: Darmstadt

Re: Bewegungsmelder - Timer

Beitrag von udo1toni » 11. Okt 2019 23:43

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: 9
Registriert: 20. Jun 2019 23:38

Re: Bewegungsmelder - Timer

Beitrag von JPH » 13. Okt 2019 09:24

Super! Klappt jetzt alles. Dankeschön

Antworten

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 2 Gäste