前言冬天来了,早上起床懒得睡觉,但是为了大家,我抗寒冒着生命危险准备了这一期的文章各位,就想知道这个值得你们点赞吗o(′^`)o当然,过了这么久,我知道你们不看货肯定不喜欢,那我先来了作为一个尊重,你可以做任何你想做的事。之前做了那么多准备,终于到了收尾的时候了!这一定是石门的选择!在上一篇文章中,我完成了光线感应器、远程灯控开关、人体感应器、远程空调遥控器。今天,所有的细线都串起来了,计划进入最后阶段!今天我们将带您了解我们自动化房屋能源控制的核心!我这边,我家也改造了一个房间,效果还是不错的。可根据房间占用检测自动控制空调和照明。当然现在是冬天,很多人睡觉的时候可能都不想下床开灯或者开空调。该应用程序还提供了手动模式来控制灯光和空调,让您可以在被窝里玩手机的同时控制它们。设备讲解中涉及到的场景设备之前都有介绍过,这里就不过多介绍了,直接给大家看传送门:光感灯开关控制人体检测传感器红外学习模块(空调遥控器)应用说明天太冷了,敲起来很痛,所以这里简单介绍一下。实现这个场景的目的主要是为了减少家里的用电量(毕竟家里有好几台空调和大灯)。感兴趣的朋友可以到:灵感桌面秘宝下载代码。或者直接gitclone:https://gitee.com/inspiration...应用的实现思路大致是这样的逻辑:首先光传感器会定时获取最新的实时数据,然后当人体感应器检测到人体有变化时,会进行逻辑处理,如果在控制时间段内房间内无人,则开启空调和灯的定时器。在定时器期间,如果房间里又有人,去掉定时器处理(因为可能有人上完厕所就回来了)。否则,当定时器被触发时,房间里仍然没有人。此时会先关闭空调,然后对比光传感器数据,检查当前室内灯是否打开。如果是开着的,那就回去关掉房间里所有的灯。.注意:我这里需要用到光感器,因为我这边的光控设备不能保存状态,所以需要比对光,而我这边的光控一般都设置成晚上生效,所以还是有点瑕疵。代码分析由于这个场景比较全面和复杂,所以在写代码的时候需要注意的点也很多。这里简单说一下代码。和上一个系列一样,使用了一个JSRE的Device模块,主要用于获取设备向爱知发送的信息,也是应用发送的一种方式通过爱智给设备下指令。首先这里的光感和温度传感器的数据没有主动上报,但是这部分逻辑是爱智应用共享的,让我的设备更便携,所以我在此处向应用程序的后端添加了一个计时器。定期获取最新的数据状态。...switch(type){case'illus-sensor'://lightingtimes[devid]=setInterval(()=>{devManager.sendDeviceInfo(devid,{method:'get',obj:['illu']});},5*1000);休息;case'temp-sensor':times[devid]=setInterval(()=>{devManager.sendDeviceInfo(devid,{method:'get',obj:['temp']});},30*60*1000);休息;default:break;}...而这里获取到数据后,会对数据进行相应的处理。由于代码量比较大,处理后的代码这里简单说一下;获取光照和温度的值后,将数据同步到前端,同时保存日志;主要逻辑是当检测到人体传感器有变化时,控制空调和灯光,这里需要做控制时间段的处理和延时响应处理。...value=data.data['micro_state']==='ON';//状态保存在日志中if(data.method==='report'){saveLog(room_id,'operation',`roomDetect${value?'Yes':'No'}in【${room.name}】People!`);}//控制空调和照明if(value){clearTimeout(roomTimes[`ac-${room_id}`]);clearTimeout(roomTimes[`light-${room_id}`]);roomTimes[`ac-${room_id}`]=未定义;roomTimes[`light-${room_id}`]=undefined;}else{if(dev&&roomTimes[`ac-${room_id}`]===undefined&&roomTimes[`light-${room_id}`]===undefined){constdate=newDate();constcurTimeMinute=日期。getHours()*60+date.getMinutes();const{devids,settings:{ac_cp,light_cp}}=room;constac_devids=[];//房间在线空调设备constlight_devids=[];//roomInlinelightdevicedevids.map((item)=>{constd=devManager.devMap.get(item);if(d){consttype=getDeviceType(d);if(type==='ac-control'){ac_devids.push(item);}elseif(ttype==='light-control'){light_devids.push(item);}}});如果(ac_devids.length){constac_start_times=ac_cp[0].split(':');constac_end_times=ac_cp[1].split(':');constac_start_time_minute=Number(ac_start_times[0])*60+Number(ac_start_times[1]);constac_end_time_minute=Number(ac_end_times[0])*60+Number(ac_end_times[1]);if(ac_start_time_minute<=ac_end_time_minute){//如果开始时间小于等于结束时间,则表示没有越过第二天的零时//取开始时间和结束时间之间的时间timeif(curTimeMinute>=ac_start_time_minute&&curTimeMinute
