dexin 发表于 2018-2-9 20:21:25

dexinHome——让微信小程序操作智能家居

还是!戳出一枚演示视频~http://player.youku.com/embed/XMzM5MDkzNjI3Mg==
设备的接入就不演示了哈哈~大家可以直接体验小程序~
几天前,dexin终于回到老家——寒冷又熟悉的辽宁啦!本着不作死就赖床的核心思想,本宝怎么能闲着,在老家房子里转悠一圈吼,我决定:我要给老家房子布置上智能家居!让爸妈也感受下新科技~
一提到DIY智能家居,相信很多人想到的核心就是hassio或者hassbian吧~但是我这次毅然决然的放弃了,因为我希望能够通过这次配置实现自己的“生态”~所以,开始作死吧~

Step1 下位机的电路设计:


[*]220VAC-5VDC-3V3DC供电
[*]继电器
[*]一个非接触式开关
[*]程序烧录/调试接口
[*]意外情况设计
[*]自诊断

电源转换出于安全考虑我选择购买成型模块,5V-3V3我采用AMS1117-3.3

继电器我采用S8050做驱动,1N4007卸流:

之所以采用非接触开关是因为:


[*]理论上非接触元件寿命无限长
[*]更加适合在家中使用:因为家中是厨房和浴室的,这两个地方有一个明显的特点:手比较湿或者比较脏,在这种情况下非接触就比较必要了。
[*]科技感十足啊 哈哈哈

程序烧录和调试接口我采用网线接口:


[*]我的MCU使用了ESP-12E,考虑到220VAC-5VDC模块可能会发生失效,我利用RJ45提供一个外部5V做备用调试电源
[*]D4接非接触开关,硬件反馈非接触开关信号
[*]D13接继电器状态反馈端,硬件反馈继电器状态

对于意外情况:

[*]当电源转换失效时,可采用通过RJ45外部5V供电
[*]当MCU故障是,可通过单刀开关强制跳通继电器闭合,强制开关上拉至5V以保证AMS1117-3.3V不工作时,依然可以保证强制跳通
[*]但是依然无法解决继电器损坏或者S8050损坏的问题(设备寿命短板)

设备自检利用的是TLP521光耦反馈和调试接口,设计这个的主要目的是:我大部分时间在西安上学,让爸妈在修理电路就是等价于让客户自己修理,这就显得不是很智能。使用另外一个硬件直接从上位操作实现设备自动诊断和外部诊断,对于用户(爸妈)必然是科技感十足,幸福感安全感满满啊哈哈~之后就是让人又痛又爱的布线

[*]AD的快捷键一定要记住,效率高~(bilibili上有一个小哥讲得,确实不错)
[*]teardrop推荐添加~


之后就是下单等货和焊接各种元件~来一个三兄弟的 hhh 当然还是要提供几个sensor的,现在我用了DHT11和光强传感器各一个~p.s. 硬件电路的一个大难点我认为妥妥地是焊接啊。。五个板子焊了快一天。。

Step2 服务器:
服务器我采用了京东云主机。服务器的搭建什么的我在这就不多说了 我才用的是Ubuntu+Nginx+Mysql+Eggjs,不得表扬一下Egg的安全性~Egg的官方API
为什么我要自己搭这个物联网服务器呢,说实话是有点鬼畜的,但是因为微信小程序是要求https加密的,这就相当于直接封杀了一些比较亲民好用的物联网平台,再有,我懒得研究其他平台的协议,我就是想配置几个开关读文档犯不上 哈哈哈
Egg响应GET在router.js中,我们把需要的请求根配置进去我在这里分别提供了微信小程序的接口、设备状态响应的接口等等

以及完成相应的请求响应(友情提醒,关爱服务器,谨防注入 哈哈)举个栗子~用户请求切换开关状态的响应代码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';
    }服务器这边给小程序提供设备注册,用户注册,用户界面参数这些信息的处理接口;

