按:此文原载于2023年10月少数派首页推荐规划库存、减少浪费:以 Grocy 为数据库的物品管理方案。分享我使用Grocy和开发GrocyCompanionCN的经验。
前言 #
我们家有两口子,平时有囤货的习惯。我们自认为生活中还是有比较良好的收纳习惯,但时而还是会为躺在柜子深处过期的物品而感到惭愧,亦或是重复购买了超量的物品。为此,家里的女主人率先行动,开始清点家里的库存并将条目数字化,后来,使用一款名为”过期啦“的APP进行管理。一年后,又值大促来临,准备囤货了,我问老婆”你还用’过期啦‘吗?“,”不用了,有点麻烦,老是忘了记录。“
在进一步深入之前,我们认真思考了家庭内搞库存管理是不是在”过度管理“。最终我们认同了家庭库存管理价值的:1.能一目了然地知道家里的存货;2.能规划物品使用,有效地较少浪费;3.让患有仓鼠症的人感到满足。但有前提,物品足够多,以及高度自动化。
收纳APP - 止于懒惰 #
我开始在网上寻找志同道合的人。发现已经有很多实践了,有人用收纳APP来记录,还有人用Notion、滴答清单来管理。1
这些APP做得非常精美,功能全面,甚至有很多拓展功能,如购物记录 、价格跟踪、食谱规划等等。我们也订阅过一些APP进行了深度的使用,使用过一段时间后,都放弃了,主观因素是,懒惰。但我们发现这些应用/服务都有一个客观缺陷:出入库困难。按最简流程,完成一个商品的出库都需要“拿起手机-解锁手机-找到并点开APP-扫码物品”;而入库则更加繁琐,在上述出库的步骤基础上,还需要完成”数量”、”保质期“、”存放地“等设置。更现实的是,在家庭生活场景中,手机并不是时时刻刻在身上的。比如:洗澡时,发现香皂用完了,到浴室柜里拿一个;做饭时,锅正热着,发现食用油用完了,赶紧到仓库里拿一瓶。一但没有于当下将物品出入库,后面很难再想起补出入库了,库存中的存量数字也变得不再可信。正如某位网友所评价的:
你需要的是一个24小时监控你的贾维斯。而不是这样的一个APP。记录不到五条你就会醒悟,哦,还是用脑子记更方便。人类进化的动力就是懒……
如果你也用过其他收纳类的 App,就应该能体会到最难的地方在于坚持物品录入。
基于以前失败的经验,我们总结出自己所需的核心功能:
- 物品快速自动出入库;
- 物品信息自动识别与归类;
- 过期、低库存提醒;
- 自动补充清单;
除此之外的功能都只是锦上添花。我们渴求的这些核心功能不是点到为止,而是要尽可能地自动化。要实现个性化的需求,只能自己动手,或者寻求开源社区的帮助,于是我找到了Grocy。
开源方案 - Grocy #
ERP beyond your fridge - Grocy is a web-based self-hosted groceries & household management solution for your home.
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个细类。3
GPC分类代码是国际物品编码组织(GS1)依据GPC标准将特征相似的商品归为一类的代码。GS1全球商品分类标准(Global Product Classification, GPC)不断扩展更新,每年发布两个新版本。GPC分类代码按照大类(Segment)、中类(Family)、小类(Class)、细类(Brick)来划分,并细分为具体的商品核心属性类型和属性值。商品数据交换中,通常采用第4级代码,即细类代码。4
条形码只能告诉我们商品的注册信息,无法定位到商品的生产日期,也极少提供保质期信息。于是我观察了一下生活中的常见物品保质期,灵活使用四类GPC分类代码,预先设置好新物品的保质期。同时,设置一些偏移量:半年(-30天),1年(-60天),3年(-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也无法让扫描器整机待机1周以上。因此,通过限位开关来触发开/关机,能很好地避免闲时的电量损耗。经我的测试,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提示;将购物清单发送至ToDo清单;将待办家务通过智能音箱播报提醒等等。
Grocy条形码 #
Grocy会为每个实体都生成一个唯一的条形码。当物品包装拆除、条码丢失,或是商品为赠品、小样、试用装(无EAN码)时,我们能通过标签打印机制作一个条码赋予这类物品。
结语 #
与以往仅通过手机与软件来管理库存的方法不同,我们设计了一个很简洁的硬件,来帮助我们打破数据和真实世界的这堵屏障,解放了用户这个”中间人“的角色。
本方案以Grocy作为数据库进行物品的管理,但经过简单的修改,我们也能将数据自动化地同步到让Notion或者像Airtable这样的多维表格中。以提供多样的可视化选择。
最后,祝各位双十一囤货愉快。