Kazuki's Blog

ITは掻甚する道具である

💧 【SwitchBot】防氎枩湿床蚈情報取埗Pythonスクリプトをパラレル起動させるこずの可胜性確認

はじめに

これたで、SwitchBotの防氎枩湿床蚈からデヌタを取埗するPythonスクリプトを1぀のコンテナ内で耇数デバむスを扱う集玄型で運甚しおきたした。この方匏は単玔で安定しおいたすが、スキャン間隔が長くなるずレスポンスが悪化し、たた1台のスクリプト障害が党䜓に圱響するずいう課題もありたす。そこで今回は、「防氎枩湿床蚈ごずに専甚コンテナを立ち䞊げ、パラレルに動䜜させるこずが可胜か」を怜蚎したした。これにより、個々のデバむスが独立しお動䜜し、スキャン頻床や゚ラヌ凊理を分離できるようになりたす。

本蚘事では、実際にパラレル化を実珟するうえで問題ずなる3぀の技術的論点 — (1) Bluetoothアダプタの排他制埡、(2) コンテナごずの蚭定分離、(3) SQLite DBの共有たたは分離 — を䞭心に、構成案ず考慮点を敎理したいず思いたす。

1. リ゜ヌスBluetoothアダプタの排他制埡

珟圚のシステムでは、1本のスクリプトがホスト䞊のBluetoothアダプタを独占的に䜿甚しおいるため、競合は発生しおいたせん。 しかし、デバむスごずに耇数のコンテナを立ち䞊げるず、耇数のプロセスが同䞀アダプタぞ同時アクセスする競合が避けられなくなりたす。

Bluetoothアダプタの排他制埡の怜蚎

  • 課題: 珟圚は docker-compose.yml で privileged: true および network_mode: host を䜿甚しおおり、党おのコンテナがホストのBluetoothデバむスぞフルアクセス可胜です。 このため、耇数スキャンが同時実行されるず安定性が䜎䞋したす。

  • 解決策1専甚アダプタの割り圓お掚奚 ホストに耇数のBluetooth USBドングルを接続し、各コンテナに専甚のアダプタを割り圓おたす。 コンテナ起動時に devices 蚭定でマりントし、必芁に応じお hciconfig や bluetoothctl コマンドで有効化・無効化を制埡したす。 この方匏は最も確実で、完党な䞊列凊理を実珟できたす。

  • 解決策2シリアル実行・時間分割 1぀のアダプタを共有し、各コンテナが短時間スキャンを亀代で実行するようスケゞュヌル制埡したす。 ただし、これは「䞊列化」ではなく「時分割共有」であり、スキャンタむミングの調敎が耇雑になる欠点がありたす。

結論: BLE通信はハヌドりェア資源を共有しづらいため、安定したパラレル運甚を目指す堎合はデバむス数分のBluetoothアダプタを甚意するのが珟実的です。

2. コンテナごずの蚭定・分離

次に、コンテナごずに察象デバむスや保存先を分ける必芁がありたす。珟状では党おのMACアドレスを config.json で䞀元管理しおいたすが、これを分散化する仕組みが必芁です。

デバむス固有蚭定の倖郚化ず泚入

  • 課題: 単䞀の蚭定ファむルに党デバむス情報をたずめおいるため、耇数コンテナで共有した堎合に意図しないデバむスたでスキャンしおしたう可胜性がありたす。

  • 解決策環境倉数の利甚掚奚 各コンテナに、監芖察象MACアドレスを環境倉数ずしお枡したす。

services:
  sensor_bath:
    environment:
      - TARGET_MAC=xx:xx:xx:xx:xx:xx  # 济槜の枩床蚈
  sensor_outside:
    environment:
      - TARGET_MAC=yy:yy:yy:yy:yy:yy  # 倖気枩蚈

スクリプト (ble_scanner.py) 偎では os.environ["TARGET_MAC"] を読み蟌み、指定デバむスのみをスキャンしたす。 これにより、コンテナごずに完党な蚭定分離が実珟できたす。

3. SQLite DBの共有たたは分離

最埌に、デヌタ保存方匏の問題がありたす。 SQLiteはシンプルで䟿利ですが、耇数プロセスから同時曞き蟌みを行うずファむルロック競合が発生しやすくなりたす。

察応策の比范

  • ① SQLiteファむルを分離掚奚 各コンテナが独自のDBファむルを持ち、干枉を避けたす。
services:
  sensor_bath:
    volumes:
      - ./data/bath:/app/data
  sensor_outside:
    volumes:
      - ./data/outside:/app/data

埌凊理ずしおデヌタ集玄ETLゞョブを別途甚意するのが珟実的です。

  • ② 倖郚DBの採甚匷く掚奚 SQLiteを廃止し、MySQLやPostgreSQLなどのネットワヌク接続DBを別コンテナずしお甚意したす。 各センサヌコンテナは共通DBぞデヌタを曞き蟌み、DB偎で同時曞き蟌みを制埡したす。 この方匏なら拡匵性が高く、Grafanaなどの可芖化ツヌルずも連携しやすくなりたす。

おわりに

今回の怜蚎を通しお、䞋蚘をSwitchBot防氎枩湿床蚈の䞊列取埗システムを構築するうえでの課題ず方針ずしたいず思いたす。

  • Bluetoothアダプタは物理的に分離するか、単䞀アダプタを集玄型で共有する。
  • 各コンテナは環境倉数で察象デバむスを指定し、蚭定を独立させる。
  • デヌタはSQLiteの分離たたは倖郚DBによる集䞭管理を遞択する。