本篇並無一步一步地教學如何設定 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 留言