@@ -13,18 +13,20 @@ func init() {
1313 registry .Add ("homewizard-p1" , NewHomeWizardP1FromConfig )
1414}
1515
16- // HomeWizardP1 implements the api.Meter interface for P1 meters
16+ // HomeWizardP1 is a wrapper for P1 meters using the common HomeWizardMeter base
1717type HomeWizardP1 struct {
18- log * util. Logger
19- device * device.P1Device
18+ * HomeWizardMeter
19+ p1MeterDevice * device.P1MeterDevice // Keep reference for battery control
2020}
2121
2222func NewHomeWizardP1FromConfig (other map [string ]any ) (api.Meter , error ) {
2323 cc := struct {
2424 Host string
2525 Token string
26+ Phases int // 1 or 3
2627 Timeout time.Duration
2728 }{
29+ Phases : 3 ,
2830 Timeout : device .DefaultTimeout ,
2931 }
3032
@@ -37,61 +39,37 @@ func NewHomeWizardP1FromConfig(other map[string]any) (api.Meter, error) {
3739 return nil , fmt .Errorf ("missing host or token - run 'evcc token homewizard'" )
3840 }
3941
40- m := & HomeWizardP1 {
41- log : util . NewLogger ( "homewizard-p1" ),
42- device : device . NewP1Device ( cc . Host , cc . Token , cc .Timeout ),
42+ // Validate phases
43+ if cc . Phases != 1 && cc . Phases != 3 {
44+ return nil , fmt . Errorf ( "invalid phases value %d: must be 1 or 3" , cc .Phases )
4345 }
4446
45- // Start device connection and wait for it to succeed
46- if err := m .device .StartAndWait (cc .Timeout ); err != nil {
47- return nil , err
48- }
47+ log := util .NewLogger ("homewizard-p1" )
4948
50- m .log .INFO .Printf ("configured P1 meter at %s" , cc .Host )
49+ // Create P1MeterDevice (includes battery control)
50+ p1MeterDevice := device .NewP1MeterDevice (cc .Host , cc .Token , cc .Timeout )
5151
52- return m , nil
53- }
54-
55- var _ api.Meter = (* HomeWizardP1 )(nil )
56-
57- // CurrentPower implements the api.Meter interface
58- func (m * HomeWizardP1 ) CurrentPower () (float64 , error ) {
59- measurement , err := m .device .GetMeasurement ()
60- if err != nil {
61- return 0 , err
52+ // Start device connection and wait for it to succeed
53+ if err := p1MeterDevice .StartAndWait (cc .Timeout ); err != nil {
54+ return nil , err
6255 }
63- return measurement .PowerW , nil
64- }
6556
66- var _ api. MeterEnergy = ( * HomeWizardP1 )( nil )
57+ log . INFO . Printf ( "configured P1 meter at %s (%d-phase)" , cc . Host , cc . Phases )
6758
68- // TotalEnergy implements the api.MeterEnergy interface
69- func (m * HomeWizardP1 ) TotalEnergy () (float64 , error ) {
70- measurement , err := m .device .GetMeasurement ()
71- if err != nil {
72- return 0 , err
59+ m := & HomeWizardP1 {
60+ HomeWizardMeter : & HomeWizardMeter {
61+ log : log ,
62+ device : p1MeterDevice ,
63+ usage : "grid" , // P1 meters are always grid meters
64+ phases : cc .Phases ,
65+ },
66+ p1MeterDevice : p1MeterDevice ,
7367 }
74- return measurement .EnergyImportT1kWh + measurement .EnergyImportT2kWh , nil
75- }
76-
77- var _ api.PhaseCurrents = (* HomeWizardP1 )(nil )
7868
79- // Currents implements the api.PhaseCurrents interface
80- func (m * HomeWizardP1 ) Currents () (float64 , float64 , float64 , error ) {
81- measurement , err := m .device .GetMeasurement ()
82- if err != nil {
83- return 0 , 0 , 0 , err
84- }
85- return measurement .CurrentL1A , measurement .CurrentL2A , measurement .CurrentL3A , nil
69+ return m , nil
8670}
8771
88- var _ api.PhaseVoltages = (* HomeWizardP1 )(nil )
89-
90- // Voltages implements the api.PhaseVoltages interface
91- func (m * HomeWizardP1 ) Voltages () (float64 , float64 , float64 , error ) {
92- measurement , err := m .device .GetMeasurement ()
93- if err != nil {
94- return 0 , 0 , 0 , err
95- }
96- return measurement .VoltageL1V , measurement .VoltageL2V , measurement .VoltageL3V , nil
72+ // SetBatteryMode sets battery mode via P1 meter (for battery controller)
73+ func (m * HomeWizardP1 ) SetBatteryMode (mode string ) error {
74+ return m .p1MeterDevice .SetBatteryMode (mode )
9775}
0 commit comments