klomp.de

retro arcade, visual pinball cabinet, techblog

Kodi Media Center LogoIn meiner per Homematic umgesetzten Heimautomatisierung werden an verschiedenen Stellen (z.B. Waschmaschine fertig, Bewegungsmelder usw.) Statusmeldungen generiert. Diese können per Mail oder SMS verschickt oder am Homematic MP3 Funkgong signalisiert werden. Für Nutzer der Kodi Media Center Software (ehemals XBMC) gibt es zusätzlich die Möglichkeit, Benachrichtigungen als Popup auf dem Bildschirm anzeigen zu lassen. Diese Notifications erscheinen per Web-API mit einer kleinen Tonsignalisierung für ein paar Sekunden und verschwinden dann wieder, das Ganze funktioniert auch während des Abspielens von Filmen oder MP3s. Was liegt da näher, als die Homematic Statusmeldungen auch in Kodi anzeigen zu lassen?

Als erstes muss in Kodi die Bedienung per HTTP aktiviert werden, die Einstellung dazu findet man in "Settings" -> "Services" -> "Webserver" -> "Allow control of Kodi via HTTP". Diese Einstellung muss übrigens auch aktiviert werden, wenn man Fernbedienungs-Apps wie Yatse verwenden möchte. Dort lässt sich auf Wunsch ein individueller Port (z.B. 8080) sowie optional Username und Passwort für eine rudimentäre Zugangskontrolle aktivieren - letzteres habe ich weggelassen.

* * * Bitte beachtet das aktualisierte Script für Kodi 18.x (Leia) weiter unten im Text! * * *

Nun lässt sich die Benachrichtigungsfunktion mit einem Webbrowser, der sich natürlich ebenfalls im selben internen Netzwerk wie das Kodi-Device befinden muss, testen. Hier ein Beispiel:

http://lokale_kodi_ip_adresse:8080/jsonrpc?request={"jsonrpc":"2.0","method":"GUI.ShowNotification","params":{"title":"Nachricht von Waschmaschine","message":"Ich bin fertig mit der Wäsche!"},"id":1}

Nach Aufruf der URL erscheint in Kodi für ein paar Sekunden ein Popup-Fenster mit dem Titel "Nachricht von Waschmaschine" und dem Inhalt "Ich bin fertig mit der Wäsche!". Wenn das funktioniert, ist die Kodi-Einrichtung abgeschlossen und es geht mit der Homematic weiter.

Kodi Benachrichtigungs-Fenster

