見出し画像

温湿度計ゲートウェイ(THGateway)の作製(途中)

はじめに

私は趣味の盆栽を通じて、IT技術を深く掘り下げたいと思っています。

元はマイクロコントローラーにセンサーを付けて、情報を取得しようと悪戦苦闘していました。
ヒトの感覚と機械とのずれを認識し、いかにして欲しいデータに近づけるかが大切でした。
センサーとの格闘に疲れたとき、校正済みで安定した値を返してくれるSwitchbot温湿度計の魅力に引き寄せられ、温度湿度の取得だけにとどまらず、屋外向けのケーシング作製をおこない、果ては、かわいくSwitchbot温湿度計を飾るためのミニ百葉箱を作りはじめ、木材工作の楽しさを知るきっかけとなりました。

Switchbot温湿度計+ミニ百葉箱を知人に譲り、新しいものと交換したところ、今まで愛用していたBLEGatewayTestから値が拾えなくなっていることが分かりました。

何か違いがあるのか調べてみると、ファームウェアのバージョンが違っており、発信されている信号も異なっていました。

思えば、このBLEGatewayTest。テスト運用のままうまく使えていたので、そのまま愛用していたものでした。
部屋の各所+屋外に置かれたSwitchbot温湿度計から発信されるBLE信号をつかまえて、解読し、Ambientへデータを飛ばしています。

このプログラムの好きなところはSwitchbot温湿度計を特定するのみで個体の特定を行いません。
このため、ソースを書き換えることなく増設することができます。

ただ、あくまでもテスト運用中でしたので、表示される情報はぐちゃぐちゃ、ソース管理もきちんとできていない状態でした。
半年前に書いたソースはもうすでに忘却の彼方にあり、思い出すところからのスタートになります。

ならば、もう少しきちんと作ってみたい。
ということで、やってみることにしました。

改良したい点は、
 ・使用するハードウェアをM5StackからAtomMatrixへ変更する。
 ・新しく加えたSwitchbot温湿度計も表示できるようにしたい。
 ・表示内容を改善したい。(もしくは、表示をしないようにしたい。)
 ・Switchbot温湿度計だけではなく、CYALKIT-E03も対象としたい。
等です。

以前の記事
【SwitchBot温湿度計モニター】の製作~ソースコード付き~

で課題としていた、再起動しても値を残すようにするのは、今回も見送ることにいたします。
しばらく使っていましたが、調子が悪くなり再起動を掛けた際、認識順序の違いからグラフの色が変わってしまうことはありましたが、特にそれ以上の問題は起きていません。

本格的にIoTデバイスとして考えるときは、今度こそはMACアドレスで個体認識させたほうがよいでしょうから、それでよいと思います。

使用するハードウェアをM5StackからAtomMatrixへ変更する。

最終版のソースが見当たらず、結局note.comにアップしたソースを元に再構築しました。

#include <m5stack.h> → #include <m5atom.h>

後は関係する箇所(表示関係)を書き換えました。

新しく加えたSwitchbot温湿度計も表示できるようにしたい。

まずはなぜ表示されないかを調べてみることにしました。

見た目はまったく同じです。

従来機
従来機のうら
新規追加機
新規追加機のうら

外見では見分けはつきません。
アプリで見てみます。

従来機のファームウェア
新規追加機のファームウェア

従来機はv2.6、新規追加機はv2.8です。

アンドロイドのアプリ、nRF Connectを用いてどんな信号が来ているか見てみます。

確かに、従来機と新規追加機とで信号が異なっています。

表:従来機と新規追加機の相違点

異なっていることはわかったのですが、そもそも、Bluetoothってどんな仕掛けだったっけ?

ぐらいに忘れてしまっています。
ここはもう一度勉強し直しです。
今回はこちらのブログにお世話になりました。

ムセンコネクト
【サルでもわかるBLE入門】(1) BLEの基礎

ムセンコネクト
【サルでもわかるBLE入門】(2) アドバタイズとGATT通信

少し思い出してきました。
Switchbot温湿度計から発信されている、BLEアドバタイズを受信し、選別・特定し、その中に含まれる、温度・湿度を読み取ることをしていました。

この選別・特定方法が、新規追加機には当てはまっていなかった。

というのが調査の結果になります。

if (device.haveServiceUUID() && device.getServiceUUID().equals(SwitchBotServiceUUID))

もし、ServiceUUIDを持っていたら、SwitchbotのUUIDである"cba20d00-224d-11e6-9fb8-0002a5d5c51b"と照合していました。新規追加機ではそもそもUUIDのデータが飛んできていません。

では、どのように対処すればよいかについて考えます。

特定できるデータはないか探します。
nRF Connectの情報を元に見ていくと、Service DataのUUID:0x0D00、0xFD3Dが気になります。
これらのデータがSwitchbot温湿度計を表していればよいのですが、これだけではわかりません。

だいぶBLEの仕掛けに頭が慣れてきたので、プログラムで取得できた値を見てみます。

device(9/9):Name: , Address: XX:XX:XX:XX:XX:XX, manufacturer data: 6909fe777f7ae7938f03029332

manufacturer dataの中に6909が見えます。これは0x0969、Woan Technology (Shenzhen) Co., Ltd.を示しています。従来機の場合は、0x0059、Nordic Semiconductor ASAと書かれた部分です。

この部分を取り出して、会社名でフィルタリングする形でいいのか。。。
少し不安が残ります。

結局今回は、下記の方法で判定しました。
 1.Service Dataを持っている
 2.かつ、そのデータのサイズが6バイト
 3.自前の構造体SwitchBotServiceDataへ読込み、deviceTypeが'T'か比較する。
※'T':SwitchBot MeterTH (WoSensorTH) Normal Mode

とすると、新規追加機からもデータを取得することができました。

device(6/6):Name: , Address: XX:XX:XX:XX:XX:XX, manufacturer data:
6909fe777f7ae793b10303942e
temperature:20.3
humidity:46.0
SwitchBotServiceData:
deviceType:54
reserved1:00
group A:00 B:00 C:00 D:00
reserved2:00
remainingBattery:64(100)
reserved3:00
decimalOfTheTemperature:03(3)
humidityAlertStatus:00
temperatureAlertStatus:00
integerOfTheTemperature:14(20)
posiNegaTemperatureFlag:01
humidityValue:2e(46)
temperatureScale:00

表示内容を改善したい。(もしくは、表示をしないようにしたい。)

そもそもゲートウェイに表示する情報って何でしょう?
WifiルーターやHUBを見ていると、LEDがチカチカ光っている様子が見えます。

温度や湿度の具体的な数字というよりも、データが届いているかどうかがわかるような仕掛けが必要です。

11★22
--★--
33★44
--★--
〇〇〇〇〇

11:アドレス1、22:アドレス2、33:アドレス3、
44:アドレス4、★:Ambient更新までの残り時間、〇:fConnect

こんな感じで考えてみました。
Switchbot温湿度計を最大4台まで管理できるようにしています。
Ambientでは8個のデータを送れますので、実際には4台までの温度・湿度を管理できることになります。

余談ですが、私の開発スキルではこれぐらい表示が制限されている方が、楽しくUIを設計できます。
M5Stick-CやM5Stackのように表示できてしまうと、何をしたらよいか、途端にわからなくなってしまいます。。。

Switchbot温湿度計だけではなく、CYALKIT-E03も対象としたい。

ずいぶん昔、まだ電子工作に興味を持つ前に、棚場の温度管理のために何かできないかと考えていた時、

Cypress Semiconductor社(現在はInfineon)のCYALKIT-E03を入手していました。

Solar-Powered BLE Sensor 5 Pack

ソーラーで電源供給できて、BLEで温湿度を発信します。

USBドングルとBLEセンサーの評価キットCYALKIT-E02のBLEセンサー部分のみの追加パックなのです。

今までも何度かCYALKIT-E02の技術資料を読んで、何とかしようと思っていましたが、結局よくわからないままでした。
BLEについての考え方が全く分からず、アプリで発信されているデータを読むという術も知りませんでした。

でも、今回は違います。5年近く寝かせてきた装置を活用する機会がやってきました。
なんとかできそうな気がしています。

CYALKIT-E02の技術資料とnRF Connectの出力をにらみながら、データを取り出します。

typedef struct {
// AD Data 25 bytes
uint16_t companyID; // 0x004C
uint8_t deviceType; // 0x02
uint8_t length3; // 0x15
char uuid[16]; // 00050001-0000-1000-8000-00805F9B0131 [hex]
uint16_t major; // 0x0001
uint8_t humidity; // 湿度[%] = 125 * (humidity * 256) / 65536 - 6
uint8_t temp; // 温度[℃] = 175.72 * (temp * 256) / 65536 - 46.85
uint8_t rssi; // RSSI
} CyalkitServiceData;

仕様書から起こした構造体定義(動作チェックはこれからです。)
作製中の画像(こんな色にしたかなぁ?)

さいごに。。。そしてつづく

今回は思い立ってから再勉強しプログラムを書き換えました。とても幸運なことに大きなつまずきもせず完成まで進めることができました。全く真っ白になったかに思えた私の記憶も再勉強するとだんだんと思い出してきました。今までの苦労は無意味ではなかったと安心しました。

という流れで、さいごにプログラムソースを見ていただき終了にしようと考えていました。

ところが、なかなか思い通りにならないのが電子工作の世界。(今回は全く工作をしていませんが。。。)

怪現象-その1

データの受信が安定していません。
とびとびです。

怪現象-その2

今まで使用していたBLEGatewayTestの表示を見てみると、今まで受信できていなかった3台目が表示されています。

でも何かおかしい様です。

怪現象-その2 データをピックアップ

棚場とリビングのデータの間をフラフラ渡り歩いているような感じです。
頭の中が真っ白になりました。全く理由が分かりません。

なぜ3台目のデータが急に取れ始めたのか?

なぜ1台目と2台目のデータに似ているのか?

もっとしっかり調べなさいということなのでしょうか。。。
まずはここまでを記事にして、続きは次回といたします。

最後までお読みいただき、誠にありがとうございました。

#途中 #IoT #温湿度計ゲートウェイ #Ambient #Switchbot温湿度計 #M5Stack #AtomMatrix #CYALKIT -E03

いいなと思ったら応援しよう!