You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
This commit was created on GitHub.com and signed with GitHub’s verified signature.
Changes in this release:
ece1953 fix: imp-control missing API key breaks prudynt color/ISP commands imp-control communicates with prudynt via its HTTP API (/api/v1/config). Prudynt requires an X-API-Key header for /api/v1/config, read from /etc/thingino-api.key. imp-control was not sending this header, causing all ISP commands (ispmode, brightness, contrast, etc.) to fail silently with 401. - imp-control: read /etc/thingino-api.key and include X-API-Key header in all curl requests - S10daynightd: generate the API key file early (before starting daynightd), so it exists when daynightd first calls color on/off. Previously the key was only created at S48 (webui-config), leaving a window where prudynt's API was inaccessible to local tools. - S31prudynt: after prudynt starts and its HTTP API is ready, re-sync the ISP daynight mode from /run/thingino/daynight_mode. This fixes a boot race where daynightd (S10) tried to set the ISP mode before prudynt (S31) was listening. Signed-off-by: Paul paul@earendilworks.com
684c705 webui: gate WireGuard button on feature flag, reorder offcanvas nav - WireGuard VPN button now only appears when thinginoUIConfig.device.wireguard is set (via wireguard.webui.json plugin featureFlags) - toggleWireGuard() bails early if WireGuard feature flag is absent - Offcanvas nav: move Information block to bottom, just before Help Signed-off-by: Paul Philippov paul@themactep.com
9c4f57d webui: use port 8080 config API directly with X-API-Key auth Replace CGI middleware passthrough (/x/json-prudynt.cgi, /x/json-prudynt-save.cgi, /x/json-prudynt-config.cgi, /x/json-config-rtsp.cgi) with direct port 8080 API calls. - All config read/write now hits http://{camera}:8080/api/v1/config - API key loaded from /x/api-key.cgi and sent as X-API-Key header - apiFetch() helper awaits key promise before sending requests - Export config now uses dump_config action + Blob download - OSD save uses POST with action.save_config for persistence - SEI OSD check uses osd.sei.enabled path Signed-off-by: Paul Philippov paul@themactep.com
b04c33f pack: correct where the size report is written It goes to the build root, beside uenv.txt, not into images/ -- which is what the CI glob that collects it already assumes.
d4e7cff package/prudynt-t: update to 4e29b88 Update prudynt-t from 0f3fa5e to 4e29b88 Hash change: 0f3fa5edbcafd1513afce6f34430edea2a9cc18b -> 4e29b8858478e6a229fb75f946b4db5f6d034f0d Changelog: 740ff75: osd: replace burnin background bool with color, nest SEI under osd.sei 713302c: osd: auto-migrate old osd.enabled/elements to osd.sei on config load 62c64af: osd: rename sei.elements -> sei.entries 7e6ce62: osd: fix entries null-wipe on query ac650c5: api: add REST GET endpoints for config domains 80b6947: osd: fix burnin outline, background via alpha blending in putBlock 2a241b8: osd: skip burnin passes when color alpha is zero 4e29b88: api: move config GET endpoints before auth check
8f9d9d3 webui: fix autocomplete warning on HA config page Replace form-level autocomplete=off (ignored by Chrome) with autocomplete=current-password on the password field. Signed-off-by: Paul Philippov paul@themactep.com
bcaba05 webui: drop redundant console.error in timelapse toggle The error is already shown to the user via showAlert; the console.error was just noise that made it look like the error wasn't being handled. Signed-off-by: Paul Philippov paul@themactep.com
1f5537a webui: replace preview.js null-query with parallel REST GETs loadConfig() now fetches image/motion/privacy/rtsp/stream0/stream1 in parallel from :8080/api/v1/config/* instead of sending a monolithic null-filled POST through the CGI. Signed-off-by: Paul Philippov paul@themactep.com
80202be webui: use REST GET for OSD config reads Replace null-filled POST queries with clean GET to :8080/api/v1/config/osd. Signed-off-by: Paul Philippov paul@themactep.com
995f2b7 webui: replace burnin background switch with color picker, nest SEI OSD under osd.sei - Replace burnin background checkbox with full color selector (swatch + picker + hex field + alpha slider), matching fill/outline UX - Change API field from osd.burnin.background (bool) to osd.burnin.background_color (hex string #RRGGBBAA, default #80) - Nest SEI OSD under osd.sei (enabled + elements) for consistency with osd.burnin - Update timps bridge docs: osd.enabled -> osd.sei.enabled Signed-off-by: Paul Philippov paul@themactep.com
1915392 thingino-ha: skip WiFi RSSI on Ethernet-only cameras, rename Live View to Preview - Add ha_has_wifi() helper to detect wireless interfaces - RSSI discovery and state publish now gated on ha_has_wifi - Rename 'Live View' camera entity to 'Preview' to avoid confusion with actual RTSP live streams Signed-off-by: Paul Philippov paul@themactep.com
88189b9 webui: install json-osd-sei.cgi with 0755 permissions Signed-off-by: Paul Philippov paul@themactep.com
6ead84a webui: add json-osd-sei.cgi SSE bridge, convert consumers to SSE - New /x/json-osd-sei.cgi: SSE bridge that polls prudynt :8080 and pushes events as text/event-stream, deduplicated by content - preview.html SEI overlay: single persistent SSE connection - sei-rotate.js: SSE, closes after first rotation received Signed-off-by: Paul Philippov paul@themactep.com
9d081b3 webui: restore :8080/api/v1/osd-sei — CGI endpoint does not exist Signed-off-by: Paul Philippov paul@themactep.com
d45046b webui: revert SSE to fetch polling — /x/json-osd-sei.cgi returns text/html Signed-off-by: Paul Philippov paul@themactep.com
dee5f12 preview: switch SEI overlay from fetch polling to SSE Signed-off-by: Paul Philippov paul@themactep.com
84063a0 sei-rotate: switch from poll to SSE, remove inline polling from streamer pages - sei-rotate.js: use EventSource (SSE) instead of fetch polling, close connection after first rotation event received - streamer-{main,substream,image,sensor}.html: remove redundant inline polling scripts, rely on sei-rotate.js Signed-off-by: Paul Philippov paul@themactep.com
cc62e08 sei-rotate: skip preview.html to avoid double-polling with its own handler Signed-off-by: Paul Philippov paul@themactep.com
66f4a88 thingino-diag: add wireless information thingino-diag: redact raw hex PSK and add overlay tree dump Redact unquoted 64-char hex PSK values in wpa_supplicant.conf that were leaking through the existing quoted-psk-only sed pattern. Also add a tree /overlay/ section so diagnostics include the overlay filesystem contents. Signed-off-by: Paul Philippov paul@themactep.com
c994588 package/prudynt-t: bump to 091e526 (precise burn-in ROI exclusion) Signed-off-by: Paul Philippov paul@themactep.com
cbf88f4 package/prudynt-t: bump to 15ceb11 (motion ROI excludes burn-in area) Signed-off-by: Paul Philippov paul@themactep.com
cf4baf8 package/prudynt-t: bump to 9cd9cbe (OSD font + burn-in colors + docs) Signed-off-by: Paul Philippov paul@themactep.com
c6ad345 webui: add burn-in fill/outline color pickers with alpha sliders - streamer-osd.html: rearranged burn-in form, added fill/outline color fields with swatch + native picker + alpha range slider - preview.html: added same color controls to OSD modal - sei-rotate.js: only poll on /preview.html, use /x/json-osd-sei.cgi - S31prudynt: hardened restart with wait-loop, force-kill fallback, retry up to 3 times Signed-off-by: Paul Philippov paul@themactep.com
6b16089 webui: live SEI OSD visual settings, fix SSE poll overwriting them Visual controls (font, outline, colors) now apply instantly on change without requiring a save. repaint() reads localStorage on every frame so the SSE poll no longer resets user visual settings. Signed-off-by: Paul Philippov paul@themactep.com
d792bd3 webui: redesign OSD modal with burn-in section and compact visual controls Restructure the preview page OSD modal into three sections: - SEI OSD: enabled toggle, elements list, add button - Visual: Font [size|color] Outline [size|color] on one line - Burn-in OSD: enabled, Format input, Scale dropdown, Background toggle Signed-off-by: Paul Philippov paul@themactep.com
64d3675 webui: SEI OSD overlay respects osd.enabled, only on preview page preview.html: overlay poller checks _seiOsdEnabled flag set from config; opening the OSD modal no longer auto-starts the overlay. Modal checkbox and overlay are decoupled — only saving updates both. streamer-osd.html: toggle SEI overlay visibility with osd.enabled checkbox on the OSD config page. sei-osd.js: check config before starting SSE; expose global SeiOSD.start/stop/restart controls. Signed-off-by: Paul Philippov paul@themactep.com
fbe26f1 package: bump prudynt-t for burn-in scale control, add WebUI scale dropdown prudynt-t: bump to d81e6e9 (configurable burn-in timestamp scale with runtime update, 0=auto, 1-10) webui: replace OSD scale slider with dropdown (0-10) Signed-off-by: Paul Philippov paul@themactep.com
55672b3 bump prudynt-t to ce03f64 (fix burnin OSD + format corruption) Signed-off-by: Paul Philippov paul@themactep.com
c5f3e0a fix: poll prudynt API instead of deleted SSE CGI
4d2d760 Restructure OSD page: split burn-in and SEI into separate cards, fix layout
88f575b package/prudynt-t: bump to 232d528 (osd pool size + burnin background) - Fix IPU buffer too small by calling IMP_OSD_SetPoolSize() at init - Make burn-in timestamp background optional - Fix snprintf truncation warning Signed-off-by: Paul Philippov paul@themactep.com
c5f8efc webui: add burn-in overlay background toggle and format to OSD page Wire osd.burnin.background (translucent dark box behind timestamp) and osd.burnin.format (strftime format string) controls to the streamer-osd WebUI page alongside the existing burnin enabled switch. Signed-off-by: Paul Philippov paul@themactep.com
1c57f26 package/prudynt-t: update to fdbb28c Update prudynt-t from 31975f5 to fdbb28c Hash change: 31975f5f79623efab1175132de8caa70762c5be8 -> fdbb28c8dff4c4ed0ace678f587205df7c2b5e0e Changelog: 4160307: osd: move default clock element position to bottom-right (-10,-10) 79d6f32: osd: add runtime toggle for burned-in timestamp overlay a084042: osd: configurable burn-in timestamp format via osd.burnin.format 1ced7f6: fix: move burnin.format to getCharItems, fix add_str typo 1e426b5: rtsp: defer initial RTCP SR until after video anchor is set fdbb28c: osd: cap burn-in scale to 2 to fit IPU OSD buffer limit
802006c webui: rename OSD enabled switch to SEI OSD for clarity Signed-off-by: Paul Philippov paul@themactep.com
0962033 webui: default new timestamp OSD elements to bottom-right Matches the prudynt.json default change (-10,-10) so the SEI overlay doesn't overlap with the burned-in hardware timestamp at top-left. Signed-off-by: Paul Philippov paul@themactep.com
a421003 prudynt-t: add BR2_PACKAGE_PRUDYNT_T_OSD_BURNIN Kconfig option Wires the compile-time OSD_BURN_TIMESTAMP flag behind a Kconfig option (enabled by default). When enabled, prudynt renders a hardware timestamp overlay directly into video frames using the IMP OSD engine. The timestamp format is driven by the 'clock' OSD element in prudynt.json. Signed-off-by: Paul Philippov paul@themactep.com
12fbcf8 webui: fix unclosed IIFE breaking streamer-osd.html Add button The inline <script> block opened (function() { ... } but never closed with })();. This caused a SyntaxError ('Unexpected end of input') that prevented all event listeners from registering, including the 'Add OSD element' button handler. Signed-off-by: Paul Philippov paul@themactep.com
f9069ff prudynt-t: bump to 31975f5 (fix stale RTCP SR state on reconnect) Signed-off-by: Paul Philippov paul@themactep.com
12c187d pack: write a buildscope size report when the tool is available Attributes the rootfs to the packages that installed it and reads real usage out of every image into images/buildscope-report.json, which needs the build tree that pack still has and distclean removes. Prefers the copy BR2_PACKAGE_HOST_BUILDSCOPE installs into HOST_DIR and falls back to PATH, so a report is available without enabling the package. Guarded on the tool being present, and never fails the build.
bca74bd thingino-core: fix camera config merge order Camera thingino.json was staged as 10-camera.json, which sorted before all package defaults (20-, 30-, 40-, 50-). This caused package defaults with empty hardware-specific values (e.g., gpio_pan, gpio_tilt, gpio_switch from motors.json) to overwrite the camera's real GPIO pin configuration. Rename to 90-camera.json so the camera config overrides all package defaults, but still runs before user configs. Signed-off-by: Paul Philippov paul@themactep.com
1619c54 package/thingino-jct: update to v1.1.0 Update thingino-jct from v1.0.0 to v1.1.0 Hash change: v1.0.0 -> v1.1.0 (No changelog available)
0c35ab9 package/ingenic-sdk: update to 5e5d7d2 Update ingenic-sdk from bcd2e09 to 5e5d7d2 Hash change: bcd2e09c024e821fe30f8917da0dcb664a00d8fd -> 5e5d7d2c84c5fd64dc2cd5aa54d9638d960736a4 Changelog: 2d6a93f: Revert "sensor-iq: t23: group 2.10 IQ under 2.10/, drop duplicate os05a10" 8cab32e: restore and add/rename t23 iq files a4e08e5: sinfo: remove duplicates, formatting 5e5d7d2: iq: restore files per sdk, symlink identical files as newer to older
8709e4a package/wifi-atbm6441: update to 5cd383d Update wifi-atbm6441 from 8cf3606 to 5cd383d Hash change: 8cf360686bb4e6e41b5206adaa86c3161d7e1515 -> 5cd383d4dbef9b3fc035e53db5671430faaf5983 Changelog: 5cd383d: Replace vendor SDK dump with trimmed driver source
1926c68 package/timps: update to v1.6.4 Update timps from v1.6.1 to v1.6.4 Hash change: v1.6.1 -> v1.6.4 (No changelog available)
3aef732 package/thingino-dfu: update to v1.5.39 Update thingino-dfu from v1.5.38 to v1.5.39 Hash change: v1.5.38 -> v1.5.39 (No changelog available)
8875b44 package/lightnvr: update to 0.36.5 Update lightnvr from 0.36.4 to 0.36.5 Hash change: 0.36.4 -> 0.36.5 (No changelog available)
eb06736 uboot: add support for EN25QX64A flash chip (ID 1c7117)
0f5d794 build-container.sh: inherit IP-based camera detection from make Support IP= ./build-container.sh to auto-detect the camera profile by SSH-ing into the device and reading IMAGE_ID from /etc/os-release, then offering the detected camera to the user before falling back to interactive selection. Also forward IP through to container-make and container-ota in both the wrapper script and Makefile.container. Signed-off-by: Paul Philippov paul@themactep.com
01167a7 timps: bump to v1.6.1 Bugfix release: the sub-stream (or any small-resolution encoder channel) could permanently stall delivering zero video after a single complex-scene IDR frame exceeded its AU assembly buffer's 128KB floor - the overflow handler's own recovery (force a fresh IDR) made it worse, since the replacement IDR was just as oversized, immediately overflowing again. See https://github.com/Lu-Fi/timps/releases/tag/v1.6.1 Co-Authored-By: Claude Sonnet 5 noreply@anthropic.com
1f08bd2 Collapse preview endpoint list into dropdown below lg breakpoint On screens smaller than lg (< 992px), the inline endpoint list is replaced by a Bootstrap dropdown menu. Both views share the same renderPreviewEndpoints() population and copy-to-clipboard behavior.
780ec0a sysupgrade: fix hook timing - ROOTFS_PRE_CMD_HOOKS, not TARGET_FINALIZE_HOOKS Verified via a real build+unsquashfs inspection: TARGET_FINALIZE_HOOKS runs BEFORE target-finalize's own overlay copy (BR2_ROOTFS_OVERLAY is applied at the end of that same recipe), so the previous hook never actually saw S97sysupgrade - the placeholder shipped unsubstituted. ROOTFS_PRE_CMD_HOOKS runs later, per rootfs-image-format, against a tree rsync'd from the now fully-finalized (overlay included) target directory - confirmed the packed squashfs now has the placeholder correctly resolved. Co-Authored-By: Claude Sonnet 5 noreply@anthropic.com
b87f201 ifplugd: fix permissions on service script
46371d4 package/thingino-onvif: update to 4ca8f06 Update thingino-onvif from 6b10262 to 4ca8f06 Hash change: 6b102622a16838e0d1d947fb4df774cb666fe002 -> 4ca8f063563b96631d04e1ed7ceb2244d413f736 Changelog: 51ed227: onvif: allow PTZ cameras without zoom capability 4ca8f06: reorder config entries alphabetically
d317bf7 sysupgrade: resolve the post-upgrade chime's extension at compile time Per review (same as the wifi captive-portal sounds): no decision- making on the camera side. S97sysupgrade now references a single @SOUND_EXT@ placeholder instead of an opus-then-wav runtime fallback. Substituted by a new thingino-sounds TARGET_FINALIZE_HOOKS entry (thingino-sounds is what decides THINGINO_SOUNDS_FORMAT in the first place) rather than a .in + package-local sed, since S97sysupgrade is a plain overlay file owned by no package - this runs once, after the overlay copy has already placed the file, and rewrites the one placeholder to the format this image actually ships. Co-Authored-By: Claude Sonnet 5 noreply@anthropic.com
52eda02 wifi: resolve the sound file extension at compile time, not runtime Per review: no decision-making on the camera side - if the image is built with one sound format, only that format ships and only that format is ever referenced. The previous runtime opus-then-wav fallback violated that. S38wpa_supplicant.in now references a single @SOUND_EXT@ placeholder, substituted by wifi.mk (mirroring THINGINO_SOUNDS_FORMAT in thingino-sounds.mk) to the one extension this image's thingino-sounds selection actually installs - the same .in-template mechanism already used for @WLAN_STA_NETDEV@ etc. in this file. Co-Authored-By: Claude Sonnet 5 noreply@anthropic.com
ada9645 thingino-sounds: rename G.711 files .wav -> .ulaw Per review: .wav on these files was misleading - they're the project's own G.711 mu-law asset format, not general-purpose WAV files a user might expect to work anywhere. .ulaw makes that unambiguous. The files' actual bytes are unchanged (still a RIFF/WAVE container with the mu-law format tag - timps' decoder sniffs the RIFF header regardless of extension), only the on-disk filename/extension changed.
d944a11 make: add -f to make ota to enforce flashing
752793c thingino-onvif: add PTZ no-zoom templates from upstream PR #62 Backport from roleoroleo/onvif_simple_server PR #62. Adds zoom capability detection: pan/tilt-only cameras now advertise PTZ without zoom spaces, so ONVIF clients (Frigate, etc.) don't show non-functional zoom controls. Auto-detects zoom from existing zoom commands or Z-axis ranges when the zoom flag is omitted from config. Signed-off-by: Paul Philippov paul@themactep.com
21db76f thingino-onvif: bump to 6b10262, drop redundant patch Includes per-profile FrameRateLimit/BitrateLimit from upstream PR #5. The local 0001 patch is no longer needed. Signed-off-by: Paul Philippov paul@themactep.com
0256ea2 cameras-exp: okam_qc2: add sensor reset and ISP params from PR #1079 Add ISP clock, ISP params, and sensor reset GPIO from @petermartis's tested configuration. Sensor needs reset_gpio=52 and shvflip=1. Signed-off-by: Paul Philippov paul@themactep.com
89ce539 cameras: add TP-Link Tapo C210 (T23N, SC3336, RTL8188FTV) Picked from PR #1129 by @pastudan. Tested working on hardware: sensor, WiFi, SPI TMI8152 IR-cut, portal mode, SSH. Modernized from the PR: trimmed verbose FRAG to core ssl, removed toolchain settings (in fragments), fixed SENSOR_PARAMS to SENSOR_1_PARAMS. GPIOs extracted from stock firmware via binwalk — identical to Tapo C200 PCB layout. Signed-off-by: Paul Philippov paul@themactep.com
e4ccc43 cameras-exp: add TP-Link Tapo C210 v3 (T23N, SC3336, RTL8188FTV) Picked from PR #1183 by @chaserhkj. Features SPI TMI8152 PTZ motors. The spi-tmi8152 motor module changes were distilled into a patch file in the camera directory (0001-spi-tmi8152-motor-module.patch) so they do not affect other cameras — apply manually if needed. Signed-off-by: Paul Philippov paul@themactep.com
e147b93 cameras: add TP-Link Tapo C100 WQ9001 variant (T31L, SC2336, WQ9001) Picked from PR #1326 by @eikaf. Based on the existing tplink_tapo_c100_t31l_sc2336_rtl8188ftv profile with WiFi changed to WQ9001. Trimmed from 83-line full defconfig down to camera- specific settings only. Signed-off-by: Paul Philippov paul@themactep.com
c1281fe cameras: add Vanhua DJZ with GC4653 sensor (T31N, GC4653, ETH) Picked from PR #1188 by @AKoo7. GC4653 variant of the existing vanhua_djz_t31n_gc2083_eth — same GPIOs, different sensor with 64MB ISP memory split and 16MB flash. Note: dropped the core.fragment console changes — those are global and unrelated to this camera profile. Signed-off-by: Paul Philippov paul@themactep.com
1ccd63c cameras-exp: add Sannce I21AG (T10L, JXH62, MT7601U) Picked from PR #216 by @diadatp. Placed in cameras-exp/. Includes PTZ motor configuration, dual-pin I2C, IRCUT, and IR850. Signed-off-by: Paul Philippov paul@themactep.com
3123bb4 cameras-exp: add Laxihub 14T (T31L, SC2336, ATBM6032) Picked from PR #403 by @crossan007. Placed in cameras-exp/ as an incomplete profile — SD card, speaker, microphone, IR LEDs, and IR filter were listed as TODO by the original author. Signed-off-by: Paul Philippov paul@themactep.com
987083a cameras-exp: add JAVISCAM A3 (T23N, OS02N10, AIC8800DC) Picked from PR #1038 by @Carl1509. Placed in cameras-exp/ pending OS02N10 sensor support confirmation in ingenic-sdk. Signed-off-by: Paul Philippov paul@themactep.com
7328974 sysupgrade: fall back to .wav for the post-upgrade chime when .opus is missing Same issue as the wifi captive-portal sounds: play /usr/share/sounds/ thingino.opus fails outright on a board built with the G.711-only thingino-sounds format (companion PR) - no .opus files ship at all in that configuration. Co-Authored-By: Claude Sonnet 5 noreply@anthropic.com
1268c81 ingenic-audiodaemon: uClibc build - inline glibc-compat stubs instead of libuclibcshim Replace the -luclibcshim link dependency with two tiny inline stub functions (__ctype_b_loc/__ctype_tolower_loc) compiled directly into the build, dropping the ingenic-uclibc dependency this package doesn't otherwise need. Self-contained instead of relying on another package's shim library being present/linked correctly. Co-Authored-By: Claude Sonnet 5 noreply@anthropic.com
a9ee18f wifi: fall back to .wav for portal sounds when .opus is missing play /usr/share/sounds/*.opus fails outright on a board built with the G.711-only thingino-sounds format (companion PR) - no .opus files ship at all in that configuration. Fall back to the matching .wav so the captive-portal start/timeout chimes still play instead of silently failing. Co-Authored-By: Claude Sonnet 5 noreply@anthropic.com
240af93 thingino-sounds: add G.711 mu-law format option New BR2_PACKAGE_THINGINO_SOUNDS_FORMAT_{OPUS,G711} choice. Opus stays the default (smaller on-disk, higher quality) but needs opusfile/opus/ libogg linked into the consumer (~200KB flash); G.711 needs zero extra library since a plain mu-law decoder is trivial to build in, at the cost of larger sound files - the better tradeoff on boards too flash-constrained for the Opus decode path. The 21 files here are the same voice lines/chimes already shipped as *.opus, re-encoded to 8kHz mono mu-law WAV (ffmpeg -acodec pcm_mulaw) so both format choices ship byte-identical content. The choice auto-defaults to G.711 whenever the consuming package can play sounds but has no Opus decoder built in (see the companion timps PR's BR2_PACKAGE_TIMPS_AUDIO_PRESET_MINIMAL), so the two packages' choices stay consistent without the user needing to coordinate them manually. thingino-sounds.mk purges both formats' files before installing the selected one, so switching formats on an existing board doesn't leave stale files from the previous choice behind. Co-Authored-By: Claude Sonnet 5 noreply@anthropic.com
e82bd98 timps: native speaker (backchannel + play queue), v1.6.0, WebUI updates Native IMP_AO speaker output - timps now owns the camera speaker directly instead of piping decoded audio to /bin/iac (ingenic-audiodaemon). One arbiter (src/rtsp/speaker.c in timps) handles two producers: - ONVIF audio backchannel (BR2_PACKAGE_TIMPS_BACKCHANNEL, optional AAC via BR2_PACKAGE_TIMPS_BC_AAC) - unchanged from the caller's perspective, just native now instead of shelling out. - System-sound play queue (BR2_PACKAGE_TIMPS_PLAY, optional Opus via BR2_PACKAGE_TIMPS_PLAY_OPUS) - a FIFO speaking the same "PLAY url=... / STOP" protocol /usr/sbin/play already uses, so the WiFi captive-portal chime, the post-upgrade sound, and the ESPHome media_player/TTS integration all get a working speaker on a timps image with no extra glue. New BR2_PACKAGE_TIMPS_AUDIO_PRESET_{FULL,MINIMAL} Kconfig presets bundle the backchannel+play+sounds-format combinations that are known to work, since getting the related knobs right one at a time is easy to get wrong. MINIMAL fits flash-constrained boards (~5MB rootfs) with G.711-only (pairs with the thingino-sounds G.711 format option in a companion PR); FULL is Opus quality on boards with headroom. Also: - Live speaker volume/gain slider + system-sound test-play control on the Audio Settings page (audio.spk_volume/spk_gain live keys, speaker.play/stop actions). - Day/night: time-window and sunrise/sunset override modes (daynight.mode = sensor/time/sun) - a fixed local-clock window, or real sunrise/sunset for a configured lat/long. The Photosensing page gained an "Override Mode" section for this, replacing a "Time Schedule" UI block that never actually did anything (POSTed to a legacy CGI endpoint nothing ever read). - OSD page Phase 1 redesign: the backend supports up to 8 independent overlay items per stream, but the WebUI only ever exposed 4 in fixed, hardcoded roles. streamer-osd.js now renders items as a dynamic card list (add/remove, any of the 8 slots, per-card live-vs-restart-required status), adds a transparency control that existed on the backend but was never exposed, and an "apply to both streams" convenience per card. Also fixes a pre-existing bug where the enable checkbox was gated on a caps.osd capability key the backend never actually advertises. - S48webui-config: fixes a false-positive PTZ-capability check that showed the pan/tilt overlay on boards without motors. - TIMPS_VERSION bumped to v1.6.0. Test plan: built and flashed to real hardware across the T20/T23/T31/ T31L family (Wyze Cam v2, a Cinnado T23 and T31L, a Galayou Y4 T23, a Wuuk T31), verified via timps-qa.sh (RTSP/ONVIF/motion/OSD/recording integrity) plus real acoustic verification of the speaker path (RTSP-mic self-loopback, comparing played-clip audible span against source content). Day/night modes verified forcing real switches against a live sensor reading in both directions, manual-mode suppression, garbage-input rejection. OSD redesign verified via /control round-trips (transparency, both-streams scope, backward- compat load of the classic 4-item layout) and rendered-frame snapshots showing a live transparency change. See https://github.com/Lu-Fi/timps/blob/main/CHANGELOG.md for full technical detail on the daemon-side changes. Co-Authored-By: Claude Sonnet 5 noreply@anthropic.com
3332370 Merge branch 'feat/mqtt-tls-skip-verify' into ciao
99b2b4a package/prudynt-t: update to 76c8071 Update prudynt-t from edf9d2b to 76c8071 Hash change: edf9d2b427a50d9b1566991da1bfe7e58d7554e0 -> 76c80712f2de8b218d91f12611fce1f46f41a6e2 Changelog: 76c8071: rtsp: seed subtitle RTP timestamp at 90000 to prevent t=0 duplicate
1788b48 mqtt-sub: add TLS skip verify control Add optional tls_skip_verify setting for MQTT subscriptions when using TLS with self-signed or untrusted broker certificates. - WebUI toggle (hidden until SSL is enabled) with warning text - CGI handler properly normalizes and persists the boolean - Documentation for both MQTT subscriptions and Home Assistant
c3b35c3 ingenic-sdk: T31 audio codec - mute speaker amp at probe gpio_request() alone leaves the speaker-amp enable pin floating until codec_set_speaker()/codec_turn_off() (replay open/close) first drives it. A capture-only session (mic-only, no two-way audio - the common case) never opens replay, so the floating pin lets clock/analog activity from mic capture leak through to the amp as a persistent high-pitched whine. Confirmed live on a Cinnado D1 T31L/SC2336: whine present exactly while the mic-capture daemon runs, silent when stopped, /proc/jz/audio/audio_info reporting replay as "closed" throughout - the amp was simply never told to mute. Driving the pin to its inactive level once at probe fixes it without any periodic toggling.
cee55fc docs: suggested docs changes for container SELinux volume labels Suggested documentation for the Makefile.container SELinux mount-label behavior. Reviewers may drop this commit if docs are unwanted. Signed-off-by: halcycon adam@thecuckoocamp.co.uk Co-authored-by: Cursor cursoragent@cursor.com
d52786d Makefile.container: auto-label bind mounts on SELinux Enforcing hosts Unlabeled workspace mounts fail with Permission denied on Fedora/Bazzite and similar Enforcing hosts. Detect getenforce and append shared :z by default; allow CONTAINER_VOLUME_LABEL override. Signed-off-by: halcycon adam@thecuckoocamp.co.uk Co-authored-by: Cursor cursoragent@cursor.com
facd724 package/prudynt-t: update to edf9d2b Update prudynt-t from bf446f5 to edf9d2b Hash change: bf446f5e41fd8008f144aee926b8d6b7f26d0ed2 -> edf9d2b427a50d9b1566991da1bfe7e58d7554e0 Changelog: edf9d2b: rtsp: fix video RTCP SR NTP using drifted imp_ts instead of CLOCK_MONOTONIC
8ce51fb package/prudynt-t: update to edf9d2b Update prudynt-t from bf446f5 to edf9d2b Hash change: bf446f5e41fd8008f144aee926b8d6b7f26d0ed2 -> edf9d2b427a50d9b1566991da1bfe7e58d7554e0 Changelog: edf9d2b: rtsp: fix video RTCP SR NTP using drifted imp_ts instead of CLOCK_MONOTONIC
5a07cc4 Remove name/target directives from mdnsd service files mdnsd v0.12 ignores the target directive and uses the name field (which contains spaces/parentheses) as the SRV target hostname. Avahi cannot resolve those malformed hostnames, so _http._tcp, _https._tcp, and _rtsp._tcp services never appear in avahi-browse. Fix by dropping name and target entirely, keeping only type and port -- the same pattern the working SSH service already uses. mdnsd then uses the system hostname as the service instance name.
5d87da5 Remove name/target directives from mdnsd service files mdnsd v0.12 ignores the target directive and uses the name field (which contains spaces/parentheses) as the SRV target hostname. Avahi cannot resolve those malformed hostnames, so _http._tcp, _https._tcp, and _rtsp._tcp services never appear in avahi-browse. Fix by dropping name and target entirely, keeping only type and port -- the same pattern the working SSH service already uses. mdnsd then uses the system hostname as the service instance name.
096e732 package/thingino-dfu: update to v1.5.38 Update thingino-dfu from v1.5.37 to v1.5.38 Hash change: v1.5.37 -> v1.5.38 (No changelog available)
fd94a72 package/thingino-dfu: update to v1.5.38 Update thingino-dfu from v1.5.37 to v1.5.38 Hash change: v1.5.37 -> v1.5.38 (No changelog available)
7175cfc package/prudynt-t: update to bf446f5 Update prudynt-t from a03923a to bf446f5 Hash change: a03923a4bc1c916d8faf536c207fdfb2c7a39a3c -> bf446f5e41fd8008f144aee926b8d6b7f26d0ed2 Changelog: 69e461e: rtsp: rework subtitle track to plain text with correct PTS timing 9db39cf: rtp: fix UDP send failure cascading into bitstream desync e605e25: rtsp: fix RTCP SR NTP timestamp using wrong clock domain 783a69f: rtsp: use CLOCK_MONOTONIC for video RTP timestamps 175775a: rtsp: clear video tap buffer on PLAY to prevent startup burst d1e91f6: rtsp: use imp_ts for RTP pacing, CLOCK_MONOTONIC only for RTCP SR d6793a6: Revert "rtsp: use imp_ts for RTP pacing, CLOCK_MONOTONIC only for RTCP SR" bf446f5: rtsp: use imp_ts for RTP pacing with mono-offset for SR NTP
4547430 package/prudynt-t: update to bf446f5 Update prudynt-t from a03923a to bf446f5 Hash change: a03923a4bc1c916d8faf536c207fdfb2c7a39a3c -> bf446f5e41fd8008f144aee926b8d6b7f26d0ed2 Changelog: 69e461e: rtsp: rework subtitle track to plain text with correct PTS timing 9db39cf: rtp: fix UDP send failure cascading into bitstream desync e605e25: rtsp: fix RTCP SR NTP timestamp using wrong clock domain 783a69f: rtsp: use CLOCK_MONOTONIC for video RTP timestamps 175775a: rtsp: clear video tap buffer on PLAY to prevent startup burst d1e91f6: rtsp: use imp_ts for RTP pacing, CLOCK_MONOTONIC only for RTCP SR d6793a6: Revert "rtsp: use imp_ts for RTP pacing, CLOCK_MONOTONIC only for RTCP SR" bf446f5: rtsp: use imp_ts for RTP pacing with mono-offset for SR NTP
514e76e docs: update thingino.json assembly order for staging directory Document the new merge pipeline: base config, per-camera overrides, per-package staging fragments (in priority order), and user configs (applied last). Replaces the old three-step description that predated the /usr/share/thingino-defaults/ staging directory.
099a857 docs: update thingino.json assembly order for staging directory Document the new merge pipeline: base config, per-camera overrides, per-package staging fragments (in priority order), and user configs (applied last). Replaces the old three-step description that predated the /usr/share/thingino-defaults/ staging directory.
ef59846 fix: serialize thingino.json assembly via staging directory Replace per-package jct import on /etc/thingino.json with a staging directory (/usr/share/thingino-defaults/) where each package drops its JSON fragment during install. A single TARGET_FINALIZE_HOOK in thingino-core merges all fragments in sorted priority order after all packages are installed, then applies user overrides last. This eliminates the read-modify-write race condition that occurred when multiple packages (agent, daynightd, ha, motors) ran jct import concurrently on the same thingino.json inode under BR2_PER_PACKAGE_DIRECTORIES=y, causing keys like 'daynight' to be silently lost. Staging priority order: 10-camera.json (per-camera overrides) 20-agent.json (thingino-agent) 30-motors.json (thingino-motors) 40-daynightd.json (thingino-daynightd) 50-ha.json (thingino-ha) 55-ha-doorbell.json (conditional, HA doorbell) ... user configs ... (common > camera > device, applied last) Packages no longer need host-thingino-jct as a dependency; only thingino-core retains it for the final merge step.
d462059 fix: serialize thingino.json assembly via staging directory Replace per-package jct import on /etc/thingino.json with a staging directory (/usr/share/thingino-defaults/) where each package drops its JSON fragment during install. A single TARGET_FINALIZE_HOOK in thingino-core merges all fragments in sorted priority order after all packages are installed, then applies user overrides last. This eliminates the read-modify-write race condition that occurred when multiple packages (agent, daynightd, ha, motors) ran jct import concurrently on the same thingino.json inode under BR2_PER_PACKAGE_DIRECTORIES=y, causing keys like 'daynight' to be silently lost. Staging priority order: 10-camera.json (per-camera overrides) 20-agent.json (thingino-agent) 30-motors.json (thingino-motors) 40-daynightd.json (thingino-daynightd) 50-ha.json (thingino-ha) 55-ha-doorbell.json (conditional, HA doorbell) ... user configs ... (common > camera > device, applied last) Packages no longer need host-thingino-jct as a dependency; only thingino-core retains it for the final merge step.
04cc83e package/scriba: update to 17ee5a9 Update scriba from c590b6a to 17ee5a9 Hash change: c590b6a7c55043218c28d7f34d6c213d950d8b71 -> 17ee5a9a6a02a62d05e0ab5497c95cb348bc24a6 Changelog: 636262d: wasm: minimal WebUSB/CH341A flash programmer support 3f63e6b: docs: add Web/WASM build and deploy instructions to README 18fa7e6: fix: address code review feedback 6ac95f7: fix: detect and warn on fast-erase failure d125c21: ch341a: split oversized SPI streams to stay inside the USB timeout (#2) d6e65b1: Merge PR #1: WASM/WebUSB CH341A flash programmer support 17ee5a9: web: bump vite ^6.4.3, fix Dependabot alerts
0589dcd package/scriba: update to 17ee5a9 Update scriba from c590b6a to 17ee5a9 Hash change: c590b6a7c55043218c28d7f34d6c213d950d8b71 -> 17ee5a9a6a02a62d05e0ab5497c95cb348bc24a6 Changelog: 636262d: wasm: minimal WebUSB/CH341A flash programmer support 3f63e6b: docs: add Web/WASM build and deploy instructions to README 18fa7e6: fix: address code review feedback 6ac95f7: fix: detect and warn on fast-erase failure d125c21: ch341a: split oversized SPI streams to stay inside the USB timeout (#2) d6e65b1: Merge PR #1: WASM/WebUSB CH341A flash programmer support 17ee5a9: web: bump vite ^6.4.3, fix Dependabot alerts
cddad45 package/prudynt-t: update to a03923a Update prudynt-t from 4518d5f to a03923a Hash change: 4518d5f543f445949de2aa99e9fe1f2488b96690 -> a03923a4bc1c916d8faf536c207fdfb2c7a39a3c Changelog: 5eb35fd: cleanup: remove dead/misleading config and scripts a03923a: fix: resolve compiler warnings
f12228b package/prudynt-t: update to a03923a Update prudynt-t from 4518d5f to a03923a Hash change: 4518d5f543f445949de2aa99e9fe1f2488b96690 -> a03923a4bc1c916d8faf536c207fdfb2c7a39a3c Changelog: 5eb35fd: cleanup: remove dead/misleading config and scripts a03923a: fix: resolve compiler warnings
69b3b8a sysupgrade: fall back to flash_eraseall when flashcp lacks -A support On older firmware, busybox flashcp doesn't have the -A flag (Thingino patch that skips already-erased blocks). Detect -A via --help and fall back to flash_eraseall + flashcp -v so upgrades from older releases work. Add flash_eraseall to the bbapplets list so the applet is available in the stage2 workdir. Signed-off-by: Paul Philippov paul@themactep.com
65aec08 sysupgrade: fall back to flash_eraseall when flashcp lacks -A support On older firmware, busybox flashcp doesn't have the -A flag (Thingino patch that skips already-erased blocks). Detect -A via --help and fall back to flash_eraseall + flashcp -v so upgrades from older releases work. Add flash_eraseall to the bbapplets list so the applet is available in the stage2 workdir. Signed-off-by: Paul Philippov paul@themactep.com
5ae4cc3 package/prudynt-t: update to 4518d5f Update prudynt-t from dd3c3a6 to 4518d5f Hash change: dd3c3a6d92f53f788c03bd7ab09e9068819f6cea -> 4518d5f543f445949de2aa99e9fe1f2488b96690 Changelog: e2f29b8: sdp: add b=AS bandwidth attribute with configured video bitrate 531d42c: debug: trace bitrate through SDP generation 811889e: sdp: move b=AS before a=control:* per RFC 4566 ordering 4518d5f: rtsp: guard against zero and jumping IMP driver timestamps
620db27 package/prudynt-t: update to 4518d5f Update prudynt-t from dd3c3a6 to 4518d5f Hash change: dd3c3a6d92f53f788c03bd7ab09e9068819f6cea -> 4518d5f543f445949de2aa99e9fe1f2488b96690 Changelog: e2f29b8: sdp: add b=AS bandwidth attribute with configured video bitrate 531d42c: debug: trace bitrate through SDP generation 811889e: sdp: move b=AS before a=control:* per RFC 4566 ordering 4518d5f: rtsp: guard against zero and jumping IMP driver timestamps
c76a2ff ingenic-audiodaemon: guard two IMP calls unsupported by T20's libimp IMP_AI_SetAgcMode and IMP_AO_SetHpfCoFrequency are link-time undefined on T20 - its libimp predates these APIs, unlike the T23/T31/etc SDK this audio-processing code was written against. Guard both under #ifndef CONFIG_T20, matching the existing CONFIG_T20 guard already a few lines above IMP_AI_SetAgcMode in input.c for IMP_AI_SetAlcGain. IMP_AI_EnableAgc/IMP_AO_EnableHpf are left unguarded - they do link on T20 - so AGC/HPF still enable there, just without this one non-essential mode/frequency tuning call.
0df4d17 ingenic-audiodaemon: link against libuclibcshim instead of hand-rolled stub The uClibc build was hand-generating a uclibc_compat.c stub at build time to provide __ctype_b_loc/__ctype_tolower_loc (glibc-specific ctype accessors the vendor audiodaemon blob was linked against). This project already ships ingenic-uclibc's libuclibcshim for exactly this class of legacy-symbol shim, used by the vendor IMP/isp libraries on T10/T20/T21/T30 - link against that instead of maintaining a parallel one-off stub, and add the ingenic-uclibc build dependency so it's guaranteed to exist first.
b49c451 package/prudynt-t: update to dd3c3a6 Update prudynt-t from c21c7c2 to dd3c3a6 Hash change: c21c7c2bab9fb4c1b85d5bf8402fab73ab5ce707 -> dd3c3a6d92f53f788c03bd7ab09e9068819f6cea Changelog: ec1618a: fix: resolve compiler warnings in RtspServer.cpp dd3c3a6: update default config
4af9fae package/prudynt-t: update to dd3c3a6 Update prudynt-t from c21c7c2 to dd3c3a6 Hash change: c21c7c2bab9fb4c1b85d5bf8402fab73ab5ce707 -> dd3c3a6d92f53f788c03bd7ab09e9068819f6cea Changelog: ec1618a: fix: resolve compiler warnings in RtspServer.cpp dd3c3a6: update default config
ed5d96c init: stop exporting TZ from rcS so daemons see live timezone changes rcS exported TZ before starting every init script, so every long-running daemon (timps/raptor/prudynt-t alike) inherited a TZ value frozen at boot. uClibc-ng's localtime_r() only re-reads /etc/TZ on every call when TZ is UNSET in the environment - with it set, a daemon started at boot never notices a later timezone change (e.g. via the WebUI's date/time settings) without being restarted, even though /etc/TZ and /etc/localtime on disk are already correct. Confirmed on a wyze_cam2 (T20) camera running timps: after changing the timezone live, the OSD timestamp stayed 2h off (stale UTC) until timpsd was manually restarted; the WebUI itself showed correct time throughout since its CGI scripts are fresh per-request processes. No code changes needed in timps/raptor/prudynt-t - interactive shells still get TZ exported fresh per-login via /etc/profile, this only affects the daemons started by rcS.
bc8def1 agents: do not allow agent to write to the camera, use a network share
2c276ff agents: do not allow agent to write to the camera, use a network share
4e8a812 scripts: add update-packages.py for automated package version + hash bumps Supports --check (audit all github-tarball packages for hash mismatches) and direct updates that download the tarball, compute sha256, and update both the .mk and .hash files in one step. Signed-off-by: Paul Philippov paul@themactep.com
7883d1b scripts: add update-packages.py for automated package version + hash bumps Supports --check (audit all github-tarball packages for hash mismatches) and direct updates that download the tarball, compute sha256, and update both the .mk and .hash files in one step. Signed-off-by: Paul Philippov paul@themactep.com
6c0a984 package: fix hashes for thingino-dfu v1.5.37 and lightnvr 0.36.4 Signed-off-by: Paul Philippov paul@themactep.com
060f7d5 package: fix hashes for thingino-dfu v1.5.37 and lightnvr 0.36.4 Signed-off-by: Paul Philippov paul@themactep.com
024ddd0 package/prudynt-t: update to c21c7c2 Update prudynt-t from 8a473c0 to c21c7c2 Hash change: 8a473c034bb9c55eec1ca5e3127d50810f12673e -> c21c7c2bab9fb4c1b85d5bf8402fab73ab5ce707 Changelog: c21c7c2: audio: hardcode speaker sample rate to 48kHz, add kSpkBitrateKbps constant
123bd93 package/prudynt-t: update to c21c7c2 Update prudynt-t from 8a473c0 to c21c7c2 Hash change: 8a473c034bb9c55eec1ca5e3127d50810f12673e -> c21c7c2bab9fb4c1b85d5bf8402fab73ab5ce707 Changelog: c21c7c2: audio: hardcode speaker sample rate to 48kHz, add kSpkBitrateKbps constant
924fbdc package/prudynt-t: update to 8a473c0 Update prudynt-t from 26d47e9 to 8a473c0 Hash change: 26d47e962d79f7383949fd31186fa61684e01156 -> 8a473c034bb9c55eec1ca5e3127d50810f12673e Changelog: 8a473c0: audio: capture natively at 48kHz, remove resampling & config knobs
cad4718 package/prudynt-t: update to 8a473c0 Update prudynt-t from 26d47e9 to 8a473c0 Hash change: 26d47e962d79f7383949fd31186fa61684e01156 -> 8a473c034bb9c55eec1ca5e3127d50810f12673e Changelog: 8a473c0: audio: capture natively at 48kHz, remove resampling & config knobs
3ecf0bf package/timps: update to v1.5.0 Update timps from v1.4.6 to v1.5.0 Hash change: v1.4.6 -> v1.5.0 (No changelog available)
64f2c78 package/timps: update to v1.5.0 Update timps from v1.4.6 to v1.5.0 Hash change: v1.4.6 -> v1.5.0 (No changelog available)
62569c8 package/thingino-dfu: update to v1.5.37 Update thingino-dfu from v1.5.33 to v1.5.37 Hash change: v1.5.33 -> v1.5.37 (No changelog available)
55d1f57 package/thingino-dfu: update to v1.5.37 Update thingino-dfu from v1.5.33 to v1.5.37 Hash change: v1.5.33 -> v1.5.37 (No changelog available)
ec5f201 package/lightnvr: update to 0.36.4 Update lightnvr from 0.36.3 to 0.36.4 Hash change: 0.36.3 -> 0.36.4 (No changelog available)
cee1226 package/lightnvr: update to 0.36.4 Update lightnvr from 0.36.3 to 0.36.4 Hash change: 0.36.3 -> 0.36.4 (No changelog available)
f3b74ef webui: remove mic_bitrate and mic_sample_rate config knobs These are now compile-time constants in prudynt (48kHz/128kbps). Signed-off-by: Paul Philippov paul@themactep.com
40d56dd webui: remove mic_bitrate and mic_sample_rate config knobs These are now compile-time constants in prudynt (48kHz/128kbps). Signed-off-by: Paul Philippov paul@themactep.com
ecab834 fw_ota: verify camera reboot before erasing flash after memory remap If the camera stalls during shutdown (e.g. on a stuck init script), the memory-remap reboot path would reconnect to the old SSH session, assume the reboot happened, and start erasing flash. When the camera finally completed shutdown mid-erase, it bricked. Three changes to prevent this: 1. Plant a /tmp/needs_reboot tmpfs marker before issuing reboot. After reconnecting, verify it's gone -- tmpfs is wiped on every genuine reboot. If the marker still exists, abort immediately. 2. Use 'reboot -f' to bypass init scripts entirely, so a stalled init script cannot block the reboot in the first place. 3. After reconnecting, verify the new osmem value persisted across the reboot with fw_printenv. Also fixes wait_for_reboot_after_detach to use the same marker-file approach instead of the saw_disconnect heuristic (which could mistake a transient network blip for a reboot). The function no longer takes an uptime argument; it relies solely on /tmp/needs_reboot. Signed-off-by: Paul Philippov paul@themactep.com
88c2d86 fw_ota: verify camera reboot before erasing flash after memory remap If the camera stalls during shutdown (e.g. on a stuck init script), the memory-remap reboot path would reconnect to the old SSH session, assume the reboot happened, and start erasing flash. When the camera finally completed shutdown mid-erase, it bricked. Three changes to prevent this: 1. Plant a /tmp/needs_reboot tmpfs marker before issuing reboot. After reconnecting, verify it's gone -- tmpfs is wiped on every genuine reboot. If the marker still exists, abort immediately. 2. Use 'reboot -f' to bypass init scripts entirely, so a stalled init script cannot block the reboot in the first place. 3. After reconnecting, verify the new osmem value persisted across the reboot with fw_printenv. Also fixes wait_for_reboot_after_detach to use the same marker-file approach instead of the saw_disconnect heuristic (which could mistake a transient network blip for a reboot). The function no longer takes an uptime argument; it relies solely on /tmp/needs_reboot. Signed-off-by: Paul Philippov paul@themactep.com
7df5600 portal: serve HTTPS alongside HTTP when a certificate exists The portal access point is open, so everything posted to the setup page crosses in the clear. uhttpd already links mbedTLS and already serves 443 in client mode; the portal branch just passed an empty HTTPS listen. Port 80 stays, unconditionally. Captive-portal detection is plain HTTP by definition, so the OS probes (/generate_204, /hotspot-detect.html, /ncsi.txt) and the -E error handler all depend on it. 443 is purely additive, for clients that address the portal directly and can demand TLS. Falls back to HTTP only when no usable certificate exists. Portal mode is the only way to configure a fresh camera, so a missing or zero-length cert must not make one unprovisionable. cert_path/key_path move above the portal branch, which returns early and so could never have reached the client-mode definitions; have_certs factors out the check both branches now share. Verified the three cert states produce the right arguments, and that -p 172.16.0.1:80 with -E /x/portal.cgi survives all of them.
6be4e80 portal: accept a pre-derived PSK and root password hash The portal access point is open, so everything posted to api.cgi is readable by anyone in range with a monitor-mode radio. A client that can hash locally can now send wlan_psk and rootpass_hash instead, and neither secret crosses in the clear. wlan configure already took a 64-hex PSK in place of a passphrase, so that side only needed validation. chpasswd -e takes an already-encrypted field for the root password. Both are optional and the plaintext fields still work, so the web portal is unaffected. rootpass_hash is restricted to $6$ so a caller cannot quietly downgrade root to a weaker scheme such as $1$ MD5. Note this is a partial mitigation, not a fix: a WPA PSK is password-equivalent for joining the network, so an eavesdropper who captures it still gets on the Wi-Fi. It protects the passphrase string itself, which users reuse, and it genuinely protects the root password since the hash is not usable to log in. Confidentiality for the PSK still needs an encrypted transport. Verified against the values a client would compute: PBKDF2-HMAC-SHA1 (passphrase, ssid, 4096, 32) matches wpa_passphrase byte for byte, and busybox mkpasswd -m sha512 matches openssl passwd -6.
b8d483a sysupgrade: fix watchdog reset during flash erase Replace the hand-rolled echo+sleep watchdog feeder with the real busybox watchdog applet. The old feeder opened the device without setting an explicit timeout, relying on whatever driver default the Ingenic JZ_WDT assigned after the magic-close reopen -- which was apparently too short for the 2-second feed interval, causing the hardware watchdog to fire mid-erase. The real watchdog applet sets a 10-second timeout via ioctl(WDIOC_SETTIMEOUT) and feeds reliably at half that interval. It is the same well-tested code that feeds the hardware before the takeover, now running from tmpfs so erasing rootfs cannot kill it. Also replaced the separate flash_eraseall + flashcp dance with a single flashcp -v -A, using Thingino's existing erase-all flag. Signed-off-by: Paul Philippov paul@themactep.com
86c9d02 sysupgrade: fix watchdog reset during flash erase Replace the hand-rolled echo+sleep watchdog feeder with the real busybox watchdog applet. The old feeder opened the device without setting an explicit timeout, relying on whatever driver default the Ingenic JZ_WDT assigned after the magic-close reopen -- which was apparently too short for the 2-second feed interval, causing the hardware watchdog to fire mid-erase. The real watchdog applet sets a 10-second timeout via ioctl(WDIOC_SETTIMEOUT) and feeds reliably at half that interval. It is the same well-tested code that feeds the hardware before the takeover, now running from tmpfs so erasing rootfs cannot kill it. Also replaced the separate flash_eraseall + flashcp dance with a single flashcp -v -A, using Thingino's existing erase-all flag. Signed-off-by: Paul Philippov paul@themactep.com
1f970cc ha-watchdog: re-publish discovery 30s after crash restart After a crash recovery, HA may miss the retained discovery messages if its MQTT integration reconnected during the restart gap. A delayed re-publish ensures the camera reappears in HA. Signed-off-by: Paul Philippov paul@themactep.com
1b89fa6 ha-watchdog: re-publish discovery 30s after crash restart After a crash recovery, HA may miss the retained discovery messages if its MQTT integration reconnected during the restart gap. A delayed re-publish ensures the camera reappears in HA. Signed-off-by: Paul Philippov paul@themactep.com
1e94568 ha-daemon: re-publish discovery 30s after boot HA's MQTT integration may miss retained discovery messages if it connects after the initial publish. A delayed re-publish ensures HA picks up the camera even after late broker connections. Signed-off-by: Paul Philippov paul@themactep.com
d95bf8d ha-daemon: re-publish discovery 30s after boot HA's MQTT integration may miss retained discovery messages if it connects after the initial publish. A delayed re-publish ensures HA picks up the camera even after late broker connections. Signed-off-by: Paul Philippov paul@themactep.com
8a2ba27 thingino-ha: fix auto-enable doorbell build error Use $(if ...) inside the define block instead of += append, which doesn't work correctly with conditional defines in Buildroot. Signed-off-by: Paul Philippov paul@themactep.com
bf5f839 thingino-ha: fix auto-enable doorbell build error Use $(if ...) inside the define block instead of += append, which doesn't work correctly with conditional defines in Buildroot. Signed-off-by: Paul Philippov paul@themactep.com
52c54e5 doorbell: add chime bypass mode, HA watchdog, and related fixes - Add chime.bypass config toggle (Web UI + CLI) to suppress no-chime alarm and skip chime playback while still firing HA button events - Add ha-watchdog to respawn ha-daemon if it crashes, preventing HA from staying offline after transient MQTT disconnects - Auto-enable ha.enable_doorbell at build time for doorbell cameras - Change HA firmware entity from update (with install) to read-only sensor - updates must be done via SSH - Reduce doorbell_alarm bypass log spam to single message - Add VDB2 substream resolution 640x480 via prudynt.json Signed-off-by: Paul Philippov paul@themactep.com
1f5f0e5 doorbell: add chime bypass mode, HA watchdog, and related fixes - Add chime.bypass config toggle (Web UI + CLI) to suppress no-chime alarm and skip chime playback while still firing HA button events - Add ha-watchdog to respawn ha-daemon if it crashes, preventing HA from staying offline after transient MQTT disconnects - Auto-enable ha.enable_doorbell at build time for doorbell cameras - Change HA firmware entity from update (with install) to read-only sensor - updates must be done via SSH - Reduce doorbell_alarm bypass log spam to single message - Add VDB2 substream resolution 640x480 via prudynt.json Signed-off-by: Paul Philippov paul@themactep.com
b9fc642 doorbell: publish ON instantly via MQTT, not just poll cycle doorbell_event now publishes ON directly to MQTT when the button is pressed, so Home Assistant automations fire immediately instead of waiting up to state_interval (15s) for the next ha-state poll. - doorbell_event: sources ha-common (if available), publishes ON with force+retain, then touches /tmp/doorbell_pressed as before - ha-state: when flag file is present, force-publishes ON then OFF to overwrite the retained ON — guarantees a clean pulse - Gracefully degrades: if ha-common is absent, falls back to flag-file- only behavior (no MQTT, poll-based) Signed-off-by: Paul paul@themactep.com
2a809b3 doorbell: publish ON instantly via MQTT, not just poll cycle doorbell_event now publishes ON directly to MQTT when the button is pressed, so Home Assistant automations fire immediately instead of waiting up to state_interval (15s) for the next ha-state poll. - doorbell_event: sources ha-common (if available), publishes ON with force+retain, then touches /tmp/doorbell_pressed as before - ha-state: when flag file is present, force-publishes ON then OFF to overwrite the retained ON — guarantees a clean pulse - Gracefully degrades: if ha-common is absent, falls back to flag-file- only behavior (no MQTT, poll-based) Signed-off-by: Paul paul@themactep.com
ba6b1f5 thingino-ha: add doorbell binary sensor for button press triggers Doorbell button presses (doorbell_event) now expose a momentary binary sensor in Home Assistant, enabling automations on ring events. - binary_sensor.thingino__doorbell: ON when button pressed, clears to OFF on next ha-state poll (max 15s delay) - doorbell_event touches /tmp/doorbell_pressed; ha-state consumes it - device_class: sound, icon: mdi:doorbell - Disabled by default (enable_doorbell: false) — only cameras with doorbell hardware should enable it Signed-off-by: Paul paul@themactep.com
73d8c40 thingino-ha: add doorbell binary sensor for button press triggers Doorbell button presses (doorbell_event) now expose a momentary binary sensor in Home Assistant, enabling automations on ring events. - binary_sensor.thingino__doorbell: ON when button pressed, clears to OFF on next ha-state poll (max 15s delay) - doorbell_event touches /tmp/doorbell_pressed; ha-state consumes it - device_class: sound, icon: mdi:doorbell - Disabled by default (enable_doorbell: false) — only cameras with doorbell hardware should enable it Signed-off-by: Paul paul@themactep.com
338b76c thingino-ha: add firmware version/timestamp sensors, optimize poll path Firmware sensors: - firmware_version: release+short-commit (e.g. ciao+9a88c72) - firmware_timestamp: build date in UTC (e.g. 2026-07-24 03:04:32 UTC) - Both parsed from COMMIT_ID in /etc/os-release, one file read - Configurable via thingino.json and Web UI checkboxes - MQTT discovery publishes as retained sensor entities Performance (pre-existing refactoring): - ha_entity_enabled() memoizes enable flags: zero jct forks after startup - HA_MQTT_BASE_ARGS pre-built once; ha_mpub_cmd reconstructs only client ID - _sq() fast path: no sed fork for strings without single quotes - ha_pub_begin() defers mktemp until first queued publish (idle cycles free) - _ha_state_changed(): read builtin instead of cat fork - eval instead of sh -c for mosquitto_pub/sub invocations - mpub hoisted out of camera snapshot loop in ha-daemon - ha_pub_disc/ha_clear_disc use cached HA_DISC_PREFIX Bug fixes: - S93ha stop_daemon: match by -n (name) not -x (exe) — shell scripts resolve to /bin/sh via /proc/PID/exe, so -x never matched - S93ha stop(): source ha-common so HA_CAMERA_ID is set before cleaning up mosquitto clients by MAC - S93ha start(): quote read_config output to avoid syntax error on empty - ha-common: restore HA_MQTT_TLS_SKIP_VERIFY + --insecure (lost in refactor) Behavior changes: - ha-state: publish availability only on startup sync (FORCE=1), not every poll cycle — ha-commands re-asserts online on MQTT reconnect - OTA firmware state/latest now published with -r (retained) so HA recovers after restart without waiting for next check cycle - S93ha: graceful shutdown with 20s wait_for_ha_shutdown before SIGKILL Signed-off-by: Paul paul@themactep.com
b40225e thingino-ha: add firmware version/timestamp sensors, optimize poll path Firmware sensors: - firmware_version: release+short-commit (e.g. ciao+9a88c72) - firmware_timestamp: build date in UTC (e.g. 2026-07-24 03:04:32 UTC) - Both parsed from COMMIT_ID in /etc/os-release, one file read - Configurable via thingino.json and Web UI checkboxes - MQTT discovery publishes as retained sensor entities Performance (pre-existing refactoring): - ha_entity_enabled() memoizes enable flags: zero jct forks after startup - HA_MQTT_BASE_ARGS pre-built once; ha_mpub_cmd reconstructs only client ID - _sq() fast path: no sed fork for strings without single quotes - ha_pub_begin() defers mktemp until first queued publish (idle cycles free) - _ha_state_changed(): read builtin instead of cat fork - eval instead of sh -c for mosquitto_pub/sub invocations - mpub hoisted out of camera snapshot loop in ha-daemon - ha_pub_disc/ha_clear_disc use cached HA_DISC_PREFIX Bug fixes: - S93ha stop_daemon: match by -n (name) not -x (exe) — shell scripts resolve to /bin/sh via /proc/PID/exe, so -x never matched - S93ha stop(): source ha-common so HA_CAMERA_ID is set before cleaning up mosquitto clients by MAC - S93ha start(): quote read_config output to avoid syntax error on empty - ha-common: restore HA_MQTT_TLS_SKIP_VERIFY + --insecure (lost in refactor) Behavior changes: - ha-state: publish availability only on startup sync (FORCE=1), not every poll cycle — ha-commands re-asserts online on MQTT reconnect - OTA firmware state/latest now published with -r (retained) so HA recovers after restart without waiting for next check cycle - S93ha: graceful shutdown with 20s wait_for_ha_shutdown before SIGKILL Signed-off-by: Paul paul@themactep.com
02f2adb wyze vbd2: do not force image rotation, vbd2 has sensor in correct position
63c389e wyze vbd2: do not force image rotation, vbd2 has sensor in correct position
7ce35a4 build: add post-build check for busybox long-option usage Thingino disables CONFIG_LONG_OPTS globally, but buildroot packages can silently install init scripts that use --long-option syntax (e.g. S41ifplugd with --start, --background, --exec, etc.). These scripts fail at runtime with a cryptic 'invalid option -- -' because getopt() cannot parse --long-option without FEATURE_*_LONG_OPTIONS. Add a post-build check (scripts/check-busybox-lopts.sh) that scans /etc/init.d/ for start-stop-daemon invocations using long options. The check runs as the final step of rootfs_script.sh and aborts the build on violations, so the problem is caught before flashing. Signed-off-by: Paul Philippov paul@themactep.com
9a88c72 build: add post-build check for busybox long-option usage Thingino disables CONFIG_LONG_OPTS globally, but buildroot packages can silently install init scripts that use --long-option syntax (e.g. S41ifplugd with --start, --background, --exec, etc.). These scripts fail at runtime with a cryptic 'invalid option -- -' because getopt() cannot parse --long-option without FEATURE_*_LONG_OPTIONS. Add a post-build check (scripts/check-busybox-lopts.sh) that scans /etc/init.d/ for start-stop-daemon invocations using long options. The check runs as the final step of rootfs_script.sh and aborts the build on violations, so the problem is caught before flashing. Signed-off-by: Paul Philippov paul@themactep.com
4e11284 overlay: fix S41ifplugd for busybox without long options Thingino disables CONFIG_FEATURE_START_STOP_DAEMON_LONG_OPTIONS (and CONFIG_LONG_OPTS globally), but the upstream buildroot init script uses long options exclusively (--start, --background, --make-pidfile, etc.). Without long option support, getopt() chokes on '--start', prints 'start-stop-daemon: invalid option -- -', and the ifplugd daemon fails to start. Convert all start-stop-daemon invocations to short options: --start -> -S --stop -> -K --background -> -b --make-pidfile -> -m --pidfile -> -p --exec -> -x --test -> -t --quiet -> -q The -- separator between daemon options and the command is standard getopt behavior and works fine with short options. Signed-off-by: Paul Philippov paul@themactep.com
524287f overlay: fix S41ifplugd for busybox without long options Thingino disables CONFIG_FEATURE_START_STOP_DAEMON_LONG_OPTIONS (and CONFIG_LONG_OPTS globally), but the upstream buildroot init script uses long options exclusively (--start, --background, --make-pidfile, etc.). Without long option support, getopt() chokes on '--start', prints 'start-stop-daemon: invalid option -- -', and the ifplugd daemon fails to start. Convert all start-stop-daemon invocations to short options: --start -> -S --stop -> -K --background -> -b --make-pidfile -> -m --pidfile -> -p --exec -> -x --test -> -t --quiet -> -q The -- separator between daemon options and the command is standard getopt behavior and works fine with short options. Signed-off-by: Paul Philippov paul@themactep.com
cd64bae make backchannel test script to use shorter lower tone sound
2954380 make backchannel test script to use shorter lower tone sound
d43ca57 scripts: add go2rtc SEI OSD overlay solution Add a go2rtc-based alternative to sei-rtsp.py that restores OSD from SEI metadata into RTSP video streams. Uses a Go NAL parser (sei-extract) to extract Thingino SEI user-data payloads and writes per-element text files for ffmpeg's drawtext filter with reload=1. Key features: - Per-element positioning from SEI metadata (auto mode) plus preset modes - Wall-clock timestamp interpolation between SEI frames - Auto-rotate from SEI metadata - Runs go2rtc via podman/docker container (alexxit/go2rtc) or native binary - Multi-protocol output: RTSP, WebRTC, MSE - Passthrough audio (-c:a copy) Includes documentation in docs/go2rtc-sei-osd.md Signed-off-by: Paul Philippov paul@themactep.com
343d100 package/prudynt-t: update to 7a768e0 Update prudynt-t from 8b02ea8 to 7a768e0 Hash change: 8b02ea882ab8f57cd46523d70f21ef1d664d3b3e -> 7a768e067b7a8633471474e1669ce3d38b75631a Changelog: 7a768e0: Fix audio/video PTS divergence in RTCP Sender Report when NTP is unsynced
95f4e6e package/open-tx-isp: update to f5224df Update open-tx-isp from 7601012 to f5224df Hash change: 76010124b480e0e2611dd06cbb198df6b4facb96 -> f5224df98e1326d9c443fa344e645211805cd1d5 Changelog: f5224df: Check pt work on t41.
ef99ecf package/prudynt-t: update to 8b02ea8 Update prudynt-t from 743ff11 to 8b02ea8 Hash change: 743ff1165d04b25fb3ca74fe0789a65d4b2601c8 -> 8b02ea882ab8f57cd46523d70f21ef1d664d3b3e Changelog: 8b02ea8: experimental subtitle stream (wip)
9bcb608 package/open-tx-isp: update to 7601012 Update open-tx-isp from d783ec7 to 7601012 Hash change: d783ec7ee553c821999acf49f4ca7b1e9a187ab4 -> 76010124b480e0e2611dd06cbb198df6b4facb96 Changelog: 7601012: Check pt work on t41
6517104 linux-kopt: run LED hooks post-patch to survive cumulative patch The Thingino cumulative kernel patch ships its own board_base.c which overwrites the LED platform device registration injected by the PRE_PATCH hook. Add a POST_PATCH hook to re-apply after patches land. Signed-off-by: Paul Philippov paul@themactep.com
558898d overlay: remove vestigial F00ledd init script No longer needed — the kernel leds-gpio pipeline handles LEDs directly, and S99led already resets triggers on startup. Signed-off-by: Paul Philippov paul@themactep.com
25d7541 thingino-kopt: enable GPIO LED kernel support by default Set BR2_PACKAGE_THINGINO_KOPT_LEDS default y so that cameras with BR2_THINGINO_LED_*_GPIO pins defined get /sys/class/leds entries and the startup indicator LED dropdown works out of the box. Signed-off-by: Paul Philippov paul@themactep.com
7454456 telegrambot: remove from default packages, can be installed as a bundle
508f169 mqtt: add tls_skip_verify option for self-signed brokers Add an optional tls_skip_verify setting across all MQTT clients. When enabled together with use_ssl, the --insecure flag is passed to mosquitto_pub/mosquitto_sub alongside --capath /etc/ssl/certs. The connection remains encrypted but broker certificate verification is skipped — useful for self-signed or private-CA brokers. Config defaults (tls_skip_verify: false): - send2.json (mqtt section) - thingino-ha.json (ha.mqtt section) - thingino-agent.json (mqtt_sub section) Shell scripts (reads key, passes --insecure when use_ssl && skip_verify): - send2mqtt (also adds missing use_ssl/--capath TLS support) - mqtt-sub-dispatcher - ha-common (independent HA setting, no fallback to mqtt_sub) - telegram-cam-agent - telegram-cam-register (both copies) WebUI (toggle shown only when SSL enabled): - HA config page (config-ha.html/js, json-config-ha.cgi) - Send-to-MQTT config page (tool-send2-mqtt.html/js) Signed-off-by: Paul Philippov paul@themactep.com
b0fc0fd kernel: update cross compiler prefix for t32
48901af bundle: rebuild plugins.js from all installed manifests Remove plugins.js from bundles — instead, thingino-pkg rebuilds it from all /var/www/a/plugins/*.webui.json manifests on every install and remove. This supports multiple webui plugin bundles without overwriting each other's nav items. Signed-off-by: Paul Philippov paul@themactep.com
6dbf91c bundle: rsync webui files then assemble directly Instead of thingino-webui-rebuild + target-finalize (which doesn't reliably merge per-package files into the global target), rsync the plugin's web files into target/ and run assemble_plugins.py directly. This correctly produces an updated plugins.js with the plugin's nav items. Update docs to reflect the new approach. Signed-off-by: Paul Philippov paul@themactep.com
fee07fd bundle: fix busybox tar incompatibilities in thingino-pkg Busybox tar on the camera lacks gzip support (-z flag) and --exclude. - Pipe through zcat instead of using tar -z - Remove manifest after extraction instead of using --exclude - Add || true guards on optional json_get calls (jct exits non-zero when key not found, which kills script with set -e) Signed-off-by: Paul Philippov paul@themactep.com
2b15f61 bundle: rename manifest to thingino-pkg.json (no leading dot) Avoids ./ prefix issues when tarring from '.' directory. Device script handles both paths for backward compatibility. Signed-off-by: Paul Philippov paul@themactep.com
767eaae docs: update package-bundles with current implementation details - Package must be enabled in config (corrected from earlier draft) - Document dirclean → build → strip pipeline - Document per-package + global target fallback for file collection - Document WebUI plugin assembly and limitations - Update walkthrough with menuconfig step and stripping output Signed-off-by: Paul Philippov paul@themactep.com
408163e bundle: rename .tpb to .tgz extension Midnight Commander and other Linux tools get confused by non-standard extensions. Use .tgz which is universally recognized as gzip'd tar. Signed-off-by: Paul Philippov paul@themactep.com
954248d bundle: fix webui plugin support - Makefile: bundle-% target detects .webui.json manifest and runs thingino-webui-rebuild + target-finalize to assemble plugin files into the global target directory - make-bundle.sh: fall back to global target/ for files not found in per-package target (webui assembly output lands there) - telegrambot.bundle: include webui plugin files + assembled plugins.js Signed-off-by: Paul Philippov paul@themactep.com
e212dde bundle: strip binaries, dirclean before build, add nino bundle - make-bundle.sh: auto-detect cross-compile strip tool and strip all binaries in the bundle before archiving - Makefile: add package-dirclean before package build in bundle-% target so existing packages can be rebundled cleanly - New bundle: nino (terminal text editor) Signed-off-by: Paul Philippov paul@themactep.com
0d9acb5 Add Phase 1 package bundle system Introduces a lightweight mechanism to build and distribute precompiled software bundles (.tpb files) that can be installed on a running Thingino camera without reflashing firmware. Build side: - BR2_THINGINO_PACKAGES menuconfig (selects thingino-pkg + thingino-jct) - 'make bundle-' target: builds the package on-demand, then packs it - scripts/make-bundle.sh: collects files from per-package target dir, generates manifest, produces .tpb archive - .bundle files: per-package file manifests for bundle inclusion Device side: - /usr/sbin/thingino-pkg: install, remove, list, info, files commands - SOC family validation, conflict checking, storage tier auto-selection - Tiers: overlay (data partition), sdcard (symlinks), tmp (volatile) Documentation: docs/package-bundles.md covering architecture, bundle format, manifest schema, walkthrough, security, and limitations. Signed-off-by: Paul Philippov paul@themactep.com
c847c37 system: guard SD card related files with BR2_THINGINO_SDCARD
236d16b wireguard: contain wireguard files in wireguard-tools package
c4eded0 package/prudynt-t: update to 743ff11 Update prudynt-t from ac02b80 to 743ff11 Hash change: ac02b8014ab64d8ff3c3f8b49a9af0586ee7ad9e -> 743ff1165d04b25fb3ca74fe0789a65d4b2601c8 Changelog: 527d2cd: privacy: hardware OSD cover for black screen + suppress motion detection 743ff11: AACEncoder: port to faac 2.0 API
d614afb privacy-lite: remove text element settings from privacy screen configuration The active prudynt-t backend only supports a boolean enabled/disabled toggle for privacy covers. Remove all text, font, color, stroke, and image overlay settings from the webui config page and JS that had no corresponding backend support. Signed-off-by: Paul Philippov paul@themactep.com
ff33d0e ha-state: remove 'iw' fallback for RSSI, not available on Thingino Signed-off-by: Paul Philippov paul@themactep.com
a024c02 ha-state: add wpa_cli signal_poll for WiFi RSSI sensor The existing RSSI detection used 'iw' and /proc/net/wireless, neither of which worked reliably on these Ingenic cameras. Add wpa_cli signal_poll as the primary method - it's available on every Thingino camera with Wi-Fi and returns RSSI in dBm directly. Also fix interface detection to check /sys/class/net/*/wireless instead of grep-ping for 'wlan', so it works with any interface naming scheme (wlan0, ra0, etc.). Signed-off-by: Paul Philippov paul@themactep.com
bc9d32d ha-event: push motion state to MQTT immediately on event Add /usr/sbin/ha-event script that publishes entity state changes to Home Assistant MQTT the moment they happen, bypassing the periodic ha-daemon poll cycle. Previously, motion ON/OFF was only detected during the next ha-state poll (up to state_interval seconds of delay). The motion script now calls 'ha-event motion ON/OFF &' right after creating/removing the motion_alarm file. The ha-daemon polling loop remains as a consistency fallback. The ha-event script sources ha-common for MQTT config, checks that HA is configured and the entity is enabled, then publishes with force=1. It silently exits if HA is not installed, so there is no hard dependency between prudynt-t and thingino-ha. Signed-off-by: Paul Philippov paul@themactep.com
0a5d580 package/subzeroclaw: update patch and config for upstream ab18b78 The upstream source was significantly rewritten (new Config struct with request_extra/compact_extra/session fields, no more 'model' or 'max_messages' keys). Rebase the embedded-paths patch against the current HEAD and update the Thingino default config to match the new format (model now rides in request_extra JSON). Signed-off-by: Paul Philippov paul@themactep.com
dbda8e7 packages: update faac to 2.0, libsrt to 1.5.6, libhelix-{aac,mp3} to 2.4.2 faac 2.0 switches to meson build system and new faac_encoder API. libsrt and libhelix hash files updated to match version bumps in .mk. Signed-off-by: Paul Philippov paul@themactep.com
ca83f99 package/libhelix-mp3: update to 2.4.2 Update libhelix-mp3 from 2.4.1 to 2.4.2 Hash change: 2.4.1 -> 2.4.2 (No changelog available)
8a86364 package/libhelix-aac: update to 2.4.2 Update libhelix-aac from 2.4.1 to 2.4.2 Hash change: 2.4.1 -> 2.4.2 (No changelog available)
6f8a567 package/libflac: update to 2.4.2 Update libflac from 2.4.1 to 2.4.2 Hash change: 2.4.1 -> 2.4.2 (No changelog available)
8b20e26 webui: tighten recording/motion/privacy button active checks The previous permissive truthy checks (value && value !== 0 && value !== "false") could produce false positives for unexpected JSON values like the string "0" (truthy in JS, !== 0 due to strict type mismatch). Use explicit value === true || value === 1 to match only the expected heartbeat formats: boolean true (raptor path) or integer 1 (native path). Signed-off-by: Paul Philippov paul@themactep.com
5f6814e package/thingino-dfu: update to v1.5.33 Update thingino-dfu from v1.5.32 to v1.5.33 Hash change: v1.5.32 -> v1.5.33 (No changelog available)
0f1537f package/prudynt-t: update to ac02b80 Update prudynt-t from 997a6df to ac02b80 Hash change: 997a6df98fba1e27f9403c8ac0add07abe8beee4 -> ac02b8014ab64d8ff3c3f8b49a9af0586ee7ad9e Changelog: ac02b80: api: serve sse stream for sei data
93cdcf8 webui: fix motion/privacy/recording/Auto button highlight from heartbeat The slow heartbeat (native path) sends motion_enabled, privacy_enabled, rec_ch0, rec_ch1 as integers 0/1, but updateHeartbeatUi() compared them with strict boolean equality (=== true). Since 1 !== true in JavaScript, the buttons never highlighted when the native heartbeat reported active state. Similarly, the raptor heartbeat path sends daynight_enabled as boolean true/false, but the Auto button checked only === 1, missing the raptor case. In preview.js, handleMessage() was setting .checked on elements, which is a no-op. Changed to classList.toggle('active', ...). All checks now use robust truthy tests consistent with the existing mic_enabled/spk_enabled pattern: value && value !== 0 && value !== false. Signed-off-by: Paul Philippov paul@themactep.com
4e40d15 Makefile: print total build time at end of pack
5eaf6e7 package/thingino-dfu: update to v1.5.32 Update thingino-dfu from v1.5.30 to v1.5.32 Hash change: v1.5.30 -> v1.5.32 (No changelog available)
50fe432 package/prudynt-t: update to 997a6df Update prudynt-t from c063550 to 997a6df Hash change: c0635506956ac759929f09625f77a8d13b749f17 -> 997a6df98fba1e27f9403c8ac0add07abe8beee4 Changelog: 997a6df: http: add Access-Control-Allow-Origin to /api/v1/osd-sei
9f08f7f package/libsrt: update to v1.5.6 Update libsrt from v1.5.5 to v1.5.6 Hash change: v1.5.5 -> v1.5.6 (No changelog available)
0012ffc thingino-button: block in poll() instead of busy-polling the input device
d0ddffd motors: apply invert_x/invert_y at runtime on GPIO/TCU steppers; fix Cinnado D1 tilt direction GPIO/TCU steppers get inversion at runtime via 'motors -I' after the daemon starts (modprobe rejects the params). Sets invert_y on the four Cinnado D1 profiles to fix the swapped tilt direction.
e50a403 Add dts and Experimental config for 360 k7ts t41nq. note: 1.The led_g is currently not working for all kernel 4.4 cameras. 2.The external speaker works ,but I didn't find the disable/enable pin. 3.The original firmware have gpio 57 and 61 as input, 82 output low, I don't know what are they. 4.Motors need previous patch in ingenic-sdk to work.
e22cb86 Add dts and Experimental config for 360 k7ts t41nq. note: 1.The led_g is currently not working for all kernel 4.4 cameras. 2.The external speaker works ,but I didn't find the disable/enable pin. 3.The original firmware have gpio 57 and 61 as input, 82 output low, I don't know what are they. 4.Motors need previous patch in ingenic-sdk to work.
bc329ac Add experimental H3C tc2100 and modify c2041 config to add ethernet
3625e1b Add experimental config for 360 ap6pcm03 note: 1.The sdio wifi script currently conflits wired ethernet and usb cdc network. So, no wifi even if both are unconnected. And the attempt to remoce mmc 1 break mmc 0 ,need the previous network and kernel patch to work. 2.32m image size for autoupdate-full.bin doesn't work in old uboot (Warning! Only lower 16MiB are accessible. Add #define CONFIG_SPI_FLASH_BAR for full access.). So please use new mainline uboot. 3.shvflip=1 doesn't work, so i flipped it later in prudynt and raptor. 4.get "gpio-73 (sdio_wifi_power_on ) out hi" in original firmware, but it doesn't seem to have any effect in my device.