Shelly Gen2 et scripts dont antenne bluetooth pour Nut

Bonjour,

Je viens de découvrir que les Shelly Gen2 peuvent exécuter des scripts.
Y-a-t-il des utilisateurs qui ont mis en œuvre ces scripts?

EDIT : Les Shelly PLUS HT ne permettent pas l’exécution de script, certainement pour ne pas faire augmenter la température interne et fausser les mesures de température.

1 « J'aime »

Premier script.

Capture d’écran du 2023-01-12 18-11-48

Capture d’écran du 2023-01-12 18-10-43

Adaptation d’un script trouvé sur la toile.
Cela remonte des adresses MAC Bluetooth.

function scanCB(ev, res) {
    if (ev === BLE.Scanner.SCAN_RESULT) {
        //let StaticMAC = { "addr": res.addr.slice(0,-2), "rssi": res.rssi };
        let StaticMAC = { "addr": res.addr, "rssi": res.rssi, "macType": res.addr_type};
        //print(JSON.stringify(StaticMAC));
        if (StaticMAC['addr'] === "xx:xx:xx:xx:xx:xx") {
            //print(JSON.stringify(StaticMAC));
            MQTT.publish('shellies/script/bluetoothMAC', JSON.stringify(StaticMAC), 0, false);
            //Shelly.emitEvent( "ShellyScanresult", StaticMAC);
         }
    }
}

BLE.Scanner.Start({ duration_ms: -1}, scanCB);
1 « J'aime »

Je viens de recevoir des nut.
Voila tout ce que je peux faire remonter dans le #plugin-jmqtt et qui doit pouvoir permettre de gérer la présence.
Capture d’écran du 2023-01-16 20-44-10

function scanCB(ev, res) {
    if (ev === BLE.Scanner.SCAN_RESULT) {
        if (res.addr === "dc:5f:xx:xx:xx:xx") {
            let unixtime = Shelly.getComponentStatus("sys").unixtime;
            MQTT.publish('shellies/script/bluetooth/nut/addr', res.addr, 0, false);
            MQTT.publish('shellies/script/bluetooth/nut/addr_type', JSON.stringify(res.addr_type), 0, false);
            MQTT.publish('shellies/script/bluetooth/nut/advData', JSON.stringify(res.advData), 0, false);
            MQTT.publish('shellies/script/bluetooth/nut/scanRsp', JSON.stringify(res.scanRsp), 0, false);
            MQTT.publish('shellies/script/bluetooth/nut/rssi', JSON.stringify(res.rssi), 0, false);
            MQTT.publish('shellies/script/bluetooth/nut/flags', JSON.stringify(res.flags), 0, false);
            MQTT.publish('shellies/script/bluetooth/nut/local_name', JSON.stringify(res.local_name), 0, false);
            MQTT.publish('shellies/script/bluetooth/nut/manufacturer_data', JSON.stringify(res.manufacturer_data), 0, false);
            MQTT.publish('shellies/script/bluetooth/nut/service_uuids', JSON.stringify(res.service_uuids), 0, false);
            MQTT.publish('shellies/script/bluetooth/nut/service_data', JSON.stringify(res.service_data), 0, false);
            MQTT.publish('shellies/script/bluetooth/nut/tx_power_level', JSON.stringify(res.tx_power_level), 0, false);
            MQTT.publish('shellies/script/bluetooth/nut/unixtime', JSON.stringify(unixtime), 0, false);
        }
    }
}

BLE.Scanner.Start({ duration_ms: -1}, scanCB);

Bonjour,

SI je comprends bien, tu utilises les shelly GEN2 comme détecteur de la présence du NUT à proximité ?

J’utilise ces shelly pour ce qu’ils sont mais en plus j’essaye d’exploiter leur partie bluetooth.
Pour la gestion de présence avec les nut, un scénario avec comme déclencheur la commande info unixtime va faire le job.
La suite va être d’essayer de décoder advData qui doit permettre de remonter les infos de capteur bluethooth.

Modification du script pour pouvoir utiliser plusieurs nut.

function scanCB(ev, res) {
  if (ev === BLE.Scanner.SCAN_RESULT) {
    if (res.local_name === 'nut') {
      let topic = 'shellies/script/bluetooth/nut/' + res.addr + '/';
      let unixtime = Shelly.getComponentStatus("sys").unixtime;
      MQTT.publish(topic + 'addr', res.addr, 0, false);
      MQTT.publish(topic + 'addr_type', JSON.stringify(res.addr_type), 0, false);
      MQTT.publish(topic + 'advData', JSON.stringify(res.advData), 0, false);
      MQTT.publish(topic + 'scanRsp', JSON.stringify(res.scanRsp), 0, false);
      MQTT.publish(topic + 'rssi', JSON.stringify(res.rssi), 0, false);
      MQTT.publish(topic + 'flags', JSON.stringify(res.flags), 0, false);
      MQTT.publish(topic + 'local_name', JSON.stringify(res.local_name), 0, false);
      MQTT.publish(topic + 'manufacturer_data', JSON.stringify(res.manufacturer_data), 0, false);
      MQTT.publish(topic + 'service_uuids', JSON.stringify(res.service_uuids), 0, false);
      MQTT.publish(topic + 'service_data', JSON.stringify(res.service_data), 0, false);
      MQTT.publish(topic + 'tx_power_level', JSON.stringify(res.tx_power_level), 0, false);
      MQTT.publish(topic + 'unixtime', JSON.stringify(unixtime), 0, false);
    }
  }
}

BLE.Scanner.Start({ duration_ms: -1}, scanCB);

Pour les Nut, script final.

function scanCB(ev, res) {
  if (ev === BLE.Scanner.SCAN_RESULT) {
    if (res.local_name === 'nut') {
      let topic = 'shellies/script/bluetooth/nut/' + res.addr + '/';
      let unixtime = Shelly.getComponentStatus("sys").unixtime;
      MQTT.publish(topic + 'rssi', JSON.stringify(res.rssi), 0, false);
      MQTT.publish(topic + 'unixtime', JSON.stringify(unixtime), 0, false);
      MQTT.publish(topic + 'presence', JSON.stringify(unixtime), 0, false);
    }
  }
}

BLE.Scanner.Start({ duration_ms: -1}, scanCB);

Résultat avec 2 Nut.

Capture d’écran du 2023-01-17 20-37-14

Malgré que cela ne soit pas nécessaire pour la gestion de présence avec les Nut, pour d’autres matériels transmettant des données, il serait intéressant de pouvoir décoder les trames Bluetooth.
Il semble exister un projet bien avancé sachant faire cette tâche, theengs-decoder.

@Bad, penses-tu que ce projet pourrait être incorporé dans le #plugin-jmqtt ?

Hello Jeandhom,

Le plugin est déjà super complex, je ne pense pas que traiter des payloads BT soit son but.

Pour moi ce serait plus le travail d’un docker, qui ferait tourner theengs/decoder afin de prendre les payloads BT en MQTT et les renvoyer en MQTT, pour être ensuite intégrés dans des eq/cmd avec jMQTT.

Ca pourrait aussi être un plugin à part s’appuyant sur MQTT Manager et créant directement les équipements dans Jeedom.

Désolé,
Bad

1 « J'aime »

Salut Bad,
Merci pour ton expertise.

Je n’ai qu’un seul shelly PLUS en service, il est au RDC.
Malgré qu’il capte bien le Nut situé au sous-sol, je projette de remplacer le shelly 1 de la porte de garage situé aussi au sous-sol par un shelly PLUS 1.
Afin de savoir qui a remonté l’information affichée par le widget, j’ai modifié le script.

let origine = JSON.stringify(Shelly.getDeviceInfo().name);
function scanCB(ev, res) {
  if (ev === BLE.Scanner.SCAN_RESULT) {
    if (res.local_name === 'nut') {
      let topic = 'shellies/script/bluetooth/nut/' + res.addr + '/';
      let unixtime = JSON.stringify(Shelly.getComponentStatus("sys").unixtime);
      MQTT.publish(topic + 'rssi', JSON.stringify(res.rssi), 0, false);
      MQTT.publish(topic + 'unixtime', unixtime, 0, false);
      MQTT.publish(topic + 'presence', unixtime, 0, false);
      MQTT.publish(topic + 'origine', origine, 0, false);
    }
  }
}

BLE.Scanner.Start({ duration_ms: -1}, scanCB);

Capture d’écran du 2023-03-03 21-56-46