feat(ev): proaktivní notifikace 'píchni auto' (default-off)

job ev_presence_notify + fn_ev_presence_nudge_due (SQL-first rozhodnutí+dedup);
asset_vehicle.presence_nudge_enabled default false=inertní (V110). Worktree agent.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Dusan Vojacek
2026-06-14 22:55:17 +02:00
parent fc6d9833a7
commit c03f9dd9d6
4 changed files with 374 additions and 0 deletions

View File

@@ -30,6 +30,7 @@ from services.signal_service import (
run_signal_outbound_send_for_active_sites,
run_signal_outbound_verify_for_active_sites,
)
from services.ev_presence_notify import run_ev_presence_nudge_for_all_active_sites
logger = logging.getLogger(__name__)
@@ -161,6 +162,18 @@ async def lifespan(app: FastAPI):
except Exception:
logger.exception("scheduled_signal_outbound_verify failed")
async def scheduled_ev_presence_nudge() -> None:
"""Proaktivní "auto doma + nepíchnuté + levné/přebytek → píchni ho".
SQL-first rozhodnutí + dedup v ems.fn_ev_presence_nudge_due (insert do
ev_presence_nudge_sent). Default-off per vozidlo (presence_nudge_enabled),
takže job běží inertně, dokud se na nějakém vozidle nezapne.
"""
try:
await run_ev_presence_nudge_for_all_active_sites(app.state.pg_pool)
except Exception:
logger.exception("scheduled_ev_presence_nudge failed")
async def scheduled_pool_control() -> None:
# Bazén: SQL-first rozhodnutí (fn_pool_control_tick) — nejlevnější souvislé
# okno denního runtime + dump-load při sell<=0; zařadí POOL_PUMP_ON (jen když
@@ -437,6 +450,14 @@ async def lifespan(app: FastAPI):
id="pool_control",
replace_existing=True,
)
scheduler.add_job(
scheduled_ev_presence_nudge,
"cron",
minute="5,30,55",
second=10,
id="ev_presence_nudge",
replace_existing=True,
)
scheduler.add_job(scheduled_daily_plan, "cron", hour=15, minute=0, id="daily_plan")
scheduler.add_job(
scheduled_rolling_replan,