Files
bambuddy/backend
maziggy 190d4f2ce8 Add temperatures to the streaming overlay and a URL builder (#1422)
The overlay at /overlay/{printer} draws live print data over a
    full-screen camera view for OBS, a wall display or any browser source.
    It has been tunable since it shipped -- which fields, what size, what
    frame rate -- but only through query parameters documented in the wiki,
    and temperatures were not among the fields on offer. The request asked
    for temperatures first and for the field set to be selectable in the web
    UI; this addresses both.

    Nozzle, bed and chamber readings join the list. The target is drawn only
    while the heater is still climbing, so a settled hotend reads "220°C"
    for the rest of the print instead of the noisier "220 / 220°C" -- 219.6
    against a target of 220 rounds to the same number, and repeating it says
    nothing. Both nozzles appear on a dual-nozzle machine. They are drawn
    whether or not a print is running, because a preheating printer is
    exactly when they are worth watching, and each reading appears only when
    the printer genuinely reports one: chamber temperature stays absent on
    P1 and A1 models, which publish a chamber_temper with no sensor behind
    it, so the overlay never puts a measurement on screen that does not
    exist. Labels reuse the heater chart's strings rather than inventing a
    second vocabulary for the same three things.

    The feed sends an allow-list rather than the temperatures dict. That
    dict doubles as the MQTT client's working memory -- derived heater flags
    and private target-set timestamps live alongside the readings -- and an
    overlay token is a narrower grant than a login, so it gets exactly what
    the overlay draws and does not pick up fields as the dict grows. The
    same chamber-sensor gate the full status payload already applies is
    applied here. The integration test that asserts the payload's exact key
    set, which exists to catch that surface widening silently, is updated
    deliberately.

    Temperatures are not in the default field set, so an overlay URL already
    pasted into a scene renders identically after upgrading.

    Settings -> API Keys -> Streaming Overlay now builds the URL: printer,
    field checkboxes, size, frame rate, camera toggle, an optional token,
    and a copy button. It persists nothing and calls nothing new -- the URL
    is the configuration, which keeps a scene reproducible by copy-paste and
    lets two displays show different fields off one token. Fields are
    emitted in the overlay's own top-to-bottom order rather than click
    order, and parameters left at their default are omitted, so the same
    selection always produces the same URL. The preview alongside it stays
    off until asked for: an always-live iframe would hold a subscriber on
    the printer's single camera connection for as long as the settings tab
    stayed open.

    The preview needed one narrow security-header change. Every SPA route
    sent frame-ancestors 'none', which is stricter than the SAMEORIGIN in
    X-Frame-Options beside it and refuses even a same-origin frame, so the
    preview showed Firefox's "another site has embedded it" page instead of
    the overlay. The overlay path now sends 'self', mirroring /gcode-viewer,
    which admits a framer only on this origin -- Bambuddy's own UI. Every
    other path keeps 'none', and embedding the overlay from another host
    still requires TRUSTED_FRAME_ORIGINS.
2026-08-15 14:07:27 +02:00
..