Skip to content

Commit 1479621

Browse files
committed
0.0.4 beta 1
1 parent 11c46be commit 1479621

7 files changed

Lines changed: 1278 additions & 323 deletions

File tree

README.md

Lines changed: 202 additions & 162 deletions
Large diffs are not rendered by default.

custom_components/growatt_modbus/const.py

Lines changed: 90 additions & 93 deletions
Original file line numberDiff line numberDiff line change
@@ -365,108 +365,104 @@ def get_sensor_type(sensor_key: str) -> str:
365365
}
366366
}
367367

368-
# SPH Hybrid Series (Storage with battery)
368+
# SPH Hybrid Series (Storage with battery). Based off protocol v1.20
369369
SPH_3000_10000 = {
370-
'name': 'SPH-3000-10000',
371-
'description': 'Hybrid inverter with battery storage (3-10kW)',
372-
'notes': 'Uses 0-124, 1000-1124 register ranges. Includes battery management.',
373-
'input_registers': {
374-
# ============================================================================
375-
# BASE RANGE 0-124: PV Input and AC Output (same as MIN series)
376-
# ============================================================================
377-
378-
# System Status
379-
0: {'name': 'inverter_status', 'scale': 1, 'unit': '', 'desc': '0=Waiting, 1=Normal, 3=Fault'},
380-
381-
# PV Total Power (32-bit)
382-
1: {'name': 'pv_total_power_high', 'scale': 1, 'unit': '', 'desc': 'Total PV power HIGH word', 'pair': 2},
383-
2: {'name': 'pv_total_power_low', 'scale': 1, 'unit': '', 'desc': 'Total PV power LOW word', 'pair': 1, 'combined_scale': 0.1, 'combined_unit': 'W'},
384-
385-
# PV String 1
386-
3: {'name': 'pv1_voltage', 'scale': 0.1, 'unit': 'V', 'desc': 'PV1 DC voltage'},
387-
4: {'name': 'pv1_current', 'scale': 0.1, 'unit': 'A', 'desc': 'PV1 DC current'},
388-
5: {'name': 'pv1_power_high', 'scale': 1, 'unit': '', 'desc': 'PV1 power HIGH word', 'pair': 6},
389-
6: {'name': 'pv1_power_low', 'scale': 1, 'unit': '', 'desc': 'PV1 power LOW word', 'pair': 5, 'combined_scale': 0.1, 'combined_unit': 'W'},
390-
391-
# PV String 2
392-
7: {'name': 'pv2_voltage', 'scale': 0.1, 'unit': 'V', 'desc': 'PV2 DC voltage'},
393-
8: {'name': 'pv2_current', 'scale': 0.1, 'unit': 'A', 'desc': 'PV2 DC current'},
394-
9: {'name': 'pv2_power_high', 'scale': 1, 'unit': '', 'desc': 'PV2 power HIGH word', 'pair': 10},
395-
10: {'name': 'pv2_power_low', 'scale': 1, 'unit': '', 'desc': 'PV2 power LOW word', 'pair': 9, 'combined_scale': 0.1, 'combined_unit': 'W'},
396-
397-
# AC Output
398-
37: {'name': 'ac_frequency', 'scale': 0.01, 'unit': 'Hz', 'desc': 'AC frequency'},
399-
38: {'name': 'ac_voltage', 'scale': 0.1, 'unit': 'V', 'desc': 'AC voltage'},
400-
39: {'name': 'ac_current', 'scale': 0.1, 'unit': 'A', 'desc': 'AC current'},
401-
40: {'name': 'ac_power_high', 'scale': 1, 'unit': '', 'desc': 'AC power HIGH', 'pair': 41},
402-
41: {'name': 'ac_power_low', 'scale': 1, 'unit': '', 'desc': 'AC power LOW', 'pair': 40, 'combined_scale': 0.1, 'combined_unit': 'VA'},
403-
404-
# Energy
405-
53: {'name': 'energy_today_high', 'scale': 1, 'unit': '', 'desc': 'Today energy HIGH', 'pair': 54},
406-
54: {'name': 'energy_today_low', 'scale': 1, 'unit': '', 'desc': 'Today energy LOW', 'pair': 53, 'combined_scale': 0.1, 'combined_unit': 'kWh'},
407-
55: {'name': 'energy_total_high', 'scale': 1, 'unit': '', 'desc': 'Total energy HIGH', 'pair': 56},
408-
56: {'name': 'energy_total_low', 'scale': 1, 'unit': '', 'desc': 'Total energy LOW', 'pair': 55, 'combined_scale': 0.1, 'combined_unit': 'kWh'},
409-
410-
# Temperatures
411-
93: {'name': 'inverter_temp', 'scale': 0.1, 'unit': '°C'},
412-
370+
"name": "SPH 3000-10000 (Hybrid Storage)",
371+
"desc": "SPH series hybrid inverters with battery storage",
372+
"input_registers": {
413373
# Status
414-
105: {'name': 'fault_code', 'scale': 1, 'unit': ''},
415-
112: {'name': 'warning_code', 'scale': 1, 'unit': ''},
374+
0: {"name": "inverter_status", "scale": 1, "desc": "0=Waiting, 1=Normal, 3=Fault, 5=Standby"},
375+
376+
# PV Inputs - Base Range
377+
1: {"name": "pv_total_power_high", "scale": 1, "desc": "Total PV power HIGH word", "pair": 2},
378+
2: {"name": "pv_total_power_low", "scale": 1, "desc": "Total PV power LOW word", "combined_scale": 0.1},
379+
3: {"name": "pv1_voltage", "scale": 0.1, "desc": "PV1 DC voltage"},
380+
4: {"name": "pv1_current", "scale": 0.1, "desc": "PV1 DC current"},
381+
5: {"name": "pv1_power_high", "scale": 1, "desc": "PV1 power HIGH word", "pair": 6},
382+
6: {"name": "pv1_power_low", "scale": 1, "desc": "PV1 power LOW word", "combined_scale": 0.1},
383+
7: {"name": "pv2_voltage", "scale": 0.1, "desc": "PV2 DC voltage"},
384+
8: {"name": "pv2_current", "scale": 0.1, "desc": "PV2 DC current"},
385+
9: {"name": "pv2_power_high", "scale": 1, "desc": "PV2 power HIGH word", "pair": 10},
386+
10: {"name": "pv2_power_low", "scale": 1, "desc": "PV2 power LOW word", "combined_scale": 0.1},
387+
388+
# AC Output - CORRECTED LOCATION (was wrong at 1003-1006)
389+
37: {"name": "ac_frequency", "scale": 0.01, "desc": "AC frequency"},
390+
38: {"name": "ac_voltage", "scale": 0.1, "desc": "AC voltage"},
391+
39: {"name": "ac_current", "scale": 0.1, "desc": "AC current"},
392+
40: {"name": "ac_power_high", "scale": 1, "desc": "AC power HIGH", "pair": 41},
393+
41: {"name": "ac_power_low", "scale": 1, "desc": "AC power LOW", "combined_scale": 0.1},
394+
395+
# Energy - Base Range
396+
53: {"name": "energy_today_high", "scale": 1, "desc": "Today energy HIGH", "pair": 54},
397+
54: {"name": "energy_today_low", "scale": 1, "desc": "Today energy LOW", "combined_scale": 0.1},
398+
55: {"name": "energy_total_high", "scale": 1, "desc": "Total energy HIGH", "pair": 56},
399+
56: {"name": "energy_total_low", "scale": 1, "desc": "Total energy LOW", "combined_scale": 0.1},
400+
401+
# Temperature
402+
93: {"name": "inverter_temp", "scale": 0.1, "desc": "Inverter temperature"},
403+
404+
# Diagnostics
405+
105: {"name": "fault_code", "scale": 1, "desc": "Fault code"},
406+
112: {"name": "warning_code", "scale": 1, "desc": "Warning code"},
416407

417-
# ============================================================================
418-
# STORAGE RANGE 1000-1124: Battery and Power Flow
419-
# ============================================================================
408+
# ===== STORAGE RANGE (1000-1124) =====
420409

421-
# System Work Mode
422-
1000: {'name': 'system_work_mode', 'scale': 1, 'unit': '', 'desc': 'Work mode'},
410+
# System Mode
411+
1000: {"name": "system_work_mode", "scale": 1, "desc": "Work mode"},
423412

424-
# Battery Discharge/Charge Power
425-
1009: {'name': 'discharge_power_high', 'scale': 1, 'unit': '', 'pair': 1010},
426-
1010: {'name': 'discharge_power_low', 'scale': 1, 'unit': '', 'pair': 1009, 'combined_scale': 0.1, 'combined_unit': 'W'},
427-
1011: {'name': 'charge_power_high', 'scale': 1, 'unit': '', 'pair': 1012},
428-
1012: {'name': 'charge_power_low', 'scale': 1, 'unit': '', 'pair': 1011, 'combined_scale': 0.1, 'combined_unit': 'W'},
413+
# Battery Power Flow
414+
1009: {"name": "discharge_power_high", "scale": 1, "desc": "Discharge power HIGH", "pair": 1010},
415+
1010: {"name": "discharge_power_low", "scale": 1, "desc": "Discharge power LOW", "combined_scale": 0.1},
416+
1011: {"name": "charge_power_high", "scale": 1, "desc": "Charge power HIGH", "pair": 1012},
417+
1012: {"name": "charge_power_low", "scale": 1, "desc": "Charge power LOW", "combined_scale": 0.1},
429418

430-
# Battery State
431-
1013: {'name': 'battery_voltage', 'scale': 0.1, 'unit': 'V'},
432-
1014: {'name': 'battery_soc', 'scale': 1, 'unit': '%'},
433-
1040: {'name': 'battery_temp', 'scale': 0.1, 'unit': '°C'},
419+
# Battery Status
420+
1013: {"name": "battery_voltage", "scale": 0.1, "desc": "Battery voltage"},
421+
1014: {"name": "battery_soc", "scale": 1, "desc": "Battery state of charge %"},
422+
1040: {"name": "battery_temp", "scale": 0.1, "desc": "Battery temperature"},
423+
1041: {"name": "battery_type", "scale": 1, "desc": "Battery type"},
434424

435425
# Power Flow
436-
1015: {'name': 'power_to_user_high', 'scale': 1, 'unit': '', 'pair': 1016},
437-
1016: {'name': 'power_to_user_low', 'scale': 1, 'unit': '', 'pair': 1015, 'combined_scale': 0.1, 'combined_unit': 'W'},
438-
1021: {'name': 'power_to_load_high', 'scale': 1, 'unit': '', 'pair': 1022},
439-
1022: {'name': 'power_to_load_low', 'scale': 1, 'unit': '', 'pair': 1021, 'combined_scale': 0.1, 'combined_unit': 'W'},
440-
1029: {'name': 'power_to_grid_high', 'scale': 1, 'unit': '', 'pair': 1030},
441-
1030: {'name': 'power_to_grid_low', 'scale': 1, 'unit': '', 'pair': 1029, 'combined_scale': 0.1, 'combined_unit': 'W', 'signed': True},
442-
443-
# Energy Breakdown
444-
1044: {'name': 'energy_to_user_today_high', 'scale': 1, 'unit': '', 'pair': 1045},
445-
1045: {'name': 'energy_to_user_today_low', 'scale': 1, 'unit': '', 'pair': 1044, 'combined_scale': 0.1, 'combined_unit': 'kWh'},
446-
1046: {'name': 'energy_to_user_total_high', 'scale': 1, 'unit': '', 'pair': 1047},
447-
1047: {'name': 'energy_to_user_total_low', 'scale': 1, 'unit': '', 'pair': 1046, 'combined_scale': 0.1, 'combined_unit': 'kWh'},
448-
1048: {'name': 'energy_to_grid_today_high', 'scale': 1, 'unit': '', 'pair': 1049},
449-
1049: {'name': 'energy_to_grid_today_low', 'scale': 1, 'unit': '', 'pair': 1048, 'combined_scale': 0.1, 'combined_unit': 'kWh'},
450-
1050: {'name': 'energy_to_grid_total_high', 'scale': 1, 'unit': '', 'pair': 1051},
451-
1051: {'name': 'energy_to_grid_total_low', 'scale': 1, 'unit': '', 'pair': 1050, 'combined_scale': 0.1, 'combined_unit': 'kWh'},
452-
1052: {'name': 'discharge_energy_today_high', 'scale': 1, 'unit': '', 'pair': 1053},
453-
1053: {'name': 'discharge_energy_today_low', 'scale': 1, 'unit': '', 'pair': 1052, 'combined_scale': 0.1, 'combined_unit': 'kWh'},
454-
1054: {'name': 'discharge_energy_total_high', 'scale': 1, 'unit': '', 'pair': 1055},
455-
1055: {'name': 'discharge_energy_total_low', 'scale': 1, 'unit': '', 'pair': 1054, 'combined_scale': 0.1, 'combined_unit': 'kWh'},
456-
1056: {'name': 'charge_energy_today_high', 'scale': 1, 'unit': '', 'pair': 1057},
457-
1057: {'name': 'charge_energy_today_low', 'scale': 1, 'unit': '', 'pair': 1056, 'combined_scale': 0.1, 'combined_unit': 'kWh'},
458-
1058: {'name': 'charge_energy_total_high', 'scale': 1, 'unit': '', 'pair': 1059},
459-
1059: {'name': 'charge_energy_total_low', 'scale': 1, 'unit': '', 'pair': 1058, 'combined_scale': 0.1, 'combined_unit': 'kWh'},
460-
1060: {'name': 'load_energy_today_high', 'scale': 1, 'unit': '', 'pair': 1061},
461-
1061: {'name': 'load_energy_today_low', 'scale': 1, 'unit': '', 'pair': 1060, 'combined_scale': 0.1, 'combined_unit': 'kWh'},
462-
1062: {'name': 'load_energy_total_high', 'scale': 1, 'unit': '', 'pair': 1063},
463-
1063: {'name': 'load_energy_total_low', 'scale': 1, 'unit': '', 'pair': 1062, 'combined_scale': 0.1, 'combined_unit': 'kWh'},
426+
1015: {"name": "power_to_user_high", "scale": 1, "desc": "Power to user HIGH", "pair": 1016},
427+
1016: {"name": "power_to_user_low", "scale": 1, "desc": "Power to user LOW", "combined_scale": 0.1},
428+
1021: {"name": "power_to_load_high", "scale": 1, "desc": "Load power HIGH", "pair": 1022},
429+
1022: {"name": "power_to_load_low", "scale": 1, "desc": "Load power LOW", "combined_scale": 0.1},
430+
1029: {"name": "power_to_grid_high", "scale": 1, "desc": "Grid power HIGH", "pair": 1030},
431+
1030: {"name": "power_to_grid_low", "scale": 1, "desc": "Grid power LOW", "combined_scale": 0.1},
432+
1037: {"name": "self_consumption_power_high", "scale": 1, "desc": "Self-consumption HIGH", "pair": 1038},
433+
1038: {"name": "self_consumption_power_low", "scale": 1, "desc": "Self-consumption LOW", "combined_scale": 0.1},
434+
1039: {"name": "self_consumption_percentage", "scale": 1, "desc": "Self-consumption %"},
435+
436+
# Energy Totals
437+
1044: {"name": "energy_to_user_today_high", "scale": 1, "desc": "Energy to user today HIGH", "pair": 1045},
438+
1045: {"name": "energy_to_user_today_low", "scale": 1, "desc": "Energy to user today LOW", "combined_scale": 0.1},
439+
1046: {"name": "energy_to_user_total_high", "scale": 1, "desc": "Energy to user total HIGH", "pair": 1047},
440+
1047: {"name": "energy_to_user_total_low", "scale": 1, "desc": "Energy to user total LOW", "combined_scale": 0.1},
441+
1048: {"name": "energy_to_grid_today_high", "scale": 1, "desc": "Energy to grid today HIGH", "pair": 1049},
442+
1049: {"name": "energy_to_grid_today_low", "scale": 1, "desc": "Energy to grid today LOW", "combined_scale": 0.1},
443+
1050: {"name": "energy_to_grid_total_high", "scale": 1, "desc": "Energy to grid total HIGH", "pair": 1051},
444+
1051: {"name": "energy_to_grid_total_low", "scale": 1, "desc": "Energy to grid total LOW", "combined_scale": 0.1},
445+
1052: {"name": "discharge_energy_today_high", "scale": 1, "desc": "Discharge today HIGH", "pair": 1053},
446+
1053: {"name": "discharge_energy_today_low", "scale": 1, "desc": "Discharge today LOW", "combined_scale": 0.1},
447+
1054: {"name": "discharge_energy_total_high", "scale": 1, "desc": "Discharge total HIGH", "pair": 1055},
448+
1055: {"name": "discharge_energy_total_low", "scale": 1, "desc": "Discharge total LOW", "combined_scale": 0.1},
449+
1056: {"name": "charge_energy_today_high", "scale": 1, "desc": "Charge today HIGH", "pair": 1057},
450+
1057: {"name": "charge_energy_today_low", "scale": 1, "desc": "Charge today LOW", "combined_scale": 0.1},
451+
1058: {"name": "charge_energy_total_high", "scale": 1, "desc": "Charge total HIGH", "pair": 1059},
452+
1059: {"name": "charge_energy_total_low", "scale": 1, "desc": "Charge total LOW", "combined_scale": 0.1},
453+
1060: {"name": "load_energy_today_high", "scale": 1, "desc": "Load today HIGH", "pair": 1061},
454+
1061: {"name": "load_energy_today_low", "scale": 1, "desc": "Load today LOW", "combined_scale": 0.1},
455+
1062: {"name": "load_energy_total_high", "scale": 1, "desc": "Load total HIGH", "pair": 1063},
456+
1063: {"name": "load_energy_total_low", "scale": 1, "desc": "Load total LOW", "combined_scale": 0.1},
457+
},
458+
"holding_registers": {
459+
3: {"name": "firmware_version", "desc": "Firmware version"},
460+
9: {"name": "serial_number_1", "desc": "Serial number part 1"},
461+
10: {"name": "serial_number_2", "desc": "Serial number part 2"},
462+
11: {"name": "serial_number_3", "desc": "Serial number part 3"},
463+
12: {"name": "serial_number_4", "desc": "Serial number part 4"},
464+
13: {"name": "serial_number_5", "desc": "Serial number part 5"},
464465
},
465-
'holding_registers': {
466-
0: {'name': 'on_off', 'scale': 1, 'unit': '', 'access': 'RW'},
467-
1008: {'name': 'system_enable', 'scale': 1, 'unit': '', 'access': 'RW'},
468-
1044: {'name': 'priority', 'scale': 1, 'unit': '', 'access': 'RW', 'desc': '0=Load, 1=Battery, 2=Grid'},
469-
}
470466
}
471467

472468
# MAX Series (Commercial Three-phase, 50-125kW)
@@ -922,6 +918,7 @@ def get_sensor_type(sensor_key: str) -> str:
922918
0: {'name': 'Waiting', 'desc': 'Waiting for sufficient PV power or grid conditions'},
923919
1: {'name': 'Normal', 'desc': 'Operating normally'},
924920
3: {'name': 'Fault', 'desc': 'Fault condition detected'},
921+
5: {"name": "Standby", "icon": "mdi:sleep", "desc": "Inverter in standby mode"},
925922
}
926923

927924
# Helper functions

0 commit comments

Comments
 (0)