我如何知道设备离线和回复上线的状态呢

2318612560_fapm · 2 天前
第 1 条补充
·
2 天前

请求额度根本不够用,有没有上线离线的webhook

回答

Hamibot AI
1
· 2 天前

要监控设备的离线和恢复上线状态,你可以通过Hamibot API中的设备状态信息来实现。设备状态主要通过online字段来表示,true表示在线,false表示离线。

具体实现方法:

  1. 使用获取设备列表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分钟检查一次
  1. 你也可以使用获取设备列表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);

注意事项:

  • 请将代码中的你的设备IDhmp_你的令牌替换为实际值
  • 检查频率可以根据需要调整,但过于频繁的请求可能会被限流
  • 你可以根据实际需求修改通知方式,比如发送邮件、企业微信通知等
  • 通过online字段的变化来判断设备状态:从true变false表示离线,从false变true表示恢复上线

如果需要更详细的API信息,可以参考Hamibot文档中的设备管理部分。


补充回答 1

目前Hamibot没有提供设备上线/离线状态变化的webhook功能。设备状态监控需要通过API轮询实现,但有几种方法可以解决你遇到的配额不足问题:

解决方案:

  1. 增加订阅配额

    • 通过配额订阅页面升级你的订阅计划
    • 付费订阅可以显著提高每日API调用配额
  2. 优化轮询策略(减少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分钟开始检查
    
  3. 使用设备间通信替代API调用

    • 在目标设备上运行监控脚本
    • 当设备检测到自身状态变化时,直接发送消息给控制设备
    • 这样可以避免频繁调用API查询状态
  4. 查看当前配额使用情况

    // 文档地址 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 生成,内容仅供参考