Socket
Socket
Sign inDemoInstall

node-red-contrib-sun-position

Package Overview
Dependencies
2
Maintainers
1
Versions
136
Alerts
File Explorer

Advanced tools

Install Socket

Detect and block malicious and high-risk dependencies

Install

Comparing version 2.0.6 to 2.0.12

nodes/icons/inputTypeStrPlaceholder.svg

37

CHANGELOG.md

@@ -18,2 +18,39 @@ # node-red-contrib-sun-position

### 2.0.12: bug fixes
- general
- Fixed bug with wrong default values for Input type in blind-control and within-time-switch node, added console error in case it occurs again.
- additional check for missing position configuration
### 2.0.10: maintenance release
- rerelease, no changed
### 2.0.9: maintenance release
- general
- code cleanup
- added string with placeholder as property value for more nodes (time-input, time comp, within-time, time-compare)
- clock-timer
- `isDisabled` now stored to context as already implemented in blind-control
### 2.0.8: bug fixes
- general, but only used in blind-control + clock-time
- added node.path (Node-Red 2.2) as possible output configuration, fallback to node.name or node.id if not defined
- fixed string with placeholder output (string could not be entered)
### 2.0.7: maintenance release
- blind-control + clock-time
- fixed blind-control example 3 and 4; clock-time example #388
- the function node in the example can now simulate different days for testing at the same time on different days #389
- renamed external given time property from `.dNow` to `.now` to maintain consistency to other nodes
- nodes can be completely disables and enabled by incoming message (topic must be `enableNode` and `disableNode`) #365
- blind-control
- after expire of manual override with -1 force to send output #387
- add possibility to force output to first output when topic contains `forceOutput`
- add possibility to add offset for the open/close position of the blind in active sun control #371
### 2.0.6: bug fixes

@@ -20,0 +57,0 @@

3

examples/blind-control/wiki-3 overrides and sun-position.json

@@ -40,3 +40,3 @@ [

"name": "30min 1sec",
"func": "\nconst minutesEachLoop = 30; // minutes to add\nconst loopCycle = 1; // seconds delay\nlet timeObj = context.get(\"timeObj\");\n\nif (timeObj && msg.topic.includes('stop')) {\n clearInterval(timeObj);\n context.set(\"timeObj\", null);\n context.set(\"orgtopic\", null);\n let d = new Date(context.get(\"date\"));\n node.log(\"STOP \" + d.toLocaleTimeString() + ' ####################################### payload='+msg.payload+' topic='+msg.topic);\n node.log('<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ' + d.toISOString());\n node.status({fill:\"red\",shape:\"ring\",text:\"stopped - \" + d.toLocaleTimeString()});\n return null;\n} else if (!timeObj && msg.topic.includes('start')) {\n context.set(\"message\", msg);\n context.set(\"orgtopic\", msg.topic);\n let d = new Date();\n let num = Number(msg.payload);\n if (isNaN(num) && num < 24) {\n d.setHours(num);\n d.setMinutes(0);\n } else {\n let dt = new Date(msg.payload);\n if (dt instanceof Date && !isNaN(dt)) {\n d = dt;\n } else {\n d.setHours(0);\n d.setMinutes(0);\n }\n }\n context.set(\"date\", d.getTime());\n msg.tsISO = d.toISOString();\n msg.ts = d.getTime();\n msg.topic += ' ' + d.toLocaleTimeString();\n node.log('>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>');\n node.log(\"START \" + d.toLocaleTimeString() + ' ####################################### payload='+msg.payload+' topic='+msg.topic);\n node.send(msg);\n\n let timeObj = setInterval(function(){\n let msg = context.get(\"message\");\n let topic = context.get(\"orgtopic\");\n let d = new Date(context.get(\"date\"));\n //d.setHours(d.getHours()+1);\n let dt = d.getDate();\n let dm = d.getMonth();\n d.setMinutes(d.getMinutes() + minutesEachLoop)\n d.setDate(dt);\n d.getMonth(dm);\n context.set(\"date\", d.getTime());\n msg.tsISO = d.toISOString();\n msg.ts = d.getTime();\n msg.topic = topic + ' ' + d.toLocaleTimeString();\n node.status({fill:\"green\",shape:\"dot\",text:\"run - \" + d.toLocaleTimeString()});\n node.log(\"sending \" + d.toLocaleTimeString() + ' ####################################### payload='+msg.payload+' topic='+msg.topic);\n node.send(msg);\n\t}, (1000 * loopCycle));\n context.set(\"timeObj\", timeObj);\n node.status({fill:\"green\",shape:\"ring\",text:\"start - \" + d.toLocaleTimeString()});\n return null;\n}\n\nlet d = new Date(context.get(\"date\"));\nif (!(d instanceof Date) || isNaN(d)) {\n d = new Date();\n}\nd.setMinutes(d.getMinutes() + 1)\n//d.setHours(d.getHours()+1);\nmsg.tsISO = d.toISOString();\nmsg.ts = d.getTime();\nmsg.topic += ' ' + d.toLocaleTimeString();\nnode.status({fill:\"yellow\",shape:\"dot\",text:\"interposed - \" + d.toLocaleTimeString() + ' - ' + msg.payload});\nnode.log(\"sending interposed msg \" + d.toLocaleTimeString() + ' ####################################### payload='+msg.payload+' topic='+msg.topic);\nnode.send(msg);\nreturn null;\n",
"func": "\nconst minutesEachLoop = 20; // minutes to add\nconst loopCycle = 2; // 0.3; // seconds delay\nlet timeObj = context.get(\"timeObj\");\n\nconst days = ['sun','mon','tue','wed','thu','fri','sat'];\n\nif (timeObj && msg.topic.includes('stop')) {\n clearInterval(timeObj);\n context.set(\"timeObj\", null);\n context.set(\"orgtopic\", null);\n let d = new Date(context.get(\"date\"));\n node.log(\"STOP \" + d.toLocaleTimeString() + ' ####################################### payload='+msg.payload+' topic='+msg.topic);\n node.log('<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ' + d.toISOString());\n node.status({fill:\"red\",shape:\"ring\",text:\"stopped - \" + d.toLocaleTimeString() + ' (' + d.getDay() + ' ' + days[d.getDay()] + ')'});\n return null;\n} else if (!timeObj && msg.topic.includes('start')) {\n context.set(\"message\", msg);\n context.set(\"orgtopic\", msg.topic);\n context.set(\"dateroll\", -1);\n let d = new Date();\n if (typeof msg.payload === 'string' && msg.payload.length > 0) {\n for (let i=0; i<7; i++) {\n\t \t if (msg.payload.includes(days[i])) {\n\t \t msg.payload = msg.payload.replace(days[i],'').trim();\n \t d.setDate(d.getDate() + (i+(7-d.getDay())) % 7);\n \t break;\n }\n }\n if (msg.payload.includes('days')) {\n d.setDate(d.getDate() + (1+(7-d.getDay())) % 7);\n msg.payload = msg.payload.replace('days','').trim();\n context.set(\"dateroll\", 1);\n }\n }\n let num = Number(msg.payload);\n if (!isNaN(num) && num < 24) {\n d.setHours(num);\n d.setMinutes(0);\n } else {\n let dt = new Date(msg.payload);\n if (dt instanceof Date && !isNaN(dt)) {\n d = dt;\n } else {\n d.setHours(0);\n d.setMinutes(0);\n }\n }\n context.set(\"date\", d.getTime());\n msg.tsISO = d.toISOString();\n msg.ts = d.getTime();\n msg.topic += ' ' + d.toLocaleTimeString();\n node.log('>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>');\n node.log(\"START \" + d.toLocaleTimeString() + ' ####################################### payload='+msg.payload+' topic='+msg.topic);\n node.send(msg);\n\n let timeObj = setInterval(function(){\n let msg = context.get(\"message\");\n let topic = context.get(\"orgtopic\");\n let dr = context.get(\"dateroll\");\n let d = new Date(context.get(\"date\"));\n let dt = d.getDate();\n let dm = d.getMonth();\n if (dr >0) {\n dr++;\n if (dr>8) { dr=1; }\n d.setDate(d.getDate() + (dr+(7-d.getDay())) % 7);\n context.set(\"dateroll\", dr);\n } else {\n //d.setHours(d.getHours()+1);\n d.setMinutes(d.getMinutes() + minutesEachLoop)\n d.setDate(dt);\n d.getMonth(dm);\n }\n context.set(\"date\", d.getTime());\n msg.tsISO = d.toISOString();\n msg.ts = d.getTime();\n msg.topic = topic + ' ' + d.toLocaleTimeString();\n node.status({fill:\"green\",shape:\"dot\",text:\"run - \" + d.toLocaleTimeString() + ' (' + d.getDay() + ' ' + days[d.getDay()] + ')'});\n node.log(\"sending \" + d.toLocaleTimeString() + ' ####################################### payload='+msg.payload+' topic='+msg.topic);\n node.send(msg);\n\t}, (1000 * loopCycle));\n context.set(\"timeObj\", timeObj);\n node.status({fill:\"green\",shape:\"ring\",text:\"start - \" + d.toLocaleTimeString() + ' (' + d.getDay() + ' ' + days[d.getDay()] + ')'});\n return null;\n}\n\nlet d = new Date(context.get(\"date\"));\nif (!(d instanceof Date) || isNaN(d)) {\n d = new Date();\n}\nd.setMinutes(d.getMinutes() + 1)\n//d.setHours(d.getHours()+1);\nmsg.tsISO = d.toISOString();\nmsg.ts = d.getTime();\nmsg.topic += ' ' + d.toLocaleTimeString();\nnode.status({fill:\"yellow\",shape:\"dot\",text:\"interposed - \" + d.toLocaleTimeString() + ' (' + d.getDay() + ' ' + days[d.getDay()] + ') - ' + msg.payload});\nnode.log(\"sending interposed msg \" + d.toLocaleTimeString() + ' ####################################### payload='+msg.payload+' topic='+msg.topic);\nnode.send(msg);\nreturn null;",
"outputs": 1,

@@ -46,2 +46,3 @@ "noerr": 0,

"finalize": "",
"libs": [],
"x": 530,

@@ -48,0 +49,0 @@ "y": 580,

@@ -48,3 +48,3 @@ [

"name": "30min 0.5sec",
"func": "\nconst minutesEachLoop = 30; // minutes to add\nconst loopCycle = 0.5; // seconds delay\nlet timeObj = context.get(\"timeObj\");\n\nif (timeObj && msg.topic.includes('stop')) {\n clearInterval(timeObj);\n context.set(\"timeObj\", null);\n context.set(\"orgtopic\", null);\n let d = new Date(context.get(\"date\"));\n node.log(\"STOP \" + d.toLocaleTimeString() + ' ####################################### payload='+msg.payload+' topic='+msg.topic);\n node.log('<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ' + d.toISOString());\n node.status({fill:\"red\",shape:\"ring\",text:\"stopped - \" + d.toLocaleTimeString()});\n return null;\n} else if (!timeObj && msg.topic.includes('start')) {\n context.set(\"message\", msg);\n context.set(\"orgtopic\", msg.topic);\n let d = new Date();\n let num = Number(msg.payload);\n if (isNaN(num) && num < 24) {\n d.setHours(num);\n d.setMinutes(0);\n } else {\n let dt = new Date(msg.payload);\n if (dt instanceof Date && !isNaN(dt)) {\n d = dt;\n } else {\n d.setHours(0);\n d.setMinutes(0);\n }\n }\n context.set(\"date\", d.getTime());\n msg.tsISO = d.toISOString();\n msg.ts = d.getTime();\n msg.topic += ' ' + d.toLocaleTimeString();\n node.log('>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>');\n node.log(\"START \" + d.toLocaleTimeString() + ' ####################################### payload='+msg.payload+' topic='+msg.topic);\n node.send(msg);\n\n let timeObj = setInterval(function(){\n let msg = context.get(\"message\");\n let topic = context.get(\"orgtopic\");\n let d = new Date(context.get(\"date\"));\n //d.setHours(d.getHours()+1);\n let dt = d.getDate();\n let dm = d.getMonth();\n d.setMinutes(d.getMinutes() + minutesEachLoop)\n d.setDate(dt);\n d.getMonth(dm);\n context.set(\"date\", d.getTime());\n msg.tsISO = d.toISOString();\n msg.ts = d.getTime();\n msg.topic = topic + ' ' + d.toLocaleTimeString();\n node.status({fill:\"green\",shape:\"dot\",text:\"run - \" + d.toLocaleTimeString()});\n node.log(\"sending \" + d.toLocaleTimeString() + ' ####################################### payload='+msg.payload+' topic='+msg.topic);\n node.send(msg);\n\t}, (1000 * loopCycle));\n context.set(\"timeObj\", timeObj);\n node.status({fill:\"green\",shape:\"ring\",text:\"start - \" + d.toLocaleTimeString()});\n return null;\n}\n\nlet d = new Date(context.get(\"date\"));\nif (!(d instanceof Date) || isNaN(d)) {\n d = new Date();\n}\nd.setMinutes(d.getMinutes() + 1)\n//d.setHours(d.getHours()+1);\nmsg.tsISO = d.toISOString();\nmsg.ts = d.getTime();\nmsg.topic += ' ' + d.toLocaleTimeString();\nnode.status({fill:\"yellow\",shape:\"dot\",text:\"interposed - \" + d.toLocaleTimeString() + ' - ' + msg.payload});\nnode.log(\"sending interposed msg \" + d.toLocaleTimeString() + ' ####################################### payload='+msg.payload+' topic='+msg.topic);\nnode.send(msg);\nreturn null;\n",
"func": "\nconst minutesEachLoop = 20; // minutes to add\nconst loopCycle = 2; // 0.3; // seconds delay\nlet timeObj = context.get(\"timeObj\");\n\nconst days = ['sun','mon','tue','wed','thu','fri','sat'];\n\nif (timeObj && msg.topic.includes('stop')) {\n clearInterval(timeObj);\n context.set(\"timeObj\", null);\n context.set(\"orgtopic\", null);\n let d = new Date(context.get(\"date\"));\n node.log(\"STOP \" + d.toLocaleTimeString() + ' ####################################### payload='+msg.payload+' topic='+msg.topic);\n node.log('<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ' + d.toISOString());\n node.status({fill:\"red\",shape:\"ring\",text:\"stopped - \" + d.toLocaleTimeString() + ' (' + d.getDay() + ' ' + days[d.getDay()] + ')'});\n return null;\n} else if (!timeObj && msg.topic.includes('start')) {\n context.set(\"message\", msg);\n context.set(\"orgtopic\", msg.topic);\n context.set(\"dateroll\", -1);\n let d = new Date();\n if (typeof msg.payload === 'string' && msg.payload.length > 0) {\n for (let i=0; i<7; i++) {\n\t \t if (msg.payload.includes(days[i])) {\n\t \t msg.payload = msg.payload.replace(days[i],'').trim();\n \t d.setDate(d.getDate() + (i+(7-d.getDay())) % 7);\n \t break;\n }\n }\n if (msg.payload.includes('days')) {\n d.setDate(d.getDate() + (1+(7-d.getDay())) % 7);\n msg.payload = msg.payload.replace('days','').trim();\n context.set(\"dateroll\", 1);\n }\n }\n let num = Number(msg.payload);\n if (!isNaN(num) && num < 24) {\n d.setHours(num);\n d.setMinutes(0);\n } else {\n let dt = new Date(msg.payload);\n if (dt instanceof Date && !isNaN(dt)) {\n d = dt;\n } else {\n d.setHours(0);\n d.setMinutes(0);\n }\n }\n context.set(\"date\", d.getTime());\n msg.tsISO = d.toISOString();\n msg.ts = d.getTime();\n msg.topic += ' ' + d.toLocaleTimeString();\n node.log('>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>');\n node.log(\"START \" + d.toLocaleTimeString() + ' ####################################### payload='+msg.payload+' topic='+msg.topic);\n node.send(msg);\n\n let timeObj = setInterval(function(){\n let msg = context.get(\"message\");\n let topic = context.get(\"orgtopic\");\n let dr = context.get(\"dateroll\");\n let d = new Date(context.get(\"date\"));\n let dt = d.getDate();\n let dm = d.getMonth();\n if (dr >0) {\n dr++;\n if (dr>8) { dr=1; }\n d.setDate(d.getDate() + (dr+(7-d.getDay())) % 7);\n context.set(\"dateroll\", dr);\n } else {\n //d.setHours(d.getHours()+1);\n d.setMinutes(d.getMinutes() + minutesEachLoop)\n d.setDate(dt);\n d.getMonth(dm);\n }\n context.set(\"date\", d.getTime());\n msg.tsISO = d.toISOString();\n msg.ts = d.getTime();\n msg.topic = topic + ' ' + d.toLocaleTimeString();\n node.status({fill:\"green\",shape:\"dot\",text:\"run - \" + d.toLocaleTimeString() + ' (' + d.getDay() + ' ' + days[d.getDay()] + ')'});\n node.log(\"sending \" + d.toLocaleTimeString() + ' ####################################### payload='+msg.payload+' topic='+msg.topic);\n node.send(msg);\n\t}, (1000 * loopCycle));\n context.set(\"timeObj\", timeObj);\n node.status({fill:\"green\",shape:\"ring\",text:\"start - \" + d.toLocaleTimeString() + ' (' + d.getDay() + ' ' + days[d.getDay()] + ')'});\n return null;\n}\n\nlet d = new Date(context.get(\"date\"));\nif (!(d instanceof Date) || isNaN(d)) {\n d = new Date();\n}\nd.setMinutes(d.getMinutes() + 1)\n//d.setHours(d.getHours()+1);\nmsg.tsISO = d.toISOString();\nmsg.ts = d.getTime();\nmsg.topic += ' ' + d.toLocaleTimeString();\nnode.status({fill:\"yellow\",shape:\"dot\",text:\"interposed - \" + d.toLocaleTimeString() + ' (' + d.getDay() + ' ' + days[d.getDay()] + ') - ' + msg.payload});\nnode.log(\"sending interposed msg \" + d.toLocaleTimeString() + ' ####################################### payload='+msg.payload+' topic='+msg.topic);\nnode.send(msg);\nreturn null;",
"outputs": 1,

@@ -54,2 +54,3 @@ "noerr": 0,

"finalize": "",
"libs": [],
"x": 530,

@@ -56,0 +57,0 @@ "y": 1060,

@@ -41,3 +41,3 @@ [

"name": "30min 0.5sec",
"func": "\nconst minutesEachLoop = 30; // minutes to add\nconst loopCycle = 0.5; // seconds delay\nlet timeObj = context.get(\"timeObj\");\n\nif (timeObj && msg.topic.includes('stop')) {\n clearInterval(timeObj);\n context.set(\"timeObj\", null);\n context.set(\"orgtopic\", null);\n let d = new Date(context.get(\"date\"));\n node.log(\"STOP \" + d.toLocaleTimeString() + ' ####################################### payload='+msg.payload+' topic='+msg.topic);\n node.log('<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ' + d.toISOString());\n node.status({fill:\"red\",shape:\"ring\",text:\"stopped - \" + d.toLocaleTimeString()});\n return null;\n} else if (!timeObj && msg.topic.includes('start')) {\n context.set(\"message\", msg);\n context.set(\"orgtopic\", msg.topic);\n let d = new Date();\n let num = Number(msg.payload);\n if (isNaN(num) && num < 24) {\n d.setHours(num);\n d.setMinutes(0);\n } else {\n let dt = new Date(msg.payload);\n if (dt instanceof Date && !isNaN(dt)) {\n d = dt;\n } else {\n d.setHours(0);\n d.setMinutes(0);\n }\n }\n context.set(\"date\", d.getTime());\n msg.tsISO = d.toISOString();\n msg.ts = d.getTime();\n msg.topic += ' ' + d.toLocaleTimeString();\n node.log('>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>');\n node.log(\"START \" + d.toLocaleTimeString() + ' ####################################### payload='+msg.payload+' topic='+msg.topic);\n node.send(msg);\n\n let timeObj = setInterval(function(){\n let msg = context.get(\"message\");\n let topic = context.get(\"orgtopic\");\n let d = new Date(context.get(\"date\"));\n //d.setHours(d.getHours()+1);\n let dt = d.getDate();\n let dm = d.getMonth();\n d.setMinutes(d.getMinutes() + minutesEachLoop)\n d.setDate(dt);\n d.getMonth(dm);\n context.set(\"date\", d.getTime());\n msg.tsISO = d.toISOString();\n msg.ts = d.getTime();\n msg.topic = topic + ' ' + d.toLocaleTimeString();\n node.status({fill:\"green\",shape:\"dot\",text:\"run - \" + d.toLocaleTimeString()});\n node.log(\"sending \" + d.toLocaleTimeString() + ' ####################################### payload='+msg.payload+' topic='+msg.topic);\n node.send(msg);\n\t}, (1000 * loopCycle));\n context.set(\"timeObj\", timeObj);\n node.status({fill:\"green\",shape:\"ring\",text:\"start - \" + d.toLocaleTimeString()});\n return null;\n}\n\nlet d = new Date(context.get(\"date\"));\nif (!(d instanceof Date) || isNaN(d)) {\n d = new Date();\n}\nd.setMinutes(d.getMinutes() + 1)\n//d.setHours(d.getHours()+1);\nmsg.tsISO = d.toISOString();\nmsg.ts = d.getTime();\nmsg.topic += ' ' + d.toLocaleTimeString();\nnode.status({fill:\"yellow\",shape:\"dot\",text:\"interposed - \" + d.toLocaleTimeString() + ' - ' + msg.payload});\nnode.log(\"sending interposed msg \" + d.toLocaleTimeString() + ' ####################################### payload='+msg.payload+' topic='+msg.topic);\nnode.send(msg);\nreturn null;\n",
"func": "\nconst minutesEachLoop = 20; // minutes to add\nconst loopCycle = 2; // 0.3; // seconds delay\nlet timeObj = context.get(\"timeObj\");\n\nconst days = ['sun','mon','tue','wed','thu','fri','sat'];\n\nif (timeObj && msg.topic.includes('stop')) {\n clearInterval(timeObj);\n context.set(\"timeObj\", null);\n context.set(\"orgtopic\", null);\n let d = new Date(context.get(\"date\"));\n node.log(\"STOP \" + d.toLocaleTimeString() + ' ####################################### payload='+msg.payload+' topic='+msg.topic);\n node.log('<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ' + d.toISOString());\n node.status({fill:\"red\",shape:\"ring\",text:\"stopped - \" + d.toLocaleTimeString() + ' (' + d.getDay() + ' ' + days[d.getDay()] + ')'});\n return null;\n} else if (!timeObj && msg.topic.includes('start')) {\n context.set(\"message\", msg);\n context.set(\"orgtopic\", msg.topic);\n context.set(\"dateroll\", -1);\n let d = new Date();\n if (typeof msg.payload === 'string' && msg.payload.length > 0) {\n for (let i=0; i<7; i++) {\n\t \t if (msg.payload.includes(days[i])) {\n\t \t msg.payload = msg.payload.replace(days[i],'').trim();\n \t d.setDate(d.getDate() + (i+(7-d.getDay())) % 7);\n \t break;\n }\n }\n if (msg.payload.includes('days')) {\n d.setDate(d.getDate() + (1+(7-d.getDay())) % 7);\n msg.payload = msg.payload.replace('days','').trim();\n context.set(\"dateroll\", 1);\n }\n }\n let num = Number(msg.payload);\n if (!isNaN(num) && num < 24) {\n d.setHours(num);\n d.setMinutes(0);\n } else {\n let dt = new Date(msg.payload);\n if (dt instanceof Date && !isNaN(dt)) {\n d = dt;\n } else {\n d.setHours(0);\n d.setMinutes(0);\n }\n }\n context.set(\"date\", d.getTime());\n msg.tsISO = d.toISOString();\n msg.ts = d.getTime();\n msg.topic += ' ' + d.toLocaleTimeString();\n node.log('>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>');\n node.log(\"START \" + d.toLocaleTimeString() + ' ####################################### payload='+msg.payload+' topic='+msg.topic);\n node.send(msg);\n\n let timeObj = setInterval(function(){\n let msg = context.get(\"message\");\n let topic = context.get(\"orgtopic\");\n let dr = context.get(\"dateroll\");\n let d = new Date(context.get(\"date\"));\n let dt = d.getDate();\n let dm = d.getMonth();\n if (dr >0) {\n dr++;\n if (dr>8) { dr=1; }\n d.setDate(d.getDate() + (dr+(7-d.getDay())) % 7);\n context.set(\"dateroll\", dr);\n } else {\n //d.setHours(d.getHours()+1);\n d.setMinutes(d.getMinutes() + minutesEachLoop)\n d.setDate(dt);\n d.getMonth(dm);\n }\n context.set(\"date\", d.getTime());\n msg.tsISO = d.toISOString();\n msg.ts = d.getTime();\n msg.topic = topic + ' ' + d.toLocaleTimeString();\n node.status({fill:\"green\",shape:\"dot\",text:\"run - \" + d.toLocaleTimeString() + ' (' + d.getDay() + ' ' + days[d.getDay()] + ')'});\n node.log(\"sending \" + d.toLocaleTimeString() + ' ####################################### payload='+msg.payload+' topic='+msg.topic);\n node.send(msg);\n\t}, (1000 * loopCycle));\n context.set(\"timeObj\", timeObj);\n node.status({fill:\"green\",shape:\"ring\",text:\"start - \" + d.toLocaleTimeString() + ' (' + d.getDay() + ' ' + days[d.getDay()] + ')'});\n return null;\n}\n\nlet d = new Date(context.get(\"date\"));\nif (!(d instanceof Date) || isNaN(d)) {\n d = new Date();\n}\nd.setMinutes(d.getMinutes() + 1)\n//d.setHours(d.getHours()+1);\nmsg.tsISO = d.toISOString();\nmsg.ts = d.getTime();\nmsg.topic += ' ' + d.toLocaleTimeString();\nnode.status({fill:\"yellow\",shape:\"dot\",text:\"interposed - \" + d.toLocaleTimeString() + ' (' + d.getDay() + ' ' + days[d.getDay()] + ') - ' + msg.payload});\nnode.log(\"sending interposed msg \" + d.toLocaleTimeString() + ' ####################################### payload='+msg.payload+' topic='+msg.topic);\nnode.send(msg);\nreturn null;",
"outputs": 1,

@@ -47,2 +47,3 @@ "noerr": 0,

"finalize": "",
"libs": [],
"x": 550,

@@ -399,3 +400,2 @@ "y": 2520,

"startDelayTime": 10000,
"storeName": "",
"results": [

@@ -402,0 +402,0 @@ {

@@ -96,3 +96,3 @@ /********************************************

if (Number.isFinite(nExpire) || (nImportance <= 0)) {
// will set expiring if importance is 0 or if expire is explizit defined
// will set expiring if importance is 0 or if expire is explicit defined
node.debug(`set expiring - expire is explicit defined "${nExpire}"`);

@@ -137,3 +137,3 @@ ctrlLib.setExpiringOverwrite(node, oNow, nExpire, 'set expiring time by message');

function changeRules(node, rulePos, ruleName, ruleData) {
node.debug(`changeRules: ${ node.rules.count } ruleData:' ${util.inspect(ruleData, {colors:true, compact:10})}`);
// node.debug(`changeRules: ${ node.rules.count } ruleData:' ${util.inspect(ruleData, {colors:true, compact:10})}`);
for (let i = 0; i <= node.rules.count; ++i) {

@@ -159,3 +159,3 @@ const rule = node.rules[i];

const livingRuleData = {};
ctrlLib.prepareRules(node, msg, tempData, oNow.dNow);
ctrlLib.prepareRules(node, msg, tempData, oNow.now);
// node.debug(`checkRules rules.count=${node.rules.count}, rules.lastUntil=${node.rules.lastUntil}, oNow=${util.inspect(oNow, {colors:true, compact:10})}`);

@@ -179,3 +179,3 @@

if (res) {
// node.debug('1. ruleSel ' + util.inspect(res, { colors: true, compact: 10, breakLength: Infinity }));
// node.debug(`1. ruleSel ${rule.name} (${rule.pos}) data=${ util.inspect(res, { colors: true, compact: 10, breakLength: Infinity }) }`);
ruleSel = res;

@@ -193,3 +193,3 @@ ruleindex = i;

const rule = node.rules.data[i];
// node.debug('rule ' + rule.time.operator + ' - ' + (rule.time.operator !== cRuleUntil) + ' - ' + util.inspect(rule, {colors:true, compact:10, breakLength: Infinity }));
// node.debug(`rule ${rule.name} (${rule.pos}) enabled=${rule.enabled} operator=${rule.time.operator} noUntil=${rule.time.operator !== cRuleUntil} data=${util.inspect(rule, {colors:true, compact:10, breakLength: Infinity })}`);
if (!rule.enabled) { continue; }

@@ -199,3 +199,3 @@ if (rule.time && rule.time.operator === cRuleUntil) { continue; } // - From: timeOp === cRuleFrom

if (res) {
// node.debug('2. ruleSel ' + util.inspect(res, { colors: true, compact: 10, breakLength: Infinity }));
// node.debug(`2. ruleSel ${rule.name} (${rule.pos}) data=${ util.inspect(res, { colors: true, compact: 10, breakLength: Infinity }) }`);
ruleSel = res;

@@ -264,3 +264,3 @@ break;

}
if (ruleSel.time) {
if (ruleSel.time && ruleSel.timeData) {
livingRuleData.time = ruleSel.timeData;

@@ -322,2 +322,10 @@ livingRuleData.time.timeLocal = node.positionConfig.toTimeString(ruleSel.timeData.value);

const node = this;
if (!this.positionConfig) {
node.status({
fill: 'red',
shape: 'dot',
text: 'Node not properly configured!!'
});
return;
}

@@ -360,2 +368,3 @@ if (!Array.isArray(config.results)) {

node.nodeData = {
isDisabled: node.context().get('isDisabled', node.contextStore) || false,
/** The Level of the window */

@@ -440,3 +449,6 @@ payloadDefault: config.payloadDefault,

// allow to overwrite settings by incomming message
if (msg.topic && (typeof msg.topic === 'string') && msg.topic.startsWith('set')) {
if (msg.topic && (typeof msg.topic === 'string') &&
(msg.topic.startsWith('set') ||
msg.topic.startsWith('disable') ||
msg.topic.startsWith('enable'))) {
switch (msg.topic) {

@@ -451,3 +463,3 @@ /* Default Settings */

break;
case 'setCntextStore':
case 'setContextStore':
node.contextStore = msg.payload || node.contextStore;

@@ -467,2 +479,15 @@ break;

break;
case 'enableNode':
node.nodeData.isDisabled = false;
node.context().set('isDisabled', false, node.contextStore);
break;
case 'disableNode':
node.nodeData.isDisabled = true;
node.context().set('isDisabled', true, node.contextStore);
node.status({
fill: 'grey',
shape: 'dot',
text: (typeof msg.payload === 'string') ? msg.payload : 'disabled'
});
break;
default:

@@ -472,2 +497,6 @@ break;

}
if (node.nodeData.isDisabled) {
done();
return null;
}

@@ -499,3 +528,3 @@ // initialize

}
}, true, oNow.dNow);
}, true, oNow.now);
}

@@ -508,3 +537,5 @@ const timeCtrl = {

name: node.name || node.id,
id: node.addId || node.id
id: node.addId || node.id,
srcId: node.id,
path: node._path || node.id
};

@@ -524,2 +555,3 @@

if (overwrite && timeCtrl.rule.resetOverwrite && timeCtrl.rule.id !== previousData.usedRule) {
node.debug(`Overwrite expired caused by rule rule=${timeCtrl.rule.id}, previousRule=${previousData.usedRule}`);
ctrlLib.posOverwriteReset(node);

@@ -532,3 +564,3 @@ overwrite = false;

if (timeCtrl.rule.payloadData) {
node.payload.current = node.positionConfig.getOutDataProp(node, msg, timeCtrl.rule.payloadData, oNow.dNow);
node.payload.current = node.positionConfig.getOutDataProp(node, msg, timeCtrl.rule.payloadData, oNow.now);
}

@@ -554,2 +586,4 @@ node.payload.topic = timeCtrl.rule.topic;

id: timeCtrl.id,
srcId: timeCtrl.srcId,
path: timeCtrl.path,
code: node.reason.code,

@@ -585,3 +619,3 @@ state: node.reason.state,

} else {
resultObj = node.positionConfig.getPropValue(this, msg, prop, false, oNow.dNow);
resultObj = node.positionConfig.getPropValue(this, msg, prop, false, oNow.now);
}

@@ -588,0 +622,0 @@ if (typeof resultObj !== 'undefined') {

@@ -260,3 +260,3 @@ /********************************************

function getRuleTimeData(node, msg, rule, dNow) {
rule.time.dNow = dNow;
rule.time.now = dNow;
rule.timeData = node.positionConfig.getTimeProp(node, msg, rule.time);

@@ -271,5 +271,6 @@ if (rule.timeData.error) {

rule.timeData.ts = rule.timeData.value.getTime();
// node.debug(`time=${rule.timeData.value} -> ${new Date(rule.timeData.value)}`);
rule.timeData.dayId = hlp.getDayId(rule.timeData.value);
if (rule.timeMin) {
rule.timeMin.dNow = dNow;
rule.timeMin.now = dNow;
rule.timeDataMin = node.positionConfig.getTimeProp(node, msg, rule.timeMin);

@@ -284,5 +285,3 @@ const numMin = rule.timeDataMin.value.getTime();

if (numMin > rule.timeData.ts) {
const tmp = rule.timeData;
rule.timeData = rule.timeDataMin;
rule.timeDataMin = tmp;
[rule.timeData, rule.timeDataMin] = [rule.timeDataMin, rule.timeData];
rule.timeData.ts = numMin;

@@ -294,3 +293,3 @@ rule.timeData.dayId = hlp.getDayId(rule.timeDataMin.value);

if (rule.timeMax) {
rule.timeMax.dNow = dNow;
rule.timeMax.now = dNow;
rule.timeDataMax = node.positionConfig.getTimeProp(node, msg, rule.timeMax);

@@ -305,5 +304,3 @@ const numMax = rule.timeDataMax.value.getTime();

if (numMax < rule.timeData.ts) {
const tmp = rule.timeData;
rule.timeData = rule.timeDataMax;
rule.timeDataMax = tmp;
[rule.timeData, rule.timeDataMax] = [rule.timeDataMax, rule.timeData];
rule.timeData.ts = numMax;

@@ -329,3 +326,3 @@ rule.timeData.dayId = hlp.getDayId(rule.timeDataMax.value);

* @name ITimeObject Data
* @param {Date} dNow
* @param {Date} now
* @param {number} nowNr

@@ -349,6 +346,7 @@ * @param {number} dayNr

function compareRules(node, msg, rule, cmp, data) {
// node.debug('fktCheck rule ' + util.inspect(rule, {colors:true, compact:10}));
// node.debug(`compareRules rule ${rule.name} (${rule.pos}) data=${util.inspect(rule, {colors:true, compact:10})}`);
if (rule.conditional) {
try {
if (!rule.conditon.result) {
node.debug(`compareRules rule ${rule.name} (${rule.pos}) conditon does not match`);
return null;

@@ -365,18 +363,25 @@ }

}
if (rule.time.days && !rule.time.days.includes(data.dayNr)) {
node.debug(`compareRules rule ${rule.name} (${rule.pos}) invalid days`);
return null;
}
if (rule.time.months && !rule.time.months.includes(data.monthNr)) {
node.debug(`compareRules rule ${rule.name} (${rule.pos}) invalid month`);
return null;
}
if (rule.time.onlyOddDays && (data.dateNr % 2 === 0)) { // even
node.debug(`compareRules rule ${rule.name} (${rule.pos}) invalid even days`);
return null;
}
if (rule.time.onlyEvenDays && (data.dateNr % 2 !== 0)) { // odd
node.debug(`compareRules rule ${rule.name} (${rule.pos}) invalid odd days`);
return null;
}
if (rule.time.onlyOddWeeks && (data.weekNr % 2 === 0)) { // even
node.debug(`compareRules rule ${rule.name} (${rule.pos}) invalid even week`);
return null;
}
if (rule.time.onlyEvenWeeks && (data.weekNr % 2 !== 0)) { // odd
node.debug(`compareRules rule ${rule.name} (${rule.pos}) invalid odd week`);
return null;

@@ -389,3 +394,4 @@ }

// in the current year
if (data.dNow < rule.time.dateStart || data.dNow > rule.time.dateEnd) {
if (data.now < rule.time.dateStart || data.now > rule.time.dateEnd) {
node.debug(`compareRules rule ${rule.name} (${rule.pos}) invalid date range within year`);
return null;

@@ -395,3 +401,4 @@ }

// switch between year from end to start
if (data.dNow < rule.time.dateStart && data.dNow > rule.time.dateEnd) {
if (data.now < rule.time.dateStart && data.now > rule.time.dateEnd) {
node.debug(`compareRules rule ${rule.name} (${rule.pos}) invalid date range over year`);
return null;

@@ -401,7 +408,8 @@ }

}
const num = getRuleTimeData(node, msg, rule, data.dNow);
// node.debug(`pos=${rule.pos} type=${rule.time.operatorText} - ${rule.time.value} - num=${num} - rule.timeData = ${ util.inspect(rule.timeData, { colors: true, compact: 40, breakLength: Infinity }) }`);
const num = getRuleTimeData(node, msg, rule, data.now);
// node.debug(`compareRules ${rule.name} (${rule.pos}) type=${rule.time.operatorText} - ${rule.time.value} - num=${num} - rule.timeData = ${ util.inspect(rule.timeData, { colors: true, compact: 40, breakLength: Infinity }) }`);
if (data.dayId === rule.timeData.dayId && num >=0 && (cmp(num) === true)) {
return rule;
}
// node.debug(`compareRules rule ${rule.name} (${rule.pos}) dayId=${data.dayId} rule-DayID=${rule.timeData.dayId} num=${num} cmp=${cmp(num)} invalid time`);
return null;

@@ -461,3 +469,3 @@ }

function initializeCtrl(REDLib, node, config) {
node.debug(`initialize ${ node.name || node.id}`);
node.debug(`initialize ${ node.name || node._path || node.id}`);
RED = REDLib;

@@ -464,0 +472,0 @@

@@ -14,2 +14,4 @@ {

"blindClosedPos": "Rollladen geschlossen (min)",
"blindOpenPosOffset": "Rollladen offen offset",
"blindClosedPosOffset": "Rollladen geschlossen offset",
"blindLevelDefault": "Standard Rollladenposition",

@@ -62,2 +64,4 @@ "slatPosDefault": "Standard Lamellenposition",

"blindClosedPos": "0",
"blindOpenPosOffset": "offset für die Position geöffnet",
"blindClosedPosOffset": "offset für die Position geschlossen",
"blindLevelDefault": "Rollladenposition, wenn keine andere zutrifft",

@@ -64,0 +68,0 @@ "slatPosDefault": "Lamellenposition, wenn keine andere zutrifft",

@@ -44,2 +44,3 @@ {

"nodeName":"Node ID",
"nodePath":"Node Pfad",
"timeentered": "Uhrzeit (nächste)",

@@ -443,2 +444,4 @@ "dateentered": "Datum (spezieller Zeitpunkt)",

"oversteer": "erlaubt das Übersteuern der Position in Abhängigkeit von der Sonne unter definierten Bedingungen wie Sonnenwinkel oder Wetter (z. B. Wolkenhimmel, Beleuchtung, etc.). Hiermit kann auch eine minimale oder maximaler Höhenwinkel definiert werden, wenn Berge/Gebäude, etc das Fenster verdecken.",
"sunAdvanced": "Erweiterte Einstellungen für die Sonnensteuerung",
"blindPosOffset": "Wenn der Fensterbereich kleiner als der Rollladen öffnen/schließenBereichs entspricht, weil ein breiter Fensterrahmen vorhanden ist oder verzögerte öffnen/schließen vorliegt (durch beispielsweise Schlitze welche sich erst Öffnen/schließen müssen), kann hier ein Offset dafür eingestellt werden.",
"sunControlMaximization": "<ul><li>Wenn keine Regel oder Überschreiben (Override) zutrifft,<ul><li>Wenn die Sonne <em>nicht</ em> in das Fenster scheint, wird die Rollladenhöhe die definierte <strong>Minimalposition</ strong> gesetzt. (Übersteuern wird ignoriert)</ li><li>Wenn sich die Sonne im Fenster befindet</ li><li>Wenn eine Übersteueruzng aufgesetzt ist und die bedingung zutrifft, wird der Behang auf die Höhe des Übersteuerns gesetzt.< / li><li>Andernfalls wird die Behanghöhe auf die definierte <strong>Maximalposition</ strong> gesetzt.</ li></ ul></ li></ ul>",

@@ -445,0 +448,0 @@ "sunControlMinimization": "<ul><li>Wenn keine Regel oder Überschreiben (Override) zutrifft,<ul><li>Wenn die Sonne <em>nicht</ em> in das Fenster scheint, wird die Rollladenhöhe die definierte <strong>Maximalposition</ strong> gesetzt. (Übersteuern wird ignoriert)</ li><li>Wenn sich die Sonne im Fenster befindet</ li><li>Wenn eine Übersteueruzng aufgesetzt ist und die bedingung zutrifft, wird der Behang auf die Höhe des Übersteuerns gesetzt.< / li><li>Andernfalls wird die Behanghöhe auf die definierte <strong>Minimalposition</ strong> gesetzt.</ li></ ul></ li></ ul>",

@@ -14,2 +14,4 @@ {

"blindClosedPos": "closed position (min)",
"blindOpenPosOffset": "open position offset",
"blindClosedPosOffset": "closed position offset",
"blindLevelDefault": "default position",

@@ -62,2 +64,4 @@ "slatPosDefault": "default slat",

"blindClosedPos": "0",
"blindOpenPosOffset": "offset for the open position",
"blindClosedPosOffset": "offset for the closed position",
"blindLevelDefault": "blind position if no other used",

@@ -130,5 +134,7 @@ "slatPosDefault": "slat position if no other used",

"getBlindPosData": "error getting blind level: __message__",
"smoothTimeToolong": "The selected smooth is too long!!"
"smoothTimeToolong": "The selected smooth is too long!!",
"invalidOpenPosOffset":"Invalid value for blind open position offset for the sun control!",
"invalidClosedPosOffset":"Invalid value for blind closed position offset for the sun control!"
}
}
}

@@ -44,2 +44,3 @@ {

"nodeName":"node ID",
"nodePath":"node path",
"timeentered":"time (next)",

@@ -458,2 +459,4 @@ "dateentered":"date",

"oversteer": "allows to oversteer the position depending on the sun under defined condition such as elevation, weather (for example sky covered by clouds, lighting, ...) This can also be used to define a minimum or maximum elevation angle if mountains / buildings, etc. cover the window.",
"sunAdvanced": "advanced settigns for sun control",
"blindPosOffset": "If the window free space does not match the blind open and closed position, here can be defined an offset to this. Example for this is a wide window frame or a delay in opening the blind caused by open/close the slits between the slats.",
"sunControlMaximization": "<ul><li>If no rule or override matches<ul><li>If the sun is <em>not</em> in the window the blind will set to defined <strong>minimum position</strong>. (oversteer will be ignored)</li><li>If the sun is in the window</li><li>If any oversteer data are setup and oversteer conditions are fulfilled the blind will set to the defined oversteer blind position.</li><li>otherwise the blind level is set to defined <strong>maximum position</strong>.</li></ul></li></ul>",

@@ -460,0 +463,0 @@ "sunControlMinimization": "<ul><li>If no rule or override matches<ul><li>If the sun is <em>not</em> in the window the blind will set to defined <strong>maximum position</strong>. (oversteer will be ignored)</li><li>If the sun is in the window</li><li>If any oversteer data are setup and oversteer conditions are fulfilled the blind will set to the defined oversteer blind position.</li><li>otherwise the blind level is set to defined <strong>minimum position</strong>.</li></ul></li></ul>",

@@ -24,2 +24,10 @@ /********************************************

const node = this;
if (!this.positionConfig) {
node.status({
fill: 'red',
shape: 'dot',
text: 'Node not properly configured!!'
});
return;
}

@@ -26,0 +34,0 @@ this.on('input', function (msg, send, done) {

@@ -228,3 +228,4 @@ /************************************************************************/

label: node._('node-red-contrib-sun-position/position-config:common.types.strPlaceholder'),
hasValue: false
icon: 'icons/node-red-contrib-sun-position/inputTypeStrPlaceholder.svg',
hasValue: true
},

@@ -248,2 +249,7 @@ numPercent: {

},
nodePath: {
value: 'nodePath',
label: node._('node-red-contrib-sun-position/position-config:common.types.nodePath','node name'),
hasValue: false
},
TimeEntered: {

@@ -870,2 +876,7 @@ value: 'entered',

}
if (Array.isArray(data.types) && !data.types.find(el => (el === type || el.value === type))) {
console.error(`unknown typeInput type: ${data.typeProp} = '${type}', using default '${data.defaultType}' allowed types=`,data.types); // eslint-disable-line no-console
type = data.defaultType;
$typeField.val(type);
}
if (typeof node[data.valueProp] === 'undefined' || node[data.valueProp] === null) {

@@ -872,0 +883,0 @@ if (typeof data.defaultValue !== 'undefined') {

@@ -33,2 +33,10 @@ /********************************************

const node = this;
if (!this.positionConfig) {
node.status({
fill: 'red',
shape: 'dot',
text: 'Node not properly configured!!'
});
return;
}

@@ -35,0 +43,0 @@ this.on('input', function (msg, send, done) {

@@ -94,2 +94,10 @@ /********************************************

const node = this;
if (!this.positionConfig) {
node.status({
fill: 'red',
shape: 'dot',
text: 'Node not properly configured!!'
});
return;
}

@@ -96,0 +104,0 @@ this.on('input', (msg, send, done) => {

@@ -750,3 +750,3 @@ /********************************************

}
msg._srcid = node.id;
msg._srcid = node._path || node.id;
msg._ts = dNow.valueOf();

@@ -753,0 +753,0 @@ return msg;

@@ -85,5 +85,3 @@ /********************************************

timeSpan = timeSpan * -1;
const dTmp = d1;
d1 = d2;
d2 = dTmp;
[d1, d2] = [d2, d1];
}

@@ -269,3 +267,10 @@

this.positionConfig = RED.nodes.getNode(config.positionConfig);
if (!this.positionConfig) {
node.status({
fill: 'red',
shape: 'dot',
text: 'Node not properly configured!!'
});
return;
}
this.operand1 = {

@@ -272,0 +277,0 @@ type: config.operand1Type,

@@ -287,3 +287,10 @@ /********************************************

// this.debug('initialize withinTimeSwitchNode ' + util.inspect(config, { colors: true, compact: 10, breakLength: Infinity }));
if (!this.positionConfig) {
node.status({
fill: 'red',
shape: 'dot',
text: 'Node not properly configured!!'
});
return null;
}
this.timeStart = {

@@ -393,6 +400,6 @@ type: config.startTimeType,

if (typeof config.timedatestart !== undefined && config.timedatestart !== '') {
if (typeof config.timedatestart !== 'undefined' && config.timedatestart !== '') {
this.timeStartDate = new Date(config.timedatestart);
}
if (typeof config.timedateend !== undefined && config.timedateend !== '') {
if (typeof config.timedateend !== 'undefined' && config.timedateend !== '') {
this.timeEndDate = new Date(config.timedateend);

@@ -399,0 +406,0 @@ }

{
"name": "node-red-contrib-sun-position",
"version": "2.0.6",
"version": "2.0.12",
"description": "NodeRED nodes to get sun and moon position",

@@ -56,3 +56,3 @@ "keywords": [

"scripts": {
"test": "eslint \"./**/*.js\" \"./**/*.html\"",
"test": "eslint \"./**/*.js\" \"./**/*.html\" && node-red-dev validate",
"lintfix": "eslint --fix \"./**/*.js\" \"./**/*.html\"",

@@ -62,3 +62,3 @@ "lint": "eslint \"./**/*.js\" \"./**/*.html\"",

"dev": "node-red -v",
"prepublishOnly": "eslint \"./**/*.js\" \"./**/*.html\""
"prepublishOnly": "eslint \"./**/*.js\" \"./**/*.html\" && node-red-dev validate"
},

@@ -116,7 +116,8 @@ "repository": {

"devDependencies": {
"eslint": "^8.3.0",
"eslint": "^8.8.0",
"eslint-plugin-html": "^6.2.0",
"eslint-plugin-jsdoc": "^37.0.3",
"eslint-plugin-jsdoc": "^37.7.0",
"eslint-plugin-json": "^3.1.0",
"eslint-plugin-node": "^11.1.0"
"eslint-plugin-node": "^11.1.0",
"node-red-dev": "^0.1.4"
},

@@ -123,0 +124,0 @@ "disabledSettings": {

@@ -0,0 +0,0 @@ # node-red-contrib-sun-position for NodeRED

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc