- 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>
64 lines
1.5 KiB
Go
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()
|
|
}
|