|
|
@@ -9,6 +9,7 @@ import time
|
|
|
import threading
|
|
|
import psutil
|
|
|
import os
|
|
|
+import logging
|
|
|
from datetime import datetime
|
|
|
from typing import Dict, Any, Optional
|
|
|
import paho.mqtt.client as mqtt
|
|
|
@@ -54,8 +55,10 @@ class HomeAssistantIntegration:
|
|
|
|
|
|
def connect_mqtt(self):
|
|
|
"""Connect to MQTT broker"""
|
|
|
+ logger = logging.getLogger(__name__)
|
|
|
+
|
|
|
try:
|
|
|
- self.mqtt_client = mqtt.Client()
|
|
|
+ self.mqtt_client = mqtt.Client(mqtt.CallbackAPIVersion.VERSION2)
|
|
|
|
|
|
if MQTT_USERNAME and MQTT_PASSWORD:
|
|
|
self.mqtt_client.username_pw_set(MQTT_USERNAME, MQTT_PASSWORD)
|
|
|
@@ -66,29 +69,34 @@ class HomeAssistantIntegration:
|
|
|
self.mqtt_client.connect(self.mqtt_broker, self.mqtt_port, 60)
|
|
|
self.mqtt_client.loop_start()
|
|
|
|
|
|
- print(f"🏠 Connecting to Home Assistant MQTT broker at {self.mqtt_broker}:{self.mqtt_port}")
|
|
|
+ logger.info(f"Connecting to Home Assistant MQTT broker at {self.mqtt_broker}:{self.mqtt_port}")
|
|
|
return True
|
|
|
|
|
|
except Exception as e:
|
|
|
- print(f"❌ Failed to connect to MQTT broker: {e}")
|
|
|
+ logger.error(f"Failed to connect to MQTT broker: {e}")
|
|
|
return False
|
|
|
|
|
|
- def _on_mqtt_connect(self, client, userdata, flags, rc):
|
|
|
+ def _on_mqtt_connect(self, client, userdata, flags, reason_code, properties):
|
|
|
"""MQTT connection callback"""
|
|
|
- if rc == 0:
|
|
|
+ logger = logging.getLogger(__name__)
|
|
|
+
|
|
|
+ if reason_code == 0:
|
|
|
self.is_connected = True
|
|
|
- print("✅ Connected to Home Assistant MQTT broker")
|
|
|
+ logger.info("Connected to Home Assistant MQTT broker")
|
|
|
self._publish_discovery_configs()
|
|
|
else:
|
|
|
- print(f"❌ Failed to connect to MQTT broker, return code {rc}")
|
|
|
+ logger.error(f"Failed to connect to MQTT broker, return code {reason_code}")
|
|
|
|
|
|
- def _on_mqtt_disconnect(self, client, userdata, rc):
|
|
|
+ def _on_mqtt_disconnect(self, client, userdata, flags, reason_code, properties):
|
|
|
"""MQTT disconnection callback"""
|
|
|
+ logger = logging.getLogger(__name__)
|
|
|
self.is_connected = False
|
|
|
- print("⚠️ Disconnected from MQTT broker")
|
|
|
+ logger.warning("Disconnected from MQTT broker")
|
|
|
|
|
|
def _publish_discovery_configs(self):
|
|
|
"""Publish Home Assistant MQTT Discovery configurations"""
|
|
|
+ logger = logging.getLogger(__name__)
|
|
|
+
|
|
|
sensors = [
|
|
|
{
|
|
|
'name': 'YouTube Download Queue',
|
|
|
@@ -190,31 +198,37 @@ class HomeAssistantIntegration:
|
|
|
}
|
|
|
]
|
|
|
|
|
|
+ discovery_count = 0
|
|
|
for sensor in sensors:
|
|
|
- config = {
|
|
|
- 'name': sensor['name'],
|
|
|
- 'unique_id': f"{MQTT_BASE_TOPIC}_{sensor['key']}",
|
|
|
- 'state_topic': f"{MQTT_BASE_TOPIC}/sensor/{sensor['key']}/state",
|
|
|
- 'icon': sensor['icon'],
|
|
|
- 'device': {
|
|
|
- 'identifiers': [MQTT_BASE_TOPIC],
|
|
|
- 'name': 'YouTube Predownloader',
|
|
|
- 'model': 'YouTube Predownloader v1.0',
|
|
|
- 'manufacturer': 'Custom',
|
|
|
- 'sw_version': '1.0.0'
|
|
|
+ try:
|
|
|
+ config = {
|
|
|
+ 'name': sensor['name'],
|
|
|
+ 'unique_id': f"{MQTT_BASE_TOPIC}_{sensor['key']}",
|
|
|
+ 'state_topic': f"{MQTT_BASE_TOPIC}/sensor/{sensor['key']}/state",
|
|
|
+ 'icon': sensor['icon'],
|
|
|
+ 'device': {
|
|
|
+ 'identifiers': [MQTT_BASE_TOPIC],
|
|
|
+ 'name': 'YouTube Predownloader',
|
|
|
+ 'model': 'YouTube Predownloader v1.0',
|
|
|
+ 'manufacturer': 'Custom',
|
|
|
+ 'sw_version': '1.0.0'
|
|
|
+ }
|
|
|
}
|
|
|
- }
|
|
|
-
|
|
|
- if sensor['unit']:
|
|
|
- config['unit_of_measurement'] = sensor['unit']
|
|
|
-
|
|
|
- if sensor['device_class']:
|
|
|
- config['device_class'] = sensor['device_class']
|
|
|
-
|
|
|
- discovery_topic = f"{HA_DISCOVERY_PREFIX}/sensor/{MQTT_BASE_TOPIC}_{sensor['key']}/config"
|
|
|
- self.mqtt_client.publish(discovery_topic, json.dumps(config), retain=True)
|
|
|
+
|
|
|
+ if sensor['unit']:
|
|
|
+ config['unit_of_measurement'] = sensor['unit']
|
|
|
+
|
|
|
+ if sensor['device_class']:
|
|
|
+ config['device_class'] = sensor['device_class']
|
|
|
+
|
|
|
+ discovery_topic = f"{HA_DISCOVERY_PREFIX}/sensor/{MQTT_BASE_TOPIC}_{sensor['key']}/config"
|
|
|
+ self.mqtt_client.publish(discovery_topic, json.dumps(config), retain=True)
|
|
|
+ discovery_count += 1
|
|
|
+
|
|
|
+ except Exception as e:
|
|
|
+ logger.error(f"Failed to publish discovery config for {sensor['name']}: {e}")
|
|
|
|
|
|
- print("📡 Published Home Assistant discovery configurations")
|
|
|
+ logger.info(f"Published {discovery_count} Home Assistant discovery configurations")
|
|
|
|
|
|
def update_stats(self, download_queue=0, conversion_queue=0, download_progress=0,
|
|
|
conversion_progress=0, download_speed=0, active_downloads=0, active_conversions=0,
|
|
|
@@ -271,21 +285,27 @@ class HomeAssistantIntegration:
|
|
|
|
|
|
def start_monitoring(self, update_interval=10):
|
|
|
"""Start monitoring and publishing stats"""
|
|
|
+ logger = logging.getLogger(__name__)
|
|
|
+
|
|
|
self.running = True
|
|
|
self.update_thread = threading.Thread(target=self._monitoring_loop, args=(update_interval,), daemon=True)
|
|
|
self.update_thread.start()
|
|
|
- print(f"📊 Started Home Assistant monitoring (update interval: {update_interval}s)")
|
|
|
+ logger.info(f"Started Home Assistant monitoring (update interval: {update_interval}s)")
|
|
|
|
|
|
def stop_monitoring(self):
|
|
|
"""Stop monitoring"""
|
|
|
+ logger = logging.getLogger(__name__)
|
|
|
+
|
|
|
self.running = False
|
|
|
if self.mqtt_client:
|
|
|
self.mqtt_client.loop_stop()
|
|
|
self.mqtt_client.disconnect()
|
|
|
- print("🛑 Stopped Home Assistant monitoring")
|
|
|
+ logger.info("Stopped Home Assistant monitoring")
|
|
|
|
|
|
def _monitoring_loop(self, interval):
|
|
|
"""Background monitoring loop"""
|
|
|
+ logger = logging.getLogger(__name__)
|
|
|
+
|
|
|
while self.running:
|
|
|
try:
|
|
|
# Update system stats only (other stats updated via update_stats method)
|
|
|
@@ -300,7 +320,7 @@ class HomeAssistantIntegration:
|
|
|
)
|
|
|
time.sleep(interval)
|
|
|
except Exception as e:
|
|
|
- print(f"❌ Monitoring error: {e}")
|
|
|
+ logger.error(f"Monitoring error: {e}")
|
|
|
time.sleep(interval)
|
|
|
|
|
|
# Global instance
|
|
|
@@ -308,18 +328,22 @@ ha_integration = None
|
|
|
|
|
|
def init_homeassistant_integration(mqtt_broker=MQTT_BROKER, mqtt_port=MQTT_PORT):
|
|
|
"""Initialize Home Assistant integration"""
|
|
|
- """Initialize Home Assistant integration"""
|
|
|
+ logger = logging.getLogger(__name__)
|
|
|
global ha_integration
|
|
|
|
|
|
if ha_integration is None:
|
|
|
+ logger.debug(f"Initializing HA integration with broker: {mqtt_broker}:{mqtt_port}")
|
|
|
ha_integration = HomeAssistantIntegration(mqtt_broker, mqtt_port)
|
|
|
if ha_integration.connect_mqtt():
|
|
|
ha_integration.start_monitoring()
|
|
|
+ logger.info("Home Assistant integration initialized successfully")
|
|
|
return ha_integration
|
|
|
else:
|
|
|
+ logger.error("Home Assistant integration failed to connect")
|
|
|
ha_integration = None
|
|
|
return None
|
|
|
|
|
|
+ logger.debug("Home Assistant integration already initialized")
|
|
|
return ha_integration
|
|
|
|
|
|
def update_homeassistant_stats(**kwargs):
|