tapesmith 0.4.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (442) hide show
  1. tapesmith-0.4.0/.gitignore +11 -0
  2. tapesmith-0.4.0/LICENSE +21 -0
  3. tapesmith-0.4.0/PKG-INFO +246 -0
  4. tapesmith-0.4.0/README.md +188 -0
  5. tapesmith-0.4.0/THIRD_PARTY_NOTICES.md +86 -0
  6. tapesmith-0.4.0/deploy/homeassistant/README.md +107 -0
  7. tapesmith-0.4.0/deploy/infra/README.md +159 -0
  8. tapesmith-0.4.0/deploy/powershell/Tapesmith/README.md +113 -0
  9. tapesmith-0.4.0/deploy/shortlink/README.md +85 -0
  10. tapesmith-0.4.0/docs/hardware/README.md +177 -0
  11. tapesmith-0.4.0/pyproject.toml +95 -0
  12. tapesmith-0.4.0/src/tapesmith/__init__.py +28 -0
  13. tapesmith-0.4.0/src/tapesmith/__main__.py +28 -0
  14. tapesmith-0.4.0/src/tapesmith/apitokens.py +190 -0
  15. tapesmith-0.4.0/src/tapesmith/archive.py +220 -0
  16. tapesmith-0.4.0/src/tapesmith/automation/__init__.py +1 -0
  17. tapesmith-0.4.0/src/tapesmith/automation/facade.py +131 -0
  18. tapesmith-0.4.0/src/tapesmith/automation/hotfolder.py +542 -0
  19. tapesmith-0.4.0/src/tapesmith/automation/mqtt.py +470 -0
  20. tapesmith-0.4.0/src/tapesmith/automation/telegram.py +506 -0
  21. tapesmith-0.4.0/src/tapesmith/automation/update.py +143 -0
  22. tapesmith-0.4.0/src/tapesmith/backup.py +239 -0
  23. tapesmith-0.4.0/src/tapesmith/calibrate.py +46 -0
  24. tapesmith-0.4.0/src/tapesmith/cli.py +446 -0
  25. tapesmith-0.4.0/src/tapesmith/cli_cmds/__init__.py +6 -0
  26. tapesmith-0.4.0/src/tapesmith/cli_cmds/app.py +34 -0
  27. tapesmith-0.4.0/src/tapesmith/cli_cmds/archive.py +85 -0
  28. tapesmith-0.4.0/src/tapesmith/cli_cmds/asn.py +117 -0
  29. tapesmith-0.4.0/src/tapesmith/cli_cmds/asset.py +205 -0
  30. tapesmith-0.4.0/src/tapesmith/cli_cmds/asset_notiz.py +46 -0
  31. tapesmith-0.4.0/src/tapesmith/cli_cmds/backup.py +73 -0
  32. tapesmith-0.4.0/src/tapesmith/cli_cmds/base.py +439 -0
  33. tapesmith-0.4.0/src/tapesmith/cli_cmds/batch.py +219 -0
  34. tapesmith-0.4.0/src/tapesmith/cli_cmds/batterie.py +162 -0
  35. tapesmith-0.4.0/src/tapesmith/cli_cmds/ble.py +38 -0
  36. tapesmith-0.4.0/src/tapesmith/cli_cmds/configcmd.py +110 -0
  37. tapesmith-0.4.0/src/tapesmith/cli_cmds/daemon.py +144 -0
  38. tapesmith-0.4.0/src/tapesmith/cli_cmds/density.py +126 -0
  39. tapesmith-0.4.0/src/tapesmith/cli_cmds/disks.py +170 -0
  40. tapesmith-0.4.0/src/tapesmith/cli_cmds/drives.py +73 -0
  41. tapesmith-0.4.0/src/tapesmith/cli_cmds/garantie.py +104 -0
  42. tapesmith-0.4.0/src/tapesmith/cli_cmds/gui.py +36 -0
  43. tapesmith-0.4.0/src/tapesmith/cli_cmds/history.py +66 -0
  44. tapesmith-0.4.0/src/tapesmith/cli_cmds/homelab.py +103 -0
  45. tapesmith-0.4.0/src/tapesmith/cli_cmds/hotfolder.py +172 -0
  46. tapesmith-0.4.0/src/tapesmith/cli_cmds/install.py +55 -0
  47. tapesmith-0.4.0/src/tapesmith/cli_cmds/integrate.py +70 -0
  48. tapesmith-0.4.0/src/tapesmith/cli_cmds/inv.py +241 -0
  49. tapesmith-0.4.0/src/tapesmith/cli_cmds/ka.py +211 -0
  50. tapesmith-0.4.0/src/tapesmith/cli_cmds/kabel.py +208 -0
  51. tapesmith-0.4.0/src/tapesmith/cli_cmds/kurz.py +119 -0
  52. tapesmith-0.4.0/src/tapesmith/cli_cmds/mcp.py +58 -0
  53. tapesmith-0.4.0/src/tapesmith/cli_cmds/module.py +72 -0
  54. tapesmith-0.4.0/src/tapesmith/cli_cmds/mqtt.py +60 -0
  55. tapesmith-0.4.0/src/tapesmith/cli_cmds/nummern.py +79 -0
  56. tapesmith-0.4.0/src/tapesmith/cli_cmds/platte.py +142 -0
  57. tapesmith-0.4.0/src/tapesmith/cli_cmds/plausi.py +122 -0
  58. tapesmith-0.4.0/src/tapesmith/cli_cmds/print_cmd.py +60 -0
  59. tapesmith-0.4.0/src/tapesmith/cli_cmds/proxmox.py +129 -0
  60. tapesmith-0.4.0/src/tapesmith/cli_cmds/qr.py +123 -0
  61. tapesmith-0.4.0/src/tapesmith/cli_cmds/queue.py +135 -0
  62. tapesmith-0.4.0/src/tapesmith/cli_cmds/raw.py +112 -0
  63. tapesmith-0.4.0/src/tapesmith/cli_cmds/report.py +75 -0
  64. tapesmith-0.4.0/src/tapesmith/cli_cmds/reprint.py +57 -0
  65. tapesmith-0.4.0/src/tapesmith/cli_cmds/secret.py +73 -0
  66. tapesmith-0.4.0/src/tapesmith/cli_cmds/setup.py +72 -0
  67. tapesmith-0.4.0/src/tapesmith/cli_cmds/sn_scan.py +88 -0
  68. tapesmith-0.4.0/src/tapesmith/cli_cmds/stats.py +73 -0
  69. tapesmith-0.4.0/src/tapesmith/cli_cmds/status.py +48 -0
  70. tapesmith-0.4.0/src/tapesmith/cli_cmds/tape.py +72 -0
  71. tapesmith-0.4.0/src/tapesmith/cli_cmds/telegram.py +72 -0
  72. tapesmith-0.4.0/src/tapesmith/cli_cmds/token.py +89 -0
  73. tapesmith-0.4.0/src/tapesmith/cli_cmds/tray.py +39 -0
  74. tapesmith-0.4.0/src/tapesmith/cli_cmds/uninstall.py +32 -0
  75. tapesmith-0.4.0/src/tapesmith/cli_cmds/update.py +129 -0
  76. tapesmith-0.4.0/src/tapesmith/cli_cmds/usb.py +32 -0
  77. tapesmith-0.4.0/src/tapesmith/cli_cmds/vault.py +214 -0
  78. tapesmith-0.4.0/src/tapesmith/clipboard.py +290 -0
  79. tapesmith-0.4.0/src/tapesmith/commandreg.py +129 -0
  80. tapesmith-0.4.0/src/tapesmith/compat.py +149 -0
  81. tapesmith-0.4.0/src/tapesmith/config.py +907 -0
  82. tapesmith-0.4.0/src/tapesmith/configcode.py +251 -0
  83. tapesmith-0.4.0/src/tapesmith/connection.py +404 -0
  84. tapesmith-0.4.0/src/tapesmith/daemon/__init__.py +12 -0
  85. tapesmith-0.4.0/src/tapesmith/daemon/__main__.py +5 -0
  86. tapesmith-0.4.0/src/tapesmith/daemon/addons.py +219 -0
  87. tapesmith-0.4.0/src/tapesmith/daemon/instance.py +272 -0
  88. tapesmith-0.4.0/src/tapesmith/daemon/probe.py +200 -0
  89. tapesmith-0.4.0/src/tapesmith/daemon/queue.py +420 -0
  90. tapesmith-0.4.0/src/tapesmith/daemon/runner.py +290 -0
  91. tapesmith-0.4.0/src/tapesmith/daemon/server.py +249 -0
  92. tapesmith-0.4.0/src/tapesmith/daemon/service.py +719 -0
  93. tapesmith-0.4.0/src/tapesmith/dataimport/__init__.py +2 -0
  94. tapesmith-0.4.0/src/tapesmith/dataimport/batch.py +187 -0
  95. tapesmith-0.4.0/src/tapesmith/dataimport/mapping.py +114 -0
  96. tapesmith-0.4.0/src/tapesmith/dataimport/table.py +161 -0
  97. tapesmith-0.4.0/src/tapesmith/density.py +118 -0
  98. tapesmith-0.4.0/src/tapesmith/device/__init__.py +0 -0
  99. tapesmith-0.4.0/src/tapesmith/device/profile.py +132 -0
  100. tapesmith-0.4.0/src/tapesmith/device/profiles/__init__.py +0 -0
  101. tapesmith-0.4.0/src/tapesmith/device/profiles/p12.json +22 -0
  102. tapesmith-0.4.0/src/tapesmith/doctor.py +97 -0
  103. tapesmith-0.4.0/src/tapesmith/document/__init__.py +1 -0
  104. tapesmith-0.4.0/src/tapesmith/document/editing.py +335 -0
  105. tapesmith-0.4.0/src/tapesmith/document/from_spec.py +105 -0
  106. tapesmith-0.4.0/src/tapesmith/document/generators/__init__.py +55 -0
  107. tapesmith-0.4.0/src/tapesmith/document/generators/kabelfahne.py +148 -0
  108. tapesmith-0.4.0/src/tapesmith/document/generators/kabelwickel.py +82 -0
  109. tapesmith-0.4.0/src/tapesmith/document/generators/raster.py +218 -0
  110. tapesmith-0.4.0/src/tapesmith/document/generators/raster_export.py +73 -0
  111. tapesmith-0.4.0/src/tapesmith/document/model.py +429 -0
  112. tapesmith-0.4.0/src/tapesmith/document/render.py +440 -0
  113. tapesmith-0.4.0/src/tapesmith/document/snap.py +176 -0
  114. tapesmith-0.4.0/src/tapesmith/document/targets.json +16 -0
  115. tapesmith-0.4.0/src/tapesmith/document/targets.py +155 -0
  116. tapesmith-0.4.0/src/tapesmith/document/undo.py +88 -0
  117. tapesmith-0.4.0/src/tapesmith/drives.py +225 -0
  118. tapesmith-0.4.0/src/tapesmith/errors.py +279 -0
  119. tapesmith-0.4.0/src/tapesmith/export.py +117 -0
  120. tapesmith-0.4.0/src/tapesmith/fileutil.py +106 -0
  121. tapesmith-0.4.0/src/tapesmith/fonts/DejaVuSans-Bold.ttf +0 -0
  122. tapesmith-0.4.0/src/tapesmith/fonts/DejaVuSans.ttf +0 -0
  123. tapesmith-0.4.0/src/tapesmith/fonts/DejaVuSansMono.ttf +0 -0
  124. tapesmith-0.4.0/src/tapesmith/fonts/LICENSE +187 -0
  125. tapesmith-0.4.0/src/tapesmith/fonts/__init__.py +0 -0
  126. tapesmith-0.4.0/src/tapesmith/guard.py +207 -0
  127. tapesmith-0.4.0/src/tapesmith/gui/__init__.py +7 -0
  128. tapesmith-0.4.0/src/tapesmith/gui/__main__.py +7 -0
  129. tapesmith-0.4.0/src/tapesmith/gui/hotkey.py +148 -0
  130. tapesmith-0.4.0/src/tapesmith/gui/icons.py +130 -0
  131. tapesmith-0.4.0/src/tapesmith/gui/preview_model.py +171 -0
  132. tapesmith-0.4.0/src/tapesmith/gui/qtutil.py +114 -0
  133. tapesmith-0.4.0/src/tapesmith/gui/recent.py +35 -0
  134. tapesmith-0.4.0/src/tapesmith/gui/services.py +216 -0
  135. tapesmith-0.4.0/src/tapesmith/gui/theme.py +112 -0
  136. tapesmith-0.4.0/src/tapesmith/gui/tray.py +994 -0
  137. tapesmith-0.4.0/src/tapesmith/history.py +376 -0
  138. tapesmith-0.4.0/src/tapesmith/hotkeyspec.py +146 -0
  139. tapesmith-0.4.0/src/tapesmith/i18n.py +337 -0
  140. tapesmith-0.4.0/src/tapesmith/icons/LICENSE-tabler.txt +21 -0
  141. tapesmith-0.4.0/src/tapesmith/icons/__init__.py +1 -0
  142. tapesmith-0.4.0/src/tapesmith/icons/app.ico +0 -0
  143. tapesmith-0.4.0/src/tapesmith/icons/categories.json +78 -0
  144. tapesmith-0.4.0/src/tapesmith/icons/simple/LICENSE-simple-icons.txt +30 -0
  145. tapesmith-0.4.0/src/tapesmith/icons/simple/MARKEN.txt +4 -0
  146. tapesmith-0.4.0/src/tapesmith/icons/simple/__init__.py +0 -0
  147. tapesmith-0.4.0/src/tapesmith/icons/simple/cloudflare.png +0 -0
  148. tapesmith-0.4.0/src/tapesmith/icons/simple/debian.png +0 -0
  149. tapesmith-0.4.0/src/tapesmith/icons/simple/docker.png +0 -0
  150. tapesmith-0.4.0/src/tapesmith/icons/simple/grafana.png +0 -0
  151. tapesmith-0.4.0/src/tapesmith/icons/simple/homeassistant.png +0 -0
  152. tapesmith-0.4.0/src/tapesmith/icons/simple/index.json +85 -0
  153. tapesmith-0.4.0/src/tapesmith/icons/simple/jellyfin.png +0 -0
  154. tapesmith-0.4.0/src/tapesmith/icons/simple/linux.png +0 -0
  155. tapesmith-0.4.0/src/tapesmith/icons/simple/nextcloud.png +0 -0
  156. tapesmith-0.4.0/src/tapesmith/icons/simple/nginx.png +0 -0
  157. tapesmith-0.4.0/src/tapesmith/icons/simple/obsidian.png +0 -0
  158. tapesmith-0.4.0/src/tapesmith/icons/simple/opnsense.png +0 -0
  159. tapesmith-0.4.0/src/tapesmith/icons/simple/paperlessngx.png +0 -0
  160. tapesmith-0.4.0/src/tapesmith/icons/simple/pfsense.png +0 -0
  161. tapesmith-0.4.0/src/tapesmith/icons/simple/proxmox.png +0 -0
  162. tapesmith-0.4.0/src/tapesmith/icons/simple/raspberrypi.png +0 -0
  163. tapesmith-0.4.0/src/tapesmith/icons/simple/synology.png +0 -0
  164. tapesmith-0.4.0/src/tapesmith/icons/simple/tailscale.png +0 -0
  165. tapesmith-0.4.0/src/tapesmith/icons/simple/truenas.png +0 -0
  166. tapesmith-0.4.0/src/tapesmith/icons/simple/ubuntu.png +0 -0
  167. tapesmith-0.4.0/src/tapesmith/icons/simple/wireguard.png +0 -0
  168. tapesmith-0.4.0/src/tapesmith/icons/tabler-icons.ttf +0 -0
  169. tapesmith-0.4.0/src/tapesmith/icons/tabler-index.json +1 -0
  170. tapesmith-0.4.0/src/tapesmith/imageinput.py +128 -0
  171. tapesmith-0.4.0/src/tapesmith/install/__init__.py +6 -0
  172. tapesmith-0.4.0/src/tapesmith/install/installer.py +478 -0
  173. tapesmith-0.4.0/src/tapesmith/install/junction.py +67 -0
  174. tapesmith-0.4.0/src/tapesmith/install/layout.py +201 -0
  175. tapesmith-0.4.0/src/tapesmith/install/legacy.py +231 -0
  176. tapesmith-0.4.0/src/tapesmith/install/processes.py +221 -0
  177. tapesmith-0.4.0/src/tapesmith/install/registry.py +112 -0
  178. tapesmith-0.4.0/src/tapesmith/install/shortcuts.py +109 -0
  179. tapesmith-0.4.0/src/tapesmith/install/uninstaller.py +213 -0
  180. tapesmith-0.4.0/src/tapesmith/install/venv.py +241 -0
  181. tapesmith-0.4.0/src/tapesmith/integration.py +429 -0
  182. tapesmith-0.4.0/src/tapesmith/integrations/__init__.py +7 -0
  183. tapesmith-0.4.0/src/tapesmith/integrations/assetnote.py +78 -0
  184. tapesmith-0.4.0/src/tapesmith/integrations/assets.py +327 -0
  185. tapesmith-0.4.0/src/tapesmith/integrations/cliprint.py +158 -0
  186. tapesmith-0.4.0/src/tapesmith/integrations/codescan.py +290 -0
  187. tapesmith-0.4.0/src/tapesmith/integrations/credentials.py +158 -0
  188. tapesmith-0.4.0/src/tapesmith/integrations/errors.py +93 -0
  189. tapesmith-0.4.0/src/tapesmith/integrations/frontmatter.py +189 -0
  190. tapesmith-0.4.0/src/tapesmith/integrations/homeassistant.py +217 -0
  191. tapesmith-0.4.0/src/tapesmith/integrations/httpclient.py +91 -0
  192. tapesmith-0.4.0/src/tapesmith/integrations/kleinanzeigen.py +300 -0
  193. tapesmith-0.4.0/src/tapesmith/integrations/mcpclient.py +186 -0
  194. tapesmith-0.4.0/src/tapesmith/integrations/netbox.py +189 -0
  195. tapesmith-0.4.0/src/tapesmith/integrations/obsidian.py +325 -0
  196. tapesmith-0.4.0/src/tapesmith/integrations/paperless.py +298 -0
  197. tapesmith-0.4.0/src/tapesmith/integrations/plausi.py +267 -0
  198. tapesmith-0.4.0/src/tapesmith/integrations/proxmox.py +438 -0
  199. tapesmith-0.4.0/src/tapesmith/integrations/scancache.py +99 -0
  200. tapesmith-0.4.0/src/tapesmith/integrations/settings.py +409 -0
  201. tapesmith-0.4.0/src/tapesmith/integrations/shortlink.py +169 -0
  202. tapesmith-0.4.0/src/tapesmith/integrations/snippet.py +143 -0
  203. tapesmith-0.4.0/src/tapesmith/integrations/tia606.py +218 -0
  204. tapesmith-0.4.0/src/tapesmith/integrations/winclip.py +76 -0
  205. tapesmith-0.4.0/src/tapesmith/integrations/zfsreplace.py +336 -0
  206. tapesmith-0.4.0/src/tapesmith/inventory.py +396 -0
  207. tapesmith-0.4.0/src/tapesmith/ipc/__init__.py +1 -0
  208. tapesmith-0.4.0/src/tapesmith/ipc/backend.py +650 -0
  209. tapesmith-0.4.0/src/tapesmith/ipc/client.py +205 -0
  210. tapesmith-0.4.0/src/tapesmith/ipc/codec.py +241 -0
  211. tapesmith-0.4.0/src/tapesmith/ipc/launcher.py +66 -0
  212. tapesmith-0.4.0/src/tapesmith/ipc/pipe.py +789 -0
  213. tapesmith-0.4.0/src/tapesmith/ipc/protocol.py +153 -0
  214. tapesmith-0.4.0/src/tapesmith/jobs.py +80 -0
  215. tapesmith-0.4.0/src/tapesmith/labelmeta.py +64 -0
  216. tapesmith-0.4.0/src/tapesmith/launch.py +93 -0
  217. tapesmith-0.4.0/src/tapesmith/locales/__init__.py +0 -0
  218. tapesmith-0.4.0/src/tapesmith/locales/de/common.json +18 -0
  219. tapesmith-0.4.0/src/tapesmith/locales/de/errors.json +222 -0
  220. tapesmith-0.4.0/src/tapesmith/locales/de/modules.json +60 -0
  221. tapesmith-0.4.0/src/tapesmith/locales/de/tray.json +114 -0
  222. tapesmith-0.4.0/src/tapesmith/locales/en/common.json +18 -0
  223. tapesmith-0.4.0/src/tapesmith/locales/en/errors.json +222 -0
  224. tapesmith-0.4.0/src/tapesmith/locales/en/modules.json +60 -0
  225. tapesmith-0.4.0/src/tapesmith/locales/en/tray.json +114 -0
  226. tapesmith-0.4.0/src/tapesmith/locales/messages/en.json +2592 -0
  227. tapesmith-0.4.0/src/tapesmith/lock.py +51 -0
  228. tapesmith-0.4.0/src/tapesmith/mcpserver/__init__.py +5 -0
  229. tapesmith-0.4.0/src/tapesmith/mcpserver/backends.py +196 -0
  230. tapesmith-0.4.0/src/tapesmith/mcpserver/server.py +213 -0
  231. tapesmith-0.4.0/src/tapesmith/mcpserver/tools.py +266 -0
  232. tapesmith-0.4.0/src/tapesmith/migrate.py +117 -0
  233. tapesmith-0.4.0/src/tapesmith/modules.py +397 -0
  234. tapesmith-0.4.0/src/tapesmith/netinfo.py +65 -0
  235. tapesmith-0.4.0/src/tapesmith/numbering.py +215 -0
  236. tapesmith-0.4.0/src/tapesmith/pacing.py +8 -0
  237. tapesmith-0.4.0/src/tapesmith/paths.py +65 -0
  238. tapesmith-0.4.0/src/tapesmith/pipeline.py +404 -0
  239. tapesmith-0.4.0/src/tapesmith/printer.py +175 -0
  240. tapesmith-0.4.0/src/tapesmith/printhooks.py +37 -0
  241. tapesmith-0.4.0/src/tapesmith/protocol/__init__.py +0 -0
  242. tapesmith-0.4.0/src/tapesmith/protocol/job.py +77 -0
  243. tapesmith-0.4.0/src/tapesmith/protocol/raster.py +28 -0
  244. tapesmith-0.4.0/src/tapesmith/protocol/rawcmd.py +85 -0
  245. tapesmith-0.4.0/src/tapesmith/protocol/status.py +77 -0
  246. tapesmith-0.4.0/src/tapesmith/render/__init__.py +0 -0
  247. tapesmith-0.4.0/src/tapesmith/render/barcode.py +93 -0
  248. tapesmith-0.4.0/src/tapesmith/render/chain.py +221 -0
  249. tapesmith-0.4.0/src/tapesmith/render/checks.py +28 -0
  250. tapesmith-0.4.0/src/tapesmith/render/code128.py +100 -0
  251. tapesmith-0.4.0/src/tapesmith/render/codes.py +61 -0
  252. tapesmith-0.4.0/src/tapesmith/render/compose.py +130 -0
  253. tapesmith-0.4.0/src/tapesmith/render/datamatrix.py +54 -0
  254. tapesmith-0.4.0/src/tapesmith/render/dither.py +58 -0
  255. tapesmith-0.4.0/src/tapesmith/render/fixes.py +191 -0
  256. tapesmith-0.4.0/src/tapesmith/render/fonts.py +46 -0
  257. tapesmith-0.4.0/src/tapesmith/render/icons.py +309 -0
  258. tapesmith-0.4.0/src/tapesmith/render/inkcheck.py +65 -0
  259. tapesmith-0.4.0/src/tapesmith/render/qr.py +78 -0
  260. tapesmith-0.4.0/src/tapesmith/render/qrcontent.py +175 -0
  261. tapesmith-0.4.0/src/tapesmith/render/shapes.py +109 -0
  262. tapesmith-0.4.0/src/tapesmith/render/text.py +120 -0
  263. tapesmith-0.4.0/src/tapesmith/render/textsize.py +84 -0
  264. tapesmith-0.4.0/src/tapesmith/render/zxing.py +83 -0
  265. tapesmith-0.4.0/src/tapesmith/reprint.py +150 -0
  266. tapesmith-0.4.0/src/tapesmith/secretref.py +149 -0
  267. tapesmith-0.4.0/src/tapesmith/selftest.py +522 -0
  268. tapesmith-0.4.0/src/tapesmith/setup.py +141 -0
  269. tapesmith-0.4.0/src/tapesmith/sourcelimits.py +81 -0
  270. tapesmith-0.4.0/src/tapesmith/sshscan.py +360 -0
  271. tapesmith-0.4.0/src/tapesmith/stats.py +96 -0
  272. tapesmith-0.4.0/src/tapesmith/status.py +122 -0
  273. tapesmith-0.4.0/src/tapesmith/statusview.py +169 -0
  274. tapesmith-0.4.0/src/tapesmith/support.py +186 -0
  275. tapesmith-0.4.0/src/tapesmith/tape/__init__.py +6 -0
  276. tapesmith-0.4.0/src/tapesmith/tape/preview.py +50 -0
  277. tapesmith-0.4.0/src/tapesmith/tape/profiles.py +179 -0
  278. tapesmith-0.4.0/src/tapesmith/tape/rolls.py +187 -0
  279. tapesmith-0.4.0/src/tapesmith/tape/suitability.py +69 -0
  280. tapesmith-0.4.0/src/tapesmith/tape/tapes.json +22 -0
  281. tapesmith-0.4.0/src/tapesmith/templates/__init__.py +0 -0
  282. tapesmith-0.4.0/src/tapesmith/templates/builtin/__init__.py +0 -0
  283. tapesmith-0.4.0/src/tapesmith/templates/builtin/absender.tapesmith.json +29 -0
  284. tapesmith-0.4.0/src/tapesmith/templates/builtin/asn.tapesmith.json +30 -0
  285. tapesmith-0.4.0/src/tapesmith/templates/builtin/asset-kurz.tapesmith.json +34 -0
  286. tapesmith-0.4.0/src/tapesmith/templates/builtin/asset-tag.tapesmith.json +32 -0
  287. tapesmith-0.4.0/src/tapesmith/templates/builtin/aufbewahrungsbox.tapesmith.json +34 -0
  288. tapesmith-0.4.0/src/tapesmith/templates/builtin/batterie.tapesmith.json +32 -0
  289. tapesmith-0.4.0/src/tapesmith/templates/builtin/datentraeger-qr.tapesmith.json +27 -0
  290. tapesmith-0.4.0/src/tapesmith/templates/builtin/datentraeger.tapesmith.json +27 -0
  291. tapesmith-0.4.0/src/tapesmith/templates/builtin/eigentum.tapesmith.json +32 -0
  292. tapesmith-0.4.0/src/tapesmith/templates/builtin/garantie-qr.tapesmith.json +37 -0
  293. tapesmith-0.4.0/src/tapesmith/templates/builtin/garantie.tapesmith.json +31 -0
  294. tapesmith-0.4.0/src/tapesmith/templates/builtin/gefriergut.tapesmith.json +43 -0
  295. tapesmith-0.4.0/src/tapesmith/templates/builtin/geoeffnet-am.tapesmith.json +28 -0
  296. tapesmith-0.4.0/src/tapesmith/templates/builtin/host-ip.tapesmith.json +35 -0
  297. tapesmith-0.4.0/src/tapesmith/templates/builtin/ip-label.tapesmith.json +25 -0
  298. tapesmith-0.4.0/src/tapesmith/templates/builtin/ka-artikel.tapesmith.json +36 -0
  299. tapesmith-0.4.0/src/tapesmith/templates/builtin/kabelfahne.tapesmith.json +37 -0
  300. tapesmith-0.4.0/src/tapesmith/templates/builtin/kabelwickel.tapesmith.json +29 -0
  301. tapesmith-0.4.0/src/tapesmith/templates/builtin/netzteil-warnung.tapesmith.json +36 -0
  302. tapesmith-0.4.0/src/tapesmith/templates/builtin/netzteil-zuordnung.tapesmith.json +31 -0
  303. tapesmith-0.4.0/src/tapesmith/templates/builtin/netzteil.tapesmith.json +31 -0
  304. tapesmith-0.4.0/src/tapesmith/templates/builtin/ordnerruecken-breit.tapesmith.json +27 -0
  305. tapesmith-0.4.0/src/tapesmith/templates/builtin/ordnerruecken-schmal.tapesmith.json +27 -0
  306. tapesmith-0.4.0/src/tapesmith/templates/builtin/passthrough.tapesmith.json +31 -0
  307. tapesmith-0.4.0/src/tapesmith/templates/builtin/platte-defekt.tapesmith.json +32 -0
  308. tapesmith-0.4.0/src/tapesmith/templates/builtin/preis.tapesmith.json +26 -0
  309. tapesmith-0.4.0/src/tapesmith/templates/builtin/psu-paar.tapesmith.json +32 -0
  310. tapesmith-0.4.0/src/tapesmith/templates/builtin/raster-patchpanel.tapesmith.json +26 -0
  311. tapesmith-0.4.0/src/tapesmith/templates/builtin/raster-sicherungskasten.tapesmith.json +25 -0
  312. tapesmith-0.4.0/src/tapesmith/templates/builtin/raster-sortiment.tapesmith.json +25 -0
  313. tapesmith-0.4.0/src/tapesmith/templates/builtin/raster-switch.tapesmith.json +26 -0
  314. tapesmith-0.4.0/src/tapesmith/templates/builtin/reserviert.tapesmith.json +27 -0
  315. tapesmith-0.4.0/src/tapesmith/templates/builtin/schule.tapesmith.json +38 -0
  316. tapesmith-0.4.0/src/tapesmith/templates/builtin/vm-lxc-qr.tapesmith.json +37 -0
  317. tapesmith-0.4.0/src/tapesmith/templates/builtin/vm-lxc.tapesmith.json +29 -0
  318. tapesmith-0.4.0/src/tapesmith/templates/builtin/vorratsdose.tapesmith.json +37 -0
  319. tapesmith-0.4.0/src/tapesmith/templates/builtin/wartung.tapesmith.json +35 -0
  320. tapesmith-0.4.0/src/tapesmith/templates/fill.py +183 -0
  321. tapesmith-0.4.0/src/tapesmith/templates/gallery.py +239 -0
  322. tapesmith-0.4.0/src/tapesmith/templates/lint.py +191 -0
  323. tapesmith-0.4.0/src/tapesmith/templates/model.py +849 -0
  324. tapesmith-0.4.0/src/tapesmith/templates/render.py +245 -0
  325. tapesmith-0.4.0/src/tapesmith/templates/serial.py +54 -0
  326. tapesmith-0.4.0/src/tapesmith/templates/series.py +130 -0
  327. tapesmith-0.4.0/src/tapesmith/templates/store.py +110 -0
  328. tapesmith-0.4.0/src/tapesmith/transport/__init__.py +0 -0
  329. tapesmith-0.4.0/src/tapesmith/transport/base.py +121 -0
  330. tapesmith-0.4.0/src/tapesmith/transport/ble.py +239 -0
  331. tapesmith-0.4.0/src/tapesmith/transport/btports.py +70 -0
  332. tapesmith-0.4.0/src/tapesmith/transport/resolve.py +50 -0
  333. tapesmith-0.4.0/src/tapesmith/transport/serial_port.py +72 -0
  334. tapesmith-0.4.0/src/tapesmith/transport/usb.py +289 -0
  335. tapesmith-0.4.0/src/tapesmith/update/__init__.py +10 -0
  336. tapesmith-0.4.0/src/tapesmith/update/apply.py +310 -0
  337. tapesmith-0.4.0/src/tapesmith/update/errors.py +23 -0
  338. tapesmith-0.4.0/src/tapesmith/update/manifest.py +278 -0
  339. tapesmith-0.4.0/src/tapesmith/update/service.py +394 -0
  340. tapesmith-0.4.0/src/tapesmith/update/signing.py +93 -0
  341. tapesmith-0.4.0/src/tapesmith/update/sources.py +308 -0
  342. tapesmith-0.4.0/src/tapesmith/update/state.py +67 -0
  343. tapesmith-0.4.0/src/tapesmith/update/trusted_keys.json +8 -0
  344. tapesmith-0.4.0/src/tapesmith/verify.py +136 -0
  345. tapesmith-0.4.0/src/tapesmith/webapi/__init__.py +5 -0
  346. tapesmith-0.4.0/src/tapesmith/webapi/accent.py +26 -0
  347. tapesmith-0.4.0/src/tapesmith/webapi/access.py +144 -0
  348. tapesmith-0.4.0/src/tapesmith/webapi/actions.py +115 -0
  349. tapesmith-0.4.0/src/tapesmith/webapi/app.py +124 -0
  350. tapesmith-0.4.0/src/tapesmith/webapi/batchapi.py +150 -0
  351. tapesmith-0.4.0/src/tapesmith/webapi/context.py +125 -0
  352. tapesmith-0.4.0/src/tapesmith/webapi/convert.py +51 -0
  353. tapesmith-0.4.0/src/tapesmith/webapi/datajson.py +95 -0
  354. tapesmith-0.4.0/src/tapesmith/webapi/documents.py +93 -0
  355. tapesmith-0.4.0/src/tapesmith/webapi/drafts.py +226 -0
  356. tapesmith-0.4.0/src/tapesmith/webapi/errors.py +197 -0
  357. tapesmith-0.4.0/src/tapesmith/webapi/events.py +105 -0
  358. tapesmith-0.4.0/src/tapesmith/webapi/homelab_common.py +61 -0
  359. tapesmith-0.4.0/src/tapesmith/webapi/homelab_routers.py +30 -0
  360. tapesmith-0.4.0/src/tapesmith/webapi/labels.py +575 -0
  361. tapesmith-0.4.0/src/tapesmith/webapi/language.py +52 -0
  362. tapesmith-0.4.0/src/tapesmith/webapi/mcp_http.py +65 -0
  363. tapesmith-0.4.0/src/tapesmith/webapi/previews.py +70 -0
  364. tapesmith-0.4.0/src/tapesmith/webapi/printing.py +110 -0
  365. tapesmith-0.4.0/src/tapesmith/webapi/ratelimit.py +93 -0
  366. tapesmith-0.4.0/src/tapesmith/webapi/routes_access.py +210 -0
  367. tapesmith-0.4.0/src/tapesmith/webapi/routes_assets.py +213 -0
  368. tapesmith-0.4.0/src/tapesmith/webapi/routes_codescan.py +58 -0
  369. tapesmith-0.4.0/src/tapesmith/webapi/routes_core.py +148 -0
  370. tapesmith-0.4.0/src/tapesmith/webapi/routes_data.py +516 -0
  371. tapesmith-0.4.0/src/tapesmith/webapi/routes_drafts.py +74 -0
  372. tapesmith-0.4.0/src/tapesmith/webapi/routes_editor.py +396 -0
  373. tapesmith-0.4.0/src/tapesmith/webapi/routes_family.py +270 -0
  374. tapesmith-0.4.0/src/tapesmith/webapi/routes_ha.py +106 -0
  375. tapesmith-0.4.0/src/tapesmith/webapi/routes_homelab.py +69 -0
  376. tapesmith-0.4.0/src/tapesmith/webapi/routes_kabel.py +218 -0
  377. tapesmith-0.4.0/src/tapesmith/webapi/routes_kleinanzeigen.py +145 -0
  378. tapesmith-0.4.0/src/tapesmith/webapi/routes_labels.py +74 -0
  379. tapesmith-0.4.0/src/tapesmith/webapi/routes_modules.py +78 -0
  380. tapesmith-0.4.0/src/tapesmith/webapi/routes_paperless.py +116 -0
  381. tapesmith-0.4.0/src/tapesmith/webapi/routes_plausi.py +133 -0
  382. tapesmith-0.4.0/src/tapesmith/webapi/routes_proxmox.py +93 -0
  383. tapesmith-0.4.0/src/tapesmith/webapi/routes_settings.py +327 -0
  384. tapesmith-0.4.0/src/tapesmith/webapi/routes_short.py +203 -0
  385. tapesmith-0.4.0/src/tapesmith/webapi/routes_support.py +46 -0
  386. tapesmith-0.4.0/src/tapesmith/webapi/routes_system.py +179 -0
  387. tapesmith-0.4.0/src/tapesmith/webapi/routes_templates.py +474 -0
  388. tapesmith-0.4.0/src/tapesmith/webapi/routes_update.py +154 -0
  389. tapesmith-0.4.0/src/tapesmith/webapi/routes_vault.py +202 -0
  390. tapesmith-0.4.0/src/tapesmith/webapi/routes_zfs.py +103 -0
  391. tapesmith-0.4.0/src/tapesmith/webapi/security.py +254 -0
  392. tapesmith-0.4.0/src/tapesmith/webapi/server.py +229 -0
  393. tapesmith-0.4.0/src/tapesmith/webapi/session.py +70 -0
  394. tapesmith-0.4.0/src/tapesmith/webapi/settings_schema.py +462 -0
  395. tapesmith-0.4.0/src/tapesmith/webui/__init__.py +8 -0
  396. tapesmith-0.4.0/src/tapesmith/webui/browser.py +261 -0
  397. tapesmith-0.4.0/src/tapesmith/webui/static/assets/DataList-BNdLqY0h.js +1 -0
  398. tapesmith-0.4.0/src/tapesmith/webui/static/assets/FamilyApp-ArkuANKE.js +1 -0
  399. tapesmith-0.4.0/src/tapesmith/webui/static/assets/ListToolbar-C4dAZi00.js +1 -0
  400. tapesmith-0.4.0/src/tapesmith/webui/static/assets/ModuleSettingsButton-ZUbj_1ik.js +1 -0
  401. tapesmith-0.4.0/src/tapesmith/webui/static/assets/NavList-Dwey-1PS.js +1 -0
  402. tapesmith-0.4.0/src/tapesmith/webui/static/assets/PrintOptionsBar-gdugjiWW.js +1 -0
  403. tapesmith-0.4.0/src/tapesmith/webui/static/assets/RowActions-CG90mya5.js +1 -0
  404. tapesmith-0.4.0/src/tapesmith/webui/static/assets/Section-B0h_MINH.js +1 -0
  405. tapesmith-0.4.0/src/tapesmith/webui/static/assets/TableScroll-BWJfFpya.js +1 -0
  406. tapesmith-0.4.0/src/tapesmith/webui/static/assets/TapePreview-DKSbEPDH.js +1 -0
  407. tapesmith-0.4.0/src/tapesmith/webui/static/assets/TextSizeSelect-NmOXQvqm.js +1 -0
  408. tapesmith-0.4.0/src/tapesmith/webui/static/assets/WarningList-TFhCJHVc.js +1 -0
  409. tapesmith-0.4.0/src/tapesmith/webui/static/assets/api-DAWnziWm.js +1 -0
  410. tapesmith-0.4.0/src/tapesmith/webui/static/assets/fluent-DAQMrKDT.js +194 -0
  411. tapesmith-0.4.0/src/tapesmith/webui/static/assets/gateMessages-BjG-W2n9.js +8 -0
  412. tapesmith-0.4.0/src/tapesmith/webui/static/assets/index-B0ibC1fA.js +5 -0
  413. tapesmith-0.4.0/src/tapesmith/webui/static/assets/index-B3ieSe8A.js +1 -0
  414. tapesmith-0.4.0/src/tapesmith/webui/static/assets/index-B6LmWkwg.js +1 -0
  415. tapesmith-0.4.0/src/tapesmith/webui/static/assets/index-BBGAZEVC.js +1 -0
  416. tapesmith-0.4.0/src/tapesmith/webui/static/assets/index-BFOUDlKz.js +1 -0
  417. tapesmith-0.4.0/src/tapesmith/webui/static/assets/index-BG0glZqe.js +2 -0
  418. tapesmith-0.4.0/src/tapesmith/webui/static/assets/index-Bk_o53YF.js +2 -0
  419. tapesmith-0.4.0/src/tapesmith/webui/static/assets/index-Bm_YhjSS.js +39 -0
  420. tapesmith-0.4.0/src/tapesmith/webui/static/assets/index-C1culFZj.js +2 -0
  421. tapesmith-0.4.0/src/tapesmith/webui/static/assets/index-C7z4MrlV.js +1 -0
  422. tapesmith-0.4.0/src/tapesmith/webui/static/assets/index-C8Wfr4XK.js +1 -0
  423. tapesmith-0.4.0/src/tapesmith/webui/static/assets/index-CSBHxRZo.js +4 -0
  424. tapesmith-0.4.0/src/tapesmith/webui/static/assets/index-CUM2lQP7.js +7 -0
  425. tapesmith-0.4.0/src/tapesmith/webui/static/assets/index-CUc32c9J.js +1 -0
  426. tapesmith-0.4.0/src/tapesmith/webui/static/assets/index-CYOf3IW7.js +1 -0
  427. tapesmith-0.4.0/src/tapesmith/webui/static/assets/index-CqdKpquX.js +1 -0
  428. tapesmith-0.4.0/src/tapesmith/webui/static/assets/index-DRDqtjoV.js +2 -0
  429. tapesmith-0.4.0/src/tapesmith/webui/static/assets/index-DXW3DZbF.js +1 -0
  430. tapesmith-0.4.0/src/tapesmith/webui/static/assets/index-NbuszyXs.js +3 -0
  431. tapesmith-0.4.0/src/tapesmith/webui/static/assets/index-QLKmO2qo.js +1 -0
  432. tapesmith-0.4.0/src/tapesmith/webui/static/assets/index-TA-i_7q_.js +6 -0
  433. tapesmith-0.4.0/src/tapesmith/webui/static/assets/index-qLvSlZoG.js +1 -0
  434. tapesmith-0.4.0/src/tapesmith/webui/static/assets/index-sdE0n6Yf.js +1 -0
  435. tapesmith-0.4.0/src/tapesmith/webui/static/assets/index-vkhP0yaY.js +2 -0
  436. tapesmith-0.4.0/src/tapesmith/webui/static/assets/konva-CZCmb_o2.js +51 -0
  437. tapesmith-0.4.0/src/tapesmith/webui/static/assets/numberText-CaqySO_R.js +1 -0
  438. tapesmith-0.4.0/src/tapesmith/webui/static/assets/systemTitle-qe0pdYpR.js +1 -0
  439. tapesmith-0.4.0/src/tapesmith/webui/static/assets/time-Ctx9DKCc.js +1 -0
  440. tapesmith-0.4.0/src/tapesmith/webui/static/assets/unsaved-Dbna7DRF.js +1 -0
  441. tapesmith-0.4.0/src/tapesmith/webui/static/index.html +19 -0
  442. tapesmith-0.4.0/web/README.md +38 -0
@@ -0,0 +1,11 @@
1
+ __pycache__/
2
+ *.pyc
3
+ .venv/
4
+ build/
5
+ dist/
6
+ *.egg-info/
7
+ .env
8
+ *.log
9
+ .pytest_cache/
10
+ .superpowers/
11
+ web/node_modules/
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Tapesmith contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,246 @@
1
+ Metadata-Version: 2.5
2
+ Name: tapesmith
3
+ Version: 0.4.0
4
+ Summary: Label studio for the Phomemo P12 label printer: templates, QR codes, homelab labels, web UI, print service and automation for Windows
5
+ Project-URL: Homepage, https://github.com/essendyx/tapesmith
6
+ Project-URL: Documentation, https://github.com/essendyx/tapesmith/blob/main/docs/manual.md
7
+ Project-URL: Handbuch, https://github.com/essendyx/tapesmith/blob/main/docs/handbuch.md
8
+ Project-URL: Source, https://github.com/essendyx/tapesmith
9
+ Project-URL: Issues, https://github.com/essendyx/tapesmith/issues
10
+ Project-URL: Changelog, https://github.com/essendyx/tapesmith/releases
11
+ Author: Tapesmith contributors
12
+ License-Expression: MIT
13
+ License-File: LICENSE
14
+ License-File: THIRD_PARTY_NOTICES.md
15
+ Keywords: homelab,label printer,labels,p12,phomemo,qr code,windows
16
+ Classifier: Development Status :: 4 - Beta
17
+ Classifier: Environment :: Web Environment
18
+ Classifier: Environment :: Win32 (MS Windows)
19
+ Classifier: Intended Audience :: End Users/Desktop
20
+ Classifier: Intended Audience :: System Administrators
21
+ Classifier: Natural Language :: English
22
+ Classifier: Natural Language :: German
23
+ Classifier: Operating System :: Microsoft :: Windows
24
+ Classifier: Operating System :: Microsoft :: Windows :: Windows 10
25
+ Classifier: Operating System :: Microsoft :: Windows :: Windows 11
26
+ Classifier: Programming Language :: Python :: 3
27
+ Classifier: Programming Language :: Python :: 3 :: Only
28
+ Classifier: Programming Language :: Python :: 3.11
29
+ Classifier: Programming Language :: Python :: 3.12
30
+ Classifier: Topic :: Printing
31
+ Classifier: Topic :: Utilities
32
+ Requires-Python: >=3.11
33
+ Requires-Dist: bleak>=0.22
34
+ Requires-Dist: cryptography>=42
35
+ Requires-Dist: fastapi>=0.115
36
+ Requires-Dist: httpx>=0.27
37
+ Requires-Dist: keyring>=25
38
+ Requires-Dist: mcp<3,>=2.2
39
+ Requires-Dist: openpyxl>=3.1
40
+ Requires-Dist: paho-mqtt>=2.0
41
+ Requires-Dist: pillow>=10.1
42
+ Requires-Dist: ppf-datamatrix>=0.2
43
+ Requires-Dist: pyserial>=3.5
44
+ Requires-Dist: pyside6>=6.6
45
+ Requires-Dist: segno>=1.6
46
+ Requires-Dist: uvicorn>=0.30
47
+ Requires-Dist: zxing-cpp>=3.0
48
+ Provides-Extra: dev
49
+ Requires-Dist: build>=1.2; extra == 'dev'
50
+ Requires-Dist: httpx>=0.27; extra == 'dev'
51
+ Requires-Dist: pytest-qt>=4.4; extra == 'dev'
52
+ Requires-Dist: pytest>=8; extra == 'dev'
53
+ Provides-Extra: golden
54
+ Requires-Dist: phomemo-p12-tools==0.0.5; extra == 'golden'
55
+ Provides-Extra: screenshots
56
+ Requires-Dist: playwright>=1.47; extra == 'screenshots'
57
+ Description-Content-Type: text/markdown
58
+
59
+ # Tapesmith
60
+
61
+ **Label studio for the Phomemo P12.**
62
+
63
+ Tapesmith is a Windows application for the Phomemo P12 Bluetooth label printer (12 mm tape). It
64
+ replaces the phone app with a fast local print service, a browser based editor, a template gallery,
65
+ a command line and optional integrations for home labs and home automation. Everything runs on your
66
+ own PC; nothing is sent to a cloud service.
67
+
68
+ ![Quick print (light)](https://github.com/essendyx/tapesmith/raw/main/docs/screenshots/schnelldruck-hell-desktop-en.png)
69
+
70
+ ## Screenshots
71
+
72
+ | Editor | Template gallery |
73
+ |---|---|
74
+ | ![Editor](https://github.com/essendyx/tapesmith/raw/main/docs/screenshots/editor-hell-desktop-en.png) | ![Gallery](https://github.com/essendyx/tapesmith/raw/main/docs/screenshots/galerie-hell-desktop-en.png) |
75
+ | **Print history** | **Settings (dark)** |
76
+ | ![History](https://github.com/essendyx/tapesmith/raw/main/docs/screenshots/verlauf-hell-desktop-en.png) | ![Settings](https://github.com/essendyx/tapesmith/raw/main/docs/screenshots/einstellungen-dunkel-desktop-en.png) |
77
+
78
+ More screenshots (German and English, light and dark, desktop and phone):
79
+ [docs/screenshots](https://github.com/essendyx/tapesmith/blob/main/docs/screenshots/index.md). All screenshots are taken from neutral demo data.
80
+
81
+ ## Features
82
+
83
+ - **Quick print** from the browser, the tray icon or a global hotkey (Ctrl+Alt+L), with automatic
84
+ text fitting and a live preview at real size.
85
+ - **Editor** with text, QR codes, Code128, DataMatrix, icons, shapes and images, multiple tabs,
86
+ undo, autosave and crash recovery.
87
+ - **Template gallery** with more than 30 built in templates (storage, kitchen, office, network
88
+ and power labels, cable flags, grid strips for patch panels and fuse boxes) and your own
89
+ templates as JSON files.
90
+ - **Series printing** from CSV, Excel or the clipboard, numbering ranges and counters.
91
+ - **Print service** that owns the printer connection: queue with automatic retry, print history,
92
+ statistics, tape roll tracking and misprint protection.
93
+ - **Command line** (`tapesmith`, short alias `p12`) for scripts, plus a PowerShell module.
94
+ - **Accessibility and languages:** keyboard operation, screen reader labels, high contrast, dark
95
+ mode. English and German throughout: web interface, tray, print service messages, built in
96
+ templates and command line follow the Windows display language (any language other than German
97
+ gives English), or the setting `app.language`; `TAPESMITH_LANG=en` forces a language for the CLI.
98
+ - **Installation through Python without admin rights** and signed automatic updates with
99
+ hash pinned packages and rollback.
100
+
101
+ ### Optional modules
102
+
103
+ Everything beyond the core app is a built in module that is off until you turn it on under
104
+ Settings > Modules (or `tapesmith module enable <id>`). Modules that are off appear nowhere in the
105
+ interface. Available: Inventory (boxes, contents, lending), Drives (drives of this PC, SSH disk scanner
106
+ and ZFS disk replacement assistant), Proxmox VE (VM and container labels), Paperless-ngx (ASN and
107
+ warranty labels), Home Assistant (battery and maintenance labels), Obsidian vault via MCP, Assets with
108
+ short links (`deploy/shortlink`), NetBox cable import, classifieds and a serial number scan from a
109
+ photo. Tapesmith ships without any preset addresses or tokens. Also part of the core app: MQTT discovery
110
+ for Home Assistant, Telegram notifications, a hot folder and an MCP server for AI assistants.
111
+ Setup notes: [docs/manual.md](https://github.com/essendyx/tapesmith/blob/main/docs/manual.md) (English), [docs/handbuch.md](https://github.com/essendyx/tapesmith/blob/main/docs/handbuch.md) (German)
112
+ and [deploy/](https://github.com/essendyx/tapesmith/tree/main/deploy/).
113
+
114
+ ## Installation
115
+
116
+ Tapesmith is distributed as a Python package on [PyPI](https://pypi.org/project/tapesmith/) and runs
117
+ with the signed Python from python.org. It has no executable of its own, so Windows Smart App Control
118
+ does not block it, although Tapesmith itself carries no code signing certificate.
119
+
120
+ 1. Install Python 3.12 (3.11 works too), for example with winget in a normal terminal (no admin
121
+ rights needed):
122
+
123
+ ```
124
+ winget install Python.Python.3.12
125
+ ```
126
+
127
+ 2. Install Tapesmith for the current user and set it up:
128
+
129
+ ```
130
+ py -m pip install --user tapesmith
131
+ py -m tapesmith install
132
+ ```
133
+
134
+ `tapesmith install` creates `%LOCALAPPDATA%\Programs\Tapesmith` with one Python environment per
135
+ version (`versions\<version>`, the junction `current` points to the active one), a start menu entry
136
+ "Tapesmith", an entry under Installed apps (with uninstall), the `tapesmith://` and `p12label://`
137
+ links, the Explorer context menu and the autostart of the tray icon. Everything starts as
138
+ `pythonw.exe -m tapesmith...` from the active environment. No admin rights are needed. Useful
139
+ options: `--no-autostart`, `--no-start`, `--status` (show the state, change nothing).
140
+ 3. Pair the printer in Windows Bluetooth settings, then pick it in the web interface under Settings
141
+ (or run `py -m tapesmith setup`).
142
+
143
+ Your settings and history live in `%APPDATA%\Tapesmith`. Installing, updating and uninstalling never
144
+ touch them.
145
+
146
+ **Updates:** after you agree (the web interface asks once), Tapesmith checks the GitHub releases of
147
+ this project. A new version is installed into a new environment next to the running one: the signed
148
+ release manifest lists every package with its SHA-256, pip installs only wheels with a matching
149
+ checksum (`pip install --require-hashes --only-binary=:all:`), the self test of the new version must
150
+ pass, and Tapesmith switches over while idle, with automatic rollback if the new version does not
151
+ start. Manually: Settings > Updates, or `py -m tapesmith update check` and `py -m tapesmith update install`.
152
+
153
+ **Uninstall:** Settings > Apps > Installed apps > Tapesmith, the start menu entry "Tapesmith
154
+ deinstallieren", or `py -m tapesmith uninstall`. This removes the program folder, start menu entries,
155
+ autostart, links and the entry under Installed apps; your data in `%APPDATA%\Tapesmith` stays. To also
156
+ remove the package that was used for the setup: `py -m pip uninstall tapesmith`.
157
+
158
+ **Smart App Control:** Windows 11 may block programs without a code signature. Tapesmith therefore
159
+ never ships an executable: `python.exe` and `pythonw.exe` from python.org are signed, and all native
160
+ parts come as unmodified wheels of their upstream projects from PyPI. The small `.exe` launchers
161
+ that pip creates for command line entry points are not used by the installed app; if Smart App
162
+ Control blocks them, use `py -m tapesmith ...` instead of `tapesmith ...`.
163
+
164
+ **Upgrading from the portable build (0.3 and older) or a source checkout:** run the two commands of
165
+ step 2. `tapesmith install` stops the old Tapesmith, takes over the installation folder, replaces
166
+ autostart, start menu entry and uninstall entry, and removes the old `Tapesmith.exe`. An autostart
167
+ that points to a Python environment of a source checkout is replaced as well. Your data stays as it
168
+ is.
169
+
170
+ **Upgrading from "P12 Label" (0.2.x):** on first start Tapesmith copies `%APPDATA%\P12Label` to
171
+ `%APPDATA%\Tapesmith` once (the old folder stays as a backup), and the installer removes the program
172
+ files, start menu entry, autostart and uninstall entry of the old installation. Links using
173
+ `p12label://` keep working as an alias of `tapesmith://`; old `P12LABEL_*` environment variables
174
+ still work as a fallback for `TAPESMITH_*`.
175
+
176
+ ## Security
177
+
178
+ - The print service listens on `127.0.0.1` only. Access from your LAN is opt in (`lan.enabled`),
179
+ limited to configured private networks and always requires an API token (roles: admin, print,
180
+ family). Tokens are stored as SHA-256 hashes only.
181
+ - Host and Origin headers are checked (DNS rebinding protection), failed logins are rate limited.
182
+ - Secrets never go into configuration files: settings hold references such as
183
+ `keyring:tapesmith/mqtt` (Windows Credential Manager), `file:<path>` or `env:<NAME>`.
184
+ - Updates are only installed if the manifest carries a valid Ed25519 signature from a key listed
185
+ in `src/tapesmith/update/trusted_keys.json`, and pip installs only wheels whose SHA-256 is listed
186
+ in that manifest.
187
+ - The automatic update check is off until you agree: the web interface asks once on the first start
188
+ of the installed app (Settings > Updates changes it later).
189
+
190
+ Please report vulnerabilities as described in [SECURITY.md](https://github.com/essendyx/tapesmith/blob/main/SECURITY.md).
191
+
192
+ ## Release signing and privacy
193
+
194
+ Tapesmith has no code signing certificate and ships no executable of its own (see
195
+ [Installation](#installation)). Releases are built by GitHub Actions from this repository, published
196
+ to PyPI with Trusted Publishing, and every update manifest is signed with an Ed25519 key; the app
197
+ installs only packages whose SHA-256 is listed in a correctly signed manifest.
198
+
199
+ - Committers and reviewers: the project maintainer (owner of
200
+ [github.com/essendyx/tapesmith](https://github.com/essendyx/tapesmith))
201
+ - Approvers: the project maintainer (owner of
202
+ [github.com/essendyx/tapesmith](https://github.com/essendyx/tapesmith))
203
+
204
+ Privacy: This program will not transfer any information to other networked systems unless
205
+ specifically requested by the user or the person installing or operating it. Which connections
206
+ Tapesmith makes and how releases are built and signed: [CODE_SIGNING_POLICY.md](https://github.com/essendyx/tapesmith/blob/main/CODE_SIGNING_POLICY.md).
207
+
208
+ ## Development
209
+
210
+ Requirements: Windows 10 or 11, Python 3.11 or newer, Node.js 20 or newer (only to build the web UI).
211
+
212
+ ```
213
+ python -m venv .venv
214
+ .venv\Scripts\pip install -e .[dev]
215
+ .venv\Scripts\python -m pytest -q
216
+ cd web && npm ci && npm run check
217
+ python tools\build_web.py # builds the web UI into src/tapesmith/webui/static
218
+ python -m build # wheel and sdist in dist/
219
+ ```
220
+
221
+ Tests never print, never open real COM ports, Bluetooth or network services and never touch your
222
+ real data folder (they run with `TAPESMITH_HOME` set to a temporary folder). Hardware tests are
223
+ marked `@pytest.mark.hardware` and only run with `--hardware`. See [CONTRIBUTING.md](https://github.com/essendyx/tapesmith/blob/main/CONTRIBUTING.md).
224
+
225
+ Documentation: user manual in English [docs/manual.md](https://github.com/essendyx/tapesmith/blob/main/docs/manual.md) and German
226
+ [docs/handbuch.md](https://github.com/essendyx/tapesmith/blob/main/docs/handbuch.md), hardware and protocol findings
227
+ [docs/hardware/README.md](https://github.com/essendyx/tapesmith/blob/main/docs/hardware/README.md), operations notes
228
+ [deploy/infra/README.md](https://github.com/essendyx/tapesmith/blob/main/deploy/infra/README.md). Translations: `web/src/locales/`,
229
+ `src/tapesmith/locales/` and the message catalog `src/tapesmith/locales/messages/en.json`
230
+ (maintained with `python tools/i18n_messages.py`).
231
+
232
+ ## License
233
+
234
+ Tapesmith is released under the [MIT License](https://github.com/essendyx/tapesmith/blob/main/LICENSE). Third party components and their licenses
235
+ are listed in [THIRD_PARTY_NOTICES.md](https://github.com/essendyx/tapesmith/blob/main/THIRD_PARTY_NOTICES.md).
236
+
237
+ ## Acknowledgements
238
+
239
+ The P12 print protocol was first documented by the
240
+ [phomemo-p12-tools](https://github.com/soburi/phomemo-p12) project (MIT License, Copyright (c) 2022
241
+ Timo "polskafan" Dobbrick, packaged by TOKITA Hiroshi). Tapesmith keeps a byte compatible reference
242
+ stream in its tests and offers the old `phomemo_render_label` and `phomemo_print_p12` commands for
243
+ compatibility. Icons come from [Tabler Icons](https://tabler.io/icons) (MIT) and
244
+ [Simple Icons](https://simpleicons.org/) (CC0); label fonts are DejaVu.
245
+
246
+ Tapesmith is an independent project and not affiliated with Phomemo.
@@ -0,0 +1,188 @@
1
+ # Tapesmith
2
+
3
+ **Label studio for the Phomemo P12.**
4
+
5
+ Tapesmith is a Windows application for the Phomemo P12 Bluetooth label printer (12 mm tape). It
6
+ replaces the phone app with a fast local print service, a browser based editor, a template gallery,
7
+ a command line and optional integrations for home labs and home automation. Everything runs on your
8
+ own PC; nothing is sent to a cloud service.
9
+
10
+ ![Quick print (light)](https://github.com/essendyx/tapesmith/raw/main/docs/screenshots/schnelldruck-hell-desktop-en.png)
11
+
12
+ ## Screenshots
13
+
14
+ | Editor | Template gallery |
15
+ |---|---|
16
+ | ![Editor](https://github.com/essendyx/tapesmith/raw/main/docs/screenshots/editor-hell-desktop-en.png) | ![Gallery](https://github.com/essendyx/tapesmith/raw/main/docs/screenshots/galerie-hell-desktop-en.png) |
17
+ | **Print history** | **Settings (dark)** |
18
+ | ![History](https://github.com/essendyx/tapesmith/raw/main/docs/screenshots/verlauf-hell-desktop-en.png) | ![Settings](https://github.com/essendyx/tapesmith/raw/main/docs/screenshots/einstellungen-dunkel-desktop-en.png) |
19
+
20
+ More screenshots (German and English, light and dark, desktop and phone):
21
+ [docs/screenshots](https://github.com/essendyx/tapesmith/blob/main/docs/screenshots/index.md). All screenshots are taken from neutral demo data.
22
+
23
+ ## Features
24
+
25
+ - **Quick print** from the browser, the tray icon or a global hotkey (Ctrl+Alt+L), with automatic
26
+ text fitting and a live preview at real size.
27
+ - **Editor** with text, QR codes, Code128, DataMatrix, icons, shapes and images, multiple tabs,
28
+ undo, autosave and crash recovery.
29
+ - **Template gallery** with more than 30 built in templates (storage, kitchen, office, network
30
+ and power labels, cable flags, grid strips for patch panels and fuse boxes) and your own
31
+ templates as JSON files.
32
+ - **Series printing** from CSV, Excel or the clipboard, numbering ranges and counters.
33
+ - **Print service** that owns the printer connection: queue with automatic retry, print history,
34
+ statistics, tape roll tracking and misprint protection.
35
+ - **Command line** (`tapesmith`, short alias `p12`) for scripts, plus a PowerShell module.
36
+ - **Accessibility and languages:** keyboard operation, screen reader labels, high contrast, dark
37
+ mode. English and German throughout: web interface, tray, print service messages, built in
38
+ templates and command line follow the Windows display language (any language other than German
39
+ gives English), or the setting `app.language`; `TAPESMITH_LANG=en` forces a language for the CLI.
40
+ - **Installation through Python without admin rights** and signed automatic updates with
41
+ hash pinned packages and rollback.
42
+
43
+ ### Optional modules
44
+
45
+ Everything beyond the core app is a built in module that is off until you turn it on under
46
+ Settings > Modules (or `tapesmith module enable <id>`). Modules that are off appear nowhere in the
47
+ interface. Available: Inventory (boxes, contents, lending), Drives (drives of this PC, SSH disk scanner
48
+ and ZFS disk replacement assistant), Proxmox VE (VM and container labels), Paperless-ngx (ASN and
49
+ warranty labels), Home Assistant (battery and maintenance labels), Obsidian vault via MCP, Assets with
50
+ short links (`deploy/shortlink`), NetBox cable import, classifieds and a serial number scan from a
51
+ photo. Tapesmith ships without any preset addresses or tokens. Also part of the core app: MQTT discovery
52
+ for Home Assistant, Telegram notifications, a hot folder and an MCP server for AI assistants.
53
+ Setup notes: [docs/manual.md](https://github.com/essendyx/tapesmith/blob/main/docs/manual.md) (English), [docs/handbuch.md](https://github.com/essendyx/tapesmith/blob/main/docs/handbuch.md) (German)
54
+ and [deploy/](https://github.com/essendyx/tapesmith/tree/main/deploy/).
55
+
56
+ ## Installation
57
+
58
+ Tapesmith is distributed as a Python package on [PyPI](https://pypi.org/project/tapesmith/) and runs
59
+ with the signed Python from python.org. It has no executable of its own, so Windows Smart App Control
60
+ does not block it, although Tapesmith itself carries no code signing certificate.
61
+
62
+ 1. Install Python 3.12 (3.11 works too), for example with winget in a normal terminal (no admin
63
+ rights needed):
64
+
65
+ ```
66
+ winget install Python.Python.3.12
67
+ ```
68
+
69
+ 2. Install Tapesmith for the current user and set it up:
70
+
71
+ ```
72
+ py -m pip install --user tapesmith
73
+ py -m tapesmith install
74
+ ```
75
+
76
+ `tapesmith install` creates `%LOCALAPPDATA%\Programs\Tapesmith` with one Python environment per
77
+ version (`versions\<version>`, the junction `current` points to the active one), a start menu entry
78
+ "Tapesmith", an entry under Installed apps (with uninstall), the `tapesmith://` and `p12label://`
79
+ links, the Explorer context menu and the autostart of the tray icon. Everything starts as
80
+ `pythonw.exe -m tapesmith...` from the active environment. No admin rights are needed. Useful
81
+ options: `--no-autostart`, `--no-start`, `--status` (show the state, change nothing).
82
+ 3. Pair the printer in Windows Bluetooth settings, then pick it in the web interface under Settings
83
+ (or run `py -m tapesmith setup`).
84
+
85
+ Your settings and history live in `%APPDATA%\Tapesmith`. Installing, updating and uninstalling never
86
+ touch them.
87
+
88
+ **Updates:** after you agree (the web interface asks once), Tapesmith checks the GitHub releases of
89
+ this project. A new version is installed into a new environment next to the running one: the signed
90
+ release manifest lists every package with its SHA-256, pip installs only wheels with a matching
91
+ checksum (`pip install --require-hashes --only-binary=:all:`), the self test of the new version must
92
+ pass, and Tapesmith switches over while idle, with automatic rollback if the new version does not
93
+ start. Manually: Settings > Updates, or `py -m tapesmith update check` and `py -m tapesmith update install`.
94
+
95
+ **Uninstall:** Settings > Apps > Installed apps > Tapesmith, the start menu entry "Tapesmith
96
+ deinstallieren", or `py -m tapesmith uninstall`. This removes the program folder, start menu entries,
97
+ autostart, links and the entry under Installed apps; your data in `%APPDATA%\Tapesmith` stays. To also
98
+ remove the package that was used for the setup: `py -m pip uninstall tapesmith`.
99
+
100
+ **Smart App Control:** Windows 11 may block programs without a code signature. Tapesmith therefore
101
+ never ships an executable: `python.exe` and `pythonw.exe` from python.org are signed, and all native
102
+ parts come as unmodified wheels of their upstream projects from PyPI. The small `.exe` launchers
103
+ that pip creates for command line entry points are not used by the installed app; if Smart App
104
+ Control blocks them, use `py -m tapesmith ...` instead of `tapesmith ...`.
105
+
106
+ **Upgrading from the portable build (0.3 and older) or a source checkout:** run the two commands of
107
+ step 2. `tapesmith install` stops the old Tapesmith, takes over the installation folder, replaces
108
+ autostart, start menu entry and uninstall entry, and removes the old `Tapesmith.exe`. An autostart
109
+ that points to a Python environment of a source checkout is replaced as well. Your data stays as it
110
+ is.
111
+
112
+ **Upgrading from "P12 Label" (0.2.x):** on first start Tapesmith copies `%APPDATA%\P12Label` to
113
+ `%APPDATA%\Tapesmith` once (the old folder stays as a backup), and the installer removes the program
114
+ files, start menu entry, autostart and uninstall entry of the old installation. Links using
115
+ `p12label://` keep working as an alias of `tapesmith://`; old `P12LABEL_*` environment variables
116
+ still work as a fallback for `TAPESMITH_*`.
117
+
118
+ ## Security
119
+
120
+ - The print service listens on `127.0.0.1` only. Access from your LAN is opt in (`lan.enabled`),
121
+ limited to configured private networks and always requires an API token (roles: admin, print,
122
+ family). Tokens are stored as SHA-256 hashes only.
123
+ - Host and Origin headers are checked (DNS rebinding protection), failed logins are rate limited.
124
+ - Secrets never go into configuration files: settings hold references such as
125
+ `keyring:tapesmith/mqtt` (Windows Credential Manager), `file:<path>` or `env:<NAME>`.
126
+ - Updates are only installed if the manifest carries a valid Ed25519 signature from a key listed
127
+ in `src/tapesmith/update/trusted_keys.json`, and pip installs only wheels whose SHA-256 is listed
128
+ in that manifest.
129
+ - The automatic update check is off until you agree: the web interface asks once on the first start
130
+ of the installed app (Settings > Updates changes it later).
131
+
132
+ Please report vulnerabilities as described in [SECURITY.md](https://github.com/essendyx/tapesmith/blob/main/SECURITY.md).
133
+
134
+ ## Release signing and privacy
135
+
136
+ Tapesmith has no code signing certificate and ships no executable of its own (see
137
+ [Installation](#installation)). Releases are built by GitHub Actions from this repository, published
138
+ to PyPI with Trusted Publishing, and every update manifest is signed with an Ed25519 key; the app
139
+ installs only packages whose SHA-256 is listed in a correctly signed manifest.
140
+
141
+ - Committers and reviewers: the project maintainer (owner of
142
+ [github.com/essendyx/tapesmith](https://github.com/essendyx/tapesmith))
143
+ - Approvers: the project maintainer (owner of
144
+ [github.com/essendyx/tapesmith](https://github.com/essendyx/tapesmith))
145
+
146
+ Privacy: This program will not transfer any information to other networked systems unless
147
+ specifically requested by the user or the person installing or operating it. Which connections
148
+ Tapesmith makes and how releases are built and signed: [CODE_SIGNING_POLICY.md](https://github.com/essendyx/tapesmith/blob/main/CODE_SIGNING_POLICY.md).
149
+
150
+ ## Development
151
+
152
+ Requirements: Windows 10 or 11, Python 3.11 or newer, Node.js 20 or newer (only to build the web UI).
153
+
154
+ ```
155
+ python -m venv .venv
156
+ .venv\Scripts\pip install -e .[dev]
157
+ .venv\Scripts\python -m pytest -q
158
+ cd web && npm ci && npm run check
159
+ python tools\build_web.py # builds the web UI into src/tapesmith/webui/static
160
+ python -m build # wheel and sdist in dist/
161
+ ```
162
+
163
+ Tests never print, never open real COM ports, Bluetooth or network services and never touch your
164
+ real data folder (they run with `TAPESMITH_HOME` set to a temporary folder). Hardware tests are
165
+ marked `@pytest.mark.hardware` and only run with `--hardware`. See [CONTRIBUTING.md](https://github.com/essendyx/tapesmith/blob/main/CONTRIBUTING.md).
166
+
167
+ Documentation: user manual in English [docs/manual.md](https://github.com/essendyx/tapesmith/blob/main/docs/manual.md) and German
168
+ [docs/handbuch.md](https://github.com/essendyx/tapesmith/blob/main/docs/handbuch.md), hardware and protocol findings
169
+ [docs/hardware/README.md](https://github.com/essendyx/tapesmith/blob/main/docs/hardware/README.md), operations notes
170
+ [deploy/infra/README.md](https://github.com/essendyx/tapesmith/blob/main/deploy/infra/README.md). Translations: `web/src/locales/`,
171
+ `src/tapesmith/locales/` and the message catalog `src/tapesmith/locales/messages/en.json`
172
+ (maintained with `python tools/i18n_messages.py`).
173
+
174
+ ## License
175
+
176
+ Tapesmith is released under the [MIT License](https://github.com/essendyx/tapesmith/blob/main/LICENSE). Third party components and their licenses
177
+ are listed in [THIRD_PARTY_NOTICES.md](https://github.com/essendyx/tapesmith/blob/main/THIRD_PARTY_NOTICES.md).
178
+
179
+ ## Acknowledgements
180
+
181
+ The P12 print protocol was first documented by the
182
+ [phomemo-p12-tools](https://github.com/soburi/phomemo-p12) project (MIT License, Copyright (c) 2022
183
+ Timo "polskafan" Dobbrick, packaged by TOKITA Hiroshi). Tapesmith keeps a byte compatible reference
184
+ stream in its tests and offers the old `phomemo_render_label` and `phomemo_print_p12` commands for
185
+ compatibility. Icons come from [Tabler Icons](https://tabler.io/icons) (MIT) and
186
+ [Simple Icons](https://simpleicons.org/) (CC0); label fonts are DejaVu.
187
+
188
+ Tapesmith is an independent project and not affiliated with Phomemo.
@@ -0,0 +1,86 @@
1
+ # Third party notices
2
+
3
+ Tapesmith itself is licensed under the MIT License (see `LICENSE`). It bundles or builds on the
4
+ following third party works. Full license texts of bundled assets are included next to the assets.
5
+
6
+ ## Bundled assets
7
+
8
+ | Component | Where | License |
9
+ |---|---|---|
10
+ | Tabler Icons, Copyright (c) 2020-2025 Paweł Kuna | `src/tapesmith/icons/tabler-icons.ttf`, `tabler-index.json` | MIT, see `src/tapesmith/icons/LICENSE-tabler.txt` |
11
+ | Simple Icons | `src/tapesmith/icons/simple/*.png` | CC0 1.0, see `src/tapesmith/icons/simple/LICENSE-simple-icons.txt`. The logos remain trademarks of their owners and are only used to label your own devices and services, see `MARKEN.txt`. |
12
+ | DejaVu fonts (DejaVu Sans, DejaVu Sans Bold, DejaVu Sans Mono), Bitstream Vera Copyright (c) 2003 Bitstream, Inc., Arev glyphs Copyright (c) 2006 Tavmjong Bah, DejaVu changes in the public domain | `src/tapesmith/fonts/*.ttf` | Bitstream Vera / Arev font license, see `src/tapesmith/fonts/LICENSE` |
13
+
14
+ ## Protocol reference
15
+
16
+ | Component | Use | License |
17
+ |---|---|---|
18
+ | [phomemo-p12-tools](https://github.com/soburi/phomemo-p12) 0.0.5, Copyright (c) 2022 Timo "polskafan" Dobbrick | Documentation of the P12 print protocol; optional test dependency (`golden` extra) that produces the reference byte stream in `tests/golden/`. The command names `phomemo_render_label` and `phomemo_print_p12` are kept for compatibility. | MIT |
19
+
20
+ MIT License text for phomemo-p12-tools:
21
+
22
+ ```
23
+ Copyright (c) 2022 Timo 'polskafan' Dobbrick
24
+
25
+ Permission is hereby granted, free of charge, to any person obtaining a copy
26
+ of this software and associated documentation files (the "Software"), to deal
27
+ in the Software without restriction, including without limitation the rights
28
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
29
+ copies of the Software, and to permit persons to whom the Software is
30
+ furnished to do so, subject to the following conditions:
31
+
32
+ The above copyright notice and this permission notice shall be included in all
33
+ copies or substantial portions of the Software.
34
+
35
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
36
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
37
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
38
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
39
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
40
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
41
+ SOFTWARE.
42
+ ```
43
+
44
+ ## Python dependencies (from `pyproject.toml`)
45
+
46
+ Installed separately by pip from PyPI (not vendored). The installed app uses one Python environment per
47
+ version, pinned by the signed lock list of each release.
48
+
49
+ | Package | License |
50
+ |---|---|
51
+ | Pillow | MIT-CMU (HPND) |
52
+ | pyserial | BSD-3-Clause |
53
+ | segno | BSD-3-Clause |
54
+ | zxing-cpp | Apache-2.0 |
55
+ | PySide6 (Qt for Python) | LGPL-3.0 (or GPL-2.0/GPL-3.0) |
56
+ | ppf-datamatrix | MIT |
57
+ | openpyxl | MIT |
58
+ | bleak | MIT |
59
+ | fastapi | MIT |
60
+ | uvicorn | BSD-3-Clause |
61
+ | mcp (Model Context Protocol SDK) | MIT |
62
+ | paho-mqtt | EPL-2.0 or EDL-1.0 (BSD-3-Clause) |
63
+ | keyring | MIT |
64
+ | httpx | BSD-3-Clause |
65
+ | cryptography | Apache-2.0 or BSD-3-Clause |
66
+ | pytest, pytest-qt (development) | MIT |
67
+ | Playwright (screenshots only) | Apache-2.0 |
68
+
69
+ PySide6 is used under the LGPL: pip installs the unmodified Qt libraries from PyPI as separate
70
+ files, which can be replaced by the user.
71
+
72
+ ## Web UI dependencies (from `web/package.json`)
73
+
74
+ Bundled into `src/tapesmith/webui/static`:
75
+
76
+ | Package | License |
77
+ |---|---|
78
+ | @fluentui/react-components, @fluentui/react-icons | MIT |
79
+ | @tanstack/react-query | MIT |
80
+ | i18next, react-i18next | MIT |
81
+ | konva, react-konva | MIT |
82
+ | react, react-dom | MIT |
83
+ | react-router-dom | MIT |
84
+
85
+ Development and build tools (not bundled): TypeScript (Apache-2.0), Vite, Vitest, ESLint,
86
+ typescript-eslint, Testing Library, jsdom, globals (MIT), axe-core (MPL-2.0).
@@ -0,0 +1,107 @@
1
+ # Home Assistant Anbindung (MQTT Discovery)
2
+
3
+ Der Druckdienst `p12d` meldet sich per MQTT Discovery als Gerät „Labeldrucker P12" bei Home
4
+ Assistant an, solange `mqtt.enabled` in `config.json` an ist. Entitäten, Topics und Grenzen
5
+ beschreibt diese Datei.
6
+
7
+ ## Voraussetzungen
8
+
9
+ * Ein MQTT-Broker (z. B. Mosquitto), in Tapesmith eingetragen über `mqtt.host` und `mqtt.port` (Standard-Port 1883).
10
+ * Ein Mosquitto Benutzer `tapesmith` mit ACL: lesen und schreiben auf `tapesmith/#`, schreiben auf
11
+ `homeassistant/#`. Diesen Benutzer legt der Administrator des Brokers an, die App tut das nicht.
12
+ * Home Assistant mit aktivierter MQTT Integration, Discovery Präfix `homeassistant` (Standard).
13
+
14
+ ## Einrichtung
15
+
16
+ 1. Passwort des Mosquitto Benutzers `tapesmith` in den Windows Anmeldeinformationen hinterlegen:
17
+
18
+ ```
19
+ p12 secret set mqtt
20
+ ```
21
+
22
+ (fragt das Passwort interaktiv ab; alternativ `p12 secret set mqtt --stdin` mit dem Passwort
23
+ auf der Standardeingabe, z. B. aus einem Passwortmanager, nie als Kommandozeilenargument).
24
+
25
+ 2. MQTT einschalten:
26
+
27
+ ```
28
+ p12 config set mqtt.enabled true
29
+ ```
30
+
31
+ Die Anbindung wirkt ohne Dienst-Neustart (Addon-Prüfung alle 5 Sekunden).
32
+
33
+ 3. Zur Kontrolle, ohne Verbindungsaufbau:
34
+
35
+ ```
36
+ p12 mqtt discovery # zeigt die Discovery-Nachrichten als JSON
37
+ p12 mqtt status # zeigt an/aus, Broker, Benutzer, Passwort-Referenz
38
+ ```
39
+
40
+ ## Entitäten
41
+
42
+ | Entität | Komponente | Bedingung |
43
+ |---|---|---|
44
+ | Verbindung | `binary_sensor` (`device_class: connectivity`) | immer |
45
+ | Akku | `sensor` (`device_class: battery`, `%`) | nur wenn `battery` im Geräteprofil verifiziert ist |
46
+ | Deckel | `binary_sensor` (`device_class: opening`) | nur wenn `lid` im Geräteprofil verifiziert ist |
47
+ | Warteschlange | `sensor` (Einheit „Aufträge") | immer |
48
+ | Testlabel | `button` | immer |
49
+
50
+ Der P12 verifiziert Akku und Deckel serienmäßig (siehe `device/profiles/p12.json`); der
51
+ Deckelcode ist beim P12 invertiert, das steckt bereits im Geräteprofil, hier zählt nur der
52
+ dekodierte Wert (`offen`/`zu`). Ein Sensor für „Band leer" fehlt bewusst: dieser Wert ist beim
53
+ P12 nicht verifiziert.
54
+
55
+ Ist der Deckelzustand (noch) nicht bekannt (`lid_open: null` im Zustandstopic, z. B. direkt nach
56
+ dem Start), zeigt der Deckelsensor in Home Assistant „unbekannt" statt fälschlich „zu": die
57
+ Discovery-Vorlage prüft `lid_open is none` und liefert dann die Jinja-Sentinel `none`.
58
+
59
+ ## Topics
60
+
61
+ Alle Topics beginnen mit `mqtt.base_topic` (Standard `tapesmith`):
62
+
63
+ | Topic | Richtung | Inhalt |
64
+ |---|---|---|
65
+ | `<base>/availability` | Dienst → HA | `online`/`offline` (retain, Last Will) |
66
+ | `<base>/state` | Dienst → HA | `{"connected", "battery", "lid_open", "queue"}` (retain, JSON) |
67
+ | `<base>/print/set` | HA → Dienst | `{"template", "values"?, "copies"?}` (JSON) |
68
+ | `<base>/print/result` | Dienst → HA | `{"status", "title", "message"}` (JSON, nicht retain) |
69
+ | `<base>/test/press` | HA → Dienst | beliebiger Inhalt, druckt ein Testlabel |
70
+
71
+ Beispiel: eine Vorlage mit Werten über `mqtt.publish` drucken.
72
+
73
+ ```yaml
74
+ service: mqtt.publish
75
+ data:
76
+ topic: tapesmith/print/set
77
+ payload: >-
78
+ {"template": "gefriergut", "values": {"inhalt": "Suppe"}, "copies": 2}
79
+ ```
80
+
81
+ ## Kontingent
82
+
83
+ MQTT ist eine nicht-interaktive Quelle. Kopien sind höchstens
84
+ `guard.confirm_copies` (Standard 5) je Auftrag; mehr wird abgelehnt, die Meldung steht im
85
+ Ergebnis auf `<base>/print/result`. Eine Rückfrage wegen zu langem Label oder zu vielen Kopien
86
+ lässt sich über MQTT nicht bestätigen (`confirmed` sendet MQTT nie); nur die Rückfrage wegen
87
+ eines nicht passenden Bandes wird von der Pipeline unabhängig von der Quelle als
88
+ `bestätigung_nötig` gemeldet, MQTT druckt dann trotzdem nicht (kein zweiter Versuch), sondern
89
+ meldet die Gründe.
90
+
91
+ ## Beispiele in diesem Ordner
92
+
93
+ * `tapesmith-skript.yaml`: Home Assistant Skript `tapesmith_drucken` mit Feldern für Vorlage,
94
+ Werte und Kopien. Der Nummern-Selektor für Kopien liefert im Template eine Gleitkommazahl
95
+ (`1.0`), das Template wandelt sie mit dem Filter `| int` in eine ganze Zahl um; der Druckdienst
96
+ nimmt eine ganzzahlige Gleitkommazahl ohnehin an (`1.0` wie `1`), lehnt aber echte
97
+ Nachkommastellen (`1.5`) ab.
98
+ * `tapesmith-automation-nfc.yaml`: Beispiel Automation, die beim Scannen eines NFC Tags das
99
+ Skript mit einer Vorlage aufruft.
100
+ * `tapesmith-rest-command.yaml`: Alternative zu MQTT, `rest_command` ruft die Kurzendpunkte
101
+ (`POST /api/v1/print`) direkt per REST auf, mit dem Token aus `secrets.yaml`
102
+ (`X-P12-Token: !secret p12_token`). Braucht `lan.enabled = true` und ein API-Token mit Rolle
103
+ `drucken` oder `admin`.
104
+
105
+ Beide Dateien lassen sich über die Home Assistant Oberfläche (Einstellungen, Automatisierungen
106
+ und Skripte, YAML bearbeiten) oder als Datei unter `config/scripts.yaml` bzw.
107
+ `config/automations.yaml` einfügen.