Seite 2 von 4
Re: OH3 Timer
Verfasst: 8. Nov 2021 21:52
von peter-pan
Also, da waren beim "schnell, schnell ein paar Logs" ein paar Klammern zu wenig. Und es war noch eine kleine Nachbesserung an der Bedingung
notwendig. Da hat das "
.getValue" gefehlt. Was natürlich auch noch unbedingt sein muss, ist die
Timer-Variable am Anfang deiner .rules-Datei steht
Da mir die Items fehlen, konnte ich nur bedingt testen.
Also noch ein Versuch:
Code: Alles auswählen
var Timer tAuto = null
rule "Timer Beduftung starten jetzt"
when
Time cron "0 0 6 ? * MON-FRI" or // Montag bis Freitag 14 Uhr
Time cron "0 0 12 ? * SAT,SUN" or // Samstag und Sonntag 12 Uhr
Item Beduftunghauptschalter received command ON // Hauptschalter wurde geschaltet
then
var Integer iStart = 14 // Startzeitvariable
if(now.getDayOfWeek.getValue > 5) iStart = 12 // Falls Wochenende
if((receivedCommand === null && Beduftunghauptschalter.state != ON)
|| (receivedCommand == ON && now.plusHours(3).getHour <= iStart + 2)) { // Siehe Text
logInfo("Beduftung","Regel abgebrochen")
return;
}
tAuto?.cancel // eventuell vorhandenen Timer entfernen
tAuto = createTimer(now.plusNanos(10000000), [| // Timer initialisieren
logInfo("Beduftung","Timer initialisiert")
if(Beduftung_An_Aus.state != ON) { // Falls Beduftung aus
var Integer iOnTime = 10 // Default ON-Zeit
if(Beduftung_Timer_Anzeit.state instanceof Number) // falls gültiger Wert
iOnTime = (Beduftung_Timer_Anzeit.state as Number).intValue // übernimm ON-Zeit aus Item
Beduftung_An_Aus.sendCommand(ON) //Beduftung an
tAuto.reschedule(now.plusSeconds(iOnTime)) // Timer bis zum erneuten Ausschalten
} else { // ansonsten
var Integer iOffTime = 290 // Default OFF-Zeit
if(Beduftung_Timer_Auszeit.state instanceof Number) // falls gültiger Wert
iOffTime = (Beduftung_Timer_Auszeit.state as Number).intValue // übernimm OFF-Zeit aus Item
Beduftung_An_Aus.sendCommand(OFF) // Beduftung aus
tAuto.reschedule(now.plusSeconds(iOffTime)) // Timer bis zum erneuten Einschalten
}
])
end
Ich hoffe das klappt besser. Und beim Speichern der Rule unbedingt darauf achten, dass die Info, wie von Udo beschrieben, auch kommt.
Was mir auch noch aufgefallen ist, ist das da eine Fehlermeldung für "timer-3" und "timer-1" kommt. Da passt also noch was nicht.
Re: OH3 Timer
Verfasst: 9. Nov 2021 07:51
von hulda
Hallo,
also das ist der letzte Stand.
Die Regel wird richtig geladen.
Wenn ich den Hauptschalter ein schalte kommt: " logInfo("Beduftung","Regel abgebrochen")"
Code: Alles auswählen
var Timer tAuto = null
rule "Timer Beduftung starten jetzt"
when
Time cron "0 0 6 ? * MON-FRI" or // Montag bis Freitag 14 Uhr
Time cron "0 0 12 ? * SAT,SUN" or // Samstag und Sonntag 12 Uhr
Item Beduftunghauptschalter received command ON // Hauptschalter wurde geschaltet
then
var Integer iStart = 14 // Startzeitvariable
if(now.getDayOfWeek.getValue > 5) iStart = 12 // Falls Wochenende
if((receivedCommand === null && Beduftunghauptschalter.state != ON)
|| (receivedCommand == ON && now.plusHours(3).getHour <= iStart + 2)) { // Siehe Text
logInfo("Beduftung","Regel abgebrochen")
return;
}
tAuto?.cancel // eventuell vorhandenen Timer entfernen
tAuto = createTimer(now.plusNanos(10000000), [| // Timer initialisieren
logInfo("Beduftung","Timer initialisiert")
if(Beduftung_An_Aus.state != ON) { // Falls Beduftung aus
var Integer iOnTime = 10 // Default ON-Zeit
if(Beduftung_Timer_Anzeit.state instanceof Number) // falls gültiger Wert
iOnTime = (Beduftung_Timer_Anzeit.state as Number).intValue // übernimm ON-Zeit aus Item
Beduftung_An_Aus.sendCommand(ON) //Beduftung an
tAuto.reschedule(now.plusSeconds(iOnTime)) // Timer bis zum erneuten Ausschalten
} else { // ansonsten
var Integer iOffTime = 290 // Default OFF-Zeit
if(Beduftung_Timer_Auszeit.state instanceof Number) // falls gültiger Wert
iOffTime = (Beduftung_Timer_Auszeit.state as Number).intValue // übernimm OFF-Zeit aus Item
Beduftung_An_Aus.sendCommand(OFF) // Beduftung aus
tAuto.reschedule(now.plusSeconds(iOffTime)) // Timer bis zum erneuten Einschalten
}
])
end
rule "Timer Beduftung stoppen"
when
Time cron "0 0 21 * * ?" or // täglich um 21 Uhr
Item Beduftunghauptschalter received command OFF // Hauptschalter wurde geschaltet
then
Beduftung_An_Aus.sendCommand(OFF) // Beduftung abschalten
tAuto?.cancel // und Timer stopppen
end
Re: OH3 Timer
Verfasst: 9. Nov 2021 09:03
von peter-pan
hulda hat geschrieben: ↑9. Nov 2021 07:51
Die Regel wird richtig geladen.
Wenn ich den Hauptschalter ein schalte kommt: " logInfo("Beduftung","Regel abgebrochen")"
Das ist ja schon mal nicht schlecht. Die Meldung bedeutet, dass deine Bedingungen nicht erfüllt sind und deshalb die Regel abgebrochen wird.
Bedingung:
Code: Alles auswählen
if((receivedCommand === null && Beduftunghauptschalter.state != ON)
|| (receivedCommand == ON && now.plusHours(3).getHour <= iStart + 2)) {
logInfo("Beduftung","Regel abgebrochen")
return;
Der Beduftungsschalter ist zwar an, aber es ist halt noch nicht 16 Uhr (iStart + 2). So verstehe ich das. Du könntest zum testen eventuell mal das "istart + 2" einfach mal durch einen Wert (z.B.: 8) ersetzen.
Edit: Oder die Variable iStart auf 6

Re: OH3 Timer
Verfasst: 9. Nov 2021 14:14
von hulda
Es läuft!!!
Vielen Dank!!!
Re: OH3 Timer
Verfasst: 9. Nov 2021 17:44
von peter-pan
Gerne.
Wenn du die Logs nicht mehr brauchst oder haben willst, kannst du sie einfach auskommentieren.
Re: OH3 Timer
Verfasst: 5. Jan 2023 11:20
von hulda
Hallo zusammen,
ich muß mal das Thema wieder hoch holen.
Wieso setzt der Timer immer wieder aus ?
Immer nach der gleichen Zeit egal auf welche Zeit der Timer eingestellt ist.
Code: Alles auswählen
var Timer tAuto = null
rule "Timer Beduftung starten jetzt"
when
Time cron "0 0 6 ? * MON-FRI" or // Montag bis Freitag 14 Uhr
Time cron "0 0 12 ? * SAT,SUN" or // Samstag und Sonntag 12 Uhr
Item Beduftunghauptschalter received command ON or // Hauptschalter wurde geschaltet
Item KWL_Wochenprogrammhauptschalter received command ON or //Kalender Hauptschalter
Item KWL_Manuell changed //Lüftungszustand
then
var Integer iStart = 7 // Startzeitvariable
if(now.getDayOfWeek.getValue > 5) iStart = 12 // Falls Wochenende
if((receivedCommand === null && Beduftunghauptschalter.state != ON)
|| (receivedCommand == ON && now.plusHours(3).getHour <= iStart + 2) )
{
logInfo("Beduftung","Regel abgebrochen")
return;
}
if (Beduftunghauptschalter.state != ON || KWL_Manuell.state !=0 || KWL_Wochenprogrammhauptschalter.state != ON)
{ // Siehe Text
logInfo("Beduftung","Regel abgebrochen nicht alle Zustände")
return;
}
tAuto?.cancel // eventuell vorhandenen Timer entfernen
tAuto = createTimer(now.plusNanos(10000000), [| // Timer initialisieren
logInfo("Beduftung","Timer initialisiert")
if(Beduftungtempswitch.state != ON) { // Falls Beduftung aus
var Integer iOnTime = 10 // Default ON-Zeit
if(Beduftung_Timer_Anzeit.state instanceof Number) // falls gültiger Wert
iOnTime = (Beduftung_Timer_Anzeit.state as Number).intValue // übernimm ON-Zeit aus Item
Beduftungtempswitch.sendCommand(ON)
logInfo("beduftung", "switch=" + Beduftungtempswitch)
tAuto.reschedule(now.plusSeconds(iOnTime))
logInfo("Beduftung","Timer Anzeit") // Timer bis zum erneuten Ausschalten
} else { // ansonsten
var Integer iOffTime = 290 // Default OFF-Zeit
if(Beduftung_Timer_Auszeit.state instanceof Number) // falls gültiger Wert
iOffTime = (Beduftung_Timer_Auszeit.state as Number).intValue // übernimm OFF-Zeit aus Item
Beduftungtempswitch.sendCommand(OFF)
logInfo("beduftung", "switch=" + Beduftungtempswitch)
// Beduftung_An_Aus_on_off.postUpdate(0) // Beduftung aus
tAuto.reschedule(now.plusSeconds(iOffTime))
logInfo("Beduftung","Timer Auszeit") // Timer bis zum erneuten Einschalten
}
])
end
rule "Timer Beduftung Test stoppen"
when
Time cron "0 0 21 * * ?" or // täglich um 21 Uhr
Item Beduftunghauptschalter received command OFF or // Hauptschalter wurde geschaltet
Item KWL_Manuell received update 1 or //Lüftung OG steht auf manuell aus
Item KWL_Wochenprogrammhauptschalter received command OFF //ist der Hauptschalter an oder der Kalenderbefehl kommt
then
if(Beduftunghauptschalter.state != ON || KWL_Manuell.state == 1 || KWL_Wochenprogrammhauptschalter.state != ON)
{
logInfo("Beduftung","Regel abgebrochen nicht alle Zustaende erreicht stoppen")
if((Beduftunghauptschalter.state != OFF) || (KWL_Manuell.state == 1 ))
}
Beduftungtempswitch.sendCommand(OFF) // Beduftung abschalten
tAuto?.cancel // und Timer stopppen
end
Vielen Dank für eure Hilfe
Gruß Dirk
Re: OH3 Timer
Verfasst: 5. Jan 2023 14:18
von int5749
Hi,
auch wenn für mich auch dem Graphen nicht ersichtlich ist, nach welcher Zeit der Timer beendet wird, nehme ich an, dass es die default Zeiten sind?
Ich würde mal ein Logging bei dem setzen der neuen Zeiten einbauen, ober der neue Werte auch wirklich in iOffTime und iOnTime übernommen wird? Oder was sagt denn das Log dazu? Wenn es einen Fehler gibt, sollte dieser dort auch aufgeführt sein.
Viele Grüße
Re: OH3 Timer
Verfasst: 5. Jan 2023 15:23
von hulda
Das ist das Log:
die zeiten sind unverändert auf 1 s an und 1s aus . Aber nach irgendeiner Zeit kommt 2 mal hintereinander OFF oder ON
aber warum?
- 2023-01-05 15:18:28.264 [INFO ] [.openhab.core.model.script.beduftung] - switch=Beduftungtempswitch (Type=SwitchItem, State=OFF, Label=null, Category=null)
2023-01-05 15:18:28.265 [INFO ] [.openhab.core.model.script.Beduftung] - Timer Auszeit
2023-01-05 15:18:29.275 [INFO ] [.openhab.core.model.script.Beduftung] - Timer initialisiert
2023-01-05 15:18:29.276 [INFO ] [.openhab.core.model.script.beduftung] - switch=Beduftungtempswitch (Type=SwitchItem, State=ON, Label=null, Category=null)
2023-01-05 15:18:29.276 [INFO ] [.openhab.core.model.script.Beduftung] - Timer Anzeit
2023-01-05 15:18:30.295 [INFO ] [.openhab.core.model.script.Beduftung] - Timer initialisiert
2023-01-05 15:18:30.308 [INFO ] [.openhab.core.model.script.beduftung] - switch=Beduftungtempswitch (Type=SwitchItem, State=OFF, Label=null, Category=null)
2023-01-05 15:18:30.314 [INFO ] [.openhab.core.model.script.Beduftung] - Timer Auszeit
2023-01-05 15:18:31.322 [INFO ] [.openhab.core.model.script.Beduftung] - Timer initialisiert
2023-01-05 15:18:31.330 [INFO ] [.openhab.core.model.script.beduftung] - switch=Beduftungtempswitch (Type=SwitchItem, State=ON, Label=null, Category=null)
2023-01-05 15:18:31.332 [INFO ] [.openhab.core.model.script.Beduftung] - Timer Anzeit
2023-01-05 15:18:32.350 [INFO ] [.openhab.core.model.script.Beduftung] - Timer initialisiert
2023-01-05 15:18:32.360 [INFO ] [.openhab.core.model.script.beduftung] - switch=Beduftungtempswitch (Type=SwitchItem, State=OFF, Label=null, Category=null)
2023-01-05 15:18:32.361 [INFO ] [.openhab.core.model.script.Beduftung] - Timer Auszeit
2023-01-05 15:18:33.371 [INFO ] [.openhab.core.model.script.Beduftung] - Timer initialisiert
2023-01-05 15:18:33.373 [INFO ] [.openhab.core.model.script.beduftung] - switch=Beduftungtempswitch (Type=SwitchItem, State=OFF, Label=null, Category=null)
2023-01-05 15:18:33.377 [INFO ] [.openhab.core.model.script.Beduftung] - Timer Anzeit
2023-01-05 15:18:34.374 [INFO ] [.openhab.core.model.script.Beduftung] - Timer initialisiert
2023-01-05 15:18:34.376 [INFO ] [.openhab.core.model.script.beduftung] - switch=Beduftungtempswitch (Type=SwitchItem, State=ON, Label=null, Category=null)
2023-01-05 15:18:34.377 [INFO ] [.openhab.core.model.script.Beduftung] - Timer Auszeit
2023-01-05 15:18:35.386 [INFO ] [.openhab.core.model.script.Beduftung] - Timer initialisiert
2023-01-05 15:18:35.388 [INFO ] [.openhab.core.model.script.beduftung] - switch=Beduftungtempswitch (Type=SwitchItem, State=OFF, Label=null, Category=null)
2023-01-05 15:18:35.389 [INFO ] [.openhab.core.model.script.Beduftung] - Timer Anzeit
2023-01-05 15:18:36.402 [INFO ] [.openhab.core.model.script.Beduftung] - Timer initialisiert
2023-01-05 15:18:36.405 [INFO ] [.openhab.core.model.script.beduftung] - switch=Beduftungtempswitch (Type=SwitchItem, State=ON, Label=null, Category=null)
2023-01-05 15:18:36.407 [INFO ] [.openhab.core.model.script.Beduftung] - Timer Auszeit
2023-01-05 15:18:37.437 [INFO ] [.openhab.core.model.script.Beduftung] - Timer initialisiert
2023-01-05 15:18:37.444 [INFO ] [.openhab.core.model.script.beduftung] - switch=Beduftungtempswitch (Type=SwitchItem, State=ON, Label=null, Category=null)
2023-01-05 15:18:37.446 [INFO ] [.openhab.core.model.script.Beduftung] - Timer Anzeit
Re: OH3 Timer
Verfasst: 5. Jan 2023 19:33
von int5749
Ok, dort ist kein Fehler gelogged. Seltsam, aber erst mal OK.
Ändere mal die Zeile:
nach
Code: Alles auswählen
logInfo("Beduftung","Timer Anzeit: " + iOnTime.state as Number)
Natürlich genauso für OffTime, damit die Werte im Log sind, wie der Timer laufen müsste.
Wenn die Werte nicht richtig übergeben werden, wird dies auch transparent!
Re: OH3 Timer
Verfasst: 5. Jan 2023 19:42
von udo1toni
Grundsätzlich sehe ich erst mal keinen Fehler im Code des Timers, wobei mir noch nicht ganz klar ist, was die Steuerung vorne macht, aber das hat ja mit dem Problem erst mal nur am Rande zu tun.
Dennoch möchte ich den Timer Code leicht abgewandelt anbieten:
Code: Alles auswählen
tAuto = createTimer(now.plusNanos(10000000), [| // Timer initialisieren
var Integer iOnTime = 10 // Default ON-Zeit
if(Beduftung_Timer_Anzeit.state instanceof Number) // falls gültiger Wert
iOnTime = (Beduftung_Timer_Anzeit.state as Number).intValue // übernimm ON-Zeit aus Item
var Integer iOffTime = 290 // Default OFF-Zeit
if(Beduftung_Timer_Auszeit.state instanceof Number) // falls gültiger Wert
iOffTime = (Beduftung_Timer_Auszeit.state as Number).intValue // übernimm OFF-Zeit aus Item
logInfo("Beduftung","Timer initialisiert - iOnTime = {}, iOffTime = {}",iOnTime,iOffTime) // gewählte Zeiten ausgeben
val Soll = if(Beduftungtempswitch.state != ON) ON else OFF // Nächster Zustand
val SollTime = if(Soll == ON) iOnTime else iOffTime // nächste Zeit
val SollLog = if(Soll == ON) "n" else "us" // Teilstring für Meldung
Beduftungtempswitch.sendCommand(Soll.toString) // Befehl absetzen
logInfo("beduftung", "Timer A{}zeit {}", SollLog, SollTime) // loggen
tAuto.reschedule(now.plusSeconds(iOnTime)) // Timer erneut planen
])
Hauptunterschiede:
- Die Initialisierung läuft immer vollständig. Dafür werden die Zeiten auch direkt geloggt.
- Der neue Zustand wird abhängig vom aktuellen Zustand berechnet.
- Davon abhängig wird die Zeit ausgewählt und ein Teilstring gesetzt.
- Der Schalter wird gesetzt und passend dazu die Meldung generiert
- Der Timer wird erneut geplant.
Grundsätzlich sollte ein Wechsel im Sekundentakt locker funktionieren, allerdings könnte es Seiteneffekte geben, die dazu führen, dass der Schaltbefehl zu spät ausgeführt wird. auch daran denken: Der Status eines Items wird gewöhnlich vom verknüpften Channel geliefert. Sollte dieses Gerät Probleme damit haben, einmal pro Sekunde geschaltet zu werden, wäre im Ergebnis dasselbe Holpern zu sehen. Mein erster Vorschalg wäre also (eben um dieses Risiko zu minimieren) eine längere Zeit zu wählen, z.B. zwei Sekunden.
Die zweite Rule (die zum Abschalten) hat einen schwerwiegenden Fehler (if ohne nachfolgenden Befehl), es irritiert mich etwas, dass diese Rule nicht zu einem entsprechenden Fehler führt.