乐趣区

关于javascript:2021爱智先行者-自动化房屋能源控制核心

前言

​ 冬天到了,早上醒来懒得出被窝,然而为了大家,我还是抵制住了凛冽,冒着生命危险给大家筹备了这一期的文章,就冲这一点值不值得你们给我一个赞 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);
          }
        }
      }
   }
}

...

场景演示

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

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

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

  • 房间配置

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

  • 日志

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

总结

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

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

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

退出移动版