編集履歴一覧に戻る
Miypのアイコン画像

Miyp が 2021年05月13日08時02分21秒 に編集

初版

タイトルの変更

+

自宅の温湿度計変化をモニタリングする

タグの変更

+

スマートホーム

+

obniz

+

Ambient

+

Govee

メイン画像の変更

メイン画像が設定されました

本文の変更

+

+ Obniz IoTコンテスト2021 ## やりたいこと コロナで自宅にいる時間が増えているので自宅のスマートホーム化を計画しました。 いきなり難しいことはできないため、まずはそれぞれの部屋の温度・湿度を取得して履歴の取得と 携帯からそれぞれの部屋の状態を確認できるシステムを構築しました。 ## デモ画面 @[Youtube](https://youtu.be/Hzoxv2gYD9w) ## システム構成 ![キャプションを入力できます](https://camo.elchika.com/30b1bf0e6969eb7747586420a640db031953c0da/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f62333035636636342d663637382d343862632d613034662d6637356432323565633864372f33313630653834342d313664612d346631652d626463312d666132376561333933383732/) ## ハードウェア 今回は買い物だけではんだ付けは不要です。 |No|名称|機能|入手先| |:--|:--|:--|:--| |1|obniz|BLE通信を使いGoveeから温湿度情報を取得し、Ambientにデータを出力します|[Amazon](https://www.amazon.co.jp/dp/B07DD6FK8G/)やSWITCHSCIENSなど| |2|Govee|BLE温湿度計|[Amazon](https://www.amazon.co.jp/dp/B083348J3X/)など| ## ソフトウェア ## ①履歴取得 obnizのサーバレス機能を使い、10分間隔で温湿度の取得。取得したデータをAmbientへ書き込みを行います ```html :サーバレスイベント <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://code.jquery.com/jquery-3.2.1.min.js"></script> <script src="https://unpkg.com/obniz@3.x/obniz.js" crossorigin="anonymous" ></script> <script src="https://unpkg.com/axios/dist/axios.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/qs/6.10.1/qs.min.js" integrity="sha512-aTKlYRb1QfU1jlF3k+aS4AqTpnTXci4R79mkdie/bp6Xm51O5O3ESAYhvg6zoicj/PD6VYY0XrYwsWLcvGiKZQ==" crossorigin="anonymous"></script> <script src="https://unpkg.com/ambient-lib@1.0.3/lib/ambient-lib.js"></script> </head> <body> <script> // インストールされたデバイス情報に書き換わる const ambientID=Your Channel key; // const ambientRKey="Your Read Key"; const ambientWKey="Your Write Key"; //const gvhName= "GVH5075_XXXX"; const obnizID="Your obniz ID" var obniz = new Obniz(obnizID); obniz.onconnect = async function () { await obniz.ble.initWait(); var target = { //localName:gvhName, localNamePrefix:"GVH5075" }; var setting = { duration: 60, // 60 sec } obniz.ble.scan.onfind = async function (peripheral) { let name=peripheral.localName; console.log("Name:"+name); const buf = peripheral.adv_data[26] * Math.pow(16, 4) + peripheral.adv_data[27] * Math.pow(16, 2) + peripheral.adv_data[28] let temperature = Math.floor(buf / 1000) / 10; let humidity = (buf % 1000) / 10; let power=peripheral.adv_data[29]; //console.log(buf); //console.log("RSSI:"+peripheral.rssi); console.log("Temp:"+temperature); console.log("Humi:"+humidity); console.log("Power:"+power); am = new Ambient(ambientID,ambientWKey); am.send({d1: temperature, d2: humidity,d3:power}, function(response) { console.log(response.status); }); if (Obniz.App.isCloudRunning()) { Obniz.App.done({ status: 'success', text: `Worked` }) } else { alert("Done.") } }; obniz.ble.scan.onfinish = async function (peripherals, error) { //console.log("scan again") await obniz.ble.scan.startWait(target, setting); }; await obniz.ble.scan.startWait(target, setting); }; obniz.onclose = async function() { }; </script> </body> </html> ``` ## ②ダッシュボード 30秒間隔で温湿度計のデータを取得。取得したデータをダッシュボードに表示しています。 温湿度計は複数個に対応しています。obnizの制限で最大4台まで対応します。 開発環境にはビジュアルプログラミングツールNoodlを使い、SPAのダッシュボードを作成します。 ```js:Javascriptノードの中身 Node.Inputs = { ObnizID: 'string', } Node.Outputs = { temperature: "number", humidity: "number", power:"number", rssi: "number", name: "string", } Node.Signals.ScriptLoaded = function () { var obniz = new Obniz(Node.Inputs.ObnizID); obniz.onconnect = async function () { await obniz.ble.initWait(); var target = { //localName: "GVH5075_BAFD", localNamePrefix:"GVH5075" }; obniz.ble.scan.onfind = async function (peripheral) { Node.Outputs.name=peripheral.localName; console.log("Name:"+peripheral.localName); const buf = peripheral.adv_data[26] * Math.pow(16, 4) + peripheral.adv_data[27] * Math.pow(16, 2) + peripheral.adv_data[28] Node.Outputs.temperature = Math.floor(buf / 1000) / 10; Node.Outputs.humidity = (buf % 1000) / 10; Node.Outputs.power=peripheral.adv_data[29]; Node.Outputs.rssi=peripheral.rssi; //console.log(buf); //console.log(temperature); //console.log(pressure); //console.log("RSSI:"+peripheral.rssi); }; obniz.ble.scan.onfinish = async function (peripherals, error) { console.log("scan again") await obniz.ble.scan.startWait(target); }; await obniz.ble.scan.startWait(target); }; } ``` 実際に設定した手順は以下になります。 開発者コンソールにアクセス リポジトリをクリック 新規作成でタイプをBlockProgram、ファイル名入力し作成ボタンをクリック プログラムを作成 して保存  ほぼサンプルプログラムと同じですが、以下のプログラムを作成しました。 ## 動作確認 準備ができたので、動作確認をしてみました。 機能②で紹介したzabbixのアクションにて、軽度以上の障害が発生した際に、以下のようにcurlコマンドでwebhookのURLにアクセスするように設定しました。 ## まとめ また、時間ができたらリベンジしてみます。 obnizとJavaScriptの経験が浅いので、間違っている実装もあると思いますがその点はご了承ください。 ## 参考資料 - [bluetooth 温度・湿度計を読んでインターフェイスする。](https://qiita.com/hiratarich/items/3f7991d4164e5f0ecc62) -[Obnizでセンサデータを取得しAmbientに送る](https://ambidata.io/samples/devices/obniz2/)