obnizでEnOceanセンサーのデータをMQTT Publishする方法

obniz

電源はMicroUSBを使用し起動します。
起動すると、4桁-4桁のobnizIDとQRコードが表示されます。

EnOceanセンサー

STM 550Bを使用して取得できる、温度・湿度・光量・バッテリーの4データをMQTTでデータを送信します。

コンソール

Developer’s Console にアクセスし、サインインします。

開発→HTML プログラム へ進みます。

obniz ID を入力し接続します。

ソースコード全体

<html>
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css">
    <script src="https://obniz.io/js/jquery-3.2.1.min.js"></script>
    <script src="https://unpkg.com/obniz@3.7.0/obniz.js" crossorigin="anonymous"></script>
    <script src="https://unpkg.com/mqtt/dist/mqtt.min.js"></script>
  </head>
  <body>
    <div class="container">
      <div>
        <h2>EnOcean STM 550B マルチセンサーモジュール(BLE)</h2>
      </div>
      <div>
        <h3>[raw advertise data]</h3>
        <div id="valueSTM550B">--</div>
        <h3>[raw advertise data 16進数]</h3>
        <div id="valueSTM550B2">--</div>
        <h3>[Temperature]</h3>
        <div id="temperature">--</div>
        <h3>[Illumination_Sensor]</h3>
        <div id="illumination">--</div>
        <h3>[Humidity]</h3>
        <div id="humidity">--</div>
        <h3>[Magnet]</h3>
        <div id="magnet">--</div>
        <h3>[Battery]</h3>
        <div id="battery">--</div>
      </div>
    </div>

    <script>
      let loopCount = 0;
      const settings = { duration: null };
      const obniz = new Obniz("4093-0779");
      let send_data = null;

      // MQTT設定
      const mqtturl = "wss://public:public@public.cloud.shiftr.io";
      const options = {
        clientId: "SmartLight-" + Math.floor(Math.random() * 100)
      };
      const topic = "obniz";
      console.log("clientId: " + options.clientId);
      console.log("connecting to: " + mqtturl + "...");

      // MQTTクライアントの作成と接続
      const client = mqtt.connect(mqtturl, options);

      // MQTTイベントハンドリング
      client.on("connect", function () {
        console.log("Connected to MQTT broker");
      });
      client.on("close", function () {
        console.error("MQTT connection closed");
      });
      client.on("reconnect", function () {
        console.log("Reconnecting to MQTT broker...");
      });
      client.on("error", function (err) {
        console.error("Connection error: ", err);
      });

      // Obnizの初期化
      obniz.onconnect = async function () {
        obniz.display.print("obniz BLE");
        obniz.display.print(" ↑ ↓");
        obniz.display.print("EnOcean");

        await obniz.ble.initWait();

        obniz.ble.scan.onfind = async function (peripheral) {
          if (peripheral.address === "e500100020ed") {
            console.log("EnOcean STM 550B connect!" + new Date().getTime());

            const adv_data = peripheral.adv_data;
            const adv_data16 = adv_data.map(function (value) {
              return value.toString(16);
            });

            $('#valueSTM550B').text(adv_data.toString());
            $('#valueSTM550B2').text(adv_data16.toString());

            const temperature = (adv_data[9] + adv_data[10] * 256) * 0.01;
            $('#temperature').text(temperature);
            const humidity = adv_data[12] * 0.5;
            $('#humidity').text(humidity);
            const illumination = adv_data[14] + adv_data[15] * 256;
            $('#illumination').text(illumination + " lux");
            const magnet = adv_data[22];
            $('#magnet').text(magnet === 1 ? "OPEN" : "CLOSE");
            const battery = adv_data[24] * 0.5;
            $('#battery').text(battery);

            send_data = {
              temperature: temperature,
              humidity: humidity,
              illumination: illumination,
              battery: battery
            };

            // データ送信
            if (send_data) {
              client.publish(topic, JSON.stringify(send_data), function (err) {
                if (err) {
                  console.error("Publish error:", err);
                } else {
                  console.log("Data sent:", send_data);
                }
              });
            }

            // 再スキャン
            await obniz.ble.scan.clearAdvertisementFilter();
            await obniz.ble.scan.endWait();
          }
        };

        obniz.ble.scan.onfinish = async function (peripherals, error) {
          loopCount++;
          console.log("scan timeout! [" + loopCount + "]");
          await obniz.ble.scan.startWait(settings);
        };

        await obniz.ble.scan.startWait(settings);
      };
    </script>
  </body>
</html>

MQTTブローカー

shifter.io をブローカーとして接続しています。

const mqtturl = "wss://public:public@public.cloud.shiftr.io";

※接続に使用するリンクが、”mqtt” → “wss” (WebSocket Secure)に変更している点に注意。

STM 550B設定

peripheral.addressobniz.ble.scan.onfind = async function (peripheral) {
          if (peripheral.address === "e500100020ed") {
            console.log("EnOcean STM 550B connect!" + new Date().getTime());

            const adv_data = peripheral.adv_data;
            const adv_data16 = adv_data.map(function (value) {
              return value.toString(16);
            });

“peripheral.address” にSTM 550B のデバイスID が指定されています。

実行

コンソールログを確認すると、正常にMQTTブローカーに接続でき、データが送信されていることがわかります。

NodeREDからも、データの受信ができました。