CONTROL-001: add safe HA automation handoff
This commit is contained in:
@@ -9,6 +9,7 @@ from app.actuators.store import ActuatorStore
|
||||
from app.behavior.engine import BehaviorEngine
|
||||
from app.dependencies import get_ha_reader
|
||||
from app.ha.discovery import EntityRole
|
||||
from app.ha.exceptions import HaClientError
|
||||
from app.ha.models import HaEntitySummary
|
||||
from app.ha.reader import HaReader
|
||||
|
||||
@@ -22,6 +23,13 @@ class ConfigureActuatorRequest(BaseModel):
|
||||
|
||||
class ActivationRequest(BaseModel):
|
||||
active: bool
|
||||
pause_matching_automations: bool = False
|
||||
restore_paused_automations: bool = False
|
||||
|
||||
|
||||
class AutomationControlRequest(BaseModel):
|
||||
automation_entity_id: str = Field(pattern=r"^automation\.[a-z0-9_]+$")
|
||||
enabled: bool
|
||||
|
||||
|
||||
@router.get("/discovery", response_model=list[HaEntitySummary])
|
||||
@@ -96,13 +104,55 @@ def set_activation(
|
||||
request: Request,
|
||||
) -> ActuatorRecord:
|
||||
try:
|
||||
return _behavior(request).set_active(actuator_entity_id, active=payload.active)
|
||||
return _behavior(request).set_active(
|
||||
actuator_entity_id,
|
||||
active=payload.active,
|
||||
pause_matching_automations=payload.pause_matching_automations,
|
||||
restore_paused_automations=payload.restore_paused_automations,
|
||||
)
|
||||
except KeyError as exc:
|
||||
raise HTTPException(status_code=404, detail=str(exc)) from exc
|
||||
except ValueError as exc:
|
||||
raise HTTPException(status_code=409, detail=str(exc)) from exc
|
||||
|
||||
|
||||
@router.post(
|
||||
"/{actuator_entity_id}/related-automations/refresh",
|
||||
response_model=ActuatorRecord,
|
||||
)
|
||||
def refresh_related_automations(
|
||||
actuator_entity_id: str,
|
||||
request: Request,
|
||||
) -> ActuatorRecord:
|
||||
try:
|
||||
return _behavior(request).refresh_related_automations(actuator_entity_id)
|
||||
except KeyError as exc:
|
||||
raise HTTPException(status_code=404, detail=str(exc)) from exc
|
||||
except (ValueError, HaClientError) as exc:
|
||||
raise HTTPException(status_code=409, detail=str(exc)) from exc
|
||||
|
||||
|
||||
@router.post(
|
||||
"/{actuator_entity_id}/related-automations/control",
|
||||
response_model=ActuatorRecord,
|
||||
)
|
||||
def control_related_automation(
|
||||
actuator_entity_id: str,
|
||||
payload: AutomationControlRequest,
|
||||
request: Request,
|
||||
) -> ActuatorRecord:
|
||||
try:
|
||||
return _behavior(request).set_automation_enabled(
|
||||
actuator_entity_id,
|
||||
payload.automation_entity_id,
|
||||
enabled=payload.enabled,
|
||||
)
|
||||
except KeyError as exc:
|
||||
raise HTTPException(status_code=404, detail=str(exc)) from exc
|
||||
except (ValueError, HaClientError) as exc:
|
||||
raise HTTPException(status_code=409, detail=str(exc)) from exc
|
||||
|
||||
|
||||
@router.get("/reconciliation/state", response_model=ReconciliationState)
|
||||
def get_reconciliation_state(request: Request) -> ReconciliationState:
|
||||
store = getattr(request.app.state, "actuator_store", None)
|
||||
|
||||
Reference in New Issue
Block a user