Archivierte Sensorwerte abfragen


04.10.2016  |  Smarthome Server, Tutorial

In deinem Smarthome-System kannst du bereits Sensorwerte in der Datenbank speichern und mit der Smarthome App wurde auch schon angefangen. Damit du dir den Verlauf der archivierten Werte einzelner Sensoren in der App ansehen kannst, muss dafür zuerst die Schnittstelle angepasst werden und ein neues Skript angelegt werden, das für den gewünschten Zeitraum die Werte zurückgibt, damit mit diesen dann in der App ein Graph dargestellt werden kann. Wenn das Start- und Enddatum des übergebenen Zeitraums gleich ist, werden alle Werte dieses Sensors vom gewünschten Tag zurückgegeben.

Dieses Tutorial gibt es auch als Video

Archivierte Werte mit Skript abfragen

Als erstes verbindest du dich per FileZilla mit deinem Server, erstellst im Server-Hauptverzeichnis die Datei "getGraphData.php" und öffnest sie. Dort fügst du dann den folgenden Code ein:
<?php

function getGraphData($room, $value, $von, $bis, $db){
	if($von == $bis){
		//Datum formattieren
		$datum = date("d.m.y", strtotime($von));
		
		return getDayData($room, $value, $datum, $db);
	}
	else{
		return getDayMinMax($room, $value, $von, $bis, $db);
	}
}

function getDayMinMax($raum, $value, $start, $ende, $db){
	$dayseconds = 60 * 60* 24;
	
	$dateS = strtotime($start);
	
	$dateE = strtotime($ende);
	
	$values = array();
	
	while($dateS != ($dateE+$dayseconds)){
		$current_values = getDayValues($raum, $value, date("d.m.y", $dateS), $db);
		
		if(!empty($current_values)){
			array_push($values, $current_values);
		}
		
		//Einen Tag vorr&uuml;cken
		$dateS += $dayseconds;
	}
	
	//Entsprechende Einheit aus Datenbank laden
	$query = $db->prepare("SELECT * FROM 'ZWAVE_SENSOREN' WHERE RAUM == :room AND SENSORART == :value");
	$query->execute(array('room' => $raum, 'value' => $value));
	
	if($result = $query->fetch(PDO::FETCH_ASSOC)){
		$einheit = $result['EINHEIT'];
	}
	
	return json_encode(array('values' => $values, 'einehit' => $einheit));
}

function getDayValues($raum, $value, $datum, $db){
	$day_values = array();
	
	$query = $db->prepare("SELECT * FROM 'SENSOR_DATA' WHERE ROOM == :room AND SENSORART == :value AND DATETIME >= :start
	AND DATETIME < :ende ORDER BY DATETIME ASC");
	$query->execute(array('room' => $raum, 'value' => $value, 'start' => $datum." 00:00", 'ende' => $datum." 23:59"));
	
	foreach($query->fetchAll(PDO::FETCH_ASSOC) as $row){
		$day_values[] = floatval($row['VALUE']);
	}
	
	if(max($day_values) == false && min($day_values) == false){
		return null;
	}
	
	return array('max' => max($day_values), 'min' => min($day_values), 'date' => $datum);
}

function getDayData($raum, $value, $datum, $db){
	$values = array();
	
	$query = $db->prepare("SELECT * FROM 'SENSOR_DATA' WHERE ROOM == :room AND SENSORART == :value AND DATETIME >= :start
	AND DATETIME < :ende ORDER BY DATETIME ASC");
	$query->execute(array('room' => $raum, 'value' => $value, 'start' => $datum." 00:00", 'ende' => $datum." 23:59"));
	
	foreach($query->fetchAll(PDO::FETCH_ASSOC) as $row){
		$value_item = array('value' => floatval($row['VALUE']), 'time' => str_replace($datum." ", "", $row['DATETIME']));
		array_push($values, $value_item);
	}
	
	$query = $db->prepare("SELECT * FROM 'ZWAVE_SENSOREN' WHERE RAUM == :room AND SENSORART == :value");
	$query->execute(array('room' => $raum, 'value' => $value));
	
	if($result = $query->fetch(PDO::FETCH_ASSOC)){
		$einheit = $result['EINHEIT'];
	}
	
	return json_encode(array('values' => $values, 'einheit' => $einheit));
}

?>

Erklärung des Skripts

Die Funktion "getGraphData()" wird mit einem Raum, einer Sensorart, einem Start- und einem Enddatum (in der Form "dd.mm.jjjj"), sowie einer Referenz auf die Datenbank aufgerufen. Wenn Start- und Enddatum unterschiedlich sind, werden für diesen Zeitraum die Höchst- und Tiefstwerte jeden Tages mit der Funktion "getDayMinMax()" ausgegeben. Falls Start- und Enddatum gleich sind, werden alle gesammelten Daten dieses Tages mit der Funktion "getDayValues()" ausgegeben.

Die Funktion zur Schnittstelle hinzufügen

Nachdem das Skript angelegt und implementiert wurde, musst du noch die Schnittstelle ergänzen und die neue Funktion dort einfügen. Dazu öffnest du einfach die Datei „api.php“ per FileZilla mit einem Editor und fügst die enstprechende include-Anweisung hinzu (Siehe Zeile 17) und danach im switch-Block den neuen case (Siehe Zeilen 33-36):
<?php

//Datenbankverbindung herstellen
$SQLITEdb = "database/data.sqlite";
$db = new PDO("sqlite:".$SQLITEdb);
  
//Funksteckdosen
include "getModes.php";
include "setModes.php";
  
//Andere
include "getRooms.php";
include "getSensorData.php";
include "getSystemInfo.php";
include "getRoomData.php";

//Dieser Punkt wurde hinzugef&uuml;gt
include "getGraphData.php";

//Szenen
include "scenes/getScenes.php";
include "scenes/runScene.php";
include "scenes/createScene.php";
  
$validUser = validateUser($_POST['username'], $_POST['password'], $db);
  
if($validUser){
    switch($_POST['action']){
        case "getrooms":
            echo getRooms($db);
            break;
			
		//Dieser Punkt wurde hinzugef&uuml;gt
        case "getgraphdata":
            echo getGraphData($_POST['room'], $_POST['value'], $_POST['von'], $_POST['bis'], $db);
            break;
			
        case "getroomdata":
            echo getRoomData($_POST['room'], $db);
            break;
        case "getmodes":
            echo getModes($_POST['room'], $_POST['device'], $db);
            break;
        case "setmodes":
            echo setModes($_POST['room'], $_POST['device'], $_POST['zustand'], $db);
            break;
        case "getsensordata":
            echo getSensorData($_POST['room'], $_POST['value'], $_POST['showeinheit'], $db);
            break;
        case "runscene":
            echo runScene($_POST['room'], $_POST['name'], $db);
            break;
        case "createscene":
            echo createScene($_POST['devices'], $_POST['rooms'], $_POST['types'], $_POST['values'], $_POST['conditions'], $_POST['room'], $_POST['name'], $db);
            break;
        case "getscenes":
            echo getScenes($_POST['room'], $db);
            break;
        case "getsysteminfo":
            echo getSystemInfo();
            break;
    }
}
  
function validateUser($username, $password, $db){
    //wird noch implementiert
      
    return true;
}
  
?>
Wenn du Fragen oder Probleme hast, kannst du mir gerne einen Kommentar hinterlassen.

Über den Autor


Sascha Huber

Hallo, ich bin Sascha, der Gründer von Smarthome Blogger.

Mit einer Leidenschaft für Technologie und einem Hintergrund als Software Engineer habe ich 2016 Smarthome Blogger gegründet. Mein Ziel war es schon immer, innovative Lösungen zu entdecken, die unser Leben einfacher und intelligenter gestalten können. In meinem beruflichen Leben arbeite ich täglich mit Software und Technik, aber auch in meiner Freizeit bin ich stets auf der Suche nach neuen technischen Spielereien und Möglichkeiten, mein Zuhause zu automatisieren und zu verbessern.

Auf Smarthome Blogger teile ich mein Wissen, meine Erfahrungen und meine Begeisterung für alles rund um das Thema Smarthome.



Dieser Beitrag hat dir gefallen?

Dann abonniere doch unseren Newsletter!