Closed thrust15 closed 2 weeks ago
camera documentation camera source (message by IssueLinks)
Workaround for now is to also set entity_id
on the parent definition. Example:
- trigger:
platform: state
entity_id: binary_sensor.main_door
to: 'on'
action:
- service: camera.record
entity_id: camera.hall
data:
entity_id: camera.hall
filename: '/tmp/{{ entity_id.name }}_{{ now().strftime("%Y%m%d-%H%M%S") }}.mp4'
duration: 8
I can confirm this issue from another angle. I've posted it on the forum for feedback and then discovered this bug report.
This fails for me running core 0.116.2 on Python 3.9.0 (the last known version this worked on for me was also 0.114 – I skipped 0.115).
test_snapshot:
sequence:
- service: camera.snapshot
data:
entity_id: camera.security_camera
filename: '/tmp/snapshot_{{ entity_id.entity_id }}.jpg'
Also, the example in the docs won't work.
(I'll try your suggestion to see if it works for me in this case.)
@parautenbach
(I'll try your suggestion to see if it works for me in this case.)
I am running into this same issue currently and my test scenario is nearly identical to yours. Have you been able to utilize the suggested workaround to find success? Unfortunately I haven't been able to get around it :(
Also having this issue. The workaround posted above doesn't seem to work for me with the snapshot service:
1: Error rendering data template: UndefinedError: 'entity_id' is undefined
Traceback (most recent call last):
File "/usr/src/homeassistant/homeassistant/helpers/template.py", line 353, in async_render
render_result = compiled.render(kwargs)
File "/usr/local/lib/python3.8/site-packages/jinja2/environment.py", line 1090, in render
self.environment.handle_exception()
File "/usr/local/lib/python3.8/site-packages/jinja2/environment.py", line 832, in handle_exception
reraise(*rewrite_traceback_stack(source=source))
File "/usr/local/lib/python3.8/site-packages/jinja2/_compat.py", line 28, in reraise
raise value.with_traceback(tb)
File "<template>", line 1, in top-level template code
File "/usr/local/lib/python3.8/site-packages/jinja2/sandbox.py", line 407, in getattr
value = getattr(obj, attribute)
jinja2.exceptions.UndefinedError: 'entity_id' is undefined
@parautenbach were you able to get this working?
Also having this issue. The workaround posted above doesn't seem to work for me with the snapshot service:
1: Error rendering data template: UndefinedError: 'entity_id' is undefined Traceback (most recent call last): File "/usr/src/homeassistant/homeassistant/helpers/template.py", line 353, in async_render render_result = compiled.render(kwargs) File "/usr/local/lib/python3.8/site-packages/jinja2/environment.py", line 1090, in render self.environment.handle_exception() File "/usr/local/lib/python3.8/site-packages/jinja2/environment.py", line 832, in handle_exception reraise(*rewrite_traceback_stack(source=source)) File "/usr/local/lib/python3.8/site-packages/jinja2/_compat.py", line 28, in reraise raise value.with_traceback(tb) File "<template>", line 1, in top-level template code File "/usr/local/lib/python3.8/site-packages/jinja2/sandbox.py", line 407, in getattr value = getattr(obj, attribute) jinja2.exceptions.UndefinedError: 'entity_id' is undefined
@parautenbach were you able to get this working?
I decided to wait for the fix so didn't try the workaround. It would be better to see more of your config but from what I understand something like this should work (based on my setup):
- service: camera.snapshot
entity_id: camera.security_camera # note entity id here
data:
entity_id: camera.security_camera
filename: '/tmp/{{ entity_id.entity_id }}_{{ now().strftime("%Y%m%d-%H%M%S") }}.jpg'
Hmm, sorry, I lied (inadvertently): I just discovered that I had a test script. It's the same format as above but nonetheless:
test_snapshot:
sequence:
- service: camera.snapshot
entity_id: camera.security_camera
data:
entity_id: camera.security_camera
filename: '/tmp/snapshot_{{ entity_id.name }}.jpg'
I am running into the same issue, and the suggested workaround does not work for me.
I think I just figured out the proper workaround.
The issue is not that 'entity_id' needs to be defined on the parent definition, but rather that the 'filename' template compilation runs into undefined error when looking for the reference 'entity_id'.
So to workaround this issue, you just need to remove the reference to 'entity_id' in the 'filename' template, and hardcode it.
- trigger:
platform: state
entity_id: binary_sensor.main_door
to: 'on'
action:
- service: camera.record
entity_id: camera.hall
data:
entity_id: camera.hall
filename: '/tmp/hall_{{ now().strftime("%Y%m%d-%H%M%S") }}.mp4'
duration: 8
I am running into the same issue, and the suggested workaround does not work for me.
You need to give more details. What exactly did you do? Which version of HA? I can categorically say that my test script illustrates the issue – and still does, at least with HA 0.118.5. Removing the parent entity_id
will cause the filename
to fail – for a given valid camera entity.
The issue is not that 'entity_id' needs to be defined on the parent definition, but rather that the 'filename' template compilation runs into undefined error when looking for the reference 'entity_id'.
What you say above is what's stated in the original bug report, and confirmed by this error:
jinja2.exceptions.UndefinedError: 'entity_id' is undefined
So to workaround this issue, you just need to remove the reference to 'entity_id' in the 'filename' template, and hardcode it.
This completely defeats the purpose. The point is not having to hardcode it. I don't understand how your workaround is one. It's just the non-generic way to do it.
I am running into the same issue, and the suggested workaround does not work for me.
You need to give more details. What exactly did you do? Which version of HA? I can categorically say that my test script illustrates the issue – and still does, at least with HA 0.118.5. Removing the parent
entity_id
will cause thefilename
to fail – for a given valid camera entity.
The configuration I used was almost identical to @ruimarinho's config, but it doesn't work. The error was the same: jinja2.exceptions.UndefinedError: 'entity_id' is undefined. HA version is 2020.12.1. Whether or not having the parent entity_id
does not make any difference. I get same error as long as I reference entity_id
in the filename
template.
The issue is not that 'entity_id' needs to be defined on the parent definition, but rather that the 'filename' template compilation runs into undefined error when looking for the reference 'entity_id'.
What you say above is what's stated in the original bug report, and confirmed by this error:
jinja2.exceptions.UndefinedError: 'entity_id' is undefined
So to workaround this issue, you just need to remove the reference to 'entity_id' in the 'filename' template, and hardcode it.
This completely defeats the purpose. The point is not having to hardcode it. I don't understand how your workaround is one. It's just the non-generic way to do it.
I didn't realize that's the purpose. For me, I started with having entity_id
in the filename
template and ran into this issue. Hardcoding the entity id is acceptable in my scenario.
There hasn't been any activity on this issue recently. Due to the high number of incoming GitHub notifications, we have to clean some of the old issues, as many of them have already been resolved with the latest updates. Please make sure to update to the latest Home Assistant version and check if that solves the issue. Let us know if that works for you by adding a comment 👍 This issue has now been marked as stale and will be closed if no further activity occurs. Thank you for your contributions.
This is still an issue on version 2021.3.3
.
I think I just figured out the proper workaround.
The issue is not that 'entity_id' needs to be defined on the parent definition, but rather that the 'filename' template compilation runs into undefined error when looking for the reference 'entity_id'.
So to workaround this issue, you just need to remove the reference to 'entity_id' in the 'filename' template, and hardcode it.
- trigger: platform: state entity_id: binary_sensor.main_door to: 'on' action: - service: camera.record entity_id: camera.hall data: entity_id: camera.hall filename: '/tmp/hall_{{ now().strftime("%Y%m%d-%H%M%S") }}.mp4' duration: 8
Hello, This issue is still on version 2021.4.4. Hard code entity name in filename is not useful if you have multiple camera as entity_id i think
service: camera.record
target:
entity_id:
- camera.one
- camera.two
data:
duration: 20
filename: >-
/somepath/whatnamehere_{{ now().strftime("%d%m%Y-%H%M%S") }}.mp4
lookback: 10
Still an issue on core-2021.6.6.
Still an issue :(
Unbelievable... still not working
Someone has a good workaround?
There hasn't been any activity on this issue recently. Due to the high number of incoming GitHub notifications, we have to clean some of the old issues, as many of them have already been resolved with the latest updates. Please make sure to update to the latest Home Assistant version and check if that solves the issue. Let us know if that works for you by adding a comment 👍 This issue has now been marked as stale and will be closed if no further activity occurs. Thank you for your contributions.
Still exists on 2021.12.7.
Can confirm still an issue.... unless I'm missing something. How else are people enabling recording? enable_motion_recording or an addon?
Issue still present. Anyone have a workaround for it? I want take snapshot of multiple camera and store with name..
Thanks
The workaround is to hardcode whatever information you want to use in the template.
As for taking multiple camera snapshots, I can't speak for that, except to say this issue has no relation to that.
issue is you can't remote record with the camera and access it at the same time through the IP. I've resorted to storing local on SD and having a back up pull from it.
That has nothing to do with this issue, which is about templating. What you mention has to do with your camera and the number of streams it can handle or is configured to handle.
That has nothing to do with this issue, which is about templating. What you mention has to do with your camera and the number of streams it can handle or is configured to handle.
It's directly related. Wouldn't even be discussing it if the record feature worked as intended. What is an example of hard coding it?
This issue is about using entity_id
within the fields that can be templated. Refer to this comment which also shows the workaround. The issue is not about whether the camera.record
service works. It does. You just can't use the entity_id
in the filename
field (as per the linked comment). Also check the bug report – the very first post.
This issue is about using
entity_id
within the fields that can be templated. Refer to this comment which also shows the workaround. The issue is not about whether thecamera.record
service works. It does. You just can't use theentity_id
in thefilename
field (as per the linked comment). Also check the bug report – the very first post.
"Error while executing automation automation.xxxx_record: Error rendering data template: UndefinedError: 'entity_id' is undefined"
Still an issue when done the way above, tried it again. Script executes but log has the above error
I had to manually enter the entity id in the field... oh well.
I think what some of us are trying to do is:
service: camera.record
entity_id:
- camera.one
- camera.two
- camera.three
data:
duration: 30
filename: "{{ entity_id.friendly_name }} - {{ now().strftime("%Y%m%d-%H%M%S") }}.mp4"
in order to create three simultaneous recordings, one per camera. There is also the possibility people are trying to access other attributes on the entity. Whilst @thrust15 looked to be using a single entity, it's all part of the same problem — the templating which used to allow this has been broken.
Hardcoding the filename (i.e. not using entity_id
at all and just typing the name yourself) has been suggested several times, and will work if you're recording a single camera, and know everything about it. Anyone planning to suggest hardcoding again, please consider the use-cases where that information isn't available ahead of time (i.e. with multiple entities, or dynamic attributes); this seems to be the original intent of the templating feature.
It's also possibly worth pointing out the canonical example of the camera.record
service remains "broken" (that is, it'll give you an error if you run the example). If this issue isn't likely to be resolved, a "quick win" might be updating the docs not to reference templating, so as not to confuse new users.
@mcoms that's a lot clearer, thanks for that. This should help the justification to get this fixed/working.
Unfortunately still an issue in 2022.04-6.
My use case is that I want all my cameras to take a snapshot with the entity_id as the name and send that to me.
Still an issue, Am I right?
I'll try to fix this.
Sorry, my PR to fix it was rejected. I can have another look at it later but it won't be in time for 2022.8.
Thanks for working on this!
Was there any update on this issue?
Thanks
Until this is fixed, you can do something like this:
service: camera.snapshot
data:
filename: /media/{{ '{{ entity_id.entity_id }}' }}/{{ now().strftime("%Y%m%d-%H%M%S") }}.jpg
target:
entity_id:
- camera.backyard_camera
- camera.doorbell_camera
Notice the {{ '{{ entity_id.entity_id }}' }}
in the filename string. The service helper template will first render the entire filename as /media/{{ entity_id.entity_id }}/20220818-163758.jpg
and pass it on to the camera service (snapshot/record), which will then render appropriately as /media/camera.backyard_camera/20220818-163758.jpg
and /media/camera.doorbell_camera/20220818-163758.jpg
, etc.
Until this is fixed, you can do something like this:
service: camera.snapshot data: filename: /media/{{ '{{ entity_id.entity_id }}' }}/{{ now().strftime("%Y%m%d-%H%M%S") }}.jpg target: entity_id: - camera.backyard_camera - camera.doorbell_camera
Notice the
{{ '{{ entity_id.entity_id }}' }}
in the filename string. The service helper template will first render the entire filename as/media/{{ entity_id.entity_id }}/20220818-163758.jpg
and pass it on to the camera service (snapshot/record), which will then render appropriately as/media/camera.backyard_camera/20220818-163758.jpg
and/media/camera.doorbell_camera/20220818-163758.jpg
, etc.
Excellent, this worked perfectly, many thanks!
Until this is fixed, you can do something like this:
service: camera.snapshot data: filename: /media/{{ '{{ entity_id.entity_id }}' }}/{{ now().strftime("%Y%m%d-%H%M%S") }}.jpg target: entity_id: - camera.backyard_camera - camera.doorbell_camera
Notice the
{{ '{{ entity_id.entity_id }}' }}
in the filename string. The service helper template will first render the entire filename as/media/{{ entity_id.entity_id }}/20220818-163758.jpg
and pass it on to the camera service (snapshot/record), which will then render appropriately as/media/camera.backyard_camera/20220818-163758.jpg
and/media/camera.doorbell_camera/20220818-163758.jpg
, etc.
It's kind of rooted in an architectural issue. The templates in the service call are now evaluated before the service calls are sent. The service calls are then sent to multiple entities at once. Unfortunately, this specifically breaks rendering things that are entity related when sending to multiple entities. Any fix would just be doing what the workaround is doing - i.e., passing the entity_id templates through unrendered. Making a PR to do this still makes sense, as it avoids the service handlers from having to process the templates themselves. See https://github.com/home-assistant/core/pull/75693#issuecomment-1194182822 I suggest using the above workaround method for now.
There hasn't been any activity on this issue recently. Due to the high number of incoming GitHub notifications, we have to clean some of the old issues, as many of them have already been resolved with the latest updates. Please make sure to update to the latest Home Assistant version and check if that solves the issue. Let us know if that works for you by adding a comment 👍 This issue has now been marked as stale and will be closed if no further activity occurs. Thank you for your contributions.
This is still an issue.
Confirm still an issue in 2023.3.6
There hasn't been any activity on this issue recently. Due to the high number of incoming GitHub notifications, we have to clean some of the old issues, as many of them have already been resolved with the latest updates. Please make sure to update to the latest Home Assistant version and check if that solves the issue. Let us know if that works for you by adding a comment 👍 This issue has now been marked as stale and will be closed if no further activity occurs. Thank you for your contributions.
.
2023.9.3: Still experiencing this when attempting to create a snapshot as documented at https://www.home-assistant.io/integrations/camera/#service-snapshot.
https://github.com/home-assistant/core/issues/40241#issuecomment-1233073391 workaround worked for me.
Since it seems like this will never be fixed, better to remove the stated functionality:
https://github.com/home-assistant/home-assistant.io/pull/29834
Just adding to the above because I struggled with escaping... if you want to remove the "camera." prefix from the filename you can use the following template (I would not recommend using entity_id.name
because you can have names which contain invalid characters for filenames).
service: camera.record
target:
entity_id:
- camera.front_yard
- camera.front_door
data:
filename: /media/{{ '{{ entity_id.entity_id|replace(\'camera.\', \'\') }}' }}_{{ now().strftime('%Y%m%d-%H%M%S') }}.mp4
This will create recordings in the form /media/front_yard_20240114_133059.mp4
.
I just started setting up my first camera automations and ran into this issue in 2024.3.3.
Crazy that this bug has been open for over 3 years and both the visual editor and online documentation still suggest doing something you can't do. If it's not going to be fixed soon, a little notice in the docs mentioning the bug and workaround would go a long way.
There hasn't been any activity on this issue recently. Due to the high number of incoming GitHub notifications, we have to clean some of the old issues, as many of them have already been resolved with the latest updates. Please make sure to update to the latest Home Assistant version and check if that solves the issue. Let us know if that works for you by adding a comment 👍 This issue has now been marked as stale and will be closed if no further activity occurs. Thank you for your contributions.
This is still an issue that needs to be fixed, regardless of the less than ideal workarounds.
When I call the camera.record service with a filename template, it fails with the following error: jinja2.exceptions.UndefinedError: 'entity_id' is undefined.
This was not the case in the previous version of home assistant.
Environment
Problem-relevant
configuration.yaml
Traceback/Error logs
Additional information