chickenbeef
Members
-
Joined
-
Last visited
Reputation Activity
-
chickenbeef reacted to Gary Waterworth in Upgrade Your Old Pylontech Batteries – Exclusive Trade-In Offer with Solar Deity & Powerforum!Sorry after the run around when I had swollen US3000's and being told I overcharged , when there is supposed to be a bms to prevent this
Will never touch the brand again
-
chickenbeef reacted to Powerforum Store in Upgrade Your Old Pylontech Batteries – Exclusive Trade-In Offer with Solar Deity & Powerforum!Book A Ticket
When you book the ticket just mention you are applying for the Fidus Upgrade and battery trade in options on powerforum.co.za
You will find the Book a ticket closer to the bottom of the Solar Deity Page I have updated the instructions to follow on my main post.
It is very simple and easy there is a process however.
-
So I thought I would do a quick update on my progress with getting information from my 8kw OmniVolt.
Happy to report that I have everything I need! All up and running when I workout what addresses were... What pain. But I have uploaded a Modbus reference document for all the addresses I used and what they mean, as well as their unit and scale factor... This should be helpful if anyone needs to get their inverter info into HA .
If you find any errors, let me know and I will update it! I am happy to share my config yaml if anyone needs it, as well as my dashboard yaml.
Ignore the fault... The inverter still seems to be acting weird with the SoC of the battery. I currently have it connected through 485, and WOW.
I have attached some screenshots of my dashboard showing everything working . Still lots to mess around with, but this is a good start!
OmniVolt_8kw_SRNE_Modbus_Reference.docx
-
I found this thread today and think it's very useful. I'm not sure whose initiative this is originally, but I was wondering if someone would be keen to maintain e.g. a public Google Sheet with a list of versions per inverter. It's kind of hard to "see" what the current state of affairs is.
-
chickenbeef reacted to JustinSchoeman in What's a reasonable period to wait for COC after an install?The electrician may not connect the installation before issuing a CoC, unless the connection is for the purpose of testing for the issuing of the CoC.
-
You are right to be concerned about insurance. As soon as you get a COC, let your broker have a copy and tell them that you have a PV system. You may be able to insure your inverter and/or battery (at a price, of course).
COC should have been given to you when the system went live. Three weeks is not acceptable.
I can't advise about the documents COCT require.
-
Same day of commissioning or handover of the system. If you are still holding on to their balance, tell the installer that you will use that to get an electrician to come and issue a CoC. I paid R1500 for my CoC a while back, not sure how much it cost now but it is better to get that asap for your peace of mind.
-
chickenbeef reacted to slipx in My Sunsynk 8Kw & data collection setupI was playing with some text sensors to get the timezone to display as 02:00 as opposed to 200 etc. You can try them if it helps
text_sensor: - platform: template name: "Program1_test" lambda: |- int minutes, hours; if (id(sunsynk_esphome_setting_timezone1).state) { minutes = static_cast<int>(id(sunsynk_esphome_setting_timezone1).state) % 100; hours = static_cast<int>(id(sunsynk_esphome_setting_timezone1).state) / 100; } else { minutes = 0; hours = 0; } char formatted_time[6]; snprintf(formatted_time, sizeof(formatted_time), "%02d:%02d", hours, minutes); return esphome::optional<std::string>(formatted_time); - platform: template name: "Program2_test" lambda: |- int minutes, hours; if (id(sunsynk_esphome_setting_timezone2).state) { minutes = static_cast<int>(id(sunsynk_esphome_setting_timezone2).state) % 100; hours = static_cast<int>(id(sunsynk_esphome_setting_timezone2).state) / 100; } else { minutes = 0; hours = 0; } char formatted_time[6]; snprintf(formatted_time, sizeof(formatted_time), "%02d:%02d", hours, minutes); return esphome::optional<std::string>(formatted_time);
-
chickenbeef reacted to CorneSchutte in My Sunsynk 8Kw & data collection setup"My" ESPHome code, which is a combination of others work before me.
But I believe the Deye registers are completely different?
esphome: name: "sunsynk" preferences: flash_write_interval: 5min esp32: board: esp32dev framework: type: arduino #################################### GLOBALS #################################### substitutions: modbus_update_interval: "3s" settings_skipped_updates: "10" query_throttle: "50ms" device_name: sunsynk friendly_name: SunSynk Link #################################### STATIC SECTION #################################### wifi: ssid: XXXX password: XXX fast_connect: true ota: safe_mode: true reboot_timeout: 10min num_attempts: 5 web_server: port: 80 #captive_portal: # Enable logging #logger: # baud_rate: 0 # Enable Home Assistant API api: # https://esphome.io/components/time.html#home-assistant-time-source time: - platform: homeassistant id: homeassistant_time #################################### STATIC SECTION #################################### uart: id: mod_bus tx_pin: 17 rx_pin: 16 baud_rate: 9600 stop_bits: 1 modbus: id: sunsynk_modbus flow_control_pin: 4 modbus_controller: - id: sunsynk_esphome address: 0x01 modbus_id: sunsynk_modbus setup_priority: -10 update_interval: ${modbus_update_interval} command_throttle: ${query_throttle} switch: - platform: restart name: "${friendly_name} Restart" - platform: modbus_controller # 248 Toggle System Timer use_write_multiple: true modbus_controller_id: sunsynk_esphome name: "Toggle System Timer" id: sunsynk_esphome_toggle_Time_of_Use register_type: holding address: 248 bitmask: 1 entity_category: config icon: "mdi:toggle-switch" - platform: modbus_controller # 274 Toggle Grid Charge Timezone1 use_write_multiple: true modbus_controller_id: sunsynk_esphome name: "Toggle Grid Charge Timezone1" id: sunsynk_esphome_toggle_grid_charge_timezone1 register_type: holding address: 274 bitmask: 1 entity_category: config icon: "mdi:toggle-switch" - platform: modbus_controller # 275 Toggle Grid Charge Timezone2 modbus_controller_id: sunsynk_esphome use_write_multiple: true name: "Toggle Grid Charge Timezone2" id: sunsynk_esphome_toggle_grid_charge_timezone2 register_type: holding address: 275 bitmask: 1 entity_category: config icon: "mdi:toggle-switch" - platform: modbus_controller # 276 Toggle Grid Charge Timezone3 modbus_controller_id: sunsynk_esphome use_write_multiple: true name: "Toggle Grid Charge Timezone3" id: sunsynk_esphome_toggle_grid_charge_timezone3 register_type: holding address: 276 bitmask: 1 entity_category: config icon: "mdi:toggle-switch" - platform: modbus_controller # 277 Toggle Grid Charge Timezone4 modbus_controller_id: sunsynk_esphome use_write_multiple: true name: "Toggle Grid Charge Timezone4" id: sunsynk_esphome_toggle_grid_charge_timezone4 register_type: holding address: 277 bitmask: 1 entity_category: config icon: "mdi:toggle-switch" - platform: modbus_controller # 278 Toggle Grid Charge Timezone5 modbus_controller_id: sunsynk_esphome use_write_multiple: true name: "Toggle Grid Charge Timezone5" id: sunsynk_esphome_toggle_grid_charge_timezone5 register_type: holding address: 278 bitmask: 1 entity_category: config icon: "mdi:toggle-switch" - platform: modbus_controller # 279 Toggle Grid Charge Timezone6 modbus_controller_id: sunsynk_esphome use_write_multiple: true name: "Toggle Grid Charge Timezone6" id: sunsynk_esphome_toggle_grid_charge_timezone6 register_type: holding address: 279 bitmask: 1 entity_category: config icon: "mdi:toggle-switch" number: - platform: modbus_controller # 268 Settings SoC Timezone1 use_write_multiple: true modbus_controller_id: sunsynk_esphome id: sunsynk_esphome_set_soc_timezone1 name: "Set SoC Timezone1" unit_of_measurement: "%" address: 268 min_value: 0 max_value: 100 step: 5 value_type: U_WORD - platform: modbus_controller # 269 Settings SoC Timezone2 use_write_multiple: true modbus_controller_id: sunsynk_esphome id: sunsynk_esphome_set_soc_timezone2 name: "Set SoC Timezone2" unit_of_measurement: "%" address: 269 min_value: 0 max_value: 100 step: 5 value_type: U_WORD - platform: modbus_controller # 270 Settings SoC Timezone3 use_write_multiple: true modbus_controller_id: sunsynk_esphome id: sunsynk_esphome_set_soc_timezone3 name: "Set SoC Timezone3" unit_of_measurement: "%" address: 270 min_value: 0 max_value: 100 step: 5 value_type: U_WORD - platform: modbus_controller # 271 Settings SoC Timezone4 use_write_multiple: true modbus_controller_id: sunsynk_esphome id: sunsynk_esphome_set_soc_timezone4 name: "Set SoC Timezone4" unit_of_measurement: "%" address: 271 min_value: 0 max_value: 100 step: 5 value_type: U_WORD - platform: modbus_controller # 272 Settings SoC Timezone5 use_write_multiple: true modbus_controller_id: sunsynk_esphome id: sunsynk_esphome_set_soc_timezone5 name: "Set SoC Timezone5" unit_of_measurement: "%" address: 272 min_value: 0 max_value: 100 step: 5 value_type: U_WORD - platform: modbus_controller # 273 Settings SoC Timezone6 use_write_multiple: true modbus_controller_id: sunsynk_esphome id: sunsynk_esphome_set_soc_timezone6 name: "Set SoC Timezone6" unit_of_measurement: "%" address: 273 min_value: 0 max_value: 100 step: 5 value_type: U_WORD sensor: - platform: wifi_signal name: WiFi signal ${device_name} id: wifi_s internal: true update_interval: 60s - platform: template name: Wifi ${device_name} unit_of_measurement: '%' accuracy_decimals: 0 icon: "mdi:wifi" lambda: |- if (id(wifi_s).state < -92.0) return 1.0; if (id(wifi_s).state > -21.0) return 100.0; else return round(( -0.0154 * id(wifi_s).state * id(wifi_s).state ) - ( 0.3794 * id(wifi_s).state ) + 98.182 ); update_interval: 60s - platform: uptime filters: - lambda: return x / 3600; unit_of_measurement: hours name: ${device_name} Uptime - platform: modbus_controller #72 Battery Charge Total modbus_controller_id: sunsynk_esphome name: "SS Battery Charge Total" id: sunsynk_esphome_battery_charge_total register_type: holding address: 72 unit_of_measurement: "kWh" accuracy_decimals: 1 device_class: energy state_class: total_increasing filters: - lambda: |- x = x / -1; if (x > 32767) return (0 - x + 65535) /10; else return (0 - x) /10; - platform: modbus_controller #74 Battery Discharge Total modbus_controller_id: sunsynk_esphome name: "SS Battery Discharge Total" id: sunsynk_esphome_battery_discharge_total register_type: holding address: 74 unit_of_measurement: "kWh" accuracy_decimals: 0 device_class: energy state_class: total_increasing filters: - lambda: |- if (x > 32767) return (x - 65535) /10; else return (x) /10; - platform: modbus_controller # 81 Grid Export Total (Sell) modbus_controller_id: sunsynk_esphome name: "SS Grid Export Total (Sell)" id: sunsynk_esphome_grid_export_total_sell register_type: holding address: 81 unit_of_measurement: "kWh" accuracy_decimals: 2 device_class: energy state_class: total_increasing filters: - lambda: |- if (x > 32767) return (x - 65535) / 10; else return x /10; - platform: modbus_controller # 78 Grid Import Total (Buy) modbus_controller_id: sunsynk_esphome name: "SS Grid Import Total (Buy)" id: sunsynk_esphome_grid_import_total_buy register_type: holding address: 78 unit_of_measurement: "kWh" accuracy_decimals: 0 device_class: energy state_class: total_increasing filters: #GOOD - lambda: |- x = x / -1; if (x > 32767) return (0 - x + 65535) /1; else return (0 - x) /1; - platform: modbus_controller # 85 Load Power Total modbus_controller_id: sunsynk_esphome name: "SS Load Power Total" id: sunsynk_esphome_load_power_total register_type: holding address: 85 unit_of_measurement: "kWh" accuracy_decimals: 0 device_class: energy state_class: total_increasing filters: #GOOD - lambda: |- if (x > 32767) return (0 - x + 65535) /1; else return (0 - x) /1; - platform: modbus_controller modbus_controller_id: sunsynk_esphome name: "SS Total PV Power (kWh)" id: sunsynk_esphome_total_pv_power_kwh register_type: holding address: 96 unit_of_measurement: "kWh" accuracy_decimals: 2 device_class: energy state_class: total_increasing filters: - multiply: 0.1 - platform: modbus_controller # 169 Grid Power modbus_controller_id: sunsynk_esphome name: "SS Grid Power" id: sunsynk_esphome_grid_power register_type: holding address: 169 unit_of_measurement: "W" accuracy_decimals: 0 device_class: power state_class: measurement filters: #GOOD - lambda: |- if (x > 32767) return (x - 65535) /1; else return (x) /1; - platform: modbus_controller # 178 Load Power modbus_controller_id: sunsynk_esphome name: "SS Load Power" id: sunsynk_esphome_load_power register_type: holding address: 178 unit_of_measurement: "W" accuracy_decimals: 0 device_class: power state_class: measurement filters: #GOOD - lambda: |- if (x > 32767) return (x - 65535) /1; else return (x) /1; - platform: modbus_controller # 186 PV1 Power modbus_controller_id: sunsynk_esphome name: "SS PV1 Power" id: sunsynk_esphome_pv1_power register_type: holding address: 186 unit_of_measurement: "W" accuracy_decimals: 2 device_class: power state_class: measurement - platform: modbus_controller # 187 PV2 Power modbus_controller_id: sunsynk_esphome name: "SS PV2 Power" id: sunsynk_esphome_pv2_power register_type: holding address: 187 unit_of_measurement: "W" accuracy_decimals: 2 device_class: power state_class: measurement - platform: template # PV Total Power name: "SS PV Power" id: sunsynk_esphome_pv_power unit_of_measurement: "W" accuracy_decimals: 2 device_class: power state_class: measurement update_interval: 15s lambda: |- return (id(sunsynk_esphome_pv1_power).state + id(sunsynk_esphome_pv2_power).state); - platform: total_daily_energy # PV Daily Energy name: 'SS PV Daily Energy' id: sunsynk_esphome_pv_daily_energy power_id: sunsynk_esphome_pv_power unit_of_measurement: 'kWh' icon: mdi:circle-slice-3 state_class: total_increasing device_class: energy accuracy_decimals: 2 restore: true filters: # Multiplication factor from W to kW is 0.001 - multiply: 0.001 - platform: modbus_controller # 190 Battery Output modbus_controller_id: sunsynk_esphome name: "SS Battery Output Power" id: sunsynk_esphome_battery_output_power register_type: holding address: 190 unit_of_measurement: "W" accuracy_decimals: 2 device_class: power state_class: measurement filters: #GOOD - lambda: |- if (x > 32767) return (x - 65535) /1; else return (x) /1; - platform: modbus_controller # 184 Battery SOC modbus_controller_id: sunsynk_esphome name: "SS Battery SOC" id: sunsynk_esphome_battery_soc register_type: holding address: 184 unit_of_measurement: "%" accuracy_decimals: 0 device_class: battery state_class: measurement filters: #GOOD - lambda: |- if (x > 32767) return (x - 65535) /1; else return (x) /1; - platform: modbus_controller # 184 Battery Usable SOC modbus_controller_id: sunsynk_esphome name: "SS Battery Usable SOC" id: sunsynk_esphome_battery_usable_soc register_type: holding address: 184 unit_of_measurement: "%" accuracy_decimals: 0 device_class: battery state_class: measurement filters: #GOOD # battery normally charges to 99%, shutdown level is 20%, so subtract 19 from value and calculate as percentage divided by 80 - lambda: |- if (x > 32767) { int y = ((((x - 65535) -19) /80) *100) /1; if (y > 100) return 100; return y; } else { int y = (((x -19) /80) *100) /1; if (y > 100) return 100; return y; } - platform: modbus_controller # 216 Battery Charging Efficiency modbus_controller_id: sunsynk_esphome name: "SS Battery Charging Efficiency" id: sunsynk_esphome_battery_charging_efficiency register_type: holding address: 216 unit_of_measurement: "%" accuracy_decimals: 1 device_class: battery state_class: measurement filters: #GOOD - lambda: |- if (x > 32767) return (x - 65535) /10; else return (x) /10; # - platform: modbus_controller # 013 Firmware Control Board # modbus_controller_id: sunsynk_esphome # name: "SS Firmware Control Board" # id: sunsynk_esphome_firmware_control_board # register_type: holding # address: 13 # - platform: modbus_controller # 013 Firmware Comms Board # modbus_controller_id: sunsynk_esphome # name: "SS Firmware Comms Board" # id: sunsynk_esphome_firmware_comms_board # register_type: holding # address: 14 - platform: modbus_controller # 079 Grid Frequency modbus_controller_id: sunsynk_esphome name: "SS Grid Frequency" id: sunsynk_esphome_grid_frequency register_type: holding address: 79 unit_of_measurement: "hz" accuracy_decimals: 2 filters: #GOOD - lambda: |- if (x > 32767) return (x - 65535) /100; else return (x) /100; #device_class: none state_class: measurement - platform: modbus_controller # 192 Load Frequency modbus_controller_id: sunsynk_esphome name: "SS Load Frequency" id: sunsynk_esphome_load_frequency register_type: holding address: 192 unit_of_measurement: "hz" accuracy_decimals: 2 filters: #GOOD - lambda: |- if (x > 32767) return (x - 65535) /100; else return (x) /100; #device_class: none state_class: measurement - platform: modbus_controller # 154 Grid Inverter Voltage modbus_controller_id: sunsynk_esphome name: "SS Grid Inverter Voltage" id: sunsynk_esphome_grid_inverter_voltage register_type: holding address: 154 unit_of_measurement: "V" accuracy_decimals: 1 filters: #GOOD - lambda: |- if (x > 32767) return (x - 65535) /10; else return (x) /10; device_class: voltage state_class: measurement - platform: modbus_controller # 150 Grid Voltage modbus_controller_id: sunsynk_esphome name: "SS Grid Voltage" id: sunsynk_esphome_grid_voltage register_type: holding address: 150 unit_of_measurement: "V" accuracy_decimals: 1 filters: #GOOD - lambda: |- if (x > 32767) return (x - 65535) /10; else return (x) /10; device_class: voltage state_class: measurement - platform: modbus_controller # 154 Grid Inverter Voltage modbus_controller_id: sunsynk_esphome name: "SS Grid Voltage" id: sunsynk_inverter_grid_voltage register_type: holding address: 154 unit_of_measurement: "V" accuracy_decimals: 1 filters: #GOOD - lambda: |- if (x > 32767) return (x - 65535) /10; else return (x) /10; device_class: voltage state_class: measurement - platform: modbus_controller # 183 Battery Voltage modbus_controller_id: sunsynk_esphome name: "SS Battery Voltage" id: sunsynk_esphome_battery_voltage register_type: holding address: 183 unit_of_measurement: "V" accuracy_decimals: 1 filters: #GOOD - lambda: |- if (x > 32767) return (x - 65535) / 100; else return x / 100; device_class: voltage state_class: measurement - platform: modbus_controller # 312 Battery Charge Voltage modbus_controller_id: sunsynk_esphome name: "SS Battery Charge Voltage" id: sunsynk_esphome_battery_charge_voltage register_type: holding address: 312 unit_of_measurement: "V" accuracy_decimals: 1 filters: #GOOD - lambda: |- x = x / -1; if (x > 32767) return (0 - x + 65535) /100; else return (0 - x) /100; device_class: voltage state_class: measurement - platform: modbus_controller # 167 Grid Inverter Load modbus_controller_id: sunsynk_esphome name: "SS Grid Inverter Load" id: sunsynk_esphome_grid_inverter_load register_type: holding address: 167 unit_of_measurement: "W" accuracy_decimals: 0 filters: #GOOD - lambda: |- if (x > 32767) return (x - 65535) /1; else return (x) /1; device_class: power state_class: measurement - platform: modbus_controller # 172 Grid External Power modbus_controller_id: sunsynk_esphome name: "SS Grid External Power" id: sunsynk_esphome_grid_external_power register_type: holding address: 172 unit_of_measurement: "W" accuracy_decimals: 0 filters: #GOOD - lambda: |- if (x > 32767) return (x - 65535) /1; else return (x) /1; device_class: power state_class: measurement - platform: total_daily_energy # Grid External Daily Energy name: 'SS Grid External Daily Energy' id: sunsynk_esphome_grid_external_daily_energy power_id: sunsynk_esphome_grid_external_power unit_of_measurement: 'kWh' icon: mdi:circle-slice-3 state_class: total_increasing device_class: energy accuracy_decimals: 2 restore: true filters: # Multiplication factor from W to kW is 0.001 - multiply: 0.001 - platform: modbus_controller # 166 Aux Output Power modbus_controller_id: sunsynk_esphome name: "SS Aux Output Power" id: sunsynk_esphome_aux_output_power register_type: holding address: 166 unit_of_measurement: "W" accuracy_decimals: 0 filters: #GOOD - lambda: |- if (x > 32767) return (x - 65535) /1; else return (x) /1; device_class: power state_class: measurement - platform: modbus_controller # 164 Inverter Output Current modbus_controller_id: sunsynk_esphome name: "SS Inverter Output Current" id: sunsynk_esphome_inverter_output_current register_type: holding address: 191 unit_of_measurement: "A" accuracy_decimals: 1 device_class: current state_class: measurement filters: #GOOD - lambda: |- if (x > 32767) return (0 - x + 65535) /100; else return (0 - x) /100; - platform: modbus_controller # 191 Battery Output Current modbus_controller_id: sunsynk_esphome name: "SS Battery Output Current" id: sunsynk_esphome_battery_output_current register_type: holding address: 191 unit_of_measurement: "A" accuracy_decimals: 1 device_class: current state_class: measurement filters: #GOOD - lambda: |- if (x > 32767) return (0 - x + 65535) /100; else return (0 - x) /100; - platform: modbus_controller # 182 Battery Temperature modbus_controller_id: sunsynk_esphome name: "SS Battery Temperature" id: sunsynk_esphome_battery_temperature register_type: holding address: 182 unit_of_measurement: "°C" accuracy_decimals: 1 device_class: temperature state_class: measurement filters: # GOOD - lambda: |- if (x > 32767) return ((x - 65535)-1000) / 10; else return ((x)-1000) / 10; - platform: modbus_controller # 090 DC Transformer Temperature modbus_controller_id: sunsynk_esphome name: "SS DC Transformer Temperature" id: sunsynk_esphome_dctransformer_temperature register_type: holding address: 090 unit_of_measurement: "°C" accuracy_decimals: 1 device_class: temperature state_class: measurement filters: # GOOD - lambda: |- if (x > 32767) return ((x - 65535)-1000) / 10; else return ((x)-1000) / 10; - platform: modbus_controller # 091 Radiator Temperature modbus_controller_id: sunsynk_esphome name: "SS DC Radiator Temperature" id: sunsynk_esphome_radiator_temperature register_type: holding address: 091 unit_of_measurement: "°C" accuracy_decimals: 1 device_class: temperature state_class: measurement filters: # GOOD - lambda: |- if (x > 32767) return ((x - 65535)-1000) / 10; else return ((x)-1000) / 10; - platform: modbus_controller #076 Grid Import Day (Buy) modbus_controller_id: sunsynk_esphome name: "SS Grid Import Day (Buy)" id: sunsynk_esphome_grid_import_day register_type: holding address: 76 unit_of_measurement: "kWh" accuracy_decimals: 0 device_class: energy state_class: total_increasing filters: # GOOD - lambda: |- if (x > 32767) return (x - 65535) / 10; else return x /10; - platform: modbus_controller # 070 Battery Charge Day modbus_controller_id: sunsynk_esphome name: "SS Battery Charge Day" id: sunsynk_esphome_battery_charge_day register_type: holding address: 70 unit_of_measurement: "kWh" accuracy_decimals: 1 device_class: energy state_class: total_increasing filters: #GOOD - lambda: |- x = x / 10; if (x > 32767) return (x - 65535) /1; else return (x) /1; - platform: modbus_controller # 071 Battery Discharge Day modbus_controller_id: sunsynk_esphome name: "SS Battery Discharge Day" id: sunsynk_esphome_battery_discharge_day register_type: holding address: 71 unit_of_measurement: "kWh" accuracy_decimals: 1 device_class: energy state_class: total_increasing filters: #GOOD - lambda: |- x = x / 10; if (x > 32767) return (x - 65535) /1; else return (x) /1; - platform: modbus_controller # 175 Inverter Output Power modbus_controller_id: sunsynk_esphome name: "SS Inverter Output Power" id: sunsynk_esphome_inverter_output_power register_type: holding address: 175 unit_of_measurement: "W" accuracy_decimals: 1 device_class: power filters: #GOOD - lambda: |- if (x > 32767) return (0 - x + 65535) /-1; else return (0 - x) /-1; ################################################ READ SETTINGS ################################################ - platform: modbus_controller # 250 Settings Timezone1 modbus_controller_id: sunsynk_esphome name: "SSS Setting Timezone1" id: sunsynk_esphome_setting_timezone1 register_type: holding skip_updates: ${settings_skipped_updates} address: 250 filters: #GOOD - lambda: |- if (x > 32767) return (x - 65535) /1; else return (x) /1; - platform: modbus_controller # 251 Settings Timezone2 modbus_controller_id: sunsynk_esphome name: "SSS Setting Timezone2" id: sunsynk_esphome_setting_timezone2 register_type: holding skip_updates: ${settings_skipped_updates} address: 251 filters: #GOOD - lambda: |- if (x > 32767) return (x - 65535) /1; else return (x) /1; - platform: modbus_controller # 252 Settings Timezone3 modbus_controller_id: sunsynk_esphome name: "SSS Setting Timezone3" id: sunsynk_esphome_setting_timezone3 register_type: holding skip_updates: ${settings_skipped_updates} address: 252 filters: #GOOD - lambda: |- if (x > 32767) return (x - 65535) /1; else return (x) /1; - platform: modbus_controller # 253 Settings Timezone4 modbus_controller_id: sunsynk_esphome name: "SSS Setting Timezone4" id: sunsynk_esphome_setting_timezone4 register_type: holding skip_updates: ${settings_skipped_updates} address: 253 filters: #GOOD - lambda: |- if (x > 32767) return (x - 65535) /1; else return (x) /1; - platform: modbus_controller # 254 Settings Timezone5 modbus_controller_id: sunsynk_esphome name: "SSS Setting Timezone5" id: sunsynk_esphome_setting_timezone5 register_type: holding skip_updates: ${settings_skipped_updates} address: 254 filters: #GOOD - lambda: |- if (x > 32767) return (x - 65535) /1; else return (x) /1; - platform: modbus_controller # 255 Settings Timezone6 modbus_controller_id: sunsynk_esphome name: "SSS Setting Timezone6" id: sunsynk_esphome_setting_timezone6 register_type: holding skip_updates: ${settings_skipped_updates} address: 255 filters: #GOOD - lambda: |- if (x > 32767) return (x - 65535) /1; else return (x) /1; - platform: modbus_controller # 256 Settings Sell Mode Timezone1 modbus_controller_id: sunsynk_esphome name: "SSS Setting Sell Mode Timezone1" id: sunsynk_esphome_setting_sellmode_timezone1 register_type: holding skip_updates: ${settings_skipped_updates} address: 256 filters: #GOOD - lambda: |- if (x > 32767) return (x - 65535) /1; else return (x) /1; - platform: modbus_controller # 257 Settings Sell Mode Timezone2 modbus_controller_id: sunsynk_esphome name: "SSS Setting Sell Mode Timezone2" id: sunsynk_esphome_setting_sellmode_timezone2 register_type: holding skip_updates: ${settings_skipped_updates} address: 257 filters: #GOOD - lambda: |- if (x > 32767) return (x - 65535) /1; else return (x) /1; - platform: modbus_controller # 258 Settings Sell Mode Timezone3 modbus_controller_id: sunsynk_esphome name: "SSS Setting Sell Mode Timezone3" id: sunsynk_esphome_setting_sellmode_timezone3 register_type: holding skip_updates: ${settings_skipped_updates} address: 258 filters: #GOOD - lambda: |- if (x > 32767) return (x - 65535) /1; else return (x) /1; - platform: modbus_controller # 259 Settings Sell Mode Timezone4 modbus_controller_id: sunsynk_esphome name: "SSS Setting Sell Mode Timezone4" id: sunsynk_esphome_setting_sellmode_timezone4 register_type: holding skip_updates: ${settings_skipped_updates} address: 259 filters: #GOOD - lambda: |- if (x > 32767) return (x - 65535) /1; else return (x) /1; - platform: modbus_controller # 260 Settings Sell Mode Timezone5 modbus_controller_id: sunsynk_esphome name: "SSS Setting Sell Mode Timezone5" id: sunsynk_esphome_setting_sellmode_timezone5 register_type: holding skip_updates: ${settings_skipped_updates} address: 260 filters: #GOOD - lambda: |- if (x > 32767) return (x - 65535) /1; else return (x) /1; - platform: modbus_controller # 261 Settings Sell Mode Timezone6 modbus_controller_id: sunsynk_esphome name: "SSS Setting Sell Mode Timezone6" id: sunsynk_esphome_setting_sellmode_timezone6 register_type: holding skip_updates: ${settings_skipped_updates} address: 261 filters: #GOOD - lambda: |- if (x > 32767) return (x - 65535) /1; else return (x) /1; - platform: modbus_controller # 245 Settings Export Limit modbus_controller_id: sunsynk_esphome name: "SSS Setting Export Limit" id: sunsynk_esphome_setting_export_limit register_type: holding skip_updates: ${settings_skipped_updates} address: 245 unit_of_measurement: "W" device_class: power state_class: measurement filters: #GOOD - lambda: |- if (x > 32767) return (x - 65535) /1; else return (x) /1; - platform: modbus_controller # 217 Settings Battery Shutdown modbus_controller_id: sunsynk_esphome name: "SSS Setting Battery Shutdown" id: sunsynk_esphome_setting_battery_shutdown register_type: holding skip_updates: ${settings_skipped_updates} address: 217 unit_of_measurement: "%" device_class: battery state_class: measurement filters: #GOOD - lambda: |- if (x > 32767) return (x - 65535) /1; else return (x) /1; - platform: modbus_controller # 219 Settings Battery Low modbus_controller_id: sunsynk_esphome name: "SSS Setting Battery Low" id: sunsynk_esphome_setting_battery_low register_type: holding skip_updates: ${settings_skipped_updates} address: 219 unit_of_measurement: "%" device_class: battery state_class: measurement filters: #GOOD - lambda: |- if (x > 32767) return (x - 65535) /1; else return (x) /1; - platform: modbus_controller # 218 Settings Battery Restart modbus_controller_id: sunsynk_esphome name: "SSS Setting Battery Restart" id: sunsynk_esphome_setting_battery_restart register_type: holding skip_updates: ${settings_skipped_updates} address: 218 unit_of_measurement: "%" device_class: battery state_class: measurement filters: #GOOD - lambda: |- if (x > 32767) return (x - 65535) /1; else return (x) /1; - platform: modbus_controller # 210 Settings Battery Max Charge Current modbus_controller_id: sunsynk_esphome name: "SSS Setting Battery Max Charge Current" id: sunsynk_esphome_setting_battery_max_charge_current register_type: holding skip_updates: ${settings_skipped_updates} address: 210 device_class: current state_class: measurement unit_of_measurement: "A" filters: #GOOD - lambda: |- if (x > 32767) return (x - 65535) /1; else return (x) /1; - platform: modbus_controller # 211 Settings Battery Max Discharge Current modbus_controller_id: sunsynk_esphome name: "SSS Setting Max Discharge Current" id: sunsynk_esphome_setting_battery_max_discharge_current register_type: holding skip_updates: ${settings_skipped_updates} address: 211 device_class: current state_class: measurement unit_of_measurement: "A" filters: #GOOD - lambda: |- if (x > 32767) return (x - 65535) /1; else return (x) /1; - platform: modbus_controller # 230 Settings Grid Charge Current modbus_controller_id: sunsynk_esphome name: "SSS Setting Grid Charge Current" id: sunsynk_esphome_setting_grid_charge_current register_type: holding skip_updates: ${settings_skipped_updates} address: 230 device_class: current state_class: measurement unit_of_measurement: "A" filters: #GOOD - lambda: |- if (x > 32767) return (x - 65535) /1; else return (x) /1; - platform: total_daily_energy name: 'SS Inverter Daily Energy' id: sunsynk_esphome_inverter_daily_energy power_id: sunsynk_esphome_inverter_output_power unit_of_measurement: 'kWh' icon: mdi:circle-slice-3 state_class: total_increasing device_class: energy accuracy_decimals: 2 restore: true filters: # Multiplication factor from W to kW is 0.001 - multiply: 0.001 ############################################### BINARY SENSORS ############################################### binary_sensor: - platform: status name: Status ${device_name} - platform: modbus_controller # 194 Grid Connected Status modbus_controller_id: sunsynk_esphome name: "SS Grid Connected Status" id: sunsynk_esphome_grid_connected_status register_type: holding address: 194 ############################################### BINARY SENSORS SETTINGS ############################################### - platform: modbus_controller # 244 Settings Load Limit Enabled modbus_controller_id: sunsynk_esphome name: "SSS Setting Load Limit Enabled" id: sunsynk_esphome_setting_load_limit2 register_type: holding skip_updates: ${settings_skipped_updates} address: 244 - platform: modbus_controller # 247 Settings Solar Export Enabled modbus_controller_id: sunsynk_esphome name: "SSS Setting Solar Export Enabled" id: sunsynk_esphome_setting_solar_export_enabled register_type: holding skip_updates: ${settings_skipped_updates} address: 247 - platform: modbus_controller # 232 Settings Battery Grid Charge Enabled modbus_controller_id: sunsynk_esphome name: "SSS Setting Battery Grid Charge Enabled" id: sunsynk_esphome_setting_battery_grid_charge_enabled register_type: holding skip_updates: ${settings_skipped_updates} address: 232 ############################################### TEXT SENSORS SETTINGS ############################################### text_sensor: - platform: wifi_info ssid: name: SSID ${device_name} bssid: name: BSSID ${device_name} id: bssid_id - platform: modbus_controller # 243 Settings Energy Management Model (PL) modbus_controller_id: sunsynk_esphome name: "SSS Setting Energy Management Model" id: sunsynk_esphome_setting_energy_management_model register_type: holding skip_updates: ${settings_skipped_updates} raw_encode: HEXBYTES address: 243 lambda: |- uint16_t value = modbus_controller::word_from_hex_str(x, 0); switch (value) { case 0: return std::string("Battery Priority Mode"); case 1: return std::string("Load First Mode"); default: return std::string("Unknown"); } - platform: modbus_controller # 059 Overall State modbus_controller_id: sunsynk_esphome name: "SS Overall State" id: sunsynk_esphome_overall_state register_type: holding skip_updates: ${settings_skipped_updates} raw_encode: HEXBYTES address: 59 lambda: |- # It is not clear what each of these states mean. TODO Fill in the string values once known uint16_t value = modbus_controller::word_from_hex_str(x, 0); switch (value) { case 0: return std::string("0"); case 1: return std::string("1"); case 2: return std::string("2"); case 3: return std::string("3"); case 4: return std::string("4"); case 5: return std::string("5"); default: return std::string("Unknown"); } I hope it helps!
-
chickenbeef reacted to sjlouw in My Sunsynk 8Kw & data collection setupHi all. Here is my version to get Sunsynk 8.8 Modbus metrics in Home Assistant:
Required Hardware:
ESP32 Development Board @R149.95 https://www.diyelectronics.co.za/store/espressif-iot/1495-esp32-development-board.html?search_query=esp32&results=26
MAX485 RS-485 to TTL Convert Module @R19.95 https://www.diyelectronics.co.za/store/serial/1204-max485-rs-485-to-ttl-converter-module.html?search_query=485&results=21
3D Printed Case I use to pack it all: https://www.thingiverse.com/thing:4670334
My code for ESPHome https://esphome.io/
Note: On the Sunsynk inverter side it is set to Modbus ID 1 and runs in Slave mode. (I think this is default for the inverter)
esphome: name: "sunsynk" esp32: board: esp32dev framework: type: arduino logger: baud_rate: 0 api: ota: wifi: ssid: !secret wifi_ssid password: !secret wifi_password # Enable fallback hotspot (captive portal) in case wifi connection fails ap: ssid: "SOMEFALLBACKAP" password: "password" fast_connect: true power_save_mode: none time: - platform: sntp id: sntp_time timezone: Africa/Johannesburg servers: - pool.ntp.org uart: id: mod_bus tx_pin: 17 rx_pin: 16 baud_rate: 9600 stop_bits: 1 modbus: id: sunsynk_modbus flow_control_pin: 4 modbus_controller: - id: sunsynk address: 0x01 modbus_id: sunsynk_modbus setup_priority: -10 update_interval: 20000ms sensor: - platform: modbus_controller modbus_controller_id: sunsynk name: "Total Battery Charge (kWh)" id: total_battery_charge_kwh register_type: holding address: 72 unit_of_measurement: "kWh" accuracy_decimals: 2 device_class: energy state_class: total_increasing filters: - multiply: 0.1 - platform: modbus_controller modbus_controller_id: sunsynk name: "Total Battery Discharge (kWh)" id: total_battery_discharge_kwh register_type: holding address: 74 unit_of_measurement: "kWh" accuracy_decimals: 2 device_class: energy state_class: total_increasing filters: - multiply: 0.1 - platform: modbus_controller modbus_controller_id: sunsynk name: "Total Grid Export (kWh)" id: total_grid_export_kwh register_type: holding address: 81 unit_of_measurement: "kWh" accuracy_decimals: 2 device_class: energy state_class: total_increasing filters: - multiply: 0.1 - platform: modbus_controller modbus_controller_id: sunsynk name: "Total Grid Import (kWh)" id: total_grid_import_kwh register_type: holding address: 78 unit_of_measurement: "kWh" accuracy_decimals: 2 device_class: energy state_class: total_increasing filters: - multiply: 0.1 - platform: modbus_controller modbus_controller_id: sunsynk name: "Total Load Power (kWh)" id: total_load_power_kwh register_type: holding address: 85 unit_of_measurement: "kWh" accuracy_decimals: 2 device_class: energy state_class: total_increasing filters: - multiply: 0.1 - platform: modbus_controller modbus_controller_id: sunsynk name: "Total PV Power (kWh)" id: total_pv_power_kwh register_type: holding address: 96 unit_of_measurement: "kWh" accuracy_decimals: 2 device_class: energy state_class: total_increasing filters: - multiply: 0.1 - platform: modbus_controller modbus_controller_id: sunsynk name: "Grid Power" id: grid_power register_type: holding address: 169 unit_of_measurement: "W" accuracy_decimals: 2 device_class: power state_class: measurement filters: - lambda: |- float MIN_VALUE = 0.00; float MAX_VALUE = 8000.00; if (MIN_VALUE <= x && x <= MAX_VALUE) return x; else return {}; - platform: modbus_controller modbus_controller_id: sunsynk name: "Load Power" id: load_power register_type: holding address: 178 unit_of_measurement: "W" accuracy_decimals: 2 device_class: power state_class: measurement - platform: modbus_controller modbus_controller_id: sunsynk name: "PV1 Power" id: pv1_power register_type: holding address: 186 unit_of_measurement: "W" accuracy_decimals: 2 device_class: power state_class: measurement - platform: modbus_controller modbus_controller_id: sunsynk name: "PV2 Power" id: pv2_power register_type: holding address: 187 unit_of_measurement: "W" accuracy_decimals: 2 device_class: power state_class: measurement - platform: modbus_controller modbus_controller_id: sunsynk name: "Battery SOC" id: battery_soc register_type: holding address: 184 unit_of_measurement: "%" accuracy_decimals: 0 device_class: battery - platform: modbus_controller modbus_controller_id: sunsynk name: "Battery Charging Efficiency" id: battery_charging_efficiency register_type: holding address: 216 unit_of_measurement: "%" accuracy_decimals: 1 device_class: battery filters: - multiply: 0.1 - platform: modbus_controller modbus_controller_id: sunsynk name: "Grid Connected Status" id: grid_connected_status register_type: holding address: 194 accuracy_decimals: 0 In Home Assistant, ensure to include the new sensors in the recorder:
recorder: include: entity_globs: - sensor.total_* - sensor.grid_* - sensor.load_* - sensor.pv*_power - sensor.power_production*
-
chickenbeef reacted to BrettC in My Sunsynk 8Kw & data collection setupHere is a sample of the code if anyone else wants to try this approach.
uart: id: mod_bus tx_pin: 17 rx_pin: 16 baud_rate: 9600 stop_bits: 1 modbus: id: modbus1 modbus_controller: - id: sunsynk address: 0x01 modbus_id: modbus1 setup_priority: -10 update_interval: 20000ms sensor: - platform: modbus_controller modbus_controller_id: sunsynk name: "Grid power" id: grid_power register_type: holding address: 169 unit_of_measurement: W device_class: power state_class: measurement
-
Thanks to Steve at PowerForum who gave me the number of RV Solar. They replied within a day and came and sorted everything out for me.
For future reference - the floating neutral and lack of earth leakage was due to no earth-neutral bonding. The DB at the inverter was also wired completely wrong. I don't know enough about electrical to give all the details, but along with the lack of earth-neutral bonding, the circuit breakers and surge protectors in the DB were all wired incorrectly, some of them into each other in strange ways, and everything was just a mess and dangerous. Frankly, not even sure how it ran at all...
But RV Solar sorted me out quickly and easily - no problem.
For anyone looking for installers - particularly in the Durbanville area - I would recommend you stay away from MacroClear Solar. They are very quick to take your money and install something... but they don't have any form of after sales service, and frankly their install was unsafe and they never even gave me a CoC.
They are supposedly a Master installer with Sunsynk... but that shows you what that classification means... not much.
-
Priorities, the squeaky wheel gets the oil. This is not a perfect world, but it's great to see how Powerforum serves its members, providing a platform to raise these kind of issues. Also that some suppliers value their name and brand to the extent that they address the issues swiftly.
-
chickenbeef reacted to Achmat in Sunsynk aux load for geyserYou can set the aux to only run when batteries are above a certain SOC if the grid is down.
If the grid is available it will use from the grid first before doing into batteries.
Grid down scenario
Daytime pv goes to load, aux and batteries
Nighttime batteries powers load then optionally can send power to aux. Its batteries drop below a certain thrusting then only loads will get power.
Grid available
Daytime pv goes to loads, aux and batteries. If allowed, excess can feed back to the grid side. Overcast will be the same as nighttime below.
Nighttime batteries powers loads then aux until set SOC is reached. This can be 100% then batteries will never be used for aux loads. Aux loads will then get power from the grid.
-
chickenbeef reacted to Sumith in RV Solar Solutions (Cape Town area) - feedbackTL;DR - electrical installation is good, but aftercare is really bad once all paid up in my experience. Restored faith in aftercare but very long wait, have to have a lot of patience if you're having issues.
02/05/2023 - Updated as after waiting through the long weekend with no responses, Ricardo organised this morning to get me a temporary battery while sending mine back into Hubble for them to look at. Took a lot of messages and ignored calls but eventually organising a temporary 5KWH battery was worth the wait, as I searched all of CT and couldn't find anyone that did hiring or had stock.
RV Solar did my installation for me 2 years ago on 19/04/2021, fitting a Sunsynk 5kw with panels and a Hubble Am2. The initial fitment was not the best as they caused a small leak in my roof, which would be a few drops whenever it rained. However, they returned to try and fix the leak which took them about 4 or 5 trips (the latter of which required lots and lots of phone calls to get them back). I withheld the payment of the SSEG registration, intending to complete it once this was resolved. I eventually fixed the roof leak myself after getting tired of trying to get them back which went on for about 6 months. (The SSEG never got completed as well). I didn't really hold it against them though as the rest of the installation was good and I didn't have any other issues.
Fast forward to this year 22 March 2023, I started having problems with my battery, it would just drop from 40% to 0 in an instant which seems to be a common problem with it so I contacted Ricardo about it over WhatsApp and he responded that it was probably a dead cell and Hubble asked me to bring it in for an assessment. It's now gone just over a month, as of posting this message, since I've tried to arrange for them to disconnect the battery for me to take it in even stating that I'm happy to pay extra for their time to do this. Would not get responses over WhatsApp and seems like when I call, it was ignored and never returned (similar to when I tried to get my leak sorted out).
The closest I got was one of their junior technicians that's come in last week to tell me my settings were wrong (Lithium mode vs AGM V mode - these were unchanged since Ricardo installed them apart from schedule adjustments by myself). Just hours after he changed them, I had load shedding and the battery dropped to 0% 30min in, leaving me in darkness for a 4-hour block. I then tried to get a hold of them so I can reset/make any adjustments so that I could at least get it to last 2 hours for the weekend but still waiting for that as well. Resorted to just leaving it to sit at 100% all the time now which is probably killing the lifespan even further.
Understand that they are probably super busy making money with new installs and don't really owe me anything as they've been paid already. But even offering to pay them further to get help has gotten me nowhere. Would have been nice just to return my call or a message saying Im busy at the moment or will get to you the next day or something, just a little bit of courtesy after having given them my business in an industry that's now saturated. 1 thing I wish had done when doing the installation was to get some sort of guarantee in writing as I can't really hold them to anything for aftercare as well.
Actually came across this thread looking for alternative help in the forum, if there are any recommendations will be greatly appreciated, thanks.
-
chickenbeef reacted to slipx in My Sunsynk 8kw silence hackJust an update. Added a Wemos D1 Mini to control the fans. Running at 100% all the time is not efficient. The fan speed is automatically regulated based on the AC temperature and the set temperature threshold. It's a lot quieter now.
-
It is great to get feedback, but the cynic in me questions the fact that you joined just to post this. Aside from that, based on what do you state the portion in red?