Add-on: Home Assistant Google Drive Backup

In HassOS on RPi, in the ‘Logs’-section, you should add a ‘back’-button. If it’s already there, I can’t find it :man_shrugging:

Here ?

or do you mean once you open the web gui:

Because when I go to ‘logs’

I get the logs opened up in a new window so no need to hit ‘back’.

1 Like

Uuhm, yeah, sorry, my mistake. A new window magically appears, didn’t notice that earlier :crazy_face:

Good day.

I have a question if you have any idea how to solve my about a week old problem.

About one hour after starting the backups, my logger freezes. I find the following entry in the log.

Does anyone have the same problem + possible solution please.

my solution so far is to restart HA but that’s not a solution…

Hi @sabeechen
Great add-on thanks !
Could I ask where I could start to troubleshoot something.
Last week my HA messed up so installed fresh (Pi4 hassio)
I had backups that has been saved to my Google account thanks to you so on the initial HA welcome page I chose to restore from backup and uploaded it choosing full restore but it was obvious after a couple of hours it wasn’t working.
So I installed fresh again and created a user this time and tried restoring and left it over night but still nothing, so then did the same again and choose partial restore this time and selected everything but the OS and it worked but obviously not work my dashboards etc.
So I ended up extracting the backup and copying and pasting everything across which worked.
How would you go about troubleshooting this ? Is it just looking at the logs
I must admit I didn’t look at the logs as I was rushing in the end.
Thanks

It looks like your log file is full and can no longer be written to. You can delete the recorder db file (home-assistant_v2.db) and it will rebuild it (you will lose your history after doing this) or try moving over to MariaDB instead of using the built in log file. There are guides on deleting it on the forum and how to move over to MariaDB (which is more stable)

@Steveuk Copy-pasting should work fine, thats basically all Home Assistant does for a restore. If you’d like to debug further my only suggestions aside from what you’ve already done is to check the supervisor logs while and after restoring the config folder. The supervisor is what runs runs at the top of Home Assistant’s stack and makes everything run together. Most problems during a restore will show up there in some way, though it might just be an opaque error message. I know 3 ways to check the supervisor logs, depending on how broken an installation is:

  • If the Ha Web-UI still works you can enable advanced settings in your HA user profile settings, then go to Settings > System > Logs > Supervisor (top right)
  • If you’re able to install an addon (eg before restoring the configuration) you can install the SSH Addon, connect to it using Putty and use the command ha supervisor logs
  • If none of the above works, you can connect a keyboard and monitor to your machine and use the command supervisor logs from the built-in shell.
1 Like

Thanks I’ll go through that when I get home hopefully I’ve still got the logs from Saturday.
Would the version of OS be a reason why the full restore didn’t work ?
As my backup was about 2 or 3 releases older the what I had just re-installed.
Cheers

@sabeechen Hey Stephen this is DIGGITY BOMB! I just bought you five coffees with the below comment within the add-on - your thoughts? :slight_smile:

“Excellent job. You have saved my butt more than once (doing idiot things and then resrtoring!)! I have a specific feature enhancement request! :smiley:… I run this on a Raspberry PI in docker - and have set the RPI to put the SYSLOG in the /usr/share/hassio/share directory, which is visible to HA within docker. so that I can use some command_line sensors to run a tail on the log with grep to notify me of certain events (yes not at all not elegant but it works for now). Therefore, the backup includes the huge syslog file! I see you have a feature to INCLUDE certain things, but can we add a feature to your backup settings to NOT include certain files or directories? PULEEEZ! (Due to the size of the syslog sometimes I believe the automated backups are having a tendency to spike the CPU when the share dirfectory is being backed up - and I have nothing in the share directoryother than some logs at the moment!)”

(The above sensors are monitoring things that run outside of docker)

Additional Edit… I just saw the option to inot include the SHARE directory - so turned that on… duh! Anyway, what about specifying backing up that directory but not certain files within it (in case I start putting other stuff in there)?

I am suddenly getting error messages after months of this add on running perfectly. And I get a 502: Bad Gateway error message when I try to access the the web UI.

This is the log book entry. Any idea what is going on?

