You can do that.
Use an automation to monitor your system log for errors and send a notification if one occurs.
You can do that.
Use an automation to monitor your system log for errors and send a notification if one occurs.
Hmm good idea, right now I have watchdogs that check if a boolean gets successfully set. Iâd still like a way to set continue on error on as the default for a certain automation or integration.
Hi Tom, thatâs true for sure. But, what I can echo from my own recent experience is itâd be super helpful to have a way to log and notify on âmore trivialâ errors instead of stopping the script entirely.
Similar to PHP, for example: The difference between âwarningsâ and âfatal errorsâ. One tells you somethingâs not right and you should look at it while the other stops the script from continuing to execute. You can specify the default behavior for warnings to âlog and continueâ instead of hard-fail.
Having a way to do that either globally or on the âwhole scriptâ level would be nice.
Iâve never experienced this issue until last night. Went downstairs and everything was dark when it should not have been. Checked the logs and my light schedule had stopped because an unreliable Sengled bulb had dropped off the network. Thereâs 20 other lights in the script; it would have been better to have those others go ahead and turn on as expected. Assume itâs going to continue to do this until I find, order and replace those flaky bulbs. (Aside: if anyone has a suggestion for a non-proprietary-hub zigbee bulb, Iâd appreciate it)
Strange thing is: Those Sengled bulbs drop off all the time; and the scripts never stopped before - odd that it decided to do it for the first time last night; havenât updated HA or any integrations.
Just my two-cents on the issue; Iâll add the continue on error for those bulbs on the scripts that run daily until I can get the replaced.
Iâve been pondering this, and what Iâd really love is to be able to add some error handling within an automation itself.
Be able to have a try catch block, specify if a step takes too long or doesnât return successfully then run an alternate code path.
The only way I seem to successfully get automations to always complete is to wrap them in a parallel block and add continue_on_error everywhere.
I dont think anyone is asking to hide the problem. I have hundreds of devices utilizing multiple protocols from cloud, zwave, zigbee, Bluetooth, etc and its a pain to make sure EVERYTHING is working for automations to execute fully.
If the HA team wants HA to become more mainstream, things like this need options and proper alerts so people can know what to do and not kill the automation dead in its tracks because of one cloud device that stopped responding or timed out.
I would suggest something like putting any automation that fails with an exception goes into the âRepairâ section as an âeasyâ next step? My script is brokenâŚ
I sometimes notice something didnât happen, dig into Traces, only to find something has stopped working for the last few days. Generally something going offline.
I understand Iâm responsible for better exception handling in my scripts, but it would help if the automations supported some standard mechanisms for exception handling (try-catch?).
+1 to this, this setting should be available in the UI and there should be an automation wide on/off default setting from UI and yaml.
Since updating to 2024.7, continue on error seems to be ignored
One of my locks sporadically works (thanks zwave 700 issues) and as you see in this trace screenshot, it completely stopped at that point
Throwing my 2 cents in on this. This feature is absolutely necessary and the best thing to do in my opinion. Especially if you donât actually want to spend your entire life obsessing over which device is causing loads of things not to work.
It would not hide the problem when something doesnât work, it would actually make it much clearer! The thing I hate about the current behaviour is that when 1 thing breaks, itâs not obvious which thing broke my script/automation, because maybe 5 things didnât happen.
If I triggered a script and everything worked perfectly every time except 1 light or plug, itâd be DAMN obvious which device was at fault! And I could choose to leave that device working as well as it does, or eventually fix/replace it.
But now Iâm basically held hostage to spend time/money on fixing an issue or at least unnecessary effort restructuring a script to work around one device that sometimes doesnât work right for seemingly no good reason. And in my experience, the moment I do that, something else chooses to go on strike, and itâs a never ending merry go round of moving things around when in reality I couldnât care if one thing occasionally failedâŚ
+1, out of my roughly 100 automations I would really only want 1 or 2 to stop running if it encounters an error, continue_on_error should absolutely be the default behavior, with a stop_on_error option instead.
+1 for Continue on Error. I just got bitten by this again last night when an automation failed due to a single Zigbee device being unavailable. I wish there was a way to allow continuing on errors by default. In my case, I would probably want this for 99% of my automations.
I agree with this ,but the problem I face is sometimes my internet goes down⌠and I basically have to put âcontinue_on_errorâ which involves anything with a cloud integration.
a âignore this step when there is no internet because my cloud integration wonât workâ would be rad.
Understand not wanting to make this the global defaultâor even not wanting to make it possible to change it to be globally on.
But, being able to ignore errors for a whole script is definitely worth doing. And being able to set it via the GUI per script block is definitely needed.
And hereâs another middle-ground suggestion: a âwrapperâ block similar to âif elseâ that works like âtry catchâ, so anything within the âtryâ block is âcontinue_on_error: trueâ. This could have an option to jump to the âcatchâ block on the first error sequentially, or treat every block as âcontinue_on_error: trueâ and only execute the âcatchâ block if any errors occurred (perhaps some variable provided to the âcatchâ block would contain the first error⌠Traces would ideally show any errors that occurred.
My use-case: I have almost 100 Z-wave devices, and I have a few scripts that turn everything in the house off or down at night or when leaving the house. Statistically, the odds of any device missing the message grows very high, even with a fairly healthy network. At the moment something in zwave-jsâs retry strategy seems to have changed so I am more often getting ZW202 failures with only 1 try (I canât find where to change this)⌠so my script that shuts everything off and arms the alarm fails quite often. Complicating matters, this script is actually turning off several group helpers, so it is not at all obvious which device is failing from the Traces.
EDIT: Forgot to mention that the fact that adding âcontinue_on_error: trueâ to the YAML breaks GUI editing for every block itâs applied to is a BIG downer and big step backward in usabilityâŚhence why I say GUI support for that is âdefinitely neededâ. Looks like this is maybe in the back of the devsâ minds, because a little icon appears in the editor when itâs enabled⌠still.
I canât even get continue on error to work reliably for me.
That being said, if you want continue as error everywhere:
python_scripts/update_continue_on_error.py
import yaml
import sys
import os
from datetime import datetime
from shutil import copy2
from typing import Any, Dict, List
def add_continue_on_error(data: Any) -> Any:
if isinstance(data, dict):
if 'action' in data:
if isinstance(data['action'], list):
for action in data['action']:
if isinstance(action, dict) and 'continue_on_error' not in action:
action['continue_on_error'] = True
elif isinstance(data['action'], dict) and 'continue_on_error' not in data['action']:
data['action']['continue_on_error'] = True
else:
for key, value in data.items():
data[key] = add_continue_on_error(value)
elif isinstance(data, list):
return [add_continue_on_error(item) for item in data]
return data
def represent_none(self, _):
return self.represent_scalar('tag:yaml.org,2002:null', '')
yaml.add_representer(type(None), represent_none)
def create_backup(file_path: str) -> str:
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
backup_path = f"{file_path}.{timestamp}.backup"
copy2(file_path, backup_path)
return backup_path
def process_yaml(input_file: str) -> None:
# Create a backup
backup_file = create_backup(input_file)
print(f"Backup created: {backup_file}")
# Read and modify the YAML
with open(input_file, 'r') as file:
data = yaml.safe_load(file)
modified_data = add_continue_on_error(data)
# Write the modified data back to the original file
with open(input_file, 'w') as file:
yaml.dump(modified_data, file, default_flow_style=False, sort_keys=False)
if __name__ == "__main__":
input_file = '/config/automations.yaml'
process_yaml(input_file)
print(f"Modified YAML has been written back to {input_file}")
configuration.yaml
update_continue_on_error: "python3 python_scripts/update_continue_on_error.py"
automation:
alias: Update Continue On Error
description: ""
trigger:
- platform: time
at: "07:16:00"
condition: []
action:
- metadata: {}
data: {}
action: shell_command.update_continue_on_error
continue_on_error: true
mode: restart