針對近期的NR隨著HA改版還有Line Notify即將結束服務
導致一些之前寫的分享文章設定異動的地方蠻多的
懶得一篇篇回去改在這邊一次整理出來我自己的修改方式
- 針對新增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 請不要亂改不然訊息會無法傳送
- 針對地牛服務的部分
因為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
如果有不需要的拿掉就好
- 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資料
- Z2M節點無法正常執行
原本參考惟家設定而使用zigbee2mqtt節點的有兩個地方需要修改
in 節點原本 Payload output 用的是 Complete payload 需改成 action
switch 節點原本用的是 msg.payload.action 需把action 拿掉只保留msg.payload即可
以上是最近幾個因為最近改版造成無法正常使用的修正方式
希望能幫到各位