From 7104cbf0e9791164222449fa87b60b67adc0d933 Mon Sep 17 00:00:00 2001 From: Edward Firmo Date: Mon, 10 Jul 2023 13:55:55 +0200 Subject: [PATCH] Services back to the Blueprint Moving service calls back to the blueprint as latest HA requires user's permissions to call HA services from ESPHome. This still have to be used for Alarm calls due to security concerns. --- nspanel_blueprint.yaml | 76 +++++++++++++++++++++++- nspanel_esphome.yaml | 128 ++++++++++++++++++++++------------------- 2 files changed, 143 insertions(+), 61 deletions(-) diff --git a/nspanel_blueprint.yaml b/nspanel_blueprint.yaml index e060d26..7b74f4b 100644 --- a/nspanel_blueprint.yaml +++ b/nspanel_blueprint.yaml @@ -533,6 +533,25 @@ blueprint: default: [128, 128, 128] #33808 Grey light selector: *color-selector + ##### Alarm Control Panel - Page Alarm + ##### PLACEHOLDER ###################################################################### + placeholder17: + name: ' ' + description: '# ✅ ALARM CONTROL PANEL ✅' + default: ' ' + selector: *placeholder-selector + ##### PLACEHOLDER ###################################################################### + alarm: + name: Alarm Control Panel to control from Home page - ENTITY (Optional) + description: > + *ALARM page* + + *If an entity is selected, the **"Alarm page"** is activated and enabled. + default: [] + selector: + entity: + domain: alarm_control_panel + ##### Climate - Page Climate ##### ##### PLACEHOLDER ###################################################################### placeholder04: @@ -5402,6 +5421,13 @@ trigger: device_id: !input 'nspanel_name' id: page_changed + ##### NSPanel service call ##### + - platform: event + event_type: esphome.nspanel_service_call + event_data: + device_id: !input 'nspanel_name' + id: service_call + ##### NSPanel event changed ##### - platform: event event_type: state_changed @@ -5831,6 +5857,14 @@ trigger: entity_id: '{{ relay02_entity }}' id: relay02_state + ##### Trigger - Alarm Control Panel - State change ################################################################################################################# + ##### Alarm - Trigger 'alarm_state' ##### + - platform: event + event_type: state_changed + event_data: + entity_id: !input 'alarm' + id: alarm_state + ##### Trigger - Climate - State change ################################################################################################################# ##### Climate - Trigger 'climate_state' ##### - platform: event @@ -6197,14 +6231,37 @@ action: cmd: "page {{ wakeup_page }}" continue_on_error: true + ##### Service call ##### + - alias: NSPanel service call + conditions: + - condition: trigger + id: service_call + - '{{ trigger.event.data.service is defined and trigger.event.data.service is string and trigger.event.data.service | length > 0 }}' + - '{{ trigger.event.data.entity is defined and trigger.event.data.entity is string and trigger.event.data.entity | length > 0 }}' + sequence: + - &variable_nspanel_event + variables: + nspanel_event: '{{ trigger.event.data }}' + - if: '{{ nspanel_event.key is defined and nspanel_event.key is string and nspanel_event.key | length > 0 }}' + then: + - service: '{{ nspanel_event.service }}' + data: { "{{ nspanel_event.key }}": "{{ nspanel_event.value }}" } + target: + entity_id: '{{ nspanel_event.entity }}' + continue_on_error: true + else: + - service: '{{ nspanel_event.service }}' + target: + entity_id: '{{ nspanel_event.entity }}' + continue_on_error: true + ##### Page changed ##### - alias: Page changed conditions: - condition: trigger id: page_changed sequence: - - variables: - nspanel_event: '{{ trigger.event.data }}' + - *variable_nspanel_event - choose: ## PAGE HOME ## - alias: Home page @@ -8729,6 +8786,21 @@ action: - *climate-update_slider - *climate-update_buttons + ##### Sync Alarm ##### + - alias: Alarm - Sync + conditions: + - condition: trigger + id: alarm_state + - '{{ trigger.event.data.new_state.state not in ["unavailable", "unknown", "", None] }}' + - '{{ nspanel_event.page == page.alarm }}' + sequence: + - variables: + alarm_entity: '{{ trigger.event.data.entity_id }}' + supported_features: '{{ state_attr(alarm_entity, "supported_features") }}' + code_arm_required: '{{ state_attr(alarm_entity, "code_arm_required") }}' + - *climate-update_slider #DEBUG + - *climate-update_buttons #DEBUG + ########## TRIGGER - HOME PAGE ########### ##### HOME PAGE - Values ##### diff --git a/nspanel_esphome.yaml b/nspanel_esphome.yaml index a710590..3e6b217 100644 --- a/nspanel_esphome.yaml +++ b/nspanel_esphome.yaml @@ -900,6 +900,7 @@ text_sensor: std::string value = doc["value"]; std::string entity = doc["entity"]; int embedded = doc["embedded"]; + std::string service = ""; if (${verbose_log}) { ESP_LOGD("text_sensor.localevent", "domain=%s", domain.c_str()); @@ -909,7 +910,7 @@ text_sensor: ESP_LOGD("text_sensor.localevent", "embedded=%i", embedded); } id(is_embedded_thermostat_visible) = (domain == "climate" and embedded == 1); - if (id(is_embedded_thermostat_visible) and (not ${embedded_thermostat_disabled})) + if (id(is_embedded_thermostat_visible)) { if (${verbose_log}) ESP_LOGD("text_sensor.localevent", "Embedded thermostat is visible"); auto call = id(thermostat_embedded).make_call(); @@ -927,68 +928,77 @@ text_sensor: } else if (entity != "" and not entity.empty() and entity != "embedded_climate") { - HomeassistantServiceResponse resp; - HomeassistantServiceMap resp_kv; - if (domain == "climate") + if (domain == "alarm_control_panel") { - if (${verbose_log}) ESP_LOGD("text_sensor.localevent", "HA controlled climate"); - if (key == "set_temperature") - { - resp.service = "climate.set_temperature"; - resp_kv.key = "temperature"; - resp_kv.value = to_string(stof(value) / 10); - if (${verbose_log}) - { - ESP_LOGD("text_sensor.localevent", "resp.service=%s", resp.service.c_str()); - ESP_LOGD("text_sensor.localevent", "resp_kv.key=%s", resp_kv.key.c_str()); - ESP_LOGD("text_sensor.localevent", "resp_kv.value=%s", resp_kv.value.c_str()); - } - resp.data.push_back(resp_kv); - } - else if (key == "hvac_mode") - { - resp.service = "climate.set_hvac_mode"; - resp_kv.key = "hvac_mode"; - resp_kv.value = value; - resp.data.push_back(resp_kv); - } - } - else if (domain == "cover") - { - if (key == "position") - { - resp.service = "cover.set_cover_position"; - resp_kv.key = key; - resp_kv.value = value; - resp.data.push_back(resp_kv); - } - else resp.service = std::string("cover.") + key.c_str(); - } - else if (domain == "fan") - { - if (key == "stop") - { - resp.service = "fan.turn_off"; - } - else - { - resp.service = "fan.turn_on"; - resp_kv.key = key; - resp_kv.value = value; - resp.data.push_back(resp_kv); - } - } - else if (domain == "light") - { - resp.service = "light.turn_on"; - resp_kv.key = key; + if (${verbose_log}) ESP_LOGD("text_sensor.localevent", "ESPHome remote service call - Alarm control panel"); + HomeassistantServiceResponse resp; + HomeassistantServiceMap resp_kv; + resp.service = "alarm_control_panel.XXXX"; // DEBUG + resp_kv.key = "entity_id"; + resp_kv.value = entity; + resp.data.push_back(resp_kv); + resp_kv.key = "pin"; // DEBUG resp_kv.value = value; resp.data.push_back(resp_kv); + id(api_server).send_homeassistant_service_call(resp); + } + else + { + if (${verbose_log}) ESP_LOGD("text_sensor.localevent", "Blueprint controlled service"); + auto ha_event = new esphome::api::CustomAPIDevice(); + if (domain == "climate") + { + + if (key == "set_temperature") + { + service = "climate.set_temperature"; + value = to_string(stof(value) / 10); + } + else if (key == "hvac_mode") + { + service = "climate.set_hvac_mode"; + } + } + else if (domain == "cover") + { + if (key == "position") + { + service = "cover.set_cover_position"; + } + else + { + service = std::string("cover.") + key.c_str(); + key = ""; + value = ""; + } + } + else if (domain == "fan") + { + if (key == "stop") + { + service = "fan.turn_off"; + key = ""; + value = ""; + } + else + { + service = "fan.turn_on"; + } + } + else if (domain == "light") + { + service = "light.turn_on"; + } + if (${verbose_log}) ESP_LOGD("text_sensor.localevent", "Service=%s", service.c_str()); + if (service != "" and not service.empty()) + ha_event->fire_homeassistant_event("esphome.nspanel_service_call", + { + {"service", service}, + {"entity", entity}, + {"key", key}, + {"value", value} + }); } - resp_kv.key = "entity_id"; - resp_kv.value = entity; - resp.data.push_back(resp_kv); - id(api_server).send_homeassistant_service_call(resp); } ##### touchevent sensor, Reset the page timeout #####