diff --git a/admin-compliance/app/sdk/iace/[projectId]/knowledge-graph/_hooks/useKnowledgeGraph.ts b/admin-compliance/app/sdk/iace/[projectId]/knowledge-graph/_hooks/useKnowledgeGraph.ts new file mode 100644 index 0000000..b64f0c3 --- /dev/null +++ b/admin-compliance/app/sdk/iace/[projectId]/knowledge-graph/_hooks/useKnowledgeGraph.ts @@ -0,0 +1,133 @@ +'use client' + +import { useState, useEffect, useMemo } from 'react' + +interface Component { id: string; name: string; component_type: string } +interface Hazard { id: string; name: string; category: string; operational_states?: string[] } +interface Mitigation { id: string; name?: string; title?: string; reduction_type: string; hazard_id?: string; linked_hazard_ids?: string[] } + +export interface GraphNode { + id: string + type: 'component' | 'hazard' | 'mitigation' + label: string + subLabel?: string + color: string +} + +export interface GraphEdge { + id: string + source: string + target: string + label?: string +} + +const NODE_COLORS: Record = { + component: '#6366F1', // indigo + hazard: '#EF4444', // red + mitigation: '#10B981', // green +} + +export function useKnowledgeGraph(projectId: string) { + const [components, setComponents] = useState([]) + const [hazards, setHazards] = useState([]) + const [mitigations, setMitigations] = useState([]) + const [loading, setLoading] = useState(true) + + useEffect(() => { + loadData() + }, [projectId]) // eslint-disable-line react-hooks/exhaustive-deps + + async function loadData() { + try { + const [compRes, hazRes, mitRes] = await Promise.all([ + fetch(`/api/sdk/v1/iace/projects/${projectId}/components`), + fetch(`/api/sdk/v1/iace/projects/${projectId}/hazards`), + fetch(`/api/sdk/v1/iace/projects/${projectId}/mitigations`), + ]) + + if (compRes.ok) { + const j = await compRes.json() + setComponents((j.components || j || []).map((c: Record) => ({ + id: c.id as string, name: c.name as string, component_type: c.component_type as string || '', + }))) + } + if (hazRes.ok) { + const j = await hazRes.json() + setHazards((j.hazards || j || []).map((h: Record) => ({ + id: h.id as string, name: h.name as string, category: h.category as string || '', + operational_states: (h.operational_states || []) as string[], + }))) + } + if (mitRes.ok) { + const j = await mitRes.json() + setMitigations((j.mitigations || j || []).map((m: Record) => ({ + id: m.id as string, name: (m.name || m.title || '') as string, + title: (m.title || m.name || '') as string, + reduction_type: (m.reduction_type || '') as string, + hazard_id: (m.hazard_id || '') as string, + linked_hazard_ids: (m.linked_hazard_ids || []) as string[], + }))) + } + } catch (err) { + console.error('Failed to load graph data:', err) + } finally { + setLoading(false) + } + } + + const { nodes, edges } = useMemo(() => { + const graphNodes: GraphNode[] = [] + const graphEdges: GraphEdge[] = [] + + // Component nodes + components.forEach((c) => { + graphNodes.push({ + id: `comp-${c.id}`, type: 'component', + label: c.name, subLabel: c.component_type, + color: NODE_COLORS.component, + }) + }) + + // Hazard nodes + hazards.forEach((h) => { + graphNodes.push({ + id: `haz-${h.id}`, type: 'hazard', + label: h.name, subLabel: h.category, + color: NODE_COLORS.hazard, + }) + // Edge: first component → hazard (simplified — could be per component_id) + if (components.length > 0) { + graphEdges.push({ + id: `e-comp-haz-${h.id}`, + source: `comp-${components[0].id}`, + target: `haz-${h.id}`, + label: 'erzeugt', + }) + } + }) + + // Mitigation nodes + mitigations.forEach((m) => { + graphNodes.push({ + id: `mit-${m.id}`, type: 'mitigation', + label: m.title || m.name || m.id, + subLabel: m.reduction_type, + color: NODE_COLORS.mitigation, + }) + // Edge: mitigation → hazard + const hazardIds = m.linked_hazard_ids?.length ? m.linked_hazard_ids : m.hazard_id ? [m.hazard_id] : [] + hazardIds.forEach((hid) => { + graphEdges.push({ + id: `e-mit-haz-${m.id}-${hid}`, + source: `mit-${m.id}`, + target: `haz-${hid}`, + label: 'schuetzt', + }) + }) + }) + + return { nodes: graphNodes, edges: graphEdges } + }, [components, hazards, mitigations]) + + return { nodes, edges, loading, stats: { components: components.length, hazards: hazards.length, mitigations: mitigations.length } } +} diff --git a/admin-compliance/app/sdk/iace/[projectId]/knowledge-graph/page.tsx b/admin-compliance/app/sdk/iace/[projectId]/knowledge-graph/page.tsx new file mode 100644 index 0000000..0123a23 --- /dev/null +++ b/admin-compliance/app/sdk/iace/[projectId]/knowledge-graph/page.tsx @@ -0,0 +1,191 @@ +'use client' + +import { useCallback, useMemo } from 'react' +import { useParams } from 'next/navigation' +import { + ReactFlow, + Background, + Controls, + MiniMap, + useNodesState, + useEdgesState, + type Node, + type Edge, + MarkerType, +} from '@xyflow/react' +import '@xyflow/react/dist/style.css' +import { useKnowledgeGraph } from './_hooks/useKnowledgeGraph' + +const TYPE_STYLES: Record = { + component: { bg: '#EEF2FF', border: '#6366F1' }, + hazard: { bg: '#FEF2F2', border: '#EF4444' }, + mitigation: { bg: '#ECFDF5', border: '#10B981' }, +} + +const TYPE_LABELS: Record = { + component: 'Komponente', + hazard: 'Gefaehrdung', + mitigation: 'Massnahme', +} + +export default function KnowledgeGraphPage() { + const { projectId } = useParams<{ projectId: string }>() + const { nodes: graphNodes, edges: graphEdges, loading, stats } = useKnowledgeGraph(projectId) + + // Convert to React Flow nodes with layout + const rfNodes = useMemo((): Node[] => { + const compNodes = graphNodes.filter((n) => n.type === 'component') + const hazNodes = graphNodes.filter((n) => n.type === 'hazard') + const mitNodes = graphNodes.filter((n) => n.type === 'mitigation') + + const nodes: Node[] = [] + const colWidth = 300 + const rowHeight = 80 + + // Column 1: Components + compNodes.forEach((n, i) => { + nodes.push({ + id: n.id, + position: { x: 0, y: i * rowHeight }, + data: { label: n.label, subLabel: n.subLabel, nodeType: n.type }, + style: { + background: TYPE_STYLES.component.bg, + border: `2px solid ${TYPE_STYLES.component.border}`, + borderRadius: '12px', + padding: '8px 12px', + fontSize: '12px', + fontWeight: 500, + width: 200, + }, + }) + }) + + // Column 2: Hazards + hazNodes.forEach((n, i) => { + nodes.push({ + id: n.id, + position: { x: colWidth, y: i * rowHeight }, + data: { label: n.label, subLabel: n.subLabel, nodeType: n.type }, + style: { + background: TYPE_STYLES.hazard.bg, + border: `2px solid ${TYPE_STYLES.hazard.border}`, + borderRadius: '12px', + padding: '8px 12px', + fontSize: '12px', + fontWeight: 500, + width: 220, + }, + }) + }) + + // Column 3: Mitigations + mitNodes.forEach((n, i) => { + nodes.push({ + id: n.id, + position: { x: colWidth * 2, y: i * rowHeight }, + data: { label: n.label, subLabel: n.subLabel, nodeType: n.type }, + style: { + background: TYPE_STYLES.mitigation.bg, + border: `2px solid ${TYPE_STYLES.mitigation.border}`, + borderRadius: '12px', + padding: '8px 12px', + fontSize: '12px', + fontWeight: 500, + width: 220, + }, + }) + }) + + return nodes + }, [graphNodes]) + + const rfEdges = useMemo((): Edge[] => { + return graphEdges.map((e) => ({ + id: e.id, + source: e.source, + target: e.target, + label: e.label, + type: 'smoothstep', + animated: true, + style: { stroke: '#94A3B8', strokeWidth: 1.5 }, + labelStyle: { fontSize: 10, fill: '#64748B' }, + markerEnd: { type: MarkerType.ArrowClosed, color: '#94A3B8' }, + })) + }, [graphEdges]) + + const [nodes, setNodes, onNodesChange] = useNodesState(rfNodes) + const [edges, setEdges, onEdgesChange] = useEdgesState(rfEdges) + + // Update when data loads + const onInit = useCallback(() => { + if (rfNodes.length > 0) { + setNodes(rfNodes) + setEdges(rfEdges) + } + }, [rfNodes, rfEdges, setNodes, setEdges]) + + if (loading) { + return ( +
+
+
+ ) + } + + return ( +
+ {/* Header */} +
+

Safety Knowledge Graph

+

+ Interaktive Visualisierung: Komponente → Gefaehrdung → Massnahme +

+
+ + {/* Legend + Stats */} +
+ {(['component', 'hazard', 'mitigation'] as const).map((t) => ( +
+
+ {TYPE_LABELS[t]} ({ + t === 'component' ? stats.components : t === 'hazard' ? stats.hazards : stats.mitigations + }) +
+ ))} +
+ + {/* Graph */} + {graphNodes.length === 0 ? ( +
+ Keine Daten — bitte zuerst Projekt initialisieren. +
+ ) : ( +
+ + + + { + const t = (node.data as { nodeType?: string })?.nodeType || 'component' + return TYPE_STYLES[t]?.border || '#94A3B8' + }} + maskColor="rgba(0,0,0,0.05)" + /> + +
+ )} +
+ ) +} diff --git a/admin-compliance/app/sdk/iace/layout.tsx b/admin-compliance/app/sdk/iace/layout.tsx index 8020c15..5dd3c80 100644 --- a/admin-compliance/app/sdk/iace/layout.tsx +++ b/admin-compliance/app/sdk/iace/layout.tsx @@ -21,6 +21,7 @@ const IACE_NAV_ITEMS = [ const IACE_EXTRA_ITEMS = [ { id: 'fmea', label: 'FMEA', href: '/fmea', icon: 'grid' }, + { id: 'knowledge-graph', label: 'Knowledge Graph', href: '/knowledge-graph', icon: 'activity' }, { id: 'classification', label: 'Klassifikation', href: '/classification', icon: 'tag' }, { id: 'monitoring', label: 'Monitoring', href: '/monitoring', icon: 'activity' }, ] diff --git a/admin-compliance/package-lock.json b/admin-compliance/package-lock.json index cf2fcbe..8621f96 100644 --- a/admin-compliance/package-lock.json +++ b/admin-compliance/package-lock.json @@ -16,6 +16,7 @@ "@tiptap/pm": "^3.20.2", "@tiptap/react": "^3.20.2", "@tiptap/starter-kit": "^3.20.2", + "@xyflow/react": "^12.10.2", "bpmn-js": "^18.0.1", "jspdf": "^4.1.0", "jszip": "^3.10.1", @@ -3413,6 +3414,38 @@ "url": "https://opencollective.com/vitest" } }, + "node_modules/@xyflow/react": { + "version": "12.10.2", + "resolved": "https://registry.npmjs.org/@xyflow/react/-/react-12.10.2.tgz", + "integrity": "sha512-CgIi6HwlcHXwlkTpr0fxLv/0sRVNZ8IdwKLzzeCscaYBwpvfcH1QFOCeaTCuEn1FQEs/B8CjnTSjhs8udgmBgQ==", + "license": "MIT", + "dependencies": { + "@xyflow/system": "0.0.76", + "classcat": "^5.0.3", + "zustand": "^4.4.0" + }, + "peerDependencies": { + "react": ">=17", + "react-dom": ">=17" + } + }, + "node_modules/@xyflow/system": { + "version": "0.0.76", + "resolved": "https://registry.npmjs.org/@xyflow/system/-/system-0.0.76.tgz", + "integrity": "sha512-hvwvnRS1B3REwVDlWexsq7YQaPZeG3/mKo1jv38UmnpWmxihp14bW6VtEOuHEwJX2FvzFw8k77LyKSk/wiZVNA==", + "license": "MIT", + "dependencies": { + "@types/d3-drag": "^3.0.7", + "@types/d3-interpolate": "^3.0.4", + "@types/d3-selection": "^3.0.10", + "@types/d3-transition": "^3.0.8", + "@types/d3-zoom": "^3.0.8", + "d3-drag": "^3.0.0", + "d3-interpolate": "^3.0.1", + "d3-selection": "^3.0.0", + "d3-zoom": "^3.0.0" + } + }, "node_modules/agent-base": { "version": "7.1.4", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", diff --git a/admin-compliance/package.json b/admin-compliance/package.json index c4522b8..02617fb 100644 --- a/admin-compliance/package.json +++ b/admin-compliance/package.json @@ -26,6 +26,7 @@ "@tiptap/pm": "^3.20.2", "@tiptap/react": "^3.20.2", "@tiptap/starter-kit": "^3.20.2", + "@xyflow/react": "^12.10.2", "bpmn-js": "^18.0.1", "jspdf": "^4.1.0", "jszip": "^3.10.1", diff --git a/ai-compliance-sdk/internal/iace/measures_library_textile_agri.go b/ai-compliance-sdk/internal/iace/measures_library_textile_agri.go index e11c74e..1717eb8 100644 --- a/ai-compliance-sdk/internal/iace/measures_library_textile_agri.go +++ b/ai-compliance-sdk/internal/iace/measures_library_textile_agri.go @@ -4,104 +4,30 @@ package iace // IDs: M452-M474 (23 measures). func GetTextileAgriMeasures() []ProtectiveMeasureEntry { return []ProtectiveMeasureEntry{ - // ══════════════════════════════════════════════════════════════ // Textilmaschinen (M452-M460) - // ══════════════════════════════════════════════════════════════ - {ID: "M452", ReductionType: "design", SubType: "inherent_safety", - NameDE: "Walzenspalt-Schutzeinrichtung (EN ISO 11111-1)", NameEN: "Nip guard per EN ISO 11111-1", - DescriptionDE: "Formschluessige Schutzeinrichtung am Walzenspalt mit Verriegelung die den Antrieb bei Oeffnung stoppt. Alternativ: sensorbasierter Schutz mit Lichtgitter.", - HazardCategory: "mechanical", NormRef: "EN ISO 11111-1:2016 Abschnitt 5.2", RiskReduction: 40}, - {ID: "M453", ReductionType: "protection", SubType: "safeguard", - NameDE: "Not-Ruecklauf an Walzenpaaren", NameEN: "Emergency reverse on roller pairs", - DescriptionDE: "Sofortige Drehrichtungsumkehr bei Betaetigung des Not-Ruecklauf-Buegels am Walzenspalt.", - HazardCategory: "mechanical", NormRef: "EN ISO 11111-1:2016 Abschnitt 5.2.4", RiskReduction: 30}, - {ID: "M454", ReductionType: "design", SubType: "inherent_safety", - NameDE: "Geschlossene Absaugung am Kardierbereich", NameEN: "Enclosed extraction at carding area", - DescriptionDE: "Vollstaendig eingehaustes Kardiersystem mit integrierter Faserstaub-Absaugung und Filterung. OEL unter 1 mg/m3 Faserstaub.", - HazardCategory: "material_environmental", NormRef: "EN ISO 11111-3:2016, TRGS 900", RiskReduction: 35}, - {ID: "M455", ReductionType: "protection", SubType: "safeguard", - NameDE: "Laermkapselung fuer Webmaschinen", NameEN: "Noise enclosure for looms", - DescriptionDE: "Schalldaemmende Einhausung der Webmaschine. Reduktion um mindestens 15 dB(A) am Bedienerplatz.", - HazardCategory: "noise_vibration", NormRef: "EN ISO 11111-7:2016", RiskReduction: 25}, - {ID: "M456", ReductionType: "protection", SubType: "safeguard", - NameDE: "Beruehrungsschutz an Heissteilen der Fixiermaschine", NameEN: "Contact protection on stenter hot parts", - DescriptionDE: "Isolierung und Verkleidung aller Oberflaechen mit Temperaturen > 65 Grad C. Warnmarkierung.", - HazardCategory: "thermal", NormRef: "EN ISO 11111-6:2016 Abschnitt 5.3", RiskReduction: 30}, - {ID: "M457", ReductionType: "protection", SubType: "safeguard", - NameDE: "Geschlossenes Chemikalien-Dosiersystem", NameEN: "Closed chemical dosing system", - DescriptionDE: "Automatische Dosierung und Zufuehrung von Faerbemitteln ueber geschlossene Leitungen. Vermeidung offener Wannen.", - HazardCategory: "material_environmental", NormRef: "EN ISO 11111-6:2016, TRGS 401", RiskReduction: 35}, - {ID: "M458", ReductionType: "design", SubType: "inherent_safety", - NameDE: "Antistatik-Ausstattung Textilmaschine", NameEN: "Anti-static equipment for textile machine", - DescriptionDE: "Erdung aller leitfaehigen Teile, antistatische Transportbaender, Luftbefeuchtung > 50% rF.", - HazardCategory: "electrical", NormRef: "EN ISO 11111-1:2016, EN 1127-1", RiskReduction: 20}, - {ID: "M459", ReductionType: "information", SubType: "instruction", - NameDE: "Ergonomie-Unterweisung Textilarbeitsplaetze", NameEN: "Ergonomics training textile workstations", - DescriptionDE: "Unterweisung zu Arbeitshaltung, Pausenregelung und ergonomischer Arbeitsplatzgestaltung an Webmaschinen.", - HazardCategory: "ergonomic", NormRef: "EN ISO 11111-1:2016 Abschnitt 6", RiskReduction: 10}, - {ID: "M460", ReductionType: "design", SubType: "inherent_safety", - NameDE: "Erdung und Potentialausgleich Gewebeauslauf", NameEN: "Grounding and bonding at fabric exit", - DescriptionDE: "Leitfaehige Walzen und Ableitsysteme am Gewebeauslauf verhindern elektrostatische Aufladung.", - HazardCategory: "electrical", NormRef: "EN 1127-1, TRBS 2153", RiskReduction: 20}, - - // ══════════════════════════════════════════════════════════════ + {ID: "M452", ReductionType: "design", SubType: "inherent_safety", Name: "Walzenspalt-Schutzeinrichtung (EN ISO 11111-1)", Description: "Formschluessige Schutzeinrichtung am Walzenspalt mit Verriegelung die den Antrieb bei Oeffnung stoppt.", HazardCategory: "mechanical", NormReferences: []string{"EN ISO 11111-1:2016 Abschnitt 5.2"}}, + {ID: "M453", ReductionType: "protection", SubType: "safeguard", Name: "Not-Ruecklauf an Walzenpaaren", Description: "Sofortige Drehrichtungsumkehr bei Betaetigung des Not-Ruecklauf-Buegels am Walzenspalt.", HazardCategory: "mechanical", NormReferences: []string{"EN ISO 11111-1:2016 Abschnitt 5.2.4"}}, + {ID: "M454", ReductionType: "design", SubType: "inherent_safety", Name: "Geschlossene Absaugung am Kardierbereich", Description: "Vollstaendig eingehaustes Kardiersystem mit integrierter Faserstaub-Absaugung und Filterung. OEL unter 1 mg/m3.", HazardCategory: "material_environmental", NormReferences: []string{"EN ISO 11111-3:2016", "TRGS 900"}}, + {ID: "M455", ReductionType: "protection", SubType: "safeguard", Name: "Laermkapselung fuer Webmaschinen", Description: "Schalldaemmende Einhausung der Webmaschine. Reduktion um mindestens 15 dB(A) am Bedienerplatz.", HazardCategory: "noise_vibration", NormReferences: []string{"EN ISO 11111-7:2016"}}, + {ID: "M456", ReductionType: "protection", SubType: "safeguard", Name: "Beruehrungsschutz an Heissteilen der Fixiermaschine", Description: "Isolierung und Verkleidung aller Oberflaechen mit Temperaturen > 65 Grad C. Warnmarkierung.", HazardCategory: "thermal", NormReferences: []string{"EN ISO 11111-6:2016 Abschnitt 5.3"}}, + {ID: "M457", ReductionType: "protection", SubType: "safeguard", Name: "Geschlossenes Chemikalien-Dosiersystem", Description: "Automatische Dosierung und Zufuehrung von Faerbemitteln ueber geschlossene Leitungen. Vermeidung offener Wannen.", HazardCategory: "material_environmental", NormReferences: []string{"EN ISO 11111-6:2016", "TRGS 401"}}, + {ID: "M458", ReductionType: "design", SubType: "inherent_safety", Name: "Antistatik-Ausstattung Textilmaschine", Description: "Erdung aller leitfaehigen Teile, antistatische Transportbaender, Luftbefeuchtung > 50% rF.", HazardCategory: "electrical", NormReferences: []string{"EN ISO 11111-1:2016", "EN 1127-1"}}, + {ID: "M459", ReductionType: "information", SubType: "instruction", Name: "Ergonomie-Unterweisung Textilarbeitsplaetze", Description: "Unterweisung zu Arbeitshaltung, Pausenregelung und ergonomischer Arbeitsplatzgestaltung an Webmaschinen.", HazardCategory: "ergonomic", NormReferences: []string{"EN ISO 11111-1:2016 Abschnitt 6"}}, + {ID: "M460", ReductionType: "design", SubType: "inherent_safety", Name: "Erdung und Potentialausgleich Gewebeauslauf", Description: "Leitfaehige Walzen und Ableitsysteme am Gewebeauslauf verhindern elektrostatische Aufladung.", HazardCategory: "electrical", NormReferences: []string{"EN 1127-1", "TRBS 2153"}}, // Landmaschinen (M461-M474) - // ══════════════════════════════════════════════════════════════ - {ID: "M461", ReductionType: "protection", SubType: "safeguard", - NameDE: "Zapfwellenschutzhuelse nach ISO 5674", NameEN: "PTO guard per ISO 5674", - DescriptionDE: "Formschluessige Schutzhuelse ueber Gelenkwelle und Zapfwellenstummel mit integrierten Sicherheitsketten.", - HazardCategory: "mechanical", NormRef: "ISO 5674:2004, ISO 4254-1:2013 Abschnitt 4.7", RiskReduction: 45}, - {ID: "M462", ReductionType: "design", SubType: "inherent_safety", - NameDE: "Automatische Zapfwellenabschaltung", NameEN: "Automatic PTO shutdown", - DescriptionDE: "Sensorbasierte Erkennung der Schutzhuelsen-Position. Automatische Abschaltung der Zapfwelle bei entfernter Huelse.", - HazardCategory: "mechanical", NormRef: "ISO 4254-1:2013", RiskReduction: 35}, - {ID: "M463", ReductionType: "design", SubType: "inherent_safety", - NameDE: "ROPS/FOPS Ueberrollschutzstruktur", NameEN: "ROPS/FOPS rollover protection", - DescriptionDE: "Normgerechte Ueberrollschutzstruktur (ROPS) mit Sicherheitsgurt. Bei Forstarbeiten zusaetzlich FOPS.", - HazardCategory: "mechanical", NormRef: "ISO 3471:2008, ISO 4254-1:2013 Abschnitt 4.3", RiskReduction: 50}, - {ID: "M464", ReductionType: "information", SubType: "instruction", - NameDE: "Hangfahrt-Schulung und Neigungsanzeige", NameEN: "Slope driving training and inclinometer", - DescriptionDE: "Elektronische Neigungsanzeige in der Kabine mit Warnung ab 15 Grad. Pflichtschulung fuer Hangfahrten.", - HazardCategory: "mechanical", NormRef: "ISO 4254-1:2013 Abschnitt 6", RiskReduction: 15}, - {ID: "M465", ReductionType: "protection", SubType: "safeguard", - NameDE: "Schneidwerk-Verriegelung mit Nachlaufueberwachung", NameEN: "Cutting header interlock with rundown monitoring", - DescriptionDE: "Verriegelter Zugang zum Schneidwerk. Oeffnung erst moeglich nach Stillstandskontrolle (Nachlauf < 5s).", - HazardCategory: "mechanical", NormRef: "ISO 4254-7:2017 Abschnitt 4.3", RiskReduction: 40}, - {ID: "M466", ReductionType: "design", SubType: "inherent_safety", - NameDE: "Berstschutz-Hydraulikleitungen", NameEN: "Hydraulic hose burst protection", - DescriptionDE: "Schlauchbruchventile an allen heb-/senk-relevanten Hydraulikzylindern. Schlauchleitungen mit Gewebeschlauch-Ueberziehern.", - HazardCategory: "pneumatic_hydraulic", NormRef: "ISO 4254-1:2013 Abschnitt 4.10", RiskReduction: 35}, - {ID: "M467", ReductionType: "protection", SubType: "safeguard", - NameDE: "Geschlossenes Befuellsystem Feldspritze", NameEN: "Closed transfer system for sprayer", - DescriptionDE: "Geschlossenes Chemikalien-Umfuellsystem (CTS) verhindert Hautkontakt beim Befuellen der Feldspritze.", - HazardCategory: "material_environmental", NormRef: "ISO 4254-6:2020, Pflanzenschutz-Anwendungsverordnung", RiskReduction: 40}, - {ID: "M468", ReductionType: "design", SubType: "inherent_safety", - NameDE: "Explosionsschutz Getreidesilo nach ATEX", NameEN: "Explosion protection grain silo per ATEX", - DescriptionDE: "ATEX-konforme Ausfuehrung: Explosionsdruckentlastung, Funkenerkennung, Inertisierung, Erdung aller Metallteile.", - HazardCategory: "fire_explosion", NormRef: "ATEX 2014/34/EU, EN 14491", RiskReduction: 45}, - {ID: "M469", ReductionType: "information", SubType: "instruction", - NameDE: "Silo-Zugangsverfahren mit Rettungskonzept", NameEN: "Silo entry procedure with rescue plan", - DescriptionDE: "Schriftliches Verfahren fuer Silobetreten: Freimessung, Anseilschutz, Sicherungsposten, Rettungsgeraet bereitstellen.", - HazardCategory: "mechanical", NormRef: "DGUV Regel 113-004, ISO 4254-1:2013", RiskReduction: 20}, - {ID: "M470", ReductionType: "design", SubType: "inherent_safety", - NameDE: "Personen-Erkennung autonomer Traktor", NameEN: "Person detection for autonomous tractor", - DescriptionDE: "Redundantes Personenerkennungssystem (LiDAR + Kamera + Radar) mit automatischem Not-Stopp. PL d nach EN ISO 13849.", - HazardCategory: "mechanical", NormRef: "ISO 18497:2018, ISO 4254-1:2013", RiskReduction: 45}, - {ID: "M471", ReductionType: "protection", SubType: "safeguard", - NameDE: "Geo-Fencing und Geschwindigkeitsbegrenzung", NameEN: "Geo-fencing and speed limitation", - DescriptionDE: "GPS-basierte Begrenzung des Einsatzgebiets. Automatische Geschwindigkeitsreduktion bei Annaeherung an Grenzbereiche.", - HazardCategory: "mechanical", NormRef: "ISO 18497:2018", RiskReduction: 25}, - {ID: "M472", ReductionType: "protection", SubType: "safeguard", - NameDE: "Schallisolierte Fahrerkabine", NameEN: "Sound-insulated cab", - DescriptionDE: "Fahrerkabine mit Schalldaemmung auf < 80 dB(A) Innenpegel. Klimaanlage fuer geschlossenen Betrieb.", - HazardCategory: "noise_vibration", NormRef: "ISO 4254-1:2013 Abschnitt 4.12", RiskReduction: 25}, - {ID: "M473", ReductionType: "design", SubType: "inherent_safety", - NameDE: "Schwingungsgedaempfter Fahrersitz", NameEN: "Vibration-damped driver seat", - DescriptionDE: "Aktiv oder passiv gefederter Fahrersitz mit Schwingungsdaempfung. Grenzwert A(8) < 0,5 m/s2 nach EU Vibrationsrichtlinie.", - HazardCategory: "noise_vibration", NormRef: "ISO 5007:2003, Richtlinie 2002/44/EG", RiskReduction: 20}, - {ID: "M474", ReductionType: "protection", SubType: "safeguard", - NameDE: "Mechanische Abstuetzung Dreipunktanbau", NameEN: "Mechanical support for three-point hitch", - DescriptionDE: "Mechanische Stuetzvorrichtung (Stuetzbock) die unter angehobene Anbaugeraete gestellt wird vor Arbeiten im Gefahrbereich.", - HazardCategory: "mechanical", NormRef: "ISO 4254-1:2013 Abschnitt 4.8", RiskReduction: 30}, + {ID: "M461", ReductionType: "protection", SubType: "safeguard", Name: "Zapfwellenschutzhuelse nach ISO 5674", Description: "Formschluessige Schutzhuelse ueber Gelenkwelle und Zapfwellenstummel mit integrierten Sicherheitsketten.", HazardCategory: "mechanical", NormReferences: []string{"ISO 5674:2004", "ISO 4254-1:2013 Abschnitt 4.7"}}, + {ID: "M462", ReductionType: "design", SubType: "inherent_safety", Name: "Automatische Zapfwellenabschaltung", Description: "Sensorbasierte Erkennung der Schutzhuelsen-Position. Automatische Abschaltung bei entfernter Huelse.", HazardCategory: "mechanical", NormReferences: []string{"ISO 4254-1:2013"}}, + {ID: "M463", ReductionType: "design", SubType: "inherent_safety", Name: "ROPS/FOPS Ueberrollschutzstruktur", Description: "Normgerechte Ueberrollschutzstruktur (ROPS) mit Sicherheitsgurt. Bei Forstarbeiten zusaetzlich FOPS.", HazardCategory: "mechanical", NormReferences: []string{"ISO 3471:2008", "ISO 4254-1:2013 Abschnitt 4.3"}}, + {ID: "M464", ReductionType: "information", SubType: "instruction", Name: "Hangfahrt-Schulung und Neigungsanzeige", Description: "Elektronische Neigungsanzeige in der Kabine mit Warnung ab 15 Grad. Pflichtschulung fuer Hangfahrten.", HazardCategory: "mechanical", NormReferences: []string{"ISO 4254-1:2013 Abschnitt 6"}}, + {ID: "M465", ReductionType: "protection", SubType: "safeguard", Name: "Schneidwerk-Verriegelung mit Nachlaufueberwachung", Description: "Verriegelter Zugang zum Schneidwerk. Oeffnung erst moeglich nach Stillstandskontrolle.", HazardCategory: "mechanical", NormReferences: []string{"ISO 4254-7:2017 Abschnitt 4.3"}}, + {ID: "M466", ReductionType: "design", SubType: "inherent_safety", Name: "Berstschutz-Hydraulikleitungen", Description: "Schlauchbruchventile an heb-/senk-relevanten Hydraulikzylindern. Schlauchleitungen mit Gewebeschlauch-Ueberziehern.", HazardCategory: "pneumatic_hydraulic", NormReferences: []string{"ISO 4254-1:2013 Abschnitt 4.10"}}, + {ID: "M467", ReductionType: "protection", SubType: "safeguard", Name: "Geschlossenes Befuellsystem Feldspritze", Description: "Geschlossenes Chemikalien-Umfuellsystem (CTS) verhindert Hautkontakt beim Befuellen der Feldspritze.", HazardCategory: "material_environmental", NormReferences: []string{"ISO 4254-6:2020", "Pflanzenschutz-Anwendungsverordnung"}}, + {ID: "M468", ReductionType: "design", SubType: "inherent_safety", Name: "Explosionsschutz Getreidesilo nach ATEX", Description: "ATEX-konforme Ausfuehrung: Explosionsdruckentlastung, Funkenerkennung, Inertisierung, Erdung.", HazardCategory: "fire_explosion", NormReferences: []string{"ATEX 2014/34/EU", "EN 14491"}}, + {ID: "M469", ReductionType: "information", SubType: "instruction", Name: "Silo-Zugangsverfahren mit Rettungskonzept", Description: "Schriftliches Verfahren fuer Silobetreten: Freimessung, Anseilschutz, Sicherungsposten.", HazardCategory: "mechanical", NormReferences: []string{"DGUV Regel 113-004", "ISO 4254-1:2013"}}, + {ID: "M470", ReductionType: "design", SubType: "inherent_safety", Name: "Personen-Erkennung autonomer Traktor", Description: "Redundantes Personenerkennungssystem (LiDAR + Kamera + Radar) mit automatischem Not-Stopp. PL d.", HazardCategory: "mechanical", NormReferences: []string{"ISO 18497:2018", "ISO 4254-1:2013"}}, + {ID: "M471", ReductionType: "protection", SubType: "safeguard", Name: "Geo-Fencing und Geschwindigkeitsbegrenzung", Description: "GPS-basierte Begrenzung des Einsatzgebiets. Automatische Geschwindigkeitsreduktion bei Annaeherung.", HazardCategory: "mechanical", NormReferences: []string{"ISO 18497:2018"}}, + {ID: "M472", ReductionType: "protection", SubType: "safeguard", Name: "Schallisolierte Fahrerkabine", Description: "Fahrerkabine mit Schalldaemmung auf < 80 dB(A) Innenpegel. Klimaanlage fuer geschlossenen Betrieb.", HazardCategory: "noise_vibration", NormReferences: []string{"ISO 4254-1:2013 Abschnitt 4.12"}}, + {ID: "M473", ReductionType: "design", SubType: "inherent_safety", Name: "Schwingungsgedaempfter Fahrersitz", Description: "Aktiv oder passiv gefederter Fahrersitz mit Schwingungsdaempfung. A(8) < 0.5 m/s2.", HazardCategory: "noise_vibration", NormReferences: []string{"ISO 5007:2003", "Richtlinie 2002/44/EG"}}, + {ID: "M474", ReductionType: "protection", SubType: "safeguard", Name: "Mechanische Abstuetzung Dreipunktanbau", Description: "Mechanische Stuetzvorrichtung die unter angehobene Anbaugeraete gestellt wird vor Arbeiten im Gefahrbereich.", HazardCategory: "mechanical", NormReferences: []string{"ISO 4254-1:2013 Abschnitt 4.8"}}, } }