Відповісти

Введіть повідомлення і натисніть Надіслати
Параметри

Назад

Огляд теми (нові повідомленні вгорі)

daniil
2024-11-17 10:59:40

Для підключення теплового насосу до системи home-assistant чи MQTT брокеру.
необхідно:
1додати ESPome до системи.
2 додати MQTT до системи.
3 створити новий пристрій.
матеріали:
плата esp-01s
програматор
https://arduino.ua/ru/prod3262-usb-perehodnik-dlya-programmirovaniya-i-otladki-modylei-esp-01-i-esp-01s

код програми я даю повний але вам треба залишити власні ключи ota та інше
фактично ви можете копіювати код починаючи зUART
також можете використовувати api чи mqtt За бажанням.

Данні будуть оновлюватись але вимикач та перемикач режимів працювати не будуть. необхіно замінити мікроконтроллер ТН заертайтесь на електронку вона активна.

Як прошити:
1 вставляєте есп у програматор антеною до юсб роз'єму не переплутайте
2 вставляєте програматор у комп вірогідно треба буде знайти драйвер під нього, як що вставите у распбері драйвер не потрібен.
3 встановлюєте кнопкою install та обираєте спосіб завантаження.
4 міняєте штатний локальний Wi-fi модуль на той що прошили. на платі намальовано антенку не переплутайте якою стороною вставляти модуль.

тепловий насос раз на 10 секунд публікує данні виду
$1 0 0 0 0 0 0 0 0;rn         -   це данні по стану реле
$2 64 213 309 154 436;rn  - це данні по температурі
$3 14 1 8 0 5 50 6 0;rn      - пакет основних налаштувань (відправляє рідко раз на 10 хвилин при завантаженні чи при зміні)
спосіб розшифрування  видно у коді программи далі

де перша цифра номер пакету далі данні.

ТН приймає пакет основних налаштувань
$1 14 1 8 0 5 50 6 0;rn  - це основні налаштування. (як розшифрувати видно у коді)
$2 1;rn                            - увімкнення вимкнення ТН (не працює без заміни мк)
$3 3;rn                            - перемикання режиму ТН   (не працює без заміни мк)


оновлений код опублікую після повного тестування.
також вона може працювати з іншими mqtt брокерами наскільки я розумію.

скрин

esphome:
  name: tn-steel
  friendly_name: TN_steel

esp8266:
  board: esp01_1m

# Enable logging
logger:
  baud_rate: 0
  
# Enable Home Assistant API
#api:
#  encryption:
#    key: "uXYp2/3SlC38i/Cxg/7DjXYwRf/5T7G9i89drS/Xciw="
mqtt:
  id: TN_STEELMQTT
  broker: !secret mqtt_host 
  username: !secret mqtt_username
  password: !secret mqtt_password

ota:
  - platform: esphome
    password: "7e3b09c29591a4ec725addad6dcf4204"

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

  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: "Tn-Steel Fallback Hotspot"
    password: "JsvITClu5byI"

# UART
uart:
  - id: uart_1
    tx_pin: 1
    rx_pin: 3
    baud_rate: 115200
    debug:
      direction: BOTH
      dummy_receiver: true
      after:
        delimiter: ";rn"
      sequence:
        - lambda: |-
            UARTDebug::log_string(direction, bytes);
            int sensorID = 0;
            float sensor1 = 0, sensor2 = 0, sensor3 = 0, sensor4 = 0, sensor5 = 0, sensor6 = 0, sensor7 = 0, sensor8 = 0;
            std::string str(bytes.begin(), bytes.end());

            if (sscanf(str.c_str(), "$%d %f %f %f %f %f %f %f %f", 
              &sensorID, &sensor1, &sensor2, &sensor3, &sensor4, &sensor5, &sensor6, &sensor7, &sensor8) >= 6) {
              if (sensorID == 2) {
                id(temp_ulica).publish_state(sensor1 * 0.1);
                id(temp_dom).publish_state(sensor2 * 0.1);
                id(temp_pod).publish_state(sensor3 * 0.1);
                id(temp_hlad).publish_state(sensor4 * 0.1);
                id(temp_celevaya).publish_state(sensor5 * 0.1);
              } else if (sensorID == 1) {
                id(rele_kompressora).publish_state(sensor1>0.5);
                id(rele_4x_wey).publish_state(sensor2);
                id(rele_fan).publish_state(sensor3);
                id(rele_heat_kab).publish_state(sensor4);
                id(rele_ten2kw).publish_state(sensor5);
                id(rele_TEN4kW).publish_state(sensor6);
                id(rele_gazkot).publish_state(sensor7);
                id(rele_nasos).publish_state(sensor8);
              } else if (sensorID == 3) {
                id(ftzad).publish_state(sensor1*0.5+15);
                id(p_kotla).publish_state(sensor2*2);
                id(gradtn).publish_state(sensor3*1-20);
                id(vspom).publish_state(sensor4);
                id(regim).publish_state(sensor5);
                if (sensor5 == 1) {
                id(select_option).publish_state("TN");
                } else if (sensor5 == 2) {
                id(select_option).publish_state("TN+EK");
                } else if (sensor5 == 3) {
                id(select_option).publish_state("EK");
                } else if (sensor5 == 4) {
                id(select_option).publish_state("TN+GAZ");
                } else if (sensor5 == 5) {
                id(select_option).publish_state("GAZ");
                }
                id(koeffb).publish_state(sensor6);
                id(rleto).publish_state(sensor7);
                id(all_stop).publish_state(sensor8);
                id(on_off_button).publish_state(sensor8 == 1); // Синхронизация кнопки
              }
            }

# Captive Portal
captive_portal:

# Датчики
sensor:
  - platform: template
    name: "T заданная"
    id: "ftzad"
    device_class: temperature
    unit_of_measurement: °C
  - platform: template
    name: "power_EK"
    id: "p_kotla"
  - platform: template
    name: "minimalno_TN"
    id: "gradtn"
  - platform: template
    name: "vspomog_mochnost"
    id: "vspom"
  - platform: template
    name: "Regim_raboty"
    id: "regim"
  - platform: template
    name: "koeficent_b"
    id: "koeffb"
  - platform: template
    name: "leto_zima"
    id: "rleto"
  - platform: template
    name: "T_ulica"
    id: "temp_ulica"
    device_class: temperature
    unit_of_measurement: °C
  - platform: template
    name: "T дом"
    id: "temp_dom"
    device_class: temperature
    unit_of_measurement: °C
  - platform: template
    name: "T подача"
    id: "temp_pod"
    device_class: temperature
    unit_of_measurement: °C
  - platform: template
    name: "T хладагент"
    id: "temp_hlad"
    device_class: temperature
    unit_of_measurement: °C
  - platform: template
    name: "T целевая"
    id: "temp_celevaya"
    device_class: temperature
    unit_of_measurement: °C


# Бинарные датчики
binary_sensor:
  - platform: template
    name: "Включен ТН"
    id: "all_stop"
  - platform: template
    name: "Kompressor"
    id: "rele_kompressora"
  - platform: template
    name: "Fan_TN"
    id: "rele_fan"
  - platform: template
    name: "4_x_wey_walwe"
    id: "rele_4x_wey"
  - platform: template
    name: "Heater_outdor"
    id: "rele_heat_kab"
  - platform: template
    name: "Heater1_indor"
    id: "rele_ten2kw"
  - platform: template
    name: "Heater2_ind"
    id: "rele_TEN4kW"
  - platform: template
    name: "Pomp_cirk"
    id: "rele_nasos"
  - platform: template
    name: "Gas_heater"
    id: "rele_gazkot"

# Выключатель
switch:
  - platform: template
    name: "Выключатель ТН"
    id: on_off_button
    optimistic: true
    on_turn_on:
      - uart.write: 
          id: uart_1
          data: "$2 1;rn"
    on_turn_off:
      - uart.write: 
          id: uart_1
          data: "$2 0;rn"

# Выпадающий список
select:
  - platform: template
    name: "Режим"
    id: select_option
    options:
      - "TN"
      - "TN+EK"
      - "EK"
      - "TN+GAZ"
      - "GAZ"
    optimistic: true
    on_value:
      - lambda: |-
          if (x == "TN") {
            id(uart_1).write_str("$3 1;rn");
          } else if (x == "TN+EK") {
            id(uart_1).write_str("$3 2;rn");
          } else if (x == "EK") {
            id(uart_1).write_str("$3 3;rn");
          } else if (x == "TN+GAZ") {
            id(uart_1).write_str("$3 4;rn");
          } else if (x == "GAZ") {
            id(uart_1).write_str("$3 5;rn");}

# Скрипты
script:
  - id: send_interval
    then:
      - uart.write:
          id: uart_1
          data: "$2 1;rn"
      - delay: 1s
      - uart.write:
          id: uart_1
          data: "$2 0;rn"

  - id: send_uart_command
    then:
      - lambda: |-
          if (id(select_option).state == "TN") {
            id(uart_1).write_str("$3 1;rn");
          } else if (id(select_option).state == "TN+EK") {
            id(uart_1).write_str("$3 2;rn");
          } else if (id(select_option).state == "EK") {
            id(uart_1).write_str("$3 3;rn");
          } else if (id(select_option).state == "TN+GAZ") {
            id(uart_1).write_str("$3 4;rn");
          } else if (id(select_option).state == "GAZ") {
            id(uart_1).write_str("$3 5;rn");}

# Интервалы
#interval:
#  - interval: 55s
#    then:
#      - script.execute: send_interval
#
#  - interval: 60s
#    then:
#      - script.execute: send_uart_command

    
    

Підвал форуму