Skip to content

Instantly share code, notes, and snippets.

@vladyspavlov
Last active April 5, 2025 16:06
Show Gist options
  • Save vladyspavlov/5ac21cb58923482eff8e7bbb2d0854b3 to your computer and use it in GitHub Desktop.
Save vladyspavlov/5ac21cb58923482eff8e7bbb2d0854b3 to your computer and use it in GitHub Desktop.
Must inverter ESPHome configuration for ESP32. More info and the latest version of the config are now in the repo: https://github.com/vladyspavlov/esphome-must-inverter
# More info and the latest version of the config are now in the repo: https://github.com/vladyspavlov/esphome-must-inverter
substitutions:
inverter_id: inverter
updates: 5s
api_key: xxx
ota_password: xxx
esphome:
name: inverter-monitor
comment: "Inverter monitor"
esp32:
board: esp32dev
framework:
type: esp-idf
wifi:
ssid: !secret wifi_ssid
password: !secret wifi_password
captive_portal:
logger:
level: DEBUG
api:
encryption:
key: ${api_key}
ota:
password: ${ota_password}
uart:
- id: uart_inverter
baud_rate: 19200
tx_pin: GPIO19
rx_pin: GPIO18
stop_bits: 1
parity: NONE
data_bits: 8
debug:
direction: BOTH
dummy_receiver: false
modbus:
- id: modbus_inverter
uart_id: uart_inverter
send_wait_time: 200ms
modbus_controller:
- id: must_inverter
address: 0x04
modbus_id: modbus_inverter
command_throttle: 200ms
setup_priority: -10
update_interval: ${updates}
sensor:
# charger sensors
- platform: modbus_controller
modbus_controller_id: must_inverter
address: 15201
name: "PV Charger Workstate"
register_type: holding
- platform: modbus_controller
modbus_controller_id: must_inverter
address: 15202
name: "PV Charger MPPT state"
register_type: holding
- platform: modbus_controller
modbus_controller_id: must_inverter
address: 15203
name: "PV Charger Charging state"
register_type: holding
- platform: modbus_controller
modbus_controller_id: must_inverter
address: 15205
name: "PV Charger Voltage"
register_type: holding
unit_of_measurement: "V"
accuracy_decimals: 1
icon: mdi:sine-wave
filters:
multiply: 0.1
- platform: modbus_controller
modbus_controller_id: must_inverter
address: 15206
name: "PV Charger Battery voltage"
register_type: holding
unit_of_measurement: "V"
accuracy_decimals: 1
icon: mdi:sine-wave
filters:
multiply: 0.1
- platform: modbus_controller
modbus_controller_id: must_inverter
address: 15207
name: "PV Charger Current"
register_type: holding
unit_of_measurement: "A"
accuracy_decimals: 1
icon: mdi:current-dc
filters:
multiply: 0.1
- platform: modbus_controller
modbus_controller_id: must_inverter
address: 15208
register_type: holding
name: "PV Charger power"
unit_of_measurement: "W"
accuracy_decimals: 1
icon: mdi:flash
- platform: modbus_controller
modbus_controller_id: must_inverter
address: 15209
register_type: holding
name: "PV Charger Radiator temp"
unit_of_measurement: "°C"
accuracy_decimals: 1
icon: mdi:temperature-celsius
# - platform: modbus_controller
# modbus_controller_id: must_inverter
# address: 15210
# register_type: holding
# name: "PV Charger External temp"
# unit_of_measurement: "°C"
# accuracy_decimals: 1
# icon: mdi:temperature-celsius
- platform: modbus_controller
modbus_controller_id: must_inverter
address: 15212
register_type: holding
name: "PV Relay"
icon: mdi:electric-switch
- platform: modbus_controller
modbus_controller_id: must_inverter
address: 15217
register_type: holding
id: charger_total_mwh
internal: true
- platform: modbus_controller
modbus_controller_id: must_inverter
address: 15218
register_type: holding
id: charger_total_kwh
internal: true
filters:
multiply: 0.1
- platform: template
name: "PV Charger Accumulated charger power"
unit_of_measurement: kWh
lambda: !lambda 'return (id(charger_total_mwh).state * 1000.0 + id(charger_total_kwh).state );'
accuracy_decimals: 1
- platform: modbus_controller
modbus_controller_id: must_inverter
address: 15219
register_type: holding
name: "PV Charger Accumulated day"
unit_of_measurement: "W"
accuracy_decimals: 1
icon: mdi:flash
- platform: modbus_controller
modbus_controller_id: must_inverter
address: 15220
register_type: holding
name: "PV Charger Accumulated hour"
unit_of_measurement: "W"
accuracy_decimals: 1
icon: mdi:flash
- platform: modbus_controller
modbus_controller_id: must_inverter
address: 15221
register_type: holding
name: "PV Charger Accumulated minute"
unit_of_measurement: "W"
accuracy_decimals: 1
icon: mdi:flash
# inverter sensors
- platform: modbus_controller
modbus_controller_id: must_inverter
address: 25201
register_type: holding
name: "Inverter Work state"
- platform: modbus_controller
modbus_controller_id: must_inverter
address: 25205
name: "Inverter Battery Voltage"
register_type: holding
unit_of_measurement: "V"
accuracy_decimals: 1
icon: mdi:sine-wave
filters:
multiply: 0.1
- platform: modbus_controller
modbus_controller_id: must_inverter
address: 25206
name: "Inverter Voltage"
register_type: holding
unit_of_measurement: "V"
accuracy_decimals: 1
icon: mdi:sine-wave
filters:
multiply: 0.1
- platform: modbus_controller
modbus_controller_id: must_inverter
address: 25207
name: "Inverter Grid voltage"
register_type: holding
unit_of_measurement: "V"
accuracy_decimals: 1
icon: mdi:sine-wave
filters:
multiply: 0.1
- platform: modbus_controller
modbus_controller_id: must_inverter
address: 25207
name: "Inverter Grid voltage"
register_type: holding
unit_of_measurement: "V"
accuracy_decimals: 1
icon: mdi:sine-wave
filters:
multiply: 0.1
- platform: modbus_controller
modbus_controller_id: must_inverter
address: 25208
name: "Inverter BUS Voltage"
register_type: holding
unit_of_measurement: "V"
accuracy_decimals: 1
icon: mdi:sine-wave
filters:
multiply: 0.1
- platform: modbus_controller
modbus_controller_id: must_inverter
address: 25209
name: "Inverter Control current"
register_type: holding
unit_of_measurement: "A"
accuracy_decimals: 1
icon: mdi:current-dc
filters:
multiply: 0.1
- platform: modbus_controller
modbus_controller_id: must_inverter
address: 25210
name: "Inverter Current"
register_type: holding
unit_of_measurement: "A"
accuracy_decimals: 1
icon: mdi:current-dc
filters:
multiply: 0.1
- platform: modbus_controller
modbus_controller_id: must_inverter
address: 25211
name: "Inverter Grid current"
register_type: holding
unit_of_measurement: "A"
accuracy_decimals: 1
icon: mdi:current-ac
filters:
multiply: 0.1
- platform: modbus_controller
modbus_controller_id: must_inverter
address: 25212
name: "Inverter Load current"
register_type: holding
unit_of_measurement: "A"
accuracy_decimals: 1
icon: mdi:current-ac
filters:
multiply: 0.1
- platform: modbus_controller
modbus_controller_id: must_inverter
address: 25213
name: "Inverter Power"
register_type: holding
unit_of_measurement: "W"
accuracy_decimals: 1
icon: mdi:flash
- platform: modbus_controller
modbus_controller_id: must_inverter
address: 25214
name: "Inverter Grid power"
register_type: holding
unit_of_measurement: "W"
accuracy_decimals: 1
value_type: S_WORD
icon: mdi:flash
- platform: modbus_controller
modbus_controller_id: must_inverter
address: 25215
name: "Inverter Load power"
register_type: holding
unit_of_measurement: "W"
accuracy_decimals: 1
icon: mdi:flash
- platform: modbus_controller
modbus_controller_id: must_inverter
address: 25216
name: "Inverter System load"
register_type: holding
unit_of_measurement: "%"
accuracy_decimals: 1
icon: mdi:flash
# MOST INFO
- platform: modbus_controller
modbus_controller_id: must_inverter
address: 25233
register_type: holding
name: "Inverter AC radiator temp"
accuracy_decimals: 1
unit_of_measurement: "°C"
icon: mdi:temperature-celsius
- platform: modbus_controller
modbus_controller_id: must_inverter
address: 25234
register_type: holding
name: "Inverter Transformer temp"
unit_of_measurement: "°C"
accuracy_decimals: 1
icon: mdi:temperature-celsius
- platform: modbus_controller
modbus_controller_id: must_inverter
address: 25235
register_type: holding
name: "Inverter DC Radiator temp"
unit_of_measurement: "°C"
accuracy_decimals: 1
icon: mdi:temperature-celsius
- platform: modbus_controller
modbus_controller_id: must_inverter
address: 25237
register_type: holding
name: "Inverter Relay state"
icon: mdi:electric-switch
- platform: modbus_controller
modbus_controller_id: must_inverter
address: 25238
register_type: holding
name: "Inverter Relay state Grid"
icon: mdi:electric-switch
- platform: modbus_controller
modbus_controller_id: must_inverter
address: 25239
register_type: holding
name: "Inverter Relay state Load"
icon: mdi:electric-switch
- platform: modbus_controller
modbus_controller_id: must_inverter
address: 25240
register_type: holding
name: "Inverter Relay state NLine"
icon: mdi:electric-switch
- platform: modbus_controller
modbus_controller_id: must_inverter
address: 25241
register_type: holding
name: "Inverter Relay state DC"
icon: mdi:electric-switch
- platform: modbus_controller
modbus_controller_id: must_inverter
address: 25242
register_type: holding
name: "Inverter Relay state Earth"
icon: mdi:electric-switch
# Inverter Accumulated discharge power
- platform: modbus_controller
modbus_controller_id: must_inverter
address: 25247
register_type: holding
id: discharger_total_mwh
internal: true
- platform: modbus_controller
modbus_controller_id: must_inverter
address: 25248
register_type: holding
id: discharger_total_kwh
internal: true
filters:
multiply: 0.1
- platform: template
name: "Accumulated discharger power"
unit_of_measurement: kWh
accuracy_decimals: 1
lambda: !lambda 'return (id(discharger_total_mwh).state * 1000.0 + id(discharger_total_kwh).state);'
# Inverter Accumulated buy power
- platform: modbus_controller
modbus_controller_id: must_inverter
address: 25249
register_type: holding
id: buy_mwh
internal: true
- platform: modbus_controller
modbus_controller_id: must_inverter
address: 25250
register_type: holding
id: buy_kwh
internal: true
filters:
multiply: 0.1
- platform: template
name: "Accumulated buy power"
unit_of_measurement: kWh
lambda: |-
return (id(buy_mwh).state * 1000.0 + id(buy_kwh).state);
accuracy_decimals: 1
# Inverter Accumulated sell power
- platform: modbus_controller
modbus_controller_id: must_inverter
address: 25251
register_type: holding
id: sell_mwh
- platform: modbus_controller
modbus_controller_id: must_inverter
address: 25252
register_type: holding
id: sell_kwh
filters:
multiply: 0.1
- platform: template
name: "Accumulated sell power"
unit_of_measurement: kWh
accuracy_decimals: 1
lambda: !lambda return (id(sell_mwh).state * 1000.0 + id(sell_kwh).state);
# Inverter Accumulated load power
- platform: modbus_controller
modbus_controller_id: must_inverter
address: 25253
register_type: holding
id: load_mwh
internal: True
- platform: modbus_controller
modbus_controller_id: must_inverter
address: 25254
register_type: holding
id: load_kwh
internal: True
filters:
multiply: 0.1
- platform: template
name: "Accumulated load power"
unit_of_measurement: kWh
accuracy_decimals: 1
lambda: !lambda return (id(load_mwh).state * 1000.0 + id(load_kwh).state);
- platform: modbus_controller
modbus_controller_id: must_inverter
address: 25273
register_type: holding
value_type: S_WORD
name: "Inverter Battery power"
unit_of_measurement: "W"
accuracy_decimals: 1
icon: mdi:flash
- platform: modbus_controller
modbus_controller_id: must_inverter
address: 25274
register_type: holding
value_type: S_WORD
name: "Inverter Battery current"
unit_of_measurement: "A"
accuracy_decimals: 1
icon: mdi:current-dc
- platform: modbus_controller
modbus_controller_id: must_inverter
address: 25275
register_type: holding
value_type: S_WORD
name: "Inverter Battery grade"
unit_of_measurement: "V"
icon: mdi:alpha-V
- platform: modbus_controller
modbus_controller_id: must_inverter
address: 25277
register_type: holding
name: "Inverter Rated power"
unit_of_measurement: "W"
accuracy_decimals: 1
icon: mdi:flash
select:
- platform: modbus_controller
modbus_controller_id: must_inverter
id: energy_use_mode
name: "Inverter Energy use mode (parameter 00)"
address: 20109
optionsmap:
"SBU (Solar/battery/utility)": 1
"SUB (Solar/utility/battery)": 2
"UTI (Utility only)": 3
"SOL (Solar only)": 4
- platform: modbus_controller
modbus_controller_id: must_inverter
id: charger_source_priority
name: "Inverter Charger source priority (parameter 10)"
address: 20143
optionsmap:
"CSO (Solar first)": 0
"SNU (Solar and utility)": 2
"OSO (Solar only)": 3
- platform: modbus_controller
modbus_controller_id: must_inverter
address: 20111
id: inverter_ac_input_voltage_range
name: "Inverter AC input voltage range (02)"
optionsmap:
"VDE (184-253VAC)": 0
"UPS (170-280VAC)": 1
"APL (90-280VAC)": 2
"GEN (Generator)": 3
number:
- platform: modbus_controller
id: batt_float_voltage
name: "PV Charger Float voltage"
unit_of_measurement: "V"
address: 10103
value_type: U_WORD
multiply: 10
- platform: modbus_controller
id: batt_absorb_voltage
name: "PV Charger Absorb voltage"
unit_of_measurement: "V"
address: 10104
value_type: U_WORD
multiply: 10
- platform: modbus_controller
id: batt_stop_dischg
name: "Inverter Battery stop discharging voltage"
unit_of_measurement: "V"
address: 20118
value_type: U_WORD
lambda: "return x * 0.1; "
write_lambda: |-
return x * 10 ;
- platform: modbus_controller
id: batt_stop_chg
name: "Inverter Battery stop charging voltage"
unit_of_measurement: "V"
address: 20119
value_type: U_WORD
multiply: 10
- platform: modbus_controller
id: batt_low_voltage
name: "Inverter Battery low voltage"
unit_of_measurement: "V"
address: 20127
value_type: U_WORD
multiply: 10
- platform: modbus_controller
id: batt_high_voltage
name: "Inverter Battery high voltage"
unit_of_measurement: "V"
address: 20128
value_type: U_WORD
multiply: 10
- platform: modbus_controller
id: solar_charger_current
name: "Inverter Charger current"
unit_of_measurement: "A"
address: 20132
value_type: U_WORD
multiply: 10
@sbvp
Copy link

sbvp commented Dec 30, 2024

Може щось таке

Хто зна, може...
Треба буде якось перевірити. А зараз вдалося заставити це все працювати іншим чином.
Все запрацювало, коли я прописав інші піни для RX/TX - GPIO13/GPIO12 відповідно. Не знаю поки чому так. Причому з усіма перехідниками, навіть самопальними.
Я новачок в темі ESPHome і ці платки D1mini використовую вперше. Пробував також ставити UART на GPIO13/15, але всеодно не працювало...
Припускаю, що можливо модулі ЕСП8266 мої якісь занадто китайські, бо при детальному огляді помітно, що на них менше деталей (резисторів/конденсаторів) чим на зразках, що використовують автори...

@goblinmaks
Copy link

Схоже просто не вимкнули логування і воно ср@ло в 13/15 піни, або tx/rx переплутано.

@sergey777s
Copy link

Screenshot_2025-01-03-20-57-09-771_io homeassistant companion android
Давно хотів спитати, в мене must 48100 батарея і багато разів на день вмикається зарядка з 53в до 56-57в піднімається за пів години, далі за пів години спускається до 53.4в далі години 3-4 розряжається 1 ампером і знову входить в зарядку, інвертор must 5248 pro підключений по can, як це виправить та що з ним не так?

@vladyspavlov
Copy link
Author

Давно хотів спитати, в мене must 48100 батарея і багато разів на день вмикається зарядка з 53в до 56-57в піднімається за пів години, далі за пів години спускається до 53.4в далі години 3-4 розряжається 1 ампером і знову входить в зарядку, інвертор must 5248 pro підключений по can, як це виправить та що з ним не так?

vladyspavlov/esphome-must-inverter#12
Тут це описав. Можете там доповнювати)

Якщо коротко, то в режимі VOL - ніяк. Єдине, що можна зробити - знизити струм заряду до 2-3А, тоді це трохи змаже тактування, проблему не вирішить, але воно буде більш розтягнуте в часі.

Якщо у вас маст батарейка по кану підключена, то поміняйте 37 параметр на SOC. Воно працює адекватно в плані алгоритму заряду, немає тактування. Однак в моєму випадку з інверторною jk воно взагалі не слухається RCV і RFV налаштувань і заряджає як йому заманеться, так і не зміг ніяк впливати на це. Підтримка маста розвела руками, сказала проблема в бмс. Можливо у вас з рідним акумом воно буде адекватно працювати.

@sergey777s
Copy link

поміняйте 37 параметр на SOC.

Там встановлено soc і на морді інвертора 100 % це може бути як 56в так і 54в так і 53,4 іноді 53.4 - це 80%, взагалі це нормально що батарея заряджена до 55в за пів години спускається до 53.4в наприклад? Я знайшов рідну прогу до батареї, і пароль адміна але ніде не має змінити вольтаж що екран батареї називає charge requirements може в bms якось змінити щоб було не 57.6 і плавающий 56.6 а на 54 до прикладу щоб заряд хочаб підтримувався на одному рівні а не різ в гору до 57в пів години і пів години спускався до 53.4в?

@vladyspavlov
Copy link
Author

взагалі це нормально що батарея заряджена до 55в за пів години спускається до 53.4в наприклад?

Для LFP нормально, напруга відкочується, якщо не підзаряджати постійно, це не впливає на ємність, якщо не рахувати саморозряд.
Стосовно 53.4В, то або флоат напруга десь нижче в них налаштована, або її взагалі немає і комірки просто на саморозряді повільному з бмскою живуть. Якось інших пояснень в мене не знайшлось.

а не різ в гору до 57в пів години і пів години спускався до 53.4в?

У мене з jk завжди були як раз 57В балк і 53.4В флоат, виходить, то не проблема в реалізації протоколу на бмс, якщо з "рідним" акумом така ж біда.

але ніде не має змінити вольтаж що екран батареї називає charge requirements

+8613302843818, то підтримка Must в WhatsApp, можете попробувати їх помучити. Але краще не показуйте їм скріншоти з ХА і нічого не кажіть про моніторинг не рідним модулем. Це, схоже, розрив шаблону для них і вони починають задавати дурні питання не по темі, забуваючи про суть. Будьте готові записувати купу відео екрану бмс і інвертора з проклацуванням всіх "екранів" і налаштувань. Готуйтесь, що це затягнеться на декілька днів. Ну і зважайте, що вони відписують орієнтовно з 3-4 ранку до 11-12 дня по Києву.

@goblinmaks
Copy link

goblinmaks commented Jan 3, 2025

Чомусь саме pro шка живиться від батареї, а не з мережі навіть коли вона є, підключено по can і використовується SOC

@sergey777s
Copy link

У мене з jk завжди були

Всередині там pace bms, самого першого разу вона стягнула прошивку відтоді пропали назви протоколів обміну зараз чисті рядки, на швидкість не впливає але нові прошивки не злітають, а на інвертор попадаются якісь прошивки?

@sergey777s
Copy link

Чомусь

Так і гуде зараза постійно

@sergey777s
Copy link

І що в paceex bms означають параметри entering test mode i entering distribution network mode?

@vladyspavlov
Copy link
Author

vladyspavlov commented Jan 3, 2025

а на інвертор попадаются якісь прошивки?

Першочергово до них з цим запитом звернувся, але звернули в сторону налаштувань, а потім і до того, що все ок.

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

@sergeysaley
Copy link

sergeysaley commented Jan 5, 2025

Виявляється вся основна проблема якраз в цих конверторах USB-RS485/TTL-RS485, а саме в способі генерування сигналу "TXEnable" на мікросхемі MAX485 (чи її аналог).

Гляньте сюди, можливо допоможе вам. vladyspavlov/esphome-must-inverter#9

Конкретно той варіант не допоміг, не працює і все... Хоча як я зрозумів, то там із відмінностей тільки flow_control_pin:

У мене все запрацювало в порту USB WiFi. Згідно опису https://github.com/vladyspavlov/esphome-must-inverter

Нюанси:

  1. Між USB та RS485-TTL залишив тільки A+ і B-. GND прибрав.
  2. Переробив шнурок між інвертором і батареєю - там був повний патчкод з відведеною парою orange-white, orange (TIA/EIA568B).
    Зробив новий шнурок, в якому залишив лише GND (green-white), CANH (blue) та CANL(blue-white).
    В документації на батарею нічого не сказано про інші контакти в RJ45 для CAN, але є підозра, що щось там є і це щось потрапляло в RS485, що давало численні CRC error та Timeout в D+ і D- в порту USB WiFi

Конфигурація ESPHome для ESP32 NodeMCU - моя з https://github.com/vladyspavlov/esphome-must-inverter

Все працює штатно.

PS: Залишилось знайти рішення для корпусу, в який можна охайно розташувати esp32, rs485-ttl та USB-A male, і який буде не дуже колгоспно виглядати :)

@goblinmaks
Copy link

Виявляється вся основна проблема якраз в цих конверторах USB-RS485/TTL-RS485, а саме в способі генерування сигналу "TXEnable" на мікросхемі MAX485 (чи її аналог).

Гляньте сюди, можливо допоможе вам. vladyspavlov/esphome-must-inverter#9

Конкретно той варіант не допоміг, не працює і все... Хоча як я зрозумів, то там із відмінностей тільки flow_control_pin:

У мене все запрацювало в порту USB WiFi. Згідно опису https://github.com/vladyspavlov/esphome-must-inverter

Нюанси:

  1. Між USB та RS485-TTL залишив тільки A+ і B-. GND прибрав.
  2. Переробив шнурок між інвертором і батареєю - там був повний патчкод з відведеною парою orange-white, orange (TIA/EIA568B).
    Зробив новий шнурок, в якому залишив лише GND (green-white), CANH (blue) та CANL(blue-white).
    В документації на батарею нічого не сказано про інші контакти в RJ45 для CAN, але є підозра, що щось там є і це щось потрапляло в RS485, що давало численні CRC error та Timeout в D+ і D- в порту USB WiFi

Конфигурація ESPHome для ESP32 NodeMCU - моя з https://github.com/vladyspavlov/esphome-must-inverter

Все працює штатно.

PS: Залишилось знайти рішення для корпусу, в який можна охайно розташувати esp32, rs485-ttl та USB-A male, і який буде не дуже колгоспно виглядати :)

Я використовую коробки від тік таку для таких рішень :)

20250106_122803

@sergeysaley
Copy link

sergeysaley commented Jan 6, 2025

Виявляється вся основна проблема якраз в цих конверторах USB-RS485/TTL-RS485, а саме в способі генерування сигналу "TXEnable" на мікросхемі MAX485 (чи її аналог).

Гляньте сюди, можливо допоможе вам. vladyspavlov/esphome-must-inverter#9

Конкретно той варіант не допоміг, не працює і все... Хоча як я зрозумів, то там із відмінностей тільки flow_control_pin:

У мене все запрацювало в порту USB WiFi. Згідно опису https://github.com/vladyspavlov/esphome-must-inverter
Нюанси:

  1. Між USB та RS485-TTL залишив тільки A+ і B-. GND прибрав.
  2. Переробив шнурок між інвертором і батареєю - там був повний патчкод з відведеною парою orange-white, orange (TIA/EIA568B).
    Зробив новий шнурок, в якому залишив лише GND (green-white), CANH (blue) та CANL(blue-white).
    В документації на батарею нічого не сказано про інші контакти в RJ45 для CAN, але є підозра, що щось там є і це щось потрапляло в RS485, що давало численні CRC error та Timeout в D+ і D- в порту USB WiFi

Конфигурація ESPHome для ESP32 NodeMCU - моя з https://github.com/vladyspavlov/esphome-must-inverter
Все працює штатно.
PS: Залишилось знайти рішення для корпусу, в який можна охайно розташувати esp32, rs485-ttl та USB-A male, і який буде не дуже колгоспно виглядати :)

Я використовую коробки від тік таку для таких рішень :)

Чудове рішення!
Пішов за тіктаком

@sergeysaley
Copy link

sergeysaley commented Jan 7, 2025

Знімок екрана 2025-01-07 о 10 56 54

Тіктак рулить :)

@goblinmaks
Copy link

uart->rs в термоусадку ще засунув, що б ніде не коротнув

@sergeysaley
Copy link

uart->rs в термоусадку ще засунув, що б ніде не коротнув

Він на скотчі. Не коротне )

@sergey777s
Copy link

Тиктак рулит :)

IMG_20250107_110520
А я не нашёл тиктак)

@sbvp
Copy link

sbvp commented Feb 6, 2025

Виявляється вся основна проблема якраз в цих конверторах USB-RS485/TTL-RS485, а саме в способі генерування сигналу "TXEnable" на мікросхемі MAX485 (чи її аналог).

Гляньте сюди, можливо допоможе вам. vladyspavlov/esphome-must-inverter#9

Конкретно той варіант не допоміг, не працює і все... Хоча як я зрозумів, то там із відмінностей тільки flow_control_pin:

У мене все запрацювало в порту USB WiFi. Згідно опису https://github.com/vladyspavlov/esphome-must-inverter

Нюанси:

1. Між USB та RS485-TTL залишив тільки A+ і B-. GND прибрав.

2. Переробив шнурок між інвертором і батареєю - там був повний патчкод з відведеною парою orange-white, orange (TIA/EIA568B).
   Зробив новий шнурок, в якому залишив лише GND (green-white), CANH (blue) та CANL(blue-white).
   _В документації на батарею нічого не сказано про інші контакти в RJ45 для CAN, але є підозра, що щось там є і це щось потрапляло в RS485, що давало численні CRC error та Timeout в D+ і D- в порту USB WiFi_

Конфигурація ESPHome для ESP32 NodeMCU - моя з https://github.com/vladyspavlov/esphome-must-inverter

Все працює штатно.

PS: Залишилось знайти рішення для корпусу, в який можна охайно розташувати esp32, rs485-ttl та USB-A male, і який буде не дуже колгоспно виглядати :)

Ну, в мене батарея проста, ніяк не спілкується з інвертором, тож і перешкод немає ніяких від неї...
Гадаю, що все ж косяк із модулями 8266 в моєму випадку..
А для звязку по RS485 якраз тільки а+ і в- потрібно... GND то для живлення (ну і +5в)

@sbvp
Copy link

sbvp commented Feb 6, 2025

0-02-05-adae623044369358265d3da65b19f31b7b89411cae821c2761ecfc7f62c40f95_5b87c128cad98e6f
0-02-05-353a346a88e272331199bdc4a50fc86bbb978beb628717d66d019c2233588c24_c3f01963ba06ca4a
Тимчасовий варіант)))

@hunterelectros
Copy link

Всім привіт! А поясніть будь-ласка (може де не побачив чи пропустив) чому на всіх схемах і фото бачу що підключаються і знімають дані із USB-A (куди зазвичай включається рідний Wi-Fi свисток). А чим не підходить USB-B порт, що поряд із COM-виходом?

@sbvp
Copy link

sbvp commented Apr 1, 2025

Всім привіт! А поясніть будь-ласка (може де не побачив чи пропустив) чому на всіх схемах і фото бачу що підключаються і знімають дані із USB-A (куди зазвичай включається рідний Wi-Fi свисток). А чим не підходить USB-B порт, що поряд із COM-виходом?

Вітаю!
Та підходить і він, але тільки для прямого підєднання до хоста (ПК) через ЮСБ-кабель, а це до 5м пасивним і 10-15м активним кабелем. Додатково ще захист від перешкод та імпульсних наводок...
Таким чином він підходить якщо сервер НА поряд біля інвертора, ну і доповнення потрібно інше (не ЕСПХоме)...
Там один і той же інтерфейс, що й СОМ чи Вай-Фай, просто через конвертер на СН340. Якось так...

@hunterelectros
Copy link

Ага, зрозумів. Просто в основний USB-A порт в мене підключений нативний Wi-Fi свисток. Нехай вже там і буде, у хмарі малює якісь дані. А от для себе (по інженерськи:-)) хотілося б більше даних витягувати (і у Grafana дивитись), тому в USB-B порт чи COM порт підключу якусь ESP через конвертер і буду пробувати вичитати дані.

@sbvp
Copy link

sbvp commented Apr 2, 2025

Ага, зрозумів. Просто в основний USB-A порт в мене підключений нативний Wi-Fi свисток. Нехай вже там і буде, у хмарі малює якісь дані. А от для себе (по інженерськи:-)) хотілося б більше даних витягувати (і у Grafana дивитись), тому в USB-B порт чи COM порт підключу якусь ESP через конвертер і буду пробувати вичитати дані.

Задумка хороша, але мені здається. що так не вийде...
Справа в тому. що обмін даними на всіх трьох портах дублюється (на скільки я визначив, принаймні в моєму випадку саме так). Таким чином потрібно обирати щось одне, бо інакше вони заважатимуть одне одному - вони зєднані одним і тим же UART процесора. Можна хіба що моніторити, тобто прослуховувати в режимі R/O що "відбувається" на лінії, коли йде обмін між адаптером і інвертором...

@hunterelectros
Copy link

Спробую.... Якщо таки не вийде - тоді доведеться рідний Wi-Fi модуль зняти...:( Жаль що прямо через нього не можна якось знімати якісь дані (наскільки я зрозумів).

@sergeysaley
Copy link

Ага, зрозумів. Просто в основний USB-A порт в мене підключений нативний Wi-Fi свисток. Нехай вже там і буде, у хмарі малює якісь дані. А от для себе (по інженерськи:-)) хотілося б більше даних витягувати (і у Grafana дивитись), тому в USB-B порт чи COM порт підключу якусь ESP через конвертер і буду пробувати вичитати дані.

