אחת הבעיות הנפוצות ביותר היום אצל משתמשי ה Home-Assistant היא נפח ה Database של המערכת אשר הולך וגדל. הבעיתיות ב Database בעל נפח גדול באה לידי ביטוי בשני אופנים עיקריים, הראשון איטיות של המערכת והשני קריסות של המערכת. במדריך זה אתמקד בדרכי ההתמודדות עם הנפחים של ה Database תוך שימוש ברכיב ה Recorder המובנה של המערכת וכן בסקריפטים מותאמים אישית אשר כתבתי לצורך כך.
אך לפני שנצלול פנימה אל הפתרונות עלינו להבין תחילה איך נראה ה Database של המערכת ומה הגורמים לכך שהוא יתנפח ויגיע לנפחים גדולים. ה Database של Home-Assistant בנוי מארבע טבלאות, אך אנחנו נתרכז בשניים מהן.
- Events – בטבלה זו נרשמים כל ארועי המערכת (אתחול, עדכון States של חיישנים, כתיבה ללוג ועוד) ולכן היא גדלה במהירות רבה.
2. States – בטבלה זו נשמרים הערכים של החיישנים והקומפוננטות השונות לצורך ההסטוריה.
אז איך בכל זאת ניתן להתמודד עם התופעה?
ניתן לעשות זאת על ידי שימוש נכון ברכיב ה 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
והתוצאה לפניכם:
בהצלחה!
Leave a Reply