Exemplo n.º 1
0
    def register_sensors(self):
        """
        Add system sensors.
        """

        log.info('Registering Terkin sensors')

        system_sensors = [
            SystemMemoryFree,
            SystemTemperature,
            SystemBatteryLevel,
            SystemUptime,
        ]

        # Create environmental sensor adapters.
        for sensor_factory in system_sensors:
            sensor = sensor_factory()
            if hasattr(sensor, 'setup') and callable(sensor.setup):
                sensor.setup(self.settings)
            self.sensor_manager.register_sensor(sensor)

        # Add WiFi metrics.
        try:
            self.sensor_manager.register_sensor(SystemWiFiMetrics(self.device.networking.wifi_manager.station))
        except:
            log.exception('Enabling SystemWiFiMetrics sensor failed')
Exemplo n.º 2
0
    def register_sensors(self):
        """
        Add system sensors.
        """

        log.info('Registering system sensors')

        system_sensors = [
            SystemMemoryFree,
            SystemTemperature,
            SystemBatteryLevel,
            SystemUptime,
        ]

        for sensor_factory in system_sensors:
            sensor_name = sensor_factory.__name__
            try:
                sensor = sensor_factory()
                if not sensor.enabled():
                    log.info('Sensor %s not enabled, skipping', sensor_name)
                    continue
                if hasattr(sensor, 'setup') and callable(sensor.setup):
                    sensor.setup(self.settings)
                self.sensor_manager.register_sensor(sensor)
            except Exception as ex:
                log.exc(ex, 'Registering system sensor "%s" failed',
                        sensor_name)

        # Add WiFi metrics.
        try:
            self.sensor_manager.register_sensor(
                SystemWiFiMetrics(self.device.networking.wifi_manager.station))
        except Exception as ex:
            log.exc(ex, 'Enabling SystemWiFiMetrics sensor failed')
Exemplo n.º 3
0
    def register_sensor_legacy(self, sensor_info, sensor_bus):

        sensor_type = sensor_info.get('type', 'unknown').lower()

        # Sensor reporting about free system memory.
        if sensor_type == 'system.memfree':
            sensor_object = SystemMemoryFree(sensor_info)

        # Sensor which reports system temperature.
        elif sensor_type == 'system.temperature':
            sensor_object = SystemTemperature(sensor_info)

        # Sensor which reports battery voltage.
        elif sensor_type in [
                'system.voltage.battery', 'system.battery-voltage'
        ]:
            sensor_object = SystemVoltage(sensor_info)

        # Sensor which reports solar panel voltage.
        elif sensor_type == 'system.voltage.solar':
            sensor_object = SystemVoltage(sensor_info)

        # Sensor which reports system uptime metrics.
        elif sensor_type == 'system.uptime':
            sensor_object = SystemUptime(sensor_info)

        # Sensor which reports WiFi metrics.
        elif sensor_type == 'system.wifi':
            try:
                sensor_object = SystemWiFiMetrics(
                    sensor_info, self.device.networking.wifi_manager.station)
            except Exception as ex:
                log.exc(ex, 'Enabling SystemWiFiMetrics sensor failed')
                return

        # Initialize buttons / touch pads.
        elif sensor_type == 'system.touch-buttons':
            from terkin.sensor.button import ButtonManager
            self.button_manager = ButtonManager()
            self.start_buttons()
            return

        else:
            raise SensorUnknownError(
                'Unknown sensor type "{}"'.format(sensor_type))

        # Register sensor object with sensor manager.
        self.sensor_manager.register_sensor(sensor_object)
