当前位置: 首页 > Web前端 > JavaScript

2021爱智先锋-自动化房屋能源控制核心

时间:2023-03-27 18:29:39 JavaScript

前言冬天来了,早上起床懒得睡觉,但是为了大家,我抗寒冒着生命危险准备了这一期的文章各位,就想知道这个值得你们点赞吗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{ac_devids.forEach((id)=>{devManager.sendDeviceInfo(id,{method:'set',ac:'OFF'});});//saveLog(room_id,'operation',`room【${房间名称}]空调关了!`);},30*1000);}}else{//如果开始时间大于结束时间,说明第二天已经过了0:00//转到开始时间-23:59和00:00-结束时间if(curTimeMinute>ac_start_time_minute||curTimeMinute{ac_devids.forEach((id)=>{devManager.sendDeviceInfo(id,{method:'set',ac:'OFF'});});//saveLog(room_id,'operation',`room[${room.name}]空调为},30*1000);}}}if(light_devids.length){constlight_start_times=light_cp[0].split(':');constlight_end_times=light_cp[1].split(':');constlight_start_time_minute=Number(light_start_times[0])*60+Number(light_start_times[1]);constlight_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{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[${room.name}]灯已关闭!`,'成功');}},30*1000);}}else{//如果开始时间大于结束时间,则表示第二天已经过了0:00//转到开始时间-23:59和00:00-结束时间if(curTimeMinute>light_start_time_minute||curTimeMinute{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【${room.name}】灯关了!`,'成功');}},30*1000);}}}}}...这里不方便演示场景,给大家展示一下实现的应用在房间列表的场景中,房间首页主要是添加房间的设备,因为逻辑已经写在后台服务中,所以添加设备后设备会自动生效并运行。这里的房间配置主要是配置一些基本信息,比如房间名称,人体感应器控制空调和灯光的动作时间。任何日志的应用都离不开日志,当然这也不例外。在这里您可以实时了解每个房间的实时日志信息。总结今天把之前的所有装备都整合到一起了,效果还是不错的。真是我这种经常忘记关家电的傻子,不想起床关灯关空调,又舍不得电费的懒鬼的救星,哈哈哈哈。我的手失去知觉了,太冷了,幸好我有两只猫,冬天来了,刚好可以当暖手器︿( ̄︶ ̄)︿,今天就到这里吧,我就选一个暖手器来暖你手。本文仅供个人学习使用。如有错误,请指正,(?˙?˙)?谢谢老板!