Satreceiver Startup Check

Allgemeine Fragen zum Thema "Smart Home" und Entscheidungshilfen

Moderator: seppy

Benutzeravatar
PeterA
Beiträge: 1106
Registriert: 8. Feb 2019 12:12
Answers: 13

Re: Satreceiver Startup Check

Beitrag von PeterA »

Hier mit bitte ich höflichst um einen Tipp.

Timer, Reschedule und Countdown...

das ist mein aktueller Stand welcher bis zum abgelaufenen 30sek Timer funktioniert denn "Shelly1_04.sendCommand(OFF)" wird noch ausgeführt.
Aber dann gibts ne Fehlermeldung im Log:

Code: Alles auswählen

2020-10-28 20:59:37.588 [ERROR] [org.quartz.core.JobRunShell         ] - Job DEFAULT.2020-10-28T20:59:35.159+01:00: Proxy for org.eclipse.xtext.xbase.lib.Procedures$Procedure0: [ | {

  org.eclipse.xtext.xbase.impl.XIfExpressionImpl@1a7d783

} ] threw an unhandled Exception: 

java.lang.NullPointerException: cannot invoke method public abstract boolean org.eclipse.smarthome.model.script.actions.Timer.reschedule(org.joda.time.base.AbstractInstant) on null

Code: Alles auswählen

var Timer tCheck = null                                    // globale Variablen zu Beginn der Datei definieren
var int versuche = 3

rule "Satreceiver Startup Check"
when
   Item Shelly1_04 changed to ON                      // SAT eingeschaltet
then
   logInfo("Coolstream Startup Check","Coolstream eingeschaltet, warte auf hochfahren.")
        tCheck?.cancel 				                          // eventuell laufenden Timer stoppen
        versuche = 3                                           //reset iterations
            createTimer(now.plusSeconds(30), [|                // lege Timer an
            if (CoolstreamTime.toString.contains ("offline") && ShellyPlugS_04_Proxy.state==ON) { // offline = Satreceiver ist nicht hochgefahren //am Denon hängt noch der Switch
            Shelly1_04.sendCommand(OFF)                    // schalte ab wenn CoolstreamTime "offline" behinhaltet
            logInfo("Coolstream Startup Check","Coolstream offline, schalte noch mal ab.")
            versuche = versuche - 1                         //Count down
                if(versuche > 0)
                tCheck.reschedule(now.plusSeconds(10))  //reschedule timer
                Shelly1_04.sendCommand(ON)
                logInfo("Coolstream Startup Check","Coolstream offline, schalte noch mal ein.")
    }
    ])
end
- OpenHab 2.4
#PWRUP

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

Re: Satreceiver Startup Check

Beitrag von udo1toni »

Aber gerne :)

Das wäre meine Version:

Code: Alles auswählen

// globale Variablen zu Beginn der Datei definieren
var Timer tCheck = null                                                     // Timer für Receivercheck
var Integer iTry = 1                                                        // Zähler Startversuche

rule "Satreceiver Startup Check"
when
    Item Shelly1_04 changed to ON                                            // SAT eingeschaltet
then
    logInfo("satreceive","Coolstream eingeschaltet, warte auf hochfahren.")
    if(tCheck !== null)                                                      // Timer läuft bereits
        return;                                                              // also Abbruch
    iTry = 1                                                                 // Zähler initialisieren
    tCheck = createTimer(now.plusSeconds(30), [|                             // lege Timer an
        if(Shelly1_04.state==ON) {                                           // Falls Receiver An
            if(CoolstreamTime.toString.contains("offline")){                 // Falls Offline
                iTry = iTry + 1                                              // Zähler erhöhen
                logInfo("satreceive","Coolstream offline, schalte aus.")
                logInfo("satreceive","{}. Versuch in 10 Sekunden.",iTry)
                Shelly1_04.sendCommand(OFF)                                  // Receiver OFF
                tCheck.reschedule(now.plusSeconds(10))                       // und in 10 Sekunden einschalten
            } else {                                                         // Falls Online
                tCheck = null                                                // Timer löschen
            }
        } else if(iTry < 4){                                                 // Falls Receiver Aus und noch nicht Maximum erreicht
            Shelly1_04.sendCommand(ON)                                       // Receiver ON
            logInfo("satreceive","Coolstream {}. Startversuch.",iTry)
            tCheck.reschedule(now.plusSeconds(30))                           // und in 30 Sekunden erneut prüfen
        } else {
            logWarn("satreceive","Coolstream: Kein weiterer Startversuch!")
            tCheck = null                                                    // Timer löschen
        }
    ])
