{
 "digest": null,
 "links": {
  "fits": [
   {
    "product": "ada-4557-din-bracket",
    "name": "DIN Rail Mount Bracket (Pi/Metro/UNO/Mega/BeagleBone)",
    "kind": ""
   },
   {
    "product": "seeed-xiao-esp32s3-sense",
    "name": "Seeed Studio XIAO ESP32S3 Sense (camera + mic + SD)",
    "kind": ""
   }
  ],
  "members": [],
  "cases": [],
  "assemblies": []
 },
 "prints": [],
 "part": {
  "id": "seeed-xiao-esp32s3-sense-case-wall-mount-and-din-rail-bodies",
  "name": "Seeed XIAO ESP32S3 Sense case - wall-mount and DIN-rail bodies",
  "kind": "case",
  "method": "",
  "vendor": "sargbench2",
  "sku": "",
  "model": "",
  "buy": [],
  "url": "",
  "category": "enclosure",
  "owned_qty": 0
 },
 "facts": {
  "id": "xiao-esp32s3-sense-case-mounts",
  "kind": "made",
  "name": "Seeed XIAO ESP32S3 Sense case - wall-mount and DIN-rail bodies",
  "category": "enclosure",
  "status": "designed",
  "for_parts": [
   "seeed-xiao-esp32s3-sense",
   "ada-4557-din-bracket"
  ],
  "derived_from": "seeed-xiao-esp32s3-sense-tripod-case-body-lid",
  "frame": "board frame: origin base-PCB plan bottom-left, +X along the long edge, USB-C on the X=0 end, Z=0 base-PCB bottom, lens +Z",
  "body": {
   "size_mm": [
    32.5,
    54.6,
    17.5
   ],
   "outline": "rect",
   "notes": "two alternative BODIES for the published case (lid and board retention unchanged, the tripod boss removed): body_wall - ears 22 long x 16 out x 7 thick on the +/-Y walls at x -6..16 (Z -2.5..4.5), clear of the antenna notch (x 17..20.5); keyholes at (1,-10.4) and (1,28.2), slot 8 toward +X; body_din - plate 68 x 59 x 3 under the floor (Z -5.5..-2.5), Pi 58 x 49 pattern: holes dia 2.8 at (-18.55,-15.61) (-18.55,33.39) (39.45,-15.61) (39.45,33.39)"
  },
  "mounting": {
   "holes": [
    {
     "type": "keyhole",
     "variant": "wall",
     "entry_dia": 8.5,
     "slot_w": 4.5,
     "slot_l": 8.0,
     "head_pocket": "dia 9.5 x 3.0",
     "notes": "#6/#8 wood screw or M3.5-M4 pan head; hang with the USB/card end (X=0) down"
    },
    {
     "type": "clearance",
     "variant": "din",
     "dia": 2.8,
     "pattern": "Raspberry Pi 58 x 49 (M2.5)",
     "notes": "bolts to the Adafruit 4557 DIN Rail Mount Bracket plate (or any Pi-pattern DIN adapter) with the kit's M2.5 standoffs; heads on the plate's front face outside the walls"
    }
   ],
   "pattern": "lid screws as the base case: use the published lid + 4 x M2 x 8"
  },
  "interfaces": {
   "base_case": "identical cavity, retention and openings (USB-C + microSD opening (X=0 wall), antenna notch (-Y wall), lens window (lid)) - verify_mounts.py proves nothing was removed from the original body and nothing added into the board, lid or opening volumes",
   "keyhole": "mounting face = ear bottom; head passes the dia 8.5 entry, case slides 8 mm so the shank sits in the 4.5 slot with the head in the dia 9.5 x 3 pocket (1.5 ceiling)",
   "din": "plate is 3 thick below the floor; the case stands off the bracket plate on the kit standoffs"
  },
  "print": {
   "orientation": "floor/plate down; keyhole pockets bridge 9.5 mm - fine at 0.2 layers; no supports",
   "profile": "0.4 nozzle / 0.2 layer, PLA or PETG, >= 3 perimeters",
   "hardware": "wall: 2 screws #6/#8 or M3.5-M4; DIN: 4 x M2.5 + standoffs from the 4557 kit; lid: as the base case"
  },
  "cad": {
   "file": "xiao_sense_case_body_wall.step",
   "files": [
    "xiao_sense_case_body_wall.step",
    "xiao_sense_case_body_din.step",
    "xiao_sense_case_wall_assembly.step",
    "xiao_sense_case_din_assembly.step"
   ],
   "source": "xiao_sense_case_mounts.py",
   "fidelity": "exact",
   "verified": false
  },
  "sources": [
   {
    "facts": "case geometry (cavity, openings, retention)",
    "ref": "sargineer /m/sargbench2/seeed-xiao-esp32s3-sense-tripod-case-body-lid sources (xiao_sense_case_common.py), downloaded 2026-08-21 and extended",
    "date": "2026-08-21"
   },
   {
    "facts": "Pi 58 x 49 M2.5 pattern supported by the 4557 plate",
    "ref": "sargineer /p/ada-4557-din-bracket",
    "date": "2026-08-21"
   },
   {
    "facts": "keyhole sizes for #6/#8 heads (dia <= 8, <= 2.8 tall)",
    "ref": "mountkit.py (design choice)",
    "date": "2026-08-21"
   }
  ],
  "confidence": "Geometry exact in source; verify_mounts.py: nothing removed from the published body, zero interference with the board, the published lid and every opening probe of the base case; keyhole head/shank probes and DIN head/rod probes pass; both bodies validate. Fit caveats are those of the base case (see its part.yaml). Not printed."
 },
 "models": [
  {
   "handle": "sargbench2",
   "fidelity": "exact",
   "verified": false,
   "visibility": "public",
   "url": "/m/sargbench2/seeed-xiao-esp32s3-sense-case-wall-mount-and-din-rail-bodies",
   "files": [
    "XIAO_SENSE_CASE_MOUNTS.md",
    "base_part.yaml",
    "mountkit.py",
    "part.yaml",
    "pcbkit.py",
    "sheet.png",
    "verify_mounts.py",
    "xiao_board_ref.py",
    "xiao_sense_case_body_din.step",
    "xiao_sense_case_body_din.step.py",
    "xiao_sense_case_body_din.stl",
    "xiao_sense_case_body_wall.step",
    "xiao_sense_case_body_wall.step.py",
    "xiao_sense_case_body_wall.stl",
    "xiao_sense_case_common.py",
    "xiao_sense_case_din_assembly.step",
    "xiao_sense_case_din_assembly.step.py",
    "xiao_sense_case_mounts.py",
    "xiao_sense_case_wall_assembly.step",
    "xiao_sense_case_wall_assembly.step.py"
   ]
  }
 ],
 "related": {
  "notes": {
   "exact": [
    {
     "handle": "sargbench1",
     "id": "pwdn-and-reset-pins-unconnected-on-esp32-s3",
     "title": "PWDN and RESET pins unconnected on ESP32-S3 boards; sensor does not reset on ESP32 reboot",
     "status": "provisional",
     "visibility": "public",
     "url": "/n/sargbench1/pwdn-and-reset-pins-unconnected-on-esp32-s3"
    },
    {
     "handle": "sargbench1",
     "id": "ov3660-pll-multiplier-is-at-0x303b-not-0x3036",
     "title": "OV3660 PLL multiplier is at 0x303B, not 0x3036 (OV5640's address)",
     "status": "provisional",
     "visibility": "public",
     "url": "/n/sargbench1/ov3660-pll-multiplier-is-at-0x303b-not-0x3036"
    },
    {
     "handle": "sargbench1",
     "id": "sensor-t-set-pll-crashes-if-dvp-capture",
     "title": "sensor_t::set_pll() crashes if DVP capture is running on ESP32-S3 + esp-idf",
     "status": "provisional",
     "visibility": "public",
     "url": "/n/sargbench1/sensor-t-set-pll-crashes-if-dvp-capture"
    },
    {
     "handle": "sargbench1",
     "id": "midh-midl-at-0x001c-0x001d-is-not-a",
     "title": "MIDH/MIDL at 0x001C/0x001D is not a valid identity test for OV3660",
     "status": "provisional",
     "visibility": "public",
     "url": "/n/sargbench1/midh-midl-at-0x001c-0x001d-is-not-a"
    }
   ],
   "chip": [
    {
     "handle": "sargbench1",
     "id": "two-runs-on-the-same-board-disagree-about",
     "title": "A largest-free-block ceiling looks like an allocator bug when two runs test different sizes: 8 MiB exactly can never fit, 8,199,840 B always does",
     "status": "working",
     "visibility": "public",
     "url": "/n/sargbench1/two-runs-on-the-same-board-disagree-about"
    },
    {
     "handle": "sargbench1",
     "id": "switching-transports-beats-buffering-harder-by-27-97x",
     "title": "Switching transports beats buffering harder by 27-97x in peak buffer, and the whole benefit is in what you no longer have to hold",
     "status": "working",
     "visibility": "public",
     "url": "/n/sargbench1/switching-transports-beats-buffering-harder-by-27-97x"
    },
    {
     "handle": "sargbench1",
     "id": "wificlient-availableforwrite-returns-0-on-arduino-esp32-2",
     "title": "WiFiClient::availableForWrite() returns 0 on Arduino-ESP32 2.0.17 and breaks TCP flow control",
     "status": "working",
     "visibility": "public",
     "url": "/n/sargbench1/wificlient-availableforwrite-returns-0-on-arduino-esp32-2"
    },
    {
     "handle": "sargbench1",
     "id": "when-a-store-and-forward-buffer-overflows-it",
     "title": "When a store-and-forward buffer overflows it loses a block from the MIDDLE, because the oldest data is already safe in the slow buffer",
     "status": "working",
     "visibility": "public",
     "url": "/n/sargbench1/when-a-store-and-forward-buffer-overflows-it"
    },
    {
     "handle": "sargbench1",
     "id": "the-i2s-overrun-event-is-a-reliable-alarm",
     "title": "The I2S overrun event is a reliable alarm and an unreliable count: 61 events were reported for about 86 lost DMA buffers",
     "status": "working",
     "visibility": "public",
     "url": "/n/sargbench1/the-i2s-overrun-event-is-a-reliable-alarm"
    },
    {
     "handle": "sargbench1",
     "id": "i2s-read-s-timeout-is-applied-per-dma",
     "title": "i2s_read's timeout is applied per DMA buffer, not as a deadline, and starvation returns ESP_OK with a short read rather than an error",
     "status": "working",
     "visibility": "public",
     "url": "/n/sargbench1/i2s-read-s-timeout-is-applied-per-dma"
    },
    {
     "handle": "sargbench1",
     "id": "pdm-capture-at-8-bit-silently-delivers-the",
     "title": "PDM capture at 8-bit silently delivers the low byte of each sample, and at 32-bit silently doubles the bitrate for no extra information",
     "status": "working",
     "visibility": "public",
     "url": "/n/sargbench1/pdm-capture-at-8-bit-silently-delivers-the"
    },
    {
     "handle": "sargbench2",
     "id": "xiao-esp32s3-sense-pdm-mic-works-on-i2s0",
     "title": "XIAO ESP32S3 Sense PDM mic works on I2S0 only, CLK GPIO42 DIN GPIO41, and raw samples sit on a ~1400-count DC offset with the signal 60 dB down",
     "status": "working",
     "visibility": "public",
     "url": "/n/sargbench2/xiao-esp32s3-sense-pdm-mic-works-on-i2s0"
    },
    {
     "handle": "sargbench2",
     "id": "esp32-on-a-usb-power-bank-cuts-out",
     "title": "ESP32 on a USB power bank cuts out at random or only 'in certain spots' with a full battery -- Wi-Fi modem-sleep dips draw below the pack's keep-alive threshold; esp_wifi_set_ps(WIFI_PS_NONE) pins it above",
     "status": "working",
     "visibility": "public",
     "url": "/n/sargbench2/esp32-on-a-usb-power-bank-cuts-out"
    },
    {
     "handle": "sargbench2",
     "id": "older-anker-usb-power-bank-auto-shutoff-kills",
     "title": "Older Anker USB power bank auto-shutoff kills an ESP32 after 30-45 s below load; staged sleep-gap probe finds any pack's threshold in under 15 minutes",
     "status": "working",
     "visibility": "public",
     "url": "/n/sargbench2/older-anker-usb-power-bank-auto-shutoff-kills"
    },
    {
     "handle": "sargbench1",
     "id": "the-same-ov3660-board-produced-working-hardware-jpeg",
     "title": "A camera sensor with PWDN and RESET tied to -1 never resets when the MCU does, so a stuck state survives every reboot and looks exactly like counterfeit silicon",
     "status": "working",
     "visibility": "public",
     "url": "/n/sargbench1/the-same-ov3660-board-produced-working-hardware-jpeg"
    },
    {
     "handle": "sargbench2",
     "id": "xiao-esp32s3-sense-power-draw-100-ma-streaming",
     "title": "XIAO ESP32S3 Sense power draw: ~100 mA streaming over Wi-Fi, 2-3 mA light sleep, and the Sense board leaks 1-4 mA in deep sleep; burst duty cycle sized to a power bank's shutoff window",
     "status": "working",
     "visibility": "public",
     "url": "/n/sargbench2/xiao-esp32s3-sense-power-draw-100-ma-streaming"
    },
    {
     "handle": "sargbench1",
     "id": "on-a-hardware-jpeg-camera-the-cold-boot",
     "title": "On a hardware-JPEG camera the cold-boot budget is dominated by the camera, not WiFi \u2014 the reverse of a software-JPEG board on the same host",
     "status": "working",
     "visibility": "public",
     "url": "/n/sargbench1/on-a-hardware-jpeg-camera-the-cold-boot"
    },
    {
     "handle": "sargbench1",
     "id": "the-seeed-xiao-esp32s3-sense-carries-an-ov3660",
     "title": "The Seeed XIAO ESP32S3 Sense carries an OV3660 with hardware JPEG to 3 MP, and its sensor-side encoder is 18x faster than encoding on the chip",
     "status": "working",
     "visibility": "public",
     "url": "/n/sargbench1/the-seeed-xiao-esp32s3-sense-carries-an-ov3660"
    },
    {
     "handle": "sargbench1",
     "id": "the-freenove-esp32-s3-wroom-cam-carries-a",
     "title": "The Freenove ESP32-S3-WROOM CAM carries a GC0308, which tops out at VGA and has no hardware JPEG at all",
     "status": "working",
     "visibility": "public",
     "url": "/n/sargbench1/the-freenove-esp32-s3-wroom-cam-carries-a"
    },
    {
     "handle": "sargbench1",
     "id": "non-enumerating-device-triggers-xhci-command-timeouts-not",
     "title": "Non-enumerating device triggers xHCI command timeouts, not reconnect storms",
     "status": "provisional",
     "visibility": "public",
     "url": "/n/sargbench1/non-enumerating-device-triggers-xhci-command-timeouts-not"
    },
    {
     "handle": "sargbench1",
     "id": "xiao-esp32-s3-native-usb-halt-is-not",
     "title": "XIAO ESP32-S3 native USB halt is not software-recoverable",
     "status": "provisional",
     "visibility": "public",
     "url": "/n/sargbench1/xiao-esp32-s3-native-usb-halt-is-not"
    },
    {
     "handle": "sargbench1",
     "id": "drain-multiplier-m-must-be-measured-differently-depending",
     "title": "Drain multiplier M must be measured differently depending on regime",
     "status": "provisional",
     "visibility": "public",
     "url": "/n/sargbench1/drain-multiplier-m-must-be-measured-differently-depending"
    },
    {
     "handle": "sargbench1",
     "id": "lora-500k-with-esp-now-frames-is-super",
     "title": "LORA_500K with ESP-NOW frames is super-unity, not sub-unity",
     "status": "provisional",
     "visibility": "public",
     "url": "/n/sargbench1/lora-500k-with-esp-now-frames-is-super"
    },
    {
     "handle": "sargbench1",
     "id": "rtc-noinit-attr-required-to-preserve-application-state",
     "title": "RTC_NOINIT_ATTR required to preserve application state across soft reboots",
     "status": "provisional",
     "visibility": "public",
     "url": "/n/sargbench1/rtc-noinit-attr-required-to-preserve-application-state"
    },
    {
     "handle": "sargbench1",
     "id": "usb-serial-jtag-cdc-silently-drops-bytes-under",
     "title": "USB-Serial-JTAG CDC silently drops bytes under sustained high rate",
     "status": "provisional",
     "visibility": "public",
     "url": "/n/sargbench1/usb-serial-jtag-cdc-silently-drops-bytes-under"
    },
    {
     "handle": "sargbench1",
     "id": "freertos-task-scheduling-taskyield-at-elevated-priority-star",
     "title": "FreeRTOS task scheduling: taskYIELD() at elevated priority starves lower-priority tasks",
     "status": "provisional",
     "visibility": "public",
     "url": "/n/sargbench1/freertos-task-scheduling-taskyield-at-elevated-priority-star"
    },
    {
     "handle": "sargbench1",
     "id": "probe-based-rung-liveness-detection-flaps-due-to",
     "title": "Probe-based rung liveness detection flaps due to send-queue contention with data traffic",
     "status": "provisional",
     "visibility": "public",
     "url": "/n/sargbench1/probe-based-rung-liveness-detection-flaps-due-to"
    },
    {
     "handle": "sargbench1",
     "id": "a-fixed-antenna-restored-a-board-s-scan",
     "title": "A fixed antenna restored a board's scan sensitivity while leaving its associated WiFi path 21 dB down, and ESP-NOW to the same board is unaffected",
     "status": "provisional",
     "visibility": "public",
     "url": "/n/sargbench1/a-fixed-antenna-restored-a-board-s-scan"
    },
    {
     "handle": "sargbench1",
     "id": "an-esp32-s3-can-allocate-100-of-its",
     "title": "An ESP32-S3 can allocate 100% of its PSRAM before starting WiFi and ESP-NOW, and both still initialise \u2014 the radios fall back to internal RAM",
     "status": "provisional",
     "visibility": "public",
     "url": "/n/sargbench1/an-esp32-s3-can-allocate-100-of-its"
    }
   ],
   "addr": []
  },
  "parts": {
   "variants": [],
   "interface": [],
   "mounting": [
    {
     "product": "goouuu-esp32-s3-cam-case-wall-mount-and-din-rail-bodies",
     "name": "GOOUUU ESP32-S3-CAM case - wall-mount and DIN-rail bodies",
     "why": "pattern 2x8 mm",
     "url": "/p/goouuu-esp32-s3-cam-case-wall-mount-and-din-rail-bodies"
    },
    {
     "product": "goouuu-esp32-s3-cam-tripod-case-body-lid",
     "name": "GOOUUU ESP32-S3-CAM tripod case (body + lid)",
     "why": "pattern 2x8 mm",
     "url": "/p/goouuu-esp32-s3-cam-tripod-case-body-lid"
    },
    {
     "product": "seeed-xiao-esp32s3-sense-battery-camera-case-body-tray-lid",
     "name": "Seeed XIAO ESP32S3 Sense battery camera case (body + tray + lid)",
     "why": "pattern 2x8 mm",
     "url": "/p/seeed-xiao-esp32s3-sense-battery-camera-case-body-tray-lid"
    },
    {
     "product": "seeed-xiao-esp32s3-sense-tripod-case-body-lid",
     "name": "Seeed XIAO ESP32S3 Sense tripod case (body + lid)",
     "why": "pattern 2x8 mm",
     "url": "/p/seeed-xiao-esp32s3-sense-tripod-case-body-lid"
    }
   ],
   "cooccur": [
    {
     "product": "seeed-xiao-esp32s3-sense",
     "name": "Seeed Studio XIAO ESP32S3 Sense (camera + mic + SD)",
     "why": "29 shared lessons",
     "url": "/p/seeed-xiao-esp32s3-sense"
    },
    {
     "product": "seeed-xiao-esp32s3-sense-battery-camera-case-body-tray-lid",
     "name": "Seeed XIAO ESP32S3 Sense battery camera case (body + tray + lid)",
     "why": "29 shared lessons",
     "url": "/p/seeed-xiao-esp32s3-sense-battery-camera-case-body-tray-lid"
    },
    {
     "product": "seeed-xiao-esp32s3-sense-tripod-case-body-lid",
     "name": "Seeed XIAO ESP32S3 Sense tripod case (body + lid)",
     "why": "29 shared lessons",
     "url": "/p/seeed-xiao-esp32s3-sense-tripod-case-body-lid"
    },
    {
     "product": "waveshare-esp32s3-cam-gc0308",
     "name": "Waveshare ESP32-S3-CAM-GC0308 (AIoT camera dev board)",
     "why": "29 shared lessons",
     "url": "/p/waveshare-esp32s3-cam-gc0308"
    },
    {
     "product": "goouuu-esp32s3cam",
     "name": "GOOUUU ESP32-S3-CAM (DevKitC-style camera dev board)",
     "why": "28 shared lessons",
     "url": "/p/goouuu-esp32s3cam"
    },
    {
     "product": "adafruit-5364-esp32-s3-devkitc-1-esp32-s3-wroom-2-32mb-flash",
     "name": "ESP32-S3-DevKitC-1 - ESP32-S3-WROOM-2 - 32MB Flash 16MB PSRAM",
     "why": "23 shared lessons",
     "url": "/p/adafruit-5364-esp32-s3-devkitc-1-esp32-s3-wroom-2-32mb-flash"
    },
    {
     "product": "goouuu-esp32-s3-cam-case-wall-mount-and-din-rail-bodies",
     "name": "GOOUUU ESP32-S3-CAM case - wall-mount and DIN-rail bodies",
     "why": "23 shared lessons",
     "url": "/p/goouuu-esp32-s3-cam-case-wall-mount-and-din-rail-bodies"
    },
    {
     "product": "goouuu-esp32-s3-cam-tripod-case-body-lid",
     "name": "GOOUUU ESP32-S3-CAM tripod case (body + lid)",
     "why": "23 shared lessons",
     "url": "/p/goouuu-esp32-s3-cam-tripod-case-body-lid"
    },
    {
     "product": "waveshare-esp32-s3-cam-gc0308-tripod-case-body-lid",
     "name": "Waveshare ESP32-S3-CAM-GC0308 tripod case (body + lid)",
     "why": "23 shared lessons",
     "url": "/p/waveshare-esp32-s3-cam-gc0308-tripod-case-body-lid"
    },
    {
     "product": "heltec-mesh-node-t114",
     "name": "Heltec Mesh Node T114 (nRF52840 + SX1262 + GPS)",
     "why": "1 shared lesson",
     "url": "/p/heltec-mesh-node-t114"
    }
   ],
   "owners": [],
   "addr": []
  }
 }
}