針對近期的NR隨著HA改版還有Line Notify即將結束服務的一些變動設定分享

針對近期的NR隨著HA改版還有Line Notify即將結束服務
導致一些之前寫的分享文章設定異動的地方蠻多的
懶得一篇篇回去改在這邊一次整理出來我自己的修改方式

  1. 針對新增Synology Chat, TeleGram的部分 function語法修正

1-1 單純傳訊息的部分

var Message = "宿舍門從裡面開啟!";
msg.payload_line = { "message": Message };
msg.payload_synology_chat = { "message": Message.replace(/%/g, '%25').replace(/&/g, '%26') };
msg.payload_telegram = { "message": Message };
return msg;

1-2 設備訊息+時間部分

const now = new Date();
const pad = (num, len = 2) => num.toString().padStart(len, '0');
// date: yyyy-mm-dd_HH_MM_SS
const date = `${now.getFullYear()}-${pad(now.getMonth() + 1)}-${pad(now.getDate())}_${pad(now.getHours())}_${pad(now.getMinutes())}_${pad(now.getSeconds())}`;
// date2: yyyy/mm/dd HH:MM:SS
const date2 = `${now.getFullYear()}/${pad(now.getMonth() + 1)}/${pad(now.getDate())} ${pad(now.getHours())}:${pad(now.getMinutes())}:${pad(now.getSeconds())}`;
// 獲取UPS電池狀態
const globalHomeAssistant = global.get('homeassistant');
const batteryPercentage = globalHomeAssistant.homeAssistant.states["sensor.ups_battery_charge"].state;
// 創建消息
const message = `新莊宿舍停電中:\n日期: ${date2}\nUPS電池狀態目前為:${batteryPercentage}%`;
// 設定 payload
msg.payload_line = { "message": message };
msg.payload_synology_chat = { "message": message.replace(/%/g, '%25').replace(/&/g, '%26') };
msg.payload_telegram = { "message": message };

return msg;

1-3 針對攝影機截圖+訊息傳送部分

const now = new Date();
const pad = (num, len = 2) => num.toString().padStart(len, '0');
// date: yyyy-mm-dd_HH_MM_SS
const date = `${now.getFullYear()}-${pad(now.getMonth() + 1)}-${pad(now.getDate())}_${pad(now.getHours())}_${pad(now.getMinutes())}_${pad(now.getSeconds())}`;
// date2: yyyy/mm/dd HH:MM:SS
const date2 = `${now.getFullYear()}/${pad(now.getMonth() + 1)}/${pad(now.getDate())} ${pad(now.getHours())}:${pad(now.getMinutes())}:${pad(now.getSeconds())}`;
// 消息內容
const message = `${date2}\n宿舍攝影機偵測到移動!`;
const file_path = `/config/www/image/snapshot_${date}.jpg`;
const file_url = `http://192.168.2.108:8123/local/image/snapshot_${date}.jpg`;
// Line Notify
msg.payload_line = {
    data: { file: file_path },
    message: message
};
// Synology Chat
msg.payload_synology_chat = {
    data: { file_url: file_url },
    message: message.replace(/%/g, '%25').replace(/&/g, '%26')
};
// Telegram payload
msg.payload_telegram = {
    message: message,
    data: {
        photo: {
            file: file_path,
            caption: message
        }
    }
};
// Snapshot
msg.payload_snapshot = {
    filename: file_path
};
return msg;

如果你不是Synology Chat, TeleGram都用
拿掉你不需要的部分就好
Synology Chat有針對 % & 做replace 請不要亂改不然訊息會無法傳送

  1. 針對地牛服務的部分
    因為Line Notify 要停止服務也有部分人員都改用 TG 還有 Synology Chat
    對於這部分分享一下個人自己的改法
    /homeassistant/oxwu/notify.sh
#!/bin/bash

DST=http://192.168.2.108:8123

VNC=:0 gnome-screenshot -w -f /config/www/image/eq.png

curl -X POST \
  -H "Content-Type: application/json" \
  -d "{ \"level\": \"$1\" , \"seconds\": \"$2\" }" \
  $DST/api/webhook/trigger_ea_command

原本圖片存檔位置在 /config/oxwu/eq.png
現在改成存在 /config/www/image/eq.png
這樣在用 Synology Chat時就不用在去搬移檔案
NR function修改如下

let EarthQuake_Intensity = msg.payload.level;
let Arrival_Time = msg.payload.seconds;
const myVoice = [
    "zh-TW-HsiaoChenNeural",
    "zh-CN-XiaoxiaoNeural"
];
const randomVoice = myVoice[Math.floor(Math.random() * myVoice.length)];
var Message = "警告!" + EarthQuake_Intensity + "級地震將在" + Arrival_Time + "秒後抵達";
const file_path = `/config/www/image/eq.png`;
const file_url = `http://192.168.2.108:8123/local/image/eq.png`;
// Line Notify
msg.payload_line = {
    data: { file: file_path },
    message: Message
};
// Synology Chat
msg.payload_synology_chat = {
    data: { file_url: file_url },
    message: Message.replace(/%/g, '%25').replace(/&/g, '%26')
};
// Telegram payload
msg.payload_telegram = {
    message: Message,
    data: {
        photo: {
            file: file_path,
            caption: Message
        }
    }
};

msg.payload_tts = {
    message: Message,
    cache: true,
    options: {
        volume: "+100%",
        voice: randomVoice,
        pitch: "+0Hz",
        rate: "+0%"
    }
};
return msg;

裡面傳送訊息的方式包含了 Line, Synology Chat, TeleGram
如果有不需要的拿掉就好

  1. TTS因為Call Service 變成 Action 導致 entity_id 沒辦法選擇只能在 function裡面去加入
    方法一
    如果很單純的TTS函數用的不多可以在每個訊息裡面加入ID

    上圖是原本舊的語法
    新的語法如下
var myArray = [
    "衣服洗好了",
    "衣服洗好了,可以收了"
];
var randomItem = myArray[Math.floor(Math.random() * myArray.length)];

var myVoice = [
    "zh-TW-HsiaoChenNeural",
    "zh-CN-XiaoxiaoNeural",
];
var randomVoice = myVoice[Math.floor(Math.random() * myVoice.length)];
const Speakers = "喇叭1,喇叭2,喇叭3"

msg.payload_tts = {
    "entity_id": Speakers,
    "message": randomItem,
    "cache": true,
    "options": {
        "volume": "+100%",
        "voice": randomVoice,
        "pitch": "+0Hz",
        "rate": "+0%"
    }
};
return msg;

增加了
const Speakers = “喇叭1,喇叭2,喇叭3”
“entity_id”: Speakers,
這兩行以符合目前的格式

方法二
如果是像我有一堆TTS的可以改用這種方式

var Message = msg.payload_tts;  // 從前一個函數中取得資料
var Speakers = "喇叭1,喇叭2,喇叭3";  // 修正 entity_id 的名稱格式

msg.payload_tts = {
    "entity_id": Speakers,
    ...Message  // 使用擴展運算符將之前的 msg.payload_tts 資料合併
};
return msg;

這樣就不用每個函數都去改直接在TTS之前
將前面產出的msg.payload_tts裡的資料插入entity_id資料

  1. Z2M節點無法正常執行
    原本參考惟家設定而使用zigbee2mqtt節點的有兩個地方需要修改

    in 節點原本 Payload output 用的是 Complete payload 需改成 action

    switch 節點原本用的是 msg.payload.action 需把action 拿掉只保留msg.payload即可

以上是最近幾個因為最近改版造成無法正常使用的修正方式
希望能幫到各位