Add per-enclosure temperature metrics + Home Assistant MQTT publisher

- enclosure: fetch SES element descriptor page (0x07) and label temp/fan/
  psu/voltage elements with human-readable names
- temps service + /api/temps: per-enclosure hotspot (max across SES sensors
  and housed drive temps) plus named SES sensor list
- mqtt_publisher: paho-mqtt with HA discovery (device per enclosure, hotspot
  + per-sensor entities), LWT availability, opt-in via MQTT_HOST
- secrets: OpenBao KV v2 reader; MQTT creds sourced from secret/home_assistant
  with env fallback
- compose/requirements/README updated
This commit is contained in:
2026-06-16 04:45:32 +00:00
parent 50dd2a631e
commit d41e3838d5
11 changed files with 591 additions and 10 deletions

View File

@@ -67,6 +67,7 @@ class SlotWithDrive(BaseModel):
class PsuStatus(BaseModel):
index: int
name: str | None = None
status: str
fail: bool = False
ac_fail: bool = False
@@ -75,6 +76,7 @@ class PsuStatus(BaseModel):
class FanStatus(BaseModel):
index: int
name: str | None = None
status: str
rpm: int | None = None
fail: bool = False
@@ -82,12 +84,14 @@ class FanStatus(BaseModel):
class TempSensor(BaseModel):
index: int
name: str | None = None
status: str
temperature_c: float | None = None
class VoltageSensor(BaseModel):
index: int
name: str | None = None
status: str
voltage: float | None = None
@@ -147,3 +151,25 @@ class Overview(BaseModel):
class HealthCheck(BaseModel):
status: str
tools: dict[str, bool]
class EnclosureTempSensor(BaseModel):
index: int
name: str | None = None
status: str
temperature_c: float | None = None
class EnclosureTemps(BaseModel):
id: str
vendor: str
model: str
hotspot_c: float | None = None
drive_max_c: float | None = None
drive_temp_count: int = 0
sensors: list[EnclosureTempSensor] = []
class TempSnapshot(BaseModel):
node: str
enclosures: list[EnclosureTemps] = []