Klimaanlage Panasonic Etherea ins HA einbinden

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“