ich mag zwar die Homematic, aber programmieren lässt die sich so elegant wie mein alter C64. Vor allem das Fehlen von sinnvollen und globalen Funktionen tut schon weh. Daher habe ich beschlossen, die Programmierung in PERL oder PHP auf dem Raspberry zu machen. Damit ich was machen kann, müssen aber die Daten erst einmal auf das Teil, am besten in eine Datenbank (MySQL).
Früher hätte ich das über den Otto-Normal-Syslog-Daemon gemacht, das ganze in eine "named pipe" geschrieben und mit PERL geparset und in die DB geschrieben. Aber wir sind ja inzwischen im 21. Jahrhundert angekommen. Daher will ich nicht schon dort mit dem Programmieren anfangen, also habe ich überlegt, wie das mit Bordmitteln geht. Die Lösung lauter SYSLOG-NG.
Vorbereitung
Raspbian neu installieren, IP-Adresse setzen und per SSH einloggen.
Als erstes muss man im Standard-Raspberry die fehlenden Pakete nachinstallieren:
Code: Alles auswählen
sudo apt-get install syslog-ng mysql-server mysql-client libdbd-mysql libdbi1
MySQL vorbereiten
Mit
Code: Alles auswählen
mysql -u root -p
Hier in der Shell legt man seine Datenbank und das restliche Bohei an:
Code: Alles auswählen
create database homematic;
use homematic;
CREATE USER 'syslogger'@'localhost' IDENTIFIED BY 'topsecret';
GRANT ALL ON homematic.* TO 'syslogger'@'localhost';
CREATE TABLE homedata (
id_homedata INT AUTO_INCREMENT,
t_date TIMESTAMP,
i_time INT UNSIGNED,
s_host VARCHAR(255),
s_device VARCHAR(128),
i_channel INT,
s_key varchar(255),
s_value varchar(255),
PRIMARY KEY (`id_homedata`),
KEY `s_host` (`s_host`),
KEY `t_date` (`t_date`),
KEY `i_time` (`i_time`),
KEY `s_device` (`s_device`),
KEY `i_channel` (`i_channel`),
KEY `s_key` (`s_key`),
KEY `s_value` (`s_value`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Syslog-NG konfigurieren
Mit
Code: Alles auswählen
sudo vi /etc/syslog-ng/syslog-ng.conf
Code: Alles auswählen
destination d_homesql {
sql(
type("mysql")
username("syslogger")
password("topsecret")
database("homematic")
host("localhost")
table("homedata")
columns("s_host", "t_date", "i_time", "s_device", "i_channel", "s_key", "s_value")
values("$HOST","$S_ISODATE","$S_UNIXTIME", "${HOME.DEVICE}", "${HOME.CHANNEL}", "${HOME.KEY}", "${HOME.VALUE}" )
);
};
parser p_home {
csv-parser(columns("HOME.EVENT", "HOME.DEVICE", "HOME.CHANNEL", "HOME.KEY", "HOME.VALUE") delimiters(":.=") flags(greedy,strip-whitespace) );
};
filter f_rfd { match("rfd" value(PROGRAM)); };
filter f_event { match("^Event:" value(MESSAGE)); };
log { source(s_net); filter(f_rfd); filter(f_event); parser(p_home); destination(d_homesql); };
Syslog-NG neu starten
Das geht mit
Code: Alles auswählen
sudo service syslog-ng restart
Code: Alles auswählen
mysql> select * from homedata LIMIT 10;
+-------------+---------------------+------------+-----------+------------+-----------+----------------+---------------+
| id_homedata | t_date | i_time | s_host | s_device | i_channel | s_key | s_value |
+-------------+---------------------+------------+-----------+------------+-----------+----------------+---------------+
| 429 | 2016-03-06 20:48:03 | 1457293683 | 10.0.1.10 | LEQ******* | 1 | TEMPERATURE | 19.800000 |
| 430 | 2016-03-06 20:48:03 | 1457293683 | 10.0.1.10 | LEQ******* | 1 | HUMIDITY | 47 |
| 431 | 2016-03-06 20:48:04 | 1457293684 | 10.0.1.10 | KEQ******* | 1 | TEMPERATURE | 20.100000 |
| 432 | 2016-03-06 20:48:04 | 1457293684 | 10.0.1.10 | KEQ******* | 1 | HUMIDITY | 52 |
| 433 | 2016-03-06 20:48:12 | 1457293692 | 10.0.1.10 | LEQ******* | 1 | TEMPERATURE | 19.400000 |
| 434 | 2016-03-06 20:48:12 | 1457293692 | 10.0.1.10 | LEQ******* | 1 | HUMIDITY | 51 |
| 435 | 2016-03-06 20:48:35 | 1457293715 | 10.0.1.10 | MEQ******* | 1 | BOOT | false |
| 436 | 2016-03-06 20:48:35 | 1457293715 | 10.0.1.10 | MEQ******* | 1 | ENERGY_COUNTER | 528983.000000 |
| 437 | 2016-03-06 20:48:35 | 1457293715 | 10.0.1.10 | MEQ******* | 1 | POWER | 1345.000000 |
| 438 | 2016-03-06 20:48:51 | 1457293731 | 10.0.1.10 | KEQ******* | 1 | TEMPERATURE | 20.200000 |
+-------------+---------------------+------------+-----------+------------+-----------+----------------+---------------+
Nächste Schritte
Keine Ahnung, aber ich werde mir ein paar "stored procedures" in MySQL ausdenken, um die Daten besser griffbereit zu haben. Danach packe ich mal ein hübsches Dashboard dazu.
Bitte wundert Euch nicht, wenn es einige Zeit dauert, bis das Projekt bei mir weiter geht.
Gruß, Martin