Wie zweistufiges Expire realisieren? Oder doch Timer?

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Antworten
Jensemann_P
Beiträge: 149
Registriert: 26. Jul 2021 20:14

Wie zweistufiges Expire realisieren? Oder doch Timer?

Beitrag von Jensemann_P »

Liebes Forum,

nachdem ich ein paar Wochen ausgefallen bin, geht es jetzt mit meiner Steuerung im Keller weiter. Der alte Thread dazu wird ja so lansgam thematisch unübersichtlich und ich habe gerade noch ein detailliertes Problem:

Sobald die Bedingungen in einem Raum (Taupunkt_Raum_A - Taupunkt_Außen >= 5) soll der Lüfter angehen.
Natürlich wäre es jetzt aber blöd so ganz ohne Hysterese um diesen einen Messwert zu flattern.

Realisieren würde ich gerne folgendes: Bedingung erfüllt => Lüfter 30 Min an => Lüfter 30 min Aus und erst jetzt wieder auf äußere Reize reagieren.
eigentlich dachte ich an folgendes: Gemeinsam mit dem Motor setze ich ein Flag (Item) "Lüfter_XY_am_lueften" mit Expire 30 min. Nach dem Ablauf dieser Zeit soll das Flag (Item) "Lüfter_XY_am_warten" gesetzt werden und "Lüfter_XY_am_Lueften"=0. Expire ebenfalls 30 min. Nach Ablauf dieser dann eben beide Flags auf Null. In den Bedingungen der Rule-Ausführung für Lüfter_An eben dann mit Aufnehmen dass "Lüfter_XY_am_Lueften" und "Lüfter_XY_am_warten" beide auf null sein müssen.

Nun wollte ich also an die Umsetzung gehen und stelle fest: Scheinbar kann im Expire nicht ein beliebiges Command stehen (so hatte ich das bisher verstanden), sondern es kann nur auf das eigene Item zugegriffen werden. Stimmt das so oder irre ich mich hier?

Wie könnte ich das sonst umsetzen?
Es scheint ja auch eine Art von Timern zu geben. Gibt es hierzu irgendwo ein brauchbares Tutorial zu JS-Rules?

LG
Jens

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

Re: Wie zweistufiges Expire realisieren? Oder doch Timer?

Beitrag von udo1toni »

Genau so ist es. Expire ist eine Eigenschaft des Items selbst. Steht das Item auf einem anderen als dem vorgesehenen Wert, wird nach Ablauf der eingestellten Zeit (unter der Voraussetzung, dass es zwischendurch kein Update oder einen anderen Befehl gibt) wahlweise der Status gesetzt oder ein Command zum Status gesendet. Du kannst natürlich zwei Items verwenden, die musst Du aber über eine Rule verknüpfen. Man könnte auch mit einem Follow Profile arbeiten, aber alles in allem wird das (falls es überhaupt funktioniert) komplizierter als eine Rule sein. In der DSL sähe eine passende Rule so aus:

Code: Alles auswählen

var Number nCount = 0
var Timer tVent = null

rule "auto ventilation"
when
    Item Taupunkt_Raum_A changed or
    Item Taupunkt_Aussen changed 
then
    if(nCount > 0)
        return;

    val Number nTauI = if(Taupunkt_Raum_A.state instanceof Number) (Taupunkt_Raum_A.state as Number).floatValue else 0
    val Number nTauA = if(Taupunkt_Aussen.state instanceof Number) (Taupunkt_Aussen.state as Number).floatValue else 0

    if(nTauI - nTauA < 5)
        return;

    nCount = 2
    Luefter.sendCommand(ON)
    tVent = createTimer(now.plusMinutes(30),[|
        nCount = nCount -1
        if(nCount > 0) {
            Luefter.sendCommand(OFF)
            tVent.reschedule(now.plusMinutes(30))
        }
    ])
end
Die Rule triggert, sobald sich einer der Eingangswerte ändert.
Ist der Zähler größer 0, bricht die Rule ab. Ist der Zähler 0, liest die Rule die Werte der beiden Items und vergleicht sie miteinander. Dabei wird jeweils ein Default Wert von 0 angenommen (hier könnte man natürlich auch andere Default Werte nutzen, die kommen nur dann zum Tragen, wenn das Item keinen gültigen Wert enthält). Kommt beim Vergleich ein Wert unter 5 heraus, bricht die Rule ab.
Falls die Rule jetzt noch läuft, sind die Bedingungen erfüllt, den Lüfter zu starten, was auch geschieht. Außerdem wird der Zähler auf 2 gesetzt.
Anschließend läuft der Timer los und die Rule ist beendet.

Läuft der Timer ab, so wird der Zähler um eins vermindert. Anschließend wird, für den Fall, dass der Zähler noch über 0 ist, der Lüfter abgeschaltet und der Timer erneut ausgeführt. Man könnte an dieser Stelle die Ausschaltdauer auch abhängig von der Differenz setzen (also z.B. wenn der Wert immer noch über 5 ist, mach nur 15 Minuten Pause, wenn der Wert unter 5 ist, mach 30 Minuten Pause.

Natürlich gibt es dabei noch eine mögliche Fehlerquelle, wenn nämlich die Rule nicht mehr getriggert wird, weil sich beide Taupunkte nicht mehr ändern. Ich gehe aber davon aus, dass dieses Problem eher theoretischer Natur ist.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

Jensemann_P
Beiträge: 149
Registriert: 26. Jul 2021 20:14

Re: Wie zweistufiges Expire realisieren? Oder doch Timer?

Beitrag von Jensemann_P »

Ich hab jetzt mal n Stück weiter gemacht, aber sehe jetzt den Wald vor Bäumen nicht mehr. Mache auch für heute Schluss. Folgender Code:

Code: Alles auswählen

var minTempKeller, minHumKeller, dew_Aussen;
var dew_Heizraum, hum_Heizraum, temp_Heizraum;
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 FanHeizraum_Timer;
var Interval;
Interval = itemRegistry.getItem("Lueftung_Interval");

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

this.FanHeizraum_Timer = (this.FanHeizraum_Timer === undefined) ? null: this.FanHeizraum_Timer;

// 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 = 8;
minHumKeller = 40;

dew_Aussen = itemRegistry.getItem('Taupunkt_Aussen').getState();


if (dew_Aussen !=null){
  // Lüftungssteuerung Heizraum
  dew_Heizraum = itemRegistry.getItem('Taupunkt_Heizraum').getState();
  hum_Heizraum = itemRegistry.getItem('HTHeizraum_Humidity').getState();
  temp_Heizraum = itemRegistry.getItem('HTHeizraum_Temperature').getState();
  
  //Randbedingungen  
  if (((dew_Heizraum != null) && (hum_Heizraum != null) && (hum_Heizraum >= minHumKeller) && (temp_Heizraum >= minTempKeller))){
    
    //Taupunktdifferenz  
    if (((dew_Aussen + 1) <= dew_Heizraum) ){
      events.sendCommand('LufterHeizraum_Betrieb', "ON");
      events.postUpdate("LuefterHeizraumImIntervall", "ON");
       this.FanHeizraum_Timer = ScriptExecution.createTimer(ZonedDateTime.now().plusMinutes(Interval), function(){events.sendCommand('LuefterHeizraum_Betrieb, "OFF"');});
       this.FanHeizraum_Timer = undefined;
       this.FanHeizraum_Timer = ScriptExecution.createTimer(ZonedDateTime.now().plusMinutes(Interval), function(){events.postUpdate("LuefterHeizraumImIntervall", "OFF");}); 
       this.FanHeizraum_Timer.timer = undefined;
    }
  } 
} 

führt zu dieser Fehlermeldung:

Code: Alles auswählen

2021-10-12 00:33:23.783 [WARN ] [ore.internal.scheduler.SchedulerImpl] - Scheduled job failed and stopped
jdk.nashorn.internal.runtime.ECMAException: TypeError: Can not invoke method [jdk.dynalink.beans.OverloadedDynamicMethod
 Object org.openhab.core.automation.module.script.internal.defaultscope.ScriptBusEvent.sendCommand(Item,Command)
 Object org.openhab.core.automation.module.script.internal.defaultscope.ScriptBusEvent.sendCommand(Item,Number)
 Object org.openhab.core.automation.module.script.internal.defaultscope.ScriptBusEvent.sendCommand(Item,String)
 Object org.openhab.core.automation.module.script.internal.defaultscope.ScriptBusEvent.sendCommand(String,String)
] with the passed arguments; they do not match any of its method signatures.
        at jdk.nashorn.internal.runtime.ECMAErrors.error(ECMAErrors.java:57) ~[jdk.scripting.nashorn:?]
        at jdk.nashorn.internal.runtime.ECMAErrors.typeError(ECMAErrors.java:213) ~[jdk.scripting.nashorn:?]
        at jdk.nashorn.internal.runtime.ECMAErrors.typeError(ECMAErrors.java:185) ~[jdk.scripting.nashorn:?]
        at jdk.nashorn.internal.runtime.ECMAErrors.typeError(ECMAErrors.java:172) ~[jdk.scripting.nashorn:?]
        at jdk.nashorn.internal.runtime.linker.NashornBottomLinker.linkBean(NashornBottomLinker.java:120) ~[jdk.scripting.nashorn:?]
        at jdk.nashorn.internal.runtime.linker.NashornBottomLinker.getGuardedInvocation(NashornBottomLinker.java:78) ~[jdk.scripting.nashorn:?]
        at jdk.dynalink.linker.support.CompositeGuardingDynamicLinker.getGuardedInvocation(CompositeGuardingDynamicLinker.java:109) ~[jdk.dynalink:?]
        at jdk.dynalink.LinkerServicesImpl.lambda$getGuardedInvocation$0(LinkerServicesImpl.java:137) ~[jdk.dynalink:?]
        at jdk.dynalink.LinkerServicesImpl.getWithLookupInternal(LinkerServicesImpl.java:168) ~[jdk.dynalink:?]
        at jdk.dynalink.LinkerServicesImpl.getGuardedInvocation(LinkerServicesImpl.java:135) ~[jdk.dynalink:?]
        at jdk.dynalink.DynamicLinker.relink(DynamicLinker.java:242) ~[jdk.dynalink:?]
        at jdk.nashorn.internal.scripts.Script$Recompilation$1305$1678$\^eval\_.FanHeizraum_Timer(<eval>:40) ~[?:?]
        at jdk.nashorn.javaadapters.org_eclipse_xtext_xbase_lib_Procedures$Procedure0.apply(Unknown Source) ~[?:?]
        at org.openhab.core.model.script.actions.ScriptExecution.lambda$0(ScriptExecution.java:82) ~[?:?]
        at org.openhab.core.internal.scheduler.SchedulerImpl.lambda$12(SchedulerImpl.java:184) ~[?:?]
        at org.openhab.core.internal.scheduler.SchedulerImpl.lambda$1(SchedulerImpl.java:87) ~[?:?]
        at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515) [?:?]
        at java.util.concurrent.FutureTask.run(FutureTask.java:264) [?:?]
        at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:304) [?:?]
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) [?:?]
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) [?:?]
        at java.lang.Thread.run(Thread.java:829) [?:?]

Jensemann_P
Beiträge: 149
Registriert: 26. Jul 2021 20:14

Re: Wie zweistufiges Expire realisieren? Oder doch Timer?

Beitrag von Jensemann_P »

Work in Progress

Momentaner Stand Code:

Code: Alles auswählen

var minTempKeller, minHumKeller, dew_Aussen;
var dew_Heizraum, hum_Heizraum, temp_Heizraum;
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 FanHeizraum_Timer;
var Interval;
Interval = itemRegistry.getItem("Lueftung_Interval").getState();

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

Interval = 1;

this.FanHeizraum_Timer = null;

// 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 = 8;
minHumKeller = 40;

dew_Aussen = itemRegistry.getItem('Taupunkt_Aussen').getState();

function LuefterTeil2(){
  events.postUpdate("LuefterHeizraumImIntervall", "OFF");  
}

function LuefterTeil1(){
  events.sendCommand("LufterHeizraum_Betrieb", "OFF"); 
  this.FanHeizraum_Timer = ScriptExecution.createTimer(ZonedDateTime.now().plusMinutes(Interval), LuefterTeil2()); 
}

if (dew_Aussen !=null){
  // Lüftungssteuerung Heizraum
  dew_Heizraum = itemRegistry.getItem('Taupunkt_Heizraum').getState();
  hum_Heizraum = itemRegistry.getItem('HTHeizraum_Humidity').getState();
  temp_Heizraum = itemRegistry.getItem('HTHeizraum_Temperature').getState();
  
  //Randbedingungen  
  if (((dew_Heizraum != null) && (hum_Heizraum != null) && (hum_Heizraum >= minHumKeller) && (temp_Heizraum >= minTempKeller))){
    
    //Taupunktdifferenz  
    if (((dew_Aussen + 1) <= dew_Heizraum) ){
      events.sendCommand('LufterHeizraum_Betrieb', "ON");
      events.postUpdate("LuefterHeizraumImIntervall", "ON");
       this.FanHeizraum_Timer = ScriptExecution.createTimer(ZonedDateTime.now().plusMinutes(Interval), LuefterTeil1());
    }
  } 
} 
Log dazu:

Code: Alles auswählen

2021-10-12 08:59:56.126 [WARN ] [e.automation.internal.RuleEngineImpl] - Fail to execute action: 3
java.lang.ClassCastException: Cannot cast jdk.nashorn.internal.runtime.Undefined to org.eclipse.xtext.xbase.lib.Procedures$Procedure0
	at java.lang.Class.cast(Class.java:3605) ~[?:?]
	at jdk.nashorn.internal.scripts.Script$Recompilation$2156$905$\^eval\_$cu1$restOf.LuefterTeil1(<eval>:32) ~[?:?]
	at jdk.nashorn.internal.scripts.Script$Recompilation$2152$\^eval\_$cu1$restOf.:program(<eval>:48) ~[?:?]
	at jdk.nashorn.internal.runtime.ScriptFunctionData.invoke(ScriptFunctionData.java:655) ~[jdk.scripting.nashorn:?]
	at jdk.nashorn.internal.runtime.ScriptFunction.invoke(ScriptFunction.java:513) ~[jdk.scripting.nashorn:?]
	at jdk.nashorn.internal.runtime.ScriptRuntime.apply(ScriptRuntime.java:527) ~[jdk.scripting.nashorn:?]
	at jdk.nashorn.api.scripting.NashornScriptEngine.evalImpl(NashornScriptEngine.java:456) ~[jdk.scripting.nashorn:?]
	at jdk.nashorn.api.scripting.NashornScriptEngine.evalImpl(NashornScriptEngine.java:413) ~[jdk.scripting.nashorn:?]
	at jdk.nashorn.api.scripting.NashornScriptEngine.evalImpl(NashornScriptEngine.java:409) ~[jdk.scripting.nashorn:?]
	at jdk.nashorn.api.scripting.NashornScriptEngine.eval(NashornScriptEngine.java:162) ~[jdk.scripting.nashorn:?]
	at javax.script.AbstractScriptEngine.eval(AbstractScriptEngine.java:264) ~[java.scripting:?]
	at org.openhab.core.automation.module.script.internal.handler.ScriptActionHandler.lambda$0(ScriptActionHandler.java:62) ~[?:?]
	at java.util.Optional.ifPresent(Optional.java:183) ~[?:?]
	at org.openhab.core.automation.module.script.internal.handler.ScriptActionHandler.execute(ScriptActionHandler.java:59) ~[?:?]
	at org.openhab.core.automation.internal.RuleEngineImpl.executeActions(RuleEngineImpl.java:1183) ~[?:?]
	at org.openhab.core.automation.internal.RuleEngineImpl.runNow(RuleEngineImpl.java:1035) ~[?:?]
	at org.openhab.core.automation.internal.RuleEngineImpl.runNow(RuleEngineImpl.java:1051) ~[?:?]
	at org.openhab.core.automation.rest.internal.RuleResource.runNow(RuleResource.java:327) ~[?:?]
	at jdk.internal.reflect.GeneratedMethodAccessor89.invoke(Unknown Source) ~[?:?]
	at jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:?]
	at java.lang.reflect.Method.invoke(Method.java:566) ~[?:?]
	at org.apache.cxf.service.invoker.AbstractInvoker.performInvocation(AbstractInvoker.java:179) ~[bundleFile:3.4.3]
	at org.apache.cxf.service.invoker.AbstractInvoker.invoke(AbstractInvoker.java:96) ~[bundleFile:3.4.3]
	at org.apache.cxf.jaxrs.JAXRSInvoker.invoke(JAXRSInvoker.java:201) ~[bundleFile:3.4.3]
	at org.apache.cxf.jaxrs.JAXRSInvoker.invoke(JAXRSInvoker.java:104) ~[bundleFile:3.4.3]
	at org.apache.cxf.interceptor.ServiceInvokerInterceptor$1.run(ServiceInvokerInterceptor.java:59) ~[bundleFile:3.4.3]
	at org.apache.cxf.interceptor.ServiceInvokerInterceptor.handleMessage(ServiceInvokerInterceptor.java:96) ~[bundleFile:3.4.3]
	at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:308) ~[bundleFile:3.4.3]
	at org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:121) ~[bundleFile:3.4.3]
	at org.apache.cxf.transport.http.AbstractHTTPDestination.invoke(AbstractHTTPDestination.java:265) ~[bundleFile:3.4.3]
	at org.apache.cxf.transport.servlet.ServletController.invokeDestination(ServletController.java:234) ~[bundleFile:3.4.3]
	at org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:208) ~[bundleFile:3.4.3]
	at org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:160) ~[bundleFile:3.4.3]
	at org.apache.cxf.transport.servlet.CXFNonSpringServlet.invoke(CXFNonSpringServlet.java:225) ~[bundleFile:3.4.3]
	at org.apache.cxf.transport.servlet.AbstractHTTPServlet.handleRequest(AbstractHTTPServlet.java:298) ~[bundleFile:3.4.3]
	at org.apache.cxf.transport.servlet.AbstractHTTPServlet.doPost(AbstractHTTPServlet.java:217) ~[bundleFile:3.4.3]
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:707) ~[bundleFile:3.1.0]
	at org.apache.cxf.transport.servlet.AbstractHTTPServlet.service(AbstractHTTPServlet.java:273) ~[bundleFile:3.4.3]
	at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:791) ~[bundleFile:9.4.40.v20210413]
	at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:550) ~[bundleFile:9.4.40.v20210413]
	at org.ops4j.pax.web.service.jetty.internal.HttpServiceServletHandler.doHandle(HttpServiceServletHandler.java:71) ~[bundleFile:?]
	at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:143) ~[bundleFile:9.4.40.v20210413]
	at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:602) ~[bundleFile:9.4.40.v20210413]
	at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:127) ~[bundleFile:9.4.40.v20210413]
	at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:235) ~[bundleFile:9.4.40.v20210413]
	at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:1624) ~[bundleFile:9.4.40.v20210413]
	at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:233) ~[bundleFile:9.4.40.v20210413]
	at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1435) ~[bundleFile:9.4.40.v20210413]
	at org.ops4j.pax.web.service.jetty.internal.HttpServiceContext.doHandle(HttpServiceContext.java:294) ~[bundleFile:?]
	at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:188) ~[bundleFile:9.4.40.v20210413]
	at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:501) ~[bundleFile:9.4.40.v20210413]
	at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:1594) ~[bundleFile:9.4.40.v20210413]
	at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:186) ~[bundleFile:9.4.40.v20210413]
	at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1350) ~[bundleFile:9.4.40.v20210413]
	at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141) ~[bundleFile:9.4.40.v20210413]
	at org.ops4j.pax.web.service.jetty.internal.JettyServerHandlerCollection.handle(JettyServerHandlerCollection.java:82) ~[bundleFile:?]
	at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:127) ~[bundleFile:9.4.40.v20210413]
	at org.eclipse.jetty.server.Server.handle(Server.java:516) ~[bundleFile:9.4.40.v20210413]
	at org.eclipse.jetty.server.HttpChannel.lambda$handle$1(HttpChannel.java:388) ~[bundleFile:9.4.40.v20210413]
	at org.eclipse.jetty.server.HttpChannel.dispatch(HttpChannel.java:633) [bundleFile:9.4.40.v20210413]
	at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:380) [bundleFile:9.4.40.v20210413]
	at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:277) [bundleFile:9.4.40.v20210413]
	at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:311) [bundleFile:9.4.40.v20210413]
	at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:105) [bundleFile:9.4.40.v20210413]
	at org.eclipse.jetty.io.ChannelEndPoint$1.run(ChannelEndPoint.java:104) [bundleFile:9.4.40.v20210413]
	at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.runTask(EatWhatYouKill.java:336) [bundleFile:9.4.40.v20210413]
	at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.doProduce(EatWhatYouKill.java:313) [bundleFile:9.4.40.v20210413]
	at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.tryProduce(EatWhatYouKill.java:171) [bundleFile:9.4.40.v20210413]
	at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.run(EatWhatYouKill.java:129) [bundleFile:9.4.40.v20210413]
	at org.eclipse.jetty.util.thread.ReservedThreadExecutor$ReservedThread.run(ReservedThreadExecutor.java:383) [bundleFile:9.4.40.v20210413]
	at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:882) [bundleFile:9.4.40.v20210413]
	at org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.run(QueuedThreadPool.java:1036) [bundleFile:9.4.40.v20210413]
	at java.lang.Thread.run(Thread.java:829) [?:?]
