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).
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.