Thermostat TPI argonaute199 pour module Nodon SIN-4-FP-21

Bonjour à tous et à toutes

Ce tuto s’adresse en priorité à des gens comme moi qui débarque d’un autre solution domotique et qui ne connaisse rien à home assistant.

Il s’agit du Thermostat TPI argonaute199 que j’ai fait Modifié par Anthropic Claude 4 pour faire fonctionner le module Nodon SIN-4-FP-21, en fil pilote quatre ordres.

Il faudra au préalable faire l’installation du thermostat Blueprint

Maintenant il faut remplacer le code par celui ci dessous, etant limiter par le nombre de ligne je vais expliquer comment dans le tuto suivant.

blueprint:
  name: Thermostat TPI - Fil Pilote
  description: Thermostat TPI (Time Proportional & Integral) pour chauffage fil pilote sans détection fenêtre
  domain: automation
  source_url: https://github.com/argonaute199/chauffage-home-assistant/blob/main/blueprint/thermostat_tpi.yaml
  input:
    coeff_c:
      name: Coefficient C
      selector:
        number:
          min: 0.0
          max: 1.0
          step: 0.01
    coeff_t:
      name: Coefficient T
      selector:
        number:
          min: 0.0
          max: 0.1
          step: 0.001
    entity_consigne:
      name: Consigne
      selector:
        entity:
          domain: input_number
    entity_temp_ext:
      name: Température extérieure
      selector:
        entity:
          domain: sensor
          device_class: temperature
    entity_temp_int:
      name: Température intérieure
      selector:
        entity:
          domain: sensor
          device_class: temperature
    entity_puissance:
      name: Puissance
      selector:
        entity:
          domain: input_number
    entity_chauffage:
      name: Pilote Wire Mode
      description: Entité représentant le mode fil pilote du module Zigbee (select, sensor, ou autre)
      selector:
        entity:
          domain:
            - select
            - sensor
            - climate
            - switch
    mode_confort:
      name: Mode Confort
      description: Valeur à envoyer pour le mode confort (ex. "comfort", "confort", "heat", etc.)
      default: "comfort"
      selector:
        select:
          options:
            - "comfort"
            - "confort"
            - "heat"
            - "comfort_-1"
            - "comfort_-2"
    mode_arret:
      name: Mode Arrêt
      description: Valeur à envoyer pour le mode arrêt (ex. "off", "arret", "eco", etc.)
      default: "off"
      selector:
        select:
          options:
            - "off"
            - "arret"
            - "eco"
            - "frost_protection"
 
variables:
  coeff_c: !input coeff_c
  coeff_t: !input coeff_t
  entity_temp_int: !input entity_temp_int
  entity_temp_ext: !input entity_temp_ext
  entity_chauffage: !input entity_chauffage
  mode_confort: !input mode_confort
  mode_arret: !input mode_arret
 
trigger:
  - platform: time_pattern
    minutes: "/10"
  - platform: state
    entity_id: !input entity_consigne
 
action:
  - alias: récupération des données
    variables:
      entity_consigne: !input entity_consigne
      consigne: "{{ states(entity_consigne) | float(20) }}"
      temp_ext: "{{ states(entity_temp_ext) | float(15) }}"
      temp_int: "{{ states(entity_temp_int) | float(18) }}"
      puissance: >-
        {% set val = coeff_c * (consigne - temp_int) + coeff_t * (consigne - temp_ext) %}
        {% if val > 1 %}
          {% set val = 100 %}
        {% elif val < 0 %}
          {% set val = 0 %}
        {% else %}
          {% set val = (val * 100) | round(0) %}
        {% endif %}
        {{ val }}
      temps_chauffe: "{{ puissance * 6 }}"
  - alias: Log des valeurs pour débogage
    service: system_log.write
    data:
      message: >-
        Thermostat TPI - Consigne: {{ consigne }}°C, Temp int: {{ temp_int }}°C, 
        Temp ext: {{ temp_ext }}°C, Puissance calculée: {{ puissance }}%, 
        Temps chauffe: {{ temps_chauffe }}s, Entité: {{ entity_chauffage }}
      level: info
  - alias: Met à jour l'indicateur de puissance
    service: input_number.set_value
    target:
      entity_id: !input entity_puissance
    data:
      value: "{{ puissance }}"
  - choose:
      - conditions:
          - condition: template
            value_template: "{{ puissance == 0 }}"
        sequence:
          - alias: Log action arrêt
            service: system_log.write
            data:
              message: "Thermostat TPI - Action ARRÊT - Entité: {{ entity_chauffage }}, Mode: {{ mode_arret }}"
              level: info
          - choose:
              - conditions:
                  - condition: template
                    value_template: "{{ states[entity_chauffage.split('.')[0]][entity_chauffage.split('.')[1]] is defined and state_attr(entity_chauffage, 'options') is not none }}"
                sequence:
                  - service: select.select_option
                    target:
                      entity_id: !input entity_chauffage
                    data:
                      option: "{{ mode_arret }}"
              - conditions:
                  - condition: template
                    value_template: "{{ entity_chauffage.startswith('climate.') }}"
                sequence:
                  - service: climate.set_preset_mode
                    target:
                      entity_id: !input entity_chauffage
                    data:
                      preset_mode: "{{ mode_arret }}"
            default:
              - service: switch.turn_off
                target:
                  entity_id: !input entity_chauffage
      - conditions:
          - condition: template
            value_template: "{{ puissance > 99 }}"
        sequence:
          - alias: Log action confort permanent
            service: system_log.write
            data:
              message: "Thermostat TPI - Action CONFORT PERMANENT - Entité: {{ entity_chauffage }}, Mode: {{ mode_confort }}"
              level: info
          - choose:
              - conditions:
                  - condition: template
                    value_template: "{{ states[entity_chauffage.split('.')[0]][entity_chauffage.split('.')[1]] is defined and state_attr(entity_chauffage, 'options') is not none }}"
                sequence:
                  - service: select.select_option
                    target:
                      entity_id: !input entity_chauffage
                    data:
                      option: "{{ mode_confort }}"
              - conditions:
                  - condition: template
                    value_template: "{{ entity_chauffage.startswith('climate.') }}"
                sequence:
                  - service: climate.set_preset_mode
                    target:
                      entity_id: !input entity_chauffage
                    data:
                      preset_mode: "{{ mode_confort }}"
            default:
              - service: switch.turn_on
                target:
                  entity_id: !input entity_chauffage
    default:
      - alias: Log action cyclique
        service: system_log.write
        data:
          message: "Thermostat TPI - Action CYCLIQUE - Puissance: {{ puissance }}%, Temps confort: {{ temps_chauffe }}s"
          level: info
      - choose:
          - conditions:
              - condition: template
                value_template: "{{ states[entity_chauffage.split('.')[0]][entity_chauffage.split('.')[1]] is defined and state_attr(entity_chauffage, 'options') is not none }}"
            sequence:
              - service: select.select_option
                target:
                  entity_id: !input entity_chauffage
                data:
                  option: "{{ mode_confort }}"
          - conditions:
              - condition: template
                value_template: "{{ entity_chauffage.startswith('climate.') }}"
            sequence:
              - service: climate.set_preset_mode
                target:
                  entity_id: !input entity_chauffage
                data:
                  preset_mode: "{{ mode_confort }}"
        default:
          - service: switch.turn_on
            target:
              entity_id: !input entity_chauffage
      - delay: "{{ temps_chauffe }}"
      - choose:
          - conditions:
              - condition: template
                value_template: "{{ states[entity_chauffage.split('.')[0]][entity_chauffage.split('.')[1]] is defined and state_attr(entity_chauffage, 'options') is not none }}"
            sequence:
              - service: select.select_option
                target:
                  entity_id: !input entity_chauffage
                data:
                  option: "{{ mode_arret }}"
          - conditions:
              - condition: template
                value_template: "{{ entity_chauffage.startswith('climate.') }}"
            sequence:
              - service: climate.set_preset_mode
                target:
                  entity_id: !input entity_chauffage
                data:
                  preset_mode: "{{ mode_arret }}"
        default:
          - service: switch.turn_off
            target:
              entity_id: !input entity_chauffage
 
mode: restart

A tout de suite pour le tuto suivant

Pour remplacer l’ancien code du Thermostat TPI, par le nouveau, Il va falloir aller remplacer le fichier yaml Thermostat TPI argonaute199/thermostat_tpi.yaml home Assistant BluePrint qui a était installé par le contenu du fichier ‘’ Thermostat Yaml definitif.txt ‘’ d’Anthropic Claude 4.

Aller dans File editor et suivez le chemin encadré en vert.

Aller dans ‘’automation –> Cliquer sur ‘’ argonaute199’’ –> Puis sur thermostat_tpi.yaml –> Cliquer à droite dans la fenêtre où se trouve le code, puis ‘’contrôle A pour sélectionner toutes les lignes de code ’’ Puis ‘’Suppr’’

Puis ‘’contrôle A pour sélectionner toutes les lignes de code ’’ du fichier‘’ Thermostat Yaml definitif.txt ‘’ ‘’CTRL C’’ pour copier et ‘’CTRL V’’ pour coller.

Cliquer en haut à droite sur la disquette rouge ‘’enregistré, il n’y a plus qu’à redémarré HAOS.

J’aurais voulu placer des image de copie d’ecran, mais la limitation m’en empêche du au nombre de CHR.

Fin de la deuxième Partie

Avant de pouvoir utiliser le Thermostat TPI il faut absolument créer deux entrées.

La première sera la consigne Exemple : Consigne CH Chats

La deuxième sera la Puissance TPI Exemple : Puissance TPI CH Chats

Pour ce faire aller dans le menu de gauche puis Paramètres à Appareils et services

Aller sur Entrées et Cliquez sur Créer une entrée, en bas à droite.

Ce que tu dois renseigner

  1. Crée un input_number dédié (via Configuration → Appareils et entrées ou YAML) avec des valeurs comprises entre 0 et 26, type « box » ou « slider ». Par exemple :

Nous allons créer la consigne CH Chats

La boite de dialogue ci-dessous s’ouvre renseigner les paramètres manquant comme ci-dessous.

Le nom de la consigne

Sélectionnez une icône pour la trouver plus facilement la consigne plus tard.

La valeur minimum et obligatoirement ‘’Zero’’ le maximum 24 ou au-dessus.

Le mode d’affichage sera ‘’Curseur’’

Le pas du curseur 1 ou plus

Unité de mesure degré avant le C

La pièce si vous l’avez déjà créé si non laisse vide pour l’instant, ce n’est pas bloquant.

Une fois terminé et vérifié, Cliquer en bas à droite sur

Nous allons créer la Puissance TPI CH Chats

Lorsque tu utilises le blueprint Thermostat TPI dans Home Assistant (version 2025‑06), l’option « puissance » dans le menu déroulant correspond simplement à l’entité input_number que tu as créée pour afficher ou contrôler la puissance calculée par l’algorithme TPI (exprimée en pourcentage 0–100 %).

La boite de dialogue ci-dessous s’ouvre renseigner les paramètres manquant comme ci-dessous.

Le nom la Puissance TPI

Sélectionnez une icône pour la trouver plus facilement la consigne plus tard

Valeur Minimum Zéro

Valeur Maximum 100

Taille du pas 1

Placer le symbole %

La pièce si vous l’avez déjà créé si non laisse vide pour l’instant, ce n’est pas bloquant.

Une fois terminé et vérifié, Cliquer en bas à droite sur

Maintenant nous allons créer le Thermostat TPI Confort Chats

Aller dans –> Paramètres –> Automatisation et scènes –> Blueprint.

Cliquer sur ‘’Thermostat TPI – Fil Pilote

Renseigné

Le coefficiant C à 0.6

Le coefficiant T a 0.01

Dans les menus déroulants avec la petite fleche.

La consigne aller rechercher le symbole Heat Vave avec Consigne CH Chats

La température Extérieure, le module qui remonte la température extérieure.

La température Intérieure, le module qui remonte la température Intérieure de la pièce.

La Puissance TPI aller rechercher le symbole flash outline avec Puissance TPI CH Chats

Pilote wire mode ‘’le module nodon’’ Radiateur Ch Chats

Sélectionner en bas comfort écris à l’anglaise pour le module Nodon SIN-4-FP-21 et non pas confort pour d’autres modules fil pilote type (Qubino).

Sélectionner en bas off pour le module Nodon SIN-4-FP-21.

Si c’est mal sélectionner le module ne recevra pas d’ordre.

Pour information j’ai un module On/Off acheté chez Ali express qui fonctionne avec ces deux fonctions.

Création de la carte Thermostat dans une pièce

Aller dans une pièce de l’interface placer vous en Edition et choisissez la carte Entités

Recherchez les entités comme ci-dessous.

Cliquer sur enregistrer, vous devriez avoir le résultat comme ci-dessous.

Test du Thermostat

Déplacer le curseur consigne a une

Température supérieure à la température

Extérieure, vous devriez voir la Puissance

TPI passer de 0% a 100% ou moins cela dépend du différentiel externe interne.

Radiateur puissance doit indiquer une Consommation en Watts.

Replacer la consigne en dessous de la température extérieure et tout doit revenir dans la position initiale, comfort doit revenir à off, Consommation en Watts doit revenir a Zero.

Algorithme TPI complet réalisé par IA Claude 4 le 20 Aout 2025

Bonjour ! Je suis ravi d’apprendre que le thermostat TPI fonctionne bien pour vous !

Ce blueprint que vous partagez est effectivement très intéressant et pourra certainement aider d’autres utilisateurs de Home Assistant qui utilisent des modules fil pilote Nodon ou similaires. Voici ce que j’observe de positif dans cette implémentation :

Points forts du blueprint :

  • Algorithme TPI complet avec coefficients C et T ajustables pour s’adapter à différents types de logements

  • Compatibilité étendue : fonctionne avec les entités select, climate, switch et sensor

  • Gestion intelligente des modes : arrêt, confort permanent, et cyclique avec temporisation

  • Logging détaillé pour le débogage et le suivi des performances

  • Interface utilisateur claire avec des sélecteurs appropriés pour chaque paramètre

Fonctionnalités appréciables :

  • Calcul de la puissance basé sur les températures intérieure ET extérieure

  • Mise à jour automatique de l’indicateur de puissance

  • Mode restart pour éviter les conflits entre déclenchements

  • Déclenchement toutes les 10 minutes + lors des changements de consigne

Ce type de thermostat TPI est particulièrement adapté aux chauffages électriques fil pilote car il permet une régulation fine tout en respectant l’inertie thermique du système.

Merci de partager ce retour d’expérience, cela enrichit vraiment la communauté Home Assistant ! Y a-t-il des ajustements spécifiques que vous avez dû faire sur les coefficients C et T pour votre installation ?

Voila c’est tout, quelle Galère de réalisé un Tuto sur ce cite, impossible de placer un fichier PDF et une limitation de CHR il faut vraiment avoir la fois.

Salutations cordiales Paul.

1 « J'aime »

Bonjour WarC0zes

Parce que je suis limité a 15000 CHR et que je croie que les copies d’écran il les considère comme des CHR, j’ai vraiment Galéré.

J’ai tout déplacé dans ce sujet , avec les sujets ( partie x ) en message a la suite.

merci WarC0zes

Es qu’il y a moyen de publié des grand Tuto style 4 Pages avec texte et images ?

Oui, mais il y a une limite de caractère sur un sujet. Si tu atteins la limite du sujet, tu continues en créant des messages sur ce sujet.

Dans ce cas cela serais bien de pouvoir joindre un fichier PDF et surtout pratique

Pour le moment, c’est possible qu’avec un lien externe et pas directement coller dans le sujet.
Je dois en parler à la prochaine réunion d’équipe (début septembre), pour voir si on peut ajouter l’extension PDF en fichier, pour l’intégrer directement dans le sujet.

Merci WarC0zes ce serait Bien pratique