Eines der grundlegenen Prinzipien von Big Data ist bekanntlich dass man die Daten erstmal sammelt. Auch wenn man sie nicht braucht.
Wozu ich also nun minütlich wissen will welche Temperatur, Luftfeuchte und Luftdruck in meinem Wohnzimmer herscht? Das weiß ich noch nicht, aber wir sammeln halt erstmal 🙂
Die Wahl unserer Waffen fällt relativ schnell auf einen Raspberry Pi der hier sowieso rumsteht und meine Backups macht: https://www.thomaschristlieb.de/mein-backup-zuhause/
Dieser bekommt noch etwas Hilfe von einem Sensor der Firma Bosch namens BME280. Dieser misst neben der Temperatur eben auch gleich noch den Luftdruck und die Luftfeuchte – und das ganze über den I2CBus mit einem Stromverbrauch der irgendwo in der Größenordnung 0 liegt. (max. 3.6 µA)
Angeschlossen wird er also an 3.3V und Ground beim Raspberry Pi. Sowie an den Pins 3 (SDA) und 5 (SCL).
Mit dem Programm raspi-config muss man jetzt noch den i2c Bus anschalten und I2C für Python installieren: apt-get install python-smbus
Auf folgender Website gibt es nun ein Python Script welches den Sensor ansteuern kann: https://www.raspberrypi-spy.co.uk/2016/07/using-bme280-i2c-temperature-pressure-sensor-in-python/
(Im Datenblatt von Bosch ist eine ekelhafte Beschreibung drin wie man die firmeninternen Kalibrierungswerte des Sensors auf die ausgelesenen Daten anwendet – das hab ich mir hier einfach mal gespart, deshalb das fertige bme280.py Script).
Auf dem empfangenden Server im Internet brauchen wir nun noch eine Datenbank mit einem User extra für das Empfangen der Daten:
CREATE USER 'envsensors'@'localhost' IDENTIFIED BY 'xxx'; GRANT USAGE ON *.* TO 'envsensors'@'localhost'; CREATE DATABASE IF NOT EXISTS `envsensors` CHARACTER SET utf8 COLLATE utf8_general_ci; GRANT ALL PRIVILEGES ON `envsensors`.* TO 'envsensors'@'localhost'; FLUSH PRIVILEGES;
Die dazugehörigen Tabellen zaubern wir wie folgt in die Datenbank:
CREATE TABLE `sensors` ( `id` int(11) NOT NULL, `name` varchar(32) NOT NULL, `description` text NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8; ALTER TABLE `sensors` ADD PRIMARY KEY (`id`); ALTER TABLE `sensors` MODIFY `id` int(11) NOT NULL AUTO_INCREMENT; INSERT INTO sensors (name, description) VALUES ('living room', 'In the living room at the computer connected to the backup raspberry Pi 3 B') CREATE TABLE `sensorvalues` ( `id` int(11) NOT NULL, `timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, `sensorid` int(11) NOT NULL, `temp` decimal(10,3) NOT NULL, `press` decimal(10,3) NOT NULL, `hum` decimal(10,3) NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8; ALTER TABLE `sensorvalues` ADD PRIMARY KEY (`id`), ADD KEY `timestampindex` (`timestamp`); ALTER TABLE `sensorvalues` MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;
Nun erzeugen wir ein Python-Script welches das vorhandene bme280.py einfach importiert:
#!/usr/bin/python import bme280 import requests temperature,pressure,humidity = bme280.readBME280All() print "Temperature : ", temperature, "C" print "Pressure : ", pressure, "hPa" print "Humidity : ", humidity, "%" r = requests.post("http://www.meinserver.de/tempsensor.php", data={'sensorid': 1, 'temp': temperature, 'press': pressure, 'hum': humidity, 'password': 'zzz'}) print r.text
Dieses machen wir mit „chmod +x ./sendtemp.py“ ausführbar und lassen es per Cron minütlich laufen:
* * * * * /home/pi/sendtemp/sendtemp.py > /dev/null 2>&1
Zuletzt gibt es hier noch das PHP Script welches die Werte empfängt und in die DB schreibt. Ich hab mich hier auch bemüht brav die Parameter zu checken, ein Passwort zu nutzen und Prepared Statements zu verwenden, damit hier niemand sagen kann mir sei die Sicherheit meiner Leser nicht wichtig 🙂
<?php $sensorpass = "zzz"; $dbserver = "localhost"; $dbuser = "envsensors"; $dbpass = "xxx"; $dbname = "envsensors"; $sensorid = $_POST["sensorid"]; if (!isset($sensorid) || !is_numeric($sensorid)) { die('Error 1'); } $temp = $_POST["temp"]; if (!isset($temp) || !is_numeric($temp)) { die('Error 2'); } $press = $_POST["press"]; if (!isset($press) || !is_numeric($press)) { die('Error 3'); } $hum = $_POST["hum"]; if (!isset($hum) || !is_numeric($hum)) { die('Error 4'); } $password = $_POST["password"]; if (!isset($password) || !($password == $sensorpass)) { die('Error 5'); } $conn = new mysqli($dbserver, $dbuser, $dbpass, $dbname); if ($conn->connect_error) { die("Error 6"); } $stmt = $conn->prepare("INSERT INTO sensorvalues (sensorid, temp, press, hum) VALUES (?, ?, ?, ?)"); $stmt->bind_param("iddd", $sensorid, $temp, $press, $hum); $stmt->execute(); echo "Done."; $stmt->close(); $conn->close(); ?>
Und zu guter letzt können wir nun noch Grafana nutzen um die Werte anzuzeigen, hierfür kommt (bei Ubuntu 18.04) in die Datei ‚/etc/apt/sources.list‘ rein:
deb https://packagecloud.io/grafana/stable/debian/ stretch main
Und dann installieren wir Grafana:
curl https://packagecloud.io/gpg.key | sudo apt-key add - sudo apt-get update sudo apt-get install grafana /bin/systemctl daemon-reload /bin/systemctl enable grafana-server systemctl start grafana-server
Das Webinterface von Grafana ist nun auf dem Port 3000 zu erreichen. Username und Passwort ist admin/admin – das ändert man natürlich beim ersten Login.
In Grafana richtet man eine neuen Data Source ein und verbindet es mit der Mysql-Datenbank. Folgende Selects führen uns zu unseren drei Werten:
SELECT UNIX_TIMESTAMP(timestamp) as time_sec, temp as value, 'Temperature' as metric FROM sensorvalues WHERE $__timeFilter(timestamp) ORDER BY timestamp ASC
SELECT UNIX_TIMESTAMP(timestamp) as time_sec, hum as value, 'Humidity' as metric FROM sensorvalues WHERE $__timeFilter(timestamp) ORDER BY timestamp ASC
SELECT UNIX_TIMESTAMP(timestamp) as time_sec, press as value, 'Pressure' as metric FROM sensorvalues WHERE $__timeFilter(timestamp) ORDER BY timestamp ASC
Nun muss man nur noch in der Grafik unten in der Legende auf den farbigen Balken neben „Pressure“ gehen und dort einstellen dass dieser auf die rechte Y-Achse geschoben wird.
Sonst sieht man die Temperatur und Fechtigkeitswerte (die ja so um die 20 Grad und 40% sind) nicht weil die Skala wegen dem Druck von ca. 1000 hPa nur ganz ungenau in dem Bereich ist.
Selbstverständlich gibt es hiervon auch ein Foto:
Und weils soviel Spaß gemacht hat, und ich noch eine Sensor für außen brauche, geht es hier weiter: Mit ESP8266, Micropython und dem BME280 einen Datenlogger basteln
Schreibe einen Kommentar