# Tapo Ceiling Mount A parametric ceiling-mount adapter for a **TP-Link Tapo C202 / C210** camera. It uses **only the existing round ceiling hole**. It drills **no new holes**. The adapter clamps the false-ceiling panel between one exterior plate below and two interior clamps above. Two **M4** screws (one per clamp) travel up through the existing hole and pull the clamps down onto the ceiling. A **modular camera connector** hangs below the plate. It carries no ceiling load. It routes the cables and it accepts exchangeable camera adapters through two bayonet interfaces. See [Modular camera connector](#modular-camera-connector). ## Load path The load goes through this chain: 1. camera 2. original Tapo base 3. exterior plate 4. M4 screws 5. captive M4 nuts 6. interior clamps 7. upper surface of the ceiling panel Broad bearing surfaces spread the load. They protect the plasterboard from point pressure. ## Files | File | Part | Print? | |------|------|--------| | `tapo_ceiling_outer_plate.scad` | Exterior plate (below ceiling) | Yes, ×1 | | `tapo_ceiling_inner_clamp.scad` | Interior clamps, joined as a pair | Yes, ×1 pair | | `tapo_ceiling_camera_connector.scad` | Modular connector collar | Yes, ×1 | | `tapo_ceiling_camera_adapter_blank.scad` | Blank adapter template | Optional | | `tapo_ceiling_camera_adapter_tapo.scad` | Direct Tapo adapter (male twist mount) | Optional | | `tapo_ceiling_camera_adapter_tapo_original_base.scad` | Adapter for the factory Tapo base | Yes, ×1 | | `tapo_ceiling_tapo_base.scad` | Printed Tapo base, and the lug gap test | Test first | | `tapo_ceiling_nut_fit_test.scad` | Nut press-fit test coupon | Test first | | `tapo_ceiling_mount_parameters.scad` | Shared parameters and modules | No (include only) | | `tapo_ceiling_mount_assembly.scad` | Preview of the full assembly | No | Print **one** camera adapter. Use `..._tapo_original_base.scad` for a reliable fit. Use `..._blank.scad` as a template for another camera. **The two clamps print as one part.** They are identical, and a thin flexible line joins them across the hole center. You push one clamp up through the hole, and the other one follows on the line. A lip under each clamp drops into the hole from above, like the plate lip from below. It seats the clamp and stops it from turning around its screw. Set `clamp_link = false` to print the clamps separately. **Edit `tapo_ceiling_mount_parameters.scad` only.** Every part reads its values from that file. ## Hardware | Item | Quantity | Note | |------|----------|------| | M4 machine screw | 2 | Length from the formula below. Default = **25 mm**. | | M4 hex nut | 2 | Standard nut, 7.0 mm across flats, 3.2 mm thick. | | ST3.5 screws for the Tapo base | 2 | Up to 13 mm long. The 20 mm factory screws are too long for the adapter. | | TPU / rubber pad | 2 | Optional. See `clamp_tpu_pad`. | ### Screw length The design computes a recommended length. Open any file in OpenSCAD. Read the console line: ``` ECHO: "Recommended M4 screw length (under head): 25 mm" ``` The formula is: ``` length = plate_thickness + ceiling_thickness + clamp_boss_height - head_recess_depth ``` The result rounds up to the next 5 mm. A thicker ceiling needs a longer screw. ## Key parameters Group `[Existing Ceiling Hole]`: - **`ceiling_hole_diameter`** — the real hole diameter. Default 80 mm. - **`ceiling_thickness`** — the real panel thickness. Default 12.5 mm. - **`install_clearance`** — gap so parts do not scrape the hole edge. Group `[Exterior Plate]`: - **`outer_diameter`** — plate diameter. Default 105 mm. Keep it at least 105 mm, so the collar rim sits on the flat face. - **`plate_thickness`** — plate thickness. Default 3 mm. - **`centering_lip_height`** — depth the lip enters the hole. Group `[Central Cable Opening]`: - **`central_opening_diameter`** — main cable opening. Default 54 mm. - **`cable_slot_reach`** — extra opening reach for cable routing. - **`cable_slot_angle`** — direction of that extra reach. Group `[M4 Fasteners]`: - **`screw_boss_d`** — boss around each screw on the plate top. The screw position is derived from it: the screw and its boss always stay inside the centering lip, so they enter the hole. A smaller boss moves the screws out. - **`head_type`** — `cap` for a counterbore, or `countersunk` for a cone. - **`m4_nut_flats`**, **`m4_nut_thickness`** — measure your real nuts. - **`nut_pocket_tol`** — across-flats offset for the nut press fit. Default -0.15 mm. Raise it if the nut does not go in. Lower it if the nut falls out. - **`nut_pocket_depth_tol`** — extra pocket depth, so the nut sits below the boss top. Default 0.2 mm. - **`nut_pocket_lead`** — lead-in chamfer at the pocket mouth. Default 0.4 mm. Group `[Interior Clamps]`: - **`clamp_outer_r`** — clamp reach. It must exceed the hole radius. - **`clamp_half_angle`** — clamp arc width. A smaller value inserts more easily. - **`clamp_grip_ribs`** — anti-slip grooves on the bearing face. - **`clamp_lip`**, **`clamp_lip_h`** — centering lip under each clamp. Default 3 mm high. - **`clamp_link`**, **`clamp_link_w`**, **`clamp_link_t`** — the thin line that joins the clamps. Default 2 x 1.2 mm. Group `[Camera Base Mount]`: - **`camera_mount_hole_spacing`** — distance between the base screw holes. The original Tapo base uses 39 mm. - **`camera_mount_hole_diameter`** — base screw hole size. - **`camera_mount_rotation`**, **`camera_mount_offset_x`**, **`camera_mount_offset_y`** — position of the base pattern on the plate, for the direct base mount without the connector. The original-base adapter follows `tapo_wing_angle` instead. The model checks its own limits with `assert`. A bad value stops the render and prints the reason. ## Modular camera connector The connector makes the ceiling mount reusable for different cameras. You change the camera adapter without touching the structural ceiling mount. ### Architecture The system has three layers: ``` exterior plate -> connector collar -> camera adapter -> camera ``` Two bayonet interfaces join the layers. Both use the same mechanism. The fixed part has a short ring with outward load tabs. The hanging part is a cup that wraps around the ring. Rigid tabs carry the load. A click latch stops the part from turning loose. | Interface | Joins | Tabs | Key (gaps from cable exit) | Lock turn | Lock | |-----------|-------|------|----------------------------|-----------|------| | Upper bayonet | plate to collar | 3 | 0, 90, 180 degrees | 30 degrees | click latch | | Lower bayonet | collar to adapter | 3 | 0, 90, 180 degrees | 30 degrees | click latch | The two interfaces are identical. So a camera adapter locks onto the collar bottom, or straight onto the plate without the collar. It ends in the same orientation both ways. ### Upper bayonet (plate to collar) The plate has a short ring with three outward tabs. The collar is larger. It wraps around the ring and sits flush against the plate face. So the tabs, the back stops and the two M4 screw heads stay hidden when the collar is locked. The three entry gaps are not evenly spaced (0, 90 and 180 degrees from the cable exit). The collar fits one way only. In that position its cable exit always meets a window in the plate ring. ### Lower bayonet (collar to adapter) The collar bottom repeats the plate design one level down. It has a flat bottom face and a short ring with three outward tabs, back stops and a latch bump. The adapter is a cup with the same outer diameter as the collar (101.6 mm). It wraps around the collar ring. So the collar and the adapter look like one cylinder with a thin seam, and the ring stays hidden. The ring, the key, the latch and the back stops copy the plate exactly. The adapter fits one way only, so its orientation to the cable exit is always the same. Its release nub sits under the collar release nub. ### Adapter straight on the plate Without the collar, the adapter locks onto the plate ring in the same way: push it up, turn it 30 degrees until it clicks. The camera face then sits 11.6 mm below the plate face instead of 24.2 mm. There is no side cable exit, so the cables must reach the camera through the adapter center. ### Click latch Each cup has a flexible beam in its rim. The beam carries a notch. A bump on the fixed part lifts the beam during the last few degrees of the turn. Then the bump drops into the notch with a click. The steep notch wall blocks the reverse turn, so the part cannot turn loose. A hard back stop blocks over-rotation. The latch only stops rotation. The tabs carry the camera load. The latch sits right beside the cable exit (`ui_latch_beside_exit`). The beam starts at the exit edge, and the release nub is just beside the exit. Both bayonets share the latch position, so when everything is closed the collar nub and the adapter nub line up, one above the other. ### Camera load path The camera hangs from rigid bayonet tabs, not from clips: ``` camera -> adapter lugs -> collar bottom tabs -> collar -> collar lugs -> plate tabs -> plate ``` ### Fit the collar 1. Turn the collar so its cable exit is 30 degrees past the ring window. 2. Push the collar straight up over the plate ring until the rim meets the plate. 3. Turn it until it clicks. Seen from below, it turns counterclockwise. ### Remove the collar 1. Press the release nub on the collar side toward the floor. 2. Turn the collar back 30 degrees. 3. Pull it straight down. ### Fit an adapter 1. Hold the adapter under the collar. Turn it until its lugs meet the three gaps in the collar bottom ring. It fits one way only. 2. Push the adapter straight up until its rim meets the collar. 3. Turn it about 30 degrees until it clicks. Seen from below, it turns counterclockwise, the same way as the collar. ### Remove an adapter 1. Press the release nub on the adapter side toward the floor. 2. Turn the adapter back 30 degrees. 3. Pull it straight down. Both parts lock in the same direction. When you lock the adapter, the turn pushes the collar against its back stop. When you unlock the adapter, the collar latch holds the collar. So the collar stays locked while you change the adapter. ### Cable management The collar is hollow. The center stays open for the RJ45 and DC cables. The collar bottom ring leaves a 79 mm passage. Inside the adapter, a 45-degree funnel leads the cables to the 40 mm central hole. The side cable exit is open at the collar rim and lines up with the window in the plate ring. So the cables can leave sideways right under the ceiling. The side cable exit is 24 mm wide and 10 mm deep. Route the cables after the collar is locked: pass each plug from inside the collar out through the exit. The RJ45 plug goes through with its latch pressed. Do not lay the cables in before you fit the collar. The collar turns 30 degrees to lock, so its exit moves away from the window in the plate ring and the rim would pinch the cables. The collar ends 2.3 mm below the cable exit, so it is as short as the exit allows. 10 mm is the smallest exit an RJ45 plug passes through. Set `cable_exit_count = 2` for a second exit on the opposite side. ### Tapo twist mount The Tapo camera does not hold a base. It holds a socket. The original Tapo base is **male**: a 56 mm disc with a short boss and 2 lugs at 180 degrees. The camera slides its socket over the lugs and turns **clockwise, seen from below**, until its own latch clicks. To remove it, turn it back. It fits C200, C202, C210, C211, C212, C216, C220, C222, C230, TC70 to TC74 and Kasa EC70/EC71. It does not fit C100/C110. No official drawing exists. The values come from 11 printable replicas that users report as a good fit: | Feature | Value | |---------|-------| | Boss diameter, root to top | 30.4 to 28.4 mm | | Lugs | 2 at 180 degrees, 7.0 mm wide, 1.5 mm thick | | Lug tips | 44 mm across (radius 22) | | Gap from the camera face to the lug underside | 3.0 mm (`tapo_lug_gap`) | | Recess around the boss | 47 mm diameter, 1 mm deep | | Base screws | 2, 39 mm apart, at 90 degrees to the lugs | **Wing rotation.** `tapo_wing_angle` turns the two wings relative to the cable exit. Set it so that the camera connectors face the cable exit once the camera has clicked on. It turns the wings of the direct Tapo adapter and the printed base. It also turns the two screw holes of the original-base adapter, because the factory base has its screws at 90 degrees to its wings. Three ways to hang the camera: - **Original-base adapter + factory base** — the reliable choice. Screw the factory base on with two ST3.5 screws up to 13 mm long. - **Original-base adapter + printed base** — `tapo_base.stl` is a copy of the factory base with the same screw holes. Use it if the factory base is lost. - **Direct Tapo adapter** — the boss and lugs are part of the adapter. It is one part less, but it needs support under the two lugs. ### Tapo lug gap test The gap from the camera face to the lug underside is the one sensitive value. A smaller gap holds tighter. 1. Print `tapo_base_test_set.stl`. It has three bases with gaps of 2.7, 3.0 and 3.3 mm. The edge notches number them 1, 2 and 3. 2. Put the camera on each base and turn it until it clicks. 3. Keep the tightest base that turns in fully and holds with no play. 4. Set `tapo_lug_gap` to its gap. Then print the direct Tapo adapter or `tapo_base.stl`. A small rib under each lug tip (`tapo_detent_h`, 0.3 mm) adds grip. Set it to 0 if the camera does not turn in. ### Connector parameters Group `[Camera Connector Collar]`: - **`enable_connector_interface`** — add the bayonet ring to the plate. - **`connector_shelf_angle`** — optional inner shelf under the collar floor. Default 0: a flat floor, and the collar ends 2.3 mm below the cable exit. The flat floor needs support inside the collar. 35 or 45 degrees print without that support, but make the collar 5.1 or 7.3 mm taller. - **`connector_floor_t`** — collar floor thickness at the bottom ring. Default 2 mm. - The collar height follows from these values and `cable_exit_height`. It is not set directly. - **`cable_exit_width`**, **`cable_exit_height`**, **`cable_exit_count`** — the side cable exit. Default 24 x 10 mm. A deeper exit makes the collar taller. Group `[Upper Bayonet - Plate to Collar]`: - **`ui_ring_r_i`** — plate ring radius. It must stay outside the screw heads. - **`ui_gap_centers`** — the keyed gap layout. - **`ui_lock_rot`** — lock turn angle. - **`ui_clearance`** — fit clearance per surface. Default 0.3 mm. Group `[Click Latch - Plate to Collar]`: - **`ui_latch_bump_h`** — how far the bump reaches into the notch. Higher gives a firmer lock. - **`ui_latch_beam_t`** — beam thickness. Thicker gives a stiffer click. Group `[Lower Bayonet - Collar to Adapter]`: - The lower bayonet takes every value from the upper bayonet. Change the `ui_*` values to change both. - **`li_floor_gap`** — gap between the ring and the adapter floor. The collar outer diameter follows from the ring and tab sizes (101.6 mm). The adapter outer diameter equals the collar outer diameter. The camera face of an adapter sits 24.2 mm below the plate face with the collar, and 11.6 mm without it. The model checks both bayonets with `assert`. Each lug must pass its gap and land fully on its tab. Each back stop must sit on its tab. The latch groove must be long enough for the turn. The notch must be shallower than the beam. Each key must fit one way only. The adapter key must also fit the plate ring. ### Fit test Print the collar and one adapter first. Try the twist-locks by hand. Use the `ui_*` values for both joints. - Too tight or it will not start: raise the clearance by 0.05 mm. - Loose or it rattles: lower the clearance by 0.05 mm. - Click too weak: raise the latch bump height by 0.2 mm. - Click too hard to push over: lower the latch beam thickness by 0.2 mm. ## Print settings - Material: **PETG** or **ASA**. This part hangs overhead, so use a strong material. - Perimeters: **4 to 5**. - Infill: **35 to 50 %**. - Layer height: **0.2 mm**. - Supports: only where the list below says so. Every load face stays flat. The lugs of a cup (collar top, adapter top) print on the bed, so their load faces point up. The tabs of a fixed ring (plate ring, collar bottom ring) end up at the top of the print, so their load faces point down. Those tabs need a little support. Print each part in the orientation below: - **Clamps** — flat top on the bed. The link prints on the bed, the lips point up and the nut pockets open onto the bed. No support. - **Connector collar** — rim on the bed. The lugs and the latch beam print on the bed. The flat floor needs support inside the collar, and the three lower tabs need support under them. - **Adapters** — rim on the bed. The lugs and the latch beam print on the bed. An inner wall and a 45-degree cable funnel hold up the base plate. The floor over the ring channel is a 4.8 mm bridge. No support. - **Direct Tapo adapter** — rim on the bed, like the other adapters. The twist ring points up. Add light support under its three inward lock tabs. - **Plate, no connector** (`enable_connector_interface = false`) — visible face on the bed. The lip and bosses point up. No support. - **Plate, with connector** — the plate then has features on both faces. It is the one part that needs a little support. Print it with the bayonet ring pointing up. The visible face then points up and stays clean. Use a brim for stability. Add light support under the disc and under the three tabs. The tab support marks sit inside the collar footprint, so the collar hides them. ## STL files for a build plate The `stl/` folder holds each part, already turned to its print orientation and placed on the bed. Import them and arrange your plate. | STL | Quantity | Size on bed (mm) | Support | |-----|----------|------------------|---------| | `inner_clamps.stl` | 1 (the linked pair) | 108 x 66 x 12 | none | | `inner_clamp.stl` | 0 (single clamp, only to replace one) | 37 x 66 x 12 | none | | `camera_connector.stl` | 1 | Ø 101.6 x 18.9 | inside under the flat floor, and under the 3 lower tabs | | `outer_plate.stl` | 1 | Ø 105 x 12.6 | light, on the ceiling side; use a brim | | `camera_adapter_tapo_original_base.stl` | 1 (reliable choice) | Ø 101.6 x 11.3 | none | | `camera_adapter_blank.stl` | 0-1 (template) | Ø 101.6 x 11.3 | none | | `camera_adapter_tapo.stl` | 0-1 (direct Tapo mount) | Ø 101.6 x 15.8 | under the 2 Tapo lugs | | `tapo_base_test_set.stl` | test first | 180 x 56 x 8.3 | under the lugs, through the plate windows | | `tapo_base.stl` | 0-1 (printed factory base) | Ø 56 x 8 | under the lugs, through the plate windows | | `nut_fit_test.stl` | test first | 65 x 19 x 5.4 | none | The collar and the adapters also carry a 1.5 mm release nub on the side. Print **one** adapter. Choose `camera_adapter_tapo_original_base.stl` for a reliable fit. A full plate is: 1 plate, 2 clamps, 1 connector, 1 adapter. To regenerate the STLs after a parameter change, run `./generate-print-stls.sh`. It turns each part to its print orientation and puts it on the bed. ## Assembly and installation Do this before you start. Press one M4 nut into each clamp pocket: 1. Set the nut in the chamfer at the pocket mouth, with its flats aligned. 2. Press it down square with your thumb or flat pliers until it sits on the floor. 3. If it is too tight, pull it in with the screw. Pass an M4 screw up through the bearing face, thread the nut and tighten until the nut seats. Then remove the screw. The nut stays in place when you turn the clamp upside down. Then follow this sequence: 1. Disconnect the camera. Remove it. 2. Pass the Ethernet cable and the power cable through the ceiling hole. 3. Push one clamp of the pair up through the hole. Lay it on the ceiling with its lip in the hole. 4. Push the second clamp up through the hole. It follows on the line. Set its lip in the hole on the opposite side. 5. Hold the exterior plate under the ceiling. 6. Push the two M4 screws up through the plate. 7. Start each screw into its captive nut by hand. 8. Pull the plate gently down while you turn each screw. This keeps each clamp from turning with the screw. 9. Tighten the two screws in small, even steps. 10. Confirm the ceiling panel sits tight between the plate and the clamps. Then attach the modular connector: 11. Push the connector collar up over the plate ring (it fits one way only). 12. Turn the collar about 30 degrees until it clicks. 13. Reach in through the open collar bottom. Pass the Ethernet plug and the power plug out through the side exit. Press the RJ45 latch to get it through. 14. Screw the factory Tapo base onto the camera adapter. 15. Push the adapter up over the collar bottom ring in the keyed orientation. 16. Turn the adapter about 30 degrees until it clicks. 17. Lead the cables to the camera connectors. 18. Attach the camera. To change the camera later, press the adapter release nub toward the floor, turn the adapter back and pull it down. The ceiling mount stays in place. ## Measurements to verify before you print Measure these values on the real installation. Set them in the parameters file. A wrong value gives a loose or a tight fit. 1. **`ceiling_hole_diameter`** — measure the real hole. This value is critical. 2. **`ceiling_thickness`** — measure the real panel. 3. **`camera_mount_hole_spacing`** — measure the two screw holes on your Tapo base. 4. **`camera_mount_hole_diameter`** — match your base screws. 5. **`m4_nut_flats`** and **`m4_nut_thickness`** — measure your real nuts. 6. **`tapo_lug_gap`** — use the Tapo lug gap test. Print the two test coupons first: - `nut_fit_test.stl` has four nut pockets at -0.25, -0.20, -0.15 and -0.10 mm. The edge notches number them 1 to 4. Press a nut into each pocket. Choose the tightest pocket that takes the nut fully and holds it upside down. Set `nut_pocket_tol` to its offset. - `tapo_base_test_set.stl` sets the Tapo lug gap. Then print one clamp. Test the fit through the hole. Then print the rest. ## Design checks The assembly preview confirms the mechanical rules. Open `tapo_ceiling_mount_assembly.scad`. Check that: - No screw touches the ceiling material. - Every screw stays inside the existing hole. - Each clamp passes through the hole one at a time. - Each clamp overlaps the ceiling top by about 14 mm (default 80 mm hole). - The clamps leave the hole center open. - The Ethernet and DC connectors pass through the open center. - The plate covers the whole hole. - The two screws and their bosses stay inside the ceiling hole. - The two screws stay clear of the camera base. For the modular connector, check also that: - The connector locks and unlocks from below. - The connector cannot pull straight down when locked. - The adapter cannot pull straight down when locked. - Each lug bears on a solid tab. - The adapter fits the collar one way only, and it does not fit the plate. - The center stays open for the RJ45 and DC connectors. - The side notch gives room for the cable bend. - You can change the adapter without removing the ceiling mount. Set `assembly_mode` in the preview to `assembled`, `exploded` or `section`. The `section` view cuts the model on the y=0 plane and shows the cable path. Where rules conflict, the design keeps this order of priority: 1. structural safety 2. no new ceiling holes 3. cable clearance 4. easy installation 5. compact look