Timer greift nicht

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Antworten
SaschaQ
Beiträge: 202
Registriert: 2. Mär 2020 13:50
Answers: 0

Timer greift nicht

Beitrag von SaschaQ »

Hallo,

ich möchte wenn der Voralarm meiner Alarmanlage ausgelöst wird eine Durchsage über meine Echos ausgeben, damit man noch die Gelegenheit hat die Alarmanlage abzuschalten.

Ich habe die folgende Rule gebaut, aber irgendwie greifen die Timer nicht: Was habe ich falsch gemacht?

Code: Alles auswählen

rule "Voralarm Alarmanlage"
when
	Item au_al_interner_alarm changed to ON
	
	
then

		echo_wohnzimmer_TTS_Volume.sendCommand(70)

		createTimer(now.plusSeconds(1), [ |
		echo_wohnzimmer_TTS.sendCommand('Voralarm ausgelöst 1 Minute Zeit die Alarmanlage zu deaktivieren')
		])
			createTimer(now.plusSeconds(10), [ |
		echo_wohnzimmer_TTS.sendCommand('Voralarm ausgelöst 1 Minute Zeit die Alarmanlage zu deaktivieren')
		])
			createTimer(now.plusSeconds(10), [ |
		echo_wohnzimmer_TTS.sendCommand('Voralarm ausgelöst 1 Minute Zeit die Alarmanlage zu deaktivieren')
		])
			createTimer(now.plusSeconds(10), [ |
		echo_wohnzimmer_TTS.sendCommand('Voralarm ausgelöst 1 Minute Zeit die Alarmanlage zu deaktivieren')
		])
			createTimer(now.plusSeconds(10), [ |
		echo_wohnzimmer_TTS.sendCommand('Voralarm ausgelöst 1 Minute Zeit die Alarmanlage zu deaktivieren')
		])
			createTimer(now.plusSeconds(10), [ |
		echo_wohnzimmer_TTS.sendCommand('Voralarm ausgelöst 1 Minute Zeit die Alarmanlage zu deaktivieren')
		])
			createTimer(now.plusSeconds(10), [ |
		echo_wohnzimmer_TTS.sendCommand('Voralarm ausgelöst 1 Minute Zeit die Alarmanlage zu deaktivieren')
		])
			createTimer(now.plusSeconds(10), [ |
		echo_wohnzimmer_TTS.sendCommand('Voralarm ausgelöst 1 Minute Zeit die Alarmanlage zu deaktivieren')
		])
			createTimer(now.plusSeconds(10), [ |
		echo_wohnzimmer_TTS.sendCommand('Voralarm ausgelöst 1 Minute Zeit die Alarmanlage zu deaktivieren')
		])
			createTimer(now.plusSeconds(10), [ |
		echo_wohnzimmer_TTS.sendCommand('Voralarm ausgelöst 1 Minute Zeit die Alarmanlage zu deaktivieren')
		])
		
		
		createTimer(now.plusSeconds(3), [ |
		echo_wohnzimmer_TTS_Volume.sendCommand(25)
		])
        
  	
end






LCN-User
Beiträge: 17
Registriert: 29. Dez 2020 10:36
Answers: 1

Re: Timer greift nicht

Beitrag von LCN-User »

Hallo @SaschaQ,

hier ein einfaches Beispiel, das bei mir funktioniert (openhabian, OH3.2 auf RPi 4B):

Code: Alles auswählen

val String filename = "Test.rules"

rule "Steckdose nach 5 Sekunden für 5 Sekunden einschalten"
when
	Item TestSwitch changed to ON
then
    logInfo(filename, "Rule wird bearbeitet.")
    createTimer(now.plusSeconds(5),  [EG_EZ_ST_1.sendCommand(ON) ] )
    createTimer(now.plusSeconds(10), [EG_EZ_ST_1.sendCommand(OFF)] )
    logInfo(filename, "Rule wird beendet.")
end
Die Rule legt zwei Timer an und wird dann sofort beendet.
Nach 5 Sekunden ist dann der erste Timer abgelaufen und die Steckdose wird eingeschaltet.
Nach weiteren 5 Sekunden ist dann der zweite Timer abgelaufen und die Steckdose wird wieder ausgeschaltet.

Deine Timer zur Sprachausgabe laufen also alle gleichzeitig nach 10 Sekunden ab und nicht wie vermutlich gewünscht nach 10, 20, 30 ...
Ob es sinnvoll ist so viele Timer gleichzeitig zu erzeugen, weiß ich allerdings auch nicht.
Gutes Gelingen...

int5749
Beiträge: 1173
Registriert: 4. Nov 2019 22:08
Answers: 9

Re: Timer greift nicht

Beitrag von int5749 »

LCN-User hat geschrieben: 5. Jan 2022 11:43 hier ein einfaches Beispiel, das bei mir funktioniert (openhabian, OH3.2 auf RPi 4B):
Hmm, dieser Timer funktioniert zwar, ist aber nicht mehr zu beeinflußen. (z.B: vorzeitig beenden)
SaschaQ hat geschrieben: 5. Jan 2022 08:10 ich möchte wenn der Voralarm meiner Alarmanlage ausgelöst wird eine Durchsage über meine Echos ausgeben, damit man noch die Gelegenheit hat die Alarmanlage abzuschalten.
Also so viele Timer hintereinander .... Evtl. beschreibst Du einmal kurz, warum so viele Timer aus Deiner Sicht notwendig sind?
Was genau möchtest Du damit erreichen?

Ich pers. habe das noch nicht verstanden. Evtl. würde es ausreihen einen Timer neu zu starten, anstatt immer wieder einen neuen anzulegen?

Bedenke: Ein Timer startet und damit ist quasi sofort der Timer verlassen. Nach Ablauf wird dann der im Timer angegebene Code ausgeführt.
openHAB 4.1.0 Release mit openHABian in einem Debian Bookworm (LXC) unter Proxmox 8.1.3

EmptySoft
Beiträge: 247
Registriert: 7. Jan 2020 14:45
Answers: 2
Kontaktdaten:

Re: Timer greift nicht

Beitrag von EmptySoft »

Den Timer kannst Du mit meinTimer.cancel() unterbrechen. Dazu muss er aber vorher als Timer angelegt werden. Anbei ein Auszug aus einer Rule

Code: Alles auswählen

var Timer meinTimer = null
...
if(meinTimer)
 {
 meinTimer.cancel()
 }
...
BYe
Harald

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

Re: Timer greift nicht

Beitrag von udo1toni »

Ich gehe mal davon aus, dass Du alle zehn Sekunden eine Ausgabe haben willst. Was Du aber tust, ist, eine Menge Timer anzulegen, welche alle fast exakt gleichzeitig ablaufen. Das wurde ja schon weiter oben erläutert.
Das Ergebnis des Codes ist also: Zunächst wird die Lautstärke auf 70 erhöht. Nach einer Sekunde erfolgt eine Ansage. 9 Sekunden, nachdem die erste Ansage gestartet wurde, erfolgen innerhalb weniger Millisekunden neun weitere Ansagen.
Allerdings: Zwei Sekunden, nachdem die erste Ansage gestartet wurde, wird die Lautstärke auf 25 gesetzt.
Spätestens die neun Ansagen, die quasi zeitgleich gestartet werden, bringen das System durcheinander :) und eventuell läuft die erste Ansage erst los, wenn die Lautstärke schon wieder auf 25 gesetzt ist (der erste TTS Befehl braucht eventuell etwas länger, bis die Ausgabe startet).

Du möchtest eine Ablaufsteuerung, welche (ähnlich einem Programmschalter in einer alten Waschmaschine) einfach eine bestimmte Zeit läuft und immer wieder bestimmte Aktionen auslöst. das geht so:

Code: Alles auswählen

// globale Variablen zu Beginn der *.rules Datei definieren!
var Timer tVoralarm = null
var Integer iVoralarm = 0

rule "Voralarm Alarmanlage"
when
    Item au_al_interner_alarm changed to ON
then
    if(tVoralarm !== null)
        return;
    echo_wohnzimmer_TTS_Volume.sendCommand(70)
    iVoralarm = 0                                                                // Zähler initialisieren
    tVoralarm = createTimer(now.plusSeconds(1), [ |                              // 1. Timer nach 1 Sekunde
        iVoralarm += 1                                                           // Zähler erhöhen
        if(iVoralarm > 10) {                                                     // Falls größer 10
            tVoralarm = null                                                     // Timer löschen
            echo_wohnzimmer_TTS_Volume.sendCommand(25)                           // Lautstärke reduzieren
            return;                                                              // und raus
        }
        var myString = 'Voralarm ausgelöst. '                                    // Meldung generieren
        myString = myString + (100 - iVoralarm * 10).toString                    // Countdown
        myString = myString + ' Sekunden Zeit die Alarmanlage zu deaktivieren.'  // Meldungsende
        echo_wohnzimmer_TTS.sendCommand(myString)                                // Meldung ausgeben
        if(iVoralarm < 10)                                                       // falls Zähler kliner 10
            tVoralarm.reschedule(now.plusSeconds(10))                            // Timer erneut ausführen in 10 Sekunden
        else                                                                     // falls gleich 10 (nur das bleibt übrig)
            tVoralarm.reschedule(now.plusSeconds(3))                             // Timer erneut ausführen in 3 Sekunden
    ])
end

rule "Stop Voralarm Alarmanlage"
when
    Item au_al_interner_alarm changed to OFF
then
    tVoralarm?.cancel                                                            // Timer abbrechen, falls vorhanden
    tVoralarm = null                                                             // und Timer löschen
    echo_wohnzimmer_TTS_Volume.sendCommand(25)                                   // Lautstärke reduzieren
end





openHAB4.3.5 stable in einem Debian-Container (bookworm) (Proxmox 8.4.1, LXC), mit openHABian eingerichtet

Antworten