Seite 3 von 3
Re: TR-064 Binding und OH3
Verfasst: 17. Okt 2022 04:39
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.
Re: TR-064 Binding und OH3
Verfasst: 17. Okt 2022 05:07
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?
Re: TR-064 Binding und OH3
Verfasst: 17. Okt 2022 12:47
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.
Re: TR-064 Binding und OH3
Verfasst: 17. Okt 2022 13:42
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.
Re: TR-064 Binding und OH3
Verfasst: 17. Okt 2022 14:20
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.
Re: TR-064 Binding und OH3
Verfasst: 17. Okt 2022 15:05
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
Re: TR-064 Binding und OH3
Verfasst: 17. Okt 2022 22:13
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.
Re: TR-064 Binding und OH3
Verfasst: 18. Okt 2022 10:21
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?
Re: TR-064 Binding und OH3
Verfasst: 18. Okt 2022 22:30
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.
Re: TR-064 Binding und OH3
Verfasst: 20. Okt 2022 05:06
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