Test de la multiprise Zigbee Nous A11Z

La multiprise Nous A11Z a fait peau neuve. Nous l'avons testée pour vous et vous présentons comment l'intégrer à Home Assistant et la transformer en outil de monitoring ultime pour votre électroménager.
Test de la multiprise Zigbee Nous A11Z

Sommaire

Contexte et Choix du Produit

Dans le cadre de nos partenariats, HACF a reçu une proposition de test de la part de Domadoo pour explorer leurs nouveautés. Mon choix s'est porté sur la multiprise connectée Nous A11Z.

Pourquoi ce choix ? L'idée était de domotiser un "coin" complet avec un seul appareil. Si on pense souvent au coin TV (TV, ampli, console), j'avais pour ma part un autre scénario en tête : la cuisine. L'objectif est de piloter et de mesurer la consommation d'appareils comme le lave-vaisselle ou la cafetière, le tout sur une seule prise murale.

⚠️
Avertissements
Les tests ont été faits avec Zigbee2MQTT. La prise est à priori censée fonctionner avec ZHA, mais je ne l'ai pas testée.

La prise est donnée pour une intensité maximale de 16A pour l'ensemble des 3 prises. Pour un usage prolongé, il est conseillé de rester en dessous (idéalement 10A ou 2 200 w grand maximum pour l'ensemble des appareils connectés).
💲
Code réduction
Vous voulez commander ce produit ? Domadoo offre aux membres de la communauté HACF une réduction de 5%, valable sur tout le site hors promotions et ce jusqu'au 31 mai 2026.
Pour en profiter, utilisez le code discount "HACF".

📦 Déballage et Design

La prise Nous A11Z arrive emballée dans un carton simple, mais efficace portant les logos Zigbee2MQTT et Home Assistant. Au déballage, elle semble de bonne facture, le plastique est de qualité et les finitions sont bonnes. Le câble est assez long (1.5m) pour une utilisation confortable. Le bouton unique est bien accessible et le voyant LED est visible, mais pas trop agressif.

⚙️ Configuration de Test

Pour ce test, la multiprise est intégrée dans un environnement complet :

  • Home Assistant :
    • Version : HAOS (Core 2026.1.3, Supervisor 2026.02.1).
    • OS : Home Assistant OS 17.0.
    • Matériel : MiniPC N150 (16 Go RAM).
  • Zigbee2MQTT :
    • Version : 2.8.0 (Installation Docker déportée).
    • Hébergement : VM sous Proxmox (Sur MiniPC Ryzen 7, 32 Go RAM).
    • Contrôleur Zigbee : SLZB-06M (PoE/Ethernet).

🔌 Installation et Appairage Z2M

Passons aux choses sérieuses. L'appairage sous Zigbee2MQTT se fait classiquement : un appui long sur le bouton unique, la LED clignote, et Z2M détecte l'appareil.

L'appareil est reconnu comme un modèle TS011F par le fabricant _TZ3210_6cmeijtd. Jusqu'ici, tout va bien. Les commandes apparaissent dans Home Assistant dès que l'interview est terminée. Mais…

🤨 La Première Déconvenue

C'est au moment du premier test que l'enthousiasme retombe.
Je tente d'allumer la prise 1... et clac-clac-clac, les trois prises s'allument en même temps !
J'essaie d'éteindre la prise 2 ? Tout s'éteint.

Impossible de piloter les prises individuellement. La multiprise réagit comme un bloc unique, une simple multiprise "bête" pilotable en tout-ou-rien.
Pire encore, en regardant les remontées d'énergie pour voir si au moins la consommation est suivie : Rien. Voltage à 0, Puissance à 0.

On se retrouve donc avec un produit inutilisable pour le projet initial. Mais, comme je n'aime pas les échecs de ce genre, j'ai commencé à fouiner.

🕵️‍♂️ L'Enquête

Face à ce comportement étrange, le premier réflexe est de vérifier si le problème est connu.
Sur les forums et les groupes communautaires, la Nous A11Z est pourtant souvent recommandée pour sa compatibilité. De nombreux utilisateurs semblent l'utiliser sans encombre. S'agit-il d'un défaut de mon exemplaire ?

En creusant davantage, on réalise que sous la même référence commerciale "A11Z" se cachent plusieurs versions matérielles.

  • Les anciens modèles utilisaient des codes fabricants génériques Tuya (généralement commençant par _TZ3000_...) qui étaient correctement reconnus et fonctionnels.
  • La nouvelle révision (2026), identifiée par le code _TZ3210_6cmeijtd, utilise un firmware différent qui a posé problème lors de sa sortie.

Fort heureusement, la communauté open-source est incroyablement réactive. Moins de quelques semaines après l'apparition du problème (documenté sur l'issue #30799), un correctif a été proposé et est désormais intégré nativement depuis la version 2.9.0 de Zigbee2MQTT.

📒
Bonne nouvelle !
Si votre conteneur Zigbee2MQTT est à jour, vous n'avez absolument rien de spécial à faire. L'appareil est reconnu immédiatement et les trois prises sont pilotables nativement et individuellement.

*Extrait du Changelog officiel validant le support.*

Dès l'inclusion (ou après une simple mise à jour de votre instance Z2M), l'appareil expose correctement les 3 switchs indépendants ('state_l1`, `state_l2`, `state_l3`) ainsi que les sécurités enfants et les mémoires d'état.

*Les commandes individuelles parfaitement reconnues nativement dans Zigbee2MQTT 2.9.0*

Dans Home Assistant, vous retrouvez désormais vos entités bien séparées :

Étape 4 (Optionnelle) : Optimisation du Polling

Pour avoir des graphiques fluides (comme ceux présentés dans cet article), il est recommandé de réduire l'intervalle de remontée des infos :

  1. Dans Zigbee2MQTT, cliquez sur l'appareil Nous A11Z.
  2. Allez dans l'onglet Paramètres (Spécifique).
  3. Cherchez Measurement Poll Interval et réglez-le sur 10 secondes (au lieu de 60 par défaut, vous pourrez repasser à 60 après vos tests).
  4. Sauvegardez.

Cela permet d'avoir une mesure quasi-temps-réel, indispensable pour détecter les pics de consommation d'un cycle de lavage.

✅ Tests Effectués

Test 1 : Calibration & Validation

Pour valider les mesures, une calibration a été effectuée avec une charge résistive de référence (Lampe à incandescence "Lava Lamp" de 25W).

  • Protocole : Mesure sur Prise 1, puis Prise 2.
  • Résultats après patch :
    • Tension : 228 V (Cohérent réseau).
    • Puissance : 26 W (Pour 25 W théorique → Précision excellente).
    • Courant : 0,11 A.
  • Conclusion du test : La calibration du fichier nous_a11z.js est validée (acPowerDivisor: 10 et acVoltageDivisor: 1). Et on valide aussi que la remontée consommation est globale (pas de mesure par prise, pour l'instant).

Test 2 : Mémoire d'État (Power Outage Memory)

  • Protocole : Coupure brutale de l'alimentation alors que les prises sont dans des états différents (ON/OFF).
  • Résultat : Au rétablissement du courant, chaque prise reprend exactement son état précédent.
  • Validation : ✅ Fonctionnel (l'option powerOutageMemory: true du script est bien active).

Test 3 : Sécurité Enfant (Child Lock)

  • Protocole : Activation du child_lock dans Z2M et tentative d'action physique sur le bouton de la multiprise.
  • Résultat : Le bouton physique est désactivé, impossible d'éteindre/allumer manuellement.
  • Validation : ✅ Fonctionnel.

Test 04 : Latence & Groupes (Pop-corn Effect)

  • Protocole : Création d'un groupe Zigbee regroupant les 3 prises et envoi d'une commande unique (ON/OFF).
  • Résultat : Les prises commutent en "cascade" (l'une après l'autre) et non simultanément (Effet "Pop-corn").
  • Conclusion : Le firmware semble traiter les commandes séquentiellement, même via un groupe Zigbee. Pas de commutation instantanée synchronisée.

Test 05 : Lave-Vaisselle (Charge Réelle)

  • Protocole : Cycle complet de lavage en mode Intensif. Suivi de la puissance crête et de la consommation totale.
  • Intérêts : Valider la tenue de charge sur la durée et la précision du cumul kWh.
  • Outils utilisés :📅 Mise à jour : Analyse du premier cycle (Mode Intensif) le test est concluant ! Voici ce que le Dashboard ApexCharts nous révèle sur un cycle complet :
    • Dashboard Énergie Home Assistant : Pour le suivi du coût global (en intégrant le capteur sensor.multi_nous_energy).
    • Intégration HA WashData : Une pépite découverte récemment ! Elle permet de :
      • Détecter automatiquement les cycles (Lavage, Séchage, Fin).
      • Reconnaître les programmes spécifiques (Eco, Rapide) via la signature de consommation.
      • Estimer le temps restant intelligent.
      • Envoyer des notifications précises ("Lave-vaisselle terminé ! Coût : 0,15 €").
    • Résultats à venir après le premier cycle complet.

Analyse des Courbes :
1. Les Pics de Chauffe (Orange) : On distingue très nettement les phases sur lesquelles la résistance s'active pour chauffer l'eau (pics à ~2000 W). C'est là que la consommation est la plus forte.
2. L'Activité Moteur (Bas du graphe) : Entre les chauffes, la consommation retombe (pompes de cyclage/vidange), ce qui montre bien la phase de brassage.
3. Stabilité de la Tension (Bleu) : Le graphique de tension (Voltage) reste très stable (~230 V), prouvant que la ligne n'est pas surchargée malgré les appels de puissance.

Conclusion : La prise encaisse parfaitement les 2000 W+ répétés et le monitoring est d'une précision redoutable pour analyser l'état de santé de l'électroménager.

Test 06 : Stress Test (Charge Maximale)

  • Protocole : Lave-vaisselle en cycle de nettoyage + Aspirateur branché sur la même multiprise.
  • Mesure : Pic de puissance observé à 2353 W (~10,2 A).
  • Observation : Aucune chauffe détectée sur le boîtier de la multiprise après 5 minutes de test.
  • Validation : ✅ La multiprise tient la charge sans broncher. La connexion Zigbee reste stable même sous forte charge.

Autres Mesures & Observations

En plus du test de calibration (Lampe 25W), voici quelques relevés intéressants sur des appareils du quotidien :

1. Machine à Café (Pic de Courant)
On observe bien les cycles de chauffe (résistance) :

Les cycles de chauffe de la cafetière sont parfaitement visibles.

2. Machine Sous-Vide (Moteur)
Profil typique d'un moteur électrique :

Signature typique d'un moteur : appel de courant au démarrage.

3. Consommation à Vide (Standby)
La multiprise elle-même consomme très peu (mesuré à 0 W par Z2M, < 0,5 W réel probablement) :

La consommation à vide est négligeable.

🎁 Bonus : Le Dashboard de Monitoring Complet

Pour surveiller cette multiprise durant mes tests (et surtout surveiller la consommation du lave-vaisselle !), je me suis concocté un Dashboard complet composé de 3 modules complémentaires.

1. Le "Monitor" (Vue Générale)

C'est la carte principale (Mushroom + Stack-in-card). Elle permet de :

  • Voir la conso totale et le coût instantané.
  • Suivre la puissance en direct (Mini Graph).
  • Piloter les 3 prises individuellement.
  • "Cat Lock" 😺 : Sécurité enfant activable en un clic.

Voici le code de la carte à ajouter à votre dashboard (nécessite stack-in-card, mushroom et mini-graph-card) :

type: custom:stack-in-card
keep:
  background: false
  box_shadow: false
  margin: false
  outer_padding: false
  border_radius: false
cards:
  - type: horizontal-stack
    cards:
      - type: custom:mushroom-title-card
        title: ⚡ Nous A11Z
      #  subtitle: Laboratoire de Test
      - type: custom:mushroom-entity-card
        entity: sensor.multi_nous_energy
        primary_info: state
        secondary_info: name
        name: Total kWh
        icon: mdi:lightning-bolt-circle
        icon_color: green
        layout: vertical
        card_mod:
          style: |
            ha-card {
              border: none !important;
              box-shadow: none !important;
              background: none !important;
            }
      - type: custom:mushroom-template-card
        primary: "{{ (states('sensor.compteur_nous_a11z_total')|float(0) * states('input_number.cout_du_kwh')|float(0)) | round(2) }} €"
        secondary: "Coût ({{ states('input_number.cout_du_kwh') }} €/kWh)"
        icon: mdi:currency-eur
        icon_color: orange
        layout: vertical
        card_mod:
          style: |
            ha-card {
              border: none !important;
              box-shadow: none !important;
              background: none !important;
            }
  - type: custom:mini-graph-card
    entities:
      - entity: sensor.multi_nous_power
        name: Puissance
        color: "#ff9800"
    show:
      graph: line
      fill: true
      labels: true
      name: true
      state: true
      legend: false
      icon: true
      points: true
      extrema: true
      average: true
    line_width: 3
    height: 120
    hours_to_show: 1
    points_per_hour: 60
    animate: true
    color_thresholds:
      - value: 0
        color: "#4caf50"
      - value: 100
        color: "#ff9800"
      - value: 2000
        color: "#f44336"
    card_mod:
      style: |
        ha-card {
          margin-bottom: 0px !important;
        }
  - type: horizontal-stack
    cards:
      - type: custom:mushroom-template-card
        primary: L1
        secondary: "{{ states('switch.multi_nous_l1') }}"
        icon: mdi:power-socket-eu
        entity: switch.multi_nous_l1
        icon_color: "{{ 'seagreen' if is_state('switch.multi_nous_l1', 'on') else 'grey' }}"
        layout: vertical
        tap_action:
          action: toggle
        card_mod:
          style: |
            ha-card {
              background: {{ 'rgba(46, 139, 87, 0.1)' if is_state('switch.multi_nous_l1', 'on') else '' }} !important;
              border: none !important;
            }
      - type: custom:mushroom-template-card
        primary: L2
        secondary: "{{ states('switch.multi_nous_l2') }}"
        icon: mdi:power-socket-eu
        entity: switch.multi_nous_l2
        icon_color: "{{ 'seagreen' if is_state('switch.multi_nous_l2', 'on') else 'grey' }}"
        layout: vertical
        tap_action:
          action: toggle
        card_mod:
          style: |
            ha-card {
              background: {{ 'rgba(46, 139, 87, 0.1)' if is_state('switch.multi_nous_l2', 'on') else '' }} !important;
              border: none !important;
            }
      - type: custom:mushroom-template-card
        primary: L3
        secondary: "{{ states('switch.multi_nous_l3') }}"
        icon: mdi:power-socket-eu
        entity: switch.multi_nous_l3
        icon_color: "{{ 'seagreen' if is_state('switch.multi_nous_l3', 'on') else 'grey' }}"
        layout: vertical
        tap_action:
          action: toggle
        card_mod:
          style: |
            ha-card {
              background: {{ 'rgba(46, 139, 87, 0.1)' if is_state('switch.multi_nous_l3', 'on') else '' }} !important;
              border: none !important;
            }
  - type: horizontal-stack
    cards:
      - type: custom:mini-graph-card
        entities:
          - sensor.multi_nous_voltage
        name: Tension
        icon: mdi:sine-wave
        line_color: "#03a9f4"
        line_width: 2
        show:
          graph: line
          fill: fade
          labels: true
          name: true
          state: true
        height: 80
        hours_to_show: 1
        points_per_hour: 10
        update_interval: 30
        cache: false
        smoothing: false
        lower_bound: 210
        upper_bound: 250
        card_mod:
          style: |
            ha-card {
              border: none !important;
              box-shadow: none !important;
              background: none !important;
            }
      - type: custom:mini-graph-card
        entities:
          - sensor.multi_nous_current
        name: Courant
        icon: mdi:current-ac
        line_color: "#e91e63"
        line_width: 2
        show:
          graph: line
          fill: fade
          labels: true
          icon: true
          name: true
          state: true
        height: 80
        hours_to_show: 1
        points_per_hour: 60
        card_mod:
          style: |
            ha-card {
              border: none !important;
              box-shadow: none !important;
              background: none !important;
            }
  - type: horizontal-stack
    cards:
      - type: custom:mushroom-template-card
        primary: Général
        secondary: Groupe Zigbee
        icon: hue:plug-group
        entity: switch.test_a11z
        icon_color: "{{ 'seagreen' if is_state('switch.test_a11z', 'on') else 'grey' }}"
        layout: horizontal
        tap_action:
          action: toggle
        card_mod:
          style: |
            ha-card {
              background: {{ 'rgba(46, 139, 87, 0.1)' if is_state('switch.test_a11z', 'on') else '' }} !important;
              border: none !important;
            }
      - type: custom:mushroom-chips-card
        chips:
          - type: template
            entity: sensor.multi_nous_linkquality
            icon: mdi:wifi
            content: "{{ states('sensor.multi_nous_linkquality') }} lqi"
            icon_color: >-
              {{ 'seagreen' if states('sensor.multi_nous_linkquality')|int > 100
              else 'orange' }}
            tap_action:
              action: more-info
          - type: template
            entity: switch.multi_nous_child_lock
            icon: mdi:cat
            content: >-
              {{ 'Activé' if is_state('switch.multi_nous_child_lock', 'on') else
              'Désactivé' }}
            icon_color: >-
              {{ 'seagreen' if is_state('switch.multi_nous_child_lock', 'on')
              else 'grey' }}
            tap_action:
              action: toggle
        alignment: end
        card_mod:
          style: |
            ha-card {
              margin-top: 12px; 
            }

2. L'Analyseur de Cycle (Stats Auto)

Un sensor intelligent qui détecte automatiquement quand la prise tourne (Start > 5 W / Stop < 2 W).
Il génère un rapport précis à la fin du cycle :

  • Temps du cycle.
  • kWh consommés sur CE cycle.
  • Mini/Max/Moy pour la Puissance, Tension et Courant.

C'est implémenté via un fichier Package template et une carte Mushroom compacte.

Installation :

  1. Ajoutez ce code dans votre configuration template: sur Home Assistant (ou dans un fichier package) :
#### Template ####

- trigger:
    # DÉMARRAGE DU CYCLE (Puissance > 5W pendant 10 sec)
    - platform: numeric_state
      entity_id: sensor.multi_nous_power
      above: 5
      for: "00:00:10"
      id: "start"
    
    # FIN DU CYCLE (Puissance < 2W pendant 5 min)
    - platform: numeric_state
      entity_id: sensor.multi_nous_power
      below: 2
      for: "00:05:00"
      id: "stop"
    
    # MISE À JOUR (Chaque changement de puissance, tension ou courant)
    - platform: state
      entity_id: 
        - sensor.multi_nous_power
        - sensor.multi_nous_voltage
        - sensor.multi_nous_current
      id: "update"

  sensor:
    - name: "Nous A11Z - Stats Cycle"
      unique_id: nous_a11z_stats_cycle
      icon: mdi:chart-box-outline
      state: >
        {% if trigger.id == 'start' %}
          En cours
        {% elif trigger.id == 'stop' %}
          Terminé
        {% else %}
          {{ states('sensor.nous_a11z_stats_cycle') }}
        {% endif %}
      
      attributes:
        # --- COMPTEUR ECHANTILLONS (Pour moyennes) ---
        scan_count: >
          {% if trigger.id == 'start' %}
            0
          {% else %}
            {{ this.attributes.scan_count | default(0) | int + 1 }}
          {% endif %}

        # --- TEMPS ---
        start_time: >
          {% if trigger.id == 'start' %}
            {{ now().isoformat() }}
          {% else %}
            {{ this.attributes.start_time | default(now().isoformat()) }}
          {% endif %}
        
        end_time: >
          {% if trigger.id == 'start' %}
            None
          {% elif trigger.id == 'stop' %}
            {{ now().isoformat() }}
          {% else %}
            {{ this.attributes.end_time | default('None') }}
          {% endif %}
        
        duration: >
          {% if this.attributes.start_time is defined and this.attributes.start_time != 'None' %}
            {% set start = as_datetime(this.attributes.start_time) %}
            {% set end = now() if trigger.id != 'stop' else as_datetime(now().isoformat()) %}
            {{ (end - start).total_seconds() | int }}
          {% else %}
            0
          {% endif %}

        # --- ENERGIE ---
        initial_energy: >
          {% if trigger.id == 'start' %}
            {{ states('sensor.multi_nous_energy') | float(0) }}
          {% else %}
            {{ this.attributes.initial_energy | default(states('sensor.multi_nous_energy') | float(0)) }}
          {% endif %}
        
        energy_consumed: >
          {% set current = states('sensor.multi_nous_energy') | float(0) %}
          {% set initial = this.attributes.initial_energy | default(current) | float(0) %}
          {{ (current - initial) | round(3) }}
        
        # ====================================================
        # STATISTIQUES (Min > 0 / Max / Avg)
        # ====================================================

        # --- POWER (W) ---
        avg_power: >
          {# Methode Energie / Temps (Plus précis pour la puissance) #}
          {% set energy = this.attributes.energy_consumed | default(0) | float(0) %}
          {% set duration = this.attributes.duration | default(0) | float(0) %}
          {% if duration > 10 %}
            {{ ((energy * 1000) / (duration / 3600)) | round(1) }}
          {% else %}
            {{ states('sensor.multi_nous_power') | float(0) }}
          {% endif %}

        max_power: >
          {% set val = states('sensor.multi_nous_power') | float(0) %}
          {% if trigger.id == 'start' %}
            {{ val }}
          {% else %}
            {{ [val, this.attributes.max_power | default(0) | float] | max }}
          {% endif %}

        min_power: >
          {% set val = states('sensor.multi_nous_power') | float(0) %}
          {% if trigger.id == 'start' %}
            {{ val if val > 0 else 9999 }}
          {% else %}
            {% set current_min = this.attributes.min_power | default(9999) | float %}
            {% if val > 0 %}
              {{ [val, current_min] | min }}
            {% else %}
              {{ current_min }}
            {% endif %}
          {% endif %}

        # --- VOLTAGE (V) ---
        avg_voltage: >
          {# Moyenne glissante : avg_new = avg_old + (val - avg_old) / count #}
          {% set val = states('sensor.multi_nous_voltage') | float(0) %}
          {% set count = this.attributes.scan_count | default(0) | int %}
          {% if trigger.id == 'start' or count <= 1 %}
            {{ val }}
          {% else %}
            {% set old_avg = this.attributes.avg_voltage | default(val) | float %}
            {{ (old_avg + (val - old_avg) / count) | round(1) }}
          {% endif %}

        max_voltage: >
          {% set val = states('sensor.multi_nous_voltage') | float(0) %}
          {% if trigger.id == 'start' %}
            {{ val }}
          {% else %}
            {{ [val, this.attributes.max_voltage | default(0) | float] | max }}
          {% endif %}

        min_voltage: >
          {% set val = states('sensor.multi_nous_voltage') | float(0) %}
          {% if trigger.id == 'start' %}
            {{ val if val > 0 else 250 }}
          {% else %}
            {% set current_min = this.attributes.min_voltage | default(250) | float %}
            {% if val > 0 %}
              {{ [val, current_min] | min }}
            {% else %}
              {{ current_min }}
            {% endif %}
          {% endif %}

        # --- CURRENT (A) ---
        avg_current: >
          {# Moyenne glissante #}
          {% set val = states('sensor.multi_nous_current') | float(0) %}
          {% set count = this.attributes.scan_count | default(0) | int %}
          {% if trigger.id == 'start' or count <= 1 %}
            {{ val }}
          {% else %}
            {% set old_avg = this.attributes.avg_current | default(val) | float %}
            {{ (old_avg + (val - old_avg) / count) | round(2) }}
          {% endif %}

        max_current: >
          {% set val = states('sensor.multi_nous_current') | float(0) %}
          {% if trigger.id == 'start' %}
            {{ val }}
          {% else %}
            {{ [val, this.attributes.max_current | default(0) | float] | max }}
          {% endif %}

        min_current: >
          {% set val = states('sensor.multi_nous_current') | float(0) %}
          {% if trigger.id == 'start' %}
            {{ val if val > 0 else 99 }}
          {% else %}
            {% set current_min = this.attributes.min_current | default(99) | float %}
            {% if val > 0 %}
              {{ [val, current_min] | min }}
            {% else %}
              {{ current_min }}
            {% endif %}
          {% endif %}

#### carte ####

type: vertical-stack
cards:
  # TITRE & INFOS GLOBALES (Reste identique)
  - type: custom:mushroom-template-card
    primary: "Bilan du Cycle : {{ states('sensor.nous_a11z_stats_cycle') }}"
    secondary: >-
      {% set t = state_attr('sensor.nous_a11z_stats_cycle', 'duration') %}
      {% set h = (t / 3600) | int %}
      {% set m = ((t % 3600) / 60) | int %}
      ⏱️ {{ h }}h {{ m }}m  |  ⚡ {{ state_attr('sensor.nous_a11z_stats_cycle', 'energy_consumed') }} kWh
    icon: mdi:chart-timeline-variant
    icon_color: teal
    layout: horizontal
    card_mod:
      style: |
        ha-card {
          background: rgba(40, 40, 40, 0.5) !important;
          border: none !important;
        }

  # 1. PUISSANCE (W) - Tout sur une ligne
  - type: custom:mushroom-template-card
    primary: "Puissance"
    secondary: >-
      Min: {{ state_attr('sensor.nous_a11z_stats_cycle', 'min_power') }} W  |  
      Moy: {{ state_attr('sensor.nous_a11z_stats_cycle', 'avg_power') }} W  |  
      Max: {{ state_attr('sensor.nous_a11z_stats_cycle', 'max_power') }} W
    icon: mdi:lightning-bolt
    icon_color: orange
    layout: horizontal
    multiline_secondary: true
    card_mod:
      style: |
        ha-card {
          background: none !important;
          border: none !important;
          box-shadow: none !important;
        }

  # 2. TENSION (V) - Tout sur une ligne
  - type: custom:mushroom-template-card
    primary: "Tension"
    secondary: >-
      Min: {{ state_attr('sensor.nous_a11z_stats_cycle', 'min_voltage') }} V  |  
      Moy: {{ state_attr('sensor.nous_a11z_stats_cycle', 'avg_voltage') }} V  |  
      Max: {{ state_attr('sensor.nous_a11z_stats_cycle', 'max_voltage') }} V
    icon: mdi:sine-wave
    icon_color: blue
    layout: horizontal
    multiline_secondary: true
    card_mod:
      style: |
        ha-card {
          background: none !important;
          border: none !important;
          box-shadow: none !important;
        }

  # 3. COURANT (A) - Tout sur une ligne
  - type: custom:mushroom-template-card
    primary: "Courant"
    secondary: >-
      Min: {{ state_attr('sensor.nous_a11z_stats_cycle', 'min_current') }} A  |  
      Moy: {{ state_attr('sensor.nous_a11z_stats_cycle', 'avg_current') }} A  |  
      Max: {{ state_attr('sensor.nous_a11z_stats_cycle', 'max_current') }} A
    icon: mdi:current-ac
    icon_color: green
    layout: horizontal
    multiline_secondary: true
    card_mod:
      style: |
        ha-card {
          background: none !important;
          border: none !important;
          box-shadow: none !important;
        }

3. Le "Debug" (Graphiques Précis)

Pour les puristes, une vue détaillée basée sur apexcharts-card permet de zoomer sur les courbes de Tension, Courant et Puissance avec un échantillonnage fin et une moyenne glissante.

type: vertical-stack
cards:
  # 1. PUISSANCE
  - type: custom:apexcharts-card
    header:
      show: true
      title: "Puissance (W)"
      show_states: true
      colorize_states: true
    graph_span: 3.5h
    layout: minimal
    apex_config:
      chart:
        height: 200
        background: transparent
        zoom:
          enabled: true
          type: x
          autoScaleYaxis: true
      stroke:
        width: 1
        curve: smooth
      grid:
        show: true
        borderColor: '#404040'
        strokeDashArray: 3
    yaxis:
      - id: power
        show: true
        decimals: 1
    series:
      - entity: sensor.multi_nous_power
        name: Puissance
        color: "#E69F00" # Orange
        opacity: 0.8
        group_by:
          func: avg
          duration: 30s
        show:
          extremas: true # Affiche Min/Max
      
      - entity: sensor.multi_nous_power
        name: Moyenne (1h)
        color: "#A9A9A9" # Gris
        opacity: 0.5
        group_by:
          func: avg
          duration: 1h
        stroke_width: 2
        show:
          in_chart: false # Juste pour la légende
          legend_value: true
    card_mod:
      style: |
        ha-card {
          background: none !important;
          border: none !important;
          box-shadow: none !important;
        }

  # 2. TENSION
  - type: custom:apexcharts-card
    header:
      show: true
      title: "Tension (V)"
      show_states: true
      colorize_states: true
    graph_span: 3.5h
    layout: minimal
    apex_config:
      chart:
        height: 150
        background: transparent
        zoom:
          enabled: true
          type: x
          autoScaleYaxis: true
      stroke:
        width: 1
        curve: smooth
      grid:
        show: true
        borderColor: '#404040'
        strokeDashArray: 3
    yaxis:
      - id: voltage
        show: true
        decimals: 1
        min: 210
        max: 250
    series:
      - entity: sensor.multi_nous_voltage
        name: Tension
        color: "#56B4E9" # Bleu
        stroke_width: 1
        opacity: 0.7
        group_by:
          func: avg
          duration: 1m
        show:
          extremas: true # Affiche Min/Max en labels
      
      - entity: sensor.multi_nous_voltage
        name: Moyenne (1h)
        color: "#A9A9A9"
        group_by:
          func: avg
          duration: 1h
        show:
          in_chart: false
          legend_value: true
    card_mod:
      style: |
        ha-card {
          background: none !important;
          border: none !important;
          box-shadow: none !important;
        }

  # 3. COURANT
  - type: custom:apexcharts-card
    header:
      show: true
      title: "Courant (A)"
      show_states: true
      colorize_states: true
    graph_span: 3.5h
    layout: minimal
    apex_config:
      chart:
        height: 150
        background: transparent
        zoom:
          enabled: true
          type: x
          autoScaleYaxis: true
      stroke:
        width: 1
        curve: smooth
      grid:
        show: true
        borderColor: '#404040'
        strokeDashArray: 3
    yaxis:
      - id: current
        show: true
        decimals: 2
    series:
      - entity: sensor.multi_nous_current
        name: Courant
        color: "#009E73" # Vert
        stroke_width: 1
        group_by:
          func: avg
          duration: 30s
        show:
          legend_value: true
          extremas: true # Affiche Min/Max
      
      - entity: sensor.multi_nous_current
        name: Moyenne (1h)
        color: "#A9A9A9"
        group_by:
          func: avg
          duration: 1h
        show:
          in_chart: false
          legend_value: true
    card_mod:
      style: |
        ha-card {
          background: none !important;
          border: none !important;
          box-shadow: none !important;
        }

Conclusion

La Nous A11Z (version 2026) a connu un démarrage difficile à cause d'un firmware capricieux, mais grâce à la communauté Zigbee2MQTT, ce n'est plus qu'un mauvais souvenir.
Aujourd'hui, c'est un produit "plug&play", reconnu nativement, qui offre un excellent rapport qualité/prix. Les prises commutent individuellement avec l'effet "pop-corn" pour protéger des appels de charge, et la mesure de consommation globale est d'une grande précision. Dommage que la mesure de consommation soit globale et pas par prise individuelle, ce qui peut limiter certains usages pointus d'analyse de charge séparée.

Je pensais l'utiliser en cuisine pour, entre autres, gérer le lave-vaisselle, mais finalement, à cause de cette mesure globale, elle va finir derrière une TV et un ampli pour couper les veilles tout en monitorant la consommation complète du meuble.

Résumé

  • Les + : Qualité de fabrication, 3 prises indépendantes, routeur Zigbee stable, Prix.
  • Les - : Mesure énergétique globale uniquement (pas détaillée par pr).

🗄️ Annexe : L'ancienne Méthode Manuelle (Firmwares < 2.9.0)

⚠️
Méthode Obsolète (pour archive et référence)
Le tutoriel ci-dessous est conservé uniquement pour de l'archivage ou si vous êtes bloqué sur une très ancienne version de Zigbee2MQTT (< 2.9.0).*

Grâce à la communauté, un convertisseur personnalisé permettait de contourner le problème et d'utiliser l'appareil normalement en attendant la mise à jour officielle.

Étape 1 : Création du Fichier JS

Créez un fichier nommé `nous_a11z.js` dans le dossier de configuration de Zigbee2MQTT (à côté de `configuration.yaml`) :

const tuya = require('zigbee-herdsman-converters/lib/tuya');
const utils = require('zigbee-herdsman-converters/lib/utils');
const exposes = require('zigbee-herdsman-converters/lib/exposes');
const e = exposes.presets;
const ea = exposes.access;

const definition = {
    fingerprint: [{ modelID: 'TS011F', manufacturerName: '_TZ3210_6cmeijtd' }],
    model: 'A11Z',
    vendor: 'Nous',
    description: 'Smart power strip 3 gang with energy monitoring & countdown',

    // Mapping endpoints
    endpoint: (device) => {
        return { l1: 1, l2: 2, l3: 3 };
    },

    // Skip global endpoints for electrical measurements
    meta: {
        multiEndpoint: true,
        multiEndpointSkip: ['energy', 'current', 'voltage', 'power'],
    },

    extend: [
        // Configuration moderne Tuya pour Switch + Mesures
        tuya.modernExtend.tuyaOnOff({
            electricalMeasurements: true,   // Active la mesure
            powerOutageMemory: true,        // Active la mémoire d'état
            onOffCountdown: true,           // Active le compte à rebours
            indicatorMode: true,            // Active le mode LED
            childLock: true,                // Active le verrouillage enfant
            endpoints: ['l1', 'l2', 'l3'],  // Définit les 3 prises
        }),
        // Sondage régulier pour la mise à jour des valeurs
        tuya.modernExtend.electricityMeasurementPoll({
            metering: (device) => [100, 160, 192].includes(device.applicationVersion) || (device.softwareBuildID && ["1.0.5"].includes(device.softwareBuildID)),
        }),
    ],

    configure: async (device, coordinatorEndpoint, logger) => {
        const endpoint = device.getEndpoint(1);

        // 1. Envoi du Magic Packet (Nécessaire pour séparer les canaux sur certains firmwares)
        await tuya.configureMagicPacket(device, coordinatorEndpoint, logger);

        // 2. Calibration des Mesures Électriques
        await endpoint.saveClusterAttributeKeyValue('haElectricalMeasurement', {
            acCurrentDivisor: 1000,
            acCurrentMultiplier: 1,
            acVoltageDivisor: 1,    // 230V brut -> 230V affiché
            acVoltageMultiplier: 1,
            acPowerDivisor: 10,     // 260 brut / 10 = 26W
            acPowerMultiplier: 1,
        });

        // Configuration du metering (Energie cumulée)
        await endpoint.saveClusterAttributeKeyValue('seMetering', {
            divisor: 100,
            multiplier: 1,
        });

        device.save();
    },
};

module.exports = definition;

Étape 2 : Activation

Ajoutez ceci à votre `configuration.yaml` :

external_converters:
  - nous_a11z.js

  

Étape 3 : Redémarrage

Redémarrez Zigbee2MQTT. Elle devrait maintenant exposer correctement 3 switchs indépendants (`state_l1`, `state_l2`, `state_l3`).

💡
Sur d'anciennes versions du firmware, la tension (Voltage) pouvait s'afficher autour de 20-23V au lieu de 230V.*
- Note HACF -
Nous tenons à remercier notre partenaire, Domadoo, qui a gracieusement offert ce matériel.

Notre unique volonté est de partager, après test et intégration avec HA, nos avis sur du matériel nous semblant intéressant pour la communauté. Il est important de souligner que HACF reste totalement libre de sa ligne éditoriale et les auteurs de leurs propos.
Les médias HACF ont cependant des liens affiliés nous permettant de compléter nos revenus liés aux adhésions et dons, ce qui nous permet de mener nos différentes actions (voir https://www.hacf.fr/association-hacf/#financement).
💲
Code réduction
Vous voulez commander ce produit ? Domadoo offre aux membres de la communauté HACF une réduction de 5%, valable sur tout le site hors promotions et ce jusqu'au 31 mai 2026.
Pour en profiter, utilisez le code discount "HACF".