Seite 2 von 3

Re: TR-064 Binding und OH3

Verfasst: 16. Okt 2022 06:14
von udo1toni
Du bist aber auf openHAB3?

ok, nächster Versuch... now.get(INSTANT_SECONDS), alternativ now.getLong(INSTANT_SECONDS).

Re: TR-064 Binding und OH3

Verfasst: 16. Okt 2022 07:54
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

Re: TR-064 Binding und OH3

Verfasst: 16. Okt 2022 10:15
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()))));
}

Re: TR-064 Binding und OH3

Verfasst: 16. Okt 2022 18:05
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.

Re: TR-064 Binding und OH3

Verfasst: 16. Okt 2022 19:11
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

Re: TR-064 Binding und OH3

Verfasst: 16. Okt 2022 19:21
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.

Re: TR-064 Binding und OH3

Verfasst: 16. Okt 2022 19:52
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.

Re: TR-064 Binding und OH3

Verfasst: 16. Okt 2022 20:21
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.

Re: TR-064 Binding und OH3

Verfasst: 16. Okt 2022 21:40
von scotty
@Udo

mal eine Frage zwischendurch: wenn ich die Variable callDauer global als String deklarieren möchte, wie muss das formuliert werden?

Re: TR-064 Binding und OH3

Verfasst: 17. Okt 2022 00:26
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