Seite 1 von 1

Amazon Echo Timer unter OH4.0.2

Verfasst: 18. Aug 2023 10:08
von Wolle17
Hallo,

Kann mir jemand sagen warum der Echo Countdown ( https://community.openhab.org/t/amazon- ... own/116389 ) unter OH4 nicht mehr funktioniert?
Meine Items zeigen alle nur noch NULL an (nur das mit dem Echo verlinkte Item funktioniert ordnungsgemäß)

Danke und schonmal ein schönes WE

Re: Amazon Echo Timer unter OH4.0.2

Verfasst: 18. Aug 2023 16:08
von udo1toni
Von Welcher Version kommst Du? Wie sieht Deine (exakte) Rule dazu aus? Wie sehen die (exakten) Item Definitionen aus?

Grundsätzlich sollte sich nichts geändert haben, es kann aber sein, dass Itemdefinitionen und Änderungen in der Rule Engine hier Anpassungen notwendig machen.

Re: Amazon Echo Timer unter OH4.0.2

Verfasst: 19. Aug 2023 08:39
von Wolle17
Guten Morgen Udo,

Ich habe vier items:
- EchoKuche_NachsterTimer, Datetime, mit Echochannel next Timer verlinkt
-EchoKuche_Countdown, Datetime, dummy, State Description %1$tH:%1$tM:%1$tS
-EchoKuche_NachsterTimerMaxSekunden, number, dummy
-EchoKuche_NachsterTimerSekunden, number, dummy

Die rules:
Start

Code: Alles auswählen

 configuration: {}
triggers:
  - id: "1"
    configuration:
      itemName: EchoKuche_NachsterTimer
      previousState: UNDEF
    type: core.ItemStateChangeTrigger
conditions: []
actions:
  - inputs: {}
    id: "2"
    configuration:
      type: application/javascript
      script: >-
        var zdt = Java.type('java.time.ZonedDateTime'); var duration =
        Java.type('java.time.Duration'); var localTime =
        Java.type('java.time.LocalTime'); var chronunit =
        Java.type('java.time.temporal.ChronoUnit');

        var alarm = itemRegistry.getItem("EchoKuche_NachsterTimer").state; var countdown = itemRegistry.getItem("EchoKuche_Countdown"); var coutndownMaxSekunden = itemRegistry.getItem("EchoKuche_NachsterTimerMaxSekunden"); var coutndownSekunden = itemRegistry.getItem("EchoKuche_NachsterTimerSekunden"); var jetzt = zdt.now().toLocalTime(); var alarmTime = alarm.getZonedDateTime().toLocalTime(); var diff = duration.between(jetzt, alarmTime); var startime = localTime.of(0, 0, 0).plus(diff).truncatedTo(chronunit.SECONDS);


        events.postUpdate(countdown, startime.toString()); events.postUpdate(coutndownMaxSekunden, diff.getSeconds()); events.postUpdate(coutndownSekunden, diff.getSeconds());
    type: script.ScriptAction
  - inputs: {}
    id: "3"
    configuration:
      enable: true
      ruleUIDs:
        - 81f01c329e
    type: core.RuleEnablementAction 
Ende

Code: Alles auswählen

 configuration: {}
triggers:
  - id: "1"
    configuration:
      itemName: EchoKuche_NachsterTimer
      state: UNDEF
    type: core.ItemStateChangeTrigger
conditions: []
actions:
  - inputs: {}
    id: "2"
    configuration:
      enable: false
      ruleUIDs:
        - 81f01c329e
    type: core.RuleEnablementAction
  - inputs: {}
    id: "3"
    configuration:
      type: application/javascript
      script: >-
        var localTime = Java.type('java.time.LocalTime');

        var countdown = itemRegistry.getItem("EchoKuche_Countdown"); var coutndownSekunden = itemRegistry.getItem("EchoKuche_NachsterTimerSekunden"); var startime = localTime.of(0, 0, 0);

        events.postUpdate(countdown, startime.toString()); events.postUpdate(coutndownSekunden, 0);
    type: script.ScriptAction
Countdown

Code: Alles auswählen

 configuration: {}
triggers:
  - id: "1"
    configuration:
      cronExpression: "* * * * * ? *"
    type: timer.GenericCronTrigger
conditions: []
actions:
  - inputs: {}
    id: "2"
    configuration:
      type: application/javascript
      script: >-
        var zdt = Java.type('java.time.ZonedDateTime'); var duration =
        Java.type('java.time.Duration'); var localTime =
        Java.type('java.time.LocalTime'); var chronunit =
        Java.type('java.time.temporal.ChronoUnit');

        var alarm = itemRegistry.getItem("EchoKuche_NachsterTimer").state; var countdown = itemRegistry.getItem("EchoKuche_Countdown"); var coutndownSekunden = itemRegistry.getItem("EchoKuche_NachsterTimerSekunden");

        var jetzt = zdt.now().toLocalTime(); var alarmTime = alarm.getZonedDateTime().toLocalTime(); var diff = duration.between(jetzt, alarmTime); var startime = localTime.of(0, 0, 0).plus(diff).truncatedTo(chronunit.SECONDS);

        events.postUpdate(countdown, startime.toString()); events.postUpdate(coutndownSekunden, diff.getSeconds());
    type: script.ScriptAction 
Danke für die Hilfe

Re: Amazon Echo Timer unter OH4.0.2

Verfasst: 19. Aug 2023 09:27
von udo1toni
Die Rules sind hervorragende Beispiele, warum ich JavaScript in openHAB als unnötig empfinde. :)