end
Funktionsweise:
Zunächst triggert die Rule, weil der Receiver über den Shelly eingeschaltet wurde. Da wir in dieser Rule einen Timer anlegen, der selbst den Receiver einschaltet, dürfen wir nicht einfach diesen Timer entfernen :) Stattdessen muss die Rule umgehend abgebrochen werden, falls der Timer existiert.
Existiert der Timer nicht, so setzen wir den Zähler auf 1. Anschließend legen wir den Timer an und die Rule ist beendet.

Wird der Timer getriggert (d.h. die Zeit ist abgelaufen) muss die Rule zunächst prüfen, ob die Steckdose gerade eingeschaltet oder ausgeschaltet ist. Ist die Steckdose eingeschaltet, muss geprüft werden, ob der Receiver offline ist.
Ist das der Fall, wird der Zähler erhöht, die Steckdose abgeschaltet und der Timer in 10 Sekunden erneut ausgeführt. Da der Zähler hoch zählt, kann an dieser Stelle auch im Log ausgegeben werden, dass ein weiterer Versuch gestartet wird.
Ist der Receiver hingegen online, so wird der Timer gelöscht und es passiert nichts weiter, denn alles ist so, wie es sein soll.
Ist die Steckdose aber ausgeschaltet, prüft die Rule, ob schon die maximale Anzahl Versuche erreicht ist. Falls nicht, wird der Receiver eingeschaltet und der Timer erneut geplant, um wieder zu prüfen, ob der Receiver online ist.
Ist das bereits der 4. Startversuch, wird hingegen nur der Timer gelöscht, die Steckdose bleibt aus.
openHAB4.3.5 stable in einem Debian-Container (bookworm) (Proxmox 8.4.1, LXC), mit openHABian eingerichtet

Benutzeravatar
PeterA
Beiträge: 1106
Registriert: 8. Feb 2019 12:12
Answers: 13

Re: Satreceiver Startup Check

Beitrag von PeterA »

Auweia, das hätte ich so nicht hinbekommen. Vielen Dank Udo.

Werde es heute Abend Testen!

Gruß Peter
- OpenHab 2.4
#PWRUP

Benutzeravatar
PeterA
Beiträge: 1106
Registriert: 8. Feb 2019 12:12
Answers: 13

Re: Satreceiver Startup Check

Beitrag von PeterA »

Ich konnte es nicht lassen und habs jetzt schon getestet.
Funktioniert bis zum ersten Abschalten.

Dann gibts diese Meldungen im Log:

Code: Alles auswählen

2020-10-29 08:22:54.244 [INFO ] [e.smarthome.model.script.satreceiver] - Coolstream offline, schalte aus.

2020-10-29 08:22:54.253 [INFO ] [e.smarthome.model.script.satreceiver] - 2. Versuch in 10 Sekunden.

==> /var/log/openhab2/events.log <==

2020-10-29 08:22:54.302 [ome.event.ItemCommandEvent] - Item 'Shelly1_04' received command OFF

==> /var/log/openhab2/openhab.log <==

2020-10-29 08:22:54.294 [ERROR] [org.quartz.core.JobRunShell         ] - Job DEFAULT.2020-10-29T08:22:52.056+01:00: Proxy for org.eclipse.xtext.xbase.lib.Procedures$Procedure0: [ | {

  org.eclipse.xtext.xbase.impl.XIfExpressionImpl@1ad7bec

} ] threw an unhandled Exception: 

java.lang.NullPointerException: cannot invoke method public abstract boolean org.eclipse.smarthome.model.script.actions.Timer.reschedule(org.joda.time.base.AbstractInstant) on null

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.invokeOperation(XbaseInterpreter.java:1071) ~[?:?]

Code: Alles auswählen

2020-10-29 08:22:54.833 [vent.ItemStateChangedEvent] - Shelly1_04 changed from ON to OFF

==> /var/log/openhab2/openhab.log <==

2020-10-29 08:22:54.808 [ERROR] [org.quartz.core.ErrorLogger         ] - Job (DEFAULT.2020-10-29T08:22:52.056+01:00: Proxy for org.eclipse.xtext.xbase.lib.Procedures$Procedure0: [ | {

  org.eclipse.xtext.xbase.impl.XIfExpressionImpl@1ad7bec

} ] threw an exception.

org.quartz.SchedulerException: Job threw an unhandled exception.

	at org.quartz.core.JobRunShell.run(JobRunShell.java:213) [107:org.eclipse.smarthome.core.scheduler:0.10.0.oh240]

	at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:573) [107:org.eclipse.smarthome.core.scheduler:0.10.0.oh240]

Caused by: java.lang.NullPointerException: cannot invoke method public abstract boolean org.eclipse.smarthome.model.script.actions.Timer.reschedule(org.joda.time.base.AbstractInstant) on nul
- OpenHab 2.4
#PWRUP

