mirror of
https://github.com/beestat/app.git
synced 2025-05-24 02:14:03 -04:00
149 lines
6.0 KiB
PHP
Executable File
149 lines
6.0 KiB
PHP
Executable File
<?php
|
|
|
|
/**
|
|
* Summary table for runtime_thermostat.
|
|
*
|
|
* @author Jon Ziebell
|
|
*/
|
|
class runtime_thermostat_summary extends cora\crud {
|
|
|
|
public static $exposed = [
|
|
'private' => [
|
|
'read_id',
|
|
'sync'
|
|
],
|
|
'public' => []
|
|
];
|
|
|
|
public static $cache = [
|
|
// Can't have these on right now because beestat loads and fires this API
|
|
// call off. Then it syncs all the data and calls these again to get updated
|
|
// data...if they're cached that just returns empty. So need to be able to
|
|
// bypass the cache or something to get that to work. Or just don't call the
|
|
// API call to begin with on first load if there's nothing there.
|
|
|
|
// 'read' => 3600, // 1 hour
|
|
// 'read_id' => 3600, // 1 hour
|
|
];
|
|
|
|
/**
|
|
* Read from the runtime_thermostat_summary table. Fixes temperature columns
|
|
* to return as decimals.
|
|
*
|
|
* @param array $attributes
|
|
* @param array $columns
|
|
*
|
|
* @return array
|
|
*/
|
|
public function read($attributes = [], $columns = []) {
|
|
$runtime_thermostat_summaries = parent::read($attributes, $columns);
|
|
|
|
foreach($runtime_thermostat_summaries as &$runtime_thermostat_summary) {
|
|
$runtime_thermostat_summary['avg_outdoor_temperature'] /= 10;
|
|
$runtime_thermostat_summary['min_outdoor_temperature'] /= 10;
|
|
$runtime_thermostat_summary['max_outdoor_temperature'] /= 10;
|
|
$runtime_thermostat_summary['avg_indoor_temperature'] /= 10;
|
|
}
|
|
|
|
return $runtime_thermostat_summaries;
|
|
}
|
|
|
|
/**
|
|
* Populate the runtime_thermostat_summary table.
|
|
*
|
|
* @param int $thermostat_id
|
|
*/
|
|
public function populate($thermostat_id) {
|
|
$thermostat = $this->api('thermostat', 'get', $thermostat_id);
|
|
|
|
$query = '
|
|
select
|
|
min(`date`) `min_date`,
|
|
max(`date`) `max_date`
|
|
from
|
|
`runtime_thermostat_summary`
|
|
where
|
|
`user_id` = ' . $this->database->escape($this->session->get_user_id()) . '
|
|
and `thermostat_id` = ' . $this->database->escape($thermostat_id) . '
|
|
';
|
|
$result = $this->database->query($query);
|
|
$row = $result->fetch_assoc();
|
|
|
|
if($row['min_date'] === null || $row['max_date'] === null) {
|
|
$start = 'now() - interval 10 year'; // Just grab everything
|
|
} else {
|
|
if(strtotime($row['min_date']) > strtotime($thermostat['sync_begin'])) {
|
|
$start = '"' . date('Y-m-d 00:00:00', strtotime($thermostat['sync_begin'])) . '"';
|
|
} else {
|
|
$start = '"' . date('Y-m-d 00:00:00', strtotime($row['max_date'] . ' - 1 day')) . '"';
|
|
}
|
|
}
|
|
|
|
// TODO
|
|
// Query takes a full second to run for my data which would add some amount of time for the sync...
|
|
// Going to need to add a stop as well so only adding in relevant data points as the backwards sync runs
|
|
//
|
|
// TODO
|
|
// timezone convert!
|
|
|
|
$query = '
|
|
insert into
|
|
`runtime_thermostat_summary`
|
|
select
|
|
null `runtime_summary_id`,
|
|
`thermostat`.`user_id` `user_id`,
|
|
`thermostat_id` `thermostat_id`,
|
|
date(convert_tz(`timestamp`, "UTC", "' . $thermostat['time_zone'] . '")) `date`,
|
|
count(*) `count`,
|
|
sum(case when `compressor_mode` = "cool" then `compressor_1` else 0 end) `compressor_cool_1`,
|
|
sum(case when `compressor_mode` = "cool" then `compressor_2` else 0 end) `compressor_cool_2`,
|
|
sum(case when `compressor_mode` = "heat" then `compressor_1` else 0 end) `compressor_heat_1`,
|
|
sum(case when `compressor_mode` = "heat" then `compressor_2` else 0 end) `compressor_heat_2`,
|
|
sum(`auxiliary_heat_1`) `auxiliary_heat_1`,
|
|
sum(`auxiliary_heat_2`) `auxiliary_heat_2`,
|
|
sum(`fan`) `fan`,
|
|
sum(case when `accessory_type` = "humidifier" then `accessory` else 0 end) `humidifier`,
|
|
sum(case when `accessory_type` = "dehumidifier" then `accessory` else 0 end) `dehumidifier`,
|
|
sum(case when `accessory_type` = "ventilator" then `accessory` else 0 end) `ventilator`,
|
|
sum(case when `accessory_type` = "economizer" then `accessory` else 0 end) `economizer`,
|
|
round(avg(`outdoor_temperature`)) `avg_outdoor_temperature`,
|
|
round(avg(`outdoor_humidity`)) `avg_outdoor_humidity`,
|
|
min(`outdoor_temperature`) `min_outdoor_temperature`,
|
|
max(`outdoor_temperature`) `max_outdoor_temperature`,
|
|
round(avg(`indoor_temperature`)) `avg_indoor_temperature`,
|
|
round(avg(`indoor_humidity`)) `avg_indoor_humidity`,
|
|
0 `deleted`
|
|
from
|
|
`runtime_thermostat`
|
|
join
|
|
`thermostat` using(`thermostat_id`)
|
|
where
|
|
convert_tz(`timestamp`, "UTC", "' . $thermostat['time_zone'] . '") > ' . $start . '
|
|
and thermostat_id = ' . $thermostat['thermostat_id'] . '
|
|
group by
|
|
`thermostat_id`,
|
|
date(convert_tz(`timestamp`, "UTC", "' . $thermostat['time_zone'] . '"))
|
|
on duplicate key update
|
|
`count` = values(`count`),
|
|
`sum_compressor_cool_1` = values(`sum_compressor_cool_1`),
|
|
`sum_compressor_cool_2` = values(`sum_compressor_cool_2`),
|
|
`sum_compressor_heat_1` = values(`sum_compressor_heat_1`),
|
|
`sum_compressor_heat_2` = values(`sum_compressor_heat_2`),
|
|
`sum_auxiliary_heat_1` = values(`sum_auxiliary_heat_1`),
|
|
`sum_auxiliary_heat_2` = values(`sum_auxiliary_heat_2`),
|
|
`sum_fan` = values(`sum_fan`),
|
|
`sum_humidifier` = values(`sum_humidifier`),
|
|
`sum_dehumidifier` = values(`sum_dehumidifier`),
|
|
`sum_ventilator` = values(`sum_ventilator`),
|
|
`sum_economizer` = values(`sum_economizer`),
|
|
`avg_outdoor_temperature` = values(`avg_outdoor_temperature`),
|
|
`avg_outdoor_humidity` = values(`avg_outdoor_humidity`),
|
|
`min_outdoor_temperature` = values(`min_outdoor_temperature`),
|
|
`max_outdoor_temperature` = values(`max_outdoor_temperature`),
|
|
`avg_indoor_temperature` = values(`avg_indoor_temperature`),
|
|
`avg_indoor_humidity` = values(`avg_indoor_humidity`)
|
|
';
|
|
$this->database->query($query);
|
|
}
|
|
}
|