requireAuth(); $response = null; if (RecordManager::getLastRecord($subDeviceId)['execuded'] === 0) { throw new Exception("Unreachable", 409); } $subDeviceData = SubDeviceManager::getSubDevice($subDeviceId); if ($subDeviceData['type'] == 'on/off') { $lastValue = RecordManager::getLastRecord($subDeviceData['subdevice_id'])['value']; RecordManager::create($subDeviceData['device_id'], 'on/off', (int) !$lastValue); $response = !$lastValue; } else { throw new Exception("Bad Request", 403); } $i = 0; $timeout = 20; while (RecordManager::getLastRecord($subDeviceId)['execuded'] == 0) { if ($i == $timeout) { throw new Exception("Timeout", 444); } $i++; usleep(250000); } $this->response(['value' => $response]); } public function detail($subDeviceId, $period = "day") { //$this->requireAuth(); $groupBy = [ "year" => "month", "month" => "day", "day" => "hour", "hout" => "minute", ]; $response = null; $subDeviceData = SubDeviceManager::getSubdeviceDetailById($subDeviceId); //TODO: zeptat se @Patrik Je Graf Dobře Seřazený na DESC ? $events = RecordManager::getAllRecordForGraph($subDeviceId, $period, $groupBy[$period]); if ( count($events) == 0){ throw new Exception("No Records", 404); } //Striping executed value from dataset if pasiv device such as Senzor ETC if ($subDeviceData['type'] != "on/off") { foreach ($events as $key => $event) { unset($events[$key]['execuded']); } } $LastRecordTime = new DateTime(reset($events)['time']); $niceTime = Utilities::ago($LastRecordTime); $labels = []; $values = []; foreach ($events as $key => $event) { $recordDatetime = new DateTime($event['time']); if ($key == 0){ $labels[] = 'now'; } else { $labels[] = $recordDatetime->format('H:i'); } $values[] = [ 'y' => $event['value'], 't' => $recordDatetime->getTimestamp() * 1000, ]; } $response = [ 'room_id' => $subDeviceData['room_id'], 'device_id' => $subDeviceData['device_id'], 'lastConnectionTime' => (empty($niceTime) ? "00:00" : $niceTime), 'records' => $events, 'graph' => [ 'type' => $this->getDeviceConfig($subDeviceData['type'])['graph'], 'data' => [ 'labels' => $labels, 'datasets' => [[ //'label' => 'FUCK you', 'data' => $values, ]], ], 'options' => [ 'scales' => [ 'xAxis' => [[ 'type' => 'time', 'distribution' => 'linear', ]], ], 'legend' => [ 'display' => false ], 'tooltips' => [ 'enabled' => true ], 'hover' => [ 'mode' => true ], ], ], ]; //TODO: Make Cleaner if (isset(RANGES[$subDeviceData['type']])){ $response['graph']['options']['scales']['yAxes'] = [[ 'ticks' => [ 'min' => RANGES[$subDeviceData['type']]['min'], 'max' => RANGES[$subDeviceData['type']]['max'], 'steps' => RANGES[$subDeviceData['type']]['scale'], ] ]]; } $this->response($response); } private function getDeviceConfig($type){ if (isset(RANGES[$type])){ return RANGES[$type]; } return RANGES['']; } }