Brinkhaus-Tools
Bibliothek zur Anbindung eigener Anwendungen an das FleetManagement — verfügbar für Python, Rust, C++ und JavaScript.
Installation
Brinkhaus-Tools ist in vier Sprachen verfügbar. Alle Varianten teilen dieselbe Versionsnummer und sprechen dasselbe Fleet-Protokoll — Details in der API-Referenz.
Python
pip install brinkhaustools Rust
# Cargo.toml
[dependencies]
brinkhaustools = { git = "https://gitlab.com/brinkhaus/brinkhaustools.git", tag = "0.17.0" }
# Mit Fleet-Management-Client:
brinkhaustools = { git = "https://gitlab.com/brinkhaus/brinkhaustools.git", tag = "0.17.0", features = ["fleet"] } Der Crate wird bewusst als Git-Dependency aus dem öffentlichen Repository bezogen — eine Veröffentlichung auf crates.io ist mittelfristig nicht geplant.
C++
# CMakeLists.txt
include(FetchContent)
FetchContent_Declare(
brinkhaustools
GIT_REPOSITORY https://gitlab.com/brinkhaus/brinkhaustools.git
GIT_TAG 0.17.0
SOURCE_SUBDIR cpp
)
FetchContent_MakeAvailable(brinkhaustools)
target_link_libraries(myapp PRIVATE brinkhaustools::brinkhaustools) JavaScript
git clone https://gitlab.com/brinkhaus/brinkhaustools.git
# js/src/brinkhaus-tools.js in das eigene Projekt übernehmen — keine Abhängigkeiten, browserkompatibel Die folgenden Beispiele zeigen die Python-Variante; die API ist in allen Sprachen gleich aufgebaut.
App erstellen
Die App-Klasse ist der zentrale Einstiegspunkt. Sie initialisiert automatisch Settings, Logging, Selbstdiagnose, Status-Reporting und die Fleet-Anbindung.
from brinkhaustools.common import App
app = App("MeineAnwendung", "1.0.0")
app.start()
# ... Anwendungslogik ...
app.wait() # Blockiert bis Shutdown-Signal Selbstdiagnose
Mit der SelfDiagnosisEngine melden Sie Fehler und lösen sie auf. Meldungen erscheinen im FleetManager-Dashboard als Ampel-Status.
from brinkhaustools.common import App
app = App("MeineAnwendung", "1.0.0")
diag = app.self_diagnosis
MQTT_ERROR_CODE = 1001
try:
mqtt_client.connect(host, port)
diag.clear(MQTT_ERROR_CODE)
except Exception as e:
diag.notify(MQTT_ERROR_CODE, f"MQTT-Verbindung fehlgeschlagen: {e}",
critical=True) notify() setzt eine Diagnosemeldung,
clear() löst sie auf.
Solange eine kritische Meldung aktiv ist, zeigt die Ampel Rot.
Status-Reporting
Registrieren Sie eigene StatusSource-Objekte, um Laufzeitinformationen an den FleetManager zu senden.
from brinkhaustools.common import App
from brinkhaustools.common.status import StatusSource
class MqttStatus(StatusSource):
def get_status(self):
return {
"MQTT-Host": f"{self.host}:{self.port}",
"Connected": self.connected,
}
app = App("MeineAnwendung", "1.0.0")
app.status_engine.register_source(MqttStatus()) Die StatusEngine sammelt periodisch alle registrierten Quellen und sendet den Snapshot an den FleetManager.
Fleet-Anbindung konfigurieren
Legen Sie eine Konfigurationsdatei unter fleetManagementData/config.json an:
{
"base_url": "https://fleet.brinkhaus-gmbh.de",
"token": "fmt_IHR_TOKEN",
"customer_name": "ihr-kunde",
"machine": "ihr-server",
"heartbeat_interval_sec": 60
} Die App erkennt die Konfiguration automatisch und beginnt, Heartbeats, Diagnosemeldungen und Status-Snapshots an den FleetManager zu senden.
Changelog
0.17.0 2026-07-01
Hinzugefügt
- [Python, Rust, C++] StatusValue: selbstbeschreibende Status-Werte mit Typ, optionaler Einheit, Label und Hinweis — Konstruktoren u. a. für boolean, integer, number, text, enum, timestamp, duration, bytes, percent und temperature
- [Python, Rust, C++] StatusSource-Quellen können StatusValue überall dort zurückgeben, wo bisher ein einfacher Wert stand — bestehende Quellen mit reinen Skalaren funktionieren unverändert weiter, keine Migration nötig
0.16.0 2026-06-19
Hinzugefügt
- [Rust] LoggingHelper::install(config) registriert den Helper als globales log-Backend — log::info!/warn!/error! landen jetzt in rotierender Log-Datei, Ring-Buffer und Konsole statt ins Leere zu laufen
- [Rust] LoggingConfig.console (Standard: aktiv) spiegelt jede formatierte Log-Zeile zusätzlich auf stdout — für Headless- oder Service-Betrieb abschaltbar
0.15.0 2026-06-16
Hinzugefügt
- [Python] register_command(): Commands mit Parameter-Spezifikation und dynamischem Options-Provider (parameter_options) — die Auswahlliste wird bei jedem Status-Snapshot neu ermittelt, z. B. für ein Firmware-Deployment mit Live-Versionsauswahl statt einem festen Button pro Version
- [Python] Command-Callbacks können ein Argument annehmen und erhalten die Bediener-Auswahl als Payload — Callbacks ohne Argument funktionieren unverändert weiter
0.14.0 2026-06-12
Hinzugefügt
- [Rust] HeartbeatEngine::expired(): benennt die überfälligen Heartbeats, damit Watchdogs gezielt auf die betroffenen Komponenten reagieren können (Diagnose-Codes, Neustart-Pfade)
- [Rust] Konfigurierbare StatusSource-Knotennamen: with_status_name() für SelfDiagnosisEngine und HeartbeatEngine — für Konsumenten mit eigenen Status-Bäumen
- [Rust] StatusEngine::start_background(): funktionierende Hintergrund-Sammelschleife mit sauberem Ende bei Shutdown oder stop()
Geändert
- [Rust] StatusEngine::start() ist veraltet (war ein wirkungsloser No-op) — stattdessen start_background() oder run_status_loop() verwenden
0.13.0 2026-06-10
Hinzugefügt
- [C++] Settings: Integritätsprüfung beim Laden, persistenter Datenverlust-Breadcrumb (__data_loss__) und recoveredFrom()-Tracking — Gleichstand mit der Power-Off-Härtung von Python/Rust (neue API: recoveredFrom(), hasDataLossFlag(), dataLossInfo(), clearDataLossFlag())
Geändert
- [All] Status-Payload: das message-Feld ist jetzt optional und wird bei leerem Inhalt weggelassen
0.12.0 2026-06-10
Hinzugefügt
- [Rust, C++] Fleet-Hierarchie wie in Python: Heartbeats übertragen optional location (Aufstellungsort) sowie group/group_priority/sort_priority — konfigurierbar über den App-Builder, jedes Feld wird nur bei Belegung gesendet, das Paketformat bleibt abwärtskompatibel
0.11.0 2026-06-10
Hinzugefügt
- [All] Umgebungsvariable FLEET_TOKEN übersteuert den Fleet-Token aus der Config-Datei — Container können das Secret per Environment injizieren, statt es in die gemountete Config zu schreiben (Python, Rust und C++)
0.10.0 2026-06-10
Behoben
- [C++] Fleet-Client hat nie gesendet: FleetMonitorClient::start() / StatusMonitor::start() starten jetzt die Heartbeat- und Controller-Threads, sodass Heartbeats, Diagnosen und Status den FleetManager erreichen
- [C++] TLS-Peer- und Host-Verifikation bei Fleet-HTTPS-Requests jetzt explizit aktiv, mit optionalem CA-Bundle (FleetClientConfig::ca_bundle oder FLEET_CA_BUNDLE)
- [Rust] Gleicher latenter Fehler im Fleet-Monitor: run_fleet_loops() treibt jetzt Heartbeat- und Controller-Schleifen an; Verbindungsdiagnose (Code 7002) und Config-Retry waren zuvor toter Code
Hinzugefügt
- [C++] HeartbeatEngine (Watchdog für hängende Komponenten), LoggingHelper (rotierende Log-Datei + Ring-Buffer, opt-in) und Settings mit absturzsicherem atomarem Speichern — Gleichstand mit Python/Rust
- [C++] App-Builder: optionale settingsFile(), logging() und heartbeatTimeout(); HeartbeatEngine als Status-Quelle registriert
- [Rust] Zuschaltbares Fleet-Reporting in App über AppBuilder::fleet_config() (hinter dem fleet-Feature) — startet die Schleifen automatisch mit App::start()
0.5.0 2026-05-19
Hinzugefügt
- [Python] register_command(): Anwendungen können fernaufrufbare Commands (z. B. reboot-edge) am FleetManager anbieten — der Katalog wird im Status-Snapshot mitgeliefert, Callbacks laufen im Worker-Thread, ACK wahlweise nach Abschluss (post) oder vorab (pre) für destruktive Commands wie Host-Reboots
- [Python, Rust] Settings: Integritäts-Trailer (SHA-256 über kanonisches JSON) bei jedem Speichern, Prüfung beim Laden — bei Abweichung greift die bestehende .bak/.bak2-Wiederherstellungskette
- [Python, Rust] Settings: recovered_from-Tracking (primary/bak/bak2/fresh/…) plus Self-Heal-Save nach erfolgreichem Fallback, der Haupt- und Backup-Kette wieder aufbaut
- [Python, Rust] Settings: persistenter __data_loss__-Breadcrumb, wenn alle drei Dateien unbrauchbar sind — überlebt Reboots und treibt die Selbstdiagnose, bis er explizit gelöscht wird (has_data_loss_flag(), data_loss_info(), clear_data_loss_flag())
Behoben
- [Python, Rust] Power-Off-Robustheit: Nach einem Stromausfall wurden die Settings bisher still aus Code-Defaults neu aufgebaut und die Backups überschrieben — der Datenverlust ist jetzt sichtbar und bleibt über Reboots erhalten
0.4.0 2026-04-22
Behoben
- [Python] FleetMonitorClient wertet jetzt jeden 2xx-Status als Erfolg — die 202-Antwort von /diagnostics wurde zuvor als Verbindungsfehler eingestuft und zeigte dauerhaft "FleetManager: Not connected" (Diagnose-Code 7002), obwohl die Daten ankamen
Hinzugefügt
- [C++] Neue C++-Variante: SelfDiagnosisEngine, StatusEngine, ShutdownHandler, VersionInformation, FleetMonitorClient, StatusMonitor und App-Builder — pures C++17 mit nlohmann/json und libcurl, ohne Qt-Abhängigkeit
- [Rust] Core- und Fleet-Crates zu einem Crate mit fleet-Feature-Flag zusammengeführt
- [All] Automatisch generierte API-Referenz für Rust (rustdoc), JavaScript (jsdoc2md) und C++ (Doxygen)
Geändert
- [JS] Distribution als Git-Dependency statt über die npm-Registry
0.3.0 2026-03-11
Hinzugefügt
- FleetMonitorClient: Empfang von Agent-Commands über Ingest-Response-Body (piggyback)
- FleetMonitorClient: Callback für eingehende Commands registrieren
- FleetMonitorClient: Bestätigung ausgeführter Commands an FleetManager
0.2.5 2026-03-07
Behoben
- Settings: Atomares Schreiben absturzsicher — fsync auf Datei und Verzeichnis
- Settings: Zweite Backup-Generation verhindert Datenverlust bei zwei aufeinanderfolgenden Abstürzen
0.2.4 2026-03-06
Hinzugefügt
- CHANGELOG.md und RELEASING.md für einheitlichen Release-Prozess
0.2.2 2026-03-01
Hinzugefügt
- Config-Retry und Client-Rekonfiguration für späte Fleet-Config-Verfügbarkeit
- Tests für send_snapshot und StatusSource ABC Compliance
0.2.1 2026-03-01
Hinzugefügt
- Vollständiges Status-Snapshot-Reporting an Fleet Management
0.2.0 2026-03-01
Geändert
- StatusSource-Implementierungen erben jetzt von ABC
0.1.1 2026-02-28
Hinzugefügt
- Fleet Management Dokumentation: Config-Format, Token, Endpunkte
Geändert
- MQTT-Referenzen durch HTTPS ersetzt
Kostenlos starten — 5 Geräte inklusive
Fleet Monitoring und Security Compliance in unter 10 Minuten. Keine Kreditkarte nötig.
Sie möchten mit einem Fachmann sprechen?
Klicken Sie den Link und wir kommen kurz ins Gespräch.
Termin vereinbaren →