Na, das passiert mittels Persistence.
eventuell muss ich dazu etwas ausholen, aber ich versuche es kurz zu machen

Ich habe keine FRITZ!Box, aus Gründen.
Vor vielen Jahren hatte ich mal eine Ackermann Euracom an einem ISDN-Anschluss, danach eine Auerswald 5020 VoIP und dann hatte ich die Faxen dicke und habe eine Asterisk aufgesetzt. Weil das auch nicht so arg komfortabel war, bin ich letztlich bei FreePBX gelandet (lässt auch an vielen Stellen zu wünschen übrig, aber ich habe mich arangiert).
FreePBX bietet viele Module für zusätzliche Kommunikation, insbesondere gibt es eine mächtige Rückwärtssuche, welche mit vielen Community Plugins erweitert wurde, so dass bei einem Anruf nicht nur die Nummer in den Namen umgesetzt, sondern wahlweise auch über diverse Schnittstellen anderen Geräten zur Verfügung gestellt wird, seien es externe Datenbanken, ein MythTV System oder was auch immer.
Was allerdings fehlte, war ein Modul, um per MQTT zu kommunizieren. Ich hab mir also ein bestehendes Modul genommen und es so umgebaut, dass es MQTT ausgibt. Klingt imposant, war es aber eigentlich gar nicht. Der schlimmste Teil daran war, das Ergebnis ins Repository rein zu bekommen, so dass auch andere es nutzen können

Die Anlage haut jetzt also bei jedem Anruf einen kompletten Datensatz über MQTT auf ein frei wählbares Topic raus. Der Datensatz wird per JSON ausgegeben.
openHAB lauscht auf dem Topic, empfängt jede Änderung und schreibt sie umgehend in ein Item. Dieses Item wird persistiert.
Meine vollständige Konfiguration zu diesem Thema lautet also:
Thing:
Code: Alles auswählen
// irgendwo weiter oben ist der Broker definiert
Thing topic freepbx "FreePBX" @ "mqtt" {
Channels:
Type string : ch01 "Nummer 1" [ stateTopic= "freepbx/calls/nummermitvorwahl1" ]
}
Statt nummermitvorwahl1 stehen dort die Nummern incl. Ortsvorwahl, also z.B. 030654321098 (ich wohne nicht in Berlin...) Ich habe für jede Rufnummer einen eigenen Channel angelegt, das ganze steht also zehn mal da.
Das Item:
Code: Alles auswählen
String Freepbx_Ch01 "Nummer 1" (Anruf) {channel="mqtt:topic:mymqtt:freepbx:ch01"}
Die Persistence in jdbc.persist:
Code: Alles auswählen
Strategies {
everyMinute : "0 * * * * ?"
}
Items {
Anruf* : strategy = everyUpdate,restoreOnStartup
}
Alle Items der Gruppe Anruf werden bei jedem Update persistiert.
Ein Datensatz sieht so aus:
Code: Alles auswählen
{"number": "+49xxxxxxxxx6","name": "Pxxxxxxxxxxxx","extension": "06151xxxxxxx","format": "Pxxxxxxxxxxxl (+49xxxxxxxxxx)"}
Der Zeitpunkt des Anrufs ergibt sich aus dem Zeitstempel des Datensatzes, Das Feld
format ist für die einfache Anzeige ohne viel Schnickschnack gedacht, so dass ich in openHAB über ein zweites Item mit Profile JSONPATH:$.format direkt den letzten Anrufer anzeigen lassen kann.
Die Daten landen nun über die Persistence automatisch in der MariaDB Datenbank, welche ich in Grafana abrufe. Dabei landen die Daten in der Tabelle mit dem Namen item0061, weil ich das nie auf Klartext Namen umgestellt habe.
Also das vollständige Query in Grafana:
Code: Alles auswählen
SELECT Time as 'Datum & Zeit',json_extract(Value, '$.extension') as Anruf,json_extract(Value,'$.number') as Nummer, json_extract(Value,'$.name') as Name from item0061 ORDER BY Time DESC LIMIT 10
Und Du kannst langsam erkennen, wie simpel das Ganze ist...
Noch ein wenig Kosmetik (Formatierung der Spalten, insbeondere die Spalte Anruf, welche die angerufene Rufnummer enthält muss ja noch auf einen Klartext Namen umgewandelt werden) und fertig ist die Tabelle.