『瀚思彼岸』» 智能家居技术论坛

 找回密码
 立即注册
查看: 38179|回复: 187

[新奇玩法] 【立省100%】小米系可视门铃本地存储

  [复制链接]

18

主题

587

帖子

4297

积分

元老级技术达人

积分
4297
金钱
3675
HASS币
182
发表于 2023-3-12 22:59:01 | 显示全部楼层 |阅读模式
本帖最后由 louis_lee 于 2023-3-30 10:17 编辑

几天前在论坛上看到有朋友用al-one大神的miot auto插件接入了可视门铃,我就想到了我的带可视门铃的小米锁。试了下接入,发现居然可以生成camera实体,于是兴致浓浓开始折腾!

看了眼miot auto git仓库的介绍,这个功能21年就加入了,原理是通过米家接口获取设备的最后一个视频。然而在使用过程中,经常会显示一个静止的视频画面(作者也提到了)。

不过好在作者将接口取到的视频地址,放到了camera实体参数中,这样就可以自己折腾啦。就目前而言,我想到了两个使用场景。

1. 将生成的视频本地化滚动储备。官方只送三天免费储存时间,一年30天滚动储存费用高达208元,贵的夸张啊!通过本地化储存视频,我们劲省100%!四舍五入每年赚了200多!(效果图如下)


视频.PNG

2. 门前有人视频推送。小米门锁自带的可视门铃功能很鸡肋,只能接入用户使用,不能分享给家庭成员我不知道产品设计思路是咋样的,买到手后才发现坑到家了!通过HA自动化,我们就可以利用ha app端及时推送门前视频,尽管存在一定延迟(10s左右),但有总比没有好啊!!


以下,我们一个一个来:

米系可视门铃、猫眼、摄像头(看家助手)本地化存储方案

step1: 设备接入miot auto

跳过。。。。

step2: 实现自动化存储

首先我们在/config目录里,新建一个文件xiaomi_video_autosave.sh,将如下代码贴入。复制过程注意window与Linux换行符差异,否则会造成执行失败。也就是最好不要用samba操作,而是直接ssh登入后,将代码贴入。

#! /bin/bash
## setting section
path="/media/xiaomi_video/"
video_limit=500

if [ ! -d $path ];then
  mkdir $path
fi

current_file_size=`ls $path|wc -l` 
video_url=$1
raw_file_name=`echo $2|sed 's/[^0-9]//g'` 
file_name=$path$raw_file_name".mp4"

if [ $current_file_size -ge $video_limit ]; then
  ls $path -tr|head -n $(($current_file_size-$video_limit+1))|sed "s/^/${path//\//\\\/}/g"|xargs rm
fi

ffmpeg -i $video_url -acodec copy -vcodec copy -f mp4 $file_name
path:就是存放目录,根据情况修改,格式为/media/xxxxxx/,不要省略结尾的“/”。可以在NAS或其他设备上存储,通过NFS挂载到/media下,见step4
video_limit:是存储上限,我存的视频大概不到1M一个,所以我设定了500个存储上限。你可以根据实际情况调整。

(另外需要注意的是,如果你播放的视频不全,比如就有1-2秒,请参考35楼的方案(已置顶)。)

保存退出后,别忘赋予可执行权限哦

chmod a+x /config/xiaomi_video_autosave.sh

再之后,我们在/config/configuration.yaml中将下述shell脚本加入到shell_command里:

shell_command:
  xiaomi_autosave: '/bin/bash /config/xiaomi_video_autosave.sh "{{state_attr("camera.lumi_wbmcn1_8a41_lock","stream_address")}}" "{{state_attr("camera.lumi_wbmcn1_8a41_lock","motion_video_time")}}" ' 

##注意将以上两个camera实体换成你自己的!

最后,我们搞个HA自动化就完成视频本地存储了,放在automation.yaml里,或者自己通过HA前端手动写一个!

- id: '1678104080023'
  alias: door_video_autosave
  description: ''
  trigger:
  - platform: state
    entity_id:
    - camera.lumi_wbmcn1_8a41_lock  ## 将此处修改为你的camera实体
    attribute: motion_video_time
  condition: []
  action:
  - service: shell_command.xiaomi_autosave
    data: {}

step3: 生成HA视频查看卡片

除了用HA存储,我也要用HA查看!我从HACS里找了一个视频播放卡片,并为可视门铃的竖屏视频做了简单适配,有兴趣的朋友可以试一试:

首先,通过HACS安装前端卡片。依次点击HACS-》前端-》右上角三个点-》自定义存储库,类别选择lovelace,存储库贴入https://github.com/louisslee/gallery-card,并点击添加。添加后,就可以找到Custom Gallery Card,直接安装即可。

接下来,我们生成个HA视频卡片。你可以选择在HA lovelace页面建一个panel或者只是一个单卡片的view,来展示存储的视频。这里我们为新手朋友简单介绍在原有lovelace添加单卡片的view的方法。

在概览页面,点击右上角三个点-》编辑仪表盘-》左侧”+“号 添加视图-》标题随便起,视图类型选择视图(单张卡片)。点击添加卡片,拉到最后选择Custom Gallery Card,并点选代码编辑器,并将以下内容贴入:

type: custom:custom-gallery-card
entities:
  - media-source://media_source/local/xiaomi_video  ##如果你存储位置也在HA主机/media目录下,直接将xiaomi_video换成你自己定义的文件夹
file_name_format: '%YYY%m%d%H%M%S'
caption_format: '%YYY %m/%d %H:%M %p'
show_reload: true
menu_alignment: vertical  #如果你的视频是横屏视频,请将此处换为responsive或直接使用未修改的gallery-card

这样就搞定了,你可以自己在门外走走,生成几个视频试试!!

step4: 使用NAS储存视频文件(非必须)

不少朋友HA的系统存储空间分配不足,或者使用倾向与使用NAS存储。毕竟NAS作为更专业的文件存储方式,不仅可使用的空间大,可使用raid 1等方式加强存储安全性。

比较常用的方式是使用NFS、CIFS(SAMBA)。大部分NAS系统都可以通过前端操作来创建一个NFS或CIFS(SAMBA)共享文件夹(简单百度一下,每家都不一样,我就不介绍了),并赋予好读写权限(非常重要!!!!!)。我们再将该共享文件夹挂载在HA系统上即可。

## cifs (samba) 挂载
mount -t cifs //192.168.3.49/cctv_storage /media/xiaomi_video -o user=xxx,pass=xxx

## 或使用nfs挂载
mount -t nfs4 192.168.3.49:/cctv_storage /media/xiaomi_video 

## 注意修改以上IP、共享文件名称,并根据情况修改挂载点位置(与前文视频存储路径保持一致)。
## 如果挂载点位置的文件夹未创建,请首先创建相应的文件夹!!!

但是大部分朋友使用的HAOS、docker容器等方式安装,这意味着mount 操作无法持久化。那么我们可以建立一个自动化,HA每次启动,就做一次挂载操作。

首先请将下列内容加入configuration.yaml中:

shell_command:
  video_storage_mount: 'mount -t cifs //192.168.3.49/cctv_storage /media/xiaomi_video -o user=xxx,pass=xxx '

## 如果使用nfs挂载,请按照前面的命令对应改一下

然后请做一个自动化,HA启动,执行该shell_command。以下放在automation.yaml里,或者自己通过HA前端手动写一个!

- id: '1680100015058'
  alias: video_storage_mount_when_ha_start
  description: ''
  trigger:
  - platform: homeassistant
    event: start
  condition: []
  action:
  - service: shell_command.video_storage_mount
    data: {}
  mode: single

米系可视门铃、猫眼、摄像头(看家助手)视频推送

这个简单,以下放在automation.yaml里,或者自己通过HA前端手动写一个!

- id: '1678104080026'
  alias: door_video_push
  description: ''
  trigger:
  - platform: state
    entity_id:
    - camera.lumi_wbmcn1_8a41_lock  ##换成你的!
    attribute: motion_video_time
  condition: []
  action:
  - service: notify.mobile_app_****_iphone  ##换成你的!
    data:
      title: 家门有人推送
      message: 点击可查看视频
      data:
        url: '{{state_attr(''camera.lumi_wbmcn1_8a41_lock'',''stream_address'')}}'  #换成你的!











评分

参与人数 13金钱 +119 HASS币 +20 收起 理由
chiunownow + 10 高手,这是高手!
HA.怿 + 5
ltt1008 + 5 感谢楼主分享!
ruike007 + 8 感谢大佬,解决一个痛点!!
DDDear + 8 感谢楼主分享!
q873139535 + 5 厉害了word楼主!
arthurfsy + 10 高手,这是高手!
flyice + 8 以为是青铜,原来是王者!
kei81131 + 5 纳尼,还有这种操作?
miaoer + 5 膜拜大神!
隔壁的王叔叔 + 10 厉害了word楼主!
+ 20 + 20 以为是青铜,原来是王者!
dscao + 20 纳尼,还有这种操作?

查看全部评分

回复

使用道具 举报

18

主题

587

帖子

4297

积分

元老级技术达人

积分
4297
金钱
3675
HASS币
182
 楼主| 发表于 2023-3-15 13:48:30 | 显示全部楼层
本帖最后由 louis_lee 于 2023-3-27 16:46 编辑

如果你按照步骤执行下来,发现视频只有少部分片段,比如米家上看视频15秒,结果用本文方法看只有1-2秒。请将如下代码替换原来的xiaomi_video_autosave.sh文件:

#! /bin/bash
##### setting section######
path="/media/xiaomi_video/"
video_limit=500
temp_path="/config/xiaomi_video_temp/"
#####################

if [ ! -d $temp_path  ];then
  mkdir $temp_path
fi

if [ ! -d $path ];then
  mkdir $path
fi

current_file_size=`ls $path|wc -l`
video_url=$1
raw_file_name=`echo $2|sed 's/[^0-9]//g'`
file_name=$path$raw_file_name".mp4"


## remove oldest video if file_size > video_limit
if [ $current_file_size -ge $video_limit ]; then
  ls $path -tr|head -n $(($current_file_size-$video_limit+1))|sed "s/^/${path//\//\\\/}/g"|xargs rm
fi


curl $video_url > $temp_path"m3u8"
ts_position_list=(`grep -n "#EXTINF" $temp_path"m3u8" |cut -d ":" -f1`)
head_end_position=`expr ${ts_position_list[0]} - 1`
tail_postion=`cat $temp_path"m3u8"|wc -l`

for((i=0;i<${#ts_position_list[@]};i++));do

  start=${ts_position_list[i]}
  if [ `expr $i + 1` -eq  ${#ts_position_list[@]} ] ; then
    end=`expr $tail_postion - 1`
  else  
    end=`expr ${ts_position_list[i+1]} - 1`
  fi

  sed -n "1,${head_end_position}p" $temp_path"m3u8" >> $temp_path$i".m3u8"
  sed -n "${start},${end}p" $temp_path"m3u8" >> $temp_path$i".m3u8"
  echo "#EXT-X-ENDLIST" >> $temp_path$i".m3u8"

  ffmpeg -protocol_whitelist 'file,crypto,data,https,tls,tcp' -i $temp_path$i".m3u8"  $temp_path$i".mp4"

  echo file \'$temp_path$i".mp4"\' >> $temp_path"list"

done

ffmpeg -f concat -safe 0 -i $temp_path"list" -c copy $file_name

rm "$temp_path"*""

评分

参与人数 7金钱 +67 收起 理由
529616965 + 5 在下对你的景仰犹如滔滔长江之水,连绵不绝.
kei81131 + 5 论坛有你更精彩!
ruike007 + 8 大哥,喝冰阔落
Alkali + 8 高手,这是高手!
anlong + 16 高手,这是高手!
miaoer + 5 感谢楼主分享!
dscao + 20 在下对你的景仰犹如滔滔长江之水,连绵不绝.

查看全部评分

回复

使用道具 举报

0

主题

38

帖子

446

积分

中级会员

Rank: 3Rank: 3

积分
446
金钱
408
HASS币
0
发表于 2023-3-12 23:16:15 | 显示全部楼层
不买,又贵又封闭又不好用
回复

使用道具 举报

18

主题

587

帖子

4297

积分

元老级技术达人

积分
4297
金钱
3675
HASS币
182
 楼主| 发表于 2023-3-12 23:19:10 | 显示全部楼层
aiancandle 发表于 2023-3-12 23:16
不买,又贵又封闭又不好用

不买立省100%

有没有价格合适,方便接入HA的可视门铃呢?
回复

使用道具 举报

7

主题

166

帖子

1302

积分

论坛技术达人

积分
1302
金钱
1131
HASS币
60
发表于 2023-3-12 23:55:21 | 显示全部楼层
mark 看看后面的小白智慧门能不能这样搞
回复

使用道具 举报

7

主题

166

帖子

1302

积分

论坛技术达人

积分
1302
金钱
1131
HASS币
60
发表于 2023-3-13 10:11:39 | 显示全部楼层
按照楼主步骤有报错,不知道是什么原因
Logger: homeassistant.components.shell_command
Source: /usr/src/homeassistant/homeassistant/components/shell_command/__init__.py:117
Integration: Shell Command (documentation, issues)
First occurred: 10:07:54 (2 occurrences)
Last logged: 10:08:57

Error running command: `/bin/bash /config/xiaomi_video_autosave.sh "{{state_attr("camera.chuangmi_515a01_d1e8_video_doorbell","stream_address")}}" "{{state_attr("camera.chuangmi_515a01_d1e8_video_doorbell","motion_video_time")}}" `, return code: 2
NoneType: None



Logger: homeassistant.components.stream.stream.camera.chuangmi_515a01_d1e8_video_doorbell
Source: components/stream/__init__.py:434
Integration: Stream (documentation, issues)
First occurred: 10:00:56 (9 occurrences)
Last logged: 10:08:46

Error from stream worker: Stream ended; no additional packets
回复

使用道具 举报

18

主题

587

帖子

4297

积分

元老级技术达人

积分
4297
金钱
3675
HASS币
182
 楼主| 发表于 2023-3-13 10:54:33 | 显示全部楼层
本帖最后由 louis_lee 于 2023-3-16 18:07 编辑
arthurfsy 发表于 2023-3-13 10:11
按照楼主步骤有报错,不知道是什么原因

先确定下,咱这个实体camera.chuangmi_515a01_d1e8_video_doorbell,有没有stream_address、motion_video_time这两个属性哈,我的小米锁是有的,我不太确定。

如果有的话,ssh登入并进入docker容器,执行shell看看有没有问题
docker container exec -it homeassistant /bin/bash
/bin/bash /config/xiaomi_video_autosave.sh "stream_address" motion_video_time"
stream adress、motion_video_time替换成你自己的参数,注意双引号不要省去哈
回复

使用道具 举报

77

主题

1391

帖子

2万

积分

元老级技术达人

积分
24443
金钱
23012
HASS币
290
发表于 2023-3-13 12:29:33 | 显示全部楼层
arthurfsy 发表于 2023-3-13 10:11
按照楼主步骤有报错,不知道是什么原因

我也出现同样的问题了。原来复制过去用了samba,默认使用了windows的格式。后来修改sh的文档格式为Unix后解决,但结果还有点问题,转存的mp4文件只有1秒。还要研究一下。
回复

使用道具 举报

18

主题

587

帖子

4297

积分

元老级技术达人

积分
4297
金钱
3675
HASS币
182
 楼主| 发表于 2023-3-13 13:16:21 | 显示全部楼层
本帖最后由 louis_lee 于 2023-3-13 13:33 编辑
dscao 发表于 2023-3-13 12:29
我也出现同样的问题了。原来复制过去用了samba,默认使用了windows的格式。后来修改sh的文档格式为Unix后 ...

感谢提醒,已更新正文注意事项。

视频长短可能跟设备、米家设置(米家可以设置视频存储时长)有关。视频链接可以试试用手机打开,如果时长仍为1秒的话,可能需要修改米家设置或MIOT auto插件配置、或者更改MIOT获取视频流的API。
回复

使用道具 举报

77

主题

1391

帖子

2万

积分

元老级技术达人

积分
24443
金钱
23012
HASS币
290
发表于 2023-3-13 14:04:13 | 显示全部楼层
本帖最后由 dscao 于 2023-3-13 14:12 编辑
ffmpeg found duplicated moov atom. skipped it

好像每次的视频地址m3u8中包含了3个文件,只能转第1个1.53秒的文件,后面的两个视频就忽略了。
手机浏览器打开这个地址就可以播放六七秒。

1.jpg
回复

使用道具 举报

0

主题

24

帖子

1216

积分

金牌会员

Rank: 6Rank: 6

积分
1216
金钱
1192
HASS币
0
发表于 2023-3-13 14:54:34 | 显示全部楼层
dscao 发表于 2023-3-13 14:04
好像每次的视频地址m3u8中包含了3个文件,只能转第1个1.53秒的文件,后面的两个视频就忽略了。
手机浏览器 ...

我的智能门铃也是这样,只播放第一段   用chrome的猫抓插件看了下,AES-128加密还有偏移,估计ffmpeg没法自己解密拼接,可能需要脚本额外操作一下     试了几个途径,只有vlc能完整解析播放出来
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Hassbian

GMT+8, 2024-12-4 00:46 , Processed in 0.067542 second(s), 38 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表