Seite 1 von 1

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

Verfasst: 31. Dez 2025 12:43
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:

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

Verfasst: 31. Dez 2025 14:22
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

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

Verfasst: 31. Dez 2025 16:11
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.

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

Verfasst: 31. Dez 2025 16:44
von int5749
Ja, Major Updates können ihre Tücken haben.

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

Verfasst: 31. Dez 2025 16:58
von technick90
Habe von 5.0.3. auf 5.1 gewechselt.
Eventuell mache ich morgen auch erstmal ein Downgrade.

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

Verfasst: 31. Dez 2025 19:21
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.

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

Verfasst: 1. Jan 2026 11:51
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?

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

Verfasst: 1. Jan 2026 12:04
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.