Klimaanlage Panasonic Etherea ins HA einbinden

Hallo zusammen,

ich habe bereits meine Panasonic WP über Heishamon lokal im HA laufen und würde das gerne für meine 5 Etherea (cs-z??xkew in vers. Leistungsstufen) machen.
Bei mir ist der Stecker noch nicht durch ein WLAN Modul belegt. Ich gehe davon aus, das WLAN ist intern verbaut? Funktioniert die ESP32 Lösung auch mit den Geräten?

Da durch die Links zu github und espthings.io bei etwas Verwirrung aufgekommen ist: Welche Komponenten brauche ich wirklich?
ESP32 Board
Kabel
Stecker (diese hier? https://de.rs-online.com/web/p/steckergehause-und-stecker/4766798)
was fehlt noch?

Danke für Hilfe!

Vielleicht.
Ausprobieren!

Moin. Ich hab 2 Etherea CS-Z20XKEW, funktioniert einwandfrei. Hab das mit je einem Waveshare ESP32-C6-Mini umgesetzt. Die haben WiFi6 und das onboard-Antennendesign ist besser als bei den China-Clones. Ich habe das Ganze auf einer Lochraster aufgebaut und weil ich es noch rumliegen hatte einen 4-Kanal-Levelshifter benutzt.

Ich rate dringend davon ab, die RX/TX des ESP-Boards direkt an die Anlage zu klemmen. Der ESP32 ist NICHT 5V-tolerant. Das kann gut gehen, muss aber nicht - und wenn es zunächst geht und dann irgendwann ausfällt, wird die Fehlersuche unnötig kompliziert und für Laien fast unmöglich. So ein Levershifter kostet nur wenige Cents.

Stecker hab ich bei Ama*** bestellt (Typ PAP-05V-S schon mit Jumper Wire Connector auf der anderen Seite, 5-Pack für 7,69€) und vorsichtig umgepinnt, um die Kabelfarben vernünftig zu haben. Zusätzlich hab ich noch einen 47uF-Elko zwischen 5V und GND verbaut, das muss aber nicht zwingend sein.

Hab zusätzlich die Onboard-LED noch als WiFi-Indikator eingerichtet und zwei Diagnose-Sensoren für die WiFi-Qualität eingerichtet. Hier meine Konfiguration (Passwörter entsprechend noch setzen):

# Lokale Steuerung der Panasonic Klimaanlage
# Board Waveshare ESP32-C6-Mini
# zusätzlich Onboard-LED als WiFi-Indikator 
# zusätzlich WiFi-Qualitätswerte als Diagnosedaten

esphome:
  name: ac-schlafzimmer
  friendly_name: AC-Schlafzimmer
  on_boot:
    - light.turn_on:
        id: onboard_led
        red: 100%
        green: 0%
        blue: 0%
        brightness: 100%
        effect: wifi_disconnected_pulse

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

# Enable logging
logger:

# Enable Home Assistant API
api:
  encryption:
    key: "blabla"

ota:
  - platform: esphome
    password: "blabla"

wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password
  on_connect: 
    then:
      - delay: 1s
      - light.turn_off: onboard_led  # vorherige Effekte beenden
      - component.update: wifi_signal_dbm
      - component.update: wifi_signal_prozent
  on_disconnect:
      - light.turn_on:
          id: onboard_led
          red: 100%
          green: 0%
          blue: 0%
          brightness: 100%
          effect: wifi_disconnected_pulse

  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: "Ac-Schlafzimmer Fallback Hotspot"
    password: "blabla"

captive_portal:

# Requires ESPHome 1.15.0+ for the even parity option
uart:
  tx_pin: GPIO4 # weiß, HV2
  rx_pin: GPIO5 # gelb, HV1
  baud_rate: 9600
  parity: EVEN

external_components:
  source: github://DomiStyle/esphome-panasonic-ac
  components: [panasonic_ac]

climate:
  - platform: panasonic_ac
    # For CZ-TACG1
    type: cnt

    name: Panasonic AC
    horizontal_swing_select:
      name: Panasonic AC Horizontal Swing Mode
    vertical_swing_select:
      name: Panasonic AC Vertical Swing Mode
    outside_temperature:
      name: Panasonic AC Outside Temperature

    # Enable as needed
    # eco_switch:
    #   name: Panasonic AC Eco Switch
    # econavi_switch:
    #  name: Panasonic AC Econavi Switch
    nanoex_switch:
      name: Panasonic AC NanoeX Switch
    mild_dry_switch:
      name: Panasonic AC Mild Dry Switch
    current_power_consumption:
      name: Panasonic AC Power Consumption

    # Useful when the ac does not report a current temperature (CZ-TACG1 only)
    # current_temperature_sensor: temperature_sensor_id

sensor:
  # WiFi Qualität
  - platform: wifi_signal # WiFi Signalstärke RSSI
    name: "WiFi Signal dBm"
    id: wifi_signal_dbm
    update_interval: 10s
    entity_category: "diagnostic"
    on_value:
      then:
        - if:
            condition:
              wifi.connected:
            then:
              # WiFi-Verbindung steht – Signalstärke linear in RGB-Farben abbilden
              # Farbverlauf bei RSSI von -100 bis -50 dBm:
              #   -100 dBm = (255,   0, 64)  — kräftiges Rot mit Magenta-Ton (RSSI schlecht)
              #    -90 dBm = (204,  51, 64)  — rötlich-orange
              #    -80 dBm = (153, 102, 64)  — gelblich
              #    -70 dBm = (102, 153, 64)  — grünlich
              #    -60 dBm = ( 51, 204, 64)  — gelbgrün bis türkisgrün
              #    -50 dBm = (  0, 255, 64)  — sattes Grün mit Blauanteil (RSSI sehr gut)
              - lambda: |-
                  int dbm = (int) id(wifi_signal_dbm).state;
                  if (dbm > -50) dbm = -50;
                  if (dbm < -100) dbm = -100;
                  int level = (dbm + 100) * 2;

                  if (dbm != id(wifi_signal_level_last)) {
                    int last_dbm = id(wifi_signal_level_last);
                    id(wifi_signal_level_last) = dbm;

                    float t = level / 100.0;
                    float red   = (1.0 - t) * 255.0;
                    float green = t * 255.0;
                    float blue  = 64.0;

                    auto call = id(onboard_led).turn_on();
                    call.set_rgb(red / 255.0, green / 255.0, blue / 255.0);
                    call.set_brightness(0.15f);
                    call.set_effect("none");
                    call.perform();

                    ESP_LOGI("Klimaanlage", "WiFi-RSSI changed from %ddBm to %ddBm, adjust LED to rgb(%d, %d, %d)",
                            last_dbm, dbm, (int) red, (int) green, (int) blue);
                  }
  - platform: template
    name: "WiFi Signal Prozent"
    id: wifi_signal_prozent
    icon: mdi:wifi
    unit_of_measurement: "%"
    accuracy_decimals: 0
    entity_category: "diagnostic"
    internal: false
    # übliche Funktion zur Umrechnung von RSSI in Prozent
    lambda: |-
      float rssi = id(wifi_signal_dbm).state;
      if (isnan(rssi)) return NAN;
      // Annahme: -100 dBm (schlecht) = 0 %, -50 dBm (gut) = 100 %
      int percent = 2 * (rssi + 100);
      if (percent > 100) percent = 100;
      if (percent < 0) percent = 0;
      return percent;

# WiFi-Status
light:
  - platform: esp32_rmt_led_strip
    id: onboard_led
    chipset: WS2812
    pin: GPIO8
    num_leds: 1
    rgb_order: RGB
    default_transition_length: 0s
    internal: true
    effects:
      - pulse:
          name: wifi_disconnected_pulse
          transition_length: 0.5s
          update_interval: 0.5s
          min_brightness: 0%
          max_brightness: 100%

globals:
  - id: wifi_signal_level_last
    type: int
    restore_value: no
    initial_value: '-999'

2 „Gefällt mir“

So, ich habe das Gerät noch etwas aufgewertet. Da man nach Einbau die Comfort-Cloud nicht mehr braucht, hab ich die Geräte daraus gelöscht und das interne WiFi abgeschaltet. Dann sind im ausgeschalteten Zustand der Klimaanlage aber auch alle LED an der Vorderseite aus, so dass man nicht sieht, ob sie überhaupt Strom hat. Das wollte ich ändern.

Ich habe dann zunächst eine zusätzliche RGB-LED (5mm, WS2811) über ein Kabel und einen freien Kanal des Levelshifters (!!) an die Platine angeschlossen. In die Datenleitung kommt ein 470k Widerstand und ein 47uF-Elko zwischen 5V und GND war ja eh schon da. Diese LED hab ich in der Anlage so befestigt, dass Sie aus dem oben offenen Gehäuse raus an die Decke strahlt.

Dann hab ich den Code erweitert und Folgendes implementiert:

  • wenn kein WiFi: rot blinken
  • wenn WiFi aber Timeout zur AC: magenta blinken
  • wenn WiFi und Verbindung zur AC aber keine Verbindung zur HA-API: gelb blinken
  • wenn WiFi und Verbindung zur AC und HA-API: WiFi RSSI als RGB-Farbe (grün bis rot)

Um die Helligkeit der LED einstellen zu können, hab ich entsprechende Regler eingebaut. Ich hole mir im YAML außerdem die Außenhelligkeit von meiner Wetterstation, da kann aber auch jeder andere Helligkeitssensor eingetragen werden. Liegt die Außenhelligkeit über dem einstellbaren Threshold, leuchtet die LED mit der eingestellten “Brightness hoch”, ansonsten mit der “Brightness niedrig”. Das Blinken ist immer mit Helligkeit 100%.

Zusätzlich hab ich implementiert, dass der ESP - wenn einige Zeit die WiFi-Verbindung unter -80dBm liegt - ein neuer WiFi-Scan initiiert wird. Das ist bei mir relevant, weil mehrere Access-Points habe und der ESP mir ansonsten zu lange an “schlechten” AP klebt, wenn er sich einmal damit verbunden hat.

Zuletzt hab ich dann einen Schalter implementiert, über den der ESP aus HA heraus neu gestartet werden kann, sowie einige Diagnose-Sensoren für die Anzeige in HA (IP, Mac-Adresse, BSSID, WiFi-Qualität und Info bzgl. der Kommunikation mit der Klimaanlage).

Falls wer die Konfiguration so verwendet, bitte beachten… der ESP holt sich nach dem Start die Zeit per SNTP. Sobald die Verbindung zur Klima steht, wird der Zeitstempel in HA angezeigt. Nach Unterbrechung der Verbindung - warum auch immer - wird der Zeitstempel erneuert. Nach dem ersten Start nach Firmware-Flashen hat der ESP aber noch keine gültige Zeit und der Zeitstempel zeigt “Unbekannt”. Dann einmal aus HA heraus den ESP neu starten und ab dann passt das alles bis zum nächsten Flashen.

# Lokale Steuerung der Panasonic Klimaanlage
#
# basiert auf github://DomiStyle/esphome-panasonic-ac
#
# Mein Modell: CS-Z20XKEW mit 5-pol. Anschluss (PAP-05V-S) an Modul CZ-TACG1
# Board Waveshare ESP32-C6-Mini
# zusätzlich Status LED onboard und extern 
# zusätzlich Fern-Restart per HA
# zusätzlich einige Diagnosedaten (IP, Mac-Adresse, BSSID, WiFi-Qualität und Info bzgl. der Kommunikation mit der Klimaanlage)

substitutions:
  const_led_brightness_low: 30  # low-Helligkeit Initialwert WiFi-Qualitäts-LED für Number-Control, ohne %
  const_led_brightness_high: 100  # high-Helligkeit Initialwert WiFi-Qualitäts-LED für Number-Control, ohne %
  const_outside_brightness_threshold: 4800  # Helligkeitsschwelle für Brightness WiFi-Qualitäts-LED
  const_ac_timeout: '20000'

esphome:
  name: ac-schlafzimmer
  friendly_name: AC-Schlafzimmer
  project:
    name: "michael.ac-controller"
    version: "3.3.0"
  on_boot:
    then:
      - text_sensor.template.publish:
          id: ac_verbunden_seit
          state: "Niemals"

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

# Logging ein
logger:

# Home Assistant API ein
api:
  encryption:
    key: "blabla"

ota:
  - platform: esphome
    password: "blabla"

wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password
  enable_btm: True
  enable_rrm: True
  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: "Ac-Schlafzimmer Fallback Hotspot"
    password: "blabla"

captive_portal:

#
# Konfiguration externe Komponente Panasonic-AC #################################################
#

# Requires ESPHome 1.15.0+ for the even parity option
uart:
  tx_pin: GPIO4 # weiß, HV2
  rx_pin: GPIO5 # gelb, HV1
  baud_rate: 9600
  parity: EVEN

external_components:
  source: github://DomiStyle/esphome-panasonic-ac
  components: [panasonic_ac]

climate:
  # Klima-Komponente für HA
  - platform: panasonic_ac
    # For CZ-TACG1
    type: cnt

    name: Panasonic AC
    horizontal_swing_select:
      name: Panasonic AC Horizontal Swing Mode
    vertical_swing_select:
      name: Panasonic AC Vertical Swing Mode
    outside_temperature:
      name: Panasonic AC Outside Temperature

    # Enable as needed
    # eco_switch:
    #   name: Panasonic AC Eco Switch
    # econavi_switch:
    #  name: Panasonic AC Econavi Switch
    nanoex_switch:
      name: Panasonic AC NanoeX Switch
    mild_dry_switch:
      name: Panasonic AC Mild Dry Switch
    current_power_consumption:
      name: Panasonic AC Power Consumption

    # Useful when the ac does not report a current temperature (CZ-TACG1 only)
    # current_temperature_sensor: temperature_sensor_id

#
# Konfiguration eigene funktionale Erweiterungen ################################################
#
    # Schnittstelle überwachen und Zeit updaten, wenn sich Werte ändern
    on_state:
      then:
        - lambda: |-
            id(ac_last_seen) = millis();

globals:
  - id: ha_connected
    type: bool
    restore_value: no
    initial_value: 'false'

  - id: bad_wifi_signal_count
    type: int
    restore_value: no
    initial_value: '0'

  - id: led_last_red
    type: float
    restore_value: no
    initial_value: '0'
  - id: led_last_green
    type: float
    restore_value: no
    initial_value: '0'
  - id: led_last_blue
    type: float
    restore_value: no
    initial_value: '0'
  - id: led_last_brightness
    type: float
    restore_value: no
    initial_value: '0'
  - id: led_last_state
    type: std::string
    restore_value: no
    initial_value: ''

  - id: ac_timeout
    type: uint32_t
    restore_value: no
    initial_value: ${const_ac_timeout}
  - id: ac_last_seen
    type: uint32_t
    restore_value: no
    initial_value: '0'
  - id: ac_connected
    type: bool
    restore_value: no
    initial_value: 'false'

time:
  - platform: sntp
    id: sntp_time
    timezone: Europe/Berlin
    servers:
      - 0.europe.pool.ntp.org
      - 1.europe.pool.ntp.org
      - 0.pool.ntp.org

switch:
  # Remote Restart-Button in HA
  - platform: restart
    name: "ESP Neustart"

sensor:
  # WiFi Signalstärke RSSI in dBm
  - platform: wifi_signal
    name: "WiFi Signal dBm"
    id: wifi_signal_dbm
    update_interval: never
    entity_category: "diagnostic"
    device_class: signal_strength
    on_value: 
      then:
        - component.update: wifi_signal_prozent
        - if:
            # prüfen, ob RSSI eine zeitlang unter -80 dBm, dann Roaming/Reconnect versuchen.
            condition:
              - lambda: 'return x < -80;'
            then:
              - lambda: 'id(bad_wifi_signal_count)++;'
            else:
              - lambda: 'id(bad_wifi_signal_count) = 0;'
        - if:
            condition:
              - lambda: 'return id(bad_wifi_signal_count) > 10;'
            then:
              - lambda: |-
                  ESP_LOGI("Klimaanlage", "Bad WiFi-connected, starting new scan for better AP");
                  id(bad_wifi_signal_count) = 0;
                  wifi::global_wifi_component->start_scanning();
  # WiFi Signalstärke RSSI in %
  - platform: template
    name: "WiFi Signal Prozent"
    id: wifi_signal_prozent
    icon: mdi:wifi
    entity_category: "diagnostic"
    unit_of_measurement: "%"
    update_interval: never
    # übliche Funktion zur Umrechnung von RSSI in Prozent
    accuracy_decimals: 0
    lambda: |-
      float rssi = id(wifi_signal_dbm).state;
      return round(min(max(2 * (rssi + 100.0), 0.0), 100.0));

  # Helligkeit vom Umweltsensor aus Home Assistant
  # verwendet für Steuerung der Brightness der LED
  - platform: homeassistant
    name: "Helligkeit Außen"
    id: helligkeit_aussen
    entity_id: sensor.gw1100a_solar_lux

text_sensor:
  # Infos für HA-Anzeige
  - platform: wifi_info
    ip_address:
      name: IP Addresse
      entity_category: "diagnostic"
    mac_address:
      name: Mac Addresse
      entity_category: "diagnostic"
    bssid:
      name: BSSID
      entity_category: "diagnostic"
  - platform: template
    name: "AC verbunden seit"
    id: ac_verbunden_seit
    entity_category: "diagnostic"
    icon: mdi:clock-check-outline
    update_interval: never

binary_sensor:
  # Überwachung der Schnittstelle zur AC
  - platform: template
    name: "AC Verbindung"
    id: ac_verbindung
    entity_category: "diagnostic"
    device_class: connectivity
    lambda: |-
      if (id(ac_last_seen) == 0) return false; // noch nie aktualisiert → nicht verbunden

      // sonst auswerten, wenn innerhalb der timeout-Zeit in ms eine Antwort kam
      id(ac_connected) = (millis() - id(ac_last_seen)) < id(ac_timeout);
      return id(ac_connected);
    # Textsensor mit Zeitstempel befüllen
    on_press:
      then:
        - script.execute: set_ac_connection_on_time
    on_release:
      then:
        - text_sensor.template.publish:
            id: ac_verbunden_seit
            state: "Getrennt"

number:
  # erzeugt ein Control, über den der Schwellwert der Brightness-Regelung angepasst werden kann
  - platform: template
    name: "LED Threshold"
    min_value: 0
    max_value: 7000
    step: 50
    initial_value: ${const_outside_brightness_threshold}
    id: brightness_threshold_var
    optimistic: true
    set_action:
      - lambda: id(brightness_threshold_var).publish_state(x);

  # erzeugt ein Control, über den die niedrige Brightness angepasst werden kann
  - platform: template
    name: "LED Brightness niedrig"
    id: brightness_low_var
    min_value: 20
    max_value: 100
    step: 1
    initial_value: ${const_led_brightness_low}
    set_action:
      - lambda: id(brightness_low_var).publish_state(x);

  # erzeugt ein Control, über den die höhere Brightness angepasst werden kann
  - platform: template
    name: "LED Brightness hoch"
    id: brightness_high_var
    min_value: 20
    max_value: 100
    step: 1
    initial_value: ${const_led_brightness_high}
    set_action:
      - lambda: id(brightness_high_var).publish_state(x);

light:
  # Konfiguration ESP32 C6 Onboard-LED
  - platform: esp32_rmt_led_strip
    id: status_led
    chipset: WS2811
    pin: GPIO0
    num_leds: 1
    rmt_symbols: 48
    rgb_order: RGB
    default_transition_length: 700ms
    internal: true
    effects:
      - pulse:
          name: led_pulse
          transition_length:
            on_length: 500ms
            off_length: 200ms
          update_interval: 500ms
          min_brightness: 0%
          max_brightness: 100%

  # Konfiguration ESP32 C6 extrene WS2812 LED
  - platform: esp32_rmt_led_strip
    id: onboard_led
    chipset: WS2812
    pin: GPIO8
    num_leds: 1
    rmt_symbols: 48
    rgb_order: RGB
    default_transition_length: 700ms
    internal: true
    effects:
      - pulse:
          name: led_pulse
          transition_length:
            on_length: 500ms
            off_length: 200ms
          update_interval: 500ms
          min_brightness: 0%
          max_brightness: 100%

script:
  # WiFi-Signalstärke linear in RGB-Farben abbilden
  - id: set_wifi_quality_led
    mode: single
    then:
      - if:
          condition:
            - api.connected: 
          then:  
            # Farbverlauf bei RSSI von -90 bis -55 dBm:
            #   -90 dBm = HSV(355°, 100%, 100%) ≈ RGB(255, 0, 42)    — Reines Rot (sehr schlechte Verbindung)
            #   -85 dBm = HSV(326°, 100%, 100%) ≈ RGB(255, 0, 182)   — Magenta
            #   -80 dBm = HSV(297°, 100%, 100%) ≈ RGB(204, 0, 255)   — Violett
            #   -75 dBm = HSV(268°, 100%, 100%) ≈ RGB(14, 0, 255)    — Blau
            #   -70 dBm = HSV(239°, 100%, 100%) ≈ RGB(0, 142, 255)   — Hellblau
            #   -65 dBm = HSV(210°, 100%, 100%) ≈ RGB(0, 255, 255)   — Cyan
            #   -60 dBm = HSV(180°, 100%, 100%) ≈ RGB(0, 255, 0)     — Grün
            #   -55 dBm = HSV(140°, 100%, 100%) ≈ RGB(0, 255, 150)   — Türkisgrün (sehr gute Verbindung)
            - lambda: |-
                int dbm = (int) id(wifi_signal_dbm).state;
                if (dbm > -55) dbm = -55;
                if (dbm < -90) dbm = -90;

                // Interpolationswert: -90 dBm = 0.0 → -55 dBm = 1.0
                float t = (dbm + 90.0) / 35.0;

                // Farbton von 355° (rot) bis 140° (grün-türkis)
                float hue = 355.0 - t * (355.0 - 140.0);

                // HSV zu RGB konvertieren
                float s = 1.0;
                float v = 1.0;
                float c = v * s;
                float h_prime = hue / 60.0;
                float x = c * (1.0 - fabs(fmod(h_prime, 2.0) - 1.0));
                float m = v - c;
                float r = 0, g = 0, b = 0, brightness = 0;

                if (0 <= h_prime && h_prime < 1) { r = c; g = x; b = 0; }
                else if (1 <= h_prime && h_prime < 2) { r = x; g = c; b = 0; }
                else if (2 <= h_prime && h_prime < 3) { r = 0; g = c; b = x; }
                else if (3 <= h_prime && h_prime < 4) { r = 0; g = x; b = c; }
                else if (4 <= h_prime && h_prime < 5) { r = x; g = 0; b = c; }
                else if (5 <= h_prime && h_prime <= 6) { r = c; g = 0; b = x; }

                // Addiere m zur Normalisierung auf [0–1]
                r += m;
                g += m;
                b += m;

                // Brightness bestimmen in Abhängigkeit Umgebungslicht          
                if (id(helligkeit_aussen).state < id(brightness_threshold_var).state) {
                  brightness = id(brightness_low_var).state / 100;
                } else {
                  brightness = id(brightness_high_var).state / 100;
                }
                ESP_LOGI("Klimaanlage",
                  "WiFi-RSSI %ddBm, RGB(%.0f%%, %.0f%%, %.0f%%), Brightness %.0f%%; ", dbm, r * 100.0f, g * 100.0f, b * 100.0f, brightness * 100.0f);
                id(led_set_color).execute(r, g, b, brightness);

  # Pulsierende LED in rot (WiFi-loss), immer Brightness = 100%
  - id: led_pulse_red
    then:
      - lambda: |-
          // RGB-Werte in den globalen Variablen für die WiFi-Qualität zurücksetzen
          id(led_last_red) = 0;
          id(led_last_green) = 0;
          id(led_last_blue) = 0;
      - light.turn_on:
          id: status_led
          red: 100%
          green: 0%
          blue: 0%
          effect: led_pulse
      - light.turn_on:
          id: onboard_led
          red: 100%
          green: 0%
          blue: 0%
          effect: led_pulse

  # Pulsierende LED in gelb (HA API-loss), immer Brightness = 100%
  - id: led_pulse_yellow
    then:
      - lambda: |-
          // RGB-Werte in den globalen Variablen für die WiFi-Qualität zurücksetzen
          id(led_last_red) = 0;
          id(led_last_green) = 0;
          id(led_last_blue) = 0;
      - light.turn_on:
          id: status_led
          red: 95%
          green: 100%
          blue: 0%
          effect: led_pulse
      - light.turn_on:
          id: onboard_led
          red: 95%
          green: 100%
          blue: 0%
          effect: led_pulse

  # Pulsierende LED in magenta (AC communication loss), immer Brightness = 100%
  - id: led_pulse_magenta
    then:
      - lambda: |-
          // RGB-Werte in den globalen Variablen für die WiFi-Qualität zurücksetzen
          id(led_last_red) = 0;
          id(led_last_green) = 0;
          id(led_last_blue) = 0;
      - light.turn_on:
          id: status_led
          red: 83%
          green: 0%
          blue: 100%
          effect: led_pulse
      - light.turn_on:
          id: onboard_led
          red: 83%
          green: 0%
          blue: 100%
          effect: led_pulse

  # LED bei Farbänderung ansteuern, Parameter = RGB in %
  - id: led_set_color
    parameters:
      red: float
      green: float
      blue: float
      brightness: float
    then:
      - if:
          condition:
            - lambda: 'return id(led_last_red) != red || id(led_last_green) != green || id(led_last_blue) != blue || id(led_last_brightness) != brightness;'
          then:
            - lambda: |-
                // Speichere die neuen Werte in den globalen Variablen
                id(led_last_red) = red;
                id(led_last_green) = green;
                id(led_last_blue) = blue;
                id(led_last_brightness) = brightness;
            - light.turn_on:
                id: status_led
                red: !lambda 'return red;'
                green: !lambda 'return green;'
                blue: !lambda 'return blue;'
                brightness: !lambda 'return brightness;'
                effect: none
            - light.turn_on:
                id: onboard_led
                red: !lambda 'return red;'
                green: !lambda 'return green;'
                blue: !lambda 'return blue;'
                brightness: !lambda 'return brightness;'
                effect: none

  # Zeit speichern, wann AC online ging seit letzter Unterbrechung
  - id: set_ac_connection_on_time
    then:
      - lambda: |-
          char buffer[25];
          auto now = id(sntp_time).now();
          if (now.is_valid()) {
            now.strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S");
            ESP_LOGI("Klimaanlage", "AC connected since: %s", buffer);
            id(ac_verbunden_seit).publish_state(buffer);
          } else {
            id(ac_verbunden_seit).publish_state("Unbekannt");
          }

interval:
  # Steuerung der LED:
  # wenn kein WiFi: rot blinken
  # wenn WiFi aber Timeout zur AC: magenta blinken
  # wenn WiFi und Verbindung zur AC aber keine Verbindung zur API: gelb blinken
  # wenn WiFi und Verbindung zur AC und API: RSSI als RGB-Farbe
  - interval: 2s
    then:
      - if:
          condition:
            wifi.connected: {}
          then:
            - component.update: wifi_signal_dbm
            - if:
                condition:
                  not:
                    - lambda: 'return id(ac_connected);'
                then:
                  - if:
                      condition: 
                        - lambda: 'return id(led_last_state) != "led_pulse_magenta";'
                      then:
                        - lambda: 'id(led_last_state) = "led_pulse_magenta";'   
                        - script.execute: led_pulse_magenta
                else:
                  - if:
                      condition:
                        not:
                          api.connected:
                      then:
                        - if:
                            condition: 
                              - lambda: 'return id(led_last_state) != "led_pulse_yellow";'
                            then:
                              - lambda: 'id(led_last_state) = "led_pulse_yellow";'
                              - script.execute: led_pulse_yellow
                      else:
                        - lambda: 'id(led_last_state) = "";'
                        - delay: 200ms
                        - script.execute: set_wifi_quality_led
          else:
            - script.execute: led_pulse_red

Anschlussleiste zur Klima (Pin oben = 1, Pin unten = 4):

  • Pin1: ESP TX
  • Pin2: ESP RX
  • Pin3: 5V
  • Pin4: GND

Anschlussleiste zur LED (Pin oben = 1, Pin unten = 3):

  • Pin1: GND
  • Pin2: 5V
  • Pin3: Data

Hier noch die Ansichten aus HA dazu:

:crayon:by HarryP: Zusammenführung Doppelpost (bei Änderungen oder hinzufügen von Inhalten bitte die „Bearbeitungsfunktion“ anstatt „Antworten“ zu nutzen)

1 „Gefällt mir“

Ich hab das heute mal geschafft nachzubauen.

Leider tut sich gar nix, wenn ich den Stecker einstecke. Einmal mit Levelshifter, einmal ohne aufgebaut. Elko habe ich nicht verbaut. An zwei Inneneinheiten getestet. Aber keine Reaktion.

5V kommen am ESP an, das habe ich mit dem Multimeter messen können.

Da ich noch so oft mit den ESP zu tun habe: Muss ich noch etwas beachten bzw. ist die Reihenfolge richtig?

  • Skript von oben über HA auf den ESP gebracht
  • Zusammenlöten
  • Einstecken
  • weitere Schritte?

Fehlt noch etwas?

Danke!

Moin,

leider kann man mit Deiner Fehlerbeschreibung kaum etwas anfangen. Welches YAML hast du geflasht? Welchen ESP hast Du? Sind am Levelshifter HV/LV richtig herum? Wie sieht dein Board aus? Stimmen die tatsächlich verwendeten RX/TX-Pins am ESP mit dem YAML überein? Zeigt der ESP auch ohne Anschluss an die AC im ESPHomeBuilder ein Log (wenn über USB verbunden und auch über WiFi)? Wenn ja, sind da Fehler drin? Was zeigt das Gerät in HA?

Sobald geflasht und in HA als neues Gerät aufgenommen müsste schon alles im Abschnitt Diagnose angezeigt werden, aber unter AC-Verbindung “getrennt”. Wenn das passt, dann MIT LEVELSHIFTER an die AC. Was kommt jetzt? AC-Verbindung immer noch “getrennt”: dann die RX/TX-Pins tauschen und nochmal versuchen. Was kommt jetzt?

Blöd ist… wenn du schon ohne Levelshifter an der AC warst, dann KÖNNTE es sein, dass Du ggf. einen/beide Eingangspins geschossen hast. Kann, muss nicht. Und dann wird die Fehlersuche - das hatte ich ja zuvor schon erwähnt - nahezu unmöglich.

Also: Ohne Detail-Infos kann man Dir nicht helfen.

Danke für die schnelle Antwort.

Ich hab das YAML von dir oben (ohne LED) auf das Board gepackt.

ESP ist ein C6-Mini, Levelshifter ist auch richtig herum. Beide Bauteile identisch zu deinen auf den Fotos. Die Pins wurden auch entsprechend verlötet.

Ich glaube, mein Problem ist softwareseitig. Im HA habe ich das Board nur als Offline gesehen. Da ich bisher nur wenig mit ESP32 zu tun hatte, dachte ich, dass das Board erst im HA erscheint, sobald es an der AC hängt. Ein Neuladen zeigt es zumindest als Online an, auch im WLAN und HA sehe ich das Gerät jetzt. Entitäten, außer Diagnose und Internet Access, sehe ich allerdings im HA nicht.

Das aktuelle (Versuchs)-Board wurde nicht ohne Levelshifter an dem Innengerät angeschlossen. Ein Fehler an den Pins sollte also kein Problem sein.

Bitte YAML posten als formatierter Text (Code), wenn Du da schon was geändert hast. Das kann man ja sonst nicht mehr nachvollziehen. Und die Anzeige online/offline im ESPHomebuilder sagt erstmal nichts, das Gerät funktioniert trotz der Anzeige mit HA, nur die Verbindung zum Builder ist dann ggf. weg. Wenn Du im Builder auf Logs klickst, dann sollte es etwas dauern, dann kommen lila etliche Infos zum Gerät und dann beginnt der Log. Ansonsten ESP neu starten und dann nochmal versuchen. Da sollte alle paar Sekunden sowas auftauchen:

11:54:30][D][sensor:104]: 'WiFi Signal dBm': Sending state -60.00000 dBm with 0 decimals of accuracy
[11:54:30][D][sensor:104]: 'WiFi Signal Prozent': Sending state 80.00000 % with 0 decimals of accuracy
[11:54:42][D][sensor:104]: 'WiFi Signal dBm': Sending state -63.00000 dBm with 0 decimals of accuracy
[11:54:42][D][sensor:104]: 'WiFi Signal Prozent': Sending state 74.00000 % with 0 decimals of accuracy
[11:54:55][I][safe_mode:042]: Boot seems successful; resetting boot loop counter
[11:54:55][D][esp32.preferences:142]: Writing 1 items: 0 cached, 1 written, 0 failed

Und was für Entitäten “Internet Access” sollen das sein? Sowas gibt es nicht mit der YAML. Hast du ggf. die externe Komponente falsch eingebunden und da was geändert? Ich habe ein zusätzliches Modul für mich gebaut, das war noch nie an einer AC, quasi als Reserve. Da erscheinen sofort die Entitäten der (nicht vorhandenen) AC aus dem git von “github://DomiStyle/esphome-panasonic-ac” im Abschnitt “Steuerelemente”. Bitte Screenshots aus dem Gerät in HA. Und zeig auch mal die Platine.

Und vielleicht zuerst… Gerät per USB an den Rechner mit HA. Dann im Builder auf die YAML und nochmal installieren… sobald man im Log den Flashvorgang sieht, sollte kurz darauf der Log lila die Konfiguration anzeigen und dann regelmäßig Diagnosedaten in türkis.

Yaml ist deine von Beitrag oben ohne die LED Erweiterung, nur der Encription Key und die WLAN Parameter wurden angepasst.

Hier ist der Auszug aus dem Log. Aktualisiert sich aber nicht alle paar Sekunden.

[13:25:22][C][wifi:454]:  Signal strength: -54 dB ▂▄▆█
[13:25:22][C][wifi:465]:   Channel: 1
[13:25:22][C][wifi:465]:  Subnet: 255.255.255.0
[13:25:22][C][wifi:465]:  Gateway: 192.168.178.1
[13:25:22][C][wifi:465]:  DNS1: 192.168.178.1
[13:25:22][C][wifi:465]:  DNS2: 0.0.0.0
[13:25:22][C][logger:252]: Logger:
[13:25:22][C][logger:252]:  Max Level: DEBUG
[13:25:22][C][logger:252]:  Initial Level: DEBUG
[13:25:22][C][logger:258]:   Log Baud Rate: 115200
[13:25:22][C][logger:258]:  Hardware UART: USB_SERIAL_JTAG
[13:25:22][C][logger:265]:   Task Log Buffer Size: 768
[13:25:22][C][captive_portal:099]: Captive Portal:
[13:25:22][C][esphome.ota:075]: Over-The-Air updates:
[13:25:22][C][esphome.ota:075]:  Address: ac-wohnzimmer.local:3232
[13:25:22][C][esphome.ota:075]:  Version: 2
[13:25:22][C][esphome.ota:082]:   Password configured
[13:25:22][C][safe_mode:018]: Safe Mode:
[13:25:22][C][safe_mode:019]:   Boot considered successful after 60 seconds
[13:25:22][C][safe_mode:019]:  Invoke after 10 boot attempts
[13:25:22][C][safe_mode:019]:  Remain for 300 seconds
[13:25:22][C][web_server.ota:224]: Web Server OTA
[13:25:22][C][api:205]: Server:
[13:25:22][C][api:205]:  Address: ac-wohnzimmer.local:6053
[13:25:22][C][api:210]:   Noise encryption: YES
[13:25:22][C][mdns:124]: mDNS:
[13:25:22][C][mdns:124]:  Hostname: ac-wohnzimmer
[13:25:28][D][api:144]: Accept 192.168.178.116
[13:25:28][W][component:317]: api cleared Warning flag
[13:25:28][D][api.connection:1343]: Home Assistant 2025.8.2 (192.168.178.116) connected
[13:26:16][I][safe_mode:042]: Boot seems successful; resetting boot loop counter
[13:26:16][D][esp32.preferences:142]: Writing 1 items: 0 cached, 1 written, 0 failed

Ich sehe nur die beiden “Entitäten”:

Wie gesagt, ich gehe davon aus, dass es softwareseitig aufgrund fehlender Erfahrung mit ESP noch an etwas fehlt oder ich irgendwas vergessen oder übersprungen habe.

Sorry, aber so wird das nix. Wenn Du Hilfe willst, dann schreib genau, was Du wo und wie gemacht hast. Du schreibst auch “Yaml ist deine von Beitrag oben ohne die LED Erweiterung“. Also doch was geändert oder was jetzt? Und wie hast du den ESP geflasht? So wie das aussieht, ist das ein völlig nackter ESP, den du über ESPHome Web mit was auch immer beschrieben hast und nicht über das AddOn “ESPHome Device Builder” aus HA heraus. Da ist gar keine Software drauf, vermute ich.

1 „Gefällt mir“

Bevor ich alle Schritte hier reinschreibe habe ich mir gedacht, dass ich es nochmals neuaufsetze.

Und siehe da, ich sehe im HA jetzt auch die Entiäten für die AC.

Was habe ich anders gemacht? Auf deinen Hinweis im letzten Absatz habe ich mir das Flashen nochmals angeschaut. Dort dürfte der erste Fehler liegen. Der zweite war vmtl. der API Key im HA.

Im HA sieht es bei dem ESP jetzt wie geschrieben gut aus. Da das allerdings der ESP ohne Levelshifter war, muss ich den erst noch dran bauen, bevor ich das ganze an der AC teste.

Danke für deine Hilfe.

Schön, dass es funktioniert hat. Ich stelle die Tage noch eine aktualisierte Version meines YAML ein, da hab ich ein paar Dinge neu strukturiert/optimiert und weitere Diagnosesachen hinzugefügt.

1 „Gefällt mir“

Ich bin tatsächlich immer noch nicht dazu gekommen meine beiden Anlagen umzubauen :man_facepalming: warscheinlich auch weil die Cloud-Lösung jetzt schon länger problemlos funktioniert.

Will mich jetzt aber demnächst trotzdem ranwagen und habe noch 2 Fragen:

Hat das zufällig schon jemand mit CS-BZ35ZKE Geräten gemacht?

Und kann man den ESP32 parallel zu den Wlanmodulen betreiben? (cz-tacg1) Bekommt der ESP mit wenn man etwas über die Cloud oder Fernbedienung ändert?

Wäre mein erstes ESP-Projekt, daher bin ich da nicht so fit drin..

So, habe das ganze nun nachgebaut und funktioniert auch super.

Laut Recherche ist der 5V am CNT auch nicht mit Levelshifter für den ESP32 “geeignet” und könnte auf Dauer das Logicboard der AC schädigen.

Da ist wohl weder Rückstromsperren drin noch ausreichend Strom (max 80-120ma, ESP zieht wohl bis 300ma).

Mache ich mir unnötig Gedanken?

Gibt es Quellen für die Recherche? Bei mir läuft es seit August fehlerfrei und ohne Aussetzer.

Und kann man den ESP32 parallel zu den Wlanmodulen betreiben? (cz-tacg1) Bekommt der ESP mit wenn man etwas über die Cloud oder Fernbedienung ändert?

Ja, jede Änderung geht über den ESP an Home Assistant.

Vermutlich. Bei mir läuft es seit Sommer 2024 auf ESP32-C3-Supermini ohne Levelshifter. Im Github-Forum gibt es auch keinen Anwender der ein Problem hat. Garantie gibt dir keiner drauf das es so bleibt.

Wenn es dir nach deinen Recherchen zu heikel ist, nimm die Cloud-Integration für das Original-WLAN-Modul.

Die cloud Integration funktioniert nicht mehr. Kann mich nicht mehr einloggen. In die App schon, homeassistant Integration nicht.

Zu heikel ist es mir nicht. Ich frage ja nur nach Erfahrungen.

Der 5v Anschluss ist ja einfach nicht für Spannungsversorgung geeignet und man könnte den 12v nehmen. Der ja für Lüfter etc verwendet werden kann/ darf.

Hab mir mal nen mp1584en dc dc converter bestellt. Kann dann ja berichten.

Ich komme mir gerade wie der letzte Idiot vor… Ich bekomme den esp c3 supermini nichtmal mit ESPhome geflasht…:man_facepalming:

Wird einfach nicht erkannt, habe mehrere PCs versucht. Ich bin mit ESPHome totaler noob, das ist mein erstes Projekt damit, weil sch*** Panasonic mal wieder an der Clout rumgepfuscht hat.

Ich bekomme jedes mal die Meldung “failed toprepare configuration”. Wie genau ist der Weg zum flashen/beschreiben des C3 mit ESPHome bzw. dem Yaml Code?

Flash erstmal eine Basisversion auf das Ding und bring ihn in dein Netz: