本篇文档采用两种摄像头接入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模块

我使用安信可的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

截屏2022-02-24 01.47.47

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:8080https://IP:8080即可打开Web端配置页面。

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后能展现如下多的实体:

摄像头添加至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集成添加摄像头配件:

  1. 创建新的HomeKit集成,勾选上Camera,点击“提交”。HomeKit集成会自动将未加入HomeKit的摄像头添加成Accessory

添加HomeKit配件

  1. 之后会自动创建含有此摄像头的桥接(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后,在家庭中可以看见摄像头,并可实时串流:

IMG_0098

HomeKit配件还可以通过编辑配置文件手动配置,可以给摄像头添加对应的linked_doorbell_sensor linked_motion_sensor8

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

参考资料