EN 14960:2019 Calculators
EN 14960:2019 Requirements for Inflatable Play Equipment
Calculation Formula
((Area × 114.0 × 1.5) ÷ 1600.0)
Ruby Source Code
Method: calculate_required_anchors
def calculate_required_anchors(area_m2)
# EN 14960-1:2019 Annex A (Lines 1175-1210) - Anchor calculation formula
# Force = 0.5 × Cw × ρ × V² × A
# Where: Cw = 1.5, ρ = 1.24 kg/m³, V = 11.1 m/s (Lines 1194-1199)
# Number of anchors = Force / 1600N (Line 450 - each anchor withstands 1600N)
return 0 if area_m2.nil? || area_m2 <= 0
# Pre-calculated: 0.5 × 1.5 × 1.24 × 11.1² ≈ 114
area_coeff = Constants::ANCHOR_CALCULATION_CONSTANTS[:area_coefficient]
base_div = Constants::ANCHOR_CALCULATION_CONSTANTS[:base_divisor]
safety_mult = Constants::ANCHOR_CALCULATION_CONSTANTS[:safety_factor]
((area_m2.to_f * area_coeff * safety_mult) / base_div).ceil
end
Source: EN14960::Calculators::AnchorCalculator (en14960 gem)
API Details
Endpoint:
POST https://play-test.co.uk/safety_standards
Headers:
Content-Type: application/json Accept: application/json
Parameters:
{
"calculation": {
"type": "anchors",
"length": 5.0,
"width": 5.0,
"height": 3.0
}
}
Example Response:
{
"passed": true,
"status": "Calculation completed successfully",
"result": {
"value": 8,
"value_suffix": "",
"breakdown": [
[
"Front/back area",
"5.0m (W) × 3.0m (H) = 15.0m²"
],
[
"Sides area",
"5.0m (L) × 3.0m (H) = 15.0m²"
],
[
"Front & back anchor counts",
"((15.0 × 114.0 * 1.5) ÷ 1600.0 = 2"
],
[
"Left & right anchor counts",
"((15.0 × 114.0 * 1.5) ÷ 1600.0 = 2"
],
[
"Calculated total anchors",
"(2 + 2) × 2 = 8"
]
]
}
}
Test with curl:
curl -X POST https://play-test.co.uk/safety_standards \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-d '{"calculation":{"type":"anchors","length":5.0,"width":5.0,"height":3.0}}'
Calculation Formula
Area ÷ space_per_user (varies by height: 1-2 m² per user)
Ruby Source Code
Method: calculate
def calculate(length, width, max_user_height = nil, negative_adjustment_area = 0)
return default_result if length.nil? || width.nil?
total_area = (length * width).round(2)
negative_adjustment_area = negative_adjustment_area.to_f.abs
usable_area = [total_area - negative_adjustment_area, 0].max.round(2)
breakdown = build_breakdown(length, width, total_area, negative_adjustment_area, usable_area)
capacities = calculate_capacities(usable_area, max_user_height, breakdown)
CalculatorResponse.new(
value: capacities,
value_suffix: "",
breakdown: breakdown
)
end
Source: EN14960::Calculators::UserCapacityCalculator (en14960 gem)
API Details
Endpoint:
POST https://play-test.co.uk/safety_standards
Headers:
Content-Type: application/json Accept: application/json
Parameters:
{
"calculation": {
"type": "user_capacity",
"length": 10.0,
"width": 8.0,
"negative_adjustment_area": 15.0,
"max_user_height": 1.5
}
}
Example Response:
{
"passed": true,
"status": "Calculation completed successfully",
"result": {
"length": 10.0,
"width": 8.0,
"area": 80.0,
"negative_adjustment_area": 15.0,
"usable_area": 65.0,
"max_user_height": 1.5,
"capacities": {
"users_1000mm": 65,
"users_1200mm": 48,
"users_1500mm": 39,
"users_1800mm": 0
},
"breakdown": [
[
"Total area",
"10m × 8m = 80m²"
],
[
"Obstacles/adjustments",
"- 15m²"
],
[
"Usable area",
"65m²"
],
[
"Capacity calculations",
"Based on usable area"
],
[
"1m users",
"65 ÷ 1 = 65 users"
],
[
"1.2m users",
"65 ÷ 1.3 = 48 users"
],
[
"1.5m users",
"65 ÷ 1.7 = 39 users"
],
[
"1.8m users",
"Not allowed (exceeds height limit)"
]
]
}
}
Test with curl:
curl -X POST https://play-test.co.uk/safety_standards \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-d '{"calculation":{"type":"user_capacity","length":10.0,"width":8.0,"negative_adjustment_area":15.0,"max_user_height":1.5}}'
Capacity Guidelines
User capacity is calculated based on the play area and the height of users. Taller users require more space for safe play.
User Height | Space Required | Users per m² |
---|---|---|
1.0m | 1.0 m² per user | 1.0 |
1.2m | 1.33 m² per user | 0.75 |
1.5m | 1.66 m² per user | 0.60 |
1.8m | 2.0 m² per user | 0.50 |
Important Notes
- Only calculate capacity for user heights that are allowed on the unit
- If a unit has a maximum user height restriction, do not calculate capacity for taller users
- Always round down fractional users for safety
- Consider obstacles and unusable areas when calculating total play area
Calculation Formula
50% of platform height, minimum 300mm
Ruby Source Code
Method: calculate_required_runout
def calculate_runout_value(platform_height, has_stop_wall: false)
return 0 if platform_height.nil? || platform_height <= 0
height_ratio = Constants::RUNOUT_CALCULATION_CONSTANTS[:platform_height_ratio]
minimum_runout = Constants::RUNOUT_CALCULATION_CONSTANTS[:minimum_runout_meters]
stop_wall_add = Constants::RUNOUT_CALCULATION_CONSTANTS[:stop_wall_addition]
calculated_runout = platform_height * height_ratio
base_runout = [calculated_runout, minimum_runout].max
has_stop_wall ? base_runout + stop_wall_add : base_runout
end
def calculate_required_runout(platform_height, has_stop_wall: false)
# EN 14960-1:2019 Section 4.2.11 (Lines 930-939) - Runout requirements
# Line 934-935: The runout distance must be at least half the height of the slide's
# highest platform (measured from ground level), with an absolute minimum of 300mm
# Line 936: If a stop-wall is installed at the runout's end, an additional
# 50cm must be added to the total runout length
return CalculatorResponse.new(value: 0, value_suffix: "m", breakdown: []) if platform_height.nil? || platform_height <= 0
# Get constants
height_ratio = Constants::RUNOUT_CALCULATION_CONSTANTS[:platform_height_ratio]
minimum_runout = Constants::RUNOUT_CALCULATION_CONSTANTS[:minimum_runout_meters]
stop_wall_add = Constants::RUNOUT_CALCULATION_CONSTANTS[:stop_wall_addition]
# Calculate values using the shared method
calculated_runout = platform_height * height_ratio
base_runout = calculate_runout_value(platform_height, has_stop_wall: false)
final_runout = calculate_runout_value(platform_height, has_stop_wall: has_stop_wall)
# Build breakdown
breakdown = [
["50% calculation", "#{platform_height}m × 0.5 = #{calculated_runout}m"],
["Minimum requirement", "#{minimum_runout}m (300mm)"],
["Base runout", "Maximum of #{calculated_runout}m and #{minimum_runout}m = #{base_runout}m"]
]
# Add stop-wall if applicable
if has_stop_wall
breakdown << ["Stop-wall addition", "#{base_runout}m + #{stop_wall_add}m = #{final_runout}m"]
end
CalculatorResponse.new(
value: final_runout,
value_suffix: "m",
breakdown: breakdown
)
end
Source: EN14960::Calculators::SlideCalculator (en14960 gem)
API Details
Endpoint:
POST https://play-test.co.uk/safety_standards
Headers:
Content-Type: application/json Accept: application/json
Parameters:
{
"calculation": {
"type": "slide_runout",
"platform_height": 2.5
}
}
Example Response:
{
"passed": true,
"status": "Calculation completed successfully",
"result": {
"value": 1.25,
"value_suffix": "m",
"breakdown": [
[
"50% calculation",
"2.5m × 0.5 = 1.25m"
],
[
"Minimum requirement",
"0.3m (300mm)"
],
[
"Base runout",
"Maximum of 1.25m and 0.3m = 1.25m"
]
]
}
}
Test with curl:
curl -X POST https://play-test.co.uk/safety_standards \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-d '{"calculation":{"type":"slide_runout","platform_height":2.5}}'
Runout Requirements
- Minimum length: 50% of highest platform height
- Absolute minimum: 300mm in any case
- Maximum inclination: Not more than 10°
- If stop wall fitted: adds 50cm to required run-out length
- Wall height on run-out sides: 50% of user height
Calculation Formula
Tiered requirements based on platform height thresholds
Ruby Source Code
Method: meets_height_requirements?
def meets_height_requirements?(platform_height, user_height, containing_wall_height, has_permanent_roof)
# EN 14960-1:2019 Section 4.2.9 (Lines 854-887) - Containment requirements
# Lines 859-860: Containing walls become mandatory for platforms exceeding 0.6m in height
# Lines 861-862: Platforms between 0.6m and 3.0m need walls at least as tall as the maximum user height
# Lines 863-864: Platforms between 3.0m and 6.0m require walls at least 1.25 times the maximum user height OR a permanent roof
# Lines 865-866: Platforms over 6.0m must have both containing walls and a permanent roof structure
return false if platform_height.nil? || user_height.nil? || containing_wall_height.nil? || has_permanent_roof.nil?
enhanced_multiplier = Constants::WALL_HEIGHT_CONSTANTS[:enhanced_height_multiplier]
thresholds = Constants::SLIDE_HEIGHT_THRESHOLDS
case platform_height
when 0..thresholds[:no_walls_required]
true # No containing walls required
when (thresholds[:no_walls_required]..thresholds[:basic_walls])
containing_wall_height >= user_height
when (thresholds[:basic_walls]..thresholds[:enhanced_walls])
# EITHER walls at 1.25x user height OR permanent roof
has_permanent_roof || containing_wall_height >= (user_height * enhanced_multiplier)
when (thresholds[:enhanced_walls]..thresholds[:max_safe_height])
# BOTH containing walls AND permanent roof required
has_permanent_roof && containing_wall_height >= (user_height * enhanced_multiplier)
else
false # Exceeds safe height limits
end
end
Source: EN14960::Calculators::SlideCalculator (en14960 gem)
API Details
Endpoint:
POST https://play-test.co.uk/safety_standards
Headers:
Content-Type: application/json Accept: application/json
Parameters:
{
"calculation": {
"type": "wall_height",
"platform_height": 2.0,
"user_height": 1.5
}
}
Example Response:
{
"passed": true,
"status": "Calculation completed successfully",
"result": {
"value": 1.5,
"value_suffix": "m",
"breakdown": [
[
"Height range",
"0.6m - 3.0m"
],
[
"Calculation",
"1.5m (user height)"
]
]
}
}
Test with curl:
curl -X POST https://play-test.co.uk/safety_standards \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-d '{"calculation":{"type":"wall_height","platform_height":2.0,"user_height":1.5}}'
Requirements by Platform Height
Platform Height | Wall Requirement |
---|---|
Under 600mm | No containing walls required |
600mm - 3000mm | Containing walls equal to platform height |
3000mm - 6000mm | Containing walls 1.25 times platform height |
Over 6000mm | Containing walls AND permanent roof required |
Material Requirements
Fabric
- Tensile strength: 1850 Newtons minimum
- Tear strength: 350 Newtons minimum
- Fire retardancy: Must meet EN 71-3 requirements
Thread
- Material: Non-rotting yarn required
- Tensile strength: 88 Newtons minimum
- Stitch length: 3-8mm
Rope
- Diameter range: 18mm - 45mm
- Material: Non-monofilament
- Attachment: Fixed at both ends
- Swing limitation: No greater than 20% to prevent strangulation
Netting
- Vertical mesh size: 30mm maximum for >1m height
- Roof mesh size: 8mm maximum
- Strength: Support heaviest intended user
Electrical Safety Requirements
General Requirements
- PAT (Portable Appliance Test) required
- Minimum pressure: 1.0 KPA operational pressure
- Finger probe: 8mm probe must not contact moving/hot parts
- Return flap: Required to reduce deflation time
- Blower distance: 1.2m minimum from equipment edge
Grounding Test Weights
User Height | Test Weight |
---|---|
1.0m | 25kg |
1.2m | 35kg |
1.5m | 65kg |
1.8m | 85kg |
Additional Safety Requirements
Additional Safety Requirements
- Maximum evacuation time: 30 seconds
- Maximum fall height: 0.6m (600mm)
- Multiple exits required for >15 users
- First metre gradient: Special requirements for slides
- Surface requirements: Non-slip surface material required
- Edge protection: Rounded edges and smooth transitions