回答
要监控设备的离线和恢复上线状态,你可以通过Hamibot API中的设备状态信息来实现。设备状态主要通过online字段来表示,true表示在线,false表示离线。
具体实现方法:
- 使用获取设备列表API定期检查设备状态
// 文档地址 https://docs.hamibot.com/
var deviceId = "你的设备ID";
var token = "hmp_你的令牌";
function checkDeviceStatus() {
var res = http.request('https://api.hamibot.com/v1/devices/' + deviceId, {
method: 'GET',
headers: {
authorization: token
}
});
var device = res.body.json();
return device.online;
}
// 上次检查的状态,初始设为null
var lastStatus = null;
// 每5分钟检查一次设备状态
setInterval(function() {
var currentStatus = checkDeviceStatus();
// 状态发生变化时
if (lastStatus !== null && lastStatus !== currentStatus) {
var message = {
title: "设备状态变化",
text: "设备 " + deviceId + " 已" + (currentStatus ? "上线" : "离线")
};
// 发送状态变化通知
http.request('https://api.hamibot.com/v1/devices/' + deviceId + '/messages', {
method: 'POST',
contentType: 'application/json',
headers: {
authorization: token
},
body: JSON.stringify(message)
});
}
lastStatus = currentStatus;
}, 5 * 60 * 1000); // 5分钟检查一次
- 你也可以使用获取设备列表API同时监控多个设备:
// 文档地址 https://docs.hamibot.com/
var token = "hmp_你的令牌";
var deviceStatusMap = {}; // 存储设备ID和状态的映射
function checkAllDevices() {
var res = http.request('https://api.hamibot.com/v1/devices', {
method: 'GET',
headers: {
authorization: token
}
});
var devices = res.body.json().items;
for (var i = 0; i < devices.length; i++) {
var device = devices[i];
var deviceId = device._id;
// 首次检查,初始化状态
if (deviceStatusMap[deviceId] === undefined) {
deviceStatusMap[deviceId] = device.online;
continue;
}
// 状态发生变化
if (deviceStatusMap[deviceId] !== device.online) {
var statusText = device.online ? "上线" : "离线";
var message = {
title: "设备状态变化",
text: "设备 " + device.name + " (" + deviceId + ") 已" + statusText
};
// 发送通知
http.request('https://api.hamibot.com/v1/devices/' + deviceId + '/messages', {
method: 'POST',
contentType: 'application/json',
headers: {
authorization: token
},
body: JSON.stringify(message)
});
// 更新状态
deviceStatusMap[deviceId] = device.online;
}
}
}
// 每5分钟检查一次所有设备
setInterval(checkAllDevices, 5 * 60 * 1000);
注意事项:
- 请将代码中的
你的设备ID和hmp_你的令牌替换为实际值 - 检查频率可以根据需要调整,但过于频繁的请求可能会被限流
- 你可以根据实际需求修改通知方式,比如发送邮件、企业微信通知等
- 通过
online字段的变化来判断设备状态:从true变false表示离线,从false变true表示恢复上线
如果需要更详细的API信息,可以参考Hamibot文档中的设备管理部分。
补充回答 1
目前Hamibot没有提供设备上线/离线状态变化的webhook功能。设备状态监控需要通过API轮询实现,但有几种方法可以解决你遇到的配额不足问题:
解决方案:
-
增加订阅配额
- 通过配额订阅页面升级你的订阅计划
- 付费订阅可以显著提高每日API调用配额
-
优化轮询策略(减少API调用)
// 文档地址 https://docs.hamibot.com/ var token = "hmp_你的令牌"; var lastStatus = null; var checkInterval = 15 * 60 * 1000; // 15分钟检查一次(比之前的5分钟减少2/3调用量) function checkDeviceStatus() { var res = http.request('https://api.hamibot.com/v1/devices/你的设备ID', { method: 'GET', headers: { authorization: token } }); var device = res.body.json(); return device.online; } // 初始检查 lastStatus = checkDeviceStatus(); // 延迟后开始定期检查,避免启动时立即消耗配额 setTimeout(function() { setInterval(function() { var currentStatus = checkDeviceStatus(); if (currentStatus !== lastStatus) { // 发送状态变化通知 var message = { title: "设备状态变化", text: "设备已" + (currentStatus ? "上线" : "离线") }; http.request('https://api.hamibot.com/v1/devices/你的设备ID/messages', { method: 'POST', contentType: 'application/json', headers: { authorization: token }, body: JSON.stringify(message) }); lastStatus = currentStatus; } }, checkInterval); }, 60 * 1000); // 启动后1分钟开始检查 -
使用设备间通信替代API调用
- 在目标设备上运行监控脚本
- 当设备检测到自身状态变化时,直接发送消息给控制设备
- 这样可以避免频繁调用API查询状态
-
查看当前配额使用情况
// 文档地址 https://docs.hamibot.com/ var token = "hmp_你的令牌"; var res = http.request('https://api.hamibot.com/v1/usage', { method: 'GET', headers: { authorization: token } }); log("当前配额: " + res.body.json().limit); log("剩余配额: " + res.body.json().remaining);
建议将轮询间隔调整为15-30分钟,对于大多数场景已经足够。如果需要更实时的状态监控,强烈建议升级订阅计划以获取更多API配额。Hamibot的免费计划配额有限,专业使用场景下建议选择合适的付费计划。
ℹ️ 本回答由 AI 生成,内容仅供参考