Bewegungsmelder - Timer

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Antworten
JPH
Beiträge: 34
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: 226
Registriert: 11. Aug 2019 06:39
Answers: 4

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: 34
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: 432
Registriert: 17. Jun 2019 16:45
Answers: 1
Wohnort: Griesheim

Re: Bewegungsmelder - Timer

Beitrag von KellerK1nd »

Code: Alles auswählen

 var Timer Elternbad_Timer = null
So sollte die Variable aussehen.
Betriebssystem: Proxmox 7.3-4
openHAB Container: debian11 LXC
openHAB Version: 3.4
Hardware: HomeServer Eigenbau mit einem Intel i5 9600K
Smarthome-Equipment:
- Rasperrymatic
- deConz
- HUE
- Shellys
- Mosquitto
- AVM Fritz!Box

Benutzeravatar
udo1toni
Beiträge: 13864
Registriert: 11. Apr 2018 18:05
Answers: 222
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.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

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

Re: Bewegungsmelder - Timer

Beitrag von JPH »

Super! Klappt jetzt alles. Dankeschön

Thor4x
Beiträge: 9
Registriert: 3. Jan 2021 13:53

Re: Bewegungsmelder - Timer

Beitrag von Thor4x »

Hallo zusammen,

ich habe ein ähnliches Vorhaben und die Regel vermeintlich auch schon fertig.

Ich beschreibe kurz, was beabsichtigt ist:
Manchmal wird vergessen, im Badezimmer die Heizung wieder auszuschalten. Ich will daher, dass die Heizung spätestens 2 Stunden nachdem sie angeschaltet wurde, wieder ausgeschaltet wird.
Sie soll aber nur dann ausgeschaltet werden, wenn sie ununterbrochen seit dem 1. Anschalten noch lief (weshalb ich den Timer im Else-Zweig zurücksetze falls es einen gibt).

Code: Alles auswählen

rule "Heizung im Badezimmer nach 2 Stunden ausschalten"
when 
	Item HEIZ_SET_Badezimmer changed		// Wenn sich der Wert des Badezimmer-Thermostats ändert
then
	if (HEIZ_SET_Badezimmer.state > 10) {		// Falls Thermostat auf > 10 Grad C. eingestellt
		Badezimmer_Timer = createTimer(now.plusMinutes(120), [|	// Dann starte einen 120-Minuten Timer
		HEIZ_SET_Badezimmer.sendCommand(5)	// Setze nach Timerablauf die Temperatur wieder auf 5 Grad C.
		])
	}
	else (HEIZ_SET_Badezimmer.state <= 10) {	// Falls Thermostat auf <= 10 Grad C. eingestellt
		Badezimmer_Timer?.cancel		// Dann lösche den Timer falls vorhanden
	}
end
Was denkt ihr, passt das so?

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

Re: Bewegungsmelder - Timer

Beitrag von udo1toni »

Ja und nein. Grundsätzlich sieht die Regel erst mal gut aus, allerdings musst Du auch wenn Du den Timer anlegst, sicherstellen, dass der Timer nicht schon existiert. Die Rule kann also erheblich vereinfacht werden:

Code: Alles auswählen

rule "Heizung im Badezimmer nach 2 Stunden ausschalten"
when 
    Item HEIZ_SET_Badezimmer changed                            // Wenn sich der Wert des Badezimmer-Thermostats ändert
then
    Badezimmer_Timer?.cancel                                    // lösche den Timer falls vorhanden
    if (HEIZ_SET_Badezimmer.state > 10)                         // Falls Thermostat auf > 10 Grad C. eingestellt
        Badezimmer_Timer = createTimer(now.plusMinutes(120), [|	// Dann starte einen 120-Minuten Timer
            HEIZ_SET_Badezimmer.sendCommand(5)	                // Setze nach Timerablauf die Temperatur wieder auf 5 Grad C.
        ])
end
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

Thor4x
Beiträge: 9
Registriert: 3. Jan 2021 13:53

Re: Bewegungsmelder - Timer

Beitrag von Thor4x »

Ja, das macht Sinn. Danke für deine Korrektur!

Antworten