Files
energy-collector/db.go
Thomas Klaehn 62ffd06444 Add go-e wallbox charger integration
- charger.go: polls go-e /api/status?filter=nrg,eto every 10 s
- db.go: WriteCharger() inserts into charger hypertable
- config.go: ChargerConf with host field
- main.go: polls charger in parallel with inverter and meters
- schema.sql: charger table + charger_10m/1h/daily aggregates + policies

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-18 11:30:59 +02:00

64 lines
1.5 KiB
Go

package main
import (
"context"
"fmt"
"time"
"github.com/jackc/pgx/v5/pgxpool"
)
// DB wraps a pgx connection pool for writing energy data.
type DB struct {
pool *pgxpool.Pool
}
func NewDB(ctx context.Context, dsn string) (*DB, error) {
pool, err := pgxpool.New(ctx, dsn)
if err != nil {
return nil, fmt.Errorf("pgxpool: %w", err)
}
if err := pool.Ping(ctx); err != nil {
return nil, fmt.Errorf("db ping: %w", err)
}
return &DB{pool: pool}, nil
}
func (db *DB) WriteInverter(ctx context.Context, t time.Time, d *InverterData) error {
_, err := db.pool.Exec(ctx, `
INSERT INTO inverter
(time, pv1_power, pv2_power, pv_l1_power, pv_l2_power, pv_l3_power,
battery_soc, grid_import_kwh, grid_export_kwh, pv_energy_kwh)
VALUES ($1,$2,$3,$4,$5,$6,$7,$8,$9,$10)`,
t,
d.Pv1Power, d.Pv2Power,
d.PvL1Power, d.PvL2Power, d.PvL3Power,
d.BatterySoC,
d.GridImportKwh, d.GridExportKwh, d.PvEnergyKwh,
)
return err
}
func (db *DB) WriteMeter(ctx context.Context, t time.Time, r MeterReading) error {
_, err := db.pool.Exec(ctx, `
INSERT INTO power_meter (time, device, l1_power, l2_power, l3_power, import_kwh, export_kwh)
VALUES ($1,$2,$3,$4,$5,$6,$7)`,
t, r.Device,
r.L1Power, r.L2Power, r.L3Power,
r.ImportKwh, r.ExportKwh,
)
return err
}
func (db *DB) WriteCharger(ctx context.Context, r ChargerReading) error {
_, err := db.pool.Exec(ctx,
`INSERT INTO charger (time, power, eto_wh) VALUES ($1, $2, $3)`,
r.Time, r.Power, r.EtoWh,
)
return err
}
func (db *DB) Close() {
db.pool.Close()
}