Script mehrfache Ausführung möglich?

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Benutzeravatar
lenschith
Beiträge: 313
Registriert: 11. Dez 2020 22:36
Answers: 0

Script mehrfache Ausführung möglich?

Beitrag von lenschith »

Hallo,
ich habe mir ein BlocklyScript erstellt das mir die Laufzeit einer Waschmaschine hochzählt. Das funktioniert auch soweit. Evtl. kann man das auch schöner/besser umsetzten aber so läuft das gerade bei mir. Nun bin ich auf die Idee gekommen ob es evtl. möglich ist dieses Script in weiteren Rules zu verwenden. Gibt es irgendeine Möglichkeit ein Script zur selben Zeit mehrmals auszuführen und unterschiedliche Werte in Unterschiedlich Items zu schreiben. Also quasi, Geschirrspüler läuft bereits und später startet die Waschmaschine und ich möchte die Laufzeit sehen.

Das Script, hier habe ich bereits die Items durch verschiedene Variablen ersetzt. Die Timer starten auch, jedoch wenn Timer1 läuft und Timer2 startet wird Timer1 gestoppt. Liegt vermutlich an den Variablen der Zeitberechnung.
timer1.png

Code: Alles auswählen

var TriggerItem, ItemObjekt, tTimer, iTimer, iHour, iMinute, strState;


TriggerItem = ctx['TriggerItem'];
ItemObjekt = ctx['getItem'];
tTimer = ctx['tTimer'];
if (cache.private.exists(tTimer)) { cache.private.remove(tTimer).cancel(); };
if (TriggerItem == 'OFF') {
  ItemObjekt.postUpdate('');
} else {
  iTimer = 0;
  if (cache.private.exists(tTimer) === false || cache.private.get(tTimer).hasTerminated()) {
    cache.private.put(tTimer, actions.ScriptExecution.createTimer(tTimer, time.ZonedDateTime.now().plusMinutes(1), function (timer_context) {
      iTimer = (typeof iTimer === 'number' ? iTimer : 0) + 1;
      iHour = Math.floor((iTimer / 60));
      iMinute = iTimer - iHour * 60;
      strState = [iHour,':',iMinute < 10 ? '0' + String(iMinute) : iMinute].join('');
      ItemObjekt.postUpdate(strState);
      if (cache.private.exists(tTimer)) { cache.private.get(tTimer).reschedule(time.ZonedDateTime.now().plusMinutes(1)); };
      }, ));
  };
}
Der Sccriptaufruf einer einer Rule:
timer2.png

Code: Alles auswählen

var tTimer, Number2, ItemObject;


tTimer = ctx.ruleUID;
ItemObject = items.getItem('TestString');
rules.runRule('Script_Timer', {'TriggerItem': event.itemState?.toString(), 'getItem': ItemObject, 'tTimer': tTimer});
Gibt es hierfür eine Möglichkeit?
Danke
Gruß Lenschi
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
openHAB4.3.3 in einem Docker Container auf RPI5-8GB, AVM: Fritz!Box 7590 - SMART301/302 - Comet, SMART200/210, SMART440, Alexa, Shelly, Tasmota, ESP Easy, WLED

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

Re: Script mehrfache Ausführung möglich?

Beitrag von Harka »

Moin,
Warnung vorab - ich bin da definitiv auch kein Profi.
Wird Timer 1 gestoppt oder nur dessen iTimer wieder auf 0 gesetzt? Ich frage weil die Deklaration außerhalb des folgenden Timers liegt und damit außerhalb der damit einhergehenden Funktion. Ich habe das so in Erinnerung, dass Variablen innerhalb von Funktionen abgeschottet sind und damit iTimer diesen Schutz noch nicht erhält.
Wenn meine Vermutung richtig ist sehe ich 2 Lösungsansätze. Entweder du übergibst schon beim Aufruf an Stelle von iTimer von der Ausgangsregel ein weiteren Parameter oder schottest alles in einer Funktion ab.
PS: ich bevorzuge Funktionen die seid OH4 leicht in andere Regeln kopiert werden können. Da habe ich imho eine bessere Kontrolle.

Benutzeravatar
lenschith
Beiträge: 313
Registriert: 11. Dez 2020 22:36
Answers: 0

Re: Script mehrfache Ausführung möglich?

Beitrag von lenschith »

Timer1 wird beim starten auf 0 gesetzt. ich muss den Timer ja beim Start wieder auf 0 setzten. Das mit dem kopieren ist natürlich auch eine Möglichkeit. Aber währe interessant zu wissen ob das gehen würde. wie meinst du einen weiteren Parameter übergeben?
openHAB4.3.3 in einem Docker Container auf RPI5-8GB, AVM: Fritz!Box 7590 - SMART301/302 - Comet, SMART200/210, SMART440, Alexa, Shelly, Tasmota, ESP Easy, WLED

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

Re: Script mehrfache Ausführung möglich?

Beitrag von Harka »

Der Gedanke war unnötig kompliziert :oops:
Einfacher ist es an Stelle der "normalen" Variablen den unterschiedlich benannten Cache zu nutzen. Dem Beispiel habe ich auch gleich noch beigefügt wie ich das mit der Funktion meine.
E: nameTimer ist hier aber etwas unglücklich gewählt. Nenn das Ding anders ^^
Timerregel08.png
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

Benutzeravatar
lenschith
Beiträge: 313
Registriert: 11. Dez 2020 22:36
Answers: 0

Re: Script mehrfache Ausführung möglich?

Beitrag von lenschith »

Danke für die Unterstützung. Ich bin mir nicht ganz sicher ob ich das richtig verstanden habe. Ich habe mein Blockly mal angepasst.
timer3.png
Der Timer funktioniert auch so. ich löse von einer Rule aus und der Count läuft los. Auslöser Rule1 läuft und die Zeit läuft auch. Wenn ich jetzt das Script von Rule 2 auslöse. bleibt die Zeit von Rule1 stehen und die Zeit für das Item der Rule2 läuft los.

Hab ich noch einen Fehler? Oder geht das einfach nicht?
Wenn es einfach nicht geht werde ich das mit der Funktion in der Rule abbilden. Ist ja auch sauber.
Gruß Lenschi
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
openHAB4.3.3 in einem Docker Container auf RPI5-8GB, AVM: Fritz!Box 7590 - SMART301/302 - Comet, SMART200/210, SMART440, Alexa, Shelly, Tasmota, ESP Easy, WLED

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

Re: Script mehrfache Ausführung möglich?

Beitrag von Harka »

ja, so war es gemeint. Du hast jetzt Sekunden gewählt. Mit etwas Glück macht OH nur zum Selbstschutz dicht? Sonst fällt mir aktuell nichts ein.
E: STOP - Blockly deklariert Variablen ja schon im Kopf und damit gilt der oben genannte Schutz innerhalb der Timer-Funktion nicht. Wenn ich damit recht habe wird es mit der externen Rule nur was wenn Du alle Variablen auf diese Weise durch umbenannte Cache-Werte ersetzt. Versuchs lieber mit der Funktionslösung.
E2: irgendwie dreht es sich im Kopf. Das mit den anderen Variablen dürfte doch keine Rolle spielen …
Zuletzt geändert von Harka am 8. Aug 2024 05:35, insgesamt 1-mal geändert.

Benutzeravatar
lenschith
Beiträge: 313
Registriert: 11. Dez 2020 22:36
Answers: 0

Re: Script mehrfache Ausführung möglich?

Beitrag von lenschith »

ok, danke für eine Hilfe. werde ich dann mal mit der Funktion umbauen.
openHAB4.3.3 in einem Docker Container auf RPI5-8GB, AVM: Fritz!Box 7590 - SMART301/302 - Comet, SMART200/210, SMART440, Alexa, Shelly, Tasmota, ESP Easy, WLED

Benutzeravatar
lenschith
Beiträge: 313
Registriert: 11. Dez 2020 22:36
Answers: 0

Re: Script mehrfache Ausführung möglich?

Beitrag von lenschith »

Du hast jetzt Sekunden gewählt. Mit etwas Glück macht OH nur zum Selbstschutz dicht?
Auch die Umstellung auf Minuten hat das selbe verhalten, habe nur Sekunden gewählt um schneller eine Reaktion zu sehen
E2: irgendwie dreht es sich im Kopf. Das mit den anderen Variablen dürfte doch keine Rolle spielen
Im Log kann ich nichts sehen, wenn Timer1 läuft und ich schalte Timer2 ein dann wird Timer1 pausiert

Code: Alles auswählen

2024-08-07 22:19:54.939 [INFO ] [openhab.event.ItemCommandEvent      ] - Item 'TestSwitch' received command ON
2024-08-07 22:19:54.940 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'TestSwitch' changed from OFF to ON
2024-08-07 22:19:54.942 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'TestString2' changed from  to 0:00
2024-08-07 22:19:55.942 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'TestString2' changed from 0:00 to 0:01
2024-08-07 22:19:56.941 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'TestString2' changed from 0:01 to 0:02
2024-08-07 22:19:57.941 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'TestString2' changed from 0:02 to 0:03
2024-08-07 22:19:58.940 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'TestString2' changed from 0:03 to 0:04
2024-08-07 22:19:59.940 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'TestString2' changed from 0:04 to 0:05
2024-08-07 22:20:00.036 [INFO ] [openhab.event.ItemCommandEvent      ] - Item 'TestSwitch2' received command ON
2024-08-07 22:20:00.036 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'TestSwitch2' changed from OFF to ON
2024-08-07 22:20:00.037 [INFO ] [hab.event.GroupItemStateChangedEvent] - Item 'mapdb_test' changed from OFF to ON through TestSwitch2
2024-08-07 22:20:00.038 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'TestString' changed from  to 0:00
2024-08-07 22:20:00.940 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'TestString' changed from 0:00 to 0:01
2024-08-07 22:20:01.939 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'TestString' changed from 0:01 to 0:02
2024-08-07 22:20:02.939 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'TestString' changed from 0:02 to 0:03
2024-08-07 22:20:03.940 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'TestString' changed from 0:03 to 0:04
2024-08-07 22:20:04.940 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'TestString' changed from 0:04 to 0:05
Ich denke ich mach da einfach nen Haken dran und mach das in der Rule für jedes Gerät. Scheint mir stabiler und sicherer zu sein.
Danke für deine Tipps. Hab wieder mal einiges gelernt ;)

Gruß Lenschi
openHAB4.3.3 in einem Docker Container auf RPI5-8GB, AVM: Fritz!Box 7590 - SMART301/302 - Comet, SMART200/210, SMART440, Alexa, Shelly, Tasmota, ESP Easy, WLED

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

Re: Script mehrfache Ausführung möglich?

Beitrag von Harka »

Hat mir keine Ruhe gelassen :geek: und nach langen hin und her habe ich was gefunden. Hat irgendwie doch mit den Variablen zu tun (hab es nur zu 80% verstanden). Ich habe den neuen context-Parameter vom Timer verwendet und damit die Timer-Variablen innerhalb der Timerfunktion neu zugewiesen. Nun laufen die Counter für jedes auslösende Item sauber getrennt. Ich stell es mal hier rein falls es noch mal jemand brauch.
sItem ist bei mir der Name (String) des betreffenden Items.
Timerregel081.png
E: Hier noch eine andere Herangehensweise. Ob schöner ... weiß nicht. Ist aber imho etwas effizienter.
E2: nach Studium alter Unterlagen empfehle ich die erste Variante zu meiden. Ich sehe nur in der komplette Parameterübergabe mit context als zuverlässig an.
Timerregel082.png
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
Zuletzt geändert von Harka am 11. Aug 2024 19:32, insgesamt 1-mal geändert.

Benutzeravatar
lenschith
Beiträge: 313
Registriert: 11. Dez 2020 22:36
Answers: 0

Re: Script mehrfache Ausführung möglich?

Beitrag von lenschith »

Vielen Dank.
Der Counter im Log funktioniert super. aber ich schaffe das nicht in mein Item das in einer Variable steht zu schreiben.
Gibt es da noch was ich übersehen habe.

Code: Alles auswählen

2024-08-10 22:25:44.081 [WARN ] [ab.automation.script.ui.Script_Timer] - TimeCounter: 1  --  strState: 0:01 Context: TestString (Type=StringItem, State=, Label=TestString1, Category=text, Tags=[Point], Groups=[test, mapdb_test])
2024-08-10 22:25:44.082 [WARN ] [ore.internal.scheduler.SchedulerImpl] - Scheduled job 'Timer_TestString (Type=StringItem, State=, Label=TestString1, Category=text, Tags=[Point], Groups=[test, mapdb_test])' failed and stopped
org.graalvm.polyglot.PolyglotException: TypeError: Context.postUpdate is not a function
	at <js>.:anonymous(<eval>:23) ~[?:?]
	at <js>.r(@openhab-globals.js:2) ~[?:?]
	at com.oracle.truffle.polyglot.PolyglotFunctionProxyHandler.invoke(PolyglotFunctionProxyHandler.java:154) ~[bundleFile:?]
	at jdk.proxy1.$Proxy346.run(Unknown Source) ~[?:?]
	at org.openhab.automation.jsscripting.internal.threading.ThreadsafeTimers.lambda$0(ThreadsafeTimers.java:85) ~[bundleFile:?]
	at org.openhab.core.internal.scheduler.SchedulerImpl.lambda$12(SchedulerImpl.java:189) ~[?:?]
	at org.openhab.core.internal.scheduler.SchedulerImpl.lambda$1(SchedulerImpl.java:88) ~[?:?]
	at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539) [?:?]
	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:1136) [?:?]
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) [?:?]
	at java.lang.Thread.run(Thread.java:840) [?:?]
openHAB4.3.3 in einem Docker Container auf RPI5-8GB, AVM: Fritz!Box 7590 - SMART301/302 - Comet, SMART200/210, SMART440, Alexa, Shelly, Tasmota, ESP Easy, WLED

Antworten