def register(self, features):
        devices = []

        temp = get_feature(features, 'temperature')
        humidity = get_feature(features, 'humidity')
        pressure = get_feature(features, 'pressure')

        if temp:
            alias = generate_alias(temp, 'temp')
            device = TemperatureSensor(domoticz.get_devices(), alias,
                                       temp['property'], ' (Temperature)')
            device.feature = temp
            devices.append(device)

        if humidity:
            alias = generate_alias(humidity, 'hum')
            device = TemperatureSensor(domoticz.get_devices(), alias,
                                       humidity['property'], ' (Humidity)')
            device.feature = humidity
            devices.append(device)

        if pressure:
            alias = generate_alias(pressure, 'pres')
            device = PressureSensor(domoticz.get_devices(), alias,
                                    pressure['property'], ' (Pressure)')
            device.feature = pressure
            devices.append(device)

        if temp and humidity:
            device = TemperatureHumiditySensor(domoticz.get_devices(), 'all',
                                               'temp+hum',
                                               ' (Temperature + Humidity)')
            device.set_temp_feature(temp)
            device.set_humidity_feature(humidity)
            device.feature = temp
            devices.append(device)

        if temp and humidity and pressure:
            device = TemperatureHumidityBarometerSensor(
                domoticz.get_devices(), 'thb', 'temp+hum+bar',
                ' (Temperature + Humidity + Barometer)')
            device.set_temp_feature(temp)
            device.set_humidity_feature(humidity)
            device.set_pressure_feature(pressure)
            device.feature = temp
            devices.append(device)

        return devices
Esempio n. 2
0
    def set_devices(self, zigbee_devices):
        self.devices = {}

        for item in zigbee_devices:
            device_id = item['ieee_address']

            if 'type' in item and item['type'] == 'Coordinator':
                domoticz.debug('Coordinator address is ' + device_id)
                continue

            if 'definition' not in item:
                domoticz.error(item['friendly_name'] +
                               ': device definiton not found')

            model = item['definition']['model']

            if model in adapter_by_model:
                adapter = adapter_by_model[model](domoticz.get_devices())
                adapter.name = item['friendly_name']
                adapter.zigbee_device = item
                adapter.register()

                self.devices[device_id] = adapter
            else:
                self.devices[device_id] = UniversalAdapter(item)
Esempio n. 3
0
    def get_device(self, address, alias):
        device_id = address + '_' + alias
        devices = domoticz.get_devices()

        for unit, device in devices.items():
            if device.DeviceID == device_id:
                return device
    def _add_device(self, alias, feature, device_type, device_name_suffix=''):
        suffix = device_name_suffix if device_name_suffix != '' else (
            ' (' + feature['name'] + ')')
        device = device_type(domoticz.get_devices(), alias,
                             feature['property'], suffix)
        device.feature = feature

        self.devices.append(device)
    def _add_energy_device(self, features):
        power = self._get_feature(features, 'power')
        energy = self._get_feature(features, 'energy')
        device = None

        if power and energy:
            device = KwhSensor(domoticz.get_devices(), 'power',
                               [power['property'], energy['property']],
                               ' (Power)')
        elif power:
            device = KwhSensor(domoticz.get_devices(), 'power',
                               [power['property']], ' (Power)')

        if device:
            device.feature = power
            self.devices.append(device)
            return
    def register(self, features):
        devices = []
        power = get_feature(features, 'power')
        energy = get_feature(features, 'energy')
        device = None

        if power and energy:
            device = KwhSensor(domoticz.get_devices(), 'power',
                               [power['property'], energy['property']],
                               ' (Power)')
        elif power:
            device = KwhSensor(domoticz.get_devices(), 'power',
                               [power['property']], ' (Power)')

        if device:
            device.feature = power
            devices.append(device)

        return devices
    def _add_light_feature(self, feature):
        light_features = feature['features']

        state = get_feature(light_features, 'state')
        brightness = get_feature(light_features, 'brightness')
        color_temp = get_feature(light_features, 'color_temp')
        color = get_feature(light_features, 'color_xy')

        alias = generate_alias(state, 'light')
        devices = domoticz.get_devices()

        if state and brightness and color_temp and color:
            device = RGBWLight(devices, alias)
            device.set_state_feature(state)
            device.set_brightness_feature(brightness)
            device.set_color_temp_feature(color_temp)
            device.set_color_feature(color)
        elif state and brightness and color:
            device = RGBLight(devices, alias)
            device.set_state_feature(state)
            device.set_brightness_feature(brightness)
            device.set_color_feature(color)
        elif state and brightness and color_temp:
            device = CTLight(devices, alias)
            device.set_state_feature(state)
            device.set_brightness_feature(brightness)
            device.set_color_temp_feature(color_temp)
        elif state and brightness:
            device = DimmerLight(devices, alias)
            device.set_state_feature(state)
            device.set_brightness_feature(brightness)
        elif state:
            device = OnOffLight(devices, 'switch')
            device.set_state_feature(state)
        else:
            domoticz.error(
                self.adapter.name +
                ': can not find appropriate device type to handle light feature'
            )
            domoticz.debug(json.dumps(feature))

        if device:
            device.feature = feature

        # Add rest light features
        for item in light_features:
            name = item['name']

            if name != 'state' and name != 'brightness' and name != 'color_temp' and name != 'color_xy':
                self.adapter._add_feature(item)

        return device
    def get_legacy_device(self, address, alias):
        domoticz.debug('Trying to get legacy device ' + address + '(' + alias +
                       ')')
        device_id = address + '_' + alias
        devices = domoticz.get_devices()

        try:
            device = list(devices[device_id].Units.values())[0]
            domoticz.debug('Success!')
            return device
        except:
            domoticz.debug('No such device found')
            return None
Esempio n. 9
0
    def _add_selector_device(self, alias, feature, device_name_suffix = ''):
        suffix = device_name_suffix if device_name_suffix != '' else (' (' + feature['name'] + ')')
        device = SelectorSwitch(domoticz.get_devices(), alias, feature['property'], suffix)
        device.disable_value_check_on_update()
        device.add_level('Off', None)
        for value in feature['values']:
            device.add_level(value, value)

        if (len(feature['values']) >= 5):
            device.set_selector_style(SelectorSwitch.SELECTOR_TYPE_MENU)

        device.feature = feature

        self.devices.append(device)
    def _get_adapter(self, group_name):
        domoticz_devices = domoticz.get_devices()

        if (group_name.endswith('_dimmer')):
            adapter = DimmableBulbAdapter(domoticz_devices)
        elif (group_name.endswith('_ct')):
            adapter = DimmableCtBulbAdapter(domoticz_devices)
        elif (group_name.endswith('_rgb')):
            adapter = RGBAdapter(domoticz_devices)
        elif (group_name.endswith('_rgbw')):
            adapter = RGBWAdapter(domoticz_devices)
        else:
            adapter = OnOffSwitchAdapter(domoticz_devices)

        # Remove LinkQuality device from adapter
        if domoticz.get_plugin_config('trackLinkQuality'):
            adapter.devices.pop(0)

        return adapter
    def _add_cover_feature(self, feature):
        cover_features = feature['features']
        state = self._get_feature(cover_features, 'state')
        position = self._get_feature(cover_features, 'position')

        if state and position:
            alias = state['endpoint'] if 'endpoint' in state else 'dimmer'
            device = BlindSwitch(domoticz.get_devices(), alias,
                                 position['property'], ' (Position)')
            device.set_state_feature(state)
            device.set_position_feature(position)
            device.feature = feature
            self.devices.append(device)

        # Add rest light features
        for item in cover_features:
            name = item['name']

            if name != 'state' and name != 'position':
                self._add_feature(item)
    def _add_cover_feature(self, feature):
        cover_features = feature['features']
        state = get_feature(cover_features, 'state')
        position = get_feature(cover_features, 'position')
        device = None

        if state and position:
            alias = generate_alias(state, 'dimmer')
            device = BlindSwitch(domoticz.get_devices(), alias,
                                 position['property'], ' (Position)')
            device.set_state_feature(state)
            device.set_position_feature(position)
            device.feature = feature

        # Add rest sub features
        for item in cover_features:
            name = item['name']

            if name != 'state' and name != 'position':
                self.adapter._add_feature(item)

        return device
    def set_devices(self, zigbee_devices):
        self.devices = {}

        for item in zigbee_devices:
            device_id = item['ieee_address']

            if 'type' in item and item['type'] == 'Coordinator':
                domoticz.debug('Coordinator address is ' + device_id)
                continue

            if 'definition' not in item:
                domoticz.log(item['friendly_name'] +
                             ': device definiton not found, skipping...')
                continue

            if item['definition'] == None:
                domoticz.log(item['friendly_name'] +
                             ': device definiton not found, skipping...')
                continue

            if 'model' not in item['definition']:
                domoticz.log(
                    item['friendly_name'] +
                    ': device definiton does not contain model, skipping...')
                domoticz.debug(json.dumps(item))
                continue

            model = item['definition']['model']

            if model in adapter_by_model:
                adapter = adapter_by_model[model](domoticz.get_devices())
                adapter.name = item['friendly_name']
                adapter.zigbee_device = item
                adapter.register()

                self.devices[device_id] = adapter
            else:
                self.devices[device_id] = UniversalAdapter(item)
    def add_numeric_device(self, feature):
        state_access = self._has_access(feature['access'], ACCESS_STATE)
        write_access = self._has_access(feature['access'], ACCESS_WRITE)

        # TODO: Use energy value for `power` feature
        if feature['name'] == 'energy':
            return

        if (feature['name'] == 'linkquality' and state_access):
            if domoticz.get_plugin_config('trackLinkQuality'):
                self._add_device('signal', feature, CustomSensor,
                                 ' (Link Quality)')
            return

        if (feature['name'] == 'battery' and state_access):
            if domoticz.get_plugin_config('useBatteryDevices'):
                self._add_device('btperc', feature, PercentageSensor,
                                 ' (Battery)')
            return

        if (feature['name'] == 'brightness' and state_access):
            alias = feature['endpoint'] if 'endpoint' in feature else 'light'
            self._add_device(alias, feature, DimmerSwitch)
            return

        if (feature['name'] == 'humidity' and state_access):
            self._add_device('hum', feature, HumiditySensor, ' (Humidity)')
            return

        if (feature['name'] == 'temperature' and state_access):
            self._add_device('temp', feature, TemperatureSensor,
                             ' (Temperature)')
            return

        if (feature['name'] == 'local_temperature' and state_access):
            self._add_device('ltemp', feature, TemperatureSensor,
                             ' (Local Temperature)')
            return

        if (feature['name'] == 'pressure' and state_access):
            self._add_device('pres', feature, PressureSensor, ' (Pressure)')
            return

        if (feature['name'] == 'voltage' and state_access):
            self._add_device('volt', feature, VoltageSensor, ' (Voltage)')
            return

        if (feature['name'] == 'current' and state_access):
            self._add_device('ampere', feature, CurrentSensor, ' (Current)')
            return

        if (feature['name'] == 'power' and state_access
                and feature['unit'] == 'W'):
            device = KwhSensor(domoticz.get_devices(), 'power',
                               [feature['property']], ' (Power)')
            device.feature = feature
            self.devices.append(device)
            return

        if 'setpoint' in feature['name'] and feature[
                'unit'] == '°C' and write_access:
            alias = feature['endpoint'] if 'endpoint' in feature else 'spoint'
            self._add_device(alias, feature, SetPoint, ' (Setpoint)')
            return

        if (feature['name'] == 'position' and state_access):
            alias = feature['endpoint'] if 'endpoint' in feature else 'level'
            self._add_device(alias, feature, LevelSwitch)
            return

        domoticz.error(self.name + ': can not process numeric item "' +
                       feature['name'] + '"')
        domoticz.debug(json.dumps(feature))