Releases: mosandlt/Bosch-Smart-Home-Camera-Tool-NodeRED
Release list
0.4.3-alpha
Family-parity batch: ports 3 HA-integration capabilities that fit this
repo's stateless request/response node model (per a ground-truth gap audit
against HA v16.1.12 — everything requiring persistent state/sessions was
correctly excluded by that audit and is not part of this batch).
- New node
bosch-camera-ai-analysis: fetches one or more live
snapshots for a camera and emits them with a ready-to-use suspicion-scoring
prompt + structured-output schema, mirroring HA'sanalyze_camera_ai
service. Deliberately does not call any AI/LLM provider itself — HA's
own service doesn't embed one either (it delegates to HA's separately
configuredai_taskintegration); this node stops at fetching the
snapshots and hands them to the flow for wiring into whichever AI/vision
node the user has installed (msg.attachments, plusmsg.payload.images/
.instructions/.structure), matching Node-RED's own composability
philosophy over embedding a bespoke HTTP client + API-key config. - New node
bosch-camera-postroll-capture: bounded, one-shot "record N
seconds starting now" local capture viaffmpeg -t <seconds> -c copy,
triggered by an incoming message (e.g. wired tobosch-camera-event).
Not HA'snvr_postroll_secondsring-buffer design (that derives its tail
from an already-running stateful pre-roll recorder) — a simpler
event-triggered analogue, with the same ffmpeg codec/argv choices as HA's
Mini-NVR pre-roll ring so output files are consistent. - Fix: stream quality selection.
bosch-api.js'sgetStreamUrlsent
onlyhighQualityVideo: trueunconditionally and never theinst=
parameter Bosch's API also uses for quality tiering — the sibling HA
integration's v16.1.2 fix confirmedhighQualityVideoalone is not
sufficient to actually change the stream tier. Newqualityoption
(auto/high/low, defaultauto) onbosch-camera-stream-urland
bosch-camera-nvr-record, mapped exactly like HA's
quality_prefs.get_quality_params:high→highQualityVideo=true, inst=1;low→highQualityVideo=false, inst=4(LOCAL only);auto→
highQualityVideo=false, inst=2. Behaviour change: the previous
hardcodedhighQualityVideo: true(noinst) is replaced by theauto
default — setquality: highto keep the old always-high-quality
behaviour.
0.4.2-alpha
Docs-only release: fixed the MCP row in the shared Integration Comparison
table (shares the Python CLI's bosch_config.json rather than its own
OAuth2 PKCE flow) and a broader README refresh (stale sibling versions,
changelog excerpt, dev/example-flow detail). No functional changes.
0.4.1-alpha
Docs-only release: refreshed the sibling-repo version table in README's
Integration Comparison section. No functional changes.
0.4.0-alpha
Feature-parity batch 2: local NVR recording plus firmware status/install —
closing more of the gap against the family's Feature Parity Matrix
(docs/family-parity-plan.md §2b).
- New node
bosch-camera-nvr-record: spawns/manages anffmpeg
subprocess that pulls a camera's local RTSP/RTSPS stream (via the existing
cloud connection API) and writes it to disk as fixed-length segments
(-f segment -c copy). Continuous mode only — a ring-buffer/pre-roll
"event buffered" mode was scoped out as it doesn't fit this repo's
stateless flow-node paradigm. Start/stop viamsg.payload/msg.topic
(start/stop/on/off/1/0, case-insensitive) or autostart-on-deploy. A small
state machine (idle → starting → recording → stopping) plus a
cancelRequestedflag guards every transition so overlapping start/stop
messages, and node close (undeploy/redeploy) firing mid-flight, can never
leak an untracked ffmpeg process or double-spawn one. SIGTERM → SIGKILL
escalation on stop/close, with a hard safety-net timer so undeploy never
blocks indefinitely on an unkillable process. - New node
bosch-camera-firmware-status(query, read-only):GET /v11/video_inputs/{id}/firmware, normalises the wire response
(current/upToDate/update/updating/status) into
installedVersion/latestVersion/upToDate/updating/status. - New node
bosch-camera-firmware-install(action):PUT /v11/video_inputs/{id}/firmware {"id": <latestVersion>}, ported
byte-accurate against the sibling HA integration's endpoint/field contract.
Triggers a real camera reboot (~3-7 min), so it only proceeds when
msg.payloadis strictly{confirm: true}— any other input is rejected
before any network call. Always re-reads firmware status fresh before
installing and refuses to PUT when the camera already reportsupdating
or is already up to date (reported as a non-errortriggered: false
output, not a flow error). A local busy-guard blocks a second install for
the same node instance while one is still in flight. bosch-api: addedgetFirmware()/installFirmware()wrappers, same
TLS-pinned/timeout-guarded pattern as every existing function.- 46 new tests (nvr-record: 28, firmware-status/install: 18), 100% line
coverage on all three new nodes. Every change hardened via
THREE_PER_ISSUE_PER_CHANGE adversarial sub-agent bug-hunts before release
(nvr-record: 3 rounds, fixed a concurrent-start double-spawn race, a stop
escalation-timer reset bug, a false "already recording" report during an
in-flight stop, close-during-transition handling, and a test-infra flake;
firmware nodes: node logic/editor-help/API-contract review, no bugs found).
0.3.0-alpha
Feature-parity batch 1: 3 new nodes covering camera light control, motion
detection, and glass-break/fire-alarm sound detection — closing part of the
gap against the family's Feature Parity Matrix (docs/family-parity-plan.md §2b).
- New node
bosch-camera-light: reads or sets the front-illuminator /
wallwasher light state (GET/PUT /v11/video_inputs/{id}/lighting_override,
read-modify-write). Fixed on/off presets plus amsg.payloadpatch mode
(frontLightOn/wallwasherOn/frontLightIntensity, a 0.0-1.0 fraction).
Wallwasher is cloud-write-only — no LAN/RCP fallback exists for it. - New node
bosch-camera-motion: reads or sets motion detection
(GET/PUT /v11/video_inputs/{id}/motion) — enable/disable plus sensitivity
(OFF/LOW/MEDIUM_LOW/MEDIUM_HIGH/HIGH/SUPER_HIGH). Setting a
sensitivity implicitly enables motion detection (Bosch-side behaviour). - New node
bosch-camera-audio-detection: reads or sets glass-break /
fire-and-smoke-alarm sound detection (GET/PUT /v11/video_inputs/{id}/audioDetectionConfig,
Gen2 Audio-Plus cameras only). Both fields are always sent together on write
(the node reads current state first and merges, since Bosch resets an
omitted field tofalseserver-side). bosch-api: addedgetLight/setLight,getMotion/setMotion,
getAudioDetection/setAudioDetection— same TLS-pinned, timeout-guarded
pattern as every existing wrapper function.- 21 new tests (happy + error paths per node,
node-red-node-test-helper+nock),
including an explicitfrontLightIntensity: 0regression (minimum brightness
must not be mistaken for "unset").
Deliberately out of scope for this release (documented, not silently
dropped — see the session notes in docs/family-parity-plan.md): lighting
schedule, wifi/network info, diagnostics, unread count, zones/masks, and
rules/friends are planned for a follow-up batch. Two-way intercom, pan/PTZ,
the full alarm suite, and NVR/recording browse are deliberately skipped —
their session/stateful nature doesn't map cleanly onto Node-RED's
fire-and-forget node model; revisit only on a concrete user request.
0.2.8-alpha
CI uplift to match the family's Gold-tier quality bar (HA integration / MCP reference).
- Coverage: added
c8coverage measurement (npm run coverage), wired into thetest
CI job. Gated at 85% lines / 70% functions / 75% branches (set just below the measured
baseline of 92%/77%/83%, not invented). - CI: new
codeql.yml(CodeQLjavascript-typescript,security-extendedqueries,
weekly scheduled scan). - CI: new
secret-scan.yml(gitleaks) +.gitleaks.toml— allowlists this repo's known
intentional non-secrets (the public OSS-app OAuth client_id/secret pair and the pinned
Bosch TLS CA certificate innodes/lib/bosch-api.js, both already documented in-code as
non-sensitive) without blinding the scanner to anything else. - CI: new
dependency-review.yml, gated onpackage.json/package-lock.jsondiffs in
PRs, fails on high-severity advisories. - No functional/runtime changes.
npm audit --omit=dev: 0 vulnerabilities.
0.2.7-alpha
CI-only fix: the release-workflow job could crash on gh release edit, which does not support --generate-notes (create-only), and had two smaller hardening gaps.
- CI:
gh release edit/gh release createnow always pass--notes-file, never--generate-notes— the same bug that actually crashed the HA repo's Publish-release job on a tag-edit path. - CI security: the release version is now passed to
awkvia-vinstead of being interpolated into the program text, closing an awk/command-injection vector reachable through the pushed tag name. - CI: a missing
## [VERSION]CHANGELOG.md section for the tagged release now hard-fails the workflow instead of silently falling back to auto-generated notes.
0.2.6-alpha
Docs-only patch: the "Related Projects" table listed sibling-repo versions several releases behind (Home Assistant, Python CLI, ioBroker, MCP Server, and this repo's own self-reference).
- Docs: refreshed sibling-repo version references in README.md to current released versions.
v0.2.5-alpha — form-data security fix + CI release job
Maintenance release: a security fix for a transitive dependency plus CI hardening.
- Security —
form-databumped to 4.0.6 (GHSA-hmw2-7cc7-3qxx): versions 4.0.0–4.0.5 (pulled in transitively viaaxios) allowed CRLF injection through unescaped multipart field names/filenames. Resolved vianpm audit fix. No runtime CVEs (npm audit --omit=dev: 0 vulnerabilities). - CI: added a GitHub Release job to the pipeline.
v0.2.2-alpha — bosch-camera-stream-url node
v0.2.2-alpha — bosch-camera-stream-url node
New node bosch-camera-stream-url — opens a live stream connection via the Bosch cloud proxy and returns the RTSP, RTSPS and HLS stream URL(s) in msg.payload. Camera id and connection type are overridable at runtime; embedded Digest credentials are redacted in node logs.