Records hourly solar panel readings imported from /home/pmp/ai/solar/csv
by the sibling repo's import-csv.mjs. Schema includes only the 8
columns that always carry data; the 5 always-empty CSV columns are
dropped.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Add production and consumption table migrations. Fix sync-month.sh
to use Linux date syntax and default to port 3030. Read Eloverblik
token from ELOVERBLIK_TOKEN env var with .token file fallback.
Mount .token into Docker container.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Rebuild Dockerfile with 3 stages (CSS, uberjar, runtime) on port 3030.
Add docker-compose.yml loading .env. Fix insert-price! ON CONFLICT to
target (time_dk, price_area) matching the actual unique index.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Remove docker-compose.yml and use JDBC_URL from .env for all
profiles. Makefile now exports .env variables automatically.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Check consumption table before fetching; return early if data exists
- Return "no data to fetch" for dates >= yesterday (not yet available)
- Add sync-month.sh script to sync all days in a month
- Add kill-server.sh script to free port 3000
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Accept ?date= param on POST /eloverblik/sync (defaults to today)
- Populate production table from D06 meter (571313113163368491)
- Populate consumption table from D07 meter (571313113163368507)
- ON CONFLICT DO NOTHING to skip existing data
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Add eloverblik controller with API client for metering points, time series, and charges
- Add migrations for metering_points, meter_readings, and charges tables
- Add HugSQL queries (upsert-metering-point!, insert-meter-reading!, insert-charge!)
- Add POST /eloverblik/sync route to trigger sync from browser
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Tabs now display the date (e.g. "Today 2026-02-14"). Removed redundant
"Today — DK1" / "Tomorrow — DK1" headings from the price tables.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Remove the Refresh Prices button. Prices are fetched automatically on
page load, and clicking the headline triggers a re-fetch.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
HTMX-powered tabs switch between today's and tomorrow's prices without
full page reload. Today tab is active by default.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
One request per area (DK1, DK2) avoids hitting the 200-record limit
that was truncating tomorrow's data when both areas were fetched together.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Changed upsert to INSERT ON CONFLICT DO NOTHING so existing prices are
never overwritten. Added unique index on (time_dk, price_area) to enforce
no duplicate quarter-hour entries per area.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Each hour shows as an open-by-default card with the average price and
indented quarter-hour rows. Added @source directive to Tailwind v4 input
so .clj files are scanned for utility classes.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
URI/create rejects raw braces/brackets in query strings. URL-encode the
filter JSON so the request succeeds.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Adds a prices controller that fetches DK1/DK2 hourly spot prices via the
Energi Data Service API, stores them in PostgreSQL, and displays today's
and tomorrow's DK1 prices on the home page in øre/kWh. An HTMX "Refresh
Prices" button triggers the fetch-and-display cycle.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>