Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
112 commits
Select commit Hold shift + click to select a range
53510e8
fix power scale
daniel309 Jun 5, 2025
957325d
add limittemp
daniel309 Jun 5, 2025
eea11a7
add LPC mode register values as comment
daniel309 Jun 5, 2025
d8c4ac2
Merge branch 'master' into master
daniel309 Jun 6, 2025
686fa41
Merge branch 'master' into master
daniel309 Jun 6, 2025
024ec33
Merge branch 'evcc-io:master' into master
daniel309 Jun 7, 2025
42adbdc
Merge branch 'master' of https://github.com/daniel309/evcc
daniel309 Feb 24, 2026
29c516f
Merge branch 'master' of https://github.com/daniel309/evcc
daniel309 Feb 27, 2026
053eab6
Merge remote-tracking branch 'upstream/master'
daniel309 Mar 11, 2026
0fc1f68
feat: add temperature-based household load correction
daniel309 Mar 2, 2026
dcc047d
Implement heater profile separation for temperature correction
daniel309 Mar 11, 2026
91ba003
fix: remove incorrect temperature correction fallback
daniel309 Mar 11, 2026
c35e440
feat: add debug logging for heater profile separation
daniel309 Mar 11, 2026
0050874
feat: require explicit configuration for temperature correction
daniel309 Mar 11, 2026
2e73f28
chore: remove documentation files
daniel309 Mar 11, 2026
1b0fe62
refactor: remove unnecessary nearestRate() function
daniel309 Mar 11, 2026
c3a7988
refactor: add meter type constants for clarity
daniel309 Mar 11, 2026
c5629bb
feat: use _household constant with GORM default value
daniel309 Mar 15, 2026
ebe56c9
fix: address code review comments
daniel309 Mar 15, 2026
807d967
refactor: pre-index rates for clearer temperature lookup
daniel309 Mar 15, 2026
d7fd335
fix: remove trailing whitespace for linter
daniel309 Mar 15, 2026
8dcdc6a
fix: correct indentation for gci linter
daniel309 Mar 15, 2026
7c9ab6c
fix: remove all trailing whitespace from blank lines
daniel309 Mar 15, 2026
2ce3d68
feat: add loadpoint-specific energy tracking to metrics
daniel309 Mar 15, 2026
1618227
Increase loadpoint meter ID offset to 1000 and extract as constant
daniel309 Mar 15, 2026
ce86770
Fix formatting (golangci-lint)
daniel309 Mar 15, 2026
2c5affb
Extract 24h average temperature calculation into separate function
daniel309 Mar 15, 2026
346f54c
Improve heater profile debug message with slot count
daniel309 Mar 16, 2026
976c63e
Add debug logging for temperature correction adjustments
daniel309 Mar 16, 2026
40796d5
Fix temperature correction debug message units (kWh -> Wh)
daniel309 Mar 16, 2026
9976bcb
Merge branch 'master' into feature/temperature-correction
daniel309 Mar 16, 2026
ecd3cf7
Merge branch 'master' of https://github.com/evcc-io/evcc into feature…
daniel309 Mar 16, 2026
55225da
fix: scale kWh to Wh in 15min consumption debug logs
daniel309 Mar 17, 2026
1521829
Merge branch 'feature/temperature-correction' of https://github.com/d…
daniel309 Mar 17, 2026
e632bd0
test: add temperature correction tests
daniel309 Mar 17, 2026
297cf68
fix: format test file
daniel309 Mar 17, 2026
61f8ae0
Remove heatingThreshold configuration and logic
daniel309 Mar 18, 2026
0e8a216
Replace heatingCoefficient with per-charger OutdoorTemperatureSensiti…
daniel309 Mar 18, 2026
bd67797
Shorten comments to match codebase style
daniel309 Mar 19, 2026
194671e
Merge branch 'master' into feature/temperature-correction
daniel309 Mar 19, 2026
841cd7f
Add safety bounds to temperature correction factor
daniel309 Mar 19, 2026
027c7fd
Merge branch 'feature/temperature-correction' of https://github.com/d…
daniel309 Mar 19, 2026
9bc25d1
Merge branch 'master' into feature/temperature-correction
daniel309 Mar 20, 2026
5416b94
Merge branch 'master' into feature/temperature-correction
daniel309 Mar 20, 2026
d90f825
Merge branch 'master' into feature/temperature-correction
daniel309 Mar 23, 2026
8a0ef6f
Merge branch 'master' into feature/temperature-correction
daniel309 Mar 24, 2026
a466035
Merge branch 'master' into feature/temperature-correction
daniel309 Mar 25, 2026
7fc4cec
Merge branch 'master' into feature/temperature-correction
daniel309 Mar 25, 2026
823e05d
Merge branch 'master' into feature/temperature-correction
daniel309 Mar 26, 2026
717e40b
Merge branch 'master' into feature/temperature-correction
daniel309 Mar 27, 2026
2cd27e3
Merge branch 'master' into feature/temperature-correction
daniel309 Mar 30, 2026
51ea81d
Merge branch 'master' into feature/temperature-correction
daniel309 Mar 31, 2026
fac693d
Merge branch 'master' into feature/temperature-correction
daniel309 Apr 3, 2026
3373291
Merge branch 'master' into feature/temperature-correction
daniel309 Apr 3, 2026
142d8b1
Merge master into feature/temperature-correction
daniel309 Apr 9, 2026
18a8414
fix: resolve duplicate features key in luxtronik template
daniel309 Apr 9, 2026
6ed26b6
merge upstream/master, adapt to entity-based metrics, improve error m…
daniel309 Apr 18, 2026
00ee4fa
Merge branch 'master' into feature/temperature-correction
daniel309 Apr 19, 2026
eac0554
fix loadpoint energy tracking: use AddEnergy instead of manual calcul…
daniel309 Apr 19, 2026
56106d3
Merge branch 'master' into feature/temperature-correction
daniel309 Apr 20, 2026
4c6a36a
Merge branch 'master' into feature/temperature-correction
daniel309 Apr 20, 2026
22d2d5f
fix: skip temp correction log when load is 0
daniel309 Apr 20, 2026
b2c68c8
Merge branch 'feature/temperature-correction' of https://github.com/d…
daniel309 Apr 20, 2026
85da0d5
Merge branch 'master' into feature/temperature-correction
daniel309 Apr 21, 2026
1e43c89
Merge branch 'master' into feature/temperature-correction
daniel309 Apr 24, 2026
30bbead
refine temp correction debug logging
daniel309 Apr 24, 2026
a645f38
Merge branch 'feature/temperature-correction' of https://github.com/d…
daniel309 Apr 24, 2026
3d92c9f
Merge branch 'master' into feature/temperature-correction
daniel309 Apr 26, 2026
67d8626
merge upstream/master
daniel309 Apr 29, 2026
2d9da3c
Merge branch 'feature/temperature-correction' of https://github.com/d…
daniel309 Apr 29, 2026
bf69bd1
Merge branch 'master' into feature/temperature-correction
daniel309 Apr 29, 2026
6fa1b5a
fix error handling for metrics.ErrIncomplete
daniel309 Apr 29, 2026
761fbc0
Merge branch 'master' into feature/temperature-correction
daniel309 Apr 30, 2026
b764419
Merge branch 'master' into feature/temperature-correction
daniel309 May 3, 2026
23e0aa2
Merge branch 'master' into feature/temperature-correction
daniel309 May 4, 2026
31c9a54
Merge branch 'master' into feature/temperature-correction
daniel309 May 15, 2026
d0e0e80
fix formatting
daniel309 May 15, 2026
dac3e8b
Merge remote-tracking branch 'upstream/master' into feature/temperatu…
daniel309 May 15, 2026
192e22f
Merge upstream/master: resolve conflicts, simplify heating energy tra…
daniel309 May 15, 2026
19b0fb1
Merge branch 'master' into feature/temperature-correction
daniel309 May 17, 2026
23d9675
Merge branch 'master' into feature/temperature-correction
daniel309 May 18, 2026
c190abd
Merge branch 'master' into feature/temperature-correction
daniel309 May 19, 2026
a81c013
Merge branch 'master' into feature/temperature-correction
daniel309 May 20, 2026
fb8ed10
Merge branch 'master' into feature/temperature-correction
daniel309 May 20, 2026
d0881fa
Merge branch 'master' into feature/temperature-correction
daniel309 May 21, 2026
4573f71
Merge branch 'master' into feature/temperature-correction
daniel309 May 21, 2026
80fc47e
Merge branch 'master' into feature/temperature-correction
daniel309 May 26, 2026
8bc72ec
Merge branch 'master' into feature/temperature-correction
daniel309 May 27, 2026
3c78534
skip temp correction when forecast near room temp
daniel309 May 27, 2026
922d73e
Merge branch 'master' into feature/temperature-correction
daniel309 Jun 4, 2026
8bb7fc7
Merge branch 'master' into feature/temperature-correction
daniel309 Jun 5, 2026
e40a64d
Merge master
daniel309 Jun 7, 2026
5c6d961
Core: rename temperature forecast feature
daniel309 Jun 9, 2026
b9f73ef
Merge master
daniel309 Jun 9, 2026
b972f8b
Fix feature enum text parsing
daniel309 Jun 9, 2026
bc1a710
Fmt feature enum
daniel309 Jun 9, 2026
237576a
Merge branch 'master' into feature/temperature-correction
daniel309 Jun 11, 2026
893781b
Merge branch 'master' into feature/temperature-correction
daniel309 Jun 15, 2026
22be5ac
Merge remote-tracking branch 'origin/master' into feature/temperature…
daniel309 Jun 19, 2026
0d7223a
Merge upstream/master into feature/temperature-correction
daniel309 Jun 19, 2026
e5a9a58
Merge branch 'master' into feature/temperature-correction
daniel309 Jun 26, 2026
28bf49b
Merge remote-tracking branch 'upstream/master' into feature/temperatu…
daniel309 Jun 28, 2026
b7ca036
Merge branch 'feature/temperature-correction' of https://github.com/d…
daniel309 Jun 28, 2026
1ca6c09
merge upstream/master
daniel309 Jul 19, 2026
a0f8f4b
revert loadpoint.go comment to upstream
daniel309 Jul 19, 2026
16abb22
remove redundant loadpoint energy tracking from site.go
daniel309 Jul 19, 2026
3698f95
fix redundant nil checks and shadowed lp variable
daniel309 Jul 19, 2026
2d7edef
refactor: replace ScaleLoadByTemperatureForecast with DemandProfileWe…
daniel309 Jul 19, 2026
56ad6fa
Merge branch 'master' into feature/temperature-correction
daniel309 Jul 19, 2026
689fc94
reduce base load history window from 30 to 7 days
daniel309 Jul 19, 2026
f5782c0
revert: restore 30-day base load history window
daniel309 Jul 21, 2026
bdf69a1
merge upstream/master
daniel309 Jul 21, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 17 additions & 15 deletions api/feature.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,19 +4,21 @@ type Feature int

//go:generate go tool enumer -type Feature -text
const (
_ Feature = iota
CoarseCurrent // charger
IntegratedDevice // charger - always connected - no vehicle, no charging sessions
SwitchDevice // charger - no current control - heat pumps or switch sockets
Heating // charger - heating device - soc ist temperature (°C)
Continuous // charger - heating device where disabled means "normal operation"
Average // tariff
Cacheable // tariff
Offline // vehicle
Retryable // vehicle
Streaming // vehicle
WelcomeCharge // vehicle
ClimaterDisabled // vehicle - ignore climater state for charge control
AutodetectDisabled // vehicle - do not try to identify vehicle by status
WakeUpDisabled // vehicle - do not send wake-up calls
_ Feature = iota
CoarseCurrent // charger
IntegratedDevice // charger - always connected - no vehicle, no charging sessions
SwitchDevice // charger - no current control - heat pumps or switch sockets
Heating // charger - heating device - soc ist temperature (°C)
DemandProfileWeekly // charger - demand forecast: same weekday last week (warm water)
DemandProfileTemperature // charger - demand forecast: daily avg scaled by outdoor temp (room heating)
Continuous // charger - heating device where disabled means "normal operation"
Average // tariff
Cacheable // tariff
Offline // vehicle
Retryable // vehicle
Streaming // vehicle
WelcomeCharge // vehicle
ClimaterDisabled // vehicle - ignore climater state for charge control
AutodetectDisabled // vehicle - do not try to identify vehicle by status
WakeUpDisabled // vehicle - do not send wake-up calls
)
96 changes: 52 additions & 44 deletions api/feature_enumer.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 4 additions & 0 deletions core/metrics/collector.go
Original file line number Diff line number Diff line change
Expand Up @@ -170,6 +170,10 @@ func (c *Collector) EnergyProfile(from time.Time) (*[96]float64, error) {
return energyProfile(c.entity, from)
}

func (c *Collector) EnergyProfileWeekday() (*[96]float64, error) {
return energyProfileWeekday(c.entity)
}

// LastSlotEnergy returns the energy in kWh of the most recently completed
// 15min slot, or false when it has not been persisted (boot, data gap) or
// contains recovered downtime energy.
Expand Down
64 changes: 62 additions & 2 deletions core/metrics/db_profile.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,9 @@ import (

var ErrIncomplete = errors.New("meter profile incomplete")

// energyProfile returns a 15min average meter profile in Wh. The profile
// is sorted by timestamp starting at 00:00. It is guaranteed to contain 96 15min values.
// energyProfile returns a 15min average meter profile in kWh, averaged across all
// days in [from, now). Groups by time-of-day (96 slots). Returns ErrIncomplete if
// fewer than 96 slots are present.
func energyProfile(entity entity, from time.Time) (*[96]float64, error) {
db, err := db.Instance.DB()
if err != nil {
Expand Down Expand Up @@ -61,3 +62,62 @@ func energyProfile(entity entity, from time.Time) (*[96]float64, error) {

return (*[96]float64)(res), nil
}

// energyProfileWeekday returns the actual 96-slot 15min energy profile (kWh) for the
// same weekday as now, taken from 7 days ago. No averaging — one day is the forecast.
// Returns ErrIncomplete if fewer than 96 slots are present for that day.
func energyProfileWeekday(entity entity) (*[96]float64, error) {
database, err := db.Instance.DB()
if err != nil {
return nil, err
}

// same weekday, 7 days back: covers exactly 00:00–23:45 of that day
weekdayNum := int(time.Now().Weekday()) // 0=Sunday
rows, err := database.Query(`SELECT ts, COALESCE(energy, 0) AS energy
FROM meters
WHERE meter = ? AND COALESCE(recovered, 0) = 0
AND strftime('%w', ts, 'unixepoch', 'localtime') = ?
AND ts >= ?
AND ts < ?
ORDER BY ts ASC`,
entity.Id,
weekdayNum,
time.Now().AddDate(0, 0, -7).Truncate(24*time.Hour).Unix(),
time.Now().AddDate(0, 0, -6).Truncate(24*time.Hour).Unix(),
)
if err != nil {
return nil, err
}
defer rows.Close()

var prev time.Time
res := make([]float64, 0, 96)

for rows.Next() {
var ts SqlTime
var val float64

if err := rows.Scan(&ts, &val); err != nil {
return nil, err
}

// interpolate single missing value
if !prev.IsZero() && time.Time(ts).Sub(prev) == 2*tariff.SlotDuration {
res = append(res, (val+res[len(res)-1])/2)
}
prev = time.Time(ts)

res = append(res, val)
}

if err := rows.Err(); err != nil {
return nil, err
}

if len(res) != 96 {
return nil, ErrIncomplete
}

return (*[96]float64)(res), nil
}
Loading
Loading