前言
冬天到了,早上醒来懒得出被窝,然而为了大家,我还是抵制住了凛冽,冒着生命危险给大家筹备了这一期的文章,就冲这一点值不值得你们给我一个赞 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);
}
}
}
}
}
...
场景演示
这里的话不太不便给大家演示现场,间接给大家看一下实现的利用的场景吧。
- 房间列表首页
-
房间外部
这里次要就是增加一下房间的设施,因为逻辑在后端服务外面曾经写好了,所以设施加进去就会主动失效运行了。
-
房间配置
这里次要是配置一些根底信息,比方房间名称、人体感应管制空调和灯光的作用工夫。
-
日志
任何一个利用都离不开日志,当然这里也不例外,这里能够让大家实时理解各个房间的实时日志信息。
总结
明天把之前的所有设施给整合到一起了,成果还是不错的。几乎是我这种常常遗记关家电的笨蛋,不想起床关灯和空调的懒鬼,然而又舍不得电费的穷鬼的救星,哈哈哈哈。
我的手曾经失去知觉了,太冷了,幸好自己养了俩只猫,冬天到了,刚好能够当暖手宝︿(~︶~)︿,明天就到这就草草完结吧,我去选个暖手宝暖暖手。
本文仅集体学习应用,如有谬误,欢送斧正,(੭ ˙ᗜ˙)੭谢谢老板!