まえがき

以前、ラズパイで猫カメラを作りました(にゃんCAM1)。
今回は、2です。
homeassistantとTP-linkのipカメラ Tapo C200 を使って構築しました。
こっちのほうが全然簡単です笑。

にゃんCAM1

part1から8まで記事が分かれています。
全体は8を見ればわかります。
8のリンクのみ載せておきます。

にゃんCAM1からの性能アップ内容

にゃんCAM1は画像をLINEで定期送信(30分ごと)が機能でしたが、それに加えて以下を追加しました。
ほとんどカメラのデフォルトの機能ですが。

  1. 暗視
  2. 動体検知
  3. 動画配信
  4. カメラ設置の自由度向上
  5. 画質向上
  6. 簡素化

以下に詳しく記載します。

暗視

カメラのデフォルトの機能です。
IRカメラが搭載されており、周りの明るさに応じて自動でカメラが切り替わります。
暗さのしきい値を越えればIRカメラに切り替わります。
にゃんCAM1では普通のwebカメラを使っていたので、暗くなると全く映りません。
そのため、夜でも薄暗く電気をつけていました。
2ではその必要がなくなったため、にゃんこの負担も減るでしょう。

一応、にゃんCAM1でもIRのwebカメラを買って動作確認はしましたが、面倒くさくて完全導入はしていませんでした笑。

動体検知

これもカメラのデフォルト機能です。
30分ごとの撮影では良いタイミングを逃してしまうことは多々あります。
カメラの設置目的はお留守番に問題ないかな?の確認用とは言っても、あっ今ウンコ💩した!ご飯食べてる!がリアルタイムにわかるのは嬉しいです。

動画配信

これもデフォルト機能です。
あまり見ませんが、リアルタイムで見れるという安心感は大きいです。
homeassistantのオーバービューに表示していますが、外出先からはtailscale(VPN)でアクセスして確認します。

カメラ設置の自由度向上

カメラと電源コードのみなので置き場所の自由度があがります。
にゃんCAM1ではラズパイ本体とwebカメラ2台をダイソーのワイヤーネットに固定していたので大きいし、設置位置も限られました。
それが解消しました。
また、ipカメラなので、カメラが容易に増やせるのもメリットです。

簡素化

homeassistant本体(ラズパイ)はルーターボックスに常設していたWOLサーバ用ラズパイに入れたので、カメラ使用時はカメラだけ設置すれば良くなりました。
ついでにWOL機能もhomeassistantに構築しています。
後ほど紹介します。

そもそも

ここまで読んでいただいて言うのもあれですが、わざわざhomeassistantを使わなくてもtp-linkのアプリ(tapoアプリ)を使って普通に使うだけで十分高性能です。
上記した動体検知や暗視は使えますし、モバイル回線からも動画が見れます。
じゃあ何でわざわざ?なのですが、以下が理由です。

  1. tp-linkのサーバに動画をあげたくない
  2. LINEで画像を確認したい
  3. 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 のインストール

参考 :
https://smartlife99.netlify.app/home-assistant%E3%82%92%E4%BD%BF%E3%81%88%E3%82%8B%E3%82%88%E3%81%86%E3%81%AB%E3%81%99%E3%82%8B%E3%81%BE%E3%81%A7-%E3%81%9D%E3%81%AE-4

参考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 : パン、チルト、ズーム
でもズームはできません!

参考:

カスタムコンポーネントのインストール

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許可とコマンドの送付が必要で面倒だったので未実装です。

参考:

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を超えたとか?かもしれません。
なのでアップデートしたから解消したのかもしれません。

参考:

以上😀