TR-064 Binding und OH3

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

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

Re: TR-064 Binding und OH3

Beitrag von udo1toni »

Du bist aber auf openHAB3?

ok, nächster Versuch... now.get(INSTANT_SECONDS), alternativ now.getLong(INSTANT_SECONDS).
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

Benutzeravatar
scotty
Beiträge: 676
Registriert: 28. Apr 2020 04:44
Answers: 0

Re: TR-064 Binding und OH3

Beitrag von scotty »

udo1toni hat geschrieben: 16. Okt 2022 06:14 Du bist aber auf openHAB3?

ok, nächster Versuch... now.get(INSTANT_SECONDS), alternativ now.getLong(INSTANT_SECONDS).
Ich bin auf OH3.3

beide Versuche negativ

Code: Alles auswählen

2022-10-16 07:47:42.295 [ERROR] [internal.handler.ScriptActionHandler] - Script execution of rule with UID 'fritzbox_94-1' failed: An error occurred during the script execution: Could not invoke method: org.openhab.core.model.script.actions.BusEvent.postUpdate(java.lang.String,java.lang.String) on instance: null in fritzbox_94
2022-10-16 07:47:42.307 [ERROR] [internal.handler.ScriptActionHandler] - Script execution of rule with UID 'fritzbox_94-3' failed: The name 'callDauer' cannot be resolved to an item or type; line 107, column 31, length 9 in fritzbox_94
2022-10-16 07:47:45.707 [ERROR] [internal.handler.ScriptActionHandler] - Script execution of rule with UID 'fritzbox_94-1' failed: The name 'INSTANT_SECONDS' cannot be resolved to an item or type; line 9, column 35, length 15 in fritzbox_94
2022-10-16 07:47:49.210 [ERROR] [internal.handler.ScriptActionHandler] - Script execution of rule with UID 'fritzbox_94-1' failed: The name 'INSTANT_SECONDS' cannot be resolved to an item or type; line 11, column 34, length 15 in fritzbox_94
OH 3.4.5 im Docker auf Synology DS918+ mit USV, Reolink-RLC-511WA, Philips Hue, AVM Fritz!Box 6591C, Alexa, Logitech Harmony und diversen Shelly's

Harka
Beiträge: 308
Registriert: 30. Apr 2021 13:13
Answers: 15

Re: TR-064 Binding und OH3

Beitrag von Harka »

Auch wenn es nur mit Blockly zusammengeklickt wurde - ev. hilft Dir ja der erzeugte Javascript-Code bei der Fehlersuche weiter.

Code: Alles auswählen

if (typeof this.storedValues === 'undefined') {
  this.storedValues = [];
}

var dtf = Java.type("java.time.format.DateTimeFormatter");

var zdt = Java.type("java.time.ZonedDateTime");

/* Try to detect the format based on its length */
function getZonedDateTime(datetime) {
  datetime = String(datetime).replace('T', ' ')
  switch (datetime.length) {
    case 10: return zdt.parse(datetime + ' 00:00:00+00:00', dtf.ofPattern('yyyy-MM-dd HH:mm:ssz'));
    case 16: return zdt.parse(datetime + ':00+00:00', dtf.ofPattern('yyyy-MM-dd HH:mm:ssz'));
    case 19: return zdt.parse(datetime + '+00:00', dtf.ofPattern('yyyy-MM-dd HH:mm:ssz'));
    case 25: return zdt.parse(datetime, dtf.ofPattern('yyyy-MM-dd HH:mm:ssz'));
    case 23: return zdt.parse(datetime + ' +00:00', dtf.ofPattern('yyyy-MM-dd HH:mm:ss.SSS z'));
    case 26: return zdt.parse(datetime + ' +00:00', dtf.ofPattern('yyyy-MM-dd HH:mm:ss.SSSSSS z'));
    case 29: return zdt.parse(datetime, dtf.ofPattern('yyyy-MM-dd HH:mm:ss.SSSSz'));
    case 32: return zdt.parse(datetime, dtf.ofPattern('yyyy-MM-dd HH:mm:ss.SSSSSSSz'));
    case 28: return zdt.parse(datetime.slice(0,26) + ':' + datetime.slice(26,28), dtf.ofPattern('yyyy-MM-dd HH:mm:ss.SSSSz'));
    default: return zdt.parse(datetime);
  }
}

function createZonedDateTime(year, month, day, hour, minute, second, nano, offsetString, timezoneString) {
  stringToParse = '' + year;
  stringToParse += '-' + ('0' + month).slice(-2);
  stringToParse += '-' + ('0' + day).slice(-2);
  stringToParse += 'T' + ('0' + hour).slice(-2);
  stringToParse += ':' + ('0' + minute).slice(-2);
  stringToParse += ':' + ('0' + second).slice(-2);
  stringToParse += '.' + nano + offsetString + '[' + timezoneString + ']';
  return zdt.parse(stringToParse, dtf.ISO_ZONED_DATE_TIME);
}

var logger = Java.type('org.slf4j.LoggerFactory').getLogger('org.openhab.rule.' + ctx.ruleUID);

var chronoUnit = Java.type("java.time.temporal.ChronoUnit");


if (typeof this.storedValues['FritzAnrufStart'] === 'undefined') {
  this.storedValues['FritzAnrufStart'] = '0';
}
if (event.itemState == 'ACTIVE') {
  this.storedValues['FritzAnrufStart'] = ((zdt.now()).format(dtf.ofPattern('yyyy-MM-dd\'T\'HH:mm:ss.SSSZ')));
} else if (event.oldItemState == 'ACTIVE' && event.itemState == 'IDLE') {
  logger.warn((chronoUnit.SECONDS.between((getZonedDateTime((this.storedValues['FritzAnrufStart']))),(zdt.now()))));
}
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

Benutzeravatar
scotty
Beiträge: 676
Registriert: 28. Apr 2020 04:44
Answers: 0

Re: TR-064 Binding und OH3

Beitrag von scotty »

@Harka
Ich hätte deinen Vorschlag gerne getestet. Allerdings verursacht der Code schon beim Laden eine Menge Fehlermeldungen und ich weiß nicht, wo die Ursache liegt.
Da scheint etwas mit der Struktur nicht zu stimmen.
OH 3.4.5 im Docker auf Synology DS918+ mit USV, Reolink-RLC-511WA, Philips Hue, AVM Fritz!Box 6591C, Alexa, Logitech Harmony und diversen Shelly's

Harka
Beiträge: 308
Registriert: 30. Apr 2021 13:13
Answers: 15

Re: TR-064 Binding und OH3

Beitrag von Harka »

mmmh, hab es gerade noch mal als reines JS-Script getestet. Hier funktionickelt es unter der Bedingung das Edition 5.1 gewählt wurde. Anbei noch mal der komplette Rule-Code für die wo nur noch der Trigger anzupassen sein sollte (falls Du noch ein Versuch wagen möchtest^^).

Code: Alles auswählen

configuration: {}
triggers:
  - id: "1"
    configuration:
      itemName: FRITZBox7490_Anrufzustand
    type: core.ItemStateChangeTrigger
conditions: []
actions:
  - inputs: {}
    id: "3"
    configuration:
      type: application/javascript
      script: >-
        if (typeof this.storedValues === 'undefined') {
          this.storedValues = [];
        }


        var dtf = Java.type("java.time.format.DateTimeFormatter");


        var zdt = Java.type("java.time.ZonedDateTime");


        /* Try to detect the format based on its length */

        function getZonedDateTime(datetime) {
          datetime = String(datetime).replace('T', ' ')
          switch (datetime.length) {
            case 10: return zdt.parse(datetime + ' 00:00:00+00:00', dtf.ofPattern('yyyy-MM-dd HH:mm:ssz'));
            case 16: return zdt.parse(datetime + ':00+00:00', dtf.ofPattern('yyyy-MM-dd HH:mm:ssz'));
            case 19: return zdt.parse(datetime + '+00:00', dtf.ofPattern('yyyy-MM-dd HH:mm:ssz'));
            case 25: return zdt.parse(datetime, dtf.ofPattern('yyyy-MM-dd HH:mm:ssz'));
            case 23: return zdt.parse(datetime + ' +00:00', dtf.ofPattern('yyyy-MM-dd HH:mm:ss.SSS z'));
            case 26: return zdt.parse(datetime + ' +00:00', dtf.ofPattern('yyyy-MM-dd HH:mm:ss.SSSSSS z'));
            case 29: return zdt.parse(datetime, dtf.ofPattern('yyyy-MM-dd HH:mm:ss.SSSSz'));
            case 32: return zdt.parse(datetime, dtf.ofPattern('yyyy-MM-dd HH:mm:ss.SSSSSSSz'));
            case 28: return zdt.parse(datetime.slice(0,26) + ':' + datetime.slice(26,28), dtf.ofPattern('yyyy-MM-dd HH:mm:ss.SSSSz'));
            default: return zdt.parse(datetime);
          }
        }


        function createZonedDateTime(year, month, day, hour, minute, second, nano, offsetString, timezoneString) {
          stringToParse = '' + year;
          stringToParse += '-' + ('0' + month).slice(-2);
          stringToParse += '-' + ('0' + day).slice(-2);
          stringToParse += 'T' + ('0' + hour).slice(-2);
          stringToParse += ':' + ('0' + minute).slice(-2);
          stringToParse += ':' + ('0' + second).slice(-2);
          stringToParse += '.' + nano + offsetString + '[' + timezoneString + ']';
          return zdt.parse(stringToParse, dtf.ISO_ZONED_DATE_TIME);
        }


        var logger = Java.type('org.slf4j.LoggerFactory').getLogger('org.openhab.rule.' + ctx.ruleUID);


        var chronoUnit = Java.type("java.time.temporal.ChronoUnit");



        if (typeof this.storedValues['FritzAnrufStart'] === 'undefined') {
          this.storedValues['FritzAnrufStart'] = '0';
        }

        if (event.itemState == 'ACTIVE') {
          this.storedValues['FritzAnrufStart'] = ((zdt.now()).format(dtf.ofPattern('yyyy-MM-dd\'T\'HH:mm:ss.SSSZ')));
        } else if (event.oldItemState == 'ACTIVE' && event.itemState == 'IDLE') {
          logger.warn((chronoUnit.SECONDS.between((getZonedDateTime((this.storedValues['FritzAnrufStart']))),(zdt.now()))));
        }
    type: script.ScriptAction

Benutzeravatar
scotty
Beiträge: 676
Registriert: 28. Apr 2020 04:44
Answers: 0

Re: TR-064 Binding und OH3

Beitrag von scotty »

Selbstverständlich bin ich für weitere Versuche offen. Aber zunächst einmal, was hat es mit der Bedingung 5.1 auf sich?
Als nächstes: bei mir läuft openhab 3.3 im Docker auf einer Synology DS918+ und meine Rules schreibe ich textbasiert (oder DSL?).

Wie wird dein Regel-Beispiel denn verwendet, diese Vorgehensweise ist mir (ehrlich gesagt) fremd.
OH 3.4.5 im Docker auf Synology DS918+ mit USV, Reolink-RLC-511WA, Philips Hue, AVM Fritz!Box 6591C, Alexa, Logitech Harmony und diversen Shelly's

Harka
Beiträge: 308
Registriert: 30. Apr 2021 13:13
Answers: 15

Re: TR-064 Binding und OH3

Beitrag von Harka »

jo, da wirds ungemütlich. Mein Beispiel ist nichts für Oldschool sondern für die UI-Weboberfläche ip:8080/settings/rules/ (+) für Neu .... Ich vermute das es bei Dir zwar nutzbar ist aber ein Mischbetrieb macht imho kein Spaß. Will Dich auch nicht bekehren sondern hatte nur gehofft das Du daraus eine alternative Herangehensweise an dein Sekunden-Problem ableiten kanns. Javascript Edition 5.1 ist im letzten Code schon hinterlegt.

Benutzeravatar
scotty
Beiträge: 676
Registriert: 28. Apr 2020 04:44
Answers: 0

Re: TR-064 Binding und OH3

Beitrag von scotty »

Oldschool - naja, ich weiß nicht. Ich arbeitet schon einige Jahre mit Linux und habe Spaß an Automation durch Bash-Scripte o. ä.
Unter openhab 3.3 ist das Binding Javascript bereits installiert.
Es hat zwar etwas gedauert, aber ich weiß jetzt was du meinst. Den bereits angesprochenen Mischbetrieb verwende ich bedingt durch die Tatsache dass es Situationen gab in denen ich text-basiert nicht weiter kam. Ich bevorzuge diese Methode weil sie für mich schneller zu korrigieren ist. Wobei ich glaube, dass der Aufbau über die UI-Weboberfläche:Port einfacher funktioniert.
Ich sage mal so: komme ich mit meiner Vorgehensweise nicht weiter, werde ich versuchen, deinen Code zu "übersetzen" oder den Mischbetrieb anzuwenden.

Jedenfalls bis hierhin schon mal vielen Dank.
OH 3.4.5 im Docker auf Synology DS918+ mit USV, Reolink-RLC-511WA, Philips Hue, AVM Fritz!Box 6591C, Alexa, Logitech Harmony und diversen Shelly's

Benutzeravatar
scotty
Beiträge: 676
Registriert: 28. Apr 2020 04:44
Answers: 0

Re: TR-064 Binding und OH3

Beitrag von scotty »

@Udo

mal eine Frage zwischendurch: wenn ich die Variable callDauer global als String deklarieren möchte, wie muss das formuliert werden?
OH 3.4.5 im Docker auf Synology DS918+ mit USV, Reolink-RLC-511WA, Philips Hue, AVM Fritz!Box 6591C, Alexa, Logitech Harmony und diversen Shelly's

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

Re: TR-064 Binding und OH3

Beitrag von udo1toni »

callDauer ist ein Item, keine Variable.

Globale Variablen definierst Du innerhalb der *.rules Datei vor der ersten Rule.
Innerhalb des Codebeispiels in viewtopic.php?p=48725#p48725 ist lPhoneStart eine globale Variable.

Und gerade habe ich mal verifiziert.... Die Formel war etwas zu einfach... korrekt funktioniert es so:

Code: Alles auswählen

var Long lPhoneStart = 0

rule "Gesprächsdauer messen"
when
    Item fritzCallRinging changed
then
    var Integer iSeconds = 0
    if(newState.toString == "ACTIVE") {
        lPhoneStart = now.toInstant.toEpochMilli
    } else if(previousState.toString == "ACTIVE" && newState.toString == "IDLE") {
        iSeconds =  ((now.toInstant.toEpochMilli - lPhoneStart)/1000).intValue
    }
    Gespraechsdauer.postUpdate(iSeconds)
end
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

Antworten