import { useEffect, useState } from 'react' import { getJson } from '../api/postgrest' type LatestRow = { site_id: number pump_id: number pump_code: string rated_power_w: number schedulable: boolean measured_at: string | null is_on: boolean | null power_w: number | null energy_wh_total: number | null } type DayRow = { day: string; kwh: number; on_minutes: number } const POLL_MS = 60_000 /** Karta bazénového čerpadla (Shelly): stav, příkon, dnešní kWh + týdenní mini přehled. */ export function PoolCard({ siteId }: { siteId: number }) { const [latest, setLatest] = useState(null) const [days, setDays] = useState([]) useEffect(() => { let alive = true const load = async () => { try { const [l, d] = await Promise.all([ getJson('/vw_latest_pool_pump', { site_id: `eq.${siteId}` }), getJson('/vw_pool_pump_day_energy', { site_id: `eq.${siteId}`, order: 'day.desc', limit: '7', }), ]) if (!alive) return setLatest(l[0] ?? null) setDays(d) } catch { /* karta je doplňková — chybu nechováme */ } } void load() const t = setInterval(load, POLL_MS) return () => { alive = false clearInterval(t) } }, [siteId]) if (!latest) return null const stale = latest.measured_at != null && Date.now() - new Date(latest.measured_at).getTime() > 5 * 60_000 const running = latest.is_on === true const today = days[0] return (
🏊 Bazénové čerpadlo 5 min stará' : running ? 'běží' : 'stojí'} />
{latest.schedulable ? 'řízeno plánem' : 'jen měření'}
{stale ? '—' : running ? `${latest.power_w ?? 0} W` : '0 W'}
příkon
{today ? `${today.kwh.toFixed(2)}` : '—'}
kWh dnes
{today ? `${Math.round(today.on_minutes / 60 * 10) / 10} h` : '—'}
běh dnes
{days.length > 1 && (
{[...days].reverse().map((d) => { const max = Math.max(...days.map((x) => x.kwh), 0.01) return (
) })}
)}
) }