├── 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 Time Slot\n | \n \n Battery SOC\n | \n \n\tGrid\n\t | \n
\n \n \n {{states('sensor.sunsynk_time_slot_1')}} - {{states('sensor.sunsynk_time_slot_2')}}\n | \n \n {{ states('number.sunsynk_prog1_capacity') | round(0) }} %\n | \n \n\t{% if is_state('switch.sunsynk_prog1_grid_charge', 'on') %} {% else %} {% endif %}\n\t | \n
\n \n \n {{states('sensor.sunsynk_time_slot_2')}} - {{states('sensor.sunsynk_time_slot_3')}}\n | \n \n {{ states('number.sunsynk_prog2_capacity') | round(0) }} %\n | \n \n\t{% if is_state('switch.sunsynk_prog2_grid_charge', 'on') %} {% else %} {% endif %}\n\t | \n
\n \n \n {{states('sensor.sunsynk_time_slot_3')}} - {{states('sensor.sunsynk_time_slot_4')}}\n | \n \n {{ states('number.sunsynk_prog3_capacity') | round(0) }} %\n | \n \n\t{% if is_state('switch.sunsynk_prog3_grid_charge', 'on') %} {% else %} {% endif %}\n\t | \n
\n \n \n {{states('sensor.sunsynk_time_slot_4')}} - {{states('sensor.sunsynk_time_slot_5')}}\n | \n \n {{ states('number.sunsynk_prog4_capacity') | round(0) }} %\n | \n \n\t{% if is_state('switch.sunsynk_prog4_grid_charge', 'on') %} {% else %} {% endif %}\n\t | \n
\n \n \n {{states('sensor.sunsynk_time_slot_5')}} - {{states('sensor.sunsynk_time_slot_6')}}\n | \n \n {{ states('number.sunsynk_prog5_capacity') | round(0) }} %\n | \n \n\t{% if is_state('switch.sunsynk_prog5_grid_charge', 'on') %} {% else %} {% endif %}\n\t | \n
\n \n \n {{states('sensor.sunsynk_time_slot_6')}} - {{states('sensor.sunsynk_time_slot_1')}}\n | \n \n {{ states('number.sunsynk_prog6_capacity') | round(0) }} %\n | \n \n\t{% if is_state('switch.sunsynk_prog6_grid_charge', 'on') %} {% else %} {% endif %}\n\t | \n
\n \n
"
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 | 
22 | 
23 | 
24 | 
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 | 
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 | 
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 | 
77 |
78 | 
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 | 
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 | 
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 | 
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 |
--------------------------------------------------------------------------------