Berechtigungen der Nutzer verwalten


13.12.2016  |  Smarthome Server, Tutorial

Berechtigungen der Nutzer sind eine einfache und effektive Möglichkeit, zu verhindern, dass jeder Nutzer Zugriff auf jeden Raum hat. Damit können Nutzer, die nicht über die nötigen Berechtigungen verfügen, nicht versehentlich Geräte löschen oder verändern oder sogar absichtlich Geräte in Räumen schalten, zu denen sie eigentlich keinen Zugriff haben sollten. Um diesem Tutorial folgen zu können, solltest du dir alle Tutorials aus der Kategorie "Smarthome-Server" durchlesen und sie nachmachen.

Dieses Tutorial als Video

Berechtigungen in Datenbank einfügen

Als erstes rufst du in deinem Browser die Adresse "http://[IP DES PI]/database/phpliteadmin.php" auf und gibst gegebenenfalls das Passwort ein ("admin"). Um die Berechtigungen nun in der Datenbank abspeichern zu können klickst du in der Übersicht bei der Tabelle "userdata" auf den Punkt "structure". Anschließend klickst du unten bei "Add 1 field at end of table" auf "GO", erstellst ein neues Feld mit dem Namen "PERMISSIONS" und dem Datentyp "TEXT", wie im Bild zu sehen und klickst auf "GO" um den Vorgang abzuschließen. In dem Feld "PERMISSIONS" werden die Berechtigungen im JSON-Format abgespeichert.
Im Feld

Funktionen zum Abfragen und Setzen von Berechtigungen

Um Berechtigungen abfragen und setzen zu können, muss noch ein Skript erstellt werden, das diese Funktionen zur Verfügung stellt. Dazu verbindest du dich per FileZilla mit deinem Pi und erstellst im Serverhauptverzeichnis eine neue Datei namens "permissions.php". Diese Datei öffnest du jetzt und fügst dort den folgenden Quellcode ein.
<?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";
}

?>
Die Methode "getPermissions" fragt lediglich die Berechtigungen des übergebenen Nutzers ab und gibt sie aus, während die Methode "setPermissions" die übergebenen Berechtigungen für den übergebenen Nutzer in die Datenbank schreibt.

Die Schnittstelle bearbeiten

Damit alle Skripte der Schnittstelle prüfen können, ob ein Nutzer die nötigen Berechtigungen zur Ausführung der gewünschten Aktion besitzt, muss die Datei "api.php" geöffnet und ein wenig angepasst werden. Dazu wurde die Datei "permissions.php" inkludiert (Zeile 20), 2 neue Cases zum switch-Block hinzugefügt (Zeilen 48-53) und eine Funktion erstellt, um zu prüfen, ob der übergebene Nutzer Zugriff auf den übergebenen Raum hat (Zeilen 92-97).
<?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&uuml;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&uuml;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&uuml;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));
}
   
?>
Die Methode "hasPermission" fragt die Berechtigungen des aktuellen Nutzers ab und prüft anschließend, ob der Wert der übergebenen Aktion oder (kein exklusives oder) der Wert "admin" in dem Array vorkommt und gibt dementsprechend entweder true oder false zurück.

Skripte anpassen

Nun müssen natürlich auch alle bisher angelegten Skripte angepasst werden, um sicherzustellen, dass jeder Nutzer nun Aktionen ausführen kann, zu denen er auch berechtigt ist. Dazu werden in alle nötigen Skripte ein paar wenige Zeilen Code eingefügt.

setModes.php

Öffne mit FileZilla die Datei "setModes.php" und füge die neuen Codezeilen (Zeilen 6-8), damit nur berechtigte Nutzer bestimmte Steckdosen schalten können.
<?php
  
function setModes($room, $device, $zustand, $db){
	
	//Diese Zeilen wurden hinzugef&uuml;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&uuml;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&uuml;ckgabe
    return "SET ".$device." IN ".$room." TO ".$zustand;
}
  
?>
Speichere die Datei anschließend und lade die Änderungen auf den Server hoch.

getModes.php

Als nächstes wird die Datei "getModes.php" bearbeitet, um auch den Zugriff auf die Abfrage von Schalterstellungen einzuschränken. Füge dazu die Zeilen 6-8 hinzu, speichere das Skript und lade die Änderungen hoch.
<?php

function getModes($room, $device, $db){
	
	//Diese Zeilen wurden hinzugef&uuml;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'];
		}
	}
}

?>

getRoomData.php

Auch der Datei "getRoomData.php" werden die Zeilen 6-8 hinzugefügt, damit nur berechtigte Nutzer die Raumdaten abfragen können. Danach wird das Skript, wie immer, gespeichert und die Änderungen hochgeladen.
<?php
 
function getRoomData($room, $db){
	
	//Diese Zeilen wurden hinzugef&uuml;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));
}
 
?>

getRooms.php

