Skip to content

Commit 5e69b8f

Browse files
committed
v1.8.10 — Bambu + Elegoo LAN scan, RFID rescan no longer wipes spool data + auto-syncs weight to chip, status only after first real data, Printer Settings polish
- LAN discovery completes the lineup: - Bambu Lab: SSDP M-SEARCH multicast on 239.255.255.250:1900 (urn:bambulab-com:device:3dprinter:1), parses DevModel/DevName/USN. Manual Add-by-IP: TLS cert sniff on :8883 (subject/issuer contains bambu/bbl). bambu:ssdp-discover + bambu:tls-probe IPC. - Elegoo: UDP unicast spray {"id":0,"method":7000} → :52700 across /24 prefixes (incl. always-scanned 192.168.1/192.168.40, persisted user extras). elegoo:udp-discover + elegoo:udp-probe IPC. - RFID: rescan switched from full set() to set(merge:true) so user-edits (container, note, capacity…) survive. weight_available only seeded from chip on fresh write (new chip / chip-rewrite). On regular rescan, if DB.weight ≠ chip.weight, surgical RFID write rebuilds payload from Firestore doc and writes only page 0x17 (Measure Available u24 BE) — chip and DB converge automatically while the chip is on the reader. - Online status across all brands now flips on the first real frame/report/heartbeat (was: on transport open for snap/cre/bbl/elg). FlashForge already did this. - Elegoo Access code is now required (was optional). Renamed from "MQTT password (optional)" to "Access code" via shared printerLblAccessCode. - Printer Settings: removed Credentials section headers and the horizontal divider between sections — one continuous form. - Friend view hides + Scan and Add buttons (read-only). - CSS fixes: password-eye / clear-input no longer drop 14px on click (dedicated :active override preserving translateY(-50%) centering); .pba-input no longer changes size when the eye toggles password ↔ text (doubled-selector outranks the global input[type=text] rule). - New icon_cloud_3d.svg + .icon-cloud-3d used by the header backend-health indicator. - Storage tooltip shows the spool's TigerTag+ material image as a full-height left column when available.
1 parent 97bfbcc commit 5e69b8f

34 files changed

Lines changed: 2164 additions & 60 deletions

‎CHANGELOG.md‎

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,29 @@ Versions follow [Semantic Versioning](https://semver.org/).
55

66
---
77

8+
## v1.8.10 — 2026-05-30
9+
10+
### Added
11+
12+
- **Bambu Lab and Elegoo printers now show up in the network scan.** *Add printer → Bambu Lab → Scan network* discovers Bambu printers via SSDP — they announce themselves on the LAN, no setup needed. *Add printer → Elegoo → Scan network* discovers Elegoo printers (Centauri Carbon 2 and later) by sending a quick UDP probe to every host on your local subnets. Each scan offers one-click add with the serial number, model, IP and name already filled in. There's also a manual *Enter IP address* path and an inline *Add by IP* shortcut for printers the scan can't reach directly; the common Elegoo subnets (192.168.1.x, 192.168.40.x) are always scanned, and any extra subnets you add persist across a *Restart scan*. With Creality, Snapmaker and FlashForge already shipping discovery, every supported brand now has it.
13+
- **Storage view: the hover tooltip on a rack slot now shows the spool's material image** as a full-height left column (for TigerTag+ spools that have a product photo). The bubble keeps everything that was already there — brand, material, color, weight bar, coordinate, lock indicator — on the right. Falls back to the previous single-column layout when no image is available.
14+
15+
### Changed
16+
17+
- **Printers are reported online only once the connection is really established** — i.e. after the first real frame/report/heartbeat arrives — not the instant the network socket opens. Previously Snapmaker and Creality flipped to "online" the moment the WebSocket connected, and Bambu / Elegoo the moment the MQTT broker accepted them, even before the printer itself had answered. Now every brand waits for real data first, so a printer that's reachable but not yet responding stays "offline" exactly as you'd expect. Elegoo printers in "connecting" state are also correctly shown offline instead of "checking", in line with the other brands.
18+
- **Elegoo: the MQTT credential field is now required and properly named.** What used to be labelled "MQTT password (optional)" in *Printer Settings → Elegoo* is now **"Access code"** and is required — matching the label the printer itself uses on its network settings screen. The hint tells you where to find it (factory default is still `123456`).
19+
- **Cleaner Printer Settings form.** The small-caps "Credentials" section header and the horizontal divider line between sections are gone across all brands. The form now reads as one continuous block of connection fields instead of looking like several separate cards stacked on each other.
20+
- **Read-only mode in a friend's inventory hides the write-action buttons.** The *+ Scan* and *Add* buttons no longer appear when you're viewing a friend's inventory — they can't act on someone else's collection anyway. They reappear automatically when you return to your own view.
21+
- **Header backend-health indicator** uses a new 3D cloud icon design (the other cloud icons elsewhere in the app are unchanged).
22+
23+
### Fixed
24+
25+
- **RFID rescan no longer erases your spool data, and the chip weight now syncs automatically to the database value.** Re-scanning a spool used to silently wipe every Firestore field that wasn't on the chip — container assignment, custom note, capacity, etc. — and replace the current weight with whatever the chip held, which is almost always stale because the weight slider only writes to the database and nothing was ever updating the chip back. Three-part fix: user-edited fields are now preserved on rescan; the weight is no longer rolled back to the chip's value on a regular rescan; and when the database weight differs from what the chip shows, the app writes the new value directly onto the chip while it's still on the reader (only the 3 bytes that hold "Measure Available" are touched). Chip and database now converge every time you tap a spool. New chips and chip-rewrite flows are unchanged.
26+
- **Password-eye and clear-input buttons no longer jump down** when clicked — a global CSS rule was overriding the absolute-positioning transform on these icon buttons, making them drop ~14 px on every click in Printer Settings, the login modal, and the Add printer form.
27+
- **Printer Settings inputs no longer change size when you click the eye toggle** to show/hide a password — the field now stays the exact same dimension regardless of whether the password is hidden or shown (was jumping from 36 → 40 px tall and 13 → 14 px text on every toggle).
28+
29+
---
30+
831
## v1.8.9 — 2026-05-29
932

1033
### Added

‎WORKLOG.md‎

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,24 @@
1-
# Worklog — v1.8.9 (in progress)
1+
# Worklog — v1.8.10 (in progress)
22

33
## Added
4-
- Creality LAN discovery in the "Add printer → Scan" flow — mirrors the mobile Flutter scanner and the existing Snapmaker/FlashForge desktop flows. Choice modal (Scan vs Manual), live LAN scan panel with one-click add, and manual-IP probe. Two-stage probe: fast TCP `:9999` port-open filter in the main process, then a renderer WebSocket handshake (`get printerInfo`, heartbeat-aware frame accumulation, `isCrealityLike` validation) — unconfirmed hosts are dropped. Common Creality subnets (192.168.1, 192.168.40) always scanned; user extra subnets persisted in localStorage so they survive a Restart scan. Logs a clear error in the debug scan log when the IPC bridge isn't loaded (app needs a full relaunch). `cre:tcp-probe` IPC + `creTcpProbe` preload bridge — `main.js`, `preload.js`, `renderer/printers/creality/probe.js`, `renderer/printers/creality/add-flow.js`, `renderer/inventory.js`
4+
- `icon_cloud_3d.svg` icon asset + `.icon-cloud-3d` mask class — `assets/svg/icons/icon_cloud_3d.svg`, `renderer/css/70-detail-misc.css`
5+
- Storage view: the hover tooltip on a rack slot now shows the spool's **material image** (TigerTag+ `url_img`) as a **full-height left column**, with all the existing tooltip content (puck + brand/material/color/coord + weight bar + locked indicator) flowing in a right column. Falls back to the previous single-column layout when the spool has no image or the URL fails to load — `renderer/inventory.js` (`buildRackTooltipHTML`), `renderer/css/30-racks.css` (`.rht-row`, `.rht-col`, `.rht-mat-img`)
6+
- Bambu Lab LAN discovery in the "Add printer → Scan" flow — SSDP multicast `M-SEARCH` on `239.255.255.250:1900` (`urn:bambulab-com:device:3dprinter:1`, two paced probes + 4 s listen for unsolicited NOTIFYs), parses `DevModel/DevName/DevVersion/USN` headers into a candidate (ip, serial, model, name) for one-click add. Manual "Add by IP" uses a TLS cert sniff on `:8883` (subject/issuer contains `bambu`/`bbl`) to confirm. Maps DevModel codes + serial-prefixes onto the bbl printer catalog. `bambu:ssdp-discover` + `bambu:tls-probe` IPC + `bambulabSsdpDiscover`/`bambulabTlsProbe` preload bridges — `main.js`, `preload.js`, `renderer/printers/bambulab/probe.js`, `renderer/printers/bambulab/add-flow.js`, `renderer/inventory.js`
7+
- Elegoo LAN discovery in the "Add printer → Scan" flow — UDP unicast spray of `{"id":0,"method":7000}` to every host:52700 across the local `/24` prefixes (incl. common Elegoo subnets `192.168.1.x`/`192.168.40.x` + persisted user extras), 2.4 s listen, parses the JSON reply (sn, machine_model, host_name) into a candidate. Manual "Add by IP" sends the same payload twice 60 ms apart. Maps `machine_model` onto the eleg catalog (Centauri Carbon 2). `elegoo:udp-discover` + `elegoo:udp-probe` IPC + `elegooUdpDiscover`/`elegooUdpProbe` preload bridges — `main.js`, `preload.js`, `renderer/printers/elegoo/probe.js`, `renderer/printers/elegoo/add-flow.js`, `renderer/inventory.js`
58

69
## Changed
7-
- Creality printer settings: `Root` account + password are now optional (were required). Most Creality printers — incl. the Ender-3 V4 — expose the WebSocket without auth and the live driver connects fine with empty credentials — `renderer/printers/creality/settings.js`
8-
- Friend (read-only) view now hides the write-action buttons (`+ Scan` and `Add product` / `Add device`) — they can't act on a friend's docs — `renderer/inventory.js` (`renderFriendBanner`)
10+
- Header backend-health indicator now uses the 3D cloud icon (`.icon-cloud-3d`); the other 8 `.icon-cloud` usages (brand "no connection" states, scan extra-subnets) are unchanged — `renderer/inventory.html`
11+
- Printers are reported online only once the connection is **really established** — i.e. after the first real frame/report/heartbeat is received — not the instant the transport socket opens. A connection attempt (`connecting`) now counts as offline everywhere, across all brands. Snapmaker & Creality flip to connected on the first WS frame (was: on WS open); Bambu & Elegoo on the first MQTT report (was: on broker connect); FlashForge already did this (first `/detail` poll). Elegoo `isOnline` also no longer returns "checking" for an in-flight attempt — `renderer/printers/{snapmaker,creality,bambulab,elegoo}/index.js`
12+
- Elegoo printer settings: the MQTT access code field is now **required** (was optional) and renamed from "MQTT password (optional)" to **"Access code"** — matches the label the printer's network-settings screen actually uses. Reuses the shared `printerLblAccessCode` string so the UI is consistent with Bambu. Hint updated to point at the printer's network settings (default still 123456) — `renderer/printers/elegoo/settings.js`, `renderer/locales/*.json` (`printerHintElegooMqtt`)
13+
- Printer Settings form is cleaner: the "Credentials" section header is no longer rendered across all brand forms (Bambu, Creality, Elegoo, FlashForge). The credentials fields still group together visually under the Connection block, but without an extra header label cluttering a short form. `renderSection()` now skips the header when a section has no `titleKey` — `renderer/printers/modal-helpers.js`, `renderer/printers/{bambulab,creality,elegoo,flashforge}/settings.js`
14+
- Removed the horizontal divider line between sections in Printer Settings (`.pba-section + .pba-section` border). Identity, connection, credentials all belong to the same connection setup and should read as one continuous form — the divider made them look like separate cards. Vertical spacing is preserved — `renderer/css/40-printers.css`
915

1016
## Fixed
17+
- Absolute-positioned icon buttons (password-eye on the printer-settings form `.pba-input-eye`, password-eye in the login modal `.lm-eye`, input-clear in the add-printer form `.adp-input-clear`) visibly jumped ~14 px down when clicked. The global `button:active { transform: translateY(1px); }` rule was overwriting each button's centering `transform: translateY(-50%)`. Each now has a dedicated `:active` override that re-applies the centering while keeping a 1 px press feedback — `renderer/css/40-printers.css`, `renderer/css/60-modals.css`
18+
- Printer-settings `.pba-input` (Bambu access code, Creality password, every secret field) silently changed size when the eye toggle flipped `type="password"` → `type="text"`: text grew from 13 → 14 px and the box from 36 → 40 px. A global `input[type="text"]` rule (60-modals.css L1354, specificity 0,1,1) was outranking `.pba-input` (0,1,0), and that global rule doesn't match `input[type="password"]` — so the two modes rendered differently. Doubled-selector overrides (`.pba-input.pba-input`, specificity 0,2,0) re-assert height/padding/font-size; the field now stays exactly the same dimension whether the password is hidden or shown — `renderer/css/40-printers.css`
19+
- **RFID rescan no longer wipes user-edited spool data, and the spool weight now syncs back onto the chip instead of being rolled back to a stale value.** The upsert previously did a full `set()` on the inventory doc on every rescan, erasing every user-edited Firestore field that isn't on the chip (container assignment, custom note, capacity, etc.) AND replacing the current `weight_available` with the chip's `measure_available_gr`. But the slider that updates the weight only writes to the DB — nothing ever writes it back to the chip — so the chip's value is almost always stale. Three-part fix: (1) switched to `set(..., { merge: true })` so user-edits survive; (2) weight is now only seeded from the chip on a **fresh write** (new chip, or after the intentional clean-slate delete on chip rewrite) — on a regular rescan the DB stays authoritative; (3) **auto-sync at scan**: when the DB weight differs from the chip's value, the app fires a surgical RFID write that rebuilds the payload from the Firestore doc and updates only page 0x17 (`Measure Available`, u24 BE) on the tag — fire-and-forget while the chip is still on the reader, so chip and DB converge automatically. New chips and chip-rewrite paths are unchanged — `renderer/inventory.js` (`_writeChipDoc` + RFID upsert loop)
1120

1221
## Removed
1322

1423
## i18n
15-
- Added: `creAddChoiceTitle`, `creScanEmpty` — 9 locales (all other scan UI strings reuse the shared `snap*` keys)
24+
- Added: `bambuAddChoiceTitle`, `elegooAddChoiceTitle`, `bambuScanEmpty`, `elegooScanEmpty` — 9 locales (all other scan UI strings reuse the shared `snap*` keys)

0 commit comments

Comments
 (0)