Satria (Diskussion | Beiträge) K |
Satria (Diskussion | Beiträge) (CPU Temperatur) |
||
(16 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt) | |||
Zeile 1: | Zeile 1: | ||
== Skripte == | == Skripte == | ||
+ | === Code-Beispiele und Erklärungen === | ||
<code><poem> | <code><poem> | ||
;Systemvariable holen:var SysVar = dom.GetObject("SysVar") | ;Systemvariable holen:var SysVar = dom.GetObject("SysVar") | ||
Zeile 10: | Zeile 11: | ||
;Gewerkeliste holen:dom.GetObject(ID_FUNCTIONS) | ;Gewerkeliste holen:dom.GetObject(ID_FUNCTIONS) | ||
+ | :''Liefert ein array von IDs, mit denen über GetObject() wiederum die eigentlichen Objekte geholt werden müssen.'' | ||
;Raumliste holen:dom.GetObject(ID_ROOMS) | ;Raumliste holen:dom.GetObject(ID_ROOMS) | ||
+ | :''Liefert ein array von IDs, mit denen über GetObject() wiederum die eigentlichen Objekte geholt werden müssen.'' | ||
− | ;Schleife:foreach(current, array | + | ;Schleife:foreach(current, array) {} |
+ | :''array ist ein string mit einer Auflistung von Werten durch Tabulator (\t) getrennt und kann auch selbst erzeugt werden.'' | ||
+ | :''string array = "Sensor1\tSensor2";'' | ||
;Log output:WriteLine("Text, Value: " + SysVar.Value()) | ;Log output:WriteLine("Text, Value: " + SysVar.Value()) | ||
+ | |||
+ | ;Linux-Befehl ausführen | ||
+ | :string stdout; | ||
+ | :string stderr; | ||
+ | :system.Exec("Befehl", &stdout, &stderr); | ||
+ | :''Beispiel für den Aufruf einer URL, stdout und stderr können wegfallen. User und Passwort sind in der URL unterzubringen, das Kaufmanns-Und (&) ist zu escapen'' | ||
+ | :system.Exec("wget -q -O /dev/null --no-check-certificate <nowiki>https://user:password@server.de?command\¶meter=1</nowiki>"); | ||
+ | |||
+ | ;Anderes Programm aufrufen | ||
+ | :var programObj = dom.GetObject("ZielProgramm"); | ||
+ | :programObj.ProgramExecute(); | ||
+ | </poem></code> | ||
+ | |||
+ | === Übersicht der Objekthierarchie === | ||
+ | [[Datei:HomeMatic_Script_Objekthierarchie.png]] | ||
+ | |||
+ | === Dokumentation von ELV === | ||
+ | [[Datei:HM_Skript_Teil_1_Sprachbeschreibung_V2.2.pdf]] | ||
+ | |||
+ | [[Datei:HM_Skript_Teil_2_Objektmodell_V1.2.pdf]] | ||
+ | |||
+ | [[Datei:HM_Skript_Teil_3_Beispiele_V1.1.pdf]] | ||
+ | |||
+ | [[Datei:HM_Skript_Teil_4-Datenpunkte.pdf]] | ||
+ | |||
+ | === Sonnenauf- und Sonnenuntergang === | ||
+ | Eine Astrofunktion stellt den Zeitpunkt des lokalen offiziellen Sonnenauf- und Sonnenuntergangs zur Verfügung. Auf diese kann in der Zeitsteuerung per Radio-Button zugegriffen werden. In Skripten erreicht man diese Werte über: | ||
+ | |||
+ | <code>system.SunriseTime</code> | ||
+ | |||
+ | und | ||
+ | |||
+ | <code>system.SunsetTime</code> | ||
+ | |||
+ | === CPU Temperatur in Systemvariable schreiben === | ||
+ | In einem periodisch aufgerufenen Programm (z.B. minütlich) kann man dieses Skript hinterlegen: | ||
+ | <code><poem> | ||
+ | string result; | ||
+ | real temp; | ||
+ | object objCpuTemp = dom.GetObject("CpuTemp"); | ||
+ | system.Exec("cat /sys/class/thermal/thermal_zone0/temp", &result); | ||
+ | temp = (0.0 + result.ToInteger()) / 1000.0; | ||
+ | objCpuTemp.State(temp); | ||
</poem></code> | </poem></code> | ||
+ | In der Systemvariablen "CpuTemp" (ist anzulegen) hat man dann immer die recht aktuelle CPU Temperatur der Zentrale. (Kann sein, dass es ein Raspberry PI sein muss.) | ||
+ | |||
+ | == Dimmer == | ||
+ | Um einen Dimm-Aktor (Steckdose, Schalter) automatisch linear ansteigen (oder abfallen) zu lassen, wird mit sog. Rampen gearbeitet. Hier werden die erforderlichen Parameter einmal an den Aktor abgesetzt, der von da an diese Rampe von selbst umsetzt. Die Parameter für eine solche Rampenfunktion müssen aus unerfindlichen Gründen zeitgleich aber in einer bestimmten Reihenfolge abgesetzt werden: | ||
+ | # sofort Einschaltdauer setzen (definiert, wie lange der Aktor eingeschaltet bleibt, nachdem er die Rampe vollständig hochgefahren ist) | ||
+ | # sofort Dimmzeit setzen (definiert, wie breit die Rampe sein soll, also wie lange der Dimmprozess dauern soll) | ||
+ | # sofort Dimmwert setzen (definiert, auf welchen Wert der Dimmaktor sich innerhalb der Dimmzeit hoch- oder runterfahren soll) | ||
+ | Jetzt beginnt der Aktor mit dem linearen Dimmen. | ||
+ | |||
+ | == Besonderheiten beim Raspberry PI 3 (RaspiMatic, RaspberryMatic) == | ||
+ | Bevor die CCU3 auf den Markt kam, die auch auf einem Raspberry PI 3 basiert, gab es community-unterstützt schon die Möglichkeit, sich einen PI3 anzuschaffen, mit einem dafür vorgesehenen Funkmodul auszustatten und die frei verfügbare Homematic Software auf eine microSD Karte zu spielen, damit den PI3 zu booten und ihn somit in eine vollwertige Homematic zu verwandeln, die sogar um einies leistungsstärker war als die CCU2. | ||
+ | |||
+ | Natürlich gibt es bei so einer OpenSource Lösung Kleinigkeiten, die anders sind oder Sachen, die man verändern / verbessern kann ;) | ||
+ | |||
+ | === XML-API absichern === | ||
+ | Das AddOn "XML-API" ist wichtig für manche externe Apps, die mit der Homematic kommunizieren wollen. Sie ist eine Schnittstelle nach außen, ohne das WebUI zu verwenden. Leider ist sie vollkommen ungesichert. Weder passwortgeschützt noch verschlüsselt. Der fehlenden Verschlüsselung kann man durch HTTPS abhelfen, was man ohnehin auf der Zentrale aktiviert haben sollte, aber den wichtigeren Passwortschutz muss man selber nachrüsten: | ||
+ | |||
+ | Hierzu greift man in die Konfiguration des Webservers ein. Verwendet wird auf Homematic der lighttpd Server, dem man für 2 Pfade eine basic HTTP authentication unterjubelt. Das bedeutet, dass bei jeglichem Zugriff auf diese Pfade (es geht um die XML-API Pfade), ein Benutzername und ein Kennwort erwartet werden, ohne die kein Zugriff möglich ist. Der Benutzer sollte bei der Abfrage nicht mitgeteilt werden und das Kennwort sehr lang sein (> 12 Zeichen). So hält das Ganze auch einer brute-force Attacke stand. In meiner Variante sind Benutzer und Kennwort im PI3 Dateisystem im Klartext hinterlegt (hier kommt ja normalerweise niemand dran), man kann das vielleicht aber auch auf MD5, SHA1 etc. umstellen. | ||
+ | |||
+ | In der Config des lighttpd Servers sieht man, dass am Ende alle .conf Dateien im Pfad /usr/local/etc/config/lighttpd ausgeführt werden. Also müssen wir unsere Änderung nur hier platzieren, und sie wird angewendet. | ||
+ | |||
+ | '''/usr/local/etc/config/lighttpd/xmlauth.conf''' (mod 644, rw-r--r--) | ||
+ | <pre> | ||
+ | auth.backend = "plain" | ||
+ | auth.backend.plain.userfile = "/usr/local/etc/.lighttpdpassword" | ||
+ | auth.require = ( | ||
+ | "/config/xmlapi" => | ||
+ | ( | ||
+ | "method" => "basic", | ||
+ | "realm" => "External access protection", | ||
+ | "require" => "user=USERNAME" | ||
+ | ), | ||
+ | "/addons/xmlapi" => | ||
+ | ( | ||
+ | "method" => "basic", | ||
+ | "realm" => "External access protection", | ||
+ | "require" => "user=USERNAME" | ||
+ | ) | ||
+ | ) | ||
+ | </pre> | ||
+ | USERNAME wird hier durch den Benutzernamen ersetzt, den man sich ausdenkt. | ||
+ | |||
+ | [[Datei:PI3_usr_local_etc_config_lighttpd_xmlauth.7z]] <-- Download. In entsprechenden Pfad kopieren. | ||
+ | |||
+ | '''/usr/local/etc/.lighttpdpassword''' (mod 644, rw-r--r--) | ||
+ | <pre> | ||
+ | USERNAME:PASSWORD | ||
+ | </pre> | ||
+ | USERNAME und PASSWORD werden hier durch die Benutzernamen/Passwort-Kombination ersetzt, den man sich ausdenkt, passend zur oberen Datei natürlich. | ||
+ | |||
+ | RaspberryMatic neustarten, und die XML-API ist abgesichert! | ||
+ | |||
+ | === Diagramme ab Version 3.37 wieder auf die SD Karte speichern === | ||
+ | Nach dem Update auf die Version 3.37 erschien in der WebUI anstatt der Diagramme die Meldung | ||
+ | <pre>Es ist kein USB-Speicher für die Speicherung der Diagrammdaten vorhanden oder auf diesen konnte nicht zugegriffen werden. Um die Diagrammdaten zu speichern, ist externer USB-Speicher erforderlich.</pre> | ||
+ | In den "Allgemeinen Einstellungen" der Zentrale unter "Externer USB Speicher" liest man: | ||
+ | <pre>microSD Karte ist vorhanden aber nicht initialisiert.</pre> | ||
+ | Diese Änderung ist beabsichtigt, um die SD Karte, auf der sich ja das Betriebssystem befindet zu schonen. Für das Speichern der Diagramme soll ein USB Stick eingesteckt werden, auf dem auch die ab dieser Version automatisch durchgeführten Backups landen sollen. Macht Sinn, gefällt aber nicht jedem. Die Gründe dafür können sehr individuell sein. | ||
+ | |||
+ | Darum erkläre ich hier, wie ich es realisiert habe, dass die Diagrammdaten wieder auf die SD Karte geschrieben werden. Das könnte aber auch das Deaktivieren der automatischen Backups erfordern, weil die SD Karte sonst rasch voll läuft und möglicherweise ein manuelles Backup auch die automatischen Backups beinhaltet. Das habe ich noch nicht untersucht. | ||
+ | |||
+ | Um die microSD Karte weiterhin für die Speicherung der Diagramme zu verwenden müssen 2 Dateien auf das Dateisystem des PI3 kopiert und mit den richtigen Attributen versehen werden: | ||
+ | |||
+ | '''/usr/local/etc/rc.postinit''' (mod 755, rwx-rx-rx) | ||
+ | <pre> | ||
+ | #!/bin/sh | ||
+ | |||
+ | /usr/local/bin/InitSD | ||
+ | </pre> | ||
+ | |||
+ | '''/usr/local/bin/InitSD''' (mod 755, rwx-rx-rx) | ||
+ | <pre> | ||
+ | #!/bin/sh | ||
+ | |||
+ | ln -sf /usr/local/sdcard /media/usb0 | ||
+ | touch /var/status/USBinitialised | ||
+ | touch /var/status/SDinitialised | ||
+ | </pre> | ||
+ | [[Datei:PI3_usr_local.7z]] <- Download. Entpacken und entsprechend auf den PI3 kopieren. | ||
+ | |||
+ | == Monit (Watachdog) == | ||
+ | Es gibt etliche Überwachungen, die alle vom tool "monit" übernommen werden. Temporär (also bis zum Neustart) lassen sich verschiedene Überwachungen abschalten per SSH: | ||
+ | <pre>monit unmonitor <dienst></pre> | ||
+ | z.B. | ||
+ | <pre>monit unmonitor hasInternet</pre> | ||
+ | Auch aus einem Homemetic Skript kann das ausgeführt werden: | ||
+ | <pre>system.Exec("monit unmonitor hasInternet");</pre> | ||
+ | Die Konfiguration von monit findet man unter | ||
+ | <pre>/etc/monitrc</pre> | ||
+ | Hier können ggf. Überwachungen auskommentiert werden, was aber bei einem Update wieder überschrieben würde. |
Aktuelle Version vom 6. Juni 2019, 08:04 Uhr
Inhaltsverzeichnis
Skripte
Code-Beispiele und Erklärungen
- Systemvariable holen
- var SysVar = dom.GetObject("SysVar")
- Systemvariable lesen
- SysVar.Value()
- Systemvariable setzen
- SysVar.Variable(1)
- Steuerung auf Geräteparameter holen
- var SollTemp = dom.GetObject("Heizung K:4").DPByHssDP("SET_TEMPERATURE")
- Geräteparameter lesen
- SollTemp.Value()
- Geräteparameter setzen
- SollTemp.State(SysVar.Value())
- Gewerkeliste holen
- dom.GetObject(ID_FUNCTIONS)
Liefert ein array von IDs, mit denen über GetObject() wiederum die eigentlichen Objekte geholt werden müssen.
- Raumliste holen
- dom.GetObject(ID_ROOMS)
Liefert ein array von IDs, mit denen über GetObject() wiederum die eigentlichen Objekte geholt werden müssen.
- Schleife
- foreach(current, array) {}
array ist ein string mit einer Auflistung von Werten durch Tabulator (\t) getrennt und kann auch selbst erzeugt werden.
string array = "Sensor1\tSensor2";
- Log output
- WriteLine("Text, Value: " + SysVar.Value())
- Linux-Befehl ausführen
string stdout;
string stderr;
system.Exec("Befehl", &stdout, &stderr);
Beispiel für den Aufruf einer URL, stdout und stderr können wegfallen. User und Passwort sind in der URL unterzubringen, das Kaufmanns-Und (&) ist zu escapen
system.Exec("wget -q -O /dev/null --no-check-certificate https://user:password@server.de?command\¶meter=1");
- Anderes Programm aufrufen
var programObj = dom.GetObject("ZielProgramm");
programObj.ProgramExecute();
Übersicht der Objekthierarchie
Dokumentation von ELV
Datei:HM Skript Teil 1 Sprachbeschreibung V2.2.pdf
Datei:HM Skript Teil 2 Objektmodell V1.2.pdf
Datei:HM Skript Teil 3 Beispiele V1.1.pdf
Datei:HM Skript Teil 4-Datenpunkte.pdf
Sonnenauf- und Sonnenuntergang
Eine Astrofunktion stellt den Zeitpunkt des lokalen offiziellen Sonnenauf- und Sonnenuntergangs zur Verfügung. Auf diese kann in der Zeitsteuerung per Radio-Button zugegriffen werden. In Skripten erreicht man diese Werte über:
system.SunriseTime
und
system.SunsetTime
CPU Temperatur in Systemvariable schreiben
In einem periodisch aufgerufenen Programm (z.B. minütlich) kann man dieses Skript hinterlegen:
string result;
real temp;
object objCpuTemp = dom.GetObject("CpuTemp");
system.Exec("cat /sys/class/thermal/thermal_zone0/temp", &result);
temp = (0.0 + result.ToInteger()) / 1000.0;
objCpuTemp.State(temp);
In der Systemvariablen "CpuTemp" (ist anzulegen) hat man dann immer die recht aktuelle CPU Temperatur der Zentrale. (Kann sein, dass es ein Raspberry PI sein muss.)
Dimmer
Um einen Dimm-Aktor (Steckdose, Schalter) automatisch linear ansteigen (oder abfallen) zu lassen, wird mit sog. Rampen gearbeitet. Hier werden die erforderlichen Parameter einmal an den Aktor abgesetzt, der von da an diese Rampe von selbst umsetzt. Die Parameter für eine solche Rampenfunktion müssen aus unerfindlichen Gründen zeitgleich aber in einer bestimmten Reihenfolge abgesetzt werden:
- sofort Einschaltdauer setzen (definiert, wie lange der Aktor eingeschaltet bleibt, nachdem er die Rampe vollständig hochgefahren ist)
- sofort Dimmzeit setzen (definiert, wie breit die Rampe sein soll, also wie lange der Dimmprozess dauern soll)
- sofort Dimmwert setzen (definiert, auf welchen Wert der Dimmaktor sich innerhalb der Dimmzeit hoch- oder runterfahren soll)
Jetzt beginnt der Aktor mit dem linearen Dimmen.
Besonderheiten beim Raspberry PI 3 (RaspiMatic, RaspberryMatic)
Bevor die CCU3 auf den Markt kam, die auch auf einem Raspberry PI 3 basiert, gab es community-unterstützt schon die Möglichkeit, sich einen PI3 anzuschaffen, mit einem dafür vorgesehenen Funkmodul auszustatten und die frei verfügbare Homematic Software auf eine microSD Karte zu spielen, damit den PI3 zu booten und ihn somit in eine vollwertige Homematic zu verwandeln, die sogar um einies leistungsstärker war als die CCU2.
Natürlich gibt es bei so einer OpenSource Lösung Kleinigkeiten, die anders sind oder Sachen, die man verändern / verbessern kann ;)
XML-API absichern
Das AddOn "XML-API" ist wichtig für manche externe Apps, die mit der Homematic kommunizieren wollen. Sie ist eine Schnittstelle nach außen, ohne das WebUI zu verwenden. Leider ist sie vollkommen ungesichert. Weder passwortgeschützt noch verschlüsselt. Der fehlenden Verschlüsselung kann man durch HTTPS abhelfen, was man ohnehin auf der Zentrale aktiviert haben sollte, aber den wichtigeren Passwortschutz muss man selber nachrüsten:
Hierzu greift man in die Konfiguration des Webservers ein. Verwendet wird auf Homematic der lighttpd Server, dem man für 2 Pfade eine basic HTTP authentication unterjubelt. Das bedeutet, dass bei jeglichem Zugriff auf diese Pfade (es geht um die XML-API Pfade), ein Benutzername und ein Kennwort erwartet werden, ohne die kein Zugriff möglich ist. Der Benutzer sollte bei der Abfrage nicht mitgeteilt werden und das Kennwort sehr lang sein (> 12 Zeichen). So hält das Ganze auch einer brute-force Attacke stand. In meiner Variante sind Benutzer und Kennwort im PI3 Dateisystem im Klartext hinterlegt (hier kommt ja normalerweise niemand dran), man kann das vielleicht aber auch auf MD5, SHA1 etc. umstellen.
In der Config des lighttpd Servers sieht man, dass am Ende alle .conf Dateien im Pfad /usr/local/etc/config/lighttpd ausgeführt werden. Also müssen wir unsere Änderung nur hier platzieren, und sie wird angewendet.
/usr/local/etc/config/lighttpd/xmlauth.conf (mod 644, rw-r--r--)
auth.backend = "plain" auth.backend.plain.userfile = "/usr/local/etc/.lighttpdpassword" auth.require = ( "/config/xmlapi" => ( "method" => "basic", "realm" => "External access protection", "require" => "user=USERNAME" ), "/addons/xmlapi" => ( "method" => "basic", "realm" => "External access protection", "require" => "user=USERNAME" ) )
USERNAME wird hier durch den Benutzernamen ersetzt, den man sich ausdenkt.
Datei:PI3 usr local etc config lighttpd xmlauth.7z <-- Download. In entsprechenden Pfad kopieren.
/usr/local/etc/.lighttpdpassword (mod 644, rw-r--r--)
USERNAME:PASSWORD
USERNAME und PASSWORD werden hier durch die Benutzernamen/Passwort-Kombination ersetzt, den man sich ausdenkt, passend zur oberen Datei natürlich.
RaspberryMatic neustarten, und die XML-API ist abgesichert!
Diagramme ab Version 3.37 wieder auf die SD Karte speichern
Nach dem Update auf die Version 3.37 erschien in der WebUI anstatt der Diagramme die Meldung
Es ist kein USB-Speicher für die Speicherung der Diagrammdaten vorhanden oder auf diesen konnte nicht zugegriffen werden. Um die Diagrammdaten zu speichern, ist externer USB-Speicher erforderlich.
In den "Allgemeinen Einstellungen" der Zentrale unter "Externer USB Speicher" liest man:
microSD Karte ist vorhanden aber nicht initialisiert.
Diese Änderung ist beabsichtigt, um die SD Karte, auf der sich ja das Betriebssystem befindet zu schonen. Für das Speichern der Diagramme soll ein USB Stick eingesteckt werden, auf dem auch die ab dieser Version automatisch durchgeführten Backups landen sollen. Macht Sinn, gefällt aber nicht jedem. Die Gründe dafür können sehr individuell sein.
Darum erkläre ich hier, wie ich es realisiert habe, dass die Diagrammdaten wieder auf die SD Karte geschrieben werden. Das könnte aber auch das Deaktivieren der automatischen Backups erfordern, weil die SD Karte sonst rasch voll läuft und möglicherweise ein manuelles Backup auch die automatischen Backups beinhaltet. Das habe ich noch nicht untersucht.
Um die microSD Karte weiterhin für die Speicherung der Diagramme zu verwenden müssen 2 Dateien auf das Dateisystem des PI3 kopiert und mit den richtigen Attributen versehen werden:
/usr/local/etc/rc.postinit (mod 755, rwx-rx-rx)
#!/bin/sh /usr/local/bin/InitSD
/usr/local/bin/InitSD (mod 755, rwx-rx-rx)
#!/bin/sh ln -sf /usr/local/sdcard /media/usb0 touch /var/status/USBinitialised touch /var/status/SDinitialised
Datei:PI3 usr local.7z <- Download. Entpacken und entsprechend auf den PI3 kopieren.
Monit (Watachdog)
Es gibt etliche Überwachungen, die alle vom tool "monit" übernommen werden. Temporär (also bis zum Neustart) lassen sich verschiedene Überwachungen abschalten per SSH:
monit unmonitor <dienst>
z.B.
monit unmonitor hasInternet
Auch aus einem Homemetic Skript kann das ausgeführt werden:
system.Exec("monit unmonitor hasInternet");
Die Konfiguration von monit findet man unter
/etc/monitrc
Hier können ggf. Überwachungen auskommentiert werden, was aber bei einem Update wieder überschrieben würde.