Thermostat mon pilotage elec engie

c est mon cas je ne connais pas grand chose :sweat_smile:

par contre j avour que je recupererais bien trois de mes ancien modules pour les remettres dans le schambres .

si tu a des liens ou de la doc pour le flashage je suis preneur

flashage pas si compliqué, il faut juste un tournevis. Le flashage fonctionne débranché du secteur 220V donc pas de risque électrique. Une fois flashé il suffit de rebrancher le boitier au radiateur. J’envoie une documentation complète avec photos d’ici 10 jours.

Au final, je pense que le boitier marchera mieux qu’avant car les valeurs de températures, humidité et conso elec ne passeront plus par le cloud.

Pour le flashage, il faut dépenser un peu plus de 10€ :

et
les cables qui vont bien (mâles femeles)

top j attend ton retex complet alors .

cable dupont j ai , le uart je vais acheter sa sera pas perdu .

une question car chez moi le veritable probleme que j ai rencontrer avec les modules etait de ne pas pouvoir regler l hysterisie et je me retrouvais avec une temperature de 17° pour une consigne a 20° .

maintenant avec le generic thermostat natif de HA je peut regler sa et la temperature ne redessend jamais sous les 19.8° pour une consigne a 20° .

Flasher un boîtier Tiko avec ESPHome

Transformez votre boîtier Tiko en un thermostat ESPHome entièrement intégré à Home Assistant : pilotage fil pilote, mesure de consommation, LED RGB, capteurs de température et humidité.


:warning: AVERTISSEMENT — LISEZ ATTENTIVEMENT AVANT DE CONTINUER

Ce document est fourni à titre purement expérimental et éducatif. Les manipulations décrites impliquent l’ouverture et la modification d’un appareil électrique raccordé au secteur 230 V, le remplacement du firmware d’origine par un firmware tiers, ainsi que des branchements sur des composants électroniques.

En suivant ce guide, vous acceptez que :

  • L’auteur décline toute responsabilité en cas d’incident, d’accident, de blessure, de dommage matériel, d’incendie, d’électrocution ou de tout autre préjudice résultant directement ou indirectement de l’application de ces instructions.
  • Ces modifications annulent la garantie constructeur de votre appareil et peuvent ne pas être conformes aux normes électriques en vigueur.
  • Vous agissez à vos propres risques et sous votre entière responsabilité.
  • Toute intervention sur un appareil raccordé au secteur doit être réalisée hors tension et idéalement par une personne possédant les compétences électriques requises.

Ce projet n’est affilié à aucun fabricant. Les marques citées appartiennent à leurs propriétaires respectifs.


Prérequis

Matériel

  • Adaptateur USB UART-TTL 3,3 V / 5 V (ou 5 V seul) avec câble
  • Câbles Dupont mâle-femelle
  • Un câble mâle-mâle (gardez-le sous la main)

:warning: Le cavalier de l’adaptateur USB UART-TTL doit être positionné sur 5 V.

Logiciel

Sur le serveur Home Assistant :

  • Add-on ESPHome Device Builder (≥ 2026.1.5)

Sur votre Mac/PC :

  • Un terminal (Terminal.app sur macOS, ou tout terminal Linux/Windows)
  • Google Chrome ou équivalent (seul navigateur supportant WebSerial pour le flashage)

1. Branchement

Photo au final (attention photo prise à un autre moment, les couleurs ne sont pas les mêmes que sur les précédentes photos)
Connectez le boîtier Tiko à l’adaptateur USB UART-TTL selon le tableau suivant :

Boîtier Tiko Adaptateur USB UART-TTL Remarque
IO Fil libre (utilisé plus tard)
GND GND
5V 5V
RX TX Croisé
TX RX Croisé
EN Fil libre (utilisé plus tard)

Une fois le branchement effectué, branchez l’adaptateur USB sur votre Mac/PC.


2. Vérification de la connexion

Dans le terminal :

Étape 1 — Lister les périphériques série :

ls /dev/tty.usb*

Exemple de retour : /dev/tty.usbserial-10

Étape 2 — Ouvrir une session série :

screen /dev/tty.usbserial-10 115200
  • Remplacez usbserial-10 par le périphérique obtenu à l’étape 1
  • 115200 est le débit en bauds

:light_bulb: Pour quitter screen : Ctrl+A puis K puis Y.

Si rien ne s’affiche, redémarrez le Tiko en faisant un cavalier bref entre EN et GND (utilisez le fil libre branché sur EN et faites-le toucher la patte GND). Recommencez une ou deux fois si nécessaire.

Vous devriez voir un log de démarrage ressemblant à ceci :

I (526) spiram: PSRAM initialized, cache is in normal (1-core) mode.
I (533) cpu_start: Pro cpu up.
I (537) cpu_start: Starting app cpu, entry point is 0x40375a80
I (0) cpu_start: App cpu up.
I (963) spiram: SPI SRAM memory test OK
I (1024) cpu_start: Pro cpu start user code
I (1024) cpu_start: cpu freq: 240000000
I (1024) cpu_start: Application information:
I (1027) cpu_start: Project name:     firmware
I (1032) cpu_start: App version:      1.6.3
I (1037) cpu_start: Compile time:     Aug 19 2025 12:39:46
I (1043) cpu_start: ELF file SHA256:  ec2684c9f09d653a...
I (1049) cpu_start: ESP-IDF:          v4.4.8-7-gb9b0b4d5e9-dirty
I (1056) cpu_start: Min chip rev:     v0.0
I (1061) cpu_start: Max chip rev:     v0.99
I (1066) cpu_start: Chip rev:         v0.1
I (1071) heap_init: Initializing. RAM available for dynamic allocation:
...
I (00:00:00.145) main: This is esp32s3 chip with 2 CPU core(s), WiFi/BLE,
I (00:00:00.153) main: silicon revision 0,
I (00:00:00.158) main: 8MB external flash
I (00:00:00.162) main: Minimum free heap size: 8556859 bytes
I (00:00:00.416) hw: Terminal output will be disabled now.

Étape 3 — Quitter screen pour libérer la connexion :

Ctrl+A puis K puis Y

Nous savons maintenant que la puce ESP32 du Tiko est maintenant visible par votre Mac/PC. :white_check_mark:


3. Flashage

Via HA → ESPHome Device Builder (recommandé)

  1. Débranchez puis rebranchez l’adaptateur USB

  2. Dans Chrome, ouvrez votre instance HA puis accédez à ESPHome Device Builder

  3. Cliquez sur « New Device » (en bas à droite), renseignez le nom de votre Wi-Fi et son mot de passe.

  4. Donnez un nom à votre appareil (exemple « tiko-chambre ») puis cliquez « Next »




  5. Séquence de connexion (mode flash) :

    • Connectez le fil libre de IO à GND (maintenez)
    • Avec le fil libre de EN, touchez GND brièvement puis relâchez
    • Tout en maintenant IO → GND, cliquez sur « Connect »
    • Si cela ne fonctionne pas, relâchez tout et recommencez la séquence
  6. L’installation prend environ 2 minutes (maintenez IO <->GND pendant toute la durée)



  7. À la fin du flashage, ESPHome a remplacé le firmware d’origine


:warning: Important : Le Wi-Fi du Tiko ne fonctionne qu’en alimentation 220 V. En USB (5 V), le module Wi-Fi ne s’active pas tant qu’il est branché en 5V sur le Mac/PC.

Erreurs possibles

Situation Solution
Erreur affichée mais le device est Online Pas de souci, continuez
Erreur affichée et le device reste Offline Débranchez/rebranchez l’USB
Le Tiko ne s’affiche pas Online Essayez de reflasher via web.esphome.io

:pushpin: Tant que le Tiko est branché en USB, il doit apparaître Online dans HA pour que vous puissiez pousser la configuration Wi-Fi et le débrancher définitivement du Mac/PC pour le rebrancher en 220V et qu’il se connecte tout seul en Wifi. Une fois connecté en Wi-Fi et sur 220V, les mises à jour suivantes se feront sans fil Over-the-air (OTA).


4. Mise en route

  1. Remettez le Tiko en place pour qu’il soit alimenté en 220 V
  2. Dans HA → Paramètres → Intégrations, il doit apparaître sous le nom que vous lui avez donné et se connecter à votre Wi-Fi

5. Configuration YAML

Base existante

Dans ESPHome Builder → votre Tiko → Edit, vous trouverez la configuration minimale générée automatiquement :

esphome:
  name: tiko-chambre
  friendly_name: "Tiko Chambre"

api:
  encryption:
    key: "xxx"

ota:
  - platform: esphome
    password: "yyy"

wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password
  ap:
    ssid: "Tiko-Chambre"
    password: "zzz"

Ajout du bloc on_boot

Dans le bloc esphome:, ajoutez :

esphome:
  name: tiko-chambre
  friendly_name: "Tiko Chambre"
  on_boot:
    - priority: 600
      then:
        - light.turn_on:
            id: led
            brightness: 100%
            effect: "Rainbow"
    - priority: -100
      then:
        - delay: 500ms
        - lambda: |-
            uint8_t f[5] = {0x6A, 0x80|0x32, 0x00, 0xA6, 0};
            uint8_t s=0; for(int i=0;i<4;i++) s+=f[i]; f[4]=~s;
            id(ht7017_uart).write_array(f, 5);
        - delay: 150ms
        - lambda: |-
            uint8_t f[5] = {0x6A, 0x80|0x59, 0x00, 0x7E, 0};
            uint8_t s=0; for(int i=0;i<4;i++) s+=f[i]; f[4]=~s;
            id(ht7017_uart).write_array(f, 5);
        - switch.turn_on: fp_arret
        - switch.turn_off: fp_confort

Ajout du bloc Wi-Fi (indicateurs LED)

Dans le bloc wifi:, ajoutez les callbacks de connexion/déconnexion (LED verte pulsée à la connexion, rouge fixe en cas de déconnexion) :

wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password
  ap:
    ssid: "Tiko-Chambre"
    password: "zzz"
  on_connect:
    - delay: 5s
    - light.turn_on:
        id: led
        red: 0%
        green: 100%
        blue: 0%
        effect: "Pulse"
    - delay: 3s
    - light.turn_off:
        id: led
        transition_length: 0s
  on_disconnect:
    - light.turn_on:
        id: led
        red: 100%
        green: 0%
        blue: 0%
        effect: "None"

À ce stade, faites Save puis Install pour vérifier que tout fonctionne et que votre Tiko est connecté.

:light_bulb: En cas d’erreur, copiez l’intégralité de votre code YAML et faites-le vérifier par une IA (Mistral) — les erreurs d’indentation sont fréquentes en YAML.

Code commun (à ajouter à la fin)

A nouveau, retournez dans Edit et ajoutez à la fin le code commun qui fait fonctionner tous les composants du Tiko :

# ╔══════════════════════════════════════════════════════════════╗
# ║  CODE COMMUN — Module Tiko (ESPHome thermostat natif)      ║
# ║                                                             ║
# ║  Hardware : ESP32-S3-WROOM-1 (module Tiko)                 ║
# ║  GPIO6  → MOC A : signal Arrêt   (ON = délestage)          ║
# ║  GPIO47 → MOC B : signal Confort  (ON = montée en T°)      ║
# ║  GPIO3  → LED WS2812                                       ║
# ║  GPIO5/4 → I2C SDA/SCL (SHT3xD @0x44 + @0x45)             ║
# ║  GPIO17/18 → UART TX/RX (HT7017 mesure conso)              ║
# ╚══════════════════════════════════════════════════════════════╝

esp32:
  board: esp32-s3-devkitc-1
  framework:
    type: esp-idf

logger:
  level: INFO

web_server:
  port: 80

i2c:
  sda: GPIO5
  scl: GPIO4
  scan: true
  id: bus_i2c

# ============================================================
# GLOBALS
# ============================================================
globals:
  - id: last_cmd
    type: uint8_t
    initial_value: '0'
  - id: prev_energy_raw
    type: uint32_t
    initial_value: '0'
  - id: first_read
    type: bool
    initial_value: 'true'
  - id: last_raw_power
    type: float
    initial_value: '0.0'
  - id: watt_multiplier
    type: float
    restore_value: true
    initial_value: '1.0'
  - id: boost_active
    type: bool
    initial_value: 'false'

# ============================================================
# 1. THERMOSTAT
# ============================================================
#   Popups HA :
#     Mode       → Chauffage (HEAT) / Éteint (OFF)
#     Préréglage → Confort / Éco / Hors-Gel
#
#   Humidité affichée en haut de la carte grâce à humidity_sensor.
#
#   Quand on change le preset, la consigne est appliquée depuis
#   les number via preset_change.
#   Quand on touche manuellement la consigne, le preset est
#   automatiquement effacé par le composant thermostat natif.
# ============================================================
climate:
  - platform: thermostat
    name: "Radiateur"
    id: tiko_climate
    sensor: temp_ambiante
    humidity_sensor: humidity_ambiante

    visual:
      min_temperature: 5 °C
      max_temperature: 30 °C
      temperature_step: 0.5 °C

    min_heating_off_time: 30s
    min_heating_run_time: 30s
    min_idle_time: 30s

    heat_deadband: 0.3 °C
    heat_overrun: 0.3 °C

    default_preset: Confort
    on_boot_restore_from: memory

    # --- Custom presets français ---
    preset:
      - name: Confort
        default_target_temperature_low: 20.0 °C
      - name: Éco
        default_target_temperature_low: 16.5 °C
      - name: Hors-Gel
        default_target_temperature_low: 7.0 °C

    # Quand le preset change, appliquer la consigne du number correspondant
    preset_change:
      - lambda: |-
          if (id(tiko_climate).has_custom_preset()) {
            auto preset = id(tiko_climate).get_custom_preset();
            float target = 20.0f;
            if (preset == "Confort") {
              target = id(temp_confort).state;
            } else if (preset == "Éco") {
              target = id(temp_eco).state;
            } else if (preset == "Hors-Gel") {
              target = id(temp_horsgel).state;
            }
            auto call = id(tiko_climate).make_call();
            call.set_target_temperature(target);
            call.perform();
            ESP_LOGI("TIKO", "Preset → %.1f°C", target);
          }

    # --- Action de chauffe → fil pilote Confort ---
    heat_action:
      - switch.turn_off: fp_arret
      - switch.turn_on: fp_confort
      - logger.log: "Thermostat → Chauffe ON"
      - if:
          condition:
            and:
              - switch.is_on: led_heating_enabled
              - lambda: 'return !id(boost_active);'
          then:
            - light.turn_on:
                id: led
                red: 100%
                green: 35%
                blue: 0%
                effect: "Pulse"

    # --- Action repos → fil pilote Arrêt ---
    idle_action:
      - switch.turn_on: fp_arret
      - switch.turn_off: fp_confort
      - logger.log: "Thermostat → Chauffe OFF"
      - if:
          condition:
            and:
              - switch.is_on: led_heating_enabled
              - lambda: 'return !id(boost_active);'
          then:
            - light.turn_off:
                id: led
                transition_length: 0s

    # --- Mode OFF → tout couper ---
    off_mode:
      - switch.turn_on: fp_arret
      - switch.turn_off: fp_confort
      - light.turn_off:
          id: led
          transition_length: 0s
      - logger.log: "Thermostat → Mode OFF"

# ============================================================
# 2. GPIO fil pilote (internal)
# ============================================================
switch:
  - platform: gpio
    pin: GPIO6
    id: fp_arret
    restore_mode: ALWAYS_OFF
    internal: true

  - platform: gpio
    pin:
      number: GPIO47
    id: fp_confort
    restore_mode: ALWAYS_OFF
    internal: true

  - platform: template
    name: "LED chauffage actif"
    id: led_heating_enabled
    icon: "mdi:led-on"
    optimistic: true
    restore_mode: RESTORE_DEFAULT_OFF
    entity_category: config

  - platform: template
    name: "Boost 30 min"
    icon: "mdi:fire"
    id: boost_switch
    optimistic: true
    restore_mode: ALWAYS_OFF
    turn_on_action:
      - script.execute: boost_script
    turn_off_action:
      - script.stop: boost_script
      - globals.set:
          id: boost_active
          value: 'false'
      - light.turn_off:
          id: led
          transition_length: 0s
      - climate.control:
          id: tiko_climate
          custom_preset: Confort
      - logger.log: "Boost arrêté → retour preset Confort"

# ============================================================
# 3. RÉGLAGES — Consignes par mode + Hystérésis + Calibration
# ============================================================
number:
  - platform: template
    name: "Température Confort"
    id: temp_confort
    icon: "mdi:home-thermometer"
    unit_of_measurement: "°C"
    min_value: 15
    max_value: 28
    step: 0.5
    initial_value: 20.0
    optimistic: true
    restore_value: true
    entity_category: config
    mode: box
    on_value:
      - lambda: |-
          // Si le preset actif est Confort, appliquer immédiatement
          if (id(tiko_climate).has_custom_preset()) {
            auto preset = id(tiko_climate).get_custom_preset();
            if (preset == "Confort") {
              auto call = id(tiko_climate).make_call();
              call.set_target_temperature(x);
              call.perform();
              ESP_LOGI("TIKO", "Confort → %.1f°C (live)", x);
            }
          }

  - platform: template
    name: "Température Éco"
    id: temp_eco
    icon: "mdi:leaf"
    unit_of_measurement: "°C"
    min_value: 10
    max_value: 25
    step: 0.5
    initial_value: 16.5
    optimistic: true
    restore_value: true
    entity_category: config
    mode: box
    on_value:
      - lambda: |-
          if (id(tiko_climate).has_custom_preset()) {
            auto preset = id(tiko_climate).get_custom_preset();
            if (preset == "Éco") {
              auto call = id(tiko_climate).make_call();
              call.set_target_temperature(x);
              call.perform();
              ESP_LOGI("TIKO", "Éco → %.1f°C (live)", x);
            }
          }

  - platform: template
    name: "Température Hors-Gel"
    id: temp_horsgel
    icon: "mdi:snowflake-thermometer"
    unit_of_measurement: "°C"
    min_value: 5
    max_value: 15
    step: 0.5
    initial_value: 7.0
    optimistic: true
    restore_value: true
    entity_category: config
    mode: box
    on_value:
      - lambda: |-
          if (id(tiko_climate).has_custom_preset()) {
            auto preset = id(tiko_climate).get_custom_preset();
            if (preset == "Hors-Gel") {
              auto call = id(tiko_climate).make_call();
              call.set_target_temperature(x);
              call.perform();
              ESP_LOGI("TIKO", "Hors-Gel → %.1f°C (live)", x);
            }
          }

  - platform: template
    name: "Hystérésis"
    id: hysteresis_val
    icon: "mdi:thermometer-lines"
    unit_of_measurement: "°C"
    min_value: 0.1
    max_value: 2.0
    step: 0.1
    initial_value: 0.3
    optimistic: true
    restore_value: true
    entity_category: config
    mode: box
    on_value:
      - lambda: |-
          id(tiko_climate).set_heat_deadband(x);
          id(tiko_climate).set_heat_overrun(x);
          ESP_LOGI("TIKO", "Hystérésis → %.1f°C", x);

  - platform: template
    name: "Puissance de référence (W)"
    id: ref_power
    unit_of_measurement: "W"
    min_value: 100
    max_value: 5000
    step: 50
    initial_value: 750
    optimistic: true
    restore_value: true
    entity_category: config
    mode: box

# ============================================================
# 4. LED WS2812
# ============================================================
light:
  - platform: esp32_rmt_led_strip
    id: led
    name: "LED"
    pin: GPIO3
    num_leds: 1
    rgb_order: GRB
    chipset: WS2812
    effects:
      - addressable_rainbow:
          name: "Rainbow"
          speed: 10
          width: 50
      - pulse:
          name: "Pulse"
          min_brightness: 20%
          max_brightness: 100%

# ============================================================
# CAPTEURS
# ============================================================
sensor:
  - platform: sht3xd
    address: 0x44
    temperature:
      name: "Température ambiante"
      id: temp_ambiante
    humidity:
      name: "Humidité ambiante"
      id: humidity_ambiante
    update_interval: 30s

  - platform: sht3xd
    address: 0x45
    temperature:
      name: "Température carte"
      entity_category: diagnostic
    humidity:
      name: "Humidité carte"
      entity_category: diagnostic
    update_interval: 60s

  - platform: template
    name: "Puissance instantanée"
    id: power_sensor
    unit_of_measurement: "W"
    accuracy_decimals: 0
    state_class: measurement
    device_class: power
    update_interval: never

  - platform: template
    name: "Énergie totale"
    id: energy_sensor
    unit_of_measurement: "kWh"
    accuracy_decimals: 4
    state_class: total_increasing
    device_class: energy
    update_interval: never

# ============================================================
# POLLING UART HT7017 (toutes les 10s)
# ============================================================
interval:
  - interval: 10s
    then:
      - lambda: |-
          id(last_cmd) = 0x0D;
          uint8_t f[2] = {0x6A, 0x0D};
          id(ht7017_uart).write_array(f, 2);

# ============================================================
# SCRIPTS
# ============================================================
script:
  - id: boost_script
    mode: restart
    then:
      - logger.log: "Boost activé pour 30 minutes"
      - globals.set:
          id: boost_active
          value: 'true'
      - lambda: |-
          float target = id(tiko_climate).target_temperature + 3.0f;
          if (target > 30.0f) target = 30.0f;
          auto call = id(tiko_climate).make_call();
          call.set_target_temperature(target);
          call.perform();
          ESP_LOGI("TIKO", "Boost → consigne %.1f°C", target);
      - light.turn_on:
          id: led
          red: 100%
          green: 30%
          blue: 0%
          effect: "Pulse"
      - delay: 30min
      - globals.set:
          id: boost_active
          value: 'false'
      - switch.turn_off: boost_switch
      - light.turn_off:
          id: led
          transition_length: 0s
      - climate.control:
          id: tiko_climate
          custom_preset: Confort
      - logger.log: "Boost terminé → retour preset Confort"

# ============================================================
# UART — HT7017 (mesure consommation)
# ============================================================
uart:
  id: ht7017_uart
  tx_pin: 17
  rx_pin: 18
  baud_rate: 4800
  data_bits: 8
  parity: EVEN
  stop_bits: 1
  rx_buffer_size: 256
  debug:
    direction: RX
    dummy_receiver: true
    after:
      timeout: 40ms
    sequence:
      - lambda: |-
          if(bytes.size() != 4) return;

          uint32_t raw = ((uint32_t)bytes[0]<<16)
                        | ((uint32_t)bytes[1]<<8)
                        |  (uint32_t)bytes[2];

          ESP_LOGD("HT7017_RAW", "cmd=0x%02X raw=0x%06X (%u) bytes=%s",
                    id(last_cmd), raw, raw,
                    format_hex_pretty(bytes).c_str());

          if(id(last_cmd) == 0x0D) {
            if(!id(first_read)) {
              uint32_t delta = 0;
              if(raw >= id(prev_energy_raw))
                delta = raw - id(prev_energy_raw);
              else
                delta = (0xFFFFFF - id(prev_energy_raw)) + raw + 1;
              id(last_raw_power) = (float)delta * 112.5f;
              float p = id(last_raw_power) * id(watt_multiplier);
              id(power_sensor).publish_state(p);
              float e = (float)raw * id(watt_multiplier) / 3200.0f;
              id(energy_sensor).publish_state(e);
            } else {
              id(first_read) = false;
            }
            id(prev_energy_raw) = raw;
          }

# ============================================================
# BOUTONS DIAGNOSTIC HT7017
# ============================================================
button:
  - platform: template
    name: "Calibrer maintenant"
    entity_category: config
    on_press:
      - lambda: |-
          if(id(last_raw_power) > 0.0f) {
            id(watt_multiplier) = id(ref_power).state / id(last_raw_power);
            ESP_LOGI("HT7017", "Calibration OK: ref=%.0fW brut=%.1f mult=%.6f",
                     id(ref_power).state, id(last_raw_power), id(watt_multiplier));
          } else {
            ESP_LOGW("HT7017", "Pas encore de mesure brute");
          }

  - platform: template
    name: "HT7017 Reset Software"
    entity_category: diagnostic
    on_press:
      - lambda: |-
          uint8_t wp[5] = {0x6A, 0x80|0x32, 0x00, 0xBC, 0};
          uint8_t s=0; for(int i=0;i<4;i++) s+=wp[i]; wp[4]=~s;
          id(ht7017_uart).write_array(wp, 5);
          delay(100);
          uint8_t rst[5] = {0x6A, 0x80|0x33, 0x00, 0x55, 0};
          s=0; for(int i=0;i<4;i++) s+=rst[i]; rst[4]=~s;
          id(ht7017_uart).write_array(rst, 5);
          id(first_read) = true;
          id(prev_energy_raw) = 0;
          ESP_LOGI("HT7017", "Reset logiciel envoyé");

  - platform: template
    name: "HT7017 Probe ChipID"
    entity_category: diagnostic
    on_press:
      - lambda: |-
          id(last_cmd) = 0x1B;
          uint8_t f[2] = {0x6A, 0x1B};
          id(ht7017_uart).write_array(f, 2);

  - platform: template
    name: "HT7017 Probe URms"
    entity_category: diagnostic
    on_press:
      - lambda: |-
          id(last_cmd) = 0x08;
          uint8_t f[2] = {0x6A, 0x08};
          id(ht7017_uart).write_array(f, 2);

  - platform: template
    name: "HT7017 Probe PowerP1"
    entity_category: diagnostic
    on_press:
      - lambda: |-
          id(last_cmd) = 0x0A;
          uint8_t f[2] = {0x6A, 0x0A};
          id(ht7017_uart).write_array(f, 2);

# ============================================================
# DIVERS
# ============================================================
text_sensor:
  - platform: wifi_info
    ip_address:
      name: "IP Address"
      on_value:
        - if:
            condition:
              lambda: 'return x == "192.168.4.1";'
            then:
              - light.turn_on:
                  id: led
                  effect: "None"
                  red: 100%
                  green: 50%
                  blue: 0%

6. Configuration initiale dans Home Assistant

Réglage des températures cibles

La configuration HA utilise le thermostat natif de HA. Tout en conservant la logique retenue du constructeur avec des modes prédéfinis : on définit des températures cibles par mode (Confort, Éco, Hors-Gel), puis on sélectionne un mode. Le radiateur chauffe jusqu’à atteindre la consigne.

L’hystérésis (tolérance de déclenchement) est réglable dans la section Configuration. Par défaut : 0,3 °C.

:warning: Attention : un réglage trop proche de 0°C risque de provoquer des cycles marche/arrêt très rapides au voisinage de la consigne, ce qui peut endommager le radiateur.

Calibration de la consommation électrique

Le capteur de consommation doit être calibré à partir de la puissance nominale de votre radiateur (500 W, 750 W, 1000 W, 1500 W…).

  1. Renseignez la puissance de référence dans la section Configuration (ex : 750 W)
  2. Allumez le radiateur à pleine puissance : mode Confort avec une consigne à 28 °C
  3. Attendez 20 secondes (le temps que la puissance se stabilise)
  4. Appuyez sur « Calibrer maintenant »

Le coefficient de calibration (watt_multiplier) est sauvegardé en flash et survit aux redémarrages.

Boutons de diagnostic HT7017

Ces boutons permettent de débuguer le capteur de consommation. Les résultats s’affichent dans les logs (ESPHome Builder → Composant → Logs). Le bouton Reset permet de réinitialiser le HT7017 s’il ne répond plus.


7. Usage des contrôles et capteurs

:thermometer: Thermostat (correspondant au composant standard HA)

Vous avez deux options :

  • Sélectionnez un mode (Confort, Éco, Hors-Gel, Éteint). Le radiateur régule automatiquement pour atteindre la température cible associée (le réglage que vous avez défini dans l’appareil)
  • Sélectionnez manuellement une température. Dans ce cas elle « écrase » le mode en cours.

:fire: Boost 30 minutes

Active une consigne temporaire de Confort + 3 °C pendant 30 minutes. À l’issue du boost, le radiateur revient automatiquement au mode en cours. Le boost peut être interrompu à tout moment en désactivant le switch.

:date: Planification

Utilisez le planificateur intégré à HA (ou tout autre outil de planification de votre choix) pour créer des scènes qui changent le mode en fonction des heures et des jours.

:light_bulb: LED

Permet de contrôler la LED RGB du boîtier et de régler ses couleurs. Dans la section Configuration, il est possible d’activer un indicateur visuel orange pulsé lorsque le radiateur est en chauffe.

:thermometer: Température et humidité

Le Tiko embarque deux capteurs SHT3xD situés aux extrémités du boîtier :

  • Capteur principal (0x44) — plus éloigné du module ESP, il reflète mieux la température de la pièce (vérifié par comparaison avec un thermomètre à alcool)
  • Capteur secondaire (0x45) — proche du module ESP, considéré comme capteur interne (visible dans Diagnostic)

:high_voltage: Puissance instantanée et énergie totale

Une fois calibrés, ces capteurs indiquent la consommation électrique en temps réel et l’énergie totale consommée.


:speech_balloon: N’hésitez pas à faire vos retours. Bonne chauffe ! :fire:

1 « J'aime »

Bravo ça donne envie de se lancer un post si bien détaillé mais on vient me retirer les modules Tiko dans 1 mois :persevering_face:

bonjour

tu fait comme moi j ai appeler pour leur dire que j avais tout enlever , la dame au telephone m a clairement dit que sa valais pas le coup de faire deplacer quelqu un si le materiel etait deja enlever et que je devais le mettre a la dechetterie .

resultat j ai mes 7 boitiers a la maison et mon contrat est officielement arreter donc les boitiers m appartiennent maintenant .

@chrisb06

super tuto bien detailler et imager merci , des que je recois mon adaptateur je me lance pour faire un test .
question a la con les cables dupont tiennent tout seul en force dans le pcb ?

Ça marche vraiment ça ? Surtout que j’en ai déjà enlevé une partie pour mettre des Nodon !

ba j ai fait comme toi j ai tout enlever pour tout remplacer par du nodon avant de me retrouver bloquer , et quand j ai appeler pour prendre rendez vous pour le retrait la dame a pas voulu faire deplacer quelqu un seulement pour recuperer le matos , elle ma donc envoyer un mail avec la resiliation de contrat a c est tout .

du coup je vais essayer le tuto gentiment proposer pour reabiliter au moins dans les chambres les modules tiko car je n est mis des nodon que dans ma piece a vivre .

1 « J'aime »

Oui les câbles tiennent seuls dans les trous; le contact est suffisant.

1 « J'aime »

Salut ah ben voilà c’est fait pour moi aussi ! J’ai 7 ou 8 modules à flasher maintenant :sweat_smile:

1 « J'aime »

Doc et code mis à jour avec composant thermostat dans le post initial

Plusieurs jours que j’utilise le boitier flashé et ça semble marcher à merveille.

1 « J'aime »

Salut ! Est ce que tu aurais la méthode pour réinitialiser le module ? J’ai du m’emmêler les pinceaux et je voudrais le réinitialiser complètement. Merci d’avance !

J’ai des erreurs quand je tente de compiler pour l’installer manuellement via HA :

Et quand je tente une installation directement dans esphome web, ça flashe bien mais après quand il tente de se reconnecter, il m’indique une erreur « Improv wifi serial not detected »

J’ai tenté sur 2 modules différents et j’obtiens la même chose (avec la même méthode).

J’ai l’impression que c’est en lien avec l’histoire du wifi qui s’active pas en 5V mais il apparaît pas plus en ligne dans HA.
Comment je peux mettre mes infos de wifi car je les ai jamais renseignées ?

Si j’interroge une IA, elle me dit qu’il peut y avoir des soucis avec les ESPHome Builder de HA au niveau compilation avec les dernières versions. Comme ça flashe bien avec le web, mais qu’il n’y a pas de yaml implanté, je vais essayer de pousser un yaml simple pour voir

EDIT : bon j’ai compilé un yaml en local, je l’ai importé dans le module, mais il ne se montre pas plus dans HA ni en point d’accès wifi, il ne démarre pas je pense.
Il n’y a que ça dans les logs :

[21:04:32]ESP-ROM:esp32s3-20210327
[21:04:32]Build:Mar 27 2021
[21:04:32]rst:0x1 (POWERON),boot:0x23 (DOWNLOAD(USB/UART0))
[21:04:32]waiting for download
[21:04:36]ESP-ROM:esp32s3-20210327
[21:04:36]Build:Mar 27 2021
[21:04:36]rst:0x1 (POWERON),boot:0x23 (DOWNLOAD(USB/UART0))
[21:04:36]waiting for download

Salut,
Oui la connexion série a été quelque fois capricieuse mais je suis finalement arrivé au bout avec qq branchements/débranchements. Par contre effectivement le WIFI ne marchera jamais tant que le boitier n’est pas alimenté par le 220V.

Concernant les identifiants wifi, je me suis posé la même question. En fait, ESP Builder ne te les demande que pour le premier appareil que tu flashes et ensuite il les stocke dans un fichier HA /homeassistant/esphome/secrets.yaml pour ne pas avoir à les mettre en clair dans le yaml de chaque appareil.


Pour reflasher à nouveau, j’ai simplement refais la procédure

Séquence de connexion (mode flash) :

  • Connectez le fil libre de IO à GND (maintenez)
  • Avec le fil libre de EN, touchez GND brièvement puis relâchez
  • Tout en maintenant IO → GND, cliquez sur « Connect »
  • Si cela ne fonctionne pas, relâchez tout et recommencez la séquence
    Ensuite si la procédure depuis HA ESP Home Builder va au bout, il aura forcément mis la partie
wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password
  ap:
    ssid: "Tiko-Chambre"
    password: "zzz"

et se connectera à ton wifi dès branchement au 220V. Je dirais qu’il faut arriver à faire la procédure depuis HA ESPHomeBuilder .

1 « J'aime »

Hello,

Je n’y arrive pas du coup avec cette erreur de compilation (qui n’apparaît pas si je build en local)…
Tu pourrais me donner la version de HA ESPHomeBuilder ? Que je regarde si j’ai la même ou non. Peut-être qu’avec un downgrade du module, je pourrais compiler dans HA.
Merci !

ESPHome Device Builder
Version actuelle : 2026.2.2

1 « J'aime »

Merci, je viens de faire la MAJ mais j’ai toujours l’erreur de compilation. Je viens de refaire la manip via ESPHome web, la prochaine étape est de rebranché le Tiko et on verra bien si ça boote :sweat_smile:

As tu essayé de Désinstaller puis réinstaller l’add-on ESPHome. Il semble que ton erreur de compilation vienne du cache de HA Esphomebuilder il y a du avoir un bug lors du téléchargement de l’addon.

Supprime ausssi le dossier de cache

/data/cache/platformio

Ta capture montre que le bug vient de là. rien à voir avec le boitier ou la flashage, c’est pe l’installation de espbuilder qui a ete mal mise à jour ou interrompue ( elle peut prendre un’peu de temps)

1 « J'aime »

Salut !
Alors en effet, en le connectant, j’ai pu le découvrir sur HA ! Waouh !
Maintenant, quand je tente de mettre les différentes yaml, ça me dit :

Et ça veut pas l’envoyer sur le module…

Si je commente pour avancer, pareil il trouve pas les « switch.turn_on » et là c’est plus sensible que la led vu que c’est le fil pilote…

EDIT : je comprends qu’il faut tout le fichier pour qu’il trouve les « variables » du bloc tout en bas. Je poursuis
PS : la réinstallation de l’app ESPHomeBuilder permet de corriger les erreurs, merci pour l’astuce !

Ça a l’air de fonctionner ! Maintenant faut que je voie si je peux faire fonctionner la soufflerie ou non mais c’est un plus