Émetteur/Récepteur IRverse

Bonjour à tous,

Je suis possesseur d’un sèche-serviette hybride ACOVA (à eau avec soufflerie élec) et d’une hotte aspirante Roblin.
La soufflerie et la hotte sont pilotables par IR avec une télécommande fournie propre à chacun.

Il me semble qu’il existe une passerelle propriétaire pour le connecter, mais je ne suis pas trop partisan d’avoir des hub partout.

Voici le github de mon projet : IRverse-Hub-IR-DIY-universel/README.md at main · Quentin90000/IRverse-Hub-IR-DIY-universel · GitHub

Du coup, je me suis lancé un petit défi : Et si je fabriquai moi-même un module pouvant snifer les communications et émettre des demandes le tout intégrable sous HA ?

Maintenant, que le cahier des charges est établi, voilà la liste du matériel nécessaire :

  • 1* D1 Mini Pro 16Mb avec antenne externe : Le cerveau de mon projet, il va gérer l’émission IR et alimenté tous mes composants.
  • 1 * LED IR « TSAL6400 » : Pour émettre une lumière IR et communiquer avec ma soufflerie IR
  • 1 * Résistance 220 Ohms : Montage en série sur l’anode de la LED pour limiter le courant et éviter qu’elle ne grille
  • 1* Résistance 10 kOhms : Montage en pull-up avec le TSOP38238
  • 1 * Condensateur 100nF céramique : Pour le découplage et filtrer les hautes-fréquences
  • 1 * Condensateur 100uF électrolytique : Stabilisation globale de l’alimentation
  • 1 * PCB sur mesure pour monter tout ça proprement
  • 1 * Module d’alimentation HLK-PM01 : Passer du 230V AC vers du 5V DC
  • 2 * Borniers 2P 5.08mm

Un morceau de câble 2G1.5 ou câble USB, presse-étoupe PG9 pour la version alimentation embarqué ou un PG7 pour la version alimentation séparée (pour le boîtier), etc.

Il faudrait également un boîtier en impression 3D pour tout mettre proprement à l’intérieur, mais chaque chose en son temps.

Coût du projet : Tout le matériel a été acheté sur aliexpress, et j’estime le coût du projet à environ 7€ version sans alimentation et 10€ version alimentation.

J’ai déjà fait la sélection du matériel via alibaba (https://www.aliexpress.com/p/wish-manage/share.html?smbPageCode=wishlist-amp&spreadId=825b08d8ee9aa58db2064336b0b6bf776838f56c5a1a1ad3830c99c9f8354210), et dessiné les PCB via Kicad (version shéma et PCB) :

EDIT : J’ai poussé le vice un peu plus loin en fabricant un module pour être raccordé directement au 230V et la version où il faut amener un 5VDC, ça me permet de palier à toutes les situations.

Version alimentation séparée (il faut raccorder un 5VDC environnant avec un USB par exemple) :

Version alimentation embarquée (une arrivée en 230V) :

Après avoir fait les différents tests (ERC et DRC), Kicad ne me remontent aucune erreur.

Ceci est mon premier projet, je me suis aidé de chatGPT pour le choix des composants, mais rien ne vaut des avis techniques, qu’en pensez-vous de ce projet ?
Je ne voulais pas d’un broadlink etc, c’est un challenge pour moi :slight_smile:

S’il faut, je peux partager le fichier Kicad si ça intéresse des personnes.

Voilà le PCB avec alimentation embarqué fabriqué :

Et voilà avec tous les composants soudés :

Voici mon programme avec des codes de ma télécommande IR de ma soufflerie du sèche-serviette ACOVA :

esphome:
  name: esp8266-acova-ir
  friendly_name: ESP8266-Acova_IR

esp8266:
  board: d1_mini_pro

logger:

api:
  encryption:
    key: "tacléAPI"

ota:
  platform: esphome
  password: "0a1abb4344477f1f0dd6a6e9c7143608"

wifi:
  ssid: "tonssidwifi"
  password: "tonmotdepasse"
  ap:
    ssid: "Esp8266-Acova-Ir"
    password: "RD8YW3fHcbNL"

captive_portal:

remote_transmitter:
  pin: D5
  carrier_duty_percent: 50%

remote_receiver:
  pin:
    number: D4
    inverted: true
  dump: all

# --- Scripts pour appuis longs (ON/OFF uniquement) ---
script:
  - id: acova_on_long
    then:
      # Phase 1 : Code ON normal (3 fois)
      - repeat:
          count: 3
          then:
            - remote_transmitter.transmit_pronto:
                data: "0000 006D 000E 0000 000C 004B 0028 004A 004D 0049 0028 0023 0029 0023 004D 0024 0027 0024 0029 0023 0029 0022 0029 0048 0029 0048 0027 004A 004D 0023 0029 0181"
            - delay: 250ms
      # Phase 2 : Code "appui maintenu" (4 fois)
      - repeat:
          count: 4
          then:
            - remote_transmitter.transmit_pronto:
                data: "0000 006D 000E 0000 000C 004B 0029 0024 0027 0049 0028 0024 0027 0024 004E 0049 004F 0049 0028 0022 0027 0025 004D 0049 0027 0049 004E 0049 004E 0023 004F 0181"
            - delay: 250ms
      # Phase 3 : Code de relâchement (1 fois)
      - remote_transmitter.transmit_pronto:
          data: "0000 006D 000E 0000 000C 004B 0028 004A 004C 004A 0027 0024 0029 0023 004C 0025 0027 0024 0028 0024 0027 0024 0028 0049 0027 004A 0028 0049 004D 0023 0028 0181"

  - id: acova_off_long
    then:
      # Phase 1 : Code OFF normal (3 fois)
      - repeat:
          count: 3
          then:
            - remote_transmitter.transmit_pronto:
                data: "0000 006D 000E 0000 000C 004B 0029 0049 004D 0024 0027 0024 0028 0024 0027 0023 0027 0025 0027 0023 0027 0025 0027 004A 004D 0023 0029 0023 0027 0023 0028 0181"
            - delay: 250ms
      # Phase 2 : Code "appui maintenu" (4 fois)
      - repeat:
          count: 4
          then:
            - remote_transmitter.transmit_pronto:
                data: "0000 006D 000E 0000 000C 004B 0028 0025 0027 0023 0028 0024 0028 0023 0027 004A 004D 004A 0028 0024 0027 0023 004E 0049 004E 0023 004D 0025 0027 0023 004F 0181"
            - delay: 250ms
      # Phase 3 : Code de relâchement (1 fois)
      - remote_transmitter.transmit_pronto:
          data: "0000 006D 000E 0000 000C 004B 0028 004A 004D 0025 0027 0023 0027 0025 0027 0023 0028 0024 0028 0023 0029 0023 0027 004A 004D 0023 0029 0023 0027 0024 0028 0181"

# --- Tous les switches ---
switch:
  # Boost ON/OFF - Séquence complète automatique
  - platform: template
    name: "Acova BOOST ON"
    turn_on_action:
      - repeat:
          count: 3
          then:
            - remote_transmitter.transmit_pronto:
                data: "0000 006D 000E 0000 000C 004C 0028 0025 004C 004A 0026 0024 0026 0026 004C 0024 0027 0024 004F 0048 004D 004A 0026 004B 0026 004B 004C 0024 0027 0024 0027 0181"
            - delay: 250ms
      - repeat:
          count: 4
          then:
            - remote_transmitter.transmit_pronto:
                data: "0000 006D 000E 0000 000C 004C 0027 0026 0027 0049 0028 0024 0026 0025 004D 004B 004C 004A 0027 0024 0027 0025 004B 004B 0026 004A 004D 004B 004B 0024 004D 0181"
            - delay: 250ms
      - remote_transmitter.transmit_pronto:
          data: "0000 006D 000E 0000 000C 004C 0028 0025 004C 004B 0026 0025 0028 0024 004B 0025 0027 0024 004D 004A 004D 004A 0026 004B 0027 004A 004C 0024 0028 0024 0026 0181"

  - platform: template
    name: "Acova BOOST OFF"
    turn_on_action:
      - repeat:
          count: 3
          then:
            - remote_transmitter.transmit_pronto:
                data: "0000 006D 000E 0000 000C 004C 0027 004B 004C 004A 0026 0025 0027 0024 004C 0026 0027 0024 0027 0024 0026 0024 0027 004A 0026 004B 0026 004B 004C 0024 0027 0181"
            - delay: 250ms
      - repeat:
          count: 4
          then:
            - remote_transmitter.transmit_pronto:
                data: "0000 006D 000E 0000 000A 004D 0027 0026 0026 004A 0027 0025 0026 0025 004D 004B 004B 004B 0026 0024 0028 0024 004C 004A 0026 004A 004D 004C 004A 0025 004D 0181"
            - delay: 250ms
      - remote_transmitter.transmit_pronto:
          data: "0000 006D 000E 0000 000C 004C 0027 004B 004B 004C 0025 0025 0027 0024 004C 0026 0026 0025 0027 0025 0026 0025 0027 004A 0026 004B 0026 004B 004B 0026 0026 0181"

  # Timer Boost +/- (ajout/retrait de 15 minutes) - Séquence complète
  - platform: template
    name: "Acova BOOST + (timer)"
    turn_on_action:
      - repeat:
          count: 3
          then:
            - remote_transmitter.transmit_pronto:
                data: "0000 006D 000E 0000 000C 004C 0027 0026 004C 004A 0027 0024 0026 0026 004B 0024 0028 0049 0027 004A 004F 0023 004C 004B 0026 0025 0027 0024 0026 004B 004C 0181"
            - delay: 250ms
      - repeat:
          count: 4
          then:
            - remote_transmitter.transmit_pronto:
                data: "0000 006D 000E 0000 000C 004B 0028 0025 0026 004A 0027 0025 0026 0025 004D 004A 004D 004C 0025 0025 0026 0026 004B 004B 0026 004A 004D 004B 004B 0026 004C 0181"
            - delay: 250ms
      - remote_transmitter.transmit_pronto:
          data: "0000 006D 000E 0000 000C 004C 0027 0026 004B 004B 0026 0025 0026 0026 004C 0024 0027 004B 0026 004A 004D 0025 004B 004B 0026 0025 0027 0025 0026 004B 004B 0181"

  - platform: template
    name: "Acova BOOST - (timer)"
    turn_on_action:
      - repeat:
          count: 3
          then:
            - remote_transmitter.transmit_pronto:
                data: "0000 006D 000E 0000 000C 004C 0027 0026 004B 004B 0026 0024 0026 0026 004C 0024 0027 0025 004D 004A 004E 0049 0026 004B 0026 004B 004B 0025 0027 0025 0026 0181"
            - delay: 250ms
      - repeat:
          count: 4
          then:
            - remote_transmitter.transmit_pronto:
                data: "0000 006D 000E 0000 000C 004B 0027 0026 0027 0049 0027 0025 0026 0025 004D 004A 004D 004B 0027 0024 0026 0026 004B 004B 0026 004A 004E 004A 004C 0025 004D 0181"
            - delay: 250ms
      - remote_transmitter.transmit_pronto:
          data: "0000 006D 000E 0000 000C 004C 0028 0025 004C 004B 0027 0024 0026 0027 004A 0024 0029 0023 004D 004A 004D 004A 0026 004B 0026 004B 004B 0026 0026 0024 0026 0181"

  # ON/OFF avec appui long (3 secondes)
  - platform: template
    name: "Acova ON - appui long 3s"
    turn_on_action:
      - script.execute: acova_on_long

  - platform: template
    name: "Acova OFF - appui long 3s"
    turn_on_action:
      - script.execute: acova_off_long

Sa carte de fonctionnement accompagnée de son code :

type: vertical-stack
cards:
  # Header Card
  - type: custom:mushroom-title-card
    title: Radiateur Acova
    subtitle: Contrôle infrarouge

  # Boutons ON/OFF et BOOST
  - type: horizontal-stack
    cards:
      - type: custom:mushroom-template-card
        primary: ''
        secondary: ON
        icon: mdi:power
        icon_color: green
        layout: vertical
        tap_action:
          action: call-service
          service: switch.turn_on
          target:
            entity_id: switch.acova_on_appui_long_3s
        card_mod:
          style: |
            ha-card {
              background: rgba(76, 175, 80, 0.1);
              border: 1px solid rgba(76, 175, 80, 0.3);
            }

      - type: custom:mushroom-template-card
        primary: ''
        secondary: OFF
        icon: mdi:power-off
        icon_color: red
        layout: vertical
        tap_action:
          action: call-service
          service: switch.turn_on
          target:
            entity_id: switch.acova_off_appui_long_3s
        card_mod:
          style: |
            ha-card {
              background: rgba(244, 67, 54, 0.1);
              border: 1px solid rgba(244, 67, 54, 0.3);
            }

      - type: custom:mushroom-template-card
        primary: ''
        secondary: Boost ON
        icon: mdi:lightning-bolt
        icon_color: orange
        layout: vertical
        tap_action:
          action: call-service
          service: switch.turn_on
          target:
            entity_id: switch.acova_boost_on
        card_mod:
          style: |
            ha-card {
              background: rgba(255, 152, 0, 0.1);
              border: 1px solid rgba(255, 152, 0, 0.3);
            }

      - type: custom:mushroom-template-card
        primary: ''
        secondary: Boost OFF
        icon: mdi:lightning-bolt-outline
        icon_color: grey
        layout: vertical
        tap_action:
          action: call-service
          service: switch.turn_on
          target:
            entity_id: switch.acova_boost_off
        card_mod:
          style: |
            ha-card {
              background: rgba(158, 158, 158, 0.1);
              border: 1px solid rgba(158, 158, 158, 0.3);
            }

      - type: custom:mushroom-template-card
        primary: ''
        secondary: Timer +
        icon: mdi:plus-circle
        icon_color: blue
        layout: vertical
        tap_action:
          action: call-service
          service: switch.turn_on
          target:
            entity_id: switch.acova_boost_timer
        card_mod:
          style: |
            ha-card {
              background: rgba(33, 150, 243, 0.1);
              border: 1px solid rgba(33, 150, 243, 0.3);
            }

      - type: custom:mushroom-template-card
        primary: ''
        secondary: Timer -
        icon: mdi:minus-circle
        icon_color: purple
        layout: vertical
        tap_action:
          action: call-service
          service: switch.turn_on
          target:
            entity_id: switch.acova_boost_timer_2
        card_mod:
          style: |
            ha-card {
              background: rgba(156, 39, 176, 0.1);
              border: 1px solid rgba(156, 39, 176, 0.3);
            }

Programme fonctionnel de ma hotte aspirante Roblin Aqua avec tous les codes, si ça peut aider :

esphome:
  name: esp8266-roblin-ir
  friendly_name: ESP8266-Roblin_IR

esp8266:
  board: d1_mini_pro

logger:

api:
  encryption:
    key: "tacléapi"

ota:
  platform: esphome
  password: "0a1abb4344477f1f0dd6a6e9c7143608"

wifi:
  ssid: "tonwifi"
  password: "tonmotdepasse"
  ap:
    ssid: "Esp8266-Roblin-Ir"
    password: "cvi91SvuVJfn"

captive_portal:

remote_transmitter:
  id: my_remote
  pin: D5
  carrier_duty_percent: 50%

# --- Récepteur IR pour sniffer ---
remote_receiver:
  pin:
    number: D4
    inverted: true
  dump: all

# --- Scripts pour appuis longs ---
script:
  - id: lumiere_min
    then:
      - delay: 3s
      - remote_transmitter.transmit_pronto:
          data: "0000 006D 000B 0000 0021 001A 001E 001A 001E 0019 003C 0034 001E 001A 001F 0019 001F 0019 001F 0019 001E 001B 001E 001A 001D 0181"

  - id: mode_24h_on
    then:
      - delay: 3s
      - remote_transmitter.transmit_pronto:
          data: "0000 006D 0009 0000 003E 0035 001E 0019 003B 0019 001E 0034 001F 001A 001E 001A 003B 0034 001F 001A 001E 0181"

  - id: mode_24h_off
    then:
      - delay: 3s
      - remote_transmitter.transmit_pronto:
          data: "0000 006D 0009 0000 003D 0034 001F 0019 003C 0019 001F 0034 001F 0019 001E 001A 003C 0035 001E 0019 001F 0181"

# --- Tous les boutons ---
button:
  # Lumière
  - platform: template
    name: "Lumière ON (max)"
    on_press:
      - remote_transmitter.transmit_pronto:
          data: "0000 006D 0009 0000 0021 0018 001F 0018 003C 0034 001E 001A 001E 001A 003B 006A 001E 001A 001E 001A 0057 0181"

  - platform: template
    name: "Lumière ON (min) - appui long"
    on_press:
      - script.execute: lumiere_min

  - platform: template
    name: "Lumière OFF"
    on_press:
      - remote_transmitter.transmit_pronto:
          data: "0000 006D 0009 0000 0021 0018 001F 0018 003C 0034 001E 001A 001E 001A 003A 006A 001E 001A 001E 001A 0057 0181"

  # Hotte
  - platform: template
    name: "Hotte ON"
    on_press:
      - remote_transmitter.transmit_pronto:
          data: "0000 006D 0009 0000 0021 0018 001F 0033 003C 001A 001E 001A 001E 0035 003B 004F 001E 0034 001E 001A 003B 0181"

  - platform: template
    name: "Hotte OFF"
    on_press:
      - remote_transmitter.transmit_pronto:
          data: "0000 006D 0009 0000 0021 0019 001F 0034 003C 0019 001F 0019 001F 0034 003B 004E 001F 0033 001F 001A 003B 0181"

  # Aspiration
  - platform: template
    name: "Aspiration +1"
    on_press:
      - remote_transmitter.transmit_pronto:
          data: "0000 006D 0008 0000 0021 0018 0059 0019 001E 001A 001E 001A 0057 001A 001E 004F 0057 0034 003B 0181"

  - platform: template
    name: "Aspiration -1"
    on_press:
      - remote_transmitter.transmit_pronto:
          data: "0000 006D 0008 0000 0021 0033 003C 0018 001F 0019 001E 0035 003B 001A 001E 006A 003B 0034 003B 0181"

  # Boost
  - platform: template
    name: "Boost ON"
    on_press:
      - remote_transmitter.transmit_pronto:
          data: "0000 006D 0008 0000 0021 0018 003C 0033 001F 001A 001E 001A 003B 0035 001E 004F 003B 004F 003B 0181"

  - platform: template
    name: "Boost OFF"
    on_press:
      - remote_transmitter.transmit_pronto:
          data: "0000 006D 0008 0000 0021 0019 003C 0033 001F 001A 001E 001A 003B 0034 001E 004F 003B 004F 003B 0181"

  # Arrêt différé
  - platform: template
    name: "Arrêt différé ON"
    on_press:
      - remote_transmitter.transmit_pronto:
          data: "0000 006D 0006 0000 0020 0034 003B 0034 001E 004F 003C 004F 001D 0034 003B 0181"

  - platform: template
    name: "Arrêt différé OFF"
    on_press:
      - remote_transmitter.transmit_pronto:
          data: "0000 006D 0006 0000 0021 0034 003B 0034 001F 004E 003B 004E 001E 0034 003C 0181"

  # Mode 24H
  - platform: template
    name: "Mode 24H ON - appui long"
    on_press:
      - script.execute: mode_24h_on

  - platform: template
    name: "Mode 24H OFF - appui long"
    on_press:
      - script.execute: mode_24h_off

  # Réserve / Inconnu
  - platform: template
    name: "Réserve / Inconnu"
    on_press:
      - remote_transmitter.transmit_pronto:
          data: "0000 006D 0009 0000 0021 0018 001F 0033 001F 0018 001F 0034 001E 0034 001E 0034 001E 001A 001E 0034 001E 0181"

Pour terminer, j’utilise une antenne externe donc il faut bien penser à déplacer la résistance “0 Ohms” de 90 degrés mais uniquement à la toute fin de votre montage car en cas d’erreur, si vous devez faire un erase de la mémoire flash de votre wemos, il n’arrivera pas à se connecter au wifi pour repartir (du moins c’était mon cas). :grin:

Désolé, pas assez calé pour aider, mais je vois que les projets continuent :grinning:
C’est une « bonne » nouvelle

1 « J'aime »

Oui, il faut trouver des petites bricoles à faire, se challenger un petit peu ! j’ai encore un projet plus conséquent qui doit venir mais j’attends encore du matériel :smiley:
Le projet du lave-vaisselle j’ai mis en stand-by car je vais finalement le changer :rofl:

bonsoir,

pour info, j’ai ca depuis quelques années pour piloter ma télé en infratrouge

j’ai mis un esp01 car il suffit largement pour faire ça,
j’ai mis tout ça sous esphome
il y a une fonction qui ‹ lis › les codes d’une télécommande ir et te permet de les restituer en commande via home assistant,
pour moi, le fonctionnement est parfait, pilote ma télé et mon ampli home cinéma tous les soirs sans aucun bug !

si tu veux un bout de code, tu me dis, mais c’est du esphome classique

Stéphane

1 « J'aime »

Salut,

Merci pour ton partage ! Je vois que nos montages ont quelques similarités donc ça me rassure sur mon travail.

Je n’ai pas pensé pour la télé ou le home cinéma, tu utilises quelles fonctions, juste pour me faire une idée ?

Je pense que oui, je voudrai bien te piquer un petit bout de code quand j’aurais produit mon PCB une fois que j’aurais eu des avis :grinning:

J’ai fais le choix d’un D1 mini pro, pour le format compact comme toi (je suppose), le fait qu’il n’y pas pas besoin d’une énorme puissance de calcul mais j’ai besoin de l’antenne, au moins la prévoir car le montage sera assez éloigné de ma box (8 mètres avec un mur en travers).

Bonjour,
pour la tv, j’utilise que le on/off et pour l’ampli le on/off, volume, changement de source.

1 « J'aime »

Oui effectivement ça évite les 50 télécommandes différentes. J’ai de la la chance avec le fire stick ça a pris le « dessus » sur ses fonctions là.

Côté montage de mon PCB, c’est un montage cohérent selon toi ?

D’avance merci :smiley:

bonsoir

voilà pour le code,
le plus gros problème est de trouver la correspondance entre les codes lus et ce que l’on doit envoyer,
pour les télécommandes standards, il existe quelques sites ou les codes sont publié

j’avais trouvé un petit logiciel de conversion

mais peut être que maintenant on peut fouetter une IA pour avoir une conversion…

en tout cas, la plupart des infos sont documentées dans esphome

# récepteur ir
remote_receiver:
  pin: 
    number: GPIO1
    inverted: True
  dump: all


# émetteur ir
remote_transmitter:
  pin: GPIO3
  carrier_duty_percent: 50%



sensor:
  - platform: wifi_signal
    name: "WiFi Signal Remote01"
    update_interval: 60s



switch:
# telecommandes
  - platform: template
    name: "AMPLI SCENE 1 ir"
    turn_on_action:
      - remote_transmitter.transmit_nec:
          address: 0x857A           #0x5EA1           # 1000 0101 0111 1010
          command: 0x7F00           #0x00FE           # 0111 1111 0000 0000
  - platform: template
    name: "AMPLI SCENE 2 ir"
    turn_on_action:
      - remote_transmitter.transmit_nec:
          address: 0x857A           #0x5EA1           # 1000 0101 0111 1010
          command: 0x7C03           #0xC03E           # 0111 1100 0000 0011
  - platform: template
    name: "AMPLI SCENE 3 ir"
    turn_on_action:
      - remote_transmitter.transmit_nec:
          address: 0x857A           #0x5EA1           # 1000 0101 0111 1010
          command: 0x7906           #0x609E           # 0111 1001 0000 0110
  - platform: template
    name: "AMPLI SCENE 4 ir"
    turn_on_action:
      - remote_transmitter.transmit_nec:
          address: 0x857A           #0x5EA1           # 1000 0101 0111 1010
          command: 0x7609           #0x906E           # 0111 0110 0000 1001
  - platform: template
    name: "AMPLI ON ir"
    turn_on_action:
      - remote_transmitter.transmit_nec:
          address: 0x817E           #0x7E81           # 1000 0001 0111 1110
          command: 0x817E           #0x7E81           # 1000 0001 0111 1110
  - platform: template
    name: "AMPLI STANDBY ir"
    turn_on_action:
      - remote_transmitter.transmit_nec:
          address: 0x817E           #0x7E81           # 1000 0001 0111 1110
          command: 0x807F           #0xFE01           # 1000 0000 0111 1111
 
 ##### tv philips
  - platform: template
    name: "PHILIPS RC6 EXT ir"
    turn_on_action:
      - remote_transmitter.transmit_rc6:
         address: 0x00
         command: 0x38
         repeat:
          times: 3
          wait_time: 20ms
  - platform: template
    name: "PHILIPS RC6 POWER ir"
    turn_on_action:
      - remote_transmitter.transmit_rc6:
         address: 0x00
         command: 0x0C
         repeat:
          times: 5
          wait_time: 20ms
 
  - platform: template
    name: "TV ON/OFF ir"
    turn_on_action:
      - remote_transmitter.transmit_raw:
           code: [258, -1836, 258, -823, 230, -824, 232, -823, 231, -824, 231, -824, 231, -1836, 259, -1833, 261, -821, 232, -1836, 260, -822, 231, -824, 231, -823, 232, -1837, 258, -822, 231, -9999, 260,
            -1835, 259, -822, 231, -823, 232, -823, 232, -823, 232, -1836, 259, -822, 232, -823, 232, -1835, 261, -821, 231, -1836, 259, -1835, 258, -1835, 260, -822, 231, -1836, 259, -9999, 260, -1834, 260, 
            -822, 231, -824, 231, -823, 233, -822, 232, -824, 231, -1836, 259, -1834, 260, -822, 232, -1835, 260, -821, 232, -824, 231, -823, 231, -1837, 259, -822, 231]      
           carrier_frequency: 38kHz       
           repeat:
             times: 3
             wait_time: 50ms
  - platform: template
    name: "TV SOURCE ir"
    turn_on_action:
      - remote_transmitter.transmit_raw:
           code: [259, -1834, 261, -821, 232, -823, 232, -823, 232, -823, 231, -1838, 259, -1834, 260, -822, 231, -824, 231, -1835, 262, -821, 231, -824, 232, -823, 232, -1836, 259, -823, 231, -9999, 
           261, -1833, 260, -822, 232, -823, 232, -823, 232, -824, 231, -823, 232, -824, 231, -1836, 260, -1835, 259, -822, 231, -1836, 260, -1838, 257, -1833, 261, -820, 233, -1835, 261, -9999, 
           259, -1834, 260, -822, 232, -823, 232, -823, 232, -823, 232, -1835, 260, -1834, 260, -823, 231, -823, 232, -1834, 262, -821, 232, -824, 231, -823, 232, -1837, 259, -822, 232]      
           carrier_frequency: 38kHz       
           repeat:
             times: 1
             wait_time: 200ms
  - platform: template
    name: "TV HAUT ir"
    turn_on_action:
      - remote_transmitter.transmit_raw:
           code: [261, -1833, 261, -821, 232, -823, 232, -824, 231, -824, 231, -1837, 258, -1834, 261, -1833, 261, -821, 232, -1835, 261, -822, 231, -1836, 260, -821, 232, -1835, 261, -821, 232, -9999, 
           261, -1834, 261, -821, 232, -824, 231, -826, 229, -823, 232, -824, 231, -823, 232, -823, 232, -1836, 260, -821, 235, -1832, 286, -796, 232, -1835, 261, -821, 232, -1836, 260, -9999, 
           261, -1833, 260, -822, 232, -823, 232, -822, 233, -823, 232, -1836, 259, -1834, 261, -1833, 261, -821, 232, -1835, 260, -822, 231, -1836, 260, -822, 232, -1836, 260, -822, 232]      
           carrier_frequency: 38kHz       
           repeat:
             times: 1
             wait_time: 200ms
  - platform: template
    name: "TV 5xHAUT ir"
    turn_on_action:
      - remote_transmitter.transmit_raw:
           code: [261, -1833, 261, -821, 232, -823, 232, -824, 231, -824, 231, -1837, 258, -1834, 261, -1833, 261, -821, 232, -1835, 261, -822, 231, -1836, 260, -821, 232, -1835, 261, -821, 232, -9999, 
           261, -1834, 261, -821, 232, -824, 231, -826, 229, -823, 232, -824, 231, -823, 232, -823, 232, -1836, 260, -821, 235, -1832, 286, -796, 232, -1835, 261, -821, 232, -1836, 260, -9999, 
           261, -1833, 260, -822, 232, -823, 232, -822, 233, -823, 232, -1836, 259, -1834, 261, -1833, 261, -821, 232, -1835, 260, -822, 231, -1836, 260, -822, 232, -1836, 260, -822, 232]      
           carrier_frequency: 38kHz       
           repeat:
             times: 5
             wait_time: 2s
  - platform: template
    name: "TV BAS ir"
    turn_on_action:
      - remote_transmitter.transmit_raw:
           code: [260, -1835, 260, -820, 232, -824, 231, -823, 232, -824, 231, -824, 231, -824, 231, -824, 231, -823, 232, -823, 232, -1795, 301, -821, 232, -824, 231, -1836, 260, -822, 232, -9999, 
           259, -1835, 259, -822, 231, -824, 231, -825, 230, -827, 229, -1836, 259, -1833, 261, -1835, 259, -1834, 260, -1835, 259, -822, 232, -1835, 260, -1834, 260, -822, 231, -1837, 260, -9999, 
           262, -1835, 260, -821, 232, -823, 231, -824, 232, -823, 232, -823, 231, -824, 232, -823, 232, -823, 232, -823, 232, -1837, 259, -821, 232, -823, 232, -1836, 259, -822, 232]      
           carrier_frequency: 38kHz       
           repeat:
             times: 1
             wait_time: 200ms
  - platform: template
    name: "TV 5xBAS ir"
    turn_on_action:
      - remote_transmitter.transmit_raw:
           code: [260, -1835, 260, -820, 232, -824, 231, -823, 232, -824, 231, -824, 231, -824, 231, -824, 231, -823, 232, -823, 232, -1795, 301, -821, 232, -824, 231, -1836, 260, -822, 232, -9999, 
           259, -1835, 259, -822, 231, -824, 231, -825, 230, -827, 229, -1836, 259, -1833, 261, -1835, 259, -1834, 260, -1835, 259, -822, 232, -1835, 260, -1834, 260, -822, 231, -1837, 260, -9999, 
           262, -1835, 260, -821, 232, -823, 231, -824, 232, -823, 232, -823, 231, -824, 232, -823, 232, -823, 232, -823, 232, -1837, 259, -821, 232, -823, 232, -1836, 259, -822, 232]      
           carrier_frequency: 38kHz       
           repeat:
             times: 5
             wait_time: 2s
  - platform: template
    name: "TV OK ir"
    turn_on_action:
      - remote_transmitter.transmit_raw:
           code: [261, -1834, 259, -822, 231, -824, 231, -824, 231, -825, 230, -827, 229, -1835, 260, -821, 232, -824, 231, -1836, 259, -823, 231, -1835, 260, -823, 231, -1837, 259, -821, 232, -9999, 
           260, -1825, 269, -822, 231, -823, 232, -823, 232, -823, 232, -1835, 260, -823, 231, -1836, 259, -1834, 261, -822, 231, -1834, 262, -821, 232, -1836, 259, -822, 232, -1835, 260, -9999, 
           260, -1835, 260, -821, 232, -823, 232, -823, 232, -823, 232, -823, 232, -1835, 260, -822, 232, -823, 236, -1831, 259, -823, 231, -1836, 260, -822, 232, -1835, 260, -822, 232]      
           carrier_frequency: 38kHz       
           repeat:
             times: 1
             wait_time: 200ms

 ##### tv samsung (s90c)
  - platform: template
    name: "SAM POWER ir"
    turn_on_action:
      - remote_transmitter.transmit_raw:
           code: [+4444,-4418,+552,-1657,+552,-1657,+552,-1657,+552,-552,+552,-552,+552,-552,+552,-552,+552,-552,+552,-1657,+552,-1657,+552,-1657,+552,-552,+552,-552,+552,-552,+552,-552,
           +552,-552,+552,-552,+552,-1657,+552,-552,+552,-552,+552,-552,+552,-552,+552,-552,+552,-552,+552,-1683,+552,-552,+552,-1657,+552,-1657,+552,-1657,+552,-1657,+552,-1657,+552,-1657,+552,-47175]
           carrier_frequency: 38kHz       
           repeat:
             times: 3
             wait_time: 50ms
  - platform: template
    name: "SAM HAUT ir"
    turn_on_action:
      - remote_transmitter.transmit_raw:
           code: [+4444,-4418,+552,-1657,+552,-552,+552,-1657,+552,-579,+552,-552,+552,-552,+552,-552,+552,-552,+552,-1657,+552,-552,+552,-1657,+552,-552,+552,-552,+552,-552,+552,-552,+552,
           -552,+552,-552,+552,-552,+552,-552,+552,-579,+552,-552,+552,-552,+552,-552,+552,-552,+552,-1657,+552,-1657,+552,-1657,+552,-1657,+552,-1657,+552,-1657,+552,-1657,+552,-1657,+552,-49594]
           carrier_frequency: 38kHz       
           repeat:
             times: 1
             wait_time: 200ms
  - platform: template
    name: "SAM DROITE ir"
    turn_on_action:
      - remote_transmitter.transmit_raw:
           code: [+4444,-4418,+552,-1657,+552,-552,+552,-1657,+552,-579,+552,-552,+552,-552,+552,-552,+552,-552,+552,-1657,+552,-552,+552,-1657,+552,-552,+552,-552,+552,-552,+552,-552,+552,-552,
           +552,-1657,+552,-1657,+552,-552,+552,-552,+552,-552,+552,-552,+552,-1657,+552,-552,+552,-552,+552,-579,+552,-1657,+552,-1657,+552,-1657,+552,-1657,+552,-552,+552,-1657,+552,-49594]
           carrier_frequency: 38kHz       
           repeat:
             times: 1
             wait_time: 200ms
  - platform: template
    name: "SAM OK ir"
    turn_on_action:
      - remote_transmitter.transmit_raw:
           code: [+4455,-4429,+547,-1641,+547,-1641,+547,-1641,+547,-547,+547,-547,+547,-547,+547,-547,+547,-547,+547,-1641,+547,-1667,+547,-1641,+547,-547,+547,-547,+547,-547,+547,-547,+547,
           -547,+547,-1667,+547,-1641,+547,-547,+547,-547,+547,-547,+547,-1641,+547,-547,+547,-547,+547,-547,+547,-547,+547,-1641,+547,-1641,+547,-1641,+547,-547,+547,-1641,+547,-1641,+547,-47159]
           carrier_frequency: 38kHz       
           repeat:
             times: 1
             wait_time: 200ms



############
# SAMSUNG S90C POWER
# code sur : https://www.remotecentral.com/cgi-bin/codes/samsung/tv_functions/

# utilitaire de conversion de codes : IrScrutinizer — an IR signal program
# http://www.harctoolbox.org/index.html
# 

1 « J'aime »

Merci pour le code et les informations !

J’ai commandé à l’instant 6 PCB pour tester auprès du fabricant aisler. J’ai aussi modifié le PCB pour mettre 3 points de fixation en M3 (visible dans le premier post que je met à jour si quelqu’un veut s’en inspirer) car ce n’était pas top si je comptais fabriquer, par la suite, un boitier en 3D pour finaliser le projet.

Plus qu’à attendre les composants et le PCB d’ici 8 jours ouvrés et ce sera le verdict après soudure ! :grin:

Salut,

Je viens avec des nouvelles plus au moins bonnes.

J’ai réceptionné mes 3 PCB de chez Aisler seulement tous les trous pour composants traversants sont bouchés par une couche metalique et le plastique du PCB en dessous.

Rien n’est perdu, car la continuité est bonne donc je vais acheter un lot de forêt de 0,3mm à 1,6mm et tout percer pour pouvoir mettre mes composants, mais seulement après mes vacances :+1:.

Erreur d’Aisler et de moi ? Mes footprints de Kicad sont officiels donc bizarre, j’ai quand même envoyé un mail au SAV.

EDIT: Après échange avec le SAV, ils n’avaient pas reçu les fichier de perçage alors que bien présent dans le dossier, sans doute un bug durant l’upload. Aisler m’offre la reproduction, donc c’est reparti pour un petit délai de fabrication + expédition !

Salut,

J’ai reçu mes PCB (avec les trous pour les composants traversants cette fois-ci !).

J’ai soudé tous les composants sur deux PCB (un pour mon sèche-serviette avec soufflerie ACOVA et le second pour ma hotte aspirante ROBLIN).

Ce soir je me pencherai sur le code et je ferais quelques essais puis je reviendrai ici ! :smiley:

1 « J'aime »

Super !

N’hésite pas a participer au concours, ton projet y a sa place je pense. Sans pression bien sur :wink:

1 « J'aime »

Salut,

Oui pourquoi pas, ça peut être une idée ! :slight_smile:

J’ai avancé sur mon projet et j’ai du code qui remonte !

Mon programme actuel :

esphome:
  name: esp8266-acova-ir
  friendly_name: ESP8266-Acova_IR

esp8266:
  board: d1_mini_pro

logger:

api:
  encryption:
    key: "masquer pour le post="

ota:
  platform: esphome
  password: "masquer pour le post"

wifi:
  ssid: "masquer pour le post"
  password: "masquer pour le post"

  ap:
    ssid: "Esp8266-Acova-Ir"
    password: "RD8YW3fHcbNL"

captive_portal:

globals:
  - id: last_raw
    type: std::vector<int>
    initial_value: 'std::vector<int>()'

remote_receiver:
  pin:
    number: D4
    inverted: true
  dump: all
  on_raw:
    then:
      - lambda: |-
          ESP_LOGD("IR", "IR code received with size: %d", x.size());
          id(last_raw) = x;

remote_transmitter:
  pin: D5
  carrier_duty_percent: 50%

switch:
  - platform: template
    name: "Send Last IR"
    turn_on_action:
      - remote_transmitter.transmit_raw:
          carrier_frequency: 38000Hz
          code: !lambda |-
            return id(last_raw);

Voilà quand j’appuie sur le même bouton de ma télécommande du sèche-serviette :

INFO ESPHome 2025.9.1
INFO Reading configuration /config/esphome/esp8266-acova-ir.yaml...
INFO Starting log output from 192.168.1.3 using esphome API
INFO Successfully resolved esp8266-acova-ir @ 192.168.1.3 in 0.000s
INFO Successfully connected to esp8266-acova-ir @ 192.168.1.3 in 0.006s
INFO Successful handshake with esp8266-acova-ir @ 192.168.1.3 in 2.626s
[23:25:29.781][I][app:185]: ESPHome version 2025.9.1 compiled on Sep 29 2025, 22:46:08
[23:25:29.781][C][wifi:661]: WiFi:
[23:25:29.781][C][wifi:444]:   Local MAC: B4:8A:0A:DD:B1:C1
[23:25:29.781][C][wifi:449]:   SSID: [redacted]
[23:25:29.781][C][wifi:452]:   IP Address: 192.168.1.3
[23:25:29.782][C][wifi:456]:   BSSID: [redacted]
[23:25:29.782][C][wifi:456]:   Hostname: 'esp8266-acova-ir'
[23:25:29.782][C][wifi:456]:   Signal strength: -58 dB ▂▄▆█
[23:25:29.782][C][wifi:467]:   Channel: 6
[23:25:29.782][C][wifi:467]:   Subnet: 255.255.255.0
[23:25:29.782][C][wifi:467]:   Gateway: 192.168.1.1
[23:25:29.782][C][wifi:467]:   DNS1: 192.168.1.1
[23:25:29.782][C][wifi:467]:   DNS2: 0.0.0.0
[23:25:29.784][C][logger:273]: Logger:
[23:25:29.784][C][logger:273]:   Max Level: DEBUG
[23:25:29.784][C][logger:273]:   Initial Level: DEBUG
[23:25:29.788][C][logger:279]:   Log Baud Rate: 115200
[23:25:29.788][C][logger:279]:   Hardware UART: UART0
[23:25:29.798][C][template.switch:087]: Template Switch 'Send Last IR'
[23:25:29.798][C][template.switch:087]:   Restore Mode: always OFF
[23:25:29.798][C][template.switch:057]:   Optimistic: NO
[23:25:29.810][C][remote_receiver.esp8266:059]: Remote Receiver:
[23:25:29.811][C][remote_receiver.esp8266:060]:   Pin: GPIO2
[23:25:29.822][C][remote_receiver.esp8266:065]:   Buffer Size: 1000
[23:25:29.822][C][remote_receiver.esp8266:065]:   Tolerance: 25%
[23:25:29.822][C][remote_receiver.esp8266:065]:   Filter out pulses shorter than: 50 us
[23:25:29.822][C][remote_receiver.esp8266:065]:   Signal is done after 10000 us of no changes
[23:25:29.834][C][remote_transmitter:018]: Remote Transmitter:
[23:25:29.834][C][remote_transmitter:018]:   Carrier Duty: 50%
[23:25:29.834][C][remote_transmitter:022]:   Pin: GPIO14
[23:25:29.839][C][captive_portal:122]: Captive Portal:
[23:25:29.851][C][esphome.ota:075]: Over-The-Air updates:
[23:25:29.851][C][esphome.ota:075]:   Address: esp8266-acova-ir.local:8266
[23:25:29.851][C][esphome.ota:075]:   Version: 2
[23:25:29.862][C][esphome.ota:082]:   Password configured
[23:25:29.863][C][safe_mode:018]: Safe Mode:
[23:25:29.863][C][safe_mode:018]:   Successful after: 60s
[23:25:29.863][C][safe_mode:018]:   Invoke after: 10 attempts
[23:25:29.863][C][safe_mode:018]:   Duration: 300s
[23:25:29.868][C][web_server.ota:235]: Web Server OTA
[23:25:29.877][C][api:205]: Server:
[23:25:29.877][C][api:205]:   Address: esp8266-acova-ir.local:6053
[23:25:29.878][C][api:210]:   Noise encryption: YES
[23:25:29.883][C][mdns:213]: mDNS:
[23:25:29.883][C][mdns:213]:   Hostname: esp8266-acova-ir
[23:25:58.896][D][IR:041]: IR code received with size: 28
[23:25:58.908][I][remote.pronto:231]: Received Pronto: data=
[23:25:58.909][I][remote.pronto:233]: 0000 006D 000E 0000 000C 004B 0028 0025 004C 004A 0027 0023 0027 0025 004D 0023 0028 0023 004E 0049 004E 0049 0027 004A 0027 004A 004D 0023 0028 0023 0027 0181 
[23:25:59.146][D][IR:041]: IR code received with size: 28
[23:25:59.157][I][remote.pronto:231]: Received Pronto: data=
[23:25:59.157][I][remote.pronto:233]: 0000 006D 000E 0000 000C 004B 0028 0025 004D 004A 0027 0024 0027 0025 004D 0023 0028 0024 004E 0049 004E 0049 0027 004A 0027 004A 004C 0025 0027 0023 0027 0181 
[23:25:59.398][D][IR:041]: IR code received with size: 28
[23:25:59.409][I][remote.pronto:231]: Received Pronto: data=
[23:25:59.410][I][remote.pronto:233]: 0000 006D 000E 0000 000C 009B 0028 0023 004D 004A 0027 0023 0028 0023 004E 0023 0027 0023 004E 0049 004E 0049 0028 0049 0028 0049 004E 0023 0027 0023 0028 0181 
[23:25:59.648][D][IR:041]: IR code received with size: 28
[23:25:59.659][I][remote.pronto:231]: Received Pronto: data=
[23:25:59.659][I][remote.pronto:233]: 0000 006D 000E 0000 000C 004B 0028 0025 0027 0049 0028 0023 0027 0023 004E 0049 004E 004A 0027 0024 0027 0025 004D 004A 0027 0049 004E 004A 004D 0023 004E 0181 
[23:25:59.898][D][IR:041]: IR code received with size: 28
[23:25:59.912][I][remote.pronto:231]: Received Pronto: data=
[23:25:59.912][I][remote.pronto:233]: 0000 006D 000E 0000 000C 004B 0028 0025 0027 0049 0028 0023 0028 0022 004E 0049 004E 004A 0027 0023 0027 0025 004D 0049 0027 0049 004E 004A 004C 0023 004E 0181 
[23:26:00.148][D][IR:041]: IR code received with size: 28
[23:26:00.159][I][remote.pronto:231]: Received Pronto: data=
[23:26:00.159][I][remote.pronto:233]: 0000 006D 000E 0000 000D 004A 0029 0024 0028 0048 0029 0022 0028 0022 004F 0048 004F 0049 0028 0022 0028 0024 004E 0049 0028 0048 004E 004A 004D 0023 004F 0181 
[23:26:00.400][D][IR:041]: IR code received with size: 28
[23:26:00.412][I][remote.pronto:231]: Received Pronto: data=
[23:26:00.413][I][remote.pronto:233]: 0000 006D 000E 0000 000D 0099 0029 0022 0029 0048 0028 0024 0028 0022 004F 0048 004F 0048 0028 0024 0028 0022 004F 0048 0029 0048 004F 0048 004F 0022 004F 0181 
[23:26:00.646][D][IR:041]: IR code received with size: 28
[23:26:00.657][I][remote.pronto:231]: Received Pronto: data=
[23:26:00.658][I][remote.pronto:233]: 0000 006D 000E 0000 000D 004A 0029 0024 004D 0049 0028 0023 0028 0024 004D 0023 0029 0022 004F 0048 004F 0048 0028 0049 0028 0049 004D 0025 0028 0023 0028 0181 
[23:26:06.894][D][IR:041]: IR code received with size: 28
[23:26:06.905][I][remote.pronto:231]: Received Pronto: data=
[23:26:06.905][I][remote.pronto:233]: 0000 006D 000E 0000 000C 004B 0028 004A 004D 004A 0027 0023 0028 0023 004D 0025 0027 0024 0028 0024 0027 0023 0028 0049 0027 004A 0027 004A 004D 0025 0027 0181 
[23:26:07.144][D][IR:041]: IR code received with size: 28
[23:26:07.155][I][remote.pronto:231]: Received Pronto: data=
[23:26:07.155][I][remote.pronto:233]: 0000 006D 000E 0000 000C 004B 0028 004A 004D 004A 0027 0023 0028 0023 004D 0025 0027 0023 0028 0023 0027 0024 0028 0049 0027 004A 0027 004A 004D 0023 0028 0181 
[23:26:07.396][D][IR:041]: IR code received with size: 28
[23:26:07.407][I][remote.pronto:231]: Received Pronto: data=
[23:26:07.408][I][remote.pronto:233]: 0000 006D 000E 0000 000C 009B 0028 0049 004E 0049 0028 0024 0027 0023 004E 0024 0027 0025 0027 0023 0027 0025 0027 004A 0027 0049 0028 0049 004E 0023 0027 0181 
[23:26:07.648][D][IR:041]: IR code received with size: 28
[23:26:07.659][I][remote.pronto:231]: Received Pronto: data=
[23:26:07.659][I][remote.pronto:233]: 0000 006D 000E 0000 000C 004B 0028 0025 0027 0049 0028 0023 0027 0024 004E 0049 004E 004A 0027 0024 0027 0025 004D 004A 0027 0049 004E 0049 004E 0023 004E 0181 
[23:26:07.898][D][IR:041]: IR code received with size: 28
[23:26:07.909][I][remote.pronto:231]: Received Pronto: data=
[23:26:07.909][I][remote.pronto:233]: 0000 006D 000E 0000 000C 004B 0028 0025 0027 0049 0028 0023 0027 0023 004E 0049 004E 004A 0027 0023 0027 0025 004D 004A 0027 0049 004E 004A 004D 0023 004E 0181 
[23:26:08.148][D][IR:041]: IR code received with size: 28
[23:26:08.159][I][remote.pronto:231]: Received Pronto: data=
[23:26:08.159][I][remote.pronto:233]: 0000 006D 000E 0000 000C 004B 0028 0025 0027 0049 0028 0023 0027 0023 004E 0049 004E 004A 0027 0023 0027 0025 004D 004A 0027 0049 004E 0049 004E 0023 004E 0181 
[23:26:08.401][D][IR:041]: IR code received with size: 28
[23:26:08.411][I][remote.pronto:231]: Received Pronto: data=
[23:26:08.412][I][remote.pronto:233]: 0000 006D 000E 0000 000C 009B 0028 0023 0027 004A 0027 0024 0028 0023 004D 004A 004D 004A 0027 0023 0028 0024 004E 0049 0027 004A 004C 004A 004D 0025 004D 0181 
[23:26:08.644][D][IR:041]: IR code received with size: 28
[23:26:08.655][I][remote.pronto:231]: Received Pronto: data=
[23:26:08.655][I][remote.pronto:233]: 0000 006D 000E 0000 000C 004B 0028 004A 004D 004A 0027 0023 0028 0024 004D 0025 0027 0023 0028 0023 0027 0023 0028 0049 0027 004A 0027 004A 004D 0025 0027 0181 

Je vais récupérer les codes tous les codes qu’il me faut et ensuite je vais voir pour la suite.

Excellent idée, j’adore !

J’ai un sèche-serviette avec un boitier de contrôle en IR, j’avais pas penser a cette solution, du coup, j’ai acheter un finger-bot pour activer le mode boost (qui l’allume 2h)

Ta solution est bien moins chère, moins moche et surtout plus complète.

Mais peut-être que c’est pas applicable tél quel, si je veut utiliser la gestion de la T°, car mon boîtier de commande actuelle a un curseur (analogique) pour sélectionner la température de consigne.

J’ai la même télécommande que @roumano et un séche-serviettes Acova.

Pour automatiser mon sèche-serviettes, j’ai mis un Shelly sur le départ de son alimentation dans mon tableau électrique.
J’ai ensuite ajouté un thermostat dans Home Assistant:

Il suffit ensuite de mettre le curseur du thermostat IR “à fond” !
Le seul inconvénient, c’est un temps de réponse un peu lent: le thermostat doit envoyer ses ordres au sèche-serviettes toutes les x minutes.

Pour moi, ta solution fonctionne pas si le seche-serviette est éteint depuis trop longtemps , …

J’avais bien tenter de mettre des automatisation pour l’allumer qq minutes par semaines mais ça a jamais était stable et bien fonctionnel.

Du coup, pour l’instant, j’ai aussi un module sur départ de son alimentation et un finger-bot sur ce boîtier qui appuie sur le bouton “2h”, donc je peut l’allumer 2h (et moins via le module sur le départ)

Cette solution, loin d’être parfaite me convient relativement car je m’en sert que comme chauffage d’appoint.

Du coup, je sélectionne le temps que je veut, via un select puis j’active le compte a rebours via le bubble-card :

Salut !

Merci et ravi que mon petit projet te plaise ! Là je suis entrain de bidouiller le code pour que tout fonctionne parfaitement. Nous n’avons pas le même modèle de télécommande, j’ai ce modèle là :

C’est également un sèche-serviette hybride, à eau avec soufflerie électrique et donc je n’ai pas autant de fonction que tu peux avoir par rapport à un full électrique, comme par exemple le réglage de la température.

Pour le code j’ai ça actuellement :

esphome:
  name: esp8266-acova-ir
  friendly_name: ESP8266-Acova_IR

esp8266:
  board: d1_mini_pro

logger:

api:
  encryption:
    key: "uyYbHPzgIPbDlKMi+5FWWxcE0NxYYNOKl2hBF41ELgE="

ota:
  platform: esphome
  password: "0a1abb4344477f1f0dd6a6e9c7143608"

wifi:
  ssid: "TP-Link EAP650-Wall-Salon 2.4GHz"
  password: "!Reiko-2020!"
  ap:
    ssid: "Esp8266-Acova-Ir"
    password: "RD8YW3fHcbNL"

captive_portal:

globals:
  - id: last_raw
    type: std::vector<int>
    initial_value: 'std::vector<int>()'

remote_receiver:
  pin:
    number: D4
    inverted: true
  dump: all
  on_raw:
    then:
      - lambda: |-
          ESP_LOGD("IR", "IR code received with size: %d", x.size());
          id(last_raw) = x;

remote_transmitter:
  pin: D5
  carrier_duty_percent: 50%

switch:
  - platform: template
    name: "Acova BOOST ON"
    turn_on_action:
      - remote_transmitter.transmit_pronto:
          data: "0000 006D 000E 0000 000C 004B 0028 0025 004D 004A 0027 0023 0028 0024 004E 0022 0028 0023 004E 0049 004F 0048 0027 004A 0027 004A 004D 0023 0028 0023 0027 0181"

  - platform: template
    name: "Acova BOOST OFF"
    turn_on_action:
      - remote_transmitter.transmit_pronto:
          data: "0000 006D 000E 0000 000D 004A 0027 004B 004C 004C 0025 0024 0027 0025 004B 0026 0027 0024 0027 0024 0026 0024 0027 004A 0026 004B 0026 004B 004C 0025 0026 0181"

  - platform: template
    name: "Acova ON/OFF"
    turn_on_action:
      - remote_transmitter.transmit_pronto:
          data: "0000 006D 000E 0000 000C 004B 0028 004A 004D 0025 0027 0023 0027 0025 0027 0023 0027 0025 0027 0023 0028 0023 0027 004A 004D 0023 0028 0023 0027 0023 0028 0181"

Sauf que lorsque je lance le mode BOOST, ça fonctionne mais je n’arrive pas à l’interrompre donc je creuse encore.

J’ai également déplacer la résistance 0Ohms de 90 degrés sur mon WEMOS pour basculer sur l’antenne externe.

EDIT : Il y a un code BOOST ON et un autre BOOST OFF, donc forcément ça ne pouvais pas fonctionné. J’ai mis à jour avec le bon yaml

Du nouveau !

Alors j’ai enfin réussi à avoir un programme qui fonctionne mais pour ma hotte roblin, si jamais ça intéresse voici le code :

esphome:
  name: esp8266-roblin-ir
  friendly_name: ESP8266-Roblin_IR

esp8266:
  board: d1_mini_pro

logger:

api:
  encryption:
    key: "takeyapi"

ota:
  platform: esphome
  password: "0a1abb4344477f1f0dd6a6e9c7143608"

wifi:
  ssid: "tonwifi"
  password: "tonmotdepasse"
  ap:
    ssid: "Esp8266-Roblin-Ir"
    password: "cvi91SvuVJfn"

captive_portal:

remote_transmitter:
  id: my_remote
  pin: D5
  carrier_duty_percent: 50%

# --- Scripts pour appuis longs ---
script:
  - id: lumiere_min
    then:
      - delay: 3s
      - remote_transmitter.transmit_pronto:
          data: "0000 006D 000B 0000 0021 001A 001E 001A 001E 0019 003C 0034 001E 001A 001F 0019 001F 0019 001F 0019 001E 001B 001E 001A 001D 0181"

  - id: mode_24h_on
    then:
      - delay: 3s
      - remote_transmitter.transmit_pronto:
          data: "0000 006D 0009 0000 003E 0035 001E 0019 003B 0019 001E 0034 001F 001A 001E 001A 003B 0034 001F 001A 001E 0181"

  - id: mode_24h_off
    then:
      - delay: 3s
      - remote_transmitter.transmit_pronto:
          data: "0000 006D 0009 0000 003D 0034 001F 0019 003C 0019 001F 0034 001F 0019 001E 001A 003C 0035 001E 0019 001F 0181"

# --- Tous les boutons ---
button:
  # Lumière
  - platform: template
    name: "Lumière ON (max)"
    on_press:
      - remote_transmitter.transmit_pronto:
          data: "0000 006D 0009 0000 0021 0018 001F 0018 003C 0034 001E 001A 001E 001A 003B 006A 001E 001A 001E 001A 0057 0181"

  - platform: template
    name: "Lumière ON (min) - appui long"
    on_press:
      - script.execute: lumiere_min

  - platform: template
    name: "Lumière OFF"
    on_press:
      - remote_transmitter.transmit_pronto:
          data: "0000 006D 0009 0000 0021 0018 001F 0018 003C 0034 001E 001A 001E 001A 003A 006A 001E 001A 001E 001A 0057 0181"

  # Hotte
  - platform: template
    name: "Hotte ON"
    on_press:
      - remote_transmitter.transmit_pronto:
          data: "0000 006D 0009 0000 0021 0018 001F 0033 003C 001A 001E 001A 001E 0035 003B 004F 001E 0034 001E 001A 003B 0181"

  - platform: template
    name: "Hotte OFF"
    on_press:
      - remote_transmitter.transmit_pronto:
          data: "0000 006D 0009 0000 0021 0019 001F 0034 003C 0019 001F 0019 001F 0034 003B 004E 001F 0033 001F 001A 003B 0181"

  # Aspiration
  - platform: template
    name: "Aspiration +1"
    on_press:
      - remote_transmitter.transmit_pronto:
          data: "0000 006D 0008 0000 0021 0018 0059 0019 001E 001A 001E 001A 0057 001A 001E 004F 0057 0034 003B 0181"

  - platform: template
    name: "Aspiration -1"
    on_press:
      - remote_transmitter.transmit_pronto:
          data: "0000 006D 0008 0000 0021 0033 003C 0018 001F 0019 001E 0035 003B 001A 001E 006A 003B 0034 003B 0181"

  # Boost
  - platform: template
    name: "Boost ON"
    on_press:
      - remote_transmitter.transmit_pronto:
          data: "0000 006D 0008 0000 0021 0018 003C 0033 001F 001A 001E 001A 003B 0035 001E 004F 003B 004F 003B 0181"

  - platform: template
    name: "Boost OFF"
    on_press:
      - remote_transmitter.transmit_pronto:
          data: "0000 006D 0008 0000 0021 0019 003C 0033 001F 001A 001E 001A 003B 0034 001E 004F 003B 004F 003B 0181"

  # Arrêt différé
  - platform: template
    name: "Arrêt différé ON"
    on_press:
      - remote_transmitter.transmit_pronto:
          data: "0000 006D 0006 0000 0020 0034 003B 0034 001E 004F 003C 004F 001D 0034 003B 0181"

  - platform: template
    name: "Arrêt différé OFF"
    on_press:
      - remote_transmitter.transmit_pronto:
          data: "0000 006D 0006 0000 0021 0034 003B 0034 001F 004E 003B 004E 001E 0034 003C 0181"

  # Mode 24H
  - platform: template
    name: "Mode 24H ON - appui long"
    on_press:
      - script.execute: mode_24h_on

  - platform: template
    name: "Mode 24H OFF - appui long"
    on_press:
      - script.execute: mode_24h_off

ça fonctionne niquel, j’ai juste encore un bouton sur la télécommande mais je ne sais pas à quoi il sert.

Pour le sèche servitte Acova, et bien j’ai bricker le wemos à priori… impossible de faire des erase ou autre, il est bien detecté lorsque je le branche au PC mais ensuite quand je lance la commande erase sous l’invite de commande, ça essaye de se connecter et puis plus rien. J’ai tenté avec le bouton flash, plusieurs câbles différents mais rien, je me fais à l’idée qu’il est corrompu à force de flasher, erase, etc.

J’en ai commandé d’autres sur aliexpress mais il va falloir encore une fois attendre.

Du nouveau, j’ai dessiné deux modèles de boitiers pour la version avec l’alimentation embarqué :

boitier alim embarquée

Des plots permettant d’apposer proprement le PCB dans le boitier. Un trou pour l’antenne externe, un autre pour monter un presse-étoupe PG9 pour amener l’alimentation. Une version ou la LED émettrice pointa vers le haut et une seconde version pour que la LED soit positionné latéralement en en la coudant délicatement. “Normalement”, le couvercle doit se clipser dessus avec un léger jeu et j’ai une encoche pour permettre de l’ouvrir avec un petit tournevis plat par exemple :slight_smile:

Un logo gravé dedans baptisant le projet au passage : IRverse :fire:

Au passage, je conseille de passer sur une TSAL6400 qui a son cône d’émission plus large (environ 25° contre 12° pour la TSAL6100) ca évitera beaucoup de problème.

Je vais voir pour faire deux modèles similaires pour la version avec alimentation via le 5VDC.

Une fois fait je verrai pour faire faire des impressions 3D (n’étant malheureusement pas équipé d’une imprimante 3D).

Si ça intéresse du monde, je mettrai le projet sur github pour qu’il soit ouvert à tous.

EDIT: Voici le boitier avec l’alimentation séparée et du coup plus compact. Le trou pour l’arrivée de l’alimentation est déporté et un prévoit un presse-étoupe PG7 pour être étanche suivant l’endroit où il sera placé.

Salut !

Un petit peu de neuf : J’ai réceptionné mon nouveau Wemos D1 et j’ai bidouillé dessus avec cette soufflerie. Donc ça y est tout fonctionne enfin :

Je partage le code si ca intéresse quelqu’un :

esphome:
  name: esp8266-acova-ir
  friendly_name: ESP8266-Acova_IR

esp8266:
  board: d1_mini_pro

logger:

api:
  encryption:
    key: "tacléAPI"

ota:
  platform: esphome
  password: "0a1abb4344477f1f0dd6a6e9c7143608"

wifi:
  ssid: "tonssidwifi"
  password: "tonmotdepasse"
  ap:
    ssid: "Esp8266-Acova-Ir"
    password: "RD8YW3fHcbNL"

captive_portal:

remote_transmitter:
  pin: D5
  carrier_duty_percent: 50%

remote_receiver:
  pin:
    number: D4
    inverted: true
  dump: all

# --- Scripts pour appuis longs (ON/OFF uniquement) ---
script:
  - id: acova_on_long
    then:
      # Phase 1 : Code ON normal (3 fois)
      - repeat:
          count: 3
          then:
            - remote_transmitter.transmit_pronto:
                data: "0000 006D 000E 0000 000C 004B 0028 004A 004D 0049 0028 0023 0029 0023 004D 0024 0027 0024 0029 0023 0029 0022 0029 0048 0029 0048 0027 004A 004D 0023 0029 0181"
            - delay: 250ms
      # Phase 2 : Code "appui maintenu" (4 fois)
      - repeat:
          count: 4
          then:
            - remote_transmitter.transmit_pronto:
                data: "0000 006D 000E 0000 000C 004B 0029 0024 0027 0049 0028 0024 0027 0024 004E 0049 004F 0049 0028 0022 0027 0025 004D 0049 0027 0049 004E 0049 004E 0023 004F 0181"
            - delay: 250ms
      # Phase 3 : Code de relâchement (1 fois)
      - remote_transmitter.transmit_pronto:
          data: "0000 006D 000E 0000 000C 004B 0028 004A 004C 004A 0027 0024 0029 0023 004C 0025 0027 0024 0028 0024 0027 0024 0028 0049 0027 004A 0028 0049 004D 0023 0028 0181"

  - id: acova_off_long
    then:
      # Phase 1 : Code OFF normal (3 fois)
      - repeat:
          count: 3
          then:
            - remote_transmitter.transmit_pronto:
                data: "0000 006D 000E 0000 000C 004B 0029 0049 004D 0024 0027 0024 0028 0024 0027 0023 0027 0025 0027 0023 0027 0025 0027 004A 004D 0023 0029 0023 0027 0023 0028 0181"
            - delay: 250ms
      # Phase 2 : Code "appui maintenu" (4 fois)
      - repeat:
          count: 4
          then:
            - remote_transmitter.transmit_pronto:
                data: "0000 006D 000E 0000 000C 004B 0028 0025 0027 0023 0028 0024 0028 0023 0027 004A 004D 004A 0028 0024 0027 0023 004E 0049 004E 0023 004D 0025 0027 0023 004F 0181"
            - delay: 250ms
      # Phase 3 : Code de relâchement (1 fois)
      - remote_transmitter.transmit_pronto:
          data: "0000 006D 000E 0000 000C 004B 0028 004A 004D 0025 0027 0023 0027 0025 0027 0023 0028 0024 0028 0023 0029 0023 0027 004A 004D 0023 0029 0023 0027 0024 0028 0181"

# --- Tous les switches ---
switch:
  # Boost ON/OFF - Séquence complète automatique
  - platform: template
    name: "Acova BOOST ON"
    turn_on_action:
      - repeat:
          count: 3
          then:
            - remote_transmitter.transmit_pronto:
                data: "0000 006D 000E 0000 000C 004C 0028 0025 004C 004A 0026 0024 0026 0026 004C 0024 0027 0024 004F 0048 004D 004A 0026 004B 0026 004B 004C 0024 0027 0024 0027 0181"
            - delay: 250ms
      - repeat:
          count: 4
          then:
            - remote_transmitter.transmit_pronto:
                data: "0000 006D 000E 0000 000C 004C 0027 0026 0027 0049 0028 0024 0026 0025 004D 004B 004C 004A 0027 0024 0027 0025 004B 004B 0026 004A 004D 004B 004B 0024 004D 0181"
            - delay: 250ms
      - remote_transmitter.transmit_pronto:
          data: "0000 006D 000E 0000 000C 004C 0028 0025 004C 004B 0026 0025 0028 0024 004B 0025 0027 0024 004D 004A 004D 004A 0026 004B 0027 004A 004C 0024 0028 0024 0026 0181"

  - platform: template
    name: "Acova BOOST OFF"
    turn_on_action:
      - repeat:
          count: 3
          then:
            - remote_transmitter.transmit_pronto:
                data: "0000 006D 000E 0000 000C 004C 0027 004B 004C 004A 0026 0025 0027 0024 004C 0026 0027 0024 0027 0024 0026 0024 0027 004A 0026 004B 0026 004B 004C 0024 0027 0181"
            - delay: 250ms
      - repeat:
          count: 4
          then:
            - remote_transmitter.transmit_pronto:
                data: "0000 006D 000E 0000 000A 004D 0027 0026 0026 004A 0027 0025 0026 0025 004D 004B 004B 004B 0026 0024 0028 0024 004C 004A 0026 004A 004D 004C 004A 0025 004D 0181"
            - delay: 250ms
      - remote_transmitter.transmit_pronto:
          data: "0000 006D 000E 0000 000C 004C 0027 004B 004B 004C 0025 0025 0027 0024 004C 0026 0026 0025 0027 0025 0026 0025 0027 004A 0026 004B 0026 004B 004B 0026 0026 0181"

  # Timer Boost +/- (ajout/retrait de 15 minutes) - Séquence complète
  - platform: template
    name: "Acova BOOST + (timer)"
    turn_on_action:
      - repeat:
          count: 3
          then:
            - remote_transmitter.transmit_pronto:
                data: "0000 006D 000E 0000 000C 004C 0027 0026 004C 004A 0027 0024 0026 0026 004B 0024 0028 0049 0027 004A 004F 0023 004C 004B 0026 0025 0027 0024 0026 004B 004C 0181"
            - delay: 250ms
      - repeat:
          count: 4
          then:
            - remote_transmitter.transmit_pronto:
                data: "0000 006D 000E 0000 000C 004B 0028 0025 0026 004A 0027 0025 0026 0025 004D 004A 004D 004C 0025 0025 0026 0026 004B 004B 0026 004A 004D 004B 004B 0026 004C 0181"
            - delay: 250ms
      - remote_transmitter.transmit_pronto:
          data: "0000 006D 000E 0000 000C 004C 0027 0026 004B 004B 0026 0025 0026 0026 004C 0024 0027 004B 0026 004A 004D 0025 004B 004B 0026 0025 0027 0025 0026 004B 004B 0181"

  - platform: template
    name: "Acova BOOST - (timer)"
    turn_on_action:
      - repeat:
          count: 3
          then:
            - remote_transmitter.transmit_pronto:
                data: "0000 006D 000E 0000 000C 004C 0027 0026 004B 004B 0026 0024 0026 0026 004C 0024 0027 0025 004D 004A 004E 0049 0026 004B 0026 004B 004B 0025 0027 0025 0026 0181"
            - delay: 250ms
      - repeat:
          count: 4
          then:
            - remote_transmitter.transmit_pronto:
                data: "0000 006D 000E 0000 000C 004B 0027 0026 0027 0049 0027 0025 0026 0025 004D 004A 004D 004B 0027 0024 0026 0026 004B 004B 0026 004A 004E 004A 004C 0025 004D 0181"
            - delay: 250ms
      - remote_transmitter.transmit_pronto:
          data: "0000 006D 000E 0000 000C 004C 0028 0025 004C 004B 0027 0024 0026 0027 004A 0024 0029 0023 004D 004A 004D 004A 0026 004B 0026 004B 004B 0026 0026 0024 0026 0181"

  # ON/OFF avec appui long (3 secondes)
  - platform: template
    name: "Acova ON - appui long 3s"
    turn_on_action:
      - script.execute: acova_on_long

  - platform: template
    name: "Acova OFF - appui long 3s"
    turn_on_action:
      - script.execute: acova_off_long

Au passage, une belle carte pour les commandes :

Voilà la code pour la carte :

type: vertical-stack
cards:
  # Header Card
  - type: custom:mushroom-title-card
    title: Radiateur Acova
    subtitle: Contrôle infrarouge

  # Boutons ON/OFF et BOOST
  - type: horizontal-stack
    cards:
      - type: custom:mushroom-template-card
        primary: ''
        secondary: ON
        icon: mdi:power
        icon_color: green
        layout: vertical
        tap_action:
          action: call-service
          service: switch.turn_on
          target:
            entity_id: switch.acova_on_appui_long_3s
        card_mod:
          style: |
            ha-card {
              background: rgba(76, 175, 80, 0.1);
              border: 1px solid rgba(76, 175, 80, 0.3);
            }

      - type: custom:mushroom-template-card
        primary: ''
        secondary: OFF
        icon: mdi:power-off
        icon_color: red
        layout: vertical
        tap_action:
          action: call-service
          service: switch.turn_on
          target:
            entity_id: switch.acova_off_appui_long_3s
        card_mod:
          style: |
            ha-card {
              background: rgba(244, 67, 54, 0.1);
              border: 1px solid rgba(244, 67, 54, 0.3);
            }

      - type: custom:mushroom-template-card
        primary: ''
        secondary: Boost ON
        icon: mdi:lightning-bolt
        icon_color: orange
        layout: vertical
        tap_action:
          action: call-service
          service: switch.turn_on
          target:
            entity_id: switch.acova_boost_on
        card_mod:
          style: |
            ha-card {
              background: rgba(255, 152, 0, 0.1);
              border: 1px solid rgba(255, 152, 0, 0.3);
            }

      - type: custom:mushroom-template-card
        primary: ''
        secondary: Boost OFF
        icon: mdi:lightning-bolt-outline
        icon_color: grey
        layout: vertical
        tap_action:
          action: call-service
          service: switch.turn_on
          target:
            entity_id: switch.acova_boost_off
        card_mod:
          style: |
            ha-card {
              background: rgba(158, 158, 158, 0.1);
              border: 1px solid rgba(158, 158, 158, 0.3);
            }

      - type: custom:mushroom-template-card
        primary: ''
        secondary: Timer +
        icon: mdi:plus-circle
        icon_color: blue
        layout: vertical
        tap_action:
          action: call-service
          service: switch.turn_on
          target:
            entity_id: switch.acova_boost_timer
        card_mod:
          style: |
            ha-card {
              background: rgba(33, 150, 243, 0.1);
              border: 1px solid rgba(33, 150, 243, 0.3);
            }

      - type: custom:mushroom-template-card
        primary: ''
        secondary: Timer -
        icon: mdi:minus-circle
        icon_color: purple
        layout: vertical
        tap_action:
          action: call-service
          service: switch.turn_on
          target:
            entity_id: switch.acova_boost_timer_2
        card_mod:
          style: |
            ha-card {
              background: rgba(156, 39, 176, 0.1);
              border: 1px solid rgba(156, 39, 176, 0.3);
            }

Plus qu’à faire une belle carte pour ma hotte et les boitiers 3D et mon projet sera enfin terminé ! :smiley: