Update auf Openhab 5.1 - Regel zur Fensterbelüftung funktioniert mal wieder nicht

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Antworten
technick90
Beiträge: 82
Registriert: 24. Jul 2019 16:56
Answers: 1

Update auf Openhab 5.1 - Regel zur Fensterbelüftung funktioniert mal wieder nicht

Beitrag von technick90 »

Hallo,

ich wünsche allen einen guten Rutsch ins neue Jahr.

Ich habe Update auf Openhab 5.1 durchgeführt und wie jedes mal nach einem Update, ich bereue den Schritt.

Meine Rule zur Belüftung funktioniert mal wieder nicht.

Code: Alles auswählen

var Timer tFensteralarm = null

rule "Fenster Status"
when
    Member of Fenstersensoren changed
then
	if(tFensteralarm !== null && Fenstersensoren.members.filter[s|s.state.toString == "Offen"].size == 0) {
		tFensteralarm.cancel
        tFensteralarm = null
    } else if(tFensteralarm === null && Fenstersensoren.members.filter[s|s.state.toString == "Offen"].size > 0) {
		tFensteralarm = createTimer(now.plusMinutes(10), [|
	    tFensteralarm.reschedule(now.plusMinutes(5))
			val StringBuilder sb = new StringBuilder
            sb.append("Folgende Fenster sind zu lange geöffnet: ")
            Fenstersensoren.members.filter[s|s.state.toString == "Offen"].forEach[i|
				logInfo("lueften","Item {} wird abgearbeitet",i.name)
                val tTimestamp = i.lastChange()
                val strID = i.name.split("_").get(1)
                val iTimeout = (Fenstersensoren_Sperrzeitfenster.members.filter[s|s.name.contains(strID)].head.state as Number).intValue 
				logInfo("lueften","ermittelte Timestamp {} und Timeout {} mit Namenteil {}",tTimestamp,iTimeout,strID)
				if(iTimeout === null || tTimestamp === null) {
				    logWarn("lueften","Fehler beim Ermitteln des Timeout!",i)
				    return;
				}
				if(tTimestamp.plusMinutes(iTimeout).isBefore(now)) {
					 logInfo("lueften","Timer überschritten...")
					 sb.append(i.label + " ")
                }
            ]
            val text = sb.toString
            if(text.length > 42) {
                if(Anwesenheit == OFF)
                    sendBroadcastNotification(text, "contact", "Info")
                else {
					AlexaWohnzimmer_Ankuendigung.sendCommand(text)
					AlexaBad_TTS.sendCommand(text)
					AlexaArbeitszimmer_TTS.sendCommand(text)
					AlexaKueche_TTS.sendCommand(text)
                    if (UniFiWirelessClientABCD_Online.state == ON) {sendNotification("abc@abc.de", text, "contact", "Info")}
					if (UniFiWirelessClientABC_Online.state == ON) {sendNotification("abc@abcd.de", text, "contact", "Info")}
					}
            }
        ])
    }
end
Folgender Fehler im Log:

Code: Alles auswählen

DSL model 'Lueften.rules' has errors, therefore ignoring it: The operator '===' is undefined for the argument types int and null The operator '===' is undefined for the argument types int and null
Dann wollte ich mit folgenden Script überprüfen ob die Uhrzeit wieder falsch ist, auch das geht nicht mehr.

Script:

Code: Alles auswählen

 logInfo("Test", now.toString)
Fehler im Log dazu:

Code: Alles auswählen

Failed to execute action: script(Cannot invoke "com.google.inject.Injector.getInstance(java.lang.Class)" because the return value of "org.openhab.core.model.script.ScriptStandaloneSetup.getInjector()" is null)

Code: Alles auswählen

Stack Trace
java.lang.NullPointerException: Cannot invoke "com.google.inject.Injector.getInstance(java.lang.Class)" because the return value of "org.openhab.core.model.script.ScriptStandaloneSetup.getInjector()" is null
at org.openhab.core.model.script.runtime.internal.engine.ScriptEngineImpl.getResourceSet(ScriptEngineImpl.java:77)
at org.openhab.core.model.script.runtime.internal.engine.ScriptEngineImpl.parseScriptIntoXTextEObject(ScriptEngineImpl.java:127)
at org.openhab.core.model.script.runtime.internal.engine.ScriptEngineImpl.newScriptFromString(ScriptEngineImpl.java:111)
at org.openhab.core.model.script.runtime.internal.engine.DSLScriptEngine.eval(DSLScriptEngine.java:137)
at org.openhab.core.automation.module.script.internal.handler.AbstractScriptModuleHandler.eval(AbstractScriptModuleHandler.java:265)
at org.openhab.core.automation.module.script.internal.handler.ScriptActionHandler.lambda$0(ScriptActionHandler.java:99)
at java.base/java.util.Optional.ifPresent(Unknown Source)
at org.openhab.core.automation.module.script.internal.handler.ScriptActionHandler.execute(ScriptActionHandler.java:86)
at org.openhab.core.automation.internal.RuleEngineImpl.executeActions(RuleEngineImpl.java:1322)
at org.openhab.core.automation.internal.RuleEngineImpl.runNow(RuleEngineImpl.java:1120)
at org.openhab.core.automation.rest.internal.RuleResource.runNow(RuleResource.java:401)
at org.openhab.core.automation.rest.internal.RuleResource.runNow(RuleResource.java:418)
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(Unknown Source)
at java.base/java.lang.reflect.Method.invoke(Unknown Source)
at org.apache.cxf.service.invoker.AbstractInvoker.performInvocation(AbstractInvoker.java:179)
at org.apache.cxf.service.invoker.AbstractInvoker.invoke(AbstractInvoker.java:96)
at org.apache.cxf.jaxrs.JAXRSInvoker.invoke(JAXRSInvoker.java:201)
at org.apache.cxf.jaxrs.JAXRSInvoker.invoke(JAXRSInvoker.java:104)
at org.apache.cxf.interceptor.ServiceInvokerInterceptor$1.run(ServiceInvokerInterceptor.java:59)
at org.apache.cxf.interceptor.ServiceInvokerInterceptor.handleMessage(ServiceInvokerInterceptor.java:96)
at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:307)
at org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:121)
at org.apache.cxf.transport.http.AbstractHTTPDestination.invoke(AbstractHTTPDestination.java:267)
at org.apache.cxf.transport.servlet.ServletController.invokeDestination(ServletController.java:234)
at org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:208)
at org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:160)
at org.apache.cxf.transport.servlet.CXFNonSpringServlet.invoke(CXFNonSpringServlet.java:225)
at org.apache.cxf.transport.servlet.AbstractHTTPServlet.handleRequest(AbstractHTTPServlet.java:304)
at org.apache.cxf.transport.servlet.AbstractHTTPServlet.doPost(AbstractHTTPServlet.java:217)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:517)
at org.apache.cxf.transport.servlet.AbstractHTTPServlet.service(AbstractHTTPServlet.java:279)
at org.ops4j.pax.web.service.spi.servlet.OsgiInitializedServlet.service(OsgiInitializedServlet.java:102)
at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:799)
at org.eclipse.jetty.servlet.ServletHandler$ChainEnd.doFilter(ServletHandler.java:1656)
at org.ops4j.pax.web.service.spi.servlet.OsgiFilterChain.doFilter(OsgiFilterChain.java:113)
at org.ops4j.pax.web.service.jetty.internal.PaxWebServletHandler.doHandle(PaxWebServletHandler.java:334)
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:143)
at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:600)
at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:127)
at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:235)
at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:1624)
at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:233)
at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1440)
at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:188)
at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:505)
at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:1594)
at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:186)
at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1355)
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141)
at org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:234)
at org.ops4j.pax.web.service.jetty.internal.PrioritizedHandlerCollection.handle(PrioritizedHandlerCollection.java:96)
at org.eclipse.jetty.server.handler.gzip.GzipHandler.handle(GzipHandler.java:722)
at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:127)
at org.eclipse.jetty.server.Server.handle(Server.java:516)
at org.eclipse.jetty.server.HttpChannel.lambda$handle$1(HttpChannel.java:487)
at org.eclipse.jetty.server.HttpChannel.dispatch(HttpChannel.java:732)
at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:479)
at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:277)
at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:311)
at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:105)
at org.eclipse.jetty.io.ChannelEndPoint$1.run(ChannelEndPoint.java:104)
at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.runTask(EatWhatYouKill.java:338)
at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.doProduce(EatWhatYouKill.java:315)
at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.tryProduce(EatWhatYouKill.java:173)
at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.run(EatWhatYouKill.java:131)
at org.eclipse.jetty.util.thread.ReservedThreadExecutor$ReservedThread.run(ReservedThreadExecutor.java:409)
at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:883)
at org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.run(QueuedThreadPool.java:1034)
at java.base/java.lang.Thread.run(Unknown Source)
Ich lese mir wirklich immer die Versionshinweise durch und trotzdem fliege ich jedes mal auf die ...
Never Touch a running System. Leider mache ich es doch jedes mal wieder. :shock:

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

Re: Update auf Openhab 5.1 - Regel zur Fensterbelüftung funktioniert mal wieder nicht

