diff --git a/modules/api/components/WebSocketAPI.php b/modules/api/components/WebSocketAPIBridge.php similarity index 64% rename from modules/api/components/WebSocketAPI.php rename to modules/api/components/WebSocketAPIBridge.php index 08d9313..d8a8522 100644 --- a/modules/api/components/WebSocketAPI.php +++ b/modules/api/components/WebSocketAPIBridge.php @@ -9,7 +9,7 @@ use React\EventLoop\Factory; use Yii; use yii\helpers\Json; -class WebSocketAPI +class WebSocketAPIBridge { /** * @var User @@ -44,6 +44,31 @@ class WebSocketAPI return $this->localWSSUrl . '/?type=user&id=' . $this->user->id . '&auth_token=' . $this->user->getAuthToken(); } + /** + * @param integer $itemID + * @return array + */ + public function getValue($itemID) + { + $response = $this->sendAndReceive([]); + + if ($response['type'] == 'init' and count($response['items']) > 0) { + foreach ($response['items'] as $item) { + if ($item['id'] == $itemID and !is_null($item['value'])) { + return [ + 'success' => true, + 'value' => $item['value'], + 'item' => $item, + ]; + } + } + } + + return [ + 'success' => false, + ]; + } + /** * @param int $itemID * @return bool @@ -134,11 +159,10 @@ class WebSocketAPI // Send data $conn->send(Json::encode($data)); - // Job done. Close the connection - $conn->close(); - $success = true; - }, function(\Exception $e) use ($loop) { + + $conn->close(); + }, function (\Exception $e) use ($loop) { echo "Could not connect: {$e->getMessage()}\n"; $loop->stop(); @@ -148,4 +172,39 @@ class WebSocketAPI return $success; } + + /** + * Send message and get response + * + * @param array $data Message to send + * @return array|bool + */ + public function sendAndReceive($data) + { + $loop = Factory::create(); + $connector = new Connector($loop); + + $result = false; + + $connector($this->getWSSUrl(), [], ['Origin' => 'origin']) + ->then(function (WebSocket $conn) use ($data, &$result) { + // Send data if not empty + if (count($data) > 0) { + $conn->send(Json::encode($data)); + } + + $conn->on('message', function ($msg) use ($conn, &$result) { + $result = Json::decode($msg); + $conn->close(); + }); + }, function (\Exception $e) use ($loop) { + echo "Could not connect: {$e->getMessage()}\n"; + + $loop->stop(); + }); + + $loop->run(); + + return $result; + } } diff --git a/modules/api/controllers/ItemController.php b/modules/api/controllers/ItemController.php index 92d257e..9ec0f52 100644 --- a/modules/api/controllers/ItemController.php +++ b/modules/api/controllers/ItemController.php @@ -5,7 +5,7 @@ namespace app\modules\api\controllers; use app\models\Board; use app\models\Item; use app\models\Trigger; -use app\modules\api\components\WebSocketAPI; +use app\modules\api\components\WebSocketAPIBridge; use Yii; use yii\base\InvalidParamException; use yii\base\NotSupportedException; @@ -38,6 +38,31 @@ class ItemController extends Controller throw new NotSupportedException(); } + /** + * @param $item_id + * @return array + * @throws NotSupportedException + */ + public function actionValue($item_id) + { + $item = $this->findItem($item_id); + + $board = $item->board; + + switch ($board->type) { + case Board::TYPE_AREST: + throw new NotSupportedException(); + case Board::TYPE_WEBSOCKET: + $api = new WebSocketAPIBridge(Yii::$app->user->identity); + + return $api->getValue($item_id); + } + + return [ + 'success' => false, + ]; + } + /** * @param int $item_id * @return array @@ -59,7 +84,7 @@ class ItemController extends Controller throw new NotSupportedException(); break; case Board::TYPE_WEBSOCKET: - $api = new WebSocketAPI(Yii::$app->user->identity); + $api = new WebSocketAPIBridge(Yii::$app->user->identity); if (!$api->turnOn($item_id)) { return [ @@ -96,7 +121,7 @@ class ItemController extends Controller throw new NotSupportedException(); break; case Board::TYPE_WEBSOCKET: - $api = new WebSocketAPI(Yii::$app->user->identity); + $api = new WebSocketAPIBridge(Yii::$app->user->identity); if (!$api->turnOff($item_id)) { return [ @@ -138,7 +163,7 @@ class ItemController extends Controller throw new NotSupportedException(); case Board::TYPE_WEBSOCKET: - $api = new WebSocketAPI(Yii::$app->user->identity); + $api = new WebSocketAPIBridge(Yii::$app->user->identity); return [ 'success' => $api->rgb($item_id, $red, $green, $blue, $fade), @@ -176,7 +201,7 @@ class ItemController extends Controller throw new NotSupportedException(); case Board::TYPE_WEBSOCKET: - $api = new WebSocketAPI(Yii::$app->user->identity); + $api = new WebSocketAPIBridge(Yii::$app->user->identity); return [ 'success' => $api->rgbMode($item_id, $mode, $start), diff --git a/modules/api/controllers/PanelController.php b/modules/api/controllers/PanelController.php index da59fb7..dc3d94e 100644 --- a/modules/api/controllers/PanelController.php +++ b/modules/api/controllers/PanelController.php @@ -2,7 +2,7 @@ namespace app\modules\api\controllers; -use app\modules\api\components\WebSocketAPI; +use app\modules\api\components\WebSocketAPIBridge; use Yii; use yii\base\NotSupportedException; use yii\rest\Controller; @@ -32,7 +32,7 @@ class PanelController extends Controller */ public function actionScheduleTriggers() { - $api = new WebSocketAPI(Yii::$app->user->identity); + $api = new WebSocketAPIBridge(Yii::$app->user->identity); $result = $api->send([ 'type' => 'schedule-triggers', @@ -48,7 +48,7 @@ class PanelController extends Controller */ public function actionUpdateItems() { - $api = new WebSocketAPI(Yii::$app->user->identity); + $api = new WebSocketAPIBridge(Yii::$app->user->identity); $result = $api->send([ 'type' => 'update-items', diff --git a/modules/api/controllers/TriggerController.php b/modules/api/controllers/TriggerController.php index 65efe44..ff56712 100644 --- a/modules/api/controllers/TriggerController.php +++ b/modules/api/controllers/TriggerController.php @@ -3,7 +3,7 @@ namespace app\modules\api\controllers; use app\models\Trigger; -use app\modules\api\components\WebSocketAPI; +use app\modules\api\components\WebSocketAPIBridge; use Yii; use yii\base\InvalidParamException; use yii\base\NotSupportedException; @@ -43,7 +43,7 @@ class TriggerController extends Controller throw new InvalidParamException('This Trigger cannot be triggered by API call'); } - $api = new WebSocketAPI(Yii::$app->user->identity); + $api = new WebSocketAPIBridge(Yii::$app->user->identity); return [ 'success' => $api->trig($trigger_id), diff --git a/views/site/error.php b/views/site/error.php index c9ff181..4b0a003 100644 --- a/views/site/error.php +++ b/views/site/error.php @@ -1,12 +1,12 @@ title = $name; ?>
@@ -15,18 +15,11 @@ $this->title = $name;

-

+

- -

- The above error occurred while the Web server was processing your request. - Please contact us if you think this is a server error. Thank you. - Meanwhile, you may return to dashboard or try using the search - form. -