给ESP-12E提供的是传感器状态上传接口、继电器状态上传接口,继电器用户请求接口。

基本思路是绑定获取微信用户的openID到一个deviceCenterId,绑定该用户注册的设备的deviceItsId到deviceCenterId。

拥有相同deviceCenterId的用户可以获得绑定在deviceCenterId下所有deviceItsId对应设备的使用权限。

这样就实现了设备中心分管~当然还缺少一些权限的设定,比如我老妈不希望让我控制主卧的照明,她应该可以对这个设备移除我的控制权限。这部分具体的操作我还没有

太想好 哈哈

这是数据库的配置,设置deviceItsId为主key~

Step3 Arduino下位机:

这部分代码我已经git,给大家做个参考~dexinHome
这里应该修改为服务器的公网IP,状态请求GET接口和开/关GET接口
#define REQ_CODE"/****?****=****"
#define REQ_OFF   "/****?****=****"
#define REQ_ON    "/****?****=****"
#define HOST_IP   "**.**.**.**"


ESP-12E对服务器状态请求后对继电器的操作。
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;
          digitalWrite(pError, LOW);

          if (value >= 125)
            digitalWrite(pRelay, HIGH);
          else
            digitalWrite(pRelay, LOW);
      }
      }
      else
      digitalWrite(pError, HIGH);
    }
    else
      digitalWrite(pError, HIGH);
}

继电器状态反馈
if (digitalRead(swRelay) == 0)
      digitalWrite(pState, HIGH);
    else
      digitalWrite(pState, LOW);

用户触碰开关灯软响应
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);
}

呼吸灯,防止在黑暗环境中找不到开关位置。
analogWrite(pBreath, 125 * sin(0.002 * millis()) + 130);

Step4 微信小程序:

虽然是造轮子,但是一个比较合理的用户界面哪那是不能少滴

首先是用户注册,参考weixin API配置好openID获取方法,授权等等,当然还是要象征性的需要一下用户同意自愿使用哈哈哈。

用户需要填写的设备认证号就是deviceCenterID,用来验证用户组。当然这部分需要检验deviceCenterID单一性。


完成身份的验证后进入控制台:

接下来就是获取当前绑定在该用户关联的deviceCenterID下的全部设备 获取名称,状态等等

wx.request({
            url: 'https://www.***.***/****',
            data: {
                ***: wxmlData.data.***
            },
            success: function (res) {
                let statusData = res.data;
                wxmlData.setData({
                  switchRooms: statusData
                });
            },
            })
当然也要防止潜在bug造成的页面错跳,就算跳错了,只要没有注册还是会跳回注册页面
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'
            })

新设备接入,采用读取二维码的方式:既利用了小程序读取二维码比较方便的优势,又保证关键信息(设备ID和设备类型)不会出现失误。同时校验二维码信息,防止用户错误扫描~(永远不要相信您的用户 hhh 后期二维码我会添加加密措施,进一步防止注入可能)




之后就是设备信息的填写和设备的注册了


结语
这应该是我回家以后做得挺有意义的一件事~昨天老妈和我说早上我爸醒了玩手机的时候嫌灯光太暗,不爱下床用内程序把灯打开以后乐坏了。
当然还有作为试用者之一——我可爱的女朋友还有我的母上大人都威胁我说再看到我晚上熬夜就远程关我的灯。(是的,这其实才是让我有了设备管理权限想法的本质原因),造了一个大轮子但是把问题解决了的感觉还是不错的,虽然现在只可以接入开关设备,但是最后当然还可以接入调光调温设备你懂的(传入量不同而已)。自己从头到尾设计这一套东西,有时候还是比较害怕hacker的。所以请各位高手放过我的服务器 哈哈哈
还是很开心的~我接下去还会继续完善~这一版本的小程序已经发布了,好像我还是用小程序做智能家居的第一人~anyway,给大家提供一个思路~
当然!!欢迎大老板们给我投资哦,让我可以开发更多有意思的设备~
最后的最后,提前祝我的小可爱生日快乐~

