Home Assistantの最大の魅力ともいっていい、1画面にカメラ映像を複数個表示できるので便利でタブレットを壁に貼り付けて家全体の様子をチェックするのにも役立つ。
IPカメラはメーカーのクラウドにアクセスして、録画をサービスとして販売するメーカーが多く、一定時間以上の録画は買うしか無いのが残念なところ。
その点で、Home AssistantにIPカメラを接続しておけばモーション動画を表示したりサーバーに接続しないで、ストリーミングしたりできるのも魅力。
(これから紹介するYi-Hackの場合はモーションセンサーが反応したら自動でMicroSDに動画を保存してくれます。)
こちらのカメラを買おうと思いますが・・・賃貸マンションなのでちょっと圧迫感があって、必要ないかなぁ?といったところ。
こちらのE560PoEがHome Assistantで使えるみたい。Aliexpressで1.6万円弱
新しいIPカメラを買わなくても、今ある安いIPカメラでも十分そうなのでまずはハックしてHome Assistantで使えるようにしてみます。
Yi home 1080P ファームウェア導入
ウチの玄関で使っている数年前に20ドル弱で買ったYi home 1080PをハックしてHome assistantで使えるようにしてみます。
ハックした結果、今まで通りYi LiteアプリやPCで使えるYi Homeアプリでカメラが使えます。
PC用のYi Homeアプリのダウンロードページ↑
この作業はファームウェアを書き換える必要があるので、ちょっと敷居が高いのですが、カスタムファームウェアが入ったMicroSDカードを引き抜けば今まで通りのカメラとして使えるとのこと。(未確認)
ではファームウエアを導入してみます。
Yi home 1080Pの状態
まずはYi Liteアプリの設定から情報を取得しておく。
IPアドレスとファームウェアバージョンをメモしておきます。
カスタムファームウェアがどれか調べる
自分の使っているYiカメラはYi home 1080Pのようで、先ほど調べたファームウェアのバージョンが12.2.0.2_2022xxxxなので、以下の4つのうちどれかだと推測する。
カスタムファームウェアはy20gaを使えば良いということですね。
バックアップ
現状に復帰させるためにバックアップもできるようですがうまく動かなかった、というよりバックアップするものがなかったのかもしれません。
backup.tar.gzをダウンロードして、解凍後に、backupフォルダか、その中のFactoryフォルダか、その中のファイルをMicroSDカードのトップにコピーしてカメラを起動しましたが、3通りやってもバックアップできなかった。
2つのファイルとMicroSDカードトップにコピーしてもバックアップできなかった。
MicroSDカードをYi Liteアプリでフォーマット
カスタムファームウェアを書き込む前に、MicroSDをYi Liteアプリでフォーマットします。
(Yi Homeカメラは6秒以上の録画を見る場合は有料のプレミアムクラウドサービスを購入する必要がある。どのIPカメラも同様に有料サービスがあるのが不満。)
Yi Lite > 設定 > マイクロSDカード でフォーマットします。
カスタムファームウェア ダウンロード・MicroSDにコピー
先ほど確認したy20gaをダウンロードします。
このページからy20ga_0.3.8.tgzをダウンロードした。
MicroSDカードをフォーマット後に↓この2つのフォルダがあったので削除した。
y20ga_0.3.8.tgzを解凍した中身↓
Factoryフォルダのconfigure_wifi.cfg.oriをconfigure_wifi.cfgに変更して開いて編集。
以下の2項目の白い部分を自分のWifi SSID・パスワードに変更する。
編集が終わったらFactory,newhomeの2つのフォルダとhome_y20gam.stageファイルをMicroSDトップにコピー。
Webページで確認
WebブラウザでカメラのIPアドレスhttp://192.168.31.229にアクセスすると↓このようになってハック成功している。
画像アイコンタブで画像ですが、スナップショットも表示される。
このページでFTPやMQTTの設定も可能だが今回はデフォルトのままいじらなかった。
(MQTTもあるのだが、今のところHome Assistantの設定方法が分からない。)
モーションセンサーが反応して録画される
カメラのモーションセンサーが反応して録画された動画は↓Eventsのページで見ることができる。
しばらくしないと録画されたデータは表示されないので、少し待つ。
Home Assistant側での動体検知で録画は未検証ですが、これがあれば必要ないっぽい。
rootパスワード設定
カメラのIPアドレスにtelnetでログインしたrootパスワードを設定します。
今回はWindows PCのLinuxシェルを起動して操作した。
telnet 192.168.31.229
root
デフォルトでパスワード無し、エンター押せばOK
passwd #rootのパスワード設定コマンド
2回 新しいパスワードを入力
これでYi home 1080Pカメラ側の設定完了。
時刻をあわせたらリブートする
日本の時間にするには「JST-9」を入力して、リブートする必要があった。
時刻を設定したらMaintenanceページでReboot Cameraボタンを押す。
Statusのページで↓正しい時間か確認する。
他の設定もリブートしないと反映されなかった。
Yi home 1080PをHome assistantで使う
configuration.yamlの設定
Home assistantのconfiguration.yamlの設定も必要
まずは、テスト的に10秒ごとに更新する画像を表示させるようにしてみる。
camera:
- platform: yi
name: Camera
host: "192.168.31.229"
password: パスワード
path: /media/mmcblk0p1/record
ffmpeg_arguments: "-vf scale=800:450"
この設定で終わりでも十分かもしれない。リアルタイムなストリーミング動画を表示させたい場合は、さらに次の項目(RTSPストリーミングも遅延あり)で設定が必要です。
カスタムコンポーネント yi-hack 導入
HACS(左メニュー)からyi-hackをダウンロードします。
検索窓に「yi_hack」と入力するとyi-hack Home Assistant integrationが出てくるのでクリックして右下のDownloadボタンでダウンロード。
yi_hack インテグレーション追加
設定 > デバイスとサービス >+統合を追加(右下)を押して新しい統合の設定で「yi-hack」を検索すると出てくるのでクリック。
カメラのIPアドレス、名前はroot、先ほどTelnetで設定したrootのパスワードを入力して送信。
登録後、Yi Home Cameras with yi-hackのデバイスの画面を見ると↓センサーやカメラ画像が表示されました♪
最初はセンサーも↑たくさん使えるみたい。
オーバービューに追加
上記画像のセンサー部分の「ダッシュボードに追加」ボタンを押してオーバービューに追加してみましょう。
ちょっと不安定で、画像は10秒に1回更新で、画像が映らない時がある。
画像は映らない時があるが、しばらくしたらセンサー類は有効になった。
RTSPストリーミングでHome Assistantに追加
ストリーミングはYI-HACKのトップページ↓RTSPのURLがあってVLCでアクセスしたらストリーミング映像がでてきた。
結論から言うと、このRTSPストリーミングとHome Assistantの汎用カメラでストリーミングを表示させると、映像の途切れが少なく良好です。(ただ、1~8秒ほどの映像の遅延があります。)
こちらはyi-hackインテグレーション(統合)が必要
rtsp://192.168.31.229/ch0_0.h264にアクセスするとストリーミング映像が見れる。
Snapshotは表示されないか、表示されるが非常に遅い。
VLCで確認
WindowsのVLCで確認する。
メディア > ネットワークストリームを開くで、先ほどのrtsp://192.168.31.229/ch0_0.h264を入力して送信する。
このような動画が表示される。
このRTSPを使えばHome Assistantでもストリーミング映像を表示することができそう。
Home Assistantの設定
設定 >デバイスとサービス >+統合を追加(右下)でgenericと検索して汎用カメラを選択。
RTSPトランスポートプロトコルは適当に、HTTPだとタイムアウトしにくい。他のだとなかなかストリーミングデータを取得できずにタイムアウトしやすい。
あとは1デバイス部分を押して「ダッシュボードに追加」を押すと玄関カメラ映像が表示されます。
WebRTC+go2rtcでストリーミング
WebRTCインテグレーションとgo2rtcアドオンをインストールすると、カメラ映像をストリーミングできました。
go2rtc アドオン導入
go2rtcは、RTSP, RTMP, HTTP, WebRTCなどの様々なプロトコルに対応したカメラストリーミングアプリ。
アドオンにリポジトリを登録しないとインストールできないのですが、ちょっとややこしいので、上記ページの真ん中あたりにある以下のボタンを押してリポジトリを登録する。
左下のほうにインストールボタンがあるので押す。
インストール後、開始ボタンが表示されるので開始。
カメラのエンティティIDをメモ
ここでカメラのエンティティIDをメモしておきます。
go2rcをインストール・起動した時点でYi_hackのエンティティにあるカメラがストリーミングに変わっているようです。
設定 >デバイスとサービス >Yi Home Cameras with yi-hackを選択してエンティティを選ぶ。
カメラアイコン(motion_detection Camじゃないやつ)↑を選ぶと↓ストリーミング映像が表示されるので、設定アイコンをクリック。
エンティティIDの右にあるコピーを押してエンティティIDをメモしておきます。
WebRTCカスタムコンポーネント 導入
HACSでWebRTC導入
続いてWebRTCも導入する。
HACSの検索窓にWebRTCと入力すると出てくる。
統合でWebRTCを追加
設定 > デバイスとサービス > +統合を追加(右下)からWebRTCを検索して追加します。
frigate-hass-cardカード導入
WebRTCで紹介されていたストリーミングを表示してくれるカスタムカードを紹介します。
HACSでfrigate-hass-cardと検索すれば出てくるので、右下のDownloadボタンを押す。
オーバービューにカードを追加
オーバービュー > 鉛筆アイコン(右上) > + カードを追加(右下)でカスタム:Frigate cardを選択します。
あとは、Camera Entityの部分に先ほどメモしたエンティティIDを入力したらストリーミング開始される。
ストリーミング成功しましたが・・・ほとんど鳥(かもめ?)の画像になってなかなかストリーミング映像が表示されない。
ストリーミングも画像もあまり表示されない↑ので使えないかなぁ、といったところ。
今のところは汎用カメラのほうがちゃんとストリーミング表示される。
Raspberry pi 3B・4BでRTSPストリーミングでHome Assistantに登録
ここからはRaspberry Piのカメラをストリーミングして映像をHome Assistantで見れるようにしていきます。
まずは簡単なRaspberry pi 3B・4BでRTSPストリーミングしてみます。
Raspberry pi 5でも同じようにストリーミングしたいのですが、やってみた結果、重い。(下のほうでちょと紹介してます。)
Raspberry Pi 作業バージョン
まずはバージョンチェック
Raspberry Pi 4B
$ lsb_release -a
No LSB modules are available.
Distributor ID: Debian
Description: Debian GNU/Linux 12 (bookworm)
Release: 12
Codename: bookworm
Raspberry Pi 3B
Raspi3Bも最新にした。
$ lsb_release -a
No LSB modules are available.
Distributor ID: Raspbian
Description: Raspbian GNU/Linux 11 (bullseye)
Release: 11
Codename: bullseye
カメラ有効化
Raspi4B(Debian 12 (bookworm))は必要ない。
sudo raspi-config
3 Interfacing Options > P1 Camera > Yes
v4l2rtspserver インストール
sudo apt-get install cmake
git clone https://github.com/mpromonet/v4l2rtspserver
cd v4l2rtspserver
cmake . && make
sudo make install
カメラが認識されているか確認
Raspi3B
$ v4l2-ctl --list-devices
bcm2835-codec-decode (platform:bcm2835-codec):
/dev/video10
/dev/video11
/dev/video12
/dev/video18
/dev/video31
/dev/media2
bcm2835-isp (platform:bcm2835-isp):
/dev/video13
/dev/video14
/dev/video15
/dev/video16
/dev/video20
/dev/video21
/dev/video22
/dev/video23
/dev/media0
/dev/media1
mmal service 16.1 (platform:bcm2835_v4l2-0):
/dev/video0
Raspi4B
$ v4l2-ctl --list-devices
bcm2835-codec-decode (platform:bcm2835-codec):
/dev/video10
/dev/video11
/dev/video12
/dev/video18
/dev/video31
/dev/media2
bcm2835-isp (platform:bcm2835-isp):
/dev/video13
/dev/video14
/dev/video15
/dev/video16
/dev/video20
/dev/video21
/dev/video22
/dev/video23
/dev/media0
/dev/media1
mmal service 16.1 (platform:bcm2835_v4l2-0):
/dev/video0
rpivid (platform:rpivid):
/dev/video19
/dev/media3
どんなフォーマットに対応しているかチェックできる。
v4l2-ctl --list-formats
ioctl: VIDIOC_ENUM_FMT
Type: Video Capture
[0]: 'YU12' (Planar YUV 4:2:0)
[1]: 'YUYV' (YUYV 4:2:2)
[2]: 'RGB3' (24-bit RGB 8-8-8)
[3]: 'JPEG' (JFIF JPEG, compressed)
[4]: 'H264' (H.264, compressed)
[5]: 'MJPG' (Motion-JPEG, compressed)
[6]: 'YVYU' (YVYU 4:2:2)
[7]: 'VYUY' (VYUY 4:2:2)
[8]: 'UYVY' (UYVY 4:2:2)
[9]: 'NV12' (Y/UV 4:2:0)
[10]: 'BGR3' (24-bit BGR 8-8-8)
[11]: 'YV12' (Planar YVU 4:2:0)
[12]: 'NV21' (Y/VU 4:2:0)
[13]: 'RX24' (32-bit XBGR 8-8-8-8)
Raspi3B
$ v4l2-ctl -d /dev/video0 --list-formats-ext
ioctl: VIDIOC_ENUM_FMT
Type: Video Capture
[0]: 'YU12' (Planar YUV 4:2:0)
Size: Stepwise 32x32 - 3280x2464 with step 2/2
[1]: 'YUYV' (YUYV 4:2:2)
Size: Stepwise 32x32 - 3280x2464 with step 2/2
[2]: 'RGB3' (24-bit RGB 8-8-8)
Size: Stepwise 32x32 - 3280x2464 with step 2/2
[3]: 'JPEG' (JFIF JPEG, compressed)
Size: Stepwise 32x32 - 3280x2464 with step 2/2
[4]: 'H264' (H.264, compressed)
Size: Stepwise 32x32 - 3280x2464 with step 2/2
[5]: 'MJPG' (Motion-JPEG, compressed)
Size: Stepwise 32x32 - 3280x2464 with step 2/2
[6]: 'YVYU' (YVYU 4:2:2)
Size: Stepwise 32x32 - 3280x2464 with step 2/2
[7]: 'VYUY' (VYUY 4:2:2)
Size: Stepwise 32x32 - 3280x2464 with step 2/2
[8]: 'UYVY' (UYVY 4:2:2)
Size: Stepwise 32x32 - 3280x2464 with step 2/2
[9]: 'NV12' (Y/UV 4:2:0)
Size: Stepwise 32x32 - 3280x2464 with step 2/2
[10]: 'BGR3' (24-bit BGR 8-8-8)
Size: Stepwise 32x32 - 3280x2464 with step 2/2
[11]: 'YV12' (Planar YVU 4:2:0)
Size: Stepwise 32x32 - 3280x2464 with step 2/2
[12]: 'NV21' (Y/VU 4:2:0)
Size: Stepwise 32x32 - 3280x2464 with step 2/2
[13]: 'RX24' (32-bit XBGR 8-8-8-8)
Size: Stepwise 32x32 - 3280x2464 with step 2/2
Raspi4B
$ v4l2-ctl -d /dev/video0 --list-formats-ext
ioctl: VIDIOC_ENUM_FMT
Type: Video Capture
[0]: 'YU12' (Planar YUV 4:2:0)
Size: Stepwise 32x32 - 2592x1944 with step 2/2
[1]: 'YUYV' (YUYV 4:2:2)
Size: Stepwise 32x32 - 2592x1944 with step 2/2
[2]: 'RGB3' (24-bit RGB 8-8-8)
Size: Stepwise 32x32 - 2592x1944 with step 2/2
[3]: 'JPEG' (JFIF JPEG, compressed)
Size: Stepwise 32x32 - 2592x1944 with step 2/2
[4]: 'H264' (H.264, compressed)
Size: Stepwise 32x32 - 2592x1944 with step 2/2
[5]: 'MJPG' (Motion-JPEG, compressed)
Size: Stepwise 32x32 - 2592x1944 with step 2/2
[6]: 'YVYU' (YVYU 4:2:2)
Size: Stepwise 32x32 - 2592x1944 with step 2/2
[7]: 'VYUY' (VYUY 4:2:2)
Size: Stepwise 32x32 - 2592x1944 with step 2/2
[8]: 'UYVY' (UYVY 4:2:2)
Size: Stepwise 32x32 - 2592x1944 with step 2/2
[9]: 'NV12' (Y/UV 4:2:0)
Size: Stepwise 32x32 - 2592x1944 with step 2/2
[10]: 'BGR3' (24-bit BGR 8-8-8)
Size: Stepwise 32x32 - 2592x1944 with step 2/2
[11]: 'YV12' (Planar YVU 4:2:0)
Size: Stepwise 32x32 - 2592x1944 with step 2/2
[12]: 'NV21' (Y/VU 4:2:0)
Size: Stepwise 32x32 - 2592x1944 with step 2/2
[13]: 'RX24' (32-bit XBGR 8-8-8-8)
Size: Stepwise 32x32 - 2592x1944 with step 2/2
ストリーミングテスト
画像サイズ640×480にした。大きくするとRaspberry Piの負担になりそう。
v4l2rtspserver -W 640 -H 480 -F 15 -P 8554 /dev/video0
log level:500
[NOTICE] /home/go/v4l2rtspserver/main.cpp:247
Version: 0.3.8-5-ge2ad168 live555 version:2024.02.15
[NOTICE] /home/go/v4l2rtspserver/src/V4l2RTSPServer.cpp:37
Create V4L2 Source.../dev/video0
[NOTICE] /home/go/v4l2rtspserver/libv4l2cpp/src/V4l2Device.cpp:133
driver:bcm2835 mmal capabilities:85200005 mandatory:4000001
[NOTICE] /home/go/v4l2rtspserver/libv4l2cpp/src/V4l2Device.cpp:136
/dev/video0 support capture
[NOTICE] /home/go/v4l2rtspserver/libv4l2cpp/src/V4l2Device.cpp:138
/dev/video0 support read/write
[NOTICE] /home/go/v4l2rtspserver/libv4l2cpp/src/V4l2Device.cpp:139
/dev/video0 support streaming
[ERROR] /home/go/v4l2rtspserver/libv4l2cpp/src/V4l2Device.cpp:212
/dev/video0: Cannot set pixelformat to:HEVC format is:YU12
[NOTICE] /home/go/v4l2rtspserver/libv4l2cpp/src/V4l2Device.cpp:225
/dev/video0:H264 size:640x480 bufferSize:307200
[NOTICE] /home/go/v4l2rtspserver/libv4l2cpp/src/V4l2Device.cpp:246
fps:1/15
[NOTICE] /home/go/v4l2rtspserver/libv4l2cpp/src/V4l2Device.cpp:247
nbBuffer:1
[NOTICE] /home/go/v4l2rtspserver/libv4l2cpp/src/V4l2MmapDevice.cpp:49
Device /dev/video0
[NOTICE] /home/go/v4l2rtspserver/libv4l2cpp/src/V4l2MmapDevice.cpp:73
Device /dev/video0 nb buffer:10
[NOTICE] /home/go/v4l2rtspserver/src/V4l2RTSPServer.cpp:62
Create Source .../dev/video0
[NOTICE] /home/go/v4l2rtspserver/src/V4L2DeviceSource.cpp:96
begin thread
[NOTICE] /home/go/v4l2rtspserver/inc/BaseServerMediaSubsession.h:49
format:video/H264
[NOTICE] /home/go/v4l2rtspserver/inc/V4l2RTSPServer.h:275
アクセスがあると以下のように表示される。
handleCmd_SETUP:SETUP rtsp://192.168.31.54:8554/unicast/track1 RTSP/1.0
CSeq: 4
User-Agent: LibVLC/3.0.20 (LIVE555 Streaming Media v2016.11.28)
Transport: RTP/AVP/TCP;unicast;interleaved=0-1
(カメラやケーブルが壊れている場合は、VLCでアクセスできるが、真っ黒で動画は表示されない。)
VLCで以下のアドレスで表示するとうまく映像が表示された。
rtsp://192.168.31.54:8554/unicastにアクセスする。
User-Agent: LibVLC/3.0.20 (LIVE555 Streaming Media v2016.11.28)の部分がVLCでアクセスした時に表示される。
systemdで自動起動設定
うまくいったら自動的にRTSPストリーミング開始するように設定。
sudo vim /etc/systemd/system/v4l2rtspserver.service
[Unit]
Description=V4L2 RTSP server
After=network.target
[Service]
ExecStart=/usr/local/bin/v4l2rtspserver -W 640 -H 480 -F 15 -P 8554 /dev/video0
Restart=always
[Install]
WantedBy=multi-user.target
上記を書いたら↓スタートする。
sudo systemctl enable v4l2rtspserver
sudo systemctl start v4l2rtspserver
sudo systemctl status v4l2rtspserver
Home Assistantの設定
今のところ一番まともにカメラ映像を表示してくれる汎用カメラを使います。
configuration.yamlでは設定せずに統合から追加します。
設定 >デバイスとサービス >+統合を追加(右下)でgenericと検索して汎用カメラを選択。
汎用カメラが一番動画が途切れずに表示してくれる気がする。
上画像の1デバイス部分を押して↓「ダッシュボードに追加」を押すとRaspi3Bのカメラ映像が表示されます。
カードのコードは以下のようになってました。
show_state: true
show_name: true
camera_view: auto
type: picture-entity
entity: camera.192_168_31_54
遅延は1~8秒くらいといったところ。
オーバービューはこのようになりました。↓
Raspberry pi 5 カメラが動作するまで
2024/2の現状では、Raspberry Pi 5でカメラを使えるまではなかなか難しいみたい。
GUIの状態でカメラを動作させてみます。
config.txtに追記
ここを参考にV2カメラはimx219とうことで、config.txtの一番下に追加する。(最近のRaspberry Piのconfig.txtは/boot/firmware/config.txtに変わったみたい。)
sudo vim /boot/firmware/config.txt
最下部
dtoverlay=imx219
ファームウェア ダウングレード
このままではうまく動かないのでファームウェアをダウングレードする必要があった。
sudo rpi-update stable
↓
sudo rpi-update d16727d
動くかチェック
以下を実行すると新しいウィンドウが開いてカメラ映像が10秒ほど表示される。
libcamera-hello
Raspi5:rpicam-vidでストリーミング 未完
Raspi5のGUIで「rpicam-vid -t 0 –inline -o – –libav-format=h264」とするとウィンドウが出てきてカメラ映像が表示される。
これをストリーミング配信する。
rpicam-vid --camera 0 --framerate 15 --hdr --timeout 0 --nopreview --codec h264 --libav-video-codec h264 --libav-format h264 --inline -o - | ffmpeg -i - -f mjpeg tcp://0.0.0.0:5000?listen
VLCで「tcp://192.168.31.53:5000」にアクセスするとストリーミング動画が表示された。
Raspi5のCPU、ffmpeg9~14%くらい、rpicam-vidも最大9~12%ほど合計で常時20%ほど消費してしまう。
VLCでは動画表示できたけど、Home Assistantの汎用カメラ(設定 > 統合 >+統合を追加でgeneで検索)ではなぜか受信できなかった。
RTSPトランスポートプロトコルはTCP/UDP/UDP Multicast/HTTPのどれにしてもタイムアウトする。
Raspberry Pi 5のカメラは、しばらく良い方法がネットに上がってくるまで放置しておく。
コメント