[分享] 如何在Dashboard上顯示通知歷程

前言

Line Notify宣佈停用之後大家開始轉進其他通訊軟體來做通知,HA自身的Companion App通知功能很強大,但沒辦法留存紀錄導致無法查詢舊通知,使用上有一些缺陷,依賴ChatGPT實現了在dashboard上顯示通知歷程,廢話不多說正文開始

工作原理

建立文字助手 :arrow_right:利用Shell command建立一個文字檔將通知訊息做保存 :arrow_right:建立自動化:當文字助手狀態變化,執行文字檔更新 :arrow_right:建立一個腳本將.txt內容轉成JSON格式並暫存系統:arrow_right:建立一個command sensor將文字檔訊息導出:arrow_right:建立markdown card將command sensor訊息顯示出來

設定

  1. 建立文字助手

  2. 利用Shell command建立歷程文字檔

shell_command:
  #event_input correspond to the input_text.event_input
  prepend_event_log: /bin/bash -c "echo '{{ now().strftime("%Y-%m-%d %H:%M") }} - {{ event_input }}' | cat - /config/www/event_log.txt | head -n 50 > /config/www/event_log.tmp && mv /config/www/event_log.tmp /config/www/event_log.txt"
  • 歷程格式為{{ now().strftime(“%Y-%m-%d %H:%M”) }} - {{ event_input }},其中變數event_input後面會對應到{{ states(“input_text.event_input”) }}
  • /config/www/event_log.txt 為文字檔儲存路徑
  • head -n 50 為要保存的最後50筆資料,可自行變更
  1. 建立自動化更新文字檔
alias: Prepend Event to Log and Notify
description: ""
trigger:
  - platform: state
    entity_id: input_text.event_input
action:
  - action: shell_command.prepend_event_log
    data:
      # event_input對應shell command變數
      event_input: |
        {{ states("input_text.event_input") }}

  1. 建立腳本將txt文字轉成JSON
  • 在config目錄下建立腳本“log_to_json.sh”
#!/bin/bash
# Get the current date and time
current_time=$(date +"%Y-%m-%d %H:%M:%S")

# Read the file and convert each line to a JSON array
echo '{ "last_update": "'"$current_time"'", "lines": ['
awk '{printf "\"%s\",\n", $0}' /config/www/event_log.txt | sed '$ s/,$//'
echo ']}'
  • 至Terminal更改.sh檔案權限(注意檔案路徑)
chmod +x /config/log_to_json.sh 
  1. Command Line sensor 搭配 “log_to_json.sh”
command_line:
  - sensor:
      name: Event Log
      command: "bash /config/log_to_json.sh" # Runs the script that outputs JSON
      scan_interval: 60 # Update every 60 seconds
      value_template: "{{ value_json.last_update }}" # Display the second-to-last line as the sensor state
      json_attributes:
        - lines

注意HA sensor的state有字元數的限制,attributes的字元限制較高,要將txt的內容導入到command line sensor才可以完整顯示50則歷程,生成Entity如下

  1. 建立markdown card
type: markdown
content: >
    {% for line in state_attr('sensor.event_log', 'lines') %}
     # 在{{ line }}前後添加markdown格式,這邊用HA alert
     <ha-alert alert-type="info">{{ line }}</ha-alert>
    {% endfor %}
title: Notification Log
  1. 成果

總結

HA本身的File可以利用notify.send_message來自動成稱歷程txt,但紀錄方式是最新的一筆在下方,而且是無限制的新增,應該也可以利用語法來更新這個txt,作法應該大同小異。

非軟體專業,code或許可以在做優化,另外可以搭配自動化或Node Red流程將歷程自動更新,也可附加圖檔等markdown可支持的操作,本歷程為HA本地記錄,不限於其他通訊軟體應用,可並存。

1個讚