-
-
Notifications
You must be signed in to change notification settings - Fork 32.7k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Camera.record service not working with entity_id.name in template, says entity_id is undefined #40241
Comments
camera documentation |
Workaround for now is to also set - 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).
Also, the example in the docs won't work. (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:
@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):
|
Hmm, sorry, I lied (inadvertently): I just discovered that I had a test script. It's the same format as above but nonetheless:
|
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.
|
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
What you say above is what's stated in the original bug report, and confirmed by this error:
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. |
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
I didn't realize that's the purpose. For me, I started with having |
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. |
This is still an issue on version |
Hello,
|
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. |
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? 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. |
2023.9.3: Still experiencing this when attempting to create a snapshot as documented at https://www.home-assistant.io/integrations/camera/#service-snapshot. #40241 (comment) workaround worked for me. |
Since it seems like this will never be fixed, better to remove the stated functionality: |
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 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 |
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. |
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. |
This is still an issue that needs to be fixed, regardless of the less than ideal workarounds. |
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. |
This is still an issue that needs to be fixed as of version 2024.9.2 |
This is not really a bug, the issue is the implicit templating of action service data which requires the nested templating suggested above. The nested templating is difficult to understand and document though, and I think the best option is to remove the pre-defined template variable and let users create their own variables. After looking through the source code, |
Thanks a mil @emontnemery for the feedback. Glad to get first-hand feedback from the core team. :-) The reason I logged it as a bug, is that the behaviour changed at some point (and doesn't work as documented). Your explanation of nested templating helps and confirms a previous comment.
Perhaps this change was made to be consistent with how other actions/operations internal work, but it still means it changed the original behaviour.
Indeed, and I don't have a suggestion, to be honest, because one will need to explain the internal operation of how templates get evaluated, which leads to a bleeding abstraction, which isn't ideal.
This sounds good. Are you thinking in a similar fashion to trigger and action variables? In such fields, one would still need some kind of reference to a trigger or service entity (from the context). Maybe a (Side note: I want to add that
There might be other actions that might benefit from your suggestion too. I'll need to think a bit though, but if there are, it might help it towards an architectural proposal (if needed). |
@parautenbach What I mean is to change a script with a template like this, the latter example is what I suggest for the updated documentation in home-assistant/home-assistant.io#35267 actions:
- action: camera.record
target:
entity_id: camera.yourcamera
data:
filename: '/tmp/{{ "{{ entity_id.entity_id }}" }}_{{ now().strftime("%Y%m%d-%H%M%S") }}.mp4' To: actions:
- variables:
entity_id: camera.yourcamera # Store the camera entity_id in a variable for reuse
- action: camera.record
target:
entity_id: '{{ entity_id }}'
data:
filename: '/tmp/{{ entity_id }}_{{ now().strftime("%Y%m%d-%H%M%S") }}.mp4'
Yeah, the functionality changed when implicit templating was added to service data four years ago.
Yes, that was a mistake in the PR which added the |
Thanks for the clarification @emontnemery! I'm on the same page now and would support this. |
There is unfortunately a very unpractical side effect with this solution and the better fix would be to properly procces the template and variables. With the change multiple entities are not supported anymore and existing recording scripts and automations need to be adapted, see: Since the current functionality is still working, is there a chance to fix the issue with the filename template instead of removing the functionality? |
Could you elaborate? Are you referring to the issue of keeping this dynamic if you're re-using a script or trigger an automation for multiple cameras? Remember that you can use templates in variables, so in an automation's actions you can get the trigger's entity ID and use that in the variable to do what you need (like mapping from a motion sensor entity to a camera entity). Same for scripts: You don't need to set that variable within the script. You can pass it in as a script field, and that field can be dynamic. |
I see the point of reusing the once build camera automation/script, but it's not the same as starting the recording for independent cameras the same time with the same values. How should this look like in future?
without creating a complex automation calling over and over the same script until all entities are recording. Or we are missing the arrays and a way to step through variables in the templates. In current functionality I can provide n-entities with the same settings and start recording the same time, this does not work anymore the new way. See also the discussion in the HA forum starting 18 days ago: https://community.home-assistant.io/t/camera-snapshot-entity-id-in-filename/31697/19?u=nodeejay IMHO, the old solution was not optimal, but the new one is even worse. Then I really prefer the hack and the functionality and I strongly assume at least @bennydente, @mcoms & @illuzn might agree? |
@NODeeJay and everyone else... dropping this here because the new documentation doesn't explicitly mention how to do this for multiple camera records. I tried using a The kind of inelegant way I got this to work is as follows:
alias: Camera Record Helper
description: "Helper Script to Record Multiple Cameras in Parallel"
fields:
camera_entity:
selector:
text: null
name: Camera Entity
required: true
description: Camera to Record
sequence:
- action: camera.record
data:
duration: 300
lookback: 300
# Turns camera.Front into Front_20250131-130102.mp4 change to suit your usecase.
# Putting year month day helps when sorting your recordings.
filename: >-
/share/recordings/{{ camera_entity|replace('camera.', '') }}_{{
now().strftime('%Y%m%d-%H%M%S') }}.mp4
target:
entity_id: "{{ camera_entity }}"
mode: parallel
# Change this if you need to record more than 10 cameras at once.
max: 10
alias: Record Cameras on Alarm Trigger
description: Records 5 minutes of camera footage when the alarm is triggered
triggers:
- entity_id:
- alarm_control_panel.alarm_whole_house
to: triggered
trigger: state
actions:
- repeat:
for_each:
- camera.backyard
- camera.front_door
- camera.frontyard
sequence:
- action: script.turn_on
data:
variables:
camera_entity: "{{ repeat.item }}"
target:
entity_id: script.camera_record_helper
mode: single There is probably a way to do this without having the seperate helper but as they say, perfect is the enemy of good enough and this works good enough for me. |
|
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
Traceback (most recent call last): File "/usr/src/homeassistant/homeassistant/helpers/template.py", line 285, in async_render return compiled.render(kwargs).strip() 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 The above exception was the direct cause of the following exception: Traceback (most recent call last): File "/usr/src/homeassistant/homeassistant/helpers/service.py", line 138, in async_prepare_call_from_config service_data.update(template.render_complex(config[conf], variables)) File "/usr/src/homeassistant/homeassistant/helpers/template.py", line 81, in render_complex return { File "/usr/src/homeassistant/homeassistant/helpers/template.py", line 82, in <dictcomp> render_complex(key, variables): render_complex(item, variables) File "/usr/src/homeassistant/homeassistant/helpers/template.py", line 86, in render_complex return value.async_render(variables) File "/usr/src/homeassistant/homeassistant/helpers/template.py", line 287, in async_render raise TemplateError(err) from err homeassistant.exceptions.TemplateError: UndefinedError: 'entity_id' is undefined The above exception was the direct cause of the following exception: Traceback (most recent call last): File "/usr/src/homeassistant/homeassistant/helpers/script.py", line 206, in _async_step await getattr( File "/usr/src/homeassistant/homeassistant/helpers/script.py", line 385, in _async_call_service_step domain, service, service_data = async_prepare_call_from_config( File "/usr/src/homeassistant/homeassistant/helpers/service.py", line 140, in async_prepare_call_from_config raise HomeAssistantError(f"Error rendering data template: {ex}") from ex homeassistant.exceptions.HomeAssistantError: Error rendering data template: UndefinedError: 'entity_id' is undefined
Additional information
The text was updated successfully, but these errors were encountered: