Python скрипт для изменения значений сущностей Home Assistant

Простой способ изменить любые значения любых датчиков в Home Assistant через автоматизации.

Странно, что штатными средствами автоматизации нет возможности изменить значение датчика, например, на «недоступен» или дать ему любое другое значение. Немного поискав, нашел python скрипт для этой цели.

Скрипт должен находиться по пути /config/python_scripts с именем set_state.py. Сам скрипт:

inputEntity = data.get('entity_id')
if inputEntity is None:
    logger.warning("===== entity_id is required if you want to set something.")
else:    
    inputStateObject = hass.states.get(inputEntity)
    if inputStateObject is None and not data.get('allow_create'):
        logger.warning("===== unknown entity_id: %s", inputEntity)
    else:
        if not inputStateObject is None:
            inputState = inputStateObject.state
            inputAttributesObject = inputStateObject.attributes.copy()
        else:
            inputAttributesObject = {}
    
        for item in data:
            newAttribute = data.get(item)
            logger.debug("===== item = {0}; value = {1}".format(item,newAttribute))
            if item == 'entity_id':
                continue            # already handled
            elif item == 'allow_create':
                continue            # already handled
            elif item == 'state':
                inputState = newAttribute
            else:
                inputAttributesObject[item] = newAttribute
            
        hass.states.set(inputEntity, inputState, inputAttributesObject)

При этом в configuration.yaml нужно разрешить использование python скриптов. Добавляем:

python_script:

И перезагружаем Home Assistant.

Чтобы использовать скрипт в автоматизациях, нужно в action прописать service: python_script.set_state и указать в data_template нужную сущность и нужные значения.

Примеры:

Установить значение сущности, в данном случае switch.switch_123, в статус Недоступно:

  action:
    service: python_script.set_state
    data_template:
      entity_id: switch.switch_123
      state: 'unavailable'

Изменить иконку:

  action:
    service: python_script.set_state
    data_template:
      entity_id: switch.switch_123
      icon: mdi:door-open

Изменить значение на Включен

  action:
    service: python_script.set_state
    data_template:
      entity_id: switch.switch_123
      state: 'on'

Добавить attribution:

  action:
    service: python_script.set_state
    data_template:
      entity_id: switch.switch_123
      attribution: 'Data provided by Synology'

Просто смотрим в Панели разработчика нужный параметр сущности и добавляем его в автоматизацию.

Скрипт найден тут:

https://community.home-assistant.io/t/how-to-manually-set-state-value-of-sensor/43975

 

 

 

 

Поделитесь с друзьями

комментариев 20

  1. Не совсем понял нужность данного скрипта. Если датчик недоступен по техническим причинам, а мы заставили его стать «доступным», что мы выиграем ? Или я самой сути не понял ?

    • Скрипт даёт полный контроль над сущностями, а уже как распоряжаться, каждый придумает) я, например, пробовал делать «недоступным» датчик, на основании его пинга по ip

      • Идет по улице гражданин, у него выпадает бумажник. Вы подбираете бумажник, но не отдаете потерявшему, а уверяете его, что отдадите в полицию, а те вернут ему ))
        Уж если вы при помощи пингов выявили, что датчика нет в экосфере, так сразу оповестите себя, любимого и примите меры.
        Ну или я все равно не понял сути ))

        • Суть в эстетике) для меня это важно. По пингу то я оповещу себя, а в карточке хочется видеть «недоступно»

    • Возможно, сделал костыль, но данной функцией воспользовался для датчика расстояния, у которого после 1.6м вместо значения становится значение ‘unknown’ — что не учитываются фильтрами сглаживания. Соответственно, когда датчик выдает такой параметр, то автоматизация(скрипт) заменяет на цифровое значение, которое учитывается в фильтре и дает корректно работать основной автоматизации с этим датчиком.

      Автору спасибо за статью!

      • Спасибо за комментарий! На мой взгляд этот скрипт как раз для вот таких костылей, когда встроенными средствами нет возможности что-то исправить.

  2. Отлично!
    У меня проблема следующая. Опрашиваю датчики Овен через Modbus TCP, и если нет ответа от девайсов (датчики температуры и датчики наличия напряжения на входе), то HomeAssistant просто не обновляет последнее значение. То есть нет вообще отображения, что датчики недоступны.
    Пока не знаю как как это применить, но пока это самое годное из найденного. Спасибо.

  3. Еще один кейс использования.
    Например у нас есть универсальный пульт, который управляется по MQTT,
    так вот с помощью скрипта можно сделать обновление статуса определенной кнопки, нажимается ли она с пульта или созданным свитчем в HASSIO

  4. А есть ли возможность менять значение сущности и/или атрибута с помощью скрипта (script:). Очень нужно присваивать формулой значение атрибутам.

  5. А есть ли возможность изменять атрибут и саму сущность сенсора с помощью скрипта (script:)?
    Очень удобно добавлять рассчитываемые значения в атрибуты, тем самым избавляя себя от создания огромного количества одинаковых сенсоров для групп.
    Но вот встает вопрос, как их изменять по одной кнопке c помощью сценария?

  6. Помогите пожалуйста. Сделал все как написано, но у меня ни в какую не хочет появляться сущность python_script.set_state. Вообще никакие python_script.xxxxx не появляются. Каталог python_scripts в config создал. скрипт лежит там, python_script: в configuration.yaml прописал, сервер перегружал. Ничего. Хелп!

    • Здравствуйте, сущность python_script.set_state и не должна появиться, python_script.set_state это action (действие) для автоматизаций и скриптов. Гляньте в примере

      • разве после добавления очередного файла xxx.py в каталог python_scripts, не должно появляться python_script.xxx в списке объектов во вкладке Панель разработчика?

        • Нет, вы как раз в automation.xxx или script.xxx будете указывать action: service: python_script.set_state для нужной сущности из панели разработчика

  7. Добрый день! Сделал согласно описанию. но ничего не сработало.
    Есть необходимость, включать чайник на кнопку.
    Атрибуты сущности чайника:

    action_id: 0
    action: idle
    friendly_name: Электрический чайник Power
    device_class: power
    

    Код автоматизации:

    #4ainik
     - trigger:
        platform: state
        entity_id: sensor.0x158d0003d43a49_action
        to: single
      action:
       - service: python_script.set_state
         data_template:
          entity_id: binary_sensor.ac9a22f232fb_power
          state: 'on'
    

    Так же пробовал,

     action:
       - service: python_script.set_state
         data_template:
          entity_id: binary_sensor.ac9a22f232fb_power
          action_id: '1'
    

    Но безуспешно…

    Возникает вопрос, а в configuration.yaml, не нужно указывать путь для .py скрипта?

    python_script:
    

    достаточно?

    как убедиться что скрипт загрузился в систему?

    Спасибо!

    • Скрипт рабочий …
      Проверил на других устройствах.

      Чайник xiaomi, не умеет включаться удаленно… Поэтому ничего не включалось

  8. Добрый день!
    Подскажите пожалуйста! сделал питон скрипт:
    /config/python_scripts/set_state.py

    inputEntity = data.get('entity_id')
    if inputEntity is None:
        logger.warning("===== entity_id is required if you want to set something.")
    else:    
        inputStateObject = hass.states.get(inputEntity)
        if inputStateObject is None and not data.get('allow_create'):
            logger.warning("===== unknown entity_id: %s", inputEntity)
        else:
            if not inputStateObject is None:
                inputState = inputStateObject.state
                inputAttributesObject = inputStateObject.attributes.copy()
            else:
                inputAttributesObject = {}
        
            for item in data:
                newAttribute = data.get(item)
                logger.debug("===== item = {0}; value = {1}".format(item,newAttribute))
                if item == 'entity_id':
                    continue            # already handled
                elif item == 'allow_create':
                    continue            # already handled
                elif item == 'state':
                    inputState = newAttribute
                else:
                    inputAttributesObject[item] = newAttribute
                
            hass.states.set(inputEntity, inputState, inputAttributesObject)
    

    в /config/configuration.yaml

    python_script:
    

    в автоматизации прописываю

      action:
        service: python_script.set_state
        data_template:
          entity_id: binary_sensor.cube_158d0002e994e4
          last_action: 'AAA'
    

    и получаю ошибку:
    Message malformed: extra keys not allowed @ data[‘action’][1][‘action’]

    В чем моя ошибка?

    Сам спросил, сам нашел! в автоматизации прописал дважды "  action:
    

    «

Ответить

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.

Exit mobile version