Nächster Schritt: regelmässiges Schreiben der Sensoren-Werte in eine MySQL-Datenbank.
Und wenn ich schon mit einer Datenbank anfange, wird auch die „sensoren.db“ aus dem vorherigen Post in die Datenbank verschoben.
Schritt 1: Datenbank erstellen: Name ‚templog‘
2 Tabellen:
CREATE TABLE `templog`.`Sensoren` ( `ID` VARCHAR(16) NOT NULL , `Name` VARCHAR(50) NOT NULL , `Temp_Max` INT NOT NULL , `Temp_Min` INT NOT NULL ) ENGINE = InnoDB CHARSET=utf8 COLLATE utf8_german2_ci;
Die Spalten Temp_Max und Temp_Min werden vorläufig nicht gebraucht, for future use…
CREATE TABLE `logging` ( `ID` varchar(16) NOT NULL, `Temperatur` int(11) NOT NULL, `datetime` datetime NOT NULL ) ENGINE = InnoDB CHARSET=utf8 COLLATE=utf8_german2_ci;
ggfs. kann man noch Primärschlüssel und/oder Indizes anlegen. Das ist aber vorläufig nicht notwendig.
Jetzt geht’s an das PHP-script, das die Werte in die Datenbank schreibt.
Version1: Sensoren aus Datenbank einlesen
//Alle Fehlermeldungen einschalten error_reporting(E_ALL); //Definition der Verbindungsdaten define ( 'MYSQL_HOST','NAME/ADRESSE-MYSQL-SERVER'); define ( 'MYSQL_BENUTZER', 'USERNAME' ); define ( 'MYSQL_KENNWORT', 'PASSWORD' ); define ( 'MYSQL_DATENBANK', 'templog' ); //Verbindung herstellen $link = mysqli_connect (MYSQL_HOST, MYSQL_BENUTZER, MYSQL_KENNWORT, MYSQL_DATENBANK); if ( !$link ) //Fehlerbehandlung { die('Verbindung fehlgeschlagen: ' . mysqli_error()); } mysqli_set_charset($link, 'utf8'); //Einlesen aller Sensoren $sql = "SELECT * FROM Sensoren"; $result = mysqli_query( $link, $sql ); if ( ! $result ) //Fehlerbehandlung { die('Fehler bei Abfrage: ' . mysqli_error()); } //Durchlaufen aller Sensoren while ($z = mysqli_fetch_array( $result, MYSQLI_ASSOC)) { //Auslesen der Temperatur aus den Sensoren $filename="/sys/bus/w1/devices/".$z['ID']."/w1_slave"; $lines=file($filename); $temp=substr($lines[1],strpos($lines[1],"t=")+2,5); //echo $z['ID'].";".$z['Name'].";".$z['Temp_Max'].";".$z['Temp_Min'].";".($temp/1000.0).";".date("Y-m-d H:i:s")."\n" //Schreiben der aktuellen Temperatur in die Datenbank $sql="INSERT INTO logging (ID, Temperatur, datetime) Values ('".$z['ID']."', '".$temp."', '".date("Y-m-d H:i:s")."')"; $write_result = mysqli_query( $link, $sql ); if ( ! $write_result ) //Fehlerbehandlung { die('Fehler bei Abfrage: ' . mysqli_error()); } } mysqli_free_result( $result ); mysqli_close($link);
Version2: Sensoren aus Device-Tree einlesen
//Alle Fehlermeldungen einschalten error_reporting(E_ALL); //Definition der Verbindungsdaten define ( 'MYSQL_HOST','NAME/ADRESSE-MYSQL-SERVER'); define ( 'MYSQL_BENUTZER', 'USERNAME' ); define ( 'MYSQL_KENNWORT', 'PASSWORD' ); define ( 'MYSQL_DATENBANK', 'templog' ); //Verbindung herstellen $link = mysqli_connect (MYSQL_HOST, MYSQL_BENUTZER, MYSQL_KENNWORT, MYSQL_DATENBANK); if ( !$link ) //Fehlerbehandlung { die('Verbindung fehlgeschlagen: ' . mysqli_error()); } mysqli_set_charset($link, 'utf8'); //Verzeichnis der Sensoren durchsuchen $vz="/sys/bus/w1/devices/"; $allfiles=scandir($vz); foreach ($allfiles as $ID) { if (substr($ID,0,3)=="28-") //nur Sensoren, die mit 28- beginnen, werden ausgewertet { //Auslesen der Temperatur aus den Sensoren $filename="/sys/bus/w1/devices/".$ID."/w1_slave"; $lines=file($filename); $temp=substr($lines[1],strpos($lines[1],"t=")+2,5); //Schreiben der aktuellen Temperatur in die Datenbank $ sql="INSERT INTO logging (ID, Temperatur, datetime) Values ('".$ID."', '".$temp."', '".date("Y-m-d H:i:s")."')"; $write_result = mysqli_query( $link, $sql ); if ( ! $write_result ) //Fehlerbehandlung { die('Fehler bei Abfrage: ' . mysqli_error()); } } } mysqli_close($link);
Und zu guter letzt der Cron-eintrag
*/30 * * * * root php /PFAD/tempread.phpAuslesen und Schreiben der Werte alle 30 Minuten
Und jetzt als naechsten Artikel noch schoen ein lokal zu installierendes Nagios-Plugin schreibseln, dass die Werte aus der DB liest. Auf dem remote-Ende (Nagios-Server) dann die Schwellwerte definieren, bei denen Warning- sowie Error-Meldungen angzeigt und gemailt werden.
nix plugin.. ich mach das selber… erste Version ist schon fertig
Thingsboard und dann per mqtt füttern …