13.12.2016
<?php
function getPermissions($username, $db){
//Berechtigungen des Nutzers aus der Datenbank laden
$results = $db->prepare("SELECT * FROM 'userdata' WHERE USERNAME == :username");
$results->execute(array('username' => $username));
//Abfrageergebnisse speichern
if($result = $results->fetch(PDO::FETCH_ASSOC)){
$permissions = $result['PERMISSIONS'];
}
return $permissions;
}
function setPermissions($username, $permissions, $db){
if(!hasPermission("admin", $db)){
return "nopermission";
}
//Berechtigungen des Nutzers aktualisieren
$results = $db->prepare("UPDATE 'userdata' SET PERMISSIONS = :permissions WHERE USERNAME == :username");
$results->execute(array('username' => $username, 'permissions' => $permissions));
return "ok";
}
?>
<?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";
include "getGraphData.php";
include "events.php";
//Diese Zeile wurde hinzugefügt
include "permissions.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;
case "getevents":
echo getEvents($_POST['username'], $_POST['type'], $_POST['limit'], $_POST['offset'], $db);
break;
case "geteventtypes":
echo getEventTypes($db);
break;
case "addevent":
echo addEvent($_POST['type'], $_POST['text'], $db);
break;
case "getunseenevents":
echo getUnseenEvents($_POST['username'], $db);
break;
//Diese Zeilen wurden hinzugefügt
case "getpermissions":
echo getPermissions($_POST['user'], $db);
break;
case "setpermissions":
echo setPermissions($_POST['user'], $_POST['permissions'], $db);
break;
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;
}
//Diese Funktion wurde hinzugefügt
function hasPermission($action, $db){
$permissions = getPermissions($_POST['username'], $db);
$permissions = json_decode($permissions, true)['permissions'];
return (in_array($action, $permissions) || in_array("admin", $permissions));
}
?>
<?php
function setModes($room, $device, $zustand, $db){
//Diese Zeilen wurden hinzugefügt
if(!hasPermission($room, $db)){
return "nopermission";
}
//Hauscode und Steckdosennummer aus Datenbank laden
$query = $db->prepare("SELECT * FROM 'funksteckdosen' WHERE ROOM == :room AND DEVICE == :device");
$query->execute(array('room' => $room, 'device' => $device));
//Abfrageergebnisse speichern
if($result = $query->fetch(PDO::FETCH_ASSOC)){
$hauscode = $result['HAUSCODE'];
$steckdosennummer = $result['STECKDOSENNUMMER'];
}
//Schaltbefehl für Steckdosen
shell_exec("/usr/local/bin/send ".$hauscode." ".$steckdosennummer." ".$zustand);
//Status der geschalteten Steckdose aktualisieren
$query = $db->prepare("UPDATE 'funksteckdosen' SET 'ZUSTAND' = :zustand WHERE ROOM == :room AND DEVICE == :device");
$query->execute(array('zustand' => $zustand, 'room' => $room, 'device' => $device));
//Rückgabe
return "SET ".$device." IN ".$room." TO ".$zustand;
}
?>
<?php
function getModes($room, $device, $db){
//Diese Zeilen wurden hinzugefügt
if(!hasPermission($room, $db)){
return "nopermission";
}
if($device==""){
//Daten des gesuchten Raumes aus der Datenbank laden
$results = $db->prepare("SELECT * FROM 'funksteckdosen' WHERE ROOM == :room");
$results->execute(array('room' => $room));
$modi = array();
foreach($results->fetchAll(PDO::FETCH_ASSOC) as $row){
$mode_item = array('device' => $row['DEVICE'], 'mode' => $row['ZUSTAND'], 'icon' => $row['ICON'], 'name' => $row['NAME']);
array_push($modi, $mode_item);
}
header('Content-type: application/json');
return json_encode(array('modi' => $modi));
}
else{
//Schaltzustand aus Datenbank laden
$results = $db->prepare("SELECT * FROM 'funksteckdosen' WHERE ROOM == :room AND DEVICE == :device");
$results->execute(array('room' => $room, 'device' => $device));
foreach($results->fetchAll(PDO::FETCH_ASSOC) as $row){
return $row['ZUSTAND'];
}
}
}
?>
<?php
function getRoomData($room, $db){
//Diese Zeilen wurden hinzugefügt
if(!hasPermission($room, $db)){
return "nopermission";
}
$roomdata = array();
$switchdata = json_decode(getModes($room, "", $db), true);
foreach($switchdata['modi'] as $switch){
if($switch['mode'] === "1"){
$mode = true;
}
else{
$mode = false;
}
array_push($roomdata, array('name' => $switch['name'], 'device' => $switch['device'], 'icon' => $switch['icon'], 'type' => "switch", 'value' => ($mode) ? 'true' : 'false'));
}
$sensordata = json_decode(getSensorData($room, "", "", $db), true);
foreach($sensordata['values'][0]['value_array'] as $sensor){
array_push($roomdata, array('name' => $sensor['shortform'], 'device' => $sensor['sensorart'], 'icon' => $sensor['sensorart'], 'type' => "value", 'value' => $sensor['wert']));
}
$scenedata = json_decode(getScenes($room, $db), true);
if(sizeOf($scenedata['scenes']) > 0){
array_push($roomdata, array('name' => "Szenen", 'device' => "scenes", 'icon' => "scenes", 'type' => "scenes", 'value' => ""));
}
//Heizungs-Item implementieren
return json_encode(array('roomdata' => $roomdata));
}
?>
<?php
function getRooms($db){
//Räume laden
$results = $db->prepare("SELECT * FROM 'ROOMS'");
$results->execute();
$rooms = array();
//JSON-Objekt erstellen und füllen
foreach($results->fetchAll(PDO::FETCH_ASSOC) as $row){
//Diese Zeilen wurden hinzugefügt
if(!hasPermission($row['LOCATION'], $db)){
continue;
}
$room_item = array('name' => $row['NAME'], 'location' => $row['LOCATION']);
array_push($rooms, $room_item);
}
//JSON-Objekt ausgeben
header('Content-type: application/json');
return json_encode(array('rooms' => $rooms));
}
?>
<?php
function getGraphData($room, $value, $von, $bis, $db){
//Diese Zeilen wurden hinzugefügt
if(!hasPermission($room, $db)){
return "nopermission";
}
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->query("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));
}
function getDayValues($raum, $value, $datum, $db){
$day_values = array();
$query = $db->query("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->query("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->query("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));
}
?>
<?php
function getSensorData($room, $val, $show_einheit, $db){
$ipAddress = $_SERVER['SERVER_ADDR'];
if($val == null){ //Alle Werte werden abgefragt
//Räume laden
if($room== "all"){
$results = $db->prepare("SELECT * FROM 'ROOMS'");
$results->execute();
}
else{
$results = $db->prepare("SELECT * FROM 'ROOMS' WHERE LOCATION == :room");
$results->execute(array('room' => $room));
}
//ausgabearray erzeugen
$values = array();
//Alle Räume durchlaufen
foreach($results->fetchAll(PDO::FETCH_ASSOC) as $row){
//Diese Zeilen wurden hinzugefügt
if(!hasPermission($row['LOCATION'], $db)){
continue;
}
//Wertearray erzeugen
$value_array = array();
//Sensoren im aktuellen Raum laden
$ergebnisse = $db->prepare("SELECT * FROM 'ZWAVE_SENSOREN' WHERE RAUM == :location");
$ergebnisse->execute(array('location' => $row['LOCATION']));
//Alle Sensoren im Raum durchlaufen
foreach($ergebnisse->fetchAll(PDO::FETCH_ASSOC) as $reihe){
//Wert für jeden Sensor zusammen mit Sensorart in Wertearray schreiben
$value = array('shortform'=> $reihe['SHORTFORM'], 'sensorart' => $reihe['SENSORART'], 'wert' => getSensorData($reihe['RAUM'], $reihe['SENSORART'], 1, $db));
array_push($value_array, $value);
}
//Daten für aktuellen Raum in Ausgabearray schreiben
$value_item = array('name' => $row['NAME'], 'location' => $row['LOCATION'], 'value_array' => $value_array);
array_push($values, $value_item);
}
//JSON-Objekt zurückgeben
return json_encode(array('values' => $values));
}
else{ //Ein spezieller Wert wird abgefragt
//Diese Zeilen wurden hinzugefügt
if(!hasPermission($room, $db)){
return "nopermission";
}
//ID des gesuchten Sensors im gesuchten Raum ermitteln
$id = getZwaveId($room, $val, $db);
if($id !== null){
//Z-Wave API aufrufen
$link = "http://".$ipAddress."/ZAutomation/api/v1/devices/".$id;
//curl mit URL initialisieren
$curl = curl_init($link);
//Port setzen
curl_setopt($curl, CURLOPT_PORT, 8083);
//Ausgabe einstellen
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
//Abfrage ausführen
$result = curl_exec($curl);
//Wert je nach Wunsch mit/ohne Einheit ausgeben
$array = json_decode($result, true);
$return = $array['data']['metrics']['level'];
if($show_einheit == "1"){
$return = $return." ".$array['data']['metrics']['scaleTitle'];
}
return $return;
}
else return "N/A"; //Sensor-ID nicht gefunden
}
}
function getZwaveId($room, $val, $db){
//Z-Wave ID des gesuchten Sensors im geuchten Raum laden
$query = $db->prepare("SELECT * FROM 'ZWAVE_SENSOREN' WHERE RAUM == :room AND SENSORART == :sensorart");
$query->execute(array('room' => $room, 'sensorart' => $val));
//ID zurückgeben, wenn gefunden
if($result = $query->fetch(PDO::FETCH_ASSOC)){
return $result['ID'];
}
else return null; //ID nicht gefunden?
}
?>
<?php
function createScene($devices, $rooms, $types, $values, $conditions, $room, $name, $db){
//Diese Zeilen wurden hinzugefügt
if(!hasPermission($room, $db)){
return "nopermission";
}
//Prüfen, ob alle Arrays ($devices, $rooms, $types, $modes) gleich viele Elemente haben, gibt andernfalls Fehlermeldung aus
if(sizeOf($devices) < sizeOf($rooms) ||
sizeOf($rooms) < sizeOf($types) ||
sizeOf($types) < sizeOf($values) ||
sizeOf($values) < sizeOf($devices)){
exit("error");
}
$scene = array();
//Die Übergabe-Arrays in ein einziges Array zusammensetzen
for($counter = 0; $counter < sizeOf($devices); $counter++){
//Diese Zeilen wurden hinzugefügt
if(!hasPermission($rooms[$counter], $db)){
return "nopermission";
}
$action_item = array('device' => $devices[$counter], 'location' => $rooms[$counter], 'value' => $values[$counter], 'type' => $types[$counter], 'if' => $conditions[$counter]);
array_push($scene, $action_item);
}
//Array als JSON-Objekt ausgeben
header('Content-type: application/json');
$action_string = json_encode(array('actions' => $scene));
//Prüfen, ob $room leer ist, wenn ja Default-Wert setzen
if($room == ''){
$room = 'NONE';
}
//Szene in Datenbank schreiben
$statement = $db->prepare("INSERT INTO SCENES (NAME, ROOM, ACTIONS) VALUES (?,?,?)");
$statement->execute(array($name, $room, $action_string));
return "ok";
}
?>
<?php
function getScenes($room, $db){
//Szenen aus Datenbank laden
//INFO: Es werden alle Szenen abgefragt, die entweder dem Raum des Parameters $room oder dem Raum 'NONE' zugewiesen sind
$results = $db->prepare("SELECT * FROM 'SCENES' WHERE ROOM == :room OR ROOM == 'NONE'");
$results->execute(array('room' => $room));
$scenes = array();
//Namen aller gefundenen Szenen in Array schreiben
foreach($results->fetchAll(PDO::FETCH_ASSOC) as $row){
//Diese Zeilen wurden hinzugefügt
if(!hasPermission($row['ROOM'], $db) && $row['ROOM'] !== "NONE"){
continue;
}
$scene_item = array('name' => $row['NAME'], 'room' => $row['ROOM'], 'actions' => $row['ACTIONS']);
array_push($scenes, $scene_item);
}
//Array als JSON-Objekt ausgeben
header('Content-type: application/json');
return json_encode(array('scenes' => $scenes));
}
?>
<?php
function runScene($room, $scene, $db){
//Diese Zeilen wurden hinzugefügt
if(!hasPermission($room, $db) && $room !== "NONE"){
return "nopermission";
}
//Szenen aus Datenbank laden
$results = $db->prepare("SELECT * FROM 'SCENES' WHERE ROOM == :room AND NAME == :scene");
$results->execute(array('room' => $room, 'scene' => $scene));
foreach($results->fetchAll(PDO::FETCH_ASSOC) as $row){
$array = json_decode($row['ACTIONS'], true);
foreach($array['actions'] as $action){
//Wenn Bedingung erfüllt ist oder keine Bedingung angegeben, führe Befehl aus
if($action['if']==null || conditionTrue($action['if'])){
//Verarbeitung der Aktion anhand des Aktionstyps (Schalter, Heizung, etc.)
switch($action['type']){
case 'switch':
setModes($action['location'], $action['device'], $action['value'], $db);
break;
case 'heizung':
//Heizungssteuerung wird noch implementiert
break;
}
}
}
}
return "ok";
}
//Prüft die übergebene Bedingung auf Wahrheit und gibt dementsprechend true/false zurück
function conditionTrue($condition){
switch($condition['type']){
//Sensorwert abfragen
case 'sensor':
$value = getData($condition['room'], $condition['sensorart'], '', $db);
break;
//Schalter abfragen
case 'switch':
$value = getModes($condition['room'], $condition['device'], $db);
break;
}
//vergleicht den abgefragten Wert mit dem übergebenen Wert
switch($condition['comparator']){
case '<':
return ($value < $condition['value']);
case '<=':
case '=<':
return ($value <= $condition['value']);
case '>':
return ($value > $condition['value']);
case '>=':
case '=>':
return ($value >= $condition['value']);
case '==':
case '=':
return ($value == $condition['value']);
default:
return false;
}
}
?>
Dieser Beitrag hat dir gefallen?
Dann abonniere doch unseren Newsletter!