Mise à jour de plusieurs noms de domaine (sans add-on)

Extrait du sujet NginX Proxi Manager perd la connexion dès que la Livebox reboot :

Pour ceux qui ne veulent pas utiliser l’add-on DuckDNS et qui ont plusieurs noms de domaine, voici 3 méthodes alternatives pour informer DuckDNS de la mise à jour de l’adresse IP…

1. Utiliser une seconde fois l’intégration DuckDNS

En fait, chaque intégration native est disponible en téléchargement depuis le GitHub officiel Home Assistant Core
Donc si on télécharge le zip du projet global :

animate

On a maintenant tous le nécessaire pour récupérer l’intégration DuckDNS qui nous intéresse.

On dois désarchiver le fichier téléchargé, naviguer dedans jusqu’à l’intégration DuckDNS et copier le dossier de l’intégration dans notre instance Home Assistant dans le dossier custom_components (si le dossier custom_components n’éxiste pas, il faut le créer dans le dossier /config) :

animate

On a donc le dossier duckdns dans notre dossier custom_components.
Si on laisse ainsi, l’intégration duckdns appelée dans le fichier configuration.yaml par les lignes :

#configuration.yaml
duckdns:
  domain: mon_domaine
  access_token: mon_soken

c’est maintenant le dossier présent dans custom_components qui est appelé car il est prioritaire (cela permet d’outrepasser n’importe quelle intégration native si on veut faire des modifications).

:warning: A la prochaine mise à jour de l’intégration (contenue dans une mise à jour de Home Assistant), l’intégration ne sera pas mise à jour car ce sera toujours le dossier présent dans custom_components qui sera appelé et qui n’aura pas été modifié à moins de récupérer la dernière version comme précédemment).

La demande initiale est de pouvoir mettre à jour plusieurs noms de domaine, donc il faut modifier l’intégration que nous venons de copier.

Le principe est le suivant : l’intégration incorporée va mettre à jour un nom de domaine et l’intégration que nous venons de placer dans le dossier custom_components mettra à jour un second nom de domaine (si un troisième nom de domaine, il faudra répéter les opérations).

Pour pourvoir utiliser 2 intégrations DuckDNS, il faut modifier celle que nous venons de placer, en la renommant duckdns_2 au lieu de duckdns :

animate

  • On renomme le dossier en duckdns_2
  • On renomme dans le fichier init.py : DOMAIN = "duckdns_2"
  • On renomme dans le fichier manifest.json : "domain": "duckdns_2",
  • On renomme dans le fichier services.yaml : set_txt_2:

On oublie pas de sauvegarder :wink:

On a maintenant une nouvelle intégration qui peut être appelée dans le fichier configuration.yaml :

#configuration.yaml
duckdns:
  domain: !secret duckdns_domain
  access_token: !secret duckdns_access_token
duckdns_2:
  domain: !secret duckdns_2_domain
  access_token: !secret duckdns_access_token

On redemmare.

C’est tout ! On a maintenant 2 nom de domaine mis à jour par Home Assistant.

:information_source: Il ne faut pas oublier que l’intégration duckdns2 ne se mettra jamais à jour si on ne récupère pas la dernière version de l’intégration duckdns à chaque mise à jour de Home Assistant.

Si on as un troisième nom de domaine, il faut créer de la même manière duckdns_3

2. Utiliser une requête RESTful (mise à jour du nom de domaine sans automatisation)
Si on gratte un peu le sujet, on trouve rapidement la requête qu’il faut envoyer pour mettre à jour l’adresse IP :

https://www.duckdns.org/update?domains=$DOMAINS&token=$TOKEN&ip=$NEWIP

Home assistant permet de lancer des requêtes et de conserver le résultat dans une entité : RESTful - Home Assistant

On va donc utiliser la plateforme rest.

Nous avons donc besoin pour construire la requête :

  • le nom de domaine : sois en dur dans le code, sois dans une entité input_text (mode Texte)
  • le token : sois en dur dans le code, sois dans une entité input_text (mode Password)
  • l’adresse IP extérieur : DNS IP - Home Assistant

Je vais détailler les deux choix (en dur dans le code ou par des entités paramétrables) :

En dur dans le code :

sensor:
  - platform: dnsip
    name: Home Assistant IP
rest:
  - resource_template: https://www.duckdns.org/update?domains=<DOMAINE>&token=<TOKEN>ip={{states('sensor.home_assistant_ip')}}
    scan_interval: 300
    sensor:
      - name: "Reponse de DuckDNS"

Par des entités paramétrables :

sensor:
  - platform: dnsip
    name: Home Assistant IP
rest:
  - resource_template: https://www.duckdns.org/update?domains={{states('input_text.nom_de_domaine')}}&token={{states('input_text.duckdns_token')}}&ip={{states('sensor.home_assistant_ip')}}
    scan_interval: 300
    sensor:
      - name: "Reponse de DuckDNS"

On redémarre.

Maintenant, si on est passé par les entités personnalisée, il faut les renseignées (dans une cartes entités par exemple).
A chaque changement d’adresse ip détecté par la plateforme dnsip, l’entité sensor.home_assistant_ip sera mise à jour.
Sa mise à jour entraîne l’envoie de la requête de mise à jour car l’entité mise à jour est présente dans le modèle de la requête.

C’est tout.
La différence avec la première solution et que nous ne sommes pas dépendant d’une intégration et de ses mises à jour.

3. Utiliser une commande RESTful (mise à jour du nom de domaine avec automatisation)

Cette méthode est quasiment identique à la précédente.

Au lieu d’utiliser la plateforme rest, on peut utiliser l’intégration RESTful Command : RESTful Command - Home Assistant

On a besoin des mêmes informations que la méthode précédente (adresse ip, nom de domaine et token) :

rest_command:
  update_duckdns: 
    url: https://www.duckdns.org/update?domains={{states('input_text.nom_de_domaine')}}&token={{states('input_text.duckdns_token')}}&ip={{states('sensor.home_assistant_ip')}}

On redémarre.

On a maintenant un nouveau service disponible du nom de rest_command.update_duckdns.

Il faut donc utiliser une automatisation qui détecte un changement d’adresse ip pour envoyer la requête de mise à jour (elle doit s’exécuter également au démarrage si jamais l’adresse ip externe change pendant un redémarrage ou l’initialisation de HA) :

alias: DuckDNS - Mise à jour <DOMAINE>
description: 'Mise à jour du nom de domaine sur changement d'adresse ip externe (et au démarrage)'
trigger:
  - platform: state
    entity_id: sensor.home_assistant_ip
  - platform: homeassistant
    event: start
condition: []
action:
  - service: rest_command.update_duckdns
mode: single

C’est fini pour mes explications.

4 « J'aime »

Ce n’est pas tout à fait clair pour le 2.

A quelle fréquence le sensor ‹ dnsip › vérifie l’IP ? un scan interval par défaut ?

Le sensor ‹ rest › est uniquement exécuté quand la valeur du sensor ‹ dnsip › change ? Pourquoi un scan interval dans celui-là ?

Quand on suit le lien vers la documentation que j’ai inclus, on lit que l’intervalle par défaut est de 2min (120 secondes) → Lien vers la propriété scan_interval

Quand on suit le lien vers la documentation que j’ai inclus, on lit que dans les exemples, on peut utiliser la propriété scan_interval.

Ce n’est pas obligatoire, mais cela permet de s’assurer que l’on envoie toutes les 5 minutes (300 secondes) l’adresse IP publique à DuckDNS.

Le changement d’adresse ip via l’intégration dsnip force la mise à jour du capteur, mais je trouve cela plus robuste de forcer la mise à jour toutes les 5min (ça peut être toutes les heures…) au cas où (suite à un redémarrage inopiné ou de surcharge (réseaux, processeur)). Ca fait ceinture et bretelles…

Donc la 3ème méthode est la plus adaptée, il n’y a pas de requête de mise à jour inutile !

Oui tu as tout à fait raison.

Bon, j’ai mis en place la première solution en pensant que c’était la plus simple. Elle fonctionne bien, mais ne sera pas mise à jour par HA. Ok (Est-ce important ?)
Mais vous êtes d’accord pour dire que c’est la troisième solution la mieux. Je suis têtu mais pas borné…

Comme je ne comprends pas toute la démarche, … le fait d’envoyer une requète ou une commande RESTful permet-il d’envoyer une demande à Duckdns de remettre à jour les adresses IP de TOUS les domaines qu’il gère ?

La méthode 3 permet de n’envoyer la demande de mise à jour qu’au démarrage et sur changement détecté.

Elle fonctionnera tant que DuckDNS ne change pas le format de la requête.

Si tu as 2 noms de domaines,tu peux très bien utiliser l’intégration duckdns native (et qui sera toujours à jours au gré des installations) et utiliser la méthode 3 pour le deuxième nom de domaine.

Si tu en a 3, il faudra repérer la méthode 3 une seconde fois (pour le 3ème nom de domaine).

Mais bon, quitte à devoir les gérer autrement que par l’intégration native, mon profil informaticien m’amène à tous les passer en méthode 3 et ne plus utiliser l’intégration native.

Mais je ne peux que préconiser la méthode 1 avec une assiduité sur la vérification de présence de modification (ou simplement ne rien vérifier et récupérer à chaque mise à jour) sinon la méthode 3…

Pas sûr que mon petit cerveau ait tout assimilé…
Mais comme dans l’état actuel la solution 1 fonctionne à merveille…
Si une mise à jour venait à planter le système, je m’en rendrais assez rapidement compte…
J’aviserai à ce moment là si je bascule vers la solution 3 :grin:

En tous cas, un grand merci pour le temps que tu passes à nous aider, et pour tous les petits tutos que tu mets sur le site :muscle: :trophy:

1 « J'aime »

Nous y voilà !
Suite à une grosse mise à jour, je me retrouve avec une problématique avec notre custom integration.

J’ai utilisé la première méthode de ce tuto, et une mise à jour l’a rendue obsolète. Le système n’est plus accessible depuis l’extérieur, et pour cause :

Je pourrais recommencer l’opération avec la nouvelle version du Core, mais ces avertissements me laissent penser que malgré cela, il faudra aller plus loin dans l’adaptation.
Mais là on dépasse mes capacités redevenues presque nulles après quelques mois d’inactivité sous HA.

Par ailleurs, les évolutions de HA depuis ce tuto ne permettent-elles toujours pas de gérer plusieurs mises à jours de noms de domaines ?

Il faut passer par un add-on me semble.

Mais je pense que la modification n’est pas enorme a faire.

Il faut juste ajouter la clé manquante qui est devenue obligatoire depuis pas mal de version.