==> /var/log/openhab/events.log <==
2021-10-12 08:59:56.073 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'LufterHeizraum_Betrieb' changed from OFF to ON
2021-10-12 08:59:56.074 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'LuefterHeizraumImIntervall' changed from OFF to ON
2021-10-12 08:59:56.101 [INFO ] [openhab.event.ItemCommandEvent      ] - Item 'LufterHeizraum_Betrieb' received command OFF
2021-10-12 08:59:56.102 [INFO ] [penhab.event.ItemStatePredictedEvent] - Item 'LufterHeizraum_Betrieb' predicted to become OFF
2021-10-12 08:59:56.105 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'LufterHeizraum_Betrieb' changed from ON to OFF
2021-10-12 08:59:56.118 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'LuefterHeizraumImIntervall' changed from ON to OFF
2021-10-12 08:59:56.214 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'LufterHeizraum_Betrieb' changed from OFF to ON
2021-10-12 08:59:56.254 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'LufterHeizraum_Betrieb' changed from ON to OFF
Die Fehlermeldungen/das Debugging spricht null zu mir. Bin vermutlich von .net da etwas verwöhnt :-(

Jensemann_P
Beiträge: 149
Registriert: 26. Jul 2021 20:14

Re: Wie zweistufiges Expire realisieren? Oder doch Timer?

Beitrag von Jensemann_P »

Okaaay, ich habe endlich was funktionierendes Zustande gebracht:

Code: Alles auswählen

Keine Seiten
Administration
TaupunktVergleichHeizraum
 
Status: 
IDLE
 
Unique ID
fddee5fd61
Name
TaupunktVergleichHeizraum
Description
schaltet die Lüftungskreis nach Taupunktvergleich Innen/Aussen
When
Delete
Delete
Then
Delete
But only if
Delete
Tags
Add tag
Edit Script
application/javascript
IDLE
1
var minTempKeller, minHumKeller, dew_Aussen;
2
var dew_Heizraum, hum_Heizraum, temp_Heizraum;
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 Timer2;
8
var Interval;
9
var Delta_DewPoint_Fans;
10
Interval = itemRegistry.getItem("Lueftung_Interval").getState();
11
​
12
//if (Interval = null){
13
//  Interval = 30;
14
//}
15
​
16
​
17
// wenn unter dieser Temperatur oder unter dieser Feuchtigkeit Innen wird nicht gelüftet
18
//var ScriptExecution = Java.type("org.openhab.core.model.script.actions.ScriptExecution");
19
​
20
minTempKeller         = itemRegistry.getItem("MinTempKeller").getState();
21
minHumKeller          = itemRegistry.getItem("MinHumKeller").getState();
22
Delta_DewPoint_Fans   = itemRegistry.get("Delta_DewPoint_Fans").getState();
23
dew_Aussen            = itemRegistry.getItem('Taupunkt_Aussen').getState();
24
​
25
​
26
if (dew_Aussen !=null){
27
  // Lüftungssteuerung Heizraum
28
  dew_Heizraum   = itemRegistry.getItem('Taupunkt_Heizraum').getState();
29
  hum_Heizraum   = itemRegistry.getItem('HTHeizraum_Humidity').getState();
30
  temp_Heizraum  = itemRegistry.getItem('HTHeizraum_Temperature').getState();
31
  
32
  //Randbedingungen  
33
  if (((dew_Heizraum != null) && (hum_Heizraum != null) && (hum_Heizraum >= minHumKeller) && (temp_Heizraum >= minTempKeller))){
34
    
35
    //Taupunktdifferenz  
36
    if (((dew_Aussen + Delta_DewPoint_Fans) <= dew_Heizraum) ){
37
      logger.info("Starte Lüfter Heizraum für Intervallzeit");      
38
      events.sendCommand('LufterHeizraum_Betrieb', "ON");
39
      events.postUpdate("LuefterHeizraumImIntervall", "ON");
40
      Timer1 = ScriptExecution.createTimer(ZonedDateTime.now().plusMinutes(Interval), function(){
41
        logger.info("Stoppe Lüfter Heizraum für Intervallzeit");
42
        events.sendCommand("LufterHeizraum_Betrieb", "OFF"); 
43
            Timer2 = ScriptExecution.createTimer(ZonedDateTime.now().plusMinutes(Interval), function(){
44
              logger.info("Lüfter Heizraum Intervall Ende");
45
              events.postUpdate("LuefterHeizraumImIntervall", "OFF");
46
              Timer2 = null;
47
            });
48
        Timer1 = null;
49
      });
50
    }
51
  } 
52
} 
53
​

Antworten