user = $user; $this->localWSSUrl = $localWSSUrl; if (is_null($this->localWSSUrl)) { $this->localWSSUrl = Yii::$app->params['localWSURL']; } } /** * @return string */ protected function getWSSUrl() { 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 */ public function turnOn($itemID) { return $this->send([ 'type' => 'turnON', 'item_id' => $itemID, ]); } /** * @param int $itemID * @return bool */ public function turnOff($itemID) { return $this->send([ 'type' => 'turnOFF', 'item_id' => $itemID, ]); } /** * @param int $itemID * @param int $red * @param int $green * @param int $blue * @param boolean $fade * @return bool * @internal param array $rgbData */ public function rgb($itemID, $red, $green, $blue, $fade) { return $this->send([ 'type' => 'rgb', 'item_id' => $itemID, 'red' => $red, 'green' => $green, 'blue' => $blue, 'fade' => $fade, ]); } /** * @param int $itemID * @param string $mode * @param bool $start * @return bool * @internal param array $rgbData */ public function rgbMode($itemID, $mode, $start) { return $this->send([ 'type' => 'rgbMode', 'item_id' => $itemID, 'mode' => $mode, 'start' => $start, ]); } /** * @param int $triggerID * @return bool */ public function trig($triggerID) { return $this->send([ 'type' => 'trig', 'trigger_id' => $triggerID, ]); } /** * @param array $data * @return bool */ public function send($data) { $loop = Factory::create(); $connector = new Connector($loop); $success = false; $connector($this->getWSSUrl(), [], ['Origin' => 'origin']) ->then(function (WebSocket $conn) use ($data, &$success) { // Send data $conn->send(Json::encode($data)); $success = true; $conn->close(); }, function (\Exception $e) use ($loop) { echo "Could not connect: {$e->getMessage()}\n"; $loop->stop(); }); $loop->run(); 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; } }