TR-064 Binding und OH3

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

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

Re: TR-064 Binding und OH3

Beitrag von scotty »

Hallo Udo,

leider verursacht der Code folgenden ERROR und danach jede Menge Meldungen.

Code: Alles auswählen

2022-10-17 03:47:31.135 [ERROR] [y.mdns.internal.MDNSDiscoveryService] - bundle org.openhab.core.config.discovery.mdns:3.3.0 (162)[org.openhab.core.config.discovery.mdns.internal.MDNSDiscoveryService(122)] : The addMDNSDiscoveryParticipant method has thrown an exception
java.util.concurrent.RejectedExecutionException: Task java.util.concurrent.FutureTask@3b02b1a0[Not completed, task = java.util.concurrent.Executors$RunnableAdapter@6fd5eef9[Wrapped task = javax.jmdns.impl.JmDNSImpl$1@b900506]] rejected from java.util.concurrent.ThreadPoolExecutor@7a11328e[Terminated, pool size = 0, active threads = 0, queued tasks = 0, completed tasks = 2]

Auch ich habe inzwischen noch etwas recherchiert und bin zu folgendem, (hoffentlich) funktionierenden Ergebnis gekommen:

Code: Alles auswählen

var Long iPhoneStart = 0

rule "Gesprächsdauer messen"

when
    Item fritzCallRinging changed from IDLE to DIALING
then
    var Integer iSeconds = 0
    if(newState.toString == "ACTIVE") {
        iPhoneStart = ZonedDateTime.now.toEpochSecond
    } else if(previousState.toString == "ACTIVE" && newState.toString == "IDLE") {
        iSeconds = (ZonedDateTime.now.toEpochSecond - iPhoneStart).intValue
    }

    Flag_ADauer_00.postUpdate(iSeconds)

end
Bei 'Flag_ADauer_00' handelt es sich um ein Item und keine Variable.

Bei diesem Code wird mir erstmals ein Wert angezeigt, nämlich "0". Weil jedoch das Gespräch zu diesem Zeit noch nicht beendet ist vermute ich, dass nach Beendigung des Telefonats noch ein Item-Update eingebaut werden.
Irgendwo habe ich schon einmal etwas darüber gelesen. Zur Zeit weiß ich allerdings nicht, wie dies zu realisieren ist. Vielleicht hast du ja noch einen Tipp dazu.
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 »

Ich habe deinen letzten Code noch einmal genauer angeschaut und festgestellt, dass du (übrigens wie bereits gestern schon) verschiedene Variablennamen verwendet hast.
Etwas korrigiert funktioniert dieser vermutlich auch:

Code: Alles auswählen

var Long iPhoneStart = 0

rule "Gesprächsdauer messen"
when
    Item fritzCallRinging changed
then
    var Integer iSeconds = 0
    if(newState.toString == "ACTIVE") {
        iPhoneStart = now.toInstant.toEpochMilli
    } else if(previousState.toString == "ACTIVE" && newState.toString == "IDLE") {
        iSeconds =  ((now.toInstant.toEpochMilli - iPhoneStart)/1000).intValue
    }
    
     Flag_ADauer_00.postUpdate(iSeconds)

logInfo("RuleLastCall", "Eingang " + " | " + iSeconds)
end
Hier der Auszug aus openhab.log:

Code: Alles auswählen

2022-10-17 04:48:15.544 [INFO ] [enhab.core.model.script.RuleLastCall] - Ausgang  | 0
2022-10-17 04:48:34.046 [INFO ] [enhab.core.model.script.RuleLastCall] - Ausgang  | 18
Hier allerdings das gleiche Problem, "iSeconds" hat zunächst den Wert 0 und 19 Sekunden später den Wert 18. Das Item allerdings zeigt mir dann wieder der Wert 0. Ich benötige also noch ein Update für das Item "Flag_ADauer_00" nach Beendigung des Telefonats. Hast du da noch einen Idee?
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: 14033
Registriert: 11. Apr 2018 18:05
Answers: 222
Wohnort: Darmstadt

Re: TR-064 Binding und OH3

Beitrag von udo1toni »

Das ist das Problem mit dem kleinen i und dem kleinen l... habe ich auch übersehen, aber jetzt an der richtigen Stelle korrigiert. Mein Namensschema funktioniert so, dass ich den Datentyp als Kleinbuchstaben davor schreibe, also ein kleines L vor PhoneStart, weil es sich hier zwingend um den Datentyp Long handelt. Ein i vor Seconds, weil hier Integer ausreicht.

Wie man die Variablen benennt, ist aber egal. Wichtig ist die Funktion.
Beginnt ein Gespräch, so merkt sich die Rule die Anzahl Millisekunden seit dem 01.01.1970, 00:00:00.000 Uhr. Dies passiert in meinem Code in der Variablen lPhoneStart
Endet ein Gespräch, so bestimmt die Rule wieder die Millisekunden und zieht die gemerkte Zahl ab. Millisekunden sind keine sinnvolle Größe, weshalb das Ergebnis durch 1000 geteilt wird. Da beim Teilen auch Bruchteile von ganzen Zahlen übrig bleiben können, wird anschließend noch der passende Integer Wert verwendet. Da es sich jetzt um einen Integer Wert handelt, kann dieser in einer Integer Variablen gespeichert werden.

Den Trigger darfst Du nicht ändern. Die Rule triggert jedes Mal, wenn sich der Zustand des Items ändert, das muss so sein, weil die Rule verschiedene Dinge tut - siehe Funktionsbeschreibung.
DIALING wird vermutlich der Wert sein, der übergeben wird, wenn ein abgehendes Telefonat aufgebaut wird. Willst Du ausschließlich abgehende Gespräche messen, so können wir das als Kriterium einbauen, müssten dazu aber nochmal genauer ins Log schauen, wie sich das Item exakt verhält.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.2.2, 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 »

Wie du vielleicht schon bemerkt hast, habe ich mich in dieses Thema "reingebissen" und mit dem Trigger auch schon ein wenig gespielt. Leider nicht mit dem richtigen Ergebnis.
Ich möchte ausgehende und eingehende Gespräche messen. Welche Log-Einträge noch benötigt werden, solltest du mir vielleicht kurz mitteilen. Vielleicht können wir das Projekt dann fertigstellen.
Hast du die meinen letzten Code mal angeschaut? Ich bin mir nicht sicher, welcher jetzt besser infrage kommen würde.
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: 14033
Registriert: 11. Apr 2018 18:05
Answers: 222
Wohnort: Darmstadt

Re: TR-064 Binding und OH3

Beitrag von udo1toni »

Versuche bitte zunächst noch mal diesen Code:

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
        Flag_ADauer_00.postUpdate(NULL)
    } else if(previousState.toString == "ACTIVE" && newState.toString == "IDLE") {
        iSeconds =  ((now.toInstant.toEpochMilli - lPhoneStart)/1000).intValue
        Flag_ADauer_00.postUpdate(iSeconds)
    }
end
Ich hatte nicht berücksichtigt, dass fritzCallRinging ja noch andere Zustände annehmen kann. So ist sichergestellt, dass zu Beginn des Gesprächs das Item geleert wird (NULL) und zum Ende des Gesprächs mit der Dauer gefüllt wird, sonst aber nicht angetastet wird.

Wir können die Rule auch dahingehend ändern, dass die aktuelle Gesprächsdauer z.B. alle 10 Sekunden aktualisiert wird:

Code: Alles auswählen

var Long lPhoneStart = 0
var Timer tPhoneDuration = null

rule "Gesprächsdauer messen"
when
    Item fritzCallRinging changed
then
    var Integer iSeconds = 0
    if(newState.toString == "ACTIVE") {
        lPhoneStart = now.toInstant.toEpochMilli
        Flag_ADauer_00.postUpdate(NULL)
        tPhoneDuration?.cancel
        tPhoneDuration = createTimer(now.plusSeconds(10),[|
            var Integer iSeconds = 0
            iSeconds =  ((now.toInstant.toEpochMilli - lPhoneStart)/1000).intValue
            Flag_ADauer_00.postUpdate(iSeconds)
            tPhoneDuration.reschedule(now.plusSeconds(10))
        ])
    } else if(previousState.toString == "ACTIVE" && newState.toString == "IDLE") {
        tPhoneDuration?.cancel
        iSeconds =  ((now.toInstant.toEpochMilli - lPhoneStart)/1000).intValue
        Flag_ADauer_00.postUpdate(iSeconds)
    }
end
Nun wird also zusätzlich bei Gesprächsbeginn ein Timer gestartet, der alle 10 Sekunden mit der bekannten Berechnung den Anzeigewert aktualisiert. Bei Gesprächsende wird der Timer abgebrochen und der Endstand übertragen.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.2.2, 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 »

Vorab noch folgende Info: über ein selbst gebautes Widget lasse ich mir verschieden Daten anzeigen. Hier auch u. a. die des Items "Flag_ADauer_00".
Nach Beendigung eines Gespräches wird dort der Wert 1666009749 angezeigt (er verändert sich auch nicht mehr). Schaue ich anschließend in die openhab-Struktur unter Items/Flag_ADauer_00, dann wird mir der Wert 24 angezeigt. Dies entspricht exakt der Gesprächsdauer meines letzten Testanrufes. Es braucht also eine Aktualisierung der Anzeige für das Widget nach dem Telefonat.

Wie kann ich das realisieren?

Nachtrag:

Ein Ansatz wäre vielleicht

Code: Alles auswählen

rule "irgendwas"
when
    Item fritzCallRinging changed from ACTIVE to IDLE
then

Hier die Aktualisierung des Widgets ...ABER WIE?

end
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: 14033
Registriert: 11. Apr 2018 18:05
Answers: 222
Wohnort: Darmstadt

Re: TR-064 Binding und OH3

Beitrag von udo1toni »

Nein, entweder das Wigdet aktualisiert sich automatisch, oder Du hast verloren.
Aber unter openHAB2 kenne ich das verhalten, dass die Aktualisierung der Darstellung nach Änderungen an bestimmten Dateien (insbesondere Sitemap) erst wieder funktioniert, wenn ich openHAB komplett neu starte.
Das wäre mein erster Tipp dazu.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.2.2, 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 »

Hallo Udo,
ich möchte noch einmal auf deine vorletzte Antwort zurückkommen. Die Variante würde ich gerne so verwenden, dass nur der Timer bei "Item fritzCallRinging changed from IDLE to DIALING" gestartet und bei "Item fritzCallRinging changed from ACTIVE to IDLE" abgefragt wird. In dem Code sollte allerdings nur der Timer vorkommen. Alles andere wird eigentlich nicht benötigt.
Wäre das so machbar und wie muss der Code dann aufgebaut 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: 14033
Registriert: 11. Apr 2018 18:05
Answers: 222
Wohnort: Darmstadt

Re: TR-064 Binding und OH3

Beitrag von udo1toni »

Ich verstehe nicht, worauf Du hinaus willst. Grundsätzlich kann man alles mögliche in eine Rule schreiben, es ist allerdings die Frage, ob das zum Ziel führt.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.2.2, 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 »

So, mit dieser Rule von Udo als Ausgangsbasis und weiteren um beispielsweise ausgehende von eingehenden Gesprächen zu unterscheiden, habe ich mein gewünschtes Ergebnis erreicht. Allerdings musste eine Pause eingebaut werden, damit die Gesprächszeit im Widget korrigiert wird.
Bei Interesse bin ich gerne bereit, weitere Infos zu geben.

Code: Alles auswählen

var Long lPhoneStart = 0
var Integer iSeconds = 0

rule "Gesprächsdauer messen"
when
    Item fritzCallRinging changed
then
    var Integer iSeconds = 0
    if(newState.toString == "ACTIVE") {
        lPhoneStart = now.toInstant.toEpochMilli
        Flag_ADauer_00.postUpdate(NULL)
    } else if(previousState.toString == "ACTIVE" && newState.toString == "IDLE") {
        iSeconds =  ((now.toInstant.toEpochMilli - lPhoneStart)/1000).intValue
        Flag_ADauer_00.postUpdate(iSeconds)
    }
end
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

Antworten