Archivierte Sensorwerte abfragen

Teile diesen Beitrag

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ü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ü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ü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.

Teile diesen Beitrag
, , , ,
Vorheriger Beitrag
Smarthome App #2: Login-Bildschirm
Nächster Beitrag
Smarthome App #3: Hauptmenü

Ähnliche Beiträge

Menü

Wir nutzen Cookies, um dir passende Inhalte zu präsentieren und dein Surfvergnügen zu optimieren, aktivieren Cookies aber erst, wenn du auf akzeptieren klickst. Weitere Informationen

Wir benutzen Google Analytics, um zu ermitteln, welche Inhalte unsere Besucher sehen wollen und welche nicht. Eingebettete YouTube-Videos helfen dir mittels Cookies nur die Videos zu sehen, die du sehen willst.

Schließen