Murad Jabir пре 1 година
родитељ
комит
164550264c
3 измењених фајлова са 697 додато и 215 уклоњено
  1. 7 1
      HOMEASSISTANT_SETUP.md
  2. 59 35
      homeassistant_integration.py
  3. 631 179
      main.py

+ 7 - 1
HOMEASSISTANT_SETUP.md

@@ -44,9 +44,15 @@ MQTT_PASSWORD = "mqtt_pass"    # If authentication enabled
 #### 3. **Install Dependencies**
 
 ```bash
-pip install paho-mqtt psutil
+# Install required Python packages
+pip3 install paho-mqtt psutil
+
+# Or using the included installation script:
+sudo ./install.sh
 ```
 
+The dependencies are automatically installed when using the `install.sh` script.
+
 #### 4. **Run the YouTube Predownloader**
 
 The integration will automatically start when you run:

+ 59 - 35
homeassistant_integration.py

@@ -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):

Разлика између датотеке није приказан због своје велике величине
+ 631 - 179
main.py


Неке датотеке нису приказане због велике количине промена