87 lines
2.9 KiB
Python
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,
|
|
)
|