规划库存、减少浪费:以 Grocy 为数据库的物品管理方案
前言
我们家有两口子,平时有囤货的习惯。我们自认为生活中还是有比较良好的收纳习惯,但时而还是会为躺在柜子深处过期的物品而感到惭愧,亦或是重复购买了超量的物品。为此,家里的女主人率先行动,开始清点家里的库存并将条目数字化,后来,使用一款名为「过期啦」的 app 进行管理。一年后,又值大促来临,准备囤货了,我问老婆「你还用『过期啦』吗?」「不用了,有点麻烦,老是忘了记录。」
在进一步深入之前,我们认真思考了家庭内搞库存管理是不是在「过度管理」。最终我们认同了家庭库存管理价值的:
- 能一目了然地知道家里的存货;
- 能规划物品使用,有效地较少浪费;
- 让患有仓鼠症的人感到满足。但有前提,物品足够多,以及高度自动化。
收纳 app,止于懒惰
我开始在网上寻找志同道合的人。发现已经有很多实践了,有人用收纳 app 来记录,还有人用 Notion、滴答清单来管理。1
这些 app 做得非常精美,功能全面,甚至有很多拓展功能,如购物记录、价格跟踪、食谱规划等等。我们也订阅过一些 app 进行了深度的使用,使用过一段时间后,都放弃了.
主观因素是,懒惰。但我们发现这些应用/服务都有一个客观缺陷:出入库困难。
按最简流程,完成一个商品的出库都需要「拿起手机-解锁手机-找到并点开 app-扫码物品」;而入库则更加繁琐,在上述出库的步骤基础上,还需要完成「数量」「保质期」「存放地」等设置。更现实的是,在家庭生活场景中,手机并不是时时刻刻在身上的。比如:洗澡时,发现香皂用完了,到浴室柜里拿一个;做饭时,锅正热着,发现食用油用完了,赶紧到仓库里拿一瓶。一旦没有于当下将物品出入库,后面很难再想起补出入库了,库存中的存量数字也变得不再可信。正如某位网友所评价的:
你需要的是一个 24 小时监控你的贾维斯,而不是这样的一个 app。记录不到五条你就会醒悟,哦,还是用脑子记更方便。人类进化的动力就是懒......
如果你也用过其他收纳类的 app,就应该能体会到最难的地方在于坚持物品录入。
基于以前失败的经验,我们总结出自己所需的核心功能:
- 物品快速自动出入库;
- 物品信息自动识别与归类;
- 过期、低库存提醒;
- 自动补充清单;
除此之外的功能都只是锦上添花。我们渴求的这些核心功能不是点到为止,而是要尽可能地自动化。要实现个性化的需求,只能自己动手,或者寻求开源社区的帮助,于是我找到了 Grocy。
开源方案,Grocy
Grocy 是一款开源的适用于家庭的杂货管理解决方案。主要功能包括了:
- 物品的出库入库,通过条形码交互,支持使用手机或专用条形扫描仪;
- 菜谱与食谱,管理自己的菜谱,并在日历中规划食谱;
- 物品临期提醒;
- 购物清单,通过菜谱食谱自动添加;
- 设备、家务、电量管理。
综合看来,Grocy 提供了一个很好的框架,易用的 API。同时,具有较为活跃的社区。目前已经有 iOS 客户端、Android 客户端、Barcode Buddy 扫码助手、Home Assistant 插件、Recipe Buddy 食谱助手等等。2Grocy 已经具备了扫码出入库和基于 Open Food Facts 的食品信息获取等功能,但它的交互与其它 app 一样,仍然强烈依赖手机,依赖手动录入;无法识别国内商品;出入库还不够「自动化」。
补齐短板,GrocyCompanionCN
Grocy 已经具备了基础的功能,为了提升 Grocy 的「自动化」程度,解决物品出入库的困难。我设计了一套辅助工具——GrocyCompanionCN,包含了软件服务端和硬件扫码器两部分。服务端负责获取并解析物品基础信息,并与 Grocy 通信;客户端为若干个扫码器,负责获取物品的 EAN 条码,并将条码信息、位置信息、出入库设置发送至服务端。
GrocyCompanionCN 的特性有:
- 条码快速识别,支持国产商品与进口产品;
- Grocy 物品扫码出库;
- Grocy 已有物品扫码入库,新物品自动获取商品详情并入库;(商品详情包括:条码,基础信息,图片,GPC 类别,保质期判别等)
- 扫码器自动启停、长续航。
提升用户体验的核心是扫码器,这些扫码器可以手持,也可以布置在家庭中的任意位置(可与 Grocy 中的「位置」一一对应),由电池或者线缆供电。以下是几个应用场景。
安装在柜子内的扫码器。与诸多衣柜中的线条灯一样:扫码器通过限位开关触发开机/关机;通过拨动开关可以设置出库(默认)/入库;扫码成功时会有蜂鸣器和指示灯提示;扫码器获取的物品信息将与 Grocy 自动同步。
扫码器可以从基座上取下,手持扫码器进行大批量的物品入库。
广泛分布在收纳空间的扫码器让我们不用再手动点击任何屏幕,物品的出入库在几秒内即可完成。我们不用再主观地去「坚持」做录入工作,一切操作都是顺势完成的。
GrocyCompanionCN 的技术实现
我把 GrocyCompanionCN 的源码托管在 Github 上了,同时提供 Docker 镜像,具体部署方式请移步:
以下是 GrocyCompanionCN 的实现思路和技术细节。
物品的身份关联
查阅现有各大商超、自动贩卖机的技术,有以下几种方法来实现物品信息的联网:
- 扫描物品条形码,查阅预先录入信息。常见于各大超市;
- 通过 RFID 将标签建档,RFID 标签黏贴或镶嵌于物品,由 RFID 检索物品,常见于鲜花自动贩卖机、门店自助结算筐;
- 机器视觉,通过视觉分析商品特征,识别用户拿取的商品,常见于饮料自动贩卖机。
综合考虑系统鲁棒性、成本、实现难度和商品数据库,我们还是选择条形码来完成物品的身份关联。任何正规售卖的商品都应具有条形码,且有唯一性,常用的编码为 EAN 码。
EAN 码(European Article Number,欧洲物品编码),是国际物品编码协会在全球推广的商品条码。EAN13 是其标准版,有 13 位,另有缩短版 EAN8,8 位。EAN13 是国际通用的符号体系,是一种无含义、定长、纯数字的条形码,主要用于商品标识,具有唯一性。EAN13 的 13 位数字,前 3 位为国家代码,中国可用的国家代码为 690-699;4-7 位为制造厂商代码(只能从 0000 - 9999 这一万组数字中进行分配);8-12 位为产品代码(每个制造商可以对自己生产的 10 万种商品进行分配);最后 1 位为校验码。
同时,我们也有免费的渠道来获取条形码对应的物品信息。中国物品编码中心提供了条形码的查询(有每日查询上限)。
中国物品编码中心。截至目前,编码中心累计向 100 多万家企业提供了商品条码服务,全国有上亿种商品上印有商品条码。在其提供的中国商品信息服务平台上,我们可以进行条码相关信息的查询。
物品分类与保质期设置
分析中国物品编码中心获取的条形码信息,发现有一个「GPC」属性。刚好能帮助我们解决物品分类问题。根据 2023 年 5 月 6 日发布的 GPC 分类代码版本,共计 43 个大类,159 个中类,932 个小类,5249 个细类。34
GPC 分类代码是国际物品编码组织(GS1)依据 GPC 标准将特征相似的商品归为一类的代码。GS1 全球商品分类标准(Global Product Classification, GPC)不断扩展更新,每年发布两个新版本。GPC 分类代码按照大类(Segment)、中类(Family)、小类(Class)、细类(Brick)来划分,并细分为具体的商品核心属性类型和属性值。商品数据交换中,通常采用第 4 级代码,即细类代码。
条形码只能告诉我们商品的注册信息,无法定位到商品的生产日期,也极少提供保质期信息。于是我观察了一下生活中的常见物品保质期,灵活使用四类 GPC 分类代码,预先设置好新物品的保质期。同时,设置一些偏移量:半年(-30 天),一年(-60 天),三年(-90 天),由此,已经能粗略地匹配好物品到期日期了。当然,后续还是可以在 Grocy 中进行商品的精确设置。
这个机制特别关键,能彻底解放我们对物品入库时,一个一个地计算到期日这种繁琐的工作。读者也可以更具自己的实际情况设置类别和偏移量。
保质期(天) | 类别 |
---|---|
7 | 50370000(中类,鲜切水果或蔬菜), 50380000(中类,鲜切水果或蔬菜), 50350000(中类,未处理或未加工的(新鲜)叶菜类蔬菜) |
14 | 50250000(中类,未处理或未加工的(新鲜)水果), 10000025(细类,牛奶(易腐坏)), 10006970(细类,牛奶替代品(易腐坏)), 10000278(细类,酸奶(易腐坏)), 10006979(细类,酸奶替代品(易腐坏)) |
152 | 50270000(中类,未处理或未加工的冷冻水果), 50310000(中类,未处理或未加工的耐储存水果) |
305 | 94000000(中类,粮食作物), 50000000(大类,食品、饮料和烟草), 10120000(中类,宠物护理用品或食品组合装), 10110000(中类,宠物食品或饮品) |
1005 | 53000000(大类,美容、个人护理和卫生用品), 47100000(中类,清洁产品), 47190000(中类,清洁和卫生产品组合装), 51000000(大类,医疗保健), 10100000(中类,宠物护理用品) |
扫码器硬件
为什么不用现成的条码枪?
- 体积大,无法嵌入柜子,无法摆脱一手拿物品、一手拿机器扫描的操作模式;
- 成本高,典型的无线条码扫描枪价格在 180 元左右,无线条码/二维码扫描枪价格在 280 元左右;
- 无法设置切换出库/入库;
自制的扫码器具有小体积、低功耗、低成本、强兼容的特点。能识别 EAN 码、UPC 码、QR 二维码、ISBN 码等。因此,在完成现有功能的前提下,未来还可用于识别录入厂商私有码、录入书籍等功能。扫码器所使用的模块包括:
- 扫描模块 GM805
- ESP01
- AMS1117
- 限位开关
- 3.7V,600mAh 锂电池
扫描模块 GM805 带蜂鸣器和灯光,ESP01 负责将 GM805 扫描获取的条码数据上传至服务器。通过限位开关触发开机/关机,实现扫码器的超长续航;通过拨动开关可以设置出库(默认)/入库。以下为硬件接线示意图。
关于自动启停和续航。GM805 的工作电流 <70mA,休眠电流约 6mA,因此,即便 ESP8266 的休眠电流能做到微安级,600mAh 也无法让扫描器整机待机一周以上。因此,通过限位开关来触发开/关机,能很好地避免闲时的电量损耗。经我的测试,600mAh 能让扫描器连续工作 3.5 小时左右。根据我们的习惯,预计 4 周以上是没问题的。
关于启动速度。无任何优化,扫描器能在 3 秒内进入工作状态,主要限制是在 ESP8266 的联网速度上。如果通过设置静态 IP,可以极大提升初始化速度5,1~2 秒内可以完成启动。
服务端
服务器部署了一个简单的服务端,负责处理扫码器上传的数据、对外抓取条码信息、与 Grocy 进行通信。对外抓取的原始数据将存储在 Grocy 的 GDSInfo 参数中,供日后的升级定制使用;还能自动完成商品图片的自动抠图;对于未收录于中国物品编码中心的国际商品(无国内代理),爬取 BarcodeLookup 完成信息补充。
Grocy 的设置
GDSInfo
通过「自定义项目」在产品属性中添加以一个自定义属性「GDSInfo」,GrocyCompanionCN 获取的商品原始数据存储在 GGDSInfo 参数中,供日后的功能升级使用。
父产品
父产品可以累计所属子产品总数,并设置总安全库存。比如我们设置一个父产品「抽纸」。「抽纸」包含 3 个子产品,总的安全库存为「3」,当「抽纸」的总数低于等于 3 时,Grocy 将自动加入购物清单,提示我们补货。这样我们就不用纠结于设置每个子产品的安全库存了。子产品的自动归类可以通过 GPC 码和商品关键词判定来完成。
API 与自动化
Grocy 提供了易用的 REST API,我们可以方便地拓展功能,打通数据流。如将补货提醒通过 Gotify 提示;将购物清单发送至待办清单;将待办家务通过智能音箱播报提醒等等。
Grocy 条形码
Grocy 会为每个实体都生成一个唯一的条形码。当物品包装拆除、条码丢失,或是商品为赠品、小样、试用装(无 EAN 码)时,我们能通过标签打印机制作一个条码赋予这类物品。
结语
与以往仅通过手机与软件来管理库存的方法不同,我们设计了一个很简洁的硬件,来帮助我们打破数据和真实世界的这堵屏障,解放了用户这个「中间人」的角色。
本方案以 Grocy 作为数据库进行物品的管理,但经过简单的修改,我们也能将数据自动化地同步到让 Notion 或者像 Airtable 这样的多维表格中。以提供多样的可视化选择。
最后,祝各位双十一囤货愉快。
> 关注 少数派公众号,解锁全新阅读体验 📰
> 实用、好用的 正版软件,少数派为你呈现 🚀
© 本文著作权归作者所有,并授权少数派独家使用,未经少数派许可,不得转载使用。