예제 #1
0
 /**
  * @param Device $thermostat
  *
  * @return \Illuminate\Http\JsonResponse
  */
 public function overview(Device $thermostat)
 {
     $timezone = $thermostat->structure->tz();
     $city = City::findCity($thermostat->structure->postal_code, $thermostat->structure->country_code);
     /** @var \Grumpydictator\Gchart\GChart $chart */
     $chart = App::make('gchart');
     $chart->addColumn('Time', 'timeofday');
     $chart->addColumn('Target temperature', 'number');
     $chart->addColumn('Ambient temperature', 'number');
     $chart->addColumn('Outside temperature', 'number');
     $start = Carbon::now($timezone)->startOfDay();
     $end = Carbon::now($timezone)->endOfDay();
     $start->timezone('utc');
     $end->timezone('utc');
     // get all entries between start and end.
     $ambient = LogEntry::betweenTimes($start, $end)->withLogValue('target_temperature_c')->withLogValue('ambient_temperature_c')->orderBy('date', 'ASC')->where('log_entries.device_id', $thermostat->id)->get([DB::Raw('DATE_FORMAT(`log_entries`.`time`,"%Y-%m-%d %H:%i") as `date`'), DB::Raw('`target_temperature_c`.`value` AS `target_temperature_c`'), DB::Raw('`ambient_temperature_c`.`value` AS `ambient_temperature_c`')]);
     $chartData = [];
     foreach ($ambient as $entry) {
         /** @var Carbon $time */
         $time = $entry->date;
         $chartData[$time] = ['target_temperature_c' => floatval($entry->target_temperature_c), 'ambient_temperature_c' => floatval($entry->ambient_temperature_c), 'main_temp' => null];
     }
     unset($entry, $ambient, $time);
     // get outside temperature between start and end:
     $outside = Report::betweenTimes($start, $end)->withReportValue('main.temp')->orderBy('reports.time', 'ASC')->where('reports.city_id', $city->id)->get([DB::Raw('DATE_FORMAT(`reports`.`time`,"%Y-%m-%d %H:%i") as `date`'), DB::Raw('`main_temp`.`value` AS `main_temp`')]);
     foreach ($outside as $entry) {
         $time = $entry->date;
         $chartData[$time]['main_temp'] = floatval($entry->main_temp);
     }
     ksort($chartData);
     $previous = null;
     foreach ($chartData as $time => $row) {
         $obj = new Carbon($time);
         $obj->timezone($timezone);
         if (is_null($previous)) {
             $previous = clone $obj;
         }
         $target = isset($row['target_temperature_c']) ? $row['target_temperature_c'] : null;
         $ambient = isset($row['ambient_temperature_c']) ? $row['ambient_temperature_c'] : null;
         $main = isset($row['main_temp']) ? $row['main_temp'] : null;
         // only add row when previous is not null and time is not smaller than previous
         if (!is_null($previous) && $obj >= $previous) {
             $chart->addRow($obj, $target, $ambient, $main);
             $previous = clone $obj;
         }
     }
     $chart->generate();
     return Response::json($chart->getData());
 }