Populate Catch All – Find all of your ungrouped entities

Populate Catch All

קרה לכם שהוספתם למערכת ה Home Assistant יישויות חדשות ולא מצאתם אותן? או שיש לכם הרבה מאוד חיישנים, סקריפטים, סוויצ'ים ואתם רוצים להגדיר אותם לתצוגה ורוצים לוודא ששום יישות לא נשארה מאחור? במדריך זה אסביר כיצד ניתן לייצר View אוטומטי אשר יכיל בתוכו את כל היישויות אשר אינן משוייכות לקבוצה כזו או אחרת באמצעות סקריפט ה Populate Catch All.

שלב א' – הוספת סקריפט פייתון שיבצע את הבידקה והשיוך:

צרו תיקיה בשם python_scripts תחת תיקיית ההגדרות של Home Assistant:

Populate Catch All - Python_scripts

וצרו בתוכה קובץ בשם: populate_catchall_group.py.
כעת הדביקו לתוכו את הקוד הבא ושמרו אותו:

ignore = data.get("domains_to_ignore","zone,group,automation,script,zwave")
domains_to_ignore=ignore.split(",")
target_group=data.get("target_group","group.catchall")

logger.info("ignoring {} domain(s)".format(len(domains_to_ignore)))
logger.info("Targetting group {}".format(target_group))

def scan_for_new_entities(hass, logger, domains_to_ignore, target_group):
  entity_ids=[]
  groups=[]
  catchall=hass.states.get(target_group)

  if (catchall is None):
    attribs={"view":True, "friendly_name": "Ungrouped Items", "icon": "mdi:magnify"}
    hass.states.set(target_group, "", attribs)
    catchall=hass.states.get(target_group)
  
  for state in hass.states.all():
    domain = state.entity_id.split(".")[0]
    if (domain not in domains_to_ignore):
      entity_ids.append(state.entity_id)
    if (domain == "group") and (state.entity_id != target_group):
      groups.append(state.entity_id)
    

  logger.info("==== Entity count ====")
  logger.info("{0} entities".format(len(entity_ids)))
  logger.info("{0} groups".format(len(groups)))

  for groupname in groups:
    group = hass.states.get(groupname)
    for a in group.attributes["entity_id"]:
      if a in entity_ids:
        entity_ids.remove(a)

  attrs={}
  for a in catchall.attributes:
    if a != "entity_id":
      attrs[a] = catchall.attributes[a]

  entity_ids.insert(0,"script.scan_for_new_devices")
  attrs["entity_id"]=entity_ids
  if len(entity_ids) > 1:
    hass.states.set("group.catchall", catchall.state, attrs)

scan_for_new_entities(hass, logger, domains_to_ignore, target_group)

כעת, על מנת שמערכת ה Home Assistant תזהה את הסקריפט, יש להוסיף את השורה הבאה לקובץ ה configuration.yaml:

python_script: !include_dir_merge_list python_scripts

** הערה: שימוש ב !include_dir יביא לכך שהמערכת תקרא את כל הקבצים שנמצאים באותה תיקיה ותמנע צורך בהוספה ידנית של כל קובץ בנפרד **

חלק ב' – הוספת View אשר אליו יצורפו כל היישויות אשר אין לא משוייכות לקבוצה:

לשם כך הוסיפו את קטע הקוד הבא לקובץ ה groups.yaml:

catchall:
  name: Catch All group
  view: yes
  icon: mdi:magnify
  entities:
    - light.doesnt_exist

חלק ג' – הוספת אוטומציה אשר תבצע סריקה בכל עליה של המערכת:

לצורך כך, הוסיפו את קטע הקוד הבא לקובץ ה automations.yaml:

- alias: Get Ungrouped Entities On Start
  hide_entity: true
  trigger:
    platform: homeassistant
    event: start
  action:
    service: python_script.populate_catchall_group
    data:
      domains_to_ignore: "zone,group,automation,zwave"
      target_group: "group.catchall"

כעת, אתחלו את המערכת ואם ביצעתם את הכל כראוי תוכלו לראות שנוסף טאב חדש שנראה כך:

Populate Catch All

ניתן גם לבצע הפעלה ידנית מתוך ה developer tools. לחצו על הסימן של Service וחפשו ברשימה את python_script.populate_catchall_group:

python_script.populate_catchall_group

ולחצו על "Call Service".

1 Comment

  1. יפה מאוד. יעבוד גם על hass.io?
    האם אפשר באותה צורה להריץ גם קוד JS?

Leave a Reply

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


*