Home-Assistant Database Optimization

Home-Assistant Database Optimization - techblog.co.i

אחת הבעיות הנפוצות ביותר היום אצל משתמשי ה Home-Assistant היא נפח ה Database של המערכת אשר הולך וגדל. הבעיתיות ב Database בעל נפח גדול באה לידי ביטוי בשני אופנים עיקריים, הראשון איטיות של המערכת והשני קריסות של המערכת. במדריך זה אתמקד בדרכי ההתמודדות עם הנפחים של ה Database תוך שימוש ברכיב ה Recorder המובנה של המערכת וכן בסקריפטים מותאמים אישית אשר כתבתי לצורך כך.

אך לפני שנצלול פנימה אל הפתרונות עלינו להבין תחילה איך נראה ה Database של המערכת ומה הגורמים לכך שהוא יתנפח ויגיע לנפחים גדולים. ה Database של Home-Assistant בנוי מארבע טבלאות, אך אנחנו נתרכז בשניים מהן.

Home-Assistant Database and Tables
  1. Events – בטבלה זו נרשמים כל ארועי המערכת (אתחול, עדכון States של חיישנים, כתיבה ללוג ועוד) ולכן היא גדלה במהירות רבה.
Home-Assistant Events Table

2. States – בטבלה זו נשמרים הערכים של החיישנים והקומפוננטות השונות לצורך ההסטוריה.

Home-Assistant States Table - Techblog.co.il

אז איך בכל זאת ניתן להתמודד עם התופעה?
ניתן לעשות זאת על ידי שימוש נכון ברכיב ה Recorder וכן על ידי שימוש בסקריפטים אשר מבצעים מחיקת רשומות ואופטימיזציה לטבלאות. ועל כך ארחיב בחלק הבא של המדריך.

שימוש ברכיב ה Recorder על מנת למנוע ניפוח של ה Database

למערכת Home-Assistant ישנו רכיב הנקרא Recorder שתפקידו ליעל את העבודה עם ה DB על ידי הכלל או החרגה של היישויות שירשמו לטבלאות ועל ידי אפשרות לעשות purge (ניקוי). החסרון בשיטה זו היא ש purge ימחק את כל ההסטוריה בלי יכולת החרגה של איזה מידע לא למחוק.

באמצעות קטע הקוד הבא, שלקוח מקובץ ה configuration.yamk אדגים כיצד ניתן לשלוט במידע שירשם לטבלאות בצורה פשוטה ונוחה:

recorder:
  db_url: mysql://[user]:[password]@1[mysql_server_ip]/hassdb?charset=utf8
  purge_keep_days: 7 #מספר ימים לשמור
  exclude: #ביצוע החרגה
    domains: #רשימת דומיינים להחרגה
      - automation
      - updater
      - docker_monitor
      - image_processing
    entities: #רשימת ישויות להחרגה
      - sun.sun # Don't record sun data
      - sensor.date
      - sensor.dark_sky_daily_summary
      - sensor.dark
      - sensor.docker
    event_types: #רשימת אירועים להחרגה
      - service_removed
      - service_executed
      - platform_discovered
      - homeassistant_start
      - homeassistant_stop      
      - feedreader
      - service_registered
      - call_service
      - component_loaded
      - logbook_entry
      - system_log_event
      - automation_triggered
      - script_started
      - timer_out_of_sync
      - panels_updated
      - persistent_notifications_updated
      - config_entry_discovered

עצם הכנסת ה Entities, Domains ו- Events תחת ה Exclude תמנע מראש את כתיבתם לטבלאות ובכך בעצם תמנע ניפוח מיותר של ה Database.
למידע נוסף אודות רכיב ה Recorder ניתן להכנס לדף שלו באתר של Home-Assistant.

שימוש בסקריפטים על מנת לבצע אופטימיזציה מותאמת אישית

תחילה, צרו תיקיה בשם scripts תחת תיקיית הקונפיגורציה של Home-Assistant. בתוך התיקיה צרו 3 קבצים חדשים והכניסו לתוכם את התוכן הבא:

כפי שציינתי בחלק הקודם, ה Purge של ה Recorder מוחק נתונים ללא הבחנה בהתאם להגדרות הזמן (בימים) לשמירת ההסטוריה. נכון, אנחנו אמנם מעוניינים למחוק הסטוריה בכדי לשמור על הגודל של ה DB אך לעיתים ישנו מידע הסטורי אותו אכן נרצה לשמור. בדיוק לצורך כך כתבתי סקריפטים אשר יבצעו מחיקה של הנתונים על פי קריטריונים אותם נקבע.

הראשון, utils.py יכיל את ההגדרות הכלליות של החיבור ל Database וכן פונקציה אשר תריץ את פקודות ה SQL. אני משתמש בקוד בתצורה זו על מנת שלא לשכפל שורות קוד.

import MySQLdb
def execute(query):
    db = MySQLdb.connect(host="localhost", port=3306, user="user", passwd="passwd", db="hass_db_name")
    cursor = db.cursor()
    cursor.execute(query)
    res = cursor.fetchall() 
    db.close()
    return res

כאשר בשורה הראשונה יש להחליף את הפרמטרים של ההתחברות לשרת ה mysql שלכם.

הקובץ השני, optimize_states_table.py, יכיל את הקוד שמטפל בטבלאת ה states:

כאשר:

  • INTERVAL 0 DAY – מציין את מספר הימים לשמור אחורה.
  • entity_id in – מערך המכיל את היישויות אותן נרצה למחוק.

קובץ שלישי ואחרון, optimize_events_table.py שמטפל בטבלאת ה Events:

כאשר:

  • INTERVAL 0 DAY – מציין את מספר הימים לשמור אחורה.

כעת, נוסיף shell commands אשר יקראו לקבצי הפייתון ויריצו אותם. לצורך כך הוסיפו את השורות הבאות לקובץ ה configuration.yaml שלכם:

shell_command: 
  optimize_events_table: 'python3 /config/scripts/optimize_events_table.py'
  optimize_states_table: 'python3 /config/scripts/optimize_states_table.py' 

אתחלו את המערכת, וכעת תחת Developer Tools אתם אמורים לראות שתי Shell Commands:

כעת נוסיף 2 כפתורים ל UI על מנת שנוכל להריץ את הסקריפטים באופן יזום. לצורך כך הכניסו את הקוד הבא אל תוך קובץ ה ui-lovelace שלכם:

        - type: horizontal-stack
          cards:
            - type: custom:button-card
              name: Optimize Events Table
              color_type: card
              color: rgb(223, 255, 97)
              icon: mdi:database-edit
              style:
                - font-size: 10px
                - font-weight: bold
              tap_action:
                action: call-service
                service: shell_command.optimize_events_table
            - type: custom:button-card
              color_type: card
              color: rgb(223, 255, 97)
              name: Optimize States Table
              icon: mdi:database-edit
              style:
                - font-size: 10px
                - font-weight: bold
              tap_action:
                action: call-service
                service: shell_command.optimize_states_table

והתוצאה לפניכם:

Home-Assistant database optimization.

בהצלחה!

Be the first to comment

Leave a Reply

כתובת האימייל שלך לא תפורסם


*