Proper Oauth for Google Home
This commit is contained in:
		@@ -12,6 +12,11 @@ class GoogleHome {
 | 
			
		||||
 | 
			
		||||
					//Google Compatibile Action Type
 | 
			
		||||
					$actionType = GoogleHomeDeviceTypes::getAction($subDeviceData['type']);
 | 
			
		||||
 | 
			
		||||
					if (strpos($deviceData['name'], 'Světlo') !== false || strpos($deviceData['name'], 'světlo') !== false) {
 | 
			
		||||
						$actionType = 'action.devices.types.LIGHT';
 | 
			
		||||
					}
 | 
			
		||||
 | 
			
		||||
					$tempDevice = [
 | 
			
		||||
						'id' => (string) $subDeviceData['subdevice_id'],
 | 
			
		||||
						'type' => $actionType,
 | 
			
		||||
@@ -78,181 +83,181 @@ class GoogleHome {
 | 
			
		||||
				$deviceId['id'] => [
 | 
			
		||||
					'online' => $online,
 | 
			
		||||
					'status'=> $status,
 | 
			
		||||
				]
 | 
			
		||||
			];
 | 
			
		||||
					]
 | 
			
		||||
				];
 | 
			
		||||
 | 
			
		||||
			if ($subDeviceData['type'] == "temp_cont"){
 | 
			
		||||
				$tempDevice[$deviceId['id']]['thermostatMode'] = 'off';
 | 
			
		||||
				if (RecordManager::getLastRecord($deviceId['id'])['value'] != 0) {
 | 
			
		||||
					$tempDevice[$deviceId['id']]['thermostatMode'] = 'heat';
 | 
			
		||||
				}
 | 
			
		||||
				if ($subDeviceData['type'] == "temp_cont"){
 | 
			
		||||
					$tempDevice[$deviceId['id']]['thermostatMode'] = 'off';
 | 
			
		||||
					if (RecordManager::getLastRecord($deviceId['id'])['value'] != 0) {
 | 
			
		||||
						$tempDevice[$deviceId['id']]['thermostatMode'] = 'heat';
 | 
			
		||||
					}
 | 
			
		||||
					$tempDevice[$deviceId['id']]['thermostatTemperatureAmbient'] = RecordManager::getLastRecord($deviceId['id'])['value'];
 | 
			
		||||
					$tempDevice[$deviceId['id']]['thermostatTemperatureSetpoint'] = RecordManager::getLastRecord($deviceId['id'])['value'];
 | 
			
		||||
			} else {
 | 
			
		||||
				$tempDevice[$deviceId['id']]['on'] = $state;
 | 
			
		||||
			}
 | 
			
		||||
			$devices = $tempDevice;
 | 
			
		||||
			if (count($devices)> 1){
 | 
			
		||||
				$devices[] = $tempDevice;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		$response = [
 | 
			
		||||
			'requestId' => $requestId,
 | 
			
		||||
			'payload' => [
 | 
			
		||||
				'devices' => $devices,
 | 
			
		||||
			],
 | 
			
		||||
		];
 | 
			
		||||
 | 
			
		||||
		$apiLogManager = new LogManager('../logs/api/HA/'. date("Y-m-d").'.log');
 | 
			
		||||
		$apiLogManager->write("[API][$requestId] request response\n" . json_encode($response, JSON_PRETTY_PRINT), LogRecordType::INFO);
 | 
			
		||||
		echo json_encode($response);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	static function execute($requestId, $payload){
 | 
			
		||||
		$commands = [];
 | 
			
		||||
 | 
			
		||||
		foreach ($payload['commands'] as $key => $command) {
 | 
			
		||||
			foreach ($command['devices'] as $key => $device) {
 | 
			
		||||
				$executionCommand = $command['execution'][0];
 | 
			
		||||
				if (isset($command['execution'][$key])) {
 | 
			
		||||
					$executionCommand = $command['execution'][$key];
 | 
			
		||||
				} else {
 | 
			
		||||
					$tempDevice[$deviceId['id']]['on'] = $state;
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
				$subDeviceId = $device['id'];
 | 
			
		||||
 | 
			
		||||
				switch ($executionCommand['command']) {
 | 
			
		||||
					case 'action.devices.commands.OnOff':
 | 
			
		||||
						$commands[] = self::executeSwitch($subDeviceId, $executionCommand);
 | 
			
		||||
						break;
 | 
			
		||||
 | 
			
		||||
					case 'action.devices.commands.ThermostatTemperatureSetpoint':
 | 
			
		||||
						$commands[] = self::executeTermostatValue($subDeviceId, $executionCommand);
 | 
			
		||||
						break;
 | 
			
		||||
 | 
			
		||||
					case 'action.devices.commands.ThermostatSetMode':
 | 
			
		||||
						$commands[] = self::executeTermostatMode($subDeviceId, $executionCommand);
 | 
			
		||||
						break;
 | 
			
		||||
				$devices = $tempDevice;
 | 
			
		||||
				if (count($devices)> 1){
 | 
			
		||||
					$devices[] = $tempDevice;
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			$response = [
 | 
			
		||||
				'requestId' => $requestId,
 | 
			
		||||
				'payload' => [
 | 
			
		||||
					'devices' => $devices,
 | 
			
		||||
				],
 | 
			
		||||
			];
 | 
			
		||||
 | 
			
		||||
			$apiLogManager = new LogManager('../logs/api/HA/'. date("Y-m-d").'.log');
 | 
			
		||||
			$apiLogManager->write("[API][$requestId] request response\n" . json_encode($response, JSON_PRETTY_PRINT), LogRecordType::INFO);
 | 
			
		||||
			echo json_encode($response);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		$response = [
 | 
			
		||||
			'requestId' => $requestId,
 | 
			
		||||
			'payload' => [
 | 
			
		||||
				'commands' => $commands,
 | 
			
		||||
			],
 | 
			
		||||
		];
 | 
			
		||||
		$apiLogManager = new LogManager('../logs/api/HA/'. date("Y-m-d").'.log');
 | 
			
		||||
		$apiLogManager->write("[API][EXECUTE][$requestId]\n" . json_encode($response, JSON_PRETTY_PRINT), LogRecordType::INFO);
 | 
			
		||||
		static function execute($requestId, $payload){
 | 
			
		||||
			$commands = [];
 | 
			
		||||
 | 
			
		||||
		echo json_encode($response);
 | 
			
		||||
	}
 | 
			
		||||
			foreach ($payload['commands'] as $key => $command) {
 | 
			
		||||
				foreach ($command['devices'] as $key => $device) {
 | 
			
		||||
					$executionCommand = $command['execution'][0];
 | 
			
		||||
					if (isset($command['execution'][$key])) {
 | 
			
		||||
						$executionCommand = $command['execution'][$key];
 | 
			
		||||
					}
 | 
			
		||||
 | 
			
		||||
	static function executeSwitch($subDeviceId, $executionCommand){
 | 
			
		||||
		$value = 0;
 | 
			
		||||
		$status = 'SUCCESS';
 | 
			
		||||
		if ($executionCommand['params']['on']) $value = 1;
 | 
			
		||||
					$subDeviceId = $device['id'];
 | 
			
		||||
 | 
			
		||||
		RecordManager::createWithSubId($subDeviceId, $value);
 | 
			
		||||
					switch ($executionCommand['command']) {
 | 
			
		||||
						case 'action.devices.commands.OnOff':
 | 
			
		||||
							$commands[] = self::executeSwitch($subDeviceId, $executionCommand);
 | 
			
		||||
						break;
 | 
			
		||||
 | 
			
		||||
		$executed = 0;
 | 
			
		||||
		$waiting = 0;
 | 
			
		||||
		foreach (RecordManager::getLastRecord($subDeviceId, 4) as $key => $value) {
 | 
			
		||||
			if ($value['execuded'] == 1){
 | 
			
		||||
				$executed++;
 | 
			
		||||
			} else {
 | 
			
		||||
				$waiting++;
 | 
			
		||||
						case 'action.devices.commands.ThermostatTemperatureSetpoint':
 | 
			
		||||
							$commands[] = self::executeTermostatValue($subDeviceId, $executionCommand);
 | 
			
		||||
						break;
 | 
			
		||||
 | 
			
		||||
						case 'action.devices.commands.ThermostatSetMode':
 | 
			
		||||
							$commands[] = self::executeTermostatMode($subDeviceId, $executionCommand);
 | 
			
		||||
						break;
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		if ($waiting < $executed){
 | 
			
		||||
			$status = "PENDING";
 | 
			
		||||
		} else {
 | 
			
		||||
			$status = "OFFLINE";
 | 
			
		||||
 | 
			
		||||
			$response = [
 | 
			
		||||
				'requestId' => $requestId,
 | 
			
		||||
				'payload' => [
 | 
			
		||||
					'commands' => $commands,
 | 
			
		||||
				],
 | 
			
		||||
			];
 | 
			
		||||
			$apiLogManager = new LogManager('../logs/api/HA/'. date("Y-m-d").'.log');
 | 
			
		||||
			$apiLogManager->write("[API][EXECUTE][$requestId]\n" . json_encode($response, JSON_PRETTY_PRINT), LogRecordType::INFO);
 | 
			
		||||
 | 
			
		||||
			echo json_encode($response);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		$commandTemp = [
 | 
			
		||||
			'ids' => [$subDeviceId],
 | 
			
		||||
			'status' => $status,
 | 
			
		||||
			'states' => [
 | 
			
		||||
				'on' => $executionCommand['params']['on'],
 | 
			
		||||
			],
 | 
			
		||||
		];
 | 
			
		||||
		return $commandTemp;
 | 
			
		||||
	}
 | 
			
		||||
		static function executeSwitch($subDeviceId, $executionCommand){
 | 
			
		||||
			$value = 0;
 | 
			
		||||
			$status = 'SUCCESS';
 | 
			
		||||
			if ($executionCommand['params']['on']) $value = 1;
 | 
			
		||||
 | 
			
		||||
	static function executeTermostatValue($subDeviceId, $executionCommand){
 | 
			
		||||
		$value = 0;
 | 
			
		||||
		$status = 'SUCCESS';
 | 
			
		||||
			RecordManager::createWithSubId($subDeviceId, $value);
 | 
			
		||||
 | 
			
		||||
		if (isset($executionCommand['params']['thermostatTemperatureSetpoint'])) {
 | 
			
		||||
			$value = $executionCommand['params']['thermostatTemperatureSetpoint'];
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		RecordManager::createWithSubId($subDeviceId, $value);
 | 
			
		||||
 | 
			
		||||
		$executed = 0;
 | 
			
		||||
		$waiting = 0;
 | 
			
		||||
		foreach (RecordManager::getLastRecord($subDeviceId, 4) as $key => $lastValue) {
 | 
			
		||||
			if ($lastValue['execuded'] == 1){
 | 
			
		||||
				$executed++;
 | 
			
		||||
			} else {
 | 
			
		||||
				$waiting++;
 | 
			
		||||
			$executed = 0;
 | 
			
		||||
			$waiting = 0;
 | 
			
		||||
			foreach (RecordManager::getLastRecord($subDeviceId, 4) as $key => $value) {
 | 
			
		||||
				if ($value['execuded'] == 1){
 | 
			
		||||
					$executed++;
 | 
			
		||||
				} else {
 | 
			
		||||
					$waiting++;
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
			if ($waiting < $executed){
 | 
			
		||||
				$status = "PENDING";
 | 
			
		||||
			} else {
 | 
			
		||||
				$status = "OFFLINE";
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			$commandTemp = [
 | 
			
		||||
				'ids' => [$subDeviceId],
 | 
			
		||||
				'status' => $status,
 | 
			
		||||
				'states' => [
 | 
			
		||||
					'on' => $executionCommand['params']['on'],
 | 
			
		||||
				],
 | 
			
		||||
			];
 | 
			
		||||
			return $commandTemp;
 | 
			
		||||
		}
 | 
			
		||||
		if ($waiting < $executed){
 | 
			
		||||
			$status = "PENDING";
 | 
			
		||||
 | 
			
		||||
		static function executeTermostatValue($subDeviceId, $executionCommand){
 | 
			
		||||
			$value = 0;
 | 
			
		||||
			$status = 'SUCCESS';
 | 
			
		||||
 | 
			
		||||
			if (isset($executionCommand['params']['thermostatTemperatureSetpoint'])) {
 | 
			
		||||
				$value = $executionCommand['params']['thermostatTemperatureSetpoint'];
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			RecordManager::createWithSubId($subDeviceId, $value);
 | 
			
		||||
 | 
			
		||||
			$executed = 0;
 | 
			
		||||
			$waiting = 0;
 | 
			
		||||
			foreach (RecordManager::getLastRecord($subDeviceId, 4) as $key => $lastValue) {
 | 
			
		||||
				if ($lastValue['execuded'] == 1){
 | 
			
		||||
					$executed++;
 | 
			
		||||
				} else {
 | 
			
		||||
					$waiting++;
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
			if ($waiting < $executed){
 | 
			
		||||
				$status = "PENDING";
 | 
			
		||||
				$status = "SUCCESS";
 | 
			
		||||
			} else {
 | 
			
		||||
				$status = "OFFLINE";
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			$commandTemp = [
 | 
			
		||||
				'ids' => [$subDeviceId],
 | 
			
		||||
				'status' => $status,
 | 
			
		||||
				'states' => [
 | 
			
		||||
					'thermostatMode' => 'heat',
 | 
			
		||||
					'thermostatTemperatureSetpoint' => $value,
 | 
			
		||||
					'thermostatTemperatureAmbient' => $value,
 | 
			
		||||
					//ambient z dalšího zenzoru v roomu
 | 
			
		||||
				],
 | 
			
		||||
			];
 | 
			
		||||
			return $commandTemp;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		static function executeTermostatMode($subDeviceId, $executionCommand){
 | 
			
		||||
			$mode = "off";
 | 
			
		||||
			$value = 0;
 | 
			
		||||
			$status = "SUCCESS";
 | 
			
		||||
		} else {
 | 
			
		||||
			$status = "OFFLINE";
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		$commandTemp = [
 | 
			
		||||
			'ids' => [$subDeviceId],
 | 
			
		||||
			'status' => $status,
 | 
			
		||||
			'states' => [
 | 
			
		||||
				'thermostatMode' => 'heat',
 | 
			
		||||
				'thermostatTemperatureSetpoint' => $value,
 | 
			
		||||
				'thermostatTemperatureAmbient' => $value,
 | 
			
		||||
				//ambient z dalšího zenzoru v roomu
 | 
			
		||||
			],
 | 
			
		||||
		];
 | 
			
		||||
		return $commandTemp;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	static function executeTermostatMode($subDeviceId, $executionCommand){
 | 
			
		||||
		$mode = "off";
 | 
			
		||||
		$value = 0;
 | 
			
		||||
		$status = "SUCCESS";
 | 
			
		||||
 | 
			
		||||
		if (isset($executionCommand['params']['thermostatMode']) && $executionCommand['params']['thermostatMode'] != 'off') {
 | 
			
		||||
			$mode = $executionCommand['params']['thermostatMode'];
 | 
			
		||||
			$value = RecordManager::getLastRecordNotNull($subDeviceId)['value'];
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		RecordManager::createWithSubId($subDeviceId, $value);
 | 
			
		||||
 | 
			
		||||
		$executed = 0;
 | 
			
		||||
		$waiting = 0;
 | 
			
		||||
		foreach (RecordManager::getLastRecord($subDeviceId, 4) as $key => $value) {
 | 
			
		||||
			if ($value['execuded'] == 1){
 | 
			
		||||
				$executed++;
 | 
			
		||||
			} else {
 | 
			
		||||
				$waiting++;
 | 
			
		||||
			if (isset($executionCommand['params']['thermostatMode']) && $executionCommand['params']['thermostatMode'] != 'off') {
 | 
			
		||||
				$mode = $executionCommand['params']['thermostatMode'];
 | 
			
		||||
				$value = RecordManager::getLastRecordNotNull($subDeviceId)['value'];
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		if ($waiting < $executed){
 | 
			
		||||
			$status = "PENDING";
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		$commandTemp = [
 | 
			
		||||
			'ids' => [$subDeviceId],
 | 
			
		||||
			'status' => $status,
 | 
			
		||||
			'states' => [
 | 
			
		||||
				'thermostatMode' => $mode
 | 
			
		||||
			],
 | 
			
		||||
		];
 | 
			
		||||
			RecordManager::createWithSubId($subDeviceId, $value);
 | 
			
		||||
 | 
			
		||||
		return $commandTemp;
 | 
			
		||||
			$executed = 0;
 | 
			
		||||
			$waiting = 0;
 | 
			
		||||
			foreach (RecordManager::getLastRecord($subDeviceId, 4) as $key => $value) {
 | 
			
		||||
				if ($value['execuded'] == 1){
 | 
			
		||||
					$executed++;
 | 
			
		||||
				} else {
 | 
			
		||||
					$waiting++;
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
			if ($waiting < $executed){
 | 
			
		||||
				$status = "PENDING";
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			$commandTemp = [
 | 
			
		||||
				'ids' => [$subDeviceId],
 | 
			
		||||
				'status' => $status,
 | 
			
		||||
				'states' => [
 | 
			
		||||
					'thermostatMode' => $mode
 | 
			
		||||
				],
 | 
			
		||||
			];
 | 
			
		||||
 | 
			
		||||
			return $commandTemp;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,7 +1,11 @@
 | 
			
		||||
<?php
 | 
			
		||||
 | 
			
		||||
class AuthManager {
 | 
			
		||||
	public function getToken($username, $password){
 | 
			
		||||
	public function getToken($username, $password, $userAgent = null){
 | 
			
		||||
		if ($userAgent == null) {
 | 
			
		||||
			$userAgent = $this->headers['HTTP_USER_AGENT'];
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		$userManager = new UserManager();
 | 
			
		||||
		if ($username != '' || $password != ''){
 | 
			
		||||
			$userLogedIn = $userManager->loginNew($username, $password);
 | 
			
		||||
@@ -10,7 +14,11 @@ class AuthManager {
 | 
			
		||||
				// Create token header as a JSON string
 | 
			
		||||
				$header = json_encode(['typ' => 'JWT', 'alg' => 'HS256']);
 | 
			
		||||
				// Create token payload as a JSON string
 | 
			
		||||
				$payload = json_encode(['user_id' => $userLogedIn]);
 | 
			
		||||
				$payload = json_encode([
 | 
			
		||||
					'user_id' => $userLogedIn,
 | 
			
		||||
					'exp' => date('Y-m-d H:i:s',strtotime("+90 Days")),
 | 
			
		||||
					'iat' => date('Y-m-d H:i:s',time()),
 | 
			
		||||
			  ]);
 | 
			
		||||
				// Encode Header to Base64Url String
 | 
			
		||||
				$base64UrlHeader = str_replace(['+', '/', '='], ['-', '_', ''], base64_encode($header));
 | 
			
		||||
				// Encode Payload to Base64Url String
 | 
			
		||||
@@ -22,7 +30,17 @@ class AuthManager {
 | 
			
		||||
				// Create JWT
 | 
			
		||||
				$jwt = $base64UrlHeader . "." . $base64UrlPayload . "." . $base64UrlSignature;
 | 
			
		||||
 | 
			
		||||
				return $jwt;
 | 
			
		||||
 | 
			
		||||
				$token = [
 | 
			
		||||
					'user_id' => $userLogedIn,
 | 
			
		||||
					'user_agent' => $userAgent,
 | 
			
		||||
					'token' => $jwt,
 | 
			
		||||
					'expire' => date('Y-m-d H:i:s',strtotime("+90 Days")),
 | 
			
		||||
					'issued' => date('Y-m-d H:i:s',time()),
 | 
			
		||||
				];
 | 
			
		||||
				if (Db::add ('tokens', $token)){
 | 
			
		||||
					return $jwt;
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		return false;
 | 
			
		||||
 
 | 
			
		||||
@@ -206,5 +206,15 @@ class UserManager
 | 
			
		||||
			return false;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public static function setOta($otaCode, $otaSecret){
 | 
			
		||||
		$ga = new PHPGangsta_GoogleAuthenticator();
 | 
			
		||||
		$checkResult = $ga->verifyCode($otaSecret, $otaCode, 2);    // 2 = 2*30sec clock tolerance
 | 
			
		||||
		if ($checkResult) {
 | 
			
		||||
			self::setUserData('ota', $otaSecret);
 | 
			
		||||
			return true;
 | 
			
		||||
		}
 | 
			
		||||
		return false;
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
?>
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user