From c1299336cb99efe96a8856552eefa3f4c4f98ce4 Mon Sep 17 00:00:00 2001 From: Pierre CLEMENT Date: Tue, 23 Jan 2018 10:48:48 +0100 Subject: [PATCH] feat(gateway): move to lumi-aqara Also add gateway search and subdevices discovery. Closes #28, closes #27, closes #26, closes #17 and fixes #12 --- icons/devices/door-icon.png | Bin 0 -> 4681 bytes icons/devices/mi-all.png | Bin 0 -> 1050 bytes icons/devices/mi-switch.png | Bin 0 -> 842 bytes icons/devices/motion-icon.png | Bin 0 -> 5812 bytes icons/devices/outlet-icon.png | Bin 0 -> 16281 bytes icons/devices/thermometer-icon.png | Bin 0 -> 3524 bytes icons/gateway/mijia-io.png | Bin 0 -> 5990 bytes icons/gateway/mijia.png | Bin 0 -> 18401 bytes .../icons/door-tw-icon.png | Bin 5395 -> 0 bytes .../icons/mi-tw-switch.png | Bin 1998 -> 0 bytes .../icons/motion-tw-icon.png | Bin 7543 -> 0 bytes .../icons/outlet-tw-icon.png | Bin 12327 -> 0 bytes .../icons/switch-tw-icon.png | Bin 11432 -> 0 bytes .../icons/thermometer-tw-icon.png | Bin 3778 -> 0 bytes .../xiaomi-configurator.html | 131 ------------------ .../xiaomi-configurator.js | 14 -- package.json | 17 ++- src/nodes/gateway/Gateway.ejs | 47 +++++++ src/nodes/gateway/Gateway.ts | 62 +++++++++ src/nodes/gateway/GatewayConfigurator.ejs | 120 ++++++++++++++++ src/nodes/gateway/GatewayConfigurator.ts | 44 ++++++ src/nodes/gateway/GatewayIn.ejs | 55 ++++++++ src/nodes/gateway/GatewayIn.ts | 70 ++++++++++ src/nodes/gateway/GatewayOut.ejs | 54 ++++++++ src/nodes/gateway/GatewayOut.ts | 49 +++++++ src/nodes/gateway/Searcher.ts | 42 ++++++ src/nodes/gateway/index.ejs | 4 + src/nodes/gateway/index.ts | 17 +++ src/nodes/yeelight/Searcher.ts | 7 +- src/nodes/yeelight/YeelightConfigurator.ejs | 2 +- src/nodes/yeelight/YeelightConfigurator.ts | 4 +- src/nodes/yeelight/YeelightOut.ejs | 12 +- src/nodes/yeelight/YeelightOut.ts | 20 +-- typings/index.d.ts | 1 + typings/lumi-aqara.d.ts | 129 +++++++++++++++++ 35 files changed, 725 insertions(+), 176 deletions(-) create mode 100644 icons/devices/door-icon.png create mode 100644 icons/devices/mi-all.png create mode 100644 icons/devices/mi-switch.png create mode 100644 icons/devices/motion-icon.png create mode 100644 icons/devices/outlet-icon.png create mode 100644 icons/devices/thermometer-icon.png create mode 100644 icons/gateway/mijia-io.png create mode 100644 icons/gateway/mijia.png delete mode 100644 node-red-contrib-xiaomi-configurator/icons/door-tw-icon.png delete mode 100644 node-red-contrib-xiaomi-configurator/icons/mi-tw-switch.png delete mode 100644 node-red-contrib-xiaomi-configurator/icons/motion-tw-icon.png delete mode 100644 node-red-contrib-xiaomi-configurator/icons/outlet-tw-icon.png delete mode 100644 node-red-contrib-xiaomi-configurator/icons/switch-tw-icon.png delete mode 100644 node-red-contrib-xiaomi-configurator/icons/thermometer-tw-icon.png delete mode 100644 node-red-contrib-xiaomi-configurator/xiaomi-configurator.html delete mode 100644 node-red-contrib-xiaomi-configurator/xiaomi-configurator.js create mode 100644 src/nodes/gateway/Gateway.ejs create mode 100644 src/nodes/gateway/Gateway.ts create mode 100644 src/nodes/gateway/GatewayConfigurator.ejs create mode 100644 src/nodes/gateway/GatewayConfigurator.ts create mode 100644 src/nodes/gateway/GatewayIn.ejs create mode 100644 src/nodes/gateway/GatewayIn.ts create mode 100644 src/nodes/gateway/GatewayOut.ejs create mode 100644 src/nodes/gateway/GatewayOut.ts create mode 100644 src/nodes/gateway/Searcher.ts create mode 100644 src/nodes/gateway/index.ejs create mode 100644 src/nodes/gateway/index.ts create mode 100644 typings/index.d.ts create mode 100644 typings/lumi-aqara.d.ts diff --git a/icons/devices/door-icon.png b/icons/devices/door-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..f33e89298eab7ec1ff445cae51a08a906b552f9a GIT binary patch literal 4681 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 literal 0 HcmV?d00001 diff --git a/icons/devices/mi-all.png b/icons/devices/mi-all.png new file mode 100644 index 0000000000000000000000000000000000000000..b2c29af957d7edf9ed2a5d1ec080ee285ab8816a GIT binary patch literal 1050 zcmV+#1m*jQP)G9b6EHpc`1d@y=0y_ZTbT%n{?Q63vo#SqOZY%|MtDJZNq9}DVZ3J93)Xqh&sdQN z4I?zS4NG$(gk+2-Y#^*4tkPg5VZC}LYn!0`Fh2vr=D^JW18@ZBa(ITP(=qLMQ+$&; zh^E}+_*xy7nTE8BzUq8y>>MTpvNBnWiMxc?uaU*v#+*RIN1X!vK}f;C~gyhS0Hm4F1VJkarLyeI*Pu zNWeh0sahq=+JoMH@cW2}O}_^SCQl&=VwO~}{5xTQK>`M_P1VXp-yZPyw2VnYYb=I@ zJs__J0tRM@fGX(U3x1xG&t*=4o`gdzE6;%$P{y)D;NMAo@JK-BBpe4LYY2t>_m3

eTiBPkf69 zkf1Z1Hj+7;>#oO*K6)s zU@n%cK&O!V{}Or`ARr2`7u!^=5PbuZ<~RE+04KeTgej36`aF=WCCoH^Bvv-rw)6@8 zoI=>3nE{!duTh3Nxqvv|H1`)7-w3rMgc_Yt>KMLg^)x!|P{-W~Is(iRfXgIkB0{^X z!vNc>!vW{%m-$ZNj0UG!cPYMCkml;}a6)t2a7bWMI|D+l`rag5AY39`;ZZ)wxU6K{ zcae2hg)R_nMo#_m-BYtb#_kjW#-=9 zJ-hRr^;R0Sa(t*!0V+TRsDMzT0#twsPyuFCfC^9nDnJFO02Po*r7Yk87gR2CT;OC) z0C!eu@StTRKz4w<7nlte5sQlq-ll1wqn`ovRXk#Ua08T5OMp|L3)SEn1sIB70A!1U zSPqGR{}~bm+@fHZlprau_`!f%1SCPOT9V{utHr>7%71~DRFiEKfEg^2-xC&d*`(M{ z-~o7CK^}qM;xLF%en1W`V;cQF+)2QZj}t*!g5pNtWZ~@J6kOsxLF@(1c`q;ta49a9 z9Rwdq-_p4M+gZBw*%aG=h-V$6xJHwJ$`n@z-2D?2Hxu-qvB~~-@cMz}!Iilv(w5T* zo>m>a^{iu3t^~-@Za|1>zV?9KW!!gIWsRD)J_;NQ!yaH35Q076q7bmdBj9Kl1Y8jUc7fTH zj|L~q0!sfX&{ zz2oz7C-^RttH3IQ0F#8Lg!s>wfIYO{s=)D3S>!HZQ{-ukE1m^Dde$+~j{xpqex9BN z;}qY6YFT_CIzntmg7Sg9m-%@g(2*C+@%sQN;S%TzI)N^ra{#&!oxn`+!!v+iKppQP zQ{FT65nA|Po?c?gJedKqpZ}Dvm3z2f0ZoL-{~*pAmm^{zk)`*65mEeI`IH&-t#DWH z29#>M1?tI~{0Q)#5Nm<8;1&1_5=G80@Bpj;78jq5FGDtH2|9yL6pIPorl#IQI@521 zHt!9k1ivrL+UIe8=?I)6$MzI%6cB1ufC^9nDj?LT02QDDR6wXv0V+TRsDMzD2IG{; U-^2PvtN;K207*qoM6N<$f>=g$Q~&?~ literal 0 HcmV?d00001 diff --git a/icons/devices/motion-icon.png b/icons/devices/motion-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..86c7e68cb92a3f4db84652d95b8deb7a51314fc7 GIT binary patch literal 5812 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 Yb}8j?bVjen@Bc0Bi~5?y>bJuF3tIbei2wiq literal 0 HcmV?d00001 diff --git a/icons/gateway/mijia-io.png b/icons/gateway/mijia-io.png new file mode 100644 index 0000000000000000000000000000000000000000..7058afb7e1fcdda6866ddb60b51c0400476873a2 GIT binary patch literal 5990 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 DwzIdi literal 0 HcmV?d00001 diff --git a/node-red-contrib-xiaomi-configurator/icons/door-tw-icon.png b/node-red-contrib-xiaomi-configurator/icons/door-tw-icon.png deleted file mode 100644 index 859d2ee48fd8500aed703f8cfc11e30e368f5e04..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5395 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 diff --git a/node-red-contrib-xiaomi-configurator/icons/mi-tw-switch.png b/node-red-contrib-xiaomi-configurator/icons/mi-tw-switch.png deleted file mode 100644 index 9040029a69d159327d27c857eab2fb9ee2237e70..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1998 zcmZuyc|6})++6kdNkIGB_V?7Q(~!Bi@aE>Mp5mU zR_me4_)xXA#yZu7snU+E9+4=e(Ztfe(7wJmpU=CW&%O8DbHC^NJ?H*$ZkC6;BMhnv z1pol%bcF0F*=@HcL`JgSp~n0v*+8+Lj&?xJ6Lp@%_Msm4W_r81;)Cc>n1EnSQ8UN3BoWok;V*Q z8PZ}kzmWWgha3_c#GpnqsdO4@n>Qek9>*l2(c41b#+N*q)X@Jb(PF=rB`FZQeScGx0H^Y-3QAMJ`VJ=3TfgWs^QBz3vNX@ z7cW9I1`R2n^3&hf=mlahmt-FXccRi>mBzj4kTJXZO3Yi^&=+Qw6~8Nc=Sr^+R65?i zp13sf_tOv8dG!YQ-|dnCrL##LC<@#NqAdNFd)-gnUPPYBgG%@Dc)Z=hvs9D{h-k#Y0nTdC^?5}O>SZCnO4pA`Nord6s%yTGNjj+{K0iAJTig|qm!;o8>Q?zOAlv~z&sH*4sy`{o|*@Gq^>lRJ3&NWBMs_NCty?^_7 zZC;8UO^b4*=`C z09I+p)R|_p0~x+*al{zFVq*|A(`fd{Vm8e80Zq=KQdmoG1i1rn>4fx$1a}8G(>QO-}YlE{p=$nJXU^64%$)+q#AEzN@=! zs~z04q}Zh@%E5kQyI{>O<;30OwwgpiWo4zWr;MI-TJf=$(g218DY)tKLkil&<< z@ZRR(DNm1h*WH!VT4@4x>^~82JFlSJ9gEA8LXdPu=MHcXeTmBhmdShQx#H&L<`pjM zMU&yRNi7w~E~;-A_|gyy%zP>jmR`#vnyhqREvSM4JTl~T_t_a=AQ5dTWu1ol&EZXH zpJVZT<<;2N!ilbw4PpAtNja`NH3xZzhvD z8Rf$zdQX#JuqGY>vHZ#JrL*Ostk7)IO>wTSZC&zfSJ^~@{v0W#;};R;Hh50k&PUh| zc@LR>G~d38>>@JCbJ_ibKL xsz_v9z^%yVx56*0y#9Z^c&9a|ZYZRtfEcNx`+Bu2t+sz&r^D{#8aqnbzX1tgbWQ*O diff --git a/node-red-contrib-xiaomi-configurator/icons/motion-tw-icon.png b/node-red-contrib-xiaomi-configurator/icons/motion-tw-icon.png deleted file mode 100644 index 010a00655e65ae63ae0220b677ce6819c95aea3e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7543 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 diff --git a/node-red-contrib-xiaomi-configurator/icons/switch-tw-icon.png b/node-red-contrib-xiaomi-configurator/icons/switch-tw-icon.png deleted file mode 100644 index a9ef1564c2e6c06be8c6e310ef43d903fee850e0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11432 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 diff --git a/node-red-contrib-xiaomi-configurator/xiaomi-configurator.html b/node-red-contrib-xiaomi-configurator/xiaomi-configurator.html deleted file mode 100644 index 5ebba6b..0000000 --- a/node-red-contrib-xiaomi-configurator/xiaomi-configurator.html +++ /dev/null @@ -1,131 +0,0 @@ - - - - - diff --git a/node-red-contrib-xiaomi-configurator/xiaomi-configurator.js b/node-red-contrib-xiaomi-configurator/xiaomi-configurator.js deleted file mode 100644 index efb0c53..0000000 --- a/node-red-contrib-xiaomi-configurator/xiaomi-configurator.js +++ /dev/null @@ -1,14 +0,0 @@ -module.exports = (RED) => { - function XiaomiConfiguratorNode(n) { - RED.nodes.createNode(this, n); - this.name = n.name; - this.deviceList = n.deviceList || []; - this.key = n.key; - this.ip = n.ip; - this.sid = this.sid || n.sid; - - var node = this; - } - - RED.nodes.registerType("xiaomi-configurator", XiaomiConfiguratorNode); -} diff --git a/package.json b/package.json index f6c69b9..d2dc66b 100644 --- a/package.json +++ b/package.json @@ -10,10 +10,10 @@ "clean": "rimraf dist", "build": "npm run clean && npm run build:ts && npm run build:ejs && npm run build:icons", "build:ts": "tsc --allowUnreachableCode -p .", - "build:ejs": "npm run build:ejs:indexes", + "build:ejs": "npm run build:ejs:indexes && npm run build:ejs:devices", "build:ejs:indexes": "ejs-cli --base-dir src/ --options \"{\\\"NODES_PREFIX\\\": \\\"mi-devices\\\"}\" \"**/index.ejs\" --out dist/", "build:ejs:devices": "ejs-cli --base-dir src/ --options \"{\\\"NODES_PREFIX\\\": \\\"mi-devices\\\"}\" \"nodes/devices/*.ejs\" --out dist/", - "build:icons": "npm run build:icons:yeelight", + "build:icons": "npm run build:icons:gateway && npm run build:icons:devices && npm run build:icons:actions && npm run build:icons:yeelight", "build:icons:gateway": "cp -pr icons/gateway dist/nodes/gateway/icons", "build:icons:devices": "cp -pr icons/devices dist/nodes/devices/icons", "build:icons:actions": "cp -pr icons/actions dist/nodes/actions/icons", @@ -28,15 +28,14 @@ ], "node-red": { "nodes": { - "xiaomi-ht": "node-red-contrib-xiaomi-ht/xiaomi-ht.js", - "xiaomi-magnet": "node-red-contrib-xiaomi-magnet/xiaomi-magnet.js", - "xiaomi-motion": "node-red-contrib-xiaomi-motion/xiaomi-motion.js", - "xiaomi-switch": "node-red-contrib-xiaomi-switch/xiaomi-switch.js", + "xiaomi-ht": "dist/nodes/devices/Sensor.js", + "xiaomi-magnet": "dist/nodes/devices/Magnet.js", + "xiaomi-motion": "dist/nodes/devices/Motion.js", + "xiaomi-switch": "dist/nodes/devices/Switch.js", "xiaomi-socket": "node-red-contrib-xiaomi-socket/xiaomi-socket.js", "xiaomi-socket-wifi": "node-red-contrib-xiaomi-socket-wifi/xiaomi-socket-wifi.js", - "xiaomi-all": "node-red-contrib-xiaomi-all/xiaomi-all.js", - "xiaomi-configurator": "node-red-contrib-xiaomi-configurator/xiaomi-configurator.js", - "xiaomi-gateway": "node-red-contrib-xiaomi-gateway/xiaomi-gateway.js", + "xiaomi-all": "dist/nodes/devices/All.js", + "xiaomi-gateway": "dist/nodes/gateway/index.js", "xiaomi-actions": "node-red-contrib-xiaomi-actions/xiaomi-actions.js", "xiaomi-yeelight": "dist/nodes/yeelight/index.js" } diff --git a/src/nodes/gateway/Gateway.ejs b/src/nodes/gateway/Gateway.ejs new file mode 100644 index 0000000..7ca4a7b --- /dev/null +++ b/src/nodes/gateway/Gateway.ejs @@ -0,0 +1,47 @@ + + + + + \ No newline at end of file diff --git a/src/nodes/gateway/Gateway.ts b/src/nodes/gateway/Gateway.ts new file mode 100644 index 0000000..ae5e456 --- /dev/null +++ b/src/nodes/gateway/Gateway.ts @@ -0,0 +1,62 @@ +import { Red, Node, NodeProperties } from "node-red"; +import { LumiAqara } from "../../../typings/index"; +import { Constants } from "../constants"; + +export interface IGatewayNode extends Node { + gatewayConf:any; + gateway: LumiAqara.Gateway; + + setGateway(gateway:LumiAqara.Gateway); +} + +export default (RED:Red) => { + class Gateway { + protected gatewayConf: any; + protected gateway: LumiAqara.Gateway; + + constructor(props:NodeProperties){ + RED.nodes.createNode( this, props); + this.gatewayConf = RED.nodes.getNode(( props).gateway); + this.gateway = null; + + ( this).status({fill:"red", shape:"ring", text: "offline"}); + this.setMessageListener(); + } + + protected setMessageListener() { + ( this).on('input', (msg) => { + if (this.gateway) { + var payload = msg.payload; + + // Input from gateway + if(payload.sid && payload.sid == this.gateway.sid) { + if(payload.data.rgb) { + /*var decomposed = miDevicesUtils.computeColor(payload.data.rgb); + payload.data.brightness = decomposed.brightness; + payload.data.color = decomposed.color;*/ + } + ( this).send(msg); + } + // Prepare for request + else { + msg.sid = this.gateway.sid; + ( this).send(msg); + } + } + }); + } + + setGateway(gateway:LumiAqara.Gateway) { + this.gateway = gateway; + this.gateway.setPassword(this.gatewayConf.password); + ( this).status({fill:"blue", shape:"dot", text: "online"}); + + this.gateway.on('offline', () => { + this.gateway = null; + ( this).status({fill:"red", shape:"ring", text: "offline"}); + }); + }; + } + + RED.nodes.registerType(`${Constants.NODES_PREFIX}-gateway`, Gateway); +}; \ No newline at end of file diff --git a/src/nodes/gateway/GatewayConfigurator.ejs b/src/nodes/gateway/GatewayConfigurator.ejs new file mode 100644 index 0000000..54ee938 --- /dev/null +++ b/src/nodes/gateway/GatewayConfigurator.ejs @@ -0,0 +1,120 @@ + + + + + diff --git a/src/nodes/gateway/GatewayConfigurator.ts b/src/nodes/gateway/GatewayConfigurator.ts new file mode 100644 index 0000000..43561a8 --- /dev/null +++ b/src/nodes/gateway/GatewayConfigurator.ts @@ -0,0 +1,44 @@ +import { Red, Node, NodeProperties, NodeStatus, ClearNodeStatus } from "node-red"; +import { Constants } from "../constants"; +import { Searcher } from "./Searcher"; +import { LumiAqara } from "../../../typings/index"; + +export interface IGatewayConfiguratorNode extends Node { + ip:string; + sid:number; + gateway: LumiAqara.Gateway; + + on(event: "gatewayFound", listener: () => void): any; +} + +export default (RED:Red) => { + class GatewayConfigurator { + ip:string; + sid:number; + _gateway:LumiAqara.Gateway; + + constructor(props: NodeProperties) { + RED.nodes.createNode( this, props); + let {ip, sid} = props; + this.sid = sid; + this.ip = ip; + } + + set gateway(gateway:LumiAqara.Gateway) { + this._gateway = gateway; + this._gateway.setPassword(( this).credentials.key); + ( this).emit('gatewayFound'); + } + + get gateway() { + return this._gateway; + } + } + + RED.nodes.registerType(`${Constants.NODES_PREFIX}-gateway configurator`, GatewayConfigurator, { + settings: { + miDevicesGatewayConfiguratorDiscoveredGateways: { value: Searcher.gateways, exportable: true } + }, + credentials: { key: {type:"text"} } + }); +}; diff --git a/src/nodes/gateway/GatewayIn.ejs b/src/nodes/gateway/GatewayIn.ejs new file mode 100644 index 0000000..caf3f31 --- /dev/null +++ b/src/nodes/gateway/GatewayIn.ejs @@ -0,0 +1,55 @@ + + + + + \ No newline at end of file diff --git a/src/nodes/gateway/GatewayIn.ts b/src/nodes/gateway/GatewayIn.ts new file mode 100644 index 0000000..c34cecd --- /dev/null +++ b/src/nodes/gateway/GatewayIn.ts @@ -0,0 +1,70 @@ +import {Red, Node, NodeProperties} from 'node-red'; +import {LumiAqara} from '../../../typings'; +import { Constants } from '../constants'; + +export interface IGatewayInNode extends Node { + gatewayConf:any; + gateway: LumiAqara.Gateway; + + setGateway(gateway:LumiAqara.Gateway); +} + +export default (RED:Red) => { + class GatewayIn { + protected gatewayConf: any; + protected gateway: LumiAqara.Gateway; + + constructor(props:NodeProperties) { + RED.nodes.createNode( this, props); + this.gatewayConf = RED.nodes.getNode(( props).gateway); + (this).status({fill:"red", shape:"ring", text: "offline"}); + } + + setGateway(gateway:LumiAqara.Gateway) { + this.gateway = gateway; + this.gateway.setPassword(this.gatewayConf.password); + (this).status({fill:"blue", shape:"dot", text: "online"}); + + this.gateway.on('offline', () => { + this.gateway = null; + (this).status({fill:"red", shape:"ring", text: "offline"}); + }); + + this.gateway.on('subdevice', (device) => { + device.sid = device.getSid(); + device.type = device.getType(); + device.data = { + voltage: device.getBatteryVoltage(), + batteryLevel: device.getBatteryPercentage() + }; + switch (device.type) { + case 'magnet': + device.data.status = device.isOpen() ? 'open' : 'close'; + break; + case 'switch': + device.on('click', () => { + // Saaad + }); + break; + case 'motion': + break; + case 'sensor': + device.data.temperature = device.getTemperature(); + device.data.humidity = device.getHumidity(); + device.data.pressure = device.getPressure(); + break; + case 'leak': + break; + case 'cube': + break; + }; + + (this).send({ + payload: device + }); + }); + } + } + + RED.nodes.registerType(`${Constants.NODES_PREFIX}-gateway in`, GatewayIn); +}; \ No newline at end of file diff --git a/src/nodes/gateway/GatewayOut.ejs b/src/nodes/gateway/GatewayOut.ejs new file mode 100644 index 0000000..d415e01 --- /dev/null +++ b/src/nodes/gateway/GatewayOut.ejs @@ -0,0 +1,54 @@ + + + + + \ No newline at end of file diff --git a/src/nodes/gateway/GatewayOut.ts b/src/nodes/gateway/GatewayOut.ts new file mode 100644 index 0000000..1748987 --- /dev/null +++ b/src/nodes/gateway/GatewayOut.ts @@ -0,0 +1,49 @@ +import { Red, NodeProperties } from "node-red"; +import { LumiAqara } from "../../../typings/index"; +import { Constants } from "../constants"; + +export interface IGatewayOutNode extends Node { + gatewayConf:any; + gateway: LumiAqara.Gateway; + + setGateway(gateway:LumiAqara.Gateway); +} + +export default (RED:Red) => { + class GatewayOut { + protected gatewayConf: any; + protected gateway: LumiAqara.Gateway; + + constructor(props:NodeProperties) { + RED.nodes.createNode( this, props); + this.gatewayConf= RED.nodes.getNode(( props).gateway); + ( this).status({fill:"red", shape:"ring", text: "offline"}); + + this.setMessageListener(); + } + + protected setMessageListener() { + ( this).on("input", (msg) => { + if (msg.hasOwnProperty("payload") && this.gateway) { + if(msg.payload.cmd === "write" && !msg.payload.data.key && this.gateway && this.gateway.sid && this.gateway._key) { + msg.payload.data.key = this.gateway._key; + } + this.gateway._sendUnicast(JSON.stringify(msg.payload)); + } + }); + } + + setGateway(gateway) { + this.gateway = gateway; + this.gateway.setPassword(this.gatewayConf.password); + ( this).status({fill:"blue", shape:"dot", text: "online"}); + + this.gateway.on('offline', () => { + this.gateway = null; + ( this).status({fill:"red", shape:"ring", text: "offline"}); + }); + } + } + + RED.nodes.registerType(`${Constants.NODES_PREFIX}-gateway out`, GatewayOut); +}; \ No newline at end of file diff --git a/src/nodes/gateway/Searcher.ts b/src/nodes/gateway/Searcher.ts new file mode 100644 index 0000000..7cde419 --- /dev/null +++ b/src/nodes/gateway/Searcher.ts @@ -0,0 +1,42 @@ +import { Red } from "node-red"; +import * as LumiAqara from 'lumi-aqara'; + +import { Constants } from "../constants"; +import { IGatewayConfiguratorNode } from "./GatewayConfigurator"; + +export class Searcher { + static _gateways:LumiAqara.Gateway[] = []; + + static discover(RED:Red) { + new Promise(() => { + const aqara = new LumiAqara(); + + aqara.on('gateway', (gateway:LumiAqara.Gateway) => { + let frontGateway = { + sid: gateway.sid, + ip: gateway.ip, + subdevices: [] + }; + this._gateways.push(frontGateway); + gateway.on('subdevice', (device:LumiAqara.SubDevice) => { + frontGateway.subdevices.push({ + sid: device.getSid(), + type: device.getType() + }); + }); + RED.nodes.eachNode((tmpNode) => { + if(tmpNode.type.indexOf(`${Constants.NODES_PREFIX}-gateway configurator`) === 0) { + let tmpNodeInst = RED.nodes.getNode(tmpNode.id); + if(tmpNodeInst && (tmpNodeInst.ip === gateway.ip || tmpNodeInst.sid === gateway.sid)) { + tmpNodeInst.gateway = gateway; + } + } + }); + }); + }); + } + + static get gateways():LumiAqara.Gateway { + return this._gateways; + } +} \ No newline at end of file diff --git a/src/nodes/gateway/index.ejs b/src/nodes/gateway/index.ejs new file mode 100644 index 0000000..f925820 --- /dev/null +++ b/src/nodes/gateway/index.ejs @@ -0,0 +1,4 @@ +<%- include('./GatewayConfigurator', {}); %> +<%- include('./Gateway', {}); %> +<%- include('./GatewayIn', {}); %> +<%- include('./GatewayOut', {}); %> \ No newline at end of file diff --git a/src/nodes/gateway/index.ts b/src/nodes/gateway/index.ts new file mode 100644 index 0000000..3aaedb5 --- /dev/null +++ b/src/nodes/gateway/index.ts @@ -0,0 +1,17 @@ +import { Red, NodeProperties } from "node-red"; +import * as LumiAqara from 'lumi-aqara'; + +import { Searcher } from "./Searcher"; +import {default as GatewayConfigurator} from "./GatewayConfigurator"; +import {default as Gateway} from "./Gateway"; +import {default as GatewayIn} from "./GatewayIn"; +import {default as GatewayOut} from "./GatewayOut"; + +export = (RED:Red) => { + Searcher.discover(RED); + + GatewayConfigurator(RED); + Gateway(RED); + GatewayIn(RED); + GatewayOut(RED); +}; diff --git a/src/nodes/yeelight/Searcher.ts b/src/nodes/yeelight/Searcher.ts index b3d67a1..08e3cf1 100644 --- a/src/nodes/yeelight/Searcher.ts +++ b/src/nodes/yeelight/Searcher.ts @@ -2,6 +2,7 @@ import { Red } from "node-red"; import * as YeelightSearch from 'yeelight-wifi'; import { Constants } from "../constants"; +import { IYeelightConfiguratorNode } from "./YeelightConfigurator"; export class Searcher { static _bulbs:any[] = []; @@ -17,9 +18,9 @@ export class Searcher { }); RED.nodes.eachNode((tmpNode) => { if(tmpNode.type.indexOf(`${Constants.NODES_PREFIX}-yeelight configurator`) === 0) { - let tmpNodeInst = RED.nodes.getNode(tmpNode.id); - if(tmpNodeInst.ip === bulb.hostname || tmpNodeInst.sid === parseInt(bulb.id)) { - tmpNodeInst.setBulb(bulb); + let tmpNodeInst = RED.nodes.getNode(tmpNode.id); + if(tmpNodeInst.ip == bulb.hostname || tmpNodeInst.sid == parseInt(bulb.id)) { + tmpNodeInst.bulb = bulb; } } }); diff --git a/src/nodes/yeelight/YeelightConfigurator.ejs b/src/nodes/yeelight/YeelightConfigurator.ejs index 929972e..d395d3d 100644 --- a/src/nodes/yeelight/YeelightConfigurator.ejs +++ b/src/nodes/yeelight/YeelightConfigurator.ejs @@ -34,7 +34,7 @@


- +
diff --git a/src/nodes/yeelight/YeelightConfigurator.ts b/src/nodes/yeelight/YeelightConfigurator.ts index a2146de..dfdb6c7 100644 --- a/src/nodes/yeelight/YeelightConfigurator.ts +++ b/src/nodes/yeelight/YeelightConfigurator.ts @@ -1,8 +1,8 @@ -import { Red, NodeProperties, NodeStatus, ClearNodeStatus } from "node-red"; +import { Red, Node, NodeProperties, NodeStatus, ClearNodeStatus } from "node-red"; import { Constants } from "../constants"; import { Searcher } from "./Searcher"; -export interface IYeelightConfiguratorNode { +export interface IYeelightConfiguratorNode extends Node { ip:string; sid:number; bulb:any; diff --git a/src/nodes/yeelight/YeelightOut.ejs b/src/nodes/yeelight/YeelightOut.ejs index 4ee7404..4fef40c 100644 --- a/src/nodes/yeelight/YeelightOut.ejs +++ b/src/nodes/yeelight/YeelightOut.ejs @@ -1,10 +1,10 @@ - -