Voraussetzung für diese Rule ist ein richtig konfiguriertes Binding TR-064, der User muss auf ein Telefonbuch zugreifen können. Außerdem werden Dummy-Items benötigt, die gut zu unterscheiden sind. Da ich mich für die Anzeige der letzten 7 Gespräche (jeweils Ein- & Ausgang) entschieden habe, bedeutet dies jeweils 35 Items für Ein- bzw. Ausgangsgespräche.
Die Bezeichnungen für die Items sind innerhalb der Regel zu erfahren. Hier wurde das erste Ausgangstelefonat die Itembezeichnung Flag_1_Axxx und für das erste Eingangstelefonat Flag_1_Exxx gewählt. Die Gespräche 2 bis 7 müssen dann fortlaufend nummeriert werden.
Des Weiteren müssen Gruppen gebildet werden, für Ausgang gAFlags und für Eingang gEFlags.
Jetzt möchte ich noch einmal auf die Rule zurück kommen. Das Tolle ist, sie muss bei einer Erweiterung der Gesprächsanzahl nicht mehr verändertet werden. Es müssen lediglich weitere Items erstellt werden.
Hier der Code, er läuft bei mir unter Openhab 3.3 im Docker auf einer Synology:
Code: Alles auswählen
var Long lPhoneStart = 0
var Integer iSeconds = 0
rule "Gesprächsdauer messen"
when
Item fritzCallRinging changed
then
val strNew = newState.toString
val strPrev = previousState.toString
if(strNew == "ACTIVE") {
if(strPrev == "RINGING")
logInfo("call", "Eingehender Anruf: Verbindung hergestellt")
else if(strPrev == "DIALING")
logInfo("call", "Ausgehender Anruf: Verbindung hergestellt")
lPhoneStart = now.toInstant.toEpochMilli
} else if(strPrev == "ACTIVE" && strNew == "IDLE") {
logInfo("call", "Aktiver Anruf: Verbindung beendet")
iSeconds = ((now.toInstant.toEpochMilli - lPhoneStart)/1000).intValue
var strTime = ""
if(iSeconds !== null)
strTime = transform("JS","secinhms.js",iSeconds.toString)
logInfo("call", "Beendigung des {}gangsgespräches nach {}",if(Flag_1_ADauer.state.toString=="...")"Aus" else "Ein",strTime)
if(Flag_1_EDauer.state == "...")
Flag_1_EDauer.postUpdate(strTime)
else if(Flag_1_ADauer.state == "...")
Flag_1_ADauer.postUpdate(strTime)
}
end
rule "Eingehender Anruf"
when
Item fritzCallRinging changed to RINGING
then
if(fritzIncomingCall.state == UNDEF || fritzIncomingCall.state == NULL) return;
gEFlags.members.sortBy[ name ].reverseView.forEach[ i |
val num = Integer::parseInt(i.name.split("_").get(1))
val art = i.name.split("_").get(2)
if(num > 1) {
val myItem = gEFlags.members.filter[ j | j.name.split("_").get(1) == (num-1).toString && j.name.endsWith(art)].head
i.postUpdate(myItem.state)
}
]
val incCall = fritzIncomingCall.state as StringListType
// val ourNumber = incCall.getValue(0)
val callerNumber = incCall.getValue(1)
val tr064Actions = getActions("tr064","tr064:fritzbox:1")
var callerName = tr064Actions.phonebookLookup(callerNumber)
if(callerName==callerNumber)
callerName = "unbekannt"
val callDate = String.format("%1$td.%1$tm.%1$tY", now)
val callTime = String.format("%1$tH:%1$tM", now)
Flag_1_EName.postUpdate(callerName)
Flag_1_ETel.postUpdate(callerNumber)
Flag_1_EDat.postUpdate(callDate)
Flag_1_ETime.postUpdate(callTime)
Flag_1_EDauer.postUpdate("...") // signalisiert, dass gerade telefoniert wird
logInfo("call", "Eingang {} | {} | {} | {}",callerName,callerNumber,callDate,callTime)
end
rule "Ausgehender Anruf"
when
Item fritzCallRinging changed to DIALING
then
if(fritzOutgoingCall.state == UNDEF || fritzOutgoingCall.state == NULL) return;
gAFlags.members.sortBy[ name ].reverseView.forEach[ i |
val num = Integer::parseInt(i.name.split("_").get(1))
val art = i.name.split("_").get(2)
//logInfo("call","Move - zu Item {} Nummer ist {} Name endet mit {}",i.name,num,art)
if(num > 1) {
val myItem = gAFlags.members.filter[ j | j.name.split("_").get(1) == (num-1).toString && j.name.endsWith(art)].head
i.postUpdate(myItem.state)
}
]
val outCall = fritzOutgoingCall.state as StringListType
var String calledNumber = outCall.getValue(0)
// var String ourNumber = outCall.getValue(1)
val tr064Actions = getActions("tr064","tr064:fritzbox:1")
var calledName = tr064Actions.phonebookLookup(calledNumber)
if(calledName==calledNumber)
calledName = "unbekannt"
val callDate = String.format("%1$td.%1$tm.%1$tY", now)
val callTime = String.format("%1$tH:%1$tM", now)
Flag_1_AName.postUpdate(calledName)
Flag_1_ATel.postUpdate(calledNumber)
Flag_1_ADat.postUpdate(callDate)
Flag_1_ATime.postUpdate(callTime)
Flag_1_ADauer.postUpdate("...") // signalisiert, dass gerade telefoniert wird
logInfo("call", "Ausgang {} | {} | {} | {}",calledName,calledNumber,callDate,callTime)
end