Sympapaのスマートホーム日記

スマートなんとかはスマートじゃない方法でつくられている

Home Assistant: Raspberry Pi 4のUSBポート優先順位に悩まされたハナシ

Sympapaです。
Raspberry Pi 4が品薄すぎてガチで購入できない状況が続いてますね。備忘録とHome Assistant初心者が初心者の方のために書いているようなブログなのでHome Assistantの新規ユーザーが増えそうにないこの状況はブログを書くモチベがちょっと下がります(汗
そしてHome Assistantでがっつり自動化している我が家はRaspberry Pi 4が壊れたら復旧出来ない。。。考えただけで身震いがします(><)
「予備を買おうかな」と思っていて、たま~に出現する1万円以下の価格の在庫を見つけるとポチろうか悩むんですが、保険にしてはもったいないと思うのと品薄なので本当に欲しい人に渡って欲しいと思うのでなかなか買えませんねぇ。
とりあえず故障リスクを下げるために我が家のRaspberry Pi 4にたまった埃を掃除しておきました(笑)


そんなワケで本題に入りますが、Raspberry Piを初めて購入していきなりHome AssistantをHome Assistant OS上で動かしている私は、全くもってRaspberry Piのことがわかりません(汗
Windows脳ではHome Assistantのトラブルに対処するのは難しいと実感する出来事があったので、今回はそれについて書いてみようと思います。


Home Assistantを使用し始めた時からZigBeeコーディネーターはUSBドングルタイプのNortec HUSBZB-1を使用しています。HUSBZB-1はZigBeeとZ-Waveが併用できます。
最初にHUSBZB-1をRaspberry Piに挿した時に"/dev/ttyUSB0"にZ-Waveが割り当てされ、"/dev/ttyUSB1"にZigBeeが割り当てされたので、この状態でHome AssistantのZHAで使用するコーディネーターを"/dev/ttyUSB1"に設定しました。


そして最近、SonoffのZigBee 3.0 USB Dongle Plus を追加しました。
Raspberry Piに挿すと"/dev/ttyUSB2"に割り当てされたので、深く考えずにHome AssistantのZigBee 2 MQTTで使用するコーディネーターを"/dev/ttyUSB2"に設定しました。


その後ZHAもZigBee 2 MQTTもなんの問題もなく稼働していましたが、数日後にHome Assistant OSをアップデートしたらZHAもZigBee 2 MQTTもセンサーなどのデバイスがリンクしなくなりました。日曜の夕方の出来事です。玄関,廊下,階段,トイレの照明オンオフの自動化は全てZigBee接続のセンサーが担っており、暗くなる前に復旧しなければ家族からのスマートホーム化への理解はダダ下がりになるためめちゃくちゃ焦りました。IoTデバイスメーカーのエンジニアがサーバートラブル復旧の対応をしている時よりも危機感は高かったはずです(笑)
最初はOSのアップデートに問題があるのかと思いましたが、何気にSonoffのUSBドングルを抜いてHUSBZB-1のみを挿した状態でOSを再起動したところZHAが正常に動作しました。
更に検証した結果、HUSBZB-1のみを挿した状態でOSを再起動して起動後にSonoffのドングルを挿すとZHAもZigBee 2 MQTTも問題なく機能し、2つのドングルを挿した状態でOSを再起動するとZHAもZigBee 2 MQTTもどちらもデバイスがリンクしなくなることが判りました。


「面倒だけどOSを再起動する時だけSonoffのドングルを抜いとけばいいんだな、そうしよ」という強引な結論に達したのもつかの間、ある日、家中のエアコンフル稼働で電子レンジとかオーブントースターとかなんやらかんやらを使っていたらブレーカーが落ちました。
そしてブレーカーを復帰させると。。。「ああ!? ZigBee接続のセンサーが動作していない。。。」


機会が少ないとはいえ、私が家にいない時に停電しZigBee接続のセンサー類が動作しなかった時の奥様の姿を想像するだけで身震いがします。
そんなワケで悩むこと悩まないこと1ヶ月くらいが経ってしまいようやく重い腰を上げて考えた結果「SonoffのドングルがHUSBZB-1よりも先にOSに認識されているため、本来、HUSBZB-1のZ-Waveが"/dev/ttyUSB0"に割り当てされなくてはいけないのにSonoffのドングルに"/dev/ttyUSB0"に割り当てされてしまうのではないか?」という仮説を立てました。
そして、正常に稼働している時は"/dev/ttyUSB0"にHUSBZB-1(Z-Wave)、"/dev/ttyUSB1"にHUSBZB-1(ZigBee)、"/dev/ttyUSB2"にSonoffのドングルが割り当てされているのに、両方挿したまま再起動すると"/dev/ttyUSB0"にSonoffのドングルが割り当てされてしまい"DEVNAME"が入れ替わっているのを確認しました。最初に確認しろよってハナシですが(汗


だがしかし、ではデバイスと"DEVNAME"を紐づけて固定することは出来るのか?
ググると結構Raspberry Pi関連の情報が出てくるのですが、実質的にRaspberry Piを触ったことがない私には読んでもどうやったらいいのかチンプンカンプンです。
ただ、そもそも両方挿して起動すると必ずSonoffのドングルが"/dev/ttyUSB0"に必ず割り当てされるが何故なのか疑問でした。暫く考えて辿り着いた仮説は、実はSonoffのドングルを挿してあるUSBポートがHUSBZB-1を挿してあるUSBポートより優先なんじゃね?でした。


そこでRaspberry PiのUSBポート番号を調べてみました。ズバリの情報がなかなか見つけられませんでしたが、ここの記事に下記のように書かれていました。
www.raspberrypirulo.net


【Rasperry Pi 4の場合】
LANコネクタ側上 ⇒ "*/usb1/1-1/1-1.1/1-1.1:1.0/*"
LANコネクタ側下 ⇒ "*/usb1/1-1/1-1.2/1-1.2:1.0/*"
GPIOコネクタ側上 ⇒ "*/usb1/1-1/1-1.3/1-1.3:1.0/*"
GPIOコネクタ側下 ⇒ "*/usb1/1-1/1-1.4/1-1.4:1.0/*"


USB-0,USB-1・・・みたいな感じではありませんが上から順に1,2,3,4ってことでしょう。USB3.0(青)上、USB3.0(青)下、USB2.0(黒)上、USB2.0(黒)下の順で1,2,3,4のようです。
HUSBZB-1はUSB2.0(黒)下に挿してあり、SonoffのドングルはUSB2.0(黒)上に挿してあったので、3番にSonoffのドングル、4番にHUSBZB-1が挿してあったことになります。


これを入れ替えて3番にHUSBZB-1、4番にSonoffのドングルとしたところ、OSを再起動しても常に"/dev/ttyUSB0"にHUSBZB-1(Z-Wave)、"/dev/ttyUSB1"にHUSBZB-1(ZigBee)、"/dev/ttyUSB2"にSonoffドングルが割り当てされるようになりました。
これで停電に怯えることなく、ZHAとZigBee 2 MQTTを使えます。


ん!? じゃあ1番とか2番のUSB3.0ポートに何か挿すとまた入れ替わってしまうのだろうか?
まぁ何か追加する時が来たらそん時に考えればいいか。。。忘れてないといいけど(笑)


そんなワケでRaspberry Piを実質的に触ったことが無いのにHome Assistantを使っている私が、Raspberry PiのUSBポートの優先順位にハマったというお話でした。
こんなこともあるので、やっぱりRaspberry Pi 4の予備機を買ってRaspberry Pi OSを触ってみようかなとも思う今日この頃です。
早く品薄以前のような価格で買えるようになりますように。
それでは。