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