homelab-codex-ws/services/ha-diag-agent/src/ha_diag/checks/heartbeat.py

48 lines
1.6 KiB
Python
Raw Normal View History

from __future__ import annotations
from ..ha_client import HAClient
from ..models import CheckResult, HAEventType, Severity
from .base import Check
class HeartbeatCheck(Check):
"""Pings HA /api/ to verify the API is reachable.
Validates the end-to-end pipeline: HA client check result event emitter.
Real diagnostic checks (entity availability, system health, etc.) come in Phase 3.
"""
name = "heartbeat"
def __init__(self, ha_client: HAClient) -> None:
self._client = ha_client
async def run(self) -> CheckResult:
try:
async with self._client:
data = await self._client.get_api_status()
if isinstance(data, dict) and "message" in data:
return CheckResult(
healthy=True,
event_type=None,
severity=Severity.info,
message="HA API reachable",
payload={"response": data},
)
return CheckResult(
healthy=False,
event_type=HAEventType.ha_websocket_dead,
severity=Severity.error,
message=f"HA API returned unexpected response: {data!r}",
payload={"response": str(data)},
)
except Exception as exc:
return CheckResult(
healthy=False,
event_type=HAEventType.ha_websocket_dead,
severity=Severity.error,
message=f"HA API unreachable: {exc}",
payload={"error": str(exc)},
)