ホーム » コンピュータ » Raspberry-Pi (ページ 2)

Raspberry-Pi」カテゴリーアーカイブ

システム

最近の投稿

アーカイブ

カテゴリー

MQTTの設定

MQTTとホームオートメーション

自宅サーバで、ホームオートメーションもどきで遊んでいるけど、デバイスとのデータのやり取りは軽量の MQTT プロトコルがあるらしい。M5Stack ATOM Lite などからの情報を上げる時などで遊べそうなので、実験してみよう。

# 現状では センサー側の Raspberry-Pi では inetd.conf などで問合せポートにアクセスがあったら測定値を echo バックするような設定となっている。

mosquittoのインストール

でもひとまずは、MQTT ブローカー のオープンソース実装 mosquitto をインストール。

ブローカーとなる Raspberry-Pi には、mosquitto, mosquitto-clients をインストール。

((( ブローカーで mosquitto のインストール )))
$ sudo aptitude install mosquitto mosquitto-clients

温湿度センサーを搭載したパブリッシャー側の Raspberry-Pi には、mosquitto-clients のみをインストール。最終的には Net::MQTT::Simple を使うようにしたから不要だけど動作試験には使える。

((( パプリッシャー側は mosquitto-client だけ入れる )))
$ sudo aptitude install mosquitto-clients

mosquitto はデフォルトで外部接続を受けないので、外部接続の設定を追加。Debian流で /etc/mosquitto/conf.d/00-remote-access.conf にリモートアクセスを受ける設定を追記。

# listener<tab>1883 だとエラーになった。項目区切りで tab 使えんのか???

後のブラウザで確認するために、websocket の機能も設定しておく。

((( 最小限の生接続でひとまず実験 )))
$ sudo vi /etc/mosquitto/conf.d/00-remote-access.conf
listener        1883  # 1883 ポートで受信
allow_anonymous true  # パスワード無し

((( Websocket の設定 )))
$ sudo vi /etc/mosquitto/conf.d/10-websocket.conf
listener        15675
protocol        websockets

((( mosquitto を再起動 )))
$ sudo systemctl restart mosquitto

((( パスワード認証を使うなら )))
$ sudo mosquitto_passwd -c /etc/mosquitto/passwd mqtt

$ sudo vi /etc/mosquitto/mosquitto.conf
(先頭に)
per_listener_settings true

$ sudo vi /etc/mosquitto/conf.d/00-remote-access.conf
(追記)
password_file /etc/mosquitto/passwd

$ sudo systemctl restart mosquitto

MQTTの基本的な導通テスト

まずは基本的な導通テスト

((( ブローカー側 )))
$ sudo mosquitto_sub -d -t /sensor/place/temperature/host

((( パブリッシャー側 )))
$ mosquitto_pub -h ブローカーホスト名 -d -t /sensor/place/temperature/host -m 12.34

((( 実験結果 )))
$ sudo mosquitto_sub -d -t /sensor/place/+/host
Client (null) sending CONNECT
Client (null) received CONNACK (0)
Client (null) sending SUBSCRIBE (Mid: 1, Topic: /sensor/place/+/host, QoS: 0, Options: 0x00)
Client (null) received SUBACK
Subscribed (mid: 1): 0
Client (null) received PUBLISH (d0, q0, r0, m0, '/sensor/place/temperature/host', ... (4 bytes))
12.34

パブリッシャー側のプログラム

外気?温度(トイレ)で温度湿度を測っている Raspberry Pi の温度情報更新処理の中に Perl でブローカー宛にパプリッシュする処理を埋め込むのなら、Net::MQTT::Simple で書くのが簡単。
Net::MQTT::Simple が HTTP::Tiny を使うけど、CPAN でインストールするパッケージは最小にしたいので、HTTP::Tiny は apt-get でインストール。

((( HTTP::Tiny をインストール )))
$ sudo aptitude install libhttp-tiny-perl

((( CPANで Net::MQTT::Simple をインストール )))
$ sudo perl -MCPAN -e shell
cpan[..]> install Net::MQTT::Simple

retain(…) でメッセージを送る際に、複数の項目を連続で送る場合は、各項目毎に 30msec 50msec ほどの遅延が必要だった。
# パブリッシャー側の問題?/ブローカー側の問題? 20msec だと後続の retain が失敗した。30msecだと最後の retain が失敗(不安定)

use Net::MQTT::Simple;
use Time::HiRes 'usleep' ;
my $mqtt = Net::MQTT::Simple->new("ブローカーホスト名") ;       # brokerのホスト名

$mqtt->retain( "/sensor/place/temperature/host" => "12.3" ) ; # センサーの値を送る時
usleep( 50000 ) ;                                             # 50msecの遅延が必要
$mqtt->retain( "/sensor/place/humidity/host" => "67.8" ) ;    # センサーの値を送る時
usleep( 50000 ) ;
$mqtt->retain( "/sensor/place/pressuore/host" => "1023.4" ) ; # センサーの値を送る時

ひとまずサブスクライバの代わりに Web ブラウザで mosquitto の結果を見るための HTML , js をダウンロード。

$ cd /var/www/html
$ sudo mkdir mqtt
$ cd mqtt
$ sudo wget https://raw.githubusercontent.com/rabbitmq/rabbitmq-web-mqtt-examples/master/priv/echo.html
$ sudo wget https://raw.githubusercontent.com/rabbitmq/rabbitmq-web-mqtt-examples/master/priv/mqttws31.js

echo.html の受信するトピックの設定を修正。

    ((( 84行目 )))
        var print_first = pipe('#first', function(data) {
            message = new Paho.MQTT.Message(data);
            message.destinationName = "/sensor/place/+/host"; // トピックを修正
            debug("SEND ON " + message.destinationName + " PAYLOAD " + data);
            client.send(message);
        });

    ((( 108行目 )))
        var options = {
            timeout: 3,
            keepAliveInterval: 30,
            onSuccess: function () {
                debug("CONNECTION SUCCESS");
                client.subscribe("/sensor/place/+/host", {qos: 1}); // トピックを修正
            },
            onFailure: function (message) {
                debug("CONNECTION FAILURE - " + message.errorMessage);
            }
        };

HomePod mini 16.3

Home Pod mini の HomePod 16.3 が公開され、今までは HomePod 内に内蔵されているけど Home アプリなどで使えなかった温度・湿度センサーの機能が、参照できるようになった。{CAPTION}

更新直後は、温度センサーの項目が増えた割りに調整中の表示だったけど、しばらく経つと温度が取れるようになってきた。同じリビングに設置してある Raspberry-Pi に付けてある温湿度センサーの値と比較すると、温度は0.5℃ほどの差だけど、湿度は 10% ほどの違い。

{CAPTION}

{CAPTION}

{CAPTION}

hb-service upgrade-node で更新

Raspberry-Pi で動かしている homebridge だけど、node.js の更新は curl とか使ってたけど、hb-service でインストールできるんだ。便利。

$ sudo hb-service update-node

node.js もメジャーバージョンが、16 から 18 に以降したうえで、最新の node.js 19 が発表されたみたい。

PlayStationのプラモデル

思わずポチったプラモデル。 使い道は決まってるよね。
{CAPTION}

raspberry-pi bullseye で cec-client が動かない

最近は、google-home や Siri 経由で TVやチューナー の ON/OFF させるのに cec-client を使っているので、これが使えないと致命的。

症状

単純に apt で入った cec-client 6.0.2 では、デバイスが見つからない。(どうも 非 RPi のパッケージが入るらしい)

$ sudo aptitude install cec-client
$ echo 'scan' | cec-client -s -d 1
autodetect FAILED.
$ cec-client -l
Found devices: NONE
$ dpkg -l | grep cec
ii  cec-utils          6.0.2

バージョンを落としてみたけど、動かない。

$ sudo aptitude install cec-client/buster
$ echo 'scan' | cec-client -s -d 1
反応なし..^C でも止まらない
$ dpkg -l | grep cec
ii  cec-utils          4.0.7 

記事を漁ると bullseye では cec-client が動かないとかいう記事もあるなか、libCEC-6.0.2 を github よりインストールを行う。

github より libCEC をインストール

((( 最初に競合しそうな cec 関連を消す )))
$ sudo aptitude purge libcec4 libcec6 cec-utils

((( 資料を参考に... )))
$ sudo apt-get update
$ sudo apt-get install cmake libudev-dev libxrandr-dev python3-dev swig git

((( raspberry-pi 用の platform をインストール )))
$ cd
$ git clone https://github.com/Pulse-Eight/platform.git
$ mkdir platform/build
$ cd platform/build
$ cmake ..
$ make
$ sudo make install

((( libcec のインストール )))
$ cd
$ git clone https://github.com/Pulse-Eight/libcec.git
$ mkdir libcec/build
$ cd libcec/build
$ cmake -DRPI_INCLUDE_DIR=/opt/vc/include -DRPI_LIB_DIR=/opt/vc/lib ..
$ make -j4
$ sudo make install
$ sudo ldconfig

これが入って、ようやく cec-client が動き出す。Google Home や Siri のホームオートメーションはやっぱり便利。

raspberry-pi を buster から bullseye

Raspberry-Pi も長く運用してこまめに更新はかけているけど、Debian のバージョンとしては buster(10) もoldstable になっているので、bullseye(11) への更新をかける。

/etc/apt/souces.list.d に bullseye のファイルを追加し、”aptitude update ; aptitude full-upgrade”を実行。

時間はかかったけど、普通に更新が終わった。

inetutils-inetd でトラブル

自宅では、Raspberry-Pi に接続した温湿度センサーBME280 の結果を、メインマシンで参照させるために、inetd から BME280 を読み出すプログラムを実行している。しかし、更新後に温湿度が取れなくなる。tail /var/log/syslog を実行すると、

... inetd[3470]: cannot execute /.../bme280: Bad address

といったエラーが記録されている。原因を調べると、inetutils-inetd 2.0 では、組み込まれている libwrap により、/etc/hosts.allow にて接続許可されているかを確認するようになったみたい。そこで、以下を追加する。

((( /etc/hosts.allow )))
+ ALL: ::1
+ ALL: 127.0.0.1
+ ALL: 192.168.XX.XX/24

((( inetd を再起動 )))
# ps ax | grep inetd
# kill -HUP <<inetdのPID>>

再起動をすると、Bad address のエラーが再び発生。”/etc/init.d/inetutils-inetd stop”,”/etc/inetd.inetutils-inetd start”を行うと、Bad address が発生、”kill -HUP (inetdのPID)” を行うと、エラーが消える。意味不明状態。

なんとなく inetutils-inetd のバグのような感じに思えたので、inetd から xinetd に切り替えたら、bme280 の機能が無事に動く様になった。

eRemote mini も動かない

broadlink のモジュールが無いと言われるので、改めてインストール。

$ sudo pip3 install broadlink

eRemote mini による赤外線リモコン関係のスクリプトは、これで動き出す。

