Commit Graph
2290 Commits
Author SHA1 Message Date
maziggy 9c66743055 Show the job the scheduler starts next on the printer card (#3200) 2026-10-01 13:06:01 +02:00
maziggy 91a04ae121 Count progress milestones from the first layer (#3211) 2026-10-01 13:05:46 +02:00
maziggy 9a5ab06ed7 Keep queued jobs when a printer refuses the upload (#3210) 2026-10-01 13:05:32 +02:00
maziggy 20df83589c Announcements: history, collapsed list, instant refresh, footer icon
- Expired messages stay readable under a collapsed "Earlier" section, as
      long as the feed keeps them (12 months, at most 50). They never count as
      unread or raise a banner; withdrawn ones are gone everywhere.
    - Each message is one row (level, date, title) that opens in place.
      Unread ones carry a dot and a New chip, and opening one is what marks
      it read; the banner's Read more opens the panel on its message.
    - A fetch that brings a newer feed broadcasts an empty
      announcements_changed event, so open pages show the new dot and banner
      without a reload.
    - The sidebar entry is a megaphone icon with an unread badge, in the
      footer row left of System. Footer icons are 32px with no gap so seven
      fit an expanded sidebar; with authentication on, logout used to wrap
      onto a line of its own.
2026-10-01 13:05:15 +02:00
maziggy 42d1083607 Show announcements from the Bambuddy maintainers
Fetch a signed feed.json from the public bambuddy-notifications repo on
    GitHub at startup and every 6 hours. Nothing about the install is sent;
    targeting (version, beta channel, install type) is decided locally.

    - Ed25519 against a key built into the app; an older serial is refused so a
      withdrawn message can't come back. The feed replaces the stored list, and
      a failed or rejected fetch keeps the last good one.
    - Sidebar entry above System with an unread count, a slide-over list, and a
      banner for unread important/critical messages. Read state per user.
    - Admins by default; Settings > General > Updates can show them to all
      users or switch them off, which also stops the fetch.
    - Plain text only; links to github.com and bambuddy.cool only.
2026-10-01 13:04:34 +02:00
maziggy 117fe5d764 Report a refused RFID refresh, and fall back to M620 R (#3206)
ams_get_rfid was published and reported as success without reading the
    printer's answer. X1Plus on base 01.08.02.00 answers FAIL / ERROR STATE,
    so the user saw "Refreshing" and the K profile was re-applied to a slot
    that was never read.

    - Wait for the ams_get_rfid answer (matched by sequence_id).
    - On a refusal from an idle X1/P1/A1, send the legacy M620 R<ams*4+slot>
      gcode Bambu Studio uses for those models, AMS units 0-3 only. Never
      during a job, never on newer-protocol models; printers that accept
      ams_get_rfid never see it.
    - Refused: the route returns 400 with the printer's reason and no PA
      re-apply is scheduled. No answer still counts as accepted.
    - Log the answers at INFO so refusals reach support bundles.
2026-10-01 13:04:12 +02:00
maziggy 888f6c4325 Make the {finish_photo_url} link open with authentication on
With authentication on, {finish_photo_url} pointed at the archive photo
    route, which needs a media token. A link tapped in Telegram, CallMeBot
    or a Home Assistant notification has none, so it only ever answered 401.

    _finish_photo_for_notification() now builds the link and the attachment
    bytes. With authentication off the link is the archive URL, unchanged.
    With it on, the photo is also saved through the notification photo
    store from #3199, and the link points there. That is an unguessable
    name that opens this one photo, for 3 days. If the auth check fails,
    it is treated as on. With auth on and the photo missing, no link is
    set rather than one that 401s. Photos over 2.5 MB are still linked but
    not attached, as before.
2026-10-01 13:03:46 +02:00
maziggy 73d10ad65a Add feature: Attach camera snapshots to notifications (issue #3089) (#3199) 2026-10-01 13:01:57 +02:00
maziggy 1400e50a0d Give the two stock alerts something that fires them (issue #2955) (#3196) 2026-10-01 13:01:21 +02:00
maziggy e634550de7 Add "Combine to 3MF" for slicing several STLs on one plate (#3162) 2026-10-01 13:00:10 +02:00
maziggy 6968433d70 Show the job the scheduler starts next on the printer card (#3200) 2026-10-01 12:58:13 +02:00
maziggy 995b4ada59 Count progress milestones from the first layer (#3211) 2026-10-01 12:48:02 +02:00
maziggy d4f66d99a4 Keep queued jobs when a printer refuses the upload (#3210) 2026-10-01 12:18:23 +02:00
maziggy 3fae2b402b Announcements: history, collapsed list, instant refresh, footer icon
- Expired messages stay readable under a collapsed "Earlier" section, as
  long as the feed keeps them (12 months, at most 50). They never count as
  unread or raise a banner; withdrawn ones are gone everywhere.
- Each message is one row (level, date, title) that opens in place.
  Unread ones carry a dot and a New chip, and opening one is what marks
  it read; the banner's Read more opens the panel on its message.
- A fetch that brings a newer feed broadcasts an empty
  announcements_changed event, so open pages show the new dot and banner
  without a reload.
- The sidebar entry is a megaphone icon with an unread badge, in the
  footer row left of System. Footer icons are 32px with no gap so seven
  fit an expanded sidebar; with authentication on, logout used to wrap
  onto a line of its own.
2026-10-01 11:37:06 +02:00
maziggy 5eb37cd41c Show announcements from the Bambuddy maintainers
Fetch a signed feed.json from the public bambuddy-notifications repo on
GitHub at startup and every 6 hours. Nothing about the install is sent;
targeting (version, beta channel, install type) is decided locally.

- Ed25519 against a key built into the app; an older serial is refused so a
  withdrawn message can't come back. The feed replaces the stored list, and
  a failed or rejected fetch keeps the last good one.
- Sidebar entry above System with an unread count, a slide-over list, and a
  banner for unread important/critical messages. Read state per user.
- Admins by default; Settings > General > Updates can show them to all
  users or switch them off, which also stops the fetch.
- Plain text only; links to github.com and bambuddy.cool only.
2026-10-01 10:45:06 +02:00
maziggy 1cc4bae5d2 Report a refused RFID refresh, and fall back to M620 R (#3206)
ams_get_rfid was published and reported as success without reading the
printer's answer. X1Plus on base 01.08.02.00 answers FAIL / ERROR STATE,
so the user saw "Refreshing" and the K profile was re-applied to a slot
that was never read.

- Wait for the ams_get_rfid answer (matched by sequence_id).
- On a refusal from an idle X1/P1/A1, send the legacy M620 R<ams*4+slot>
  gcode Bambu Studio uses for those models, AMS units 0-3 only. Never
  during a job, never on newer-protocol models; printers that accept
  ams_get_rfid never see it.
- Refused: the route returns 400 with the printer's reason and no PA
  re-apply is scheduled. No answer still counts as accepted.
- Log the answers at INFO so refusals reach support bundles.
2026-10-01 09:40:00 +02:00
maziggy 919aa69f83 Make the {finish_photo_url} link open with authentication on
With authentication on, {finish_photo_url} pointed at the archive photo
route, which needs a media token. A link tapped in Telegram, CallMeBot
or a Home Assistant notification has none, so it only ever answered 401.

_finish_photo_for_notification() now builds the link and the attachment
bytes. With authentication off the link is the archive URL, unchanged.
With it on, the photo is also saved through the notification photo
store from #3199, and the link points there. That is an unguessable
name that opens this one photo, for 3 days. If the auth check fails,
it is treated as on. With auth on and the photo missing, no link is
set rather than one that 401s. Photos over 2.5 MB are still linked but
not attached, as before.
2026-10-01 09:16:49 +02:00
Benji 7f64e2ba8b Add feature: Attach camera snapshots to notifications (issue #3089) (#3199) 2026-10-01 08:43:44 +02:00
Kouki Ojima 318430f0f4 Give the two stock alerts something that fires them (issue #2955) (#3196) 2026-10-01 08:28:12 +02:00
adman234 b67c9b572c Add "Combine to 3MF" for slicing several STLs on one plate (#3162) 2026-10-01 08:11:19 +02:00
maziggy e7ca347de4 Start queued jobs in list order, whether pinned or "Any <model>" (#3200) 2026-09-30 16:29:07 +02:00
maziggy fdf062a64a Add layers, job id, HMS faults and serial to the API-key printer status (#2919) 2026-09-30 16:27:31 +02:00
maziggy 22436a3416 Choose what a spool label shows, preview it, and save it as PNG (#2981, #2980) 2026-09-30 16:26:58 +02:00
maziggy 3c164afa24 Match a Bambu roll to its own product line, not just its colour (issue #2907) (#2944) 2026-09-30 16:26:40 +02:00
maziggy 177f136ea3 Resolve LDAP groups on lldap and OpenLDAP (#3197)
lldap and OpenLDAP's memberof overlay omit memberOf from "*", so every
    lldap login fell through to the default group. Request memberOf by name
    when the schema defines it, and on non-AD directories also search the
    directory root for groupOfNames/groupOfUniqueNames entries listing the
    user, since groups often sit outside the user search base and the
    overlay tracks only one group class.

    Also: skip ldap3's anonymous schema read after StartTLS, which AD and
    Samba AD reject, so StartTLS works there; reword a server's StartTLS
    refusal with an LDAPS hint; stop the bundle sanitizer masking part of
    an OID as an IP; skip the sync right after auto-provisioning so the
    default-group warning logs once.
2026-09-30 16:26:10 +02:00
maziggy a26dd51e5a Use the Spoolman spool's own initial_weight as its label weight (#3194)
Spoolman keeps a full spool's net weight on the spool (initial_weight)
    and falls back to the filament's weight, but Bambuddy read only the
    filament, so a 250 g spool of a 1000 g filament showed and synced as
    1000 g. The list, weigh, AMS sync, SpoolBuddy scale, remain-% tracking,
    fill bar and cost now share one lookup. Create writes initial_weight,
    and a label-weight edit writes it instead of patching or duplicating the
    filament. The spool form's cost per kg is converted at the spool's size
    to and from Spoolman's per-spool price.
2026-09-30 16:25:56 +02:00
maziggy 5e5fcbba26 Use the vendor's empty spool weight as tare in Spoolman mode (#3195)
Spoolman resolves a spool's tare from the spool, then the filament, then
    the vendor's empty_spool_weight. Bambuddy skipped the vendor and fell
    back to 250 g, so weighing a spool whose tare was set only on its vendor
    gave the wrong remaining weight. The inventory weigh action, the
    SpoolBuddy scale and the displayed core weight now share one lookup, and
    "keep old weight" on a filament change stamps a vendor-inherited tare.
2026-09-30 16:25:40 +02:00
maziggy 835049dd43 Map the P-series model codes to the right printers
C11 is the P1P, C12 the P1S, C13 the X1E and N7 the P2S, as the virtual
    printer and a real P1P 3MF already say. The frontend map had them shifted,
    so discovery pre-filled a P1S as a P1P and an X1E as a P2S. The backend
    map read C11/C12 as X1C/X1 and lacked N7, the firmware check sent C13 to
    the P2S line, and the capability lists never matched BL-P001 because
    their lookup strips the dash.

    -----

    Post work PR #3134
2026-09-30 16:24:42 +02:00
maziggy 0f32b71827 fix: display friendly legacy printer model names in stream overlay (#3134) 2026-09-30 16:24:23 +02:00
maziggy d09f9d8cc1 Sync OIDC provider groups to BamBuddy groups on every login (issue #3107) (#3122) 2026-09-30 16:23:47 +02:00
maziggy a5965cac34 Post work PR #2994 2026-09-30 16:23:33 +02:00
maziggy d30e0e685b Material number as a first-class spool field (#2994) 2026-09-30 16:23:17 +02:00
maziggy 451be985fb Give the Low Filament notification something that fires it (issue #2913) (#2940) 2026-09-30 16:22:49 +02:00
maziggy df9802492c Count camera reconnects in a row, not for the life of the stream 2026-09-30 16:22:34 +02:00
maziggy b5441cd269 Hold an automatic slot unlink until the slot stays empty (issue #3186) 2026-09-30 16:22:22 +02:00
maziggy fbcc0b1e94 Resolve dispatch plate_id from the archive instead of assuming 1 (#2951) 2026-09-30 16:20:21 +02:00
maziggy 80840ad6c5 Suppliers as a managed list with per-spool assignments (#2996) 2026-09-30 16:19:54 +02:00
maziggy 86badf6993 Let a spool keep its own empty weight (issue #2908) (#3011) 2026-09-30 16:19:21 +02:00
maziggy 780d3e9b93 Paint SpoolBuddy spools with their extra colours and effect (issue #3033) 2026-09-30 16:19:09 +02:00
maziggy 0e0fad9568 Show Bambu's own HMS descriptions and the real alert level (issue #2728)
Document HMS levels, Bambu's descriptions and uncounted faults (issue #2728)
2026-09-30 16:18:53 +02:00
maziggy bfde96cce4 Give the AI's own halt a name in the archive (issue #2946) (#2954) 2026-09-30 16:18:22 +02:00
maziggy 3b4b7439c6 (Post work): parked AMS drying timers and translated drying failures (issue #2896) 2026-09-30 16:18:06 +02:00
maziggy dc12cda3b4 fix(ams): show a parked drying command as not started instead of an active cycle (#3096) 2026-09-30 16:17:51 +02:00
maziggy 8c31937a5f Correct the drying settings path and the print-drying comment (issue #2518)
The changelog named Settings -> Print Queue -> Auto-Drying; the toggle
    lives in the Queue Auto-Drying card under Settings -> Workflow. The
    scheduler comment and a test docstring called print_drying a permission
    overlay rather than a trigger, but since #1816 it starts mid-print
    cycles on its own regardless of queue state.
2026-09-30 16:17:31 +02:00
maziggy 9bb2a01f9e Refuse null for number and on/off settings, and read bad rows as the default (issue #2518)
A PUT /settings with null for a number setting stored the literal
    "None". From then on int()/float() raised inside the response builder,
    and every settings read returned 503 until the row was fixed by hand.

    Explicit null for any boolean or numeric setting is now refused with a
    422 that names the keys, and nothing in that request is saved. A numeric
    row that does not parse reads back as its default with a warning, so an
    install that already stored one recovers. The typed-key lists moved to
    module constants so the save check and the read path share them.
2026-09-30 16:17:14 +02:00
maziggy 86a0d0deb7 feat: Wait for sustained AMS humidity before an ambient auto-dry starts (issue #2518) 2026-09-30 16:16:51 +02:00
maziggy 5b59d35141 Post work PR #2956
-----

    Give each test worker its own scratch folder in the #3025 and #3029 tests (issue #3025)

    Both modules wrote into one shared folder under settings.base_dir and deleted
    it after every test. Under xdist, one worker's cleanup removed files another
    worker was still serving, so tests failed at random with a 404. The folder name
    now includes the process ID.
2026-09-30 16:16:32 +02:00
maziggy 534e337c35 Let the two stock alert toggles reach the database (issue #2945) (#2956) 2026-09-30 16:16:19 +02:00
maziggy 6d42632b67 Keep the consumed-counter reset out of Spoolman's own numbers (issue #2906) (#2939) 2026-09-30 16:16:05 +02:00
maziggy bc4084b2a9 Let other applications send messages through the notification channels
POST /notifications/app-message delivers an app's message to every channel
    with the new "Messages from connected apps" switch on (off by default),
    through quiet hours, the digest and the log. API keys need the new "Send
    notifications" permission, and their owner notifications:update; plain text,
    http(s) links, 20 messages a minute per key. The electricity-price door and
    this one now share one scoped-key check. /queue?batch=<id> opens and
    highlights one batch order.
2026-09-30 16:15:43 +02:00