← Zurück zur Übersicht

🏗️ Architektur & Konzepte

Konfigurationssystem, App-Architektur, DGUV-Konformität
Version 2.5 · März 2026

1. App-Architektur (Flutter)

GIS Care folgt einer MVVM-Architektur (Model - View - ViewModel) mit Riverpod als State-Management-Lösung.

lib/
├── main.dart                    # App-Entry-Point
├── app.dart                     # MaterialApp + Routing
├── models/                      # Datenmodelle
│   ├── emergency_contact.dart
│   └── sensor_data.dart
├── services/                    # Business-Logik / API-Kommunikation
│   ├── config_sync_service.dart # Server-Config → App-State
│   ├── api_service.dart         # HTTP-Client für Server-API
│   └── ...
├── viewmodels/                  # Riverpod StateProvider / StateNotifier
│   ├── server_config_providers.dart   # Alle serverseitig gesteuerten Optionen
│   ├── lone_worker_providers.dart     # Schutz-Logik, Alarme, Szenarien
│   └── ...
├── views/                       # UI-Screens (Seiten)
│   ├── lone_worker_page.dart
│   ├── settings_page.dart
│   └── ...
├── widgets/                     # Wiederverwendbare UI-Komponenten
├── theme/                       # Theming (Dark/Light)
└── utils/                       # Hilfsfunktionen

State-Management

Alle server-gesteuerten Einstellungen werden über Riverpod StateProvider in server_config_providers.dart gehalten. Der ConfigSyncService schreibt die Serverwerte beim Login und periodisch in diese Provider. Views und ViewModels lesen sie per ref.watch() / ref.read().

Prinzip: Der Server ist Single Source of Truth für alle Konfigurationen. Die App hat Standardwerte als Fallback, überschreibt diese aber sofort nach dem Sync.

2. Konfigurationssystem

Das Konfigurationssystem verbindet Admin-Panel, Server-Datenbank und Flutter-App in einer durchgängigen Pipeline:

Admin-Panel (admin.js) │ CONFIG_META definiert Labels, Beschreibungen, Tooltips │ Benutzer ändert Werte → saveAllConfig() ▼ Server-API (config.php) │ POST /api/config.php?action=set_bulk │ Schreibt in DB-Tabelle `app_config` ▼ Datenbank (app_config) │ config_group | config_key | config_value | value_type │ Gruppiert: general, sensor, protection, alarm, ui, branding, dguv ▼ App-Sync (config_sync_service.dart) │ GET /api/config.php?action=app_sync │ _applyConfig() → schreibt in Riverpod StateProvider ▼ Flutter-App (server_config_providers.dart) │ ref.watch(showSensorsTabProvider) → UI passt sich an │ ref.read(storeGpsOnAlarmProvider) → Alarm-Logik

Konfigurations-Gruppen (Tabs im Admin-Panel)

GruppeTab-NameZweck
general🏢 AllgemeinApp-Name, Version, Firmenname, Sprache, Heartbeat
sensor📡 SensorenAbtastrate, Zeitfenster, Datenpunkte
protection🛡️ SchutzProfil, Berechtigungen, Schutzzwang
alarm🚨 AlarmServer-Meldung, GPS, Sensordaten bei Alarm
ui🎨 OberflächeDark Mode, Tab-Sichtbarkeit, Startseite
branding🎨 Branding & ImpressumLogo, Berichte, Firmendaten, Impressum
dguv📋 DGUVAkku-Warnung, Funktionsprüfung, Schichtdauer

3. Konfigurationsschlüssel (Referenz)

Übersicht aller Konfigurationsschlüssel mit ihrem Status:

🏢 Allgemein

KeyTypStatusBeschreibung
app_namestringServer-onlyName der Anwendung
app_versionstringServer-onlyAktuelle App-Version
company_namestringServer-onlyFirmenname
default_languagestringServer-onlyStandard-Sprache
heartbeat_interval_secintAktivHeartbeat-Intervall (Sekunden)

📡 Sensoren

KeyTypStatusBeschreibung
default_sampling_ratestringAktivAbtastrate (fastest/game/ui/normal)
default_graph_windowintAktivDiagramm-Zeitfenster (Sekunden)
max_data_pointsintGeplantMax. Datenpunkte im Speicher
auto_start_sensorsboolGeplantSensoren beim App-Start starten

🛡️ Schutz

KeyTypStatusBeschreibung
default_profile_idintServer-onlyStandard-Schutzprofil-ID
allow_profile_changeboolAktivBenutzer darf Profil wechseln
force_protection_onboolAktivSchutz kann nicht deaktiviert werden
allow_threshold_changeboolAktivBenutzer darf Schwellwerte anpassen
allow_scenario_toggleboolAktivBenutzer darf Szenarien umschalten

🚨 Alarm

KeyTypStatusBeschreibung
send_to_serverboolAktivAlarme an Server melden
store_gps_on_alarmboolAktivGPS-Position bei Alarm speichern
store_sensor_databoolAktivSensordaten bei Alarm mitsenden
max_alarm_historyintGeplantMax. lokale Alarm-Historie

🎨 Oberfläche

