[ 'read_id', 'sync' ], 'public' => [] ]; public static $cache = [ 'sync' => 180 // 3 Minutes ]; /** * Normal read_id, but filter out unsupported sensor types. * * @param array $attributes * @param array $columns * * @return array */ public function read_id($attributes = [], $columns = []) { $sensors = parent::read_id($attributes, $columns); $return = []; foreach($sensors as $sensor) { if ( in_array( $sensor['type'], ['ecobee3_remote_sensor', 'thermostat'] ) === true ) { $return[$sensor['sensor_id']] = $sensor; } else if ( in_array( $sensor['type'], ['monitor_sensor', 'control_sensor'] ) === true ) { /** * Support for these sensor types is rudimentary. It's enough to get * temperature but some of these legacy sensors split a single sensor * up into multiple sensors. For example, thermostat temperature, * humidity, and motion are three different sensors. Newer sensors * show up as a single sensor with more than one capability. To make * sense of this I would have to do a good deal of merging etc in the * GUI. * * I don't really think it's worth the clutter or the time investment. */ foreach($sensor['capability'] as $capability) { if($capability['type'] === 'temperature') { $return[$sensor['sensor_id']] = $sensor; } } } } return $return; } /** * Sync all sensors for the current user. If we fail to get a lock, fail * silently (catch the exception) and just return false. * * @return boolean true if the sync ran, false if not. */ public function sync() { // Skip this for the demo if($this->setting->is_demo() === true) { return; } try { $lock_name = 'sensor->sync(' . $this->session->get_user_id() . ')'; $this->database->get_lock($lock_name); $this->api('ecobee_sensor', 'sync'); $this->api( 'user', 'update_sync_status', [ 'key' => 'sensor' ] ); $this->database->release_lock($lock_name); } catch(cora\exception $e) { return false; } } }