Je vais vous décrire ici la solution que j’utilise pour mettre à jour mon Home Assistant en évitant au maximum les problèmes de compatibilité de configuration. L’idée est de valider la configuration actuelle avec la version courante de HA puis avec la dernière version et de mettre à jour automatiquement s’il n’y a pas d’erreur remontée. L’utilisation de drone.io est une alternative à Github Actions mais vous imposera une installation @home de quelques outils. La solution proposée est donnée à titre d’exemple (fonctionnel) et sera à adapter pour coller à votre fonctionnement.

Prérequis

Pour continuer, vous devez :

  • Gérer votre configuration HA avec un outil de gestion de version tel que Git.
  • Un serveur Git comme gogs.io ou gitea.io qui devra être compatible avec drone.io (à voir ici).
  • Installer un serveur drone.io et un runner qui va gérer les étapes à réaliser pour mettre à jour HA selon le scénario décrit.
  • Relier votre drone.io à votre projet git qui héberge votre configuration.

Fonctionnement

Ma configuration est donc gérée par Git. J’utilise 2 branches :

  • La branche “test” sur laquelle je pousse toutes mes modifications de configuration. Chaque push déclenche la validation de la configuration avec la version actuelle de HA et la version fraichement mise à jour.
  • Quand je souhaite déployer mes mises à jour et mettre à jour ma version de HA, je merge la branche “test” sur “master” et le push va déclencher l’installation de mes modifications et la mise à jour de HA.
  • drone.io me permet aussi de déclencher en console la mise à jour de HA ou via l’IHM.
  • Si ma configuration n’est pas valide, le scénario de mise à jour s’arrête.

Home Assistant est installé en virtualenv python. J’utilise 2 virtualenv :

  • Un pour la version déployée de Home Assistant, celle actuellement utilisée.
  • Un qui est systématiquement mis à jour et qui me permet de vérifier que ma configuration est toujours valide avec l’éventuelle mise à jour.

Mon scénario drone.io va réaliser les étapes suivantes (en s’arrêtant si un problème est rencontré) :

  • Tester ma configuration sur la version HA actuellement déployée.
  • Tester ma configuration sur la version HA mise à jour.

Si je ne suis pas sur ma branche de test, on rajoutera au scénario :

  • Un status et stop de HA.
  • Mise à jour des confs.
  • Mise à jour de ma version de HA.
  • Redémarrage/status de HA.

En image, ca donne ca :

test_ha.png

maj_ha.png

.drone.yml

Voilà mon fichier .drone.ymldont je viens de vous détailler le fonctionnement.

kind: pipeline
type: exec
name: check config

platform:
  os: linux
  arch: amd64

steps:
- name: on latest
  commands:
  - . /srv/homeassistant-test/bin/activate
  - python3 -m pip install --upgrade homeassistant
  - vault login -address=$VAULT_ADDR -no-print $VAULT_TOKEN > /dev/null 2>&1
  - >
    vault kv get -format=json hass/secrets|jq -r '.data.data|keys[] as $k | "\($k): \(.[$k])"' >  conf/secrets.yaml    
  - hass -c conf --script check_config
  environment:
    VAULT_TOKEN:
      from_secret: vaultToken
    VAULT_ADDR: https://vault
- name: on current
  commands:
  - . /srv/homeassistant/bin/activate
  - vault login -address=$VAULT_ADDR -no-print $VAULT_TOKEN > /dev/null 2>&1
  - >
    vault kv get -format=json hass/secrets|jq -r '.data.data|keys[] as $k | "\($k): \(.[$k])"' >  conf/secrets.yaml    
  - hass -c conf --script check_config
  when:
    branch:
      - test
  environment:
    VAULT_TOKEN:
      from_secret: vaultToken
    VAULT_ADDR: https://vault

trigger:
  branch:
  - test
  - master

node:
  host:hass
---
kind: pipeline
type: exec
name: upgrade

platform:
  os: linux
  arch: amd64

steps:
- name: HA status
  commands:
  - sudo systemctl status hass@homeassistant.service

- name: HA stop
  commands:
  - sudo systemctl stop hass@homeassistant.service

- name: HA upgrade
  commands:
  - rsync -avS --no-o --no-g --exclude .git --exclude zwcfg_0x.xml conf/ /home/homeassistant/hass/conf/
  - vault login -address=$VAULT_ADDR -no-print $VAULT_TOKEN > /dev/null 2>&1
  - >
    vault kv get -format=json hass/secrets|jq -r '.data.data|keys[] as $k | "\($k): \(.[$k])"' >  /home/homeassistant/hass/conf/secrets.yaml    
  - cd /srv/homeassistant
  - . bin/activate
  - python3 -m pip install --upgrade homeassistant
  environment:
    VAULT_TOKEN:
      from_secret: vaultToken
    VAULT_ADDR: https://vault

- name: HA start
  commands:
  - sudo systemctl start hass@homeassistant.service

- name: HA check restart
  commands:
  - sudo systemctl status hass@homeassistant.service
depends_on:
- check config

trigger:
  status:
  - success
  branch:
  - master
node:
  host: hass
---
kind: secret
name: vaultToken
get:
  path: certificates/data/drone
  name: token

Un petit détail ne vous à certainement pas échappé… Je gère mes secrets Home Assistant dans un Vault. Il faudra adapter cette partie là pour gérer votre secrets.yamlutilisé lors des validations de configuration de HA. Ou attendre la suite ;) Je fonctionne sur ce principe depuis quelques semaines et j’en suis satisfait. L’utilisation de drone.io est une bonne alternative à Github Actions et tout ce mécanisme permet de garder la main sur ses données.