├── Dashboard.yaml ├── ESPHome Configs ├── DEY12k-modbus.yaml ├── ESPHome-1P-Sunsynk-Deye-Master-Slave.yaml ├── ESPHome-1P-Sunsynk-Deye.yaml ├── ESPHome-3P-Sunsynk-Deye.yaml └── sunsynk_modbus.pdf └── README.md /Dashboard.yaml: -------------------------------------------------------------------------------- 1 | type: custom:layout-card 2 | layout_type: custom:grid-layout 3 | cards: 4 | - type: custom:sunsynk-power-flow-card 5 | cardstyle: compact 6 | large_font: true 7 | show_solar: true 8 | panel_mode: true 9 | card_height: 100% 10 | inverter: 11 | modern: true 12 | colour: "#959595" 13 | autarky: power 14 | solar: 15 | mppts: 2 16 | show_daily: true 17 | colour: "#F4C430" 18 | animation_speed: 9 19 | max_power: 6600 20 | pv1_name: West 21 | pv2_name: North 22 | display_mode: 2 23 | auto_scale: true 24 | pv2_max_power: 3850 25 | pv1_max_power: 2750 26 | efficiency: 3 27 | battery: 28 | energy: 15960 29 | shutdown_soc: sensor.sunsynk_battery_capacity_shutdown 30 | show_daily: true 31 | colour: pink 32 | animation_speed: 6 33 | max_power: 4100 34 | auto_scale: true 35 | show_absolute: true 36 | animate: true 37 | path_threshold: 90 38 | load: 39 | show_aux: false 40 | show_daily: true 41 | animation_speed: 8 42 | max_power: 8000 43 | load1_name: Geyser 44 | load1_icon: sensor.template_mdi 45 | load3_name: Dishwasher 46 | load3_icon: mdi:dishwasher 47 | auto_scale: true 48 | path_threshold: 90 49 | additional_loads: 4 50 | load2_name: Pool 51 | load2_icon: mdi:pool 52 | off_threshold: 3 53 | load4_name: Aircon 54 | load4_icon: mdi:air-conditioner 55 | grid: 56 | show_daily_buy: true 57 | no_grid_colour: 58 | - 125 59 | - 125 60 | - 125 61 | animation_speed: 8 62 | max_power: 8000 63 | auto_scale: true 64 | grid_off_colour: 65 | - 122 66 | - 0 67 | - 0 68 | grid_name: "" 69 | entities: 70 | use_timer_248: switch.sunsynk_toggle_system_timer 71 | priority_load_243: switch.sunsynk_toggle_priority_load 72 | day_battery_charge_70: sensor.sunsynk_day_battery_charge 73 | day_battery_discharge_71: sensor.sunsynk_day_battery_discharge 74 | day_load_energy_84: sensor.sunsynk_day_load_energy 75 | day_grid_import_76: sensor.sunsynk_day_grid_import 76 | day_grid_export_77: none 77 | day_pv_energy_108: sensor.sunsynk_day_pv_energy 78 | inverter_voltage_154: sensor.sunsynk_inverter_voltage 79 | load_frequency_192: sensor.sunsynk_load_frequency 80 | inverter_current_164: sensor.sunsynk_inverter_current 81 | inverter_power_175: sensor.sunsynk_inverter_power 82 | grid_power_169: sensor.sunsynk_grid_power 83 | pv1_power_186: sensor.sunsynk_pv1_power 84 | pv2_power_187: sensor.sunsynk_pv2_power 85 | pv3_power_188: none 86 | pv4_power_189: none 87 | battery_voltage_183: sensor.sunsynk_battery_voltage 88 | battery_soc_184: sensor.sunsynk_battery_soc 89 | battery_power_190: sensor.sunsynk_battery_power 90 | battery_current_191: sensor.sunsynk_battery_current 91 | essential_power: sensor.sunsynk_essential_power_1 92 | essential_load1: sensor.tuya_geyser_current_consumption 93 | essential_load3: sensor.sonoff_pow_r2_energy_power 94 | nonessential_power: sensor.sunsynk_nonessential_power_1 95 | grid_ct_power_172: sensor.sunsynk_grid_ct_power 96 | pv1_voltage_109: sensor.sunsynk_pv1_voltage 97 | pv1_current_110: sensor.sunsynk_pv1_current 98 | pv2_voltage_111: sensor.sunsynk_pv2_voltage 99 | pv2_current_112: sensor.sunsynk_pv2_current 100 | grid_connected_status_194: binary_sensor.sunsynk_grid_connected_status 101 | inverter_status_59: sensor.sunsynk_overall_state 102 | aux_power_166: sensor.sunsynk_aux_power 103 | remaining_solar: sensor.solcast_pv_forecast_forecast_remaining_today 104 | battery_temp_182: sensor.sunsynk_battery_temperature 105 | radiator_temp_91: sensor.sunsynk_radiator_temperature 106 | dc_transformer_temp_90: sensor.sunsynk_dc_transformer_temperature 107 | prog1_time: sensor.sunsynk_time_slot_1 108 | prog1_capacity: number.sunsynk_prog1_capacity 109 | prog1_charge: switch.sunsynk_prog1_grid_charge 110 | prog2_time: sensor.sunsynk_time_slot_2 111 | prog2_capacity: number.sunsynk_prog2_capacity 112 | prog2_charge: switch.sunsynk_prog2_grid_charge 113 | prog3_time: sensor.sunsynk_time_slot_3 114 | prog3_capacity: number.sunsynk_prog3_capacity 115 | prog3_charge: switch.sunsynk_prog3_grid_charge 116 | prog4_time: sensor.sunsynk_time_slot_4 117 | prog4_capacity: number.sunsynk_prog4_capacity 118 | prog4_charge: switch.sunsynk_prog4_grid_charge 119 | prog5_time: sensor.sunsynk_time_slot_5 120 | prog5_capacity: number.sunsynk_prog5_capacity 121 | prog5_charge: switch.sunsynk_prog5_grid_charge 122 | prog6_time: sensor.sunsynk_time_slot_6 123 | prog6_capacity: number.sunsynk_prog6_capacity 124 | prog6_charge: switch.sunsynk_prog6_grid_charge 125 | essential_load1_extra: sensor.daily_geyser_energy 126 | essential_load3_extra: sensor.sonoff_pow_r2_energy_today 127 | environment_temp: sensor.home_realfeel_temperature 128 | prepaid_units: sensor.prepaid_units_left 129 | essential_load2: sensor.sonoff_10013bda3a_power 130 | essential_load4: sensor.midea_aircon_study_power 131 | essential_load4_extra: sensor.daily_aircon_energy 132 | essential_load2_extra: sensor.pool_temperature 133 | dynamic_line_width: true 134 | wide: false 135 | view_layout: 136 | grid-area: flow 137 | - type: custom:plotly-graph 138 | view_layout: 139 | grid-area: graph 140 | entities: 141 | - entity: sensor.sunsynk_solar_power 142 | name: | 143 | $fn ({ ys,meta }) => 144 | "Solar" + "🔆" + "(" +ys[ys.length - 1]+"W)" 145 | fill: tozeroy 146 | line: 147 | color: rgb(255, 155, 48) 148 | shape: spline 149 | - entity: sensor.sunsynk_essential_power 150 | name: | 151 | $fn ({ ys,meta }) => 152 | "Load" + "⚡" + "(" +ys[ys.length - 1]+"W)" 153 | fill: tozeroy 154 | line: 155 | color: rgb(95, 182, 173) 156 | shape: spline 157 | - entity: sensor.sunsynk_grid_ct_power 158 | name: | 159 | $fn ({ ys,meta }) => 160 | "Grid" + "💡" + "(" +ys[ys.length - 1]+"W)" 161 | fill: tozeroy 162 | line: 163 | color: rgb(84, 144, 194) 164 | shape: spline 165 | - entity: sensor.sunsynk_battery_power 166 | fill: tozeroy 167 | name: | 168 | $fn ({ ys,meta }) => 169 | "Battery" + "🔋" + "(" +ys[ys.length - 1]+"W)" 170 | line: 171 | color: rgb(243, 179, 202) 172 | shape: spline 173 | - entity: sensor.sunsynk_battery_soc 174 | name: | 175 | $fn ({ ys,meta }) => 176 | "SOC" + "⚠️" + "(" +ys[ys.length - 1]+"%)" 177 | yaxis: y2 178 | line: 179 | color: red 180 | width: 1 181 | shape: spline 182 | fill: none 183 | filters: 184 | - sliding_window_moving_average: 185 | window_size: 1 186 | extended: true 187 | hours_to_show: 24 188 | refresh_interval: 60 189 | title: null 190 | defaults: 191 | entity: 192 | show_value: false 193 | yaxes: 194 | fixedrange: true 195 | layout: 196 | legend: 197 | bgcolor: rgba(0,0,0,0) 198 | itemsizing: constant 199 | font: 200 | size: 11 201 | yaxis2: 202 | range: 203 | - 20 204 | - 105 205 | fixedrange: true 206 | yaxis: 207 | tickmode: linear 208 | dtick: 1000 209 | config: 210 | scrollZoom: false 211 | - type: custom:plotly-graph 212 | view_layout: 213 | grid-area: daily 214 | entities: 215 | - entity: sensor.sunsynk_day_pv_energy_local 216 | name: | 217 | $fn ({ ys,meta }) => 218 | "Solar" + "🔆" + "(" +ys[ys.length - 1]+"kWh)" 219 | marker: 220 | color: rgb(255, 155, 48) 221 | - entity: sensor.sunsynk_day_load_energy_local 222 | name: | 223 | $fn ({ ys,meta }) => 224 | "Load" + "⚡" + "(" +ys[ys.length - 1]+"kWh)" 225 | marker: 226 | color: rgb(95, 182, 173) 227 | - entity: sensor.sunsynk_day_grid_import_energy_local 228 | name: | 229 | $fn ({ ys,meta }) => 230 | "Grid Import" + "💡" + "(" +ys[ys.length - 1]+"kWh)" 231 | marker: 232 | color: rgb(84, 144, 194) 233 | - entity: sensor.sunsynk_day_battery_discharge_energy_local 234 | name: | 235 | $fn ({ ys,meta }) => 236 | "Battery Discharge" + "🖱️" + "(" +ys[ys.length - 1]+"kWh)" 237 | marker: 238 | color: rgb(151, 90, 182) 239 | - entity: sensor.sunsynk_day_battery_charge_energy_local 240 | name: | 241 | $fn ({ ys,meta }) => 242 | "Battery Charge" + "🔋" + "(" +ys[ys.length - 1]+"kWh)" 243 | marker: 244 | color: yellow 245 | hours_to_show: 5d 246 | title: null 247 | refresh_interval: 120 248 | defaults: 249 | entity: 250 | statistic: state 251 | period: day 252 | type: bar 253 | texttemplate: "%{y}" 254 | filters: 255 | - filter: i>0 256 | yaxes: 257 | fixedrange: true 258 | fn: | 259 | $fn({getFromConfig, vars})=> { 260 | const range = getFromConfig("visible_range"); 261 | const width = range[1] - range[0]; 262 | vars.scroll = (label, p) => ({ 263 | args: [ 264 | { 265 | layout: { 266 | "xaxis.range": [range[0] + width*p, range[1] + width*p], 267 | } 268 | }, { 269 | transition: { 270 | duration: 150, 271 | } 272 | } 273 | ], 274 | label, 275 | method: "animate", 276 | }) 277 | vars.zoom = (label, h) => ({ 278 | args: [ 279 | { 280 | layout: { 281 | "xaxis.range": [Date.now()-1000*60*60*h, Date.now()], 282 | } 283 | } 284 | ], 285 | label, 286 | method: "animate", 287 | }) 288 | } 289 | layout: 290 | updatemenus: 291 | - buttons: 292 | - $fn({vars}) => vars.zoom( '30d', 24*30) 293 | - $fn({vars}) => vars.zoom( '14d', 24*14) 294 | - $fn({vars}) => vars.zoom( '7d', 24*7) 295 | - $fn({vars}) => vars.scroll( ' <', -.5) 296 | - $fn({vars}) => vars.scroll( ' >', .5) 297 | direction: null 298 | active: -1 299 | pad: 300 | r: 10 301 | t: 10 302 | type: buttons 303 | x: 1 304 | xanchor: auto 305 | "y": 1 306 | yanchor: auto 307 | legend: 308 | bgcolor: rgba(0,0,0,0) 309 | yanchor: bottom 310 | xanchor: left 311 | x: 0 312 | "y": 1 313 | font: 314 | size: 11 315 | height: 410 316 | config: 317 | displayModeBar: false 318 | scrollZoom: false 319 | time_offset: 12h 320 | - type: custom:plotly-graph 321 | view_layout: 322 | grid-area: solar 323 | hours_to_show: 4d 324 | time_offset: 2.5d 325 | refresh_interval: auto 326 | entities: 327 | - entity: sensor.sunsynk_solar_power 328 | name: Solar Power 329 | line: 330 | color: rgb(255, 155, 48) 331 | shape: spline 332 | width: 1 333 | fill: tozeroy 334 | fillcolor: rgba(255, 155, 48, 0.3) 335 | yaxis: y3 336 | show_value: false 337 | showlegend: false 338 | - entity: sensor.energy_production_today 339 | line: 340 | color: rgb(125, 125, 125) 341 | shape: spline 342 | fill: tozeroy 343 | filters: 344 | - fn: | 345 | ({meta}) => { 346 | const entries = Object.entries(meta.wh_period); 347 | const xs = entries.map(([start, _]) => new Date(start)); 348 | const ys = entries.map(([_, value]) => value); 349 | return { xs, ys }; 350 | } 351 | yaxis: y1 352 | showlegend: true 353 | - entity: sensor.energy_production_tomorrow 354 | line: 355 | color: rgb(90,90,90) 356 | shape: spline 357 | fill: tozeroy 358 | filters: 359 | - fn: | 360 | ({meta}) => { 361 | const entries = Object.entries(meta.wh_period); 362 | const xs = entries.map(([start, _]) => new Date(start)); 363 | const ys = entries.map(([_, value]) => value); 364 | return { xs, ys }; 365 | } 366 | yaxis: y1 367 | - entity: sensor.energy_production_d2 368 | line: 369 | color: rgb(50,50,50) 370 | shape: spline 371 | fill: tozeroy 372 | filters: 373 | - fn: | 374 | ({meta}) => { 375 | const entries = Object.entries(meta.wh_period); 376 | const xs = entries.map(([start, _]) => new Date(start)); 377 | const ys = entries.map(([_, value]) => value); 378 | return { xs, ys }; 379 | } 380 | yaxis: y1 381 | showlegend: true 382 | - entity: sensor.sunsynk_battery_soc 383 | name: Battery 384 | line: 385 | color: red 386 | shape: spline 387 | width: 1 388 | yaxis: y2 389 | show_value: true 390 | showlegend: false 391 | visible: true 392 | - entity: "" 393 | name: Now 394 | yaxis: y9 395 | showlegend: false 396 | line: 397 | width: 2 398 | dash: dot 399 | color: aqua 400 | x: $ex [Date.now(), Date.now()] 401 | "y": 402 | - 0 403 | - 1 404 | defaults: 405 | yaxes: 406 | fixedrange: true 407 | layout: 408 | height: 410 409 | margin: 410 | t: 55 411 | l: 50 412 | showlegend: false 413 | legend: 414 | x: 0.1 415 | "y": -0.8 416 | yaxis2: 417 | range: 418 | - 20 419 | - 105 420 | fixedrange: true 421 | annotations: 422 | - text: |- 423 | $fn ({hass}) => 424 | "" 425 | + Number(hass.states['sensor.energy_production_today'].state).toFixed(1) + "kWh
" 426 | + "Forecast Today
" 427 | xref: x domain 428 | yref: y domain 429 | xanchor: center 430 | yanchor: center 431 | x: 0.06 432 | "y": 1.2 433 | showarrow: false 434 | - text: |- 435 | $fn ({hass}) => 436 | "" 437 | + Number(hass.states['sensor.meteo_energy_production_today_remaining'].state).toFixed(1) + "kWh
" 438 | + "Remaining
" 439 | xref: x domain 440 | yref: y domain 441 | xanchor: center 442 | yanchor: center 443 | x: 0.28 444 | "y": 1.2 445 | showarrow: false 446 | - text: |- 447 | $fn ({hass}) => 448 | "" 449 | + Number(hass.states['sensor.energy_production_tomorrow'].state).toFixed(1) + "kWh
" 450 | + "Forecast Tomorrow
" 451 | xref: x domain 452 | yref: y domain 453 | xanchor: center 454 | yanchor: centre 455 | x: 0.5 456 | "y": 1.2 457 | showarrow: false 458 | - text: |- 459 | $fn ({hass}) => 460 | "" 461 | + Number(hass.states['sensor.energy_production_d2'].state).toFixed(1) + "kWh
" 462 | + "Forecast Day 2
" 463 | xref: x domain 464 | yref: y domain 465 | xanchor: center 466 | yanchor: center 467 | x: 0.72 468 | "y": 1.2 469 | showarrow: false 470 | - text: |- 471 | $fn ({hass}) => 472 | "" 473 | + Number(hass.states['sensor.sunsynk_battery_soc'].state) + "%
" 474 | + "SOC
" 475 | xref: x domain 476 | yref: y domain 477 | xanchor: center 478 | yanchor: center 479 | x: 0.94 480 | "y": 1.2 481 | showarrow: false 482 | config: 483 | scrollZoom: false 484 | - type: custom:plotly-graph 485 | view_layout: 486 | grid-area: total 487 | entities: 488 | - entity: sensor.sunsynk_total_pv_energy 489 | name: | 490 | $fn ({ ys,meta }) => 491 | "Solar" + "🔆" + "(" +ys[ys.length - 1]+"kWh)" 492 | offset: $fn() => 1000*60*60*4.5 493 | marker: 494 | color: rgb(255, 155, 48) 495 | - entity: sensor.sunsynk_total_load_energy 496 | name: | 497 | $fn ({ ys,meta }) => 498 | "Load" + "⚡" + "(" +ys[ys.length - 1]+"kWh)" 499 | offset: $fn() => 1000*60*60*7.5 500 | marker: 501 | color: rgb(95, 182, 173) 502 | - entity: sensor.sunsynk_total_grid_import 503 | name: | 504 | $fn ({ ys,meta }) => 505 | "Grid Import" + "💡" + "(" +ys[ys.length - 1]+"kWh)" 506 | offset: $fn() => 1000*60*60*10.5 507 | marker: 508 | color: rgb(84, 144, 194) 509 | - entity: sensor.sunsynk_total_battery_discharge 510 | name: | 511 | $fn ({ ys,meta }) => 512 | "Bat Discharge" + "🖱️" + "(" +ys[ys.length - 1]+"kWh)" 513 | offset: $fn() => 1000*60*60*13.5 514 | marker: 515 | color: rgb(151, 90, 182) 516 | - entity: sensor.sunsynk_total_battery_charge 517 | name: | 518 | $fn ({ ys,meta }) => 519 | "Bat Charge" + "🔋" + "(" +ys[ys.length - 1]+"kWh)" 520 | offset: $fn() => 1000*60*60*16.5 521 | marker: 522 | color: yellow 523 | hours_to_show: current_day 524 | defaults: 525 | entity: 526 | statistic: state 527 | period: day 528 | type: bar 529 | width: $fn() => 1000*60*60*3 530 | texttemplate: "%{y}" 531 | yaxes: 532 | fixedrange: true 533 | title: null 534 | layout: 535 | xaxis: 536 | nticks: 1 537 | height: 410 538 | config: 539 | displayModeBar: false 540 | scrollZoom: false 541 | - type: custom:plotly-graph 542 | view_layout: 543 | grid-area: stats 544 | title: Generation Purpose 545 | entities: 546 | - entity: sensor.sunsynk_day_load_energy 547 | type: pie 548 | hole: 0.6 549 | values: >- 550 | $ex [ 551 | hass.states["sensor.sunsynk_day_battery_charge_energy_local"].state, 552 | hass.states["sensor.sunsynk_day_load_energy_local"].state 553 | ] 554 | marker: 555 | colors: 556 | - rgb(84, 144, 194) 557 | - rgb(95, 182, 173) 558 | textinfo: value+percent 559 | hours_to_show: 1 560 | refresh_interval: auto 561 | layout: 562 | height: 390 563 | margin: 564 | t: 60 565 | showlegend: false 566 | annotations: 567 | - text: |- 568 | $fn ({hass}) => 569 | "" 570 | + Number(hass.states['sensor.sunsynk_day_battery_charge_energy_local'].state).toFixed(1) + "kWh
" 571 | + "Charging
" 572 | xref: paper 573 | yref: paper 574 | xanchor: center 575 | yanchor: center 576 | x: 0.9 577 | "y": 1.2 578 | showarrow: false 579 | - text: |- 580 | $fn ({hass}) => 581 | "" 582 | + Number(hass.states['sensor.sunsynk_day_load_energy_local'].state).toFixed(1) + "kWh
" 583 | + "Consumption
" 584 | xref: paper 585 | yref: paper 586 | xanchor: center 587 | yanchor: center 588 | x: 0.05 589 | "y": 1.2 590 | showarrow: false 591 | - type: custom:plotly-graph 592 | view_layout: 593 | grid-area: stats1 594 | title: Generation Today 595 | entities: 596 | - entity: sensor.sunysnk_battery_day_charge 597 | type: pie 598 | hole: 0.6 599 | values: >- 600 | $ex [ 601 | hass.states["sensor.sunsynk_day_battery_discharge_energy_local"].state, 602 | hass.states["sensor.sunsynk_day_grid_import_energy_local"].state, 603 | hass.states["sensor.sunsynk_day_pv_energy_local"].state ] 604 | labels: 605 | - Battery Charge 606 | - Grid Offpeak 607 | - Solar 608 | marker: 609 | colors: 610 | - rgb(151, 90, 182) 611 | - rgb(84, 144, 194) 612 | - rgb(255, 155, 48) 613 | textinfo: value+percent 614 | hours_to_show: 1 615 | refresh_interval: auto 616 | layout: 617 | height: 410 618 | margin: 619 | t: 60 620 | showlegend: false 621 | annotations: 622 | - text: |- 623 | $fn ({hass}) => 624 | "" 625 | + Number(hass.states['sensor.sunsynk_day_pv_energy_local'].state).toFixed(1) + "kWh
" 626 | + "Solar
" 627 | xref: paper 628 | yref: paper 629 | xanchor: center 630 | yanchor: center 631 | x: 0.05 632 | "y": 1.2 633 | showarrow: false 634 | - text: |- 635 | $fn ({hass}) => 636 | "" 637 | + Number(hass.states['sensor.sunsynk_day_battery_discharge_energy_local'].state).toFixed(1) + "kWh
" 638 | + "Battery
" 639 | xref: paper 640 | yref: paper 641 | xanchor: center 642 | yanchor: center 643 | x: 0.5 644 | "y": 1.2 645 | showarrow: false 646 | - text: |- 647 | $fn ({hass}) => 648 | "" 649 | + Number(hass.states['sensor.sunsynk_day_grid_import_energy_local'].state).toFixed(1) + "kWh
" 650 | + "Grid
" 651 | xref: paper 652 | yref: paper 653 | xanchor: center 654 | yanchor: centre 655 | x: 0.9 656 | "y": 1.2 657 | showarrow: false 658 | - type: vertical-stack 659 | cards: 660 | - type: custom:plotly-graph 661 | entities: 662 | - entity: sensor.sonoff_10013bda3a_energy 663 | statistic: state 664 | name: Daily Energy 665 | period: day 666 | type: bar 667 | texttemplate: "%{y}" 668 | filters: 669 | - filter: i>0 670 | hours_to_show: 7d 671 | defaults: 672 | entity: 673 | line: 674 | width: 2 675 | yaxes: 676 | fixedrange: true 677 | title: Daily Pool Energy 678 | fn: | 679 | $fn({getFromConfig, vars})=> { 680 | const range = getFromConfig("visible_range"); 681 | const width = range[1] - range[0]; 682 | vars.scroll = (label, p) => ({ 683 | args: [ 684 | { 685 | layout: { 686 | "xaxis.range": [range[0] + width*p, range[1] + width*p], 687 | } 688 | }, { 689 | transition: { 690 | duration: 150, 691 | } 692 | } 693 | ], 694 | label, 695 | method: "animate", 696 | }) 697 | vars.zoom = (label, h) => ({ 698 | args: [ 699 | { 700 | layout: { 701 | "xaxis.range": [Date.now()-1000*60*60*h, Date.now()], 702 | } 703 | } 704 | ], 705 | label, 706 | method: "animate", 707 | }) 708 | } 709 | layout: 710 | updatemenus: 711 | - buttons: 712 | - $fn({vars}) => vars.zoom( '90d', 24*90) 713 | - $fn({vars}) => vars.zoom( '30d', 24*30) 714 | - $fn({vars}) => vars.zoom( '7d', 24*7) 715 | direction: right 716 | active: -1 717 | pad: 718 | r: 10 719 | t: 10 720 | type: buttons 721 | x: 0 722 | xanchor: left 723 | "y": 1.25 724 | yanchor: top 725 | legend: 726 | bgcolor: rgba(0,0,0,0) 727 | itemsizing: constant 728 | font: 729 | size: 11 730 | config: 731 | displayModeBar: false 732 | scrollZoom: false 733 | - type: entities 734 | entities: 735 | - entity: switch.sonoff_10013bda3a 736 | name: Pool pump 737 | - entity: sensor.sonoff_10013bda3a_current 738 | icon: mdi:current-ac 739 | name: Current 740 | - entity: sensor.sonoff_10013bda3a_power 741 | icon: mdi:lightning-bolt 742 | name: Power 743 | view_layout: 744 | grid-area: bat 745 | - type: vertical-stack 746 | cards: 747 | - type: custom:plotly-graph 748 | entities: 749 | - entity: sensor.daily_geyser_energy 750 | statistic: state 751 | name: Daily Energy 752 | period: day 753 | type: bar 754 | texttemplate: "%{y}" 755 | filters: 756 | - filter: i>0 757 | hours_to_show: 7d 758 | defaults: 759 | entity: 760 | line: 761 | width: 2 762 | yaxes: 763 | fixedrange: true 764 | title: Daily Geyser Energy 765 | fn: | 766 | $fn({getFromConfig, vars})=> { 767 | const range = getFromConfig("visible_range"); 768 | const width = range[1] - range[0]; 769 | vars.scroll = (label, p) => ({ 770 | args: [ 771 | { 772 | layout: { 773 | "xaxis.range": [range[0] + width*p, range[1] + width*p], 774 | } 775 | }, { 776 | transition: { 777 | duration: 150, 778 | } 779 | } 780 | ], 781 | label, 782 | method: "animate", 783 | }) 784 | vars.zoom = (label, h) => ({ 785 | args: [ 786 | { 787 | layout: { 788 | "xaxis.range": [Date.now()-1000*60*60*h, Date.now()], 789 | } 790 | } 791 | ], 792 | label, 793 | method: "animate", 794 | }) 795 | } 796 | layout: 797 | updatemenus: 798 | - buttons: 799 | - $fn({vars}) => vars.zoom( '90d', 24*90) 800 | - $fn({vars}) => vars.zoom( '30d', 24*30) 801 | - $fn({vars}) => vars.zoom( '7d', 24*7) 802 | direction: right 803 | active: -1 804 | pad: 805 | r: 10 806 | t: 10 807 | type: buttons 808 | x: 0 809 | xanchor: left 810 | "y": 1.25 811 | yanchor: top 812 | legend: 813 | bgcolor: rgba(0,0,0,0) 814 | itemsizing: constant 815 | font: 816 | size: 11 817 | config: 818 | displayModeBar: false 819 | scrollZoom: false 820 | - type: entities 821 | entities: 822 | - entity: switch.geyser 823 | - entity: sensor.tuya_geyser_current 824 | icon: mdi:current-ac 825 | name: Current 826 | - entity: sensor.tuya_geyser_current_consumption 827 | icon: mdi:lightning-bolt 828 | name: Power 829 | view_layout: 830 | grid-area: geyser 831 | - type: markdown 832 | content: " ## System Timer Settings\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n Time Slot\n \n Battery SOC\n \n\tGrid\n\t
\n {{states('sensor.sunsynk_time_slot_1')}} - {{states('sensor.sunsynk_time_slot_2')}}\n \n {{ states('number.sunsynk_prog1_capacity') | round(0) }} %\n \n\t{% if is_state('switch.sunsynk_prog1_grid_charge', 'on') %} {% else %} {% endif %}\n\t
\n {{states('sensor.sunsynk_time_slot_2')}} - {{states('sensor.sunsynk_time_slot_3')}}\n \n {{ states('number.sunsynk_prog2_capacity') | round(0) }} %\n \n\t{% if is_state('switch.sunsynk_prog2_grid_charge', 'on') %} {% else %} {% endif %}\n\t
\n {{states('sensor.sunsynk_time_slot_3')}} - {{states('sensor.sunsynk_time_slot_4')}}\n \n {{ states('number.sunsynk_prog3_capacity') | round(0) }} %\n \n\t{% if is_state('switch.sunsynk_prog3_grid_charge', 'on') %} {% else %} {% endif %}\n\t
\n {{states('sensor.sunsynk_time_slot_4')}} - {{states('sensor.sunsynk_time_slot_5')}}\n \n {{ states('number.sunsynk_prog4_capacity') | round(0) }} %\n \n\t{% if is_state('switch.sunsynk_prog4_grid_charge', 'on') %} {% else %} {% endif %}\n\t
\n {{states('sensor.sunsynk_time_slot_5')}} - {{states('sensor.sunsynk_time_slot_6')}}\n \n {{ states('number.sunsynk_prog5_capacity') | round(0) }} %\n \n\t{% if is_state('switch.sunsynk_prog5_grid_charge', 'on') %} {% else %} {% endif %}\n\t
\n {{states('sensor.sunsynk_time_slot_6')}} - {{states('sensor.sunsynk_time_slot_1')}}\n \n {{ states('number.sunsynk_prog6_capacity') | round(0) }} %\n \n\t{% if is_state('switch.sunsynk_prog6_grid_charge', 'on') %} {% else %} {% endif %}\n\t
" 833 | view_layout: 834 | grid-area: weather 835 | - type: custom:flex-horseshoe-card 836 | view_layout: 837 | grid-area: g3 838 | entities: 839 | - entity: sensor.sunsynk_essential_power_1 840 | unit: W 841 | name: AC 842 | - entity: sensor.sunsynk_inverter_voltage 843 | decimals: 0 844 | unit: V 845 | - entity: sensor.sunsynk_grid_frequency 846 | decimals: 2 847 | unit: Hz 848 | name: Grid 849 | - entity: sensor.sunsynk_grid_ct_power 850 | decimals: 0 851 | unit: W 852 | name: Grid 853 | - entity: sensor.sunsynk_day_grid_import 854 | decimals: 2 855 | unit: kWh 856 | name: Import 857 | - entity: sensor.sunsynk_day_load_energy 858 | decimals: 2 859 | unit: kWh 860 | name: Daily 861 | show: 862 | horseshoe_style: autominmax 863 | layout: 864 | hlines: 865 | - id: 0 866 | xpos: 50 867 | ypos: 40 868 | length: 70 869 | styles: 870 | - opacity: 0.2; 871 | - id: 0 872 | xpos: 50 873 | ypos: 60 874 | length: 70 875 | styles: 876 | - opacity: 0.2; 877 | vlines: 878 | - id: 0 879 | xpos: 50 880 | ypos: 50 881 | length: 18 882 | styles: 883 | - opacity: 0.2; 884 | states: 885 | - id: 0 886 | entity_index: 0 887 | xpos: 50 888 | ypos: 33 889 | styles: 890 | - font-size: 3em; 891 | - opacity: 0.9; 892 | - text-anchor: middle; 893 | - id: 1 894 | entity_index: 1 895 | xpos: 44 896 | ypos: 53 897 | styles: 898 | - font-size: 1.5em; 899 | - text-anchor: end; 900 | - id: 2 901 | entity_index: 2 902 | xpos: 55 903 | ypos: 53 904 | styles: 905 | - text-anchor: start; 906 | - font-size: 1.5em; 907 | - id: 3 908 | entity_index: 3 909 | xpos: 50 910 | ypos: 75 911 | styles: 912 | - text-anchor: middle; 913 | - font-size: 2em; 914 | - id: 4 915 | entity_index: 4 916 | xpos: 75 917 | ypos: 7 918 | styles: 919 | - text-anchor: start; 920 | - font-size: 1.2em; 921 | - id: 5 922 | entity_index: 5 923 | xpos: 0 924 | ypos: 7 925 | styles: 926 | - text-anchor: start; 927 | - font-size: 1.2em; 928 | icons: 929 | - id: 0 930 | entity_index: 1 931 | xpos: 30 932 | ypos: 52 933 | align: start 934 | size: 1 935 | names: 936 | - id: 0 937 | entity_index: 0 938 | xpos: 50 939 | ypos: 95 940 | styles: 941 | - font-size: 1.2em; 942 | - id: 1 943 | entity_index: 4 944 | xpos: 85 945 | ypos: 12 946 | styles: 947 | - font-size: 0.5em; 948 | - text-anchor: start; 949 | - id: 2 950 | entity_index: 5 951 | xpos: 0 952 | ypos: 12 953 | styles: 954 | - font-size: 0.5em; 955 | - text-anchor: start; 956 | - id: 3 957 | entity_index: 3 958 | xpos: 50 959 | ypos: 80 960 | styles: 961 | - font-size: 0.5em; 962 | - text-anchor: middle; 963 | horseshoe_scale: 964 | min: 0 965 | max: 8000 966 | width: 6 967 | color_stops: 968 | "0": "#5fb6ad" 969 | "2000": "#5fb6ad" 970 | card_mod: 971 | style: | 972 | ha-card { 973 | --ha-card-background: var(--card-background-color); 974 | color: var(--primary-color); 975 | } 976 | - type: custom:flex-horseshoe-card 977 | view_layout: 978 | grid-area: g1 979 | entities: 980 | - entity: sensor.sunsynk_solar_power 981 | decimals: 0 982 | unit: W 983 | name: Solar 984 | - entity: sensor.sunsynk_pv1_power 985 | decimals: 0 986 | unit: W 987 | name: PV1 988 | - entity: sensor.sunsynk_pv2_power 989 | decimals: 0 990 | unit: W 991 | name: PV2 992 | - entity: sensor.sunsynk_pv1_voltage 993 | decimals: 0 994 | unit: V 995 | - entity: sensor.sunsynk_pv2_voltage 996 | decimals: 0 997 | unit: V 998 | - entity: sensor.sunsynk_pv1_current 999 | decimals: 1 1000 | unit: A 1001 | - entity: sensor.sunsynk_pv2_current 1002 | decimals: 1 1003 | unit: A 1004 | - entity: sensor.sunsynk_day_pv_energy 1005 | decimals: 2 1006 | unit: kWh 1007 | name: Daily 1008 | - entity: sensor.solcast_pv_forecast_forecast_remaining_today 1009 | decimals: 2 1010 | unit: kWh 1011 | name: Left Today 1012 | show: 1013 | horseshoe_style: autominmax 1014 | layout: 1015 | hlines: 1016 | - id: 0 1017 | xpos: 50 1018 | ypos: 40 1019 | length: 70 1020 | styles: 1021 | - opacity: 0.2; 1022 | vlines: 1023 | - id: 0 1024 | xpos: 50 1025 | ypos: 59 1026 | length: 36 1027 | styles: 1028 | - opacity: 0.2; 1029 | states: 1030 | - id: 0 1031 | entity_index: 0 1032 | xpos: 50 1033 | ypos: 33 1034 | styles: 1035 | - font-size: 3em; 1036 | - opacity: 0.9; 1037 | - id: 1 1038 | entity_index: 1 1039 | xpos: 47 1040 | ypos: 53 1041 | styles: 1042 | - font-size: 1.5em; 1043 | - text-anchor: end; 1044 | - id: 2 1045 | entity_index: 2 1046 | xpos: 53 1047 | ypos: 53 1048 | styles: 1049 | - text-anchor: start; 1050 | - font-size: 1.5em; 1051 | - id: 3 1052 | entity_index: 3 1053 | xpos: 46 1054 | ypos: 63 1055 | styles: 1056 | - text-anchor: end; 1057 | - font-size: 1.5em; 1058 | - id: 4 1059 | entity_index: 4 1060 | xpos: 53 1061 | ypos: 63 1062 | styles: 1063 | - text-anchor: start; 1064 | - font-size: 1.5em; 1065 | - id: 5 1066 | entity_index: 5 1067 | xpos: 46 1068 | ypos: 73 1069 | styles: 1070 | - text-anchor: end; 1071 | - font-size: 1.5em; 1072 | - id: 6 1073 | entity_index: 6 1074 | xpos: 53 1075 | ypos: 73 1076 | styles: 1077 | - text-anchor: start; 1078 | - font-size: 1.5em; 1079 | - id: 7 1080 | entity_index: 7 1081 | xpos: 0 1082 | ypos: 7 1083 | styles: 1084 | - text-anchor: start; 1085 | - font-size: 1.2em; 1086 | - id: 8 1087 | entity_index: 8 1088 | xpos: 75 1089 | ypos: 7 1090 | styles: 1091 | - text-anchor: start; 1092 | - font-size: 1.2em; 1093 | icons: 1094 | - id: 0 1095 | entity_index: 1 1096 | xpos: 1 1097 | ypos: 53 1098 | align: start 1099 | size: 1 1100 | - id: 1 1101 | entity_index: 2 1102 | xpos: 53 1103 | ypos: 65 1104 | align: end 1105 | size: 0.5 1106 | names: 1107 | - id: 0 1108 | entity_index: 0 1109 | xpos: 50 1110 | ypos: 95 1111 | styles: 1112 | - font-size: 1.2em; 1113 | - id: 1 1114 | entity_index: 1 1115 | xpos: 15 1116 | ypos: 45 1117 | styles: 1118 | - text-anchor: start; 1119 | - font-size: 0.5em; 1120 | - id: 2 1121 | entity_index: 2 1122 | xpos: 85 1123 | ypos: 45 1124 | styles: 1125 | - text-anchor: end; 1126 | - font-size: 0.5em; 1127 | - id: 3 1128 | entity_index: 7 1129 | xpos: 0 1130 | ypos: 12 1131 | styles: 1132 | - text-anchor: start; 1133 | - font-size: 0.5em; 1134 | - id: 4 1135 | entity_index: 8 1136 | xpos: 80 1137 | ypos: 12 1138 | styles: 1139 | - font-size: 0.5em; 1140 | - text-anchor: start; 1141 | horseshoe_scale: 1142 | min: 0 1143 | max: 7000 1144 | width: 6 1145 | color_stops: 1146 | "0": orange 1147 | "2000": orange 1148 | card_mod: 1149 | style: | 1150 | ha-card { 1151 | --ha-card-background: var(--card-background-color); 1152 | color: var(--primary-color); 1153 | } 1154 | - type: custom:plotly-graph 1155 | view_layout: 1156 | grid-area: energy 1157 | hours_to_show: current_day 1158 | title: System Timer 1159 | time_offset: 1h 1160 | refresh_interval: auto 1161 | fn: | 1162 | $fn({hass, vars}) => { 1163 | vars.computeAll = () => { 1164 | const timeSlots = [ 1165 | {start: 1, end: 2, cap: 1}, 1166 | {start: 2, end: 3, cap: 2}, 1167 | {start: 3, end: 4, cap: 3}, 1168 | {start: 4, end: 5, cap: 4}, 1169 | {start: 5, end: 6, cap: 5}, 1170 | {start: 6, end: 1, cap: 6} 1171 | ]; 1172 | 1173 | const now = new Date(); 1174 | const xs = []; 1175 | const ys = []; 1176 | 1177 | timeSlots.forEach(({start, end, cap}) => { 1178 | const startTimeString = hass.states[`sensor.sunsynk_time_slot_${start}`].state; 1179 | const endTimeString = hass.states[`sensor.sunsynk_time_slot_${end}`].state; 1180 | const capacity = parseFloat(hass.states[`number.sunsynk_prog${cap}_capacity`].state); 1181 | 1182 | const [startHours, startMinutes] = startTimeString.split(':').map(Number); 1183 | const [endHours, endMinutes] = endTimeString.split(':').map(Number); 1184 | 1185 | const startTime = new Date(now.getFullYear(), now.getMonth(), now.getDate(), startHours, startMinutes); 1186 | let endTime = new Date(now.getFullYear(), now.getMonth(), now.getDate(), endHours, endMinutes); 1187 | 1188 | if (endTime < startTime) { 1189 | endTime.setDate(endTime.getDate() + 1); 1190 | } 1191 | 1192 | xs.push(startTime, endTime); 1193 | ys.push(capacity, capacity); 1194 | }); 1195 | 1196 | return { xs, ys }; 1197 | } 1198 | } 1199 | entities: 1200 | - entity: sensor.sunsynk_battery_soc 1201 | name: | 1202 | $fn ({ ys,meta }) => 1203 | "SOC" + "🔋" + "(" +ys[ys.length - 1]+"%)" 1204 | line: 1205 | color: red 1206 | shape: spline 1207 | width: 1 1208 | fillcolor: rgba(255,0,0, 0.3) 1209 | show_value: true 1210 | texttemplate: "%{y}" 1211 | - entity: sensor.sunsynk_solar_power 1212 | name: | 1213 | $fn ({ ys,meta }) => 1214 | "Solar" + "🔆" + "(" +ys[ys.length - 1]+"W)" 1215 | line: 1216 | color: rgb(255, 155, 48) 1217 | shape: spline 1218 | width: 1 1219 | fill: tozeroy 1220 | fillcolor: rgba(255, 155, 48, 0.3) 1221 | yaxis: y2 1222 | show_value: false 1223 | showlegend: true 1224 | - entity: sensor.sunsynk_grid_ct_power 1225 | name: | 1226 | $fn ({ ys,meta }) => 1227 | "Grid" + "💡" + "(" +ys[ys.length - 1]+"W)" 1228 | fill: tozeroy 1229 | line: 1230 | color: rgb(84, 144, 194) 1231 | - entity: sensor.sunsynk_combined_capacity 1232 | name: | 1233 | $fn ({ ys, meta }) => 1234 | "Prog Capacity" 1235 | line: 1236 | color: rgb(30, 144, 255) 1237 | width: 2 1238 | fillcolor: rgba(30, 144, 255, 0.6) 1239 | show_value: true 1240 | unit_of_measurement: "%" 1241 | filters: 1242 | - fn: ({ vars }) => vars.computeAll() 1243 | layout: 1244 | showlegend: true 1245 | yaxis: 1246 | nticks: 20 1247 | range: 1248 | - 0 1249 | - 105 1250 | fixedrange: true 1251 | yaxis2: 1252 | range: 1253 | - 0 1254 | - 6600 1255 | fixedrange: true 1256 | xaxis: 1257 | nticks: 9 1258 | tickangle: 0 1259 | config: 1260 | scrollZoom: false 1261 | - type: custom:flex-horseshoe-card 1262 | view_layout: 1263 | grid-area: g2 1264 | entities: 1265 | - entity: sensor.sunsynk_battery_soc 1266 | decimals: 0 1267 | unit: "%" 1268 | name: BATTERY 1269 | - entity: sensor.sunsynk_battery_voltage 1270 | decimals: 2 1271 | unit: V 1272 | - entity: sensor.sunsynk_battery_current 1273 | decimals: 2 1274 | unit: A 1275 | - entity: sensor.sunsynk_battery_power 1276 | decimals: 0 1277 | unit: W 1278 | - entity: sensor.sunsynk_day_battery_discharge 1279 | decimals: 2 1280 | unit: kWh 1281 | name: Discharge 1282 | - entity: sensor.sunsynk_day_battery_charge 1283 | decimals: 2 1284 | unit: kWh 1285 | name: Charge 1286 | show: 1287 | horseshoe_style: autominmax 1288 | layout: 1289 | hlines: 1290 | - id: 0 1291 | xpos: 50 1292 | ypos: 40 1293 | length: 70 1294 | styles: 1295 | - opacity: 0.2; 1296 | - id: 0 1297 | xpos: 50 1298 | ypos: 60 1299 | length: 70 1300 | styles: 1301 | - opacity: 0.2; 1302 | vlines: 1303 | - id: 0 1304 | xpos: 50 1305 | ypos: 50 1306 | length: 18 1307 | styles: 1308 | - opacity: 0.2; 1309 | states: 1310 | - id: 0 1311 | entity_index: 0 1312 | xpos: 50 1313 | ypos: 33 1314 | styles: 1315 | - font-size: 3em; 1316 | - opacity: 0.9; 1317 | - id: 1 1318 | entity_index: 1 1319 | xpos: 44 1320 | ypos: 53 1321 | styles: 1322 | - font-size: 1.5em; 1323 | - text-anchor: end; 1324 | - id: 2 1325 | entity_index: 2 1326 | xpos: 55 1327 | ypos: 53 1328 | styles: 1329 | - text-anchor: start; 1330 | - font-size: 1.5em; 1331 | - id: 3 1332 | entity_index: 3 1333 | xpos: 50 1334 | ypos: 75 1335 | styles: 1336 | - text-anchor: middle; 1337 | - font-size: 2em; 1338 | - id: 4 1339 | entity_index: 4 1340 | xpos: 76 1341 | ypos: 7 1342 | styles: 1343 | - text-anchor: start; 1344 | - font-size: 1.2em; 1345 | - id: 5 1346 | entity_index: 5 1347 | xpos: 0 1348 | ypos: 7 1349 | styles: 1350 | - text-anchor: start; 1351 | - font-size: 1.2em; 1352 | icons: 1353 | - id: 0 1354 | entity_index: 1 1355 | xpos: 30 1356 | ypos: 52 1357 | align: start 1358 | size: 1 1359 | names: 1360 | - id: 0 1361 | entity_index: 0 1362 | xpos: 50 1363 | ypos: 95 1364 | styles: 1365 | - font-size: 1.2em; 1366 | - id: 1 1367 | entity_index: 4 1368 | xpos: 81 1369 | ypos: 12 1370 | styles: 1371 | - font-size: 0.5em; 1372 | - text-anchor: start; 1373 | - id: 2 1374 | entity_index: 5 1375 | xpos: 0 1376 | ypos: 12 1377 | styles: 1378 | - font-size: 0.5em; 1379 | - text-anchor: start; 1380 | horseshoe_scale: 1381 | min: 0 1382 | max: 100 1383 | width: 6 1384 | color_stops: 1385 | "0": pink 1386 | "2000": pink 1387 | card_mod: 1388 | style: | 1389 | ha-card { 1390 | --ha-card-background: var(--card-background-color); 1391 | color: var(--primary-color); 1392 | } 1393 | - type: custom:plotly-graph 1394 | view_layout: 1395 | grid-area: sg 1396 | entities: 1397 | - entity: sensor.sunsynk_day_pv_energy_local 1398 | name: | 1399 | $fn ({ ys,meta }) => 1400 | "Solar" + "🔆" + "(" +ys[ys.length - 1]+"kWh)" 1401 | type: bar 1402 | texttemplate: "%{y}" 1403 | filters: 1404 | - filter: i>0 1405 | marker: 1406 | color: rgb(255, 155, 48) 1407 | - entity: sensor.sunsynk_day_grid_import_energy_local 1408 | name: | 1409 | $fn ({ ys,meta }) => 1410 | "Grid Import" + "💡" + "(" +ys[ys.length - 1]+"kWh)" 1411 | type: bar 1412 | texttemplate: "%{y}" 1413 | filters: 1414 | - filter: i>0 1415 | marker: 1416 | color: rgb(84, 144, 194) 1417 | - entity: sensor.sunsynk_day_load_energy_local 1418 | show_value: true 1419 | name: | 1420 | $fn ({ ys,meta }) => 1421 | "Load" + "⚡" + "(" +ys[ys.length - 1]+"kWh)" 1422 | period: day 1423 | type: line 1424 | texttemplate: "%{y}" 1425 | line: 1426 | color: rgb(95, 182, 173) 1427 | width: 2 1428 | hours_to_show: 31d 1429 | title: null 1430 | refresh_interval: 600 1431 | defaults: 1432 | entity: 1433 | statistic: state 1434 | period: day 1435 | yaxes: 1436 | fixedrange: true 1437 | fn: | 1438 | $fn({getFromConfig, vars})=> { 1439 | const range = getFromConfig("visible_range"); 1440 | const width = range[1] - range[0]; 1441 | vars.scroll = (label, p) => ({ 1442 | args: [ 1443 | { 1444 | layout: { 1445 | "xaxis.range": [range[0] + width*p, range[1] + width*p], 1446 | } 1447 | }, { 1448 | transition: { 1449 | duration: 150, 1450 | } 1451 | } 1452 | ], 1453 | label, 1454 | method: "animate", 1455 | }) 1456 | vars.zoom = (label, h) => ({ 1457 | args: [ 1458 | { 1459 | layout: { 1460 | "xaxis.range": [Date.now()-1000*60*60*h, Date.now()], 1461 | } 1462 | } 1463 | ], 1464 | label, 1465 | method: "animate", 1466 | }) 1467 | } 1468 | layout: 1469 | updatemenus: 1470 | - buttons: 1471 | - $fn({vars}) => vars.scroll( '<', -.5) 1472 | - $fn({vars}) => vars.scroll( '>', .5) 1473 | direction: right 1474 | active: -1 1475 | pad: 1476 | r: 10 1477 | t: 10 1478 | type: buttons 1479 | x: 1 1480 | xanchor: right 1481 | "y": 1.25 1482 | yanchor: top 1483 | - buttons: 1484 | - $fn({vars}) => vars.zoom( '90d', 24*90) 1485 | - $fn({vars}) => vars.zoom( '30d', 24*30) 1486 | - $fn({vars}) => vars.zoom( '7d', 24*7) 1487 | direction: right 1488 | active: -1 1489 | pad: 1490 | r: 10 1491 | t: 10 1492 | type: buttons 1493 | x: 0 1494 | xanchor: left 1495 | "y": 1.25 1496 | yanchor: top 1497 | barmode: stack 1498 | legend: 1499 | bgcolor: rgba(0,0,0,0) 1500 | itemsizing: constant 1501 | font: 1502 | size: 11 1503 | height: 410 1504 | config: 1505 | displayModeBar: false 1506 | scrollZoom: false 1507 | - type: custom:plotly-graph 1508 | view_layout: 1509 | grid-area: m 1510 | entities: 1511 | - entity: sensor.sunsynk_day_pv_energy 1512 | statistic: sum 1513 | name: | 1514 | $fn ({ ys,meta }) => 1515 | "Solar" + "🔆" 1516 | period: month 1517 | type: bar 1518 | width: $fn() => 1000*60*60*130 1519 | offset: $fn() => -1000*60*60*325 1520 | texttemplate: "%{y}" 1521 | filters: 1522 | - delta 1523 | marker: 1524 | color: rgb(255, 155, 48) 1525 | - entity: sensor.sunsynk_day_load_energy 1526 | statistic: sum 1527 | name: | 1528 | $fn ({ ys,meta }) => 1529 | "Load" + "⚡" 1530 | period: month 1531 | type: bar 1532 | filters: 1533 | - delta 1534 | width: $fn() => 1000*60*60*130 1535 | offset: $fn() => -1000*60*60*195 1536 | texttemplate: "%{y}" 1537 | marker: 1538 | color: rgb(95, 182, 173) 1539 | - entity: sensor.sunsynk_day_grid_import 1540 | statistic: sum 1541 | name: | 1542 | $fn ({ ys,meta }) => 1543 | "Grid Import" + "💡" 1544 | period: month 1545 | type: bar 1546 | texttemplate: "%{y}" 1547 | width: $fn() => 1000*60*60*130 1548 | filters: 1549 | - delta 1550 | marker: 1551 | color: rgb(84, 144, 194) 1552 | - entity: sensor.sunsynk_day_battery_discharge 1553 | statistic: sum 1554 | name: | 1555 | $fn ({ ys,meta }) => 1556 | "Battery Discharge" + "🔋" 1557 | period: month 1558 | type: bar 1559 | width: $fn() => 1000*60*60*130 1560 | offset: $fn() => 1000*60*60*65 1561 | texttemplate: "%{y}" 1562 | filters: 1563 | - delta 1564 | marker: 1565 | color: rgb(151, 90, 182) 1566 | - entity: sensor.sunsynk_day_battery_charge 1567 | statistic: sum 1568 | name: | 1569 | $fn ({ ys,meta }) => 1570 | "Battery Charge" + "🔋" 1571 | period: month 1572 | type: bar 1573 | width: $fn() => 1000*60*60*130 1574 | offset: $fn() => 1000*60*60*195 1575 | texttemplate: "%{y}" 1576 | filters: 1577 | - delta 1578 | marker: 1579 | color: yellow 1580 | hours_to_show: 6M 1581 | title: Monthly Production 1582 | refresh_interval: 600 1583 | defaults: 1584 | yaxes: 1585 | fixedrange: true 1586 | layout: 1587 | legend: 1588 | bgcolor: rgba(0,0,0,0) 1589 | itemsizing: constant 1590 | font: 1591 | size: 11 1592 | height: 410 1593 | config: 1594 | displayModeBar: false 1595 | scrollZoom: false 1596 | time_offset: 1M 1597 | - type: vertical-stack 1598 | view_layout: 1599 | grid-area: ls 1600 | cards: 1601 | - type: entities 1602 | entities: 1603 | - entity: sensor.prepaid_units_left 1604 | type: custom:bar-card 1605 | entity_row: true 1606 | severity: 1607 | - color: Red 1608 | from: 0 1609 | to: 40 1610 | - color: Orange 1611 | from: 41 1612 | to: 80 1613 | - color: null 1614 | from: 81 1615 | to: 300 1616 | - entity: input_number.prepaid_units 1617 | - entity: sensor.units_used_since_last_update 1618 | name: Units Used Since Last Update (kWh) 1619 | icon: mdi:flash 1620 | - entity: sensor.last_update_date 1621 | name: Last Update 1622 | icon: mdi:calendar 1623 | - entity: script.update_prepaid_units 1624 | - type: custom:plotly-graph 1625 | entities: 1626 | - entity: sensor.sunsynk_day_grid_import_energy_local 1627 | texttemplate: "%{y:.1f}" 1628 | name: Import 1629 | type: bar 1630 | statistic: state 1631 | period: day 1632 | marker: 1633 | color: "#5e90c1" 1634 | opacity: 1 1635 | filters: 1636 | - filter: i>0 && i < xs.length - 1 1637 | - fn: | 1638 | ({ys,xs,hass}) => ({ 1639 | xs: [...xs, new Date().setHours(0,0,0)], 1640 | ys: [...ys, hass.states['sensor.sunsynk_day_grid_import_energy_local'].state], 1641 | }) 1642 | - entity: sensor.sunsynk_day_battery_discharge 1643 | texttemplate: "%{y:.1f}" 1644 | name: Discharge 1645 | type: bar 1646 | statistic: state 1647 | period: day 1648 | marker: 1649 | color: "#935bb6" 1650 | opacity: 1 1651 | filters: 1652 | - filter: i>0 && i < xs.length - 1 1653 | - fn: | 1654 | ({ys,xs,hass}) => ({ 1655 | xs: [...xs, new Date().setHours(0,0,0)], 1656 | ys: [...ys, hass.states['sensor.sunsynk_day_battery_discharge'].state], 1657 | }) 1658 | - entity: sensor.sunsynk_day_pv_energy_local 1659 | texttemplate: "%{y:.1f}" 1660 | textposition: outside 1661 | name: Production 1662 | type: bar 1663 | statistic: state 1664 | period: day 1665 | marker: 1666 | color: orange 1667 | opacity: 1 1668 | filters: 1669 | - filter: i>0 && i < xs.length - 1 1670 | - fn: | 1671 | ({ys,xs,hass}) => ({ 1672 | xs: [...xs, new Date().setHours(0,0,0)], 1673 | ys: [...ys, hass.states['sensor.sunsynk_day_pv_energy_local'].state], 1674 | }) 1675 | - entity: sensor.sunsynk_day_load_energy 1676 | texttemplate: "%{y:.1f}" 1677 | name: Consumption 1678 | type: bar 1679 | statistic: state 1680 | period: day 1681 | marker: 1682 | color: "#6cb6ac" 1683 | opacity: 0.9 1684 | filters: 1685 | - map_y_numbers: y *(-1) 1686 | - filter: i>0 && i < xs.length - 1 1687 | - fn: | 1688 | ({ys,xs,hass}) => ({ 1689 | xs: [...xs, new Date().setHours(0,0,0)], 1690 | ys: [...ys, hass.states['sensor.sunsynk_day_load_energy_local'].state * (-1)], 1691 | }) 1692 | - entity: sensor.sunsynk_day_battery_charge 1693 | texttemplate: "%{y:.1f}" 1694 | textposition: outside 1695 | name: Charge 1696 | type: bar 1697 | statistic: state 1698 | period: day 1699 | marker: 1700 | color: "#fdff1d" 1701 | opacity: 0.9 1702 | filters: 1703 | - map_y_numbers: y *(-1) 1704 | - filter: i>0 && i < xs.length - 1 1705 | - fn: | 1706 | ({ys,xs,hass}) => ({ 1707 | xs: [...xs, new Date().setHours(0,0,0)], 1708 | ys: [...ys, hass.states['sensor.sunsynk_day_battery_charge'].state * (-1)], 1709 | }) 1710 | - entity: sensor.sunsynk_day_grid_export_energy_local 1711 | texttemplate: "%{y:.1f}" 1712 | name: Export 1713 | type: bar 1714 | statistic: state 1715 | period: day 1716 | marker: 1717 | color: "#385674" 1718 | opacity: 0.9 1719 | filters: 1720 | - map_y_numbers: y *(-1) 1721 | - filter: i>0 && i < xs.length - 1 1722 | - fn: | 1723 | ({ys,xs,hass}) => ({ 1724 | xs: [...xs, new Date().setHours(0,0,0)], 1725 | ys: [...ys, hass.states['sensor.sunsynk_day_grid_export_energy_local'].state * (-1)], 1726 | }) 1727 | fn: | 1728 | $fn({getFromConfig, vars})=> { 1729 | const range = getFromConfig("visible_range"); 1730 | const width = range[1] - range[0]; 1731 | vars.scroll = (label, p) => ({ 1732 | args: [ 1733 | { 1734 | layout: { 1735 | "xaxis.range": [range[0] + width*p, range[1] + width*p], 1736 | } 1737 | }, { 1738 | transition: { 1739 | duration: 150, 1740 | } 1741 | } 1742 | ], 1743 | label, 1744 | method: "animate", 1745 | }) 1746 | vars.zoom = (label, h) => ({ 1747 | args: [ 1748 | { 1749 | layout: { 1750 | "xaxis.range": [Date.now()-1000*60*60*h, Date.now()], 1751 | } 1752 | } 1753 | ], 1754 | label, 1755 | method: "animate", 1756 | }) 1757 | } 1758 | layout: 1759 | updatemenus: 1760 | - buttons: 1761 | - $fn({vars}) => vars.scroll( '<', -.5) 1762 | - $fn({vars}) => vars.scroll( '>', .5) 1763 | direction: right 1764 | active: -1 1765 | pad: 1766 | r: 10 1767 | t: 10 1768 | type: buttons 1769 | x: 1 1770 | xanchor: right 1771 | "y": 1.25 1772 | yanchor: top 1773 | - buttons: 1774 | - $fn({vars}) => vars.zoom( '60d', 24*60) 1775 | - $fn({vars}) => vars.zoom( '30d', 24*30) 1776 | - $fn({vars}) => vars.zoom( '15d', 24*15) 1777 | direction: right 1778 | active: -1 1779 | pad: 1780 | r: 10 1781 | t: 10 1782 | type: buttons 1783 | x: 0 1784 | xanchor: left 1785 | "y": 1.25 1786 | yanchor: top 1787 | barmode: relative 1788 | bargap: 0.2 1789 | height: 520 1790 | legend: 1791 | bgcolor: rgba(0,0,0,0) 1792 | itemsizing: constant 1793 | font: 1794 | size: 11 1795 | xaxis: 1796 | showgrid: true 1797 | linewidth: 0 1798 | linecolor: null 1799 | yaxis: 1800 | visible: true 1801 | fixedrange: true 1802 | hours_to_show: 31d 1803 | config: 1804 | scrollZoom: false 1805 | refresh_interval: auto 1806 | view_layout: 1807 | grid-area: ge 1808 | layout: 1809 | grid-template-columns: 10% 10% 10% 10% 10% 10% 10% 10% 10% 10% 1810 | grid-template-rows: auto 2fr auto auto auto auto auto 1811 | grid-template-areas: | 1812 | "g1 g1 g2 g2 g3 g3 ls ls weather weather" 1813 | "flow flow flow flow graph graph graph graph graph graph " 1814 | "total total total total daily daily daily daily daily daily" 1815 | "ge ge ge ge ge ge ge ge ge ge" 1816 | "sg sg sg sg sg sg sg sg stats stats" 1817 | "m m m m m m m m stats1 stats1" 1818 | "bat bat bat bat bat geyser geyser geyser geyser geyser " 1819 | "energy energy energy solar solar solar solar solar solar solar " 1820 | justify-items: stretch 1821 | mediaquery: 1822 | "(max-width: 800px)": 1823 | grid-template-columns: 100% 1824 | grid-template-areas: | 1825 | "ls" 1826 | "g1" 1827 | "g2" 1828 | "g3" 1829 | "flow" 1830 | "graph" 1831 | "daily" 1832 | "total" 1833 | "stats1" 1834 | "sg" 1835 | "m" 1836 | "bat" 1837 | "geyser" 1838 | "stats" 1839 | "energy" 1840 | "solar" 1841 | "weather" 1842 | "(max-width: 1300px)": 1843 | grid-template-columns: 33% 33% 33% 1844 | grid-template-rows: auto 1845 | grid-template-areas: | 1846 | "g1 g2 g3" 1847 | "flow flow flow " 1848 | "graph graph graph" 1849 | "stats1 daily daily" 1850 | "stats total total" 1851 | "ge ge ge" 1852 | "sg sg sg" 1853 | "m m m" 1854 | "ls bat bat" 1855 | "weather geyser geyser" 1856 | "energy solar solar" 1857 | -------------------------------------------------------------------------------- /ESPHome Configs/DEY12k-modbus.yaml: -------------------------------------------------------------------------------- 1 | switch: 2 | - platform: modbus_controller 3 | use_write_multiple: true 4 | modbus_controller_id: ${modbus_controller_id} 5 | name: sun12k_Solar_sell 6 | register_type: holding 7 | address: 145 8 | bitmask: 1 9 | entity_category: config 10 | icon: "mdi:toggle-switch" 11 | 12 | - platform: modbus_controller 13 | use_write_multiple: true 14 | modbus_controller_id: ${modbus_controller_id} 15 | name: sun12k-Grid_Charge 16 | register_type: holding 17 | address: 130 18 | bitmask: 1 19 | entity_category: config 20 | icon: "mdi:toggle-switch" 21 | 22 | - platform: modbus_controller # Advanced peak shaving and valley filling function enabled 23 | use_write_multiple: true 24 | modbus_controller_id: ${modbus_controller_id} 25 | name: sun12k-Time of Use 26 | id: sun12k_Time_of_Use 27 | register_type: holding 28 | address: 146 29 | bitmask: 1 30 | entity_category: config 31 | icon: "mdi:toggle-switch" 32 | 33 | - platform: modbus_controller # Time point 1 charge enable - grid charging enable 34 | use_write_multiple: true 35 | modbus_controller_id: ${modbus_controller_id} 36 | name: sun12k-Time point 1 charge enable 37 | register_type: holding 38 | address: 172 39 | bitmask: 1 # 2 hvis man ønsker Gen charging enabel i sted for. 40 | entity_category: config 41 | icon: "mdi:toggle-switch" 42 | 43 | - platform: modbus_controller # Time point 2 charge enable - grid charging enable 44 | use_write_multiple: true 45 | modbus_controller_id: ${modbus_controller_id} 46 | name: sun12k-Time point 2 charge enable 47 | register_type: holding 48 | address: 173 49 | bitmask: 1 # 2 hvis man ønsker Gen charging enabel i sted for. 50 | entity_category: config 51 | icon: "mdi:toggle-switch" 52 | 53 | - platform: modbus_controller # Time point 3 charge enable - grid charging enable 54 | use_write_multiple: true 55 | modbus_controller_id: ${modbus_controller_id} 56 | name: sun12k-Time point 3 charge enable 57 | register_type: holding 58 | address: 174 59 | bitmask: 1 # 2 hvis man ønsker Gen charging enabel i sted for. 60 | entity_category: config 61 | icon: "mdi:toggle-switch" 62 | 63 | - platform: modbus_controller # Time point 4 charge enable - grid charging enable 64 | use_write_multiple: true 65 | modbus_controller_id: ${modbus_controller_id} 66 | name: sun12k-Time point 4 charge enable 67 | register_type: holding 68 | address: 175 69 | bitmask: 1 # 2 hvis man ønsker Gen charging enabel i sted for. 70 | entity_category: config 71 | icon: "mdi:toggle-switch" 72 | 73 | - platform: modbus_controller # Time point 5 charge enable - grid charging enable 74 | use_write_multiple: true 75 | modbus_controller_id: ${modbus_controller_id} 76 | name: sun12k-Time point 5 charge enable 77 | register_type: holding 78 | address: 176 79 | bitmask: 1 # 2 hvis man ønsker Gen charging enabel i sted for. 80 | entity_category: config 81 | icon: "mdi:toggle-switch" 82 | 83 | - platform: modbus_controller # Time point 6 charge enable - grid charging enable 84 | use_write_multiple: true 85 | modbus_controller_id: ${modbus_controller_id} 86 | name: sun12k-Time point 6 charge enable 87 | register_type: holding 88 | address: 177 89 | bitmask: 1 # 2 hvis man ønsker Gen charging enabel i sted for. 90 | entity_category: config 91 | icon: "mdi:toggle-switch" 92 | 93 | binary_sensor: 94 | - platform: modbus_controller 95 | modbus_controller_id: ${modbus_controller_id} 96 | name: sun12k-AC INV relay # bit 0 97 | id: sun12k_AC_INV_relay 98 | register_type: holding 99 | address: 552 100 | bitmask: 0x1 101 | 102 | - platform: modbus_controller 103 | modbus_controller_id: ${modbus_controller_id} 104 | name: sun12k-AC Load relay Reserved # bit 1 105 | id: sun12k_AC_Load_relay_Reserved 106 | register_type: holding 107 | address: 552 108 | bitmask: 0x2 109 | 110 | - platform: modbus_controller 111 | modbus_controller_id: ${modbus_controller_id} 112 | name: sun12k-AC grid relay # bit 2 113 | id: sun12k_AC_grid_relay 114 | register_type: holding 115 | address: 552 116 | bitmask: 0x4 117 | 118 | - platform: modbus_controller 119 | modbus_controller_id: ${modbus_controller_id} 120 | name: sun12k-AC Generator relay # bit 3 121 | id: sun12k_AC_Generator_relay 122 | register_type: holding 123 | address: 552 124 | bitmask: 0x8 125 | 126 | - platform: modbus_controller 127 | modbus_controller_id: ${modbus_controller_id} 128 | name: sun12k-Turn off/on status #The lower 4 bits represent the switch signal 129 | id: sun12k_Turn_off_on_status 130 | register_type: holding 131 | address: 551 132 | bitmask: 0x1 133 | 134 | text_sensor: 135 | - platform: modbus_controller 136 | modbus_controller_id: ${modbus_controller_id} 137 | id: sun12k_Running_Status 138 | bitmask: 0 139 | register_type: holding 140 | address: 500 141 | raw_encode: HEXBYTES 142 | name: sun12k-Running Status 143 | lambda: |- 144 | uint16_t value = modbus_controller::word_from_hex_str(x, 0); 145 | switch (value) { 146 | case 0: return std::string("standby"); 147 | case 1: return std::string("selfcheck"); 148 | case 2: return std::string("normal"); 149 | case 3: return std::string("alarm"); 150 | case 4: return std::string("fault"); 151 | default: return std::string("----"); 152 | } 153 | return x; 154 | 155 | number: 156 | - platform: modbus_controller 157 | use_write_multiple: true 158 | modbus_controller_id: ${modbus_controller_id} 159 | id: sun12k_Maximum_battery_charge_current 160 | name: "sun12k-Maximum battery charge current" 161 | address: 108 162 | unit_of_measurement: A 163 | value_type: U_WORD 164 | 165 | - platform: modbus_controller 166 | use_write_multiple: true 167 | modbus_controller_id: ${modbus_controller_id} 168 | id: sun12k_Maximum_battery_discharge_current 169 | name: "sun12k-Maximum battery discharge current" 170 | address: 109 171 | unit_of_measurement: A 172 | value_type: U_WORD 173 | 174 | - platform: modbus_controller 175 | use_write_multiple: true 176 | modbus_controller_id: ${modbus_controller_id} 177 | id: sun12k_Maximum_battery_grid_charge_current 178 | name: "sun12k-Maximum battery_grid charge current" 179 | address: 128 180 | unit_of_measurement: A 181 | value_type: U_WORD 182 | 183 | - platform: modbus_controller 184 | use_write_multiple: true 185 | modbus_controller_id: ${modbus_controller_id} 186 | id: sun12k_Time_point_1 187 | name: "sun12k-Time point 1 start" 188 | address: 148 189 | value_type: U_WORD 190 | 191 | - platform: modbus_controller 192 | use_write_multiple: true 193 | modbus_controller_id: ${modbus_controller_id} 194 | id: sun12k_Time_point_2 195 | name: "sun12k-Time point 2 start" 196 | address: 149 197 | value_type: U_WORD 198 | 199 | - platform: modbus_controller 200 | use_write_multiple: true 201 | modbus_controller_id: ${modbus_controller_id} 202 | id: sun12k_Time_point_3 203 | name: "sun12k-Time point 3 start" 204 | address: 150 205 | value_type: U_WORD 206 | 207 | - platform: modbus_controller 208 | use_write_multiple: true 209 | modbus_controller_id: ${modbus_controller_id} 210 | id: sun12k_Time_point_4 211 | name: "sun12k-Time point 4 start" 212 | address: 151 213 | value_type: U_WORD 214 | 215 | - platform: modbus_controller 216 | use_write_multiple: true 217 | modbus_controller_id: ${modbus_controller_id} 218 | id: sun12k_Time_point_5 219 | name: "sun12k-Time point 5 start" 220 | address: 152 221 | value_type: U_WORD 222 | 223 | - platform: modbus_controller 224 | use_write_multiple: true 225 | modbus_controller_id: ${modbus_controller_id} 226 | id: sun12k_Time_point_6 227 | name: "sun12k-Time point 6 start" 228 | address: 153 229 | value_type: U_WORD 230 | 231 | - platform: modbus_controller 232 | use_write_multiple: true 233 | modbus_controller_id: ${modbus_controller_id} 234 | id: sun12k_Time_point_1_power 235 | name: "sun12k-Time point 1 power" 236 | unit_of_measurement: W 237 | address: 154 238 | value_type: U_WORD 239 | 240 | - platform: modbus_controller 241 | use_write_multiple: true 242 | modbus_controller_id: ${modbus_controller_id} 243 | id: sun12k_Time_point_2_power 244 | name: "sun12k-Time point 2 power" 245 | unit_of_measurement: W 246 | address: 155 247 | value_type: U_WORD 248 | 249 | - platform: modbus_controller 250 | use_write_multiple: true 251 | modbus_controller_id: ${modbus_controller_id} 252 | id: sun12k_Time_point_3_power 253 | name: "sun12k-Time point 3 power" 254 | unit_of_measurement: W 255 | address: 156 256 | value_type: U_WORD 257 | 258 | - platform: modbus_controller 259 | use_write_multiple: true 260 | modbus_controller_id: ${modbus_controller_id} 261 | id: sun12k_Time_point_4_power 262 | name: "sun12k-Time point 4 power" 263 | unit_of_measurement: W 264 | address: 157 265 | value_type: U_WORD 266 | 267 | - platform: modbus_controller 268 | use_write_multiple: true 269 | modbus_controller_id: ${modbus_controller_id} 270 | id: sun12k_Time_point_5_power 271 | name: "sun12k-Time point 5 power" 272 | unit_of_measurement: W 273 | address: 158 274 | value_type: U_WORD 275 | 276 | - platform: modbus_controller 277 | use_write_multiple: true 278 | modbus_controller_id: ${modbus_controller_id} 279 | id: sun12k_Time_point_6_power 280 | name: "sun12k-Time point 6 power" 281 | unit_of_measurement: W 282 | address: 159 283 | value_type: U_WORD 284 | 285 | - platform: modbus_controller 286 | use_write_multiple: true 287 | modbus_controller_id: ${modbus_controller_id} 288 | id: sun12k_Time_point_1_capacity 289 | name: "sun12k-Time point 1 capacity" 290 | unit_of_measurement: "%" 291 | address: 166 292 | min_value: 0 293 | max_value: 100 294 | step: 5 295 | value_type: U_WORD 296 | 297 | - platform: modbus_controller 298 | use_write_multiple: true 299 | modbus_controller_id: ${modbus_controller_id} 300 | id: sun12k_Time_point_2_capacity 301 | name: "sun12k-Time point 2 capacity" 302 | unit_of_measurement: "%" 303 | address: 167 304 | min_value: 0 305 | max_value: 100 306 | step: 5 307 | value_type: U_WORD 308 | 309 | - platform: modbus_controller 310 | use_write_multiple: true 311 | modbus_controller_id: ${modbus_controller_id} 312 | id: sun12k_Time_point_3_capacity 313 | name: "sun12k-Time point 3 capacity" 314 | unit_of_measurement: "%" 315 | address: 168 316 | min_value: 0 317 | max_value: 100 318 | step: 5 319 | value_type: U_WORD 320 | 321 | - platform: modbus_controller 322 | use_write_multiple: true 323 | modbus_controller_id: ${modbus_controller_id} 324 | id: sun12k_Time_point_4_capacity 325 | name: "sun12k-Time point 4 capacity" 326 | unit_of_measurement: "%" 327 | address: 169 328 | min_value: 0 329 | max_value: 100 330 | step: 5 331 | value_type: U_WORD 332 | 333 | - platform: modbus_controller 334 | use_write_multiple: true 335 | modbus_controller_id: ${modbus_controller_id} 336 | id: sun12k_Time_point_5_capacity 337 | name: "sun12k-Time point 5 capacity" 338 | unit_of_measurement: "%" 339 | address: 170 340 | min_value: 0 341 | max_value: 100 342 | step: 5 343 | value_type: U_WORD 344 | 345 | - platform: modbus_controller 346 | use_write_multiple: true 347 | modbus_controller_id: ${modbus_controller_id} 348 | id: sun12k_Time_point_6_capacity 349 | name: "sun12k-Time point 6 capacity" 350 | unit_of_measurement: "%" 351 | address: 171 352 | min_value: 0 353 | max_value: 100 354 | value_type: U_WORD 355 | 356 | 357 | sensor: 358 | - platform: modbus_controller #sun12k-køleplade temeratur 359 | modbus_controller_id: ${modbus_controller_id} 360 | name: "sun12k-Heat sink temperature" 361 | id: sun12k_koleplade_temeratur 362 | register_type: holding 363 | address: 541 364 | unit_of_measurement: "°C" 365 | value_type: S_WORD 366 | accuracy_decimals: 2 367 | filters: 368 | - offset: -1000 369 | - multiply: 0.1 370 | 371 | - platform: modbus_controller #sun12k-load frequency 372 | modbus_controller_id: ${modbus_controller_id} 373 | name: "sun12k-load frequency" 374 | id: sun12k_load_frequency 375 | register_type: holding 376 | address: 655 377 | unit_of_measurement: "Hz" 378 | state_class: "measurement" 379 | accuracy_decimals: 2 380 | filters: 381 | - multiply: 0.01 382 | value_type: U_WORD 383 | 384 | - platform: modbus_controller #sun12k-inverter-frequency 385 | modbus_controller_id: ${modbus_controller_id} 386 | name: "sun12k-inverter-frequency" 387 | id: sun12k_inverter_frequency 388 | register_type: holding 389 | address: 638 390 | unit_of_measurement: "Hz" 391 | state_class: "measurement" 392 | accuracy_decimals: 2 393 | filters: 394 | - multiply: 0.01 395 | value_type: U_WORD 396 | 397 | - platform: modbus_controller 398 | modbus_controller_id: ${modbus_controller_id} 399 | name: "sun12k-PV1 Power" 400 | id: sun12k_PV1_Power 401 | register_type: holding 402 | address: 672 403 | unit_of_measurement: "W" 404 | state_class: "measurement" 405 | accuracy_decimals: 0 406 | value_type: U_WORD 407 | 408 | - platform: modbus_controller 409 | modbus_controller_id: ${modbus_controller_id} 410 | name: "sun12k-PV2 Power" 411 | id: sun12k_PV2_Power 412 | register_type: holding 413 | address: 673 414 | unit_of_measurement: "W" 415 | state_class: "measurement" 416 | accuracy_decimals: 0 417 | value_type: U_WORD 418 | 419 | - platform: modbus_controller 420 | modbus_controller_id: ${modbus_controller_id} 421 | name: "sun12k-PV1 Voltage" 422 | id: sun12k_PV1_Voltage 423 | register_type: holding 424 | address: 676 425 | unit_of_measurement: "V" 426 | state_class: "measurement" 427 | accuracy_decimals: 0 428 | filters: 429 | - multiply: 0.1 430 | value_type: U_WORD 431 | 432 | - platform: modbus_controller 433 | modbus_controller_id: ${modbus_controller_id} 434 | name: "sun12k-PV2 Voltage" 435 | id: sun12k_PV2_Voltage 436 | register_type: holding 437 | address: 678 438 | unit_of_measurement: "V" 439 | state_class: "measurement" 440 | accuracy_decimals: 0 441 | filters: 442 | - multiply: 0.1 443 | value_type: U_WORD 444 | 445 | - platform: modbus_controller 446 | modbus_controller_id: ${modbus_controller_id} 447 | name: "sun12k-PV1 Current" 448 | id: sun12k_PV1_Current 449 | register_type: holding 450 | address: 677 451 | unit_of_measurement: "A" 452 | state_class: "measurement" 453 | accuracy_decimals: 2 454 | filters: 455 | - multiply: 0.1 456 | value_type: U_WORD 457 | 458 | - platform: modbus_controller 459 | modbus_controller_id: ${modbus_controller_id} 460 | name: "sun12k-PV2 Current" 461 | id: sun12k_PV2_Current 462 | register_type: holding 463 | address: 679 464 | unit_of_measurement: "A" 465 | state_class: "measurement" 466 | accuracy_decimals: 2 467 | filters: 468 | - multiply: 0.1 469 | value_type: U_WORD 470 | 471 | - platform: modbus_controller 472 | modbus_controller_id: ${modbus_controller_id} 473 | name: "sun12k-Daily Production" 474 | id: sun12k_Daily_Production 475 | register_type: holding 476 | address: 529 477 | unit_of_measurement: "kWh" 478 | state_class: "total_increasing" 479 | device_class: energy 480 | accuracy_decimals: 1 481 | filters: 482 | - multiply: 0.1 483 | value_type: U_WORD 484 | 485 | - platform: modbus_controller 486 | modbus_controller_id: ${modbus_controller_id} 487 | name: "sun12k-Total PV Production" #Cumulative Production 488 | id: sun12k_Total_PV_Production 489 | register_type: holding 490 | address: 534 491 | unit_of_measurement: "kWh" 492 | state_class: "measurement" 493 | device_class: energy 494 | accuracy_decimals: 1 495 | value_type: U_DWORD_R 496 | filters: 497 | - multiply: 0.1 498 | 499 | - platform: modbus_controller 500 | modbus_controller_id: ${modbus_controller_id} 501 | name: "sun12k-Total Grid Power" # Grid side total power 502 | id: sun12k_Total_Grid_Power 503 | register_type: holding 504 | address: 625 505 | unit_of_measurement: "W" 506 | state_class: "measurement" 507 | accuracy_decimals: 0 508 | value_type: S_WORD 509 | 510 | - platform: modbus_controller 511 | modbus_controller_id: ${modbus_controller_id} 512 | name: "sun12k-Daily Energy Bought" 513 | id: sun12k_Daily_Energy_Bought 514 | register_type: holding 515 | address: 520 516 | unit_of_measurement: "kWh" 517 | state_class: "total_increasing" 518 | device_class: energy 519 | accuracy_decimals: 1 520 | value_type: U_WORD 521 | filters: 522 | - multiply: 0.1 523 | 524 | - platform: modbus_controller 525 | modbus_controller_id: ${modbus_controller_id} 526 | name: "sun12k-Daily Energy Sold" 527 | id: sun12k_Daily_Energy_Sold 528 | register_type: holding 529 | address: 521 530 | unit_of_measurement: "kWh" 531 | state_class: "total_increasing" 532 | device_class: energy 533 | accuracy_decimals: 1 534 | value_type: U_WORD 535 | filters: 536 | - multiply: 0.1 537 | 538 | - platform: modbus_controller 539 | modbus_controller_id: ${modbus_controller_id} 540 | name: "sun12k-Total Energy Bought" 541 | id: sun12k_Total_Energy_Bought 542 | register_type: holding 543 | address: 522 544 | unit_of_measurement: "kWh" 545 | state_class: "total_increasing" 546 | device_class: energy 547 | accuracy_decimals: 1 548 | value_type: U_WORD 549 | filters: 550 | - multiply: 0.1 551 | 552 | - platform: modbus_controller 553 | modbus_controller_id: ${modbus_controller_id} 554 | name: "sun12k-Total Energy Sold" 555 | id: sun12k_Total_Energy_Sold 556 | register_type: holding 557 | address: 524 558 | unit_of_measurement: "kWh" 559 | state_class: "total_increasing" 560 | device_class: energy 561 | accuracy_decimals: 1 562 | value_type: U_WORD 563 | filters: 564 | - multiply: 0.1 565 | 566 | - platform: modbus_controller #Total Consumption 567 | modbus_controller_id: ${modbus_controller_id} 568 | name: "sun12k-Total Consumption" 569 | id: sun12k_Total_Consumption 570 | register_type: holding 571 | address: 527 572 | unit_of_measurement: "kWh" 573 | state_class: "total_increasing" 574 | device_class: energy 575 | accuracy_decimals: 2 576 | value_type: U_DWORD_R 577 | filters: 578 | - multiply: 0.1 579 | 580 | - platform: modbus_controller 581 | modbus_controller_id: ${modbus_controller_id} 582 | name: "sun12k-active power generation of today" 583 | id: sun12k_active_power_generation_of_today 584 | register_type: holding 585 | address: 502 586 | unit_of_measurement: "kWh" 587 | state_class: "total_increasing" 588 | device_class: energy 589 | accuracy_decimals: 1 590 | value_type: S_WORD 591 | filters: 592 | - multiply: 0.1 593 | 594 | - platform: modbus_controller 595 | modbus_controller_id: ${modbus_controller_id} 596 | name: "sun12k-Grid Current L1" 597 | id: sun12k_Grid_Current_L1 598 | register_type: holding 599 | address: 630 600 | unit_of_measurement: "A" 601 | state_class: "measurement" 602 | accuracy_decimals: 1 603 | filters: 604 | - multiply: 0.01 605 | value_type: S_WORD 606 | 607 | - platform: modbus_controller 608 | modbus_controller_id: ${modbus_controller_id} 609 | name: "sun12k-Grid Current L2" 610 | id: sun12k_Grid_Current_L2 611 | register_type: holding 612 | address: 631 613 | unit_of_measurement: "A" 614 | state_class: "measurement" 615 | accuracy_decimals: 1 616 | filters: 617 | - multiply: 0.01 618 | value_type: S_WORD 619 | 620 | - platform: modbus_controller 621 | modbus_controller_id: ${modbus_controller_id} 622 | name: "sun12k-Grid Current L3" 623 | id: sun12k_Grid_Current_L3 624 | register_type: holding 625 | address: 632 626 | unit_of_measurement: "A" 627 | state_class: "measurement" 628 | accuracy_decimals: 1 629 | filters: 630 | - multiply: 0.01 631 | value_type: S_WORD 632 | 633 | - platform: modbus_controller 634 | modbus_controller_id: ${modbus_controller_id} 635 | name: "sun12k-Grid Voltage L1" 636 | id: sun12k_Grid_Voltage_L1 637 | register_type: holding 638 | address: 598 639 | unit_of_measurement: "V" 640 | state_class: "measurement" 641 | accuracy_decimals: 1 642 | filters: 643 | - multiply: 0.1 644 | value_type: U_WORD 645 | 646 | - platform: modbus_controller 647 | modbus_controller_id: ${modbus_controller_id} 648 | name: "sun12k-Grid Voltage L2" 649 | id: sun12k_Grid_Voltage_L2 650 | register_type: holding 651 | address: 599 652 | unit_of_measurement: "V" 653 | state_class: "measurement" 654 | accuracy_decimals: 1 655 | filters: 656 | - multiply: 0.1 657 | value_type: U_WORD 658 | 659 | - platform: modbus_controller 660 | modbus_controller_id: ${modbus_controller_id} 661 | name: "sun12k-Grid Voltage L3" 662 | id: sun12k_Grid_Voltage_L3 663 | register_type: holding 664 | address: 600 665 | unit_of_measurement: "V" 666 | state_class: "measurement" 667 | accuracy_decimals: 1 668 | filters: 669 | - multiply: 0.1 670 | value_type: U_WORD 671 | 672 | 673 | - platform: modbus_controller 674 | modbus_controller_id: ${modbus_controller_id} 675 | name: "sun12k-Internal CT L1 Power" 676 | id: sun12k_Internal_CT_L1_Power 677 | register_type: holding 678 | address: 604 679 | unit_of_measurement: "W" 680 | state_class: "measurement" 681 | accuracy_decimals: 0 682 | value_type: S_WORD 683 | 684 | - platform: modbus_controller 685 | modbus_controller_id: ${modbus_controller_id} 686 | name: "sun12k-Internal CT L2 Power" 687 | id: sun12k_Internal_CT_L2_Power 688 | register_type: holding 689 | address: 605 690 | unit_of_measurement: "W" 691 | state_class: "measurement" 692 | accuracy_decimals: 0 693 | value_type: S_WORD 694 | 695 | - platform: modbus_controller 696 | modbus_controller_id: ${modbus_controller_id} 697 | name: "sun12k-Internal CT L3 Power" 698 | id: sun12k_Internal_CT_L3_Power 699 | register_type: holding 700 | address: 606 701 | unit_of_measurement: "W" 702 | state_class: "measurement" 703 | accuracy_decimals: 0 704 | value_type: S_WORD 705 | 706 | - platform: modbus_controller # Grid internal - total active power 707 | modbus_controller_id: ${modbus_controller_id} 708 | name: "sun12k-Internal total Power" 709 | id: sun12k_Internal_total_Power 710 | register_type: holding 711 | address: 607 712 | unit_of_measurement: "W" 713 | state_class: "measurement" 714 | accuracy_decimals: 0 715 | value_type: S_WORD 716 | 717 | - platform: modbus_controller 718 | modbus_controller_id: ${modbus_controller_id} 719 | name: "sun12k-External CT L1 Power" 720 | id: sun12k_External_CT_L1_Power 721 | register_type: holding 722 | address: 616 723 | unit_of_measurement: "W" 724 | state_class: "measurement" 725 | accuracy_decimals: 0 726 | value_type: S_WORD 727 | 728 | - platform: modbus_controller 729 | modbus_controller_id: ${modbus_controller_id} 730 | name: "sun12k-External CT L2 Power" 731 | id: sun12k_External_CT_L2_Power 732 | register_type: holding 733 | address: 617 734 | unit_of_measurement: "W" 735 | state_class: "measurement" 736 | accuracy_decimals: 0 737 | value_type: S_WORD 738 | 739 | - platform: modbus_controller 740 | modbus_controller_id: ${modbus_controller_id} 741 | name: "sun12k-External CT L3 Power" 742 | id: sun12k_External_CT_L3_Power 743 | register_type: holding 744 | address: 618 745 | unit_of_measurement: "W" 746 | state_class: "measurement" 747 | accuracy_decimals: 0 748 | value_type: S_WORD 749 | 750 | - platform: modbus_controller 751 | modbus_controller_id: ${modbus_controller_id} 752 | name: "sun12k-Out-of-grid–total power" 753 | id: sun12k_out_of_grid_total_power 754 | register_type: holding 755 | address: 619 756 | unit_of_measurement: "W" 757 | state_class: "measurement" 758 | accuracy_decimals: 0 759 | value_type: S_WORD 760 | 761 | - platform: modbus_controller # Load totalpower 762 | modbus_controller_id: ${modbus_controller_id} 763 | name: "sun12k-Load totalpower" 764 | id: sun12k_Load_totalpower 765 | register_type: holding 766 | address: 653 767 | unit_of_measurement: "W" 768 | state_class: "measurement" 769 | accuracy_decimals: 0 770 | value_type: S_WORD 771 | 772 | - platform: modbus_controller 773 | modbus_controller_id: ${modbus_controller_id} 774 | name: "sun12k-Warning1" 775 | id: sun12k_Warning1 776 | register_type: holding 777 | address: 553 778 | accuracy_decimals: 0 779 | value_type: U_WORD 780 | 781 | - platform: modbus_controller 782 | modbus_controller_id: ${modbus_controller_id} 783 | name: "sun12k-Warning2" 784 | id: sun12k_Warning2 785 | register_type: holding 786 | address: 554 787 | accuracy_decimals: 0 788 | value_type: U_WORD 789 | 790 | - platform: modbus_controller 791 | modbus_controller_id: ${modbus_controller_id} 792 | name: "sun12k-Warning3" 793 | id: sun12k_Warning3 794 | register_type: holding 795 | address: 555 796 | accuracy_decimals: 0 797 | value_type: U_WORD 798 | 799 | - platform: modbus_controller 800 | modbus_controller_id: ${modbus_controller_id} 801 | name: "sun12k-Error1" 802 | id: sun12k_Error1 803 | register_type: holding 804 | address: 556 805 | accuracy_decimals: 0 806 | value_type: U_WORD 807 | 808 | - platform: modbus_controller 809 | modbus_controller_id: ${modbus_controller_id} 810 | name: "sun12k-Error2" 811 | id: sun12k_Error2 812 | register_type: holding 813 | address: 557 814 | accuracy_decimals: 0 815 | value_type: U_WORD 816 | 817 | - platform: modbus_controller 818 | modbus_controller_id: ${modbus_controller_id} 819 | name: "sun12k-Error3" 820 | id: sun12k_Error3 821 | register_type: holding 822 | address: 558 823 | accuracy_decimals: 0 824 | value_type: U_WORD 825 | 826 | - platform: modbus_controller 827 | modbus_controller_id: ${modbus_controller_id} 828 | name: "sun12k-Failure status of communication board" 829 | id: sun12k_Failure_status_of_communication_board 830 | register_type: holding 831 | address: 548 832 | accuracy_decimals: 0 833 | value_type: U_WORD 834 | 835 | - platform: modbus_controller 836 | modbus_controller_id: ${modbus_controller_id} 837 | name: "sun12k-Minimum insulation impedance" 838 | id: sun12k_Minimum_insulation_impedance 839 | register_type: holding 840 | unit_of_measurement: "kΩ" 841 | state_class: "measurement" 842 | address: 65 843 | accuracy_decimals: 0 844 | value_type: U_WORD 845 | filters: 846 | - multiply: 0.1 847 | 848 | # Batteri 849 | 850 | - platform: modbus_controller 851 | modbus_controller_id: ${modbus_controller_id} 852 | name: "sun12k-Today charge of the battery" 853 | id: sun12k_Today_charge_of_the_battery 854 | register_type: holding 855 | address: 514 856 | unit_of_measurement: "kWh" 857 | state_class: "total_increasing" 858 | device_class: energy 859 | accuracy_decimals: 1 860 | value_type: U_WORD 861 | filters: 862 | - multiply: 0.1 863 | 864 | - platform: modbus_controller 865 | modbus_controller_id: ${modbus_controller_id} 866 | name: "sun12k-Today discharge of the battery" 867 | id: sun12k_Today_discharge_of_the_battery 868 | register_type: holding 869 | address: 515 870 | unit_of_measurement: "kWh" 871 | state_class: "total_increasing" 872 | device_class: energy 873 | accuracy_decimals: 1 874 | value_type: U_WORD 875 | filters: 876 | - multiply: 0.1 877 | 878 | - platform: modbus_controller 879 | modbus_controller_id: ${modbus_controller_id} 880 | name: "sun12k-Total charge of the battery" 881 | id: sun12k_battery_total_charge 882 | register_type: holding 883 | address: 516 884 | unit_of_measurement: "kWh" 885 | state_class: "total_increasing" 886 | device_class: energy 887 | accuracy_decimals: 1 888 | value_type: U_DWORD_R 889 | filters: 890 | - multiply: 0.1 891 | 892 | - platform: modbus_controller 893 | modbus_controller_id: ${modbus_controller_id} 894 | name: "sun12k-Total discharge of the battery" 895 | id: sun12k_battery_total_discharge 896 | register_type: holding 897 | address: 518 898 | unit_of_measurement: "kWh" 899 | state_class: "total_increasing" 900 | device_class: energy 901 | accuracy_decimals: 1 902 | value_type: U_DWORD_R 903 | filters: 904 | - multiply: 0.1 905 | 906 | - platform: modbus_controller 907 | modbus_controller_id: ${modbus_controller_id} 908 | name: "sun12k-battery temperature" 909 | id: sun12k_battery_temperature 910 | register_type: holding 911 | address: 586 912 | unit_of_measurement: "°C" 913 | accuracy_decimals: 1 914 | value_type: U_WORD 915 | filters: 916 | - offset: -1000 917 | - multiply: 0.1 918 | 919 | - platform: modbus_controller 920 | modbus_controller_id: ${modbus_controller_id} 921 | name: "sun12k-battery voltage" 922 | id: sun12k_battery_voltage 923 | register_type: holding 924 | address: 587 925 | unit_of_measurement: "V" 926 | state_class: "measurement" 927 | accuracy_decimals: 2 928 | filters: 929 | - multiply: 0.01 930 | value_type: U_WORD 931 | 932 | - platform: modbus_controller 933 | modbus_controller_id: ${modbus_controller_id} 934 | name: "sun12k-battery capacity" 935 | id: sun12k_battery_capacity 936 | register_type: holding 937 | address: 588 938 | unit_of_measurement: "%" 939 | state_class: "measurement" 940 | accuracy_decimals: 1 941 | value_type: U_WORD 942 | 943 | - platform: modbus_controller 944 | modbus_controller_id: ${modbus_controller_id} 945 | name: "sun12k-Battery output power" 946 | id: sun12k_Battery_output_power 947 | register_type: holding 948 | address: 590 949 | unit_of_measurement: "W" 950 | state_class: "measurement" 951 | accuracy_decimals: 0 952 | value_type: S_WORD 953 | 954 | - platform: modbus_controller 955 | modbus_controller_id: ${modbus_controller_id} 956 | name: "sun12k-Battery output current" 957 | id: sun12k_Battery_output_current 958 | register_type: holding 959 | address: 591 960 | unit_of_measurement: "A" 961 | state_class: "measurement" 962 | accuracy_decimals: 2 963 | filters: 964 | - multiply: 0.01 965 | value_type: S_WORD 966 | 967 | - platform: modbus_controller 968 | modbus_controller_id: ${modbus_controller_id} 969 | name: "sun12k-The corrected capacity of the battery" 970 | id: sun12k_The_corrected_capacity_of_the_battery 971 | register_type: holding 972 | address: 592 973 | unit_of_measurement: "Ah" 974 | state_class: "measurement" 975 | accuracy_decimals: 0 976 | value_type: U_WORD 977 | -------------------------------------------------------------------------------- /ESPHome Configs/ESPHome-3P-Sunsynk-Deye.yaml: -------------------------------------------------------------------------------- 1 | ##########################WARNING HAS NOT BEEN TESTED USE AT YOUR OWN RISK ######################################## 2 | # Based on https://github.com/kellerza/sunsynk/blob/main/src/sunsynk/definitions3ph.py 3 | # 4 | substitutions: 5 | settings_skipped_updates: "30" 6 | devicename: sunsynk 7 | device_description: "Sunsynk RS485 Logger" 8 | friendly_name: "SunSynk" 9 | 10 | esphome: 11 | name: $devicename 12 | comment: '${device_description}' 13 | 14 | esp32: 15 | board: nodemcu-32s 16 | framework: 17 | type: arduino 18 | 19 | # Enable logging 20 | logger: 21 | baud_rate: 0 22 | 23 | # Enable Home Assistant API 24 | api: 25 | encryption: 26 | key: !secret api_encryption_key 27 | 28 | ota: 29 | password: !secret ota_password_sunsynk 30 | platform: esphome 31 | 32 | wifi: 33 | ssid: !secret wifi_ssid 34 | password: !secret wifi_password 35 | 36 | # Enable fallback hotspot (captive portal) in case wifi connection fails 37 | ap: 38 | ssid: '${devicename}' 39 | password: !secret fallback_password 40 | 41 | fast_connect: true 42 | power_save_mode: none 43 | 44 | captive_portal: 45 | 46 | # Enable time component to reset energy at midnight 47 | # https://esphome.io/components/time.html#home-assistant-time-source 48 | time: 49 | - platform: homeassistant 50 | id: homeassistant_time 51 | 52 | uart: 53 | id: mod_bus 54 | tx_pin: GPIO1 55 | rx_pin: GPIO3 56 | baud_rate: 9600 57 | stop_bits: 1 58 | 59 | modbus: 60 | id: sunsynk_modbus 61 | flow_control_pin: GPIO16 62 | 63 | modbus_controller: 64 | - id: sunsynk 65 | address: 0x01 66 | modbus_id: sunsynk_modbus 67 | setup_priority: -10 68 | update_interval: "15s" 69 | command_throttle: "50ms" 70 | 71 | ############################################### BINARY SENSORS ######################################## 72 | binary_sensor: 73 | - platform: modbus_controller # 552 Grid Connected Status 74 | modbus_controller_id: sunsynk 75 | name: "${friendly_name} Grid Connected Status" 76 | id: sunsynk_esphome_grid_connected_status 77 | register_type: holding 78 | address: 552 79 | 80 | # SENSORS # 81 | ####################################################################################################### 82 | 83 | ############################################### BATTERY ############################################### 84 | sensor: 85 | - platform: modbus_controller # 586 Battery Temperature 86 | modbus_controller_id: sunsynk 87 | name: "${friendly_name} Battery Temperature" 88 | id: sunsynk_esphome_battery_temperature 89 | register_type: holding 90 | address: 586 91 | unit_of_measurement: "°C" 92 | accuracy_decimals: 1 93 | device_class: temperature 94 | state_class: measurement 95 | value_type: U_WORD 96 | filters: 97 | - offset: -1000 98 | - multiply: 0.1 99 | 100 | - platform: modbus_controller # 587 Battery Voltage 101 | modbus_controller_id: sunsynk 102 | name: "${friendly_name} Battery Voltage" 103 | id: sunsynk_esphome_battery_voltage 104 | register_type: holding 105 | address: 587 106 | unit_of_measurement: "V" 107 | accuracy_decimals: 1 108 | device_class: voltage 109 | state_class: measurement 110 | filters: 111 | - multiply: 0.01 112 | value_type: U_WORD 113 | 114 | - platform: modbus_controller # 588 Battery SOC 115 | modbus_controller_id: sunsynk 116 | name: "${friendly_name} Battery SOC" 117 | id: sunsynk_esphome_battery_soc 118 | register_type: holding 119 | address: 588 120 | unit_of_measurement: "%" 121 | accuracy_decimals: 0 122 | device_class: battery 123 | value_type: U_WORD 124 | 125 | - platform: modbus_controller # 590 Battery Power 126 | modbus_controller_id: sunsynk 127 | name: "${friendly_name} Battery Power" 128 | id: sunsynk_esphome_battery_power 129 | register_type: holding 130 | address: 590 131 | unit_of_measurement: "W" 132 | accuracy_decimals: 0 133 | device_class: power 134 | value_type: S_WORD 135 | 136 | - platform: modbus_controller # 591 Battery Current 137 | modbus_controller_id: sunsynk 138 | name: "${friendly_name} Battery Current" 139 | id: sunsynk_esphome_battery_current 140 | register_type: holding 141 | address: 591 142 | unit_of_measurement: "A" 143 | accuracy_decimals: 1 144 | device_class: current 145 | state_class: measurement 146 | value_type: S_WORD 147 | filters: 148 | - multiply: 0.01 149 | 150 | - platform: modbus_controller # 115 Battery Capacity Shutdown 151 | modbus_controller_id: sunsynk 152 | name: "${friendly_name} Battery Capacity Shutdown" 153 | id: sunsynk_esphome_battery_capacity_shutdown 154 | register_type: holding 155 | address: 115 156 | unit_of_measurement: "%" 157 | accuracy_decimals: 0 158 | device_class: battery 159 | 160 | ############################################### INVERTER ############################################## 161 | 162 | - platform: modbus_controller # 636 Inverter Power 163 | modbus_controller_id: sunsynk 164 | name: "${friendly_name} Inverter Power" 165 | id: sunsynk_esphome_inverter_power 166 | register_type: holding 167 | address: 636 168 | unit_of_measurement: "W" 169 | accuracy_decimals: 0 170 | device_class: power 171 | value_type: S_WORD 172 | 173 | - platform: modbus_controller # 633 Inverter L1 Power 174 | modbus_controller_id: sunsynk 175 | name: "${friendly_name} Inverter L1 Power" 176 | id: sunsynk_esphome_inverter_L1_power 177 | register_type: holding 178 | address: 633 179 | unit_of_measurement: "W" 180 | accuracy_decimals: 0 181 | device_class: power 182 | value_type: S_WORD 183 | 184 | - platform: modbus_controller # 634 Inverter L2 Power 185 | modbus_controller_id: sunsynk 186 | name: "${friendly_name} Inverter L2 Power" 187 | id: sunsynk_esphome_inverter_L2_power 188 | register_type: holding 189 | address: 634 190 | unit_of_measurement: "W" 191 | accuracy_decimals: 0 192 | device_class: power 193 | value_type: S_WORD 194 | 195 | - platform: modbus_controller # 635 Inverter L3 Power 196 | modbus_controller_id: sunsynk 197 | name: "${friendly_name} Inverter L3 Power" 198 | id: sunsynk_esphome_inverter_L3_power 199 | register_type: holding 200 | address: 635 201 | unit_of_measurement: "W" 202 | accuracy_decimals: 0 203 | device_class: power 204 | value_type: S_WORD 205 | 206 | - platform: modbus_controller # 627 Inverter Voltage 207 | modbus_controller_id: sunsynk 208 | name: "${friendly_name} Inverter Voltage" 209 | id: sunsynk_esphome_inverter_voltage 210 | register_type: holding 211 | address: 627 212 | unit_of_measurement: "V" 213 | accuracy_decimals: 1 214 | device_class: voltage 215 | state_class: measurement 216 | filters: 217 | - multiply: 0.1 218 | value_type: U_WORD 219 | 220 | - platform: modbus_controller # 638 Inverter Frequency 221 | modbus_controller_id: sunsynk 222 | name: "${friendly_name} Inverter Frequency" 223 | id: sunsynk_esphome_inverter_frequency 224 | register_type: holding 225 | address: 638 226 | unit_of_measurement: "Hz" 227 | accuracy_decimals: 2 228 | filters: 229 | - multiply: 0.01 230 | value_type: U_WORD 231 | state_class: measurement 232 | 233 | ############################################### GRID ################################################## 234 | 235 | - platform: modbus_controller # 609 Grid Frequency 236 | modbus_controller_id: sunsynk 237 | name: "${friendly_name} Grid Frequency" 238 | id: sunsynk_esphome_grid_frequency 239 | register_type: holding 240 | address: 609 241 | unit_of_measurement: "Hz" 242 | accuracy_decimals: 2 243 | filters: 244 | - multiply: 0.01 245 | value_type: U_WORD 246 | state_class: measurement 247 | 248 | - platform: modbus_controller # 625 Grid Power 249 | modbus_controller_id: sunsynk 250 | name: "${friendly_name} Grid Power" 251 | id: sunsynk_esphome_grid_power 252 | register_type: holding 253 | address: 625 254 | unit_of_measurement: "W" 255 | accuracy_decimals: 0 256 | device_class: power 257 | state_class: measurement 258 | value_type: S_WORD 259 | 260 | - platform: modbus_controller # 622 Grid L1 Power 261 | modbus_controller_id: sunsynk 262 | name: "${friendly_name} Grid L1 Power" 263 | id: sunsynk_esphome_grid_power_L1 264 | register_type: holding 265 | address: 622 266 | unit_of_measurement: "W" 267 | accuracy_decimals: 0 268 | device_class: power 269 | state_class: measurement 270 | value_type: S_WORD 271 | 272 | - platform: modbus_controller # 623 Grid L2 Power 273 | modbus_controller_id: sunsynk 274 | name: "${friendly_name} Grid L2 Power" 275 | id: sunsynk_esphome_grid_power_L2 276 | register_type: holding 277 | address: 623 278 | unit_of_measurement: "W" 279 | accuracy_decimals: 0 280 | device_class: power 281 | state_class: measurement 282 | value_type: S_WORD 283 | 284 | - platform: modbus_controller # 624 Grid L3 Power 285 | modbus_controller_id: sunsynk 286 | name: "${friendly_name} Grid L3 Power" 287 | id: sunsynk_esphome_grid_power_L3 288 | register_type: holding 289 | address: 624 290 | unit_of_measurement: "W" 291 | accuracy_decimals: 0 292 | device_class: power 293 | state_class: measurement 294 | value_type: S_WORD 295 | 296 | - platform: modbus_controller # 600 Grid Voltage 297 | modbus_controller_id: sunsynk 298 | name: "${friendly_name} Grid Voltage" 299 | id: sunsynk_esphome_grid_voltage 300 | register_type: holding 301 | address: 600 302 | unit_of_measurement: "V" 303 | accuracy_decimals: 1 304 | device_class: voltage 305 | state_class: measurement 306 | filters: 307 | - multiply: 0.1 308 | value_type: U_WORD 309 | 310 | - platform: modbus_controller # 610 Grid L1 Current 311 | modbus_controller_id: sunsynk 312 | name: "${friendly_name} Grid L1 Current" 313 | id: sunsynk_esphome_grid_current_L1 314 | register_type: holding 315 | address: 610 316 | unit_of_measurement: "A" 317 | accuracy_decimals: 1 318 | device_class: current 319 | state_class: measurement 320 | value_type: S_WORD 321 | filters: 322 | - multiply: 0.01 323 | 324 | - platform: modbus_controller # 611 Grid L2 Current 325 | modbus_controller_id: sunsynk 326 | name: "${friendly_name} Grid L2 Current" 327 | id: sunsynk_esphome_grid_current_L2 328 | register_type: holding 329 | address: 611 330 | unit_of_measurement: "A" 331 | accuracy_decimals: 1 332 | device_class: current 333 | state_class: measurement 334 | value_type: S_WORD 335 | filters: 336 | - multiply: 0.01 337 | 338 | - platform: modbus_controller # 612 Grid L3 Current 339 | modbus_controller_id: sunsynk 340 | name: "${friendly_name} Grid L3 Current" 341 | id: sunsynk_esphome_grid_current_L3 342 | register_type: holding 343 | address: 612 344 | unit_of_measurement: "A" 345 | accuracy_decimals: 1 346 | device_class: current 347 | state_class: measurement 348 | value_type: S_WORD 349 | filters: 350 | - multiply: 0.01 351 | 352 | - platform: modbus_controller # 619 Grid CT Power 353 | modbus_controller_id: sunsynk 354 | name: "${friendly_name} Grid CT Power" 355 | id: sunsynk_esphome_grid_ct_power 356 | register_type: holding 357 | address: 619 358 | unit_of_measurement: "W" 359 | accuracy_decimals: 0 360 | device_class: power 361 | state_class: measurement 362 | value_type: S_WORD 363 | 364 | ############################################### LOAD ################################################ 365 | 366 | - platform: modbus_controller # 653 Load Power 367 | modbus_controller_id: sunsynk 368 | name: "${friendly_name} Load Power" 369 | id: sunsynk_esphome_load_power 370 | register_type: holding 371 | address: 653 372 | unit_of_measurement: "W" 373 | accuracy_decimals: 0 374 | device_class: power 375 | state_class: measurement 376 | value_type: S_WORD 377 | 378 | - platform: modbus_controller # 650 Load L1 Power 379 | modbus_controller_id: sunsynk 380 | name: "${friendly_name} Load L1 Power" 381 | id: sunsynk_esphome_load_l1_power 382 | register_type: holding 383 | address: 650 384 | unit_of_measurement: "W" 385 | accuracy_decimals: 0 386 | device_class: power 387 | state_class: measurement 388 | value_type: S_WORD 389 | 390 | - platform: modbus_controller # 651 Load L2 Power 391 | modbus_controller_id: sunsynk 392 | name: "${friendly_name} Load L2 Power" 393 | id: sunsynk_esphome_load_l2_power 394 | register_type: holding 395 | address: 651 396 | unit_of_measurement: "W" 397 | accuracy_decimals: 0 398 | device_class: power 399 | state_class: measurement 400 | value_type: S_WORD 401 | 402 | - platform: modbus_controller # 651 Load L3 Power 403 | modbus_controller_id: sunsynk 404 | name: "${friendly_name} Load L3 Power" 405 | id: sunsynk_esphome_load_l3_power 406 | register_type: holding 407 | address: 652 408 | unit_of_measurement: "W" 409 | accuracy_decimals: 0 410 | device_class: power 411 | state_class: measurement 412 | value_type: S_WORD 413 | 414 | ############################################### SOLAR PV1 ############################################# 415 | 416 | - platform: modbus_controller # 672 PV1 Power 417 | modbus_controller_id: sunsynk 418 | name: "${friendly_name} PV1 Power" 419 | id: sunsynk_esphome_pv1_power 420 | register_type: holding 421 | address: 672 422 | unit_of_measurement: "W" 423 | accuracy_decimals: 0 424 | device_class: power 425 | state_class: measurement 426 | value_type: U_WORD 427 | 428 | - platform: modbus_controller # 676 PV1 Voltage 429 | modbus_controller_id: sunsynk 430 | name: "${friendly_name} PV1 Voltage" 431 | id: sunsynk_esphome_pv1_voltage 432 | register_type: holding 433 | address: 676 434 | unit_of_measurement: "V" 435 | device_class: voltage 436 | state_class: measurement 437 | accuracy_decimals: 1 438 | filters: 439 | - multiply: 0.1 440 | value_type: U_WORD 441 | 442 | - platform: modbus_controller # 677 PV1 Current 443 | modbus_controller_id: sunsynk 444 | name: "${friendly_name} PV1 Current" 445 | id: sunsynk_esphome_pv1_current 446 | register_type: holding 447 | address: 677 448 | unit_of_measurement: "A" 449 | accuracy_decimals: 1 450 | device_class: current 451 | state_class: measurement 452 | filters: 453 | - multiply: 0.1 454 | value_type: U_WORD 455 | 456 | ############################################### SOLAR PV2 ############################################# 457 | 458 | - platform: modbus_controller # 673 PV2 Power 459 | modbus_controller_id: sunsynk 460 | name: "${friendly_name} PV2 Power" 461 | id: sunsynk_esphome_pv2_power 462 | register_type: holding 463 | address: 673 464 | unit_of_measurement: "W" 465 | accuracy_decimals: 0 466 | device_class: power 467 | state_class: measurement 468 | value_type: U_WORD 469 | 470 | - platform: modbus_controller # 678 PV2 Voltage 471 | modbus_controller_id: sunsynk 472 | name: "${friendly_name} PV2 Voltage" 473 | id: sunsynk_esphome_pv2_voltage 474 | register_type: holding 475 | address: 678 476 | unit_of_measurement: "V" 477 | accuracy_decimals: 1 478 | filters: 479 | - multiply: 0.1 480 | device_class: voltage 481 | state_class: measurement 482 | value_type: U_WORD 483 | 484 | - platform: modbus_controller # 679 PV2 Current 485 | modbus_controller_id: sunsynk 486 | name: "${friendly_name} PV2 Current" 487 | id: sunsynk_esphome_pv2_current 488 | register_type: holding 489 | address: 679 490 | unit_of_measurement: "A" 491 | accuracy_decimals: 1 492 | device_class: current 493 | state_class: measurement 494 | filters: 495 | - multiply: 0.1 496 | value_type: U_WORD 497 | 498 | ############################################### SOLAR PV3 ############################################# 499 | 500 | - platform: modbus_controller # 674 PV3 Power 501 | modbus_controller_id: sunsynk 502 | name: "${friendly_name} PV3 Power" 503 | id: sunsynk_esphome_pv3_power 504 | register_type: holding 505 | address: 674 506 | unit_of_measurement: "W" 507 | accuracy_decimals: 0 508 | device_class: power 509 | state_class: measurement 510 | value_type: U_WORD 511 | 512 | - platform: modbus_controller # 680 PV3 Voltage 513 | modbus_controller_id: sunsynk 514 | name: "${friendly_name} PV3 Voltage" 515 | id: sunsynk_esphome_pv3_voltage 516 | register_type: holding 517 | address: 680 518 | unit_of_measurement: "V" 519 | accuracy_decimals: 1 520 | filters: 521 | - multiply: 0.1 522 | device_class: voltage 523 | state_class: measurement 524 | value_type: U_WORD 525 | 526 | - platform: modbus_controller # 681 PV3 Current 527 | modbus_controller_id: sunsynk 528 | name: "${friendly_name} PV3 Current" 529 | id: sunsynk_esphome_pv3_current 530 | register_type: holding 531 | address: 681 532 | unit_of_measurement: "A" 533 | accuracy_decimals: 1 534 | device_class: current 535 | state_class: measurement 536 | filters: 537 | - multiply: 0.1 538 | value_type: U_WORD 539 | 540 | ############################################### SOLAR PV4 ############################################# 541 | 542 | - platform: modbus_controller # 675 PV4 Power 543 | modbus_controller_id: sunsynk 544 | name: "${friendly_name} PV4 Power" 545 | id: sunsynk_esphome_pv4_power 546 | register_type: holding 547 | address: 675 548 | unit_of_measurement: "W" 549 | accuracy_decimals: 0 550 | device_class: power 551 | state_class: measurement 552 | value_type: U_WORD 553 | 554 | - platform: modbus_controller # 682 PV4 Voltage 555 | modbus_controller_id: sunsynk 556 | name: "${friendly_name} PV4 Voltage" 557 | id: sunsynk_esphome_pv4_voltage 558 | register_type: holding 559 | address: 682 560 | unit_of_measurement: "V" 561 | accuracy_decimals: 1 562 | filters: 563 | - multiply: 0.1 564 | device_class: voltage 565 | state_class: measurement 566 | value_type: U_WORD 567 | 568 | - platform: modbus_controller # 683 PV4 Current 569 | modbus_controller_id: sunsynk 570 | name: "${friendly_name} PV4 Current" 571 | id: sunsynk_esphome_pv4_current 572 | register_type: holding 573 | address: 683 574 | unit_of_measurement: "A" 575 | accuracy_decimals: 1 576 | device_class: current 577 | state_class: measurement 578 | filters: 579 | - multiply: 0.1 580 | value_type: U_WORD 581 | 582 | ############################################### SOLAR TOTAL ########################################### 583 | 584 | - platform: template # Sum of PV1 and PV2 to get total PV Power 585 | name: "${friendly_name} Solar Power" 586 | unit_of_measurement: "W" 587 | accuracy_decimals: 0 588 | device_class: power 589 | state_class: measurement 590 | lambda: |- 591 | return (id(sunsynk_esphome_pv1_power).state + id(sunsynk_esphome_pv2_power).state + id(sunsynk_esphome_pv3_power).state + id(sunsynk_esphome_pv4_power).state); 592 | update_interval: 5s 593 | 594 | ############################################### OUTPUTS ############################################### 595 | 596 | - platform: modbus_controller # 667 Gen Power 597 | modbus_controller_id: sunsynk 598 | name: "${friendly_name} Gen Power" 599 | id: sunsynk_esphome_gen_power 600 | register_type: holding 601 | address: 667 602 | unit_of_measurement: "W" 603 | accuracy_decimals: 0 604 | device_class: power 605 | state_class: measurement 606 | value_type: S_WORD 607 | 608 | - platform: modbus_controller # 664 Gen L1 Power 609 | modbus_controller_id: sunsynk 610 | name: "${friendly_name} Gen L1 Power" 611 | id: sunsynk_esphome_gen_l1_power 612 | register_type: holding 613 | address: 664 614 | unit_of_measurement: "W" 615 | accuracy_decimals: 0 616 | device_class: power 617 | state_class: measurement 618 | value_type: S_WORD 619 | 620 | - platform: modbus_controller # 665 Gen L2 Power 621 | modbus_controller_id: sunsynk 622 | name: "${friendly_name} Gen L2 Power" 623 | id: sunsynk_esphome_gen_l2_power 624 | register_type: holding 625 | address: 665 626 | unit_of_measurement: "W" 627 | accuracy_decimals: 0 628 | device_class: power 629 | state_class: measurement 630 | value_type: S_WORD 631 | 632 | - platform: modbus_controller # 666 Gen L3 Power 633 | modbus_controller_id: sunsynk 634 | name: "${friendly_name} Gen L3 Power" 635 | id: sunsynk_esphome_gen_L3_power 636 | register_type: holding 637 | address: 666 638 | unit_of_measurement: "W" 639 | accuracy_decimals: 0 640 | device_class: power 641 | state_class: measurement 642 | value_type: S_WORD 643 | 644 | ############################################### ENERGY ################################################ 645 | 646 | - platform: modbus_controller # 514 Day Battery Charge 647 | modbus_controller_id: sunsynk 648 | name: "${friendly_name} Day Battery Charge" 649 | id: sunsynk_esphome_day_battery_charge 650 | register_type: holding 651 | address: 514 652 | unit_of_measurement: "kWh" 653 | accuracy_decimals: 1 654 | device_class: energy 655 | state_class: total_increasing 656 | value_type: U_WORD 657 | filters: 658 | - multiply: 0.1 659 | 660 | - platform: modbus_controller # 515 Day Battery Discharge 661 | modbus_controller_id: sunsynk 662 | name: "${friendly_name} Day Battery Discharge" 663 | id: sunsynk_esphome_day_battery_discharge 664 | register_type: holding 665 | address: 515 666 | unit_of_measurement: "kWh" 667 | accuracy_decimals: 1 668 | device_class: energy 669 | state_class: total_increasing 670 | value_type: U_WORD 671 | filters: 672 | - multiply: 0.1 673 | 674 | - platform: modbus_controller # 516 Total Battery Charge 675 | modbus_controller_id: sunsynk 676 | name: "${friendly_name} Total Battery Charge" 677 | id: sunsynk_esphome_total_battery_charge 678 | register_type: holding 679 | address: 516 680 | unit_of_measurement: "kWh" 681 | accuracy_decimals: 1 682 | device_class: energy 683 | state_class: total_increasing 684 | value_type: U_DWORD_R 685 | filters: 686 | - multiply: 0.1 687 | 688 | - platform: modbus_controller # 518 Total Battery Discharge 689 | modbus_controller_id: sunsynk 690 | name: "${friendly_name} Total Battery Discharge" 691 | id: sunsynk_esphome_total_battery_discharge 692 | register_type: holding 693 | address: 518 694 | unit_of_measurement: "kWh" 695 | accuracy_decimals: 0 696 | device_class: energy 697 | state_class: total_increasing 698 | value_type: U_DWORD_R 699 | filters: 700 | - multiply: 0.1 701 | 702 | - platform: modbus_controller # 520 Day Grid Import 703 | modbus_controller_id: sunsynk 704 | name: "${friendly_name} Day Grid Import" 705 | id: sunsynk_esphome_day_grid_import 706 | register_type: holding 707 | address: 520 708 | unit_of_measurement: "kWh" 709 | accuracy_decimals: 1 710 | device_class: energy 711 | state_class: total_increasing 712 | value_type: U_WORD 713 | filters: 714 | - multiply: 0.1 715 | 716 | - platform: modbus_controller # 521 Day Grid Export 717 | modbus_controller_id: sunsynk 718 | name: "${friendly_name} Day Grid Export" 719 | id: sunsynk_esphome_day_grid_export 720 | register_type: holding 721 | address: 521 722 | unit_of_measurement: "kWh" 723 | accuracy_decimals: 1 724 | device_class: energy 725 | state_class: total_increasing 726 | value_type: U_WORD 727 | filters: 728 | - multiply: 0.1 729 | 730 | - platform: modbus_controller # 522 Total Grid Import 731 | modbus_controller_id: sunsynk 732 | name: "${friendly_name} Total Grid Import" 733 | id: sunsynk_esphome_total_grid_import 734 | register_type: holding 735 | address: 522 736 | unit_of_measurement: "kWh" 737 | accuracy_decimals: 2 738 | device_class: energy 739 | state_class: total_increasing 740 | value_type: U_WORD 741 | filters: 742 | - multiply: 0.1 743 | 744 | - platform: modbus_controller # 524 Total Grid Export 745 | modbus_controller_id: sunsynk 746 | name: "${friendly_name} Total Grid Export" 747 | id: sunsynk_esphome_total_grid_export 748 | register_type: holding 749 | address: 524 750 | unit_of_measurement: "kWh" 751 | accuracy_decimals: 2 752 | device_class: energy 753 | state_class: total_increasing 754 | value_type: U_WORD 755 | filters: 756 | - multiply: 0.1 757 | 758 | - platform: modbus_controller # 526 Day Load Energy 759 | modbus_controller_id: sunsynk 760 | name: "${friendly_name} Day Load Energy" 761 | id: sunsynk_esphome_day_load_energy 762 | register_type: holding 763 | address: 526 764 | unit_of_measurement: "kWh" 765 | accuracy_decimals: 2 766 | device_class: energy 767 | state_class: total_increasing 768 | filters: 769 | - multiply: 0.1 770 | value_type: U_WORD 771 | 772 | - platform: modbus_controller # 527 Total Load Energy 773 | modbus_controller_id: sunsynk 774 | name: "${friendly_name} Total Load Energy" 775 | id: sunsynk_esphome_total_load_energy 776 | register_type: holding 777 | address: 527 778 | unit_of_measurement: "kWh" 779 | accuracy_decimals: 2 780 | device_class: energy 781 | state_class: total_increasing 782 | value_type: U_DWORD_R 783 | filters: 784 | - multiply: 0.1 785 | 786 | - platform: modbus_controller # 534 Total PV Energy 787 | modbus_controller_id: sunsynk 788 | name: "${friendly_name} Total PV Energy" 789 | id: sunsynk_esphome_total_pv_energy 790 | register_type: holding 791 | address: 534 792 | unit_of_measurement: "kWh" 793 | accuracy_decimals: 2 794 | device_class: energy 795 | state_class: total_increasing 796 | filters: 797 | - multiply: 0.1 798 | value_type: U_DWORD_R 799 | 800 | - platform: modbus_controller # 529 Day PV Energy 801 | modbus_controller_id: sunsynk 802 | name: "${friendly_name} Day PV Energy" 803 | id: sunsynk_esphome_day_pv_energy 804 | register_type: holding 805 | address: 529 806 | unit_of_measurement: "kWh" 807 | accuracy_decimals: 1 808 | device_class: energy 809 | state_class: total_increasing 810 | filters: 811 | - multiply: 0.1 812 | value_type: U_WORD 813 | 814 | ############################################### TEMPERATURE ################################################ 815 | 816 | - platform: modbus_controller # 540 DC Transformer Temperature 817 | modbus_controller_id: sunsynk 818 | name: "${friendly_name} DC Transformer Temperature" 819 | id: sunsynk_esphome_dc_transformer_temperature 820 | register_type: holding 821 | address: 540 822 | unit_of_measurement: "°C" 823 | accuracy_decimals: 1 824 | device_class: temperature 825 | state_class: measurement 826 | value_type: S_WORD 827 | filters: 828 | - offset: -1000 829 | - multiply: 0.1 830 | 831 | - platform: modbus_controller # 541 Radiator Temperature 832 | modbus_controller_id: sunsynk 833 | name: "${friendly_name} Radiator Temperature" 834 | id: sunsynk_esphome_radiator_temperature 835 | register_type: holding 836 | address: 541 837 | unit_of_measurement: "°C" 838 | accuracy_decimals: 1 839 | device_class: temperature 840 | state_class: measurement 841 | value_type: S_WORD 842 | filters: 843 | - offset: -1000 844 | - multiply: 0.1 845 | 846 | ################################################ READ SETTINGS ############################################# 847 | 848 | - platform: modbus_controller # 148 System Mode Time 1 849 | modbus_controller_id: sunsynk 850 | name: "${friendly_name} System Mode Time1" 851 | id: sunsynk_esphome_system_mode_time1 852 | register_type: holding 853 | skip_updates: ${settings_skipped_updates} 854 | address: 148 855 | icon: "mdi:clock" 856 | 857 | - platform: modbus_controller # 149 System Mode Time 2 858 | modbus_controller_id: sunsynk 859 | name: "${friendly_name} System Mode Time2" 860 | id: sunsynk_esphome_system_mode_time2 861 | register_type: holding 862 | skip_updates: ${settings_skipped_updates} 863 | address: 149 864 | icon: "mdi:clock" 865 | 866 | - platform: modbus_controller # 150 System Mode Time 3 867 | modbus_controller_id: sunsynk 868 | name: "${friendly_name} System Mode Time3" 869 | id: sunsynk_esphome_system_mode_time3 870 | register_type: holding 871 | skip_updates: ${settings_skipped_updates} 872 | address: 150 873 | icon: "mdi:clock" 874 | 875 | - platform: modbus_controller # 151 System Mode Time 4 876 | modbus_controller_id: sunsynk 877 | name: "${friendly_name} System Mode Time4" 878 | id: sunsynk_esphome_system_mode_time4 879 | register_type: holding 880 | skip_updates: ${settings_skipped_updates} 881 | address: 151 882 | icon: "mdi:clock" 883 | 884 | - platform: modbus_controller # 152 System Mode Time 5 885 | modbus_controller_id: sunsynk 886 | name: "${friendly_name} System Mode Time5" 887 | id: sunsynk_esphome_system_mode_time5 888 | register_type: holding 889 | skip_updates: ${settings_skipped_updates} 890 | address: 152 891 | icon: "mdi:clock" 892 | 893 | - platform: modbus_controller # 153 System Mode Time 6 894 | modbus_controller_id: sunsynk 895 | name: "${friendly_name} System Mode Time6" 896 | id: sunsynk_esphome_system_mode_time6 897 | register_type: holding 898 | skip_updates: ${settings_skipped_updates} 899 | address: 153 900 | icon: "mdi:clock" 901 | 902 | ################################################ WRITE SETTINGS ############################################ 903 | 904 | switch: 905 | - platform: modbus_controller # 145 Toggle Solar Sell 906 | use_write_multiple: true 907 | modbus_controller_id: sunsynk 908 | name: "${friendly_name} Toggle Solar sell" 909 | id: sunsynk_esphome_toggle_solar_sell 910 | register_type: holding 911 | address: 145 912 | bitmask: 1 913 | icon: "mdi:toggle-switch" 914 | 915 | - platform: modbus_controller # 146 Toggle System Timer 916 | use_write_multiple: true 917 | modbus_controller_id: sunsynk 918 | name: "${friendly_name} Toggle System Timer" 919 | id: sunsynk_esphome_toggle_Time_of_Use 920 | register_type: holding 921 | address: 146 922 | bitmask: 1 923 | icon: "mdi:toggle-switch" 924 | 925 | - platform: modbus_controller # 141 Priority Load 926 | use_write_multiple: true 927 | modbus_controller_id: sunsynk 928 | name: "${friendly_name} Toggle Priority Load" 929 | id: sunsynk_esphome_toggle_priority_load 930 | register_type: holding 931 | address: 141 932 | bitmask: 1 933 | icon: "mdi:toggle-switch" 934 | 935 | - platform: modbus_controller # 172 System Mode Grid Charge Time 1 936 | use_write_multiple: true 937 | modbus_controller_id: sunsynk 938 | name: "${friendly_name} System Mode Grid Charge Time1" 939 | id: sunsynk_esphome_toggle_grid_charge_time1 940 | register_type: holding 941 | address: 172 942 | bitmask: 1 943 | icon: "mdi:toggle-switch" 944 | 945 | - platform: modbus_controller # 173 System Mode Grid Charge Time 2 946 | modbus_controller_id: sunsynk 947 | use_write_multiple: true 948 | name: "${friendly_name} System Mode Grid Charge Time2" 949 | id: sunsynk_esphome_toggle_grid_charge_time2 950 | register_type: holding 951 | address: 173 952 | bitmask: 1 953 | icon: "mdi:toggle-switch" 954 | 955 | - platform: modbus_controller # 174 System Mode Grid Charge Time 3 956 | modbus_controller_id: sunsynk 957 | use_write_multiple: true 958 | name: "${friendly_name} System Mode Grid Charge Time3" 959 | id: sunsynk_esphome_toggle_grid_charge_time3 960 | register_type: holding 961 | address: 174 962 | bitmask: 1 963 | icon: "mdi:toggle-switch" 964 | 965 | - platform: modbus_controller # 175 System Mode Grid Charge Time 4 966 | modbus_controller_id: sunsynk 967 | use_write_multiple: true 968 | name: "${friendly_name} System Mode Grid Charge Time4" 969 | id: sunsynk_esphome_toggle_grid_charge_time4 970 | register_type: holding 971 | address: 175 972 | bitmask: 1 973 | icon: "mdi:toggle-switch" 974 | 975 | - platform: modbus_controller # 176 System Mode Grid Charge Time 5 976 | modbus_controller_id: sunsynk 977 | use_write_multiple: true 978 | name: "${friendly_name} System Mode Grid Charge Time5" 979 | id: sunsynk_esphome_toggle_grid_charge_time5 980 | register_type: holding 981 | address: 176 982 | bitmask: 1 983 | icon: "mdi:toggle-switch" 984 | 985 | - platform: modbus_controller # 177 System Mode Grid Charge Time 6 986 | modbus_controller_id: sunsynk 987 | use_write_multiple: true 988 | name: "${friendly_name} System Mode Grid Charge Time6" 989 | id: sunsynk_esphome_toggle_grid_charge_time6 990 | register_type: holding 991 | address: 177 992 | bitmask: 1 993 | icon: "mdi:toggle-switch" 994 | 995 | number: 996 | - platform: modbus_controller # 166 System Mode SoC Time 1 997 | use_write_multiple: true 998 | modbus_controller_id: sunsynk 999 | id: sunsynk_esphome_set_soc_time1 1000 | name: "${friendly_name} System Mode SoC Time1" 1001 | unit_of_measurement: "%" 1002 | address: 166 1003 | min_value: 0 1004 | max_value: 100 1005 | step: 5 1006 | value_type: U_WORD 1007 | 1008 | - platform: modbus_controller # 167 System Mode SoC Time 2 1009 | use_write_multiple: true 1010 | modbus_controller_id: sunsynk 1011 | id: sunsynk_esphome_set_soc_time2 1012 | name: "${friendly_name} System Mode SoC Time2" 1013 | unit_of_measurement: "%" 1014 | address: 167 1015 | min_value: 0 1016 | max_value: 100 1017 | step: 5 1018 | value_type: U_WORD 1019 | 1020 | - platform: modbus_controller # 168 System Mode SoC Time 3 1021 | use_write_multiple: true 1022 | modbus_controller_id: sunsynk 1023 | id: sunsynk_esphome_set_soc_time3 1024 | name: "${friendly_name} System Mode SoC Time3" 1025 | unit_of_measurement: "%" 1026 | address: 168 1027 | min_value: 0 1028 | max_value: 100 1029 | step: 5 1030 | value_type: U_WORD 1031 | 1032 | - platform: modbus_controller # 169 System Mode SoC Time 4 1033 | use_write_multiple: true 1034 | modbus_controller_id: sunsynk 1035 | id: sunsynk_esphome_set_soc_time4 1036 | name: "${friendly_name} System Mode SoC Time4" 1037 | unit_of_measurement: "%" 1038 | address: 169 1039 | min_value: 0 1040 | max_value: 100 1041 | step: 5 1042 | value_type: U_WORD 1043 | 1044 | - platform: modbus_controller # 170 System Mode SoC Time 5 1045 | use_write_multiple: true 1046 | modbus_controller_id: sunsynk 1047 | id: sunsynk_esphome_set_soc_time5 1048 | name: "${friendly_name} System Mode SoC Time5" 1049 | unit_of_measurement: "%" 1050 | address: 170 1051 | min_value: 0 1052 | max_value: 100 1053 | step: 5 1054 | value_type: U_WORD 1055 | 1056 | - platform: modbus_controller # 171 System Mode SoC Time 6 1057 | use_write_multiple: true 1058 | modbus_controller_id: sunsynk 1059 | id: sunsynk_esphome_set_soc_time6 1060 | name: "${friendly_name} System Mode SoC Time6" 1061 | unit_of_measurement: "%" 1062 | address: 171 1063 | min_value: 0 1064 | max_value: 100 1065 | step: 5 1066 | value_type: U_WORD 1067 | 1068 | - platform: modbus_controller # 154 System Mode Power Time 1 1069 | use_write_multiple: true 1070 | modbus_controller_id: sunsynk 1071 | id: sunsynk_esphome_set_power_time1 1072 | name: "${friendly_name} System Mode Power Time1" 1073 | unit_of_measurement: "W" 1074 | address: 154 1075 | min_value: 0 1076 | max_value: 12000 1077 | step: 100 1078 | value_type: U_WORD 1079 | 1080 | - platform: modbus_controller # 155 System Mode Power Time 2 1081 | use_write_multiple: true 1082 | modbus_controller_id: sunsynk 1083 | id: sunsynk_esphome_set_power_time2 1084 | name: "${friendly_name} System Mode Power Time2" 1085 | unit_of_measurement: "W" 1086 | address: 155 1087 | min_value: 0 1088 | max_value: 12000 1089 | step: 100 1090 | value_type: U_WORD 1091 | 1092 | - platform: modbus_controller # 156 System Mode Power Time 3 1093 | use_write_multiple: true 1094 | modbus_controller_id: sunsynk 1095 | id: sunsynk_esphome_set_power_time3 1096 | name: "${friendly_name} System Mode Power Time3" 1097 | unit_of_measurement: "W" 1098 | address: 156 1099 | min_value: 0 1100 | max_value: 12000 1101 | step: 100 1102 | value_type: U_WORD 1103 | 1104 | - platform: modbus_controller # 157 System Mode Power Time 4 1105 | use_write_multiple: true 1106 | modbus_controller_id: sunsynk 1107 | id: sunsynk_esphome_set_power_time4 1108 | name: "${friendly_name} System Mode Power Time4" 1109 | unit_of_measurement: "W" 1110 | address: 157 1111 | min_value: 0 1112 | max_value: 12000 1113 | step: 100 1114 | value_type: U_WORD 1115 | 1116 | - platform: modbus_controller # 158 System Mode Power Time 5 1117 | use_write_multiple: true 1118 | modbus_controller_id: sunsynk 1119 | id: sunsynk_esphome_set_power_time5 1120 | name: "${friendly_name} System Mode Power Time5" 1121 | unit_of_measurement: "W" 1122 | address: 158 1123 | min_value: 0 1124 | max_value: 12000 1125 | step: 100 1126 | value_type: U_WORD 1127 | 1128 | - platform: modbus_controller # 159 System Mode Power Time 6 1129 | use_write_multiple: true 1130 | modbus_controller_id: sunsynk 1131 | id: sunsynk_esphome_set_power_time6 1132 | name: "${friendly_name} System Mode Power Time6" 1133 | unit_of_measurement: "W" 1134 | address: 159 1135 | min_value: 0 1136 | max_value: 12000 1137 | step: 100 1138 | value_type: U_WORD 1139 | 1140 | - platform: modbus_controller # 128 Grid Charge Battery current 1141 | use_write_multiple: true 1142 | modbus_controller_id: sunsynk 1143 | id: sunsynk_esphome_grid_charge_bat_current 1144 | name: "${friendly_name} Grid Charge Battery current" 1145 | unit_of_measurement: "A" 1146 | address: 128 1147 | min_value: 0 1148 | max_value: 185 1149 | step: 5 1150 | value_type: U_WORD 1151 | 1152 | - platform: modbus_controller # 108 Battery Max Charge current 1153 | use_write_multiple: true 1154 | modbus_controller_id: sunsynk 1155 | id: sunsynk_esphome_bat_max_charge_current 1156 | name: "${friendly_name} Battery Max Charge current" 1157 | unit_of_measurement: "A" 1158 | address: 108 1159 | min_value: 0 1160 | max_value: 185 1161 | step: 5 1162 | value_type: U_WORD 1163 | 1164 | - platform: modbus_controller # 109 Battery Max Discharge current 1165 | use_write_multiple: true 1166 | modbus_controller_id: sunsynk 1167 | id: sunsynk_esphome_bat_max_discharge_current 1168 | name: "${friendly_name} Battery Max Discharge current" 1169 | unit_of_measurement: "A" 1170 | address: 109 1171 | min_value: 0 1172 | max_value: 185 1173 | step: 5 1174 | value_type: U_WORD 1175 | 1176 | - platform: modbus_controller # 143 Max Sell Power 1177 | use_write_multiple: true 1178 | modbus_controller_id: sunsynk 1179 | name: "${friendly_name} Max Sell power" 1180 | id: sunsynk_max_sell_power 1181 | address: 143 1182 | unit_of_measurement: "W" 1183 | min_value: 0 1184 | max_value: 12000 1185 | step: 500 1186 | value_type: U_WORD 1187 | 1188 | 1189 | ################################################ TEXT SENSORS ################################################## 1190 | 1191 | text_sensor: 1192 | - platform: modbus_controller # 500 Overall State 1193 | modbus_controller_id: sunsynk 1194 | name: "${friendly_name} Overall State" 1195 | id: sunsynk_esphome_overall_state 1196 | register_type: holding 1197 | skip_updates: ${settings_skipped_updates} 1198 | raw_encode: HEXBYTES 1199 | address: 500 1200 | lambda: |- 1201 | uint16_t value = modbus_controller::word_from_hex_str(x, 0); 1202 | switch (value) { 1203 | case 0: return std::string("standby"); 1204 | case 1: return std::string("selftest"); 1205 | case 2: return std::string("normal"); 1206 | case 3: return std::string("alarm"); 1207 | case 4: return std::string("fault"); 1208 | default: return std::string("unknown"); 1209 | } 1210 | 1211 | - platform: template 1212 | name: "${friendly_name} Time Slot 1" 1213 | id: sunsynk_esphome_time_slot_1 1214 | icon: "mdi:clock" 1215 | lambda: |- 1216 | int minutes, hours; 1217 | if (id(sunsynk_esphome_system_mode_time1).state) { 1218 | minutes = static_cast(id(sunsynk_esphome_system_mode_time1).state) % 100; 1219 | hours = static_cast(id(sunsynk_esphome_system_mode_time1).state) / 100; 1220 | } else { 1221 | minutes = 0; 1222 | hours = 0; 1223 | } 1224 | char formatted_time[6]; 1225 | snprintf(formatted_time, sizeof(formatted_time), "%02d:%02d", hours, minutes); 1226 | return esphome::optional(formatted_time); 1227 | - platform: template 1228 | name: "${friendly_name} Time Slot 2" 1229 | id: sunsynk_esphome_time_slot_2 1230 | icon: "mdi:clock" 1231 | lambda: |- 1232 | int minutes, hours; 1233 | if (id(sunsynk_esphome_system_mode_time2).state) { 1234 | minutes = static_cast(id(sunsynk_esphome_system_mode_time2).state) % 100; 1235 | hours = static_cast(id(sunsynk_esphome_system_mode_time2).state) / 100; 1236 | } else { 1237 | minutes = 0; 1238 | hours = 0; 1239 | } 1240 | char formatted_time[6]; 1241 | snprintf(formatted_time, sizeof(formatted_time), "%02d:%02d", hours, minutes); 1242 | return esphome::optional(formatted_time); 1243 | - platform: template 1244 | name: "${friendly_name} Time Slot 3" 1245 | id: sunsynk_esphome_time_slot_3 1246 | icon: "mdi:clock" 1247 | lambda: |- 1248 | int minutes, hours; 1249 | if (id(sunsynk_esphome_system_mode_time3).state) { 1250 | minutes = static_cast(id(sunsynk_esphome_system_mode_time3).state) % 100; 1251 | hours = static_cast(id(sunsynk_esphome_system_mode_time3).state) / 100; 1252 | } else { 1253 | minutes = 0; 1254 | hours = 0; 1255 | } 1256 | char formatted_time[6]; 1257 | snprintf(formatted_time, sizeof(formatted_time), "%02d:%02d", hours, minutes); 1258 | return esphome::optional(formatted_time); 1259 | - platform: template 1260 | name: "${friendly_name} Time Slot 4" 1261 | id: sunsynk_esphome_time_slot_4 1262 | icon: "mdi:clock" 1263 | lambda: |- 1264 | int minutes, hours; 1265 | if (id(sunsynk_esphome_system_mode_time4).state) { 1266 | minutes = static_cast(id(sunsynk_esphome_system_mode_time4).state) % 100; 1267 | hours = static_cast(id(sunsynk_esphome_system_mode_time4).state) / 100; 1268 | } else { 1269 | minutes = 0; 1270 | hours = 0; 1271 | } 1272 | char formatted_time[6]; 1273 | snprintf(formatted_time, sizeof(formatted_time), "%02d:%02d", hours, minutes); 1274 | return esphome::optional(formatted_time); 1275 | - platform: template 1276 | name: "${friendly_name} Time Slot 5" 1277 | id: sunsynk_esphome_time_slot_5 1278 | icon: "mdi:clock" 1279 | lambda: |- 1280 | int minutes, hours; 1281 | if (id(sunsynk_esphome_system_mode_time5).state) { 1282 | minutes = static_cast(id(sunsynk_esphome_system_mode_time5).state) % 100; 1283 | hours = static_cast(id(sunsynk_esphome_system_mode_time5).state) / 100; 1284 | } else { 1285 | minutes = 0; 1286 | hours = 0; 1287 | } 1288 | char formatted_time[6]; 1289 | snprintf(formatted_time, sizeof(formatted_time), "%02d:%02d", hours, minutes); 1290 | return esphome::optional(formatted_time); 1291 | - platform: template 1292 | name: "${friendly_name} Time Slot 6" 1293 | id: sunsynk_esphome_time_slot_6 1294 | icon: "mdi:clock" 1295 | lambda: |- 1296 | int minutes, hours; 1297 | if (id(sunsynk_esphome_system_mode_time6).state) { 1298 | minutes = static_cast(id(sunsynk_esphome_system_mode_time6).state) % 100; 1299 | hours = static_cast(id(sunsynk_esphome_system_mode_time6).state) / 100; 1300 | } else { 1301 | minutes = 0; 1302 | hours = 0; 1303 | } 1304 | char formatted_time[6]; 1305 | snprintf(formatted_time, sizeof(formatted_time), "%02d:%02d", hours, minutes); 1306 | return esphome::optional(formatted_time); 1307 | 1308 | 1309 | ################################################ SELECT SENSORS ################################################ 1310 | 1311 | select: 1312 | - platform: modbus_controller #141 Select Energy Patern 1313 | use_write_multiple: true 1314 | modbus_controller_id: sunsynk 1315 | id: sunsynk_esphome_select_energy_pattern 1316 | name: "${friendly_name} Energy Pattern" 1317 | address: 141 1318 | value_type: U_WORD 1319 | optionsmap: 1320 | "Battery first": 0 1321 | "Load first": 1 1322 | 1323 | - platform: modbus_controller #142 Select Work Mode 1324 | use_write_multiple: true 1325 | modbus_controller_id: sunsynk 1326 | id: sunsynk_esphome_select_work_mode 1327 | name: "${friendly_name} Work Mode" 1328 | address: 142 1329 | value_type: U_WORD 1330 | optionsmap: 1331 | "Selling First": 0 1332 | "Zero Export + Limit to Load Only": 1 1333 | "Limited to Home": 2 1334 | -------------------------------------------------------------------------------- /ESPHome Configs/sunsynk_modbus.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slipx06/Sunsynk-Home-Assistant-Dash/d225b2d0ac3c6f2cfc976b376b2b81da2ceb4582/ESPHome Configs/sunsynk_modbus.pdf -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Inverter Home Assistant Dashboard 2 | Home Assistant Dashboard to display Inverter data and Energy Usage. 3 | 4 | Requires the following: 5 | 6 | Cards: 7 | 8 | - Flexible Horseshoe Card (https://github.com/AmoebeLabs/flex-horseshoe-card). If this does not load see https://github.com/AmoebeLabs/flex-horseshoe-card/issues/88#issuecomment-2145334978 9 | - Sunsynk Power Flow Card (https://github.com/slipx06/Sunsynk-Home-Assistant-Power-Flow-Card) 10 | - Layout Card (https://github.com/thomasloven/lovelace-layout-card) 11 | - Plotly Graph Card (https://github.com/dbuezas/lovelace-plotly-graph-card) 12 | 13 | Integrations: 14 | 15 | - Load Shedding (https://github.com/wernerhp/ha.integration.load_shedding) 16 | - HA Open-Meteo Solar Forecast Integration ([https://github.com/oziee/ha-solcast-solar](https://github.com/rany2/ha-open-meteo-solar-forecast)) 17 | 18 | ## Screenshots 19 | 20 | 21 | ![image](https://github.com/user-attachments/assets/49c5b645-4472-440e-aeb9-4a99f3158974) 22 | ![image](https://github.com/user-attachments/assets/a3ed68f1-3a4d-4dd8-9c04-0dd1a604eb11) 23 | ![image](https://github.com/user-attachments/assets/fc85912b-46c4-4f8c-a17d-a5119e9cf619) 24 | ![image](https://github.com/user-attachments/assets/bc98f175-a63c-4287-b395-f2df76c6df9a) 25 | 26 | 27 | ## Installation 28 | Data can be collected from the inverter using the RS485 port. There are a number of different ways to do this but I'm using an ESP32 chip running ESPHome. See **Hardware and Wiring Guide** below and [ESPHome-1P-Sunsynk-Deye.yaml](https://github.com/slipx06/Sunsynk-Home-Assistant-Dash/blob/main/ESPHome-1P-Sunsynk-Deye.yaml) 29 | 30 | Create a new view on your current Dashboard and set the view type to Panel (1 card) as shown below: 31 | 32 | ![image](https://user-images.githubusercontent.com/7227275/223527428-b4508e6c-cf2d-473a-b63c-ffad11d2630d.png) 33 | 34 | 35 | You can then edit the Dashboard (using the code editor) and paste the contents of the Dashboard. 36 | You'll need to adjust all the sensor names to match yours and install the necessary custom components. 37 | 38 | ## Demo 39 | 40 | ![layout_card](https://github.com/user-attachments/assets/f44a7c36-72dc-47ae-bf40-84419f4b3dfc) 41 | 42 | ## Hardware and Wiring Guide 43 | 44 | > Disclaimer: Proceed with caution. Working with electrical equipment carries inherent risks. If you are unsure about any step, consult a qualified professional. The author is not responsible for any damage to equipment or injury. ALWAYS consult your specific inverter's manual and VERIFY ALL voltages and polarities with a multimeter before making connections. 45 | 46 | ### Required Components & Tools: 47 | 48 | - ESP-based board (e.g., [AtomS3 Lite M5 Stack](https://shop.m5stack.com/products/atoms3-lite-esp32s3-dev-kit)) 49 | - RS485 to TTL Converter (e.g., [M5Stack Tail485](https://shop.m5stack.com/products/atom-tail485), which accepts 12V) 50 | - Standard Ethernet Patch Cable (Cat5e or Cat6) 51 | - Tools: Wire strippers, wire cutters, small screwdriver (for terminal blocks), multimeter (essential for voltage/polarity checks). 52 | 53 | ### Powering Your ESP Board & RS485 Converter: 54 | 55 | - The M5Stack AtomS3 Lite with Tail485 converter example accepts 12V input. 56 | - Many inverters provide an onboard 12V DC power source. 57 | - Consult your inverter's manual to locate a suitable 12V DC output and its Ground (GND) terminal. BEFORE CONNECTING ANYTHING: Use a multimeter to verify the output is indeed 12V DC (or the voltage your converter expects). Confirm the correct polarity of the 12V (+) and GND (-) terminals. Incorrect voltage or polarity can permanently damage your components. 58 | 59 | ### Preparing the Ethernet Cable for RS485 Data: 60 | 61 | - Connect one end of the Ethernet cable to your inverter's RS485 port (this might be labeled RS485, BMS, Meter, etc. – check your manual). 62 | - Consult your inverter's manual to identify which pins on its port correspond to RS485 A+, RS485 B- as well as the pins for +12V (or other voltage) and GND. Note these down. 63 | - Carefully cut off the connector from the other end of the Ethernet cable. 64 | - Strip back about 1-2 inches (2-5 cm) of the outer jacket to expose the 4 twisted pairs of wires. 65 | - Using a standard Ethernet cable pinout diagram (e.g., T568B, easily found online) and the pin information from your inverter's manual, identify the colored wires that correspond to your inverter's RS485 A+, RS485 B- signals. 66 | 67 | ### Connecting to the RS485 Converter (e.g., Tail485): 68 | - Connect the wire you identified as RS485 A+ (from the Ethernet cable) to the 'A' (or 'A+') terminal on your RS485 converter. 69 | - Connect the wire you identified as RS485 B- (from the Ethernet cable) to the 'B' (or 'B-') terminal on your RS485 converter. 70 | - Connect dedicated wires from the inverter's verified 12V and GND terminals to the VIN and GND of the RS485 converter. 71 | 72 | ### Example Wiring: Solark 15K Inverter 73 | 74 | Pinout 75 | 76 | ![image](https://github.com/user-attachments/assets/539d831b-27da-40ab-a908-aa70a9f9d1f1) 77 | 78 | ![image](https://github.com/user-attachments/assets/579cb6e6-b261-4e1f-99ed-fc28e4fc7737) 79 | 80 | From the above picture, port 15 goes to the 12V port on the tail485, while port 16 goes to the Gnd. 81 | 82 | ![InverterWiringDiagram](https://github.com/user-attachments/assets/44aa39ba-df9d-460b-af20-b9518f267d64) 83 | 84 | ## Additional Info 85 | Added remaining battery time. You will need to add the following template sensor 86 | 87 | ``` 88 | - platform: template 89 | sensors: 90 | battery_cap: 91 | friendly_name: "Battery Capacity" 92 | value_template: > 93 | {% set grid_online = states('binary_sensor.sunsynk_grid_connected_status') %} 94 | {% if grid_online == 'off'%} 95 | {{ states('sensor.sunsynk_battery_capacity_shutdown') | int }} 96 | {% else %} 97 | {% set now = strptime(as_timestamp(now()) | timestamp_custom('%H:%M'), '%H:%M') %} 98 | {% set sellTime1 = strptime(states('sensor.sunsynk_time_slot_1'), '%H:%M') %} 99 | {% set sellTime2 = strptime(states('sensor.sunsynk_time_slot_2'), '%H:%M') %} 100 | {% set sellTime3 = strptime(states('sensor.sunsynk_time_slot_3'), '%H:%M') %} 101 | {% set sellTime4 = strptime(states('sensor.sunsynk_time_slot_4'), '%H:%M') %} 102 | {% set sellTime5 = strptime(states('sensor.sunsynk_time_slot_5'), '%H:%M') %} 103 | {% set sellTime6 = strptime(states('sensor.sunsynk_time_slot_6'), '%H:%M') %} 104 | {% if now >= sellTime1 and now < sellTime2 %} 105 | {{ states('number.sunsynk_prog1_capacity') | int }} 106 | {% elif now >= sellTime2 and now < sellTime3 %} 107 | {{ states('number.sunsynk_prog2_capacity') | int }} 108 | {% elif now >= sellTime3 and now < sellTime4 %} 109 | {{ states('number.sunsynk_prog3_capacity') | int }} 110 | {% elif now >= sellTime4 and now < sellTime5 %} 111 | {{ states('number.sunsynk_prog4_capacity') | int }} 112 | {% elif now >= sellTime5 and now < sellTime6 %} 113 | {{ states('number.sunsynk_prog5_capacity') | int }} 114 | {% elif now >= sellTime6 or now < sellTime1 %} 115 | {{ states('number.sunsynk_prog6_capacity') | int }} 116 | {% else %} 117 | {{ states('sensor.sunsynk_battery_capacity_shutdown') | int }} 118 | {% endif %} 119 | {% endif %} 120 | soc_battery_time_left: 121 | friendly_name: "Battery Depletion Seconds" 122 | unit_of_measurement: Seconds 123 | value_template: > 124 | {% set state = states('sensor.sunsynk_battery_power') | int %} 125 | {% set cap = states('sensor.battery_cap') | float %} 126 | {% if state == 0 -%} 127 | {{ ((((states('sensor.sunsynk_battery_soc') | float - cap) /100) * 15960) / (1) * 60 * 60 ) | timestamp_custom('%s', 0) }} 128 | {%- else -%} 129 | {{ ((((states('sensor.sunsynk_battery_soc') | float - cap) /100) * 15960) / (states('sensor.sunsynk_battery_power') | float) * 60 * 60 ) | timestamp_custom('%s', 0) }} 130 | {%- endif %} 131 | soc_battery_time_left_friendly: 132 | friendly_name: "Battery Depletion Time" 133 | value_template: > 134 | {% set state = states('sensor.sunsynk_battery_power') | int %} 135 | {% if state > 0 -%} 136 | {%- set time = states('sensor.soc_battery_time_left') | int %} 137 | {%- set minutes = ((time % 3600) // 60) %} 138 | {%- set minutes = '{} minutes'.format(minutes) if minutes > 0 else '' %} 139 | {%- set hours = ((time % 86400) // 3600) %} 140 | {%- set hours = '{} hours, '.format(hours) if hours > 0 else '' %} 141 | {%- set days = (time // 86400) %} 142 | {%- set days = '{} day, '.format(days) if days > 0 else '' %} 143 | {{ 'Less than 1 minute' if time < 60 else days + hours + minutes }} 144 | {%- else -%} 145 | {{ 'Charging' }} 146 | {%- endif %} 147 | battery_charging_time_left: 148 | friendly_name: "Battery Charging Time Left" 149 | unit_of_measurement: Seconds 150 | value_template: > 151 | {% set power = states('sensor.sunsynk_battery_power') | float %} 152 | {% set soc = states('sensor.sunsynk_battery_soc') | float %} 153 | {% set cap = states('sensor.battery_cap') | float %} 154 | {% if power < 0 %} 155 | {% if soc < cap %} 156 | {{ ((((cap - soc) / 100) * 15960) / (-power) * 60 * 60) | int }} 157 | {% else %} 158 | {{ ((((100 - soc) / 100) * 15960) / (-power) * 60 * 60) | int }} 159 | {% endif %} 160 | {% else %} 161 | 0 162 | {% endif %} 163 | battery_charging_time_left_friendly: 164 | friendly_name: "Battery Charging Time" 165 | value_template: > 166 | {% set state = states('sensor.sunsynk_battery_power') | int %} 167 | {% if state < 0 -%} 168 | {%- set time = states('sensor.battery_charging_time_left') | int %} 169 | {%- set minutes = ((time % 3600) // 60) %} 170 | {%- set minutes = '{} min'.format(minutes) if minutes > 0 else '' %} 171 | {%- set hours = ((time % 86400) // 3600) %} 172 | {%- set hours = '{} hrs, '.format(hours) if hours > 0 else '' %} 173 | {%- set days = (time // 86400) %} 174 | {%- set days = '{} day, '.format(days) if days > 0 else '' %} 175 | {{ 'Floating' if time < 60 else days + hours + minutes }} 176 | {%- else -%} 177 | {{ 'Discharging' }} 178 | {%- endif %} 179 | markdown_battery_charge_time_left: 180 | friendly_name: "Markdown Battery Charging Time" 181 | value_template: > 182 | {% if states('sensor.sunsynk_battery_soc') | float < states('sensor.battery_cap') | float %} 183 | {{ states('sensor.battery_cap') | float | round(0) }} 184 | {% else %} 185 | 100 186 | {% endif %} 187 | markdown_discharge_time: 188 | friendly_name: "Markdown Discharge Time" 189 | value_template: > 190 | {% set now = as_timestamp(now()) %} 191 | {% set add = states('sensor.soc_battery_time_left') | int %} 192 | {% set future_time = now + add %} 193 | {{ future_time | timestamp_custom('%H:%M') }} 194 | markdown_charge_time: 195 | friendly_name: "Markdown Charging Time" 196 | value_template: > 197 | {% set now = as_timestamp(now()) %} 198 | {% set add = states('sensor.battery_charging_time_left') | int %} 199 | {% set future_time = now + add %} 200 | {{ future_time | timestamp_custom('%H:%M') }} 201 | ``` 202 | 15960 is battery size in Wh. You will need to adjust for your system 203 | 204 | 20 is the minimum battery SOC before shutdown 205 | 206 | ## Change Inverter Settings 207 | These following example cards can be used to set system timer settings 208 | 209 | ### Example 1 210 | 211 | ![image](https://github.com/slipx06/Sunsynk-Home-Assistant-Dash/assets/7227275/2c665082-1d12-4a26-ba19-def6ffdd7780) 212 | 213 | ``` 214 | type: vertical-stack 215 | cards: 216 | - type: tile 217 | entity: switch.sunsynk_toggle_system_timer 218 | icon: mdi:timer-outline 219 | vertical: true 220 | - type: horizontal-stack 221 | cards: 222 | - type: entities 223 | entities: 224 | - entity: select.sunsynk_energy_pattern 225 | name: Energy Pattern 226 | state_color: true 227 | - type: entities 228 | entities: 229 | - entity: select.sunsynk_work_mode 230 | name: Work Mode 231 | state_color: true 232 | - type: entities 233 | entities: 234 | - entity: switch.sunsynk_prog1_grid_charge 235 | type: custom:multiple-entity-row 236 | name: Program 1 237 | toggle: true 238 | state_header: Charge 239 | state_color: true 240 | icon: mdi:timer 241 | entities: 242 | - entity: sensor.sunsynk_time_slot_1 243 | name: From 244 | - entity: sensor.sunsynk_time_slot_2 245 | name: To 246 | - entity: number.sunsynk_prog1_capacity 247 | name: SOC 248 | format: precision0 249 | - entity: switch.sunsynk_prog2_grid_charge 250 | type: custom:multiple-entity-row 251 | name: Program 2 252 | toggle: true 253 | state_header: Charge 254 | state_color: true 255 | icon: mdi:timer 256 | entities: 257 | - entity: sensor.sunsynk_time_slot_2 258 | name: From 259 | - entity: sensor.sunsynk_time_slot_3 260 | name: To 261 | - entity: number.sunsynk_prog2_capacity 262 | name: SOC 263 | format: precision0 264 | - entity: switch.sunsynk_prog3_grid_charge 265 | type: custom:multiple-entity-row 266 | name: Program 3 267 | toggle: true 268 | state_header: Charge 269 | state_color: true 270 | icon: mdi:timer 271 | entities: 272 | - entity: sensor.sunsynk_time_slot_3 273 | name: From 274 | - entity: sensor.sunsynk_time_slot_4 275 | name: To 276 | - entity: number.sunsynk_prog3_capacity 277 | name: SOC 278 | format: precision0 279 | - entity: switch.sunsynk_prog4_grid_charge 280 | type: custom:multiple-entity-row 281 | name: Program 4 282 | toggle: true 283 | state_header: Charge 284 | state_color: true 285 | icon: mdi:timer 286 | entities: 287 | - entity: sensor.sunsynk_time_slot_4 288 | name: From 289 | - entity: sensor.sunsynk_time_slot_5 290 | name: To 291 | - entity: number.sunsynk_prog4_capacity 292 | name: SOC 293 | format: precision0 294 | - entity: switch.sunsynk_prog5_grid_charge 295 | type: custom:multiple-entity-row 296 | name: Program 5 297 | toggle: true 298 | state_header: Charge 299 | state_color: true 300 | icon: mdi:timer 301 | entities: 302 | - entity: sensor.sunsynk_time_slot_5 303 | name: From 304 | - entity: sensor.sunsynk_time_slot_6 305 | name: To 306 | - entity: number.sunsynk_prog5_capacity 307 | name: SOC 308 | format: precision0 309 | - entity: switch.sunsynk_prog6_grid_charge 310 | type: custom:multiple-entity-row 311 | name: Program 6 312 | toggle: true 313 | state_header: Charge 314 | state_color: true 315 | icon: mdi:timer 316 | entities: 317 | - entity: sensor.sunsynk_time_slot_6 318 | name: From 319 | - entity: sensor.sunsynk_time_slot_1 320 | name: To 321 | - entity: number.sunsynk_prog6_capacity 322 | name: SOC 323 | format: precision0 324 | state_color: true 325 | view_layout: 326 | grid-area: a 327 | ``` 328 | ### Example 2 329 | ![image](https://github.com/slipx06/Sunsynk-Home-Assistant-Dash/assets/7227275/ff40ea09-0aa3-4987-abb4-69fd195f5286) 330 | 331 | 332 | ``` 333 | type: custom:layout-card 334 | layout_type: custom:grid-layout 335 | cards: 336 | - type: custom:mushroom-title-card 337 | title: Sunsynk System Mode 338 | alignment: center 339 | view_layout: 340 | grid-area: header 341 | - type: horizontal-stack 342 | cards: 343 | - type: entities 344 | entities: 345 | - entity: switch.sunsynk_toggle_system_timer 346 | name: System Timer 347 | state_color: true 348 | - type: entities 349 | entities: 350 | - entity: select.sunsynk_energy_pattern 351 | name: Energy Pattern 352 | state_color: true 353 | - type: entities 354 | entities: 355 | - entity: select.sunsynk_work_mode 356 | name: Work Mode 357 | state_color: true 358 | view_layout: 359 | grid-area: system 360 | - type: vertical-stack 361 | cards: 362 | - type: horizontal-stack 363 | cards: 364 | - type: custom:mushroom-template-card 365 | primary: Program 1 366 | secondary: >- 367 | {{ states("sensor.sunsynk_time_slot_1") }} - {{ 368 | states("sensor.sunsynk_time_slot_2") }} 369 | icon: mdi:timer 370 | multiline_secondary: false 371 | badge_icon: mdi:lightning-bolt 372 | icon_color: blue 373 | badge_color: green 374 | fill_container: true 375 | - type: entities 376 | entities: 377 | - entity: select.sunsynk_prog1_charge_option 378 | name: Option 379 | state_color: true 380 | - type: entities 381 | entities: 382 | - type: custom:slider-entity-row 383 | entity: number.sunsynk_prog1_capacity 384 | name: Battery SOC 385 | hide_state: false 386 | grow: true 387 | - type: custom:slider-entity-row 388 | entity: number.sunsynk_prog1_power 389 | name: Power 390 | hide_state: false 391 | grow: true 392 | view_layout: 393 | grid-area: prog1 394 | - type: vertical-stack 395 | cards: 396 | - type: horizontal-stack 397 | cards: 398 | - type: custom:mushroom-template-card 399 | primary: Program 2 400 | secondary: >- 401 | {{ states("sensor.sunsynk_time_slot_2") }} - {{ 402 | states("sensor.sunsynk_time_slot_3") }} 403 | icon: mdi:timer 404 | multiline_secondary: false 405 | badge_icon: mdi:lightning-bolt 406 | icon_color: blue 407 | badge_color: green 408 | fill_container: true 409 | - type: entities 410 | entities: 411 | - entity: select.sunsynk_prog2_charge_option 412 | name: Option 413 | state_color: true 414 | - type: entities 415 | entities: 416 | - type: custom:slider-entity-row 417 | entity: number.sunsynk_prog2_capacity 418 | name: Battery SOC 419 | hide_state: false 420 | grow: true 421 | - type: custom:slider-entity-row 422 | entity: number.sunsynk_prog2_power 423 | name: Power 424 | hide_state: false 425 | grow: true 426 | view_layout: 427 | grid-area: prog2 428 | - type: vertical-stack 429 | cards: 430 | - type: horizontal-stack 431 | cards: 432 | - type: custom:mushroom-template-card 433 | primary: Program 3 434 | secondary: >- 435 | {{ states("sensor.sunsynk_time_slot_3") }} - {{ 436 | states("sensor.sunsynk_time_slot_4") }} 437 | icon: mdi:timer 438 | multiline_secondary: false 439 | badge_icon: mdi:lightning-bolt 440 | icon_color: blue 441 | badge_color: green 442 | fill_container: true 443 | - type: entities 444 | entities: 445 | - entity: select.sunsynk_prog3_charge_option 446 | name: Option 447 | state_color: true 448 | - type: entities 449 | entities: 450 | - type: custom:slider-entity-row 451 | entity: number.sunsynk_prog3_capacity 452 | name: Battery SOC 453 | hide_state: false 454 | grow: true 455 | - type: custom:slider-entity-row 456 | entity: number.sunsynk_prog3_power 457 | name: Power 458 | hide_state: false 459 | grow: true 460 | view_layout: 461 | grid-area: prog3 462 | - type: vertical-stack 463 | cards: 464 | - type: horizontal-stack 465 | cards: 466 | - type: custom:mushroom-template-card 467 | primary: Program 4 468 | secondary: >- 469 | {{ states("sensor.sunsynk_time_slot_4") }} - {{ 470 | states("sensor.sunsynk_time_slot_5") }} 471 | icon: mdi:timer 472 | multiline_secondary: false 473 | badge_icon: mdi:lightning-bolt 474 | icon_color: blue 475 | badge_color: green 476 | fill_container: true 477 | - type: entities 478 | entities: 479 | - entity: select.sunsynk_prog4_charge_option 480 | name: Option 481 | state_color: true 482 | - type: entities 483 | entities: 484 | - type: custom:slider-entity-row 485 | entity: number.sunsynk_prog4_capacity 486 | name: Battery SOC 487 | hide_state: false 488 | grow: true 489 | - type: custom:slider-entity-row 490 | entity: number.sunsynk_prog4_power 491 | name: Power 492 | hide_state: false 493 | grow: true 494 | view_layout: 495 | grid-area: prog4 496 | - type: vertical-stack 497 | cards: 498 | - type: horizontal-stack 499 | cards: 500 | - type: custom:mushroom-template-card 501 | primary: Program 5 502 | secondary: >- 503 | {{ states("sensor.sunsynk_time_slot_5") }} - {{ 504 | states("sensor.sunsynk_time_slot_6") }} 505 | icon: mdi:timer 506 | multiline_secondary: false 507 | badge_icon: mdi:lightning-bolt 508 | icon_color: blue 509 | badge_color: green 510 | fill_container: true 511 | - type: entities 512 | entities: 513 | - entity: select.sunsynk_prog5_charge_option 514 | name: Option 515 | state_color: true 516 | - type: entities 517 | entities: 518 | - type: custom:slider-entity-row 519 | entity: number.sunsynk_prog5_capacity 520 | name: Battery SOC 521 | hide_state: false 522 | grow: true 523 | - type: custom:slider-entity-row 524 | entity: number.sunsynk_prog5_power 525 | name: Power 526 | hide_state: false 527 | grow: true 528 | view_layout: 529 | grid-area: prog5 530 | - type: vertical-stack 531 | cards: 532 | - type: horizontal-stack 533 | cards: 534 | - type: custom:mushroom-template-card 535 | primary: Program 6 536 | secondary: >- 537 | {{ states("sensor.sunsynk_time_slot_6") }} - {{ 538 | states("sensor.sunsynk_time_slot_1") }} 539 | icon: mdi:timer 540 | multiline_secondary: false 541 | badge_icon: mdi:lightning-bolt 542 | icon_color: blue 543 | badge_color: green 544 | fill_container: true 545 | - type: entities 546 | entities: 547 | - entity: select.sunsynk_prog6_charge_option 548 | name: Option 549 | state_color: true 550 | - type: entities 551 | entities: 552 | - type: custom:slider-entity-row 553 | entity: number.sunsynk_prog6_capacity 554 | name: Battery SOC 555 | hide_state: false 556 | grow: true 557 | - type: custom:slider-entity-row 558 | entity: number.sunsynk_prog6_power 559 | name: Power 560 | hide_state: false 561 | grow: true 562 | view_layout: 563 | grid-area: prog6 564 | layout: 565 | grid-template-columns: 2fr 2fr 2fr 2fr 566 | grid-template-rows: auto 567 | grid-template-areas: | 568 | ". header header ." 569 | ". system system ." 570 | ". prog1 prog2 ." 571 | ". prog3 prog4 ." 572 | ". prog5 prog6 ." 573 | mediaquery: 574 | '(max-width: 800px)': 575 | grid-template-columns: auto 576 | grid-template-areas: | 577 | "header" 578 | "system" 579 | "priority" 580 | "prog1" 581 | "prog2" 582 | "prog3" 583 | "prog4" 584 | "prog5" 585 | "prog6" 586 | ``` 587 | 588 | --------------------------------------------------------------------------------