Exhaust hose adapter for small skylight - for 3D printers and others
by viewprintlab ·
A place to attach a 4" (100mm) hose to vent out a small (18-22") skylight. The goal was to not require permanent mounting, so the intent is to use command strips or mounting tape.
The port as show is 100mm ID - should be 100mm OUTside diameter, didn't catch until I printed. Easy to adjust in SCAD.
The port can be extended to use one of the many magnetic coupling designs to allow for fast disconnect if required (I glued a magnetic mount in).
Interactive Preview & Customizer
3D STL viewer with browser-based OpenSCAD rendering on parameter changes.
Loading preview...
--- Parameters (in mm) ---
step 0.5
step 0.5
step 0.1
step 0.5
5cm requirement (distance from leg edge to hose edge)
step 0.5
Tolerances
step 0.1
WASM compiler loads on first parameter change.
Screenshots
Prompt
An adapter for a 4 inch flexible hose to fit in a skylight. The adapter should be U-shaped and able to adjust from 18-22 inches wide. The legs of the adapter should be a fixed 5 inches.
OpenSCAD Code
// --- Parameters (in mm) ---
$fn = 64;
inch = 25.4;
plate_thick = 15;
leg_length = 5 * inch;
hose_diameter = 4 * inch;
hose_collar_height = 1 * inch;
bar_height = 130;
// Female arm reduced by 25mm
female_arm_length = (12 * inch) - 25;
// Male arm length maintained to ensure 22" total reach
male_arm_length = 12 * inch;
// Width for preview (18 to 22 inches)
total_width_preview = 22 * inch;
// 5cm requirement (distance from leg edge to hose edge)
dist_from_leg = 50;
hose_center_x = plate_thick + dist_from_leg + (hose_diameter / 2);
// Tolerances
tol = 0.5;
// Calculated track start to avoid the hose port
track_start_ref = hose_center_x + (hose_diameter/2) + 15;
available_track_len = female_arm_length - track_start_ref;
module port_arm_female() {
difference() {
union() {
// Main Face Plate
cube([female_arm_length, plate_thick, bar_height]);
// 5-inch Leg (Positive Y)
cube([plate_thick, leg_length, bar_height]);
// Hose Collar
translate([hose_center_x, plate_thick, bar_height/2])
rotate([-90, 0, 0])
difference() {
cylinder(d = hose_diameter + 10, h = hose_collar_height);
translate([0, 0, -1])
cylinder(d = hose_diameter, h = hose_collar_height + 2);
}
}
// Hose Cutout
translate([hose_center_x, -1, bar_height/2])
rotate([-90, 0, 0])
cylinder(d = hose_diameter, h = plate_thick + 2);
// Internal track for the slider
translate([track_start_ref, 3, 10])
cube([available_track_len + 1, plate_thick - 6, bar_height - 20]);
}
}
module slider_arm_male() {
// The tongue is sized to match the available track in the female arm
tongue_len = available_track_len;
union() {
// Main Face Plate (The part that stays outside)
// Calculated to ensure total width can be reached
outer_body_len = male_arm_length - tongue_len;
translate([tongue_len, 0, 0])
cube([outer_body_len, plate_thick, bar_height]);
// 5-inch Leg (Positive Y) at the very end
translate([tongue_len + outer_body_len - plate_thick, 0, 0])
cube([plate_thick, leg_length, bar_height]);
// Sliding Tongue (Male)
translate([0, 3 + tol/2, 10 + tol/2])
cube([tongue_len, plate_thick - 6 - tol, bar_height - 20 - tol]);
}
}
// --- Assembly View ---
// X-positioning for preview
male_pos_x = total_width_preview - male_arm_length;
port_arm_female();
translate([male_pos_x, 0, 0])
slider_arm_male();
// --- Printing Instructions ---
// 1. Render and export 'port_arm_female()'
// 2. Render and export 'slider_arm_male()'
// Note: If the male arm (approx 304mm) is too long for your bed,
// you can rotate it diagonally or print it vertically.