In der Datei "getRooms.php" funktioniert die Berechtigungsabfrage ein wenig anders, als bisher. Hier wird nämlich in einer Schleife für jeden Raum geprüft, ob der aktuelle Nutzer die nötigen Berechtigungen besitzt. Falls ja, wird der Raum in das Ausgabearray geschrieben, falls nicht jedoch nicht. Dazu werden die Zeilen 15-17 ins Skript eingefügt. Anschließend wird die Datei gespeichert und die Änderungen hochgeladen
<?php
 
function getRooms($db){
    //R&auml;ume laden
    $results = $db->prepare("SELECT * FROM 'ROOMS'");
 
    $results->execute();
 
    $rooms = array();
 
    //JSON-Objekt erstellen und f&uuml;llen
    foreach($results->fetchAll(PDO::FETCH_ASSOC) as $row){
		
		//Diese Zeilen wurden hinzugef&uuml;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));
}
 
?>

getGraphData.php

In der Datei "getGraphData.php" werden wie vorhin die Zeilen 6-8 hinzugefügt, um das Skript bei fehlenden Berechtigungen sofort mit der Nachricht "nopermission" abzubrechen. Danach wird das Skript gespeichert und auf den Server hochgeladen.
<?php

function getGraphData($room, $value, $von, $bis, $db){
	
	//Diese Zeilen wurden hinzugef&uuml;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&uuml;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));
}

?>

getSensorData.php

In der Datei "getSensorData.php" werden die Zeilen 23-25 und 52-54 hinzugefügt, um einmal nur die Sensordaten zu den Räumen auszugeben, zu denen der Nutzer die Berechtigung hat und ein weiteres mal, um beim Abfragen von bestimmten Werten nur dann einen Wert zu erhalten, wenn die nötige Berechtigung vorliegt. Nach dem Bearbeiten wird das Skript wieder gespeichert und hochgeladen.
<?php
 
function getSensorData($room, $val, $show_einheit, $db){
    $ipAddress = $_SERVER['SERVER_ADDR'];
     
    if($val == null){   //Alle Werte werden abgefragt
        //R&auml;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&auml;ume durchlaufen
        foreach($results->fetchAll(PDO::FETCH_ASSOC) as $row){
			//Diese Zeilen wurden hinzugef&uuml;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&uuml;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&uuml;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&uuml;ckgeben
        return json_encode(array('values' => $values));
    }
    else{   //Ein spezieller Wert wird abgefragt
     
        //Diese Zeilen wurden hinzugef&uuml;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&uuml;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&uuml;ckgeben, wenn gefunden
    if($result = $query->fetch(PDO::FETCH_ASSOC)){
        return $result['ID'];
    }
    else return null;   //ID nicht gefunden?
}
 
?>

createSene.php

In der Datei "createScene.php" wird der Code zweimal eingefügt, nämlich einmal in den Zeilen 6-8 und ein weiteres mal in den Zeilen 24-26. Damit wird sichergestellt, dass der aktuelle Nutzer nur Szenen in Räumen anlegen kann, zu denen er die Berechtigung hat (oder er weist die Szene keinem Raum zu) und dass er nur Aktionen in die Szene einbauen kann, zu deren Raum er die Berechtigung hat. Anschließend wird das Skript gespeichert und hochgeladen.
<?php

function createScene($devices, $rooms, $types, $values, $conditions, $room, $name, $db){
	
	//Diese Zeilen wurden hinzugef&uuml;gt
	if(!hasPermission($room, $db)){
		return "nopermission";
	}
	
	//Pr&uuml;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 &Uuml;bergabe-Arrays in ein einziges Array zusammensetzen
	for($counter = 0; $counter < sizeOf($devices); $counter++){
		
		//Diese Zeilen wurden hinzugef&uuml;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&uuml;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";
}

?>

getScenes.php

In der Datei "getScenes.php" sorgen die Zeilen 16-18 dafür, dass jeder Nutzer nur die Szenen aus den Räumen ausgegeben bekommt, zu denen er Zugriff hat oder die keinem Raum zugewiesen wurden. Anschließend wird das Skript wieder gespeichert und auf den Server hochgeladen.
<?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&uuml;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));
}

?>

runScene.php

In der Datei "runScene.php" werden die Zeilen 6-8 hinzugefügt, um sicherzustellen, dass jeder Nutzer nur die Szenen der Räume ausführen kann, zu denen er die nötige Berechtigung hat. Danach wird das Skript wieder gespeichert und auf den Server hochgeladen.
<?php

function runScene($room, $scene, $db){
	
	//Diese Zeilen wurden hinzugef&uuml;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&uuml;llt ist oder keine Bedingung angegeben, f&uuml;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&uuml;ft die &uuml;bergebene Bedingung auf Wahrheit und gibt dementsprechend true/false zur&uuml;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 &uuml;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;
	}
}

?>
Falls 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!