dexin 发表于 2018-3-5 14:10:47

快乐王子 发表于 2018-2-28 10:51
看到您做的真佩服,但是这些元器件都是从哪儿买到的呢?我也想做一个,有没有现成的元器件,我连接一下电路 ...

哈哈 因为这个完全是我设计制作的 所以暂时没有打包好的元器件。不过电路的部分原理图我基本都已经在帖子中附图了。您可以在电子市场等处购买相应的零件~下一版本的PCB我在完善后会开源。到时候您按照我的BOM表和PCB自行购买元器件加工就可以了。

DFHy97JtUQ7 发表于 2018-7-14 03:39:11

dexin 发表于 2018-3-5 14:13
哈哈哈 我主要是希望自己能提一种新的轻量级的解决方案。其实也完全可以使用其他的方式解决问题哒~ ...

大神好,加个微信吧18701935531,有很多想法,交一下!!

lkk255 发表于 2018-2-11 10:11:04

腻害了,前排留名!

Ash 发表于 2018-2-11 10:45:24

腻害了,前排留名!

Forgotten 发表于 2018-2-11 13:20:54

不容易,太厉害了,收藏顶起{:5_125:}

dexin 发表于 2018-2-11 15:39:41

Forgotten 发表于 2018-2-11 13:20
不容易,太厉害了,收藏顶起

早就想这么倒腾一次了 哈哈~

digi_cow 发表于 2018-2-12 21:46:09

{:5_168:}PFPF

好奇吖斌 发表于 2018-2-13 15:04:17

牛逼,可是不会画板子

dexin 发表于 2018-2-14 13:16:22

好奇吖斌 发表于 2018-2-13 15:04
牛逼,可是不会画板子

好像有一些自动布线的软件 在某宝上有元件封装库 应该很快就能出板子了;P

snake 发表于 2018-2-15 08:49:37

dexin 发表于 2018-2-9 20:21
还是!戳出一枚演示视频~
设备的接入就不演示了哈哈~大家可以直接体验小程序~
几天前,dexin终于回到老家— ...

厉害,专业

安卓机器人 发表于 2018-2-19 20:07:33

想做就做!V

svw 发表于 2018-2-26 10:46:21

腻害了,就是没看懂

快乐王子 发表于 2018-2-28 10:51:35

看到您做的真佩服,但是这些元器件都是从哪儿买到的呢?我也想做一个,有没有现成的元器件,我连接一下电路就行呢?希望得到您的回复。

dexin 发表于 2018-3-5 14:12:42

svw 发表于 2018-2-26 10:46
腻害了,就是没看懂

哈哈哈 我主要是希望自己能提一种新的轻量级的解决方案。其实也完全可以使用其他的方式解决问题哒~

dexin 发表于 2018-3-5 14:13:06

svw 发表于 2018-2-26 10:46
腻害了,就是没看懂

哈哈哈 我主要是希望自己能提一种新的轻量级的解决方案。其实也完全可以使用其他的方式解决问题哒~:P

DFS19eZQav7 发表于 2018-9-5 17:47:20

楼主的小程序能开源一下吗?非常感兴趣啊

zZZCbDdp 发表于 2018-9-18 11:40:18

这个现在您还有搞吗?

gada888 发表于 2018-9-19 17:39:18

这个厉害

DFrJCrA4DPV 发表于 2019-3-14 10:38:23

dexin 发表于 2018-2-9 20:21
还是!戳出一枚演示视频~
设备的接入就不演示了哈哈~大家可以直接体验小程序~
几天前,dexin终于回到老家— ...

可以加个微信联系一下不

DFrJnCdAk8B 发表于 2019-9-6 22:00:48

可以模仿着自己做家庭改造
页: [1] 2
查看完整版本: dexinHome——让微信小程序操作智能家居