Pi zero Homebridge BME680でデータを表示する

まじのアバター

Raspberry Pi ZeroのHomeBridgeで、BME680により取得した温度、湿度、気圧、空気質指数?を表示しようとして1.5日ぐらい詰まりました。

BME680のテスト

https://github.com/pimoroni/bme680-python/blob/main/examples/read-all.py#L16

このプログラムでBME680のテストができます。正しく配線して、i2cを有効化して実行してください。

HomeBridgeのセットアップ

方法が2つあります。

1つ目はHomeBridgeのOSをインストールする方法です。一発でUIにアクセスできるようになるので便利です。試してないですがRaspberry Pi OSは使えなくなる?と赤外線関係ができなくなるかもしれないと考えたので、今回は使いません。(実際どうかはわからない)

https://github.com/homebridge/homebridge-raspbian-image/wiki/Getting-Started

2つ目はRaspberry Pi OSにインストールする方法です。UIにアクセスするまで書いてあります。

https://github.com/homebridge/homebridge/wiki/Install-Homebridge-on-Raspbian

使用した者たち

非公式node.jsビルド v20.16.0 : https://unofficial-builds.nodejs.org/download/release/v20.16.0/

BME680のプラグインをインストール

プラグインでbme680と検索すると、マサチューセッツ工科大学のプラグインが出てきたのでインストール。

指示に従って再起動すると…

 ====================
[dd/mm/yyyy, hh:mm:ss] ERROR LOADING PLUGIN homebridge-bme680:
[dd/mm/yyyy, hh:mm:ss] Error: Could not locate the bindings file. Tried:
 → /var/lib/homebridge/node_modules/homebridge-bme680/node_modules/i2c-bus/build/i2c.node
 → /var/lib/homebridge/node_modules/homebridge-bme680/node_modules/i2c-bus/build/Debug/i2c.node
 → /var/lib/homebridge/node_modules/homebridge-bme680/node_modules/i2c-bus/build/Release/i2c.node
 → /var/lib/homebridge/node_modules/homebridge-bme680/node_modules/i2c-bus/out/Debug/i2c.node
 → /var/lib/homebridge/node_modules/homebridge-bme680/node_modules/i2c-bus/Debug/i2c.node
 → /var/lib/homebridge/node_modules/homebridge-bme680/node_modules/i2c-bus/out/Release/i2c.node
 → /var/lib/homebridge/node_modules/homebridge-bme680/node_modules/i2c-bus/Release/i2c.node
 → /var/lib/homebridge/node_modules/homebridge-bme680/node_modules/i2c-bus/build/default/i2c.node
 → /var/lib/homebridge/node_modules/homebridge-bme680/node_modules/i2c-bus/compiled/20.16.0/linux/arm/i2c.node
 → /var/lib/homebridge/node_modules/homebridge-bme680/node_modules/i2c-bus/addon-build/release/install-root/i2c.node
 → /var/lib/homebridge/node_modules/homebridge-bme680/node_modules/i2c-bus/addon-build/debug/install-root/i2c.node
 → /var/lib/homebridge/node_modules/homebridge-bme680/node_modules/i2c-bus/addon-build/default/install-root/i2c.node
 → /var/lib/homebridge/node_modules/homebridge-bme680/node_modules/i2c-bus/lib/binding/node-v115-linux-arm/i2c.node
    at bindings (/var/lib/homebridge/node_modules/homebridge-bme680/node_modules/bindings/bindings.js:126:9)
    at Object.<anonymous> (/var/lib/homebridge/node_modules/homebridge-bme680/node_modules/i2c-bus/i2c-bus.js:4:32)
    at Module._compile (node:internal/modules/cjs/loader:1358:14)
    at Object.Module._extensions..js (node:internal/modules/cjs/loader:1416:10)
    at Module.load (node:internal/modules/cjs/loader:1208:32)
    at Function.Module._load (node:internal/modules/cjs/loader:1024:12)
    at Module.require (node:internal/modules/cjs/loader:1233:19)
    at require (node:internal/modules/helpers:179:18)
    at Object.<anonymous> (/var/lib/homebridge/node_modules/homebridge-bme680/node_modules/bme680-sensor/lib/bme680.js:3:13)
    at Module._compile (node:internal/modules/cjs/loader:1358:14)

ChatGPTに入れてみると、i2c-busというnpmのモジュールが入っていないからだそうで。
SSHのターミナルから適当にインストールしてみると…

$ sudo npm install -g i2c-bus

internal/modules/cjs/loader.js:883
  throw err;
  ^

Error: Cannot find module 'node:path'
Require stack:
- /usr/local/lib/node_modules/npm/lib/cli.js
- /usr/local/lib/node_modules/npm/bin/npm-cli.js
    at Function.Module._resolveFilename (internal/modules/cjs/loader.js:880:15)
    at Function.Module._load (internal/modules/cjs/loader.js:725:27)
    at Module.require (internal/modules/cjs/loader.js:952:19)
    at require (internal/modules/cjs/helpers.js:88:18)
    at Object.<anonymous> (/usr/local/lib/node_modules/npm/lib/cli.js:2:18)
    at Module._compile (internal/modules/cjs/loader.js:1063:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1092:10)
    at Module.load (internal/modules/cjs/loader.js:928:32)
    at Function.Module._load (internal/modules/cjs/loader.js:769:14)
    at Module.require (internal/modules/cjs/loader.js:952:19) {
  code: 'MODULE_NOT_FOUND',
  requireStack: [
    '/usr/local/lib/node_modules/npm/lib/cli.js',
    '/usr/local/lib/node_modules/npm/bin/npm-cli.js'
  ]
}

