ha借助node-red实现工作日判断
ha使用中有时候自动化需要用到工作日判断,可是ha没有自带提供。后来使用了一段时间https://github.com/Crazysiri/chineseholiday/ ,发现有些自定义需求无法满足,也不大会ha中的代码操作,决定自己写一个工作日判断。
大致需求
使用node-red在ha中提供状态
从星期几判断当日是否为工作日
从节日判断当日是否为调休
其他自定义需求后续添加
基本逻辑
前提:
node-red的data文件夹绝对路径:/data 安装方式:docker
如果和我不同,则根据实际情况修改代码中的路径。
先在node-red的data文件夹下创建一个info目录,然后获取今年的假期安排(来源:seimin/holiday-cn),并下载到info文件夹下。
获取节日调休情况,在代码判断后,如果不是节日,则根据当前星期几判断是否工作。
ps:内置了几种假期安排的下载途径,可以根据需求,在“下载当年假期安排”节点自行更改。

暂时只写了框架功能,其他功能后续慢慢写。
node-red展示:

JSON代码
[ { "id": "1711cd8aba31fb2e", "type": "file in", "z": "de12c299987996aa", "name": "读取假期安排文件", "filename": "path", "filenameType": "msg", "format": "utf8", "chunk": false, "sendError": false, "encoding": "none", "allProps": false, "x": 470, "y": 400, "wires": [ [ "fbab2155d92b9b5c" ] ] }, { "id": "4263aceaad7a37ed", "type": "inject", "z": "de12c299987996aa", "name": "", "props": [ { "p": "payload" } ], "repeat": "", "crontab": "*/2 0 * * *", "once": true, "onceDelay": 0.1, "topic": "", "payload": "", "payloadType": "date", "x": 120, "y": 400, "wires": [ [ "11c15c408d30337a" ] ] }, { "id": "7a929ab98323ba96", "type": "debug", "z": "de12c299987996aa", "name": "debug 2", "active": true, "tosidebar": true, "console": false, "tostatus": false, "complete": "true", "targetType": "full", "statusVal": "", "statusType": "auto", "x": 1060, "y": 220, "wires": [] }, { "id": "11c15c408d30337a", "type": "function", "z": "de12c299987996aa", "name": "获取时间", "func": "var date=new Date();n// date=new Date("2024-1-20");nnmsg.year=date.getFullYear();nmsg.date=formatDateTime(date);nmsg.date_main=date;nnmsg.path="/data/info/"+msg.year+".json";nreturn msg;nnnfunction formatDateTime(date) {n date=date.toLocaleDateString();n date=date.split("/");n str="0"+date[1];n let d = str.substring(str.length-2);n str="0"+date[0];n let m = str.substring(str.length-2);n let y = date[2];n str = y+'-'+m+'-'+d;n return str;n}", "outputs": 1, "noerr": 0, "initialize": "", "finalize": "", "libs": [], "x": 280, "y": 400, "wires": [ [ "1711cd8aba31fb2e" ] ] }, { "id": "0c1ef5856b75ddd8", "type": "catch", "z": "de12c299987996aa", "name": "", "scope": [ "1711cd8aba31fb2e" ], "uncaught": false, "x": 140, "y": 240, "wires": [ [ "be759aac2f421805" ] ] }, { "id": "be759aac2f421805", "type": "function", "z": "de12c299987996aa", "name": "下载当年假期安排", "func": "msg.year=new Date().getFullYear();nn//gitee国内源nvar url='wget -P /data/info https://gitee.com/seimin/holiday-cn/raw/master/'+msg.year+'.json';nnn//////////备用n//github源n//var url='wget -P /data/info https://raw.githubusercontent.com/NateScarlet/holiday-cn/master/'+msg.year+'.json';nn//JSDelivrn//var url='wget -P /data/info https://cdn.jsdelivr.net/gh/NateScarlet/holiday-cn@master/'+msg.year+'.json';nn//github国内镜像n//var url='wget -P /data/info https://mirror.ghproxy.com/https://raw.githubusercontent.com/NateScarlet/holiday-cn/master/'+msg.year+'.json';nnnnmsg.payload=url;nreturn msg;", "outputs": 1, "noerr": 0, "initialize": "", "finalize": "", "libs": [], "x": 370, "y": 240, "wires": [ [ "6b04c6851ce2943e" ] ] }, { "id": "6b04c6851ce2943e", "type": "exec", "z": "de12c299987996aa", "command": "", "addpay": "payload", "append": "", "useSpawn": "false", "timer": "", "winHide": false, "oldrc": false, "name": "", "x": 570, "y": 240, "wires": [ [ "7a929ab98323ba96" ], [], [] ] }, { "id": "fbab2155d92b9b5c", "type": "json", "z": "de12c299987996aa", "name": "", "property": "payload", "action": "", "pretty": false, "x": 690, "y": 400, "wires": [ [ "7a3dd75858b0dd0e" ] ] }, { "id": "7a3dd75858b0dd0e", "type": "function", "z": "de12c299987996aa", "name": "判断休息日", "func": "var days=msg.payload.daysnvar isOffDay="";nfor(var i=0;i
效果展示:

flow下载:
