本文及资源最后更新时间 2021-08-22 by sky995
将“小米摄像头”录制的视频转存至“群晖”,在“群晖”上与onedrive同步,同时根据onedrive的 1T空间限制(个人版或家庭版)进行文件转移,使onedrive存有最新的视频文件(1T大小),并将旧文件存放至另一位置(视情况保留或删除)。
这样一来,云盘和本地至少都有 1T 的视频在。进一步提升监控文件存储的可靠性。
同时还可以省下摄像头“云存储”的费用,那玩意还是挺贵的。
用到的工具:群晖、Python、小米摄像头、OneDrive
起因:
我需要将本地的录像文件留一个备份,以备不时之需。
家中有三个小米摄像头,它们都支持转存到群晖(有些型号会不支持,记得问好卖家)。正是因为这个,才买的小米摄像头,之前用小蚁摄像头,云存储一年的费用不少,而且是按照机器来收取,存储天数越长越贵,不划算。
一台设备一天下来大约8个g,群晖单盘有2t空间,算下来3台设备可存77天。
正好家里也有台群晖d218j,支持onedrive转存(好像所有群晖nas设备都支持)。我自己购买了onedrive家庭版,有个1T的空间。
开始操作:
第一步:设置好摄像头的转存文件夹,这一步在小米摄像头内操作,米家app里。多台摄像头记得放同一位置,方便一同与onedrive同步。
第二步:群晖内设置onedrive
将摄像头文件夹,我这的名称为xiaomi_camera_videos,与onedrive云端文件夹(新建一个,自己取名)同步,同步方式选择“双向”
这样的话群晖本地的小米摄像头转存文件就能与onedrive同步了。
但是onedrive有空间限制,且满了不会自动删除旧文件,只会限制你的上传,这样的话,只能咱自己来搞了。
第三部:编写python脚本,加入任务计划程序中。
基本逻辑就是:设定一个阀值,在空间快满时,把旧的文件移动到另一个文件夹,释放onedrive的空间(因为选择了“双向同步”)。
代码如下:
import os
import shutil
import re
#输出和路径不能有中文,不然会在计划程序中报错。ssh里可以执行
def get_doc_size(doc):#获取文件大小,单位g,两位小数
size = 0.0
for root,dirs,files in os.walk(doc):
size += sum([os.path.getsize(os.path.join(root, file)) for file in files])
size = round(size/1024/1024/1024, 2)
return size
def transfer_file(path,n,x):#各参数:初始路径,转存文件数,转存路径
lists = os.listdir(path) #取目录下的文件保存到lists
lists.sort(key=lambda fn: os.path.getmtime(path + "/" + fn),reverse = True) # 按修改时间排序,正序
for i in range(1,n+1):# 获取最旧的n个非空文件
file = os.path.join(path,lists[-i])
if get_doc_size(file)==0:#如果文件夹大小为0,则删除
print('empty file,delete it'+str(lists[-i]))
os.remove(file)
n+=1#空文件则增加循环次数
else:#移动文件
shutil.move(file,x)
print('moving'+str(lists[-i]))
if get_doc_size('/volume1/homes/bb/xiaomi_camera_videos')>900:#阀值900g
#24为一天的视频量,任务计划程序可2天运行一次,可加大些
transfer_file('/volume1/homes/bb/xiaomi_camera_videos/5ce50c62ae61',50,'/volume1/homes/bb/b/transferonedrive/5ce50c62ae61')
transfer_file('/volume1/homes/bb/xiaomi_camera_videos/5ce50ca9f839',50,'/volume1/homes/bb/b/transferonedrive/5ce50ca9f839')
else:
print('sapce enough')
自己改里面的路径(需无中文)、转存数即可。将py文件保存,放到群晖的任意文件夹内(之后要调用)。
然后在群晖的“任务计划”中,添加执行脚本的代码。(默认已经配置好了python3)
我这为
python3 /volume1/homes/bb/b/dd.py
更改阀值,试运行一下。
- 低于阀值时:
- 超出阈值时:
大功告成。
技术总结:
中文路径、输出中文的问题没解决,就索性用英文了,问题不大,个人使用满足需求就好。