@@ -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
369369SPH_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