在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_
相关产品推荐
相关产品推荐

