node-red-contrib-padavan 2.0.2 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -4,7 +4,7 @@ Performs system diagnostics and control operations.
4
4
  ### Inputs
5
5
 
6
6
  - **Action** (`msg.topic`):
7
- - `status`: Get system status (CPU, RAM, Uptime).
7
+ - `status`: Get system status.
8
8
  - `log`: Get the system log.
9
9
  - `reboot`: Reboot the router.
10
10
  - `scan`: Scan for Wi-Fi networks (Site Survey).
@@ -15,8 +15,14 @@ Performs system diagnostics and control operations.
15
15
 
16
16
  ### Outputs
17
17
 
18
- - `msg.payload`: The result of the operation (JSON object for status/doctor,
19
- array for scan, string for log).
18
+ - `msg.payload`: The result of the operation.
19
+ - For `status`, the object is enhanced with:
20
+ - `uptimeStr` (`string`): A formatted uptime string (e.g., "5d 12h 30m").
21
+ - `cpuPercent` (`number` | `null`): Calculated CPU usage.
22
+ - `ramPercent` (`number`): Calculated RAM usage.
23
+ - For `scan`, an array of networks.
24
+ - For `doctor`, an analysis object.
25
+ - For `log`, a string.
20
26
 
21
27
  ### Details
22
28
 
@@ -4,7 +4,7 @@
4
4
  ### Входы
5
5
 
6
6
  - **Действие** (`msg.topic`):
7
- - `status`: Получить статус системы (CPU, RAM, Uptime).
7
+ - `status`: Получить статус системы.
8
8
  - `log`: Получить системный журнал.
9
9
  - `reboot`: Перезагрузить роутер.
10
10
  - `scan`: Сканировать эфир Wi-Fi (Site Survey).
@@ -15,8 +15,15 @@
15
15
 
16
16
  ### Выходы
17
17
 
18
- - `msg.payload`: Результат операции (JSON объект для статуса/доктора, массив
19
- для сканирования, строка для лога).
18
+ - `msg.payload`: Результат операции.
19
+ - Для `status`, объект дополняется полями:
20
+ - `uptimeStr` (`string`): Отформатированная строка времени работы
21
+ (например, "5d 12h 30m").
22
+ - `cpuPercent` (`number` | `null`): Рассчитанная загрузка CPU.
23
+ - `ramPercent` (`number`): Рассчитанное использование RAM.
24
+ - Для `scan` — массив сетей.
25
+ - для `doctor` — объект с анализом.
26
+ - Для `log` — строка.
20
27
 
21
28
  ### Детали
22
29
 
@@ -1,5 +1,5 @@
1
1
  <script type="text/javascript">
2
- var ACTION_MODE=[" Apply "," Restart "," Reboot "," Shutdown "," Add "," Del "," ClearLog "," SystemCmd "," CommitFlash "," RestoreNVRAM "," RestoreStorage "," FreeMemory "," NTPSyncNow "," CreateCertHTTPS "," CheckCertHTTPS "," CreateCertOVPNS "," ExportConfOVPNC "," ExportWGConf "," wg_action ","Update"],SERVICE_ID=["General","LANHostConfig","IPConnection","PPPConnection","FirewallConfig","RouterConfig","WLANConfig11a","WLANConfig11b","WLANAuthentication11a","WLANAuthentication11b","Storage","IP6Connection","Layer3Forwarding"],GROUP_ID=["ManualDHCPList","VSList","GWStatic","UrlList","MFList","ACLList","rt_ACLList","RBRList","rt_RBRList","LWFilterList","VPNSACLList"];var RED=window.RED,mapOptions=(list)=>list.map((value)=>({value,label:value.trim()})),ACTION_MODES=mapOptions(ACTION_MODE),SERVICE_IDS=mapOptions(SERVICE_ID),GROUP_IDS=mapOptions(GROUP_ID);RED.nodes.registerType("padavan-params",{category:"Padavan",defaults:{settings:{value:"",type:"padavan-config",required:!0},name:{value:""},topic:{value:"topic"},topicType:{value:"msg"},payload:{value:"payload"},payloadType:{value:"msg"},page:{value:""},pageType:{value:"str"},sid:{value:""},sidType:{value:"str"},group:{value:""},groupType:{value:"str"},script:{value:""},scriptType:{value:"str"},action:{value:" Apply "},actionType:{value:"str"}},icon:"font-awesome/fa-cogs",inputs:1,outputs:1,color:"#49AFCD",paletteLabel:"Params",label:function(){return this.name||"Params"},oneditprepare:function(){$("#node-input-topic").typedInput({types:["msg",{value:"action",options:[{value:"list",label:this._("params.action.list")},{value:"get",label:this._("params.action.get")},{value:"set",label:this._("params.action.set")}]}],typeField:"#node-input-topicType"}),$("#node-input-payload").typedInput({types:["msg","json","str"],typeField:"#node-input-payloadType"}),$("#node-input-page").typedInput({types:["str","msg"],typeField:"#node-input-pageType"}),$("#node-input-sid").typedInput({types:["str","json","msg",{value:"sid",options:SERVICE_IDS}],typeField:"#node-input-sidType"}),$("#node-input-group").typedInput({types:["str","msg",{value:"group",options:GROUP_IDS}],typeField:"#node-input-groupType"}),$("#node-input-script").typedInput({types:["str","msg"],typeField:"#node-input-scriptType"}),$("#node-input-action").typedInput({types:[{value:"mode",options:ACTION_MODES},"str","msg"],typeField:"#node-input-actionModeType"}),$("#node-input-topic").on("change",function(){let type=$("#node-input-topicType").val(),value=$("#node-input-topic").val(),isSet=type==="action"&&value==="set"||type==="msg",isList=type==="action"&&value==="list";$("#node-row-payload").toggle(!isList),$("#node-row-page").toggle(!isList),$("#node-row-sid").toggle(isSet),$("#node-row-group").toggle(isSet),$("#node-row-script").toggle(isSet),$("#node-row-action").toggle(isSet)})}});
2
+ var ACTION_MODE=[" Apply "," Restart "," Reboot "," Shutdown "," Add "," Del "," ClearLog "," SystemCmd "," CommitFlash "," RestoreNVRAM "," RestoreStorage "," FreeMemory "," NTPSyncNow "," CreateCertHTTPS "," CheckCertHTTPS "," CreateCertOVPNS "," ExportConfOVPNC "," ExportWGConf "," wg_action ","Update"],SERVICE_ID=["General","LANHostConfig","IPConnection","PPPConnection","FirewallConfig","RouterConfig","WLANConfig11a","WLANConfig11b","WLANAuthentication11a","WLANAuthentication11b","Storage","IP6Connection","Layer3Forwarding"],GROUP_ID=["ManualDHCPList","VSList","GWStatic","UrlList","MFList","ACLList","rt_ACLList","RBRList","rt_RBRList","LWFilterList","VPNSACLList"];function createTypedInputOptions(list){return list.map((value)=>({value,label:value.trim()}))}var RED=window.RED;RED.nodes.registerType("padavan-params",{category:"Padavan",defaults:{settings:{value:"",type:"padavan-config",required:!0},name:{value:""},topic:{value:"topic"},topicType:{value:"msg"},payload:{value:"payload"},payloadType:{value:"msg"},page:{value:""},pageType:{value:"str"},sid:{value:""},sidType:{value:"str"},group:{value:""},groupType:{value:"str"},script:{value:""},scriptType:{value:"str"},action:{value:" Apply "},actionType:{value:"str"}},icon:"font-awesome/fa-cogs",inputs:1,outputs:1,color:"#49AFCD",paletteLabel:"Params",label:function(){return this.name||"Params"},oneditprepare:function(){$("#node-input-topic").typedInput({types:["msg",{value:"action",options:[{value:"list",label:this._("params.action.list")},{value:"get",label:this._("params.action.get")},{value:"set",label:this._("params.action.set")}]}],typeField:"#node-input-topicType"}),$("#node-input-payload").typedInput({types:["msg","json","str","jsonata"],typeField:"#node-input-payloadType"}),$("#node-input-page").typedInput({types:["str","msg"],typeField:"#node-input-pageType"}),$("#node-input-sid").typedInput({types:["str","json","msg",{value:"sid",options:createTypedInputOptions(SERVICE_ID)}],typeField:"#node-input-sidType"}),$("#node-input-group").typedInput({types:["str","msg",{value:"group",options:createTypedInputOptions(GROUP_ID)}],typeField:"#node-input-groupType"}),$("#node-input-script").typedInput({types:["str","msg"],typeField:"#node-input-scriptType"}),$("#node-input-action").typedInput({types:[{value:"mode",options:createTypedInputOptions(ACTION_MODE)},"str","msg"],typeField:"#node-input-actionType"}),$("#node-input-topic").on("change",function(){let type=$("#node-input-topicType").val(),value=$("#node-input-topic").val(),isSet=type==="action"&&value==="set"||type==="msg",isList=type==="action"&&value==="list";$("#node-row-payload").toggle(!isList),$("#node-row-page").toggle(!isList),$("#node-row-sid").toggle(isSet),$("#node-row-group").toggle(isSet),$("#node-row-script").toggle(isSet),$("#node-row-action").toggle(isSet)})}});
3
3
  </script>
4
4
 
5
5
  <script type="text/html" data-template-name="padavan-params">
@@ -1 +1 @@
1
- class z{#j;#h;#b;#k;constructor(b,j,h){this.#h=b,this.#b=j,this.#j=h;let q=h.nodes.getNode(j.settings);if(q)this.#k=q.instance;else this.#h.warn("Config node not found or configured.");this.#h.on("input",this.#q.bind(this))}get client(){if(!this.#k)throw Error("Client is not initialized. Check configuration.");return this.#k.client}async#q(b,j,h){let q=this.#j.util.evaluateNodeProperty(this.#b.topic,this.#b.topicType,this.#h,b),w=this.#j.util.evaluateNodeProperty(this.#b.payload,this.#b.payloadType,this.#h,b),B=this.#j.util.evaluateNodeProperty(this.#b.action,this.#b.actionType,this.#h,b),F=this.#j.util.evaluateNodeProperty(this.#b.script,this.#b.scriptType,this.#h,b),G=this.#j.util.evaluateNodeProperty(this.#b.sid,this.#b.sidType,this.#h,b),H=this.#j.util.evaluateNodeProperty(this.#b.group,this.#b.groupType,this.#h,b),x=this.#j.util.evaluateNodeProperty(this.#b.page,this.#b.pageType,this.#h,b);try{this.#h.status({fill:"blue",shape:"dot",text:"Processing..."});let k;switch(q){case"list":{k=await this.client.getParams();break}case"get":{k=await this.client.getParams(w,x);break}case"set":{if(!w||typeof w!=="object")throw Error("Input payload missing or not an object");await this.client.setParams(w,{action_mode:B,action_script:F,sid_list:G,group_id:H,current_page:x}),k=w;break}default:throw Error(`Invalid topic: "${q}". Must be 'list', 'get', or 'set'.`)}if(k){if(!b.topic)b.topic=q;b.payload=k,j(b)}this.#h.status({}),h()}catch(k){this.#h.status({fill:"red",shape:"ring",text:"Error"}),h(k)}}}function J(b){b.nodes.registerType("padavan-params",function(j){b.nodes.createNode(this,j);let h=this;h.instance=new z(h,j,b)})}export{J as default,z as ParamsNode};
1
+ function L(b,q,h,k,w){return new Promise((z,B)=>{if(h==="jsonata")b.util.evaluateNodeProperty(q,h,k,w,(x,G)=>{if(x)B(x);else z(G)});else try{let x=b.util.evaluateNodeProperty(q,h,k,w);z(x)}catch(x){B(x)}})}async function J(b,q,h,k){let w=k.map(({value:z,type:B})=>L(b,z,B,q,h));return Promise.all(w)}class K{#q;#h;#b;#k;constructor(b,q,h){this.#h=b,this.#b=q,this.#q=h;let k=h.nodes.getNode(q.settings);if(k)this.#k=k.instance;else this.#h.warn("Config node not found or configured.");this.#h.on("input",this.#w.bind(this))}get client(){if(!this.#k)throw Error("Client is not initialized. Check configuration.");return this.#k.client}async#w(b,q,h){try{let[k,w,z,B,x,G,H]=await J(this.#q,this.#h,b,[{value:this.#b.topic,type:this.#b.topicType},{value:this.#b.payload,type:this.#b.payloadType},{value:this.#b.action,type:this.#b.actionType},{value:this.#b.script,type:this.#b.scriptType},{value:this.#b.sid,type:this.#b.sidType},{value:this.#b.group,type:this.#b.groupType},{value:this.#b.page,type:this.#b.pageType}]);this.#h.status({fill:"blue",shape:"dot",text:"Processing..."});let F;switch(k){case"list":{F=await this.client.getParams();break}case"get":{F=await this.client.getParams(w,H);break}case"set":{if(!w||typeof w!=="object")throw Error("Input payload missing or not an object");await this.client.setParams(w,{action_mode:z,action_script:B,sid_list:x,group_id:G,current_page:H}),F=w;break}default:throw Error(`Invalid topic: "${k}". Must be 'list', 'get', or 'set'.`)}if(F){if(!b.topic)b.topic=k;b.payload=F,q(b)}this.#h.status({}),h()}catch(k){this.#h.status({fill:"red",shape:"ring",text:"Error"}),h(k)}}}function O(b){b.nodes.registerType("padavan-params",function(q){b.nodes.createNode(this,q);let h=this;h.instance=new K(h,q,b)})}export{O as default,K as ParamsNode};
@@ -1,5 +1,5 @@
1
1
  <script type="text/javascript">
2
- var RED=window.RED;RED.nodes.registerType("padavan-system",{category:"Padavan",defaults:{settings:{value:"",type:"padavan-config",required:!0},name:{value:""},topic:{value:"topic"},topicType:{value:"msg"},band:{value:"2.4"},bandType:{value:"str"}},icon:"font-awesome/fa-server",inputs:1,outputs:1,color:"#49AFCD",paletteLabel:"System",label:function(){return this.name||"System"},oneditprepare:function(){$("#node-input-topic").typedInput({types:["msg",{value:"action",options:[{value:"status",label:this._("system.action.status")},{value:"log",label:this._("system.action.log")},{value:"reboot",label:this._("system.action.reboot")},{value:"scan",label:this._("system.action.scan")},{value:"doctor",label:this._("system.action.doctor")}]}],typeField:"#node-input-topicType"}).on("change",function(){let type=$("#node-input-topicType").val(),value=$("#node-input-topic").val(),showBand=type==="action"&&(value==="scan"||value==="doctor")||type==="msg";$("#node-input-band-row").toggle(showBand)}),$("#node-input-band").typedInput({types:[{value:"str",options:[{value:"2.4",label:"2.4 GHz"},{value:"5",label:"5 GHz"}]},"msg"],typeField:"#node-input-bandType"})}});
2
+ var RED=window.RED;RED.nodes.registerType("padavan-system",{category:"Padavan",defaults:{settings:{value:"",type:"padavan-config",required:!0},name:{value:""},topic:{value:"topic"},topicType:{value:"msg"},band:{value:"2.4"},bandType:{value:"band"}},icon:"font-awesome/fa-server",inputs:1,outputs:1,color:"#49AFCD",paletteLabel:"System",label:function(){return this.name||"System"},oneditprepare:function(){$("#node-input-topic").typedInput({types:["msg",{value:"action",options:[{value:"status",label:this._("system.action.status")},{value:"log",label:this._("system.action.log")},{value:"reboot",label:this._("system.action.reboot")},{value:"scan",label:this._("system.action.scan")},{value:"doctor",label:this._("system.action.doctor")}]}],typeField:"#node-input-topicType"}).on("change",function(){let type=$("#node-input-topicType").val(),value=$("#node-input-topic").val(),showBand=type==="action"&&(value==="scan"||value==="doctor")||type==="msg";$("#node-input-band-row").toggle(showBand)}),$("#node-input-band").typedInput({types:[{value:"band",options:[{value:"2.4",label:"2.4 GHz"},{value:"5",label:"5 GHz"}]},"msg"],typeField:"#node-input-bandType"})}});
3
3
  </script>
4
4
 
5
5
  <script type="text/html" data-template-name="padavan-system">
@@ -1 +1 @@
1
- class z{#k;#h;#j;#q;constructor(h,q,k){this.#h=h,this.#j=q,this.#k=k;let w=k.nodes.getNode(q.settings);if(w)this.#q=w.instance;else this.#h.warn("Config node not found or configured.");this.#h.on("input",this.#w.bind(this))}get client(){if(!this.#q)throw Error("Client is not initialized. Check configuration.");return this.#q.client}async#w(h,q,k){let w=this.#k.util.evaluateNodeProperty(this.#j.topic,this.#j.topicType,this.#h,h),x=this.#k.util.evaluateNodeProperty(this.#j.band,this.#j.bandType,this.#h,h)||"2.4";try{this.#h.status({fill:"blue",shape:"dot",text:`Running ${w}...`});let j;switch(w){case"status":{j=await this.client.getStatus();break}case"log":{j=await this.client.getLog();break}case"reboot":{j=await this.client.startReboot();break}case"scan":{j=await this.client.startScan(x);break}case"doctor":{j=await this.client.getBestChannel(x);break}default:throw Error(`Invalid topic: "${w}".`)}if(j!==void 0){if(!h.topic)h.topic=w;h.payload=j,q(h)}this.#h.status({}),k()}catch(j){this.#h.status({fill:"red",shape:"ring",text:"Error"}),k(j)}}}function B(h){h.nodes.registerType("padavan-system",function(q){h.nodes.createNode(this,q);let k=this;k.instance=new z(k,q,h)})}export{B as default,z as SystemNode};
1
+ import{formatUptime as O}from"padavan/utils/formatting.js";function L(k,z,q,x,F){return new Promise((h,G)=>{if(q==="jsonata")k.util.evaluateNodeProperty(z,q,x,F,(B,H)=>{if(B)G(B);else h(H)});else try{let B=k.util.evaluateNodeProperty(z,q,x,F);h(B)}catch(B){G(B)}})}async function J(k,z,q,x){let F=x.map(({value:h,type:G})=>L(k,h,G,z,q));return Promise.all(F)}class K{#z;#h;#q;#x;#k=null;constructor(k,z,q){this.#h=k,this.#q=z,this.#z=q;let x=q.nodes.getNode(z.settings);if(x)this.#x=x.instance;else this.#h.warn("Config node not found or configured.");this.#h.on("input",this.#B.bind(this)),this.#h.on("close",()=>{this.#k=null})}get client(){if(!this.#x)throw Error("Client is not initialized. Check configuration.");return this.#x.client}async#B(k,z,q){try{let[x,F]=await J(this.#z,this.#h,k,[{value:this.#q.topic,type:this.#q.topicType},{value:this.#q.band,type:this.#q.bandType}]);this.#h.status({fill:"blue",shape:"dot",text:`Running ${x}...`});let h;switch(x){case"status":{let G=Date.now();if(h=await this.client.getStatus(),h.ram?.total>0)h.ramPercent=Math.round(h.ram.used/h.ram.total*100);if(h.uptime)h.uptimeStr=O(h.uptime);if(h.cpu){if(h.cpuPercent=null,this.#k&&G-this.#k.timestamp<30000){let B=h.cpu.busy-this.#k.state.busy,H=h.cpu.total-this.#k.state.total;if(H>0&&B>=0)h.cpuPercent=Math.round(B/H*100)}this.#k={state:h.cpu,timestamp:G}}break}case"log":{h=await this.client.getLog();break}case"reboot":{h=await this.client.startReboot();break}case"scan":{h=await this.client.startScan(F);break}case"doctor":{h=await this.client.getBestChannel(F);break}default:throw Error(`Invalid topic: "${x}".`)}if(h!==void 0){if(!k.topic)k.topic=x;k.payload=h,z(k)}this.#h.status({}),q()}catch(x){this.#h.status({fill:"red",shape:"ring",text:"Error"}),q(x)}}}function Q(k){k.nodes.registerType("padavan-system",function(z){k.nodes.createNode(this,z);let q=this;q.instance=new K(q,z,k)})}export{Q as default,K as SystemNode};
@@ -1 +1 @@
1
- class w{#k;#b;#h;#j;constructor(b,k,j){this.#b=b,this.#h=k,this.#k=j;let q=j.nodes.getNode(k.settings);if(q)this.#j=q.instance;else this.#b.warn("Config node not found or configured.");this.#b.on("input",this.#q.bind(this))}get client(){if(!this.#j)throw Error("Client is not initialized. Check configuration.");return this.#j.client}async#q(b,k,j){let q=this.#k.util.evaluateNodeProperty(this.#h.topic,this.#h.topicType,this.#b,b);try{this.#b.status({fill:"blue",shape:"dot",text:"Processing..."});let h;switch(q){case"changelog":{if(this.#b.status({fill:"blue",shape:"dot",text:"Checking updates..."}),h=await this.client.getChangelog(),h.messages&&h.messages.length>0)this.#b.status({fill:"green",shape:"dot",text:`New updates: ${h.messages.length}`});else this.#b.status({fill:"green",shape:"ring",text:"Up to date"});break}case"build":{this.#b.status({fill:"blue",shape:"dot",text:"Triggering build..."}),await this.client.startBuild(),h={status:"success",message:"Build triggered"},this.#b.status({fill:"green",shape:"dot",text:"Build started"}),setTimeout(()=>this.#b.status({}),5000);break}case"upgrade":{this.#b.status({fill:"blue",shape:"dot",text:"Downloading & Flashing..."}),await this.client.startUpgrade(),h={status:"success",message:"Firmware uploaded, router is rebooting"},this.#b.status({fill:"green",shape:"dot",text:"Rebooting..."}),setTimeout(()=>this.#b.status({}),1e4);break}default:throw Error(`Invalid topic: "${q}". Must be 'changelog', 'build', or 'upgrade'.`)}if(h){if(!b.topic)b.topic=q;b.payload=h,k(b)}j()}catch(h){this.#b.status({fill:"red",shape:"ring",text:"Error"}),j(h)}}}function x(b){b.nodes.registerType("padavan-upgrade",function(k){b.nodes.createNode(this,k);let j=this;j.instance=new w(j,k,b)})}export{x as default,w as UpgradeNode};
1
+ function F(b,w,h,k,q){return new Promise((z,B)=>{if(h==="jsonata")b.util.evaluateNodeProperty(w,h,k,q,(x,H)=>{if(x)B(x);else z(H)});else try{let x=b.util.evaluateNodeProperty(w,h,k,q);z(x)}catch(x){B(x)}})}class G{#q;#b;#h;#k;constructor(b,w,h){this.#b=b,this.#h=w,this.#q=h;let k=h.nodes.getNode(w.settings);if(k)this.#k=k.instance;else this.#b.warn("Config node not found or configured.");this.#b.on("input",this.#w.bind(this))}get client(){if(!this.#k)throw Error("Client is not initialized. Check configuration.");return this.#k.client}async#w(b,w,h){try{let k=await F(this.#q,this.#h.topic,this.#h.topicType,this.#b,b);this.#b.status({fill:"blue",shape:"dot",text:"Processing..."});let q;switch(k){case"changelog":{if(this.#b.status({fill:"blue",shape:"dot",text:"Checking updates..."}),q=await this.client.getChangelog(),q.messages&&q.messages.length>0)this.#b.status({fill:"green",shape:"dot",text:`New updates: ${q.messages.length}`});else this.#b.status({fill:"green",shape:"ring",text:"Up to date"});break}case"build":{this.#b.status({fill:"blue",shape:"dot",text:"Triggering build..."}),await this.client.startBuild(),q={status:"success",message:"Build triggered"},this.#b.status({fill:"green",shape:"dot",text:"Build started"}),setTimeout(()=>this.#b.status({}),5000);break}case"upgrade":{this.#b.status({fill:"blue",shape:"dot",text:"Downloading & Flashing..."}),await this.client.startUpgrade(),q={status:"success",message:"Firmware uploaded, router is rebooting"},this.#b.status({fill:"green",shape:"dot",text:"Rebooting..."}),setTimeout(()=>this.#b.status({}),1e4);break}default:throw Error(`Invalid topic: "${k}". Must be 'changelog', 'build', or 'upgrade'.`)}if(q){if(!b.topic)b.topic=k;b.payload=q,w(b)}h()}catch(k){this.#b.status({fill:"red",shape:"ring",text:"Error"}),h(k)}}}function J(b){b.nodes.registerType("padavan-upgrade",function(w){b.nodes.createNode(this,w);let h=this;h.instance=new G(h,w,b)})}export{J as default,G as UpgradeNode};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "node-red-contrib-padavan",
3
- "version": "2.0.2",
3
+ "version": "2.1.0",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "description": "Node-RED nodes for managing routers with Padavan firmware.",
@@ -27,7 +27,7 @@
27
27
  }
28
28
  },
29
29
  "dependencies": {
30
- "padavan": "2.0.2"
30
+ "padavan": "2.1.0"
31
31
  },
32
32
  "devDependencies": {
33
33
  "@types/bun": "^1.2.17",