Egal... Hast Du JavaScript Scripting installiert? in openHAB4 ist das nicht automatisch eingerichtet.

Meines Wissens sind einige Klimmzüge, die früher unvermeidbar waren, jetzt nicht mehr notwendig.
Da müsstest Du allerdings selbst die Doku für openHAB JavaScript Scripting lesen, mit JavaScript Scripting beschäftige ich mich eher nicht.

PS: Aus irgendeinem Grund ist der Code in Deinen Rules komplett falsch umgebrochen. Für die Ausführung hat das keine Auswirkungen, wohl aber für die Lesbarkeit. Eine Anweisung in JavaScript endet mit einem Semikolon, Du kannst Also erst mal alle Zeilen nach jedem Semikolon umbrechen. Bleiben nun Zeilen übrig, die nicht mit einme Semikolon enden, so kannst Du die nachfolgende Zeile mit dieser Zeile verbinden. Dann sehen die Rules so aus:

Code: Alles auswählen

 configuration: {}
triggers:
  - id: "1"
    configuration:
      itemName: EchoKuche_NachsterTimer
      previousState: UNDEF
    type: core.ItemStateChangeTrigger
conditions: []
actions:
  - inputs: {}
    id: "2"
    configuration:
      type: application/javascript
      script: >-
        var zdt = Java.type('java.time.ZonedDateTime'); 
        var duration = Java.type('java.time.Duration'); 
        var localTime = Java.type('java.time.LocalTime');
        var chronunit = Java.type('java.time.temporal.ChronoUnit');
        var alarm = itemRegistry.getItem("EchoKuche_NachsterTimer").state;
        var countdown = itemRegistry.getItem("EchoKuche_Countdown");
        var coutndownMaxSekunden = itemRegistry.getItem("EchoKuche_NachsterTimerMaxSekunden");
        var coutndownSekunden = itemRegistry.getItem("EchoKuche_NachsterTimerSekunden");
        var jetzt = zdt.now().toLocalTime();
        var alarmTime = alarm.getZonedDateTime().toLocalTime();
        var diff = duration.between(jetzt, alarmTime);
        var startime = localTime.of(0, 0, 0).plus(diff).truncatedTo(chronunit.SECONDS);

        events.postUpdate(countdown, startime.toString()); 
        events.postUpdate(coutndownMaxSekunden, diff.getSeconds());
        events.postUpdate(coutndownSekunden, diff.getSeconds());
    type: script.ScriptAction
  - inputs: {}
    id: "3"
    configuration:
      enable: true
      ruleUIDs:
        - 81f01c329e
    type: core.RuleEnablementAction 

 configuration: {}
triggers:
  - id: "1"
    configuration:
      itemName: EchoKuche_NachsterTimer
      state: UNDEF
    type: core.ItemStateChangeTrigger
conditions: []
actions:
  - inputs: {}
    id: "2"
    configuration:
      enable: false
      ruleUIDs:
        - 81f01c329e
    type: core.RuleEnablementAction
  - inputs: {}
    id: "3"
    configuration:
      type: application/javascript
      script: >-
        var localTime = Java.type('java.time.LocalTime');
        var countdown = itemRegistry.getItem("EchoKuche_Countdown");
        var coutndownSekunden = itemRegistry.getItem("EchoKuche_NachsterTimerSekunden");
        var startime = localTime.of(0, 0, 0);

        events.postUpdate(countdown, startime.toString());
        events.postUpdate(coutndownSekunden, 0);
    type: script.ScriptAction

 configuration: {}
triggers:
  - id: "1"
    configuration:
      cronExpression: "* * * * * ? *"
    type: timer.GenericCronTrigger
conditions: []
actions:
  - inputs: {}
    id: "2"
    configuration:
      type: application/javascript
      script: >-
        var zdt = Java.type('java.time.ZonedDateTime');
        var duration = Java.type('java.time.Duration');
        var localTime = Java.type('java.time.LocalTime');
        var chronunit = Java.type('java.time.temporal.ChronoUnit');

        var alarm = itemRegistry.getItem("EchoKuche_NachsterTimer").state;
        var countdown = itemRegistry.getItem("EchoKuche_Countdown");
        var coutndownSekunden = itemRegistry.getItem("EchoKuche_NachsterTimerSekunden");

        var jetzt = zdt.now().toLocalTime();
        var alarmTime = alarm.getZonedDateTime().toLocalTime();
        var diff = duration.between(jetzt, alarmTime);
        var startime = localTime.of(0, 0, 0).plus(diff).truncatedTo(chronunit.SECONDS);

        events.postUpdate(countdown, startime.toString());
        events.postUpdate(coutndownSekunden, diff.getSeconds());
    type: script.ScriptAction 
und man kann besser verstehen, was da passiert.

Re: Amazon Echo Timer unter OH4.0.2

Verfasst: 21. Aug 2023 10:23
von Wolle17
Hallo,
Ja, JavaScript Scripting ist installiert,

Ich habe mal im Log nachgesehen und da kommt folgender Fehler:

2923-08-21 09:17:34.900 [ERROR] [internal.handler.ScriptActionHandler] - Script execution of rule with UID '4cf705d028' failed: org.graalvm.polyglot.PolyglotException: ReferenceError: "itemRegistry" is not defined

Re: Amazon Echo Timer unter OH4.0.2

Verfasst: 21. Aug 2023 11:35
von udo1toni
Ich fürchte, direkt helfen kann ich Dir nicht (eben weil ich keine JavaScript Scripte verwende...) aber ein Hinweis: unter OH3 war Nashorn im Einsatz und unter OH4 ist Nashorn lediglich noch als Option möglich. GraalVM ist ist die bevorzugte Version, wird aber anders programmiert, d.h. Du musst die Scripte anpassen (selbst wenn Du Nashorn installierst, musst Du die Scripte anpassen, weil die JavaScript Scripting Engine einen anderen Namen verwendet - allerdings sollte es in diesem Fall reichen, ein Script zu öffnen und neu zu speichern, openHAB sollte die Anpassung dann automatisch vornehmen.

Re: Amazon Echo Timer unter OH4.0.2

Verfasst: 21. Aug 2023 12:35
von Wolle17
Ich hab es jetzt…

Ich habe JavaScript Scripting deinstalliert (weiß nicht ob es wirklich nötig war), Nashorn installiert und dann im Code der Rule den type: application/javascript
in
type: application/javascript;version=ECMAScript-5.1 geändert.