謎のエラー。よくわからなかったので、またもやChatGPTに聞いてみると

このエラーは、node:pathモジュールが見つからないために発生しています。これは、Node.jsのインストールに問題があるか、破損している可能性があることを示しています。以下の手順でNode.jsとnpmを再インストールして問題を解決してみましょう。

Node.jsの破損か。たしかに心当たりはあります。
Raspberry pi zeroではCPUが古いため公式のNode.jsは動かないそうで、非公式のものをインストールしました。(参照した記事:https://note.com/t_t_tonbi/n/n1c0aab5f731d)

代わりにいろいろ11系のバージョンだったり入れてみてもうまくいかず、実に1日以上を費やしました。(何やってんだか)

ここでChatGPTが意味深な発言をします。

  1. Homebridgeがインストールされているディレクトリに移動します。通常は /var/lib/homebridge です。bashコードをコピーするcd /var/lib/homebridge
  2. 「i2c-bus」モジュールを再インストールします。bashコードをコピーするnpm install i2c-bus

ここまで来てやっとわかりました。HomeBridgeのUIの方を確認すると…

やっぱり。HomeBridgeのために独自のNode.jsがインストールされているでは有りませんか。

そして、UIの方の「コンソール」のところで、sudoを外して

npm install i2c-bus

これでインストールできました。
再起動してみるとちゃんとプラグインが動いてHomeApp上で気温・湿度・空気質が確認できるようになりました。やったね!

結論:専用コンソールがあるなら使え

いやぁ、ずっとSSHの方のコンソールで操作してて、よくわかんねぇなぁ…と思いながらやっていたので思ったより手こずってしまいました。

アプリケーション専用のコンソールあるなら優先的に使ってみたほうが良いのかなと思います。

今後は赤外線を実装するぞ!!

番外編:気圧も表示したい

マサチューセッツ工科大学さんのプラグインでは、気圧を表示することが出来ません。

せっかくBME680で気圧を測定できるので、既存のソースコードを参考に、気圧を表示できるようにしてみたいと思います。

…と思って張り切ってコードを見たのですが、別に意図的に大気圧が表示されないようになってるわけじゃないんですよね。

と思って検索したらこれが見つかりました。

https://github.com/arachnetech/homebridge-mqttthing/issues/367

なんと、デフォルトのホームアプリは気圧表示に対応していないらしいです。マジか。
Eveというアプリを入れると自動で表示されました。な~んだ。

Eveは完全無料で、プライバシーもAppStore上では匿名加工情報として診断ログのみ収集になっていたので割とそこはしっかりしてるっぽいです。


公式サイト:https://www.evehome.com/en-us

[メモ]古いバージョンのHomeAppに戻してiPadをホームハブに

参考:https://discussions.apple.com/thread/254934792?sortBy=rank

http://appldnld.apple.com/iOSProfiles/HomeKitReset.mobileconfig
http://appldnld.apple.com/iOSProfiles/KeepLegacyHome.mobileconfig

参考文献

bme680-python. from https://github.com/pimoroni/bme680-python

homebridge-bme680. from https://github.com/Odisseuss/homebridge-bme680

kyle . serverあれこれ. from https://serverarekore.blogspot.com/2021/03/raspberry-pi-zerobme680.html

Raspberry Pi ZERO WHへのHomebridgeセットアップ|tonbi. from https://note.com/t_t_tonbi/n/n1c0aab5f731d

HomeBridge-bme680. from https://github.com/Odisseuss/homebridge-bme680

RaspberryPi 2にNodejs をインストール #Linux – Qiita. from https://qiita.com/sda134/items/7c55a537401eaa9679c6

自由研究:Raspberry Pi Zero に nodejs 環境を最新にしたメモ. from https://www.cooptec.jp/archives/1718

後日譚

空気質が常に「非常に良い」になっているのが気になりました。

例のリポジトリにあるsensor.jsという非常にわかりやすいファイルがあったのでのぞいてみました。[

場所はインストールの仕方によって以下のパターンが考えられます。(By GPT-4o)

sudo nano /usr/local/lib/node_modules/homebridge-bme680/sensor.js
sudo nano /homebridge/node_modules/homebridge-bme680/sensor.js
sudo nano /var/lib/homebridge/node_modules/homebridge-bme680/sensor.js

# 見つからなければ検索
find / -name "script.js" | grep homebridge-bme680

どうやら、computeIAQ関数の下にいろいろパラメータがくっついています。

function computeIAQ(gas, humidity) {
	const humidityWeight = 0.25;          # 評価における湿度の与える影響度を25%とする
	let gasOffset = 50000 - gas;          # ガスセンサ抵抗値の基準値を50000とする
	let humidityOffset = humidity - 40;   # 理想的な湿度を40%とする

これを、

function computeIAQ(gas, humidity) {
	const humidityWeight = 0.40;          # 40%
    let gasOffset = 100000 - gas;         # 100000
	let humidityOffset = humidity - 40;

としてみました。

ただ…変わんねぇやw

まぁおまけみたいなもんでした。



コメント

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA