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 …