Home Assistant 的 Yaml 處理換行字元發送 Line Push Message (Restful Request)

本篇並無一步一步地教學如何設定 Home Assistant 以將 Gmail 通知發送到 LINE,而是特別關注如何正確處理換行字元(“\n”)。這個看似簡單的需求,可能會由於 YAML、JSON 和各種 API 之間的複雜性而帶來許多頭痛的問題。

篇幅將專注在如何確保 LINE 訊息中的換行字元號正確顯示的問題。


1. 問題描述:處理 LINE API 中的換行字元號(\n)

最初,我嘗試配置 Home Assistant 來將 Gmail 內容發送到 LINE。想法很簡單:每當收到新的郵件時,就在 Home Assistant 中觸發自動化,並使用 LINE Messaging API 將內容發送到 LINE。

然而卻一直出現錯誤 – 400 Bad Request。這個錯誤是由於訊息內容中的換行字元處理不當導致的,這使得 LINE API 無法正確解析該 Json Payload 訊息。


2. 試錯

一開始,我嘗試直接在訊息中包含 \n,這是大多數文檔中建議的做法。然而,當 Home Assistant 的 YAML 和模板處理這些字元時,往往會過度轉換或者將其視為字面字串,導致錯誤的 JSON 被發送到 LINE。

我嘗試過多種無效或不理想的方法:

  • 移除所有換行字元(導致內容成為單行,不易閱讀)。
  • 嘗試不同的 YAML 配置(|> 標記)來處理多行字串。
  • \n 替換為 Unicode 或其他字元。

3. 最終解決方案

解決方案集中於謹慎使用 YAML 標記(>)、正確轉換字元,並確保範本到 JSON 的轉送正確。

正確的設定檔

automations.yaml

我們使用 > 標記來指示折疊塊,允許多行內容折疊為單行,同時在 JSON 中保留換行字元為 \n

- alias: "IMAP - Send Email Content to Line"
  description: "當收到標題為 '#www-message' 的郵件時觸發,並將內容發送到 LINE Messenger"
  trigger:
    - platform: event
      event_type: imap_content
  condition:
    - condition: template
      value_template: "{{ trigger.event.data['subject'] == '#www-message' and trigger.event.data['initial'] == true }}"
  action:
    - service: rest_command.send_line_message
      data:
        message: >
          {{ trigger.event.data['text'] | replace('\r\n', '\n') | replace('\r', '\n') | replace('\n', '\n') }}
  • >:此標記折疊多行內容,同時確保換行字元正確傳遞到 JSON。
  • replace('\r\n', '\n'):這確保任何 Windows 樣式的換行字元(\r\n)都被轉換為單個 \n

rest_commands.yaml

我們保持這部分不變,但確保從自動化步驟接收到的文本格式正確:

rest_command:
  send_line_message:
    url: https://api.line.me/v2/bot/message/push
    method: POST
    headers:
      Authorization: !secret line_channel_access_token
      Content-Type: "application/json"
    payload: >
      {
        "to": "{{ states('input_text.line_group_id') }}",
        "messages": [
          {
            "type": "text",
            "text": "{{ message }}"
          }
        ]
      }

4. 總結

經過多次嘗試和錯誤,我們最終找到了如何正確處理換行字元的方法,使其能夠被 LINE API 接受並正確顯示。

  • 使用 YAML 的 > 標記來處理多行字串,並確保換行字元在轉換過程中保持一致。
  • 通過模板過濾器將所有換行字元轉換為 \n,以確保最終的 JSON 格式正確。

希望能幫助有相同需求的使用者順利配置 Home Assistant 與 LINE API 的整合。
如果還有其他問題或需要更多詳細步驟,歡迎留言。

Facebook 留言

Posted in 小技巧, 研究與開發, 軟體筆記.

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *