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.
- tapesmith-0.4.0/.gitignore +11 -0
- tapesmith-0.4.0/LICENSE +21 -0
- tapesmith-0.4.0/PKG-INFO +246 -0
- tapesmith-0.4.0/README.md +188 -0
- tapesmith-0.4.0/THIRD_PARTY_NOTICES.md +86 -0
- tapesmith-0.4.0/deploy/homeassistant/README.md +107 -0
- tapesmith-0.4.0/deploy/infra/README.md +159 -0
- tapesmith-0.4.0/deploy/powershell/Tapesmith/README.md +113 -0
- tapesmith-0.4.0/deploy/shortlink/README.md +85 -0
- tapesmith-0.4.0/docs/hardware/README.md +177 -0
- tapesmith-0.4.0/pyproject.toml +95 -0
- tapesmith-0.4.0/src/tapesmith/__init__.py +28 -0
- tapesmith-0.4.0/src/tapesmith/__main__.py +28 -0
- tapesmith-0.4.0/src/tapesmith/apitokens.py +190 -0
- tapesmith-0.4.0/src/tapesmith/archive.py +220 -0
- tapesmith-0.4.0/src/tapesmith/automation/__init__.py +1 -0
- tapesmith-0.4.0/src/tapesmith/automation/facade.py +131 -0
- tapesmith-0.4.0/src/tapesmith/automation/hotfolder.py +542 -0
- tapesmith-0.4.0/src/tapesmith/automation/mqtt.py +470 -0
- tapesmith-0.4.0/src/tapesmith/automation/telegram.py +506 -0
- tapesmith-0.4.0/src/tapesmith/automation/update.py +143 -0
- tapesmith-0.4.0/src/tapesmith/backup.py +239 -0
- tapesmith-0.4.0/src/tapesmith/calibrate.py +46 -0
- tapesmith-0.4.0/src/tapesmith/cli.py +446 -0
- tapesmith-0.4.0/src/tapesmith/cli_cmds/__init__.py +6 -0
- tapesmith-0.4.0/src/tapesmith/cli_cmds/app.py +34 -0
- tapesmith-0.4.0/src/tapesmith/cli_cmds/archive.py +85 -0
- tapesmith-0.4.0/src/tapesmith/cli_cmds/asn.py +117 -0
- tapesmith-0.4.0/src/tapesmith/cli_cmds/asset.py +205 -0
- tapesmith-0.4.0/src/tapesmith/cli_cmds/asset_notiz.py +46 -0
- tapesmith-0.4.0/src/tapesmith/cli_cmds/backup.py +73 -0
- tapesmith-0.4.0/src/tapesmith/cli_cmds/base.py +439 -0
- tapesmith-0.4.0/src/tapesmith/cli_cmds/batch.py +219 -0
- tapesmith-0.4.0/src/tapesmith/cli_cmds/batterie.py +162 -0
- tapesmith-0.4.0/src/tapesmith/cli_cmds/ble.py +38 -0
- tapesmith-0.4.0/src/tapesmith/cli_cmds/configcmd.py +110 -0
- tapesmith-0.4.0/src/tapesmith/cli_cmds/daemon.py +144 -0
- tapesmith-0.4.0/src/tapesmith/cli_cmds/density.py +126 -0
- tapesmith-0.4.0/src/tapesmith/cli_cmds/disks.py +170 -0
- tapesmith-0.4.0/src/tapesmith/cli_cmds/drives.py +73 -0
- tapesmith-0.4.0/src/tapesmith/cli_cmds/garantie.py +104 -0
- tapesmith-0.4.0/src/tapesmith/cli_cmds/gui.py +36 -0
- tapesmith-0.4.0/src/tapesmith/cli_cmds/history.py +66 -0
- tapesmith-0.4.0/src/tapesmith/cli_cmds/homelab.py +103 -0
- tapesmith-0.4.0/src/tapesmith/cli_cmds/hotfolder.py +172 -0
- tapesmith-0.4.0/src/tapesmith/cli_cmds/install.py +55 -0
- tapesmith-0.4.0/src/tapesmith/cli_cmds/integrate.py +70 -0
- tapesmith-0.4.0/src/tapesmith/cli_cmds/inv.py +241 -0
- tapesmith-0.4.0/src/tapesmith/cli_cmds/ka.py +211 -0
- tapesmith-0.4.0/src/tapesmith/cli_cmds/kabel.py +208 -0
- tapesmith-0.4.0/src/tapesmith/cli_cmds/kurz.py +119 -0
- tapesmith-0.4.0/src/tapesmith/cli_cmds/mcp.py +58 -0
- tapesmith-0.4.0/src/tapesmith/cli_cmds/module.py +72 -0
- tapesmith-0.4.0/src/tapesmith/cli_cmds/mqtt.py +60 -0
- tapesmith-0.4.0/src/tapesmith/cli_cmds/nummern.py +79 -0
- tapesmith-0.4.0/src/tapesmith/cli_cmds/platte.py +142 -0
- tapesmith-0.4.0/src/tapesmith/cli_cmds/plausi.py +122 -0
- tapesmith-0.4.0/src/tapesmith/cli_cmds/print_cmd.py +60 -0
- tapesmith-0.4.0/src/tapesmith/cli_cmds/proxmox.py +129 -0
- tapesmith-0.4.0/src/tapesmith/cli_cmds/qr.py +123 -0
- tapesmith-0.4.0/src/tapesmith/cli_cmds/queue.py +135 -0
- tapesmith-0.4.0/src/tapesmith/cli_cmds/raw.py +112 -0
- tapesmith-0.4.0/src/tapesmith/cli_cmds/report.py +75 -0
- tapesmith-0.4.0/src/tapesmith/cli_cmds/reprint.py +57 -0
- tapesmith-0.4.0/src/tapesmith/cli_cmds/secret.py +73 -0
- tapesmith-0.4.0/src/tapesmith/cli_cmds/setup.py +72 -0
- tapesmith-0.4.0/src/tapesmith/cli_cmds/sn_scan.py +88 -0
- tapesmith-0.4.0/src/tapesmith/cli_cmds/stats.py +73 -0
- tapesmith-0.4.0/src/tapesmith/cli_cmds/status.py +48 -0
- tapesmith-0.4.0/src/tapesmith/cli_cmds/tape.py +72 -0
- tapesmith-0.4.0/src/tapesmith/cli_cmds/telegram.py +72 -0
- tapesmith-0.4.0/src/tapesmith/cli_cmds/token.py +89 -0
- tapesmith-0.4.0/src/tapesmith/cli_cmds/tray.py +39 -0
- tapesmith-0.4.0/src/tapesmith/cli_cmds/uninstall.py +32 -0
- tapesmith-0.4.0/src/tapesmith/cli_cmds/update.py +129 -0
- tapesmith-0.4.0/src/tapesmith/cli_cmds/usb.py +32 -0
- tapesmith-0.4.0/src/tapesmith/cli_cmds/vault.py +214 -0
- tapesmith-0.4.0/src/tapesmith/clipboard.py +290 -0
- tapesmith-0.4.0/src/tapesmith/commandreg.py +129 -0
- tapesmith-0.4.0/src/tapesmith/compat.py +149 -0
- tapesmith-0.4.0/src/tapesmith/config.py +907 -0
- tapesmith-0.4.0/src/tapesmith/configcode.py +251 -0
- tapesmith-0.4.0/src/tapesmith/connection.py +404 -0
- tapesmith-0.4.0/src/tapesmith/daemon/__init__.py +12 -0
- tapesmith-0.4.0/src/tapesmith/daemon/__main__.py +5 -0
- tapesmith-0.4.0/src/tapesmith/daemon/addons.py +219 -0
- tapesmith-0.4.0/src/tapesmith/daemon/instance.py +272 -0
- tapesmith-0.4.0/src/tapesmith/daemon/probe.py +200 -0
- tapesmith-0.4.0/src/tapesmith/daemon/queue.py +420 -0
- tapesmith-0.4.0/src/tapesmith/daemon/runner.py +290 -0
- tapesmith-0.4.0/src/tapesmith/daemon/server.py +249 -0
- tapesmith-0.4.0/src/tapesmith/daemon/service.py +719 -0
- tapesmith-0.4.0/src/tapesmith/dataimport/__init__.py +2 -0
- tapesmith-0.4.0/src/tapesmith/dataimport/batch.py +187 -0
- tapesmith-0.4.0/src/tapesmith/dataimport/mapping.py +114 -0
- tapesmith-0.4.0/src/tapesmith/dataimport/table.py +161 -0
- tapesmith-0.4.0/src/tapesmith/density.py +118 -0
- tapesmith-0.4.0/src/tapesmith/device/__init__.py +0 -0
- tapesmith-0.4.0/src/tapesmith/device/profile.py +132 -0
- tapesmith-0.4.0/src/tapesmith/device/profiles/__init__.py +0 -0
- tapesmith-0.4.0/src/tapesmith/device/profiles/p12.json +22 -0
- tapesmith-0.4.0/src/tapesmith/doctor.py +97 -0
- tapesmith-0.4.0/src/tapesmith/document/__init__.py +1 -0
- tapesmith-0.4.0/src/tapesmith/document/editing.py +335 -0
- tapesmith-0.4.0/src/tapesmith/document/from_spec.py +105 -0
- tapesmith-0.4.0/src/tapesmith/document/generators/__init__.py +55 -0
- tapesmith-0.4.0/src/tapesmith/document/generators/kabelfahne.py +148 -0
- tapesmith-0.4.0/src/tapesmith/document/generators/kabelwickel.py +82 -0
- tapesmith-0.4.0/src/tapesmith/document/generators/raster.py +218 -0
- tapesmith-0.4.0/src/tapesmith/document/generators/raster_export.py +73 -0
- tapesmith-0.4.0/src/tapesmith/document/model.py +429 -0
- tapesmith-0.4.0/src/tapesmith/document/render.py +440 -0
- tapesmith-0.4.0/src/tapesmith/document/snap.py +176 -0
- tapesmith-0.4.0/src/tapesmith/document/targets.json +16 -0
- tapesmith-0.4.0/src/tapesmith/document/targets.py +155 -0
- tapesmith-0.4.0/src/tapesmith/document/undo.py +88 -0
- tapesmith-0.4.0/src/tapesmith/drives.py +225 -0
- tapesmith-0.4.0/src/tapesmith/errors.py +279 -0
- tapesmith-0.4.0/src/tapesmith/export.py +117 -0
- tapesmith-0.4.0/src/tapesmith/fileutil.py +106 -0
- tapesmith-0.4.0/src/tapesmith/fonts/DejaVuSans-Bold.ttf +0 -0
- tapesmith-0.4.0/src/tapesmith/fonts/DejaVuSans.ttf +0 -0
- tapesmith-0.4.0/src/tapesmith/fonts/DejaVuSansMono.ttf +0 -0
- tapesmith-0.4.0/src/tapesmith/fonts/LICENSE +187 -0
- tapesmith-0.4.0/src/tapesmith/fonts/__init__.py +0 -0
- tapesmith-0.4.0/src/tapesmith/guard.py +207 -0
- tapesmith-0.4.0/src/tapesmith/gui/__init__.py +7 -0
- tapesmith-0.4.0/src/tapesmith/gui/__main__.py +7 -0
- tapesmith-0.4.0/src/tapesmith/gui/hotkey.py +148 -0
- tapesmith-0.4.0/src/tapesmith/gui/icons.py +130 -0
- tapesmith-0.4.0/src/tapesmith/gui/preview_model.py +171 -0
- tapesmith-0.4.0/src/tapesmith/gui/qtutil.py +114 -0
- tapesmith-0.4.0/src/tapesmith/gui/recent.py +35 -0
- tapesmith-0.4.0/src/tapesmith/gui/services.py +216 -0
- tapesmith-0.4.0/src/tapesmith/gui/theme.py +112 -0
- tapesmith-0.4.0/src/tapesmith/gui/tray.py +994 -0
- tapesmith-0.4.0/src/tapesmith/history.py +376 -0
- tapesmith-0.4.0/src/tapesmith/hotkeyspec.py +146 -0
- tapesmith-0.4.0/src/tapesmith/i18n.py +337 -0
- tapesmith-0.4.0/src/tapesmith/icons/LICENSE-tabler.txt +21 -0
- tapesmith-0.4.0/src/tapesmith/icons/__init__.py +1 -0
- tapesmith-0.4.0/src/tapesmith/icons/app.ico +0 -0
- tapesmith-0.4.0/src/tapesmith/icons/categories.json +78 -0
- tapesmith-0.4.0/src/tapesmith/icons/simple/LICENSE-simple-icons.txt +30 -0
- tapesmith-0.4.0/src/tapesmith/icons/simple/MARKEN.txt +4 -0
- tapesmith-0.4.0/src/tapesmith/icons/simple/__init__.py +0 -0
- tapesmith-0.4.0/src/tapesmith/icons/simple/cloudflare.png +0 -0
- tapesmith-0.4.0/src/tapesmith/icons/simple/debian.png +0 -0
- tapesmith-0.4.0/src/tapesmith/icons/simple/docker.png +0 -0
- tapesmith-0.4.0/src/tapesmith/icons/simple/grafana.png +0 -0
- tapesmith-0.4.0/src/tapesmith/icons/simple/homeassistant.png +0 -0
- tapesmith-0.4.0/src/tapesmith/icons/simple/index.json +85 -0
- tapesmith-0.4.0/src/tapesmith/icons/simple/jellyfin.png +0 -0
- tapesmith-0.4.0/src/tapesmith/icons/simple/linux.png +0 -0
- tapesmith-0.4.0/src/tapesmith/icons/simple/nextcloud.png +0 -0
- tapesmith-0.4.0/src/tapesmith/icons/simple/nginx.png +0 -0
- tapesmith-0.4.0/src/tapesmith/icons/simple/obsidian.png +0 -0
- tapesmith-0.4.0/src/tapesmith/icons/simple/opnsense.png +0 -0
- tapesmith-0.4.0/src/tapesmith/icons/simple/paperlessngx.png +0 -0
- tapesmith-0.4.0/src/tapesmith/icons/simple/pfsense.png +0 -0
- tapesmith-0.4.0/src/tapesmith/icons/simple/proxmox.png +0 -0
- tapesmith-0.4.0/src/tapesmith/icons/simple/raspberrypi.png +0 -0
- tapesmith-0.4.0/src/tapesmith/icons/simple/synology.png +0 -0
- tapesmith-0.4.0/src/tapesmith/icons/simple/tailscale.png +0 -0
- tapesmith-0.4.0/src/tapesmith/icons/simple/truenas.png +0 -0
- tapesmith-0.4.0/src/tapesmith/icons/simple/ubuntu.png +0 -0
- tapesmith-0.4.0/src/tapesmith/icons/simple/wireguard.png +0 -0
- tapesmith-0.4.0/src/tapesmith/icons/tabler-icons.ttf +0 -0
- tapesmith-0.4.0/src/tapesmith/icons/tabler-index.json +1 -0
- tapesmith-0.4.0/src/tapesmith/imageinput.py +128 -0
- tapesmith-0.4.0/src/tapesmith/install/__init__.py +6 -0
- tapesmith-0.4.0/src/tapesmith/install/installer.py +478 -0
- tapesmith-0.4.0/src/tapesmith/install/junction.py +67 -0
- tapesmith-0.4.0/src/tapesmith/install/layout.py +201 -0
- tapesmith-0.4.0/src/tapesmith/install/legacy.py +231 -0
- tapesmith-0.4.0/src/tapesmith/install/processes.py +221 -0
- tapesmith-0.4.0/src/tapesmith/install/registry.py +112 -0
- tapesmith-0.4.0/src/tapesmith/install/shortcuts.py +109 -0
- tapesmith-0.4.0/src/tapesmith/install/uninstaller.py +213 -0
- tapesmith-0.4.0/src/tapesmith/install/venv.py +241 -0
- tapesmith-0.4.0/src/tapesmith/integration.py +429 -0
- tapesmith-0.4.0/src/tapesmith/integrations/__init__.py +7 -0
- tapesmith-0.4.0/src/tapesmith/integrations/assetnote.py +78 -0
- tapesmith-0.4.0/src/tapesmith/integrations/assets.py +327 -0
- tapesmith-0.4.0/src/tapesmith/integrations/cliprint.py +158 -0
- tapesmith-0.4.0/src/tapesmith/integrations/codescan.py +290 -0
- tapesmith-0.4.0/src/tapesmith/integrations/credentials.py +158 -0
- tapesmith-0.4.0/src/tapesmith/integrations/errors.py +93 -0
- tapesmith-0.4.0/src/tapesmith/integrations/frontmatter.py +189 -0
- tapesmith-0.4.0/src/tapesmith/integrations/homeassistant.py +217 -0
- tapesmith-0.4.0/src/tapesmith/integrations/httpclient.py +91 -0
- tapesmith-0.4.0/src/tapesmith/integrations/kleinanzeigen.py +300 -0
- tapesmith-0.4.0/src/tapesmith/integrations/mcpclient.py +186 -0
- tapesmith-0.4.0/src/tapesmith/integrations/netbox.py +189 -0
- tapesmith-0.4.0/src/tapesmith/integrations/obsidian.py +325 -0
- tapesmith-0.4.0/src/tapesmith/integrations/paperless.py +298 -0
- tapesmith-0.4.0/src/tapesmith/integrations/plausi.py +267 -0
- tapesmith-0.4.0/src/tapesmith/integrations/proxmox.py +438 -0
- tapesmith-0.4.0/src/tapesmith/integrations/scancache.py +99 -0
- tapesmith-0.4.0/src/tapesmith/integrations/settings.py +409 -0
- tapesmith-0.4.0/src/tapesmith/integrations/shortlink.py +169 -0
- tapesmith-0.4.0/src/tapesmith/integrations/snippet.py +143 -0
- tapesmith-0.4.0/src/tapesmith/integrations/tia606.py +218 -0
- tapesmith-0.4.0/src/tapesmith/integrations/winclip.py +76 -0
- tapesmith-0.4.0/src/tapesmith/integrations/zfsreplace.py +336 -0
- tapesmith-0.4.0/src/tapesmith/inventory.py +396 -0
- tapesmith-0.4.0/src/tapesmith/ipc/__init__.py +1 -0
- tapesmith-0.4.0/src/tapesmith/ipc/backend.py +650 -0
- tapesmith-0.4.0/src/tapesmith/ipc/client.py +205 -0
- tapesmith-0.4.0/src/tapesmith/ipc/codec.py +241 -0
- tapesmith-0.4.0/src/tapesmith/ipc/launcher.py +66 -0
- tapesmith-0.4.0/src/tapesmith/ipc/pipe.py +789 -0
- tapesmith-0.4.0/src/tapesmith/ipc/protocol.py +153 -0
- tapesmith-0.4.0/src/tapesmith/jobs.py +80 -0
- tapesmith-0.4.0/src/tapesmith/labelmeta.py +64 -0
- tapesmith-0.4.0/src/tapesmith/launch.py +93 -0
- tapesmith-0.4.0/src/tapesmith/locales/__init__.py +0 -0
- tapesmith-0.4.0/src/tapesmith/locales/de/common.json +18 -0
- tapesmith-0.4.0/src/tapesmith/locales/de/errors.json +222 -0
- tapesmith-0.4.0/src/tapesmith/locales/de/modules.json +60 -0
- tapesmith-0.4.0/src/tapesmith/locales/de/tray.json +114 -0
- tapesmith-0.4.0/src/tapesmith/locales/en/common.json +18 -0
- tapesmith-0.4.0/src/tapesmith/locales/en/errors.json +222 -0
- tapesmith-0.4.0/src/tapesmith/locales/en/modules.json +60 -0
- tapesmith-0.4.0/src/tapesmith/locales/en/tray.json +114 -0
- tapesmith-0.4.0/src/tapesmith/locales/messages/en.json +2592 -0
- tapesmith-0.4.0/src/tapesmith/lock.py +51 -0
- tapesmith-0.4.0/src/tapesmith/mcpserver/__init__.py +5 -0
- tapesmith-0.4.0/src/tapesmith/mcpserver/backends.py +196 -0
- tapesmith-0.4.0/src/tapesmith/mcpserver/server.py +213 -0
- tapesmith-0.4.0/src/tapesmith/mcpserver/tools.py +266 -0
- tapesmith-0.4.0/src/tapesmith/migrate.py +117 -0
- tapesmith-0.4.0/src/tapesmith/modules.py +397 -0
- tapesmith-0.4.0/src/tapesmith/netinfo.py +65 -0
- tapesmith-0.4.0/src/tapesmith/numbering.py +215 -0
- tapesmith-0.4.0/src/tapesmith/pacing.py +8 -0
- tapesmith-0.4.0/src/tapesmith/paths.py +65 -0
- tapesmith-0.4.0/src/tapesmith/pipeline.py +404 -0
- tapesmith-0.4.0/src/tapesmith/printer.py +175 -0
- tapesmith-0.4.0/src/tapesmith/printhooks.py +37 -0
- tapesmith-0.4.0/src/tapesmith/protocol/__init__.py +0 -0
- tapesmith-0.4.0/src/tapesmith/protocol/job.py +77 -0
- tapesmith-0.4.0/src/tapesmith/protocol/raster.py +28 -0
- tapesmith-0.4.0/src/tapesmith/protocol/rawcmd.py +85 -0
- tapesmith-0.4.0/src/tapesmith/protocol/status.py +77 -0
- tapesmith-0.4.0/src/tapesmith/render/__init__.py +0 -0
- tapesmith-0.4.0/src/tapesmith/render/barcode.py +93 -0
- tapesmith-0.4.0/src/tapesmith/render/chain.py +221 -0
- tapesmith-0.4.0/src/tapesmith/render/checks.py +28 -0
- tapesmith-0.4.0/src/tapesmith/render/code128.py +100 -0
- tapesmith-0.4.0/src/tapesmith/render/codes.py +61 -0
- tapesmith-0.4.0/src/tapesmith/render/compose.py +130 -0
- tapesmith-0.4.0/src/tapesmith/render/datamatrix.py +54 -0
- tapesmith-0.4.0/src/tapesmith/render/dither.py +58 -0
- tapesmith-0.4.0/src/tapesmith/render/fixes.py +191 -0
- tapesmith-0.4.0/src/tapesmith/render/fonts.py +46 -0
- tapesmith-0.4.0/src/tapesmith/render/icons.py +309 -0
- tapesmith-0.4.0/src/tapesmith/render/inkcheck.py +65 -0
- tapesmith-0.4.0/src/tapesmith/render/qr.py +78 -0
- tapesmith-0.4.0/src/tapesmith/render/qrcontent.py +175 -0
- tapesmith-0.4.0/src/tapesmith/render/shapes.py +109 -0
- tapesmith-0.4.0/src/tapesmith/render/text.py +120 -0
- tapesmith-0.4.0/src/tapesmith/render/textsize.py +84 -0
- tapesmith-0.4.0/src/tapesmith/render/zxing.py +83 -0
- tapesmith-0.4.0/src/tapesmith/reprint.py +150 -0
- tapesmith-0.4.0/src/tapesmith/secretref.py +149 -0
- tapesmith-0.4.0/src/tapesmith/selftest.py +522 -0
- tapesmith-0.4.0/src/tapesmith/setup.py +141 -0
- tapesmith-0.4.0/src/tapesmith/sourcelimits.py +81 -0
- tapesmith-0.4.0/src/tapesmith/sshscan.py +360 -0
- tapesmith-0.4.0/src/tapesmith/stats.py +96 -0
- tapesmith-0.4.0/src/tapesmith/status.py +122 -0
- tapesmith-0.4.0/src/tapesmith/statusview.py +169 -0
- tapesmith-0.4.0/src/tapesmith/support.py +186 -0
- tapesmith-0.4.0/src/tapesmith/tape/__init__.py +6 -0
- tapesmith-0.4.0/src/tapesmith/tape/preview.py +50 -0
- tapesmith-0.4.0/src/tapesmith/tape/profiles.py +179 -0
- tapesmith-0.4.0/src/tapesmith/tape/rolls.py +187 -0
- tapesmith-0.4.0/src/tapesmith/tape/suitability.py +69 -0
- tapesmith-0.4.0/src/tapesmith/tape/tapes.json +22 -0
- tapesmith-0.4.0/src/tapesmith/templates/__init__.py +0 -0
- tapesmith-0.4.0/src/tapesmith/templates/builtin/__init__.py +0 -0
- tapesmith-0.4.0/src/tapesmith/templates/builtin/absender.tapesmith.json +29 -0
- tapesmith-0.4.0/src/tapesmith/templates/builtin/asn.tapesmith.json +30 -0
- tapesmith-0.4.0/src/tapesmith/templates/builtin/asset-kurz.tapesmith.json +34 -0
- tapesmith-0.4.0/src/tapesmith/templates/builtin/asset-tag.tapesmith.json +32 -0
- tapesmith-0.4.0/src/tapesmith/templates/builtin/aufbewahrungsbox.tapesmith.json +34 -0
- tapesmith-0.4.0/src/tapesmith/templates/builtin/batterie.tapesmith.json +32 -0
- tapesmith-0.4.0/src/tapesmith/templates/builtin/datentraeger-qr.tapesmith.json +27 -0
- tapesmith-0.4.0/src/tapesmith/templates/builtin/datentraeger.tapesmith.json +27 -0
- tapesmith-0.4.0/src/tapesmith/templates/builtin/eigentum.tapesmith.json +32 -0
- tapesmith-0.4.0/src/tapesmith/templates/builtin/garantie-qr.tapesmith.json +37 -0
- tapesmith-0.4.0/src/tapesmith/templates/builtin/garantie.tapesmith.json +31 -0
- tapesmith-0.4.0/src/tapesmith/templates/builtin/gefriergut.tapesmith.json +43 -0
- tapesmith-0.4.0/src/tapesmith/templates/builtin/geoeffnet-am.tapesmith.json +28 -0
- tapesmith-0.4.0/src/tapesmith/templates/builtin/host-ip.tapesmith.json +35 -0
- tapesmith-0.4.0/src/tapesmith/templates/builtin/ip-label.tapesmith.json +25 -0
- tapesmith-0.4.0/src/tapesmith/templates/builtin/ka-artikel.tapesmith.json +36 -0
- tapesmith-0.4.0/src/tapesmith/templates/builtin/kabelfahne.tapesmith.json +37 -0
- tapesmith-0.4.0/src/tapesmith/templates/builtin/kabelwickel.tapesmith.json +29 -0
- tapesmith-0.4.0/src/tapesmith/templates/builtin/netzteil-warnung.tapesmith.json +36 -0
- tapesmith-0.4.0/src/tapesmith/templates/builtin/netzteil-zuordnung.tapesmith.json +31 -0
- tapesmith-0.4.0/src/tapesmith/templates/builtin/netzteil.tapesmith.json +31 -0
- tapesmith-0.4.0/src/tapesmith/templates/builtin/ordnerruecken-breit.tapesmith.json +27 -0
- tapesmith-0.4.0/src/tapesmith/templates/builtin/ordnerruecken-schmal.tapesmith.json +27 -0
- tapesmith-0.4.0/src/tapesmith/templates/builtin/passthrough.tapesmith.json +31 -0
- tapesmith-0.4.0/src/tapesmith/templates/builtin/platte-defekt.tapesmith.json +32 -0
- tapesmith-0.4.0/src/tapesmith/templates/builtin/preis.tapesmith.json +26 -0
- tapesmith-0.4.0/src/tapesmith/templates/builtin/psu-paar.tapesmith.json +32 -0
- tapesmith-0.4.0/src/tapesmith/templates/builtin/raster-patchpanel.tapesmith.json +26 -0
- tapesmith-0.4.0/src/tapesmith/templates/builtin/raster-sicherungskasten.tapesmith.json +25 -0
- tapesmith-0.4.0/src/tapesmith/templates/builtin/raster-sortiment.tapesmith.json +25 -0
- tapesmith-0.4.0/src/tapesmith/templates/builtin/raster-switch.tapesmith.json +26 -0
- tapesmith-0.4.0/src/tapesmith/templates/builtin/reserviert.tapesmith.json +27 -0
- tapesmith-0.4.0/src/tapesmith/templates/builtin/schule.tapesmith.json +38 -0
- tapesmith-0.4.0/src/tapesmith/templates/builtin/vm-lxc-qr.tapesmith.json +37 -0
- tapesmith-0.4.0/src/tapesmith/templates/builtin/vm-lxc.tapesmith.json +29 -0
- tapesmith-0.4.0/src/tapesmith/templates/builtin/vorratsdose.tapesmith.json +37 -0
- tapesmith-0.4.0/src/tapesmith/templates/builtin/wartung.tapesmith.json +35 -0
- tapesmith-0.4.0/src/tapesmith/templates/fill.py +183 -0
- tapesmith-0.4.0/src/tapesmith/templates/gallery.py +239 -0
- tapesmith-0.4.0/src/tapesmith/templates/lint.py +191 -0
- tapesmith-0.4.0/src/tapesmith/templates/model.py +849 -0
- tapesmith-0.4.0/src/tapesmith/templates/render.py +245 -0
- tapesmith-0.4.0/src/tapesmith/templates/serial.py +54 -0
- tapesmith-0.4.0/src/tapesmith/templates/series.py +130 -0
- tapesmith-0.4.0/src/tapesmith/templates/store.py +110 -0
- tapesmith-0.4.0/src/tapesmith/transport/__init__.py +0 -0
- tapesmith-0.4.0/src/tapesmith/transport/base.py +121 -0
- tapesmith-0.4.0/src/tapesmith/transport/ble.py +239 -0
- tapesmith-0.4.0/src/tapesmith/transport/btports.py +70 -0
- tapesmith-0.4.0/src/tapesmith/transport/resolve.py +50 -0
- tapesmith-0.4.0/src/tapesmith/transport/serial_port.py +72 -0
- tapesmith-0.4.0/src/tapesmith/transport/usb.py +289 -0
- tapesmith-0.4.0/src/tapesmith/update/__init__.py +10 -0
- tapesmith-0.4.0/src/tapesmith/update/apply.py +310 -0
- tapesmith-0.4.0/src/tapesmith/update/errors.py +23 -0
- tapesmith-0.4.0/src/tapesmith/update/manifest.py +278 -0
- tapesmith-0.4.0/src/tapesmith/update/service.py +394 -0
- tapesmith-0.4.0/src/tapesmith/update/signing.py +93 -0
- tapesmith-0.4.0/src/tapesmith/update/sources.py +308 -0
- tapesmith-0.4.0/src/tapesmith/update/state.py +67 -0
- tapesmith-0.4.0/src/tapesmith/update/trusted_keys.json +8 -0
- tapesmith-0.4.0/src/tapesmith/verify.py +136 -0
- tapesmith-0.4.0/src/tapesmith/webapi/__init__.py +5 -0
- tapesmith-0.4.0/src/tapesmith/webapi/accent.py +26 -0
- tapesmith-0.4.0/src/tapesmith/webapi/access.py +144 -0
- tapesmith-0.4.0/src/tapesmith/webapi/actions.py +115 -0
- tapesmith-0.4.0/src/tapesmith/webapi/app.py +124 -0
- tapesmith-0.4.0/src/tapesmith/webapi/batchapi.py +150 -0
- tapesmith-0.4.0/src/tapesmith/webapi/context.py +125 -0
- tapesmith-0.4.0/src/tapesmith/webapi/convert.py +51 -0
- tapesmith-0.4.0/src/tapesmith/webapi/datajson.py +95 -0
- tapesmith-0.4.0/src/tapesmith/webapi/documents.py +93 -0
- tapesmith-0.4.0/src/tapesmith/webapi/drafts.py +226 -0
- tapesmith-0.4.0/src/tapesmith/webapi/errors.py +197 -0
- tapesmith-0.4.0/src/tapesmith/webapi/events.py +105 -0
- tapesmith-0.4.0/src/tapesmith/webapi/homelab_common.py +61 -0
- tapesmith-0.4.0/src/tapesmith/webapi/homelab_routers.py +30 -0
- tapesmith-0.4.0/src/tapesmith/webapi/labels.py +575 -0
- tapesmith-0.4.0/src/tapesmith/webapi/language.py +52 -0
- tapesmith-0.4.0/src/tapesmith/webapi/mcp_http.py +65 -0
- tapesmith-0.4.0/src/tapesmith/webapi/previews.py +70 -0
- tapesmith-0.4.0/src/tapesmith/webapi/printing.py +110 -0
- tapesmith-0.4.0/src/tapesmith/webapi/ratelimit.py +93 -0
- tapesmith-0.4.0/src/tapesmith/webapi/routes_access.py +210 -0
- tapesmith-0.4.0/src/tapesmith/webapi/routes_assets.py +213 -0
- tapesmith-0.4.0/src/tapesmith/webapi/routes_codescan.py +58 -0
- tapesmith-0.4.0/src/tapesmith/webapi/routes_core.py +148 -0
- tapesmith-0.4.0/src/tapesmith/webapi/routes_data.py +516 -0
- tapesmith-0.4.0/src/tapesmith/webapi/routes_drafts.py +74 -0
- tapesmith-0.4.0/src/tapesmith/webapi/routes_editor.py +396 -0
- tapesmith-0.4.0/src/tapesmith/webapi/routes_family.py +270 -0
- tapesmith-0.4.0/src/tapesmith/webapi/routes_ha.py +106 -0
- tapesmith-0.4.0/src/tapesmith/webapi/routes_homelab.py +69 -0
- tapesmith-0.4.0/src/tapesmith/webapi/routes_kabel.py +218 -0
- tapesmith-0.4.0/src/tapesmith/webapi/routes_kleinanzeigen.py +145 -0
- tapesmith-0.4.0/src/tapesmith/webapi/routes_labels.py +74 -0
- tapesmith-0.4.0/src/tapesmith/webapi/routes_modules.py +78 -0
- tapesmith-0.4.0/src/tapesmith/webapi/routes_paperless.py +116 -0
- tapesmith-0.4.0/src/tapesmith/webapi/routes_plausi.py +133 -0
- tapesmith-0.4.0/src/tapesmith/webapi/routes_proxmox.py +93 -0
- tapesmith-0.4.0/src/tapesmith/webapi/routes_settings.py +327 -0
- tapesmith-0.4.0/src/tapesmith/webapi/routes_short.py +203 -0
- tapesmith-0.4.0/src/tapesmith/webapi/routes_support.py +46 -0
- tapesmith-0.4.0/src/tapesmith/webapi/routes_system.py +179 -0
- tapesmith-0.4.0/src/tapesmith/webapi/routes_templates.py +474 -0
- tapesmith-0.4.0/src/tapesmith/webapi/routes_update.py +154 -0
- tapesmith-0.4.0/src/tapesmith/webapi/routes_vault.py +202 -0
- tapesmith-0.4.0/src/tapesmith/webapi/routes_zfs.py +103 -0
- tapesmith-0.4.0/src/tapesmith/webapi/security.py +254 -0
- tapesmith-0.4.0/src/tapesmith/webapi/server.py +229 -0
- tapesmith-0.4.0/src/tapesmith/webapi/session.py +70 -0
- tapesmith-0.4.0/src/tapesmith/webapi/settings_schema.py +462 -0
- tapesmith-0.4.0/src/tapesmith/webui/__init__.py +8 -0
- tapesmith-0.4.0/src/tapesmith/webui/browser.py +261 -0
- tapesmith-0.4.0/src/tapesmith/webui/static/assets/DataList-BNdLqY0h.js +1 -0
- tapesmith-0.4.0/src/tapesmith/webui/static/assets/FamilyApp-ArkuANKE.js +1 -0
- tapesmith-0.4.0/src/tapesmith/webui/static/assets/ListToolbar-C4dAZi00.js +1 -0
- tapesmith-0.4.0/src/tapesmith/webui/static/assets/ModuleSettingsButton-ZUbj_1ik.js +1 -0
- tapesmith-0.4.0/src/tapesmith/webui/static/assets/NavList-Dwey-1PS.js +1 -0
- tapesmith-0.4.0/src/tapesmith/webui/static/assets/PrintOptionsBar-gdugjiWW.js +1 -0
- tapesmith-0.4.0/src/tapesmith/webui/static/assets/RowActions-CG90mya5.js +1 -0
- tapesmith-0.4.0/src/tapesmith/webui/static/assets/Section-B0h_MINH.js +1 -0
- tapesmith-0.4.0/src/tapesmith/webui/static/assets/TableScroll-BWJfFpya.js +1 -0
- tapesmith-0.4.0/src/tapesmith/webui/static/assets/TapePreview-DKSbEPDH.js +1 -0
- tapesmith-0.4.0/src/tapesmith/webui/static/assets/TextSizeSelect-NmOXQvqm.js +1 -0
- tapesmith-0.4.0/src/tapesmith/webui/static/assets/WarningList-TFhCJHVc.js +1 -0
- tapesmith-0.4.0/src/tapesmith/webui/static/assets/api-DAWnziWm.js +1 -0
- tapesmith-0.4.0/src/tapesmith/webui/static/assets/fluent-DAQMrKDT.js +194 -0
- tapesmith-0.4.0/src/tapesmith/webui/static/assets/gateMessages-BjG-W2n9.js +8 -0
- tapesmith-0.4.0/src/tapesmith/webui/static/assets/index-B0ibC1fA.js +5 -0
- tapesmith-0.4.0/src/tapesmith/webui/static/assets/index-B3ieSe8A.js +1 -0
- tapesmith-0.4.0/src/tapesmith/webui/static/assets/index-B6LmWkwg.js +1 -0
- tapesmith-0.4.0/src/tapesmith/webui/static/assets/index-BBGAZEVC.js +1 -0
- tapesmith-0.4.0/src/tapesmith/webui/static/assets/index-BFOUDlKz.js +1 -0
- tapesmith-0.4.0/src/tapesmith/webui/static/assets/index-BG0glZqe.js +2 -0
- tapesmith-0.4.0/src/tapesmith/webui/static/assets/index-Bk_o53YF.js +2 -0
- tapesmith-0.4.0/src/tapesmith/webui/static/assets/index-Bm_YhjSS.js +39 -0
- tapesmith-0.4.0/src/tapesmith/webui/static/assets/index-C1culFZj.js +2 -0
- tapesmith-0.4.0/src/tapesmith/webui/static/assets/index-C7z4MrlV.js +1 -0
- tapesmith-0.4.0/src/tapesmith/webui/static/assets/index-C8Wfr4XK.js +1 -0
- tapesmith-0.4.0/src/tapesmith/webui/static/assets/index-CSBHxRZo.js +4 -0
- tapesmith-0.4.0/src/tapesmith/webui/static/assets/index-CUM2lQP7.js +7 -0
- tapesmith-0.4.0/src/tapesmith/webui/static/assets/index-CUc32c9J.js +1 -0
- tapesmith-0.4.0/src/tapesmith/webui/static/assets/index-CYOf3IW7.js +1 -0
- tapesmith-0.4.0/src/tapesmith/webui/static/assets/index-CqdKpquX.js +1 -0
- tapesmith-0.4.0/src/tapesmith/webui/static/assets/index-DRDqtjoV.js +2 -0
- tapesmith-0.4.0/src/tapesmith/webui/static/assets/index-DXW3DZbF.js +1 -0
- tapesmith-0.4.0/src/tapesmith/webui/static/assets/index-NbuszyXs.js +3 -0
- tapesmith-0.4.0/src/tapesmith/webui/static/assets/index-QLKmO2qo.js +1 -0
- tapesmith-0.4.0/src/tapesmith/webui/static/assets/index-TA-i_7q_.js +6 -0
- tapesmith-0.4.0/src/tapesmith/webui/static/assets/index-qLvSlZoG.js +1 -0
- tapesmith-0.4.0/src/tapesmith/webui/static/assets/index-sdE0n6Yf.js +1 -0
- tapesmith-0.4.0/src/tapesmith/webui/static/assets/index-vkhP0yaY.js +2 -0
- tapesmith-0.4.0/src/tapesmith/webui/static/assets/konva-CZCmb_o2.js +51 -0
- tapesmith-0.4.0/src/tapesmith/webui/static/assets/numberText-CaqySO_R.js +1 -0
- tapesmith-0.4.0/src/tapesmith/webui/static/assets/systemTitle-qe0pdYpR.js +1 -0
- tapesmith-0.4.0/src/tapesmith/webui/static/assets/time-Ctx9DKCc.js +1 -0
- tapesmith-0.4.0/src/tapesmith/webui/static/assets/unsaved-Dbna7DRF.js +1 -0
- tapesmith-0.4.0/src/tapesmith/webui/static/index.html +19 -0
- tapesmith-0.4.0/web/README.md +38 -0
tapesmith-0.4.0/LICENSE
ADDED
|
@@ -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.
|
tapesmith-0.4.0/PKG-INFO
ADDED
|
@@ -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
|
+

|
|
69
|
+
|
|
70
|
+
## Screenshots
|
|
71
|
+
|
|
72
|
+
| Editor | Template gallery |
|
|
73
|
+
|---|---|
|
|
74
|
+
|  |  |
|
|
75
|
+
| **Print history** | **Settings (dark)** |
|
|
76
|
+
|  |  |
|
|
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
|
+

|
|
11
|
+
|
|
12
|
+
## Screenshots
|
|
13
|
+
|
|
14
|
+
| Editor | Template gallery |
|
|
15
|
+
|---|---|
|
|
16
|
+
|  |  |
|
|
17
|
+
| **Print history** | **Settings (dark)** |
|
|
18
|
+
|  |  |
|
|
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.
|