def read_sensors(self): """ Read measurements from all sensor objects that have been registered in the sensor_manager. Reading is done with the read() function of each respective sensor object. """ # Collect observations. data = {} richdata = {} # Iterate all registered sensors. sensors = self.sensor_manager.sensors log.info('Reading %s sensor ports', len(sensors)) for sensor in sensors: # Signal sensor reading to user. sensorname = sensor.__class__.__name__ log.info('Reading sensor port "%s"', sensorname) # Read sensor port. try: # Disable garbage collector to guarantee reasonable # realtime behavior before invoking sensor reading. with gc_disabled(): reading = sensor.read() # Evaluate sensor outcome. if reading is None or reading is AbstractSensor.SENSOR_NOT_INITIALIZED: continue # Add sensor reading to observations. data.update(reading) # Record reading for prettified output. self.record_reading(sensor, reading, richdata) except Exception as ex: # Because of the ``gc_disabled`` context manager used above, # the propagation of exceptions has to be tweaked like that. log.exc(ex, 'Reading sensor "%s" failed', sensorname) # Feed the watchdog. self.device.watchdog.feed() # Clean up memory after reading each sensor object. #self.device.run_gc() # Debugging: Print sensor data before running telemetry. prettify_log = self.settings.get('sensors.prettify_log', False) if prettify_log: log.info('Sensor data:\n\n%s', ddformat(richdata, indent=11)) else: log.info('Sensor data: %s', data) return data
def read_sensors(self) -> DataFrame: """ Read measurements from all sensor objects that have been registered in the sensor_manager. Reading is done with the read() function of each respective sensor object. """ # Power up sensor peripherals. self.sensor_manager.power_on() # Collect observations. data = {} richdata = {} readings = [] # Iterate all registered sensors. sensors = self.sensor_manager.sensors log.info('Reading %s sensor ports', len(sensors)) for sensor in sensors: # Signal sensor reading to user. sensorname = sensor.__class__.__name__ log.info('Reading sensor port "%s"', sensorname) # Read sensor port. try: # Disable garbage collector to guarantee reasonable # realtime behavior before invoking sensor reading. with gc_disabled(): sensor_outcome = sensor.read() # Power off HX711 after reading if "HX711Sensor" in sensorname: sensor.power_off() # Backward compat. if isinstance(sensor_outcome, SensorReading): sensor_reading = sensor_outcome else: sensor_reading = SensorReading() sensor_reading.sensor = sensor sensor_reading.data = sensor_outcome sensor_data = sensor_reading.data # Evaluate sensor outcome. if sensor_data is None or sensor_data is AbstractSensor.SENSOR_NOT_INITIALIZED: continue # Round values according to sensor settings. if sensor.settings.get('decimals') is not None: for key, value in sensor_data.items(): sensor_data[key] = round( sensor_data[key], sensor.settings.get('decimals')) # Add sensor reading to observations. data.update(sensor_data) # Record reading for prettified output. self.record_reading(sensor, sensor_data, richdata) readings.append(sensor_reading) except Exception as ex: # Because of the ``gc_disabled`` context manager used above, # the propagation of exceptions has to be tweaked like that. log.exc(ex, 'Reading sensor "%s" failed', sensorname) # Feed the watchdog. self.device.watchdog.feed() # Clean up memory after reading each sensor object. #self.device.run_gc() # Debugging: Print sensor data before running telemetry. prettify_log = self.settings.get('sensors.prettify_log', False) if prettify_log: from terkin.util import ddformat log.info('Sensor data:\n\n%s', ddformat(richdata, indent=11)) else: log.info('Sensor data: %s', data) # Capture all sensor readings. result = DataFrame() result.readings = readings result.data_in = data return result