Yes, I get that, but are you talking about
Inside the python script or in the yaml?
Yes, I get that, but are you talking about
Inside the python script or in the yaml?
If I check the results in Developer Tools/States I get
The State Attribute for Front 123 is 0 but Front1 is â0â
So the Front End GUI doesnât recognise that the single blind is up or down.
Front Blinds/All Blinds is Front 123, South is Front1
Ok, what is setting that value? You donât have a single automation posted that shows how you set the current position.
So it must be in your python script or outside what you posted. Thatâs all Iâm trying to get out of you.
Did you write the python script? Is the python script setting the value or are you doing it in another automation?
Hi Petro,
It is RodPayneâs python script above How to manually set state/value of sensor?
Post #15.
Thatâs the source of your issues. Thatâs a poorly written script in regards to maintaining attribute types. It keeps everything a string which is the root cause of your issue.
Why arenât you using a cover group instead?
cover:
- platform: group
name: front123
entities:
- cover.front1
- cover.front2
- cover.front3
You wonât even need an automation. Youâll just have a cover that controls all 3.
I guess, for some of us, we need to take the long way round to get at the best solution.
It has been a very circuitous path for these blinds involving RF transmitters, rolling codes and complicated supply of power. They finally work and the GUI was the last bit.
Thank you so much for the simple solution for the icing on the cake
Lol, it happens to all of us. Donât fret over it. Cover groups is pretty new, I think itâs less than a year old.
@ rodpayne the set_state.py is a great help thankyou.
However, I have a small issue when running mine, giving a no attribute lower() error.
Here is my log:
2020-02-06 20:35:08 INFO (SyncWorker_5) [homeassistant.components.python_script] Executing set_state.py: {'state': '0.105.1', 'entity_id': ['sensor.last_known_version']}
2020-02-06 20:35:08 ERROR (SyncWorker_5) [homeassistant.components.python_script.set_state.py] Error executing script: 'list' object has no attribute 'lower'
Traceback (most recent call last):
File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/homeassistant/components/python_script/__init__.py", line 196, in execute
exec(compiled.code, restricted_globals)
File "set_state.py", line 13, in <module>
File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/homeassistant/core.py", line 876, in get
return self._states.get(entity_id.lower())
AttributeError: 'list' object has no attribute 'lower'
Here is my sensor definition:
sensor:
- platform: template
sensors:
last_known_version:
value_template: "0.105.1"
As you can see, Iâm running latest(ish) version of HA.
Are you able to assist at all please?
how exactly do you do that?
Via this automation:
- alias: 'Notify Home Assistant Has Been Updated'
initial_state: 'on'
trigger:
platform: homeassistant
event: start
condition:
- condition: template
value_template: "{{ states('sensor.current_version') | string != states('sensor.last_known_version') | string }}"
action:
- service: tts.google_say
entity_id: media_player.kitchen
data_template:
message: "Home Assistant has been updated to version {{states('sensor.current_version')}}"
cache: false
- service: python_script.set_state
entity_id: sensor.last_known_version
data_template:
state: "{{states('sensor.current_version')}}"
And did it work with previous versions of HA?
Actually today is the first time I tried it and I updated earlier this evening, so Iâm not sureâŚ
hm⌠error message points inside states.get function⌠strange!
it works fine on 0.104.2, havenât updated to 0.105 yet (but will over the weekend)
that should work, did you use to have it configured like this:
- service: python_script.set_state
entity_id:
- sensor.last_known_version
data_template:
state: "{{states('sensor.current_version')}}"
If so, that would make it a list. Which would propagate error in question all the way down in the hass.states.get() in line 13.
change the code to this and it should always work.
inputEntity = data.get('entity_id')
if inputEntity is None:
logger.warning("===== entity_id is required if you want to set something.")
else:
if isinstance(inputEntity, list) and len(inputEntity) >= 1:
inputEntity = inputEntity[0]
if isinstance(inputEntity, str) and inputEntity:
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)
else:
logger.warning("===== entity_id is required if you want to set something.")
could you explain why it is a list?
and I think this makes sense
inputEntity = data.get('entity_id')
if isinstance(inputEntity, list) and len(inputEntity) >= 1:
inputEntity = inputEntity[0]
if isinstance(inputEntity, str) and inputEntity:
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)
else:
logger.warning("===== entity_id is required if you want to set something.")
Seems like it is a list looking at the square brackets in the log. I will play with it tonight.
Iâd also like to know why itâs being input as a list.
So yaml is pretty smart. It takes your configuration and converts it on load into python objects.
If you have this as a configuration in yaml:
foo:
- a
python recieves {'foo':['a']}
So if you were to get foo, youâd get ['a']
which is a list.
Same goes for a mapping object with a dict
foo:
bar: a
python gets {'foo':{'bar':'a'}}
or if you were to just use a single value:
foo: a
python gets {'foo':'a'}
So with that knowledge, and the flow of the program, you could deduce where this list would be coming from in get() because itâs only accepting what the user puts inside âentity_idâ)
Well, I use a little bit modified script(which apparently does not do any list->str conversions) in my setup and there is at least one place where I call in from automation.yaml
service: python_script.set_state
data_template:
entity_id: binary_sensor.wallpanel_entrance_sensor_motion
state: >
{% if trigger.to_state.state == 'off' %}
Unavailable
{% else %}
{% set sensor_state = states('binary_sensor.wallpanel_entrance_sensor_motion') %}
{{ 'Clear' if sensor_state == 'Unavailable' else sensor_state }}
{% endif %}
and it does not produce errors, I wonder whatâs the difference between my and @stuart-i-m-smith automations.
My assumption is that his original configuration was:
entity_id:
- binary_sensor.wallpanel_entrance_sensor_motion
instead of
entity_id: binary_sensor.wallpanel_entrance_sensor_motion
I see now (was focusing on the state
attribute for some reason). Looking at his code it sounds reasonable
- service: python_script.set_state
entity_id:
- sensor.last_known_version
So actually there is no need to change the script code, he just have to remove that dash and this should work
- service: python_script.set_state
entity_id: sensor.last_known_version
data_template:
state: "{{states('sensor.current_version')}}"
The only trouble is he says it doesnât⌠8()