Benutzeravatar
PeterA
Beiträge: 1106
Registriert: 8. Feb 2019 12:12
Answers: 13

Re: Satreceiver Startup Check

Beitrag von PeterA »

Wenn ich "tCheck.reschedule(now.plusSeconds(10))" auskommentiere gibt es keine Fehlermeldungen mehr im Log.
Weshalb "kracht" es damit ?
- OpenHab 2.4
#PWRUP

violine21
Beiträge: 600
Registriert: 20. Sep 2019 05:49
Answers: 7

Re: Satreceiver Startup Check

Beitrag von violine21 »

Hallo,
ich lese hier still mit, da mich das Thema auch interessiert.
Ich bin jetzt nicht so tief in der Materie, aber kann es sein, das die Programmzeile

Code: Alles auswählen

createTimer(now.plusSeconds(30), [|                                      // lege Timer an
so heissen müsste?

Code: Alles auswählen

tCheck = createTimer(now.plusSeconds(30), [|                                      // lege Timer an
Würde mich mal brennend interessieren, ob es dann funktioniert...

Benutzeravatar
PeterA
Beiträge: 1106
Registriert: 8. Feb 2019 12:12
Answers: 13

Re: Satreceiver Startup Check

Beitrag von PeterA »

Du Fuchs!

Funktioniert einmannfrei!!!

Vielen Dank Udo und Violine21!

Klar... weshalb der Fehler kam... der reschedule wusste ja nicht was er neu Einplanen sollte...

Top!
- OpenHab 2.4
#PWRUP

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

Re: Satreceiver Startup Check

Beitrag von udo1toni »

Ja, sorry für diesen Fehler... muss die Uhrzeit gewesen sein... Ich ergänze das aber oben :)
openHAB4.3.5 stable in einem Debian-Container (bookworm) (Proxmox 8.4.1, LXC), mit openHABian eingerichtet

Benutzeravatar
PeterA
Beiträge: 1106
Registriert: 8. Feb 2019 12:12
Answers: 13

Re: Satreceiver Startup Check

Beitrag von PeterA »

Hier die aktuelle und funktionierende Rule welche ich noch um eine pushNotification und einen zusätzlichen Abbruch ergänzt habe:

Code: Alles auswählen

// globale Variablen zu Beginn der Datei definieren
var Timer tCheck = null                                                     // Timer für Receivercheck
var Integer iTry = 1                                                        // Zähler Startversuche

rule "Satreceiver Startup Check"
when
    Item ShellyPlugS_06 changed to ON                                       // SAT eingeschaltet
then
    if (ShellyPlugS_05_Proxy.state!=ON) {                                   // Wenn Denon nicht an, Abbruch
    logInfo("satreceiver","Denon noch nicht eingeschaltet, Abbruch.")
        return;
    }
    logInfo("satreceiver","Coolstream eingeschaltet, warte auf hochfahren.")
    if(tCheck !== null)                                                      // Timer läuft bereits
        return;                                                              // also Abbruch
    iTry = 1                                                                 // Zähler initialisieren
    tCheck = createTimer(now.plusSeconds(180), [|                            // lege Timer an
        if(ShellyPlugS_06.state==ON)  {                                      // Falls Receiver An
            if(CoolstreamTime.toString.contains("offline")){                 // Falls Offline
                iTry = iTry + 1                                              // Zähler erhöhen
                logInfo("satreceiver","Coolstream offline, schalte aus.")
                logInfo("satreceiver","{}. Versuch in 10 Sekunden.",iTry)
                ShellyPlugS_06.sendCommand(OFF)                              // Receiver OFF
                tCheck.reschedule(now.plusSeconds(10))                       // und in 10 Sekunden einschalten
            } else {                                                         // Falls Online
                tCheck = null                                                // Timer löschen
            }
        } else if(iTry < 4){                                                 // Falls Receiver Aus und noch nicht Maximum erreicht
            ShellyPlugS_06.sendCommand(ON)                                   // Receiver ON
            logInfo("satreceiver","Coolstream {}. Startversuch.",iTry)
            tCheck.reschedule(now.plusSeconds(180))                          // und in 180 Sekunden erneut prüfen
        } else {
            logWarn("satreceiver","Coolstream: Kein weiterer Startversuch!")
            sendBroadcastNotification("Satreceiver Startup: Coolstream ist nicht sauber hochgefahren" + " um " + now.toString("HH:mm") + " Uhr") //Allgemeine Warnung an alle 
            tCheck = null                                                      // Timer löschen
        }
    ])
end
- OpenHab 2.4
#PWRUP

Antworten