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
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)
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
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))