Update 2: scheinbar klappt es bei einigen Usern noch immer nicht, oder nicht mehr, Bilder von IP-Kameras zu speichern und dann per Telegram Nachricht zu versenden. Bei mir hat es auf meiner ziemlich vollgestopften CCU2 immer funktioniert.
Jetzt, da ich ja aufgrund der Covid Ausgangsbeschränkungen, wie viele Österreicher immer zuhause sein muss, habe ich mir die Zeit genommen und mich ein wenig genauer mit der Thematik beschäftigt. Und da niemand lange um den „heißen Brei“ herum lesen möchte, komme ich gleich zur Sache: Dass es auf meiner CCU2 funktioniert hat, liegt daran, dass sie aufgrund des „mit Skripten und Programmen vollgestopften Zustandes“ in ihrer Abarbeitungsgeschwindigkeit ziemlich gebremst war. Darum funktionierte es auch in ein und demselben Skript, die Bilder von den IP Kameras abzuholen und im /tmp/ Ordner zu speichern und sie nur zwei Zeilen weiter im Skript per Telegram API zu versenden.
Die Bilder waren einfach noch nicht fertig im Filesystem gespeichert und die unvollständigen Dateien wurden schon gesendet.
Hier die einfache Lösung:
Das Skript in zwei separate Teile zerlegen und nach einander mit einer Verzögerung von ein bis zwei Sekunden abarbeiten lassen:
Im ersten Skript werden jetzt lediglich die IP-Cams aufgerufen und die Bilder als Dateien gespeichert. Im zweiten Skript wird, wie schon zuvor die Telegram API aufgerufen. Jedoch wird das zweite Skript 1-2 Sekunden später gestartet. Dann sind schon alle Files gespeichert und kommen auch über Telegram an…
getestet auf CCU2, RaspiMatic (sollte auch auf der CCU3 klappen)
Update: bei mir war auch die Pfadangabe zum „curl“ Befehl das Problem. Mit Angabe des „pseudo“ absoluten Pfades zum Befehl wurde er nicht mehr gefunden. Siehe unten:
es genügt, den curl Befehl direkt aufzurufen, also anstelle von : ….State(„extra/curl -s -k https://api.telegram.org/bot“#botAPI#“/sendMessage…..
die Pfadangabe „extra/“ entfernen, je nach CCU Variante und Cuxd Version, also: …… State(„curl -s -k https://api.telegram.org/bot“#botAPI#“/sendMessage …..
Wer sich nicht sicher ist, wo das Kommando liegt, am besten im cuxd oder über SSH nachsehen…
Update Ende.
In den Kommentaren zum Beitrag „Nachrichten pushen mit Telegram“ wurde mehrfach darauf hingewiesen, dass die Push Nachrichten nicht mehr gesendet werden. Zuerst dachte ich es gibt irgendwelche grundlegende Änderungen bei der Telegram Api. Aber dem war nicht so. Also habe ich noch einmal ein Skript zusammengebastelt. Um zu debuggen, habe ich einen gesamten String aus einzelnen Teilen zusammengebaut. Das ist zwar alles andere als schön, aber es lässt sich leichter nachvollziehen was funktioniert oder eben nicht. Auch den Pfad zum curl-Kommando habe ich vollständig angegeben. Mit dem folgenden Beispiel Skript funktioniert bei mir die Textausgabe wieder:
Mit der Homematic CCU ist es ja schon lange möglich, Nachrichten aus Systemereignissen heraus zu generieren und per E-Mail zu versenden. Ein einfaches Beispiel hierfür ist die Bestätigung der Alarmanlage. Wird diese scharf oder unscharf geschaltet, so kann der Status als Email versendet werden. Oder hat man Umweltdatensensoren verbaut, so kann man sich auch die Daten, wie Temperatur, Luftfeuchte etc. senden lassen. Dazu muss einfach nur das Email-Plug-In unter Zusatzsoftware installiert und eingerichtet werden. Die Nachrichten werden dann per Script Aufruf versendet. Jedes Mal, wenn der Ziel-Email-Client, zum Beispiel am Smartphone, die Nachrichten abruft, ist man wieder informiert.
Es muss aber nicht unbedingt die E-Mail-Lösung sein um Nachrichten zu versenden. Eine weitere Möglichkeit ist der Messenger „Telegram“. Er ist den Nachrichten Messengern WhatsApp, Signal, etc. ähnlich und versendet per Push-Service. Der Versand unterschiedlichster Daten ist hier möglich. Bilder, Videos und Audiodateien können genau so einfach wie Textnachrichten versendet werden. Um einen den Telegram Dienst mit der Homematic nutzen zu können, muss man sich der freien Telegram API bedienen. In den folgenden Zeilen zeige ich, wie ich ein für mich funktionsfähiges System aufgebaut habe, um von der Homematic CCU Nachrichten und IPCam-Bilder an ein Smartphone mit installiertem Telegram Messenger zu senden.
In dem Beispiel beschreibe ich die Installation und Einrichtung auf einem Android System. Beginnend mit dem Download der APP „Telegram Messenger“ aus dem Google Appstore kann derselbe dann installiert und gestartet werden. Nach dem registrieren der Telefonnummer sollte die Software dann auch schon bereit sein.
Einrichten des Bots:
In der rechten, oberen Ecke des Bildschirms ist das Lupensymbol für die Suche zu sehen. Das ist anzuwählen, um ein Eingabefeld zu erhalten. In dieses Feld ist nun BotFather einzugeben. Das ist quasi das Administrationstool für das Erstellen und Einrichten von Bots. Unter einem Bot (von englisch robot ‚Roboter‘) versteht man ein Computerprogramm, das weitgehend automatisch sich wiederholende Aufgaben abarbeitet, ohne dabei auf eine Interaktion mit einem menschlichen Benutzer angewiesen zu sein.( Quelle: Wikipedia)
Ist der BotFather gefunden, dann kann der einfach angeklickt werden und es öffnet sich ein Fenster. Um die Einrichtung des eigenen Bots zu starten, ist in der Nachrichtenzeile folgendes Kommando einzutippen:
/start
Jetzt kommt als Antwort eine Liste mit Befehlen, die für die Bot-Einrichtung und Konfiguration nützlich sind. Um nun einen neuen Bot zu erstellen ist
/newbot
einzugeben. Als nächstes ist ein Name für den Bot auszuwählen. Hier habe ich als Beispiel CCU gewählt. Sollte der Name bereits vergeben sein, dann einen anderen wählen. Das gilt ebenso für den Benutzernamen, der mit „_bot“ zu enden hat. Hier habe ich iretro_bot gewählt.
Ist der Name gewählt und gültig, so kommt als Antwort eine Meldung mit einem Token, der in der Regel 45 Zeichen lang ist. Dieser Token ist zu kopieren oder abzuschreiben. Er ist der Schlüssel für den Bot. Die Arbeiten am Smartphone sind nun soweit abgeschlossen und es geht am PC weiter. Im Browser (am besten Firefox) ist die Telegram Website aufzurufen. web.telegram.org ist der Link zu Website. Diese Schritte dienen dazu, neben dem Token auch noch die ChatID zu erhalten, die in weiterer Folge in den Homematic Skripten benötigt wird. Um sich im Webbrowser anmelden zu können, ist die zu Anfang in der App registrierte Telefonnummer einzugeben. Ist die Nummer eingegeben wird auf das Smartphone ein Anmeldecode gesendet. Mit dem kann die Telegram Session im Browser gestartet werden. Jetzt sollte im Browser Telegram auch der iretro_bot per Suche zu finden sein. Ist er gefunden, dann ist er mit „STARTEN“ zu öffnen und irgendeine beliebige Nachricht einzugeben. Das Eingeben einer beliebigen Nachricht ist wichtig um dann auch die ChatID erhalten zu können. Ist das geschehen, dann ist in der Adresszeile desselben Browserfensters der folgende Link einzugeben:
und mit Enter bestätigen. Jetzt sollte im Browser in etwa folgendes zu sehen sein: (Tab JSON ausgewählt) Den Inhalt der Website habe ich in die untenstehende Tabelle kopiert. (die originale ID wurde natürlich geändert…)
ok
true
result
0
update_id
121212121
message
message_id
106
from id
123456789
is_bot
false
first_name
„ingmarsretro“
language_code
„de“
chat id
123456789
first_name
„ingmarsretro“
type
„private“
date
1565349110
text
„test“
update_id
121212121
message
message_id
111
from id
123456789
is_bot
false
first_name
„iretro“
language_code
„de“
chat id
123456789
first_name
„iretro“
type
„private“
date
1565349112
text
„test“
Nun kann durch Eingabe in die Browserzeile eine Testnachricht vom PC an das Smartphone gesendet werden.
https://api.telegram.org/botAPITOKEN/sendMessage?chat_id=123456789&text=Hallo das ist ein Test
Nach Bestätigen erscheint die Nachricht in der Telegram App am Smartphone und alles hat geklappt. Für alles Weitere wird nun nur mehr der API-Token und die chatID benötigt.
Homematic und Telegram
Jetzt ist soweit alles für den Einsatz von Telegram mit der Homematic vorbereitet. Meine Beispiele hier beziehen sich auf eine CCU2. Als Addon muss die aktuelle Version des CUxD auf der CCU installiert sein. (Zum Zeitpunkt des erstellen des Blogbeitrages ist es 2.3.0). Der CUx-Daemon ermöglicht es unter anderem, per Skript auf das Linux System der CCU zuzugreifen und stellt somit eine universelle Schnittstelle zu anderen Systemen dar.
Die einfachste und am schnellsten realisierbare Anwendung mit Telegram ist, ein von der Homematic getriggertes Skript zu starten, das eine PUSH-Nachricht versendet. Dazu erstellt man in der CCU ein neues Programm und wählt zuerst unter Bedingung einen „Trigger“ aus. Mit „Trigger“ ist zum Beispiel eine Tastereingabe, eine Bewegungserkennung des Bewegungsmelders, oder auch einfach nur das Auslösen eines beliebigen Sensors gemeint. Das sollte für einen HomeMatic Benutzer auch kein Problem darstellen. Dann wählt man als Aktivität Skript aus und öffnet das Scripteingabefenster. Das folgende Code-Beispiel sendet eine Nachricht an das Handy, wenn bei der HomeMatic der gewählte Trigger ausgelöst ist und das Script gestartet wird:
!Variablen definieren
string msg = "Das ist eine Testnachricht von der CCU";
string chatid = "123456789"; !das ist die chatid
string botAPI = "987654321:ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghi"; !und das ist die BOT API id
!Textnachricht versenden
dom.GetObject("CUxD.CUX2801001:1.CMD_EXEC").State("extra/curl -s -k https://api.telegram.org/bot"#botAPI#"/sendMessage -F text='"#msg#"' -F chat_id="#chatid);
Die ChatID in dem Beispielscript und auch die botAPI ist hier nur symbolisch angeführt. Wären da reale IDs angeführt, dann würden eure Versuche alle als Nachrichten auf meinem Handy landen. 🙂 Diese beiden IDs sind also durch die vorher ermittelten zu ersetzen.
Versenden von Kamerabildern
Es geht aber noch besser. Viele User haben neben der HomeMatic CCU auch noch IP-Kameras im Einsatz. Da bietet es sich doch an, den Trigger der HomeMatic und seine Webanbindung für das Versenden der IP-Kamera Bilder zu verwenden. Denn Telegramm kann neben Textnachrichten auch Bilddateien versenden.
Um das zu realisieren muss die IP Kamera in der Lage sein, einen Snapshot per http – Aufruf zu erzeugen. Das sollte bei den meisten Kameras möglich sein. In diesem Beispiel habe ich eine Dlink DCS-932 und eine Vivotec FD81xx Domkamera getestet. Es klappt mit beiden.
Hier die grundlegenden Snapshotaufrufe der Kameras:
DLINK:
https://benutzername:passwort@ip_der_kamera/image/jpeg.cgi
Als nächstes muss sichergestellt sein, dass die HomeMatic nach dem Aufruf der Snapshot-Links die von der Kamera gelieferten Bilder auch irgendwo im Dateisystem der CCU speichern kann. Hier hilft der CUx-Daemon wieder weiter. Ich speichere im /tmp Ordner das Bild der Kamera unter dem Dateinamen „cambild.jpg“
Nach dem Aufruf desKameralinks über das unten gelistete Script sollte die Datei im /tmp Ordner zu sehen sein.
Eine Kontrolle des Inhaltes der Datei „cambild.jpg“ kann einfach durch Doppelklicken durchgeführt werden. Das Bild sollte dann im CUxD Fenster zu sehen sein.
Das folgend gelistete Script in einem neu erstellten HomeMatic Programm kann nun durch Aufruf das Kamerabild abholen und versendet es als Telegram Push Nachricht.
string picture = "/tmp/cambild.jpg"; !das ist der Pfad in dem die Bilddatei erzeugt und gespeichert wird
string chatid = "123456789"; !das ist die chatid
string botAPI = "987654321:ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghi"; !und das ist die BOT API id
!Kamera aufrufen und snapshotdatei in /tmp/ anlegen und als datei cambild.jpg speichern
dom.GetObject("CUxD.CUX2801001:1.CMD_EXEC").State("wget --auth-no-challenge -O /tmp/cambild.jpg 'https://user:passwort@000.000.000.000:80/image/jpeg.cgi?profileid=1'");
!Kamerabild per Telegram versenden
dom.GetObject("CUxD.CUX2801001:1.CMD_EXEC").State("extra/curl -s -k https://api.telegram.org/bot"#botAPI#"/sendPhoto -F chat_id="#chatid#" -F photo='@"#picture#"'");
Die CCUs der Homematic kommunizieren mit ihren drahtlos angebundenen Sensoren und Aktoren über das 868MHz ISM Band. Hier sind die Sendeleistung und die Senderate klar definiert. So kommt es durchaus häufiger vor, dass bei vielen Geräten, die unterschiedlich weit von der Zentrale entfernt sind, auch Kommunikationsfehler auftreten. Einige diese Fehler sind dabei auf die Feldstärke an der CCU- Antenne zurückzuführen. Die Wellenlänge in Luft beträgt bei 868MHz in etwa 0,345m. Die Antenne in der CCU und in den Aktoren ist auf Lambda/4 ausgelegt. Das sind ca. 8,6cm, die als Unipol im Gehäuse liegen. Diese Antenne ist einfach und funktionell. Allerdings kann der Antennengewinn und somit die Reichweite der Homematic durch einbauen einer anderen Antenne einfach gesteigert werden.
Es gibt zu diesem Thema im Netz schon einige Lösungen und Umbauten. Hier beschreibe ich meinen Umbau auf eine externe Antenne. Die Antenne soll extern befestigt werden. Eine SMA-Buchse ermöglicht das Anschließen unterschiedlicher Antennen. In diesem Beispiel habe ich mich für eine 868 MHz Helix Antenne mit Knickgelenk entschieden. Die SMA Buchse ist eine fertig konfektionierte MH113 50Ohm Buchse mit 1,13mm Koaxialleitung und MHF1 Stecker.
Der MHF1 Stecker wird nicht benötigt und kann von der Koaxialleitung „abgeschnitten“ werden. Bei diesem, nun offenen, Kabelende muss der Innenleiter und Schirm zum Anlöten vorbereitet werden.
Jetzt ist die CCU2 an der Reihe. Der Deckel ist schnell entfernt und die Platine freigelegt. Unten links im Bild ist das RF-Modul der Homematic mit dem Antennendraht zu erkennen. Zuerst wird die originale Antenne entfernt und ein wenig vom Lötstoplack der Masseplane entfernt. An dieser Stelle wird dann der Schirm des Koaxialkabels festgelötet.
Das vorbereitete Stückchen Koaxialkabel mit dem SMA Stecker wird nun am RF-Modul angelötet. Hierbei kommt der Innenleiter an das RF-Pad mit dem vorher die Antenne verbunden war und das Schirmgeflecht an die freigekratzte Masseplane.
Die elektrische Verbindung ist somit hergestellt. Eine kleine Unstimmigkeit gibt es hier allerdings noch, bzw. habe ich mich hier noch nicht schlau gemacht: Die originale Antenne war ein einfacher Draht. Das würde bedeuten, es gibt eine Impedanz Anpassung am Ende des RF-Modul LNAs und des High-Z Drahtes. Die Koaxialleitung mit dem SMA Stecker hat allerding ebenfalls eine charakteristische Impedanz von 50 Ohm. Das würde bedeuten, es gäbe (oder gibt) hier eine Fehlanpassung. Das wiederum würde wieder Reflexionen an der Leitung und somit wiederum Leistungseinbußen hervorrufen. Im Gesamtsystem wird aber trotz vermutlicher Fehlanpassung eine Reichweitensteigerung erreicht. (Die wiederum könnte man aber mit einer korrekten Netzanpassung nochmals steigern… dazu müsste man sich das RF-Modul genauer ansehen)
Jetzt muss nur noch ein geeignetes Loch für den SMA – Stecker in den Gehäusedeckel gebohrt werden. Dann kann man den SMA Stecker festschrauben. Nach dem Zusammenbau der CCU ist nun nur mehr die Antenne aufzuschrauben und der Umbau ist erledigt.
Einen Funktionstest, bzw. einen Nachweis der Steigerung der Empfangs- Sendeleistung kann man überprüfen, indem man die RSSI-Pegel der angelernten Sensoren und Aktoren vor und nach dem Umbau vergleicht. Hier hilft „devconfig“, ein kleines Tool in der Homematic Software, das mittels SSH freigeschaltet werden kann:
Mein Interesse an Strahlungsmessung im Allgemeinen und das Interesse am Eigenbau von Messgeräten lässt mich oft, vor allem bei langweiligem Fernsehprogramm, im Web recherchieren. Auf der Suche nach dem Begriff Geigerzähler findet man ja unheimlich viele Ergebnisse. Nach einer Unterhaltung mit einem Kollegen, wie es zu Zeiten von Tschernobyl hier mit der Strahlungsbelastung aussah, suchte ich auch nach einer Karte mit der aktuellen Strahlungsverteilung in Österreich und wurde auch fündig. Es gibt ein ganzes Netzwerk an Messgeräten in ganz Österreich verteilt, das stündlich die Radioaktivität misst und aufzeichnet. Über diese Website kann man sich anhand einer Karte mit unterschiedlich (entsprechend der Intensität der Strahlung) eingefärbten Punkten informieren. Klickt man einen Messpunkt an, so erhält man die Detailwerte der Messungen angegeben in nSievert/h dargestellt als Diagramm oder auch in Tabellenform. Die Website nennt sich: https://sfws.lfrz.at.
Toll dachte ich beim Betrachten der Messdaten. Noch toller wäre es, selber so eine Messstation aufzubauen und in mein bestehendes Homematic-System mit aufzunehmen. Oder für´s erste könnte man ja versuchen, die Daten der Website in die Homematic zu integrieren. … und dann beispielsweise bei Überschreitung eines Messwertes eine Nachricht oder einen Alarm zu generieren.
Also perfekte Rohdaten um damit was anfangen zu können 🙂 Im Datensatz ist der Zeitstempel (im Unix-Zeitcode Format), der Messwert in nS/h, sowie ein RGB Farbcode für die Darstellung der Farbe in der Webkarte angegeben. Also beginnen wir, die Messdaten über die Homematic CCU2 Zentrale abzurufen und nach der Datenaufbereitung in Systemvariablen zu speichern.
Als erstes legen wir zwei neue Systemvariablen an:Die erste Variable soll „Strahlungswert“ heissen und vom Datentyp „Zahl“ sein. Als Maßeinheit gebe ich nS/h (nanoSivert pro Stunde) an.
Die zweite Variable benennen wir „Messzeitpunkt“ mit dem Datentyp „Zeichenkette“. Wenn alles mit OK bestätigt ist, dann legen wir unter Programme und Verknüpfungen ein neues Programm an:
Das Programm habe ich „strahlungswerte über web“ genannt und als Trigger ein periodisches Zeitevent definiert. Das Programm soll alle 60 Minuten ausgeführt werden um die Daten vom Web abzuholen und in die Systemvariablen zu schreiben.
Nachdem der Auslöser definiert ist, muss eine Aktivität bestimmt werden. Wir wählen hier keinen Aktor, sondern die Option „Skript“:
Danach klicken wir auf die Script-Zeile und öffnen den Scripteditor:
Die nachfolgenden Zeilen sind am besten per copy und paste in den Scripteditor einzufügen und per OK zu bestätigen.
!script zum importieren der webdaten von der landeswarnzentrale radioaktivität
!by ingmar b.03/2016
string stderr;
string stdout;
string answer;
!Website angeben - die Antwort kommt als string
string url="https://sfws.lfrz.at/json.php?command=getstationdata&stationcode=AT0408&a=&b=";
!mit wget den Inhalt der Antwort in stdout schreiben
!wget commando bei CCU2
!system.Exec("wget -q -O - "#url, &stdout, &stderr);
!Änderung: Ein Blogleser hat mich daraug aufmerksam gemacht, dass der Aufruf von gwet bei der ccu3 nicht wie oben angegeben funktioniert. Darum bei ccu3 Geräten wie folgt:
!wget commande bei CCU3
system.Exec("wget -q -O - '" # url # "'", &stdout, &stderr);
!stdout in die variable answer schreiben
answer = stdout;
!stringlänge des Inhalts von answer ermitteln
integer length = answer.Length();
!foreach(summand, summanden.Split(","))
!answer=answer.Split("},{"));
var rad;
var zeitst;
var radiation;
var zeitstempel;
!Antwort Radiation in index 1,4,7,10,13...70
!Antwort Zeitcode in index 0,3,6,9,12...69
rad=(answer.StrValueByIndex(",", 1));
zeitst=(answer.StrValueByIndex(",",0));
!WriteLine(rad); nur zum debuggen
!WriteLine(zeitst); nur zum debuggen
radiation=rad.Substr(4,4); !String an pos4 substituiern und 4 Stellen ausgeben
zeitstempel=zeitst.Substr(11,10); !String an pos11 substituiern und 10 Stellen ausgeben
zeitst=zeitstempel.ToInteger();
zeitst=zeitst.ToTime();
rad=radiation.ToFloat();
dom.GetObject("Messzeitpunkt").State(zeitst); !Systemvariable muss definiert sein
dom.GetObject("Strahlungswert").State(rad); !Auch die Systemvariable 'Strahlungswert' vorher anlegen
Zum Schluss noch per Fehlerprüfung nachsehen ob der code ein Problem hat und dann OK und mit OK speichern. Hat alles geklappt sollte man jetzt die Systemvariablen ansehen können und es sollten auch gültige Werte zu sehen sein: