Javascriptfehler typeerror no such function getItem

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Jensemann_P
Beiträge: 162
Registriert: 26. Jul 2021 20:14
Answers: 0

Javascriptfehler typeerror no such function getItem

Beitrag von Jensemann_P »

Hi Leute,

ich bin grad fast am durchdrehen.

Ich habe festgestellt, dass manche JS-Rules doch noch nciht so recht laufen.
Also gut, rein und eben um "runtime" in den Aufrufen der OH-spezifischen Sachen ergänzt. Nun Gehen fast alle Rules, bis auf eine von anfang an nicht und eine mag jetzt nach Neustart auf einmal nicht mehr. Diese Rules sind alle identisch aufgebaut, bis auf eben die items die sie verarbeiten (4x die gleiche Verarbeitung von Temperatur und Feuchtigkeit).

Die Rule die von Anfang an den Fehler produziert hat habe ich auch schonmal komplett neu angelegt => ohne Erfolg.
Vielleicht bin ich Betriebsblind und übersehe etwas ganz einfaches, aber ich komme nicht drauf. Da die Fehlermeldung keine (für mich) nützlichen Infos, Zeile o.ä. auswirft, komme ich keinen Schritt weiter.

Hier die Fehlermeldung:

Code: Alles auswählen

2024-02-10 18:59:42.163 [ERROR] [b.automation.script.javascript.stack] - Failed to execute script:

org.graalvm.polyglot.PolyglotException: TypeError: undefined has no such function "getItem"

	at <js>.:program(<eval>:21) ~[?:?]

	at org.graalvm.polyglot.Context.eval(Context.java:399) ~[?:?]

	at com.oracle.truffle.js.scriptengine.GraalJSScriptEngine.eval(GraalJSScriptEngine.java:458) ~[?:?]

	at com.oracle.truffle.js.scriptengine.GraalJSScriptEngine.eval(GraalJSScriptEngine.java:426) ~[?:?]

	at javax.script.AbstractScriptEngine.eval(AbstractScriptEngine.java:262) ~[java.scripting:?]

	at org.openhab.automation.jsscripting.internal.scriptengine.DelegatingScriptEngineWithInvocableAndAutocloseable.eval(DelegatingScriptEngineWithInvocableAndAutocloseable.java:53) ~[?:?]

	at org.openhab.automation.jsscripting.internal.scriptengine.InvocationInterceptingScriptEngineWithInvocableAndAutoCloseable.eval(InvocationInterceptingScriptEngineWithInvocableAndAutoCloseable.java:78) ~[?:?]

	at org.openhab.automation.jsscripting.internal.scriptengine.DelegatingScriptEngineWithInvocableAndAutocloseable.eval(DelegatingScriptEngineWithInvocableAndAutocloseable.java:53) ~[?:?]

	at org.openhab.automation.jsscripting.internal.scriptengine.InvocationInterceptingScriptEngineWithInvocableAndAutoCloseable.eval(InvocationInterceptingScriptEngineWithInvocableAndAutoCloseable.java:78) ~[?:?]

	at org.openhab.core.automation.module.script.internal.handler.ScriptActionHandler.lambda$0(ScriptActionHandler.java:71) ~[?:?]

	at java.util.Optional.ifPresent(Optional.java:178) ~[?:?]

	at org.openhab.core.automation.module.script.internal.handler.ScriptActionHandler.execute(ScriptActionHandler.java:68) ~[?:?]

	at org.openhab.core.automation.internal.RuleEngineImpl.executeActions(RuleEngineImpl.java:1188) ~[?:?]

	at org.openhab.core.automation.internal.RuleEngineImpl.runNow(RuleEngineImpl.java:1039) ~[?:?]

	at org.openhab.core.automation.rest.internal.RuleResource.runNow(RuleResource.java:381) ~[?:?]

	at org.openhab.core.automation.rest.internal.RuleResource.runNow(RuleResource.java:398) ~[?:?]

	at jdk.internal.reflect.GeneratedMethodAccessor51.invoke(Unknown Source) ~[?:?]

	at jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:?]

	at java.lang.reflect.Method.invoke(Method.java:568) ~[?:?]

	at org.apache.cxf.service.invoker.AbstractInvoker.performInvocation(AbstractInvoker.java:179) ~[bundleFile:3.6.2]

	at org.apache.cxf.service.invoker.AbstractInvoker.invoke(AbstractInvoker.java:96) ~[bundleFile:3.6.2]

	at org.apache.cxf.jaxrs.JAXRSInvoker.invoke(JAXRSInvoker.java:201) ~[bundleFile:3.6.2]

	at org.apache.cxf.jaxrs.JAXRSInvoker.invoke(JAXRSInvoker.java:104) ~[bundleFile:3.6.2]

	at org.apache.cxf.interceptor.ServiceInvokerInterceptor$1.run(ServiceInvokerInterceptor.java:59) ~[bundleFile:3.6.2]

	at org.apache.cxf.interceptor.ServiceInvokerInterceptor.handleMessage(ServiceInvokerInterceptor.java:96) ~[bundleFile:3.6.2]

	at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:307) ~[bundleFile:3.6.2]

	at org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:121) ~[bundleFile:3.6.2]

	at org.apache.cxf.transport.http.AbstractHTTPDestination.invoke(AbstractHTTPDestination.java:265) ~[bundleFile:3.6.2]

	at org.apache.cxf.transport.servlet.ServletController.invokeDestination(ServletController.java:234) ~[bundleFile:3.6.2]

	at org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:208) ~[bundleFile:3.6.2]

	at org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:160) ~[bundleFile:3.6.2]

	at org.apache.cxf.transport.servlet.CXFNonSpringServlet.invoke(CXFNonSpringServlet.java:225) ~[bundleFile:3.6.2]

	at org.apache.cxf.transport.servlet.AbstractHTTPServlet.handleRequest(AbstractHTTPServlet.java:304) ~[bundleFile:3.6.2]

	at org.apache.cxf.transport.servlet.AbstractHTTPServlet.doPost(AbstractHTTPServlet.java:217) ~[bundleFile:3.6.2]

	at javax.servlet.http.HttpServlet.service(HttpServlet.java:517) ~[bundleFile:4.0.4]

	at org.apache.cxf.transport.servlet.AbstractHTTPServlet.service(AbstractHTTPServlet.java:279) ~[bundleFile:3.6.2]

	at org.ops4j.pax.web.service.spi.servlet.OsgiInitializedServlet.service(OsgiInitializedServlet.java:102) ~[bundleFile:?]

	at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:799) ~[bundleFile:9.4.52.v20230823]

	at org.eclipse.jetty.servlet.ServletHandler$ChainEnd.doFilter(ServletHandler.java:1656) ~[bundleFile:9.4.52.v20230823]

	at org.ops4j.pax.web.service.spi.servlet.OsgiFilterChain.doFilter(OsgiFilterChain.java:100) ~[bundleFile:?]

	at org.ops4j.pax.web.service.jetty.internal.PaxWebServletHandler.doHandle(PaxWebServletHandler.java:320) ~[bundleFile:?]

	at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:143) ~[bundleFile:9.4.52.v20230823]

	at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:600) ~[bundleFile:9.4.52.v20230823]

	at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:127) ~[bundleFile:9.4.52.v20230823]

	at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:235) ~[bundleFile:9.4.52.v20230823]

	at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:1624) ~[bundleFile:9.4.52.v20230823]

	at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:233) ~[bundleFile:9.4.52.v20230823]

	at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1440) ~[bundleFile:9.4.52.v20230823]

	at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:188) ~[bundleFile:9.4.52.v20230823]

	at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:505) ~[bundleFile:9.4.52.v20230823]

	at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:1594) ~[bundleFile:9.4.52.v20230823]

	at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:186) ~[bundleFile:9.4.52.v20230823]

	at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1355) ~[bundleFile:9.4.52.v20230823]

	at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141) ~[bundleFile:9.4.52.v20230823]

	at org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:234) ~[bundleFile:9.4.52.v20230823]

	at org.ops4j.pax.web.service.jetty.internal.PrioritizedHandlerCollection.handle(PrioritizedHandlerCollection.java:96) ~[bundleFile:?]

	at org.eclipse.jetty.server.handler.gzip.GzipHandler.handle(GzipHandler.java:722) ~[bundleFile:9.4.52.v20230823]

	at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:127) ~[bundleFile:9.4.52.v20230823]

	at org.eclipse.jetty.server.Server.handle(Server.java:516) ~[bundleFile:9.4.52.v20230823]

	at org.eclipse.jetty.server.HttpChannel.lambda$handle$1(HttpChannel.java:487) ~[bundleFile:9.4.52.v20230823]

	at org.eclipse.jetty.server.HttpChannel.dispatch(HttpChannel.java:732) [bundleFile:9.4.52.v20230823]

	at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:479) [bundleFile:9.4.52.v20230823]

	at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:277) [bundleFile:9.4.52.v20230823]

	at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:311) [bundleFile:9.4.52.v20230823]

	at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:105) [bundleFile:9.4.52.v20230823]

	at org.eclipse.jetty.io.ChannelEndPoint$1.run(ChannelEndPoint.java:104) [bundleFile:9.4.52.v20230823]

	at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.runTask(EatWhatYouKill.java:338) [bundleFile:9.4.52.v20230823]

	at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.doProduce(EatWhatYouKill.java:315) [bundleFile:9.4.52.v20230823]

	at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.tryProduce(EatWhatYouKill.java:173) [bundleFile:9.4.52.v20230823]

	at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.run(EatWhatYouKill.java:131) [bundleFile:9.4.52.v20230823]

	at org.eclipse.jetty.util.thread.ReservedThreadExecutor$ReservedThread.run(ReservedThreadExecutor.java:409) [bundleFile:9.4.52.v20230823]

	at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:883) [bundleFile:9.4.52.v20230823]

	at org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.run(QueuedThreadPool.java:1034) [bundleFile:9.4.52.v20230823]

	at java.lang.Thread.run(Thread.java:840) [?:?]