Beitrag von int5749 »

Hi,

ich meine einen ähnlichen Fehler hatte ich beim Umstieg auch.

Das "Problem" gab es eigentlich schon immer, nur hat es in Versionen < 5.x fukntioniert, da openHAB 3/4 stillschweigend int zu Integer (nullable) gewrappt hat. openHAB 5.x ist strenger und lässt diesen impliziten Cast nicht mehr zu.

iTimeout ist ein int (weil du .intValue verwendest) und ein int kann niemals null sein → und === null ist damit ein ungültiger Vergleich.

Eine Möglicheit könnte es sein, vorher auf .IntValue zu prüfen

Code: Alles auswählen

val timeoutState = Fenstersensoren_Sperrzeitfenster.members
    .filter[s|s.name.contains(strID)]
    .head.state

if(timeoutState === null || tTimestamp === null) {
    logWarn("lueften","Fehler beim Ermitteln des Timeout!", i)
    return;
}

val iTimeout = (timeoutState as Number).intValue
Achtung: ungetestet.

Viele Grüße und guten Rutsch
openHAB Milestone 5.1.0.M1 mit openHABian in einem Debian Bookworm (LXC) unter Proxmox 9.0.11

technick90
Beiträge: 82
Registriert: 24. Jul 2019 16:56
Answers: 1

Re: Update auf Openhab 5.1 - Regel zur Fensterbelüftung funktioniert mal wieder nicht

Beitrag von technick90 »

Ich schaue mir das morgen an.

Geht wieder ganz vieles nicht. Steckdose geht nicht automatisch aus (Rule sobald PC aus). Zigbee Steuerung über KNX Taster geht nicht uvm.. Ich hasse die Updates von openhab.

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

Re: Update auf Openhab 5.1 - Regel zur Fensterbelüftung funktioniert mal wieder nicht

Beitrag von int5749 »

Ja, Major Updates können ihre Tücken haben.
openHAB Milestone 5.1.0.M1 mit openHABian in einem Debian Bookworm (LXC) unter Proxmox 9.0.11

technick90
Beiträge: 82
Registriert: 24. Jul 2019 16:56
Answers: 1

Re: Update auf Openhab 5.1 - Regel zur Fensterbelüftung funktioniert mal wieder nicht

Beitrag von technick90 »

Habe von 5.0.3. auf 5.1 gewechselt.
Eventuell mache ich morgen auch erstmal ein Downgrade.

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

Re: Update auf Openhab 5.1 - Regel zur Fensterbelüftung funktioniert mal wieder nicht

Beitrag von udo1toni »

Ja, das Problem ist hier, dass openHAB mit jeder Version strikter wird, was die Verwendung von Datentypen betrifft.
Streng genommen war der Vergleich schon immer "falsch", aber erst jetzt wird er (zurecht) moniert.
iTimeout wird nie null werden, weil die Rule vorher mit einem Fehler abbricht, falls ...head.state nicht vom Typ Number ist.
openHAB5.0.3 stable in einem Debian-Container (trixie, OpenJDK 21 headless runtime - LXC, 4 Kerne, 3 GByte RAM)
Hostsystem Proxmox 9.1.2 - AMD Ryzen 5 3600 6 Kerne, 12 Threads - 64 GByte RAM - ZFS Pools: Raid Z1, 3 x 20 TB HDD -> 40 TByte und Raid Z0-Mirrored 4 x 1 TByte NVMe -> 2 TByte

technick90
Beiträge: 82
Registriert: 24. Jul 2019 16:56
Answers: 1

Re: Update auf Openhab 5.1 - Regel zur Fensterbelüftung funktioniert mal wieder nicht

Beitrag von technick90 »

Ich wünsche ein frohes und gesundes neues Jahr.
Ich habe jetzt erstmal wieder openhab 5.0.3 installiert.
Im Endeffekt haben alle meine Regeln nicht funktioniert, selbst relativ simple Regeln.
Beispiel:

Code: Alles auswählen

rule "Licht Kueche"
when
        Item Dimmaktor4x_Licht_EG_Kueche changed
then
val percent = Dimmaktor4x_Licht_EG_Kueche.state as Number

if (Dimmaktor4x_Licht_EG_Kueche.state == 0) {
	MQTTLichtleisteKueche_Power.sendCommand(OFF)
	MQTTLichtleisteKueche_Dimmen.sendCommand(percent) 
	}
else {
	MQTTLichtleisteKueche_Power.sendCommand(ON)
	MQTTLichtleisteKueche_Dimmen.sendCommand(percent)
	}
end

rule "Wandlicht Arbeitszimmer KNX2Zigbee" 
when
    Item MQTTTuyaE14_V_Dimmen received command
then
    switch(receivedCommand.toString) {
    case "OFF" : MQTTTuyaE14_Dimmen.sendCommand(OFF)
    case "ON" : {
                  if((MQTTTuyaE14_Dimmen.state as Number) > 0)
                      MQTTTuyaE14_Dimmen.sendCommand(100)
                  else
                      MQTTTuyaE14_Dimmen.sendCommand(MQTTTuyaE14_Dimmen.previousState(true).state.toString)
                  }
    case "INCREASE" : MQTTTuyaE14_Dimmen.sendCommand(INCREASE)
    case "DECREASE" : MQTTTuyaE14_Dimmen.sendCommand(DECREASE)
    }
end

rule "Wandlicht Arbeitszimmer Zigbee2KNX" 
when
    Item MQTTTuyaE14_Dimmen changed
then
   MQTTTuyaE14_V_Dimmen.postUpdate(MQTTTuyaE14_Dimmen.state)
end

rule "Wandlicht KNX2Zigbee" 
when
    Item MQTTInnrE14_V_Dimmen received command
then
    switch(receivedCommand.toString) {
    case "OFF" : MQTTInnrE14_Dimmen.sendCommand(OFF)
    case "ON" : {
                  if((MQTTInnrE14_Dimmen.state as Number) > 0)
                      MQTTInnrE14_Dimmen.sendCommand(100)
                  else
                      MQTTInnrE14_Dimmen.sendCommand(MQTTInnrE14_Dimmen.previousState(true).state.toString)
                  }
    case "INCREASE" : MQTTInnrE14_Dimmen.sendCommand(INCREASE)
    case "DECREASE" : MQTTInnrE14_Dimmen.sendCommand(DECREASE)
    }
end

rule "Wandlicht Zigbee2KNX" 
when
    Item MQTTInnrE14_Dimmen changed
then
   MQTTInnrE14_V_Dimmen.postUpdate(MQTTInnrE14_Dimmen.state)
end
Verrückter Weise gehen selbst nach dem Upgrade ganz einfache Dinge nicht mehr.
Wollte die Uhrzeit kontrollieren:

Code: Alles auswählen

 logInfo("Test", now.toString)
Aber selbst dieser Einzeiler geht nicht mehr.

Code: Alles auswählen

Failed to execute action: script(Cannot invoke "com.google.inject.Injector.getInstance(java.lang.Class)" because the return value of "org.openhab.core.model.script.ScriptStandaloneSetup.getInjector()" is null)
Möchte nun unter openhab 5.0.3 die Regeln alle kontrollieren und danach erneut das Update durchführen.
Kann mir einer einen guten Artikel zur Variablendeklaration in openhab benennen?

technick90
Beiträge: 82
Registriert: 24. Jul 2019 16:56
Answers: 1

Re: Update auf Openhab 5.1 - Regel zur Fensterbelüftung funktioniert mal wieder nicht

Beitrag von technick90 »

Habe aus Spaß die erste Regel für das Küchenlicht einfach mal bei ChatGPT hochgeladen und dabei wurde folgendes korrigiert:

Code: Alles auswählen

rule "Licht Kueche"
when
    Item Dimmaktor4x_Licht_EG_Kueche changed
then
    val percent = (Dimmaktor4x_Licht_EG_Kueche.state as Number)
    MQTTLichtleisteKueche_Dimmen.sendCommand(percent)
    if ((percent as Number) == 0) {
        MQTTLichtleisteKueche_Power.sendCommand(OFF)
    } else {
        MQTTLichtleisteKueche_Power.sendCommand(ON)
		MQTTLichtleisteKueche_Dimmen.sendCommand(percent)										  
    }
end
Im Endeffekt also nur der Wert der Variablendeklaration in Klammern gesetzt. Ist das so richtig bzw. war das der einzige Fehler in dieser Regel?
Sie funktioniert mit openhab 5.0.3 in beiden Varianten.

technick90
Beiträge: 82
Registriert: 24. Jul 2019 16:56
Answers: 1

Re: Update auf Openhab 5.1 - Regel zur Fensterbelüftung funktioniert mal wieder nicht

Beitrag von technick90 »

Auch nach dem Downgrade akzeptiert 5.0.3 nun falsche Definitionen nicht mehr.
Was ich aber nicht verstehe, ich kann noch nicht mal den Item Status in einer Regel verwende. Ich muss diesen zwingend in eine Variable packen, so z. B. auch bei triggeringItem.state.

Ist das richtig? Wenn ich das nicht mache, läuft die Regel auf einen Fehler.

Antworten