Seite 1 von 2

Javascriptfehler typeerror no such function getItem

Verfasst: 10. Feb 2024 19:08
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.

Re: Javascriptfehler typeerror no such function getItem

Verfasst: 10. Feb 2024 20:07
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.

Re: Javascriptfehler typeerror no such function getItem

Verfasst: 10. Feb 2024 20:17
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?

Re: Javascriptfehler typeerror no such function getItem

Verfasst: 10. Feb 2024 20:41
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/

Re: Javascriptfehler typeerror no such function getItem

Verfasst: 10. Feb 2024 22:57
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.

Re: Javascriptfehler typeerror no such function getItem

Verfasst: 10. Feb 2024 23:29
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.

Re: Javascriptfehler typeerror no such function getItem

Verfasst: 10. Feb 2024 23:38
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...

Re: Javascriptfehler typeerror no such function getItem

Verfasst: 11. Feb 2024 00:19
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)

Re: Javascriptfehler typeerror no such function getItem

Verfasst: 11. Feb 2024 00:49
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
​

Re: Javascriptfehler typeerror no such function getItem

Verfasst: 11. Feb 2024 01:07
von Jensemann_P
Wobei ich immer noch nicht das ursprüngliche Verhalten verstehe, warum einige Rules liefen und andere nicht...