二酸化炭素濃度(CO2)センサー VSON WP6003(安心宝)のデータをBLEで読み出す(1)

2020/12/19ガジェット

換気チェックのために購入した二酸化炭素濃度(CO2)センサー VSON WP6003(安心宝)のデータをBLE経由で読み出してみました。まだ解析できていないところもありますが、メモ残しておきます。


Carbon Dioxide CO2 Detector Air Quality Tester Formaldehyde Detector High Sensitive Detector Indoor Formaldehyde Testing Machine(VSON WP6003)

購入した格安空気センサーです。Aliexpressから送料込み1000円程度で買えます。

CO2の他、TVOC、HCHO、気温が測れます。スマホアプリでデータ読み出せますが、このアプリがお行儀がよろしくないのでBLE経由で読んでみました。




下準備

AndroidのBLE Scannerで叩いてみます。6003#なんちゃら という名前でアクセスできるようです。



データはNotifyで上がってきます。



データは全部で18バイトあり、下記のフォーマットのようです(一部不明)。TVOCとHCHOは逆かもしれません。

  • 6バイト: タイムスタンプ 0x0a(?),年(2桁),月日時分をおのおの1バイトで表す
  • 2バイト: 気温(0.1℃単位)
  • 2バイト: 不明
  • 2バイト: TVOC(0.001mg/㎥)
  • 2バイト: HCHO(0.001mg/㎥)
  • 2バイト: 不明(0100)
  • 2バイト: CO2濃度(ppm)


BLE経由で読み出してみた

下記サイトの記事を参考に、MacOS上でAdafruit_Python_BluefruitLEを使って読んでみました。

読み出しテストコード


[code lang="python"]
# -*- coding: utf-8 -*-
import Adafruit_BluefruitLE, uuid
from Adafruit_BluefruitLE.services import UART, DeviceInformation
import struct
import atexit
import time
import datetime

DEVICE = '6003#XXXXXXXXXXXXX’ # デバイス名
SERVICE = uuid.UUID('0000FFF0-0000-1000-8000-00805F9B34FB’)
SENSOR = uuid.UUID('0000FFF4-0000-1000-8000-00805F9B34FB’)

provider = Adafruit_BluefruitLE.get_provider()
provider.initialize()

def main():
adapter = provider.get_default_adapter()
adapter.power_on()
print('adapter:’, adapter.name)
try:
print('adapter.start_scan()’)
adapter.start_scan()
atexit.register(adapter.stop_scan)
known_uarts = set()
isnotFound = True
while(isnotFound):
found = set(provider.find_devices())
new = found – known_uarts
for device in new:
print('Found device: {0} [{1}]’.format(device.name, device.id))
if(device.name == DEVICE):
print('connecting…’)
device.connect()
print('connected.’)
isnotFound = False
adapter.stop_scan()
known_uarts.update(new)
time.sleep(0.5)
if device is None:
raise RuntimeError('Failed to find UART device!’)
finally:
adapter.stop_scan()

print(device.name)

device.discover([SERVICE],[SENSOR])
service = device.find_service(SERVICE)
print('got service’,SERVICE)
sensor = service.find_characteristic(SENSOR)
print('got characteristic’,SENSOR)

def received(data):
dt_now = datetime.datetime.now()
print('Notify:’,dt_now,’ ',data.hex())
print('Time: 20′,data[1],’年’,data[2],’月’,data[3],’日’, data[4],’:’,data[5])
print('Temp:’,(data[6]*256+data[7])/10,’℃’)
print('TVOC:’,(data[10]*256+data[11])/1000,’mg/㎥’)
print('HCHO:’,(data[12]*256+data[13])/1000,’mg/㎥’)
print('CO2 :’,(data[16]*256+data[17]),’ppm’)

sensor.start_notify(received)
print('start notifications.’)
while (True):
time.sleep(5)

provider.run_mainloop_with(main)
[/code]

実行例

$ python3 test.py
adapter: Default Adapter
adapter.start_scan()
Found device: 6003#XXXXXXXXXXXXX [xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx]
connecting…
connected.
6003#XXXXXXXXXXXXX
got service 0000fff0-0000-1000-8000-00805f9b34fb
got characteristic 0000fff4-0000-1000-8000-00805f9b34fb
start notifications.
Notify: 2020-12-19 10:46:42.541015 0a140c130a2300b958020003000201000222
Time: 20 20 年 12 月 19 日 10 : 35
Temp: 18.5 ℃
TVOC: 0.003 mg/㎥
HCHO: 0.002 mg/㎥
CO2 : 546 ppm


ToDo

  • Notity間隔を設定できるはずだけど、どこを叩けばいいか不明。要調査。 Done.
  • 時刻設定もできるはずだが Done.
  • センサーのエラー?によりデータがおかしくなることがある。“TVOC: 9.999 mg/㎥ HCHO: 1.999 mg/㎥ CO2 : 2000 ppm” になる。これスマホアプリでも発生するんだよな。安心宝の電源をON/OFFしないと治らない?

続き: 二酸化炭素濃度(CO2)センサー VSON WP6003(安心宝)のデータをBLEで読み出す(2) | ず@沖縄


リンク

ガジェット

Posted by ず@沖縄