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からも、データの受信ができました。