Task exception was never retrieved
future: <Task finished name='Task-1' coro=<run.<locals>.new_coro() done, defined at /usr/lib/python3.10/site-packages/aiorun.py:221> exception=JSONDecodeError('Expecting value: line 1 column 1 (char 0)')>
Traceback (most recent call last):
  File "/usr/lib/python3.10/site-packages/aiorun.py", line 231, in new_coro
    await coro
  File "/app/backup/__main__.py", line 11, in main
    await Injector([BaseModule(), MainModule()]).get(Starter).start()
  File "/usr/lib/python3.10/site-packages/injector/__init__.py", line 943, in get
    result = scope_instance.get(interface, binding.provider).get(self)
  File "/usr/lib/python3.10/site-packages/injector/__init__.py", line 91, in wrapper
    return function(*args, **kwargs)
  File "/usr/lib/python3.10/site-packages/injector/__init__.py", line 785, in get
    provider = InstanceProvider(provider.get(self.injector))
  File "/usr/lib/python3.10/site-packages/injector/__init__.py", line 264, in get
    return injector.create_object(self._cls)
  File "/usr/lib/python3.10/site-packages/injector/__init__.py", line 966, in create_object
    self.call_with_injection(init, self_=instance, kwargs=additional_kwargs)
  File "/usr/lib/python3.10/site-packages/injector/__init__.py", line 999, in call_with_injection
    dependencies = self.args_to_inject(
  File "/usr/lib/python3.10/site-packages/injector/__init__.py", line 91, in wrapper
    return function(*args, **kwargs)
  File "/usr/lib/python3.10/site-packages/injector/__init__.py", line 1047, in args_to_inject
    instance: Any = self.get(interface)
  File "/usr/lib/python3.10/site-packages/injector/__init__.py", line 943, in get
    result = scope_instance.get(interface, binding.provider).get(self)
  File "/usr/lib/python3.10/site-packages/injector/__init__.py", line 91, in wrapper
    return function(*args, **kwargs)
  File "/usr/lib/python3.10/site-packages/injector/__init__.py", line 785, in get
    provider = InstanceProvider(provider.get(self.injector))
  File "/usr/lib/python3.10/site-packages/injector/__init__.py", line 358, in get
    return [i for provider in self._providers for i in provider.get(injector)]
  File "/usr/lib/python3.10/site-packages/injector/__init__.py", line 358, in <listcomp>
    return [i for provider in self._providers for i in provider.get(injector)]
  File "/usr/lib/python3.10/site-packages/injector/__init__.py", line 302, in get
    return injector.call_with_injection(self._callable)
  File "/usr/lib/python3.10/site-packages/injector/__init__.py", line 999, in call_with_injection
    dependencies = self.args_to_inject(
  File "/usr/lib/python3.10/site-packages/injector/__init__.py", line 91, in wrapper
    return function(*args, **kwargs)
  File "/usr/lib/python3.10/site-packages/injector/__init__.py", line 1047, in args_to_inject
    instance: Any = self.get(interface)
  File "/usr/lib/python3.10/site-packages/injector/__init__.py", line 943, in get
    result = scope_instance.get(interface, binding.provider).get(self)
  File "/usr/lib/python3.10/site-packages/injector/__init__.py", line 91, in wrapper
    return function(*args, **kwargs)
  File "/usr/lib/python3.10/site-packages/injector/__init__.py", line 785, in get
    provider = InstanceProvider(provider.get(self.injector))
  File "/usr/lib/python3.10/site-packages/injector/__init__.py", line 264, in get
    return injector.create_object(self._cls)
  File "/usr/lib/python3.10/site-packages/injector/__init__.py", line 966, in create_object
    self.call_with_injection(init, self_=instance, kwargs=additional_kwargs)
  File "/usr/lib/python3.10/site-packages/injector/__init__.py", line 999, in call_with_injection
    dependencies = self.args_to_inject(
  File "/usr/lib/python3.10/site-packages/injector/__init__.py", line 91, in wrapper
    return function(*args, **kwargs)
  File "/usr/lib/python3.10/site-packages/injector/__init__.py", line 1047, in args_to_inject
    instance: Any = self.get(interface)
  File "/usr/lib/python3.10/site-packages/injector/__init__.py", line 943, in get
    result = scope_instance.get(interface, binding.provider).get(self)
  File "/usr/lib/python3.10/site-packages/injector/__init__.py", line 264, in get
    return injector.create_object(self._cls)
  File "/usr/lib/python3.10/site-packages/injector/__init__.py", line 966, in create_object
    self.call_with_injection(init, self_=instance, kwargs=additional_kwargs)
  File "/usr/lib/python3.10/site-packages/injector/__init__.py", line 999, in call_with_injection
    dependencies = self.args_to_inject(
  File "/usr/lib/python3.10/site-packages/injector/__init__.py", line 91, in wrapper
    return function(*args, **kwargs)
  File "/usr/lib/python3.10/site-packages/injector/__init__.py", line 1047, in args_to_inject
    instance: Any = self.get(interface)
  File "/usr/lib/python3.10/site-packages/injector/__init__.py", line 943, in get
    result = scope_instance.get(interface, binding.provider).get(self)
  File "/usr/lib/python3.10/site-packages/injector/__init__.py", line 91, in wrapper
    return function(*args, **kwargs)
  File "/usr/lib/python3.10/site-packages/injector/__init__.py", line 785, in get
    provider = InstanceProvider(provider.get(self.injector))
  File "/usr/lib/python3.10/site-packages/injector/__init__.py", line 264, in get
    return injector.create_object(self._cls)
  File "/usr/lib/python3.10/site-packages/injector/__init__.py", line 966, in create_object
    self.call_with_injection(init, self_=instance, kwargs=additional_kwargs)
  File "/usr/lib/python3.10/site-packages/injector/__init__.py", line 1008, in call_with_injection
    return callable(*full_args, **dependencies)
  File "/app/backup/util/data_cache.py", line 46, in __init__
    self._load()
  File "/app/backup/util/data_cache.py", line 53, in _load
    self._data = json.load(f)
  File "/usr/lib/python3.10/json/__init__.py", line 293, in load
    return loads(fp.read(),
  File "/usr/lib/python3.10/json/__init__.py", line 346, in loads
    return _default_decoder.decode(s)
  File "/usr/lib/python3.10/json/decoder.py", line 337, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "/usr/lib/python3.10/json/decoder.py", line 355, in raw_decode
    raise JSONDecodeError("Expecting value", s, err.value) from None
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)

@sabeechen any update - leaving specific files only out of the backup?

Hello! Please tell me how to disable Frigate integration data backup

Have you looked at the partial backup option in the configuration? you can configure exactly what you want to backup.

1 Like

@KruseLuds You can see here for a little more detail, but tl;dr is that support for excluding sub-folders would need to be added to Home Assistant’s Supervisor.

@MilesAheadToo This looks like the addon’s configuration files have been corrupted. I’d uninstall then reinstall the addon and consider changing your SD card. After you reinstall the addon make sure you go through your settings to make sure you have it set up the way you like.

@customstudioyandexru I’m not familiar with the frigate integration, but maybe this will help? As @Piggyback poitned out you can tell this addon to exclude some certain folders/addons from backup if thats what you’re looking for, check out the settings in the web-ui.

1 Like

I haven’t really been posting here for every release I make on the addon, but today I just released a new version, v0.109.1. Here is the list of changes since my last announcement (ignoring bug fixes). No huge features, just quality of life stuff and fixing little bugs that come up:

  • If configured from the browser, the web-ui now defaults to a “dark” theme if haven’t already configured custom colors.
  • Now you can configure the interval at which the addon publishes sensors to Home Assistant (see the “Uncommon Options” settings)
  • “Free space in Google Drive” is now published as an attribute of the “sensor.backup_state” sensor.
  • The “sensors.backups_stale” sensor will now report a problem if creating a backup hangs for more than a day (this was a problem for at least 1 person).
  • Added a warning for existing users if you’re not ignoring upgrade backups.
  • Added a warning about google’s OOB deprecation for private credential users.
  • Added commenting on backups, ie you can annotate them before or after creation.


*The addon is free to use and there is no intention of changing that in the for foreseeable future. It does cost me real money to run. Donations help keep the lights on indefinitely.

2 Likes

Hi. Thanks for the add-on.
Silly question that has me confused: how come the GitHub releases page is stuck on v0.106.1 but the add-on continues to be updated an appear in HACS?

I didn’t know that was possible, and sometimes I look at GitHub’s Releases for info, but that might not be as trustable as I thought. Thanks :slight_smile:

I normally don’t create a github “releases” because HA doesn’t look at them to know about updates, they’re managed through the addon config file and a bunch of convoluted docker labels. People seem to like seeing it though, so I’ll make them going forward. Here is the one for 0.109.1.

2 Likes

Friends, please tell me how to limit the download of data? There is a function in the settings to disable addons during backup, but then they have to be run separately! I have 1.9 gigabytes of unnecessary data in my deep stack that I can’t delete. Double Take 350 megabytes, which also for some reason cannot be deleted. They are uploaded to the cloud and take up space. (((

Can you give an example of how to do this? Thanks

Have you tried? I don’t use this setting but when selecting partial backup you can just I select the addons you do not want to back up