MCP3424 in Home Assistant mit ESPHome einbinden

Der MCP3424 ist ein präziser 18-Bit-ADC mit vier analogen Eingängen und ideal, um Spannungen oder 4–20-mA-Sensoren in Home Assistant einzubinden.
In diesem Beitrag zeige ich dir Schritt für Schritt, wie du den MCP3424 mit ESPHome konfigurierst, an einen ESP8266 anschließt und die Messwerte sauber im Home Assistant Dashboard darstellst.
Als Beispiel verwende ich unsere analoge Eingangskarte I2AE18 für die Hutschiene.

Unsere Analoge Eingangskarte I2AE18 für Hutschienenmontage kann als Bausatz im Onlineshop bezogen werden. Bausatz I2C Analog Input 4 Kanal 18 Bit mit MCP3424

Als I2C-Master wird dieses mal der I2C-Master für NodeMCU ESP8266-12F verwendet.

Am Ende des Beitrags steht eine vollständige YAML-Datei zum Download sowie ein Beispiel, wie die Auflösung des MCP3424 eingestellt und die Messwerte in Home Assistant dargestellt werden.

Schaltplan Analoge Eingangskarte I2AE18 mit MCP3424

Einens Schaltplan zum Modul findest du hier: 

Datenblatt       Schaltplan

Hardware I2C-Master für NodeMCU ESP8266-12F

ESP8266 Modul für die Hutschiene
ESP8266 Modul für die Hutschiene

Der Bausatz Bausatz ESP8266 I2C-Master für NodeMCU ESP8266-12F hat den Pegelwandler PCA9517 on Board, der die I2C-Signale von der ESP8266 Node-MCU von 3,3 auf 5V anhebt. An drei Status-LEDs kann man die Pegel der I2C-SIgnale SDA, SCL und INT beobachten.

Über unsere Busverbindern lassen sich die neueren E/A-Module im Handumdrehen mit dem Master verbinden.
Die „älteren“ SPS-Baugruppen können wie gewohnt über den Stecker verkabelt werden.

Aufbau der Peripherie

Hardware-Aufbau I2NO2-Testboard mit MCP3424

ESPHome in Home Assistant

Voraussetzung für die Funktion ist, dass ESPHome in Home Assistant installiert und gestartet ist.
Eine Anleitung gibt es hier: Getting Started with ESPHome and Home Assistant

Zusätzlich habe ich den File editor installiert. Mit ihm kann man Konfigurations-Dateien wie z.B. die Datei secrets.yaml anlegen und editieren.

Neuen ESP8266 in ESPHome anlegen

Um einen neuen ESP8266 in ESPHome für Home Assistant einzurichten, gehst du folgendermaßen vor:

  • ESPHome Dashboard öffnen:
    In Home Assistant öffnest du das ESPHome‑Add‑on (oben in der Seitenleiste). Dort siehst du eine Übersicht deiner ESP‑Boards.
  • Neues Gerät erstellen:
    Klicke auf „+ New Device“ oder „Gerät hinzufügen“.
    Du wirst durch einen kleinen Assistenten geführt:
    – Gib einen Gerätenamen ein (z. B. i2no2-testboard).
    – Wähle den Board‑Typ aus – für den I2NO2-Bausatz ist das der esp8266
    – Trage dein WLAN SSID und Passwort ein oder verwende die Datei secrets.yaml für alle Passwörter
  • Erste Konfiguration speichern:
    Nach Abschluss erstellt ESPHome für dich eine Basis‑YAML‑Datei – du kannst sie im Editor öffnen und nach deinen Bedürfnissen erweitern.
  • Firmware installieren:
    Verbinde den ESP per USB am Besten mit dem Gerät, auf dem Home Assistant läuft. Das funktioniert am einfachsten.
    Klicke im Dashboard auf „Install“ → „Plug into the computer running ESPHome Device Builder“ und folge den Anweisungen.
    ESPHome kompiliert die Firmware und spielt sie auf die ESP8266 Node-MCU.
  • Verbinden mit Home Assistant:
    Sobald der ESP gestartet ist und sich mit deinem WLAN verbunden hat, sollte Home Assistant das Gerät automatisch erkennen.
    Alternativ kannst du es manuell über Einstellungen → Geräte & Dienste → Integration hinzufügen → ESPHome eintragen.

Nach dem ersten Flashen kannst du weitere Änderungen drahtlos Over‑The‑Air (OTA) aktualisieren – das erspart erneutes USB‑Anschließen.

YAML-Datei anpassen

In der automatisch von ESPHome angelegten Konfigurationsdatei müssen jetzt einige Eintragungen vorgenommen werden.

esphome:
  name: i2no2-testboard
  friendly_name: I2NO2-Testboard

esp8266:
  board: nodemcuv2

# Enable logging
logger:
  level: DEBUG
  logs:
    sensor: ERROR # Unterdrückt die "Sending state"-Meldungen im Log-Fenster

# Sensible Daten sind in der Datei "secrets.yaml" abgelegt
# ========================================================
# Enable Home Assistant API
api:
  encryption:
    key: !secret i2no2_api_key

ota:
  - platform: esphome
    password: !secret i2no2_ota_password

wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password

captive_portal:
    
# ========= I2C-Pins festlegen ========= # 
i2c:
  id: i2c_bus
  sda: 4
  scl: 5
  scan: true
  frequency: 70000

# ========= Auflösung und Adresse vom MCP3424 festlegen ========= # 
substitutions:
  mcp_address:     "0x68"   # I2C-Adresse des MCP3424 (0x68 – 0x6F möglich)
  voltage_divider: "5.0"    # Spannungsteiler auf dem Board (1:5 → Faktor 5)


# ========= Globale Variablen anlegen ========= # 
globals:
  - id: mcp_channel         # Aktuell gemessener Kanal (0 = CH1 … 3 = CH4)
    type: int
    initial_value: '0'

  - id: mcp_values          # Letzte Messwerte in Volt je Kanal
    type: float[4]

  - id: mcp_busy            # true = Messung läuft, noch kein Ergebnis
    type: bool
    initial_value: 'false'

  - id: mcp_resolution_idx  # Auflösung: 0=12Bit  1=14Bit  2=16Bit  3=18Bit
    type: int
    initial_value: '3'      # Standard: 18 Bit (höchste Auflösung)

  - id: mcp_gain_idx        # PGA-Verstärkung: 0=1x  1=2x  2=4x  3=8x
    type: int
    initial_value: '0'      # Standard: 1x (kein Gain, voller Eingangsbereich)


# ─────────────────────────────────────────────────────────────
#  Auswahl-Entitäten – in Home Assistant sichtbar und änderbar
# ─────────────────────────────────────────────────────────────
select:
  # Auflösung / Sample-Rate des MCP3424
  # Je höher die Auflösung, desto langsamer die Messung
  - platform: template
    name: "MCP3424 Auflösung"
    id: sel_resolution
    options:
      - "12 Bit  (240 SPS)"    # schnellste Messung, geringste Auflösung
      - "14 Bit  ( 60 SPS)"
      - "16 Bit  ( 15 SPS)"
      - "18 Bit  (3.75 SPS)"   # langsamste Messung, höchste Auflösung
    initial_option: "18 Bit  (3.75 SPS)"
    restore_value: true
    optimistic: true
    on_value:
      then:
        - globals.set:
            id: mcp_resolution_idx
            value: !lambda 'return (int)id(sel_resolution).active_index().value_or(3);'


# ========= Hauptprogramm MCP3424-Messwerte lesen ========= # 

  # ── MCP3424 Messmotor ──────────────────────────────────────
  #  Dieser interne Sensor liest die vier Kanäle des MCP3424
  #  nacheinander im One-Shot-Verfahren aus und speichert die
  #  umgerechneten Spannungswerte in mcp_values[0..3].
  #  Er ist in Home Assistant nicht sichtbar (internal: true).
  # ──────────────────────────────────────────────────────────

sensor:
  - platform: template
    name: "MCP3424 Engine"
    internal: true
    update_interval: 100ms
    lambda: |-
      const uint8_t ADDR = ${mcp_address};
      const float DIVIDER = ${voltage_divider};

      int ch = id(mcp_channel);
      int res_idx = id(mcp_resolution_idx);
      int gain_idx = id(mcp_gain_idx);

      int data_bytes = (res_idx == 3) ? 3 : 2;

      uint8_t config = 0x80
        | (ch << 5)
        | (res_idx << 2)
        | gain_idx;

      if (!id(mcp_busy)) {
        id(i2c_bus).write(ADDR, &config, 1);
        id(mcp_busy) = true;
        return id(mcp_values)[ch];
      }

      uint8_t data[4] = {0};
      id(i2c_bus).read(ADDR, data, data_bytes + 1);

      if (data[data_bytes] & 0x80) {
        return id(mcp_values)[ch];
      }

      int32_t raw = 0;

      switch (res_idx) {
        case 0: {  // 12 Bit
          raw = ((uint16_t)data[0] << 8) | data[1];
          raw &= 0x0FFF;
          if (raw & 0x0800) raw -= 0x1000;  // Vorzeichen erweitern
          break;
        }

        case 1: {  // 14 Bit
          raw = ((uint16_t)data[0] << 8) | data[1];
          raw &= 0x3FFF;
          if (raw & 0x2000) raw -= 0x4000;  // Vorzeichen erweitern
          break;
        }

        case 2: {  // 16 Bit
          raw = ((int16_t)data[0] << 8) | data[1];
          if (raw & 0x8000) raw -= 0x10000;
          break;
        }

        case 3: {  // 18 Bit
          raw = ((int32_t)(data[0] & 0x03) << 16) | ((int32_t)data[1] << 8) | data[2];
          if (raw & 0x20000) raw -= 0x40000;
          break;
        }
      }

      static const int res_bits[] = {12, 14, 16, 18};
      int gain_val = 1 << gain_idx;
      float lsb = 2.048f / (float)(1 << (res_bits[res_idx] - 1)) / gain_val;
      float voltage = (float)raw * lsb * DIVIDER;

      id(mcp_values)[ch] = voltage;
      id(mcp_channel) = (ch + 1) % 4;
      id(mcp_busy) = false;

      switch (ch) {
        case 0: id(sensor_ch1).publish_state(voltage); break;
        case 1: id(sensor_ch2).publish_state(voltage); break;
        case 2: id(sensor_ch3).publish_state(voltage); break;
        case 3: id(sensor_ch4).publish_state(voltage); break;
      }
      return NAN;


# ========= Hier werden die Anzeigen der Messwerte vom MCP3424 konfiguriert ========= # 
  - platform: template
    name: "MCP3424 Kanal 1"
    id: sensor_ch1
    unit_of_measurement: "V"
    accuracy_decimals: 2
    filters: 
      - delta: 0.1
    on_value:
      then:
        - logger.log:
            format: "MCP3424 Kanal 1: %.2f V"
            args: ['x']

  - platform: template
    name: "MCP3424 Kanal 2"
    id: sensor_ch2
    unit_of_measurement: "V"
    accuracy_decimals: 2
    filters: 
      - delta: 0.1
    on_value:
      then:
        - logger.log:
            format: "MCP3424 Kanal 2: %.2f V"
            args: ['x']

  - platform: template
    name: "MCP3424 Kanal 3"
    id: sensor_ch3
    unit_of_measurement: "V"
    accuracy_decimals: 2
    filters: 
      - delta: 0.1
    on_value:
      then:
        - logger.log:
            format: "MCP3424 Kanal 3: %.2f V"
            args: ['x']

  - platform: template
    name: "MCP3424 Kanal 4"
    id: sensor_ch4
    unit_of_measurement: "V"
    accuracy_decimals: 2
    filters: 
      - delta: 0.1
    on_value:
      then:
        - logger.log:
            format: "MCP3424 Kanal 4: %.2f V"
            args: ['x']

Ansicht im Home Assistant Dashboard

I2NO2+I2AE18-HomeAssistant Dashboard

Komplette YAML-Datei zum Download

Hier kann die komplette YAML-Datei für das I2NO2_I2AE18-Testboard heruntergeladen werden.
YAML_I2NO2-I2AE18-Testboard.zip (4 Downloads )

Ich würde die nicht in ESPHome direkt importieren sondern besser in einem Editor wie Notepad++ öffnen und in die vorbereitete Konfigurationsdatei rein kopieren ..um die bestehende substitutions und wifi Struktur deiner eigenen Installation nicht zu überschreiben.

Achtung:
Wie bereits oben besprochen, sind in der YAML-Datei meine sicherheitsrelevanten Daten nicht mit enthalten. Ich habe die in meinem ESPHome in einer separaten Datei secrets.yaml abgespeichert.

# Sensible Daten sind in der Datei "secrets.yaml" abgelegt
# ========================================================
# Enable Home Assistant API
api:
  encryption:
    key: !secret i2no2_api_key

ota:
  - platform: esphome
    password: !secret i2no2_ota_password

wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password

Die secrets.yaml muss im gleichen Ordner liegen wie die Konfigurationsdatei vom ESP!

/config/
└── esphome/
    ├── I2NO2-Testboard.yaml  <-- Deine Hauptdatei
    └── secrets.yaml          <-- Hier müssen die Zugangsdaten reinCode-Sprache: PHP (php)

Fazit

Mit ESPHome lassen sich auch eigene oder spezielle I2C-Module sehr flexibel in Home Assistant integrieren – selbst dann, wenn es dafür keine fertigen Komponenten gibt.
Durch den Einsatz von template-Sensoren, und etwas lambda-Code können analoge und digitale Signale sauber abgebildet und gesteuert werden.

Die hier gezeigte YAML-Struktur dient als Grundlage, die sich leicht auf weitere Module, Kanäle oder Projekte erweitern lässt.
So entsteht eine transparente, wartbare Lösung, bei der Hardware-Funktion und Home-Assistant-Darstellung klar miteinander verknüpft sind.

Speichere in deinen Favoriten diesen permalink.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert