前言
作为一个新世纪打工人,平时也会去养一些花草,来给我的房间减少点绿色和生机,然而经常因为工作忙而遗记一些事件。,毕竟我大部分的工夫都是陪伴着电脑的(严正声明:我不是个独身狗!!!
(¬◡¬)✧),之前在淘宝上买了个土壤湿度传感器和浇水设施,本人革新了一下,通过 WiFi 和 SDDC 胜利接入了爱智盒子,当初筹备搞一个爱智利用来进行设施的管制;
场景演示
先看一下我革新好的成品吧ヾ(╹◡╹)ノ",间接放在了我房间的展示柜上开始用了。
这是浇水器!
这是插进去的土壤湿度传感器的屁股!
(゚∀゚)..:*☆ 哎哟是不是很厉害啊!
这个花盆外面我插了之前的土壤湿度传感器和浇水器的出水口,而后浇水器的入水口我放在了一个装水的瓶子里,这样一个主动浇水的货色就实现了。因为这是我本人室内用的小设施,规模比拟小,有想法的兄弟扩大扩大能够搞到在农业浇灌这方面去试试,想想还有点小兴奋呢。ヾ(>∀<)(ノ∀`●)⊃
利用演示
话不多说 ─=≡(((つ••)つ,还是间接先看一下我的利用页面长什么样子,
判若两人的放了一个数据显示面板,一个设施抉择模块,一个设施参数设置模块。
应用起来也是十分的简略,间接抉择一下土壤湿度传感器以及浇水设施,拖动两个游标,设置浇水的合适范畴,每当我花盆外面的土壤湿度低于60%的时候就会通过 Spirit 向浇水器发送加水信号并开始加水,湿度达到85%就进行浇水,这样一个智慧浇水的场景就实现了。
整体实现逻辑是比较简单的,前面的话我也会逐渐的在网上买一些其余的设施,搭建一些比拟残缺的智能场景进去。
代码剖析
对于实现的代码也是利用了之前的设施模块 device,前端的我感觉就不必摆出来显摆了,比较简单的一个页面没啥好讲的,
只贴一下后端js局部的要害代码吧<( ̄ ﹌  ̄)@m 。
// 因为用的频率比拟高,集体比拟懒,所以就基于失常的逻辑封装了一下,根本能够满足我目前乃至前面的大部分需要了,其余个别需要遇到再裁减。// device_manager.js const Device = require('device');const EventEmitter = require('events');class DeviceManager extends EventEmitter { constructor() { super(); this.devMap = new Map(); this.controllerMap = new Map(); this.init(); } init() { // 获取以后所有已退出网络的在线设施! Device.list(true, (error, list) => { if (error) { console.error('Device.list error!' + error); } else { list.forEach((item) => { Device.info(item.devid, (error, info) => { if (error) { console.error('Device.info error!' + error); } else { this.devMap.set(item.devid, { devid: item.devid, alias: info.alias, report: info.report }); } }); }); } }); Device.on('join', async (devid, info) => { const dev = { devid, ...info }; this.devMap.set(devid, dev); this.emit('join', dev); }); Device.on('lost', (devid) => { const dev = this.devMap.get(devid); this.devMap.delete(devid); if (this.controllerMap.has(devid)) { this.controllerMap.delete(devid); } if (!dev) { this.emit('error', '利用呈现未知谬误,请退出重试!'); } else { this.emit('lost', dev); } }); } // 构建设施管制对象 generateController(devid) { if (this.controllerMap.has(devid)) { return Promise.resolve(this.controllerMap.get(devid)) } const controller = new Device(); return new Promise((resolve, reject) => { controller.request(devid, (error) => { if (error) { reject(error); } else { this.controllerMap.set(devid, controller); resolve(controller); } }); }) } // 删除控制器 deleteController(devid) { this.controllerMap.delete(devid); } // 发送设施音讯 sendDeviceInfo(devid, data) { const controller = this.controllerMap.get(devid); if (!controller) { return Promise.reject('程序呈现未知谬误,请退出重试!') } return new Promise((resolve, reject) => { controller.send(data, (err) => { if (err) { reject('管制设施失败,请重试!') } else { resolve(); } }, 3) }) }}const devManager = new DeviceManager();module.exports = { devManager}
以上就是封装的设施治理模块了,接下来在main.js
中就会去应用该模块中的相干办法;
// main.js...function generateDevController(devid) { return new Promise((resolve, reject) => { const dev = devManager.devMap.get(devid); devManager.generateController(devid).then((controller) => { controller.on('message', (data) => { const points = humidity_water_scene.settings.points; if (isSceneDev(devid) && getDeviceType(dev) === 'humidity') { socketIO.emit('humidity', Number(data.data.soil_humidity.toFixed(1))); // 0-100 if (!waterDev) { return; } if (data.data.soil_humidity < points[0] && !watering) { startWater(); // 浇水 } else if (data.data.soil_humidity >= points[0] && watering) { stopWater(); // 停水 } } else if (getDeviceType(dev) === 'water') { if (data.data.watering === 'ON' && watering && t === 0 && humidityDev) { setHumidityTimer(1000); } else if (data.data.watering === 'OFF' && !watering && t) { clearInterval(t); t = 0 } } }); resolve(controller); }).catch(() => { reject(`利用短少管制${dev.alias}的权限!`); }) })}...
下面的代码调用封装的设施治理模块实例的generateController
办法来结构设施管制对象,
能够看到在设施音讯监听事件 message 中如果湿度感应设施返回的数据值小于咱们指定的值就会调用startWater
办法进行浇水,否则就会进行浇水;
同样浇水设施会依据管制浇水开关命令,来返回以后设施状态,如果浇水设施处于运行中,则会被动放慢获取湿度感应器的实时数值,便于实时控制设施。
总结
整体实现没有太大的问题,某些细节方面可能还须要优化一下,不过当初曾经开始用了,当然必定不会间接接到水龙头上,不然程序要是出bug了,那代价就有点太大了( uTェTu )!
明天的分享到此就完结了,具体的具体代码能够去灵感桌面的机密宝库外面去查看,不说了,言尽于此,睡了。