でも一番の問題は、cec-client が動かなくなる… (x_x;

M5 Atom Lite を購入

先日購入した、ドアモニタにはちょっとした連携機能があるので、それらを活用するネタにならないかということで、M5 Atom Lite を購入してみた。

小さな CPU のわりに、WiFi や Bluetooth を使うことができて、若干のデジタル・アナログ入出力端子もついてる。卒研のネタで使ってもらう練習も兼ねて、ちょっと遊んでみよう。

UIFlow を書き込む

M5Burner で ターゲットの ATOM(Lite)を選んで、シリアルポートを確認し COM5 などの値を設定。後は書き込む。

設定で、BootMenu を True にしておくと、電源を入れたり/Reset した時に、中央ボタンを押すと、緑・青・黄・紫の LED 表示が 1 秒周期ぐらいで変化するようになる。この時の離すタイミングで、以下の状態に変化

  • 緑 – Internet Mode (UIFlow のWebサイトでプログラムを書き込める)
  • 青 – USB Mode (USB Serial 経由でプログラムを書き込める) – UIFlow-Desktop-IDE
  • 黄 – WiFi 設定モード
  • 紫 – App Mode (書き込まれているアプリを実行)

A端子入力でWeb APIを起動

新しく購入したドアホンには、来客時の呼出しに合わせA端子入力を Short できるらしいので、Homebridge を連動させてみたいので、こんなプログラムを書いてみた。Web API といっても、今回は実験なので自宅サーバの特定 URL を読み出すだけ。

homebridge用にnode.jsの更新

家電制御用に動かしている Raspberry Pi の homebridge のために、node.js と npm の更新。

ついでに、最新の node.js を 16.3 にアップグレードしてみた。

$ sudo systemctl stop homebridge
$ sudo curl -fsSL https://deb.nodesource.com/setup_16.x | bash -
$ sudo systemctl stop homebridge
$ sudo apt-get install -y nodejs
$ sudo systemctl start homebridge
$ sudo npm update
$ sudo node -v
16.3.0
$ sudo npm -v
7.15.1

SwitchBot の制御が動かなくなり、プラグインを別の物に切り替え。

SwitchBotの導入

我が家で、新たに SwitchBot を導入し、エアコンのリモコンを操作させてみた。コンセントプラグ構造のスマートプラグを導入する方法もあるけど、エアコンは電力も大きいし、コンセントプラグの形状も違うので SwitchBot を選んだ。

まずはボタン動作の確認

うちのエアコン nocria は RFリモコンなので、赤外線信号では制御できない。仕方がないので、SwitchBotでリモコンのスイッチを直接押させる。基本的な使い方は、スマホにアプリを入れて SwitchBot を見つけて登録するだけ。スイッチを押す機能が確認できたので、エアコンのリモコンに貼り付け。貼り付けた場所が開く構造なので、押す動作で開きっぱなしになる可能性があったので、奥さんのヘアゴムで押さえる。

Homebridgeに登録しスマートスピーカで制御

homebridgeを導入してるので homebridge-switchbot-ble をインストール。スマホアプリで SwitchBot の Bluetooth の MACアドレスが確認できるので、これらの情報を登録するだけで簡単。これで、google home や Siri から「Ok google (or Hey Siri), エアコンをつける」ができるようになった。

{CAPTION}

ただし、プッシュ動作しかできないので、現在エアコンがついているのか解らないし、エアコンを消しても「自動クリーニング」状態になるので、ON-自動クリーニング-OFF の3状態。遠隔でON/OFFには使えない。(部屋の温度に応じてエアコンを自動でON/OFFはできない)

次にエアコンを買い替えるときは、素直に赤外線リモコンの機種か、最初からスマートスピーカ対応の機種だなぁ…。

フレームバッファ出力で電力不足?

ラズパイの状態表示を出力させてみたけど、このあとからか、Raspberry-Pi が Under-Voltage 警告が増えたみたい。そして、よく落ちるようになってきた。

HDMI 出力をすることで、電力不足だと思われる。homebridgeさえ動いていればいいので、状況表示はもともとそんなに使うはずでもないので、早々に出力の処理は止めた。

素直に大電流ACアダプタ

ACアダプタをこれ以上増やしたくないと、ルータの USB-3.0 端子から、homebridge用 Raspberry-Pi に給電していたけど、不安定なのは困る。RPi 3 用と書いてある AC アダプタを購入して取り換え。Under-voltage の警告は出なくなったな。当然か。

1日間で700回ほど出力されていた、電圧低下の警告がキレイさっぱりなくなった。当然か…(^_^;

Google 検索

My Google   Yahoo

Microsoft

ファンサイト