2024-02-10 18:59:42.179 [ERROR] [internal.handler.ScriptActionHandler] - Script execution of rule with UID '0faa3aea87' failed: org.graalvm.polyglot.PolyglotException: TypeError: undefined has no such function "getItem"

Der Code einer funktionierenden Rule:

Code: Alles auswählen

var runtime = require('@runtime');
var minTempKeller, minHumKeller, dew_Aussen;
var dew_Lagerraum, hum_Lagerraum, temp_Lagerraum;
var logger = Java.type('org.slf4j.LoggerFactory').getLogger('org.openhab.rule.' + ctx.ruleUID);
var ScriptExecution = Java.type("org.openhab.core.model.script.actions.ScriptExecution");
var ZonedDateTime   = Java.type("java.time.ZonedDateTime");
var Timer1;
var Timer2;
var Interval;
var Delta_DewPoint_Fans;
var DewDiff;
Interval = runtime.itemRegistry.getItem("Lueftung_Interval").getState();

//if (Interval = null){
//  Interval = 30;
//}

// wenn unter dieser Temperatur oder unter dieser Feuchtigkeit Innen wird nicht gelüftet
//var ScriptExecution = Java.type("org.openhab.core.model.script.actions.ScriptExecution");

minTempKeller         = parseFloat(runtime.itemRegistry.getItem("MinTempKeller").getState());
minHumKeller          = parseFloat(runtime.itemRegistry.getItem("MinHumKeller").getState());
Delta_DewPoint_Fans   = parseFloat(runtime.itemRegistry.getItem("Delta_DewPoint_Fans").getState());
dew_Aussen            = parseFloat(runtime.itemRegistry.getItem('Taupunkt_Aussen').getState());

if (dew_Aussen !=null){
  // Lüftungssteuerung Lagerraum
  dew_Lagerraum   = parseFloat(runtime.itemRegistry.getItem('TaupunktLagerraum').getState());
  hum_Lagerraum   = parseFloat(runtime.itemRegistry.getItem('HTLagerraum_Humidity').getState());
  temp_Lagerraum  = parseFloat(runtime.itemRegistry.getItem('HTLagerraum_Temperature').getState());
  
  //Randbedingungen  
  if (((dew_Lagerraum != null) && (hum_Lagerraum != null) && (hum_Lagerraum >= minHumKeller) && (temp_Lagerraum >= minTempKeller))){
    DewDiff = dew_Lagerraum - (dew_Aussen + Delta_DewPoint_Fans);
    logger.info("Dew Lagerraum: " + dew_Lagerraum + "; Dew Out: " + dew_Aussen +"; Delta Dew: " + Delta_DewPoint_Fans +"; Dew Diff= "+DewDiff);
    //Taupunktdifferenz  
    if (((dew_Aussen + Delta_DewPoint_Fans) <= dew_Lagerraum) ){
      logger.info("Starte Lüfter Anschlussraum/Lagerraum für Intervallzeit");      
      runtime.events.sendCommand('LufterAnschlussraum_Betrieb', "ON");
      runtime.events.postUpdate("LuefterAnschlussraumImIntervall", "ON");
      Timer1 = ScriptExecution.createTimer(ZonedDateTime.now().plusMinutes(Interval), function(){
        logger.info("Stoppe Lüfter Anschlussraum");
        runtime.events.sendCommand("LufterAnschlussraum_Betrieb", "OFF"); 
          //Timer2 = ScriptExecution.createTimer(ZonedDateTime.now().plusMinutes(Interval), function(){
            logger.info("Lüfter Anschlussraum Intervall Ende");
            runtime.events.postUpdate("LuefterAnschlussraumImIntervall", "OFF");
      // Timer2 = null;
         });
        Timer1 = null;
      }
    }
}
 logger.info("Ausführung Rule Taupunktvergleich Lagerraum");
Der Code einer der beiden Rules die Fehler schmeissen:

Code: Alles auswählen

var runtime = require('@runtime');
var minTempKeller, minHumKeller, dew_Aussen;
var dew_Anschlussraum, hum_Anschlussraum, temp_Anschlussraum;
var logger = Java.type('org.slf4j.LoggerFactory').getLogger('org.openhab.rule.' + ctx.ruleUID);
var ScriptExecution = Java.type("org.openhab.core.model.script.actions.ScriptExecution");
var ZonedDateTime   = Java.type("java.time.ZonedDateTime");
var Timer1;
var Timer2;
var Interval;
var Delta_DewPoint_Fans;
var DewDiff;
Interval = runtime.itemRegistry.getItem("Lueftung_Interval").getState();

//if (Interval = null){
//  Interval = 30;
//}

// wenn unter dieser Temperatur oder unter dieser Feuchtigkeit Innen wird nicht gelüftet
//var ScriptExecution = Java.type("org.openhab.core.model.script.actions.ScriptExecution");

minTempKeller         = parseFloat(runtime.ItemRegistry.getItem("MinTempKeller").getState());
minHumKeller          = parseFloat(runtime.ItemRegistry.getItem("MinHumKeller").getState());
Delta_DewPoint_Fans   = parseFloat(runtime.ItemRegistry.getItem("Delta_DewPoint_Fans").getState());
dew_Aussen            = parseFloat(runtime.ItemRegistry.getItem('Taupunkt_Aussen').getState());

if (dew_Aussen !=null){
  // Lüftungssteuerung Anschlussraum
  dew_Anschlussraum   = parseFloat(runtime.itemRegistry.getItem('TaupunktAnschlussraum').getState());
  hum_Anschlussraum   = parseFloat(runtime.itemRegistry.getItem('HTAnschlussraum_Humidity').getState());
  temp_Anschlussraum  = parseFloat(runtime.itemRegistry.getItem('HTAnschlussraum_Temperature').getState());
  
  //Randbedingungen  
  if (((dew_Anschlussraum != null) && (hum_Anschlussraum != null) && (hum_Anschlussraum >= minHumKeller) && (temp_Anschlussraum >= minTempKeller))){
    DewDiff = dew_Anschlussraum - (dew_Aussen + Delta_DewPoint_Fans);
    logger.info("Dew Anschlussraum: " + dew_Anschlussraum + "; Dew Out: " + dew_Aussen +"; Delta Dew: " + Delta_DewPoint_Fans +"; Dew Diff= "+DewDiff);
    //Taupunktdifferenz  
    if (((dew_Aussen + Delta_DewPoint_Fans) <= dew_Anschlussraum) ){
      logger.info("Starte Lüfter Anschlussraum/Lagerraum für Intervallzeit");      
      runtime.events.sendCommand('LufterAnschlussraum_Betrieb', "ON");
      runtime.events.postUpdate("LuefterAnschlussraumImIntervall", "ON");
      Timer1 = ScriptExecution.createTimer(ZonedDateTime.now().plusMinutes(Interval), function(){
        logger.info("Stoppe Lüfter Anschlussraum");
        runtime.events.sendCommand("LufterAnschlussraum_Betrieb", "OFF"); 
          //Timer2 = ScriptExecution.createTimer(ZonedDateTime.now().plusMinutes(Interval), function(){
            logger.info("Lüfter Anschlussraum Intervall Ende");
            runtime.events.postUpdate("LuefterAnschlussraumImIntervall", "OFF");
      // Timer2 = null;
         });
        Timer1 = null;
      }
    }
}
logger.info("Ausführung Script Taupunktvergleich Anschlussraum");
Es gibt Tage, da hasse ich Computer.

Harka
Beiträge: 489
Registriert: 30. Apr 2021 13:13
Answers: 19

Re: Javascriptfehler typeerror no such function getItem

Beitrag von Harka »

Moin,
nur geraten, weil mir kein Nashorn mehr auf den Rechner kommt -> hast Du mal die JavaScript Versionen verglichen? Ich frage wegen "GraalJSScriptEngine" in der Fehlermeldung.

Jensemann_P
Beiträge: 162
Registriert: 26. Jul 2021 20:14
Answers: 0

Re: Javascriptfehler typeerror no such function getItem

Beitrag von Jensemann_P »

Hi, so ganz verstehe ich das nicht. Ich hab ja nur die aktuelle Javascript addon installiert. Erstellt wurde das vor 3 Jahren unter Nashorn, klar. Aber wieso geht die von Prinzip und den Funktionen her eine rule und die daneben nicht auf dem gleichen System?

Harka
Beiträge: 489
Registriert: 30. Apr 2021 13:13
Answers: 19

Re: Javascriptfehler typeerror no such function getItem

Beitrag von Harka »

da hat sich im Unterbau einiges geändert. https://www.openhab.org/docs/configurat ... me-history
Du kannst beide Versionen parallel installieren und betreiben.
Hier noch eine Übersicht für GraalJS https://www.openhab.org/addons/automation/jsscripting/

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

Re: Javascriptfehler typeerror no such function getItem

Beitrag von udo1toni »

Es erscheint mir reichlich kompliziert und umständlich, vier weitgehend identische Rules anzulegen. Auch mit JavaScript kann man Rules so formulieren, dass sie auf Gruppen und deren Kinder zurückgreifen, um eine Rule anzulegen, welche für beliebig viele Items (bzw. Itempaarungen) funktioniert.
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

Jensemann_P
Beiträge: 162
Registriert: 26. Jul 2021 20:14
Answers: 0

Re: Javascriptfehler typeerror no such function getItem

Beitrag von Jensemann_P »

Die Rules gibt es ja jetzt schon ne ganze Weile. Ich finde das bei den (ja eigentlich nicht umfangreichen) Rules schon wegen der verschiedenen trigger einfach übersichtlicher, wenn auch zugegebenermaßen etwas redundant. Hat aber jetzt auch drei Jahre lang super funktioniert.

Jensemann_P
Beiträge: 162
Registriert: 26. Jul 2021 20:14
Answers: 0

Re: Javascriptfehler typeerror no such function getItem

Beitrag von Jensemann_P »

Harka hat geschrieben: 10. Feb 2024 20:41 da hat sich im Unterbau einiges geändert. https://www.openhab.org/docs/configurat ... me-history
Du kannst beide Versionen parallel installieren und betreiben.
Hier noch eine Übersicht für GraalJS https://www.openhab.org/addons/automation/jsscripting/
Ok, muss ich mir die Aufrufe doch genauer anschauen und wohl ein wenig mehr umbauen als Stur eine Klasse davor zu schreiben.

Wie mich solche gezwungenen Umbauten funktionsfähigen Codes nerven. Genau das hat mir irgendwann völlig den Spaß an php genommen...

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

Re: Javascriptfehler typeerror no such function getItem

Beitrag von udo1toni »

Mal ein Beispiel als DSL Rule, da geht es um die Übertragung eines ankommenden Status (als Byte) in ein anderes Item (als Zahl). Die Bits 0 - 3 kommen an, dabei ist immer exakt eines dieser Bits gesetzt, als zahl kommt hinten 1 - 4 raus, wenn man die Bits von 1 bis 8 durchnummerierte, wäre es also die Position des gesetzten Bits. Sehr simple kleine Rule, aber schon sie doppelt hinzuschreiben würde einfach viel Platz vergeuden.

Code: Alles auswählen

rule "Betriebsart RTR"
 when
    Member of gHeat_Mode changed
 then
    var Integer newMode = 2
    val mode = (triggeringItem.state as DecimalType).toBigDecimal.toBigInteger
    val iName = triggeringItem.name.split("_").get(0).toString
    logDebug("rtr","Name is: {}, Mode is: {}",iName,mode)
    switch(mode) {
        case mode.testBit(0) : newMode = 1
        case mode.testBit(2) : newMode = 3
        case mode.testBit(3) : newMode = 4
    }
    var myItem = gHeat_Set.members.filter[ f | f.name.startsWith(iName) ].head
    var Integer oldMode = 0
    if(myItem.state instanceof Number) oldMode = (myItem.state as Number).intValue
    if(oldMode != newMode) {
        logDebug("rtr","Name is: {}, oldMode is: {}, newMode is: {}",myItem.name,oldMode,newMode)
        myItem.postUpdate(newMode)
    }
end
Da es hier um Raumthermostate geht... ich hatte die individuellen Rules ursprünglich auch im Code stehen, da waren es dann neun Stück. JA, hat auch funktioniert, aber es hat mich geärgert, dass es so ineffizient ist. Jetzt ist es nur noch eine Rule, die Rule ist tatsächlich nur zwei Zeilen länger als die individuelle Variante (wenn man mal davon absieht, dass einige Logs damit überflüssig werden, aber die darf man ohnehin nicht mitzählen)
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

Jensemann_P
Beiträge: 162
Registriert: 26. Jul 2021 20:14
Answers: 0

Re: Javascriptfehler typeerror no such function getItem

Beitrag von Jensemann_P »

Joa, also aus Informatischer Sicht ist was du vorschlägst eindeutig effizienter und eleganter.

Bei meiner Rule kommen dann aber je 4 Trigger in Betracht (und nur einer ist überall gleich).
Ich kann auch absehen dass es bei max 5 Stück bleibt. Bei Thermostate, wo das ganze ja vlt auch mal 20 oder 25 erreichen könnte würd ich das vlt auch anders sehen.

Mit den Timern wirds sicherlich auch nicht übersichtlicher wenn man alles in eins packt.

Wie auch immer, ich habe meine Rules jetzt auf einen scheinbar funktionierenden Zustand umgebaut. Vlt hilft es ja mal noch jemandem:

Code: Alles auswählen

TaupunktVergleichBuegelraum
 
Status: 
IDLE
 
Unique ID
ce0a121f16
Name
TaupunktVergleichBuegelraum
Description
When
Delete
Delete
Then
Delete
But only if
Delete
Delete
Edit Script
application/javascript
IDLE
1
var minTempKeller, minHumKeller, dew_Aussen;
2
var dew_Buegelzimmer, hum_Buegelzimmer, temp_Buegelzimmer;
3
var logger = Java.type('org.slf4j.LoggerFactory').getLogger('org.openhab.rule.' + ctx.ruleUID);
4
var ScriptExecution = Java.type("org.openhab.core.model.script.actions.ScriptExecution");
5
var ZonedDateTime   = Java.type("java.time.ZonedDateTime");
6
var Timer1;
7
var Interval;
8
var Delta_DewPoint_Fans;
9
var DewDiff;
10
Interval = items.getItem("Lueftung_Interval").numericState;
11
​
12
​
13
// wenn unter dieser Temperatur oder unter dieser Feuchtigkeit Innen wird nicht gelüftet
14
​
15
minTempKeller         = items.getItem("MinTempKeller").numericState;
16
minHumKeller          = items.getItem("MinHumKeller").numericState;
17
Delta_DewPoint_Fans   = items.getItem("Delta_DewPoint_Fans").numericState;
18
dew_Aussen            = items.getItem('Taupunkt_Aussen').numericState;
19
​
20
​
21
if (dew_Aussen !=null){
22
  // Lüftungssteuerung Bügelzimmer
23
  dew_Buegelzimmer   = items.getItem('Taupunkt_Buegelzimmer').numericState;
24
  hum_Buegelzimmer   = items.getItem('HT_Buegelzimmer_Humidity').numericState;
25
  temp_Buegelzimmer  = items.getItem('HT_Buegelzimmer_Temperature').numericState;
26
  
27
  //Randbedingungen  
28
  if (((dew_Buegelzimmer != null) && (hum_Buegelzimmer != null) && (hum_Buegelzimmer >= minHumKeller) && (temp_Buegelzimmer >= minTempKeller))){
29
    DewDiff = dew_Buegelzimmer - (dew_Aussen + Delta_DewPoint_Fans);
30
    logger.info("Ausführung Rule Taupunktvergleich Buegelzimmer");
31
    logger.info("Dew Bügelzimmer: " + dew_Buegelzimmer + "; Dew Out: " + dew_Aussen +"; Delta Dew: " + Delta_DewPoint_Fans +"; Dew Diff= "+DewDiff);
32
    //Taupunktdifferenz  
33
    if (((dew_Aussen + Delta_DewPoint_Fans) <= dew_Buegelzimmer) ){
34
      logger.info("Starte Lüfter Bügelzimmer für Intervallzeit");      
35
      items.getItem('LuefterBugelzimmerImIntervall').sendCommand('ON');
36
      items.getItem('LufterBugelzimmer_Betrieb').sendCommand('OFF');
37
        Timer1 = ScriptExecution.createTimer(ZonedDateTime.now().plusMinutes(Interval), function(){
38
          logger.info("Stoppe Lüfter Bügelzimmer");
39
          items.getItem('LufterBugelzimmer_Betrieb').sendCommand('OFF');
40
          logger.info("Lüfter Bügelzimmer Intervall Ende");
41
          items.getItem('LuefterBugelzimmerImIntervall').sendCommand('OFF');
42
        });
43
        Timer1 = null;
44
      }
45
    }
46
}
47
​
48
​

Jensemann_P
Beiträge: 162
Registriert: 26. Jul 2021 20:14
Answers: 0

Re: Javascriptfehler typeerror no such function getItem

Beitrag von Jensemann_P »

Wobei ich immer noch nicht das ursprüngliche Verhalten verstehe, warum einige Rules liefen und andere nicht...

Antworten