Se rendre au contenu

← - Vue d'ensemble Lambda | Sommaire | Suivant : - Exemples Lambda →


Intégration ESPHome — Entités prêtes à l'emploi

Blocs de code prêts à copier dans votre configuration ESPHome.

Tip
**Comment utiliser :** Copiez les blocs nécessaires dans votre fichier YAML. Toutes les entités sont indépendantes — vous pouvez utiliser n'importe quelle combinaison.



Sommaire




Configuration de base

Partie requise pour toutes les entités.


Minimale

yaml
i2c:
  sda: GPIO21
  scl: GPIO22
  scan: true
  frequency: 100kHz
  id: bus_a


yaml
substitutions:
  device_name: "dimmerlink"
  friendly_name: "DimmerLink"
  dimmerlink_addr: "0x50"

i2c:
  sda: GPIO21
  scl: GPIO22
  scan: true
  frequency: 100kHz
  id: bus_a
Tip
Les **substitutions** permettent de modifier facilement les paramètres à un seul endroit. Utilisez `${dimmerlink_addr}` dans les lambda au lieu de `0x50`.



6.1 Light — Lumière à intensité variable

Méthode principale d'intégration avec Home Assistant.


Minimale

yaml
light:
  - platform: monochromatic
    name: "Dimmer"
    output: dimmerlink_output


Standard

yaml
light:
  - platform: monochromatic
    name: "${friendly_name} Light"
    id: dimmer_light
    output: dimmerlink_output
    default_transition_length: 1s
    gamma_correct: 1.0


Étendue

yaml
light:
  - platform: monochromatic
    name: "${friendly_name} Light"
    id: dimmer_light
    output: dimmerlink_output

    # Transitions
    default_transition_length: 1s

    # No gamma correction (DimmerLink has its own curves)
    gamma_correct: 1.0

    # Restore state after reboot
    restore_mode: RESTORE_DEFAULT_OFF

    # Effects (optional)
    effects:
      - pulse:
          name: "Pulse"
          transition_length: 1s
          update_interval: 2s
      - strobe:
          name: "Strobe"
          colors:
            - state: true
              duration: 500ms
            - state: false
              duration: 500ms

Paramètres :

Paramètre Description Par défaut
output ID du composant de sortie Requis
default_transition_length Durée de transition douce 1s
gamma_correct Correction gamma 2.8 (définir à 1.0)
restore_mode Restauration au démarrage RESTORE_DEFAULT_OFF
Important
**gamma_correct: 1.0** — important ! DimmerLink possède ses propres courbes de variation. La correction gamma d'ESPHome interférerait.



6.2 Output — Sortie pour Light

Lien entre Light et I2C.


Minimale

yaml
output:
  - platform: template
    id: dimmerlink_output
    type: float
    write_action:
      - lambda: |-
          uint8_t level = (uint8_t)(state * 100.0f);
          if (level > 100) level = 100;
          uint8_t data[2] = {0x10, level};
          id(bus_a).write(0x50, data, 2, true);


Standard (avec journalisation)

yaml
output:
  - platform: template
    id: dimmerlink_output
    type: float
    write_action:
      - lambda: |-
          // Convert 0.0-1.0 → 0-100%
          uint8_t level = (uint8_t)(state * 100.0f);
          if (level > 100) level = 100;

          // Write to DIM0_LEVEL register
          uint8_t data[2] = {0x10, level};
          auto err = id(bus_a).write(0x50, data, 2, true);

          if (err == i2c::ERROR_OK) {
              ESP_LOGD("dimmerlink", "Level: %d%%", level);
          } else {
              ESP_LOGW("dimmerlink", "Write error: %d", err);
          }


Avec substitutions

yaml
output:
  - platform: template
    id: dimmerlink_output
    type: float
    write_action:
      - lambda: |-
          uint8_t level = (uint8_t)(state * 100.0f);
          if (level > 100) level = 100;
          uint8_t data[2] = {0x10, level};
          id(bus_a).write(${dimmerlink_addr}, data, 2, true);
          ESP_LOGD("dimmerlink", "Level: %d%%", level);


Multi-appareils (plusieurs variateurs)

yaml
substitutions:
  dimmer1_addr: "0x50"
  dimmer2_addr: "0x51"

output:
  - platform: template
    id: dimmer1_output
    type: float
    write_action:
      - lambda: |-
          uint8_t level = (uint8_t)(state * 100.0f);
          if (level > 100) level = 100;
          uint8_t data[2] = {0x10, level};
          id(bus_a).write(${dimmer1_addr}, data, 2, true);

  - platform: template
    id: dimmer2_output
    type: float
    write_action:
      - lambda: |-
          uint8_t level = (uint8_t)(state * 100.0f);
          if (level > 100) level = 100;
          uint8_t data[2] = {0x10, level};
          id(bus_a).write(${dimmer2_addr}, data, 2, true);

light:
  - platform: monochromatic
    name: "Dimmer 1"
    output: dimmer1_output

  - platform: monochromatic
    name: "Dimmer 2"
    output: dimmer2_output



6.3 Sensor — Capteurs

Valeurs numériques pour la surveillance.


Fréquence AC

yaml
sensor:
  - platform: template
    name: "${friendly_name} AC Frequency"
    id: ac_frequency
    icon: "mdi:sine-wave"
    unit_of_measurement: "Hz"
    accuracy_decimals: 0
    device_class: frequency
    state_class: measurement
    update_interval: 60s
    lambda: |-
      uint8_t reg = 0x20;
      uint8_t freq = 0;
      if (id(bus_a).write(0x50, ®, 1, false) == i2c::ERROR_OK) {
        if (id(bus_a).read(0x50, &freq, 1) == i2c::ERROR_OK) {
          if (freq == 50 || freq == 60) {
            return (float)freq;
          }
        }
      }
      return {};


Niveau du variateur — Niveau actuel (relecture)

yaml
sensor:
  - platform: template
    name: "${friendly_name} Level"
    id: dimmer_level
    icon: "mdi:brightness-percent"
    unit_of_measurement: "%"
    accuracy_decimals: 0
    state_class: measurement
    update_interval: 5s
    lambda: |-
      uint8_t reg = 0x10;
      uint8_t level = 0;
      if (id(bus_a).write(0x50, ®, 1, false) == i2c::ERROR_OK) {
        if (id(bus_a).read(0x50, &level, 1) == i2c::ERROR_OK) {
          return (float)level;
        }
      }
      return {};


Période AC — Période de demi-onde

yaml
sensor:
  - platform: template
    name: "${friendly_name} AC Period"
    id: ac_period
    icon: "mdi:timer-outline"
    unit_of_measurement: "μs"
    accuracy_decimals: 0
    entity_category: diagnostic
    update_interval: 60s
    lambda: |-
      uint8_t reg = 0x21;
      uint8_t buffer[2] = {0, 0};
      if (id(bus_a).write(0x50, ®, 1, false) == i2c::ERROR_OK) {
        if (id(bus_a).read(0x50, buffer, 2) == i2c::ERROR_OK) {
          uint16_t period = (buffer[1] << 8) | buffer[0];
          return (float)period;
        }
      }
      return {};


Version du firmware

yaml
sensor:
  - platform: template
    name: "${friendly_name} Firmware"
    id: firmware_version
    icon: "mdi:chip"
    accuracy_decimals: 0
    entity_category: diagnostic
    update_interval: never
    lambda: |-
      uint8_t reg = 0x03;
      uint8_t version = 0;
      if (id(bus_a).write(0x50, ®, 1, false) == i2c::ERROR_OK) {
        if (id(bus_a).read(0x50, &version, 1) == i2c::ERROR_OK) {
          return (float)version;
        }
      }
      return {};


Code d'erreur

yaml
sensor:
  - platform: template
    name: "${friendly_name} Error Code"
    id: error_code
    icon: "mdi:alert-octagon"
    accuracy_decimals: 0
    entity_category: diagnostic
    update_interval: 10s
    lambda: |-
      uint8_t reg = 0x02;
      uint8_t error = 0;
      if (id(bus_a).write(0x50, ®, 1, false) == i2c::ERROR_OK) {
        if (id(bus_a).read(0x50, &error, 1) == i2c::ERROR_OK) {
          return (float)error;
        }
      }
      return {};


Valeur de courbe — Courbe actuelle (numérique)

yaml
sensor:
  - platform: template
    name: "${friendly_name} Curve Value"
    id: curve_value
    icon: "mdi:chart-bell-curve"
    accuracy_decimals: 0
    entity_category: diagnostic
    update_interval: 60s
    lambda: |-
      uint8_t reg = 0x11;
      uint8_t curve = 0;
      if (id(bus_a).write(0x50, ®, 1, false) == i2c::ERROR_OK) {
        if (id(bus_a).read(0x50, &curve, 1) == i2c::ERROR_OK) {
          return (float)curve;
        }
      }
      return {};


Tous les capteurs (copier le bloc entier)

yaml
sensor:
  # AC frequency
  - platform: template
    name: "${friendly_name} AC Frequency"
    id: ac_frequency
    icon: "mdi:sine-wave"
    unit_of_measurement: "Hz"
    accuracy_decimals: 0
    device_class: frequency
    state_class: measurement
    update_interval: 60s
    lambda: |-
      uint8_t reg = 0x20;
      uint8_t freq = 0;
      if (id(bus_a).write(0x50, ®, 1, false) == i2c::ERROR_OK) {
        if (id(bus_a).read(0x50, &freq, 1) == i2c::ERROR_OK) {
          if (freq == 50 || freq == 60) return (float)freq;
        }
      }
      return {};

  # Current level
  - platform: template
    name: "${friendly_name} Level"
    id: dimmer_level
    icon: "mdi:brightness-percent"
    unit_of_measurement: "%"
    accuracy_decimals: 0
    state_class: measurement
    update_interval: 5s
    lambda: |-
      uint8_t reg = 0x10;
      uint8_t level = 0;
      if (id(bus_a).write(0x50, ®, 1, false) == i2c::ERROR_OK) {
        if (id(bus_a).read(0x50, &level, 1) == i2c::ERROR_OK) {
          return (float)level;
        }
      }
      return {};

  # Firmware version
  - platform: template
    name: "${friendly_name} Firmware"
    id: firmware_version
    icon: "mdi:chip"
    accuracy_decimals: 0
    entity_category: diagnostic
    update_interval: never
    lambda: |-
      uint8_t reg = 0x03;
      uint8_t version = 0;
      if (id(bus_a).write(0x50, ®, 1, false) == i2c::ERROR_OK) {
        if (id(bus_a).read(0x50, &version, 1) == i2c::ERROR_OK) {
          return (float)version;
        }
      }
      return {};

  # WiFi signal (for diagnostics)
  - platform: wifi_signal
    name: "${friendly_name} WiFi Signal"
    update_interval: 60s



6.4 Binary Sensor — Capteurs binaires

États marche/arrêt.


Ready — Appareil prêt

yaml
binary_sensor:
  - platform: template
    name: "${friendly_name} Ready"
    id: dimmerlink_ready
    icon: "mdi:check-circle"
    device_class: running
    entity_category: diagnostic
    lambda: |-
      uint8_t reg = 0x00;
      uint8_t status = 0;
      if (id(bus_a).write(0x50, ®, 1, false) == i2c::ERROR_OK) {
        if (id(bus_a).read(0x50, &status, 1) == i2c::ERROR_OK) {
          return (status & 0x01) != 0;
        }
      }
      return {};


Indicateur d'erreur

yaml
binary_sensor:
  - platform: template
    name: "${friendly_name} Error"
    id: dimmerlink_error
    icon: "mdi:alert-circle"
    device_class: problem
    entity_category: diagnostic
    lambda: |-
      uint8_t reg = 0x00;
      uint8_t status = 0;
      if (id(bus_a).write(0x50, ®, 1, false) == i2c::ERROR_OK) {
        if (id(bus_a).read(0x50, &status, 1) == i2c::ERROR_OK) {
          return (status & 0x02) != 0;
        }
      }
      return {};


Calibrated — Calibrage terminé

yaml
binary_sensor:
  - platform: template
    name: "${friendly_name} Calibrated"
    id: dimmerlink_calibrated
    icon: "mdi:tune"
    entity_category: diagnostic
    lambda: |-
      uint8_t reg = 0x23;
      uint8_t status = 0;
      if (id(bus_a).write(0x50, ®, 1, false) == i2c::ERROR_OK) {
        if (id(bus_a).read(0x50, &status, 1) == i2c::ERROR_OK) {
          return status == 1;
        }
      }
      return {};


Tous les capteurs binaires

yaml
binary_sensor:
  # Device ready
  - platform: template
    name: "${friendly_name} Ready"
    id: dimmerlink_ready
    icon: "mdi:check-circle"
    device_class: running
    entity_category: diagnostic
    lambda: |-
      uint8_t reg = 0x00;
      uint8_t status = 0;
      if (id(bus_a).write(0x50, ®, 1, false) == i2c::ERROR_OK) {
        if (id(bus_a).read(0x50, &status, 1) == i2c::ERROR_OK) {
          return (status & 0x01) != 0;
        }
      }
      return {};

  # Error flag
  - platform: template
    name: "${friendly_name} Error"
    id: dimmerlink_error
    icon: "mdi:alert-circle"
    device_class: problem
    entity_category: diagnostic
    lambda: |-
      uint8_t reg = 0x00;
      uint8_t status = 0;
      if (id(bus_a).write(0x50, ®, 1, false) == i2c::ERROR_OK) {
        if (id(bus_a).read(0x50, &status, 1) == i2c::ERROR_OK) {
          return (status & 0x02) != 0;
        }
      }
      return {};

  # Calibration complete
  - platform: template
    name: "${friendly_name} Calibrated"
    id: dimmerlink_calibrated
    icon: "mdi:tune"
    entity_category: diagnostic
    lambda: |-
      uint8_t reg = 0x23;
      uint8_t status = 0;
      if (id(bus_a).write(0x50, ®, 1, false) == i2c::ERROR_OK) {
        if (id(bus_a).read(0x50, &status, 1) == i2c::ERROR_OK) {
          return status == 1;
        }
      }
      return {};



6.5 Text Sensor — Capteurs texte

Valeurs textuelles pour l'affichage.


Last Error — Description de l'erreur

yaml
text_sensor:
  - platform: template
    name: "${friendly_name} Last Error"
    id: last_error_text
    icon: "mdi:alert"
    entity_category: diagnostic
    update_interval: 10s
    lambda: |-
      uint8_t reg = 0x02;
      uint8_t error = 0;

      if (id(bus_a).write(0x50, ®, 1, false) != i2c::ERROR_OK) {
        return {"I2C Error"};
      }
      if (id(bus_a).read(0x50, &error, 1) != i2c::ERROR_OK) {
        return {"Read Error"};
      }

      switch (error) {
        case 0x00: return {"OK"};
        case 0xF9: return {"ERR_SYNTAX"};
        case 0xFC: return {"ERR_NOT_READY"};
        case 0xFD: return {"ERR_INDEX"};
        case 0xFE: return {"ERR_PARAM"};
        default:   return {"UNKNOWN"};
      }
**Codes d'erreur :**
- `0x00` OK — Succès - `0xF9` ERR_SYNTAX — Adresse de registre invalide - `0xFC` ERR_NOT_READY — Appareil non prêt (non calibré ou erreur FLASH) - `0xFD` ERR_INDEX — Index de variateur invalide - `0xFE` ERR_PARAM — Paramètre invalide (level>100, curve>2)


Courbe actuelle (texte)

yaml
text_sensor:
  - platform: template
    name: "${friendly_name} Current Curve"
    id: current_curve_text
    icon: "mdi:chart-bell-curve"
    entity_category: diagnostic
    update_interval: 60s
    lambda: |-
      uint8_t reg = 0x11;
      uint8_t curve = 0;

      if (id(bus_a).write(0x50, ®, 1, false) != i2c::ERROR_OK) {
        return {"I2C Error"};
      }
      if (id(bus_a).read(0x50, &curve, 1) != i2c::ERROR_OK) {
        return {"Read Error"};
      }

      switch (curve) {
        case 0: return {"LINEAR"};
        case 1: return {"RMS"};
        case 2: return {"LOG"};
        default: return {"UNKNOWN"};
      }


Informations sur l'appareil

yaml
text_sensor:
  - platform: template
    name: "${friendly_name} Info"
    id: device_info
    icon: "mdi:information"
    entity_category: diagnostic
    update_interval: never
    lambda: |-
      uint8_t reg_ver = 0x03;
      uint8_t reg_freq = 0x20;
      uint8_t version = 0;
      uint8_t freq = 0;

      id(bus_a).write(0x50, ®_ver, 1, false);
      id(bus_a).read(0x50, &version, 1);

      id(bus_a).write(0x50, ®_freq, 1, false);
      id(bus_a).read(0x50, &freq, 1);

      char buf[32];
      snprintf(buf, sizeof(buf), "FW:%d, %dHz", version, freq);
      return {buf};


Tous les capteurs texte

yaml
text_sensor:
  # Error description
  - platform: template
    name: "${friendly_name} Last Error"
    id: last_error_text
    icon: "mdi:alert"
    entity_category: diagnostic
    update_interval: 10s
    lambda: |-
      uint8_t reg = 0x02;
      uint8_t error = 0;
      if (id(bus_a).write(0x50, ®, 1, false) != i2c::ERROR_OK) return {"I2C Error"};
      if (id(bus_a).read(0x50, &error, 1) != i2c::ERROR_OK) return {"Read Error"};
      switch (error) {
        case 0x00: return {"OK"};
        case 0xF9: return {"ERR_SYNTAX"};
        case 0xFC: return {"ERR_NOT_READY"};
        case 0xFD: return {"ERR_INDEX"};
        case 0xFE: return {"ERR_PARAM"};
        default:   return {"UNKNOWN"};
      }

  # Current curve
  - platform: template
    name: "${friendly_name} Curve"
    id: current_curve_text
    icon: "mdi:chart-bell-curve"
    entity_category: diagnostic
    update_interval: 60s
    lambda: |-
      uint8_t reg = 0x11;
      uint8_t curve = 0;
      if (id(bus_a).write(0x50, ®, 1, false) != i2c::ERROR_OK) return {"I2C Error"};
      if (id(bus_a).read(0x50, &curve, 1) != i2c::ERROR_OK) return {"Read Error"};
      switch (curve) {
        case 0: return {"LINEAR"};
        case 1: return {"RMS"};
        case 2: return {"LOG"};
        default: return {"UNKNOWN"};
      }

  # ESPHome version
  - platform: version
    name: "${friendly_name} ESPHome Version"



6.6 Select — Sélection de courbe

Liste déroulante pour la sélection de la courbe de variation.


Standard

yaml
select:
  - platform: template
    name: "${friendly_name} Curve"
    id: dimming_curve
    icon: "mdi:chart-bell-curve"
    options:
      - "LINEAR"
      - "RMS"
      - "LOG"
    initial_option: "LINEAR"
    optimistic: true
    set_action:
      - lambda: |-
          uint8_t curve = 0;
          if (x == "RMS") curve = 1;
          else if (x == "LOG") curve = 2;

          uint8_t data[2] = {0x11, curve};
          id(bus_a).write(0x50, data, 2, true);
          ESP_LOGI("dimmerlink", "Curve: %s", x.c_str());


Avec lecture de la valeur actuelle au démarrage

yaml
select:
  - platform: template
    name: "${friendly_name} Curve"
    id: dimming_curve
    icon: "mdi:chart-bell-curve"
    options:
      - "LINEAR"
      - "RMS"
      - "LOG"
    initial_option: "LINEAR"
    optimistic: true
    restore_value: true
    set_action:
      - lambda: |-
          uint8_t curve = 0;
          if (x == "RMS") curve = 1;
          else if (x == "LOG") curve = 2;

          uint8_t data[2] = {0x11, curve};
          id(bus_a).write(0x50, data, 2, true);
          ESP_LOGI("dimmerlink", "Curve: %s", x.c_str());

# Sync on boot
esphome:
  on_boot:
    priority: -100
    then:
      - delay: 2s
      - lambda: |-
          uint8_t reg = 0x11;
          uint8_t curve = 0;
          if (id(bus_a).write(0x50, ®, 1, false) == i2c::ERROR_OK) {
            if (id(bus_a).read(0x50, &curve, 1) == i2c::ERROR_OK) {
              auto call = id(dimming_curve).make_call();
              switch (curve) {
                case 0: call.set_option("LINEAR"); break;
                case 1: call.set_option("RMS"); break;
                case 2: call.set_option("LOG"); break;
              }
              call.perform();
            }
          }



6.7 Number — Contrôle numérique

Contrôle direct du niveau sans entité Light.


Level — Niveau de luminosité

yaml
number:
  - platform: template
    name: "${friendly_name} Level"
    id: dimmer_level_number
    icon: "mdi:brightness-percent"
    unit_of_measurement: "%"
    min_value: 0
    max_value: 100
    step: 1
    mode: slider
    optimistic: true
    set_action:
      - lambda: |-
          uint8_t level = (uint8_t)x;
          uint8_t data[2] = {0x10, level};
          id(bus_a).write(0x50, data, 2, true);
          ESP_LOGI("dimmerlink", "Level: %d%%", level);


I2C Address — Changement d'adresse

yaml
number:
  - platform: template
    name: "${friendly_name} I2C Address"
    id: i2c_address_number
    icon: "mdi:identifier"
    entity_category: config
    min_value: 8      # 0x08
    max_value: 119    # 0x77
    step: 1
    mode: box
    optimistic: true
    set_action:
      - lambda: |-
          uint8_t new_addr = (uint8_t)x;

          if (new_addr < 0x08 || new_addr > 0x77) {
            ESP_LOGE("dimmerlink", "Invalid address: 0x%02X", new_addr);
            return;
          }

          uint8_t data[2] = {0x30, new_addr};
          id(bus_a).write(0x50, data, 2, true);

          ESP_LOGW("dimmerlink", "Address changed to 0x%02X!", new_addr);
          ESP_LOGW("dimmerlink", "Update config and reboot!");
Warning
**Adresse I2C :** Après avoir modifié l'adresse, vous devez mettre à jour `${dimmerlink_addr}` dans la configuration et reflasher l'ESP32.



6.8 Button — Boutons de commande

Actions lors de l'appui.


Reset — Réinitialisation logicielle

yaml
button:
  - platform: template
    name: "${friendly_name} Reset"
    id: dimmer_reset
    icon: "mdi:restart"
    entity_category: config
    on_press:
      - lambda: |-
          uint8_t data[2] = {0x01, 0x01};
          id(bus_a).write(0x50, data, 2, true);
          ESP_LOGW("dimmerlink", "Reset command sent");
      - delay: 3s
      - logger.log:
          level: INFO
          format: "DimmerLink should be online"


Recalibrage

yaml
button:
  - platform: template
    name: "${friendly_name} Recalibrate"
    id: dimmer_recalibrate
    icon: "mdi:refresh"
    entity_category: config
    on_press:
      - lambda: |-
          uint8_t data[2] = {0x01, 0x02};
          id(bus_a).write(0x50, data, 2, true);
          ESP_LOGI("dimmerlink", "Recalibration started");
      - delay: 500ms
      - component.update: ac_frequency


Redémarrage ESP32

yaml
button:
  - platform: restart
    name: "${friendly_name} ESP Restart"
    icon: "mdi:restart-alert"
    entity_category: config


yaml
button:
  - platform: template
    name: "${friendly_name} Identify"
    id: dimmer_identify
    icon: "mdi:lightbulb-alert"
    on_press:
      - repeat:
          count: 3
          then:
            - lambda: |-
                uint8_t on[2] = {0x10, 100};
                id(bus_a).write(0x50, on, 2, true);
            - delay: 300ms
            - lambda: |-
                uint8_t off[2] = {0x10, 0};
                id(bus_a).write(0x50, off, 2, true);
            - delay: 300ms


Tous les boutons

yaml
button:
  # Reset DimmerLink
  - platform: template
    name: "${friendly_name} Reset"
    id: dimmer_reset
    icon: "mdi:restart"
    entity_category: config
    on_press:
      - lambda: |-
          uint8_t data[2] = {0x01, 0x01};
          id(bus_a).write(0x50, data, 2, true);
      - delay: 3s

  # Recalibrate
  - platform: template
    name: "${friendly_name} Recalibrate"
    id: dimmer_recalibrate
    icon: "mdi:refresh"
    entity_category: config
    on_press:
      - lambda: |-
          uint8_t data[2] = {0x01, 0x02};
          id(bus_a).write(0x50, data, 2, true);
      - delay: 500ms

  # ESP32 restart
  - platform: restart
    name: "${friendly_name} ESP Restart"
    entity_category: config

  # Identify (blink)
  - platform: template
    name: "${friendly_name} Identify"
    id: dimmer_identify
    icon: "mdi:lightbulb-alert"
    on_press:
      - repeat:
          count: 3
          then:
            - lambda: |-
                uint8_t on[2] = {0x10, 100};
                id(bus_a).write(0x50, on, 2, true);
            - delay: 300ms
            - lambda: |-
                uint8_t off[2] = {0x10, 0};
                id(bus_a).write(0x50, off, 2, true);
            - delay: 300ms



6.9 Globals — Variables globales

Pour stocker l'état entre les appels lambda.

yaml
globals:
  # Current level (cache)
  - id: cached_level
    type: uint8_t
    initial_value: '0'
    restore_value: true

  # Current curve
  - id: cached_curve
    type: uint8_t
    initial_value: '0'
    restore_value: true

  # Initialization flag
  - id: initialized
    type: bool
    initial_value: 'false'

Utilisation :

yaml
output:
  - platform: template
    id: dimmerlink_output
    type: float
    write_action:
      - lambda: |-
          uint8_t level = (uint8_t)(state * 100.0f);
          if (level > 100) level = 100;

          // Only send if value changed
          if (level != id(cached_level)) {
            uint8_t data[2] = {0x10, level};
            id(bus_a).write(0x50, data, 2, true);
            id(cached_level) = level;
          }



6.10 Initialisation au démarrage

Lecture de l'état DimmerLink au démarrage de l'ESP32.


Basique

yaml
esphome:
  on_boot:
    priority: -100
    then:
      - delay: 2s  # Wait for DimmerLink calibration
      - lambda: |-
          ESP_LOGI("dimmerlink", "Reading initial state...");

          // Check ready status
          uint8_t reg_status = 0x00;
          uint8_t status = 0;
          id(bus_a).write(0x50, ®_status, 1, false);
          id(bus_a).read(0x50, &status, 1);

          if (status & 0x01) {
            ESP_LOGI("dimmerlink", "Device ready");
          } else {
            ESP_LOGW("dimmerlink", "Device not ready!");
          }


Complète (avec synchronisation de toutes les entités)

yaml
esphome:
  on_boot:
    priority: -100
    then:
      - delay: 2s
      - lambda: |-
          ESP_LOGI("dimmerlink", "=== Initializing DimmerLink ===");

          // 1. Check ready status
          uint8_t reg = 0x00;
          uint8_t status = 0;
          id(bus_a).write(0x50, ®, 1, false);
          id(bus_a).read(0x50, &status, 1);

          if (!(status & 0x01)) {
            ESP_LOGW("dimmerlink", "Device not ready, waiting...");
            return;
          }

          // 2. Read version
          reg = 0x03;
          uint8_t version = 0;
          id(bus_a).write(0x50, ®, 1, false);
          id(bus_a).read(0x50, &version, 1);
          ESP_LOGI("dimmerlink", "Firmware: %d", version);

          // 3. Read frequency
          reg = 0x20;
          uint8_t freq = 0;
          id(bus_a).write(0x50, ®, 1, false);
          id(bus_a).read(0x50, &freq, 1);
          ESP_LOGI("dimmerlink", "AC Frequency: %d Hz", freq);

          // 4. Read current curve and sync Select
          reg = 0x11;
          uint8_t curve = 0;
          id(bus_a).write(0x50, ®, 1, false);
          id(bus_a).read(0x50, &curve, 1);

          auto call = id(dimming_curve).make_call();
          switch (curve) {
            case 0: call.set_option("LINEAR"); break;
            case 1: call.set_option("RMS"); break;
            case 2: call.set_option("LOG"); break;
          }
          call.perform();
          ESP_LOGI("dimmerlink", "Curve: %d", curve);

          // 5. Read current level
          reg = 0x10;
          uint8_t level = 0;
          id(bus_a).write(0x50, ®, 1, false);
          id(bus_a).read(0x50, &level, 1);
          ESP_LOGI("dimmerlink", "Level: %d%%", level);

          ESP_LOGI("dimmerlink", "=== Initialization complete ===");

      # Update all sensors
      - component.update: ac_frequency
      - component.update: firmware_version



Tableau entity_category

Catégorie Affichage dans HA Quand utiliser
(vide) Interface principale Light, capteurs principaux
diagnostic Diagnostic Version, statut, erreurs
config Configuration Boutons, paramètres



Démarrage rapide

Configuration minimale fonctionnelle — copiez et ça fonctionne :

yaml
substitutions:
  device_name: "dimmerlink"
  friendly_name: "DimmerLink"

esphome:
  name: ${device_name}

esp32:
  board: esp32dev

logger:
api:
ota:

wifi:
  ssid: "YOUR_WIFI"
  password: "YOUR_PASSWORD"

i2c:
  sda: GPIO21
  scl: GPIO22
  scan: true
  id: bus_a

output:
  - platform: template
    id: dimmerlink_output
    type: float
    write_action:
      - lambda: |-
          uint8_t level = (uint8_t)(state * 100.0f);
          if (level > 100) level = 100;
          uint8_t data[2] = {0x10, level};
          id(bus_a).write(0x50, data, 2, true);

light:
  - platform: monochromatic
    name: "${friendly_name}"
    output: dimmerlink_output
    default_transition_length: 1s
    gamma_correct: 1.0



Historique des versions

Version Date Modifications
1.0 2026-02 Version initiale

← - Vue d'ensemble Lambda | Sommaire | Suivant : - Exemples Lambda →