TR-064 Binding und OH3
- udo1toni
- Beiträge: 13986
- Registriert: 11. Apr 2018 18:05
- Wohnort: Darmstadt
Re: TR-064 Binding und OH3
Du bist aber auf openHAB3?
ok, nächster Versuch... now.get(INSTANT_SECONDS), alternativ now.getLong(INSTANT_SECONDS).
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
- scotty
- Beiträge: 676
- Registriert: 28. Apr 2020 04:44
Re: TR-064 Binding und OH3
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
-
- Beiträge: 308
- Registriert: 30. Apr 2021 13:13
Re: TR-064 Binding und OH3
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.
- scotty
- Beiträge: 676
- Registriert: 28. Apr 2020 04:44
Re: TR-064 Binding und OH3
@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.
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
-
- Beiträge: 308
- Registriert: 30. Apr 2021 13:13
Re: TR-064 Binding und OH3
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
- scotty
- Beiträge: 676
- Registriert: 28. Apr 2020 04:44
Re: TR-064 Binding und OH3
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.
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
-
- Beiträge: 308
- Registriert: 30. Apr 2021 13:13
Re: TR-064 Binding und OH3
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.
- scotty
- Beiträge: 676
- Registriert: 28. Apr 2020 04:44
Re: TR-064 Binding und OH3
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.
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
- scotty
- Beiträge: 676
- Registriert: 28. Apr 2020 04:44
Re: TR-064 Binding und OH3
@Udo
mal eine Frage zwischendurch: wenn ich die Variable callDauer global als String deklarieren möchte, wie muss das formuliert werden?
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
- udo1toni
- Beiträge: 13986
- Registriert: 11. Apr 2018 18:05
- Wohnort: Darmstadt
Re: TR-064 Binding und OH3
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:
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