Je surveille visuellement mon réseau Zigbee (Linkquality & Last_seen)

Objectif : rendre visibles (et exploitables) deux infos clés pour chaque device Zigbee :

  • linkquality (santé radio) et
  • last_seen (dernière communication)

Cela afin de repérer immédiatement une sirène “perdue” ou une batterie HS, sans attendre de le découvrir par hasard.

🧭 Pourquoi j’ai mis ça en place

Avec 69 appareils Zigbee, je n’avais pas de visibilité simple pour répondre à deux questions basiques : est-ce que l’appareil capte correctement ? et est-ce qu’il a communiqué récemment ?
Sur une sirène, ce n’est pas acceptable de le découvrir “au hasard” : je veux voir immédiatement si elle est muette, hors réseau, ou en difficulté radio.

J’ai donc décidé d’afficher partout :

  • linkquality : indicateur de qualité du lien radio (LQI). (C’est une “photo” utile pour repérer les zones faibles.)
  • last_seen : date/heure de la dernière communication (ou un temps relatif : 12s, 4m, 2h…).



⚠️ Piège #1 : il y a deux “configuration.yaml”

Au début, je me suis fait avoir : dans Home Assistant, il y a bien deux fichiers différents.

  • Le fichier principal de Home Assistant : /config/configuration.yaml
  • Le fichier de Zigbee2MQTT : /config/zigbee2mqtt/configuration.yaml

Important : pour last_seen et (en pratique) l’exposition/activation par défaut, tout se configure côté Zigbee2MQTT, donc dans /config/zigbee2mqtt/configuration.yaml.

🧹 Piège #2 : l’UI de l’add-on Zigbee2MQTT peut “nettoyer” des options

J’ai eu un comportement très pénible : j’ajoutais des options avancées, je sauvegardais… puis l’interface de l’add-on semblait “simplifier” le fichier en supprimant ce qu’elle ne comprenait pas.

La méthode fiable (chez moi) :

  • J’édite directement /config/zigbee2mqtt/configuration.yaml (File Editor ou SSH)
  • Je sauvegarde
  • Je redémarre Zigbee2MQTT

🕒 Activer last_seen dans Zigbee2MQTT (obligatoire)

Par défaut, Zigbee2MQTT peut ne pas publier last_seen (valeur “disable”).
Pour l’activer, j’ajoute ceci dans la section advanced de /config/zigbee2mqtt/configuration.yaml :

advanced:
  # Ajoute "last_seen" dans les messages MQTT
  # valeurs possibles: disable, ISO_8601, ISO_8601_local, epoch
  last_seen: ISO_8601_local

Ce réglage indique à Zigbee2MQTT d’ajouter l’attribut last_seen aux messages MQTT, avec un format lisible en heure locale.

Formats utiles (pour choisir)

  • ISO_8601_local : lisible + fuseau local (le plus pratique au quotidien).
  • ISO_8601 : lisible, mais en UTC (utile pour centraliser tout en UTC).
  • epoch : timestamp Unix (pratique pour scripts/traitements).

🧩 Activer last_seen et linkquality “par défaut” dans Home Assistant (facultatif)

Une fois last_seen activé côté Zigbee2MQTT, il reste un point : dans Home Assistant, ces entités sont souvent classées “diagnostic”, donc elles peuvent être créées mais désactivées automatiquement.

Pour que chaque nouvel appareil Zigbee ajouté arrive directement “prêt à superviser”, j’ajoute ceci dans /config/zigbee2mqtt/configuration.yaml :

device_options:
  homeassistant:
    last_seen:
      enabled_by_default: true
    linkquality:
      enabled_by_default: true

Puis je redémarre Zigbee2MQTT.

Important : impact sur les appareils déjà installés

Ce réglage aide surtout les nouveaux appareils (ou les appareils redécouverts).
Pour les devices déjà présents, il faut souvent activer manuellement les entités correspondantes dans Home Assistant.

🗄️ Base de données : garder l’info visible sans “polluer” l’historique

Le “risque” n’est pas tellement Zigbee2MQTT (il ajoute juste un champ timestamp dans les messages), mais plutôt Home Assistant si on enregistre chaque update de last_seen dans la base : ça peut générer beaucoup d’écritures avec beaucoup de capteurs.

Mon choix : je veux voir ces valeurs partout, mais je n’ai pas besoin de graphes minute par minute. J’exclus donc ces entités du recorder.

Ce que je mets dans /config/recorders.yaml

recorder:
  exclude:
    entity_globs:
      - sensor.*_last_seen
      - sensor.*_linkquality

Après ça, je redémarre Home Assistant : les valeurs restent visibles en temps réel, mais je limite fortement la création d’historique inutile.

🗺️ Supervision visuelle : un plan “radio + fraîcheur”

Je ne voulais pas “une entité perdue dans une liste” : je voulais une supervision visuelle, immédiatement lisible.

Principe :

  • Chaque appareil Zigbee apparaît sous forme d’un petit rectangle sur un plan.
  • Le nombre affiché en gros = Linkquality.
  • Le temps en bas à droite = Last_seen en relatif (s / m / h / d).
  • Le cadre noir = routeur (variable router: 1), pour reconnaître vite les routeurs.

🧰 La carte “decluttering” (réutilisable)

J’utilise la magie de la carte decluttering_templates que j’avais décrite dans cette page il y a 3 ans :

Ainsi decluttering_templates + custom:decluttering-card pour réutiliser le même composant partout, en ne changeant que 4 variables.

Je défini tout simplement 4 éléments qui sont différents pour chaque appareils :

  • zone: c’est le capteur qui va être traité
  • top: sa position depuis le haut
  • left: sa position depuis la gauche
  • router: 1 si c’est un routeur sinon 0

Exemple : page Dashboard très simple

type: picture-elements
image: /local/maison/1920x1000/off_0800.png
elements:
  - type: custom:decluttering-card
    template: linkquality
    variables:
      - zone: sensor.lumiere_chambre_parents
      - top: 20%
      - left: 35%
      - router: 1

  - type: custom:decluttering-card
    template: linkquality
    variables:
      - zone: sensor.fenetre_de_la_chambre_des_parents
      - top: 15%
      - left: 37%
      - router: 0

Le template linkquality (le “gros morceau”)

decluttering_templates:
  linkquality:
    default:
      - top: 5%
      - left: 95%
      - router: 0
    element:
      type: custom:button-card
      entity: |
        [[[
          return `[[zone]]_linkquality`;
        ]]]
      show_icon: false
      name: |
        [[[
          return '[[zone]]'
                  .replace(/^sensor\\./i, '')
                  .replace(/_/g, ' ')
                  .trim();
        ]]]
      show_state: true
      show_units: false
      custom_fields:
        lastseen: |
          [[[
            const obj = states[`[[zone]]_last_seen`];
            if (!obj || !obj.state || obj.state === 'unavailable') return '!!';
            const last = new Date(obj.state);
            if (isNaN(last.getTime())) return '!!';
            const now = new Date();
            const seconds = Math.floor((now - last) / 1000);

            if (seconds < 60) return `${seconds}s`;
            const minutes = Math.floor(seconds / 60);
            if (minutes < 60) return `${minutes}m`;
            const hours = Math.floor(minutes / 60);
            if (hours < 24) return `${hours}h`;
            const days = Math.floor(hours / 24);
            return `${days}d`;
          ]]]
      styles:
        card:
          - border: |
              [[[ return ([[router]] == 1) ? '2px solid black' : 'none'; ]]]
          - box-shadow: none
          - position: relative
          - border-radius: 8px
          - min-width: 100px
          - height: 45px
          - display: flex
          - flex-direction: column
          - justify-content: center
          - align-items: center
          - color: white
        name:
          - font-size: 10px
          - line-height: '1'
          - padding: 0
          - margin: 0
          - text-align: center
          - color: white
          - flex: 1
          - max-width: 95px
          - word-wrap: break-word
          - overflow: hidden
          - white-space: normal
        state:
          - font-size: 15px
          - font-weight: bold
          - line-height: '1'
          - padding: 0
          - margin: 0
          - text-align: center
          - color: white
          - flex: 1
        custom_fields:
          lastseen:
            - position: absolute
            - bottom: 0px
            - right: 0px
            - font-size: 10px
            - color: black
            - padding: 2px 4px
            - border-radius: 4px
            - box-shadow: 0 1px 3px rgba(0,0,0,0.3)
            - background: |
                [[[
                  const obj = states[`[[zone]]_last_seen`];
                  if (!obj || !obj.state) return 'rgba(128,128,128,0.5)';
                  const last = new Date(obj.state);
                  const now = new Date();
                  const seconds = Math.floor((now - last) / 1000);
                  if (seconds < 1200) return 'rgba(0,255,0,0.9)';       // Vert <20min
                  if (seconds < 1800) return 'rgba(255,255,0,0.9)';     // Jaune 20-30min
                  if (seconds < 7200) return 'rgba(255,165,0,0.9)';     // Orange <2h return 'rgba(255,0,0,0.9)'; // Rouge >2h
                ]]]
      state:
        - value: unavailable
          styles:
            card:
              - background: rgba(255,0,0,0.3)
        - operator: '>'
          value: 200
          styles:
            card:
              - background: rgba(0,180,0,0.3)
        - operator: '>'
          value: 150
          styles:
            card:
              - background: rgba(34,255,34,0.3)
        - operator: '>'
          value: 130
          styles:
            card:
              - background: rgba(255,255,0,0.3)
        - operator: '>='
          value: 80
          styles:
            card:
              - background: rgba(255,165,0,0.3)
        - operator: '<'
          value: 80
          styles:
            card:
              - background: rgba(255,107,53,0.3)
      style:
        top: '[[top]]'
        left: '[[left]]'

Simplement, que fait ce code ?

Ce template définit un modèle unique de carte que tu réutilises pour tous tes appareils Zigbee, en ne changeant que la variable [[zone]].

La propriété entity est construite dynamiquement en JavaScript ([[[ … ]]]) pour pointer vers l’entité [[zone]]_linkquality, ce qui permet d’afficher automatiquement la qualité de lien du device (valeur LQI remontée par Zigbee2MQTT ou ZHA).

Le name est lui aussi généré côté client : on retire le préfixe sensor. puis on remplace les _ par des espaces et on fait un trim(), ce qui produit un libellé lisible à partir de l’ID de l’entité.

Le champ personnalisé lastseen lit l’entité [[zone]]_last_seen dans states[], convertit sa valeur en objet Date, puis calcule la différence avec l’heure actuelle pour afficher un temps relatif (s, m, h, d). Si la valeur est vide, unavailable ou une date invalide, il affiche !! au lieu de laisser apparaître une valeur incohérente.

Le style du badge lastseen en bas à droite utilise une fonction JavaScript qui renvoie une couleur RGBA différente selon l’âge de la dernière communication (gris si pas de valeur, puis vert → jaune → orange → rouge en fonction du nombre de secondes écoulées), ce qui encode visuellement la fraîcheur des données.

La section state: du button-card définit plusieurs seuils sur la valeur de LinkQuality : indisponible, puis tranches >200, >150, >130, >=80, <80, chacune appliquant un fond coloré spécifique à la carte, ce qui transforme une valeur numérique en indicateur de qualité radio immédiatement lisible.

Les propriétés de mise en forme (flex, min-width, height, border-radius, position absolute du badge, etc.) assurent un rendu compact et uniforme, avec une bordure noire optionnelle quand [[router]] == 1 pour identifier visuellement les routeurs Zigbee par rapport aux simples terminaux.

🧠 Ajouts utiles : infos “santé” globales Zigbee2MQTT

Voici le code de cette carte

type: picture-elements
image: /local/maison/1920x1000/off_0800.png
elements:
  - type: custom:mod-card
    card:
      type: entities
      title: Zigbee2MQTT
      show_header_toggle: false
      entities:
        - entity: switch.zigbee2mqtt_bridge_permit_join
          name: Autoriser inclusion
        - entity: button.zigbee2mqtt_bridge_restart
          name: Redémarrer
        - entity: select.zigbee2mqtt_bridge_log_level
          name: Niveau de log
        - entity: binary_sensor.zigbee2mqtt_bridge_connection_state
          name: État de connexion
        - type: custom:template-entity-row
          name: Lancé depuis
          state: >
            {% if states('binary_sensor.zigbee2mqtt_bridge_connection_state')
            not in ['unavailable', 'unknown'] %}
              {{ ((now() - states('binary_sensor.zigbee2mqtt_bridge_connection_state').last_changed).total_seconds() / 3600) | round(1) }} h
            {% else %}
              Non disponible
            {% endif %}
        - entity: sensor.zigbee2mqtt_bridge_coordinator_version
          name: Version coordinateur
        - entity: sensor.zigbee2mqtt_bridge_version
          name: Version Zigbee2MQTT
        - entity: sensor.nombre_de_capteurs_linkq_en_erreur
          name: Injoignables
          icon: mdi:alert-circle
        - entity: sensor.nombre_de_capteurs_linkq
          name: Total
          icon: mdi:devices
        - entity: sensor.zigbee_linkquality_moyenne
          name: Moyenne LinkQuality
          icon: mdi:signal
    style:
      top: 35%
      left: 75%
      width: 450px

J’ai ajouté un capteur pour calculer la moyenne de Linkquality

Ce capteur s’ajoute dans le fichier templates.yaml, voici son code :

- name: "zigbee_linkquality_moyenne"
  unique_id: zigbee_linkquality_moyenne
  unit_of_measurement: "LQI"
  state_class: measurement
  state: >-
    {% set linkqualities = states.sensor 
       | selectattr('entity_id', 'search', '_linkquality')
       | selectattr('state', 'is_number')
       | map(attribute='state') | map('float') | list %}
    {% if linkqualities | length > 0 %}
      {{ (linkqualities | sum / linkqualities | length) | round(1) }}
    {% else %} 0 {% endif %}

J’ai ajouté un capteur pour calculer le nombre de capteurs

- name: "Nombre de capteurs Linkq"
  unique_id: sensor.nombre_capteurs_linkq
  state: >-
    {% set lq_sensors = states.sensor
       | selectattr('entity_id', 'search', '_linkquality$')
       | list %}
    {{ lq_sensors | count }}
  icon: mdi:signal-variant
  unit_of_measurement: "capteurs"

J’ai ajouté un capteur pour calculer le nombre d’appareils en erreur

- name: "Nombre de capteurs Linkq en erreur"
  unique_id: sensor.nombre_capteurs_linkq_erreur
  state: >-
    {% set lq_sensors = states.sensor
       | selectattr('entity_id', 'search', '_linkquality$')
       | selectattr('state', 'in', ['unavailable', 'unknown', 'None'])
       | list %}
    {{ lq_sensors | count }}
  icon: mdi:alert-circle
  unit_of_measurement: "capteurs"

J’ai ajouté un indicateur sur le dasboard principal pour signaler le nombre en erreur

Tout d’abord ce template pour afficher xx en erreur / yy au total

- name: "zigbee_injoignables_synthese"
  unique_id: sensor.zigbee_injoignables_synthese
  state: >-
    {{ states('sensor.nombre_de_capteurs_linkq_en_erreur') }}/{{ states('sensor.nombre_de_capteurs_linkq') }}
  icon: mdi:alert-circle

Et dans mon picture-elements, j’ajoute :

- type: conditional
  conditions:
    - condition: state
      entity: sensor.nombre_de_capteurs_linkq_en_erreur
      state_not: "0"
  elements:
    - type: custom:button-card
      entity: sensor.zigbee_injoignables_synthese
      icon: mdi:zigbee
      show_name: false
      show_state: true
      style:
        top: 5%
        left: 5%
        transform: translate(-50%, -50%)
      styles:
        state:
          - color: red
          - font-weight: 700
          - font-size: 16px
        icon:
          - color: red
          - width: 20px
          - height: 20px
        card:
          - border-radius: 999px
          - padding: 4px 6px
          - background: transparent
          - box-shadow: none

Ce bloc sert à afficher un petit indicateur rouge « Zigbee en erreur » sur le dashboard plan uniquement quand il y a au moins un capteur problématique.

C’est un élément conditional dans une carte picture-elements : il ne montre son contenu que si sensor.nombre_de_capteurs_linkq_en_erreur est différent de « 0 » (donc si au moins un capteur est injoignable ou en erreur de LinkQuality).

Quand la condition est vraie, il affiche un custom:button-card basé sur sensor.zigbee_injoignables_synthese, qui contient probablement un texte du style « 3 en erreur » ou similaire.

Le bouton est placé en haut à gauche du plan (5 % / 5 %), centré grâce au transform: translate(-50%, -50%), avec un fond transparent et sans ombre pour ne garder que l’icône Zigbee et le texte.

L’icône Zigbee et l’état sont stylés en rouge, en gras et en taille 16 px, avec un border-radius: 999px pour donner un aspect de pastille/étiquette, ce qui en fait un avertissement visuel discret mais bien visible tant qu’il existe des capteurs en erreur.

Pour savoir qui est en erreur

Pour avoir d’un coup d’œil la liste des équipements en erreur, voici les codes nécessaires.

La déclaration des templates

- name: "Nombre de capteurs Linkq en erreur"
  unique_id: sensor.nombre_capteurs_linkq_erreur
  state: >-
    {% set lq_sensors = states.sensor
       | selectattr('entity_id', 'search', '_linkquality$')
       | selectattr('state', 'in', ['unavailable', 'unknown', 'None'])
       | list %}
    {{ lq_sensors | count }}
  icon: mdi:alert-circle
  unit_of_measurement: "capteurs"

- name: "Liste capteurs Linkquality en erreur"
  unique_id: sensor.liste_capteurs_linkquality_erreur
  state: >-
    {% set lq_sensors = states.sensor
       | selectattr('entity_id', 'search', '_linkquality$')
       | selectattr('state', 'in', ['unavailable', 'unknown', 'None'])
       | map(attribute='entity_id')
       | map('regex_replace', 'sensor\\\\\\\\.(.*)_linkquality$', '\\\\\\\\1')
       | list %}
    {% set count = lq_sensors | length %}
    {% if count == 0 %}
      Aucun
    {% elif count <= 5 %}
      {{ lq_sensors | join(', ') }}
    {% else %}
      {{ lq_sensors[:5] | join(', ') ~ ' + ' ~ count }}
    {% endif %}
  attributes:
    count: >-
      {% set lq_sensors = states.sensor
         | selectattr('entity_id', 'search', '_linkquality$')
         | selectattr('state', 'in', ['unavailable', 'unknown', 'None'])
         | map(attribute='entity_id')
         | map('regex_replace', 'sensor\\\\\\\\.(.*)_linkquality$', '\\\\\\\\1')
         | list %}
      {{ lq_sensors | length }}
    full_list: >-
      {% set lq_sensors = states.sensor
         | selectattr('entity_id', 'search', '_linkquality$')
         | selectattr('state', 'in', ['unavailable', 'unknown', 'None'])
         | map(attribute='entity_id')
         | map('regex_replace', 'sensor\\\\\\\\.(.*)_linkquality$', '\\\\\\\\1')
         | list %}
      {{ lq_sensors | join(', ') | default('Aucun') }}
  icon: mdi:alert-circle

Et sur le Dasboard, toujours dans le picture-elements

type: picture-elements
image: /local/maison/1920x1000/off_0800.png
elements:
      - type: custom:mod-card
        card:
          type: entities
          title: Capteurs Zigbee en erreur
          entities:
            - type: custom:template-entity-row
              entity: sensor.liste_capteurs_linkquality_en_erreur
              name: Liste
              state: >
                {% set s = states('sensor.liste_capteurs_linkquality_en_erreur')
                %} {% if s not in ['unknown', 'unavailable', ''] %}
                  {{ s.replace(',', '\\\\n') }}
                {% else %}
                  Aucun
                {% endif %}
        style:
          top: 80%
          left: 75%
          width: 450px

✅ Récapitulatif simple (les 3 blocs indispensables)

1. Zigbee2MQTT : activer last_seen

advanced:
  last_seen: ISO_8601_local

2. Zigbee2MQTT : activer par défaut dans HA (optionnel mais pratique)

device_options:
  homeassistant:
    last_seen:
      enabled_by_default: true
    linkquality:
      enabled_by_default: true

3. Home Assistant : ne pas enregistrer ces entités dans la DB

recorder:
  exclude:
    entity_globs:
      - sensor.*_last_seen
      - sensor.*_linkquality

🎯 Ce que ça change au quotidien

  • Je vois immédiatement les zones faibles (linkquality bas) et je sais quoi renforcer (routeur, placement, canal, etc.).
  • Je sais exactement quand une sirène a cessé de parler (last_seen), donc je ne “suppose” plus.
  • Je garde une base de données saine (pas d’historique inutile sur des capteurs qui bougent tout le temps).



Besoin de précisions ? des questions ?

Cette discussion (si elle est encore ouverte) est disponible :

https://forum.hacf.fr/t/retex-je-surveille-visuellement-mon-reseau-zigbee-linkquality-last-seen/76732

Je récupère mes données de santé Withings sur mon Dashboard

J’intègre Withings à Home Assistant

Je décide un jour d’intégrer mes appareils Withings – ma balance connectée et mon tensiomètre – directement dans Home Assistant pour suivre ma santé en temps réel dans ma domotique.

En tant que débutant, vous vous demandez peut-être : « Comment faire pour que ma balance communique avec mon système domotique ? »

Pas de panique, je vous raconte étape par étape cette aventure comme si vous étiez à mes côtés, en expliquant chaque clic et chaque raison.

J’ajoute l’intégration Withings

Je commence par ouvrir Home Assistant sur mon navigateur. J’accède aux Paramètres > Appareils et services > Intégrations > Ajouter une intégration.

Dans la barre de recherche, je tape « Withings » et je sélectionne l’intégration officielle.

Home Assistant me demande alors un Client ID et un Client Secret – des codes secrets que je vais obtenir chez Withings.

C’est comme s’inscrire à un club exclusif pour que les deux systèmes puissent discuter.

Ajout de l'intégration Withings dans Home Assistant

J’étudie la documentation

Avant de plonger tête la première, je lis la documentation fournie par Home Assistant.

Elle m’indique précisément où obtenir ces fameuses clés : sur le portail développeur de Withings.

Pour un débutant, c’est crucial – imaginez-vous essayer d’ouvrir une porte sans clé ! La doc est claire : direction le dashboard développeur Withings.

Documentation de l'intégration Withings

J’accède au portail développeur Withings

Je clique sur le lien et atterris sur la page d’accueil du développeur. Je sélectionne Public Cloud car c’est le mode pour les intégrations comme Home Assistant – pas besoin de serveur privé compliqué. Ensuite, je me connecte avec mon compte Withings personnel, celui lié à mes appareils de santé.

Page d'accueil développeur Withings

Connexion au compte Withings

Je crée ma nouvelle application

Une fois connecté, je clique sur Créer une nouvelle application. Je remplis le formulaire avec des infos basiques :

 

Création nouvelle application Withings

Formulaire création application

Permissions application Withings

J’enregistre et récupère les clés

Je valide la création. Withings génère alors mon Client ID (public) et Client Secret (secret, à ne jamais partager !).

Le bouton « Test » peut afficher une erreur à ce stade – c’est normal.

Application créée Withings

Erreur test bouton Withings

Bouton test en erreur

Client ID et Secret Withings

Je configure Home Assistant avec les clés

De retour dans Home Assistant, je colle le Client ID et le Client Secret dans les champs de l’intégration.

Je valide. Immédiatement, ça me redirige vers Withings pour autoriser l’accès.

Configuration clés dans Home Assistant

Autorisation Withings

J’ajuste l’URL de redirection externe

Par défaut, Withings essaie de revenir sur http://homeassistant.local:8123, mais ce lien local n’est pas accessible depuis les serveurs Withings (qui sont loin de chez moi). J’obtiens une erreur classique :

Erreur URL locale Withings

Erreur connexion locale

Je retourne dans mon app Withings, j’édite l’URL de redirection pour utiliser mon accès externe via Nabucasa

Je sauvegarde et je recommence la config. Victoire !

URL Nabucasa Withings

Succès connexion Withings

J’accueille mes appareils et profils

Une fois connecté, Home Assistant détecte automatiquement mes appareils : « Mes données », « Ma balance » et « Mon tensiomètre ».

Chacun apparaît comme un capteur avec poids, tension artérielle, batterie, etc.

Je renomme pour plus de clarté : « Santé Lionel » pour mes données globales, « Balance » et « Tensiomètre ».

Notez que la balance et le tensiomètre n’ont souvent qu’un seul capteur utile : la batterie.

Appareils détectés Withings

Entités Home Assistant Withings

Renommage appareils

Capteur batterie balance

Capteur batterie tensiomètre

J’ajoute les profils familiaux

Pour la famille, j’ajoute les profils : ma fille indépendante (profil séparé >16 ans), mon autre fille (<16 ans) sur mon compte, et celui de ma femme.

Home Assistant liste tout proprement.

Attention : les batteries peuvent générer des doublons inutiles, j’ai désactivé ces capteurs pour éviter les spams de données.

Profils familiaux Withings

Conseils pour éviter les pièges

  • URL externe obligatoire : Toujours utiliser Nabucasa ou un reverse proxy public.
  • Désactivez les doublons : Les appareils « Balance/Tensiomètre » ne servent qu’à la batterie. Eviter les doublons et désactiver ce qui n’est pas necessaire.

Je personnalise mon Dashboard

Dès que je trouve comment faire…🤣simplement.

 

 

Références utiles

Si vous bloquez, la communauté aide :

Maintenant, mes données santé s’affichent en direct dans Home Assistant – prêt pour des automatisations fun comme des alertes si mon poids décolle !

Je teste le détecteur de fumée Zigbee NOUS E8

🎯 Mes objectifs

J’ai besoin de surveiller ma maison contre les risques d’incendie dès l’apparition des premières fumées.

Le détecteur de fumée Zigbee Nous E8 est idéal pour cette mission, il fait partie des 3 équipements Zigbee de la gamme grand public. Pour arriver à les départager, j’ai réaliser un comparatif :

Les données du E8 permettent des alertes précises dans Zigbee2MQTT et Home Assistant, comme des sirènes, des notifications push et une ventilation automatique.

La sécurité de ma maison est ainsi renforcée de manière simple et efficace.

Cet appareil respecte les normes européennes EN14604 pour les détecteurs de fumée autonomes (DAAF), ainsi que les certifications CE et RoHS, garantissant sa conformité aux standards de sécurité européens.

Le détecteur de fumée photoélectrique Nous E8 home ZigBee détecte un incendie en repérant la fumée dans l’air et déclenche une alarme sonore et lumineuse dès qu’un certain seuil de concentration est atteint. Il est conçu pour les bâtiments résidentiels et sa chambre de détection à source unique est protégée contre les faux positifs causés par la poussière, les insectes ou l’humidité.

La conception interne de type « labyrinthe » permet une détection d’incendie rapide, tout en limitant les déclenchements intempestifs. Le boîtier est en plastique ignifuge avec une finition brillante. Lire la suite

Je teste la nouvelle gamme Sonoff Zigbee : ZB2GS, ZB2GS-L et ZBDIM

Aujourd’hui, je vous emmène dans mon aventure, étape par étape, à travers la dernière gamme de modules Sonoff Zigbee sortie fin 2025. Qu’est-ce que c’est que ces « modules Sonoff Zigbee » ? Laissez-moi tout expliquer depuis le début, comme si on était assis autour d’une table avec un café.

Imaginez : vous avez un interrupteur mural banal qui allume votre lampe de salon. Avec un de ces modules, cet interrupteur devient intelligent. Vous pouvez l’allumer depuis votre smartphone, dire « Alexa, éteins la cuisine », ou programmer « s’éteint auto après 5 minutes si oublié ». Pas de câbles partout, pas de WiFi qui rame : c’est du Zigbee, une radio spéciale domotique super stable (comme le WiFi mais dédiée, portée 10 à 30 mètres par module, et ça s’étend automatiquement en « mesh » – chaque module relaie le signal des autres, comme une chaîne d’amis qui passent le mot).

Ces modules sont des petits boîtiers électroniques (39 mm de long, 45 mm de large, 17 mm d’épaisseur). Vous les cachez derrière votre interrupteur existant, sans changer le bouton visible ni refaire l’électricité. Ils coûtent entre 15 et 25 euros pièce, se vissent en 10 minutes (deux vis, fils phase/noire + neutre/bleu ou pas selon modèle), et marchent avec Home Assistant (HA, logiciel gratuit sur un mini-PC ou Raspberry Pi qui centralise toute votre maison smart).

Lire la suite

Je teste le Sonoff MINI DUO Zigbee MINI-ZB2GS

Double relais compact 16A pour mes éclairages

Le Sonoff MINI DUO Zigbee (référence MINI-ZB2GS) est un micro-module double relais Zigbee 3.0 avec neutre, conçu pour se loger derrière un interrupteur mural standard et piloter deux circuits jusqu’à 16A au total.

MINI DUO Zigbee : pourquoi je le teste

Je cherchais un micro-module Zigbee double relais capable de piloter deux circuits d’éclairage tout en restant très compact, pour l’encastrer derrière un interrupteur existant. Le Sonoff MINI DUO Zigbee (MINI-ZB2GS) promet 10A par canal, 16A au total, un vrai mode répéteur Zigbee et une intégration simple dans les écosystèmes Zigbee modernes.

Parfais pour le pilotage de la cuisine et du salon, les deux interrupteurs sont un à côté de l’autre, avec le neutre et une phase commune.

Lire la suite

Je teste le détecteur de fumée Zigbee Mi Honeywell JTYJ-GD-01LM/BW

🔍 Je vérifie le modèle reçu

Le colis arrive intact. À l’intérieur, je retrouve bien le détecteur de fumée Zigbee Mi Honeywell JTYJ-GD-01LM/BW que j’ai commandé.

Attention le même profil d’appareil en Wifi, Bluetooth ou rien du tout.

C’est un modèle Xiaomi Mijia Honeywell, diamètre environ 10 cm, avec support de fixation au plafond et vis fournies. Lire la suite

Je teste le module Porte de Garage/Portail TS0603 (Jaune)

J’ai choisi ce contrôleur Zigbee Tuya TS0603 pour tester la domotisation de mon portail existante.

Il remplace le bouton mural traditionnel et intègre Zigbee2MQTT puis Home Assistant.

Ce guide détaillé explique mon achat, branchement, appairage et automatisations pour une sécurité accrue.

🔍 Je vérifie le modèle reçu

Je débute mon test avec le contrôleur Tuya TS0603 Zigbee garage door opener, conçu pour commander l’ouverture/fermeture à distance et surveiller l’état en temps réel.

Ce modèle polyvalent se branche sur les moteurs existants et intègre capteur de contact.

  • Type d’équipement : Contrôleur + capteur magnétique pour garage/portail.
  • Protocole : Zigbee 3.0, compatible Z2M/ZHA.
  • Alimentation : 100-240VAC 50/60Hz, pas de piles.
  • Installation prévue : Branchement bornes bouton mural + capteur aimant.
  • Plages de fonctionnement : <100m.
  • Dimensions / IP : 43x39x22mm, IP20 intérieur.

🛒 Où j’achète cet équipement ?

Voici le lien vers la page dédiée au TS0603. J’y ai référencé les vendeurs, les prix.

📦 Déballage et premières impressions

À la réception, je déballe : contrôleur, support mural, câble 1m, accessoires vis/attaches, notice basique. Pas de câble secteur.

Boîtier compact ABS+PC, qualité chinoise correcte.

🏡 Où je l’installe

Je place le contrôleur dans le boitier de la commande de l’automatisme de mon portail.

J’ai déjà documenté le raccordement à la carte de l’automatisation de mon portail :

🔗 J’appaire dans Zigbee2MQTT

  • Je passe Z2M en mode pairing.

  • LED clignote dès la mise sous tension.
  • Détecté comme TS0603.

  • Commandes ou entités découvertes :

Je le renomme « Test Portail TS0603 »

🏠 Intégration dans Home Assistant

Aucun souci, l’équipement est bien là avec ses capteurs.

 

 

💬 Mon avis après mise en service

✅ Forts : Prix mini, install simple, entités complètes Z2M/HA.

❌ Faibles : Pas de câble alimentation fourni contrairement au Moes, qualité plastique basique.

Mon verdict : Excellent module low-cost, fiable pour automatisations quotidiennes.

Je teste le capteur Porte/Fenêtre de Frient, gamme WISZB

🔍 Je vérifie le modèle reçu

Je débute mon test avec le Frient Entry Sensor Pro portant la référence WISZB-120, un capteur Zigbee 3.0 conçu pour détecter précisément l’ouverture des portes et des fenêtres dans une installation domotique.

Ce modèle fabriqué par Develco pour Frient se distingue par son capteur de température haute précision et son interrupteur tamper anti-sabotage, des fonctionnalités que j’apprécie particulièrement pour renforcer la sécurité de ma maison.

Pour contextualiser, je compare avec le WISZB-121 version basique sans température ni tamper, et le WISZB-131 Entry Sensor 2 Pro qui offre la température mais omet le tamper physique, où le Pro original reste le favori pour son équilibre complet. Difficile de choisir son modèle à l’achat, souvent un seul modèle est proposé. Lire la suite