From 23aa83ec9ade0faf7487b0df2fd229ae97cdd6f5 Mon Sep 17 00:00:00 2001 From: JonatanRek Date: Sat, 2 May 2020 13:18:15 +0200 Subject: [PATCH] Google Home Bether Working --- app/Bootstrap.php | 14 +++- app/Routes.php | 2 +- app/api/GoogleHomeApi.php | 150 +++++++++++++++++++++++------------ app/models/LogManager.php | 3 - app/models/RecordManager.php | 14 ++++ 5 files changed, 128 insertions(+), 55 deletions(-) diff --git a/app/Bootstrap.php b/app/Bootstrap.php index 8a11014..3c41b3d 100644 --- a/app/Bootstrap.php +++ b/app/Bootstrap.php @@ -42,10 +42,22 @@ class ErrorHandler { 'message' => $exception->getMessage(), ]; echo json_encode($message); + + $apiLogManager = new LogManager('../logs/'. date("Y-m-d").'.log'); + $apiLogManager->write("[APACHE] ERROR\n" . json_encode($message, JSON_PRETTY_PRINT), LogRecordType::INFO); } } set_exception_handler("ErrorHandler::exception"); +$json = file_get_contents('php://input'); +$obj = json_decode($json, true); + +$apiLogManager = new LogManager('../logs/api/HA/'. date("Y-m-d").'.log'); + +$apiLogManager->write("[API] request body\n" . json_encode($obj, JSON_PRETTY_PRINT), LogRecordType::INFO); +$apiLogManager->write("[API] POST body\n" . json_encode($_POST, JSON_PRETTY_PRINT), LogRecordType::INFO); +$apiLogManager->write("[API] GET body\n" . json_encode($_GET, JSON_PRETTY_PRINT), LogRecordType::INFO); + //Debug error_reporting(E_ALL); ini_set( 'display_errors','1'); @@ -78,4 +90,4 @@ Db::connect (DBHOST, DBUSER, DBPASS, DBNAME); $userManager = new UserManager(); // import routes -require_once '../app/Routes.php'; \ No newline at end of file +require_once '../app/Routes.php'; diff --git a/app/Routes.php b/app/Routes.php index 9158e65..cf2a959 100644 --- a/app/Routes.php +++ b/app/Routes.php @@ -22,7 +22,7 @@ $router->post('/api/devices', 'DevicesApi@getAllDevices'); $router->post('/api/login', 'AuthApi@login'); $router->get('/api/HA/auth', 'GoogleHomeApi@autorize'); -$router->post('/api/HA', 'GoogleHomeApi@response'); +$router->any('/api/HA', 'GoogleHomeApi@response'); // examples $router->any('/api/example', 'ExampleApi@example'); diff --git a/app/api/GoogleHomeApi.php b/app/api/GoogleHomeApi.php index e4a24f2..9b2782f 100644 --- a/app/api/GoogleHomeApi.php +++ b/app/api/GoogleHomeApi.php @@ -1,32 +1,64 @@ write("[API] request body\n" . json_encode($obj, JSON_PRETTY_PRINT), LogRecordType::INFO); - $apiLogManager->write("[API] POST body\n" . json_encode($_POST, JSON_PRETTY_PRINT), LogRecordType::INFO); - $apiLogManager->write("[API] GET body\n" . json_encode($_GET, JSON_PRETTY_PRINT), LogRecordType::INFO); - header('Content-Type: application/json'); + switch ($obj['inputs'][0]['intent']) { case 'action.devices.SYNC': - self::sync($obj['requestId']); + self::sync($obj['requestId']); break; case 'action.devices.QUERY': - + self::query($obj['requestId'], $obj['inputs'][0]['payload']); break; case 'action.devices.EXECUTE': - self::execute($obj['requestId'], $obj['inputs'][0]['payload']); + self::execute($obj['requestId'], $obj['inputs'][0]['payload']); break; } } + static function query($requestId, $payload){ + + foreach ($payload['devices'] as $deviceId) { + $subDeviceData = SubDeviceManager::getSubDevice($deviceId['id']); + if ($subDeviceData['type'] != "on/off") continue; + + $state = false; + if (RecordManager::getLastRecord($deviceId['id'])['value'] == 1){ + $state = true; + } + + $online = false; + if (RecordManager::getLastRecord($deviceId['id'])['execuded'] == 1){ + $online = true; + } + + $devices[] = [ + $deviceId['id'] => [ + 'on' => $state, + 'online' => $online, + 'status'=> 'SUCCESS', + ] + ]; + } + + + $response = [ + 'requestId' => $requestId, + 'payload' => [ + 'devices' => $devices, + ], + ]; + + $apiLogManager = new LogManager('../logs/api/HA/'. date("Y-m-d").'.log'); + $apiLogManager->write("[API] request response\n" . json_encode($response, JSON_PRETTY_PRINT), LogRecordType::INFO); + echo json_encode($response); + } static function sync($requestId){ $devices = []; @@ -53,49 +85,67 @@ class GoogleHomeApi { $response = [ 'requestId' => $requestId, 'payload' => [ - 'agentUserId'=>'simple-Home', - 'devices' => $devices,], + 'agentUserId'=>'651351531531', + 'devices' => $devices, + ], ]; - $apiLogManager = new LogManager('../logs/api/HA/'. date("Y-m-d").'.log'); - $apiLogManager->write("[API] request response\n" . json_encode($response, JSON_PRETTY_PRINT), LogRecordType::INFO); echo json_encode($response); } - static function execute($subdeviceId, $payload){ - $commands = [ - 'ids' => - ]; + static function execute($requestId, $payload){ + $commands = []; + foreach ($payload['commands'] as $key => $command) { foreach ($command['devices'] as $key => $device) { - $executionCommand = $command['execution'][$key]; - $subDeviceId = $device['id']; - - switch ($executionCommand) { - case 'action.devices.commands.OnOff': - if ($executionCommand['on'] == true){ - //turn ddeivce on - - } - break; - default: - # code... - break; + $executionCommand = $command['execution'][0]; + if (isset($command['execution'][$key])) { + $executionCommand = $command['execution'][$key]; } + $subDeviceId = $device['id']; + + switch ($executionCommand['command']) { + case 'action.devices.commands.OnOff': + $value = 0; + if ($executionCommand['params']['on']) $value = 1; + + RecordManager::createWithSubId($subDeviceId, $value); + + $timeout = 0; + while(RecordManager::getLastRecord($subDeviceId)['execuded'] == 0 && $timeout < 5 ){ + sleep(1); + $timeout++; + } + + $commandTemp = [ + 'ids' => [$subDeviceId], + 'status' => 'SUCCESS', + 'states' => [ + 'on' => $executionCommand['params']['on'], + ], + ]; + + if ($timeout >= 5){ + $commandTemp['status'] = "ERROR"; + } + $commands[] = $commandTemp; + + break; + } } } $response = [ 'requestId' => $requestId, 'payload' => [ - 'commands' => $commands,], + 'commands' => $commands, + ], ]; - $apiLogManager = new LogManager('../logs/api/HA/'. date("Y-m-d").'.log'); - $apiLogManager->write("[API] request response\n" . json_encode($response, JSON_PRETTY_PRINT), LogRecordType::INFO); + echo json_encode($response); } @@ -111,21 +161,21 @@ class GoogleHomeApi { //tel: zemanová 607979429 /*echo json_encode(array ( - 'access_token' => '', - 'token_type' => 'bearer', - 'expires_in' => 3600, - 'refresh_token' => '', - 'scope' => 'create', - ));*/ + 'access_token' => '', + 'token_type' => 'bearer', + 'expires_in' => 3600, + 'refresh_token' => '', + 'scope' => 'create', + ));*/ - $get = [ - "access_token"=>"23165133", - "token_type"=>"Bearer", - "expires_in"=>600, - "state"=>$_GET["state"], - ]; + $get = [ + "access_token"=>"23165133", + "token_type"=>"Bearer", + "expires_in"=>600, + "state"=>$_GET["state"], + ]; - echo $_GET["redirect_uri"] . '#' . http_build_query($get) ; - echo 'FINISH'; - } + echo $_GET["redirect_uri"] . '#' . http_build_query($get) ; + echo 'FINISH'; +} } diff --git a/app/models/LogManager.php b/app/models/LogManager.php index 6329072..dde1c14 100644 --- a/app/models/LogManager.php +++ b/app/models/LogManager.php @@ -46,9 +46,6 @@ class LogManager function write($value, $type = LogRecordType::ERROR){ $record = "[".date("H:m:s")."][".$type."]" . $value . "\n"; - if (strlen($record) > 65 ) { - $record = Utilities::stringInsert($record,"\n",65); - } fwrite($this->logFile, $record); } diff --git a/app/models/RecordManager.php b/app/models/RecordManager.php index 0a82d43..b2046a7 100644 --- a/app/models/RecordManager.php +++ b/app/models/RecordManager.php @@ -2,6 +2,19 @@ class RecordManager{ public static $records; + public static function createWithSubId ($subDeviceId, $value) { + $record = array ( + 'subdevice_id' => $subDeviceId, + 'value' => $value, + ); + try { + return Db::add ('records', $record); + } catch(PDOException $error) { + echo $error->getMessage(); + die(); + } + } + public static function create ($deviceId, $type, $value) { $subDeviceId = Db::loadOne('SELECT * FROM subdevices WHERE device_id = ? AND type = ?;', array($deviceId, $type))['subdevice_id']; if ($subDeviceId == '') { @@ -19,6 +32,7 @@ class RecordManager{ } } + public static function setExecuted($recordId) { try { Db::edit ('records', ['execuded' => 1], 'WHERE record_id = ?', array($recordId));