From a33cf0ba3583776c5c4b6c0b612eddc038ac9910 Mon Sep 17 00:00:00 2001 From: andig Date: Mon, 21 Apr 2025 13:20:23 +0200 Subject: [PATCH] Vaillant: re-boost hot water every 15m (#20752) --- charger/vaillant.go | 30 +++++++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/charger/vaillant.go b/charger/vaillant.go index d02d169b6..5ccd7ef46 100644 --- a/charger/vaillant.go +++ b/charger/vaillant.go @@ -93,18 +93,46 @@ func NewVaillantFromConfig(ctx context.Context, other map[string]interface{}) (a systemId := homes[0].SystemID heating := cc.HeatingSetpoint > 0 + wwCancel := func() {} + set := func(mode int64) error { switch mode { case Normal: if heating { return conn.StopZoneQuickVeto(systemId, cc.HeatingZone) } + + wwCancel() return conn.StopHotWaterBoost(systemId, sensonet.HOTWATERINDEX_DEFAULT) + case Boost: if heating { return conn.StartZoneQuickVeto(systemId, cc.HeatingZone, cc.HeatingSetpoint, 4) // hours } - return conn.StartHotWaterBoost(systemId, sensonet.HOTWATERINDEX_DEFAULT) // zone 255 + + if err := conn.StartHotWaterBoost(systemId, sensonet.HOTWATERINDEX_DEFAULT); err != nil { + return err + } + + var wwCtx context.Context + wwCtx, wwCancel = context.WithCancel(ctx) + + // re-boost every 15m + go func() { + for { + select { + case <-wwCtx.Done(): + return + case <-time.After(15 * time.Minute): + if err := conn.StartHotWaterBoost(systemId, sensonet.HOTWATERINDEX_DEFAULT); err != nil { + log.ERROR.Println("hot water boost:", err) + } + } + } + }() + + return nil + default: return api.ErrNotAvailable }