diff --git a/lib/entity_class/group_entity.class.dart b/lib/entity_class/group_entity.class.dart new file mode 100644 index 0000000..d82fe84 --- /dev/null +++ b/lib/entity_class/group_entity.class.dart @@ -0,0 +1,43 @@ +part of '../main.dart'; + +class GroupEntity extends Entity { + GroupEntity(Map rawData) : super(rawData); + + final List _domainsForSwitchableGroup = ["switch", "light", "automation", "input_boolean"]; + String mutualDomain; + bool switchable = false; + + @override + Widget _buildStatePart(BuildContext context) { + if (switchable) { + return SwitchStateWidget( + domainForService: "homeassistant", + ); + } else { + return super._buildStatePart(context); + } + } + + @override + void update(Map rawData) { + super.update(rawData); + if (_isOneDomain()) { + mutualDomain = attributes['entity_id'][0].split(".")[0]; + switchable = _domainsForSwitchableGroup.contains(mutualDomain); + } + } + + bool _isOneDomain() { + bool result = false; + if (attributes['entity_id'] != null && attributes['entity_id'] is List && attributes['entity_id'].isNotEmpty) { + String firstChildDomain = attributes['entity_id'][0].split(".")[0]; + result = true; + attributes['entity_id'].forEach((childEntityId){ + if (childEntityId.split(".")[0] != firstChildDomain) { + result = false; + } + }); + } + return result; + } +} \ No newline at end of file diff --git a/lib/entity_collection.class.dart b/lib/entity_collection.class.dart index 6154f2a..a09d293 100644 --- a/lib/entity_collection.class.dart +++ b/lib/entity_collection.class.dart @@ -55,6 +55,9 @@ class EntityCollection { case "light": { return LightEntity(rawEntityData); } + case "group": { + return GroupEntity(rawEntityData); + } case "script": case "scene": { return ButtonEntity(rawEntityData); diff --git a/lib/entity_widgets/state/switch_state.dart b/lib/entity_widgets/state/switch_state.dart index cb40957..db18948 100644 --- a/lib/entity_widgets/state/switch_state.dart +++ b/lib/entity_widgets/state/switch_state.dart @@ -1,6 +1,11 @@ part of '../../main.dart'; class SwitchStateWidget extends StatefulWidget { + + final String domainForService; + + const SwitchStateWidget({Key key, this.domainForService}) : super(key: key); + @override _SwitchStateWidgetState createState() => _SwitchStateWidgetState(); } @@ -27,8 +32,14 @@ class _SwitchStateWidgetState extends State { //TheLogger.debug("Timer@!!"); }); }); + String domain; + if (widget.domainForService != null) { + domain = widget.domainForService; + } else { + domain = entity.domain; + } eventBus.fire(new ServiceCallEvent( - entity.domain, (newValue as bool) ? "turn_on" : "turn_off", entity.entityId, null)); + domain, (newValue as bool) ? "turn_on" : "turn_off", entity.entityId, null)); } @override diff --git a/lib/main.dart b/lib/main.dart index 5f694a0..7d558f4 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -30,6 +30,7 @@ part 'entity_class/other_entity.class.dart'; part 'entity_class/slider_entity.dart'; part 'entity_class/media_player_entity.class.dart'; part 'entity_class/lock_entity.class.dart'; +part 'entity_class/group_entity.class.dart'; part 'entity_widgets/common/badge.dart'; part 'entity_widgets/model_widgets.dart'; part 'entity_widgets/default_entity_container.dart';