前言

冬天到了,早上醒来懒得出被窝,然而为了大家,我还是抵制住了凛冽,冒着生命危险给大家筹备了这一期的文章,就冲这一点值不值得你们给我一个赞o(´^`)o,当然,这么久了,晓得你们不见货是不会点赞的,那我还是先干为敬,你们随便。

之前做了这么多铺垫,当初终于到了收束的时刻!这肯定是石头门的抉择!在之前的文章里我别离实现了光照传感器,近程灯控开关,人体存在传感器,近程空调遥控器。明天所有的细线曾经串成了一条,打算至此进入最终阶段!明天将带大家实现咱们的自动化屋宇能源管制外围!

我这边的话也曾经把我家里的一个房间革新了一下,成果还是不错的。能够依据房间人员检测主动进行管制空调和灯光。当然,冬天了,可能很多人睡觉都不违心下床去开关灯或者空调啥的,这里利用也提供了手动模式进行管制灯光和空调的性能,让你在被窝里玩手机也能够管制。

设施解说

波及到的场景设施之前也曾经介绍过了,这里就不再过多介绍,间接给大家放传送门:

光照传感器

灯光开关管制

人体检测传感器

红外学习模块(空调遥控器)

利用解说

天太冷了,敲着手疼,这里就简短介绍一下。

实现这个场景的目标次要是为了缩小一下家里的用电(毕竟家里有好几个空调和大灯)

感兴趣的敌人能够返回:灵感桌面的机密宝库 下载代码。
或者间接 git clone:

https://gitee.com/inspiration...

利用的实现思路大抵就是以下逻辑了:

首先光照传感器会定时去获取最新实时数据,接着当人体感应器检测到人体变动时会进行逻辑解决,如果在管制时间段内,这时候房间内没人了,会去开启敞开空调和灯光的定时器。在定时器时间段内,如果房间再次出现人,则移除定时器解决(因为可能有人去上了个厕所就回来了)。否则在定时器触发时候,房间仍然没有人,这时候会先去关掉空调,而后再去比对光照传感器数据,检测以后室内灯是否开启,如果开启,则回去关掉房间内的所有灯设施。

留神:这里须要利用光照传感器,因为我这边的灯光管制设施无奈保留状态,所以须要比照光照,同时我这边的灯光管制失效工夫个别设置的是早晨的时候,所以说还是有点瑕疵的。

代码剖析

因为这个场景比拟综合简单,在写代码时候有很多须要留神的点。这里就简略的讲一下代码。

和之前的一系列一样,用的是JSRE的一个Device模块,次要用来去获取设施传递给爱智的信息,同时也是利用通过爱智向设施发送指令的路径。

首先这边光照和温度传感器的数据不是被动上报的,而是把这部分的逻辑让爱智利用去分担,这样我的设施就能够更加轻便,所以我这边利用后端增加了定时器去定时获取最新的数据状态。

...switch (type) {     case 'illu-sensor':    // 光照    times[devid] = setInterval(() => {      devManager.sendDeviceInfo(devid, { method: 'get', obj: ['illu'] });    }, 5 * 1000);  break;  case 'temp-sensor':    times[devid] = setInterval(() => {      devManager.sendDeviceInfo(devid, { method: 'get', obj: ['temp'] });    }, 30 * 60 * 1000);  break;  default:  break;}...

而这边获取到数据之后,就会对数据进行相应的解决,因为代码量比拟大,所以解决的代码这边就简略讲一下;

在获取到光照和温度的值后,将数据同步到前端,同时保留日志;

次要逻辑是当检测到人体感应变动时候,会去对空调和灯光进行管制,这里须要进行管制时间段的解决和提早响应解决。

...value = data.data['micro_state'] === 'ON';// 状态存入日志中if (data.method === 'report') {   saveLog(room_id, 'operation', `房间【${room.name}】中检测${value ? '有' : '没'}人!`);}// 管制空调和灯光if (value) {   clearTimeout(roomTimes[`ac-${room_id}`]);   clearTimeout(roomTimes[`light-${room_id}`]);   roomTimes[`ac-${room_id}`] = undefined;   roomTimes[`light-${room_id}`] = undefined;} else {   if (dev && roomTimes[`ac-${room_id}`] === undefined && roomTimes[`light-${room_id}`] === undefined) {      const date = new Date();      const curTimeMinute = date.getHours() * 60 + date.getMinutes();      const {devids,settings: { ac_cp, light_cp }} = room;      const ac_devids = []; // 房间内在线的空调设备      const light_devids = []; // 房间内在线的灯设施      devids.map((item) => {        const d = devManager.devMap.get(item);        if (d) {          const type = getDeviceType(d);          if (type === 'ac-control') {            ac_devids.push(item);          } else if (type === 'light-control') {            light_devids.push(item);          }        }      });      if (ac_devids.length) {        const ac_start_times = ac_cp[0].split(':');        const ac_end_times = ac_cp[1].split(':');        const ac_start_time_minute = Number(ac_start_times[0]) * 60 + Number(ac_start_times[1]);        const ac_end_time_minute = Number(ac_end_times[0]) * 60 + Number(ac_end_times[1]);        if (ac_start_time_minute <= ac_end_time_minute) {          // 如果开始工夫小于等于完结工夫,阐明没有逾越次日零点          // 取开始工夫-完结工夫之间          if (curTimeMinute >= ac_start_time_minute && curTimeMinute < ac_end_time_minute) {            // 在空调管制工夫内            // 敞开空调            // 增加定时器延时            roomTimes[`ac-${room_id}`] = setTimeout(() => {              ac_devids.forEach((id) => {                devManager.sendDeviceInfo(id, { method: 'set', ac: 'OFF' });              });              // saveLog(room_id, 'operation', `房间【${room.name}】空调被关掉了!`);            }, 30 * 1000);          }        } else {          // 如果开始工夫大于完结工夫,阐明逾越了次日零点          // 去开始工夫-23:59 和 00:00-完结工夫          if (curTimeMinute > ac_start_time_minute || curTimeMinute < ac_end_time_minute) {            // 在空调管制工夫内            // 敞开空调            // 增加定时器延时            roomTimes[`ac-${room_id}`] = setTimeout(() => {              ac_devids.forEach((id) => {                devManager.sendDeviceInfo(id, { method: 'set', ac: 'OFF' });              });              // saveLog(room_id, 'operation', `房间【${room.name}】空调被关掉了!`);            }, 30 * 1000);          }       }     }            if (light_devids.length) {       const light_start_times = light_cp[0].split(':');       const light_end_times = light_cp[1].split(':');       const light_start_time_minute = Number(light_start_times[0]) * 60 + Number(light_start_times[1]);       const light_end_time_minute = Number(light_end_times[0]) * 60 + Number(light_end_times[1]);       if (light_start_time_minute <= light_end_time_minute) {       // 如果开始工夫小于等于完结工夫,阐明没有逾越次日零点       // 取开始工夫-完结工夫之间         if (curTimeMinute >= light_start_time_minute && curTimeMinute < light_end_time_minute) {         // 在灯管制工夫内         // 敞开灯         // 增加定时器延时           roomTimes[`light-${room_id}`] = setTimeout(() => {             if (roomRealValue[room_id] &&                 roomRealValue[room_id]['illu'] &&                 roomRealValue[room_id]['illu'] > 30             ) {               // 光照强度 > 30 断定为开灯状态               light_devids.forEach((id) => {                 devManager.sendDeviceInfo(id, { method: 'set', SW_ctrl: 'OFF' });               });               // 保留操作日志               saveLog(room_id, 'operation', `房间【${room.name}】灯被关掉了!`, 'success');             }           }, 30 * 1000);         }       } else {         // 如果开始工夫大于完结工夫,阐明逾越了次日零点         // 去开始工夫-23:59 和 00:00-完结工夫         if (curTimeMinute > light_start_time_minute || curTimeMinute < light_end_time_minute) {           // 在灯管制工夫内           // 敞开灯           // 增加定时器延时           roomTimes[`light-${room_id}`] = setTimeout(() => {             if (roomRealValue[room_id] &&                 roomRealValue[room_id]['illu'] &&                 roomRealValue[room_id]['illu'] > 30              ) {                // 光照强度 > 30 断定为开灯状态                light_devids.forEach((id) => {                  devManager.sendDeviceInfo(id, { method: 'set', SW_ctrl: 'OFF' });                });                // 保留操作日志                saveLog(room_id, 'operation', `房间【${room.name}】灯被关掉了!`, 'success');              }            }, 30 * 1000);          }        }      }   }}...

场景演示

这里的话不太不便给大家演示现场,间接给大家看一下实现的利用的场景吧。

  • 房间列表首页
  • 房间外部

    这里次要就是增加一下房间的设施,因为逻辑在后端服务外面曾经写好了,所以设施加进去就会主动失效运行了。

  • 房间配置

    这里次要是配置一些根底信息,比方房间名称、人体感应管制空调和灯光的作用工夫。

  • 日志

    任何一个利用都离不开日志,当然这里也不例外,这里能够让大家实时理解各个房间的实时日志信息。

总结

明天把之前的所有设施给整合到一起了,成果还是不错的。几乎是我这种常常遗记关家电的笨蛋,不想起床关灯和空调的懒鬼,然而又舍不得电费的穷鬼的救星,哈哈哈哈。

我的手曾经失去知觉了,太冷了,幸好自己养了俩只猫,冬天到了,刚好能够当暖手宝︿( ̄︶ ̄)︿,明天就到这就草草完结吧,我去选个暖手宝暖暖手。

本文仅集体学习应用,如有谬误,欢送斧正, ( )谢谢老板!