二酸化炭素濃度(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を使って読んでみました。

読み出しテストコード


# -*- 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)

実行例

$ 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 ず@沖縄