本篇文档采用两种摄像头接入HomeAssistant,并接入HomeKit。
一种是使用安信可的ESP32-CAM,通过ESPHome编辑配置文件并刷入固件,然后接入HomeKit,但这种方式没有较好的分辨率,不能串流至HomeKit,且不具备较多的功能。如果是通过Arduino编程,烧录官方示例的Camera WebServer等项目,是可以RTSP串流的,也可以开发其他的功能。
另一种是采用旧手机作为IP摄像头,iOS端可以使用App Store下载的IP摄像头(国人编写的基础版即可),Android端可以使用Google Play 商店的IP摄像头App,不仅能从Web访问进行控制和配置修改,还可以将控制按钮传入Home Assistant和HomeKit。
1 ESP32-CAM 接入ESPHome
我使用安信可的ESP32-CAM的开发板作为IP摄像头,通过ESPHome编程烧录固件,最终接入HA与HomeKit。
买安信可的ESP32尽量到安信可的官方旗舰店购买,避免买到冒牌货。
ESP32-CAM可以采用Arduino编程,也可以采用较简单的ESPHome,通过编写配置文件烧录固件。不过通过ESPHome接入HA能实现功能较为简单,不如自己编程有可玩性。
这里只展示通过ESPHome接入HA的方案。
ESPHome配置
安信可ESP32-CAM摄像头的配置,包括在GPIO_4
的LED灯和在GPIO_13
的运动传感器。
安信可的摄像头配置参照ESPHome文档的配置1,如不同的摄像头类型请对照官网自行修改。
esphome:
name: esp32-cam
esp32:
board: esp32dev
framework:
type: arduino
# Enable logging
logger:
# Enable Home Assistant API
api:
reboot_timeout: 0s
ota:
password: "1"
wifi:
ssid: "ssid"
password: "password"
# Enable fallback hotspot (captive portal) in case wifi connection fails
ap:
ssid: "Esp32-Cam Fallback Hotspot"
password: "12345678"
captive_portal:
# Example configuration entry
esp32_camera:
external_clock:
pin: GPIO0
frequency: 20MHz
i2c_pins:
sda: GPIO26
scl: GPIO27
data_pins: [GPIO5, GPIO18, GPIO19, GPIO21, GPIO36, GPIO39, GPIO34, GPIO35]
vsync_pin: GPIO25
href_pin: GPIO23
pixel_clock_pin: GPIO22
power_down_pin: GPIO32
# Image settings
name: My Camera
# ...
# Flashlight
output:
- platform: gpio
pin: GPIO4
id: gpio_4
light:
- platform: binary
output: gpio_4
name: esp32cam-light
# Binary Sensor
binary_sensor:
- platform: gpio
pin: GPIO13
name: "westcam2_pir"
device_class: motion
HA端
在Home Assistant上直接添加ESPHome设备即可。
通过ESPHome添加的摄像头有如下问题:
- 无声音,HA上可查看串流
- 桥接至HomeKit无法查看串流,只可查看10s更新一次的缩略图
- 运动传感器可用,但貌似只有在光线变化剧烈时才会动作
2 手机做IP摄像头添加至HASS
如果无法忍受ESP32-CAM较低的帧率和分辨率,手头又没有较好的摄像头或者监控设备的话,使用旧手机作为IP摄像头是一个不错的尝试。
目前我拿了一台 HUAWEI Mate 10 Pro 作为IP摄像头,裸机散热基本可用,功能全开待机功耗在3.5W左右。注意在电池未满的情况,尽量选择5V2A以上的充电器和传输线,否则可能会导致充电监控,电量不升反降。
2-1 传输方式
采取rtsp
协议,或onvif
。
手机端使用IP摄像头APP,作为rtsp
的推流端。
配置HASS,添加摄像头实体,并桥接给HomeKit。
2-2 手机端配置
IP摄像头-iOS端
配置rtsp
推流端即可。
我使用过一款国产的IP摄像头,可以显示时间和电量覆盖,提供RTSP流服务器,免费版功能不是很多,但基本够用。
安卓端-Google Play商店应用:Android IP Webcam
IP Webcam的免费版提供足够多的功能,包括显示时间与电量的覆盖(overlay)、运动和声音检测、检测到移动自动录像30s、远程管理对焦和切换摄像头等诸多功能。
Home Assistant有IP Camera对应的集成,可以通过修改配置文件configuration.yaml
添加摄像头实体,而且可以将诸多控制开关和传感器接入Home Assistant。
1)基本配置
- 配置主、副摄像头
- 配置开启时间、电量和充电状态的Overlay
- 配置传感器动作的阈值
2)推流与录像配置
推流服务器要设置开机自启、防止休眠。
RTSP推流可以选择$\mu$律编码还是PCM编码
设置检测到运动后,开始录像,要选择录像的保存位置,必要时,还要设置定时清理和实时异地备份:
我是使用Syncthing同步至Home Assistant所在的服务器,在设置过期删除。
3)Web端配置
默认在摄像机 http://IP:8080
或https://IP:8080
即可打开Web端配置页面。
在网页端可以配置大部分功能,包括启用运动检测、切换摄像头、自动对焦、是否显示时间电量、对焦模式、场景模式、夜视增益等等。
还能设置运动传感器监测范围,和查看传感器图像。
此外,网页端也可以访问录制的视频。
2-3 HA端配置
可以参考camera
类别下的多种集成可以选择:
- Generic Camera2:只需添加串流源,可以每10s自动generate缩略图。
- FFmpeg Camera3: 可以控制画质
- Camera Proxy4:摄像头代理
- Android IP Webcam5:可以直接配置源于Android APP:IP Webcam的摄像头
- 通过ONVIF协议的摄像头6:暂时未用
不支持使用UI添加实体,可以去配置configuration.yaml
,按照不同实体,在配置文件中添加以下内容:
2.3.1 使用 FFmpeg Camera 和代理的配置
使用了`FFmpeg Camera
集成和Camera Proxy
集成。
使用FFmpeg可以重新编码视频流的分辨率,使用Camera Proxy可以创造出一个新的摄像机,专门用于10s生成一张缩略图片。具体的配置参照各自的文档34。
camera:
- platform: ffmpeg
input: -rtsp_tramsport tcp -i rtsp://admin:[email protected]:8554/live
name: iphone14_cam
extra_arguments: -pred 1 -q:v 2 -s 1280x720
- platform: proxy
entity_id: camera.iphone14_cam
max_stream_width: 1280
max_image_width: 720
image_refresh_rate: 10.0
事实上IP摄像头原编码够用的情况下,可以使用FFmpeg二压,这样更占用系统资源。
2.3.2 只使用 Generic Camera2 的配置:
Generic Camera实体可以直接捕获RTSP流。安全认证方面,可以直接在流地址前写上user@pswd
(注意含特殊字符需要URL转义),特殊认证方式可以参照官方文档修改。
不加stream_image
参数,默认每10s自动生成一张缩略图。
camera:
- platform: generic
name: iphone14_cam_1
stream_source: rtsp://admin:[email protected]:8554/live
username: admin
password: 1105
framerate: 30
2.3.3 使用 Android IP Webcam 的配置
源自官方示例5:
# Example configuration.yaml entry
android_ip_webcam:
- host: 192.168.50.111
port: 8080
name: Hw_cam
username: username
password: password
sensors:
- audio_connections
- battery_level
- battery_temp
- battery_voltage
- light
- motion
- pressure
- proximity
- sound
- video_connections
switches:
- exposure_lock
- ffc
- focus
- gps_active
- motion_detect
- night_vision
- overlay
- torch
- whitebalance_lock
- video_recording
motion_sensor: true
添加了官方文档中全部的传感器与控制开关,基本上包括了Web端控制IP摄像头的大部分功能。
另外添加了一个二进制传感器:运动传感器。在Web管理页面可以设置阈值,待数值的运动传感器捕获的数值大于阈值时触发二进制运动传感器。此二进制传感器可以接入HomeKit,并参与自动化配置。
HW手机摄像头接入HA后能展现如下多的实体:
在iOS的手机摄像头中,HA端我先后尝试使用了FFmpeg Camera配置和Generic Camera配置,只接入RTSP流,可以实时串流至HomeKit。
在Android IP Webcam摄像头中,在HA端我同时使用了原生Android IP Webcam集成和Generic Camera集成。这样我可以传入RTSP流,同时可以传入摄像头的控制按钮与传感器。
3 摄像头接入HomeKit
根据官方文档7,摄像头、遥控器、电视、媒体播放器、锁等实体(media_player
, remote
, lock
, camera
)不能直接桥接至HomeKit,需要设置成accessory添加至HomeKit。
在UI界面中,可以通过HomeKit集成添加摄像头配件:
- 创建新的HomeKit集成,勾选上
Camera
,点击“提交”。HomeKit集成会自动将未加入HomeKit的摄像头添加成Accessory
- 之后会自动创建含有此摄像头的桥接(HASS Bridge),如若之前已建立过桥接,且包含此摄像头(
camera.XXX
实体),则可放心地删除自动新建的Bridge。
推荐为不同的实体类型创建不同的Bridge。
串流设置
需要注意的是,直接通过ESPHome方式添加至Home Assistant的摄像头,无法提供类似RTSP的串流,因此仅能在Home Assistant中查看视频流,而无法在HomeKit中看到实时串流,只能看到10s更新一次的图片。
想要在HomeKit中查得到实时串流的画面和声音,需要摄像头端支持RTSP,ONVIF等串流模式,且能提供不止一条视频流。
我将手机IP摄像头接入HomeKit的方案,是利用Android IP Webcam
实体,将控制switch
和传感器sensor
以及二进制传感器binary_sensor
接入HomeKit。
再使用generic_camera
实体将RTSP流桥接至HomeKit。总体的configuration.yaml
如文末所示。
成功接入HomeKit后,在家庭中可以看见摄像头,并可实时串流:
HomeKit配件还可以通过编辑配置文件手动配置,可以给摄像头添加对应的linked_doorbell_sensor
、linked_motion_sensor
8
4 HA 配置文件备份
时间 2022.2.20
# Configure a default setup of Home Assistant (frontend, api, etc)
default_config:
# Text to speech
tts:
- platform: google_translate
group: !include groups.yaml
automation: !include automations.yaml
script: !include scripts.yaml
scene: !include scenes.yaml
camera:0
- platform: generic
name: HW_cam_rtsp
stream_source: rtsp://username:[email protected]:8080/h264_pcm.sdp
username: username
password: password
framerate: 30
android_ip_webcam:
- host: 192.168.50.111
port: 8080
name: Hw_cam
username: username
password: password
sensors:
- audio_connections
- battery_level
- battery_temp
- battery_voltage
- light
- motion
- pressure
- proximity
- sound
- video_connections
switches:
- exposure_lock
- ffc
- focus
- gps_active
- motion_detect
- night_vision
- overlay
- torch
- whitebalance_lock
- video_recording
motion_sensor: true
参考资料
- ESP32CAM-ESPHome: https://esphome.io/components/esp32_camera.html#configuration-for-ai-thinker-camera ↩
- Generic Camera - Home Assistant: https://www.home-assistant.io/integrations/generic/ ↩
- FFmpeg Camera- Home Assistant: https://www.home-assistant.io/integrations/camera.ffmpeg/ ↩
- Camera Proxy- Home Assistant: https://www.home-assistant.io/integrations/proxy/ ↩
- Android IP Webcam- Home Assistant: https://www.home-assistant.io/integrations/android_ip_webcam/ ↩
- ONVIF- Home Assistant: https://www.home-assistant.io/integrations/onvif/ ↩
- HomeKit.Accessory Mode - Home Assistant: https://www.home-assistant.io/integrations/homekit/#accessory-mode ↩
- HomeKit.Configuration Variables - Home Assistant:https://www.home-assistant.io/integrations/homekit/#linked_doorbell_sensor ↩