Files
Video-Player-Node/homeassistant_discovery.py
T
2026-08-06 16:46:04 -05:00

87 lines
2.9 KiB
Python

"""Home Assistant MQTT discovery publishing for the video player.
This module deliberately reuses the player's existing MQTT client. It does
not create another connection or change any of the player's MQTT topics.
"""
import json
from typing import Any, Dict
def _publish_sensor(
client: Any,
*,
discovery_prefix: str,
device_id: str,
device_name: str,
telemetry_topic: str,
status_topic: str,
entity_id: str,
name: str,
value_template: str,
icon: str = "",
unit: str = "",
) -> None:
topic = f"{discovery_prefix}/sensor/{device_id}/{entity_id}/config"
payload: Dict[str, Any] = {
"name": name,
"unique_id": f"{device_id}_{entity_id}",
"state_topic": telemetry_topic,
"value_template": value_template,
"availability_topic": status_topic,
"availability_template": "{% if value_json.state != 'offline' %}online{% else %}offline{% endif %}",
"payload_available": "online",
"payload_not_available": "offline",
"device": {
"identifiers": [device_id],
"name": device_name,
"manufacturer": "Custom",
"model": "mpv mqtt player",
},
}
if icon:
payload["icon"] = icon
if unit:
payload["unit_of_measurement"] = unit
client.publish(topic, json.dumps(payload), qos=1, retain=True)
def publish_discovery(
client: Any,
*,
discovery_prefix: str,
device_id: str,
device_name: str,
telemetry_topic: str,
status_topic: str,
) -> None:
"""Publish the same nine retained discovery sensors used historically."""
sensors = (
("position", "YT Position (s)", "{{ value_json.position }}", "mdi:timeline-clock", "s"),
("duration", "YT Duration (s)", "{{ value_json.duration }}", "mdi:timer", "s"),
("remaining", "YT Remaining (s)", "{{ value_json.remaining }}", "mdi:timer-sand", "s"),
("position_fmt", "YT Position", "{{ value_json.position_fmt }}", "mdi:timeline-clock", ""),
("duration_fmt", "YT Duration", "{{ value_json.duration_fmt }}", "mdi:timer", ""),
("remaining_fmt", "YT Remaining", "{{ value_json.remaining_fmt }}", "mdi:timer-sand", ""),
("title", "YT Title", "{{ value_json.title }}", "mdi:music", ""),
("paused", "YT Paused", "{{ value_json.paused }}", "mdi:pause-circle", ""),
("slot", "YT Slot", "{{ value_json.slot }}", "mdi:playlist-play", ""),
)
for entity_id, name, template, icon, unit in sensors:
_publish_sensor(
client,
discovery_prefix=discovery_prefix,
device_id=device_id,
device_name=device_name,
telemetry_topic=telemetry_topic,
status_topic=status_topic,
entity_id=entity_id,
name=name,
value_template=template,
icon=icon,
unit=unit,
)