You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Athom Homey中通过JavaScript数组验证设备ID并筛选灯光设备

问题解决:Athom Homey脚本中匹配指定数组内的Light设备

你的核心问题是直接将单个设备ID字符串与整个数组进行比较,这永远不会匹配成功——device.id是单个字符串,而myLights是字符串数组,!==运算符只会判断两者是否完全相等(类型和值都一致),所以这个条件永远为真,导致直接返回false,不会执行后续的打印逻辑。

修正后的代码

// Fetch all devices from Homey
let devices = await Homey.devices.getDevices();
let myLights = [
  // Fireplace_lightstrip
  "fe5d4348-8842-438d-be7e-d03d772ddddd",
  // Lightswitch_Hall
  "bc77b020-0388-42b5-9088-b329dbceeeee",
  // Chromecast_power (not light class, will be filtered out)
  "b50c3c39-285d-4dba-8e4c-327621ffffff",
  // Next (not a valid ID, will be filtered out)
  "four"
];

// 遍历所有设备,筛选符合条件的
Object.values(devices).forEach(device => {
  // 首先过滤非light类的设备
  if (device.class !== 'light') return;
  
  // 检查当前设备ID是否存在于myLights数组中
  if (!myLights.includes(device.id)) return;
  
  // 打印符合条件的设备名称
  console.log(device.name);
});

关键修正点说明

  • 替换比较逻辑:把if (device.id !== myLights)改成if (!myLights.includes(device.id)),includes()方法会检查数组中是否包含指定的字符串ID,这才是正确的数组元素匹配方式。
  • 简化返回逻辑:forEach里的return false其实不需要,直接return就能跳出当前循环迭代,写法更简洁。
  • 自动过滤无效项:数组里的非light类设备ID(比如Chromecast_power)和无效ID(比如"four")会因为两个过滤条件被自动排除,不会被打印出来。

扩展:如果需要开启匹配到的设备

如果后续要实现“开启匹配到的设备”,可以在console.log之后添加设备控制逻辑,比如:

// 尝试开启设备(需要设备支持on/off能力)
if (device.capabilities.includes('onoff')) {
  await device.setCapabilityValue('onoff', true);
  console.log(`已开启设备:${device.name}`);
}

内容的提问来源于stack exchange,提问作者Makke_

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:35:17