Seite 6 von 6

Re: Timer Ablauf

Verfasst: 8. Feb 2022 15:17
von udo1toni
Ich sehe das Problem... Die Rule, welche die Zeit für den Timer ändert, läuft, aber währenddessen endet der Timer und läuft selbst. Das Timing ist so ungünstig, dass der Timer noch den alten Wert im Item vorfindet und entsprechend auch nutzt.
Was mich allerdings etwas verwundert, ist, warum der Timer nicht dennoch neu geplant wird. Hast Du wirklich alle Vorkommen des Loggers org.openhab.core.model.script.charge angezeigt, oder hast Du nur die erwarteten Zeiten angeschaut? In frontail kannst Du gezielt nach Schlüsselworten filtern :), von der Kommandozeile aus geht es sogar noch bequemer.

Re: Timer Ablauf

Verfasst: 8. Feb 2022 16:40
von shuo
Hi Udo. Ich hatte bereits "großzügig" gefiltert. Anbei noch ein kompletter Auszug auch mit allen "tMyTimer already scheduled, abort Rule"
charge.txt

Re: Timer Ablauf

Verfasst: 9. Feb 2022 00:56
von udo1toni
Ja, das ist es... Manchmal muss man das große Ganze sehen, um ein Detail zu erkennen...

Man sehr schön sehen, dass zunächst der Timer endet (z.B. 14:03:43) und unmittelbar tSched ausliest. ziemlich genau zu dem Zeitpunkt wird auch die erste Abfrage gestartet, welche in einem Log um 14:03:54 mündet. In der Zwischenzeit hat die timespan Rule nSoll und auch das zugehörige Item verstellt. Der Timer wurde erneut geplant. Der Timer-Code läuft zu diesem Zeitpunkt aber noch und die zweite Abfrage braucht auch noch mal 4 Sekunden. Anschließend plant sich der Timer selbst erneut ein, die Zeit ist aber die von vor 14 Sekunden...

Die Lösung ist deshalb denkbar einfach:
Verschiebe die Zeile

Code: Alles auswählen

val tSched = if(myTime.state instanceof Number) (myTime.state as Number).intValue else 0                   // Zykluszeit in Minuten
unmittelbar vor das if(tSched > 0), seiht dann so aus:

Code: Alles auswählen

    tMyTimer = createTimer(now.plusSeconds(1), [|                                                                  // Timer anlegen und gleich starten
        val results_status = executeCommandLine(Duration.ofSeconds(30), "sudo", "-u", "openhabian", "/usr/local/bin/pyze", "status", "--km")
        logInfo("charge", "timer: results_Status Plugged {}", results_status)
        val results_vehicle = executeCommandLine(Duration.ofSeconds(30),"sudo", "-u", "openhabian", "/usr/local/bin/pyze", "vehicles")
        logInfo("charge", "timer: results_Vehicle Plugged {}", results_vehicle)
        val tSched = if(myTime.state instanceof Number) (myTime.state as Number).intValue else 0                   // Zykluszeit in Minuten
        if(tSched > 0) {
            logInfo("charge","timer: Timer scheduled in {} Minutes!",tSched)
            tMyTimer.reschedule(now.plusMinutes(tSched))
        } else {
            logInfo("charge","timer: no reschedule for Timer!")
            tMyTimer = null
        }
    ])
Auf die Logzeile können wir dann auch verzichten, da im if-Block auf jeden Fall eine Ausgabe erfolgt.

Re: Timer Ablauf

Verfasst: 9. Feb 2022 08:23
von shuo
Danke vielmals. Nach Deiner Erklärung ist es nun völlig klar. Ich wäre niemals von selbst da drauf gekommen.

Ich denke ich muss morgen wieder laden. Werde dann berichten (und irgendwie freue ich mich schon drauf) :D

Re: Timer Ablauf

Verfasst: 9. Feb 2022 16:15
von udo1toni
:)

Re: Timer Ablauf

Verfasst: 11. Feb 2022 09:54
von shuo
Kurz Rückmeldung: Nun funktioniert alles wie es soll! Vielen Dank Udo!

Re: Timer Ablauf

Verfasst: 11. Feb 2022 13:03
von udo1toni
Super! Manchmal sind solche (Denk-) Fehler schwer zu finden...