Shelly bluetooth

Salut à tous

Petite question avec les Shelly Bluetooth.
A part utiliser la cle usb wifi de shelly, puis je ressortir de mon armoire ma cle sena ud100 et communiquer avec leurs capteurs door/window avec ? Si oui j’aimerais bien le faire mais en mqtt.

1 « J'aime »

A confirmer, mais je pense que tu peux aussi utiliser un Shelly Gen2 (sauf module sur pile) en lieu et place de la clé Shelly.

salut

Si je comprends tes dires , j’installe un gen2 et je peux récupérer les trames bluetooth en mqtt.
J’ai pas vu grand chose dans les docs shelly , c’est pour cela que je m’interroge.

Ce ne sont que des suppositions de ma part.

Interface web de configuration d’un Gen2.

Doc ShellyBLU Gateway

Merci de ton retour je vais commander un de chaque et je ferais un retour

1 « J'aime »

Pour moi ça fonctionne avec le Gen2 grâce au script : GitHub - ALLTERCO/shelly-script-examples: Examples for Shelly Scripts for Gen2 Shelly devices

Salut à tous,
Je viens de recevoir mon Shelly gen1 avec bluetooth et mes quatres capteurs d’ouvertures.
Mise en service laborieuse du gen1, il ne prennait pas mon ssid cache dédie domotique. Après mise à jour ce fut ok.
Il m’a fallu après comprendre comment faire fonctionner le bluetooth. Le script pour les door ne fonctionne pas directement. Et oui il faut trouver l adresse des capteurs et modifier le script.
Il y a un script de scan et j’ai pu remonter les infos sur le shelly.
Maintenant j’ai pu grace à une commande mqtt commencer à publier sur mon broker.
Il y a encore des améliorations à amener mais je pense pouvoir faire un rtex rapidement.

Mais ça marche YESS

1 « J'aime »

Voici mon script pour reconnaitre directement les cpateurs bluetooth .
J’ai rien inventé, uniquement adapté.
Penser à modifier votre topic.

function triggerAutomation() {
  Shelly.call("Switch.Set", { id: 0, on: true });
  }

function printClosed() {
  Shelly.call("Switch.Set", { id: 0, on: false });
}

// Topic à modifier suivant votre config
let genericTopic = "shellies/script/doorwindow";

let CONFIG = {
  shelly_blu_name_prefix: 'SBDW',
  actions: [
    {
      cond: {
        Window: 0,
      },
      action: triggerAutomation,
    },
    {
      cond: {
        Window: 1,
      },
      action: printClosed,
    },
  ],
};
// END OF CHANGE

let ALLTERCO_MFD_ID_STR = "0ba9";
let BTHOME_SVC_ID_STR = "fcd2";

let ALLTERCO_MFD_ID = JSON.parse("0x" + ALLTERCO_MFD_ID_STR);
let BTHOME_SVC_ID = JSON.parse("0x" + BTHOME_SVC_ID_STR);

let SCAN_DURATION = BLE.Scanner.INFINITE_SCAN;
let ACTIVE_SCAN =
  typeof CONFIG.shelly_blu_name_prefix !== "undefined" &&
  CONFIG.shelly_blu_name_prefix !== null;

let uint8 = 0;
let int8 = 1;
let uint16 = 2;
let int16 = 3;
let uint24 = 4;
let int24 = 5;

function getByteSize(type) {
  if (type === uint8 || type === int8) return 1;
  if (type === uint16 || type === int16) return 2;
  if (type === uint24 || type === int24) return 3;
  //impossible as advertisements are much smaller;
  return 255;
}

let BTH = [];
BTH[0x00] = { n: "pid", t: uint8 };
BTH[0x01] = { n: "Battery", t: uint8, u: "%" };
BTH[0x05] = { n: "Illuminance", t: uint24, f: 0.01 };
BTH[0x1a] = { n: "Door", t: uint8 };
BTH[0x20] = { n: "Moisture", t: uint8 };
BTH[0x2d] = { n: "Window", t: uint8 };
BTH[0x3a] = { n: "Button", t: uint8 };
BTH[0x3f] = { n: "Rotation", t: int16, f: 0.1 };

let BTHomeDecoder = {
  utoi: function (num, bitsz) {
    let mask = 1 << (bitsz - 1);
    return num & mask ? num - (1 << bitsz) : num;
  },
  getUInt8: function (buffer) {
    return buffer.at(0);
  },
  getInt8: function (buffer) {
    return this.utoi(this.getUInt8(buffer), 8);
  },
  getUInt16LE: function (buffer) {
    return 0xffff & ((buffer.at(1) << 8) | buffer.at(0));
  },
  getInt16LE: function (buffer) {
    return this.utoi(this.getUInt16LE(buffer), 16);
  },
  getUInt24LE: function (buffer) {
    return (
      0x00ffffff & ((buffer.at(2) << 16) | (buffer.at(1) << 8) | buffer.at(0))
    );
  },
  getInt24LE: function (buffer) {
    return this.utoi(this.getUInt24LE(buffer), 24);
  },
  getBufValue: function (type, buffer) {
    if (buffer.length < getByteSize(type)) return null;
    let res = null;
    if (type === uint8) res = this.getUInt8(buffer);
    if (type === int8) res = this.getInt8(buffer);
    if (type === uint16) res = this.getUInt16LE(buffer);
    if (type === int16) res = this.getInt16LE(buffer);
    if (type === uint24) res = this.getUInt24LE(buffer);
    if (type === int24) res = this.getInt24LE(buffer);
    return res;
      },
  unpack: function (buffer) {
    // beacons might not provide BTH service data
    if (typeof buffer !== "string" || buffer.length === 0) return null;
    let result = {};
    let _dib = buffer.at(0);
    result["encryption"] = _dib & 0x1 ? true : false;
    result["BTHome_version"] = _dib >> 5;
    if (result["BTHome_version"] !== 2) return null;
    //Can not handle encrypted data
    if (result["encryption"]) return result;
    buffer = buffer.slice(1);

    let _bth;
    let _value;
    while (buffer.length > 0) {
      _bth = BTH[buffer.at(0)];
      if (_bth === "undefined") {
        console.log("BTH: unknown type");
        break;
      }
      buffer = buffer.slice(1);
      _value = this.getBufValue(_bth.t, buffer);
      if (_value === null) break;
      if (typeof _bth.f !== "undefined") _value = _value * _bth.f;
      result[_bth.n] = _value;
      buffer = buffer.slice(getByteSize(_bth.t));
    }
    return result;
  },
};

let ShellyBLUParser = {
  getData: function (res) {
    let result = BTHomeDecoder.unpack(res.service_data[BTHOME_SVC_ID_STR]);
    result.addr = res.addr;
    result.rssi = res.rssi;
    return result;
  },
};

let last_packet_id = 0x100;
function scanCB(ev, res) {
  if (ev !== BLE.Scanner.SCAN_RESULT) return;
  // skip if there is no service_data member
  if (
    typeof res.service_data === "undefined" ||
    typeof res.service_data[BTHOME_SVC_ID_STR] === "undefined"
  )
    return;
  // skip if we are looking for name match but don't have active scan as we don't have name
  if (
    typeof CONFIG.shelly_blu_name_prefix !== "undefined" &&
    (typeof res.local_name === "undefined" ||
      res.local_name.indexOf(CONFIG.shelly_blu_name_prefix) !== 0)
  )
    return;
  // skip if we don't have address match
  if (
    typeof CONFIG.shelly_blu_address !== "undefined" &&
    CONFIG.shelly_blu_address !== res.addr
  )
    return;
  let BTHparsed = ShellyBLUParser.getData(res);
  // skip if parsing failed
  if (BTHparsed === null) {
    console.log("Failed to parse BTH data");
    return;
  }
  // skip, we are deduping results
  if (last_packet_id === BTHparsed.pid) return;
  last_packet_id = BTHparsed.pid;
  console.log("Shelly BTH packet: ", JSON.stringify(BTHparsed));
//  MQTT.publish(res.addr, JSON.stringify(BTHparsed), 0, false);
  MQTT.publish( genericTopic + '/' + res.addr  ,  JSON.stringify(BTHparsed), 0, false);
  }

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

Hello la compagnie et meilleurs voeux
J’ai plusieurs équipements shelly wifi et tout fonctionne bien avec Jeedom
J’ai commencé par acheter deux Shelly Blu Door Window puis le ShellyBluGateway (après avoir compris que c’était indispensable lol )
Bref tout fonctionne côté appli Shelly mais je n’arrive pas à l’intégré dans Jeedom, cet équipement n’est pas dans la liste des équipements à la création
J’ai bien vu les scripts plus haut,mais c’est hors de mes compétences
Y aurai il un tuto? Je n’ai rien trouvé ^^
Merci

salut, quand tu dis :

tu veux dire avec le plugin shelly?

Salut,
Pas évident, il n’est pas reconnu par les plugins.
Il faut les créés en mode individuel.
Dans mon cas , j’ai testé pas mal de version et façon de faire. J’ai même pris une passerelle chez eux.
Mais il y a eu une énorme mise à jour de theengsgateway et maintenant je n’utilise que ça sur une VM.

Pour le script c’est sur les modules à faire directement, et surtout modifier les topics mqtt.
Fonctionne parfaitement avec Jmqtt

Je ne pense pas que ce soit reconnu avec ce plugin

Je posais la question pour savoir si cetait un problème avec le plugin ou jmqtt mais visiblement pas de soucis avec le mqtt ; c’est pour moi le mieux quand on a jeedom et ce type de module car la gestion reste en local et n’est donc pas soumise au bon vouloir du cloud.

Moi si je peux passer en Mqtt je le fais . Avec le super plugin Jmqtt je me suis fait un template pour aller plus vite.
Lors de mes essaie j’avais un script modifier qui me permettait d’avoir mes détecteurs en mqtt.
Depuis que je suis passé en Theengsgateway j’ai reinitilisé mes capteurs et mis sur la nouvelle passerelle.
Donc à part copier mon script sur un device et l’activer je ne peux point faire de tuto pour le moment.
J’ai recommandé 8 capteurs et je veux bien essayer de vous faire un tuto pour une communication direct via la passerelle ou le device

1 « J'aime »

Hello, oui avec le plugin shelly
On n’y trouve pas les équipements connectés à la passerelle Blu / wifi
Je ne sais pas si ce sera pour une prochaine mise à jour…
Merci

Hello @freeddoo
Je n’ai pas encore « jouer » avec Mqtt. ^^ c’est peut-être l’occasion
Merci je suivrai ce post :wink:

Merci pour la proposition, ça m’intéresse! si je comprends bien, avec l’installation de ce script sur un shelly, on peut faire remonter les données des capteurs en mqtt?

Oui c’est bien cela

1 « J'aime »

Top! Je suis preneur d’un petit tuto si tu as le temps!

Très intéressé par ce post et notamment par le possibilité d’un capteur Shelly BLU relayé par un module gen 3 pour pouvoir l’utiliser en MQTT.
Cela ouvre des horizon car j’avais testé un capteur de mouvement Shelly en wifi et à la fois les piles s’usaient vites mais aussi il était pas très fiable. Logique, le wifi en alimentation piles, il y a des sacrifices à faire.
Bref, le BLU me semble nettement plus approprié pour les devices sur piles, et si, via un « relai » gen3 on peut dialoguer avec lui, c’est parfait.

Bref, ai-je bien compris :
On place un capteur BLU + un module par exemple Shelly Plus 1 Mini Gen3
On peut alors dialoguer en MQTT avec le gen 3 exactement de la même façon que si on dialoguait directement avec le gen 3 moyennant un script que l’on place ?
Pour configurer mes devices Shelly y compris MQTT, je ne passe pas par le cloud mais je me connecte à son propre serveur (connexion direct pour pouvoir lui donner les identifiant et mdp du wifi, puis par son ip). C’est pareil pour un capteur BLU relayé par un gen 3 ?

Au fait, ils en sont à gen3, dans les messages précédents, on parle de gen1. Quelles différences ?