diff --git a/nspanel_blueprint.yaml b/nspanel_blueprint.yaml index 8748b70..3dc39b4 100644 --- a/nspanel_blueprint.yaml +++ b/nspanel_blueprint.yaml @@ -6531,6 +6531,18 @@ action: target: entity_id: '{{ nspanel_event.entity }}' continue_on_error: true + - delay: + milliseconds: 500 + - service: homeassistant.update_entity + data: + entity_id: '{{ nspanel_event.entity }}' + continue_on_error: true + - delay: + milliseconds: 1500 + - service: homeassistant.update_entity + data: + entity_id: '{{ nspanel_event.entity }}' + continue_on_error: true ##### Page changed ##### - alias: Page changed @@ -7603,6 +7615,13 @@ action: sequence: &refresh_page_media_player - variables: media_player_entity: '{{ nspanel_event.entity if nspanel_event is defined and nspanel_event.entity is defined else trigger.entity_id }}' + - service: homeassistant.update_entity + data: + entity_id: '{{ nspanel_event.entity }}' + continue_on_error: true + - delay: + milliseconds: 500 + - variables: media_player: state: '{{ states(media_player_entity) }}' is_volume_muted: '{{ state_attr(media_player_entity, "is_volume_muted") | default(false) }}' @@ -7648,20 +7667,25 @@ action: page_title: '{{ media_player.friendly_name }}' track: '{{ media_player.media_title }}' artist: '{{ media_player.media_artist }}' - bt_on_off: '{{ media_player.supported_features | bitwise_and(feature.TURN_ON) > 0 }}' # DEBUG + bt_on_off: '{{ media_player.supported_features | bitwise_and(feature.TURN_ON) > 0 }}' bt_prev: '{{ media_player.supported_features | bitwise_and(feature.PREVIOUS_TRACK) > 0 }}' - bt_play_pause: 1 #DEBUG + bt_play_pause: '{{ 2 if media_player.state == "playing" else (1 if media_player.state == "paused" else 0)}}' bt_stop: '{{ media_player.supported_features | bitwise_and(feature.STOP) > 0 }}' bt_next: '{{ media_player.supported_features | bitwise_and(feature.NEXT_TRACK) > 0 }}' time_current: '{{ media_player.media_position }}' time_total: '{{ media_player.media_duration }}' time_progress: '{{ 0 if media_player.media_duration <= 0 else (100*media_player.media_position/media_player.media_duration) | round(0, default=0) }}' volume: '{{ media_player.volume_level }}' - bt_mute: 1 #DEBUG + bt_mute: '{{ 1 if media_player.is_volume_muted else 2 }}' bt_vol_down: '{{ media_player.supported_features | bitwise_and(feature.VOLUME_SET) > 0 }}' bt_vol_up: '{{ media_player.supported_features | bitwise_and(feature.VOLUME_SET) > 0 }}' continue_on_error: true - - *delay-default + - delay: + milliseconds: 500 + - service: homeassistant.update_entity + data: + entity_id: '{{ nspanel_event.entity }}' + continue_on_error: true ## PAGE ALARM ## - alias: Alarm settings page @@ -8527,7 +8551,14 @@ action: data: entity_id: '{{ button_context.entity }}' continue_on_error: true - - *delay-default + - delay: + milliseconds: 500 + - service: homeassistant.update_entity + data: + entity_id: '{{ button_context.entity }}' + continue_on_error: true + - delay: + milliseconds: 1500 - service: homeassistant.update_entity data: entity_id: '{{ button_context.entity }}' @@ -8597,7 +8628,14 @@ action: data: entity_id: '{{ last_click_button.entity }}' continue_on_error: true - - *delay-default + - delay: + milliseconds: 500 + - service: homeassistant.update_entity + data: + entity_id: '{{ last_click_button.entity }}' + continue_on_error: true + - delay: + milliseconds: 1500 - service: homeassistant.update_entity data: entity_id: '{{ last_click_button.entity }}' @@ -8637,43 +8675,6 @@ action: - '{{ entity_domain not in ["unknown", "person", "binary_sensor", "sensor"] }}' sequence: - *service-button_changed - - alias: Media player page - conditions: - - '{{ nspanel_event.page == page.media_player }}' - sequence: - - if: '{{ nspanel_event.component == "bt_mute" }}' - then: - - service: media_player.volume_mute - data: - is_volume_muted: '{{ not state_attr(media_player_entity, "is_volume_muted") | default(false) }}' - target: - entity_id: '{{ nspanel_envent.entity }}' - continue_on_error: true - else: - - service: > - {% if nspanel_event.component == "bt_on_off" %} - media_player.toggle - {% elif nspanel_event.component == "bt_play_pause" %} - media_player.media_play_pause - {% elif nspanel_event.component == "bt_stop" %} - media_player.media_stop - {% elif nspanel_event.component == "bt_prev" %} - media_player.media_previous_track - {% elif nspanel_event.component == "bt_next" %} - media_player.media_next_track - {% elif nspanel_event.component == "bt_vol_down" %} - media_player.volume_down - {% elif nspanel_event.component == "bt_vol_up" %} - media_player.volume_up - {% endif %} - target: - entity_id: '{{ nspanel_envent.entity }}' - continue_on_error: true - - *delay-default - - service: homeassistant.update_entity - data: - entity_id: '{{ nspanel_envent.entity }}' - continue_on_error: true ##### Versions mismatch ##### - alias: Versions @@ -8891,7 +8892,6 @@ action: conditions: - '{{ page.current in page.buttonpages }}' - '{{ page.current in [page.light, page.cover, page.climate, page.fan, page.alarm] }}' - sequence: - choose: - alias: "Button pages" @@ -8930,6 +8930,11 @@ action: - '{{ page.current == page.fan }}' - '{{ trigger.entity_id is match "fan." }}' sequence: *refresh_page_fan + - alias: 'Media player page' + conditions: + - '{{ page.current == page.media_player }}' + - '{{ trigger.entity_id is match "media_player." }}' + sequence: *refresh_page_media_player #- alias: 'Alarm page' # conditions: # - '{{ page.current == page.alarm }}' diff --git a/nspanel_esphome.yaml b/nspanel_esphome.yaml index e6438aa..ea90ab6 100644 --- a/nspanel_esphome.yaml +++ b/nspanel_esphome.yaml @@ -378,7 +378,7 @@ api: } else if (id(current_page).state == "screensaver") id(disp1).send_command_printf("page %s", id(wakeup_page_name).state.c_str()); id(disp1).send_command_printf("dim=brightness"); - if (reset_timer) id(page_timer)->execute(int(id(page_timeout).state)); + if (reset_timer) id(page_timer)->execute(); #### Service to set the entities #### - service: set_entity @@ -495,7 +495,7 @@ api: - text_sensor.state: # Is boot page visible? id: current_page state: 'boot' - timeout: 5s + timeout: 2s - if: condition: - text_sensor.state: # Avoid this being called twice by multiple boot triggers @@ -983,7 +983,16 @@ sensor: on_value: then: - lambda: |- - id(page_timer)->execute(int(id(page_timeout).state)); + id(page_timer)->execute(); + + ##### Send current brightness info to Home Assistant + - name: ${device_name} Brightness + id: brightness + platform: nextion + variable_name: dim + #update_interval: 1s + internal: false + precision: 0 ##### Uptime Sensors ##### - name: ${device_name} Uptime seconds @@ -1124,7 +1133,7 @@ text_sensor: then: - lambda: |- ESP_LOGV("text_sensor.nspanelevent", "Starting"); - id(page_timer)->execute(int(id(page_timeout).state)); + id(page_timer)->execute(); DynamicJsonDocument doc(1024); deserializeJson(doc, x); std::string page = doc["page"]; @@ -1262,7 +1271,7 @@ text_sensor: then: - lambda: |- ESP_LOGV("text_sensor.localevent", "Starting"); - id(page_timer)->execute(int(id(page_timeout).state)); + id(page_timer)->execute(); DynamicJsonDocument doc(1024); deserializeJson(doc, x); std::string page = doc["page"]; @@ -1300,7 +1309,7 @@ text_sensor: ESP_LOGV("text_sensor.localevent", "Construct new page"); } else if (event=="short_click" or event=="long_click") id(ha_button)->execute(page.c_str(), component.c_str(), event.c_str()); - else if (page == "light" or page == "climate" or page == "notification")// Generic event + else if (page == "light" or page == "climate" or page == "notification" or page == "media_player")// Generic event { ha_event->fire_homeassistant_event("esphome.nspanel_ha_blueprint", { @@ -1390,6 +1399,12 @@ text_sensor: id(disp1).send_command_printf("page %s", base_domain.c_str()); } else if (page == "light") id(ha_call_service)->execute("light.turn_on", key.c_str(), value.c_str(), entity.c_str()); + else if (page == "media_player") + { + if (key == "volume_mute") id(ha_call_service)->execute("media_player.volume_mute", "is_volume_muted", value.c_str(), entity.c_str()); + else if (key == "volume_set") id(ha_call_service)->execute("media_player.volume_set", "volume_level", to_string(stof(value) / 100), entity.c_str()); + else id(ha_call_service)->execute((std::string("media_player.") + key.c_str()), "", "", entity.c_str()); + } ESP_LOGV("text_sensor.localevent", "Finished"); @@ -1574,12 +1589,24 @@ number: ##### page-timeout ##### - platform: template - name: ${device_name} Page Timeout + name: ${device_name} Page timeout id: page_timeout entity_category: config min_value: 0 max_value: 60 - initial_value: 10 + initial_value: 5 + step: 1 + restore_value: true + optimistic: true + + ##### dimming-timeout ##### + - platform: template + name: ${device_name} Dimming timeout + id: dimming_timeout + entity_category: config + min_value: 0 + max_value: 60 + initial_value: 15 step: 1 restore_value: true optimistic: true @@ -1643,10 +1670,14 @@ display: then: *sleep_mode-turn_off else: *sleep_mode-turn_on - lambda: |- + // Set dimming values id(display_brightness).publish_state(id(display_brightness_global)); id(display_dim_brightness).publish_state(id(display_dim_brightness_global)); + id(disp1).send_command_printf("brightness=%i", id(display_brightness_global)); id(disp1).send_command_printf("settings.brightslider.val=%i", id(display_brightness_global)); + id(disp1).send_command_printf("brightness_dim=%i", id(display_dim_brightness_global)); id(disp1).send_command_printf("settings.dimslider.val=%i", id(display_dim_brightness_global)); + id(nextion_init).publish_state(true); auto ha_event = new esphome::api::CustomAPIDevice(); ha_event->fire_homeassistant_event("esphome.nspanel_ha_blueprint", @@ -1664,11 +1695,9 @@ display: script: - id: page_timer mode: restart - parameters: - delay: int then: - - lambda: ESP_LOGV("script.page_timer", "start page-timer delay %i", int(id(page_timeout).state)); - - delay: !lambda return delay *1000; + - lambda: ESP_LOGV("script.page_timer", "start page-timer delay %i", delay); + - delay: !lambda return int(id(page_timeout).state *1000); - lambda: |- if (id(current_page).state == "home" or id(current_page).state == "screensaver" or id(current_page).state == "boot" or int(id(page_timeout).state) == 0) ESP_LOGD("script.page_timer", "no page-jump"); diff --git a/nspanel_eu.HMI b/nspanel_eu.HMI index 7aa2763..5db184d 100644 Binary files a/nspanel_eu.HMI and b/nspanel_eu.HMI differ diff --git a/nspanel_eu.tft b/nspanel_eu.tft index d5861b8..b64f172 100644 Binary files a/nspanel_eu.tft and b/nspanel_eu.tft differ diff --git a/nspanel_eu_code/Program.s.txt b/nspanel_eu_code/Program.s.txt index 66022c1..627811f 100644 --- a/nspanel_eu_code/Program.s.txt +++ b/nspanel_eu_code/Program.s.txt @@ -4,6 +4,7 @@ Program.s int r=0,g=0,b=0 int h=0,s=0,v=0 int p=0,q=0,t=0,f=0 + int dimdelta=0 int api=0 // 0 = disconnected from HA, 1 = connected to HA int sleep_mode=0 int is_alarm=0,is_entities=0,is_qrcode=0,is_notification=0 diff --git a/nspanel_eu_code/alarm.txt b/nspanel_eu_code/alarm.txt index e4c8112..e931c94 100644 --- a/nspanel_eu_code/alarm.txt +++ b/nspanel_eu_code/alarm.txt @@ -12,7 +12,6 @@ Page alarm Events Preinitialize Event - dim=brightness if(api==0) { page home @@ -436,3 +435,26 @@ Hotspot bt_disarm printh 00 printh FF FF FF +Timer wakeup_timer + Attributes + ID : 33 + Scope : local + Period (ms): 100 + Enabled : yes + + Events + Timer Event + if(dim0) + { + vol_slider.val-- + covx vol_slider.val,va0.txt,0,0 + vol_text.txt=va0.txt+"%" + timer0.en=1 + } printh 92 prints "localevent",0 printh 00 @@ -124,7 +142,13 @@ Text bt_vol_up Events Touch Release Event - lastclick.txt="{\"page\": \"media_player\", \"event\": \"short_click\", \"component\": \"bt_vol_up\", \"entity\": \""+entity.txt+"\"}" + if(vol_slider.val<100) + { + vol_slider.val++ + covx vol_slider.val,va0.txt,0,0 + vol_text.txt=va0.txt+"%" + timer0.en=1 + } printh 92 prints "localevent",0 printh 00 @@ -144,7 +168,14 @@ Text bt_mute Events Touch Release Event - lastclick.txt="{\"page\": \"media_player\", \"event\": \"short_click\", \"component\": \"bt_mute\", \"entity\": \""+entity.txt+"\"}" + if(is_muted.val==1) + { + va0.txt="true" + }else + { + va0.txt="false" + } + lastclick.txt="{\"page\": \"media_player\", \"key\": \"volume_mute\", \"value\": \""+va0.txt+"\", \"entity\": \""+entity.txt+"\"}" printh 92 prints "localevent",0 printh 00 @@ -204,7 +235,7 @@ Text bt_prev Events Touch Release Event - lastclick.txt="{\"page\": \"media_player\", \"event\": \"short_click\", \"component\": \"bt_prev\", \"entity\": \""+entity.txt+"\"}" + lastclick.txt="{\"page\": \"media_player\", \"key\": \"media_previous_track\", \"value\": \"\", \"entity\": \""+entity.txt+"\"}" printh 92 prints "localevent",0 printh 00 @@ -224,7 +255,7 @@ Text bt_play_pause Events Touch Release Event - lastclick.txt="{\"page\": \"media_player\", \"event\": \"short_click\", \"component\": \"bt_play_pause\", \"entity\": \""+entity.txt+"\"}" + lastclick.txt="{\"page\": \"media_player\", \"key\": \"media_play_pause\", \"value\": \"\", \"entity\": \""+entity.txt+"\"}" printh 92 prints "localevent",0 printh 00 @@ -244,7 +275,7 @@ Text bt_stop Events Touch Release Event - lastclick.txt="{\"page\": \"media_player\", \"event\": \"short_click\", \"component\": \"bt_stop\", \"entity\": \""+entity.txt+"\"}" + lastclick.txt="{\"page\": \"media_player\", \"key\": \"media_stop\", \"value\": \"\", \"entity\": \""+entity.txt+"\"}" printh 92 prints "localevent",0 printh 00 @@ -264,7 +295,7 @@ Text bt_next Events Touch Release Event - lastclick.txt="{\"page\": \"media_player\", \"event\": \"short_click\", \"component\": \"bt_next\", \"entity\": \""+entity.txt+"\"}" + lastclick.txt="{\"page\": \"media_player\", \"key\": \"media_next_track\", \"value\": \"\", \"entity\": \""+entity.txt+"\"}" printh 92 prints "localevent",0 printh 00 @@ -284,7 +315,7 @@ Text bt_on_off Events Touch Release Event - lastclick.txt="{\"page\": \"media_player\", \"event\": \"short_click\", \"component\": \"bt_on_off\", \"entity\": \""+entity.txt+"\"}" + lastclick.txt="{\"page\": \"media_player\", \"key\": \"toggle\", \"value\": \"\", \"entity\": \""+entity.txt+"\"}" printh 92 prints "localevent",0 printh 00 @@ -312,6 +343,9 @@ Slider vol_slider Events Touch Release Event + covx vol_slider.val,va0.txt,0,0 + vol_text.txt=va0.txt+"%" + timer0.en=1 printh 91 prints "touchevent",0 printh 00 @@ -347,3 +381,46 @@ Button button_back page home } +Timer wakeup_timer + Attributes + ID : 22 + Scope : local + Period (ms): 100 + Enabled : yes + + Events + Timer Event + if(dim0) + { + vol_slider.val-- + covx vol_slider.val,va0.txt,0,0 + vol_text.txt=va0.txt+"%" + timer0.en=1 + } printh 92 prints "localevent",0 printh 00 @@ -136,7 +142,13 @@ Text bt_vol_up Events Touch Release Event - lastclick.txt="{\"page\": \"media_player\", \"event\": \"short_click\", \"component\": \"bt_vol_up\", \"entity\": \""+entity.txt+"\"}" + if(vol_slider.val<100) + { + vol_slider.val++ + covx vol_slider.val,va0.txt,0,0 + vol_text.txt=va0.txt+"%" + timer0.en=1 + } printh 92 prints "localevent",0 printh 00 @@ -156,7 +168,14 @@ Text bt_mute Events Touch Release Event - lastclick.txt="{\"page\": \"media_player\", \"event\": \"short_click\", \"component\": \"bt_mute\", \"entity\": \""+entity.txt+"\"}" + if(is_muted.val==1) + { + va0.txt="true" + }else + { + va0.txt="false" + } + lastclick.txt="{\"page\": \"media_player\", \"key\": \"volume_mute\", \"value\": \""+va0.txt+"\", \"entity\": \""+entity.txt+"\"}" printh 92 prints "localevent",0 printh 00 @@ -216,7 +235,7 @@ Text bt_prev Events Touch Release Event - lastclick.txt="{\"page\": \"media_player\", \"event\": \"short_click\", \"component\": \"bt_prev\", \"entity\": \""+entity.txt+"\"}" + lastclick.txt="{\"page\": \"media_player\", \"key\": \"media_previous_track\", \"value\": \"\", \"entity\": \""+entity.txt+"\"}" printh 92 prints "localevent",0 printh 00 @@ -236,7 +255,7 @@ Text bt_play_pause Events Touch Release Event - lastclick.txt="{\"page\": \"media_player\", \"event\": \"short_click\", \"component\": \"bt_play_pause\", \"entity\": \""+entity.txt+"\"}" + lastclick.txt="{\"page\": \"media_player\", \"key\": \"media_play_pause\", \"value\": \"\", \"entity\": \""+entity.txt+"\"}" printh 92 prints "localevent",0 printh 00 @@ -256,7 +275,7 @@ Text bt_stop Events Touch Release Event - lastclick.txt="{\"page\": \"media_player\", \"event\": \"short_click\", \"component\": \"bt_stop\", \"entity\": \""+entity.txt+"\"}" + lastclick.txt="{\"page\": \"media_player\", \"key\": \"media_stop\", \"value\": \"\", \"entity\": \""+entity.txt+"\"}" printh 92 prints "localevent",0 printh 00 @@ -276,7 +295,7 @@ Text bt_next Events Touch Release Event - lastclick.txt="{\"page\": \"media_player\", \"event\": \"short_click\", \"component\": \"bt_next\", \"entity\": \""+entity.txt+"\"}" + lastclick.txt="{\"page\": \"media_player\", \"key\": \"media_next_track\", \"value\": \"\", \"entity\": \""+entity.txt+"\"}" printh 92 prints "localevent",0 printh 00 @@ -296,7 +315,7 @@ Text bt_on_off Events Touch Release Event - lastclick.txt="{\"page\": \"media_player\", \"event\": \"short_click\", \"component\": \"bt_on_off\", \"entity\": \""+entity.txt+"\"}" + lastclick.txt="{\"page\": \"media_player\", \"key\": \"toggle\", \"value\": \"\", \"entity\": \""+entity.txt+"\"}" printh 92 prints "localevent",0 printh 00 @@ -324,6 +343,9 @@ Slider vol_slider Events Touch Release Event + covx vol_slider.val,va0.txt,0,0 + vol_text.txt=va0.txt+"%" + timer0.en=1 printh 91 prints "touchevent",0 printh 00 @@ -359,18 +381,46 @@ Button button_back page home } -Timer tm_progress +Timer wakeup_timer Attributes ID : 22 Scope : local + Period (ms): 100 + Enabled : yes + + Events + Timer Event + if(dim0) + { + vol_slider.val++ + covx vol_slider.val,va0.txt,0,0 + vol_text.txt=va0.txt+"%" + timer0.en=1 + } printh 92 prints "localevent",0 printh 00 @@ -124,7 +142,13 @@ Text bt_vol_up Events Touch Release Event - lastclick.txt="{\"page\": \"media_player\", \"event\": \"short_click\", \"component\": \"bt_vol_up\", \"entity\": \""+entity.txt+"\"}" + if(vol_slider.val<100) + { + vol_slider.val-- + covx vol_slider.val,va0.txt,0,0 + vol_text.txt=va0.txt+"%" + timer0.en=1 + } printh 92 prints "localevent",0 printh 00 @@ -144,7 +168,14 @@ Text bt_mute Events Touch Release Event - lastclick.txt="{\"page\": \"media_player\", \"event\": \"short_click\", \"component\": \"bt_mute\", \"entity\": \""+entity.txt+"\"}" + if(is_muted.val==1) + { + va0.txt="true" + }else + { + va0.txt="false" + } + lastclick.txt="{\"page\": \"media_player\", \"key\": \"volume_mute\", \"value\": \""+va0.txt+"\", \"entity\": \""+entity.txt+"\"}" printh 92 prints "localevent",0 printh 00 @@ -204,7 +235,7 @@ Text bt_prev Events Touch Release Event - lastclick.txt="{\"page\": \"media_player\", \"event\": \"short_click\", \"component\": \"bt_prev\", \"entity\": \""+entity.txt+"\"}" + lastclick.txt="{\"page\": \"media_player\", \"key\": \"media_previous_track\", \"value\": \"\", \"entity\": \""+entity.txt+"\"}" printh 92 prints "localevent",0 printh 00 @@ -224,7 +255,7 @@ Text bt_play_pause Events Touch Release Event - lastclick.txt="{\"page\": \"media_player\", \"event\": \"short_click\", \"component\": \"bt_play_pause\", \"entity\": \""+entity.txt+"\"}" + lastclick.txt="{\"page\": \"media_player\", \"key\": \"media_play_pause\", \"value\": \"\", \"entity\": \""+entity.txt+"\"}" printh 92 prints "localevent",0 printh 00 @@ -244,7 +275,7 @@ Text bt_stop Events Touch Release Event - lastclick.txt="{\"page\": \"media_player\", \"event\": \"short_click\", \"component\": \"bt_stop\", \"entity\": \""+entity.txt+"\"}" + lastclick.txt="{\"page\": \"media_player\", \"key\": \"media_stop\", \"value\": \"\", \"entity\": \""+entity.txt+"\"}" printh 92 prints "localevent",0 printh 00 @@ -264,7 +295,7 @@ Text bt_next Events Touch Release Event - lastclick.txt="{\"page\": \"media_player\", \"event\": \"short_click\", \"component\": \"bt_next\", \"entity\": \""+entity.txt+"\"}" + lastclick.txt="{\"page\": \"media_player\", \"key\": \"media_next_track\", \"value\": \"\", \"entity\": \""+entity.txt+"\"}" printh 92 prints "localevent",0 printh 00 @@ -284,7 +315,7 @@ Text bt_on_off Events Touch Release Event - lastclick.txt="{\"page\": \"media_player\", \"event\": \"short_click\", \"component\": \"bt_on_off\", \"entity\": \""+entity.txt+"\"}" + lastclick.txt="{\"page\": \"media_player\", \"key\": \"toggle\", \"value\": \"\", \"entity\": \""+entity.txt+"\"}" printh 92 prints "localevent",0 printh 00 @@ -312,6 +343,9 @@ Slider vol_slider Events Touch Release Event + covx vol_slider.val,va0.txt,0,0 + vol_text.txt=va0.txt+"%" + timer0.en=1 printh 91 prints "touchevent",0 printh 00 @@ -347,3 +381,46 @@ Button button_back page home } +Timer wakeup_timer + Attributes + ID : 22 + Scope : local + Period (ms): 100 + Enabled : yes + + Events + Timer Event + if(dim