まえがき
以前、ラズパイで猫カメラを作りました(にゃんCAM1)。
今回は、2です。
homeassistantとTP-linkのipカメラ Tapo C200 を使って構築しました。
こっちのほうが全然簡単です笑。
にゃんCAM1
part1から8まで記事が分かれています。
全体は8を見ればわかります。
8のリンクのみ載せておきます。
にゃんCAM1からの性能アップ内容
にゃんCAM1は画像をLINEで定期送信(30分ごと)が機能でしたが、それに加えて以下を追加しました。
ほとんどカメラのデフォルトの機能ですが。
- 暗視
- 動体検知
- 動画配信
- カメラ設置の自由度向上
- 画質向上
- 簡素化
以下に詳しく記載します。
暗視
カメラのデフォルトの機能です。
IRカメラが搭載されており、周りの明るさに応じて自動でカメラが切り替わります。
暗さのしきい値を越えればIRカメラに切り替わります。
にゃんCAM1では普通のwebカメラを使っていたので、暗くなると全く映りません。
そのため、夜でも薄暗く電気をつけていました。
2ではその必要がなくなったため、にゃんこの負担も減るでしょう。
一応、にゃんCAM1でもIRのwebカメラを買って動作確認はしましたが、面倒くさくて完全導入はしていませんでした笑。
動体検知
これもカメラのデフォルト機能です。
30分ごとの撮影では良いタイミングを逃してしまうことは多々あります。
カメラの設置目的はお留守番に問題ないかな?の確認用とは言っても、あっ今ウンコ💩した!ご飯食べてる!がリアルタイムにわかるのは嬉しいです。
動画配信
これもデフォルト機能です。
あまり見ませんが、リアルタイムで見れるという安心感は大きいです。
homeassistantのオーバービューに表示していますが、外出先からはtailscale(VPN)でアクセスして確認します。
カメラ設置の自由度向上
カメラと電源コードのみなので置き場所の自由度があがります。
にゃんCAM1ではラズパイ本体とwebカメラ2台をダイソーのワイヤーネットに固定していたので大きいし、設置位置も限られました。
それが解消しました。
また、ipカメラなので、カメラが容易に増やせるのもメリットです。
簡素化
homeassistant本体(ラズパイ)はルーターボックスに常設していたWOLサーバ用ラズパイに入れたので、カメラ使用時はカメラだけ設置すれば良くなりました。
ついでにWOL機能もhomeassistantに構築しています。
後ほど紹介します。
そもそも
ここまで読んでいただいて言うのもあれですが、わざわざhomeassistantを使わなくてもtp-linkのアプリ(tapoアプリ)を使って普通に使うだけで十分高性能です。
上記した動体検知や暗視は使えますし、モバイル回線からも動画が見れます。
じゃあ何でわざわざ?なのですが、以下が理由です。
- tp-linkのサーバに動画をあげたくない
- LINEで画像を確認したい
- homeassistantで構築できる機能を使いたい
1については、モバイル回線から動画が見れている時点でtp-linkのどっかのサーバに動画が上がっているわけです。
動画のようなプライベート性の高いものを知らないサーバに上げるのは気持ちが悪いです。(それを言ったら他のクラウドサービスも一緒ですけどね)
Amazonのレビューを見ると、カメラが勝手に動いたとかtapoアプリのプライバシーポリシーには第3者が動画を見ますよ?(←よく読んでない)的なことが書いてあって同意しないとアプリを使えないとか何とか。
など諸々を考えてLANのみの運用にしました。
後ほど詳しく記載しますが、ルータの設定でtapoのインターネットアクセスを遮断しています。
WANからはtailscale(VPN)を使ってアクセスします。
2についてはにゃんCAM1の機能を維持するためです。
tapo純正ではその機能は無い(調べてない、が正しい)ので、作ることにしました。
3については、WOLやtailscaleのことです。
日々の運用方法
homeassistantは常に起動しており、WOLやtailscaleのサーバとして動作しています。
そして必要なときにカメラの電源を入れればhomeassistantから見えるようになり、監視が開始します。
カメラが不要になったら、カメラの電源を抜けばそれで終わりです。
環境
- raspi 3B+
- 32GB SDカード
失敗メモ
以下に記載したのは構築時の自分メモです。
実際は失敗したので使用していません。
当初はWOLサーバは別個で動かすことを考えていたので、素のラズパイOSにdocker上でhomeassistantを構築することを考えていました。
でもうまくいきませんでした。
後々考えるとSDカードが死んでたっぽいので、SDカードを変更すればうまく行ってたかもしれません。
Raspberry Pi OS 32bit の書き込み
Windowsにて、Raspberry Pi Imager v1.7.2で書き込み。
書き込み時に以下を設定。
- Wi-Fiは設定無し(有線で接続)
- ssh有効化
- パスワード変更
ssh接続
入ろうとしたら以下のように怒られた。
PS C:\Users\username> ssh username@ipaddress
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
以前同じipでラズパイを触っていて、今回OSを入れ直したために発生。
なので、以下を参考にしてホスト鍵を消す。
参考 :
https://qiita.com/hnw/items/0eeee62ce403b8d6a23c
PS C:\Users\username> ssh-keygen -R ipaddress
# Host ipaddress found: line 1
C:\Users\username/.ssh/known_hosts updated.
Original contents retained as C:\Users\username/.ssh/known_hosts.old
これでおk。
アップデートとか
ラズパイにssh接続していつものヤツを実施。sudo raspi-update
はプレリリース版(安定版ではない)にアップデートしてしまうのでやらない。
参考 :
https://qiita.com/takeaship/items/5861660c11d9d434368f
$ sudo apt update
$ sudo apt full-upgrade
$ sudo apt clean
Home Assistant のインストール
参考2 :
https://qiita.com/Olykoek/items/385c8c7ee6b1d2434188
OSはraspberry pi OSだが、Home Assistantも全部入りでほしいので、Home Assistant Supervised にする。
でもこれはオススメではない方法らしい。
Dockerがインストールできたことを確認。
$ docker --version
Docker version 20.10.17, build 100c701
OS-Agent
ラズパイ3B+のCPUは以下
model name : ARMv7 Processor rev 4 (v7l)
参考2と同じcpuなので、
os-agent_1.3.0_linux_armv7.deb
をダウンロード
WindowsでダウンロードしてFileZilla(FTPクライアント)でラズパイに転送。
それをラズパイ上でインストール。
Step 4: Install the Home Assistant Supervised Debian Package:
raspberrypi3 を選択
終わったら再起動。
でも起動しない。dockerがおかしい。
homeassistantOSにする(失敗)
docker構築はそうそうに諦めて、オススメの方法であるhomeassistantOSを試す。
参考 :
https://www.home-assistant.io/installation/raspberrypi
はじめは
Raspberry Pi 3 32-bit
を選択した。
SDカードに焼き終わったらこちらにアクセス :
http://homeassistant.local:8123/
アクセスでき20分くらい設定がかかる旨が書いてあったので待っていた。
その間に出かけていたが、帰ってきたら以下のエラーが表示されていた。
500 Internal Server Error
調べたが、皆突然でた、原因がわからない、で正確な解決方法が無いようだった。
なので焼き直し。今度は64bitにしてみた(64bitがrecommendedのよう)。
64bit↓
https://github.com/home-assistant/operating-system/releases/download/8.5/haos_rpi3-64-8.5.img.xz
しばらく待ったが、safariにて「ページが開けません」と出た。
pingは通るが、ラズパイの緑LEDは周期的に点滅していて、何かおかしそうな動きに見える。
ここでSDカードを変更することを思いつく。
失敗メモおわり。
homeassistantOSのインストール(成功)
SDカードを変更してやっと成功しました。
公式ではbalenaEtcherにて「Flash from URL」でOSイメージを取ってくるようにとありましたが、OSイメージは予めダウンロードしました。
これまでで何度も焼き直して時間がかかったためです
今度は20分も待たず5分程で画面が移行してちゃんと起動することが確認できました。
ふぅ。。。 手間かけやがって。
tapoを動かすには
PTZを使うにはカスタムコンポーネント(カスコン)が必要です。
PTZ : パン、チルト、ズーム
でもズームはできません!
参考:
- https://community.home-assistant.io/t/use-pan-tilt-function-for-tp-link-tapo-c200-from-home-assistant/170143
- https://github.com/JurajNyiri/HomeAssistant-Tapo-Control
カスタムコンポーネントのインストール
Copy contents of custom_components/tapo_control/ to custom_components/tapo_control/ in your Home Assistant config folder.
上記のようにtapoのカスタムコンポーネントをhomeassistantのディレクトリに入れたい。
そのためにはwindowsでダウンロードして、FileZilla(FTPクライント)で転送すれば良いと考えました。
そのためにhomeassistantにadd-onからsshを導入します。
という考えで進んでいましたが、HACSを使った方法でインストールしました。
直接カスコンをディレクトリに入れるかHACS経由で入れるかを選択できまして、最初は直接入れましたがHACSには出てきませんでした。
ですので、一旦先に入れたのは消してHACS経由で入れてみたらtapoが出ました。
Terminal & SSH の導入
参考:
とりあえずパスワードを設定するだけでwindowsPCからSSHがいけることを確認しました。
HACSを使ったインストール
HACS is a community store for Home Assistant. You can install HACS and then install Tapo: Camera Control from the HACS store.
HACSをインストール
HACS自体もカスコンです。
HACSをダウンロードします。
https://hacs.xyz/docs/setup/download
sshでHACS download scriptを実行します。
ダウンロードが完了したらhomeassistantを再起動します。
参考:
https://www.youtube.com/watch?v=zlaJrepZl2E
サイドメニューの「設定」→「デバイスとサービス」→「統合を追加」→「HACS を検索」 4つ全部チェックし、githubとHACSを関連付けします。
サイドメニューにHACSが追加されます。成功!
install Tapo: Camera Control from the HACS store.
サイドメニューの「HACS」→「Integrations」→「右下のプラスマーク」→「camera」でサーチすると
Tapo: Cameras Control
があるので、ダウンロードします
3.7.2
っとここに来るまでに、カメラはtapoアプリで一旦設定を済ませておきipアドレスが付与されるところまで準備しておきます。(つまり普通に使える状態にしておく)
この時点ではカメラはまだWANに出てしまっています。
カメラの発見
ふたたびtapoアプリを開きカメラアカウントを作成します。
このアカウントはtp-linkのアカウントではなく、nasに画像を保存できるやつです。
設定しダッシュボードにカメラ映像が表示されました。
PTZも動作しました。
にゃんCAM2としての実装
tapoの準備ができたので、実装です。
tapoのipアドレスを固定
変わるとhomeassistant側でエラーになるので固定します。
私の環境では、ルーターで固定しました。
ルーターはsynologyのMR2200acを使っています。
ルーターにログインしてネットワークセンター ローカルネットワーク DHCPクライアントタブでtapoのipアドレスが表示されているので選択してから「アドレス予約に追加」をクリックします。
これがipを固定することに相当します。
クリックしたのちDHCP予約タブを見てtapoのipが入っていればおkです。
tapoのwanへの通信を遮断する(LANだけで運用)
理由はすでに書いたとおりです。
ルーターで、tapoのwanへの通信を遮断する設定をします。
MR2200acにログインし、ネットワークセンター トラフィックコントロール 全般タブからtapoを探します。
地球にバツがついたマークを押します。
これがインターネット接続を拒否する設定です。
最初は、ファイアウォールでtapoのipを遮断しようと思っていましたが、これで簡単にできました。
モバイル回線からは繋がらなくなり、wi-fiからはつながったのでwanは遮断できlanのみの運用ができます。
LINE Notify
参考:
https://sympapa.hatenablog.com/entry/2021/10/30/084303
動体検知した際にtapoでスクショを撮って、それをLINEで送信します。
pythonで書いてスクリプト実行しようと思っていましたが、home assistantから扱えるようなので使用しました。
参考:
https://github.com/maxmacstn/HA-Line-Notify
Windowsでnotify_lineフォルダをダウンロードして、FileZillaでラズパイのcustom_componentsフォルダにアップロードしました。
その後homeassistantを再起動します。
スナップショットは保持するつもりはないので、全部同じ名前になるように以下のようにしました。
/media/snapshot.jpg
30分定期送信用、動体検知用をスクリプトでわけて、automationで実行しています。
スクリプトを分けたのはlineのメッセージを定期送信と動体検知で分けたかったからです。
なのでscriptの中身はほぼ同じです。
(aliasは分けるために違います)
# scripts.yaml
alias: Take snap Periodically
sequence:
- service: camera.snapshot
data:
filename: /media/snapshot.jpg
target:
entity_id:
- camera.tapo_camera_7542_hd
- delay:
hours: 0
minutes: 0
seconds: 1
milliseconds: 0
- service: notify.line_notification
data:
data:
file: /media/snapshot.jpg
message: 30分ごと定期送信
mode: single
# 30分定期送信用
# automation.yaml
alias: 30分ごと送信
description: ""
trigger:
- platform: time_pattern
minutes: "30"
- platform: time_pattern
minutes: "0"
condition: []
action:
- service: script.take_snap
data: {}
mode: single
# 動体検知用
# automation.yaml
alias: 動体検知送信
description: ""
trigger:
- platform: state
entity_id:
- binary_sensor.tapo_camera_7542_motion
condition: []
action:
- service: script.take_snap_2
data: {}
mode: single
# configuration.yaml
notify:
- name: line_notification
platform: notify_line
access_token: 'XXXX' # あなたのtoken
tapoの表示時間がずれる問題
tapoをWANから遮断したためNTPサーバと同期がとれなくなり時間がずれるようですが、私が使っているtapoのカスコンのバージョンは自動的に同期してくれるはずです。
ですが、それでもズレてしまいます。
プラグインの再読み込みで直るので、毎日夜の再起動後とカメラ接続後に再読み込みを実施するようにしました。
スクリプトで書いて、automationやボタン押下で実行します。
参考:
https://github.com/JurajNyiri/HomeAssistant-Tapo-Control/issues/119
# ボタンカード
show_name: true
show_icon: true
type: button
tap_action:
action: call-service
service: script.1662263621826
data: {}
target: {}
entity: input_button.input_button
icon: mdi:reload
name: Tapo接続後reload
show_state: false
theme: clear
hold_action:
action: none
# scripts.yaml
sequence:
- service: homeassistant.reload_core_config
data: {}
- service: homeassistant.restart
data: {}
mode: single
alias: リロード
# automation.yaml
alias: Tapo reload
description: 時間がずれるのでリロード
trigger:
- platform: time
at: "03:20:00"
condition: []
action:
- service: script.1662263621826
data: {}
mode: single
tapo関係以外
全く関係ないわけでも無いですが、tapo以外にhomeassistantに導入したものも合わせて紹介します。
ラズパイのCPU温度と周波数の表示
参考:
https://www.home-assistant.io/integrations/sensor.command_line
参考を見ると、温度はファイルを読んでいるので、周波数も同じように行けるだろうと思いやったら表示できました。
やり方は以下を参照ください。
Wake On Lan(WOL)
DS118があるのでwolを導入しました。
これで以前のWOLサーバの代わりになりました。
シャットダウンもできそうなのですが、DS118とのssh許可とコマンドの送付が必要で面倒だったので未実装です。
参考:
- https://www.home-assistant.io/integrations/wake_on_lan/
- https://community.home-assistant.io/t/switch-creation-wake-on-lan/367200/2
NASは起動に時間がかかるため、起動状態を表示するエンティティはスイッチONしてもすぐにはONになりません。
これではちゃんと起動したのがどうか不安になります。
そこで起動は押しボタンでワンショットおして「Button Pressed!起動中!」みたいなメッセージ通知をだし、ステートは別で表示することにしました。
Input Buttonを使っています。
automationと組み合わせています。
参考:
https://www.home-assistant.io/integrations/input_button/
水平スタックカードで左右にオンオフのステータス、wolボタンを配置しています。
ボタンを押したときの動作は押したことの通知とwolの2つを行いたかったのですが一つしかできない様子です。
なので、automationのアクションで通知とwolを実現し、ボタンを押したときにはこのautomationを実行するようにしました。
automationはアクションだけ設定しています。
# 水平スタックカード
type: horizontal-stack
cards:
- show_name: true
show_icon: true
type: button
entity: input_button.ds118wol
show_state: true
theme: clear
tap_action:
action: call-service
service: automation.trigger
data: {}
target:
entity_id: automation.ds118_wol
hold_action:
action: none
icon: ''
- type: entity
entity: switch.ds118
theme: clear
icon: mdi:nas
# automation.yaml
alias: DS118 WOL
description: ""
trigger: []
condition: []
action:
- service: notify.notify
data:
message: DS118 booting ⚡
title: ⚡WOL⚡
- service: switch.turn_on
data: {}
target:
entity_id: switch.ds118
mode: single
# configuration.yaml
wake_on_lan:
switch:
- platform: wake_on_lan
mac: "XX-XX-XX-XX-XX-XX"
name: "DS118"
host: "XXX.XXX.X.X"
input_button:
ds118wol:
name: DS118 wol
定期再起動
ラズパイの安定性確保のために、毎日再起動させます。
automationに記載しました。
# automation.yaml
alias: reboot at am3:00
description: ""
trigger:
- platform: time
at: "03:10:00"
condition: []
action:
- service: hassio.host_reboot
data: {}
mode: single
tailscale(VPN)
tailscaleはいくつか表示されますが、stateが表示されるだけで外から接続できないものもあります。
参考1:
https://github.com/hassio-addons/repository/tree/master/tailscale
参考2:
https://github.com/tsujamin/hass-addons/blob/main/tailscale/DOCS.md
参考1はadd-onに表示されるものです。
これは外部から接続できました。
デフォルトでexit nodeが有効になっていました。
tailscaleのadmin consoleでexit nodeとsubnet routerを有効にしまして、
モバイル回線からlanのhomeassistantに接続できました。
tapoのカメラ映像も見れました。
参考2は1がだめだったら試そうとしていたため、試していません。
google driveにバックアップ
参考:
https://github.com/sabeechen/hassio-google-drive-backup
バックアップ頻度は毎日としています。
エラー
HACS is disabled - Ratelimited
このエラーが出ていました。
そんなにapiをコールした覚えはないのですが。
設定はアップデートしたらfalseに戻ってしまう様子です。
なのでアップデート後は再確認する必要があります。
HACSをアップデートし、何度かhomeassitantを再起動したらエラーが消えたのでこれはやっていません。
もしかして、HACSのアップデート通知が何度も通信してapiのratelimitを超えたとか?かもしれません。
なのでアップデートしたから解消したのかもしれません。
参考:
- https://community.home-assistant.io/t/github-rate-limit-error-hacs/229709/118
- https://hacs.xyz/docs/configuration/options/
- https://github.com/hacs/integration/issues/1864#issuecomment-858135207
- https://github.com/hacs/integration/issues/1864#issuecomment-865450376
以上😀