Comment savoir si un capteur communique bien ( perte de portée)

J’ai une question que je me pose comment savoir qu’un capteur ne réactualise pas ces données auprès de la box soit par un bug ,ou perte de portées,dans mon cas un capteur de température aqara en Zigbee ,j’aimerai que la Box me fasse remonter dans mon journal quand je perd un capteur,mais est ce que c’est possible ?

Bonsoir,

Il y a quelques produits qui te permettent de connaitre l’état : Connecté/déconnecté mais ils sont pas nombreux. A ne pas confondre avec Activé/désactivé.

Coté App je n’ai rien trouvé… c’est probablement un script a developper avec HomeyScript ?

Il y a beaucoup de choses disponibles sur cette plateforme :wink: mais il faut explorer… ce matin j’ai testé les Dev Tools : https://tools.developer.homey.app/. Tu peux y accéder…

Tu trouveras un section Zigbee, qui te permet de Pinger ou interroger un appareil, c’est ainsi que je me suis rendu compte que mon Bridge n’était pas connecté ! Pour debugger une connexion c’est parfait :slight_smile:

Un grand merci pour ton aide ,c’est exactement ce que je recherchais :+1:

1 Like

Bonne fête de fin d’année !

Je me demande pourquoi Athom ne met pas ce service/interface disponible dans Homey, ce serait super !

Oui ce serait bien …bonne fête de fin d’année à tous !

Bonjour, de mon côté, j’ai Adapté un script qui m’envoie un rapport quotidien à une heure précise sur les modules qui ne répondent plus depuis plus de 5 jours. Ce délai peut être modifié dans le script. Je l’utilise depuis plus de 3 mois et j’en suis très satisfait. Au cas où cela vous intéresserait, voici le script :

let myArgs = JSON.parse(args[0]);
const hoursSinceLastUpdate = myArgs.hoursSinceLastUpdate;
let whiteList;

if (myArgs.whiteList) {
  whiteList = (myArgs.whiteList.replace(/\s/g, '')); //Get the devices on white list and remove spaces in their name (get problem with some device who have space in name)
}
else whiteList = 'null';




const devices = await Homey.devices.getDevices();// Get all devices
let nextList = "";
let previousList = "";
let deviceName;
let idActuel = Object.values(await Homey.devices.getDevices())[0].id; //Récupère l'id de Homey pour avoir un id de base 
let source;


let actualDevice;
let actualDeviceString;
let actualDeviceCapabilitiesString;
let capabilityObjString;
let deviceNameString;
let dateNow;
let batteryDate;
let temperatureDate;
let pressureDate;
let humidityDate;
let luminanceDate;
let alarmBatteryDate;
let alarmContactDate;
let alarmTamperDate;
let alarmMotionDate;
let alarmHeatDate;
let alarmSmokeDate;
let alarmWaterDate;
let dateCompare;




for (const device of Object.values(devices)) {


  dateNow = new Date();
  idActuel = device.id;
  actualDevice = await Homey.devices.getDevice({ id: idActuel });
  actualDeviceString = JSON.stringify(actualDevice);
  actualDeviceCapabilitiesString = JSON.stringify(actualDevice.capabilities);
  capabilityObjString = JSON.stringify(actualDevice.capabilitiesObj);
  deviceNameString = JSON.stringify(actualDevice.name);

  if (!whiteList.toLowerCase().includes(((actualDevice.name).toLowerCase()).replace(/\s/g, ''))) { //Check if device is on white list

    if (!actualDeviceCapabilitiesString.includes("measure_battery")) {
      continue; //if device hasn't battery, ignore it
    }

    // Search if there an error message 
    if ((JSON.stringify(actualDevice.unavailableMessage)) !== "null") {
      previousList = nextList;
      nextList = previousList + actualDevice.name + ": " + actualDevice.unavailableMessage + " ⚠️" + "\n\n";
      continue;
    }
    //search if the device has a battery. Then get all last update of the capabilities (if exist)
    if (actualDeviceCapabilitiesString.includes("measure_battery")) {
      //log(actualDevice.name);
      batteryDate = new Date(actualDevice.capabilitiesObj.measure_battery.lastUpdated);
      dateCompare = batteryDate;
      temperatureDate = 0;
      pressureDate = 0;
      humidityDate = 0;
      luminanceDate = 0;
      alarmBatteryDate = 0;
      alarmContactDate = 0;
      alarmTamperDate = 0;
      alarmMotionDate = 0;
      alarmHeatDate = 0;
      alarmSmokeDate = 0;
      alarmWaterDate = 0;

      if (capabilityObjString.includes("measure_temperature")) {
        temperatureDate = new Date(actualDevice.capabilitiesObj.measure_temperature.lastUpdated);
      source='measure_temperature"';}
      if (capabilityObjString.includes("measure_pressure")) {
        pressureDate = new Date(actualDevice.capabilitiesObj.measure_pressure.lastUpdated);
      source='measure_pressure';}
      if (capabilityObjString.includes("measure_humidity")) {
        humidityDate = new Date(actualDevice.capabilitiesObj.measure_humidity.lastUpdated);
      source='measure_humidity';}
      if (capabilityObjString.includes("alarm_battery")) {
        alarmBatteryDate = new Date(actualDevice.capabilitiesObj.alarm_battery.lastUpdated);
      source='alarm_battery';}
      if (capabilityObjString.includes("alarm_contact")) {
        alarmContactDate = new Date(actualDevice.capabilitiesObj.alarm_contact.lastUpdated);
      source='alarm_contact';}
      if (capabilityObjString.includes("alarm_tamper")) {
        alarmTamperDate = new Date(actualDevice.capabilitiesObj.alarm_tamper.lastUpdated);
      source='alarm_tamper';}
      if (capabilityObjString.includes("alarm_motion")) {
        alarmMotionDate = new Date(actualDevice.capabilitiesObj.alarm_motion.lastUpdated);
      source='alarm_motion';}
      if (capabilityObjString.includes("measure_luminance")) {
        luminanceDate = new Date(actualDevice.capabilitiesObj.measure_luminance.lastUpdated);
      source='measure_luminance';}
      if (capabilityObjString.includes("alarm_heat")) {
        alarmHeatDate = new Date(actualDevice.capabilitiesObj.alarm_heat.lastUpdated);
      source='alarm_heat';}
      if (capabilityObjString.includes("alarm_smoke")) {
        alarmSmokeDate = new Date(actualDevice.capabilitiesObj.alarm_smoke.lastUpdated);
      source='alarm_smoke';}
      if (capabilityObjString.includes("alarm_water")) {
        alarmWaterDate = new Date(actualDevice.capabilitiesObj.alarm_water.lastUpdated);
      source='alarm_water';}
    }
    //compare all dates and get the most recent
    if ((dateCompare < temperatureDate) && (temperatureDate !== 0)) {
      dateCompare = temperatureDate
    }
    if ((dateCompare < pressureDate) && (pressureDate !== 0)) {
      dateCompare = pressureDate;
    }
    if ((dateCompare < humidityDate) && (humidityDate !== 0)) {
      dateCompare = humidityDate;
    }
    if ((dateCompare < luminanceDate) && (luminanceDate !== 0)) {
      dateCompare = luminanceDate;
    }
    if ((dateCompare < alarmBatteryDate) && (alarmBatteryDate !== 0)) {
      dateCompare = alarmBatteryDate;
    }
    if ((dateCompare < alarmContactDate) && (alarmContactDate !== 0)) {
      dateCompare = alarmContactDate;
    }
    if ((dateCompare < alarmHeatDate) && (alarmHeatDate !== 0)) {
      dateCompare = alarmHeatDate;
    }
    if ((dateCompare < alarmMotionDate) && (alarmMotionDate !== 0)) {
      dateCompare = alarmMotionDate;
    }
    if ((dateCompare < alarmSmokeDate) && (alarmMotionDate !== 0)) {
      dateCompare = alarmSmokeDate;
    }
    if ((dateCompare < alarmTamperDate) && (alarmTamperDate !== 0)) {
      dateCompare = alarmTamperDate;
    }
    if ((dateCompare < alarmWaterDate) && (alarmWaterDate !== 0)) {
      dateCompare = alarmWaterDate;
    }
    //chech if last update is older than we want, if it is, log the device in the list
    let difference = dateNow - dateCompare;
    if (difference > (((hoursSinceLastUpdate * 60) * 60) * 1000)) { //convert millisecond in hour
      previousList = nextList;
      nextList = previousList + "Le module " + actualDevice.name + " dont la source était "+ source +" a émis pour la dernière fois le : " + dateCompare.toLocaleString("fr-FR") + "\n\n\n";
    }
  }

}
//create a String tag from the list
if (nextList === "") { //tag cant be empty, so if no device returned by the script write it (or what you want)
  nextList = "Aucun module retourné par le script";
  await tag('No Signal List ', nextList);
  return false;
}
else {
  await tag('No Signal List ', nextList);
  //log(nextList);
  
  //return true;
  return "Liste des modules qui ne communiquent plus depuis "+hoursSinceLastUpdate/24+" jours "+":\n" + nextList;
}

2 Likes

Bonjour, j’ai cette erreur dans le script.
Je ne connais pas les scripts homey, comment est défini ton tag Result ?

D’avance merci.

1 Like

“Adapté” aurai été plus juste je pense…

Il faut que tu passes un argument dans le code. Cela se fait dans les flows avec cette carte:

image

Tu cliques sur “Script” pour sélectionner le nom de ton script et dans “Argument” ce que tu souhaites envoyer à ton script. args[0] correspond au premier argument passé, args[1] au second…

J’explique tout ici.

Si tu souhaites tester le code depuis Homeyscript, tu peux commenter cette ligne (en ajoutant 2 slash au début):

//let myArgs = JSON.parse(args[0]);

Et ajouter:

let myArgs = {"hoursSinceLastUpdate": 120};
1 Like

Autant pour moi, effectivement j’ai adapté ton script que tu as très bien réalisé et qui me sert tous les jours. Merci à toi.

1 Like