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() }