Якщо Ви готові посеред ночі прокидатися від істерики в телефоні про 100500 помилок (в т.ч. і критичних) - то пробуйте )
Одна шина rs485 - один майстер. При паралельному опитуванні шини конфлікти будуть. Періодично, не дуже часто (бо логгер опитує шину досить розслаблено і оновлює дані раз на 5 хвилин, якщо я не помиляюсь), але гарантовано. І якщо в процесі опитування шини щось не склалося, то починається істерика з генерацією 10-15 повідомлень в телефон.

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

  1. Локальність моніторингу і управління поза будь-якою залежністю від чужих сервісів та інтернета взагалі.
  2. Гнучкість налаштувань і повна підконтрольність мого обладнання мені, а не якимсь невідомим китайцям.
  3. Легкість вирішення будь-яких проблем (opensource код і швидка адаптація під потреби, що можуть змінюватись з часом і обставинами.

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

@sergeysaley
Copy link

Всім привіт! А поясніть будь-ласка (може де не побачив чи пропустив) чому на всіх схемах і фото бачу що підключаються і знімають дані із USB-A (куди зазвичай включається рідний Wi-Fi свисток). А чим не підходить USB-B порт, що поряд із COM-виходом?

Тому що в USB-B немає +5V та GND (принаймні в моєму Must PV19 6248 EXP). А хочеться ж живлення брати із порта, а не тягнути окремий шнурок від БЖ в розетці ))

@hunterelectros
Copy link

Всім привіт! А поясніть будь-ласка (може де не побачив чи пропустив) чому на всіх схемах і фото бачу що підключаються і знімають дані із USB-A (куди зазвичай включається рідний Wi-Fi свисток). А чим не підходить USB-B порт, що поряд із COM-виходом?

Тому що в USB-B немає +5V та GND (принаймні в моєму Must PV19 6248 EXP). А хочеться ж живлення брати із порта, а не тягнути окремий шнурок від БЖ в розетці ))

Це вже я теж зрозумів, дякую:)

@hunterelectros
Copy link

Ага, зрозумів. Просто в основний USB-A порт в мене підключений нативний Wi-Fi свисток. Нехай вже там і буде, у хмарі малює якісь дані. А от для себе (по інженерськи:-)) хотілося б більше даних витягувати (і у Grafana дивитись), тому в USB-B порт чи COM порт підключу якусь ESP через конвертер і буду пробувати вичитати дані.

Якщо Ви готові посеред ночі прокидатися від істерики в телефоні про 100500 помилок (в т.ч. і критичних) - то пробуйте ) Одна шина rs485 - один майстер. При паралельному опитуванні шини конфлікти будуть. Періодично, не дуже часто (бо логгер опитує шину досить розслаблено і оновлює дані раз на 5 хвилин, якщо я не помиляюсь), але гарантовано. І якщо в процесі опитування шини щось не склалося, то починається істерика з генерацією 10-15 повідомлень в телефон.

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

  1. Локальність моніторингу і управління поза будь-якою залежністю від чужих сервісів та інтернета взагалі.
  2. Гнучкість налаштувань і повна підконтрольність мого обладнання мені, а не якимсь невідомим китайцям.
  3. Легкість вирішення будь-яких проблем (opensource код і швидка адаптація під потреби, що можуть змінюватись з часом і обставинами.

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

Дякую за розширену відповідь. Поспішив я з покупкою Wi-Fi модуля.... Ну ладно, нехай буде в запасі:)

@1Nikolay
Copy link

1Nikolay commented Apr 5, 2025

Привіт !
Хочу поділитися інформацією. Мені вдалось знайти регістр SOC батареї.
Я використовую : MUST PH18 5448 pro + jk bms JK-PB2A16S20P Інвертор спілкується з батарею по протоколу CAN Pylontech.
Відсотки SOC батареї що відображаються на інверторі можна знайти у регістрі 44180 - це пряме значення.
Для додавання датчика використана конфігурація:

  • platform: modbus_controller # Battery SOC MUST PH18 5448 PRO + CAN battery PYLON tech

name: "Battery SOC"
register_type: holding
address: 44180
unit_of_measurement: "%"
accuracy_decimals: 0
device_class: battery
value_type: U_WORD

PS: Я думаю що це буде стосуватися інверторів серії PH18 PV18 може хто підтвердить ЩЕ ?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment