Інтегруємо чайник в Home Assitstant

Дайте відповідь на опитування Розумний Будинок 2024 🏠

Привіт усім у цій публікації поділюсь досвідом інтеграції CakesTwix та MihMihMihMi розумного чайника ProfiCook PC-WKS 1167G в ESPHome та Home Assistant. Взагалі сам чайник і так працює дистанційно через застосунок Tuya Smart, проте для власника чайника принципово було відв’язати чайник від хмари та керувати ним локально через Tasmota, або ESPHome. Для цього знадобилось трохи модифікувати пристрій на рівні заліза, замінивши відпаявши Tuya плату WBR3 та замінити її на ESP32.

Для чайника ProfiCook уже є готова прошивка під ESPHome та Tasmota. Проте тут ці конфігурації не підходять, оскільки новіші моделі чайників мають на борту не ESP32, а власний чіп під назвою WBR3, який хоч і підтримується ESPHome, але не працює прошивка по повітрю (OTA). Тому рішенням стало заміна WBR3 на ESP32.

У цього чайника схема підключення виглядає так: WBR3 — Tuya MCU — Залізо
Після модифікації змінилась на таку: esp32-c3-devkitm-1 — Tuya MCU — Залізо (чайник)

ESP32 підключена контактами GPIO20 (RX) та GPIO21 (TX) до Tuya MCU і керує ним через UART.

Також додаю конфігурацію ESPHome

esphome:
  name: proficook-pc-wks-1167g
  friendly_name: ProfiCook PC-WKS 1167G

esp32:
  board: esp32-c3-devkitm-1
  framework:
    type: arduino  # idf не працює, йде в bootloop

# Enable logging
logger:

# Enable Home Assistant API
api:
  encryption:
    key: "/790pJKEywnmVNLXGZylVTSxNI74ptiBAjeqgPltlHc="

# Over-the-air updates
ota:
  password: "your password"  # Сюди свій пароль вписати

wifi:
  output_power: 8.5dB  # Важлива хрінь, не прибирати
  ssid: !secret HO_wifi_ssid
  password: !secret HO_wifi_password

  # Enable fallback hotspot (captive portal) in case WiFi connection fails
  ap:
    ssid: "Proficook-Pc-Wks-1167G"
    password: "0000000009"

captive_portal:

uart:
  rx_pin: GPIO20
  tx_pin: GPIO21
  baud_rate: 9600

# Register the Tuya MCU connection
tuya:

text_sensor:
  - platform: template
    name: Kettle State
    icon: mdi:kettle
    id: text_state
  - platform: template
    name: Kettle Error
    icon: mdi:alert-circle-outline
    id: text_error

select:
  - platform: template
    name: "Kettle mode"
    id: kettle_control
    options:
      - 45°
      - 60°
      - 85°
      - 100°
      - 100° and off
      - Custom
      - "Off"
    optimistic: true
    set_action:
      lambda: |-
        if (strcmp(x.c_str(), "45°") == 0) {
          tuya_tuya_id->set_enum_datapoint_value(101, 0);
        } else if (strcmp(x.c_str(), "60°") == 0) {
          tuya_tuya_id->set_enum_datapoint_value(101, 1);
        } else if (strcmp(x.c_str(), "85°") == 0) {
          tuya_tuya_id->set_enum_datapoint_value(101, 2);
        } else if (strcmp(x.c_str(), "100°") == 0) {
          tuya_tuya_id->set_enum_datapoint_value(101, 3);
        } else if (strcmp(x.c_str(), "100° and off") == 0) {
          tuya_tuya_id->set_enum_datapoint_value(101, 4);
        } else if (strcmp(x.c_str(), "Custom") == 0) {
          tuya_tuya_id->set_enum_datapoint_value(101, 5);
        } else {
          tuya_tuya_id->set_enum_datapoint_value(101, 6);
        }

number:
  - platform: "tuya"
    name: "Kettle Custom Temperature"
    number_datapoint: 102
    icon: mdi:oil-temperature
    min_value: 35
    max_value: 100
    step: 1

sensor:
  - platform: template
    name: Kettle Temperature
    id: kettle_temp
    unit_of_measurement: "°C"
    accuracy_decimals: 0

  - platform: tuya
    id: tuya_105
    sensor_datapoint: 105
    on_value:
      then:
        - if:
            condition:
              lambda: |-
                return static_cast(id(tuya_106).state) == 1;
            then:
              - sensor.template.publish:
                  id: kettle_temp
                  state: !lambda |-
                    return 0;
            else:
              - sensor.template.publish:
                  id: kettle_temp
                  state: !lambda |-
                    return id(tuya_105).state;

  - platform: tuya
    id: kettle_remaining
    name: Kettle Remaining Time
    icon: mdi:clock-time-five-outline
    sensor_datapoint: 107
    unit_of_measurement: "min"
    accuracy_decimals: 0

  - platform: tuya
    id: tuya_101
    sensor_datapoint: 101
    on_value:
      then:
        - select.set_index:
            id: kettle_control
            index: !lambda |-
              return id(tuya_101).state;

  - platform: tuya
    id: tuya_106
    sensor_datapoint: 106
    on_value:
      then:
        - text_sensor.template.publish:
            id: text_state
            state: !lambda |-
              switch(static_cast(id(tuya_106).state)) {
                case 1: return "Lifted";
                case 2: return "Standby";
                case 3: return "Heating";
                case 4: return "Cooling";
                case 5: return "Maintaining Temp";
                default: return "";
              }

  - platform: tuya
    id: tuya_104
    sensor_datapoint: 104
    on_value:
      then:
        - if:
            condition:
              lambda: |-
                return id(kettle_temp).raw_state == 0;
          else:
            - text_sensor.template.publish:
                id: text_error
                state: !lambda |-
                  switch(static_cast(id(tuya_104).state)) {
                    case 0: return "OK";
                    case 1: return "Empty";
                    case 4: return "Overheated";
                    default: return "other error";
                  }
    

Також в кінець конфігурації можна додати клімат компонент. Він додає зручний інтерфейс керування температурою нагріву, накшталт круглого перемикача керування кондиціонером.

climate:
  platform: tuya
  name: "Kettle"
  target_temperature_datapoint: 102
  current_temperature_datapoint: 105
  switch_datapoint: 101
  active_state:
    datapoint: 106
  visual:
    min_temperature: 35
    max_temperature: 100
    temperature_step: 5

Підписуйтеся на Telegram-канал «DOU #tech», щоб не пропустити нові технічні статті

👍ПодобаєтьсяСподобалось8
До обраногоВ обраному1
LinkedIn
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

Підписатись на коментарі