Exemplo n.º 4
0
    def register_sensors(self):
        """
        Configure and register sensor objects.
        There are three types of sensors: system, environment & busses. Only the former two are assigned to the latter (if applicable).
        Definitions are in 'settings.py'.
        The sensor are registered by calling their respective classes from terkin/drivers/
        """

        # Add sensors.
        log.info('Registering sensors')
        sensor_infos = []

        # Get list of system sensors from configuration settings.
        sensor_infos += self.settings.get('sensors.system', [])

        # Get list of environmental sensors from configuration settings.
        sensor_infos += self.settings.get('sensors.environment', [])

        # Backward compatibility for environmental sensors.
        if sensor_infos is None:
            sensor_infos += self.settings.get('sensors.registry',
                                              {}).values() or []

        # Scan sensor definitions, create and register sensor objects.
        for sensor_info in sensor_infos:

            sensor_type = sensor_info.get('type', 'unknown').lower()
            sensor_id = sensor_info.get('id',
                                        sensor_info.get('key', sensor_type))
            description = sensor_info.get('description')

            # Skip sensor if disabled in configuration.
            if sensor_info.get('enabled') is False:
                log.info(
                    'Sensor with id={} and type={} is disabled, skipping registration'
                    .format(sensor_id, sensor_type))
                continue

            # skip WiFi sensor registration when WiFi is disabled
            if sensor_type == 'system.wifi':
                if not self.settings.get('networking.wifi.enabled'):
                    log.info('WiFi is disabled, skipping sensor registration')
                    continue

            # Resolve associated bus object.
            sensor_bus = None
            sensor_bus_name = None
            if 'bus' in sensor_info:
                sensor_info_bus = sensor_info['bus']
                sensor_bus = self.sensor_manager.get_bus_by_name(
                    sensor_info_bus)

                # Skip sensor if associated bus is disabled in configuration.
                if sensor_bus is None:
                    log.info(
                        'Bus {} for sensor with id={} and type={} is disabled, '
                        'skipping registration'.format(sensor_info_bus,
                                                       sensor_id, sensor_type))
                    continue
                sensor_bus_name = sensor_bus.name

            # Human readable sensor address.
            if 'address' in sensor_info:
                sensor_address = hex(sensor_info.get('address'))
            else:
                sensor_address = None

            # Report sensor registration to user.
            message = 'Setting up sensor with with id={} and type={} on bus={} with address={} ' \
                      'described as "{}"'.format(sensor_id, sensor_type, sensor_bus_name, sensor_address, description)
            log.info(message)

            try:

                # Sensor reporting about free system memory.
                if sensor_type == 'system.memfree':
                    sensor_object = SystemMemoryFree(sensor_info)

                # Sensor which reports system temperature.
                elif sensor_type == 'system.temperature':
                    sensor_object = SystemTemperature(sensor_info)

                # Sensor which reports battery voltage.
                elif sensor_type in [
                        'system.voltage.battery', 'system.battery-voltage'
                ]:
                    sensor_object = SystemVoltage(sensor_info)

                # Sensor which reports solar panel voltage.
                elif sensor_type == 'system.voltage.solar':
                    sensor_object = SystemVoltage(sensor_info)

                # Sensor which reports system uptime metrics.
                elif sensor_type == 'system.uptime':
                    sensor_object = SystemUptime(sensor_info)

                # Sensor which reports WiFi metrics.
                elif sensor_type == 'system.wifi':
                    try:
                        sensor_object = SystemWiFiMetrics(
                            sensor_info,
                            self.device.networking.wifi_manager.station)
                    except Exception as ex:
                        log.exc(ex, 'Enabling SystemWiFiMetrics sensor failed')
                        continue

                # Initialize buttons / touch pads.
                elif sensor_type == 'system.touch-buttons':
                    from terkin.sensor.button import ButtonManager
                    self.button_manager = ButtonManager()
                    self.start_buttons()

                # Setup and register HX711 sensors.
                elif sensor_type == 'hx711':
                    sensor_object = HX711Sensor(settings=sensor_info)
                    sensor_object.set_address(
                        sensor_info.get('number',
                                        sensor_info.get('address', 0)))
                    sensor_object.register_pin('dout', sensor_info['pin_dout'])
                    sensor_object.register_pin('pdsck',
                                               sensor_info['pin_pdsck'])
                    sensor_object.register_parameter('scale',
                                                     sensor_info['scale'])
                    sensor_object.register_parameter('offset',
                                                     sensor_info['offset'])
                    sensor_object.register_parameter(
                        'gain', sensor_info.get('gain', 128))

                    # Select driver module. Use "gerber" (vanilla) or "heisenberg" (extended).
                    # hx711_sensor.select_driver('gerber')
                    sensor_object.select_driver('heisenberg')

                    # Start sensor.
                    sensor_object.start()

                # Setup and register DS18X20 sensors.
                elif sensor_type == 'ds18b20':
                    sensor_object = DS18X20Sensor(settings=sensor_info)
                    sensor_object.acquire_bus(sensor_bus)

                    # Start sensor.
                    sensor_object.start()

                # Setup and register BME280 sensors.
                elif sensor_type == 'bme280':

                    sensor_object = BME280Sensor(settings=sensor_info)
                    if 'address' in sensor_info:
                        sensor_object.set_address(sensor_info['address'])
                    sensor_object.acquire_bus(sensor_bus)

                    # Start sensor.
                    sensor_object.start()

                elif sensor_type == 'max17043':

                    sensor_object = MAX17043Sensor(settings=sensor_info)
                    if 'address' in sensor_info:
                        sensor_object.set_address(sensor_info['address'])
                    sensor_object.acquire_bus(sensor_bus)

                    # Start sensor.
                    sensor_object.start()

                else:
                    log.warning(
                        'Sensor with id={} has unknown type, skipping registration. '
                        'Sensor settings:\n{}'.format(sensor_id, sensor_info))
                    continue

                # Register sensor object with sensor manager.
                self.sensor_manager.register_sensor(sensor_object)

            except Exception as ex:
                log.exc(
                    ex,
                    'Setting up sensor with id={} and type={} failed'.format(
                        sensor_id, sensor_type))