├── .gitattributes ├── pcb ├── board_example.jpg ├── Schematic_ESPHome_Inverter_2341.png ├── EasyEDA_Schematic_ESPHome_Inverter_2341.pdf ├── README.md └── EasyEDA_SCH_ESPHome_Inverter_2341.json ├── images ├── board_example.png ├── dessmonitor_device.png └── powmr_esp32_connection.png ├── src ├── powmr-inverter │ ├── modules │ │ ├── debug.yaml │ │ ├── secrets.yaml │ │ ├── common-system.yaml │ │ ├── pow-hvm4.2m-24v.yaml │ │ ├── pow-hvm6.2m-48v.yaml │ │ ├── pzem.yaml │ │ ├── pow-hvm10.2m-48v.yaml │ │ ├── common-sensors.yaml │ │ ├── inverter-info.yaml │ │ └── inverter.yaml │ ├── helpers │ │ ├── myHelpers.h │ │ └── myHelpers.cpp │ └── main.yaml └── powmr-inverter.yaml ├── src-nowr ├── powmr-inverter │ ├── modules │ │ ├── debug.yaml │ │ ├── secrets.yaml │ │ ├── common-system.yaml │ │ ├── pow-hvm10.2m-48v.yaml │ │ ├── pzem.yaml │ │ ├── common-sensors.yaml │ │ ├── inverter-info.yaml │ │ └── inverter.yaml │ ├── helpers │ │ ├── myHelpers.h │ │ └── myHelpers.cpp │ └── main.yaml └── powmr-inverter.yaml ├── examples ├── inverter-card-screenshots │ ├── lovelace_powmr.png │ └── inverter-card-page1.png ├── inverter-card-example.yaml └── lovelace-powmr.yaml ├── README.md └── docs ├── registers-map.md ├── registers-map-SmartESS.md └── 02FF.json /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | -------------------------------------------------------------------------------- /pcb/board_example.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aver-ua/esphome-hybrid-inverter-2341/HEAD/pcb/board_example.jpg -------------------------------------------------------------------------------- /images/board_example.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aver-ua/esphome-hybrid-inverter-2341/HEAD/images/board_example.png -------------------------------------------------------------------------------- /images/dessmonitor_device.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aver-ua/esphome-hybrid-inverter-2341/HEAD/images/dessmonitor_device.png -------------------------------------------------------------------------------- /images/powmr_esp32_connection.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aver-ua/esphome-hybrid-inverter-2341/HEAD/images/powmr_esp32_connection.png -------------------------------------------------------------------------------- /pcb/Schematic_ESPHome_Inverter_2341.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aver-ua/esphome-hybrid-inverter-2341/HEAD/pcb/Schematic_ESPHome_Inverter_2341.png -------------------------------------------------------------------------------- /src/powmr-inverter/modules/debug.yaml: -------------------------------------------------------------------------------- 1 | debug: 2 | update_interval: 10s 3 | 4 | sensor: 5 | - platform: debug 6 | free: 7 | name: "Heap Free" 8 | -------------------------------------------------------------------------------- /src-nowr/powmr-inverter/modules/debug.yaml: -------------------------------------------------------------------------------- 1 | debug: 2 | update_interval: 10s 3 | 4 | sensor: 5 | - platform: debug 6 | free: 7 | name: "Heap Free" 8 | -------------------------------------------------------------------------------- /pcb/EasyEDA_Schematic_ESPHome_Inverter_2341.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aver-ua/esphome-hybrid-inverter-2341/HEAD/pcb/EasyEDA_Schematic_ESPHome_Inverter_2341.pdf -------------------------------------------------------------------------------- /examples/inverter-card-screenshots/lovelace_powmr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aver-ua/esphome-hybrid-inverter-2341/HEAD/examples/inverter-card-screenshots/lovelace_powmr.png -------------------------------------------------------------------------------- /examples/inverter-card-screenshots/inverter-card-page1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aver-ua/esphome-hybrid-inverter-2341/HEAD/examples/inverter-card-screenshots/inverter-card-page1.png -------------------------------------------------------------------------------- /src-nowr/powmr-inverter/helpers/myHelpers.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include 4 | #include "esphome.h" 5 | 6 | uint16_t swapBytes(uint16_t value); 7 | 8 | uint16_t swapBytes(std::string value); 9 | 10 | uint32_t swapBytes32(uint32_t val); -------------------------------------------------------------------------------- /src/powmr-inverter/modules/secrets.yaml: -------------------------------------------------------------------------------- 1 | # Your Wi-Fi SSID and password 2 | wifi_ssid: "wifi_ssid" 3 | wifi_password: "wifi_password" 4 | ap_password: "ap_password" 5 | ota_password: "ota_password" 6 | api_encryption_key: "api_encryption_key" 7 | hotspot_password: "hotspot_password" 8 | -------------------------------------------------------------------------------- /src-nowr/powmr-inverter/modules/secrets.yaml: -------------------------------------------------------------------------------- 1 | # Your Wi-Fi SSID and password 2 | wifi_ssid: "wifi_ssid" 3 | wifi_password: "wifi_password" 4 | ap_password: "ap_password" 5 | ota_password: "ota_password" 6 | api_encryption_key: "api_encryption_key" 7 | hotspot_password: "hotspot_password" 8 | -------------------------------------------------------------------------------- /pcb/README.md: -------------------------------------------------------------------------------- 1 | ## PCB 2 | Files for https://easyeda.com/ 3 | - [EasyEDA scheme](EasyEDA_SCH_ESPHome_Inverter_2341.json) 4 | - [EasyEDA PCB](EasyEDA_PCB_PCB_ESPHome_Inverter_2341.json) 5 | 6 | ![PCB Scheme](Schematic_ESPHome_Inverter_2341.png) 7 | 8 | ![Board Example](board_example.jpg)) 9 | -------------------------------------------------------------------------------- /src/powmr-inverter/helpers/myHelpers.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include 4 | #include "esphome.h" 5 | 6 | uint16_t swapBytes(uint16_t value); 7 | 8 | uint16_t swapBytes(std::string value); 9 | 10 | uint32_t swapBytes32(uint32_t val); 11 | 12 | /*void updateUnknownSelect(uint16_t sensorIndex, esphome::modbus_controller::ModbusSelect* selectComp);*/ 13 | -------------------------------------------------------------------------------- /src/powmr-inverter/modules/common-system.yaml: -------------------------------------------------------------------------------- 1 | wifi: 2 | ssid: !secret wifi_ssid 3 | password: !secret wifi_password 4 | ap: 5 | ssid: "${node_name} Fallback" 6 | password: !secret ap_password 7 | 8 | # captive_portal: 9 | 10 | ota: 11 | id: "${node_id}_ota" 12 | platform: esphome 13 | password: !secret ota_password 14 | 15 | api: 16 | reboot_timeout: 10min 17 | encryption: 18 | key: !secret api_encryption_key 19 | 20 | #web_server: 21 | # port: 80 22 | # ota: false 23 | -------------------------------------------------------------------------------- /src-nowr/powmr-inverter/modules/common-system.yaml: -------------------------------------------------------------------------------- 1 | wifi: 2 | ssid: !secret wifi_ssid 3 | password: !secret wifi_password 4 | ap: 5 | ssid: "${node_name} Fallback" 6 | password: !secret ap_password 7 | 8 | # captive_portal: 9 | 10 | ota: 11 | id: "${node_id}_ota" 12 | platform: esphome 13 | password: !secret ota_password 14 | 15 | api: 16 | reboot_timeout: 10min 17 | encryption: 18 | key: !secret api_encryption_key 19 | 20 | #web_server: 21 | # port: 80 22 | # ota: false 23 | -------------------------------------------------------------------------------- /src-nowr/powmr-inverter/helpers/myHelpers.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include "esphome.h" 5 | #include "esphome/core/log.h" 6 | #include "myHelpers.h" 7 | 8 | uint16_t swapBytes(uint16_t value) 9 | { 10 | return (value << 8) | (value >> 8); 11 | } 12 | 13 | uint16_t swapBytes(std::string value) 14 | { 15 | uint16_t intValue = std::stoi(value); 16 | return (intValue << 8) | (intValue >> 8); 17 | } 18 | 19 | uint32_t swapBytes32( uint32_t val ) 20 | { 21 | val = ((val << 8) & 0xFF00FF00 ) | ((val >> 8) & 0xFF00FF ); 22 | return (val << 16) | (val >> 16); 23 | } 24 | -------------------------------------------------------------------------------- /src/powmr-inverter/modules/pow-hvm4.2m-24v.yaml: -------------------------------------------------------------------------------- 1 | select: 2 | - id: !extend max_total_charge_current 3 | optionsmap: 4 | "10": 10 5 | "20": 20 6 | "30": 30 7 | "40": 40 8 | "50": 50 9 | "60": 60 10 | "70": 70 11 | "80": 80 12 | "90": 90 13 | "100": 100 14 | "110": 110 15 | "120": 120 16 | "130": 130 17 | "140": 140 18 | - id: !extend utility_charge_current 19 | optionsmap: 20 | "10": 10 21 | "20": 20 22 | "30": 30 23 | "40": 40 24 | "50": 50 25 | "60": 60 26 | "70": 70 27 | "80": 80 28 | "90": 90 29 | "100": 100 30 | -------------------------------------------------------------------------------- /src-nowr/powmr-inverter/main.yaml: -------------------------------------------------------------------------------- 1 | esphome: 2 | name: "${device_name}" 3 | friendly_name: "${node_name}" 4 | comment: "Monitor a PowMr inverter" 5 | includes: 6 | - "${device_name}/helpers" 7 | project: 8 | name: "odya.esphome-powmr-hybrid-inverter" 9 | version: 1.3.3 10 | 11 | packages: 12 | inverter: !include modules/inverter.yaml 13 | 14 | # for using PZEM uncomment this line: 15 | # pzem: !include modules/pzem.yaml 16 | 17 | # for debug uncomment this line: 18 | # debug: !include modules/debug.yaml 19 | 20 | # for inverter info sensors uncomment this line: 21 | # inverter-info: !include modules/inverter-info.yaml 22 | 23 | # changes for model POW-HVM10.2M-48V: 24 | # pow-hvm10.2m-48v: !include modules/pow-hvm10.2m-48v.yaml -------------------------------------------------------------------------------- /src/powmr-inverter/main.yaml: -------------------------------------------------------------------------------- 1 | esphome: 2 | name: "${device_name}" 3 | friendly_name: "${node_name}" 4 | comment: "Monitor and control a PowMr inverter" 5 | includes: 6 | - "${device_name}/helpers" 7 | project: 8 | name: "odya.esphome-powmr-hybrid-inverter" 9 | version: 1.3.3 10 | 11 | packages: 12 | inverter: !include modules/inverter.yaml 13 | 14 | # for using PZEM uncomment this line: 15 | # pzem: !include modules/pzem.yaml 16 | 17 | # for debug uncomment this line: 18 | # debug: !include modules/debug.yaml 19 | 20 | # for inverter info sensors uncomment this line: 21 | # inverter-info: !include modules/inverter-info.yaml 22 | 23 | # changes for model POW-HVM4.2M-24V: 24 | pow-hvm4.2m-24v: !include modules/pow-hvm4.2m-24v.yaml 25 | # changes for model POW-HVM6.2M-48V: 26 | # pow-hvm6.2m-48v: !include modules/pow-hvm6.2m-48v.yaml 27 | # changes for model POW-HVM10.2M-48V: 28 | # pow-hvm10.2m-48v: !include modules/pow-hvm10.2m-48v.yaml -------------------------------------------------------------------------------- /src/powmr-inverter/helpers/myHelpers.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include "esphome.h" 5 | #include "esphome/core/log.h" 6 | #include "myHelpers.h" 7 | 8 | uint16_t swapBytes(uint16_t value) 9 | { 10 | return (value << 8) | (value >> 8); 11 | } 12 | 13 | uint16_t swapBytes(std::string value) 14 | { 15 | uint16_t intValue = std::stoi(value); 16 | return (intValue << 8) | (intValue >> 8); 17 | } 18 | 19 | uint32_t swapBytes32( uint32_t val ) 20 | { 21 | val = ((val << 8) & 0xFF00FF00 ) | ((val >> 8) & 0xFF00FF ); 22 | return (val << 16) | (val >> 16); 23 | } 24 | 25 | /* 26 | void updateUnknownSelect(uint16_t sensorIndex, esphome::modbus_controller::ModbusSelect* selectComp) 27 | { 28 | const char* logTag = "myHelpers"; 29 | if (!selectComp->active_index().has_value() || sensorIndex != selectComp->active_index().value()) { 30 | //esphome::ESP_LOGW(logTag, "Update select to index %d", sensorIndex); 31 | auto call = selectComp->make_call(); 32 | call.set_index(sensorIndex); 33 | call.perform(); 34 | } 35 | } 36 | */ -------------------------------------------------------------------------------- /src/powmr-inverter.yaml: -------------------------------------------------------------------------------- 1 | substitutions: 2 | device_name: "powmr-inverter" 3 | node_name: "PowMr Inverter" 4 | node_id: powmr_inverter 5 | inverter_tx_pin: GPIO16 6 | inverter_rx_pin: GPIO17 7 | inverter_voltage_offset: "0" 8 | pzem_tx_pin: GPIO1 9 | pzem_rx_pin: GPIO3 10 | pzem_voltage_offset: "1" 11 | pzem_current_offset: "0.04" 12 | update_interval: 30s # Minimum 10s recommended to avoid duplicate command errors 13 | select_skip_updates: "2" 14 | pzem_update_interval: 6s # Needs to be 1/5 of update interval because of smoothing filter on pzem readings 15 | 16 | esp32: 17 | board: esp32dev #nodemcu-32s 18 | framework: 19 | type: arduino #esp-idf 20 | 21 | packages: 22 | main: !include powmr-inverter/main.yaml 23 | common_system: !include powmr-inverter/modules/common-system.yaml 24 | common_sensors: !include powmr-inverter/modules/common-sensors.yaml 25 | 26 | logger: 27 | level: WARN 28 | baud_rate: 0 29 | logs: 30 | component: ERROR # Fix for issue #4717 "Component xxxxxx took a long time for an operation" 31 | 32 | time: 33 | - platform: homeassistant 34 | id: hass_time 35 | -------------------------------------------------------------------------------- /src/powmr-inverter/modules/pow-hvm6.2m-48v.yaml: -------------------------------------------------------------------------------- 1 | select: 2 | - id: !extend max_total_charge_current 3 | optionsmap: 4 | "10": 10 5 | "20": 20 6 | "30": 30 7 | "40": 40 8 | "50": 50 9 | "60": 60 10 | "70": 70 11 | "80": 80 12 | "90": 90 13 | "100": 100 14 | "110": 110 15 | "120": 120 16 | - id: !extend utility_charge_current 17 | optionsmap: 18 | "10": 10 19 | "20": 20 20 | "30": 30 21 | "40": 40 22 | "50": 50 23 | "60": 60 24 | "70": 70 25 | "80": 80 26 | "90": 90 27 | "100": 100 28 | 29 | number: 30 | - id: !extend back_to_utility_source_voltage 31 | min_value: 45 32 | max_value: 51 33 | step: 1 34 | - id: !extend back_to_battery_source_voltage 35 | min_value: 48 36 | max_value: 58 37 | step: 1 38 | - id: !extend bulk_charging_voltage 39 | min_value: 48 40 | max_value: 61 41 | - id: !extend floating_charging_voltage 42 | min_value: 48 43 | max_value: 61 44 | - id: !extend low_dc_cut_off_voltage 45 | min_value: 40 46 | max_value: 48 47 | -------------------------------------------------------------------------------- /src-nowr/powmr-inverter.yaml: -------------------------------------------------------------------------------- 1 | substitutions: 2 | device_name: "powmr-inverter" 3 | node_name: "PowMr Inverter" 4 | node_id: powmr_inverter 5 | inverter_tx_pin: GPIO16 6 | inverter_rx_pin: GPIO17 7 | inverter_voltage_offset: "0" 8 | pzem_tx_pin: GPIO1 9 | pzem_rx_pin: GPIO3 10 | pzem_voltage_offset: "1" 11 | pzem_current_offset: "0.04" 12 | update_interval: 30s # Minimum 10s recommended to avoid duplicate command errors 13 | select_skip_updates: "2" 14 | pzem_update_interval: 6s # Needs to be 1/5 of update interval because of smoothing filter on pzem readings 15 | 16 | esp32: 17 | board: esp32dev #nodemcu-32s 18 | framework: 19 | type: arduino #esp-idf 20 | 21 | packages: 22 | main: !include powmr-inverter/main.yaml 23 | common_system: !include powmr-inverter/modules/common-system.yaml 24 | common_sensors: !include powmr-inverter/modules/common-sensors.yaml 25 | 26 | logger: 27 | level: WARN 28 | baud_rate: 0 29 | logs: 30 | component: ERROR # Fix for issue #4717 "Component xxxxxx took a long time for an operation" 31 | 32 | time: 33 | - platform: homeassistant 34 | id: hass_time 35 | -------------------------------------------------------------------------------- /src-nowr/powmr-inverter/modules/pow-hvm10.2m-48v.yaml: -------------------------------------------------------------------------------- 1 | sensor: 2 | - platform: modbus_controller 3 | modbus_controller_id: smg_inverter 4 | name: "PV 2 Voltage" 5 | id: pv2_voltage 6 | address: 4563 7 | register_type: holding 8 | value_type: U_WORD 9 | unit_of_measurement: "V" 10 | device_class: voltage 11 | state_class: measurement 12 | accuracy_decimals: 1 13 | lambda: |- 14 | return swapBytes(x); 15 | filters: 16 | - multiply: 0.1 17 | 18 | - platform: modbus_controller 19 | modbus_controller_id: smg_inverter 20 | name: "PV 2 Power" 21 | id: pv2_power 22 | address: 4564 23 | register_type: holding 24 | value_type: U_WORD 25 | accuracy_decimals: 1 26 | unit_of_measurement: "W" 27 | device_class: power 28 | state_class: measurement 29 | lambda: |- 30 | return swapBytes(x); 31 | 32 | - platform: template 33 | name: "PV 2 Current" 34 | state_class: "measurement" 35 | device_class: current 36 | unit_of_measurement: "A" 37 | accuracy_decimals: 1 38 | icon: mdi:solar-power 39 | lambda: |- 40 | return id(pv2_power).state / id(pv2_voltage).state; 41 | -------------------------------------------------------------------------------- /src/powmr-inverter/modules/pzem.yaml: -------------------------------------------------------------------------------- 1 | uart: 2 | - id: uart_pzem 3 | baud_rate: 9600 4 | tx_pin: ${pzem_tx_pin} 5 | rx_pin: ${pzem_rx_pin} 6 | # debug: 7 | # direction: BOTH 8 | # dummy_receiver: false 9 | 10 | modbus: 11 | - id: modbus_pzem 12 | uart_id: uart_pzem 13 | 14 | sensor: 15 | - platform: pzemac 16 | modbus_id: modbus_pzem 17 | update_interval: ${pzem_update_interval} 18 | voltage: 19 | name: "Grid PZEM Voltage" 20 | id: pzem_grid_voltage 21 | internal: true 22 | filters: 23 | - &mafilter quantile: 24 | window_size: 5 25 | send_every: 1 26 | send_first_at: 1 27 | quantile: .9 28 | - offset: ${pzem_voltage_offset} 29 | current: 30 | name: "Grid Current" 31 | id: pzem_grid_current 32 | filters: 33 | - *mafilter 34 | - offset: ${pzem_current_offset} 35 | power: 36 | name: "Grid Power" 37 | id: pzem_grid_power 38 | internal: true 39 | filters: 40 | - *mafilter 41 | power_factor: 42 | name: "Grid Power Factor" 43 | id: pzem_grid_power_factor 44 | filters: 45 | - *mafilter 46 | 47 | - platform: template 48 | name: "Grid Power" 49 | unit_of_measurement: "W" 50 | device_class: power 51 | state_class: measurement 52 | accuracy_decimals: 0 53 | update_interval: ${update_interval} 54 | lambda: |- 55 | return id(pzem_grid_current).state * id(pzem_grid_voltage).state * id(pzem_grid_power_factor).state; 56 | 57 | # extend "Grid Voltage" for pzem 58 | - id: !extend grid_voltage 59 | on_raw_value: 60 | then: 61 | - lambda: !lambda |- 62 | if (!id(grid_active).state) { 63 | id(pzem_grid_voltage).publish_state(0.0); 64 | id(pzem_grid_current).publish_state(${pzem_current_offset} * -1); 65 | id(pzem_grid_power).publish_state(0.0); 66 | id(pzem_grid_power_factor).publish_state(0.0); 67 | } 68 | -------------------------------------------------------------------------------- /src-nowr/powmr-inverter/modules/pzem.yaml: -------------------------------------------------------------------------------- 1 | uart: 2 | - id: uart_pzem 3 | baud_rate: 9600 4 | tx_pin: ${pzem_tx_pin} 5 | rx_pin: ${pzem_rx_pin} 6 | # debug: 7 | # direction: BOTH 8 | # dummy_receiver: false 9 | 10 | modbus: 11 | - id: modbus_pzem 12 | uart_id: uart_pzem 13 | 14 | sensor: 15 | - platform: pzemac 16 | modbus_id: modbus_pzem 17 | update_interval: ${pzem_update_interval} 18 | voltage: 19 | name: "Grid PZEM Voltage" 20 | id: pzem_grid_voltage 21 | internal: true 22 | filters: 23 | - &mafilter quantile: 24 | window_size: 5 25 | send_every: 1 26 | send_first_at: 1 27 | quantile: .9 28 | - offset: ${pzem_voltage_offset} 29 | current: 30 | name: "Grid Current" 31 | id: pzem_grid_current 32 | filters: 33 | - *mafilter 34 | - offset: ${pzem_current_offset} 35 | power: 36 | name: "Grid Power" 37 | id: pzem_grid_power 38 | internal: true 39 | filters: 40 | - *mafilter 41 | power_factor: 42 | name: "Grid Power Factor" 43 | id: pzem_grid_power_factor 44 | filters: 45 | - *mafilter 46 | 47 | - platform: template 48 | name: "Grid Power" 49 | unit_of_measurement: "W" 50 | device_class: power 51 | state_class: measurement 52 | accuracy_decimals: 0 53 | update_interval: ${update_interval} 54 | lambda: |- 55 | return id(pzem_grid_current).state * id(pzem_grid_voltage).state * id(pzem_grid_power_factor).state; 56 | 57 | # extend "Grid Voltage" for pzem 58 | - id: !extend grid_voltage 59 | on_raw_value: 60 | then: 61 | - lambda: !lambda |- 62 | if (!id(grid_active).state) { 63 | id(pzem_grid_voltage).publish_state(0.0); 64 | id(pzem_grid_current).publish_state(${pzem_current_offset} * -1); 65 | id(pzem_grid_power).publish_state(0.0); 66 | id(pzem_grid_power_factor).publish_state(0.0); 67 | } 68 | -------------------------------------------------------------------------------- /src/powmr-inverter/modules/pow-hvm10.2m-48v.yaml: -------------------------------------------------------------------------------- 1 | sensor: 2 | - platform: modbus_controller 3 | modbus_controller_id: smg_inverter 4 | name: "PV 2 Voltage" 5 | id: pv2_voltage 6 | address: 4563 7 | register_type: holding 8 | value_type: U_WORD 9 | unit_of_measurement: "V" 10 | device_class: voltage 11 | state_class: measurement 12 | accuracy_decimals: 1 13 | lambda: |- 14 | return swapBytes(x); 15 | filters: 16 | - multiply: 0.1 17 | 18 | - platform: modbus_controller 19 | modbus_controller_id: smg_inverter 20 | name: "PV 2 Power" 21 | id: pv2_power 22 | address: 4564 23 | register_type: holding 24 | value_type: U_WORD 25 | accuracy_decimals: 1 26 | unit_of_measurement: "W" 27 | device_class: power 28 | state_class: measurement 29 | lambda: |- 30 | return swapBytes(x); 31 | 32 | - platform: template 33 | name: "PV 2 Current" 34 | state_class: "measurement" 35 | device_class: current 36 | unit_of_measurement: "A" 37 | accuracy_decimals: 1 38 | icon: mdi:solar-power 39 | lambda: |- 40 | return id(pv2_power).state / id(pv2_voltage).state; 41 | 42 | select: 43 | - id: !extend max_total_charge_current 44 | optionsmap: 45 | "10": 10 46 | "20": 20 47 | "30": 30 48 | "40": 40 49 | "50": 50 50 | "60": 60 51 | "70": 70 52 | "80": 80 53 | "90": 90 54 | "100": 100 55 | "110": 110 56 | "120": 120 57 | "130": 130 58 | "140": 140 59 | "150": 150 60 | "160": 160 61 | - id: !extend utility_charge_current 62 | optionsmap: 63 | "10": 10 64 | "20": 20 65 | "30": 30 66 | "40": 40 67 | "50": 50 68 | "60": 60 69 | "70": 70 70 | "80": 80 71 | "90": 90 72 | "100": 100 73 | "110": 110 74 | "120": 120 75 | "130": 130 76 | "140": 140 77 | 78 | number: 79 | - id: !extend back_to_utility_source_voltage 80 | min_value: 45 81 | max_value: 51 82 | step: 1 83 | - id: !extend back_to_battery_source_voltage 84 | min_value: 48 85 | max_value: 58 86 | step: 1 87 | - id: !extend bulk_charging_voltage 88 | min_value: 48 89 | max_value: 61 90 | - id: !extend floating_charging_voltage 91 | min_value: 48 92 | max_value: 61 93 | - id: !extend low_dc_cut_off_voltage 94 | min_value: 40 95 | max_value: 48 96 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # ESPHome Hybrid Inverter (2341) 2 | This project forked from https://github.com/odya/esphome-powmr-hybrid-inverter 3 | 4 | ESPHome config to monitor and management various PowMr Hybrid Inverter models and Inverters that supported by the [**WIFI-VM (WiFi Plug Pro)**](https://powmr.com/products/powmr-wifi-module-with-rs232-remote-monitoring-solution-wifi-vm) device and `SmartESS` cloud application. 5 | 6 | ## Protocol 7 | Protocol is Modbus RTU via RS232. Protocol ID (SmartESS) : `2341` (hex 0925). Slave ID : `5`. 8 | 9 | Registers map 10 | 11 | 1) [registers-map.md from original project](/docs/registers-map.md) 12 | 2) [0925.json](/docs/0925.json) in JSON fromat from offical app `SmartESS.apk` 13 | 3) [registers-map-SmartESS.md](/docs/registers-map-SmartESS.md) - compilated from `0925.json` 14 | 15 | ## Connection 16 | ![PowMr ESP32 connection diagram](images/powmr_esp32_connection.png "PowMr ESP32 connection diagram") 17 | See PCB board files and example in folder [/pcb/](/pcb/) 18 | 19 | ## Usage 20 | 1) Copy the contents of the `src` repo folder to your ESPHome configuration directory 21 | 2) Edit substitutions & customize `powmr-inverter.yaml` & `main.yaml` 22 | 3) Flash firmware to your ESP32 23 | 24 | The code is divided into packages: 25 | 1) `secrets.yaml` - WIFI, OTA, AP passwords 26 | 2) `common-system.yaml` - system configuration (wifi, ota, api) 27 | 3) `common-sensors.yaml` - common sensor like uptime, wifi signal, total_daily_energy, etc. 28 | 4) `inverter.yaml` - basic inverter sensors 29 | 5) `inverter-info.yaml` - additional inverter info sensors like Machine Type, nominal input/output voltage, current, power. **Commented out** by default 30 | 6) `pzem.yaml` - PZEM module configuration and sensors. **Commented out** by default 31 | 7) `pow-hvm4.2m-24v.yaml` - specific configs and sensors for 4.2kW model 32 | 8) `pow-hvm6.2m-48v.yaml` - specific configs and sensors for 6.2kW model. **Commented out** by default 33 | 9) `pow-hvm10.2m-48v.yaml` - specific configs and sensors for 10.2kW model. **Commented out** by default 34 | 35 | Note. Some registers (like Battery Equalization) are commented out in `/modules/inverter.yaml` because I don't need them. 36 | 37 | ## Inverter card 38 | For easy integration into Home Assistant, you can use the [following snippet](/examples/inverter-card-example.yaml). 39 | Lovelace dashboard example 40 | [Lovelace dashboard example](/examples/lovelace-powmr.yaml), [screenshot](/examples/inverter-card-screenshots/lovelace_powmr.png). 41 | The following custom plugins are required: [sunsynk-power-flow-card](https://github.com/slipx06/sunsynk-power-flow-card), [stack-in-card](https://github.com/custom-cards/stack-in-card), [canary](https://github.com/jcwillox/lovelace-canary), [mini-graph-card](https://github.com/kalkih/mini-graph-card). 42 | 43 | ## References 44 | - https://github.com/odya/esphome-powmr-hybrid-inverter 45 | - https://github.com/leodesigner/powmr_comm 46 | - https://github.com/syssi/esphome-smg-ii 47 | - https://github.com/syssi/esphome-pipsolar 48 | - https://github.com/alexeyden/openess 49 | - https://github.com/sabatex/NetDaemonApps.InverterAnenji-4kw-7.2kw 50 | -------------------------------------------------------------------------------- /src/powmr-inverter/modules/common-sensors.yaml: -------------------------------------------------------------------------------- 1 | sensor: 2 | - platform: internal_temperature 3 | name: "Controller Temperature" 4 | update_interval: ${update_interval} 5 | state_class: measurement 6 | device_class: temperature 7 | #filters: 8 | # - lambda: return (x-32)*5/9; 9 | - platform: uptime 10 | name: "Uptime" 11 | id: esp_uptime 12 | entity_category: "diagnostic" 13 | device_class: duration 14 | update_interval: ${update_interval} 15 | on_raw_value: 16 | then: 17 | - text_sensor.template.publish: 18 | id: uptime_human 19 | state: !lambda |- 20 | int seconds = round(id(esp_uptime).raw_state); 21 | int days = seconds / (24 * 3600); 22 | seconds = seconds % (24 * 3600); 23 | int hours = seconds / 3600; 24 | seconds = seconds % 3600; 25 | int minutes = seconds / 60; 26 | seconds = seconds % 60; 27 | return ( 28 | (days ? to_string(days) + "d " : "") + 29 | (hours ? to_string(hours) + "h " : "") + 30 | (minutes ? to_string(minutes) + "m " : "") + 31 | (to_string(seconds) + "s") 32 | ).c_str(); 33 | - platform: wifi_signal 34 | name: "RSSI" 35 | id: wifi_rssi 36 | entity_category: "diagnostic" 37 | update_interval: ${update_interval} 38 | - platform: copy # Reports the WiFi signal strength in % 39 | source_id: wifi_rssi 40 | name: "WiFi Signal Percent" 41 | filters: 42 | - lambda: return min(max(2 * (x + 100.0), 0.0), 100.0); 43 | unit_of_measurement: "%" 44 | entity_category: "diagnostic" 45 | # - platform: dht 46 | # pin: GPIO4 47 | # model: AM2302 48 | # temperature: 49 | # name: "OutDoor Temperature" 50 | # humidity: 51 | # name: "OutDoor Humidity" 52 | # update_interval: ${update_interval} 53 | - platform: total_daily_energy 54 | name: "Daily Energy" 55 | restore: true 56 | power_id: load_power 57 | unit_of_measurement: 'kWh' 58 | state_class: total_increasing 59 | device_class: energy 60 | accuracy_decimals: 3 61 | filters: 62 | # Multiplication factor from W to kW is 0.001 63 | - multiply: 0.001 64 | - platform: total_daily_energy 65 | name: "PV Daily Energy" 66 | restore: true 67 | power_id: pv_power 68 | unit_of_measurement: 'kWh' 69 | state_class: total_increasing 70 | device_class: energy 71 | accuracy_decimals: 3 72 | filters: 73 | - multiply: 0.001 74 | - platform: total_daily_energy 75 | name: "Battery Daily Charge Energy" 76 | restore: true 77 | power_id: battery_charge_power 78 | unit_of_measurement: 'kWh' 79 | state_class: total_increasing 80 | device_class: energy 81 | accuracy_decimals: 3 82 | filters: 83 | - multiply: 0.001 84 | - platform: total_daily_energy 85 | name: "Battery Daily Discharge Energy" 86 | restore: true 87 | power_id: battery_discharge_power 88 | unit_of_measurement: 'kWh' 89 | state_class: total_increasing 90 | device_class: energy 91 | accuracy_decimals: 3 92 | filters: 93 | - multiply: 0.001 94 | 95 | text_sensor: 96 | # Uptime Human Readable 97 | - platform: template 98 | name: "Uptime HR" 99 | id: uptime_human 100 | icon: mdi:clock-start 101 | 102 | binary_sensor: 103 | - platform: status 104 | name: "Controller Status" 105 | entity_category: diagnostic 106 | 107 | button: 108 | # Restart the ESP Device 109 | - platform: restart 110 | name: 'Restart ESP' -------------------------------------------------------------------------------- /src-nowr/powmr-inverter/modules/common-sensors.yaml: -------------------------------------------------------------------------------- 1 | sensor: 2 | - platform: internal_temperature 3 | name: "Controller Temperature" 4 | update_interval: ${update_interval} 5 | state_class: measurement 6 | device_class: temperature 7 | #filters: 8 | # - lambda: return (x-32)*5/9; 9 | - platform: uptime 10 | name: "Uptime" 11 | id: esp_uptime 12 | entity_category: "diagnostic" 13 | device_class: duration 14 | update_interval: ${update_interval} 15 | on_raw_value: 16 | then: 17 | - text_sensor.template.publish: 18 | id: uptime_human 19 | state: !lambda |- 20 | int seconds = round(id(esp_uptime).raw_state); 21 | int days = seconds / (24 * 3600); 22 | seconds = seconds % (24 * 3600); 23 | int hours = seconds / 3600; 24 | seconds = seconds % 3600; 25 | int minutes = seconds / 60; 26 | seconds = seconds % 60; 27 | return ( 28 | (days ? to_string(days) + "d " : "") + 29 | (hours ? to_string(hours) + "h " : "") + 30 | (minutes ? to_string(minutes) + "m " : "") + 31 | (to_string(seconds) + "s") 32 | ).c_str(); 33 | - platform: wifi_signal 34 | name: "RSSI" 35 | id: wifi_rssi 36 | entity_category: "diagnostic" 37 | update_interval: ${update_interval} 38 | - platform: copy # Reports the WiFi signal strength in % 39 | source_id: wifi_rssi 40 | name: "WiFi Signal Percent" 41 | filters: 42 | - lambda: return min(max(2 * (x + 100.0), 0.0), 100.0); 43 | unit_of_measurement: "%" 44 | entity_category: "diagnostic" 45 | # - platform: dht 46 | # pin: GPIO4 47 | # model: AM2302 48 | # temperature: 49 | # name: "OutDoor Temperature" 50 | # humidity: 51 | # name: "OutDoor Humidity" 52 | # update_interval: ${update_interval} 53 | - platform: total_daily_energy 54 | name: "Daily Energy" 55 | restore: true 56 | power_id: load_power 57 | unit_of_measurement: 'kWh' 58 | state_class: total_increasing 59 | device_class: energy 60 | accuracy_decimals: 3 61 | filters: 62 | # Multiplication factor from W to kW is 0.001 63 | - multiply: 0.001 64 | - platform: total_daily_energy 65 | name: "PV Daily Energy" 66 | restore: true 67 | power_id: pv_power 68 | unit_of_measurement: 'kWh' 69 | state_class: total_increasing 70 | device_class: energy 71 | accuracy_decimals: 3 72 | filters: 73 | - multiply: 0.001 74 | - platform: total_daily_energy 75 | name: "Battery Daily Charge Energy" 76 | restore: true 77 | power_id: battery_charge_power 78 | unit_of_measurement: 'kWh' 79 | state_class: total_increasing 80 | device_class: energy 81 | accuracy_decimals: 3 82 | filters: 83 | - multiply: 0.001 84 | - platform: total_daily_energy 85 | name: "Battery Daily Discharge Energy" 86 | restore: true 87 | power_id: battery_discharge_power 88 | unit_of_measurement: 'kWh' 89 | state_class: total_increasing 90 | device_class: energy 91 | accuracy_decimals: 3 92 | filters: 93 | - multiply: 0.001 94 | 95 | text_sensor: 96 | # Uptime Human Readable 97 | - platform: template 98 | name: "Uptime HR" 99 | id: uptime_human 100 | icon: mdi:clock-start 101 | 102 | binary_sensor: 103 | - platform: status 104 | name: "Controller Status" 105 | entity_category: diagnostic 106 | 107 | button: 108 | # Restart the ESP Device 109 | - platform: restart 110 | name: 'Restart ESP' -------------------------------------------------------------------------------- /examples/inverter-card-example.yaml: -------------------------------------------------------------------------------- 1 | type: custom:stack-in-card 2 | cards: 3 | - type: conditional 4 | conditions: 5 | - entity: sensor.powmr_inverter_load_state 6 | state: unavailable 7 | card: 8 | type: markdown 9 | content: | 10 | Inverter is turned off 11 | style: | 12 | ha-card { 13 | margin: 0px 0; 14 | border: 0; 15 | } 16 | - type: conditional 17 | conditions: 18 | - entity: sensor.powmr_inverter_load_state 19 | state_not: unavailable 20 | card: 21 | type: vertical-stack 22 | cards: 23 | - type: custom:sunsynk-power-flow-card 24 | cardstyle: full 25 | show_solar: true 26 | show_battery: true 27 | show_grid: true 28 | panel_mode: false 29 | decimal_places: 3 30 | no_card: true 31 | card_mod: 32 | style: | 33 | ha-card { 34 | margin-top: -5px !important; 35 | } 36 | .card { 37 | box-shadow: none !important; 38 | } 39 | inverter: 40 | modern: false 41 | colour: gray 42 | autarky: power 43 | model: powmr 44 | tree_phase: false 45 | auto_scale: true 46 | battery: 47 | energy: 11520 48 | shutdown_soc: 5 49 | colour: "#9A64A0" 50 | show_daily: true 51 | invert_power: true 52 | show_absolute: true 53 | solar: 54 | show_daily: true 55 | maxpower: 2400 56 | pv1_name: Solar 57 | mppts: 1 58 | display_mode: 1 59 | load: 60 | show_daily: true 61 | auto_scale: true 62 | grid: 63 | grid_name: Utility Power 64 | show_daily_buy: false 65 | show_daily_sell: false 66 | show_nonessential: false 67 | grid_off_colour: "#aaaa" 68 | auto_scale: true 69 | dynamic_icon: true 70 | dynamic_colour: true 71 | energy_cost_decimals: 3 72 | entities: 73 | inverter_voltage_154: sensor.powmr_inverter_load_voltage 74 | inverter_current_164: sensor.powmr_inverter_load_current 75 | inverter_power_175: sensor.powmr_inverter_load_power 76 | load_frequency_192: sensor.powmr_inverter_load_frequency 77 | grid_connected_status_194: binary_sensor.powmr_inverter_grid_active 78 | #grid_ct_power_172: sensor.powmr_grid_power # inverter grid power consumption 79 | day_load_energy_84: sensor.powmr_inverter_daily_energy 80 | battery_voltage_183: sensor.powmr_inverter_battery_voltage 81 | battery_soc_184: sensor.powmr_inverter_battery_soc 82 | battery_power_190: sensor.powmr_inverter_battery_power 83 | battery_current_191: sensor.powmr_inverter_battery_current 84 | #battery_temp_182: sensor.jkbms_b2a8s20p_calb_temperature_sensor_1 85 | battery_rated_capacity: 480 86 | pv1_power_186: sensor.powmr_inverter_pv_power 87 | pv1_voltage_109: sensor.powmr_inverter_pv_voltage 88 | pv1_current_110: sensor.powmr_inverter_pv_current 89 | day_pv_energy_108: sensor.powmr_inverter_pv_daily_energy 90 | #environment_temp: sensor.sonoff_sw1_bme280_temperature_2 91 | day_battery_charge_70: sensor.powmr_inverter_battery_daily_charge_energy 92 | day_battery_discharge_71: sensor.powmr_inverter_battery_daily_discharge_energy 93 | # add your essentials loads 94 | #essential_load1: sensor.boiler_shp_plug_power 95 | #essential_load2: sensor.earu_mcb_power 96 | #essential_load3: sensor.fridge_plug_power 97 | #essential_load4: sensor.freezer_plug_bl0937_power 98 | -------------------------------------------------------------------------------- /docs/registers-map.md: -------------------------------------------------------------------------------- 1 | # PowMr 2.4kW Inverter registers map 2 | 3 | ### Read registers 4 | - 4501 : Output Source Priority *(Returns index with offset. I'd prefer to use register 4537)* `settings` 5 | - 4502 : AC Voltage `measurement` 6 | - 4503 : AC Frequency `measurement` 7 | - 4504 : PV Voltage `measurement` 8 | - 4505 : PV Power `measurement` 9 | - 4506 : Battery Voltage `measurement` 10 | - 4507 : Battery SoC `measurement` 11 | - 4508 : Battery Charge Current `measurement` 12 | - 4509 : Battery Discharge Current `measurement` 13 | - 4510 : Load Voltage `measurement` 14 | - 4511 : Load Frequency `measurement` 15 | - 4512 : Load Power `measurement` 16 | - 4513 : Load VA `measurement` 17 | - 4514 : Load Percent `measurement` 18 | - 4515 : Load Percent `measurement` 19 | - 4516 : Binary flags `binary_flags` 20 | * `0x100` Something overload related (?) 21 | - 4530 : Error Code 22 | - 4535 : Settings binary flags `binary_flags` 23 | * `0x1` Record Fault Code `settings` 24 | * `0x2` Battery Equalization `settings` 25 | * `0x4` Equalization Activated Immediately `settings` 26 | * `0x100` Alarm `settings` 27 | * `0x400` Backlight `settings` 28 | * `0x800` Restart On Overload `settings` 29 | * `0x1000` Restart On Overheat `settings` 30 | * `0x2000` Beep On Primary Source Fail `settings` 31 | * `0x4000` Return To Default Screen `settings` 32 | * `0x8000` Overload Bypass `settings` 33 | - 4536 : Charger Source Priority `settings` 34 | - 4537 : Output Source Priority *(More correct one)* `settings` 35 | - 4538 : AC Input Voltage Range `settings` 36 | - 4540 : Target Output Frequency `settings` 37 | - 4541 : Max Total Charging Current `settings` 38 | - 4542 : Target Output Voltage `settings` 39 | - 4543 : Max Utility Charging Current `settings` 40 | - 4544 : Back To Utility Source Voltage `settings` 41 | - 4545 : Back To Battery Source Voltage `settings` 42 | - 4546 : Bulk Charging Voltage `settings` 43 | - 4547 : Floating Charging Voltage `settings` 44 | - 4548 : Low CutOff Voltage `settings` 45 | - 4549 : Battery Equalization Voltage `settings` 46 | - 4550 : Battery Equalized Time `settings` 47 | - 4551 : Battery Equalized Timeout `settings` 48 | - 4552 : Equalization Interval `settings` 49 | - 4553 : Binary flags `binary_flags` 50 | * `0x100` On Battery 51 | * `0x200` AC Active 52 | * `0x1000` Load Off (Inverted "*Load Enabled*") 53 | * `0x2000` AC Active 54 | * `0x4000` Load Enabled 55 | - 4554 : Binary flags `binary_flags` 56 | * `0x1` On Battery 57 | * `0x100` AC Active 58 | * `0x8000` AC Active 59 | - 4555 : Charger Status *(0 - Off, 1 - Idle, 2 - Active)* 60 | - 4557 : (PV) Temperature sensor (**HVM3.6M confirmed**, **HVM2.4H not confirmed**) 61 | 62 | ### Write registers 63 | *( [+] means tested )* 64 | 65 | | Register | Description | HVM2.4H | HVM4.2M | 66 | |----------|-------------------------------------------------------------------------------------|---------|---------| 67 | | 5002 | Buzzer Alarm (range 0-1, settings menu 18) | + | + | 68 | | 5004 | Backlight control (range 0-1, settings menu 20) | | + | 69 | | 5005 | Auto restart when overload occurs (range 0-1, settings menu 6) | | + | 70 | | 5006 | Auto restart when over temperature occurs (range 0-1, settings menu 7) | | + | 71 | | 5007 | Beep On Primary Source Fail (range 0-1, settings menu 22) | + | + | 72 | | 5008 | Auto return to default display screen (range 0-1, settings menu 19) | | + | 73 | | 5009 | Overload Bypass (0-1, settings menu 23) | + | + | 74 | | 5010 | Record fault code (range 0-1, settings menu 25) | | | 75 | | 5017 | Charger Source Priority (range 0-3, settings menu 16) | + | + | 76 | | 5018 | Output Source Priority (range 0-2, settings menu 1) | + | + | 77 | | 5019 | AC input voltage range (range 0-1, settings menu 3) (0 - 90-280VAC, 1 - 170-280VAC) | | + | 78 | | 5020 | Battery type (range 0-2, settings menu 5) | | + | 79 | | 5021 | Output frequency (range 0-1, settings menu 9) (0 - 50hz, 1 - 60hz) | | + | 80 | | 5022 | Max Total Charge Current (range 10-80, settings menu 2) | + | + | 81 | | 5023 | Output voltage (one of 220, 230, 240, settings menu 10) | | + | 82 | | 5024 | Utility Charge Current (one of 2, 10, 20, 30, 40, 50, 60, settings menu 11) | + | + | 83 | | 5025 | Comeback Utility Mode Voltage (SBU) (0.5 volts step, settings menu 12) | | + | 84 | | 5026 | Comeback Battery Mode Voltage (SBU) (0.5 volts step, settings menu 13) | | + | 85 | | 5027 | Bulk charging voltage (settings menu 26) | | + | 86 | | 5028 | Floating charging voltage (settings menu 27) | | + | 87 | | 5029 | Low DC cut-off voltage (settings menu 29) | | + | 88 | | 5030 | Battery equalization voltage (settings menu 31) | | | 89 | | 5031 | Battery equalized time (settings menu 33) | | | 90 | | 5032 | Battery equalized timeout (settings menu 34) | | | 91 | | 5033 | Equalization interval (settings menu 35) | | | 92 | -------------------------------------------------------------------------------- /src/powmr-inverter/modules/inverter-info.yaml: -------------------------------------------------------------------------------- 1 | text_sensor: 2 | 3 | - platform: modbus_controller 4 | modbus_controller_id: smg_inverter 5 | id: Machine_Type 6 | name: "Machine Type" 7 | icon: mdi:memory 8 | entity_category: diagnostic 9 | address: 4517 10 | register_type: holding 11 | response_size: 2 12 | raw_encode: HEXBYTES 13 | lambda: |- 14 | uint16_t sensorIndex = swapBytes(modbus_controller::word_from_hex_str(x, 0)); 15 | switch (sensorIndex) { 16 | case 0: return std::string("Solar Inverter"); 17 | case 1: return std::string("Voltage regulator"); 18 | default: return std::string(x); 19 | } 20 | 21 | - platform: modbus_controller 22 | modbus_controller_id: smg_inverter 23 | id: Battery_Piece 24 | name: "Battery Piece" 25 | icon: mdi:battery 26 | entity_category: diagnostic 27 | address: 4520 28 | register_type: holding 29 | response_size: 2 30 | raw_encode: HEXBYTES 31 | lambda: |- 32 | uint16_t sensorIndex = swapBytes(modbus_controller::word_from_hex_str(x, 0)); 33 | switch (sensorIndex) { 34 | case 0: return std::string("No Battery"); 35 | case 1: return std::string("24V"); 36 | case 2: return std::string("48V"); 37 | default: return std::string(x); 38 | } 39 | 40 | sensor: 41 | 42 | - platform: modbus_controller 43 | modbus_controller_id: smg_inverter 44 | name: "Main CPU version" 45 | icon: mdi:chip 46 | entity_category: diagnostic 47 | address: 4518 48 | register_type: holding 49 | value_type: U_WORD 50 | lambda: |- 51 | return swapBytes(x); 52 | 53 | - platform: modbus_controller 54 | modbus_controller_id: smg_inverter 55 | name: "Secondary CPU version" 56 | icon: mdi:chip 57 | entity_category: diagnostic 58 | address: 4519 59 | register_type: holding 60 | value_type: U_WORD 61 | lambda: |- 62 | return swapBytes(x); 63 | 64 | - platform: modbus_controller 65 | modbus_controller_id: smg_inverter 66 | name: "Nominal output apparent power" 67 | entity_category: diagnostic 68 | unit_of_measurement: "VA" 69 | device_class: apparent_power 70 | address: 4521 71 | register_type: holding 72 | value_type: U_WORD 73 | lambda: |- 74 | return swapBytes(x); 75 | 76 | - platform: modbus_controller 77 | modbus_controller_id: smg_inverter 78 | name: "Nominal output active power" 79 | entity_category: diagnostic 80 | unit_of_measurement: "W" 81 | device_class: power 82 | address: 4522 83 | register_type: holding 84 | value_type: U_WORD 85 | lambda: |- 86 | return swapBytes(x); 87 | 88 | - platform: modbus_controller 89 | modbus_controller_id: smg_inverter 90 | name: "Nominal AC voltage" 91 | entity_category: diagnostic 92 | unit_of_measurement: "V" 93 | device_class: voltage 94 | address: 4523 95 | register_type: holding 96 | value_type: U_WORD 97 | lambda: |- 98 | return swapBytes(x); 99 | 100 | - platform: modbus_controller 101 | modbus_controller_id: smg_inverter 102 | name: "Nominal AC current" 103 | entity_category: diagnostic 104 | unit_of_measurement: "A" 105 | device_class: current 106 | address: 4524 107 | register_type: holding 108 | value_type: U_WORD 109 | lambda: |- 110 | return swapBytes(x); 111 | 112 | - platform: modbus_controller 113 | modbus_controller_id: smg_inverter 114 | name: "Rated battery voltage" 115 | entity_category: diagnostic 116 | unit_of_measurement: "V" 117 | device_class: voltage 118 | address: 4525 119 | register_type: holding 120 | value_type: U_WORD 121 | lambda: |- 122 | return swapBytes(x); 123 | filters: 124 | - multiply: 0.1 125 | 126 | - platform: modbus_controller 127 | modbus_controller_id: smg_inverter 128 | name: "Nominal output voltage" 129 | entity_category: diagnostic 130 | unit_of_measurement: "V" 131 | device_class: voltage 132 | address: 4526 133 | register_type: holding 134 | value_type: U_WORD 135 | lambda: |- 136 | return swapBytes(x); 137 | 138 | - platform: modbus_controller 139 | modbus_controller_id: smg_inverter 140 | name: "Nominal output frequency" 141 | entity_category: diagnostic 142 | unit_of_measurement: "Hz" 143 | device_class: frequency 144 | address: 4527 145 | register_type: holding 146 | value_type: U_WORD 147 | lambda: |- 148 | return swapBytes(x); 149 | filters: 150 | - multiply: 0.1 151 | 152 | - platform: modbus_controller 153 | modbus_controller_id: smg_inverter 154 | name: "Nominal output current" 155 | entity_category: diagnostic 156 | unit_of_measurement: "A" 157 | device_class: current 158 | address: 4528 159 | register_type: holding 160 | value_type: U_WORD 161 | lambda: |- 162 | return swapBytes(x); 163 | 164 | - platform: modbus_controller 165 | modbus_controller_id: smg_inverter 166 | name: "ID1" 167 | icon: mdi:identifier 168 | entity_category: diagnostic 169 | address: 4531 170 | register_type: holding 171 | value_type: U_WORD 172 | lambda: |- 173 | return swapBytes(x); 174 | 175 | - platform: modbus_controller 176 | modbus_controller_id: smg_inverter 177 | name: "ID2" 178 | icon: mdi:identifier 179 | entity_category: diagnostic 180 | address: 4532 181 | register_type: holding 182 | value_type: U_WORD 183 | lambda: |- 184 | return swapBytes(x); 185 | 186 | - platform: modbus_controller 187 | modbus_controller_id: smg_inverter 188 | name: "ID3" 189 | icon: mdi:identifier 190 | entity_category: diagnostic 191 | address: 4533 192 | register_type: holding 193 | value_type: U_WORD 194 | lambda: |- 195 | return swapBytes(x); 196 | 197 | - platform: modbus_controller 198 | modbus_controller_id: smg_inverter 199 | name: "ID4" 200 | icon: mdi:identifier 201 | entity_category: diagnostic 202 | address: 4534 203 | register_type: holding 204 | value_type: U_WORD 205 | lambda: |- 206 | return swapBytes(x); 207 | -------------------------------------------------------------------------------- /src-nowr/powmr-inverter/modules/inverter-info.yaml: -------------------------------------------------------------------------------- 1 | text_sensor: 2 | 3 | - platform: modbus_controller 4 | modbus_controller_id: smg_inverter 5 | id: Machine_Type 6 | name: "Machine Type" 7 | icon: mdi:memory 8 | entity_category: diagnostic 9 | address: 4517 10 | register_type: holding 11 | response_size: 2 12 | raw_encode: HEXBYTES 13 | lambda: |- 14 | uint16_t sensorIndex = swapBytes(modbus_controller::word_from_hex_str(x, 0)); 15 | switch (sensorIndex) { 16 | case 0: return std::string("Solar Inverter"); 17 | case 1: return std::string("Voltage regulator"); 18 | default: return std::string(x); 19 | } 20 | 21 | - platform: modbus_controller 22 | modbus_controller_id: smg_inverter 23 | id: Battery_Piece 24 | name: "Battery Piece" 25 | icon: mdi:battery 26 | entity_category: diagnostic 27 | address: 4520 28 | register_type: holding 29 | response_size: 2 30 | raw_encode: HEXBYTES 31 | lambda: |- 32 | uint16_t sensorIndex = swapBytes(modbus_controller::word_from_hex_str(x, 0)); 33 | switch (sensorIndex) { 34 | case 0: return std::string("No Battery"); 35 | case 1: return std::string("24V"); 36 | case 2: return std::string("48V"); 37 | default: return std::string(x); 38 | } 39 | 40 | sensor: 41 | 42 | - platform: modbus_controller 43 | modbus_controller_id: smg_inverter 44 | name: "Main CPU version" 45 | icon: mdi:chip 46 | entity_category: diagnostic 47 | address: 4518 48 | register_type: holding 49 | value_type: U_WORD 50 | lambda: |- 51 | return swapBytes(x); 52 | 53 | - platform: modbus_controller 54 | modbus_controller_id: smg_inverter 55 | name: "Secondary CPU version" 56 | icon: mdi:chip 57 | entity_category: diagnostic 58 | address: 4519 59 | register_type: holding 60 | value_type: U_WORD 61 | lambda: |- 62 | return swapBytes(x); 63 | 64 | - platform: modbus_controller 65 | modbus_controller_id: smg_inverter 66 | name: "Nominal output apparent power" 67 | entity_category: diagnostic 68 | unit_of_measurement: "VA" 69 | device_class: apparent_power 70 | address: 4521 71 | register_type: holding 72 | value_type: U_WORD 73 | lambda: |- 74 | return swapBytes(x); 75 | 76 | - platform: modbus_controller 77 | modbus_controller_id: smg_inverter 78 | name: "Nominal output active power" 79 | entity_category: diagnostic 80 | unit_of_measurement: "W" 81 | device_class: power 82 | address: 4522 83 | register_type: holding 84 | value_type: U_WORD 85 | lambda: |- 86 | return swapBytes(x); 87 | 88 | - platform: modbus_controller 89 | modbus_controller_id: smg_inverter 90 | name: "Nominal AC voltage" 91 | entity_category: diagnostic 92 | unit_of_measurement: "V" 93 | device_class: voltage 94 | address: 4523 95 | register_type: holding 96 | value_type: U_WORD 97 | lambda: |- 98 | return swapBytes(x); 99 | 100 | - platform: modbus_controller 101 | modbus_controller_id: smg_inverter 102 | name: "Nominal AC current" 103 | entity_category: diagnostic 104 | unit_of_measurement: "A" 105 | device_class: current 106 | address: 4524 107 | register_type: holding 108 | value_type: U_WORD 109 | lambda: |- 110 | return swapBytes(x); 111 | 112 | - platform: modbus_controller 113 | modbus_controller_id: smg_inverter 114 | name: "Rated battery voltage" 115 | entity_category: diagnostic 116 | unit_of_measurement: "V" 117 | device_class: voltage 118 | address: 4525 119 | register_type: holding 120 | value_type: U_WORD 121 | lambda: |- 122 | return swapBytes(x); 123 | filters: 124 | - multiply: 0.1 125 | 126 | - platform: modbus_controller 127 | modbus_controller_id: smg_inverter 128 | name: "Nominal output voltage" 129 | entity_category: diagnostic 130 | unit_of_measurement: "V" 131 | device_class: voltage 132 | address: 4526 133 | register_type: holding 134 | value_type: U_WORD 135 | lambda: |- 136 | return swapBytes(x); 137 | 138 | - platform: modbus_controller 139 | modbus_controller_id: smg_inverter 140 | name: "Nominal output frequency" 141 | entity_category: diagnostic 142 | unit_of_measurement: "Hz" 143 | device_class: frequency 144 | address: 4527 145 | register_type: holding 146 | value_type: U_WORD 147 | lambda: |- 148 | return swapBytes(x); 149 | filters: 150 | - multiply: 0.1 151 | 152 | - platform: modbus_controller 153 | modbus_controller_id: smg_inverter 154 | name: "Nominal output current" 155 | entity_category: diagnostic 156 | unit_of_measurement: "A" 157 | device_class: current 158 | address: 4528 159 | register_type: holding 160 | value_type: U_WORD 161 | lambda: |- 162 | return swapBytes(x); 163 | 164 | - platform: modbus_controller 165 | modbus_controller_id: smg_inverter 166 | name: "ID1" 167 | icon: mdi:identifier 168 | entity_category: diagnostic 169 | address: 4531 170 | register_type: holding 171 | value_type: U_WORD 172 | lambda: |- 173 | return swapBytes(x); 174 | 175 | - platform: modbus_controller 176 | modbus_controller_id: smg_inverter 177 | name: "ID2" 178 | icon: mdi:identifier 179 | entity_category: diagnostic 180 | address: 4532 181 | register_type: holding 182 | value_type: U_WORD 183 | lambda: |- 184 | return swapBytes(x); 185 | 186 | - platform: modbus_controller 187 | modbus_controller_id: smg_inverter 188 | name: "ID3" 189 | icon: mdi:identifier 190 | entity_category: diagnostic 191 | address: 4533 192 | register_type: holding 193 | value_type: U_WORD 194 | lambda: |- 195 | return swapBytes(x); 196 | 197 | - platform: modbus_controller 198 | modbus_controller_id: smg_inverter 199 | name: "ID4" 200 | icon: mdi:identifier 201 | entity_category: diagnostic 202 | address: 4534 203 | register_type: holding 204 | value_type: U_WORD 205 | lambda: |- 206 | return swapBytes(x); 207 | -------------------------------------------------------------------------------- /docs/registers-map-SmartESS.md: -------------------------------------------------------------------------------- 1 | System Info [4501-4515,4517-4529,4535-4553], Fault [4529-4530], Other [4531-4534]: 2 | - 4501 : Working State ["7": "ShutDown", "3": "Invert Mode", "4": "Line Mode", "0": "Power On", "5": "Bypass", "1": "Test", "6": "Fault Mode", "2": "Stand By"] 3 | - 4502 : AC input voltage, V 4 | - 4503 : AC input frequency, Hz 5 | - 4504 : PV input voltage, V 6 | - 4505 : PV input power, W 7 | - 4506 : Battery Voltage, V 8 | - 4507 : Battery capacity % 9 | - 4508 : Charging current, A 10 | - 4509 : Battery discharge current, A 11 | - 4510 : Output voltage, V, scale: 0.1 12 | - 4511 : Output frequency, Hz, scale: 0.1 13 | - 4512 : Output apparent power, VA 14 | - 4513 : Output active power, W 15 | - 4514 : AC output Load % 16 | - 4515 : Load Percent 17 | - 4517 : Machine Type ["0": "Solar Inverter", "1": "Voltage regulator"] 18 | - 4518 : Main CPU version 19 | - 4519 : Secondary CPU version 20 | - 4520 : Battery Piece ["0": "no battery", "1": "24V(3KW)", "2": "48V(5KW)"] 21 | - 4521 : Nominal output apparent power, VA 22 | - 4522 : Nominal output active power, W 23 | - 4523 : Nominal AC voltage, V 24 | - 4524 : Nominal AC current, A 25 | - 4525 : Rated battery voltage, V, scale: 0.1 26 | - 4526 : Nominal output voltage, V 27 | - 4527 : Nominal output frequency, Hz, scale: 0.1 28 | - 4528 : Nominal output current, A 29 | - 4529 : Error Code, binary: "0" - normal, "1" - fault. 30 | Bits: [0:"Fan locked",1:"Over Temperater",2:"Battery Voltage High", 31 | 3:"Battery Voltage Low",4:"Output shorted",5:"INV Voltage Over", 32 | 6:"Over Load",7:"Bus Voltage Over",8:"Bus Soft Failed", 33 | 9:"PV Voltage High",10:"Over Current",11:"Bus Voltage Under", 34 | 12:"INV Soft Failed",13:"DC Voltage Over",14:"CT Fault", 35 | 15:"INV Voltage Low"] 36 | - 4530 : Alarm Code, binary: binary: "0" - normal, "1" - alarm. 37 | Bits: [0:"Fan locked",1:"Over Temperater",2:"Battery Over Charged", 38 | 3:"Battery Voltage Low",4:"Over Load",5:"Output Power Derating", 39 | 6:"PV Energy Weak",7:"AC Voltage High",8:"No Battery"] 40 | - 4531 : ID1 41 | - 4532 : ID2 42 | - 4533 : ID3 43 | - 4534 : ID4 44 | - 4535 : Settings state, binary: "0" - disable, "1" - enable. 45 | Bits: [0:"Buzzer alarm",1:"Power saving mode",2:"LCD backlight", 46 | 3:"Overload auto restart",4:"Over temperature auto restart",5:"Beeps while primary source interupt", 47 | 6:"Auto return to default display screen",7:"Transfer to bypass @ overload,8:"Record fault code", 48 | 9:"Battery Equalization",10:"Battery Equalization activated immediately"] 49 | - 4536 : Charger Source Priority 50 | - 4537 : Output Source Priority ["0": "Utility (default)", "1": "Solar", "2": "SBU"] 51 | - 4538 : AC input range ["0": "Appliances (default)", "1": "UPS"] 52 | - 4539 : Battery type ["0": "AGM (default)","1": "Flooded","2": "User"] 53 | - 4540 : Output Frequency ["0": "50Hz(default)","1": "60Hz"] 54 | - 4541 : Max total charge current 55 | - 4542 : Output voltage ["220": "220V", "230": "230V", "240": "240V"] 56 | - 4543 : Max utility charge current 57 | - 4544 : Comeback utility mode voltage point under "SBU priority" 58 | - 4545 : Comeback battery mode voltage point under "SBU priority" 59 | - 4546 : Bulk charging voltage, V, scale: 0.1 60 | - 4547 : Floating charging voltage, V, scale: 0.1 61 | - 4548 : Low Battery cut-off voltage, V, scale: 0.1 62 | - 4549 : Battery Equalization voltage, V, scale: 0.1 63 | - 4550 : Battery Equalized time, min 64 | - 4551 : Battery Equalized timeout, min 65 | - 4552 : Battery Equalization interval, day 66 | - 4553 : APPShows, binary. 67 | * bits 0-1: Battery state ["3": "Ok","1": "Discharging","2": "Charging","0": "Disconnected"] 68 | * bits 2-3: PV state ["3": "Ok","1": "Discharging","2": "Overvoltage","0": "Undervoltage"] 69 | * bits 4-5: Mains supply state ["3": "Ok","1": "Absorption","2": "Discharging","0": "Abnormal"] 70 | * bits 6-7: Load state ["0": "Off","1": "Normal","2": "Overload"] 71 | 72 | - 4554 : Today Energy, KWH, scale: 0.01 (? 2 registers, 4 bytes) 73 | - 4556 : Month Energy, KWH, scale: 0.01 (? 2 registers, 4 bytes) 74 | - 4558 : Year Energy, KWH, scale: 0.01 (? 2 registers, 4 bytes) 75 | - 4560 : All Energy, KWH, scale: 0.01 (? 2 registers, 4 bytes) 76 | 77 | System settings [5001-5012, 5016-5033]: 78 | - 5001 : Remove all power history ["0": "Do nothing","1": "Remove all power history"] 79 | - 5002 : Buzzer alarm ["0": "disable","1": "enable"] 80 | - 5003 : Power saving mode ["0": "disable","1": "enable"] 81 | - 5004 : LCD backlight ["0": "disable","1": "enable"] 82 | - 5005 : Overload auto restart ["0": "disable","1": "enable"] 83 | - 5006 : Over temperature auto restart ["0": "disable","1": "enable"] 84 | - 5007 : Beeps while primary source interupt ["0": "disable","1": "enable"] 85 | - 5008 : Auto return to default display screen ["0": "disable","1": "enable"] 86 | - 5009 : Transfer to bypass @ overload ["0": "disable","1": "enable"] 87 | - 5010 : Record fault code ["0": "disable","1": "enable"] 88 | - 5011 : Battery Equalization ["0": "disable","1": "enable"] 89 | - 5012 : Battery Equalization activated immediately ["0": "disable","1": "enable"] 90 | - 5016 : Restore Defaults ["0": "disable","1": "enable"] 91 | - 5017 : Charger source priority ["3": "Solar only","1": "Solar","2": "Utility or Solar (default)","0": "Utility"] 92 | - 5018 : Output Source priority ["0": "Utility (default)","1": "Solar","2": "SBU"] 93 | - 5019 : AC input range ["0": "Appliances (default)","1": "UPS"] 94 | - 5020 : Battery type ["0": "AGM (default)","1": "Flooded","2": "User"] 95 | - 5021 : Output Frequency ["0": "50Hz (default)","1": "60Hz"] 96 | - 5022 : Max total charge current 97 | - 5023 : Output voltage ["220": "220V","230": "230V (default)","240": "240V"] 98 | - 5024 : Max utility charge current 99 | - 5025 : Comeback utility mode voltage point under "SBU priority". 12V: 10.5-15.0 (step 0.5) 24V: 21.0-25.5 (step 0.5) 48V: 45-51 (step 1). multiply: 10 100 | - 5026 : Comeback battery mode voltage point under "SBU priority". 12V: 12.0-17.0 (step 0.5) 24V: 24.0-29.0 (step 0.5) 48V: 48-58 (step 1). multiply: 10 101 | - 5027 : Bulk charging voltage. 12V: 12.5-15.5 24V: 25.0-31.5 48V: 48-61 (step 0.1). multiply: 10 102 | - 5028 : Floting charging voltage. 12V: 12.5-15.5 24V: 25.0-31.5 48V: 48-61 (step 0.1). multiply: 10 103 | - 5029 : Low Battery cut-off voltage. 12V: 10-12 24V: 20-24 48V: 40-48 (step 0.1). multiply: 10 104 | - 5030 : Battery Equalization voltage. 24V: 25.0-31.5 48V: 48-61 (step 0.1). multiply: 10 105 | - 5031 : Battery Equalized time. 5-900 min (step 5) 106 | - 5032 : Battery Equalized timeout. 5-900 min (step 5) 107 | - 5033 : Battery Equalization interval. 0-90 day (step 1) 108 | 109 | Time settings [6030-6035]: 110 | - 6030 : System time setting - year 111 | - 6031 : System time setting - month 112 | - 6032 : System time setting - day 113 | - 6033 : System time setting - hour 114 | - 6034 : System time setting - min 115 | - 6035 : System time setting - second -------------------------------------------------------------------------------- /docs/02FF.json: -------------------------------------------------------------------------------- 1 | { 2 | "Root": [ 3 | { 4 | "address": 40500, 5 | "valueType": 0, 6 | "digits": 1, 7 | "iconName": "", 8 | "title": { 9 | "base": "MPPT1 Input Voltage", 10 | "zh_cn": "MPPT1输入电压" 11 | }, 12 | "units": "V", 13 | "subTitle": "--", 14 | "scale": 0.1 15 | }, 16 | { 17 | "address": 40501, 18 | "valueType": 0, 19 | "digits": 1, 20 | "iconName": "", 21 | "title": { 22 | "base": "MPPT2 Input Voltage", 23 | "zh_cn": "MPPT2输入电压" 24 | }, 25 | "units": "V", 26 | "subTitle": "--", 27 | "scale": 0.1 28 | }, 29 | { 30 | "address": 40502, 31 | "valueType": 0, 32 | "digits": 1, 33 | "iconName": "", 34 | "title": { 35 | "base": "MPPT3 Input Voltage", 36 | "zh_cn": "MPPT3输入电压" 37 | }, 38 | "units": "V", 39 | "subTitle": "--", 40 | "scale": 0.1 41 | }, 42 | { 43 | "address": 40503, 44 | "valueType": 0, 45 | "digits": 1, 46 | "iconName": "", 47 | "title": { 48 | "base": "MPPT4 Input Voltage", 49 | "zh_cn": "MPPT4输入电压" 50 | }, 51 | "units": "V", 52 | "subTitle": "--", 53 | "scale": 0.1 54 | }, 55 | { 56 | "address": 40508, 57 | "valueType": 0, 58 | "digits": 2, 59 | "iconName": "", 60 | "title": { 61 | "base": "String 01 Input Current", 62 | "zh_cn": "组串01输入电流" 63 | }, 64 | "units": "A", 65 | "subTitle": "--", 66 | "scale": 0.01 67 | }, 68 | { 69 | "address": 40509, 70 | "valueType": 0, 71 | "digits": 2, 72 | "iconName": "", 73 | "title": { 74 | "base": "String 02 Input Current", 75 | "zh_cn": "组串02输入电流" 76 | }, 77 | "units": "A", 78 | "subTitle": "--", 79 | "scale": 0.01 80 | }, 81 | { 82 | "address": 40510, 83 | "valueType": 0, 84 | "digits": 2, 85 | "iconName": "", 86 | "title": { 87 | "base": "String 03 Input Current", 88 | "zh_cn": "组串03输入电流" 89 | }, 90 | "units": "A", 91 | "subTitle": "--", 92 | "scale": 0.01 93 | }, 94 | { 95 | "address": 40511, 96 | "valueType": 0, 97 | "digits": 2, 98 | "iconName": "", 99 | "title": { 100 | "base": "String 04 Input Current", 101 | "zh_cn": "组串04输入电流" 102 | }, 103 | "units": "A", 104 | "subTitle": "--", 105 | "scale": 0.01 106 | }, 107 | { 108 | "address": 40512, 109 | "valueType": 0, 110 | "digits": 2, 111 | "iconName": "", 112 | "title": { 113 | "base": "String 05 Input Current", 114 | "zh_cn": "组串05输入电流" 115 | }, 116 | "units": "A", 117 | "subTitle": "--", 118 | "scale": 0.01 119 | }, 120 | { 121 | "address": 40513, 122 | "valueType": 0, 123 | "digits": 2, 124 | "iconName": "", 125 | "title": { 126 | "base": "String 06 Input Current", 127 | "zh_cn": "组串06输入电流" 128 | }, 129 | "units": "A", 130 | "subTitle": "--", 131 | "scale": 0.01 132 | }, 133 | { 134 | "address": 40514, 135 | "valueType": 0, 136 | "digits": 2, 137 | "iconName": "", 138 | "title": { 139 | "base": "String 07 Input Current", 140 | "zh_cn": "组串07输入电流" 141 | }, 142 | "units": "A", 143 | "subTitle": "--", 144 | "scale": 0.01 145 | }, 146 | { 147 | "address": 40515, 148 | "valueType": 0, 149 | "digits": 2, 150 | "iconName": "", 151 | "title": { 152 | "base": "String 08 Input Current", 153 | "zh_cn": "组串08输入电流" 154 | }, 155 | "units": "A", 156 | "subTitle": "--", 157 | "scale": 0.01 158 | }, 159 | { 160 | "address": 40516, 161 | "valueType": 0, 162 | "digits": 2, 163 | "iconName": "", 164 | "title": { 165 | "base": "String 09 Input Current", 166 | "zh_cn": "组串09输入电流" 167 | }, 168 | "units": "A", 169 | "subTitle": "--", 170 | "scale": 0.01 171 | }, 172 | 173 | { 174 | "address": 40524, 175 | "valueType": 1, 176 | "digits": 2, 177 | "iconName": "", 178 | "title": { 179 | "base": "MPPT1 input power", 180 | "zh_cn": "MPPT1输入功率" 181 | }, 182 | "units": "kw", 183 | "subTitle": "--", 184 | "scale": 0.01 185 | }, 186 | { 187 | "address": 40525, 188 | "valueType": 1, 189 | "digits": 2, 190 | "iconName": "", 191 | "title": { 192 | "base": "MPPT2 input power", 193 | "zh_cn": "MPPT2输入功率" 194 | }, 195 | "units": "kw", 196 | "subTitle": "--", 197 | "scale": 0.01 198 | }, 199 | { 200 | "address": 40526, 201 | "valueType": 1, 202 | "digits": 2, 203 | "iconName": "", 204 | "title": { 205 | "base": "MPPT3 input power", 206 | "zh_cn": "MPPT3输入功率" 207 | }, 208 | "units": "kw", 209 | "subTitle": "--", 210 | "scale": 0.01 211 | }, 212 | { 213 | "address": 40527, 214 | "valueType": 1, 215 | "digits": 2, 216 | "iconName": "", 217 | "title": { 218 | "base": "MPPT4 input power", 219 | "zh_cn": "MPPT4输入功率" 220 | }, 221 | "units": "kw", 222 | "subTitle": "--", 223 | "scale": 0.01 224 | }, 225 | { 226 | "address": 40532, 227 | "valueType": 0, 228 | "digits": 1, 229 | "iconName": "", 230 | "title": { 231 | "base": "Grid AB line voltage", 232 | "zh_cn": "电网AB线电压" 233 | }, 234 | "units": "V", 235 | "subTitle": "--", 236 | "scale": 0.1 237 | }, 238 | { 239 | "address": 40533, 240 | "valueType": 0, 241 | "digits": 1, 242 | "iconName": "", 243 | "title": { 244 | "base": "Grid CB line voltage", 245 | "zh_cn": "电网BC线电压" 246 | }, 247 | "units": "V", 248 | "subTitle": "--", 249 | "scale": 0.1 250 | }, 251 | { 252 | "address": 40534, 253 | "valueType": 0, 254 | "digits": 1, 255 | "iconName": "", 256 | "title": { 257 | "base": "Grid CA line voltage", 258 | "zh_cn": "电网CA线电压" 259 | }, 260 | "units": "V", 261 | "subTitle": "--", 262 | "scale": 0.1 263 | }, 264 | { 265 | "address": 40538, 266 | "valueType": 0, 267 | "digits": 2, 268 | "iconName": "", 269 | "title": { 270 | "base": "Grid frequency", 271 | "zh_cn": "电网频率" 272 | }, 273 | "units": "Hz", 274 | "subTitle": "--", 275 | "scale": 0.01 276 | }, 277 | { 278 | "address": 40539, 279 | "valueType": 0, 280 | "digits": 2, 281 | "iconName": "", 282 | "title": { 283 | "base": "AC active power", 284 | "zh_cn": "交流有功功率" 285 | }, 286 | "units": "kw", 287 | "subTitle": "--", 288 | "scale": 0.01 289 | }, 290 | { 291 | "address": 40540, 292 | "valueType": 0, 293 | "digits": 2, 294 | "iconName": "", 295 | "title": { 296 | "base": "AC reactive power", 297 | "zh_cn": "交流无功功率" 298 | }, 299 | "units": "kVar", 300 | "subTitle": "--", 301 | "scale": 0.01 302 | }, 303 | { 304 | "address": 40541, 305 | "valueType": 0, 306 | "digits": 2, 307 | "iconName": "", 308 | "title": { 309 | "base": "DC input power", 310 | "zh_cn": "直流输入功率" 311 | }, 312 | "units": "kw", 313 | "subTitle": "--", 314 | "scale": 0.01 315 | }, 316 | { 317 | "address": 40542, 318 | "valueType": 1, 319 | "digits": 2, 320 | "iconName": "", 321 | "title": { 322 | "base": "Inverter efficiency", 323 | "zh_cn": "逆变器效率" 324 | }, 325 | "units": "%", 326 | "subTitle": "--", 327 | "scale": 0.01 328 | }, 329 | { 330 | "address": 40544, 331 | "valueType": 0, 332 | "digits": 1, 333 | "iconName": "", 334 | "title": { 335 | "base": "Temperature inside the machine", 336 | "zh_cn": "机内温度" 337 | }, 338 | "units": "℃", 339 | "subTitle": "--", 340 | "scale": 0.1 341 | }, 342 | { 343 | "address": 40545, 344 | "valueType": 1, 345 | "digits": 1, 346 | "iconName": "", 347 | "title": { 348 | "base": "Insulation resistance", 349 | "zh_cn": "绝缘阻抗" 350 | }, 351 | "units": "kΩ", 352 | "subTitle": "--", 353 | "scale": 0.1 354 | }, 355 | { 356 | "address": 40548, 357 | "length":2, 358 | "byteSoft":1, 359 | "valueType": 1, 360 | "digits": 2, 361 | "iconName": "", 362 | "title": { 363 | "base": "Power generation of the day", 364 | "zh_cn": "当日发电量" 365 | }, 366 | "units": "kWh", 367 | "subTitle": "--", 368 | "scale": 0.01 369 | }, 370 | { 371 | "address": 40550, 372 | "length":2, 373 | "byteSoft":1, 374 | "valueType": 1, 375 | "digits": 2, 376 | "iconName": "", 377 | "title": { 378 | "base": "Cumulative power generation", 379 | "zh_cn": "累计发电量" 380 | }, 381 | "units": "kWh", 382 | "subTitle": "--", 383 | "scale": 0.01 384 | } 385 | , 386 | { 387 | "address": 40552, 388 | "length":2, 389 | "byteSoft":1, 390 | "valueType": 1, 391 | "digits": 2, 392 | "iconName": "", 393 | "title": { 394 | "base": "CO2 reduction", 395 | "zh_cn": "二氧化碳减排量" 396 | }, 397 | "units": "kg", 398 | "subTitle": "--", 399 | "scale": 0.01 400 | } 401 | 402 | 403 | 404 | 405 | 406 | ], 407 | "OherCodes": {}, 408 | "Configuration": { 409 | "devAddrs": [ 410 | "1" 411 | ], 412 | "writeOneFunCode": 6, 413 | "writeMoreFunCode": 10, 414 | "SystemInfoVC": [ 415 | { 416 | "title": { 417 | "base": "System data", 418 | "zh_cn": "系统数据" 419 | }, 420 | "segments": [ 421 | { 422 | "canEdit": false, 423 | "length": 4, 424 | "funNumber": 3, 425 | "startAddress": 40500 426 | }, 427 | { 428 | "canEdit": false, 429 | "length": 9, 430 | "funNumber": 3, 431 | "startAddress": 40508 432 | }, 433 | { 434 | "canEdit": false, 435 | "length": 4, 436 | "funNumber": 3, 437 | "startAddress": 40524 438 | }, 439 | { 440 | "canEdit": false, 441 | "length": 3, 442 | "funNumber": 3, 443 | "startAddress": 40532 444 | }, 445 | { 446 | "canEdit": false, 447 | "length": 5, 448 | "funNumber": 3, 449 | "startAddress": 40538 450 | }, 451 | { 452 | "canEdit": false, 453 | "length": 2, 454 | "funNumber": 3, 455 | "startAddress": 40544 456 | }, 457 | 458 | { 459 | "canEdit": false, 460 | "length": 3, 461 | "funNumber": 3, 462 | "startAddress": 40548 463 | } 464 | 465 | ] 466 | } 467 | ], 468 | "SystemSettingVC": [ 469 | { 470 | "title": { 471 | "base": "System Setting", 472 | "zh_cn": "系统设置" 473 | }, 474 | "segments": [ 475 | { 476 | "canEdit": true, 477 | "length": 1, 478 | "funNumber": 3, 479 | "startAddress": 40200 480 | } 481 | ] 482 | } 483 | ], 484 | "addressOffset": { 485 | "offsetBase": 1, 486 | "offsetType": 0, 487 | "offsetAddress": 0 488 | } 489 | } 490 | } -------------------------------------------------------------------------------- /examples/lovelace-powmr.yaml: -------------------------------------------------------------------------------- 1 | icon: mdi:solar-power-variant 2 | path: powmr 3 | title: PowMr Inverter 4 | type: sections 5 | max_columns: 2 6 | sections: 7 | - type: grid 8 | cards: 9 | - type: custom:stack-in-card 10 | cards: 11 | - type: conditional 12 | conditions: 13 | - entity: sensor.powmr_inverter_load_state 14 | state: unavailable 15 | card: 16 | type: markdown 17 | content: | 18 | Inverter is turned off 19 | style: | 20 | ha-card { 21 | margin: 0px 0; 22 | border: 0; 23 | } 24 | - type: conditional 25 | conditions: 26 | - entity: sensor.powmr_inverter_load_state 27 | state_not: unavailable 28 | card: 29 | type: vertical-stack 30 | cards: 31 | - type: custom:sunsynk-power-flow-card 32 | cardstyle: full 33 | show_solar: true 34 | show_battery: true 35 | show_grid: true 36 | panel_mode: false 37 | decimal_places: 3 38 | no_card: true 39 | card_mod: 40 | style: | 41 | ha-card { 42 | margin-top: -5px !important; 43 | } 44 | .card { 45 | box-shadow: none !important; 46 | } 47 | inverter: 48 | modern: false 49 | colour: gray 50 | autarky: power 51 | model: powmr 52 | tree_phase: false 53 | auto_scale: true 54 | battery: 55 | energy: 11520 56 | shutdown_soc: 5 57 | colour: "#9A64A0" 58 | show_daily: true 59 | invert_power: true 60 | show_absolute: true 61 | solar: 62 | show_daily: true 63 | maxpower: 2400 64 | pv1_name: Solar 65 | mppts: 1 66 | display_mode: 1 67 | load: 68 | show_daily: true 69 | auto_scale: true 70 | grid: 71 | grid_name: Utility Power 72 | show_daily_buy: false 73 | show_daily_sell: false 74 | show_nonessential: false 75 | grid_off_colour: "#aaaa" 76 | auto_scale: true 77 | dynamic_icon: true 78 | dynamic_colour: true 79 | entities: 80 | inverter_voltage_154: sensor.powmr_inverter_load_voltage 81 | inverter_current_164: sensor.powmr_inverter_load_current 82 | inverter_power_175: sensor.powmr_inverter_load_power 83 | load_frequency_192: sensor.powmr_inverter_load_frequency 84 | grid_connected_status_194: binary_sensor.powmr_inverter_grid_active 85 | #grid_ct_power_172: sensor.powmr_grid_power 86 | day_load_energy_84: sensor.powmr_inverter_daily_energy 87 | battery_voltage_183: sensor.powmr_inverter_battery_voltage 88 | battery_soc_184: sensor.inverter_battery_soc 89 | battery_power_190: sensor.powmr_inverter_battery_power 90 | battery_current_191: sensor.powmr_inverter_battery_current 91 | #battery_temp_182: sensor.jkbms_b2a8s20p_calb_temperature_sensor_1 92 | battery_rated_capacity: 480 93 | pv1_power_186: sensor.powmr_inverter_pv_power 94 | pv1_voltage_109: sensor.powmr_inverter_pv_voltage 95 | pv1_current_110: sensor.powmr_inverter_pv_current 96 | day_pv_energy_108: sensor.powmr_inverter_pv_daily_energy 97 | #environment_temp: sensor.sonoff_sw1_bme280_temperature_2 98 | day_battery_charge_70: sensor.powmr_inverter_battery_daily_charge_energy 99 | day_battery_discharge_71: sensor.powmr_inverter_battery_daily_discharge_energy 100 | # add your essentials loads 101 | #essential_load1: sensor.boiler_shp_plug_power 102 | #essential_load2: sensor.earu_mcb_power 103 | #essential_load3: sensor.fridge_plug_power 104 | #essential_load4: sensor.freezer_plug_bl0937_power 105 | - type: tile 106 | entity: sensor.powmr_inverter_working_state 107 | name: Mode 108 | color: accent 109 | icon: "" 110 | - type: tile 111 | entity: sensor.powmr_inverter_load_power_factor 112 | name: Power Factor 113 | icon: mdi:power-plug 114 | color: teal 115 | - type: grid 116 | cards: 117 | - type: custom:mini-graph-card 118 | entities: 119 | - entity: sensor.powmr_inverter_load_power 120 | name: Inverter (W) 121 | - entity: sensor.powmr_inverter_pv_power 122 | name: Solar Panels 123 | - entity: sensor.powmr_inverter_load_percent 124 | name: Inverter (%) 125 | y_axis: secondary 126 | hours_to_show: 14 127 | points_per_hour: 32 128 | show: 129 | labels: true 130 | name: false 131 | icon: false 132 | extrema: true 133 | labels_secondary: true 134 | line_width: 2 135 | animate: true 136 | - type: tile 137 | entity: sensor.powmr_inverter_mains_supply_state 138 | color: purple 139 | name: Mains supply State 140 | - type: tile 141 | entity: sensor.powmr_inverter_load_percent 142 | name: Load 143 | - type: tile 144 | entity: sensor.powmr_inverter_load_current 145 | name: Current 146 | color: indigo 147 | - type: grid 148 | cards: 149 | - type: heading 150 | heading: Solar Panels 151 | heading_style: subtitle 152 | icon: mdi:solar-power-variant 153 | - type: custom:mini-graph-card 154 | entities: 155 | - entity: sensor.powmr_inverter_pv_power 156 | name: Power 157 | - entity: sensor.powmr_inverter_pv_voltage 158 | name: Voltage 159 | y_axis: secondary 160 | hours_to_show: 14 161 | points_per_hour: 32 162 | show: 163 | labels: true 164 | name: false 165 | icon: false 166 | extrema: true 167 | labels_secondary: true 168 | line_width: 2 169 | animate: true 170 | - type: tile 171 | entity: sensor.powmr_inverter_pv_state 172 | name: State 173 | color: purple 174 | - type: tile 175 | entity: sensor.powmr_inverter_pv_temperature 176 | icon: mdi:coolant-temperature 177 | color: accent 178 | name: Temperature 179 | - type: grid 180 | cards: 181 | - type: heading 182 | heading: Battery 183 | heading_style: subtitle 184 | icon: mdi:home-battery 185 | - type: custom:mini-graph-card 186 | entities: 187 | - entity: sensor.powmr_inverter_battery_voltage 188 | name: Voltage 189 | - entity: sensor.powmr_inverter_battery_power 190 | name: Power 191 | y_axis: secondary 192 | hours_to_show: 14 193 | points_per_hour: 32 194 | show: 195 | labels: true 196 | name: false 197 | icon: false 198 | extrema: true 199 | labels_secondary: true 200 | line_width: 2 201 | animate: true 202 | - type: tile 203 | entity: sensor.powmr_inverter_battery_state 204 | name: State 205 | color: purple 206 | - type: tile 207 | entity: sensor.powmr_inverter_battery_current 208 | name: Current 209 | - type: grid 210 | cards: 211 | - type: heading 212 | heading: Inverter configs 213 | heading_style: subtitle 214 | icon: mdi:application-cog 215 | - type: tile 216 | entity: select.powmr_inverter_output_voltage 217 | name: Output Voltage 218 | icon: mdi:home-export-outline 219 | color: primary 220 | - type: tile 221 | entity: select.powmr_inverter_ac_input_voltage_range 222 | name: Input Voltage 223 | icon: mdi:home-import-outline 224 | - type: tile 225 | entity: select.powmr_inverter_output_source_priority 226 | name: Output Priority 227 | icon: mdi:export 228 | color: lime 229 | - type: tile 230 | entity: select.powmr_inverter_charger_source_priority 231 | name: Charger Priority 232 | icon: mdi:battery-charging 233 | color: purple 234 | - type: tile 235 | entity: select.powmr_inverter_restart_on_overheat 236 | name: Restart On Overheat 237 | icon: mdi:restart-alert 238 | color: accent 239 | - type: tile 240 | entity: select.powmr_inverter_restart_on_overload 241 | name: Restart On Overload 242 | icon: mdi:restart 243 | color: red 244 | - type: tile 245 | entity: select.powmr_inverter_buzzer_alarm 246 | name: Buzzer 247 | icon: mdi:speaker-wireless 248 | color: brown 249 | - type: tile 250 | entity: select.powmr_inverter_backlight 251 | name: Backlight 252 | icon: mdi:alarm-light 253 | color: light-blue 254 | - type: tile 255 | entity: select.powmr_inverter_return_to_default_display 256 | icon: mdi:backburger 257 | name: Return To Default Display 258 | color: cyan 259 | - type: tile 260 | entity: select.powmr_inverter_beep_on_primary_source_fail 261 | name: Beep On Primary Source Fail 262 | color: blue-grey 263 | - type: grid 264 | cards: 265 | - type: heading 266 | heading: Inverter configs 267 | heading_style: subtitle 268 | icon: mdi:application-cog 269 | - type: tile 270 | entity: select.powmr_inverter_max_total_charge_current 271 | name: Max Total Charge, A 272 | icon: mdi:battery-charging-100 273 | - type: tile 274 | entity: select.powmr_inverter_utility_charge_current 275 | name: Utility Charge, A 276 | icon: mdi:transmission-tower-export 277 | color: primary 278 | - type: tile 279 | entity: number.powmr_inverter_bulk_charging_voltage 280 | name: Bulk Charging V 281 | icon: mdi:battery-arrow-down 282 | color: yellow 283 | - type: tile 284 | entity: number.powmr_inverter_floating_charging_voltage 285 | name: Floating Charging V 286 | icon: mdi:battery-sync-outline 287 | color: green 288 | - type: tile 289 | entity: number.powmr_inverter_back_to_utility_source_voltage 290 | name: Back to Utility V 291 | icon: mdi:transmission-tower-import 292 | color: red 293 | - type: tile 294 | entity: number.powmr_inverter_back_to_battery_source_voltage 295 | name: Back to Battery V 296 | color: light-green 297 | icon: mdi:power-plug-battery 298 | - type: tile 299 | entity: number.powmr_inverter_low_dc_cut_off_voltage 300 | name: Battery Low V 301 | color: accent 302 | - type: tile 303 | entity: select.powmr_inverter_overload_bypass 304 | name: OverLoad Bypass 305 | icon: mdi:transit-skip 306 | color: red 307 | badges: 308 | - type: entity 309 | show_name: true 310 | show_state: true 311 | show_icon: true 312 | entity: sensor.powmr_inverter_uptime_hr 313 | color: green 314 | name: Uptime 315 | - type: entity 316 | entity: sensor.powmr_inverter_wifi_signal_percent 317 | color: purple 318 | name: WiFi 319 | display_type: complete 320 | - type: entity 321 | show_name: true 322 | show_state: true 323 | show_icon: true 324 | entity: sensor.powmr_inverter_load_state 325 | name: Load 326 | color: "" 327 | - type: entity 328 | show_name: true 329 | show_state: true 330 | show_icon: true 331 | color: deep-orange 332 | entity: sensor.powmr_inverter_charger_status 333 | name: Charger 334 | show_entity_picture: false 335 | - type: entity 336 | show_name: true 337 | show_state: true 338 | show_icon: true 339 | entity: sensor.powmr_inverter_errors 340 | color: pink 341 | name: Errors 342 | - type: entity 343 | show_name: true 344 | show_state: true 345 | show_icon: true 346 | entity: sensor.powmr_inverter_alarms 347 | color: yellow 348 | name: Alarms 349 | cards: [] 350 | -------------------------------------------------------------------------------- /pcb/EasyEDA_SCH_ESPHome_Inverter_2341.json: -------------------------------------------------------------------------------- 1 | { 2 | "editorVersion": "6.5.47", 3 | "docType": "5", 4 | "title": "ESPHome_Inverter_2341", 5 | "description": "", 6 | "colors": {}, 7 | "schematics": [ 8 | { 9 | "docType": "1", 10 | "title": "Main board", 11 | "description": "", 12 | "dataStr": { 13 | "head": { 14 | "docType": "1", 15 | "editorVersion": "6.5.47", 16 | "newgId": true, 17 | "c_para": { 18 | "Prefix Start": "1" 19 | }, 20 | "c_spiceCmd": "null", 21 | "hasIdFlag": true, 22 | "uuid": "71d6abb944f84fb8ac3c9e43ea9fade8", 23 | "x": "0", 24 | "y": "0", 25 | "portOfADImportHack": "", 26 | "importFlag": 0, 27 | "transformList": "" 28 | }, 29 | "canvas": "CA~1000~1000~#FFFFFF~yes~#CCCCCC~5~1000~1000~line~5~pixel~5~0~0", 30 | "shape": [ 31 | "LIB~0~-850~package`NONE`Manufacturer Part`?`spicePre`.`~~0~frame_lib_1~~~0~~yes~yes~~~#@$T~N~102.359375~-1179~0~#000080~Arial~~~~~comment~A~0~start~gge223~0~#@$T~P~102.3828125~-1188~0~#000080~Arial~~~~~comment~A~0~start~gge220~0~#@$PT~M 206 -840 L 206 -850 M 206 -380 L 206 -370 M 402 -840 L 402 -850 M 402 -380 L 402 -370 M 598 -840 L 598 -850 M 598 -380 L 598 -370 M 10 -644 L 0 -644 M 670 -644 L 680 -644 M 10 -448 L 0 -448 M 670 -448 L 680 -448~#880000~1~0~none~gge72488~0~frame_tick#@$T~L~1.5~-742~0~#880000~~~~~~comment~A~1~start~gge72491~0~frame_tick#@$T~L~671.5~-742~0~#880000~~~~~~comment~A~1~start~gge72497~0~frame_tick#@$T~L~1.5~-546~0~#880000~~~~~~comment~B~1~start~gge72503~0~frame_tick#@$T~L~671.5~-546~0~#880000~~~~~~comment~B~1~start~gge72509~0~frame_tick#@$T~L~108~-841.5~0~#880000~~~~~~comment~1~1~start~gge72515~0~frame_tick#@$T~L~108~-371.5~0~#880000~~~~~~comment~1~1~start~gge72521~0~frame_tick#@$T~L~304~-841.5~0~#880000~~~~~~comment~2~1~start~gge72527~0~frame_tick#@$T~L~304~-371.5~0~#880000~~~~~~comment~2~1~start~gge72533~0~frame_tick#@$T~L~500~-841.5~0~#880000~~~~~~comment~3~1~start~gge72539~0~frame_tick#@$T~L~500~-371.5~0~#880000~~~~~~comment~3~1~start~gge72545~0~frame_tick#@$R~10~-840~~~660~460~#880000~1~0~none~gge121~0~frame_innerbox#@$R~0~-850~~~680~480~#880000~1~0~none~gge124~0~frame_outbox#@$R~225.99995~-460~~~444~80~#880000~1~0~none~gge127~0~frame_hitarea#@$PL~226.1 -420.75 669.63 -420.75~#880000~1~0~none~gge130~0#@$PL~330.63 -400.75 669.63 -400.75~#880000~1~0~none~gge133~0#@$PL~590.61 -459.93 590.63 -420.75~#880000~1~0~none~gge136~0#@$PL~590.63 -420.75 590.63 -400.75~#880000~1~0~none~gge139~0#@$T~L~230.99995~-447~0~#880000~~8pt~~~~comment~TITLE:~1~start~gge142~0~pinpart#@$T~L~288.62495~-434.41~0~#0000FF~~10pt~~~~comment~ESPHome Inverter 2341~1~start~gge148~0~frame_title#@$T~L~595.62~-433.75~0~#880000~~8pt~~~~comment~REV:~1~start~gge154~0~pinpart#@$T~L~633.62~-433.75~0~#0000FF~~9pt~~~~comment~1.0~1~start~gge160~0~frame_version#@$T~L~335.62495~-385~0~#880000~~8pt~~~~comment~Date:~1~start~gge166~0~pinpart#@$T~L~382.62495~-384.52~0~#0000FF~~9pt~~~~comment~2024-09-06~1~start~gge172~0~frame_date#@$T~L~594.62~-405~0~#880000~~8pt~~~~comment~Sheet:~1~start~gge178~0~pinpart#@$T~L~639.62~-404.52~0~#0000FF~~9pt~~~~comment~1/1~1~start~gge184~0~frame_sheet#@$T~L~474.62495~-384.75~0~#880000~~8pt~~~~comment~Drawn By:~1~start~gge190~0~pinpart#@$T~L~335.62495~-406.75~0~#880000~~8pt~~~~comment~Company:~1~start~gge202~0~pinpart#@$PL~330.63 -420.75 330.63 -380.75~#880000~1~0~none~gge214~0#@$Pimage~L~1~gge217~0~gge72485~224~-416.5~110~35~data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjxzdmcgdmVyc2lvbj0iMS4xIiBpZD0iSkxDRURBIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4PSIwcHgiIHk9IjBweCIgdmlld0JveD0iMCAwIDIwMDAgNjI5IiBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6IG5ldyAwIDAgMjAwMCA2Mjk7IiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCgk8cmVjdCBzdHlsZT0iZGlzcGxheTogbm9uZTsgZmlsbDogI0ZGRkZGRjsiIHdpZHRoPSIyMDAwIiBoZWlnaHQ9IjYyOSIgLz4NCgk8cmVjdCB4PSIyMjk4IiB5PSItNjc2IiBzdHlsZT0iZGlzcGxheTogbm9uZTsgZmlsbDogI0ZGRkZGRjsiIHdpZHRoPSIyMDAwIiBoZWlnaHQ9IjIwMDAiIC8+DQoJPGRlc2M+Q3JlYXRlZCBieSBYaWFvWGkoYWRtaW5Ac29yYWhhcnUuY29tKS48L2Rlc2M+DQoJPGc+DQoJCTxwYXRoIHN0eWxlPSJmaWxsOiAjNTU4OEZGOyIgZD0iTTE0NzQuNSwxODguN2MtMC4zLDAtMTE4LjMsMC0xMTguMywwbC0zMCwyMTkuM2gxMjMuN2wwLDBjMTAuNC0wLjIsMTguOC04LjcsMTguOC0xOS4xDQoJCQljMC0xMC42LTguNi0xOS4xLTE5LjEtMTkuMWMtMC40LDAtNzYuNywwLjEtNzYuNywwLjFsOC4xLTU4LjFjMCwwLDc4LjMsMC4xLDc5LDAuMWMxMC43LDAsMTkuNC04LjcsMTkuNC0xOS40DQoJCQljMC05LjYtNy0xNy42LTE2LjItMTkuMWgtNzYuOWw2LjMtNDUuNWMwLDAsODEuNS0wLjEsODItMC4xYzEwLjcsMCwxOS40LTguNywxOS40LTE5LjRDMTQ5My45LDE5Ny40LDE0ODUuMiwxODguNywxNDc0LjUsMTg4Ljd6IiAvPg0KCQk8cGF0aCBzdHlsZT0iZmlsbDogIzU1ODhGRjsiIGQ9Ik0xNjg4LjksMjkzLjhjMC0yMS42LTUtNDAuNi0xNC45LTU3LjFjLTkuOS0xNi41LTIyLjktMjguNi0zOC44LTM2LjMNCgkJCWMtMTUuOS03LjctNDAuMS0xMS41LTcyLjctMTEuNWgtMzQuN2wtMzAsMjE5LjNoNjguMmMyOC42LDAsNTAuOS00LjMsNjctMTIuOGMxNi4xLTguNSwyOS41LTIyLDQwLTQwLjUNCgkJCUMxNjgzLjcsMzM2LjIsMTY4OC45LDMxNS44LDE2ODguOSwyOTMuOHogTTE2MzUsMzM5Yy03LjksMTIuMS0xOC40LDIwLjYtMzEuNiwyNS41Yy05LjMsMy40LTI0LjQsNS4zLTQ1LjMsNS4zaC0xMy42bDE5LjMtMTQyLjMNCgkJCWgxMC4zYzE2LjksMCwzMC40LDIuNiw0MC42LDhjMTAuMSw1LjQsMTgsMTIuOSwyMy42LDIyLjdjNS42LDkuOCw4LjQsMjIsOC40LDM2LjVDMTY0Ni45LDMxMi4yLDE2NDIuOSwzMjcsMTYzNSwzMzl6IiAvPg0KCQk8cGF0aCBzdHlsZT0iZmlsbDogIzU1ODhGRjsiIGQ9Ik0xODQ2LjksMjkxLjRsLTI0LDEzLjJjLTIsMTcuMy0xNi43LDMwLjktMzQuNiwzMC45Yy0xOS4yLDAtMzQuOC0xNS42LTM0LjgtMzQuOA0KCQkJYzAtMTkuMiwxNS42LTM0LjgsMzQuOC0zNC44YzcuNCwwLDE0LjMsMi4zLDE5LjksNi4zbDI5LjgtMTYuNGwtMTYuMS02NC43aC0zNGwtMTE2LjEsMjE0LjloNDMuNWwyNC40LTQ1LjdoODUuM2wxMS40LDQ1LjdoMzkuMg0KCQkJTDE4NDYuOSwyOTEuNHoiIC8+DQoJCQk8ZWxsaXBzZSB0cmFuc2Zvcm09Im1hdHJpeCgxLjA2MzczM2UtMDIgLTAuOTk5OSAwLjk5OTkgMS4wNjM3MzNlLTAyIDE0NzAuMDY5NiAyMDg1LjY3MzgpIiBzdHlsZT0iZmlsbDogIzU1ODhGRjsiIGN4PSIxNzg5IiBjeT0iMjk5LjkiIHJ4PSIxMy41IiByeT0iMTMuNSIgLz4NCgkJPHBhdGggc3R5bGU9ImZpbGw6ICM1NTg4RkY7IiBkPSJNMTIxNS41LDM2Mi4zYzIuNSwyLjgsNi4zLDQuNiwxMC4xLDQuNmgwLjVjNy42LDAsMTQtNS43LDE1LTEzLjJsMjAuMy0xNDMuNmgtMjkuMmwtMjAuMSwxNDEuNg0KCQkJQzEyMTEuOCwzNTUuNCwxMjEyLjksMzU5LjQsMTIxNS41LDM2Mi4zeiIgLz4NCgkJPHBhdGggc3R5bGU9ImZpbGw6ICM1NTg4RkY7IiBkPSJNMTI1MC4zLDM3OC40Yy0wLjMsMi4yLTEuNSw0LjYtMy40LDYuNmMtMS44LDEuNy0zLjcsMi41LTYuMSwyLjVoLTE5LjljLTcuNCwwLTE0LDUuOC0xNSwxMy4yDQoJCQlsLTAuMSwwLjVjLTAuNSw0LDAuNyw3LjgsMy4yLDEwLjdjMi41LDIuOCw2LjMsNC42LDEwLjEsNC42aDE5LjljNS40LDAsMTAuMi0xLDE0LjctMy4yYzEzLjgtNS43LDIzLjItMTcuOCwyNS4xLTMyLjdsMjUuMS0xOTMuNg0KCQkJaC0yOC45TDEyNTAuMywzNzguNHoiIC8+DQoJCTxwYXRoIHN0eWxlPSJmaWxsOiAjNTU4OEZGOyIgZD0iTTEyMDYuNywyNTkuOWMzLjYsMCw2LjYtMi45LDYuNi02LjZjMC0wLjctMC4xLTEuMy0wLjMtMS45YzAsMCwwLDAsMC4xLDBsLTEyLjEtNDJsLTAuMS0wLjINCgkJCWMtMy04LjEtNy0xNC4zLTExLjktMTguMWwtMC41LTAuNGMtNS43LTMuNi0xMy4xLTUuNS0yMi43LTUuNWgtMzIuNmMtOS4yLDAtMTYuOSwxLjktMjIuOCw1LjZjLTYuMyw0LTExLjYsOS43LTE1LjgsMTcNCgkJCWMwLDAtMTYuNywyOC0yNS40LDQyLjRsMC4xLDAuMWMtMC41LDAuOS0wLjgsMS45LTAuOCwzYzAsMy42LDIuOSw2LjYsNi42LDYuNmMwLjEsMCwwLjIsMCwwLjIsMGgyMC43YzEuNi0yLjcsMy4zLTUuNCw1LTguMQ0KCQkJbDAuNS0wLjhjNS40LTkuMywxMi4yLTIwLjgsMTcuNS0yOS41bDAuMS0wLjJjMS40LTIuNCwzLjMtNC41LDUuNC01LjhjMS42LTEsNC4xLTEuNSw3LjEtMS41aDMyLjZjMi43LDAsNC44LDAuNCw1LjgsMS4xDQoJCQljMS40LDEuMSwyLjYsMi44LDMuMiw0LjdsMTEuNSw0MGgyMS4xdi0wLjFDMTIwNi4xLDI1OS45LDEyMDYuNCwyNTkuOSwxMjA2LjcsMjU5Ljl6IiAvPg0KCQk8cGF0aCBzdHlsZT0iZmlsbDogIzU1ODhGRjsiIGQ9Ik0xMTczLDI2OC44aC02MC45Yy04LjQsMC0xNi45LDMuMy0yMy45LDkuM2MtNi44LDUuOC0xMS4zLDEzLjYtMTIuOSwyMS45bC0xNC40LDc4LjcNCgkJCWMtMC45LDUuMS0wLjcsMTAsMC41LDE0LjRjMi4yLDkuMiw4LjEsMTYuMywxNi40LDIwYzQsMi4yLDguNSwzLjMsMTQsMy4zaDg0LjJjNy41LDAsMTQuMS01LjYsMTUuNC0xMy4xbDAuMS0wLjUNCgkJCWMwLjctNC0wLjMtNy44LTIuNy0xMC43Yy0yLjQtMi44LTUuOS00LjUtOS45LTQuNWgtODQuMmMtMS44LDAtMy4zLTAuNy00LjUtMmwtMC4yLTAuMmMtMC42LTAuNy0xLjQtMS45LTAuOS00LjdsMTQuNS03OC44DQoJCQljMC4zLTEuNSwwLjctMi4yLDEuOS0zLjFsMC41LTAuNGMwLjctMC43LDEuNC0xLDMuMi0xaDYwLjljMC44LDAsMS4yLDAuMSwxLjIsMC4xbDAuMywwLjRjMC4yLDAuMywwLjUsMC42LDAuMiwybC03LjYsMzMuMg0KCQkJYy0wLjUsMi43LTIuNSw0LjYtNS4xLDQuNkgxMTMyYy03LjQsMC0xNC4yLDUuOC0xNS40LDEzLjFsLTAuMSwwLjdjLTAuNiwzLjcsMC4zLDcuNSwyLjcsMTAuM2MyLjQsMi45LDYuMSw0LjYsOS45LDQuNmgyNy4yDQoJCQljMC44LDAsMS41LDAsMi4zLTAuMWMwLjYsMCwxLjIsMC4xLDEuOCwwLjFjMTYuNSwwLDI4LjctMTAuNSwzMC4zLTI0LjFjMS0zLjcsOS43LTQwLjMsOS43LTQwLjNjMC44LTQuNCwwLjYtOC43LTAuNi0xMi41DQoJCQlDMTE5Ni42LDI3Ni45LDExODYuMiwyNjguOCwxMTczLDI2OC44eiIgLz4NCgkJPHBhdGggc3R5bGU9ImZpbGw6ICM1NTg4RkY7IiBkPSJNMTAxOSwzODcuM0g4MTMuOWwtMi4xLDIyLjRjMCwwLDAsMCwwLjEsMHYwLjFjMCwzLjYsMi45LDYuNyw2LjcsNi43bDAsMGwwLDBoMTk4LjcNCgkJCWM3LjMsMCwxMy44LTUuOCwxNC44LTEzLjJsMC4xLTAuN2MwLjUtNC0wLjctNy45LTMuMi0xMC44QzEwMjYuMywzODksMTAyMi44LDM4Ny4zLDEwMTksMzg3LjN6IiAvPg0KCQk8cGF0aCBzdHlsZT0iZmlsbDogIzU1ODhGRjsiIGQ9Ik05NTguOSwzODFsMS41LDAuNGMxLjIsMC4zLDIuNCwwLjUsMy42LDAuNWwwLDBjNS43LDAsMTEtMy40LDEzLjYtOC43DQoJCQljMTUuNi0zMy41LDI3LjUtODYuMSw0MC4yLTEyOC4ybDAuMS0wLjNjMC4xLTAuMywwLjEtMC41LDAuMi0wLjhoLTMwYy0xMS45LDM5LjMtMjIuNyw4OC43LTM2LjcsMTE4LjdjLTEuNiwzLjYtMS42LDcuNywwLDExLjMNCgkJCUM5NTIuOCwzNzcuMSw5NTUuNCwzNzkuNyw5NTguOSwzODF6IiAvPg0KCQk8cGF0aCBzdHlsZT0iZmlsbDogIzU1ODhGRjsiIGQ9Ik04NzEuOCwzNjcuN2MxLDYuNSw2LjQsMTAuOSwxMy4xLDEwLjljMSwwLDItMC4xLDMtMC4zbDAuMy0wLjFjNy4xLTEuOSwxMS45LTguNCwxMS4yLTE1LjQNCgkJCWwtMTIuMS0xMTYuNkg4NTl2MC4xbDEyLjgsMTIwLjlMODcxLjgsMzY3Ljd6IiAvPg0KCQk8cGF0aCBzdHlsZT0iZmlsbDogIzU1ODhGRjsiIGQ9Ik0xMDI4LjcsMjA1LjVoLTcyLjVsMy44LTI1LjJoLTIyLjdsMCwwYy0wLjEsMC0wLjIsMC0wLjQsMGMtMy4zLDAtNi4xLDIuNS02LjUsNS45bDAsMGwtMy4zLDE5LjMNCgkJCWMwLDAtODcuOSwwLTg4LjQsMC4xbC0xLjksMjAuNWMtMC4xLDAuNC0wLjEsMC44LTAuMSwxLjNjMCwzLjYsMi45LDYuNiw2LjYsNi43djAuMWMzNC43LDAuMSwxODMuOCwwLDE4My44LDBjNy42LDAsMTQtNS42LDE1LTEzDQoJCQlWMjIxYzAuNS00LjEtMC42LTcuOS0zLjEtMTAuOEMxMDM2LjUsMjA3LjEsMTAzMi44LDIwNS41LDEwMjguNywyMDUuNXoiIC8+DQoJCTxwYXRoIHN0eWxlPSJmaWxsOiAjNTU4OEZGOyIgZD0iTTYxNy45LDM1OC41aDIzLjdjMTQuNywwLDIwLjUsNywxNy45LDIxLjhsLTMuMiwxOC42Yy0xLjMsMTQuNy05LDE5LjktMjYuMywyMC41SDYwMHYtMTkuMmgxOC42DQoJCQljNy43LDAsMTAuOS0yLjYsMTIuMi02LjRsMS4zLTUuOGMxLjMtNS4xLTEuOS03LjctOS42LTcuN2gtMTIuOGMtMTIuMiwxOS4yLTMwLjcsMzAuMS02Mi4xLDM5LjdsLTcuNy0xOS4yDQoJCQljMjAuNS02LjQsMjguOC05LjYsNDAuNC0xOS45aC0zMC43bDMuMi0yMS44aDM3LjhjMC0wLjYsMC42LTMuMiwxLjktNi40YzAuNi0yLjYsMy4yLTQuNSw1LjgtNC41aDIyLjRMNjE3LjksMzU4LjV6IiAvPg0KCQk8cGF0aCBzdHlsZT0iZmlsbDogIzU1ODhGRjsiIGQ9Ik01NzIuNSwyMTMuMWwyLjYtMTQuN2g5OC42bDEuMy0xMC4yYzAuNi0zLjIsMy4yLTUuMSw1LjgtNS4xSDcwN2wtMi42LDE1LjRoODguNA0KCQkJYzYuNCwwLDExLjUsNS44LDEwLjksMTIuOGwwLDBjLTAuNiw1LjEtNS4xLDktMTAuOSw5aC05MWwtMS45LDEwLjloNzMuN2M1LjgsMCwxMC4yLDUuMSw5LDEwLjlsMCwwYy0wLjYsNC41LTQuNSw3LjctOSw3LjdINTg5LjENCgkJCWMtMy44LDAtNi40LTMuMi01LjgtN2wxLjktMTEuNWg4My4zbDEuOS0xMC45aC05MS42QzU3NSwyMjAuMiw1NzEuOCwyMTYuMyw1NzIuNSwyMTMuMXoiIC8+DQoJCTxwYXRoIHN0eWxlPSJmaWxsOiAjNTU4OEZGOyIgZD0iTTc3Ni44LDMyMi42aC00Ny40YzAuNi0wLjYsMS45LTEuOSwyLjYtMy4yYzEuOS0zLjgsMy44LTYuNCw0LjUtOWg5LjZjMTYuNywwLDI2LjMtNywyOC4yLTIwLjUNCgkJCWwxLjktMTIuMmMxLjktMTIuOC0zLjgtMTkuMi0xOC42LTE5LjJINjAwYy0xMi44LDAtMjAuNSw3LTIzLjEsMjAuNWwtMS45LDEyLjJjLTEuOSwxMi44LDMuOCwxOS4yLDE4LjYsMTkuMmg5LjYNCgkJCWMwLjYsMy44LDEuMyw2LjQsMS45LDljMC42LDEuMywxLjMsMi42LDEuOSwzLjJoLTU0LjRsLTEuOSwxMi4yYy0wLjYsMy44LDIuNiw3LDUuOCw3aDIxOS43YzQuNSwwLDktMy4yLDkuNi04LjMNCgkJCUM3ODcuNywzMjguNCw3ODIuNiwzMjIuNiw3NzYuOCwzMjIuNnogTTYwMy4yLDI4Ni4xbDAuNi00LjVjMC42LTMuOCwzLjItNS4xLDctNS4xaDEzMC43YzQuNSwwLDYuNCwxLjksNS44LDUuMWwtMC42LDQuNQ0KCQkJYy0wLjYsNS4xLTMuMiw3LjctNy43LDcuN0g2MDguM0M2MDQuNSwyOTMuOCw2MDIuNiwyOTEuMyw2MDMuMiwyODYuMXogTTY5OS45LDMxOS40Yy0wLjYsMS4zLTEuOSwyLjYtMi42LDMuMmgtNTguMw0KCQkJYy0wLjYtMC42LTEuMy0xLjktMS45LTMuMmMtMC42LTMuOC0xLjMtNi40LTEuOS05aDY5LjJDNzAyLjUsMzE1LDcwMS4yLDMxNy41LDY5OS45LDMxOS40eiIgLz4NCgkJPHBhdGggc3R5bGU9ImZpbGw6ICM1NTg4RkY7IiBkPSJNNzU5LjUsMzU0LjdoLTU2LjRjLTE0LjcsMC0yMy4xLDctMjUsMjAuNWwtMy44LDI1Yy0zLjIsMTMuNSwyLjYsMTkuMiwxOC42LDE5LjJoNTQuNA0KCQkJYzE2LTAuNiwyMy43LTYuNCwyNi4zLTIwLjVsMy44LTIzLjFDNzc4LjcsMzYxLjcsNzczLDM1NC43LDc1OS41LDM1NC43eiBNNzQ2LjEsMzgyLjhsLTEuMyw5Yy0wLjYsNS44LTMuOCw5LTksOWgtMjUNCgkJCWMtNywwLTEwLjItMi42LTguMy03LjdsMS4zLTljMC42LTUuOCw0LjUtOSwxMC4yLTloMjYuM0M3NDQuOCwzNzUuMiw3NDcuMywzNzcuNyw3NDYuMSwzODIuOHoiIC8+DQoJPC9nPg0KCTxwYXRoIHN0eWxlPSJmaWxsOiAjNTU4OEZGOyIgZD0iTTQzNC41LDI0OS40Yy03LjMtMTkuMS0xOS0zNi42LTM0LjYtNTAuNWMtMjMuOS0yMS41LTU0LjctMzMuMy04Ni45LTMzLjMNCgkJYy0yNy45LDAtNTQuNCw4LjctNzYuOCwyNS4xYy0xMC44LDcuOS0yMC4yLDE3LjMtMjgsMjcuOWMtNC45LTAuNy05LjgtMS0xNC44LTFjLTI3LjgsMC01My45LDEwLjgtNzMuNCwzMC41DQoJCWMtMTkuNiwxOS42LTMwLjUsNDUuNy0zMC41LDczLjRjMCwyNS44LDkuNSw1MC41LDI2LjgsNjkuN2MxMy44LDE1LjIsMzEuNSwyNS44LDUxLDMwLjljOC41LDI1LjMsMzIuNSw0My42LDYwLjYsNDMuNg0KCQljMzUuMiwwLDYzLjktMjguNyw2My45LTYzLjljMC0yLTAuMS00LjItMC4zLTYuMmw4OS43LTQ3LjFsLTE5LjYtMzRsLTg1LjgsNDUuMWMtMTEuNy0xMy4zLTI4LjktMjEuOC00OC0yMS44DQoJCWMtMjcuOCwwLTUxLjQsMTcuNy02MC4zLDQyLjRjLTIyLjYtOS45LTM4LjQtMzIuNC0zOC40LTU4LjdjMC0zNS4zLDI4LjctNjQuMSw2NC4xLTY0LjFjMTIuNSwwLDI0LjEsMy41LDM0LDkuNw0KCQljMTEuOS0zNS45LDQ1LjctNjEuNyw4NS41LTYxLjdjNDYuMywwLDg0LjUsMzQuOSw4OS41LDc5LjljMS42LTAuMiwzLjItMC4yLDQuOS0wLjJjMjcuOCwwLDUwLjIsMjIuNSw1MC4yLDUwLjINCgkJYzAsMjYuMi0yMC4yLDQ3LjgtNDUuOSw1MGgtMjguOGMtMS4zLTAuMy0yLjYtMC40LTQtMC40Yy0xMSwwLTIwLjEsOS0yMC4xLDIwLjFjMCwxMC41LDguMSwxOS4xLDE4LjQsMjB2MC4yaDM0LjJoMS43bDEuNy0wLjENCgkJYzIyLjQtMS45LDQzLjEtMTIuMSw1OC40LTI4LjdjMTUuNC0xNi43LDIzLjktMzguNCwyMy45LTYxLjFDNDk3LjUsMjk0LjksNDcwLjksMjYwLjgsNDM0LjUsMjQ5LjR6DQoJCU0yMjguMSwzNzYuOQ0KCQljMTMuNiwwLDI0LjcsMTEsMjQuNywyNC43DQoJCWMwLDEzLjYtMTEsMjQuNy0yNC43LDI0LjcNCgkJYy0xMy42LDAtMjQuNy0xMS0yNC43LTI0LjcNCgkJQzIwMy40LDM4OCwyMTQuNSwzNzYuOSwyMjguMSwzNzYuOXoiIC8+DQo8L3N2Zz4NCg==", 32 | "F~part_netLabel_gnD~225~-660~0~gge16675~~0^^225~-660^^GND~#000000~212~-634~0~start~1~Times New Roman~9pt~flag_gge7^^PL~225 -650 225 -660~#000000~1~0~transparent~gge16687~0^^PL~216 -650 234 -650~#000000~1~0~transparent~gge16690~0^^PL~219 -648 231 -648~#000000~1~0~transparent~gge16693~0^^PL~222 -646 228 -646~#000000~1~0~transparent~gge16696~0^^PL~224 -644 226 -644~#000000~1~0~transparent~gge16699~0", 33 | "W~210 -650 210 -560 270 -560~#008800~1~0~none~gge16765~0", 34 | "W~210 -660 225 -660~#008800~1~0~none~gge16768~0", 35 | "F~part_netLabel_gnD~210~-535~0~gge16780~~0^^210~-535^^GND~#000000~197~-509~0~start~1~Times New Roman~9pt~flag_gge10^^PL~210 -525 210 -535~#000000~1~0~transparent~gge16792~0^^PL~201 -525 219 -525~#000000~1~0~transparent~gge16795~0^^PL~204 -523 216 -523~#000000~1~0~transparent~gge16798~0^^PL~207 -521 213 -521~#000000~1~0~transparent~gge16801~0^^PL~209 -519 211 -519~#000000~1~0~transparent~gge16804~0", 36 | "F~part_netLabel_VCC~80~-630~180~gge16834~~0^^80~-630^^VCC~#000000~67.65625~-608.8984375~0~start~1~Times New Roman~9pt~flag_gge13^^PL~80 -620 80 -630~#000000~1~0~transparent~gge16846~0^^PL~85 -620 75 -620~#000000~1~0~transparent~gge16849~0", 37 | "W~80 -650 80 -630~#008800~1~0~none~gge16881~0", 38 | "W~270 -540 210 -540 210 -535~#008800~1~0~none~gge16884~0", 39 | "F~part_netLabel_gnD~320~-660~180~gge31424~~0^^320~-660^^GND~#000000~307~-679.171875~0~start~1~Times New Roman~9pt~flag_gge16^^PL~320 -670 320 -660~#000000~1~0~transparent~gge31436~0^^PL~329 -670 311 -670~#000000~1~0~transparent~gge31439~0^^PL~326 -672 314 -672~#000000~1~0~transparent~gge31442~0^^PL~323 -674 317 -674~#000000~1~0~transparent~gge31445~0^^PL~321 -676 319 -676~#000000~1~0~transparent~gge31448~0", 40 | "F~part_netLabel_VCC~285~-660~0~gge31478~~0^^285~-660^^VCC~#000000~272.65625~-673.171875~0~start~1~Times New Roman~9pt~flag_gge19^^PL~285 -670 285 -660~#000000~1~0~transparent~gge31490~0^^PL~280 -670 290 -670~#000000~1~0~transparent~gge31493~0", 41 | "W~480 -640 490 -640 490 -660 530 -660~#008800~1~0~none~gge31542~0", 42 | "W~530 -650 480 -650~#008800~1~0~none~gge36018~0", 43 | "W~380 -540 385 -540 480 -540 480 -590 480 -620~#008800~1~0~none~gge36021~0", 44 | "W~340 -650 320 -650 320 -660~#008800~1~0~none~gge36024~0", 45 | "W~340 -640 285 -640 285 -660~#008800~1~0~none~gge36027~0", 46 | "LIB~430~-660~package`RS232TTL_SMALL`Manufacturer``Manufacturer Part``Supplier Part``Supplier`BANGGOOD`link``Contributor`Andrey Ganzevich`spicePre`U`spiceSymbolName`RS232TTL_SMALL_v2`~180~0~ggeefc6f3416d412d25~45ca519139a64111a123da0d73dd27a0~2f3195b5cdf542da9e2fe4170f1f3fb6~0~~yes~yes~8180f732886c4e83a0c34e1b4dc602f2~1689327954~#@$T~N~362.02~-661.76~0~#000080~Arial~~~~~comment~RS232TTL_SMALL_v2~1~start~gge36589~0~#@$T~P~362.02~-670.82~0~#000080~Arial~~~~~comment~U6~1~start~gge36595~0~#@$R~360~-660~~~100~50~#000000~1~0~none~gge36601~0~#@$P~show~0~5~480~-620~0~gge36604~0^^480~-620^^M 480 -620 h -20~#880000^^1~458~-617~0~GND1~end~~~#0000FF^^1~465~-621~0~1~start~~~#0000FF^^0~463~-620^^0~M 460 -623 L 457 -620 L 460 -617#@$P~show~0~6~480~-630~0~gge36625~0^^480~-630^^M 480 -630 h -20~#880000^^1~458~-627~0~VCC1~end~~~#0000FF^^1~465~-631~0~2~start~~~#0000FF^^0~463~-630^^0~M 460 -633 L 457 -630 L 460 -627#@$P~show~0~7~480~-640~0~gge36646~0^^480~-640^^M 480 -640 h -20~#880000^^1~458~-637~0~RX 232~end~~~#0000FF^^1~465~-641~0~3~start~~~#0000FF^^0~463~-640^^0~M 460 -643 L 457 -640 L 460 -637#@$P~show~0~8~480~-650~0~gge36667~0^^480~-650^^M 480 -650 h -20~#880000^^1~458~-647~0~TX 232~end~~~#0000FF^^1~465~-651~0~4~start~~~#0000FF^^0~463~-650^^0~M 460 -653 L 457 -650 L 460 -647#@$P~show~0~9~340~-620~180~gge36688~0^^340~-620^^M 340 -620 h 20~#880000^^1~362~-617~0~TX TTL~start~~~#0000FF^^1~355~-621~0~8~end~~~#0000FF^^0~357~-620^^0~M 360 -617 L 363 -620 L 360 -623#@$P~show~0~11~340~-640~180~gge36709~0^^340~-640^^M 340 -640 h 20~#880000^^1~362~-637~0~VCC2~start~~~#0000FF^^1~355~-641~0~6~end~~~#0000FF^^0~357~-640^^0~M 360 -637 L 363 -640 L 360 -643#@$P~show~0~12~340~-650~180~gge36730~0^^340~-650^^M 340 -650 h 20~#880000^^1~362~-647~0~GND2~start~~~#0000FF^^1~355~-651~0~5~end~~~#0000FF^^0~357~-650^^0~M 360 -647 L 363 -650 L 360 -653#@$P~show~0~14~340~-630~180~gge36751~0^^340~-630^^M 340 -630 h 20~#880000^^1~362~-627~0~RX TTL~start~~~#0000FF^^1~355~-631~0~7~end~~~#0000FF^^0~357~-630^^0~M 360 -627 L 363 -630 L 360 -633", 47 | "LIB~550~-630~package`RJ45-TH_KH-RJ45-58-8P8C`Contributor`LCSC`Supplier`LCSC`Supplier Part`C2683360`Manufacturer`kinghelm(金航标)`Manufacturer Part`KH-RJ45-58-8P8C`JLCPCB Part Class`Extended Part`link`https://lcsc.com/eda_search?q=C2683360&%26type=1&ref=editor`spicePre`R`spiceSymbolName`KH-RJ45-58-8P8C`~~0~gge314e98bc29ba410d~4addca61805848d1897c7a59517b13d5~1f7f5ce558d1413d836cbe02a99eb924~0~~yes~yes~298d5b9f035a4599aedc43f2519b319c~1672854320~ab08eda905b344198fa1a5fafd240fad#@$T~N~562~-612.56~0~#000080~Arial~~~~~comment~KH-RJ45-58-8P8C~1~start~gge71588~0~#@$T~P~562~-621.53~0~#000080~Arial~~~~~comment~RJ4~1~start~gge71594~0~#@$R~540~-680~2~2~20~110~#880000~1~0~none~gge71600~0~#@$E~545~-665~1.5~1.5~#880000~1~0~#880000~gge71603~0#@$P~show~0~1~530~-660~180~gge71606~0^^530~-660^^M 530 -660 h 10~#880000^^1~543.7~-656~0~RX~start~~~#0000FF^^1~539.5~-661~0~1~end~~~#0000FF^^0~537~-660^^0~M 540 -657 L 543 -660 L 540 -663#@$P~show~0~2~530~-650~180~gge71627~0^^530~-650^^M 530 -650 h 10~#880000^^1~543.7~-646~0~TX~start~~~#0000FF^^1~539.5~-651~0~2~end~~~#0000FF^^0~537~-650^^0~M 540 -647 L 543 -650 L 540 -653#@$P~show~0~3~530~-640~180~gge71648~0^^530~-640^^M 530 -640 h 10~#880000^^1~543.7~-636~0~3~start~~~#0000FF^^1~539.5~-641~0~3~end~~~#0000FF^^0~537~-640^^0~M 540 -637 L 543 -640 L 540 -643#@$P~show~0~4~530~-630~180~gge71669~0^^530~-630^^M 530 -630 h 10~#880000^^1~543.7~-626~0~12V~start~~~#0000FF^^1~539.5~-631~0~4~end~~~#0000FF^^0~537~-630^^0~M 540 -627 L 543 -630 L 540 -633#@$P~show~0~5~530~-620~180~gge71690~0^^530~-620^^M 530 -620 h 10~#880000^^1~543.7~-616~0~5~start~~~#0000FF^^1~539.5~-621~0~5~end~~~#0000FF^^0~537~-620^^0~M 540 -617 L 543 -620 L 540 -623#@$P~show~0~6~530~-610~180~gge71711~0^^530~-610^^M 530 -610 h 10~#880000^^1~543.7~-606~0~6~start~~~#0000FF^^1~539.5~-611~0~6~end~~~#0000FF^^0~537~-610^^0~M 540 -607 L 543 -610 L 540 -613#@$P~show~0~7~530~-600~180~gge71732~0^^530~-600^^M 530 -600 h 10~#880000^^1~543.7~-596~0~7~start~~~#0000FF^^1~539.5~-601~0~7~end~~~#0000FF^^0~537~-600^^0~M 540 -597 L 543 -600 L 540 -603#@$P~show~0~8~530~-590~180~gge71753~0^^530~-590^^M 530 -590 h 10~#880000^^1~543.7~-586~0~GND~start~~~#0000FF^^1~539.5~-591~0~8~end~~~#0000FF^^0~537~-590^^0~M 540 -587 L 543 -590 L 540 -593#@$P~show~0~9~550~-690~90~gge71774~0^^550~-690^^M 550 -690 v 10~#880000^^1~554~-676.3~270~9~end~~~#0000FF^^1~549~-680.5~270~9~start~~~#0000FF^^0~550~-683^^0~M 547 -680 L 550 -677 L 553 -680#@$P~show~0~10~550~-560~270~gge71795~0^^550~-560^^M 550 -560 v -10~#880000^^1~554~-573.7~270~10~start~~~#0000FF^^1~549~-569.5~270~10~end~~~#0000FF^^0~550~-567^^0~M 553 -570 L 550 -573 L 547 -570", 48 | "W~380 -560 500 -560 500 -630 530 -630~#008800~1~0~none~gge71991~0", 49 | "O~530~-640~gge71995~M 526 -644 L 534 -636 M 534 -644 L 526 -636~#33cc33~0", 50 | "O~530~-610~gge72001~M 526 -614 L 534 -606 M 534 -614 L 526 -606~#33cc33~0", 51 | "O~530~-600~gge72007~M 526 -604 L 534 -596 M 534 -604 L 526 -596~#33cc33~0", 52 | "O~210~-720~gge72031~M 206 -724 L 214 -716 M 214 -724 L 206 -716~#33cc33~0", 53 | "O~210~-710~gge72037~M 206 -714 L 214 -706 M 214 -714 L 206 -706~#33cc33~0", 54 | "O~480~-630~gge72043~M 476 -634 L 484 -626 M 484 -634 L 476 -626~#33cc33~0", 55 | "O~80~-670~gge72157~M 76 -674 L 84 -666 M 84 -674 L 76 -666~#33cc33~0", 56 | "O~80~-680~gge72163~M 76 -684 L 84 -676 M 84 -684 L 76 -676~#33cc33~0", 57 | "O~210~-670~gge72169~M 206 -674 L 214 -666 M 214 -674 L 206 -666~#33cc33~0", 58 | "O~210~-680~gge72175~M 206 -684 L 214 -676 M 214 -684 L 206 -676~#33cc33~0", 59 | "O~80~-690~gge72181~M 76 -694 L 84 -686 M 84 -694 L 76 -686~#33cc33~0", 60 | "O~80~-700~gge72187~M 76 -704 L 84 -696 M 84 -704 L 76 -696~#33cc33~0", 61 | "O~80~-710~gge72193~M 76 -714 L 84 -706 M 84 -714 L 76 -706~#33cc33~0", 62 | "O~80~-720~gge72199~M 76 -724 L 84 -716 M 84 -724 L 76 -716~#33cc33~0", 63 | "O~550~-690~gge72247~M 546 -694 L 554 -686 M 554 -694 L 546 -686~#33cc33~0", 64 | "O~550~-560~gge72253~M 546 -564 L 554 -556 M 554 -564 L 546 -556~#33cc33~0", 65 | "O~530~-620~gge72563~M 526 -624 L 534 -616 M 534 -624 L 526 -616~#33cc33~0", 66 | "W~530 -590 480 -590~#008800~1~0~none~gge72575~0", 67 | "LIB~140~-690~package`WEMOS D1 V4 FP`Manufacturer``Manufacturer Part`WeMos D1 Mini Pro`Supplier Part`undefined`Supplier``link``Contributor`Alexus-12`spicePre`U`spiceSymbolName`WEMOS D1 V4`~~0~ggee5475b06a265245a~fd593a9d9cde47ac85c919891a7bb178~1171e30612e341f9af9ab18d29094602~0~~yes~yes~c93cc661f13843a9a3f8e6d7bf2d68e7~1691406994~ba4d54b9605b456ab99d5d7140316063#@$T~N~138.96~-753~0~#000080~Arial~~~~~comment~WEMOS D1/S3 mini~1~start~gge74846~0~#@$T~P~138.96~-762~0~#000080~Arial~~~~~comment~U3~1~start~gge74852~0~#@$P~show~0~1~210~-720~~gge74858~0^^210~-720^^M 210 -720 h -20~#880000^^1~188~-717~0~TX~end~~~#0000FF^^0~195~-721~0~TX~start~~~#0000FF^^0~193~-720^^0~M 190 -723 L 187 -720 L 190 -717#@$P~show~0~2~210~-710~~gge74879~0^^210~-710^^M 210 -710 h -20~#880000^^1~188~-707~0~RX~end~~~#0000FF^^0~195~-711~0~RX~start~~~#0000FF^^0~193~-710^^0~M 190 -713 L 187 -710 L 190 -707#@$P~show~0~3~210~-700~~gge74900~0^^210~-700^^M 210 -700 h -20~#880000^^1~188~-697~0~5~end~~~#0000FF^^0~195~-701~0~5~start~~~#0000FF^^0~193~-700^^0~M 190 -703 L 187 -700 L 190 -697#@$P~show~0~4~210~-690~~gge74921~0^^210~-690^^M 210 -690 h -20~#880000^^1~188~-687~0~4~end~~~#0000FF^^0~195~-691~0~4~start~~~#0000FF^^0~193~-690^^0~M 190 -693 L 187 -690 L 190 -687#@$P~show~0~5~210~-680~~gge74942~0^^210~-680^^M 210 -680 h -20~#880000^^1~188~-677~0~0~end~~~#0000FF^^0~195~-681~0~0~start~~~#0000FF^^0~193~-680^^0~M 190 -683 L 187 -680 L 190 -677#@$P~show~0~6~210~-670~~gge74963~0^^210~-670^^M 210 -670 h -20~#880000^^1~188~-667~0~2~end~~~#0000FF^^0~195~-671~0~2~start~~~#0000FF^^0~193~-670^^0~M 190 -673 L 187 -670 L 190 -667#@$P~show~0~7~210~-660~~gge74984~0^^210~-660^^M 210 -660 h -20~#880000^^1~188~-657~0~GND~end~~~#0000FF^^0~195~-661~0~GND~start~~~#0000FF^^0~193~-660^^0~M 190 -663 L 187 -660 L 190 -657#@$P~show~0~8~210~-650~~gge75005~0^^210~-650^^M 210 -650 h -20~#880000^^1~188~-647~0~VBUS~end~~~#0000FF^^0~195~-651~0~VBUS~start~~~#0000FF^^0~193~-650^^0~M 190 -653 L 187 -650 L 190 -647#@$P~show~0~9~80~-650~180~gge75026~0^^80~-650^^M 80 -650 h 20~#880000^^1~102~-647~0~3V3~start~~~#0000FF^^0~95~-651~0~3V3~end~~~#0000FF^^0~97~-650^^0~M 100 -647 L 103 -650 L 100 -653#@$P~show~0~10~80~-660~180~gge75047~0^^80~-660^^M 80 -660 h 20~#880000^^1~102~-657~0~15~start~~~#0000FF^^0~95~-661~0~15~end~~~#0000FF^^0~97~-660^^0~M 100 -657 L 103 -660 L 100 -663#@$P~show~0~11~80~-670~180~gge75068~0^^80~-670^^M 80 -670 h 20~#880000^^1~102~-667~0~13~start~~~#0000FF^^0~95~-671~0~13~end~~~#0000FF^^0~97~-670^^0~M 100 -667 L 103 -670 L 100 -673#@$P~show~0~12~80~-680~180~gge75089~0^^80~-680^^M 80 -680 h 20~#880000^^1~102~-677~0~12~start~~~#0000FF^^0~95~-681~0~12~end~~~#0000FF^^0~97~-680^^0~M 100 -677 L 103 -680 L 100 -683#@$P~show~0~13~80~-690~180~gge75110~0^^80~-690^^M 80 -690 h 20~#880000^^1~102~-687~0~14~start~~~#0000FF^^0~95~-691~0~14~end~~~#0000FF^^0~97~-690^^0~M 100 -687 L 103 -690 L 100 -693#@$P~show~0~14~80~-700~180~gge75131~0^^80~-700^^M 80 -700 h 20~#880000^^1~102~-697~0~16~start~~~#0000FF^^0~95~-701~0~16~end~~~#0000FF^^0~97~-700^^0~M 100 -697 L 103 -700 L 100 -703#@$P~show~0~15~80~-710~180~gge75152~0^^80~-710^^M 80 -710 h 20~#880000^^1~102~-707~0~A0~start~~~#0000FF^^0~95~-711~0~A0~end~~~#0000FF^^0~97~-710^^0~M 100 -707 L 103 -710 L 100 -713#@$P~show~0~16~80~-720~180~gge75173~0^^80~-720^^M 80 -720 h 20~#880000^^1~102~-717~0~RST~start~~~#0000FF^^0~95~-721~0~RST~end~~~#0000FF^^0~97~-720^^0~M 100 -717 L 103 -720 L 100 -723#@$A~M 180 -750 A 10 10 0 0 1 190 -740~~#000000~1~0~none~gge75194~0#@$PL~190 -740 190 -630~#000000~1~0~none~gge75197~0#@$PL~100 -740 100 -650~#000000~1~0~none~gge75200~0#@$A~M 100 -740 A 10 10 0 0 1 110 -750~~#000000~1~0~none~gge75203~0#@$PL~110 -750 180 -750~#000000~1~0~none~gge75206~0#@$PL~100 -650 110 -640 110 -630~#000000~1~0~none~gge75209~0#@$PL~110 -630 190 -630~#000000~1~0~none~gge75212~0", 68 | "W~340 -630 265 -630 265 -700 210 -700~#008800~1~0~none~gge75622~0", 69 | "W~210 -690 255 -690 255 -620 340 -620~#008800~1~0~none~gge75634~0", 70 | "LIB~380~-530~package`HX-MINI-360 MODULE`Manufacturer Part`HX-MINI-360 Module`link`https://cdn.solarbotics.com/products/datasheets/mp2307.pdf`Contributor`160205vl`Supplier Part``Supplier``spicePre`U`spiceSymbolName`HX-MINI-360 Module`~180~0~ggef91e075ec65ace35~88b827482dfd4434a9ee7c387014b00f~a2933464b3314897a1552d23d6bdc777~0~~yes~yes~~1588134350~#@$T~N~441.1~-556.67~0~#000080~Arial~~~~~comment~HX-MINI-360 Module~0~start~gge79739~0~#@$T~P~318.96~-582~0~#000080~Arial~~~~~comment~U2~1~start~gge79517~0~#@$R~290~-570~~~70~40~#000000~1~0~none~gge79523~0~#@$P~show~0~1~380~-560~0~gge79526~0^^380~-560^^M 380 -560 h -20~#880000^^1~358~-557~0~IN+~end~~~#0000FF^^1~365~-561~0~1~start~~~#0000FF^^0~363~-560^^0~M 360 -563 L 357 -560 L 360 -557#@$P~show~0~2~380~-540~0~gge79547~0^^380~-540^^M 380 -540 h -20~#880000^^1~358~-537~0~IN-~end~~~#0000FF^^1~365~-541~0~2~start~~~#0000FF^^0~363~-540^^0~M 360 -543 L 357 -540 L 360 -537#@$P~show~0~3~270~-560~180~gge79568~0^^270~-560^^M 270 -560 h 20~#880000^^1~292~-557~0~OUT+~start~~~#0000FF^^1~285~-561~0~3~end~~~#0000FF^^0~287~-560^^0~M 290 -557 L 293 -560 L 290 -563#@$P~show~0~4~270~-540~180~gge79589~0^^270~-540^^M 270 -540 h 20~#880000^^1~292~-537~0~OUT-~start~~~#0000FF^^1~285~-541~0~4~end~~~#0000FF^^0~287~-540^^0~M 290 -537 L 293 -540 L 290 -543#@$T~L~288.05~-572.67~0~#0000FF~~~~~~comment~HX-MINI-360~1~start~gge79610~0~pinpart#@$AR~part_arrowhead~330~-550~gge79616~180~M 330 -550 L 334 -542 L 322 -550 L 334 -558 Z ~#333333~0~3~15", 71 | "LIB~280~-770~package`SENSOR-TH_HAIGU_DHT22`Supplier`Curto-circuito`Supplier Part`C2880291`Manufacturer`ASAIR AM2302`Manufacturer Part`DHT22 Modulo`Contributor`mrpcb2015`JLCPCB Part Class`Extended Part`spicePre`U`spiceSymbolName`DHT22 Modulo (3 pinos)`~~0~gge972083fd2de8cd79~bfcbe79096b0410cbea5e3afa03d3279~5fa4fe5614e748199df8e5abe4315a09~0~~yes~yes~731b5e2852d141f98c09ac5272b8a4b6~1654616586~51f356728e4649e99d9f984b9a0c2c68#@$T~N~267.96~-798~0~#000080~Arial~~~~~comment~DHT22 (3 pins), optional~1~start~gge83865~0~#@$T~P~267.96~-807~0~#000080~Arial~~~~~comment~U1~1~start~gge83871~0~#@$R~265~-795~2~2~30~40~#880000~1~0~none~gge83877~0~#@$E~270~-790~1.5~1.5~#880000~1~0~#880000~gge83880~0#@$P~show~0~1~255~-785~180~gge83883~0^^255~-785^^M 255 -785 h 10~#FF0000^^1~268.7~-781~0~VCC~start~~5.5pt~#FF0000^^1~264.5~-786~0~1~end~~5.5pt~#FF0000^^0~262~-785^^0~M 265 -782 L 268 -785 L 265 -788#@$P~show~0~2~255~-775~180~gge83904~0^^255~-775^^M 255 -775 h 10~#880000^^1~268.7~-771~0~OUT~start~~5.5pt~#0000FF^^1~264.5~-776~0~2~end~~5.5pt~#0000FF^^0~262~-775^^0~M 265 -772 L 268 -775 L 265 -778#@$P~show~0~3~255~-765~180~gge83925~0^^255~-765^^M 255 -765 h 10~#000000^^1~268.7~-761~0~GND~start~~5.5pt~#000000^^1~264.5~-766~0~3~end~~5.5pt~#000000^^0~262~-765^^0~M 265 -762 L 268 -765 L 265 -768#@$T~L~292.11~-765.92~270~#0000FF~~4pt~~~~comment~DHT22~1~start~gge83946~0~pinpart", 72 | "F~part_netLabel_gnD~255~-765~0~gge84078~~0^^255~-765^^GND~#000000~242~-739~0~start~1~Times New Roman~9pt~flag_gge22^^PL~255 -755 255 -765~#000000~1~0~transparent~gge84090~0^^PL~246 -755 264 -755~#000000~1~0~transparent~gge84093~0^^PL~249 -753 261 -753~#000000~1~0~transparent~gge84096~0^^PL~252 -751 258 -751~#000000~1~0~transparent~gge84099~0^^PL~254 -749 256 -749~#000000~1~0~transparent~gge84102~0", 73 | "F~part_netLabel_VCC~255~-785~0~gge84117~~0^^255~-785^^VCC~#000000~242.65625~-798.171875~0~start~1~Times New Roman~9pt~flag_gge25^^PL~255 -795 255 -785~#000000~1~0~transparent~gge84129~0^^PL~250 -795 260 -795~#000000~1~0~transparent~gge84132~0", 74 | "W~255 -775 45 -775 45 -660 80 -660~#008800~1~0~none~gge84135~0", 75 | "J~480~-590~2.5~#CC0000~gge72579~0" 76 | ], 77 | "BBox": { 78 | "x": 0, 79 | "y": -850.8, 80 | "width": 680, 81 | "height": 481.3 82 | }, 83 | "colors": {} 84 | } 85 | } 86 | ] 87 | } -------------------------------------------------------------------------------- /src-nowr/powmr-inverter/modules/inverter.yaml: -------------------------------------------------------------------------------- 1 | uart: 2 | - id: uart_inverter 3 | baud_rate: 2400 4 | tx_pin: ${inverter_tx_pin} 5 | rx_pin: ${inverter_rx_pin} 6 | # debug: 7 | # direction: BOTH 8 | # dummy_receiver: false 9 | 10 | modbus: 11 | - id: modbus_inverter 12 | uart_id: uart_inverter 13 | send_wait_time: 250ms 14 | 15 | modbus_controller: 16 | - id: smg_inverter 17 | address: 0x05 18 | modbus_id: modbus_inverter 19 | setup_priority: -10 20 | offline_skip_updates: 100 21 | command_throttle: 1s 22 | update_interval: ${update_interval} 23 | 24 | sensor: 25 | 26 | - platform: modbus_controller 27 | modbus_controller_id: smg_inverter 28 | name: "Grid Voltage" 29 | id: grid_voltage 30 | address: 4502 31 | register_type: holding 32 | value_type: U_WORD 33 | unit_of_measurement: "V" 34 | device_class: voltage 35 | state_class: measurement 36 | accuracy_decimals: 1 37 | lambda: |- 38 | if (id(grid_state).state == "Abnormal") { 39 | return 0.0; 40 | } 41 | return swapBytes(x); 42 | filters: 43 | - multiply: 0.1 44 | - offset: ${inverter_voltage_offset} 45 | - heartbeat: 10s 46 | 47 | - platform: modbus_controller 48 | modbus_controller_id: smg_inverter 49 | name: "Grid Frequency" 50 | address: 4503 51 | register_type: holding 52 | value_type: U_WORD 53 | unit_of_measurement: "Hz" 54 | device_class: frequency 55 | state_class: measurement 56 | accuracy_decimals: 1 57 | lambda: |- 58 | return swapBytes(x); 59 | filters: 60 | - multiply: 0.1 61 | 62 | - platform: modbus_controller 63 | modbus_controller_id: smg_inverter 64 | name: "PV Voltage" 65 | id: pv_voltage 66 | address: 4504 67 | register_type: holding 68 | value_type: U_WORD 69 | unit_of_measurement: "V" 70 | device_class: voltage 71 | state_class: measurement 72 | accuracy_decimals: 1 73 | lambda: |- 74 | return swapBytes(x); 75 | filters: 76 | - multiply: 0.1 77 | 78 | - platform: modbus_controller 79 | modbus_controller_id: smg_inverter 80 | name: "PV Power" 81 | id: pv_power 82 | address: 4505 83 | register_type: holding 84 | value_type: U_WORD 85 | unit_of_measurement: "W" 86 | device_class: power 87 | state_class: measurement 88 | accuracy_decimals: 1 89 | lambda: |- 90 | return swapBytes(x); 91 | 92 | - platform: template 93 | name: "PV Current" 94 | id: pv_current 95 | state_class: "measurement" 96 | device_class: current 97 | unit_of_measurement: "A" 98 | accuracy_decimals: 1 99 | icon: mdi:solar-power 100 | lambda: |- 101 | if (id(pv_voltage).state == 0) { 102 | return 0; 103 | } 104 | return id(pv_power).state / id(pv_voltage).state; 105 | 106 | - platform: modbus_controller 107 | modbus_controller_id: smg_inverter 108 | name: "Battery Voltage" 109 | id: battery_voltage 110 | address: 4506 111 | register_type: holding 112 | value_type: U_WORD 113 | unit_of_measurement: "V" 114 | device_class: voltage 115 | state_class: measurement 116 | accuracy_decimals: 2 117 | lambda: |- 118 | return swapBytes(x); 119 | filters: 120 | - multiply: 0.1 121 | 122 | - platform: modbus_controller 123 | modbus_controller_id: smg_inverter 124 | name: "Battery SoC" 125 | accuracy_decimals: 0 126 | unit_of_measurement: "%" 127 | device_class: battery 128 | address: 4507 129 | register_type: holding 130 | value_type: U_WORD 131 | state_class: measurement 132 | lambda: |- 133 | return swapBytes(x); 134 | 135 | - platform: modbus_controller 136 | modbus_controller_id: smg_inverter 137 | name: "Battery Charge Current" 138 | id: battery_charge_current 139 | address: 4508 140 | register_type: holding 141 | value_type: U_WORD 142 | unit_of_measurement: "A" 143 | device_class: current 144 | state_class: measurement 145 | accuracy_decimals: 1 146 | lambda: |- 147 | return swapBytes(x); 148 | 149 | - platform: modbus_controller 150 | modbus_controller_id: smg_inverter 151 | name: "Battery Discharge Current" 152 | id: battery_discharge_current 153 | address: 4509 154 | register_type: holding 155 | value_type: U_WORD 156 | unit_of_measurement: "A" 157 | device_class: current 158 | state_class: measurement 159 | accuracy_decimals: 1 160 | lambda: |- 161 | return swapBytes(x); 162 | 163 | - platform: template 164 | name: "Battery Current" 165 | id: battery_current 166 | unit_of_measurement: "A" 167 | device_class: current 168 | state_class: measurement 169 | accuracy_decimals: 1 170 | update_interval: ${update_interval} 171 | lambda: |- 172 | return id(battery_charge_current).state - id(battery_discharge_current).state; 173 | filters: 174 | - heartbeat: 10s 175 | 176 | - platform: template 177 | name: "Battery Power" 178 | unit_of_measurement: "W" 179 | device_class: power 180 | state_class: measurement 181 | accuracy_decimals: 0 182 | update_interval: ${update_interval} 183 | lambda: |- 184 | return id(battery_current).state * id(battery_voltage).state; 185 | 186 | - platform: template 187 | name: "Battery Charge Power" 188 | id: battery_charge_power 189 | unit_of_measurement: "W" 190 | device_class: power 191 | state_class: measurement 192 | accuracy_decimals: 0 193 | update_interval: ${update_interval} 194 | lambda: |- 195 | return id(battery_charge_current).state * id(battery_voltage).state; 196 | 197 | - platform: template 198 | name: "Battery Discharge Power" 199 | id: battery_discharge_power 200 | unit_of_measurement: "W" 201 | device_class: power 202 | state_class: measurement 203 | accuracy_decimals: 0 204 | update_interval: ${update_interval} 205 | lambda: |- 206 | return id(battery_discharge_current).state * id(battery_voltage).state; 207 | 208 | - platform: modbus_controller 209 | modbus_controller_id: smg_inverter 210 | name: "Load Voltage" 211 | id: load_voltage 212 | address: 4510 213 | register_type: holding 214 | value_type: U_WORD 215 | unit_of_measurement: "V" 216 | device_class: voltage 217 | state_class: measurement 218 | accuracy_decimals: 1 219 | lambda: |- 220 | return swapBytes(x); 221 | filters: 222 | - multiply: 0.1 223 | 224 | - platform: modbus_controller 225 | modbus_controller_id: smg_inverter 226 | name: "Load Frequency" 227 | address: 4511 228 | register_type: holding 229 | value_type: U_WORD 230 | unit_of_measurement: "Hz" 231 | device_class: frequency 232 | state_class: measurement 233 | accuracy_decimals: 1 234 | lambda: |- 235 | return swapBytes(x); 236 | filters: 237 | - multiply: 0.1 238 | 239 | - platform: modbus_controller 240 | modbus_controller_id: smg_inverter 241 | name: "Load Power VA" 242 | id: load_Power_VA 243 | address: 4512 244 | register_type: holding 245 | value_type: U_WORD 246 | unit_of_measurement: "VA" 247 | device_class: apparent_power 248 | state_class: measurement 249 | accuracy_decimals: 0 250 | lambda: |- 251 | return swapBytes(x); 252 | 253 | - platform: modbus_controller 254 | modbus_controller_id: smg_inverter 255 | name: "Load Power" 256 | id: load_power 257 | address: 4513 258 | register_type: holding 259 | value_type: U_WORD 260 | unit_of_measurement: "W" 261 | device_class: power 262 | state_class: measurement 263 | accuracy_decimals: 0 264 | lambda: |- 265 | return swapBytes(x); 266 | 267 | - platform: template 268 | name: "Load Current" 269 | id: load_current 270 | unit_of_measurement: "A" 271 | device_class: current 272 | state_class: measurement 273 | accuracy_decimals: 3 274 | update_interval: ${update_interval} 275 | lambda: |- 276 | if (id(load_voltage).state == 0) { 277 | return 0; 278 | } 279 | return id(load_Power_VA).state / id(load_voltage).state; 280 | 281 | - platform: template 282 | name: "Load Power Factor" 283 | id: load_power_factor 284 | device_class: power_factor 285 | state_class: measurement 286 | accuracy_decimals: 2 287 | update_interval: ${update_interval} 288 | lambda: |- 289 | if (id(load_Power_VA).state == 0) { 290 | return 0; 291 | } 292 | return id(load_power).state / id(load_Power_VA).state; 293 | 294 | - platform: modbus_controller 295 | modbus_controller_id: smg_inverter 296 | name: "AC Out Load Percent" 297 | address: 4514 298 | register_type: holding 299 | value_type: U_WORD 300 | unit_of_measurement: "%" 301 | device_class: power_factor 302 | state_class: measurement 303 | lambda: |- 304 | return swapBytes(x); 305 | 306 | - platform: modbus_controller 307 | modbus_controller_id: smg_inverter 308 | name: "Load Percent" 309 | address: 4515 310 | register_count: 15 311 | register_type: holding 312 | value_type: U_WORD 313 | unit_of_measurement: "%" 314 | device_class: power_factor 315 | state_class: measurement 316 | lambda: |- 317 | return swapBytes(x); 318 | 319 | - platform: modbus_controller 320 | modbus_controller_id: smg_inverter 321 | name: "Target Output Frequency" 322 | icon: mdi:cosine-wave 323 | accuracy_decimals: 0 324 | entity_category: diagnostic 325 | address: 4540 326 | register_type: holding 327 | value_type: U_WORD 328 | unit_of_measurement: "Hz" 329 | lambda: |- 330 | uint16_t value = swapBytes(x); 331 | switch (value) { 332 | case 0: return std::uint16_t(50); 333 | case 1: return std::uint16_t(60); 334 | default: return x; 335 | } 336 | 337 | - platform: modbus_controller 338 | modbus_controller_id: smg_inverter 339 | name: "Max Total Charging Current" 340 | icon: mdi:battery-charging-100 341 | accuracy_decimals: 0 342 | entity_category: diagnostic 343 | address: 4541 344 | register_type: holding 345 | value_type: U_WORD 346 | unit_of_measurement: "A" 347 | lambda: |- 348 | return swapBytes(x); 349 | 350 | - platform: modbus_controller 351 | modbus_controller_id: smg_inverter 352 | name: "Target Output Voltage" 353 | icon: mdi:sine-wave 354 | accuracy_decimals: 0 355 | entity_category: diagnostic 356 | address: 4542 357 | register_type: holding 358 | value_type: U_WORD 359 | unit_of_measurement: "V" 360 | lambda: |- 361 | return swapBytes(x); 362 | 363 | - platform: modbus_controller 364 | modbus_controller_id: smg_inverter 365 | name: "Max Utility Charging Current" 366 | icon: mdi:transmission-tower-export 367 | accuracy_decimals: 0 368 | entity_category: diagnostic 369 | address: 4543 370 | register_type: holding 371 | value_type: U_WORD 372 | unit_of_measurement: "A" 373 | lambda: |- 374 | return swapBytes(x); 375 | 376 | - platform: modbus_controller 377 | modbus_controller_id: smg_inverter 378 | name: "Back To Utility Source Voltage" 379 | icon: mdi:transmission-tower-import 380 | filters: 381 | - multiply: 0.1 382 | accuracy_decimals: 1 383 | entity_category: diagnostic 384 | address: 4544 385 | register_type: holding 386 | value_type: U_WORD 387 | unit_of_measurement: "V" 388 | lambda: |- 389 | return swapBytes(x); 390 | 391 | - platform: modbus_controller 392 | modbus_controller_id: smg_inverter 393 | name: "Back To Battery Source Voltage" 394 | icon: mdi:power-plug-battery 395 | filters: 396 | - multiply: 0.1 397 | accuracy_decimals: 1 398 | entity_category: diagnostic 399 | address: 4545 400 | register_type: holding 401 | value_type: U_WORD 402 | unit_of_measurement: "V" 403 | lambda: |- 404 | return swapBytes(x); 405 | 406 | - platform: modbus_controller 407 | modbus_controller_id: smg_inverter 408 | name: "Bulk Charging Voltage" 409 | icon: mdi:battery-arrow-down 410 | filters: 411 | - multiply: 0.1 412 | accuracy_decimals: 1 413 | entity_category: diagnostic 414 | address: 4546 415 | register_type: holding 416 | value_type: U_WORD 417 | unit_of_measurement: "V" 418 | lambda: |- 419 | return swapBytes(x); 420 | 421 | - platform: modbus_controller 422 | modbus_controller_id: smg_inverter 423 | name: "Floating Charging Voltage" 424 | icon: mdi:battery-sync-outline 425 | filters: 426 | - multiply: 0.1 427 | accuracy_decimals: 1 428 | entity_category: diagnostic 429 | address: 4547 430 | register_type: holding 431 | value_type: U_WORD 432 | unit_of_measurement: "V" 433 | lambda: |- 434 | return swapBytes(x); 435 | 436 | - platform: modbus_controller 437 | modbus_controller_id: smg_inverter 438 | name: "Low CutOff Voltage" 439 | icon: mdi:battery-off 440 | filters: 441 | - multiply: 0.1 442 | accuracy_decimals: 1 443 | entity_category: diagnostic 444 | address: 4548 445 | register_type: holding 446 | value_type: U_WORD 447 | unit_of_measurement: "V" 448 | lambda: |- 449 | return swapBytes(x); 450 | 451 | # - platform: modbus_controller 452 | # modbus_controller_id: smg_inverter 453 | # name: "Battery Equalization Voltage" 454 | # icon: mdi:battery-medium 455 | # filters: 456 | # - multiply: 0.1 457 | # accuracy_decimals: 1 458 | # entity_category: diagnostic 459 | # address: 4549 460 | # register_type: holding 461 | # value_type: U_WORD 462 | # unit_of_measurement: "V" 463 | # lambda: |- 464 | # return swapBytes(x); 465 | 466 | # - platform: modbus_controller 467 | # modbus_controller_id: smg_inverter 468 | # name: "Battery Equalized Time" 469 | # icon: mdi:battery-clock-outline 470 | # accuracy_decimals: 0 471 | # entity_category: diagnostic 472 | # address: 4550 473 | # register_type: holding 474 | # value_type: U_WORD 475 | # lambda: |- 476 | # return swapBytes(x); 477 | 478 | # - platform: modbus_controller 479 | # modbus_controller_id: smg_inverter 480 | # name: "Battery Equalized Timeout" 481 | # icon: mdi:battery-remove-outline 482 | # accuracy_decimals: 0 483 | # entity_category: diagnostic 484 | # address: 4551 485 | # register_type: holding 486 | # value_type: U_WORD 487 | # lambda: |- 488 | # return swapBytes(x); 489 | 490 | # - platform: modbus_controller 491 | # modbus_controller_id: smg_inverter 492 | # name: "Equalization Interval" 493 | # icon: mdi:update 494 | # accuracy_decimals: 0 495 | # entity_category: diagnostic 496 | # address: 4552 497 | # register_count: 5 498 | # register_type: holding 499 | # value_type: U_WORD 500 | # lambda: |- 501 | # return swapBytes(x); 502 | 503 | # something "Working State"/"Mains supply State" related... 504 | # 2 - Line Mode, 7 - Invert Mode ... 505 | - platform: modbus_controller 506 | modbus_controller_id: smg_inverter 507 | name: "Register4554" 508 | entity_category: diagnostic 509 | address: 4554 510 | register_type: holding 511 | value_type: U_WORD 512 | lambda: |- 513 | return swapBytes(x); 514 | 515 | # something PV related... 516 | # 0 - PV Undervoltage, 13 - PV Discharging, 11 - 517 | - platform: modbus_controller 518 | modbus_controller_id: smg_inverter 519 | name: "Register4556" 520 | entity_category: diagnostic 521 | address: 4556 522 | register_type: holding 523 | value_type: U_WORD 524 | lambda: |- 525 | return swapBytes(x); 526 | 527 | - platform: modbus_controller 528 | modbus_controller_id: smg_inverter 529 | name: "PV Temperature" 530 | icon: mdi:thermometer-lines 531 | accuracy_decimals: 0 532 | entity_category: diagnostic 533 | address: 4557 534 | register_type: holding 535 | value_type: U_WORD 536 | unit_of_measurement: "°C" 537 | lambda: |- 538 | return swapBytes(x); 539 | 540 | binary_sensor: 541 | 542 | - platform: template 543 | name: "Grid Active" 544 | id: grid_active 545 | lambda: |- 546 | if (id(grid_state).state == "Abnormal") { 547 | return false; 548 | } else { 549 | return true; 550 | } 551 | 552 | - platform: template 553 | name: "On Battery" 554 | id: on_battery 555 | lambda: |- 556 | if (id(battery_state).state == "Discharging") { 557 | return true; 558 | } else { 559 | return false; 560 | } 561 | 562 | - platform: template 563 | name: "Load Enabled" 564 | id: load_enabled 565 | lambda: |- 566 | if (id(load_state).state == "Normal") { 567 | return true; 568 | } else { 569 | return false; 570 | } 571 | 572 | - platform: modbus_controller 573 | modbus_controller_id: smg_inverter 574 | name: "Error - Fan Locked" 575 | id: error_fan_locked 576 | internal: true 577 | entity_category: diagnostic 578 | address: 4529 579 | register_type: holding 580 | bitmask: 0x100 581 | 582 | - platform: modbus_controller 583 | modbus_controller_id: smg_inverter 584 | name: "Error - Over Temperater" 585 | id: error_over_temperater 586 | internal: true 587 | entity_category: diagnostic 588 | address: 4529 589 | register_type: holding 590 | bitmask: 0x200 591 | 592 | - platform: modbus_controller 593 | modbus_controller_id: smg_inverter 594 | name: "Error - Battery Voltage High" 595 | id: error_battery_voltage_high 596 | internal: true 597 | entity_category: diagnostic 598 | address: 4529 599 | register_type: holding 600 | bitmask: 0x400 601 | 602 | - platform: modbus_controller 603 | modbus_controller_id: smg_inverter 604 | name: "Error - Battery Voltage Low" 605 | id: error_battery_voltage_low 606 | internal: true 607 | entity_category: diagnostic 608 | address: 4529 609 | register_type: holding 610 | bitmask: 0x800 611 | 612 | - platform: modbus_controller 613 | modbus_controller_id: smg_inverter 614 | name: "Error - Output shorted" 615 | id: error_output_shorted 616 | internal: true 617 | entity_category: diagnostic 618 | address: 4529 619 | register_type: holding 620 | bitmask: 0x1000 621 | 622 | - platform: modbus_controller 623 | modbus_controller_id: smg_inverter 624 | name: "Error - INV Voltage Over" 625 | id: error_inv_voltage_over 626 | internal: true 627 | entity_category: diagnostic 628 | address: 4529 629 | register_type: holding 630 | bitmask: 0x2000 631 | 632 | - platform: modbus_controller 633 | modbus_controller_id: smg_inverter 634 | name: "Error - Over Load" 635 | id: error_over_load 636 | internal: true 637 | entity_category: diagnostic 638 | address: 4529 639 | register_type: holding 640 | bitmask: 0x4000 641 | 642 | - platform: modbus_controller 643 | modbus_controller_id: smg_inverter 644 | name: "Error - Bus Voltage Over" 645 | id: error_bus_voltage_over 646 | internal: true 647 | entity_category: diagnostic 648 | address: 4529 649 | register_type: holding 650 | bitmask: 0x8000 651 | 652 | - platform: modbus_controller 653 | modbus_controller_id: smg_inverter 654 | name: "Error - Bus Soft Failed" 655 | id: error_bus_soft_failed 656 | internal: true 657 | entity_category: diagnostic 658 | address: 4529 659 | register_type: holding 660 | bitmask: 0x1 661 | 662 | - platform: modbus_controller 663 | modbus_controller_id: smg_inverter 664 | name: "Error - PV Voltage High" 665 | id: error_pv_voltage_high 666 | internal: true 667 | entity_category: diagnostic 668 | address: 4529 669 | register_type: holding 670 | bitmask: 0x2 671 | 672 | - platform: modbus_controller 673 | modbus_controller_id: smg_inverter 674 | name: "Error - Over Current" 675 | id: error_over_current 676 | internal: true 677 | entity_category: diagnostic 678 | address: 4529 679 | register_type: holding 680 | bitmask: 0x4 681 | 682 | - platform: modbus_controller 683 | modbus_controller_id: smg_inverter 684 | name: "Error - Bus Voltage Under" 685 | id: error_bus_voltage_under 686 | internal: true 687 | entity_category: diagnostic 688 | address: 4529 689 | register_type: holding 690 | bitmask: 0x8 691 | 692 | - platform: modbus_controller 693 | modbus_controller_id: smg_inverter 694 | name: "Error - INV Soft Failed" 695 | id: error_inv_soft_failed 696 | internal: true 697 | entity_category: diagnostic 698 | address: 4529 699 | register_type: holding 700 | bitmask: 0x10 701 | 702 | - platform: modbus_controller 703 | modbus_controller_id: smg_inverter 704 | name: "Error - DC Voltage Over" 705 | id: error_dc_voltage_over 706 | internal: true 707 | entity_category: diagnostic 708 | address: 4529 709 | register_type: holding 710 | bitmask: 0x20 711 | 712 | - platform: modbus_controller 713 | modbus_controller_id: smg_inverter 714 | name: "Error - CT Fault" 715 | id: error_ct_fault 716 | internal: true 717 | entity_category: diagnostic 718 | address: 4529 719 | register_type: holding 720 | bitmask: 0x40 721 | 722 | - platform: modbus_controller 723 | modbus_controller_id: smg_inverter 724 | name: "Error - INV Voltage Low" 725 | id: error_inv_voltage_low 726 | internal: true 727 | entity_category: diagnostic 728 | address: 4529 729 | register_type: holding 730 | bitmask: 0x80 731 | 732 | - platform: modbus_controller 733 | modbus_controller_id: smg_inverter 734 | name: "Alarm - Fan Locked" 735 | id: alarm_fan_locked 736 | internal: true 737 | entity_category: diagnostic 738 | address: 4530 739 | register_type: holding 740 | bitmask: 0x100 741 | 742 | - platform: modbus_controller 743 | modbus_controller_id: smg_inverter 744 | name: "Alarm - Over Temperater" 745 | id: alarm_over_temperater 746 | internal: true 747 | entity_category: diagnostic 748 | address: 4530 749 | register_type: holding 750 | bitmask: 0x200 751 | 752 | - platform: modbus_controller 753 | modbus_controller_id: smg_inverter 754 | name: "Alarm - Battery Over Charged" 755 | id: alarm_battery_over_charged 756 | internal: true 757 | entity_category: diagnostic 758 | address: 4530 759 | register_type: holding 760 | bitmask: 0x400 761 | 762 | - platform: modbus_controller 763 | modbus_controller_id: smg_inverter 764 | name: "Alarm - Battery Voltage Low" 765 | id: alarm_battery_voltage_low 766 | internal: true 767 | entity_category: diagnostic 768 | address: 4530 769 | register_type: holding 770 | bitmask: 0x800 771 | 772 | - platform: modbus_controller 773 | modbus_controller_id: smg_inverter 774 | name: "Alarm - Over Load" 775 | id: alarm_over_load 776 | internal: true 777 | entity_category: diagnostic 778 | address: 4530 779 | register_type: holding 780 | bitmask: 0x1000 781 | 782 | - platform: modbus_controller 783 | modbus_controller_id: smg_inverter 784 | name: "Alarm - Output Power Derating" 785 | id: alarm_output_power_derating 786 | internal: true 787 | entity_category: diagnostic 788 | address: 4530 789 | register_type: holding 790 | bitmask: 0x2000 791 | 792 | - platform: modbus_controller 793 | modbus_controller_id: smg_inverter 794 | name: "Alarm - PV Energy Weak" 795 | id: alarm_pv_energy_weak 796 | internal: true 797 | entity_category: diagnostic 798 | address: 4530 799 | register_type: holding 800 | bitmask: 0x4000 801 | 802 | - platform: modbus_controller 803 | modbus_controller_id: smg_inverter 804 | name: "Alarm - AC Voltage High" 805 | internal: true 806 | id: alarm_ac_voltage_high 807 | entity_category: diagnostic 808 | address: 4530 809 | register_type: holding 810 | bitmask: 0x8000 811 | 812 | - platform: modbus_controller 813 | modbus_controller_id: smg_inverter 814 | name: "Alarm - No Battery" 815 | id: alarm_no_battery 816 | internal: true 817 | entity_category: diagnostic 818 | address: 4530 819 | register_type: holding 820 | bitmask: 0x1 821 | 822 | - platform: modbus_controller 823 | modbus_controller_id: smg_inverter 824 | name: "Record Fault Code" 825 | icon: mdi:alert-plus-outline 826 | entity_category: diagnostic 827 | address: 4535 828 | register_type: holding 829 | bitmask: 0x1 830 | 831 | # - platform: modbus_controller 832 | # modbus_controller_id: smg_inverter 833 | # name: "Battery Equalization" 834 | # icon: mdi:battery-arrow-up-outline 835 | # entity_category: diagnostic 836 | # address: 4535 837 | # register_type: holding 838 | # bitmask: 0x2 839 | 840 | # - platform: modbus_controller 841 | # modbus_controller_id: smg_inverter 842 | # name: "Battery Equalization activated immediately" 843 | # icon: mdi:battery-plus 844 | # entity_category: diagnostic 845 | # address: 4535 846 | # register_type: holding 847 | # bitmask: 0x4 848 | 849 | - platform: modbus_controller 850 | modbus_controller_id: smg_inverter 851 | name: "Buzzer Alarm" 852 | icon: mdi:speaker-wireless 853 | entity_category: diagnostic 854 | address: 4535 855 | register_type: holding 856 | bitmask: 0x100 857 | 858 | - platform: modbus_controller 859 | modbus_controller_id: smg_inverter 860 | name: "Power saving mode" 861 | icon: mdi:leaf-circle-outline 862 | entity_category: diagnostic 863 | address: 4535 864 | register_type: holding 865 | bitmask: 0x200 866 | 867 | - platform: modbus_controller 868 | modbus_controller_id: smg_inverter 869 | name: "Backlight" 870 | icon: mdi:alarm-light 871 | entity_category: diagnostic 872 | address: 4535 873 | register_type: holding 874 | bitmask: 0x400 875 | 876 | - platform: modbus_controller 877 | modbus_controller_id: smg_inverter 878 | name: "Restart On Overload" 879 | icon: mdi:restart 880 | entity_category: diagnostic 881 | address: 4535 882 | register_type: holding 883 | bitmask: 0x800 884 | 885 | - platform: modbus_controller 886 | modbus_controller_id: smg_inverter 887 | name: "Restart On Overheat" 888 | icon: mdi:restart-alert 889 | entity_category: diagnostic 890 | address: 4535 891 | register_type: holding 892 | bitmask: 0x1000 893 | 894 | - platform: modbus_controller 895 | modbus_controller_id: smg_inverter 896 | name: "Beep On Primary Source Fail" 897 | icon: mdi:speaker-message 898 | entity_category: diagnostic 899 | address: 4535 900 | register_type: holding 901 | bitmask: 0x2000 902 | 903 | - platform: modbus_controller 904 | modbus_controller_id: smg_inverter 905 | name: "Return To Default Screen" 906 | icon: mdi:backburger 907 | entity_category: diagnostic 908 | address: 4535 909 | register_type: holding 910 | bitmask: 0x4000 911 | 912 | - platform: modbus_controller 913 | modbus_controller_id: smg_inverter 914 | name: "Overload Bypass" 915 | icon: mdi:transit-skip 916 | entity_category: diagnostic 917 | address: 4535 918 | register_type: holding 919 | bitmask: 0x8000 920 | 921 | text_sensor: 922 | 923 | - platform: modbus_controller 924 | modbus_controller_id: smg_inverter 925 | id: Working_State 926 | name: "Working State" 927 | icon: mdi:state-machine 928 | entity_category: diagnostic 929 | address: 4501 930 | register_type: holding 931 | response_size: 2 932 | raw_encode: HEXBYTES 933 | lambda: |- 934 | uint16_t sensorIndex = swapBytes(modbus_controller::word_from_hex_str(x, 0)); 935 | switch (sensorIndex) { 936 | case 7: return std::string("ShutDown"); 937 | case 3: return std::string("Invert Mode"); 938 | case 4: return std::string("Line Mode"); 939 | case 0: return std::string("Power On"); 940 | case 5: return std::string("Bypass"); 941 | case 1: return std::string("Test"); 942 | case 6: return std::string("Fault Mode"); 943 | case 2: return std::string("Stand By"); 944 | default: return std::string(x); 945 | } 946 | 947 | - platform: modbus_controller 948 | modbus_controller_id: smg_inverter 949 | id: charger_source_priority_text 950 | name: "Charger Source Priority" 951 | entity_category: diagnostic 952 | address: 4536 953 | register_type: holding 954 | response_size: 2 955 | raw_encode: HEXBYTES 956 | lambda: |- 957 | uint16_t sensorIndex = swapBytes(modbus_controller::word_from_hex_str(x, 0)); 958 | switch (sensorIndex) { 959 | case 0: return std::string("Solar first"); 960 | case 1: return std::string("Solar and Utility"); 961 | case 2: return std::string("Only solar"); 962 | default: return std::string(x); 963 | } 964 | 965 | - platform: modbus_controller 966 | modbus_controller_id: smg_inverter 967 | name: "Output Source Priority" 968 | entity_category: diagnostic 969 | address: 4537 970 | register_type: holding 971 | response_size: 2 972 | raw_encode: HEXBYTES 973 | lambda: |- 974 | uint16_t sensorIndex = swapBytes(modbus_controller::word_from_hex_str(x, 0)); 975 | switch (sensorIndex) { 976 | case 0: return std::string("Utility first (USB)"); 977 | case 1: return std::string("Solar first (SUB)"); 978 | case 2: return std::string("SBU priority"); 979 | default: return std::string(x); 980 | } 981 | 982 | - platform: modbus_controller 983 | modbus_controller_id: smg_inverter 984 | name: "AC Input Voltage Range" 985 | icon: mdi:home-import-outline 986 | entity_category: diagnostic 987 | address: 4538 988 | register_type: holding 989 | response_size: 2 990 | raw_encode: HEXBYTES 991 | lambda: |- 992 | uint16_t value = swapBytes(modbus_controller::word_from_hex_str(x, 0)); 993 | switch (value) { 994 | case 0: return std::string("Appliances"); 995 | case 1: return std::string("UPS"); 996 | default: return std::string(x); 997 | } 998 | 999 | - platform: modbus_controller 1000 | modbus_controller_id: smg_inverter 1001 | name: "Battery type" 1002 | icon: mdi:home-battery 1003 | entity_category: diagnostic 1004 | address: 4539 1005 | register_type: holding 1006 | response_size: 2 1007 | raw_encode: HEXBYTES 1008 | lambda: |- 1009 | uint16_t value = swapBytes(modbus_controller::word_from_hex_str(x, 0)); 1010 | switch (value) { 1011 | case 0: return std::string("AGM"); 1012 | case 1: return std::string("Flooded"); 1013 | case 2: return std::string("User defined"); 1014 | default: return std::string(x); 1015 | } 1016 | 1017 | - platform: modbus_controller 1018 | modbus_controller_id: smg_inverter 1019 | name: "Battery State" 1020 | id: battery_state 1021 | icon: mdi:battery-unknown 1022 | entity_category: diagnostic 1023 | address: 4553 1024 | register_type: holding 1025 | raw_encode: HEXBYTES 1026 | lambda: |- 1027 | uint8_t val = modbus_controller::byte_from_hex_str(x, 0); 1028 | val = val & 0x3; 1029 | switch(val) { 1030 | case 3: return std::string("Ok"); 1031 | case 1: return std::string("Discharging"); 1032 | case 2: return std::string("Charging"); 1033 | case 0: return std::string("Disconnected"); 1034 | default: return std::string(x); 1035 | } 1036 | 1037 | - platform: modbus_controller 1038 | modbus_controller_id: smg_inverter 1039 | name: "PV State" 1040 | icon: mdi:solar-power 1041 | entity_category: diagnostic 1042 | address: 4553 1043 | register_type: holding 1044 | raw_encode: HEXBYTES 1045 | lambda: |- 1046 | uint8_t val = modbus_controller::byte_from_hex_str(x, 0); 1047 | val = val & 0xC; 1048 | val = val >> 2; 1049 | switch(val) { 1050 | case 3: return std::string("Ok"); 1051 | case 1: return std::string("Discharging"); 1052 | case 2: return std::string("Overvoltage"); 1053 | case 0: return std::string("Undervoltage"); 1054 | default: return std::string(x); 1055 | } 1056 | 1057 | - platform: modbus_controller 1058 | modbus_controller_id: smg_inverter 1059 | name: "Mains supply State" 1060 | id: grid_state 1061 | icon: mdi:transmission-tower 1062 | entity_category: diagnostic 1063 | address: 4553 1064 | register_type: holding 1065 | raw_encode: HEXBYTES 1066 | lambda: |- 1067 | uint8_t val = modbus_controller::byte_from_hex_str(x, 0); 1068 | val = val & 0x30; 1069 | val = val >> 4; 1070 | switch(val) { 1071 | case 3: return std::string("Ok"); 1072 | case 1: return std::string("Absorption"); 1073 | case 2: return std::string("Discharging"); 1074 | case 0: return std::string("Abnormal"); 1075 | default: return std::string(x); 1076 | } 1077 | 1078 | - platform: modbus_controller 1079 | modbus_controller_id: smg_inverter 1080 | name: "Load State" 1081 | id: load_state 1082 | icon: mdi:lightning-bolt-circle 1083 | entity_category: diagnostic 1084 | address: 4553 1085 | register_type: holding 1086 | raw_encode: HEXBYTES 1087 | lambda: |- 1088 | uint8_t val = modbus_controller::byte_from_hex_str(x, 0); 1089 | val = val & 0xC0; 1090 | val = val >> 6; 1091 | switch(val) { 1092 | case 0: return std::string("Off"); 1093 | case 1: return std::string("Normal"); 1094 | case 2: return std::string("Overload"); 1095 | default: return std::string(x); 1096 | } 1097 | 1098 | - platform: modbus_controller 1099 | modbus_controller_id: smg_inverter 1100 | name: "Charger Status" 1101 | icon: mdi:ev-station 1102 | entity_category: diagnostic 1103 | address: 4555 1104 | register_type: holding 1105 | response_size: 2 1106 | raw_encode: HEXBYTES 1107 | lambda: |- 1108 | uint16_t sensorIndex = modbus_controller::word_from_hex_str(x, 0); 1109 | switch (sensorIndex) { 1110 | case 0x0a00: 1111 | return std::string("Off"); 1112 | case 0x0c00: 1113 | return std::string("Charge"); 1114 | case 0x0b00: 1115 | return std::string("Pre-Charge"); 1116 | case 0x0d00: 1117 | return std::string("Floating"); 1118 | default: 1119 | return std::string("Unknown State"); 1120 | } 1121 | 1122 | - platform: template 1123 | name: "Alarms" 1124 | icon: mdi:shield-alert-outline 1125 | lambda: |- 1126 | std::string alarm_str; 1127 | if (id(alarm_fan_locked).state) alarm_str += "Fan Locked;"; 1128 | if (id(alarm_over_temperater).state) alarm_str += "Over Temperater;"; 1129 | if (id(alarm_battery_over_charged).state) alarm_str += "Battery Over Charged;"; 1130 | if (id(alarm_battery_voltage_low).state) alarm_str += "Battery Voltage Low;"; 1131 | if (id(alarm_over_load).state) alarm_str += "Over Load;"; 1132 | if (id(alarm_output_power_derating).state) alarm_str += "Output Power Derating;"; 1133 | if (id(alarm_pv_energy_weak).state) alarm_str += "PV Energy Weak;"; 1134 | if (id(alarm_ac_voltage_high).state) alarm_str += "AC Voltage High;"; 1135 | if (id(alarm_no_battery).state) alarm_str += "No Battery;"; 1136 | if (alarm_str.length()==0) return std::string("None"); 1137 | return alarm_str; 1138 | update_interval: 60s 1139 | 1140 | - platform: template 1141 | name: "Errors" 1142 | icon: mdi:alert-circle 1143 | lambda: |- 1144 | std::string error_str; 1145 | if (id(error_fan_locked).state) error_str += "Fan Locked;"; 1146 | if (id(error_over_temperater).state) error_str += "Over Temperater;"; 1147 | if (id(error_battery_voltage_high).state) error_str += "Battery Voltage High;"; 1148 | if (id(error_battery_voltage_low).state) error_str += "Battery Voltage Low;"; 1149 | if (id(error_output_shorted).state) error_str += "Output shorted;"; 1150 | if (id(error_inv_voltage_over).state) error_str += "INV Voltage Over;"; 1151 | if (id(error_over_load).state) error_str += "Over Load;"; 1152 | if (id(error_bus_voltage_over).state) error_str += "Bus Voltage Over;"; 1153 | if (id(error_bus_soft_failed).state) error_str += "Bus Soft Failed;"; 1154 | if (id(error_pv_voltage_high).state) error_str += "PV Voltage High;"; 1155 | if (id(error_over_current).state) error_str += "Over Current;"; 1156 | if (id(error_bus_voltage_under).state) error_str += "Bus Voltage Under;"; 1157 | if (id(error_inv_soft_failed).state) error_str += "INV Soft Failed;"; 1158 | if (id(error_dc_voltage_over).state) error_str += "DC Voltage Over;"; 1159 | if (id(error_ct_fault).state) error_str += "CT Fault;"; 1160 | if (id(error_inv_voltage_low).state) error_str += "INV Voltage Low;"; 1161 | if (error_str.length()==0) return std::string("None"); 1162 | return error_str; 1163 | update_interval: 60s 1164 | -------------------------------------------------------------------------------- /src/powmr-inverter/modules/inverter.yaml: -------------------------------------------------------------------------------- 1 | uart: 2 | - id: uart_inverter 3 | baud_rate: 2400 4 | tx_pin: ${inverter_tx_pin} 5 | rx_pin: ${inverter_rx_pin} 6 | # debug: 7 | # direction: BOTH 8 | # dummy_receiver: false 9 | 10 | modbus: 11 | - id: modbus_inverter 12 | uart_id: uart_inverter 13 | send_wait_time: 250ms 14 | 15 | modbus_controller: 16 | - id: smg_inverter 17 | address: 0x05 18 | modbus_id: modbus_inverter 19 | setup_priority: -10 20 | offline_skip_updates: 100 21 | command_throttle: 1s 22 | update_interval: ${update_interval} 23 | 24 | sensor: 25 | 26 | - platform: modbus_controller 27 | modbus_controller_id: smg_inverter 28 | name: "Grid Voltage" 29 | id: grid_voltage 30 | address: 4502 31 | register_type: holding 32 | value_type: U_WORD 33 | unit_of_measurement: "V" 34 | device_class: voltage 35 | state_class: measurement 36 | accuracy_decimals: 1 37 | lambda: |- 38 | if (id(grid_state).state == "Abnormal") { 39 | return 0.0; 40 | } 41 | return swapBytes(x); 42 | filters: 43 | - multiply: 0.1 44 | - offset: ${inverter_voltage_offset} 45 | - heartbeat: 10s 46 | 47 | - platform: modbus_controller 48 | modbus_controller_id: smg_inverter 49 | name: "Grid Frequency" 50 | address: 4503 51 | register_type: holding 52 | value_type: U_WORD 53 | unit_of_measurement: "Hz" 54 | device_class: frequency 55 | state_class: measurement 56 | accuracy_decimals: 1 57 | lambda: |- 58 | return swapBytes(x); 59 | filters: 60 | - multiply: 0.1 61 | 62 | - platform: modbus_controller 63 | modbus_controller_id: smg_inverter 64 | name: "PV Voltage" 65 | id: pv_voltage 66 | address: 4504 67 | register_type: holding 68 | value_type: U_WORD 69 | unit_of_measurement: "V" 70 | device_class: voltage 71 | state_class: measurement 72 | accuracy_decimals: 1 73 | lambda: |- 74 | return swapBytes(x); 75 | filters: 76 | - multiply: 0.1 77 | 78 | - platform: modbus_controller 79 | modbus_controller_id: smg_inverter 80 | name: "PV Power" 81 | id: pv_power 82 | address: 4505 83 | register_type: holding 84 | value_type: U_WORD 85 | unit_of_measurement: "W" 86 | device_class: power 87 | state_class: measurement 88 | accuracy_decimals: 1 89 | lambda: |- 90 | return swapBytes(x); 91 | 92 | - platform: template 93 | name: "PV Current" 94 | id: pv_current 95 | state_class: "measurement" 96 | device_class: current 97 | unit_of_measurement: "A" 98 | accuracy_decimals: 1 99 | icon: mdi:solar-power 100 | lambda: |- 101 | if (id(pv_voltage).state == 0) { 102 | return 0; 103 | } 104 | return id(pv_power).state / id(pv_voltage).state; 105 | 106 | - platform: modbus_controller 107 | modbus_controller_id: smg_inverter 108 | name: "Battery Voltage" 109 | id: battery_voltage 110 | address: 4506 111 | register_type: holding 112 | value_type: U_WORD 113 | unit_of_measurement: "V" 114 | device_class: voltage 115 | state_class: measurement 116 | accuracy_decimals: 2 117 | lambda: |- 118 | return swapBytes(x); 119 | filters: 120 | - multiply: 0.1 121 | 122 | - platform: modbus_controller 123 | modbus_controller_id: smg_inverter 124 | name: "Battery SoC" 125 | accuracy_decimals: 0 126 | unit_of_measurement: "%" 127 | device_class: battery 128 | address: 4507 129 | register_type: holding 130 | value_type: U_WORD 131 | state_class: measurement 132 | lambda: |- 133 | return swapBytes(x); 134 | 135 | - platform: modbus_controller 136 | modbus_controller_id: smg_inverter 137 | name: "Battery Charge Current" 138 | id: battery_charge_current 139 | address: 4508 140 | register_type: holding 141 | value_type: U_WORD 142 | unit_of_measurement: "A" 143 | device_class: current 144 | state_class: measurement 145 | accuracy_decimals: 1 146 | lambda: |- 147 | return swapBytes(x); 148 | 149 | - platform: modbus_controller 150 | modbus_controller_id: smg_inverter 151 | name: "Battery Discharge Current" 152 | id: battery_discharge_current 153 | address: 4509 154 | register_type: holding 155 | value_type: U_WORD 156 | unit_of_measurement: "A" 157 | device_class: current 158 | state_class: measurement 159 | accuracy_decimals: 1 160 | lambda: |- 161 | return swapBytes(x); 162 | 163 | - platform: template 164 | name: "Battery Current" 165 | id: battery_current 166 | unit_of_measurement: "A" 167 | device_class: current 168 | state_class: measurement 169 | accuracy_decimals: 1 170 | update_interval: ${update_interval} 171 | lambda: |- 172 | return id(battery_charge_current).state - id(battery_discharge_current).state; 173 | filters: 174 | - heartbeat: 10s 175 | 176 | - platform: template 177 | name: "Battery Power" 178 | unit_of_measurement: "W" 179 | device_class: power 180 | state_class: measurement 181 | accuracy_decimals: 0 182 | update_interval: ${update_interval} 183 | lambda: |- 184 | return id(battery_current).state * id(battery_voltage).state; 185 | 186 | - platform: template 187 | name: "Battery Charge Power" 188 | id: battery_charge_power 189 | unit_of_measurement: "W" 190 | device_class: power 191 | state_class: measurement 192 | accuracy_decimals: 0 193 | update_interval: ${update_interval} 194 | lambda: |- 195 | return id(battery_charge_current).state * id(battery_voltage).state; 196 | 197 | - platform: template 198 | name: "Battery Discharge Power" 199 | id: battery_discharge_power 200 | unit_of_measurement: "W" 201 | device_class: power 202 | state_class: measurement 203 | accuracy_decimals: 0 204 | update_interval: ${update_interval} 205 | lambda: |- 206 | return id(battery_discharge_current).state * id(battery_voltage).state; 207 | 208 | - platform: modbus_controller 209 | modbus_controller_id: smg_inverter 210 | name: "Load Voltage" 211 | id: load_voltage 212 | address: 4510 213 | register_type: holding 214 | value_type: U_WORD 215 | unit_of_measurement: "V" 216 | device_class: voltage 217 | state_class: measurement 218 | accuracy_decimals: 1 219 | lambda: |- 220 | return swapBytes(x); 221 | filters: 222 | - multiply: 0.1 223 | 224 | - platform: modbus_controller 225 | modbus_controller_id: smg_inverter 226 | name: "Load Frequency" 227 | address: 4511 228 | register_type: holding 229 | value_type: U_WORD 230 | unit_of_measurement: "Hz" 231 | device_class: frequency 232 | state_class: measurement 233 | accuracy_decimals: 1 234 | lambda: |- 235 | return swapBytes(x); 236 | filters: 237 | - multiply: 0.1 238 | 239 | - platform: modbus_controller 240 | modbus_controller_id: smg_inverter 241 | name: "Load Power VA" 242 | id: load_Power_VA 243 | address: 4512 244 | register_type: holding 245 | value_type: U_WORD 246 | unit_of_measurement: "VA" 247 | device_class: apparent_power 248 | state_class: measurement 249 | accuracy_decimals: 0 250 | lambda: |- 251 | return swapBytes(x); 252 | 253 | - platform: modbus_controller 254 | modbus_controller_id: smg_inverter 255 | name: "Load Power" 256 | id: load_power 257 | address: 4513 258 | register_type: holding 259 | value_type: U_WORD 260 | unit_of_measurement: "W" 261 | device_class: power 262 | state_class: measurement 263 | accuracy_decimals: 0 264 | lambda: |- 265 | return swapBytes(x); 266 | 267 | - platform: template 268 | name: "Load Current" 269 | id: load_current 270 | unit_of_measurement: "A" 271 | device_class: current 272 | state_class: measurement 273 | accuracy_decimals: 3 274 | update_interval: ${update_interval} 275 | lambda: |- 276 | if (id(load_voltage).state == 0) { 277 | return 0; 278 | } 279 | return id(load_Power_VA).state / id(load_voltage).state; 280 | 281 | - platform: template 282 | name: "Load Power Factor" 283 | id: load_power_factor 284 | device_class: power_factor 285 | state_class: measurement 286 | accuracy_decimals: 2 287 | update_interval: ${update_interval} 288 | lambda: |- 289 | if (id(load_Power_VA).state == 0) { 290 | return 0; 291 | } 292 | return id(load_power).state / id(load_Power_VA).state; 293 | 294 | - platform: modbus_controller 295 | modbus_controller_id: smg_inverter 296 | name: "AC Out Load Percent" 297 | address: 4514 298 | register_type: holding 299 | value_type: U_WORD 300 | unit_of_measurement: "%" 301 | device_class: power_factor 302 | state_class: measurement 303 | lambda: |- 304 | return swapBytes(x); 305 | 306 | - platform: modbus_controller 307 | modbus_controller_id: smg_inverter 308 | name: "Load Percent" 309 | address: 4515 310 | register_count: 15 311 | register_type: holding 312 | value_type: U_WORD 313 | unit_of_measurement: "%" 314 | device_class: power_factor 315 | state_class: measurement 316 | lambda: |- 317 | return swapBytes(x); 318 | 319 | - platform: modbus_controller 320 | modbus_controller_id: smg_inverter 321 | name: "Target Output Frequency" 322 | icon: mdi:cosine-wave 323 | accuracy_decimals: 0 324 | entity_category: diagnostic 325 | address: 4540 326 | register_type: holding 327 | value_type: U_WORD 328 | unit_of_measurement: "Hz" 329 | lambda: |- 330 | uint16_t value = swapBytes(x); 331 | switch (value) { 332 | case 0: return std::uint16_t(50); 333 | case 1: return std::uint16_t(60); 334 | default: return x; 335 | } 336 | 337 | - platform: modbus_controller 338 | modbus_controller_id: smg_inverter 339 | name: "Max Total Charging Current" 340 | icon: mdi:battery-charging-100 341 | accuracy_decimals: 0 342 | entity_category: diagnostic 343 | address: 4541 344 | register_type: holding 345 | value_type: U_WORD 346 | unit_of_measurement: "A" 347 | lambda: |- 348 | return swapBytes(x); 349 | 350 | - platform: modbus_controller 351 | modbus_controller_id: smg_inverter 352 | name: "Target Output Voltage" 353 | icon: mdi:sine-wave 354 | accuracy_decimals: 0 355 | entity_category: diagnostic 356 | address: 4542 357 | register_type: holding 358 | value_type: U_WORD 359 | unit_of_measurement: "V" 360 | lambda: |- 361 | return swapBytes(x); 362 | 363 | - platform: modbus_controller 364 | modbus_controller_id: smg_inverter 365 | name: "Max Utility Charging Current" 366 | icon: mdi:transmission-tower-export 367 | accuracy_decimals: 0 368 | entity_category: diagnostic 369 | address: 4543 370 | register_type: holding 371 | value_type: U_WORD 372 | unit_of_measurement: "A" 373 | lambda: |- 374 | return swapBytes(x); 375 | 376 | - platform: modbus_controller 377 | modbus_controller_id: smg_inverter 378 | name: "Back To Utility Source Voltage" 379 | icon: mdi:transmission-tower-import 380 | filters: 381 | - multiply: 0.1 382 | accuracy_decimals: 1 383 | entity_category: diagnostic 384 | address: 4544 385 | register_type: holding 386 | value_type: U_WORD 387 | unit_of_measurement: "V" 388 | lambda: |- 389 | return swapBytes(x); 390 | 391 | - platform: modbus_controller 392 | modbus_controller_id: smg_inverter 393 | name: "Back To Battery Source Voltage" 394 | icon: mdi:power-plug-battery 395 | filters: 396 | - multiply: 0.1 397 | accuracy_decimals: 1 398 | entity_category: diagnostic 399 | address: 4545 400 | register_type: holding 401 | value_type: U_WORD 402 | unit_of_measurement: "V" 403 | lambda: |- 404 | return swapBytes(x); 405 | 406 | - platform: modbus_controller 407 | modbus_controller_id: smg_inverter 408 | name: "Bulk Charging Voltage" 409 | icon: mdi:battery-arrow-down 410 | filters: 411 | - multiply: 0.1 412 | accuracy_decimals: 1 413 | entity_category: diagnostic 414 | address: 4546 415 | register_type: holding 416 | value_type: U_WORD 417 | unit_of_measurement: "V" 418 | lambda: |- 419 | return swapBytes(x); 420 | 421 | - platform: modbus_controller 422 | modbus_controller_id: smg_inverter 423 | name: "Floating Charging Voltage" 424 | icon: mdi:battery-sync-outline 425 | filters: 426 | - multiply: 0.1 427 | accuracy_decimals: 1 428 | entity_category: diagnostic 429 | address: 4547 430 | register_type: holding 431 | value_type: U_WORD 432 | unit_of_measurement: "V" 433 | lambda: |- 434 | return swapBytes(x); 435 | 436 | - platform: modbus_controller 437 | modbus_controller_id: smg_inverter 438 | name: "Low CutOff Voltage" 439 | icon: mdi:battery-off 440 | filters: 441 | - multiply: 0.1 442 | accuracy_decimals: 1 443 | entity_category: diagnostic 444 | address: 4548 445 | register_type: holding 446 | value_type: U_WORD 447 | unit_of_measurement: "V" 448 | lambda: |- 449 | return swapBytes(x); 450 | 451 | # - platform: modbus_controller 452 | # modbus_controller_id: smg_inverter 453 | # name: "Battery Equalization Voltage" 454 | # icon: mdi:battery-medium 455 | # filters: 456 | # - multiply: 0.1 457 | # accuracy_decimals: 1 458 | # entity_category: diagnostic 459 | # address: 4549 460 | # register_type: holding 461 | # value_type: U_WORD 462 | # unit_of_measurement: "V" 463 | # lambda: |- 464 | # return swapBytes(x); 465 | 466 | # - platform: modbus_controller 467 | # modbus_controller_id: smg_inverter 468 | # name: "Battery Equalized Time" 469 | # icon: mdi:battery-clock-outline 470 | # accuracy_decimals: 0 471 | # entity_category: diagnostic 472 | # address: 4550 473 | # register_type: holding 474 | # value_type: U_WORD 475 | # lambda: |- 476 | # return swapBytes(x); 477 | 478 | # - platform: modbus_controller 479 | # modbus_controller_id: smg_inverter 480 | # name: "Battery Equalized Timeout" 481 | # icon: mdi:battery-remove-outline 482 | # accuracy_decimals: 0 483 | # entity_category: diagnostic 484 | # address: 4551 485 | # register_type: holding 486 | # value_type: U_WORD 487 | # lambda: |- 488 | # return swapBytes(x); 489 | 490 | # - platform: modbus_controller 491 | # modbus_controller_id: smg_inverter 492 | # name: "Equalization Interval" 493 | # icon: mdi:update 494 | # accuracy_decimals: 0 495 | # entity_category: diagnostic 496 | # address: 4552 497 | # register_count: 5 498 | # register_type: holding 499 | # value_type: U_WORD 500 | # lambda: |- 501 | # return swapBytes(x); 502 | 503 | # something "Working State"/"Mains supply State" related... 504 | # 2 - Line Mode, 7 - Invert Mode ... 505 | - platform: modbus_controller 506 | modbus_controller_id: smg_inverter 507 | name: "Register4554" 508 | entity_category: diagnostic 509 | address: 4554 510 | register_type: holding 511 | value_type: U_WORD 512 | lambda: |- 513 | return swapBytes(x); 514 | 515 | # something PV related... 516 | # 0 - PV Undervoltage, 13 - PV Discharging, 11 - 517 | - platform: modbus_controller 518 | modbus_controller_id: smg_inverter 519 | name: "Register4556" 520 | entity_category: diagnostic 521 | address: 4556 522 | register_type: holding 523 | value_type: U_WORD 524 | lambda: |- 525 | return swapBytes(x); 526 | 527 | - platform: modbus_controller 528 | modbus_controller_id: smg_inverter 529 | name: "PV Temperature" 530 | icon: mdi:thermometer-lines 531 | accuracy_decimals: 0 532 | entity_category: diagnostic 533 | address: 4557 534 | register_type: holding 535 | value_type: U_WORD 536 | unit_of_measurement: "°C" 537 | lambda: |- 538 | return swapBytes(x); 539 | 540 | binary_sensor: 541 | 542 | - platform: template 543 | name: "Grid Active" 544 | id: grid_active 545 | lambda: |- 546 | if (id(grid_state).state == "Abnormal") { 547 | return false; 548 | } else { 549 | return true; 550 | } 551 | 552 | - platform: template 553 | name: "On Battery" 554 | id: on_battery 555 | lambda: |- 556 | if (id(battery_state).state == "Discharging") { 557 | return true; 558 | } else { 559 | return false; 560 | } 561 | 562 | - platform: template 563 | name: "Load Enabled" 564 | id: load_enabled 565 | lambda: |- 566 | if (id(load_state).state == "Normal") { 567 | return true; 568 | } else { 569 | return false; 570 | } 571 | 572 | - platform: modbus_controller 573 | modbus_controller_id: smg_inverter 574 | name: "Error - Fan Locked" 575 | id: error_fan_locked 576 | internal: true 577 | entity_category: diagnostic 578 | address: 4529 579 | register_type: holding 580 | bitmask: 0x100 581 | 582 | - platform: modbus_controller 583 | modbus_controller_id: smg_inverter 584 | name: "Error - Over Temperater" 585 | id: error_over_temperater 586 | internal: true 587 | entity_category: diagnostic 588 | address: 4529 589 | register_type: holding 590 | bitmask: 0x200 591 | 592 | - platform: modbus_controller 593 | modbus_controller_id: smg_inverter 594 | name: "Error - Battery Voltage High" 595 | id: error_battery_voltage_high 596 | internal: true 597 | entity_category: diagnostic 598 | address: 4529 599 | register_type: holding 600 | bitmask: 0x400 601 | 602 | - platform: modbus_controller 603 | modbus_controller_id: smg_inverter 604 | name: "Error - Battery Voltage Low" 605 | id: error_battery_voltage_low 606 | internal: true 607 | entity_category: diagnostic 608 | address: 4529 609 | register_type: holding 610 | bitmask: 0x800 611 | 612 | - platform: modbus_controller 613 | modbus_controller_id: smg_inverter 614 | name: "Error - Output shorted" 615 | id: error_output_shorted 616 | internal: true 617 | entity_category: diagnostic 618 | address: 4529 619 | register_type: holding 620 | bitmask: 0x1000 621 | 622 | - platform: modbus_controller 623 | modbus_controller_id: smg_inverter 624 | name: "Error - INV Voltage Over" 625 | id: error_inv_voltage_over 626 | internal: true 627 | entity_category: diagnostic 628 | address: 4529 629 | register_type: holding 630 | bitmask: 0x2000 631 | 632 | - platform: modbus_controller 633 | modbus_controller_id: smg_inverter 634 | name: "Error - Over Load" 635 | id: error_over_load 636 | internal: true 637 | entity_category: diagnostic 638 | address: 4529 639 | register_type: holding 640 | bitmask: 0x4000 641 | 642 | - platform: modbus_controller 643 | modbus_controller_id: smg_inverter 644 | name: "Error - Bus Voltage Over" 645 | id: error_bus_voltage_over 646 | internal: true 647 | entity_category: diagnostic 648 | address: 4529 649 | register_type: holding 650 | bitmask: 0x8000 651 | 652 | - platform: modbus_controller 653 | modbus_controller_id: smg_inverter 654 | name: "Error - Bus Soft Failed" 655 | id: error_bus_soft_failed 656 | internal: true 657 | entity_category: diagnostic 658 | address: 4529 659 | register_type: holding 660 | bitmask: 0x1 661 | 662 | - platform: modbus_controller 663 | modbus_controller_id: smg_inverter 664 | name: "Error - PV Voltage High" 665 | id: error_pv_voltage_high 666 | internal: true 667 | entity_category: diagnostic 668 | address: 4529 669 | register_type: holding 670 | bitmask: 0x2 671 | 672 | - platform: modbus_controller 673 | modbus_controller_id: smg_inverter 674 | name: "Error - Over Current" 675 | id: error_over_current 676 | internal: true 677 | entity_category: diagnostic 678 | address: 4529 679 | register_type: holding 680 | bitmask: 0x4 681 | 682 | - platform: modbus_controller 683 | modbus_controller_id: smg_inverter 684 | name: "Error - Bus Voltage Under" 685 | id: error_bus_voltage_under 686 | internal: true 687 | entity_category: diagnostic 688 | address: 4529 689 | register_type: holding 690 | bitmask: 0x8 691 | 692 | - platform: modbus_controller 693 | modbus_controller_id: smg_inverter 694 | name: "Error - INV Soft Failed" 695 | id: error_inv_soft_failed 696 | internal: true 697 | entity_category: diagnostic 698 | address: 4529 699 | register_type: holding 700 | bitmask: 0x10 701 | 702 | - platform: modbus_controller 703 | modbus_controller_id: smg_inverter 704 | name: "Error - DC Voltage Over" 705 | id: error_dc_voltage_over 706 | internal: true 707 | entity_category: diagnostic 708 | address: 4529 709 | register_type: holding 710 | bitmask: 0x20 711 | 712 | - platform: modbus_controller 713 | modbus_controller_id: smg_inverter 714 | name: "Error - CT Fault" 715 | id: error_ct_fault 716 | internal: true 717 | entity_category: diagnostic 718 | address: 4529 719 | register_type: holding 720 | bitmask: 0x40 721 | 722 | - platform: modbus_controller 723 | modbus_controller_id: smg_inverter 724 | name: "Error - INV Voltage Low" 725 | id: error_inv_voltage_low 726 | internal: true 727 | entity_category: diagnostic 728 | address: 4529 729 | register_type: holding 730 | bitmask: 0x80 731 | 732 | - platform: modbus_controller 733 | modbus_controller_id: smg_inverter 734 | name: "Alarm - Fan Locked" 735 | id: alarm_fan_locked 736 | internal: true 737 | entity_category: diagnostic 738 | address: 4530 739 | register_type: holding 740 | bitmask: 0x100 741 | 742 | - platform: modbus_controller 743 | modbus_controller_id: smg_inverter 744 | name: "Alarm - Over Temperater" 745 | id: alarm_over_temperater 746 | internal: true 747 | entity_category: diagnostic 748 | address: 4530 749 | register_type: holding 750 | bitmask: 0x200 751 | 752 | - platform: modbus_controller 753 | modbus_controller_id: smg_inverter 754 | name: "Alarm - Battery Over Charged" 755 | id: alarm_battery_over_charged 756 | internal: true 757 | entity_category: diagnostic 758 | address: 4530 759 | register_type: holding 760 | bitmask: 0x400 761 | 762 | - platform: modbus_controller 763 | modbus_controller_id: smg_inverter 764 | name: "Alarm - Battery Voltage Low" 765 | id: alarm_battery_voltage_low 766 | internal: true 767 | entity_category: diagnostic 768 | address: 4530 769 | register_type: holding 770 | bitmask: 0x800 771 | 772 | - platform: modbus_controller 773 | modbus_controller_id: smg_inverter 774 | name: "Alarm - Over Load" 775 | id: alarm_over_load 776 | internal: true 777 | entity_category: diagnostic 778 | address: 4530 779 | register_type: holding 780 | bitmask: 0x1000 781 | 782 | - platform: modbus_controller 783 | modbus_controller_id: smg_inverter 784 | name: "Alarm - Output Power Derating" 785 | id: alarm_output_power_derating 786 | internal: true 787 | entity_category: diagnostic 788 | address: 4530 789 | register_type: holding 790 | bitmask: 0x2000 791 | 792 | - platform: modbus_controller 793 | modbus_controller_id: smg_inverter 794 | name: "Alarm - PV Energy Weak" 795 | id: alarm_pv_energy_weak 796 | internal: true 797 | entity_category: diagnostic 798 | address: 4530 799 | register_type: holding 800 | bitmask: 0x4000 801 | 802 | - platform: modbus_controller 803 | modbus_controller_id: smg_inverter 804 | name: "Alarm - AC Voltage High" 805 | internal: true 806 | id: alarm_ac_voltage_high 807 | entity_category: diagnostic 808 | address: 4530 809 | register_type: holding 810 | bitmask: 0x8000 811 | 812 | - platform: modbus_controller 813 | modbus_controller_id: smg_inverter 814 | name: "Alarm - No Battery" 815 | id: alarm_no_battery 816 | internal: true 817 | entity_category: diagnostic 818 | address: 4530 819 | register_type: holding 820 | bitmask: 0x1 821 | 822 | - platform: modbus_controller 823 | modbus_controller_id: smg_inverter 824 | name: "Record Fault Code" 825 | icon: mdi:alert-plus-outline 826 | entity_category: diagnostic 827 | address: 4535 828 | register_type: holding 829 | bitmask: 0x1 830 | 831 | # - platform: modbus_controller 832 | # modbus_controller_id: smg_inverter 833 | # name: "Battery Equalization" 834 | # icon: mdi:battery-arrow-up-outline 835 | # entity_category: diagnostic 836 | # address: 4535 837 | # register_type: holding 838 | # bitmask: 0x2 839 | 840 | # - platform: modbus_controller 841 | # modbus_controller_id: smg_inverter 842 | # name: "Battery Equalization activated immediately" 843 | # icon: mdi:battery-plus 844 | # entity_category: diagnostic 845 | # address: 4535 846 | # register_type: holding 847 | # bitmask: 0x4 848 | 849 | - platform: modbus_controller 850 | modbus_controller_id: smg_inverter 851 | name: "Buzzer Alarm" 852 | icon: mdi:speaker-wireless 853 | entity_category: diagnostic 854 | address: 4535 855 | register_type: holding 856 | bitmask: 0x100 857 | 858 | - platform: modbus_controller 859 | modbus_controller_id: smg_inverter 860 | name: "Power saving mode" 861 | icon: mdi:leaf-circle-outline 862 | entity_category: diagnostic 863 | address: 4535 864 | register_type: holding 865 | bitmask: 0x200 866 | 867 | - platform: modbus_controller 868 | modbus_controller_id: smg_inverter 869 | name: "Backlight" 870 | icon: mdi:alarm-light 871 | entity_category: diagnostic 872 | address: 4535 873 | register_type: holding 874 | bitmask: 0x400 875 | 876 | - platform: modbus_controller 877 | modbus_controller_id: smg_inverter 878 | name: "Restart On Overload" 879 | icon: mdi:restart 880 | entity_category: diagnostic 881 | address: 4535 882 | register_type: holding 883 | bitmask: 0x800 884 | 885 | - platform: modbus_controller 886 | modbus_controller_id: smg_inverter 887 | name: "Restart On Overheat" 888 | icon: mdi:restart-alert 889 | entity_category: diagnostic 890 | address: 4535 891 | register_type: holding 892 | bitmask: 0x1000 893 | 894 | - platform: modbus_controller 895 | modbus_controller_id: smg_inverter 896 | name: "Beep On Primary Source Fail" 897 | icon: mdi:speaker-message 898 | entity_category: diagnostic 899 | address: 4535 900 | register_type: holding 901 | bitmask: 0x2000 902 | 903 | - platform: modbus_controller 904 | modbus_controller_id: smg_inverter 905 | name: "Return To Default Screen" 906 | icon: mdi:backburger 907 | entity_category: diagnostic 908 | address: 4535 909 | register_type: holding 910 | bitmask: 0x4000 911 | 912 | - platform: modbus_controller 913 | modbus_controller_id: smg_inverter 914 | name: "Overload Bypass" 915 | icon: mdi:transit-skip 916 | entity_category: diagnostic 917 | address: 4535 918 | register_type: holding 919 | bitmask: 0x8000 920 | 921 | text_sensor: 922 | 923 | - platform: modbus_controller 924 | modbus_controller_id: smg_inverter 925 | id: Working_State 926 | name: "Working State" 927 | icon: mdi:state-machine 928 | entity_category: diagnostic 929 | address: 4501 930 | register_type: holding 931 | response_size: 2 932 | raw_encode: HEXBYTES 933 | lambda: |- 934 | uint16_t sensorIndex = swapBytes(modbus_controller::word_from_hex_str(x, 0)); 935 | switch (sensorIndex) { 936 | case 7: return std::string("ShutDown"); 937 | case 3: return std::string("Invert Mode"); 938 | case 4: return std::string("Line Mode"); 939 | case 0: return std::string("Power On"); 940 | case 5: return std::string("Bypass"); 941 | case 1: return std::string("Test"); 942 | case 6: return std::string("Fault Mode"); 943 | case 2: return std::string("Stand By"); 944 | default: return std::string(x); 945 | } 946 | 947 | - platform: modbus_controller 948 | modbus_controller_id: smg_inverter 949 | id: charger_source_priority_text 950 | name: "Charger Source Priority" 951 | entity_category: diagnostic 952 | address: 4536 953 | register_type: holding 954 | response_size: 2 955 | raw_encode: HEXBYTES 956 | lambda: |- 957 | uint16_t sensorIndex = swapBytes(modbus_controller::word_from_hex_str(x, 0)); 958 | switch (sensorIndex) { 959 | case 0: return std::string("Solar first"); 960 | case 1: return std::string("Solar and Utility"); 961 | case 2: return std::string("Only solar"); 962 | default: return std::string(x); 963 | } 964 | 965 | - platform: modbus_controller 966 | modbus_controller_id: smg_inverter 967 | name: "Output Source Priority" 968 | entity_category: diagnostic 969 | address: 4537 970 | register_type: holding 971 | response_size: 2 972 | raw_encode: HEXBYTES 973 | lambda: |- 974 | uint16_t sensorIndex = swapBytes(modbus_controller::word_from_hex_str(x, 0)); 975 | switch (sensorIndex) { 976 | case 0: return std::string("Utility first (USB)"); 977 | case 1: return std::string("Solar first (SUB)"); 978 | case 2: return std::string("SBU priority"); 979 | default: return std::string(x); 980 | } 981 | 982 | - platform: modbus_controller 983 | modbus_controller_id: smg_inverter 984 | name: "AC Input Voltage Range" 985 | icon: mdi:home-import-outline 986 | entity_category: diagnostic 987 | address: 4538 988 | register_type: holding 989 | response_size: 2 990 | raw_encode: HEXBYTES 991 | lambda: |- 992 | uint16_t value = swapBytes(modbus_controller::word_from_hex_str(x, 0)); 993 | switch (value) { 994 | case 0: return std::string("Appliances"); 995 | case 1: return std::string("UPS"); 996 | default: return std::string(x); 997 | } 998 | 999 | - platform: modbus_controller 1000 | modbus_controller_id: smg_inverter 1001 | name: "Battery type" 1002 | icon: mdi:home-battery 1003 | entity_category: diagnostic 1004 | address: 4539 1005 | register_type: holding 1006 | response_size: 2 1007 | raw_encode: HEXBYTES 1008 | lambda: |- 1009 | uint16_t value = swapBytes(modbus_controller::word_from_hex_str(x, 0)); 1010 | switch (value) { 1011 | case 0: return std::string("AGM"); 1012 | case 1: return std::string("Flooded"); 1013 | case 2: return std::string("User defined"); 1014 | default: return std::string(x); 1015 | } 1016 | 1017 | - platform: modbus_controller 1018 | modbus_controller_id: smg_inverter 1019 | name: "Battery State" 1020 | id: battery_state 1021 | icon: mdi:battery-unknown 1022 | entity_category: diagnostic 1023 | address: 4553 1024 | register_type: holding 1025 | raw_encode: HEXBYTES 1026 | lambda: |- 1027 | uint8_t val = modbus_controller::byte_from_hex_str(x, 0); 1028 | val = val & 0x3; 1029 | switch(val) { 1030 | case 3: return std::string("Ok"); 1031 | case 1: return std::string("Discharging"); 1032 | case 2: return std::string("Charging"); 1033 | case 0: return std::string("Disconnected"); 1034 | default: return std::string(x); 1035 | } 1036 | 1037 | - platform: modbus_controller 1038 | modbus_controller_id: smg_inverter 1039 | name: "PV State" 1040 | icon: mdi:solar-power 1041 | entity_category: diagnostic 1042 | address: 4553 1043 | register_type: holding 1044 | raw_encode: HEXBYTES 1045 | lambda: |- 1046 | uint8_t val = modbus_controller::byte_from_hex_str(x, 0); 1047 | val = val & 0xC; 1048 | val = val >> 2; 1049 | switch(val) { 1050 | case 3: return std::string("Ok"); 1051 | case 1: return std::string("Discharging"); 1052 | case 2: return std::string("Overvoltage"); 1053 | case 0: return std::string("Undervoltage"); 1054 | default: return std::string(x); 1055 | } 1056 | 1057 | - platform: modbus_controller 1058 | modbus_controller_id: smg_inverter 1059 | name: "Mains supply State" 1060 | id: grid_state 1061 | icon: mdi:transmission-tower 1062 | entity_category: diagnostic 1063 | address: 4553 1064 | register_type: holding 1065 | raw_encode: HEXBYTES 1066 | lambda: |- 1067 | uint8_t val = modbus_controller::byte_from_hex_str(x, 0); 1068 | val = val & 0x30; 1069 | val = val >> 4; 1070 | switch(val) { 1071 | case 3: return std::string("Ok"); 1072 | case 1: return std::string("Absorption"); 1073 | case 2: return std::string("Discharging"); 1074 | case 0: return std::string("Abnormal"); 1075 | default: return std::string(x); 1076 | } 1077 | 1078 | - platform: modbus_controller 1079 | modbus_controller_id: smg_inverter 1080 | name: "Load State" 1081 | id: load_state 1082 | icon: mdi:lightning-bolt-circle 1083 | entity_category: diagnostic 1084 | address: 4553 1085 | register_type: holding 1086 | raw_encode: HEXBYTES 1087 | lambda: |- 1088 | uint8_t val = modbus_controller::byte_from_hex_str(x, 0); 1089 | val = val & 0xC0; 1090 | val = val >> 6; 1091 | switch(val) { 1092 | case 0: return std::string("Off"); 1093 | case 1: return std::string("Normal"); 1094 | case 2: return std::string("Overload"); 1095 | default: return std::string(x); 1096 | } 1097 | 1098 | - platform: modbus_controller 1099 | modbus_controller_id: smg_inverter 1100 | name: "Charger Status" 1101 | icon: mdi:ev-station 1102 | entity_category: diagnostic 1103 | address: 4555 1104 | register_type: holding 1105 | response_size: 2 1106 | raw_encode: HEXBYTES 1107 | lambda: |- 1108 | uint16_t sensorIndex = modbus_controller::word_from_hex_str(x, 0); 1109 | switch (sensorIndex) { 1110 | case 0x0a00: 1111 | return std::string("Off"); 1112 | case 0x0c00: 1113 | return std::string("Charge"); 1114 | case 0x0b00: 1115 | return std::string("Pre-Charge"); 1116 | case 0x0d00: 1117 | return std::string("Floating"); 1118 | default: 1119 | return std::string("Unknown State"); 1120 | } 1121 | 1122 | - platform: template 1123 | name: "Alarms" 1124 | icon: mdi:shield-alert-outline 1125 | lambda: |- 1126 | std::string alarm_str; 1127 | if (id(alarm_fan_locked).state) alarm_str += "Fan Locked;"; 1128 | if (id(alarm_over_temperater).state) alarm_str += "Over Temperater;"; 1129 | if (id(alarm_battery_over_charged).state) alarm_str += "Battery Over Charged;"; 1130 | if (id(alarm_battery_voltage_low).state) alarm_str += "Battery Voltage Low;"; 1131 | if (id(alarm_over_load).state) alarm_str += "Over Load;"; 1132 | if (id(alarm_output_power_derating).state) alarm_str += "Output Power Derating;"; 1133 | if (id(alarm_pv_energy_weak).state) alarm_str += "PV Energy Weak;"; 1134 | if (id(alarm_ac_voltage_high).state) alarm_str += "AC Voltage High;"; 1135 | if (id(alarm_no_battery).state) alarm_str += "No Battery;"; 1136 | if (alarm_str.length()==0) return std::string("None"); 1137 | return alarm_str; 1138 | update_interval: 60s 1139 | 1140 | - platform: template 1141 | name: "Errors" 1142 | icon: mdi:alert-circle 1143 | lambda: |- 1144 | std::string error_str; 1145 | if (id(error_fan_locked).state) error_str += "Fan Locked;"; 1146 | if (id(error_over_temperater).state) error_str += "Over Temperater;"; 1147 | if (id(error_battery_voltage_high).state) error_str += "Battery Voltage High;"; 1148 | if (id(error_battery_voltage_low).state) error_str += "Battery Voltage Low;"; 1149 | if (id(error_output_shorted).state) error_str += "Output shorted;"; 1150 | if (id(error_inv_voltage_over).state) error_str += "INV Voltage Over;"; 1151 | if (id(error_over_load).state) error_str += "Over Load;"; 1152 | if (id(error_bus_voltage_over).state) error_str += "Bus Voltage Over;"; 1153 | if (id(error_bus_soft_failed).state) error_str += "Bus Soft Failed;"; 1154 | if (id(error_pv_voltage_high).state) error_str += "PV Voltage High;"; 1155 | if (id(error_over_current).state) error_str += "Over Current;"; 1156 | if (id(error_bus_voltage_under).state) error_str += "Bus Voltage Under;"; 1157 | if (id(error_inv_soft_failed).state) error_str += "INV Soft Failed;"; 1158 | if (id(error_dc_voltage_over).state) error_str += "DC Voltage Over;"; 1159 | if (id(error_ct_fault).state) error_str += "CT Fault;"; 1160 | if (id(error_inv_voltage_low).state) error_str += "INV Voltage Low;"; 1161 | if (error_str.length()==0) return std::string("None"); 1162 | return error_str; 1163 | update_interval: 60s 1164 | 1165 | select: 1166 | 1167 | # 5001 - ? Remove all power history ["0": "Do nothing","1": "Remove all power history"] 1168 | 1169 | - platform: modbus_controller 1170 | name: "Buzzer Alarm" 1171 | icon: mdi:speaker-wireless 1172 | optimistic: true 1173 | skip_updates: ${select_skip_updates} 1174 | entity_category: config 1175 | address: 5002 1176 | value_type: U_WORD 1177 | force_new_range: true 1178 | optionsmap: 1179 | "Off": 0 1180 | "On": 1 1181 | 1182 | - platform: modbus_controller 1183 | name: "Power saving mode" 1184 | icon: mdi:leaf-circle-outline 1185 | optimistic: true 1186 | skip_updates: ${select_skip_updates} 1187 | entity_category: config 1188 | address: 5003 1189 | value_type: U_WORD 1190 | optionsmap: 1191 | "Off": 0 1192 | "On": 1 1193 | 1194 | - platform: modbus_controller 1195 | name: "Backlight" 1196 | icon: mdi:alarm-light 1197 | optimistic: true 1198 | skip_updates: ${select_skip_updates} 1199 | entity_category: config 1200 | address: 5004 1201 | value_type: U_WORD 1202 | force_new_range: true 1203 | optionsmap: 1204 | "Off": 0 1205 | "On": 1 1206 | 1207 | - platform: modbus_controller 1208 | name: "Restart On Overload" 1209 | icon: mdi:restart 1210 | optimistic: true 1211 | skip_updates: ${select_skip_updates} 1212 | entity_category: config 1213 | address: 5005 1214 | value_type: U_WORD 1215 | optionsmap: 1216 | "Off": 0 1217 | "On": 1 1218 | 1219 | - platform: modbus_controller 1220 | name: "Restart On Overheat" 1221 | icon: mdi:restart-alert 1222 | optimistic: true 1223 | skip_updates: ${select_skip_updates} 1224 | entity_category: config 1225 | address: 5006 1226 | value_type: U_WORD 1227 | force_new_range: true 1228 | optionsmap: 1229 | "Off": 0 1230 | "On": 1 1231 | 1232 | - platform: modbus_controller 1233 | name: "Beep On Primary Source Fail" 1234 | icon: mdi:speaker-message 1235 | optimistic: true 1236 | skip_updates: ${select_skip_updates} 1237 | entity_category: config 1238 | address: 5007 1239 | value_type: U_WORD 1240 | optionsmap: 1241 | "Off": 0 1242 | "On": 1 1243 | 1244 | - platform: modbus_controller 1245 | name: "Return To Default Display" 1246 | icon: mdi:backburger 1247 | optimistic: true 1248 | skip_updates: ${select_skip_updates} 1249 | entity_category: config 1250 | address: 5008 1251 | value_type: U_WORD 1252 | force_new_range: true 1253 | optionsmap: 1254 | "Off": 0 1255 | "On": 1 1256 | 1257 | - platform: modbus_controller 1258 | name: "Overload Bypass" 1259 | icon: mdi:transit-skip 1260 | optimistic: true 1261 | skip_updates: ${select_skip_updates} 1262 | entity_category: config 1263 | address: 5009 1264 | value_type: U_WORD 1265 | optionsmap: 1266 | "Off": 0 1267 | "On": 1 1268 | 1269 | - platform: modbus_controller 1270 | name: "Record fault code" 1271 | icon: mdi:folder-alert 1272 | optimistic: true 1273 | skip_updates: ${select_skip_updates} 1274 | entity_category: config 1275 | address: 5010 1276 | value_type: U_WORD 1277 | force_new_range: true 1278 | optionsmap: 1279 | "Off": 0 1280 | "On": 1 1281 | 1282 | # - platform: modbus_controller 1283 | # name: "Battery Equalization" 1284 | # icon: mdi:approximately-equal 1285 | # optimistic: true 1286 | # skip_updates: ${select_skip_updates} 1287 | # entity_category: config 1288 | # address: 5011 1289 | # value_type: U_WORD 1290 | # optionsmap: 1291 | # "Off": 0 1292 | # "On": 1 1293 | 1294 | # - platform: modbus_controller 1295 | # name: "Battery Equalization activated immediately" 1296 | # icon: mdi:battery-arrow-up 1297 | # optimistic: true 1298 | # skip_updates: ${select_skip_updates} 1299 | # entity_category: config 1300 | # address: 5012 1301 | # value_type: U_WORD 1302 | # force_new_range: true 1303 | # optionsmap: 1304 | # "Off": 0 1305 | # "On": 1 1306 | 1307 | # - platform: modbus_controller 1308 | # name: "Restore Defaults (!RESET!)" 1309 | # icon: mdi:restore 1310 | # optimistic: true 1311 | # skip_updates: ${select_skip_updates} 1312 | # entity_category: config 1313 | # address: 5016 1314 | # value_type: U_WORD 1315 | # optionsmap: 1316 | # "NO": 0 1317 | # "YES": 1 1318 | 1319 | - platform: modbus_controller 1320 | id: charger_source_priority_select 1321 | name: "Charger Source Priority" 1322 | icon: mdi:battery-charging 1323 | optimistic: true 1324 | skip_updates: ${select_skip_updates} 1325 | force_new_range: true 1326 | entity_category: config 1327 | address: 5017 1328 | value_type: U_WORD 1329 | optionsmap: 1330 | "Solar first": 0 1331 | "Solar and Utility": 1 1332 | "Only Solar": 2 1333 | 1334 | - platform: modbus_controller 1335 | id: output_source_priority_select 1336 | name: "Output Source Priority" 1337 | icon: mdi:export 1338 | optimistic: true 1339 | skip_updates: ${select_skip_updates} 1340 | entity_category: config 1341 | address: 5018 1342 | value_type: U_WORD 1343 | optionsmap: 1344 | "Utility first (USB)": 0 1345 | "Solar first (SUB)": 1 1346 | "SBU priority": 2 1347 | 1348 | - platform: modbus_controller 1349 | name: "AC input voltage range" 1350 | icon: mdi:home-import-outline 1351 | optimistic: true 1352 | skip_updates: ${select_skip_updates} 1353 | entity_category: config 1354 | address: 5019 1355 | force_new_range: true 1356 | value_type: U_WORD 1357 | optionsmap: 1358 | "APL (90-280)": 0 1359 | "UPS (170-280)": 1 1360 | 1361 | - platform: modbus_controller 1362 | name: "Battery type" 1363 | icon: mdi:car-battery 1364 | optimistic: true 1365 | skip_updates: ${select_skip_updates} 1366 | entity_category: config 1367 | address: 5020 1368 | value_type: U_WORD 1369 | optionsmap: 1370 | "AGM": 0 1371 | "Flooded": 1 1372 | "User Defined": 2 1373 | 1374 | - platform: modbus_controller 1375 | name: "Output Frequency" 1376 | icon: mdi:cosine-wave 1377 | optimistic: true 1378 | skip_updates: ${select_skip_updates} 1379 | entity_category: config 1380 | address: 5021 1381 | force_new_range: true 1382 | value_type: U_WORD 1383 | optionsmap: 1384 | "50Hz": 0 1385 | "60Hz": 1 1386 | 1387 | - platform: modbus_controller 1388 | name: "Max Total Charge Current" 1389 | id: max_total_charge_current 1390 | icon: mdi:battery-charging-100 1391 | optimistic: true 1392 | skip_updates: ${select_skip_updates} 1393 | entity_category: config 1394 | address: 5022 1395 | value_type: U_WORD 1396 | optionsmap: 1397 | "10": 10 1398 | "20": 20 1399 | "30": 30 1400 | "40": 40 1401 | "50": 50 1402 | "60": 60 1403 | "70": 70 1404 | "80": 80 1405 | 1406 | - platform: modbus_controller 1407 | name: "Output voltage" 1408 | icon: mdi:home-export-outline 1409 | optimistic: true 1410 | skip_updates: ${select_skip_updates} 1411 | entity_category: config 1412 | address: 5023 1413 | force_new_range: true 1414 | value_type: U_WORD 1415 | optionsmap: 1416 | "220V": 220 1417 | "230V": 230 1418 | "240V": 240 1419 | 1420 | - platform: modbus_controller 1421 | name: "Utility Charge Current" 1422 | id: utility_charge_current 1423 | icon: mdi:transmission-tower-export 1424 | optimistic: true 1425 | skip_updates: ${select_skip_updates} 1426 | entity_category: config 1427 | address: 5024 1428 | value_type: U_WORD 1429 | optionsmap: 1430 | "10": 10 1431 | "20": 20 1432 | "30": 30 1433 | "40": 40 1434 | "50": 50 1435 | "60": 60 1436 | 1437 | number: 1438 | - platform: modbus_controller 1439 | name: "Back To Utility Source Voltage" 1440 | id: back_to_utility_source_voltage 1441 | icon: mdi:transmission-tower-import 1442 | skip_updates: ${select_skip_updates} 1443 | entity_category: config 1444 | address: 5025 1445 | value_type: U_WORD 1446 | force_new_range: true 1447 | min_value: 21.0 # 12V - 10.5, 48V - 45 1448 | max_value: 25.5 # 12V - 15.0, 48V - 51 1449 | step: 0.5 # 48V - 1 1450 | multiply: 10 1451 | - platform: modbus_controller 1452 | name: "Back To Battery Source Voltage" 1453 | id: back_to_battery_source_voltage 1454 | icon: mdi:power-plug-battery 1455 | skip_updates: ${select_skip_updates} 1456 | entity_category: config 1457 | address: 5026 1458 | value_type: U_WORD 1459 | min_value: 24.0 # 12V - 12, 48V - 48 1460 | max_value: 29.0 # 12V - 17, 48V - 58 1461 | step: 0.5 # 48V - 1 1462 | multiply: 10 1463 | - platform: modbus_controller 1464 | name: "Bulk Charging Voltage" 1465 | id: bulk_charging_voltage 1466 | icon: mdi:battery-arrow-down 1467 | skip_updates: ${select_skip_updates} 1468 | entity_category: config 1469 | address: 5027 1470 | value_type: U_WORD 1471 | force_new_range: true 1472 | min_value: 25.0 # 12V - 12.5, 48V - 48 1473 | max_value: 31.5 # 12V - 15.5, 48V - 61 1474 | step: 0.1 1475 | multiply: 10 1476 | - platform: modbus_controller 1477 | name: "Floating Charging Voltage" 1478 | id: floating_charging_voltage 1479 | icon: mdi:battery-sync-outline 1480 | skip_updates: ${select_skip_updates} 1481 | entity_category: config 1482 | address: 5028 1483 | value_type: U_WORD 1484 | min_value: 25.0 # 12V - 12.5, 48V - 48 1485 | max_value: 31.5 # 12V - 15.5, 48V - 61 1486 | step: 0.1 1487 | multiply: 10 1488 | - platform: modbus_controller 1489 | name: "Low DC cut-off voltage" 1490 | id: low_dc_cut_off_voltage 1491 | icon: mdi:battery-off 1492 | skip_updates: ${select_skip_updates} 1493 | entity_category: config 1494 | address: 5029 1495 | value_type: U_WORD 1496 | force_new_range: true 1497 | min_value: 20.0 # 12V - 10, 48V - 40 1498 | max_value: 24.0 # 12V - 12, 48V - 48 1499 | step: 0.1 1500 | multiply: 10 1501 | 1502 | # - platform: modbus_controller 1503 | # name: "Battery Equalization voltage" 1504 | # id: battery_equ_voltage 1505 | # icon: mdi:battery-medium 1506 | # skip_updates: ${select_skip_updates} 1507 | # entity_category: config 1508 | # address: 5030 1509 | # value_type: U_WORD 1510 | # min_value: 25.0 # 48V - 48 1511 | # max_value: 31.5 # 48V - 61 1512 | # step: 0.1 1513 | # multiply: 10 1514 | # - platform: modbus_controller 1515 | # name: "Battery Equalized Time" 1516 | # id: battery_equ_time 1517 | # icon: mdi:battery-clock-outline 1518 | # skip_updates: ${select_skip_updates} 1519 | # entity_category: config 1520 | # address: 5031 1521 | # value_type: U_WORD 1522 | # force_new_range: true 1523 | # min_value: 5 1524 | # max_value: 900 1525 | # step: 5 1526 | # - platform: modbus_controller 1527 | # name: "Battery Equalized Timeout" 1528 | # id: battery_equ_timeout 1529 | # icon: mdi:battery-remove-outline 1530 | # skip_updates: ${select_skip_updates} 1531 | # entity_category: config 1532 | # address: 5032 1533 | # value_type: U_WORD 1534 | # min_value: 5 1535 | # max_value: 900 1536 | # step: 5 1537 | # - platform: modbus_controller 1538 | # name: "Battery Equalization interval" 1539 | # id: battery_equ_interval 1540 | # icon: mdi:update 1541 | # skip_updates: ${select_skip_updates} 1542 | # entity_category: config 1543 | # address: 5033 1544 | # value_type: U_WORD 1545 | # force_new_range: true 1546 | # min_value: 0 1547 | # max_value: 90 1548 | # step: 1 1549 | --------------------------------------------------------------------------------