【CONEXIOBlackBearでこんなことをやってみた】部屋の照度に応じてスマート電球を調光してみた！

<p>最近は在宅勤務が増えて自宅の照明を点けることが多くなったのではないでしょうか。</p><p>部屋の明るさに応じて照明がちょうど良い明るさを保ってくれたらいいな…と感じたことから、
<strong><a href="https://conexio-iot.jp/serviceproduct/blackbear.html?utm_source=qiita&utm_medium=blog&utm_campaign=qiita&utm_id=qiita">CONEXIOBlackBear</a></strong>で自動的に調光する仕組みを考えてみました！</p>
<p>※そもそも<strong>CONEXIOBlackBear</strong>ってなに？という方は下記の記事をご確認ください！</p>

https://qiita.com/conexioIoT/items/6de49b078bf3a59436ba

<h2><i class="fa fa-link"></i></a>スマート電球のご紹介</h2>
<p>今回使用したのはPhilips社のスマート電球「Philips Hue」です。専用の「Hueブリッジ」をインターネットに接続し、「Hueブリッジ」からZigBeeネットワークで接続した電球を自由に操作できます。スマート電球自体の設置も既存の電球と取り換えるだけなので、手軽で簡単に電源のオン・オフや調光ができました。電球の光量は256段階で指定できます。

![Qiita_02_pic01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2637100/7b7c91be-596c-69b1-f129-5b62629550fd.png)

<h2><i class="fa fa-link"></i></a>CONEXIOBlackBearで明るさを制御する</h2>
<p>Philips Hueは、REST(<strong>Re</strong>presentational <strong>S</strong>tate <strong>T</strong>ransfer)という技術を用いて制御します。
この技術はWebサービスで良く使われるもので、サービスを提供するURLにHTTPを使ってアクセスすれば、そのサービスを利用できるというものです。例えばCONEXIOBlackBearの場合、以下のようなコマンドを実行することで、スマート電球を調光できます。(詳細は省略しますが、電気の状態<strong>”on”</strong>と光量<strong>”bri”</strong>を指定する命令を送信することで電球を調光しています)

```
# curl -X PUT <IPアドレス>/api/<UserName>/lights/1/state -d '{"on": true, "bri": 25}'
```
<h2><i class="fa fa-link"></i>照度センサーについてのご紹介</h2>
<p>調光に必要な照度データはオムロン株式会社の環境センサー「２JCIE-BU01」で計測しました。このセンサーがBLE通信で出力するアドバタイズの中に、下記のような照度などの環境データが記載されています。このセンサーは下図のようなUSBドングルタイプで、小型で電源を供給するだけで起動でき、設定不要ですぐにデータを計測できます。BLE通信については別記事の「BLEセンサを初心者がつなげてみた！」でご紹介していますので参考にしてください。</p>

<p>【2JCIE-BU01が出力する環境データ】</p>温度、湿度、照度、気圧、騒音、3軸加速度、eTVOC(※)、<br>
不快指数、 熱中症警戒度、振動情報<br>
※equivalent Total Volatile Organic Compound：室内環境下における総揮発性有機化合物濃度<br>
<a href="https://www.omron.co.jp/ecb/product-detail?partNumber=2JCIE-BU">https://www.omron.co.jp/ecb/product-detail?partNumber=2JCIE-BU</a>

<h2><i class="fa fa-link"></i></a>CONEXIOBlackBearで照度を取得する</h2>
<p>今回の実験では、自宅の部屋の照度データを測定しました。直射日光が当たらない場所に環境センサを配置し、AC電源から電力供給を行いました。この状況で照度データの測定値を比較したところ、暗いと感じたのが平均30ルクスであり、十分明るいと感じたのが平均60ルクスでした。照度データの取得には、先ほどご紹介した記事を参考にしてbluepyを使用しました。

<h2><i class="fa fa-link"></i></a>自動で調光してみた</h2>
<p>以下のような自動制御するプログラムを作成して1分周期で動かしてみました。制御の内容としては「30ルクス以下の時は光量に255を指定して電球を一番明るく点灯」「30ルクス超60ルクス以下の時は光量に128を指定して中位の光量で点灯」「60ルクス超なら消灯」させるというものです。いざプログラムを書いてみると30ステップ以下で簡単に実現でき、無事部屋の照度に応じて調光することができました！

![Qiita_02_pic02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2637100/2731bcac-c55b-cbc9-e738-e24e4b4cc20a.png)

<p><strong>【プログラムの内容】</strong></p>

```
from bluepy import btle
import struct
import subprocess
scanner = btle.Scanner(0)
devices = scanner.scan(2.0)
#環境センサの特定及びデータの取得
for device in devices:
 for (adTypeCode, description, valueText) in device.getScanData():
  if description == ‘xxxx' and valueText[0:4] == ‘xxxx':
   #照度データをバイナリから数値に変換
   binary = bytes.fromhex(valueText[16:20])
   light = struct.unpack('h', binary)
   print(‘light’, light)#照度の表示（ルクス）
   #照度に対する調光制御の内容
   if int(light[0]) > 60:
    subprocess.run(['curl', '-X', 'PUT', '<IPアドレス>
/api/<UserName>/lights/1/state ‘, ’-d‘, ’{“on”: false}‘])#消灯

   elif int(light[0]) > 30 and int(light[0]) <= 60:
    subprocess.call(['curl', '-X', 'PUT', '<IPアドレス>
/api/<UserName>/lights/1/state ‘, ’-d‘, ’{“on”: true, “bri”: 128}‘])#中光量

     else:
    subprocess.call(['curl', '-X', 'PUT', '<IPアドレス>
/api/<UserName>/lights/1/state ‘, ’-d‘, ’{“on”: true, “bri”: 255}‘])#最大光量
# curl -X PUT <IPアドレス>/api/<UserName>/lights/1/state -d '{"on": true, "bri": 25}'
```
<p>これほど少ない作業で簡単に自動調光できるとは思っていませんでした。</p>みなさまもスマート化(自動化)にぜひ挑戦してみてください！　

<strong><p>お部屋の照明、[**CONEXIOBlackBear**](https://conexio-iot.jp/serviceproduct/blackbear.html?utm_source=qiita&utm_medium=blog&utm_campaign=qiita&utm_id=qiita)で調光してみませんか？</strong></p>