serial = $serial; $this->secret = $secret; $this->model = $model; $this->robotid = $robotid; switch ($model) { case "VR200": $this->baseNucleoUrl = "https://nucleo.ksecosys.com:4443/vendors/vorwerk/robots/"; $this->baseUrl = "https://vorwerk-beehive-production.herokuapp.com"; $this->version = "application/vnd.neato.beehive.v1+json"; break; case "D10": $this->baseNucleoUrl = "https://nucleo.neatocloud.com:4443/vendors/neato/"; $this->baseUrl = "https://orbital.neatocloud.com"; $this->version = "application/vnd.neato.orbital-http.v1+json"; $this->apimodel = "ability"; break; } $this->url = $this->baseNucleoUrl . $serial . "/messages"; } public function getState() { if ($this->apimodel == "ability") { return $this->getRobotInfo("last_state"); } else { return $this->doAction("getRobotState"); } } public function startCleaning($eco = false,$_modelCleaning,$_maps=null,$_boundaryId=null) { if ($this->apimodel == "ability") { $floor = $this->getRanks()[0]; $rank_id = $floor["rank_uuid"]; //$floor_id = $floor["floorplan_uuid"]; //$this->getTrackNames($floor_id); //$track_id = $this->getTrackId($floor_id,"Cuisine"); //$rank_id = $_maps; $track_id = $_boundaryId; if ($eco) { $mode = "auto"; } else { $mode = "turbo"; } return $this->doAbility("cleaning.start", array( "force_floorplan" => false, "runs" => [ array( "map" => array( "rank_id" => $rank_id, "track_id" => $track_id, "nogo_enabled" => true, ), "settings" => array( "mode" => $mode, "navigation_mode" => "normal", ), ), ], )); } else { switch ($_modelCleaning) { case 'basic-1'; $params = array("category" => 2, "mode" => ($eco ? 1 : 2), "modifier" => 2); break; case 'minimal-2'; case 'minimal-3'; $params = array("category" => 2, 'navigationMode' => 1); break; case 'basic-3'; if($_maps == 'advanced-1' || $_maps == 'macro-1'){ $params = array("category" => 4, "mode" => ($eco ? 1 : 2), 'navigationMode' => 1); }else { $params = array("category" => 2, "mode" => ($eco ? 1 : 2), 'navigationMode' => 1); } break; case 'basic-4'; if($_maps == 'basic-2'){ if($_boundaryId != ''){ $params = array("category" => 4, "mode" => ($eco ? 1 : 2), 'navigationMode' => 1, 'boundaryId' => $_boundaryId ); }else{ $params = array("category" => 4, "mode" => ($eco ? 1 : 2), 'navigationMode' => 1); } }else { $params = array("category" => 2, "mode" => ($eco ? 1 : 2), 'navigationMode' => 1); } break; default: $params = array("category" => 2, "mode" => ($eco ? 1 : 2), "modifier" => 2,'navigationMode' => 1); break; } return $this->doAction("startCleaning", $params); } } public function pauseCleaning() { if ($this->apimodel == "ability") { return $this->doAbility("cleaning.pause"); } else { return $this->doAction("pauseCleaning"); } } public function resumeCleaning() { if ($this->apimodel == "ability") { return $this->doAbility("cleaning.resume"); } else { return $this->doAction("resumeCleaning"); } } public function stopCleaning() { if ($this->apimodel == "ability") { return $this->doAbility("cleaning.cancel"); } else { return $this->doAction("stopCleaning"); } } public function sendToBase() { if ($this->apimodel == "ability") { return $this->doAbility("navigation.return_to_base"); } else { return $this->doAction("sendToBase"); } } public function enableSchedule() { return $this->doAction("enableSchedule"); } public function disableSchedule() { return $this->doAction("disableSchedule"); } public function getSchedule() { return $this->doAction("getSchedule"); } public function getMapBoundaries($_maps) { if ($this->apimodel == "ability") { $boundaries = []; foreach ($this->getTracks($_maps) as $track) { array_push($boundaries,array('id'=>$track['track_uuid'],'name'=>$track['name'])); } return array('data'=>array('boundaries'=>$boundaries)); } else { return $this->doAction("getMapBoundaries",array('mapId' => $_maps)); } } // last_state, features, reminders, cleaningmaps, floorplans protected function getRobotInfo($info, $params = false) { log::add('neato','debug','Get robot info : '.$info); $result = array("message" => "no serial or secret"); if ($this->serial !== false) { $result = NeatoBotvacApi::request($this->baseUrl."/robots/".$this->robotid."/".$info, $this->version, null, "GET", array("Authorization: Token ".$this->secret)); log::add('neato','debug','Neato info : '.$payload.' => '.json_encode($result)); } return $result; } public function getRanks() { $ranks = $this->getRobotInfo("floorplans"); return $ranks; } public function getTracks($floor_id) { log::add('neato','debug','Get tracks : '.$floor_id); $result = array("message" => "no serial or secret"); if ($this->serial !== false) { $result = NeatoBotvacApi::request($this->baseUrl."/maps/floorplans/".$floor_id."/tracks", $this->version, null, "GET", array("Authorization: Token ".$this->secret)); log::add('neato','debug','Neato info : '.$payload.' => '.json_encode($result)); } return $result; } public function getTrackNames($floor_id) { foreach ($this->getTracks($floor_id) as $track) { log::add('neato','debug','Neato track : '.$track["name"]." UUID=".$track["track_uuid"]); } } public function getTrackId($floor_id, $track_name) { foreach ($this->getTracks($floor_id) as $track) { if ($track["name"] == $track_name) { return $track["track_uuid"]; } } } protected function doAbility($command, $params = false) { log::add('neato','debug','Do ability : '.$command); $result = array("message" => "no serial or secret"); if ($this->serial !== false) { $payload = array("ability" => $command); if ($params !== false) { $payload = array_merge($payload, $params); } $payload = json_encode($payload); $result = NeatoBotvacApi::request($this->baseUrl."/vendors/N/robots/".$this->serial."/messages", $this->version, $payload, "POST", array("Authorization: Token ".$this->secret, "Content-Type: application/json")); log::add('neato','debug','Neato ability : '.$payload.' => '.json_encode($result)); } return $result; } protected function doAction($command, $params = false) { log::add('neato','debug','Do action : '.$command); $result = array("message" => "no serial or secret"); if ($this->serial !== false && $this->secret !== false) { $payload = array("reqId" => "1", "cmd" => $command); if ($params !== false) { $payload["params"] = $params; } $payload = json_encode($payload); $date = gmdate("D, d M Y H:i:s") . " GMT"; $data = implode("\n", array(strtolower($this->serial), $date, $payload)); $hmac = hash_hmac("sha256", $data, $this->secret); $headers = array( "Date: " . $date, "Authorization: NEATOAPP " . $hmac, ); $result = NeatoBotvacApi::request($this->url, $payload, "POST", $headers); log::add('neato','debug','Neato action : '.$payload.' => '.json_encode($result)); } return $result; } }