TigerTag Firebase

第三方集成参考TigerTag Firebase Integration

将 Home Assistant、ESP32 电子秤或 Python 脚本连接到 TigerTag 账户。

本仓库说明任何客户端如何使用用户自己的 TigerTag 凭据登录,读取其在 Firestore 中的线材卷和料架,并写回线材卷重量。这里记录的内容即已部署的内容,每一项变更都会记入更新日志。

0.1.3最新发布的契约版本(CHANGELOG,2026 年 5 月 2 日)
1 小时idToken 的有效期:请在过期前刷新
5 分钟建议的最短轮询间隔
3 个月字段重命名或移除前的最短弃用通知期

客户端如何连接 TigerTag

每个客户端都遵循相同的四个步骤:获取公开的 Firebase 配置,以用户身份登录,使用用户的令牌调用 Firestore REST API,并保持该令牌有效。

  1. 1

    获取公开配置

    一次 GET 请求即可返回 Firebase 项目配置。apiKey 本来就是公开的:它标识的是项目,而不是调用方。请缓存它,每周刷新一次即可。

    01-firebase-config.md
  2. 2

    以用户身份登录

    用户自己的邮箱和密码会返回一个 UID、一个有效期 1 小时的 idToken 和一个 refreshToken。Google Sign-In 需要浏览器,因此无界面客户端使用密码登录。

    02-authentication.md
  3. 3

    读写 Firestore

    将 idToken 作为 Bearer 令牌发送。线材卷位于 users/{uid}/inventory,料架位于 users/{uid}/racks;重量为净重(克),日期为 Unix 毫秒时间戳。

    03-data-model.md
  4. 4

    保持令牌有效

    在一小时到期前刷新 idToken,并替换已保存的两个令牌。遇到 permission-denied 时,刷新一次并重试一次读取。

    刷新 idToken

三次调用,摘自文档

GET  https://tigertag-cdn.web.app/__/firebase/init.json

POST https://identitytoolkit.googleapis.com/v1/accounts:signInWithPassword?key={apiKey}
     { "email": "user@example.com", "password": "…", "returnSecureToken": true }

GET  https://firestore.googleapis.com/v1/projects/{projectId}/databases/(default)/documents/users/{uid}/inventory
     Authorization: Bearer {idToken}

花括号中的值来自上一次调用:apiKey 和 projectId 来自配置,uid 和 idToken 来自登录。

本仓库中记录的集成

docs/clients 中的每份指南都涵盖身份验证、读取或写入的数据、字段映射和代码。以下代码片段摘自这些指南。

组件草稿

Home Assistant

一个 Home Assistant 自定义组件,为每个线材卷提供一个传感器,状态值为剩余重量(克)。指南还涵盖好友的库存、分页和令牌存储;配置流程和传感器只是骨架代码,完整可运行的组件尚待编写。

{
  "domain": "tigertag",
  "name":   "TigerTag",
  "version": "0.1.0",
  "requirements": ["pyrebase4>=4.5.0"],
  "config_flow": true,
  "iot_class": "cloud_polling"
}
Arduino 程序

ESP32 / Arduino

适用于电子秤或 NFC 设备:根据扫描到的 RFID UID 查找线材卷(先 uid,再 twin_uid),计算净重,并通过更新掩码写入 weight_available 和 last_update。指南最后附有一个完整的 ESP32 程序(WiFi、ArduinoJson)。

weight_available = max(0, measured_raw_weight - container_weight)
完整客户端

Python CLI

一个基于 Pyrebase4 的极简 Python 客户端:登录,列出您的线材卷,并显示每位好友拥有的线材卷数量。指南包含完整脚本和一次运行示例。

pip install -r requirements.txt
python tigertag_client.py
完整脚本

Spoolman bridge

从 TigerTag 到 Spoolman 实例的单向桥接:品牌成为供应商,每种品牌、材料和颜色的组合成为一种线材,每个库存文档成为一个线材卷,通过 Spoolman 的 REST API 写入或更新。可通过 cron、systemd 或 Docker 运行。

pip install -r requirements.txt
export TIGERTAG_EMAIL=you@example.com
export TIGERTAG_PASSWORD=yourpassword
export SPOOLMAN_URL=http://192.168.1.10:7912
export DRY_RUN=1                    # dry-run mode
python3 sync.py
设备契约

TigerScale

TigerScale 或兼容电子秤要在 Tiger Studio Manager 和 TigerTag 移动应用中显示为在线所需遵循的契约:每 30 秒一个心跳文档,每次读数稳定时更新一次重量,双芯片标签在一个原子批处理中写入。

users/{uid}/scales/{mac}          ← heartbeat, every 30 s
users/{uid}/inventory/{spoolId}   ← weight_available + last_update

要为其他平台开发?新指南放在 docs/clients 中,可选的可运行示例放在 examples/ 中。 CONTRIBUTING.md

用户的账户,用户的规则

没有需要保护的共享密钥,也没有可能泄露的主令牌:客户端能做的恰好就是其用户能做的,并由 Firestore 在服务器端强制执行。

没有服务账户

每个客户端都使用最终用户自己的凭据登录。切勿在第三方客户端中包含 firebase-admin SDK 或任何管理员密钥。

由 Security Rules 决定

Firestore Security Rules 根据 request.auth.uid 检查每个请求:所有者可读写自己的文档,好友可读取库存和料架,任何未被允许的操作都会被拒绝。规则的公开副本位于 rules/firestore.rules。

每段好友关系一条纽带

接受好友请求会在双方各写入一个文档。只要 users/{friend}/friends/{you} 存在,您就可以只读访问该好友的库存和料架;删除该文档会立即切断访问。

04-friend-system.md

礼貌轮询

轮询频率最高每 5 分钟一次,绝不低于 30 秒,仅在值发生变化时写入,并在列表读取时传入 limit(200 个线材卷,50 个料架)。未强制启用 Firebase App Check。

05-rate-limiting.md

面向集成者的公开契约

本仓库被视为一份公开契约:影响客户端的变更会在同一版本中同步到本仓库,更新日志将每项变更记录为 Added、Changed、Deprecated、Removed、Fixed 或 Security。

不会在未经通知的情况下变更

  • 文档路径,例如 users/{uid}/inventory/{spoolId}、users/{uid}/racks/{rackId} 和 users/{uid}/friends/{friendUid}。
  • 每个已记录字段的名称和含义:weight_available 为净重(克),last_update 为 Unix 毫秒时间戳,deleted: true 表示软删除。
  • 好友访问模型,以及客户端登录所用的 Firebase Auth 端点。
  • apiKey 和 projectId,除非整个项目迁移,且会至少提前 6 个月公布。

可能变更:请做好防御

  • 查找表会新增品牌和材料;数字 id 只增不减,且永不重复使用。
  • cdn.tigertag.io 上的便捷 HTTPS 端点,其请求和响应结构可能会演变。
  • 新集合和新字段始终是增量添加的:忽略您不认识的字段,即可保持兼容。

参考文档

每个集成所依赖的核心文档,按客户端需要的顺序排列。

TigerTag 生态的一部分

本指南涵盖云端账户。芯片、应用和 SDK 各有自己的代码仓库。

TigerTag 协议

用于线材卷和树脂瓶的开放 NFC 芯片格式、其规范和参考数据库。

打开

Tiger Studio Manager

管理同一库存的桌面应用(Electron);本文档会根据其各个版本进行核对。

代码仓库

TigerTag SDK

离线读取、验证、创建和修补 TigerTag 芯片,支持 JavaScript 或 Python,采用 Apache-2.0 许可。

常见问题

我需要服务账户或管理员密钥吗?

不需要。每个客户端都使用最终用户自己的 TigerTag 邮箱和密码登录,由 Firestore Security Rules 决定该用户可以读取或写入什么。不存在共享的管理员密钥,并且绝不能在第三方客户端中使用 firebase-admin SDK。

为什么 Firebase apiKey 是公开的?

apiKey 标识的是 TigerTag Firebase 项目,而不是调用方。如果没有以真实用户身份登录获得的有效 idToken,它无法访问任何内容;访问控制由身份验证和 Security Rules 完成。

Home Assistant 或 ESP32 可以使用 Google 登录吗?

不能直接登录:Google Sign-In 需要浏览器重定向。只使用过 Google 登录的用户需要先通过桌面或移动应用的忘记密码流程为账户设置密码,然后再使用邮箱和密码登录。

我的集成可以多频繁地轮询?

传感器最高每 5 分钟一次,料架概览每 15 分钟一次,且绝不低于 30 秒。电子秤仅在重量变化时写入。列表读取应传入 limit:库存为 200,料架为 50。

我的集成可以读取好友的线材卷吗?

可以,只读。两位用户成为好友后,双方都会在 users/{uid}/friends 下拥有对方的文档,规则允许好友读取库存和料架。任何一方都可以随时解除好友关系,访问会立即被切断。

如果生产环境与本文档不一致怎么办?

以文档为准:出现差异意味着发布了回归问题。请在代码仓库中提交 issue,附上页面、您读取或写入的路径以及响应内容,并删除其中的令牌和私有密钥。

我可以在什么许可下复用这些代码?

Security Rules 和文档中的每个代码片段均采用 Apache-2.0 许可,粘贴到您自己项目中的代码片段无需署名。文档本身采用 CC-BY-4.0 许可。TigerTag 名称、标志和服务不在这些许可范围内。

开始您的集成

在 README 的快速链接中选择适合您平台的指南,从登录一直跟随到第一次读取。

打开快速链接