How to manually set state/value of sensor?

Is it possible to manually set the state of a binary sensor or any sensor as part of an action in automation, i.e.

  trigger:
    platform: homeassistant
    event: start
  action:
    "Set binary_sensor.sensor1 to state "ON""
    "Set sensor.sensor2 to value "12.5""
3 Likes

You can do that using the REST API with curl - https://home-assistant.io/developers/rest_api/#post-apistatesltentity_id

1 Like

For what itā€™s worth, I have been hunting for a solution to this problem and I finally decided to make a small script:
# python_scripts/set_state.py

#--------------------------------------------------------------------------------------------------
# Set the state or other attributes for the entity specified in the Automation Action
#--------------------------------------------------------------------------------------------------

inputEntity = data.get('entity_id')
inputStateObject = hass.states.get(inputEntity)
inputState = inputStateObject.state
inputAttributesObject = inputStateObject.attributes.copy()

newState = data.get('state')
if newState is not None:
    inputState = newState
    
newIcon = data.get('icon')
if newIcon is not None:
    inputAttributesObject['icon'] = newIcon

hass.states.set(inputEntity, inputState, inputAttributesObject)

With this script in place, the action could be:

  action:
    service: python_script.set_state
    data_template:
      entity_id: Binary_sensor.sensor1
      state: ON

(This script could also set the icon.)

37 Likes

Try to get this merged into HA with a PR. Should be a standard service for sensors to begin with.

9 Likes

Hi,

but where i must put the ā€œset_state.pyā€ file for show it in the home assistant?

Thanks

Scripts are placed in a python_scripts folder under the configuration directory, in my case it is /home/homeassistant/.homeassistant/python_scripts. You then need to either restart Home Assistant or click RELOAD SCRIPTS under Configuration, General, Configuration Reloading.

Great!

In my case, I had to add the line python_script: in configuration.yaml for this to work.

Oh yes, configuration.yaml must be set up if you havenā€™t used any other scripts.

FYI, here is an updated script that has been generalized to be able to set any attribute.

#==================================================================================================
#  python_scripts/set_state.py 
#==================================================================================================

#--------------------------------------------------------------------------------------------------
# Set the state or other attributes for the entity specified in the Automation Action
#--------------------------------------------------------------------------------------------------

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)
    inputState = inputStateObject.state
    inputAttributesObject = inputStateObject.attributes.copy()

    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 == 'state':
            inputState = newAttribute
        else:
            inputAttributesObject[item] = newAttribute
        
    hass.states.set(inputEntity, inputState, inputAttributesObject)
30 Likes

whats the syntax for setting attributes, can you show an example. thanks.

2 Likes

Iā€™m looking forward to testing this out as I sometimes find that a couple of my motion sensors will occasionally get stuck in a ā€˜motionā€™ state. I think itā€™s actually that HA hasnā€™t seen a state change back to ā€˜no motionā€™ for whatever reasonā€¦ But this would give me a way of forcing the state back within HA I guessā€¦?

Thanks so much!
Itā€™s works fine.

:wink:

Here is an example of automations where the icon of sensor.garage_door is set based on changes in its state:

- alias: Garage Door Open
  hide_entity: True
  trigger:
    platform: state
    entity_id: sensor.garage_door
    to: 'Open'
  action:
    - service: python_script.set_state
      data_template:
        entity_id: sensor.garage_door
        icon: mdi:garage-open

- alias: Garage Door Closed
  hide_entity: True
  trigger:
    platform: state
    entity_id: sensor.garage_door
    to: 'Closed'
  action:
    - service: python_script.set_state
      data_template:
        entity_id: sensor.garage_door
        icon: mdi:garage
14 Likes

@rodpayne

This is awesome. Any plans to put set_state.py on github? Iā€™d love to be able to follow it in the event you make any future enhancements.

I put it under https://github.com/rodpayne/home-assistant.

6 Likes

Thanks for a nifty script! I was thinking to write an appdaemon for the exact same thing but python_script is much better option. It can be used from HA automation :slight_smile:.

Hi all.
I would love to test the script but Iā€™m running HASSIO. Where should I copy the python_scripts to ???
Thanks!

/config/python_scripts

@rodpayne +1 for a PR. I agree that it should be part of HA. Had I seen this, it would have saved me a great deal of pain recently working out how to use the REST API to set entity attributes.

1 Like

I like this very much.
But I get a failure if the sensor is unknown.

:   File "set_state.py", line 15, in <module>
: TypeError: 'NoneType' object is not callable

Would it be possible to allow the script to create a new sensor if it does not already exist?

2 Likes