Domoticz自动化脚本:夜间空闲时段自动处理积压照片队列
在家庭服务器的某个深夜,当全家人都已入睡,电脑屏幕早已熄灭——此时,一台不起眼的NAS设备却悄然苏醒。它从硬盘深处调取一张泛黄的老照片,通过AI模型为其“注入”温暖的肤色与蓝天绿树的背景,再将修复后的图像归档保存。第二天清晨,用户打开相册时,仿佛穿越时空,与过去的亲人重逢。
这并非科幻场景,而是借助Domoticz + ComfyUI + DDColor构建的家庭级AI图像处理流水线的真实写照。随着边缘计算能力的普及和深度学习模型的轻量化,普通家庭也开始具备运行复杂AI任务的能力。关键在于:如何让这些算力在不干扰日常使用的前提下,自动完成那些耗时但重要的数字化工作?
答案是——把AI变成一个会“看时机”的管家。
设想一下这样的日常:你手头有几百张祖辈留下的黑白照片,想修复却迟迟没动手,原因无非几个:操作太麻烦、怕卡电脑、不知道用什么工具……但如果有个系统能每天夜里自动挑出几张未处理的照片,悄悄完成上色修复,并把结果整理好放在指定文件夹里呢?这就是我们正在实现的自动化逻辑。
核心思路其实很朴素:利用夜间系统空闲资源,批量执行高负载AI任务。而实现这一目标的技术链条,依赖三个关键组件的协同:
- DDColor提供高质量的黑白图像着色能力;
- ComfyUI作为可视化AI流程平台,承载模型运行;
- Domoticz担任调度中枢,判断何时启动任务。
它们各自都不是为“家庭自动化”而生,但组合起来却形成了意想不到的化学反应。
先说DDColor。这个模型专为老照片修复设计,不同于通用着色算法“随便涂点颜色”,它能根据图像内容区分人物和建筑两类场景,分别优化色彩还原策略。比如对人脸部分更注重肤色连续性,避免出现“半边脸红半边脸绿”的诡异现象;对建筑物则强调材质一致性,让砖墙、玻璃、招牌等元素呈现符合历史真实的色调。
它的底层是一个融合了注意力机制与条件生成对抗网络(cGAN)的卷积神经网络,训练数据包含大量标注的历史影像。有意思的是,它并不追求“完全真实”——毕竟没人记得1950年某条街道到底是什么颜色——而是追求“视觉合理”。这种哲学上的取舍,恰恰让它在实际应用中显得更加自然可信。
更重要的是,DDColor以预训练模型的形式被封装进ComfyUI生态中,用户无需懂PyTorch或CUDA,只需拖拽几个节点就能构建完整的工作流。每个修复任务对应一个.json文件,里面定义了从图像输入到色彩输出的全过程。例如:
{ "class_type": "LoadImage", "inputs": { "image": "upload://person_1950s.jpg" } }这行代码的作用就是加载一张待处理的图片。虽然看起来简单,但它背后连接的是ComfyUI的资源管理模块,支持本地路径、上传队列甚至远程URL。再比如模型加载节点:
{ "class_type": "DDColor_ModelLoader", "inputs": { "model_name": "ddcolor-artistic.pth", "size": 640 } }这里指定了使用艺术风格化的模型版本,并将输入尺寸设为640×660。这个数值不是随意定的——对于人像来说,短边640既能保留面部细节,又不会因过大导致显存溢出(尤其是消费级GPU)。如果你处理的是城市街景,则可以切换到更高分辨率的建筑专用模型,比如设置size: 960来捕捉更多建筑纹理。
整个流程由多个节点串联而成,构成一个有向无环图(DAG),确保执行顺序正确。而这一切都可以通过浏览器界面完成配置,极大降低了技术门槛。
但光有图像处理能力还不够。真正的智能化,体现在“什么时候做”。
这就轮到Domoticz登场了。很多人只知道它能控制灯泡和温控器,但实际上,作为一个成熟的开源智能家居平台,它内置了强大的事件引擎和定时调度系统。我们可以设置一条规则:“当时间为23:00至次日6:00之间,且CPU与GPU负载均低于30%时,触发照片修复任务”。
这条规则的意义在于:把AI任务当作一种‘可延迟服务’来调度。就像洗衣机不会在做饭时启动热水一样,我们的图像修复也不该在你剪视频或打游戏时抢资源。通过监控系统负载状态,Domoticz能精准识别“空闲窗口”,只在合适时机才唤醒ComfyUI服务。
具体怎么联动?靠的是脚本桥接。
下面是一段Python小脚本,负责监听Domoticz的事件并触发ComfyUI任务:
import requests import json import os server_address = "http://localhost:8188" input_dir = "/photos/black_input/" output_dir = "/photos/color_output/" # 扫描待处理图片 for filename in os.listdir(input_dir): if filename.lower().endswith(('.jpg', '.png')): # 根据关键词选择工作流 if any(k in filename.lower() for k in ['family', 'portrait', 'woman', 'man']): workflow = "DDColor人物黑白修复.json" elif any(k in filename.lower() for k in ['building', 'street', 'city', 'house']): workflow = "DDColor建筑黑白修复.json" else: workflow = "DDColor通用修复.json" # 默认流程 with open(workflow, "r") as f: prompt_data = json.load(f) # 注入图像路径 prompt_data["3"]["inputs"]["image"] = f"upload://{filename}" # 提交任务 response = requests.post( f"{server_address}/prompt", json={"prompt": prompt_data} ) if response.status_code == 200: print(f"✅ 已提交 {filename} 至修复队列") # 移动原图至临时处理区,防止重复提交 os.rename(f"{input_dir}{filename}", f"{input_dir}.processing/{filename}") else: print(f"❌ 提交失败:{response.text}")这段脚本看似简单,实则完成了多项关键动作:扫描输入目录、智能分类、动态注入参数、调用API、状态标记。其中最巧妙的设计是基于文件名关键词自动匹配修复模型。虽然未来可以用OCR+语义分析实现更精准的内容识别,但在现阶段,这种启发式规则已经能满足绝大多数家庭用户的需求。
而且你会发现,整个过程完全无人值守。你可以把原始照片一股脑扔进black_input文件夹,然后忘记它的存在。系统会在接下来的几个夜晚分批处理,最终把彩色版放进color_output,并发送Telegram通知告诉你:“爷爷奶奶的婚礼照已修复,请查收。”
当然,部署过程中也有一些经验值得分享。
首先是图像尺寸的权衡。我们测试发现,短边在460–680之间的图像在RTX 3060级别显卡上推理速度最快,平均每张耗时约90秒。一旦超过960像素,显存占用急剧上升,容易触发OOM(Out of Memory)错误。因此建议在预处理阶段统一缩放,特别是扫描质量过高的老照片,其实不需要保留全部细节。
其次是模型缓存策略。如果频繁切换人物与建筑模型,每次重新加载都会浪费数秒时间。ComfyUI支持模型常驻内存,只要不重启服务,后续调用就能直接复用。配合SSD存储模型文件,加载延迟可控制在1秒以内。
还有安全性问题。ComfyUI默认开放HTTP接口,若暴露在局域网中可能被恶意调用。建议启用Basic Auth认证,或通过Nginx反向代理添加访问控制。自动化脚本也应以低权限账户运行,避免因路径遍历漏洞误删系统文件。
更进一步,还可以引入消息队列机制。当前方案采用“扫描即提交”的模式,在照片数量庞大时可能导致瞬时并发过高。若接入RabbitMQ或Redis Queue,可以让脚本只负责入队,另起一个Worker进程按速率消费任务,从而实现平滑调度。
这套系统的真正价值,或许不在技术本身,而在于它所代表的一种新范式:家庭数字资产的主动维护。
过去,我们习惯被动地存储照片、等待某天“有空了再去整理”。但现在,系统可以主动提醒你哪些记忆尚未数字化,哪些文件存在损坏风险,并在后台默默完成修复。它不只是一个工具,更像是一个懂得珍惜记忆的数字管家。
更有意思的是,这种模式具有很强的扩展性。今天是老照片上色,明天就可以是旧录像增强、语音降噪、文档OCR归档……只要有合适的AI模型,都能纳入这个自动化流水线。
试想未来某天,你的家庭服务器不仅能控制灯光温度,还能帮你整理家族史、生成年度回忆视频、甚至根据老照片风格创作新年贺卡——这才是智能家居应有的温度。
技术从来不是冷冰冰的代码堆砌,而是服务于人的生活智慧。当我们在深夜启动一次AI推理任务时,真正驱动它的,不是GPU的算力,而是那份想要留住时光的温柔心意。