From ab67b557ca198e84697e17717cae1b3b9c444a9a Mon Sep 17 00:00:00 2001 From: Yegor Vialov Date: Fri, 16 Nov 2018 23:35:08 +0200 Subject: [PATCH] Resolves #183 Service call support for glance card --- lib/entity_class/entity_wrapper.class.dart | 6 ++- lib/entity_widgets/entity_icon.dart | 31 ++++++++++++-- lib/home_assistant.class.dart | 50 ++++++++++++++++------ 3 files changed, 71 insertions(+), 16 deletions(-) diff --git a/lib/entity_class/entity_wrapper.class.dart b/lib/entity_class/entity_wrapper.class.dart index a7b9793..89a1f63 100644 --- a/lib/entity_class/entity_wrapper.class.dart +++ b/lib/entity_class/entity_wrapper.class.dart @@ -6,6 +6,8 @@ class EntityWrapper { String icon; String tapAction; String holdAction; + String actionService; + Map actionServiceData; Entity entity; @@ -14,7 +16,9 @@ class EntityWrapper { String icon, String displayName, this.tapAction: EntityTapAction.moreInfo, - this.holdAction + this.holdAction, + this.actionService, + this.actionServiceData }) { this.icon = icon ?? entity.icon; this.displayName = displayName ?? entity.displayName; diff --git a/lib/entity_widgets/entity_icon.dart b/lib/entity_widgets/entity_icon.dart index f37f1f1..54b7969 100644 --- a/lib/entity_widgets/entity_icon.dart +++ b/lib/entity_widgets/entity_icon.dart @@ -20,19 +20,44 @@ class EntityIcon extends StatelessWidget { EntityColor.stateColor(entityModel.entityWrapper.entity.state) ), ), - onTap: () { + onLongPress: () { if (entityModel.handleTap) { - switch (entityModel.entityWrapper.tapAction) { - case EntityTapAction.moreInfo: { + switch (entityModel.entityWrapper.holdAction) { + case EntityTapAction.toggle: { + eventBus.fire( + ServiceCallEvent("homeassistant", "toggle", entityModel.entityWrapper.entity.entityId, null)); + break; + } + + default: { eventBus.fire( new ShowEntityPageEvent(entityModel.entityWrapper.entity)); break; } + } + + } + }, + onTap: () { + if (entityModel.handleTap) { + switch (entityModel.entityWrapper.tapAction) { case EntityTapAction.toggle: { eventBus.fire( ServiceCallEvent("homeassistant", "toggle", entityModel.entityWrapper.entity.entityId, null)); break; } + + case EntityTapAction.callService: { + eventBus.fire( + ServiceCallEvent(entityModel.entityWrapper.actionService.split(".")[0], entityModel.entityWrapper.actionService.split(".")[1], null, entityModel.entityWrapper.actionServiceData)); + break; + } + + default: { + eventBus.fire( + new ShowEntityPageEvent(entityModel.entityWrapper.entity)); + break; + } } } diff --git a/lib/home_assistant.class.dart b/lib/home_assistant.class.dart index 1cc54ce..8506601 100644 --- a/lib/home_assistant.class.dart +++ b/lib/home_assistant.class.dart @@ -327,17 +327,40 @@ class HomeAssistant { Future callService(String domain, String service, String entityId, Map additionalParams) { _incrementMessageId(); - String message = '{"id": $_currentMessageId, "type": "call_service", "domain": "$domain", "service": "$service", "service_data": {"entity_id": "$entityId"'; - if (additionalParams != null) { - additionalParams.forEach((name, value){ - if ((value is double) || (value is int) || (value is List)) { - message += ', "$name" : $value'; - } else { - message += ', "$name" : "$value"'; - } - }); + String message = ""; + if (entityId != null) { + message = '{"id": $_currentMessageId, "type": "call_service", "domain": "$domain", "service": "$service", "service_data": {"entity_id": "$entityId"'; + if (additionalParams != null) { + additionalParams.forEach((name, value) { + if ((value is double) || (value is int) || (value is List)) { + message += ', "$name" : $value'; + } else { + message += ', "$name" : "$value"'; + } + }); + } + message += '}}'; + } else { + message = '{"id": $_currentMessageId, "type": "call_service", "domain": "$domain", "service": "$service"'; + if (additionalParams != null && additionalParams.isNotEmpty) { + message += ', "service_data": {'; + bool first = true; + additionalParams.forEach((name, value) { + if (!first) { + message += ', '; + } + if ((value is double) || (value is int) || (value is List)) { + message += '"$name" : $value'; + } else { + message += '"$name" : "$value"'; + } + first = false; + }); + + message += '}'; + } + message += '}'; } - message += '}}'; return _sendMessageRaw(message, true); } @@ -423,13 +446,16 @@ class HomeAssistant { } } else { if (entities.isExist(rawEntity["entity"])) { + Entity e = entities.get(rawEntity["entity"]); card.entities.add( EntityWrapper( - entity: entities.get(rawEntity["entity"]), + entity: e, displayName: rawEntity["name"], icon: rawEntity["icon"], tapAction: rawEntity["tap_action"] ?? EntityTapAction.moreInfo, - holdAction: rawEntity["hold_action"] ?? EntityTapAction.moreInfo + holdAction: rawEntity["hold_action"] ?? EntityTapAction.moreInfo, + actionService: rawEntity["service"], + actionServiceData: rawEntity["service_data"] ?? {"entity_id": e.entityId} ) ); }