diff --git a/platypush/backend/http/webapp/src/components/panels/Entities/Light.vue b/platypush/backend/http/webapp/src/components/panels/Entities/Light.vue index ae85e59b..b15cfb8f 100644 --- a/platypush/backend/http/webapp/src/components/panels/Entities/Light.vue +++ b/platypush/backend/http/webapp/src/components/panels/Entities/Light.vue @@ -88,11 +88,15 @@ export default { if (this.value.meta?.icon?.color) return this.value.meta.icon.color + if (this.value.red && this.value.green && this.value.blue) + return ['red', 'green', 'blue'].map((c) => this.value[c]) + + if (!this.colorConverter) + return + if ( - !this.colorConverter || ( - this.value.hue == null && - (this.value.x == null || this.value.y == null) - ) + this.value.hue == null && + (this.value.x == null || this.value.y == null) ) return @@ -150,11 +154,18 @@ export default { const rgb = this.colorConverter.hexToRgb(attrs.color) if (this.value.x != null && this.value.y != null) { attrs.xy = this.colorConverter.rgbToXY(...rgb) - delete attrs.color } else if (this.value.hue != null) { [attrs.hue, attrs.saturation, attrs.brightness] = this.colorConverter.rgbToHsl(...rgb) - delete attrs.color + } else if ( + this.value.red != null && this.value.green != null && this.value.blue != null + ) { + [attrs.red, attrs.green, attrs.blue] = [rgb.red, rgb.green, rgb.blue] + } else { + console.warn('Unrecognized color format') + console.warn(attrs.color) } + + delete attrs.color } this.execute({ diff --git a/platypush/plugins/zwave/mqtt/__init__.py b/platypush/plugins/zwave/mqtt/__init__.py index 1b7af7d6..b9a6da28 100644 --- a/platypush/plugins/zwave/mqtt/__init__.py +++ b/platypush/plugins/zwave/mqtt/__init__.py @@ -30,6 +30,7 @@ from platypush.entities.electricity import ( ) from platypush.entities.humidity import HumiditySensor from platypush.entities.illuminance import IlluminanceSensor +from platypush.entities.lights import Light from platypush.entities.sensors import BinarySensor, EnumSensor, NumericSensor from platypush.entities.switches import EnumSwitch, Switch from platypush.entities.temperature import TemperatureSensor @@ -588,6 +589,16 @@ class ZwaveMqttPlugin(MqttPlugin, ZwaveBasePlugin): def _is_enum_switch(cls, value: Mapping): return value.get('type') == 'List' and not value.get('is_read_only') + @classmethod + def _is_light(cls, value: Mapping): + return ( + cls._matches_classes(value, 'color') + and not {'red', 'green', 'blue'}.difference( + set(value.get('value', {}).keys()) + ) + and not value.get('is_read_only') + ) + @classmethod def _get_sensor_args( cls, value: Mapping @@ -689,7 +700,13 @@ class ZwaveMqttPlugin(MqttPlugin, ZwaveBasePlugin): entity_args = self._to_entity_args(value) sensor_type, sensor_args = self._get_sensor_args(value) - if self._is_dimmer(value): + if self._is_light(value): + entity_type = Light + color = value['value'] + entity_args['red'] = color['red'] + entity_args['green'] = color['green'] + entity_args['blue'] = color['blue'] + elif self._is_dimmer(value): entity_type = Dimmer entity_args['value'] = value['data'] entity_args['min'] = value['min'] @@ -1486,6 +1503,15 @@ class ZwaveMqttPlugin(MqttPlugin, ZwaveBasePlugin): **kwargs, ) + @action + def set_lights(self, lights, **kwargs): + """ + Set the state for one or more Z-Wave lights. + """ + lights = [lights] if isinstance(lights, str) else lights + for light in lights: + self.set_value(light, kwargs) + @action def set_value_label(self, **_): """