KeyTypStatusBeschreibung
dark_mode_defaultboolAktivDark Mode als Standard
show_sensors_tabboolAktivSensoren-Tab anzeigen
show_analysis_tabboolAktivAnalyse-Tab anzeigen
show_dashboard_tabboolAktivDashboard-Tab anzeigen
show_settings_detailsboolAktivTechnische Einstellungen anzeigen
start_pagestringAktivStartseite (protection/dashboard)
show_sensor_detailsboolGeplantErweiterte Sensorinfos
enable_exportboolGeplantDatenexport erlauben
enable_recordingboolGeplantAufzeichnung erlauben

🎨 Branding & Impressum

KeyTypStatusBeschreibung
logo_urlstringServer-onlyURL zum Firmenlogo
report_headerstringServer-onlyKopfzeile für PDF-Berichte
report_footerstringServer-onlyFußzeile für PDF-Berichte
company_addressstringServer-onlyFirmenadresse
company_phonestringServer-onlyFirmentelefon
company_emailstringServer-onlyFirmen-E-Mail
company_websitestringServer-onlyWebseite
impressum_*stringServer-onlyImpressum-Pflichtangaben (§5 TMG)

📋 DGUV 112-139

KeyTypStatusBeschreibung
battery_warning_thresholdintAktivAkku-Warnschwelle in % (§4.5)
require_functional_testboolAktivFunktionsprüfung erforderlich (§4.7)
max_shift_duration_hoursintAktivMax. Schichtdauer in Stunden (§4.8)
alarm_response_timeout_secintAktivReaktionszeit Empfangszentrale (§4.3)
dguv_compliance_modeboolAktivDGUV-Konformitätsmodus (Master-Toggle)
Hinweis: Keys mit Status Geplant sind im Admin-Panel konfigurierbar, werden aber noch nicht von der App ausgewertet. Sie sind für zukünftige Funktionen vorgesehen.

4. Alleinarbeiterschutz-Szenarien

GIS Care erkennt Gefahrensituationen durch verschiedene Sensor-Szenarien:

SzenarioSensorAuslöserDGUV-Bezug
🔻 SturzerkennungBeschleunigungssensorPlötzliche Beschleunigungsspitze + Aufprallmuster§4.4 Personennotsignal
😴 BewusstlosigkeitBeschleunigungssensorKeine Mikro-Bewegungen über einstellbare Dauer§4.4 Personennotsignal
⏸️ BewegungslosigkeitSchrittzählerKeine Schritte über einstellbare Dauer§4.4 Personennotsignal
📐 LageänderungBeschleunigungssensorDauerhafte Neigungsänderung (liegend)§4.4 Personennotsignal
💓 Check-inBenutzer meldet sich nicht innerhalb des Intervalls§4.2 Zeitüberwachung
🆘 Manueller SOSBenutzer drückt den SOS-Button§4.1 Willensabhängig
📡 VerbindungsverlustNetzwerkHeartbeat erreicht Server nicht§4.6 Kommunikationsweg

Schutzprofile

Ein Schutzprofil bündelt die Konfiguration aller Szenarien: welche aktiv sind, Schwellwerte, Empfindlichkeit und Verzögerungen. Profile werden zentral im Admin-Panel verwaltet und den Benutzern zugewiesen.

5. DGUV 112-139 Konformität

GIS Care implementiert die Anforderungen der DGUV 112-139 (Einsatz von Personen-Notsignal-Anlagen):

DGUV-ParagraphAnforderungUmsetzung in GIS Care
§4.1Willensabhängige AuslösungManueller SOS-Button in der App
§4.2Zeitgesteuerte ÜberwachungCheck-in / Heartbeat-Szenario
§4.3Zeitnahe Quittierungalarm_response_timeout_sec (Standard: 120s)
§4.4Willensunabhängige AuslösungSturz-, Bewusstlosigkeits-, Lageerkennungs-Szenarien
§4.5Energieversorgung überwachenbattery_warning_threshold (Standard: 20%)
§4.6Kommunikationsweg sichernVerbindungsverlust-Erkennung + Heartbeat
§4.7Funktionsprüfung vor Benutzungrequire_functional_test vor jeder Schicht
§4.8Schichtdauer begrenzenmax_shift_duration_hours (Standard: 8h)
Alarme und Heartbeats dürfen NIEMALS stille Fallbacks haben.
Jeder fehlgeschlagene Alarm oder Heartbeat muss als Fehler gemeldet werden — keine Unterdrückung, kein try/catch ohne Logging.

6. Alarm-Ablauf

Wenn ein Szenario auslöst, durchläuft der Alarm folgende Stufen:

Szenario-Erkennung (z.B. Sturz) ▼ Eskalationskette (configurable per Profil): 1. Warnung → App-Vibration + Ton (30s Reaktionszeit) 2. Kritisch → Push-Benachrichtigung (60s) 3. Notfall → Server-Alarm + GPS + Sensordaten ▼ Server empfängt Alarm (POST /api/alarms.php) ├── Speichert in DB (alarms-Tabelle) ├── GPS-Position (wenn store_gps_on_alarm = true) ├── Sensordaten-Snapshot (wenn store_sensor_data = true) └── Benachrichtigt Admin-Panel (Live-Polling) ▼ Admin/Customer-Admin quittiert Alarm └── Reaktionszeit wird gemessen (alarm_response_timeout_sec)

Entwarnung

Der Benutzer kann einen Alarm jederzeit vor der Eskalation abbrechen. Abgebrochene Alarme werden als Entwarnung gespeichert und im Admin-Panel mit ✅ markiert.

7. Sicherheitskonzept

Authentifizierung

Mandantentrennung

Datenschutz

API-Absicherung