Surveiller l'accès à internet avec Home Assistant

À la maison, nous utilisons un routeur 4G avec une carte SIM Free afin d'accéder à internet en attendant l'arrivée de la fibre. Nous perdons, parfois, notre accès à internet et nous devons redémarrer le routeur 4G afin d'accéder de nouveau à nos sites favoris.

N'étant pas forcément à mon domicile durant les coupures, j'utilise Home Assistant afin de vérifier l'accès à internet ainsi qu'une prise connectée pour redémarrer automatiquement le routeur 4G si besoin.

Vérification de l'accès à internet

Home Assistant fournit l'intégration ping permettant de tester l'accessibilité d'une autre machine à travers un réseau IP. Nous allons effectuer un ping vers différents serveurs DNS afin de vérifier l'accès à internet. J'ai choisi d'utiliser quatre serveurs DNS mais vous pouvez en ajouter autant que vous le souhaitez. Vous pourrez trouver d'autres adresses IP de serveurs DNS sur le site public-dns.info.

Il est important de garder le même préfixe - exemple : "Ping - Internet access - " - pour le nom de chacune de vos entités.

binary_sensor:
  - platform: ping
    name: Ping - Internet access - DNS - Cloudflare
    host: 1.1.1.1
    count: 2
    scan_interval: 60
  - platform: ping
    name: Ping - Internet access - DNS - FDN
    host: 80.67.169.12
    count: 2
    scan_interval: 60
  - platform: ping
    name: Ping - Internet access - DNS - Google
    host: 8.8.8.8
    count: 2
    scan_interval: 60
  - platform: ping
    name: Ping - Internet access - DNS - Quad9
    host: 9.9.9.9
    count: 2
    scan_interval: 60

Nous allons ajouter un binary sensor avec un device class de type problem qui sera à off quand tout va bien et à on lorsque plus de la moitié des requêtes ping seront KO.

template:
  - binary_sensor:
      - name: Internet access
        state: >
          {{ (states.binary_sensor 
          | selectattr('attributes.device_class', 'eq', 'connectivity') 
          | selectattr('entity_id', 'match', 'binary_sensor.ping_internet_access_')
          | selectattr('state','eq','on')
          | list | count | int) 
          < 
          (((states.binary_sensor 
          | selectattr('attributes.device_class', 'eq', 'connectivity') 
          | selectattr('entity_id', 'match', 'binary_sensor.ping_internet_access_')
          | list | count | int) / 2) | round(0, 'ceil')) }}
          device_class: problem

N'hésitez pas à utiliser Outils de développement au sein d'Home Assistant pour comprendre ce que réalise chaque selectattr().

Redémarrer le routeur

Avant de se lancer dans l'automatisation, il convient d'expliquer le choix du modèle Shelly Plug S.

Shelly Plug S

Le routeur 4G fait partie des appareils sensibles au sein de la maison. Par conséquent, il doit toujours être allumé. Il fallait donc que la prise connectée répondent à quelques critères pour être utilisée :

  • Posséder un bouton physique permettant l'allumage et l'extinction de la prise
  • S'allumer automatiquement, après une extinction ou une coupure de courant, au bout de quelques secondes sans aucune intervention
  • Bonus : si elle possède un voyant lumineux, avoir la possibilité de l'éteindre

Ayant une prise Shelly Plug S dans le placard, j'ai décidé naturellement de l'utiliser, mais toutes les prises connectées répondant à ces critères auraient pu faire l'affaire.
Voici le paramétrage effectué sur la prise :

Interface du Shelly Plug S : Timer ➜ Auto on ➜ 10 seconds
Interface du Shelly Plug S : Timer ➜ Auto on ➜ 10 seconds
Interface du Shelly Plug S : Settings ➜ Power on default mode ➜ ON
Interface du Shelly Plug S : Settings ➜ Power on default mode ➜ ON

Automatisation

Le scénario est très simple : lorsque le binary sensor Internet access passe à l'état on durant plus de deux minutes, il faut éteindre la prise connectée. Puis, si cette dernière est toujours éteinte au bout de 15 secondes, forcer son allumage.

La prise Shelly Plug S correspond dans l'automatisation à l'entité : switch.bureau_routeur_4g.

automation:
  - description: Check internet connection
    alias: check_internet_connection
    id: 7f45bcd7-7478-410e-ae1b-3771220f8179
    trigger:
      - platform: template
        value_template: "{{ is_state('binary_sensor.internet_access', 'on') }}"
        for:
          minutes: 2
    action:
      - service: switch.turn_off
        entity_id: switch.bureau_routeur_4g
      - delay:
          seconds: 15
      - choose:
          - conditions: "{{ is_state('switch.bureau_routeur_4g', 'off') }}"
            sequence:
              - service: switch.turn_on
                entity_id: switch.bureau_routeur_4g

Conclusion

J'utilise ce scénario depuis plusieurs mois et nous n'avons pas eu de faux positifs malgré la dizaine de coupures que nous avons subi.

Comme vous avez pu le remarquer, cette automatisation se déclenche une seule fois en cas de perte d'accès à internet. Si la coupure persiste encore suite au redémarrage du routeur 4G, mon réseau local bascule automatiquement sur la connexion ADSL afin de permettre une continuité même si le débit reste très faible.