One of the soaker hoses in Mary’s Vassar Farms garden split lengthwise near one end:

Although the hose is fully depreciated, I thought it’d be worthwhile to cut off the damaged end and conjure an end cap to see if a simple plug can withstand 100 psi water pressure.
A pair of Delrin (because I have it) plugs with serrations fill the hose channels, with the outer clamp squishing the hose against them:

In real life, they’ll be pushed completely into the hose, with a generous layer of silicone snot caulk improving their griptivity.
I started with 8 mm plugs, but they didn’t quite fill the channels:

Going to 8.5 mm worked better, although there’s really no way to force the granulated rubber shape into a snug fit around a cylinder:

Fortunately, they need not be leakproof, because leaking is what the hose does for a living. Well, did for a living, back before it died.
The clamps have a solid endstop, although it’s more to tidy the end than to hold the plugs in place:

The clamps need aluminum backing plates to distribute the stress evenly across their flat sides:

Those are 8-32 stainless steel screws. The standard 1 inch length worked out exactly right through no fault of my own.
The OpenSCAD source code as a GitHub Gist:
// Rubber Soaker Hose End Plug | |
// Ed Nisley KE4ZNU June 2019 | |
// 2020-05 Two-channel hose end plug | |
Layout = "Hose"; // [Hose,Block,Show,Build] | |
//- Extrusion parameters must match reality! | |
/* [Hidden] */ | |
ThreadThick = 0.25; | |
ThreadWidth = 0.40; | |
HoleWindage = 0.2; | |
Protrusion = 0.1; // make holes end cleanly | |
inch = 25.4; | |
function IntegerMultiple(Size,Unit) = Unit * ceil(Size / Unit); | |
//---------- | |
// Dimensions | |
// Hose lies along X axis | |
HoseTubeOD = 12.0; // water tube diameter | |
HoseTubeOC = 12.5; // .. spacing | |
HoseWebThick = 7.8; // center joining tubes | |
Hose = [100,25.0,HoseTubeOD]; // X=very long, Y=overall width, Z=thickness | |
HoseSides = 12*4; | |
PlugLength = 25.0; // plugs in hose channels | |
PlateThick = 5.0; // end block thickness | |
WallThick = 2.0; // overall minimum thickness | |
Kerf = 0.75; // cut through middle to apply compression | |
ID = 0; | |
OD = 1; | |
LENGTH = 2; | |
// 8-32 stainless screws | |
Screw = [4.1,8.0,3.0]; // OD = head LENGTH = head thickness | |
Washer = [4.4,9.5,1.0]; | |
Nut = [4.1,9.7,6.0]; | |
CornerRadius = Washer[OD]/2; | |
ScrewOC = Hose.y + Washer[OD]; | |
echo(str("Screw OC: ",ScrewOC)); | |
BlockOAL = [PlugLength + PlateThick,ScrewOC + Washer[OD],2*WallThick + Hose.z]; // overall splice block size | |
echo(str("Block: ",BlockOAL)); | |
//---------------------- | |
// Useful routines | |
module PolyCyl(Dia,Height,ForceSides=0) { // based on nophead's polyholes | |
Sides = (ForceSides != 0) ? ForceSides : (ceil(Dia) + 2); | |
FixDia = Dia / cos(180/Sides); | |
cylinder(d=(FixDia + HoleWindage),h=Height,$fn=Sides); | |
} | |
// Hose shape | |
module HoseProfile() { | |
rotate([0,-90,0]) | |
translate([0,0,-Hose.x/2]) | |
linear_extrude(height=Hose.x,convexity=4) | |
union() { | |
for (j=[-1,1]) // outer channels | |
translate([0,j*HoseTubeOC/2]) | |
circle(d=HoseTubeOD,$fn=HoseSides); | |
translate([0,0]) | |
square([HoseWebThick,HoseTubeOC],center=true); | |
} | |
} | |
// Outside shape of splice Block | |
// Z centered on hose rim circles, not overall thickness through center ridge | |
module SpliceBlock() { | |
difference() { | |
hull() | |
for (i=[-1,1], j=[-1,1]) // rounded block | |
translate([i*(BlockOAL.x/2 - CornerRadius),j*(BlockOAL.y/2 - CornerRadius),-BlockOAL.z/2]) | |
cylinder(r=CornerRadius,h=BlockOAL.z,$fn=4*8); | |
for (j=[-1,1]) // screw holes | |
translate([0, | |
j*ScrewOC/2, | |
-(BlockOAL.z/2 + Protrusion)]) | |
PolyCyl(Screw[ID],BlockOAL.z + 2*Protrusion,6); | |
cube([2*BlockOAL.x,2*BlockOAL.y,Kerf],center=true); // slice through center | |
} | |
} | |
// Splice block less hose | |
module ShapedBlock() { | |
difference() { | |
SpliceBlock(); | |
translate([(-Hose.x/2) + (BlockOAL.x/2) - PlateThick,0,0]) | |
HoseProfile(); | |
} | |
} | |
//---------- | |
// Build them | |
if (Layout == "Hose") | |
HoseProfile(); | |
if (Layout == "Block") | |
SpliceBlock(); | |
if (Layout == "Show") { | |
ShapedBlock(); | |
translate([(-Hose.x/2) + (BlockOAL.x/2) - PlateThick,0,0]) | |
color("Green",0.25) | |
HoseProfile(); | |
} | |
if (Layout == "Build") { | |
SliceOffset = 0; | |
intersection() { | |
translate([SliceOffset,0,BlockOAL.z/4]) | |
cube([4*BlockOAL.x,4*BlockOAL.y,BlockOAL.z/2],center=true); | |
union() { | |
translate([0,0.6*BlockOAL.y,BlockOAL.z/2]) | |
ShapedBlock(); | |
translate([0,-0.6*BlockOAL.y,BlockOAL.z/2]) | |
rotate([0,180,0]) | |
ShapedBlock(); | |
} | |
} | |
} |
The original doodle, with dimensions vaguely related to the final model:

There is, as far as I can tell, no standardization of dimensions or shapes across manufacturers, apart from the threaded hose fittings.
Why bother with cylindrical plugs? Those flat plates would clamp the hose end shut. Don’t make the job any harder than it has to be!
Well, if you’re going for simplicity, it’s hard to beat bending it in half and using a nylon tie or even better just tie the end in a knot. However, the components are beautiful.
The safe bending radius for these hoses is so large Mary can barely train them along one edge of a bed, around the end, and down the other side. Folding the end over produces a neat crack across the entire width of the hose!
Their best-used-by date has long since passed, but even the new hoses aren’t particularly bendy.
The hose is all squishy granulated rubber, so there’s nothing rigid to clamp against: the (absurdly high) water pressure would blow the plug right off the end.
And, as always, nothing exceeds like excess!
FWIW, an “RV water hose water pressure regulator” (the search term at Amazon) runs $8 to $15 for a fixed pressure. Some seem to be set up for relatively high flows if you need to run a bunch of hoses off a manifold.
Rational pressures should (maybe) extend the life of the hose.