各種センサ

# SwitchBot

この製品は仕様が公開されている。
https://github.com/OpenWonderLabs/python-host/blob/master/switchbot.py
https://github.com/OpenWonderLabs/python-host/wiki/Meter-BLE-open-API#New_Broadcast_Message

## 温度湿度計とラズパイを接続する

### 参考

https://qiita.com/nonbiriya/items/ded22ebb1894bcc7041f

アプリ-[温湿度計設定]-[デバイス情報]からBLU MACを確認する。
ラズパイからつぎのコマンドでBluetooth機器の一覧を確認する。

```console
$ sudo hcitool lescan
```

### ライブラリを取得

https://github.com/OpenWonderLabs/python-host

### インストール

gitのテキストをみてインストールを行います。

### 実行

スクリプトが修正されているので、Meterをつけます。

```console
$ sudo python switchbot.py  xx:xx:xx:xx:xx:xx Meter Press
```

しかしながら、コネクションエラーになります。

```console
Usage: "sudo python switchbot.py [mac dev_type cmd]" or "sudo python switchbot.py"
Preparing to connect.
Connection error.
```

## ためした事１

こちらのスクリプトを試す。
https://qiita.com/jksoft/items/5175d6c0b49928c2b214

```python:sensor.py
import sys
import binascii
from bluepy.btle import Scanner, DefaultDelegate

macaddr = ''

class ScanDelegate( DefaultDelegate ):
  def __init__( self ):
    DefaultDelegate.__init__( self )

  def handleDiscovery( self, dev, isNewDev, isNewData ):
    if dev.addr == macaddr:
      data = dev.getScanData()
      for item in data:
        if(item[0] == 22):
          bytedata = binascii.unhexlify( item[2] )
          flag = bytedata[6] & 0x80
          temperature = ( bytedata[6] & 0x7F ) + ( bytedata[5] & 0x0F ) / 10
          if not flag:
            temperature = -temperature
          humidity = bytedata[7] & 0x7F
          print( '{ "temperature": ' + str( temperature ) + ', "humidity": ' + str( humidity ) + ' }' )
          exit()

macaddr = sys.argv[1]
scanner = Scanner().withDelegate( ScanDelegate() )
scanner.scan( 0 )
```

a) bluepy

```console
$ sudo pip3 install bluepy
```

b) MACアドレスを小文字でかく。

<font color="DeepPink">
引数で入ってくるdev.addrが小文字なので、入力も小文字で与える。とりあえず動いた。機材の正当性は確認できた。
</font>

```python
  def handleDiscovery( self, dev, isNewDev, isNewData ):
    if dev.addr == macaddr:
      data = dev.getScanData()
```

# 二酸化炭素センサ

NDIR方式が値が正確なセンサ。MH-Z19シリーズが評判よさそう。co2miniもNDIR方式です。

https://qiita.com/danzig1972/items/baf516ba10a0a11472ed

コロナでCo2濃度を測るのがプチブームになっていて、UEDAさんの記事が大本っぽい。

## 参考

UEDA： https://pypi.org/project/mh-z19/
UEDA 日本語： https://qiita.com/UedaTakeyuki/items/c5226960a7328155635f
片岡氏: https://qiita.com/yukataoka/items/a3b4065e8210b8f372ff
https://qiita.com/kanamekun/items/db27968080a1fcf3ad93

## co2mini(二種類あるので注意）

いろいろやったら動いた。crontabからはなぜか動かない。

https://qiita.com/sgrk/items/366beb3d08f792097f46

https://github.com/heinemml/CO2Meter

公式にそって `/etc/udev/rules.d/90-co2mini.rules` に、次の内容を保存する。
当該スクリプトを `sudo chgrp plugdev 90-co2mini.rules` する

```

ACTION=="remove", GOTO="co2mini_end"

SUBSYSTEMS=="usb", KERNEL=="hidraw*", ATTRS{idVendor}=="04d9", ATTRS{idProduct}=="a052", GROUP="plugdev", MODE="0660", SYMLINK+="co2mini%n", GOTO="co2mini_end"

LABEL="co2mini_end"

```

再起動する

```console
$ cd /dev/
$ ls -l hi*
crw------- 1 root root    245, 0 Feb 17 15:23 hidraw0
crw------- 1 root root    245, 1 Feb 17 15:23 hidraw1
crw------- 1 root root    245, 2 Feb 17 15:23 hidraw2
crw------- 1 root root    245, 3 Feb 17 15:23 hidraw3
crw-rw---- 1 root plugdev 245, 4 Feb 17 15:28 hidraw4
```

こうなっていたので、hidraw4に接続していると思う。
スクリプト内を hidraw4にすると動く。
この辺は名称を固定する方法について言及している記事を見た記憶あるので、できると思うが、保留にする。

```python
from CO2Meter import *
from time import sleep
from datetime import datetime
import csv

# CO2meterが認識されているデバイスを設定
sensor = CO2Meter("/dev/hidraw0")
# ちょっと待つ
sleep(8)
# CO2濃度を取得(単位はppm)
data = sensor.get_co2()
# 現在日時と時刻を取得
time = datetime.now()
# ファイル名を作成
filename = time.strftime('/home/pi/co2/co2%y%m%d.csv')
# ファイルに結果を追記
with open(filename, 'a') as f:
    writer = csv.writer(f, lineterminator='\n')
    row = [time.strftime('%H:%M:%S'),data["co2"]]
    writer.writerow(row)
    print(row)
```

## co2mini/vfilimono版（大文字、小文字に注意）

https://qiita.com/akeome/items/997d2f2bd9aea538857e#raspberry-pi-%E3%81%A8-co2-mini-%E3%81%AE%E6%8E%A5%E7%B6%9A

`sudo apt install libusb-1.0-0-dev libudev-dev`
`udev` はLINUXのデバイス管理コマンド

## hidraw0

これはUSBに接続する順番で変化する。

`lsusb` :USBデバイスの一覧と詳細情報を表示する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555658/1f0163e0-0c74-4fd3-9aa5-65809022e337.png)

# ---------------- オムロン環境センサ-------------------
型番：2JCIE-BU

CO2はVTOC方式（他の指標からの推測値で精度が悪い、NDIRの方が良い）、値が高めにでるようだ。
騒音、気圧、照度あたりが使えそう。

#　参考

https://qiita.com/Toshiaki0315/items/aa43e78c024bb900ef53


# デバイスの確認

0590 00d4 を確認する。

```
pi@raspberrypi:~ $ lsusb
Bus 001 Device 004: ID 1a81:1004 Holtek Semiconductor, Inc. Wireless Dongle 2.4 GHZ HT82D40REW
Bus 001 Device 006: ID 0590:00d4 Omron Corp. 2JCIE-BU01
Bus 001 Device 005: ID 0566:3029 Monterey International Corp.
Bus 001 Device 007: ID 0424:7800 Microchip Technology, Inc. (formerly SMSC)
Bus 001 Device 003: ID 0424:2514 Microchip Technology, Inc. (formerly SMSC) USB 2.0 Hub
Bus 001 Device 002: ID 0424:2514 Microchip Technology, Inc. (formerly SMSC) USB 2.0 Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
```

FTDIのドライバと2JCIE-BUを関連付ける
```
pi@raspberrypi:~ $ sudo modprobe ftdi_sio
pi@raspberrypi:~ $ sudo sh -c "echo 0590 00d4 > /sys/bus/usb-serial/drivers/ftdi_sio/new_id"
```

# 2JCIE-BUを自動認識するように設定
/etc/udev/rules.d/に新しいルールファイルを作って自動認識させる

```
sudo udevadm control --reload
```

# サンプルプログラム、MITライセンス

GITHUB：https://github.com/omron-devhub/2jciebu-usb-raspberrypi/blob/master/README_ja.md

```
cd ~/
git clone https://github.com/omron-devhub/2jciebu-usb-raspberrypi.git
cd 2jciebu-usb-raspberrypi/

sudo modprobe ftdi_sio
sudo chmod 777 /sys/bus/usb-serial/drivers/ftdi_sio/new_id
sudo echo 0590 00d4 > /sys/bus/usb-serial/drivers/ftdi_sio/new_id
sudo python3 sample_2jciebu.py
```

# 項目の説明

Time measured	計測時刻
Temperature	温度　-10～60℃
Relative humidity	湿度　30～85%RH
Ambient light	照度　10～2000lx
Barometric pressure	大気圧　700～1100hPa
Sound noise	騒音　40～94dB
eTVOC	総揮発性有機化学物量相当値 0～29206ppb
eCO2	CO2 濃度相当値
Discomfort index	不快指数
Heat stroke	熱中症警戒度
Vibration information	振動
SI value	スペクトル強度
PGA	最大加速度値
Seismic intensity	計測震度相当値

# 結果

```
Time measured:2022/03/06 22:56:02
Temperature:26.41
Relative humidity:35.38
Ambient light:178
Barometric pressure:1009.107
Sound noise:66.87
eTVOC:196
eCO2:1536
Discomfort index:71.88
Heat stroke:20.48
Vibration information:0
SI value:0.0
PGA:0.0
Seismic intensity:0.0
Temperature flag:0
Relative humidity flag:0
Ambient light flag:0
Barometric pressure flag:0
Sound noise flag:0
eTVOC flag:0
eCO2 flag:0
Discomfort index flag:0
Heat stroke flag:0
SI value flag:0
PGA flag:0
Seismic intensity flag:0


```