Ich arbeite mit der Homematic Zentrale CCU-2, aber ähnliches lässt sich natürlich auch per FHEM oder weiteren Systemen umsetzen. Als Beispiel nehme ich den Homematic Türkontakt an der Hühnerklappe  unseres Hühnerstalls - die Klappe wird automatisch per Dämmerungsschalter geöffnet und geschlossen, was durch den Türkontakt ausgewertet und an die Zentrale gemeldet wird. Bisher wurde eine Mail verschickt und der Funkgong ausgelöst (weil er's kann), zusätzlich habe ich die Benachrichtigung per Kodi hinzugefügt. Dazu ist bei dem betreffendem Device oder Programm eine weitere Aktivität "Script" einzutragen:

Homematic Einstellungen für Kodi Notification

Der Aufbau des Scriptes sieht wie folgt aus:

string stdout;
string stderr;
system.Exec("wget -O /dev/null -q http://lokale_kodi_ip_adresse:8080/jsonrpc?request={%22jsonrpc%22:%222.0%22,%22method%22:%22GUI.ShowNotification%22,%22params%22:{%22title%22:%22Nachricht%20von%20Huehnerstall%22,%22message%22:%22Die%20Klappe%20wurde%20geschlossen!%22},%22id%22:1}") 

Wichtig an dieser Stelle: Es dürfen sich keine Leerzeichen oder Umlaute im Link befinden - deshalb das URL Encoding. Sobald nun der Türkontakt auslöst (geschlossen) wird das Script ausgeführt, die Kodi URL aufgerufen und das Popup-Fenster angezeigt. Natürlich kann man auch mit Variablen arbeiten und beispielsweise von verschiedensten Sensoren Temperatur, Luftfeuchtigkeit, Stromverbrauch und weitere Werte ausgeben.

Die Kodi Notifications können für alle Arten von Alarmierungen oder Statusinformationen genutzt werden - und das nicht nur in Verbindung mit Homematic oder FHEM, sondern auch mit Apps wie Tasker, die z.B. über eingehende Nachrichten oder Termine informieren. Die Möglichkeiten sind quasi unbegrenzt...

Weitere Infos:

* * * Aktualisiertes Script für Kodi ab Version 18.x (Leia) * * *

André Rohland wies mich darauf hin, dass das Script ab Kodi 18.x in dieser Form nicht mehr funktioniert, da aus Sicherheitsgründen die GET-Methode zum Aufruf der JSON-API eingeschränkt wurde. Laut Entwickler lässt sich die API nur noch über POST-Requests ansprechen. André hat nach etlichen Tests ein aktualisiertes Script erstellt, welches er dankenswerterweise zur Verfügung stellt. Ich habe in meiner CCU2 die betroffenen Programme bereits angepasst und der neue Aufruf funktioniert einwandfrei.

Hierfür muss CUxD installiert sein, um Curl verwenden zu können. Mit CUxD ist gleichzeitig der Befehl system.Exec() hinfällig, der diverse Nachteile mit sich gebracht hat (z.B. blieb die Logikschicht der CCU so lange stehen, bis das aufgerufene Programm ausgeführt wurde).

Hier das aktualisierte Script:

! Homematic Meldungen an Kodi (18.x Leia) senden - Skript by André Rohland
!------------------------------
!___Erläuterungen:
! Die Variable my_Kodi_address enthält als HTTP-Aufruf die IP-Adresse,den (in Kodi eingestellten) Port und die Schnittstelle
! jsonprc, also z.B.: "http://192.168.2.111:8080/jsonrpc"
! In den Variablen my_title und my_message sind Umlaute erlaubt, sie werden in utf8-kodiert übergeben... .
! Die Anzeigedauer wird in Sekunden angegeben, diese werden in die erforderlichen Millisekunden umgerechnet... .
! Diese sollte vor allem bei längeren Texten entsprechend passend gewählt werden... .
! Hier die Parameter setzen:
string my_Kodi_address = "http://192.168.2.111:8080/jsonrpc";
string my_title="Nachricht von der Waschmaschine:";
string my_message="Ich bin fertig mit der Wäsche";
var my_duration = 15;
! ### Ab hier keine Änderungen vornehmen #########################
my_title = my_title.ToUTF8();
my_message = my_message.ToUTF8();
my_duration = my_duration * 1000;
string my_curl = "/usr/local/addons/cuxd/curl -H \"Content-Type: application/json\" -X POST -d '{\"jsonrpc\":\"2.0\",\"method\":\"GUI.ShowNotification\",\"id\":1,\"params\":{\"title\": \" " # my_title # " \" , \"message\": \" " # my_message # " \", \"displaytime\":" # my_duration # "}}' " # my_Kodi_address # " ";
dom.GetObject("CUxD.CUX2801001:1.CMD_EXEC").State(my_curl);
! Ende des Scriptes #########################################

 * * * Update 2 vom 10. März 2020 * * *

Von Meik V. bekam ich Ende letzten Jahres ein aktualisiertes Script. Zum einen kann es sein, dass Benutzer das Kodi Webinterface mit einem Passwort schützen, zum anderen lässt sich das Icon für die Nachricht anpassen. Vielen Dank Meik für die Infos!

Zitat:

Es kann sein, das die Leute das Kodi Webinterface mit einem Username Passwort schützen, dann muss natürlich auch diese in deinem Script angepasst werden.

string my_Kodi_address = "http://username:Diese E-Mail-Adresse ist vor Spambots geschützt! Zur Anzeige muss JavaScript eingeschaltet sein.:8080/jsonrpc";

Des Weiteren ist es auch möglich das Icon für die Nachricht anzupassen. Dafür muss dieses auf dem Kodi System abgelegt werden. Wobei bestimmt auch ein http Link klappen könnten (ungetestet).

 Hier einmal das angepasste Skript mit dem Image-Wert:

! Homematic Meldungen an Kodi (18.x Leia) senden - Skript by André Rohland
!------------------------------
! Erläuterungen:
! Die Variable my_Kodi_address enthält als HTTP-Aufruf die IP-Adresse,den (in Kodi eingestellten) Port und die Schnittstelle
! jsonprc, also z.B.: "http://username:Diese E-Mail-Adresse ist vor Spambots geschützt! Zur Anzeige muss JavaScript eingeschaltet sein.:8080/jsonrpc"

! In den Variablen my_title und my_message sind Umlaute erlaubt, sie werden in utf8-kodiert übergeben... .
! Die Anzeigedauer wird in Sekunden angegeben, diese werden in die erforderlichen Millisekunden umgerechnet... .
! Diese sollte vor allem bei längeren Texten entsprechend passend gewählt werden... .

! Hier die Parameter setzen:
string my_Kodi_address = "http://username:Diese E-Mail-Adresse ist vor Spambots geschützt! Zur Anzeige muss JavaScript eingeschaltet sein.:8080/jsonrpc";
string my_title="Waschmaschine:";
string my_message="Ich bin fertig mit der Wäsche";
string my_image="/storage/icon/waschmaschine.png";
var my_duration = 15;

! ### Ab hier keine Änderungen vornehmen #########################

my_title = my_title.ToUTF8();
my_message = my_message.ToUTF8();
my_duration = my_duration * 1000;

string my_curl = "/usr/local/addons/cuxd/curl -H \"Content-Type:application/json\" -X POST -d '{\"jsonrpc\":\"2.0\",\"method\":\"GUI.ShowNotification\",\"id\":1,\"params\":{\"title\": \"" # my_title # "\" , \"message\": \"" # my_message # "\",\"image\":\"" # my_image # "\", \"displaytime\":" # my_duration # "}}' " # my_Kodi_address # " ";

dom.GetObject("CUxD.CUX2801001:1.CMD_EXEC").State(my_curl);
!WriteLine(my_curl);

! Ende des Scriptes #########################################