====== Homey scripts ====== ===== Check last update for devices ===== Source: https://community.homey.app/t/a-script-to-check-sensor-last-update/63142/9 const INVALIDATE_AFTER = 86400; const invalidatedDevices = []; for (const device of Object.values(await Homey.devices.getDevices())) { if (! device.capabilitiesObj) continue; let count = 0; for (const capabilityObj of Object.values(device.capabilitiesObj)) { if (! capabilityObj.lastUpdated || (Date.now() - new Date(capabilityObj.lastUpdated) > INVALIDATE_AFTER * 1000)) { count++; } } if (count && count === Object.keys(device.capabilitiesObj).length) { invalidatedDevices.push(device.name); } } await tag('InvalidatedDevices', invalidatedDevices.join(', ')); return invalidatedDevices.length != 0; // Sensor.Check, to check on sensor last update time. Argument: inactive time (in seconds): const INVALIDATE_AFTER = (args[0]); // Example 86400sec./3600 = 24hrs const invalidatedDevices = []; for (const device of Object.values(await Homey.devices.getDevices())) { if (! device.capabilitiesObj) continue; let count = 0; for (const capabilityObj of Object.values(device.capabilitiesObj)) { if (device.capabilitiesObj.measure_temperature || device.capabilitiesObj.alarm_contact || device.capabilitiesObj.alarm_motion ) { if (! capabilityObj?.lastUpdated || (Date.now() - new Date(capabilityObj?.lastUpdated) > INVALIDATE_AFTER * 1000)) { count++; } } } if (count && count === Object.keys(device.capabilitiesObj).length) { invalidatedDevices.push("- " + device.name + "\n (zone: " + device.zoneName + ")" ); } } // When there are matching sensors if ( invalidatedDevices.length != 0 ) { // create / update HomeyScript variable await tag('InvalidatedDevices', invalidatedDevices.join('\n')); // Send Timeline notification Homey.flow.runFlowCardAction({ uri: 'homey:manager:notifications', id: 'create_notification', args: { text: "\nDevices without updates for " + INVALIDATE_AFTER / 3600 + "hrs: \n" + invalidatedDevices.join('\n') + "\n\nflow Sensors Check" }, }); console.log("Devices without updates for " + INVALIDATE_AFTER / 3600 + "hrs: \n" + invalidatedDevices.join('\n')); return("Devices without updates for " + INVALIDATE_AFTER / 3600 + "hrs: \n" + invalidatedDevices.join('\n')); } // When there's no matching sensor if ( invalidatedDevices.length == 0 ) { // Just report "None" // create / update HomeyScript variable await tag('InvalidatedDevices', 'None'); // Send Timeline notification Homey.flow.runFlowCardAction({ uri: 'homey:manager:notifications', id: 'create_notification', args: { text: "\nDevices without updates for " + INVALIDATE_AFTER / 3600 + "hrs: None\n\nflow Sensors Check" }, }); console.log("Devices without updates for " + INVALIDATE_AFTER / 3600 + "hrs: None" ); return invalidatedDevices.length != 0; } // Original script by Robert Klep