EspHome Epever RS485 modbus

Fotovoltaická elektrárna (solární park, solární farma, solární elektrárna) a Home Assistant.
Photovoltaic power station (solar park, solar farm, solar power plant) & Home Assistant.
Odpovědět
Plazivec
Aktivní autor
Aktivní autor
Příspěvky: 61
Registrován: 04. červenec 2022, 23:32
Dal poděkování: 10 poděkování
Dostal poděkování: 1 poděkování

EspHome Epever RS485 modbus

Příspěvek od Plazivec »

Zdarec. Jelikož už mám FVE téměř hotovou, ve zkušebním provozu, potřebuju vytáhnout data ze třech Epever regulátorů. Mám koupenej a funkční modul od Colina Hickeyho, který funguje s jeho .bin firmvérem. Ten by se měl umět napíchnout na mosquito, což mě na první ránu nejede.
Ale touhle cestou stejně nechci jít, chci sestavit další dva vlastní kousky z nodemcu a převodníků, kterých mám doma několik. Pokoušel jsem se o zfunkčnění originál USB kabelu Epever to PC HA, ale je tam problém s driverem XRUSB, který je potřeba do PC doinstalovat a pak následně vypnout funkci cdc-adm, což mi vyřadí USB wifi dongle a HA zůstane bez spojení a to je, samozřejmě, nesmysl. Mám i USB RS485 CH340 převodník, ale tudy také cesta jaksi nevedla.
CHci se zeptat, jestli jste to někdo neřešil a jak. Mám už nějakou cestu nastíněnou a pomalu s tím pracuju, ale jelikož jsem python objevil doslova předevčírem tak to zatím okousávám.
Pokud by se našel někdo, kdo to vyřešil kabelem, nebo by mě s tím pomoh, bylo by to asi nejlepší.
Jinak budu muset pokračovat přes EspHome, což sice obvykle přináší problémy s napájením, ale v tomhle případě lze použít napájení z Epevru přes RJ45.

Zátiší:
zatisi.jpg
Od každého mám víc kusů.
Naposledy upravil(a) Plazivec dne 08. červenec 2022, 00:32, celkem upraveno 1 x.

Plazivec
Aktivní autor
Aktivní autor
Příspěvky: 61
Registrován: 04. červenec 2022, 23:32
Dal poděkování: 10 poděkování
Dostal poděkování: 1 poděkování

Re: EspHome Epever RS485 modbus

Příspěvek od Plazivec »

Vidím, že se nikdo nechytnul, tak konkrétní dotaz.
Pokouším se přizpůsobit ten kód pro moje podmínky a první věc:

Kód: Vybrat vše

time:
  - platform: sntp
    id: sntp_time
    timezone: "CET-1CEST,M3.5.0,M10.5.0/3"
    servers: "de.pool.ntp.org"
Je to dobře to časové pásmo?

Další vec je hláška file editoru "expected float na předposlední řádce:

Kód: Vybrat vše

substitutions:
  updates: 30s
  name: solarstation-x

esphome:
  name: ${name}
  platformio_options:
    ## larger stack size required with all registers enable_load_test
    ## reduce registers or wait for integration of 2.0.0 arduinoespressif32
    ## not yet working needs 2.0
    build_flags:
      - -DCONFIG_ARDUINO_LOOP_STACK_SIZE=32768

  on_boot:
    ## configure controller settings at setup
    ## make sure priority is lower than setup_priority of modbus_controller
    priority: -100
    then:
      - lambda: |-
          // get local time and sync to controller
          time_t now = ::time(nullptr);
          struct tm *time_info = ::localtime(&now);
          int seconds = time_info->tm_sec;
          int minutes = time_info->tm_min;
          int hour = time_info->tm_hour;
          int day = time_info->tm_mday;
          int month = time_info->tm_mon + 1;
          int year = time_info->tm_year % 100;
          esphome::modbus_controller::ModbusController *controller = id(epever);
          // if there is no internet connection localtime returns year 70
          if (year != 70) {
            // create the payload
            std::vector<uint16_t> rtc_data = {uint16_t((minutes << 8) | seconds), uint16_t((day << 8) | hour),
                                              uint16_t((year << 8) | month)};
            // Create a modbus command item with the time information as the payload
            esphome::modbus_controller::ModbusCommandItem set_rtc_command =
                esphome::modbus_controller::ModbusCommandItem::create_write_multiple_command(controller, 0x9013, 3, rtc_data);
            // Submit the command to the send queue
            epever->queue_command(set_rtc_command);
            ESP_LOGI("ModbusLambda", "EPSOLAR RTC set to %02d:%02d:%02d %02d.%02d.%04d", hour, minutes, seconds, day, month,
                    year + 2000);
          }
          // Battery settings
          // Note: these values are examples only and apply my AGM Battery
          std::vector<uint16_t> battery_settings1 = {
              0,       // 9000 Battery Type 0 =  User
              0x0073,  // 9001 Battery Cap 0x55 == 115AH
              0x012C,  // 9002 Temp compensation -3V /°C/2V
              0x05DC,  // 9003 0x5DC == 1500 Over Voltage Disconnect Voltage 15,0
              0x058C,  // 9004 0x58C == 1480 Charging Limit Voltage 14,8
              0x058C,  // 9005 Over Voltage Reconnect Voltage 14,8
              0x05BF,  // 9006 Equalize Charging Voltage 14,6
              0x05BE,  // 9007 Boost Charging Voltage 14,7
              0x0550,  // 9008 Float Charging Voltage 13,6
              0x0528,   // 9009 Boost Reconnect Charging Voltage 13,2
              0x04C4,  // 900A Low Voltage Reconnect Voltage 12,2
              0x04B0,  // 900B Under Voltage Warning Reconnect Voltage 12,0
              0x04BA,  // 900c Under Volt. Warning Volt 12,1
              0x04BA,  // 900d Low Volt. Disconnect Volt. 11.8
              0x04BA   // 900E Discharging Limit Voltage 11.8
          };

          // Boost and equalization periods
          std::vector<uint16_t> battery_settings3 = {
              0x0000,  // 906B Equalize Duration (min.) 0
              0x0075   // 906C Boost Duration (aka absorb) 117 mins
          };
          esphome::modbus_controller::ModbusCommandItem set_battery1_command =
              esphome::modbus_controller::ModbusCommandItem::create_write_multiple_command(controller, 0x9000, battery_settings1.size() ,
                                                                                          battery_settings1);
          //   esphome::modbus_controller::ModbusCommandItem set_battery2_command =
          //   esphome::modbus_controller::ModbusCommandItem::create_write_multiple_command(controller, 0x900A, battery_settings2.size() ,
          //                                                                              battery_settings2);

          esphome::modbus_controller::ModbusCommandItem set_battery3_command =
              esphome::modbus_controller::ModbusCommandItem::create_write_multiple_command(controller, 0x906B, battery_settings3.size(),
                                                                                          battery_settings3);
          delay(200) ;
          controller->queue_command(set_battery1_command);
          delay(200) ;
          // controller->queue_command(set_battery2_command);
          // delay(200) ;
          controller->queue_command(set_battery3_command);
          ESP_LOGI("ModbusLambda", "EPSOLAR Battery set");

esp32:
  board: pico32
  framework:
    type: arduino
    version: latest

wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password
  manual_ip:
    static_ip: 192.168.1.180
    gateway: 192.168.1.2
    subnet: 255.255.255.0

time:
  - platform: sntp
    id: sntp_time
    timezone: "CET-1CEST,M3.5.0,M10.5.0/3"
    servers: "de.pool.ntp.org"

# Enable logging
logger:
  level: INFO

# Enable Home Assistant API
api:
  reboot_timeout: 0s
A také nerozumím, proč je místo nastavení hesla pro api použito: "reboot_timeout: 0"

Uživatelský avatar
Pete30
Moderátor
Moderátor
Příspěvky: 3333
Registrován: 30. září 2020, 20:33
Dal poděkování: 172 poděkování
Dostal poděkování: 364 poděkování

Re: EspHome Epever RS485 modbus

Příspěvek od Pete30 »

K tomu prvnímu: tam se nedá použít čas z HA ?

Kód: Vybrat vše

time:
  - platform: homeassistant
    id: xyz
Lambda, ! není problém spíš to vidím na špatný zápis nebo syntaxe.
Naformátuj ten kód takto není možné zjistit jestli je to dobře odsazené :?
Co vidím na kódu teď že je to špatně.
Pokud nejsem přítomen tak jsem na rybách ;)

Uživatelský avatar
Pete30
Moderátor
Moderátor
Příspěvky: 3333
Registrován: 30. září 2020, 20:33
Dal poděkování: 172 poděkování
Dostal poděkování: 364 poděkování

Re: EspHome Epever RS485 modbus

Příspěvek od Pete30 »

U api heslo není podmínka jen bonus.
Nastavením reboot na 0 ignoruje restart při odpojení klienta, defaultně je v esp nastaveno 15 min
Pokud nejsem přítomen tak jsem na rybách ;)

Uživatelský avatar
Pete30
Moderátor
Moderátor
Příspěvky: 3333
Registrován: 30. září 2020, 20:33
Dal poděkování: 172 poděkování
Dostal poděkování: 364 poděkování

Re: EspHome Epever RS485 modbus

Příspěvek od Pete30 »

V kódu toho máš část a řešíš chyby ;)
Nemáš uart, modbus, modbus controller a další.
Proč nepostupuješ podle tohoto postupu, který je vyzkoušen a až to rozjedeš můžeš to upravovat podle svého:
https://esphome.io/cookbook/tracer-an.html
Pokud nejsem přítomen tak jsem na rybách ;)

Plazivec
Aktivní autor
Aktivní autor
Příspěvky: 61
Registrován: 04. červenec 2022, 23:32
Dal poděkování: 10 poděkování
Dostal poděkování: 1 poděkování

Re: EspHome Epever RS485 modbus

Příspěvek od Plazivec »

Pete30 píše: 08. červenec 2022, 01:09 V kódu toho máš část a řešíš chyby ;)
Nemáš uart, modbus, modbus controller a další.
Proč nepostupuješ podle tohoto postupu, který je vyzkoušen a až to rozjedeš můžeš to upravovat podle svého:
https://esphome.io/cookbook/tracer-an.html
No dyť podle toho postupuju, to je to samý a jsou tam ty samý chybky.
expected float.png

Plazivec
Aktivní autor
Aktivní autor
Příspěvky: 61
Registrován: 04. červenec 2022, 23:32
Dal poděkování: 10 poděkování
Dostal poděkování: 1 poděkování

Re: EspHome Epever RS485 modbus

Příspěvek od Plazivec »

No to mě po...drž. vyřešeno. nakonec jsem to zkusil podle jednoduššího návodu, který mě kdysy dávno také nešel. Pro jistotu to sem hodím, kdyby někdo něco podobného řešil.
Všimněte si jak jsou definovány TX a RX v UART. V tom byl problém, já je zapojoval do kříže a vono to má být rovně. Něchtělo se mi to přeletovávat, tak jsem to prohodil v yamlu a flešnul přes OTA a těpic, vono to najelo!

Kód: Vybrat vše

esphome:
  name: epever-zapad

esp8266:
  board: nodemcuv2

# Enable logging
logger:
  level: INFO
  baud_rate: 0

# Enable Home Assistant API
api:
  password: "vašehesloAPI"

ota:
  password: "vašhesloOTA"

wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password
  manual_ip:
    static_ip: va.še.ip.adresa
    gateway: 192.168.1.2
    subnet: 255.255.255.0

  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: "epever-zapad"
    password: "pinoccio"

captive_portal:

web_server:
  port: 80

uart:
  id: mod_bus
  tx_pin: RX
  rx_pin: TX
  baud_rate: 115200
  stop_bits: 1

modbus:
  flow_control_pin: 5
  id: modbus1

modbus_controller:
  - id: epever
    ## the Modbus device addr
    address: 0x1
    modbus_id: modbus1
    setup_priority: -10

sensor:
  - platform: modbus_controller
    modbus_controller_id: epever
    id: pv_input_voltage
    name: "PV array input voltage"
    address: 0x3100
    unit_of_measurement: "V" ## for any other unit the value is returned in minutes
    register_type: read
    value_type: U_WORD
    accuracy_decimals: 1
    filters:
      - multiply: 0.01

  - platform: modbus_controller
    modbus_controller_id: epever
    id: pv_input_current
    name: "PV array input current"
    address: 0x3101
    unit_of_measurement: "A" ## for any other unit the value is returned in minutes
    register_type: read
    value_type: U_WORD
    accuracy_decimals: 2
    filters:
      - multiply: 0.01

  - platform: modbus_controller
    modbus_controller_id: epever
    id: pv_input_power
    name: "PV array input power"
    address: 0x3102
    unit_of_measurement: "W" ## for any other unit the value is returned in minutes
    register_type: read
    value_type: U_DWORD_R
    accuracy_decimals: 1
    filters:
      - multiply: 0.01

  - platform: modbus_controller
    modbus_controller_id: epever
    id: charging_voltage
    name: "Charging voltage"
    address: 0x3104
    unit_of_measurement: "V"
    register_type: read
    value_type: U_WORD
    accuracy_decimals: 1
    filters:
      - multiply: 0.01

  - platform: modbus_controller
    modbus_controller_id: epever
    id: charging_current
    name: "Charging current"
    address: 0x3105
    unit_of_measurement: "A"
    register_type: read
    value_type: U_WORD
    accuracy_decimals: 1
    filters:
      - multiply: 0.01

  - platform: modbus_controller
    modbus_controller_id: epever
    id: charging_power
    name: "Charging power"
    address: 0x3106
    unit_of_measurement: "W"
    register_type: read
    value_type: U_DWORD_R
    accuracy_decimals: 1
    filters:
      - multiply: 0.01

  - platform: modbus_controller
    modbus_controller_id: epever
    id: battery_temperature
    name: "Battery temperature"
    address: 0x3110
    unit_of_measurement: °C
    register_type: read
    value_type: U_WORD
    accuracy_decimals: 1
    filters:
      - multiply: 0.01

  - platform: modbus_controller
    modbus_controller_id: epever
    id: device_temperature
    name: "Device temperature"
    address: 0x3111
    unit_of_measurement: °C
    register_type: read
    value_type: U_WORD
    accuracy_decimals: 1
    filters:
      - multiply: 0.01

  - platform: modbus_controller
    modbus_controller_id: epever
    id: battery_soc
    name: "Battery SOC"
    address: 0x311A
    unit_of_measurement: "%"
    register_type: read
    value_type: U_WORD
    accuracy_decimals: 0

  - platform: modbus_controller
    modbus_controller_id: epever
    id: battery_voltage
    name: "Battery voltage"
    address: 0x331A
    register_type: read
    value_type: U_WORD
    accuracy_decimals: 1
    unit_of_measurement: "V"
    filters:
      - multiply: 0.01

  - platform: modbus_controller
    modbus_controller_id: epever
    id: battery_current
    name: "Battery current"
    address: 0x331B
    register_type: read
    value_type: S_DWORD_R
    register_count: 2
    accuracy_decimals: 2
    unit_of_measurement: "A"
    filters:
      - multiply: 0.01

Odpovědět

Zpět na „FVE a Home Assistant“