39363| 27
|
dexinHome——让微信小程序操作智能家居 |
还是!戳出一枚演示视频~ 设备的接入就不演示了哈哈~大家可以直接体验小程序~ 几天前,dexin终于回到老家——寒冷又熟悉的辽宁啦!本着不作死就赖床的核心思想,本宝怎么能闲着,在老家房子里转悠一圈吼,我决定:我要给老家房子布置上智能家居!让爸妈也感受下新科技~ 一提到DIY智能家居,相信很多人想到的核心就是hassio或者hassbian吧~但是我这次毅然决然的放弃了,因为我希望能够通过这次配置实现自己的“生态”~所以,开始作死吧~ Step1 下位机的电路设计:
电源转换出于安全考虑我选择购买成型模块,5V-3V3我采用AMS1117-3.3 继电器我采用S8050做驱动,1N4007卸流: 之所以采用非接触开关是因为:
程序烧录和调试接口我采用网线接口:
对于意外情况:
设备自检利用的是TLP521光耦反馈和调试接口,设计这个的主要目的是:我大部分时间在西安上学,让爸妈在修理电路就是等价于让客户自己修理,这就显得不是很智能。 使用另外一个硬件直接从上位操作实现设备自动诊断和外部诊断,对于用户(爸妈)必然是科技感十足,幸福感安全感满满啊哈哈~ 之后就是让人又痛又爱的布线
之后就是下单等货和焊接各种元件~来一个三兄弟的 hhh 当然还是要提供几个sensor的,现在我用了DHT11和光强传感器各一个~ p.s. 硬件电路的一个大难点我认为妥妥地是焊接啊。。五个板子焊了快一天。。 Step2 服务器: 服务器我采用了京东云主机。服务器的搭建什么的我在这就不多说了 我才用的是Ubuntu+Nginx+Mysql+Eggjs,不得表扬一下Egg的安全性~Egg的官方API 为什么我要自己搭这个物联网服务器呢,说实话是有点鬼畜的,但是因为微信小程序是要求https加密的,这就相当于直接封杀了一些比较亲民好用的物联网平台,再有,我懒得研究其他平台的协议,我就是想配置几个开关读文档犯不上 哈哈哈 Egg响应GET在router.js中,我们把需要的请求根配置进去 我在这里分别提供了微信小程序的接口、设备状态响应的接口等等 以及完成相应的请求响应(友情提醒,关爱服务器,谨防注入 哈哈) 举个栗子~用户请求切换开关状态的响应代码 [mw_shl_code=javascript,true]async devSttChg() { let result = await this.ctx.service.devices.updateChange(this.ctx.query); if (result.affectedRows === 1) this.ctx.body = 'success'; else this.ctx.body = 'fail'; }[/mw_shl_code] 给ESP-12E提供的是传感器状态上传接口、继电器状态上传接口,继电器用户请求接口。 基本思路是绑定获取微信用户的openID到一个deviceCenterId,绑定该用户注册的设备的deviceItsId到deviceCenterId。 拥有相同deviceCenterId的用户可以获得绑定在deviceCenterId下所有deviceItsId对应设备的使用权限。 这样就实现了设备中心分管~当然还缺少一些权限的设定,比如我老妈不希望让我控制主卧的照明,她应该可以对这个设备移除我的控制权限。这部分具体的操作我还没有 太想好 哈哈 这是数据库的配置,设置deviceItsId为主key~ Step3 Arduino下位机: 这部分代码我已经git,给大家做个参考~dexinHome 这里应该修改为服务器的公网IP,状态请求GET接口和开/关GET接口 [mw_shl_code=c,true]#define REQ_CODE "/****?****=****" #define REQ_OFF "/****?****=****" #define REQ_ON "/****?****=****" #define HOST_IP "**.**.**.**" [/mw_shl_code] ESP-12E对服务器状态请求后对继电器的操作。 [mw_shl_code=c,true]if ((WiFiMulti.run() == WL_CONNECTED)) { HTTPClient http; http.begin(HOST_IP, 7001, REQ_CODE); int httpCode = http.GET(); if (httpCode) { if (httpCode == 200) { String httpPayload = http.getString(); DynamicJsonBuffer jsonBuffer; JsonObject& root = jsonBuffer.parseObject(httpPayload); int value = root[String("val")]; digitalWrite(pError, LOW); if (value >= 125) digitalWrite(pRelay, HIGH); else digitalWrite(pRelay, LOW); } } else digitalWrite(pError, HIGH); } else digitalWrite(pError, HIGH); }[/mw_shl_code] 继电器状态反馈 [mw_shl_code=c,true]if (digitalRead(swRelay) == 0) digitalWrite(pState, HIGH); else digitalWrite(pState, LOW);[/mw_shl_code] 用户触碰开关灯软响应 [mw_shl_code=c,true]thisUserSwState = digitalRead(swUser); if (millis() - timeBgNoReadSw > noneReadSwithMs) { if (lastUserSwState != thisUserSwState) { if (thisUserSwState == false) { timeBgNoReadSw = millis(); if ((WiFiMulti.run() == WL_CONNECTED)) { HTTPClient http; if (digitalRead(swRelay)) http.begin(HOST_IP, 7001, REQ_ON); else http.begin(HOST_IP, 7001, REQ_OFF); int httpCode = http.GET(); if (httpCode) { if (httpCode == 200) { String httpPayload = http.getString(); Serial.println(httpPayload); }}} digitalWrite(pRelay, digitalRead(swRelay));//protect from unlink wi-fi }}} lastUserSwState = thisUserSwState; delay(1); }[/mw_shl_code] 呼吸灯,防止在黑暗环境中找不到开关位置。 [mw_shl_code=c,true]analogWrite(pBreath, 125 * sin(0.002 * millis()) + 130);[/mw_shl_code] Step4 微信小程序: 虽然是造轮子,但是一个比较合理的用户界面哪那是不能少滴 首先是用户注册,参考weixin API配置好openID获取方法,授权等等,当然还是要象征性的需要一下用户同意自愿使用哈哈哈。 用户需要填写的设备认证号就是deviceCenterID,用来验证用户组。当然这部分需要检验deviceCenterID单一性。 完成身份的验证后进入控制台: 接下来就是获取当前绑定在该用户关联的deviceCenterID下的全部设备 获取名称,状态等等 [mw_shl_code=javascript,true]wx.request({ url: 'https://www.***.***/****', data: { ***: wxmlData.data.*** }, success: function (res) { let statusData = res.data; wxmlData.setData({ switchRooms: statusData }); }, })[/mw_shl_code] 当然也要防止潜在bug造成的页面错跳,就算跳错了,只要没有注册还是会跳回注册页面 [mw_shl_code=javascript,true]let openID = await wx.getStorageSync('openid'); wx.request({ url: 'https://www.***.***/***', data: { ***: openID }, success: function (res) { if (res.data.regist) { /*...*/ } else { wx.showLoading({ title: '请先完成验证', }); setTimeout(function () { wx.hideLoading() wx.navigateTo({ url: '../reg/reg' })[/mw_shl_code] 新设备接入,采用读取二维码的方式:既利用了小程序读取二维码比较方便的优势,又保证关键信息(设备ID和设备类型)不会出现失误。同时校验二维码信息,防止用户错误扫描~(永远不要相信您的用户 hhh 后期二维码我会添加加密措施,进一步防止注入可能) 之后就是设备信息的填写和设备的注册了 结语 这应该是我回家以后做得挺有意义的一件事~昨天老妈和我说早上我爸醒了玩手机的时候嫌灯光太暗,不爱下床用内程序把灯打开以后乐坏了。 当然还有作为试用者之一——我可爱的女朋友还有我的母上大人都威胁我说再看到我晚上熬夜就远程关我的灯。(是的,这其实才是让我有了设备管理权限想法的本质原因),造了一个大轮子但是把问题解决了的感觉还是不错的,虽然现在只可以接入开关设备,但是最后当然还可以接入调光调温设备你懂的(传入量不同而已)。自己从头到尾设计这一套东西,有时候还是比较害怕hacker的。所以请各位高手放过我的服务器 哈哈哈 还是很开心的~我接下去还会继续完善~这一版本的小程序已经发布了,好像我还是用小程序做智能家居的第一人~anyway,给大家提供一个思路~ 当然!!欢迎大老板们给我投资哦,让我可以开发更多有意思的设备~ 最后的最后,提前祝我的小可爱生日快乐~ |
dexin 发表于 2018-3-5 14:13 大神好,加个微信吧18701935531,有很多想法,交一下!! |
dexin 发表于 2018-2-9 20:21 可以加个微信联系一下不 |
© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed