HASwitchPlate / openHASP-custom-component

Home Assistant custom component for openHASP
https://www.openhasp.com
MIT License
51 stars 12 forks source link

Plate config file error after update to 0.7.6 custom component #150

Open Taffy9325 opened 2 weeks ago

Taffy9325 commented 2 weeks ago

Version of the custom_component

0.7.6

Configuration


plate1: #Bedroom
  objects:
    - obj: "p0b1" # temperature label on all pages
      properties:
        "text": '{{ states("sensor.bedroom_temperature_temperature_2") }}°C'
    - obj: "p0b6" # time
      properties:
        "text": "{{ states('sensor.time') }}"
    - obj: "p1b2" # light-switch toggle button
      properties:
        "val": '{{ 1 if states("light.bedroom_light") == "on" else 0 }}'
        "text": '{{ "\uE6E8 Light" if is_state("light.bedroom_light", "on") else "\uE335 Light" | e }}'
      event:
        "up":
          - service: homeassistant.toggle
            entity_id: "light.bedroom_light"

    - obj: "p1b5" # toggle button for ON/OFF switching of light I.
      properties:
        "val": '{{ 1 if is_state("light.rhys_shelly_lamp", "on") else 0 }}'
      event:
        "down":
          - service: homeassistant.toggle
            entity_id: "light.rhys_shelly_lamp"

    - obj: "p1b6" # toggle button for ON/OFF switching of light II.
      properties:
        "val": '{{ 1 if is_state("light.jess_shelly_lamp", "on") else 0 }}'
      event:
        "down":
          - service: homeassistant.toggle
            entity_id: "light.jess_shelly_lamp"

    - obj: "p2b20" # arc slider
      properties:
        "val": >
          {% if state_attr('climate.bedroom_thermostat','temperature') is not none %}
          {{ state_attr('climate.bedroom_thermostat','temperature') | int * 10 }}
          {%- endif %}
        "min": >
          {% if state_attr('climate.bedroom_thermostat','min_temp') is not none %}
          {{ state_attr('climate.bedroom_thermostat','min_temp') | int * 10 }}
          {%- endif %}
        "max": >
          {% if state_attr('climate.bedroom_thermostat','max_temp') is not none %}
          {{ state_attr('climate.bedroom_thermostat','max_temp') | int * 10 }}
          {%- endif %}
        "opacity": "{{ 60 if (is_state('climate.bedroom_thermostat','unavailable') or is_state('climate.bedroom_thermostat','unknown')) else 255 }}"
        "click": "{{ 'false' if (is_state('climate.bedroom_thermostat','unavailable') or is_state('climate.bedroom_thermostat','unknown')) else 'true' }}"
        "line_color1": >
          {% if is_state('climate.bedroom_thermostat', 'cool') %}
          {{ "#346beb" }}
          {%-elif is_state('climate.bedroom_thermostat', 'heat_cool') %}
          {{ "#34bdeb" }}
          {%-elif is_state('climate.bedroom_thermostat', 'heat') %}
          {{ "#eb3434" }}
          {%-elif is_state('climate.bedroom_thermostat', 'dry') %}
          {{ "#ebeb34" }}
          {%-elif is_state('climate.bedroom_thermostat', 'fan_only') %}
          {{ "#34eb77" }}
          {%-else %}
          {{ "#9f96b0" }}
          {% endif %}
      event:
        "changed":
          - service: climate.set_temperature
            target:
              entity_id: climate.bedroom_thermostat
            data:
              temperature: "{{ val | int / 10 }}"
        "up":
          - service: climate.set_temperature
            target:
              entity_id: climate.bedroom_thermostat
            data:
              temperature: "{{ val | int / 10 }}"

    - obj: "p2b21" # gauge current temp
      properties:
        "val": >
          {% if not (is_state('sensor.bedroom_temperature_temperature_2','unavailable') or is_state('sensor.bedroom_temperature_temperature_2','unknown')) %}
          {{ states('sensor.bedroom_temperature_temperature_2') | float (default=0) * 10 }}
          {%- endif %}
        "min": >
          {% if state_attr('climate.bedroom_thermostat','min_temp') is not none %}
          {{ state_attr('climate.bedroom_thermostat','min_temp') | int * 10 }}
          {%- endif %}
        "max": >
          {% if state_attr('climate.bedroom_thermostat','max_temp') is not none %}
          {{ state_attr('climate.bedroom_thermostat','max_temp') | int * 10 }}
          {%- endif %}
        "critical_value": >
          {% if state_attr('climate.bedroom_thermostat','max_temp') is not none %}
          {{ state_attr('climate.bedroom_thermostat','max_temp') | int * 10 + 1 }}
          {%- endif %}
        "label_count": >
          {% if state_attr('climate.bedroom_thermostat','max_temp') is not none %}
          {{ state_attr('climate.bedroom_thermostat','max_temp') | int - state_attr('climate.bedroom_thermostat','min_temp') | int + 1 }}
          {%- endif %}
        "line_count": >
          {% if state_attr('climate.bedroom_thermostat','max_temp') is not none %}
          {{ (state_attr('climate.bedroom_thermostat','max_temp') | int - state_attr('climate.bedroom_thermostat','min_temp') | int) * 2 + 1 }}
          {%- endif %}
        "opacity": "{{ 60 if (is_state('climate.bedroom_thermostat','unavailable') or is_state('climate.bedroom_thermostat','unknown')) else 255 }}"

    - obj: "p2b23" # label current temp (and +/- with short/long touch)
      properties:
        "text": >
          {% if (is_state('sensor.bedroom_temperature_temperature_2','unavailable') or is_state('sensor.bedroom_temperature_temperature_2','unknown')) %}
          {{ "--.-" }}
          {%-else %}
          {{ states('sensor.bedroom_temperature_temperature_2') | round(1,default=0) }}
          {%- endif %}
        "click": "{{ 'false' if (is_state('climate.bedroom_thermostat','unavailable') or is_state('climate.bedroom_thermostat','unknown')) else 'true' }}"
        "opacity": "{{ 60 if (is_state('climate.bedroom_thermostat','unavailable') or is_state('climate.bedroom_thermostat','unknown')) else 255 }}"
      event:
        "up":
          - service: climate.set_temperature
            target:
              entity_id: climate.bedroom_thermostat
            data:
              temperature: "{{ state_attr('climate.bedroom_thermostat','temperature') + state_attr('climate.bedroom_thermostat','target_temp_step') | float(default=1)}}"
        "long":
          - service: climate.set_temperature
            target:
              entity_id: climate.bedroom_thermostat
            data:
              temperature: "{{ state_attr('climate.bedroom_thermostat','temperature') - state_attr('climate.bedroom_thermostat','target_temp_step') | float(default=1)}}"

    - obj: "p2b25" # label target temp
      properties:
        "text": >
          {% if state_attr('climate.bedroom_thermostat','temperature') is not none %}
          {{ state_attr('climate.bedroom_thermostat','temperature') }}
          {%- endif %}
        "opacity": "{{ 60 if (is_state('climate.bedroom_thermostat','unavailable') or is_state('climate.bedroom_thermostat','unknown')) else 255 }}"

    - obj: "p2b41" # on/off switch
      properties:
        "val": "{{ 0 if (is_state('climate.bedroom_thermostat', 'off') or is_state('climate.bedroom_thermostat', 'unavailable')) else 1 }}"
        "click": "{{ 'false' if (is_state('climate.bedroom_thermostat','unavailable') or is_state('climate.bedroom_thermostat','unknown')) else 'true' }}"
        "opacity": "{{ 60 if (is_state('climate.bedroom_thermostat','unavailable') or is_state('climate.bedroom_thermostat','unknown')) else 255 }}"
      event:
        "down":
          - service_template: >
              {% if val == 0 -%}
              climate.turn_on
              {% else -%}
              climate.turn_off
              {% endif -%}
            entity_id: "climate.bedroom_thermostat"

    - obj: "p2b30" # tab dots
      event:
        "changed":
          - service: openhasp.command
            target:
              entity_id: openhasp.your_plate
            data:
              keyword: p3b26.text
              parameters: >
                {% if val == 0 %}
                {{ "#000000 \u2022# #909090 \u2022# #909090 \u2022#" | e }}
                {%-elif val == 1 %}
                {{ "#909090 \u2022# #000000 \u2022# #909090 \u2022#" | e }}
                {%-elif val == 2 %}
                {{ "#909090 \u2022# #909090 \u2022# #000000 \u2022#" | e }}
                {% endif %}

    - obj: "p2b42" # dropdown with fan_modes
      properties:
        "options": >
          {% if state_attr('climate.bedroom_thermostat','fan_modes') is not none %}{%for mode in state_attr('climate.bedroom_thermostat','fan_modes')%}
          {%- if mode == 'auto' -%}
          Automatic{{"\n"|e}}
          {%- elif mode == 'low' -%}
          Low{{"\n"|e}}
          {%- elif mode == 'medium' -%}
          Medium{{"\n"|e}}
          {%- elif mode == 'high' -%}
          High{{"\n"|e}}
          {%- elif mode == 'turbo' -%}
          Turbo{{"\n"|e}}
          {%- endif -%}
          {%-if not loop.last%}{%-endif%}{%-endfor%}{% endif %}
        "click": "{{ 'false' if (is_state('climate.bedroom_thermostat','unavailable') or is_state('climate.bedroom_thermostat','unknown')) else 'true' }}"
        "val": >
          {% if not (is_state('climate.bedroom_thermostat','unavailable')) %}{%for mode in state_attr('climate.bedroom_thermostat','fan_modes')%}
          {{loop.index -1 if mode == state_attr('climate.bedroom_thermostat','fan_mode') }}
          {%-endfor%}{% endif %}
      event:
        "changed":
          - service: climate.set_fan_mode
            target:
              entity_id: climate.bedroom_thermostat
            data:
              fan_mode: >
                {% if text == "Automatic" -%}
                auto
                {% elif text == 'Low' -%}
                low
                {% elif text == 'Medium' -%}
                medium
                {% elif text == 'High' -%}
                high
                {% elif text == 'Turbo' -%}
                turbo
                {% endif -%}

    - obj: "p2b43" # dropdown with hvac_modes
      properties:
        "options": >
          {% if state_attr('climate.bedroom_thermostat','hvac_modes') is not none %}{%for mode in state_attr('climate.bedroom_thermostat','hvac_modes')%}
          {%- if mode == 'off' -%}
          Off{{"\n"|e}}
          {%- elif mode == 'heat' -%}
          Heating{{"\n"|e}}
          {%- elif mode == 'cool' -%}
          Cooling{{"\n"|e}}
          {%- elif mode == 'heat_cool' -%}
          Heat/Cool{{"\n"|e}}
          {%- elif mode == 'dry' -%}
          Drying{{"\n"|e}}
          {%- elif mode == 'fan_only' -%}
          Fan only{{"\n"|e}}
          {%- else -%}
          On{{"\n"|e}}
          {%- endif -%}
          {%-if not loop.last%}{%-endif%}{%-endfor%}{% endif %}
        "click": "{{ 'false' if (is_state('climate.bedroom_thermostat','unavailable') or is_state('climate.bedroom_thermostat','unknown')) else 'true' }}"
        "val": >
          {% if not (is_state('climate.bedroom_thermostat','unavailable')) %}{%for mode in state_attr('climate.bedroom_thermostat','hvac_modes')%}
          {{loop.index -1 if mode == states('climate.bedroom_thermostat') }}
          {%-endfor%}{% endif %}
      event:
        "changed":
          - service: climate.set_hvac_mode
            target:
              entity_id: climate.bedroom_thermostat
            data:
              hvac_mode: >
                {% if text == "Off" -%}
                off
                {% elif text == 'Heating' -%}
                heat
                {% elif text == 'Cooling' -%}
                cool
                {% elif text == 'Heat/Cool' -%}
                heat_cool
                {% elif text == 'Drying' -%}
                dry
                {% elif text == 'Fan only' -%}
                fan_only
                {% endif -%}

    - obj: "p3b10" # bed heater-switch toggle button
      properties:
        "val": '{{ 1 if states("switch.bed_heater_shelly_7") == "on" else 0 }}'
        "text": '{{ "\uE438 Bed Heater" if is_state("switch.bed_heater_shelly_7", "on") else "\uEAD7 Bed Heater" | e }}'
      event:
        "up":
          - service: homeassistant.toggle
            entity_id: "switch.bed_heater_shelly_7"

    - obj: "p3b12" # Movie night button
      event:
        "down":
          - service: input_button.press
            entity_id: "input_button.movie_night"

    - obj: "p3b13" # Romance night button
      event:
        "down":
          - service: input_button.press
            entity_id: "input_button.romance_night"

    - obj: "p3b14" # Game night button
      event:
        "down":
          - service: input_button.press
            entity_id: "input_button.gaming_bedroom"

Describe the bug

Upgraded to 0.7.6. Error log states page file is no longer valid. Screen showing page layouts buttons and switches but no data being sent. IE temp sensor showing blank

Debug log

Logger: custom_components.openhasp
Source: custom_components/openhasp/__init__.py:638
integration: openHASP ([documentation](https://www.openhasp.com/), [issues](https://github.com/HASwitchPlate/openHASP-custom-component/issues))
First occurred: 10:17:55 AM (4 occurrences)
Last logged: 11:09:28 AM

'/config/openhaspconfig/bedroomtouchscreen.jsonl' is not an allowed directory

Logger: homeassistant.helpers.event
Source: helpers/template.py:621
First occurred: 10:17:55 AM (4 occurrences)
Last logged: 11:09:28 AM

Error while processing template: Template<template=({% if not (is_state('climate.bedroom_thermostat','unavailable')) %}{%for mode in state_attr('climate.bedroom_thermostat','fan_modes')%} {{loop.index -1 if mode == state_attr('climate.bedroom_thermostat','fan_mode') }} {%-endfor%}{% endif %}) renders=2>
Traceback (most recent call last):
  File "/usr/src/homeassistant/homeassistant/helpers/template.py", line 619, in async_render
    render_result = _render_with_context(self.template, compiled, **kwargs)
                    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/helpers/template.py", line 2654, in _render_with_context
    return template.render(**kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.12/site-packages/jinja2/environment.py", line 1304, in render
    self.environment.handle_exception()
  File "/usr/local/lib/python3.12/site-packages/jinja2/environment.py", line 939, in handle_exception
    raise rewrite_traceback_stack(source=source)
  File "<template>", line 1, in top-level template code
  File "/usr/local/lib/python3.12/site-packages/jinja2/runtime.py", line 422, in __init__
    self._iterator = self._to_iterator(iterable)
                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.12/site-packages/jinja2/runtime.py", line 430, in _to_iterator
    return iter(iterable)
           ^^^^^^^^^^^^^^
TypeError: 'NoneType' object is not iterable

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/usr/src/homeassistant/homeassistant/helpers/template.py", line 731, in async_render_to_info
    render_info._result = self.async_render(  # noqa: SLF001
                          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/helpers/template.py", line 621, in async_render
    raise TemplateError(err) from err
homeassistant.exceptions.TemplateError: TypeError: 'NoneType' object is not iterable

Logger: custom_components.openhasp
Source: custom_components/openhasp/__init__.py:753
integration: openHASP ([documentation](https://www.openhasp.com/), [issues](https://github.com/HASwitchPlate/openHASP-custom-component/issues))
First occurred: 10:17:55 AM (4 occurrences)
Last logged: 11:09:28 AM

TemplateError('TypeError: 'NoneType' object is not iterable') while processing template 'Template<template=({% if not (is_state('climate.bedroom_thermostat','unavailable')) %}{%for mode in state_attr('climate.bedroom_thermostat','fan_modes')%} {{loop.index -1 if mode == state_attr('climate.bedroom_thermostat','fan_mode') }} {%-endfor%}{% endif %}) renders=4>' in entity 'None'
pvtex commented 5 days ago

I get the same TypeError: 'NoneType' object is not iterable

Taffy9325 commented 5 days ago

I get the same TypeError: 'NoneType' object is not iterable

Strangely enough though it hasn’t affected the functionality. I’ve upgraded to latest version of home assistant which is 2024.9.3 and it’s fine just a throws the error up. I think it’s got something to do with the thermostat entity’s