diff --git a/pkg/fronius/fronius_test.go b/pkg/fronius/fronius_test.go index 3179ac7..4202ccf 100644 --- a/pkg/fronius/fronius_test.go +++ b/pkg/fronius/fronius_test.go @@ -241,7 +241,7 @@ func TestBatteryChargeMode5(t *testing.T) { setup() result, err := fronius.SetFroniusChargeBatteryMode(1000, 11000, 11000, 9000, 3500, 2500, "00:00", "23:59", modbus_ip, modbus_port) - assert.Equal(int16(22), result, "SetFroniusChargeBatteryMode returned wrong value") + assert.Equal(int16(31), result, "SetFroniusChargeBatteryMode returned wrong value") assert.NoError(err) teardown() @@ -251,19 +251,41 @@ func TestBatteryChargeMode6(t *testing.T) { assert := assert.New(t) setup() - result, err := fronius.SetFroniusChargeBatteryMode(8000, 2000, 11000, 9000, 3500, 0, "00:00", "23:59", modbus_ip, modbus_port) + result, err := fronius.SetFroniusChargeBatteryMode(8000, 2000, 11000, 8000, 3500, 0, "00:00", "23:59", modbus_ip, modbus_port) assert.Equal(int16(0), result, "SetFroniusChargeBatteryMode returned wrong value") assert.NoError(err) teardown() } +func TestBatteryChargeMode7(t *testing.T) { + assert := assert.New(t) + setup() + + result, err := fronius.SetFroniusChargeBatteryMode(10000, 7000, 11000, 0, 3500, 5000, "00:00", "23:59", modbus_ip, modbus_port) + assert.Equal(int16(9), result, "SetFroniusChargeBatteryMode returned wrong value") + assert.NoError(err) + + teardown() +} + +func TestBatteryChargeMode8(t *testing.T) { + assert := assert.New(t) + setup() + + result, err := fronius.SetFroniusChargeBatteryMode(5000, 7000, 11000, 10000, 3500, 3000, "00:00", "23:59", modbus_ip, modbus_port) + assert.Equal(int16(9), result, "SetFroniusChargeBatteryMode returned wrong value") + assert.NoError(err) + + teardown() +} + func TestBatteryChargeError(t *testing.T) { assert := assert.New(t) setup() result, err := fronius.SetFroniusChargeBatteryMode(1000, 11000, -11000, 9000, 3500, 0, "00:00", "23:59", modbus_ip, modbus_port) - assert.Equal(int16(-200), result, "SetFroniusChargeBatteryMode returned wrong value") + assert.Equal(int16(-72), result, "SetFroniusChargeBatteryMode returned wrong value") assert.Error(err) teardown() diff --git a/pkg/fronius/schedule.go b/pkg/fronius/schedule.go index 8f7a9dc..9611d65 100644 --- a/pkg/fronius/schedule.go +++ b/pkg/fronius/schedule.go @@ -12,14 +12,18 @@ func SetFroniusChargeBatteryMode(pw_forecast float64, pw_batt2charge float64, pw var ch_pc int16 = 0 pw_pv_net := pw_forecast - pw_consumption // Net solar power pw_batt := pw_batt_max - pw_batt2charge // actual battery power + pw_net := pw_batt_reserve + pw_pv_net // net power available (reserve + Net solar power) switch { case pw_batt2charge == 0: // battery 100% => do not charge u.Log.Info("Battery is full charged") + case pw_net < 0 && pw_batt < pw_batt_reserve: // net power is not enough and battery level is under the reserve => charge + u.Log.Infof("Battery is under the reserve and Net Power (battery reserve + Net solar power) is not enough: %f W", pw_net) + ch_pc = SetChargePower(pw_batt_max, -1*pw_net, max_charge) case pw_batt < pw_batt_reserve: // battery is less than reserve => charge u.Log.Infof("battery %f W < reserve %f W", pw_batt, pw_batt_reserve) ch_pc = SetChargePower(pw_batt_max, pw_batt_reserve-pw_batt, max_charge) - default: + default: // check if Actual battery is enough, charge oterwise pw_grid, charge_enabled := ChargeBattery(pw_pv_net, pw_batt) if charge_enabled { ch_pc = SetChargePower(pw_batt_max, -1*pw_grid, max_charge)