# friedrichsigel/visitorcounter architecture

> Architecture diagram of the GitHub repository friedrichsigel/visitorcounter, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-11-09). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/friedrichsigel/visitorcounter
- Repository: https://github.com/friedrichsigel/visitorcounter

## Overview

Besucherzählsensor: Die Bedienoberfläche wählt Videoeingabe und Zählgeometrie und startet die Erkennungspipeline. Diese verarbeitet Hailo-Erkennungen, verfolgt Objekte, wertet Bewegungen an Linien oder Flächen aus und zeigt Ergebnisse an. Ergänzende Zweige konfigurieren Geometrie und Auto-Konfiguration, zeichnen Debug-Aufnahmen auf und übertragen Zählwerte per LoRaWAN oder MQTT. Die Belege zeigen nicht alle Laufzeitverdrahtungen; unbestätigte Verbindungen sind daher ausgelassen.

Main entry points: [`core/core.py`](https://github.com/friedrichsigel/visitorcounter/blob/main/core/core.py) (Video-Pipeline), [`core/app.py`](https://github.com/friedrichsigel/visitorcounter/blob/main/core/app.py) (Steuer-App), [`tabs/config_tab.py`](https://github.com/friedrichsigel/visitorcounter/blob/main/tabs/config_tab.py) (Geometrie-Seite), [`core/tracking.py`](https://github.com/friedrichsigel/visitorcounter/blob/main/core/tracking.py) (Objektverfolgung)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_ui["Bedienung &amp; Konfiguration"]
  node_app["Steuer-App<br/>[app.py]"]
  node_settings["App-Einstellungen<br/>[settings_store.py]"]
  node_inputui["Eingabeauswahl<br/>[input_tab.py]"]
  node_configui["Geometrie-Seite<br/>[config_tab.py]"]
  node_roi["Geometrie-Editor<br/>[roi_config_app.py]"]
  node_autoui["Auto-Konfig-Seite<br/>[autoconfig_tab.py]"]
  node_pipelineui["Pipeline-Steuerung"]
  node_dialogs["Dialoge<br/>[ctk_dialogs.py]"]
end

subgraph group_vision["Erkennung &amp; Zählung"]
  node_config["Zählkonfiguration<br/>[config.py]"]
  node_runtime["Video-Pipeline<br/>[core.py]"]
  node_compat["Hailo-Kompatibilität<br/>[hailo_compat.py]"]
  node_tracking["Objektverfolgung<br/>[tracking.py]"]
  node_counting["Geometrisches Zählen<br/>[counting.py]"]
  node_visual["Live-Visualisierung<br/>[visualization.py]"]
end

subgraph group_autoconfig["Auto-Konfiguration"]
  node_autocollect["Punktesammlung<br/>[auto_config.py]"]
  node_cluster["Clustering-Auswertung"]
  node_csv["CSV-Hilfen<br/>[csv_utils.py]"]
end

subgraph group_outputs["Aufzeichnung &amp; Übertragung"]
  node_recording["Debug-Aufzeichnung<br/>[recording.py]"]
  node_loraformat["LoRa-Nachrichtenformat<br/>[lora_message.py]"]
  node_loraloop["LoRa-Sender<br/>[lora_send_loop.py]"]
  node_mqtt["MQTT-Sender<br/>[mqtt_send_loop.py]"]
end

node_operator(("Bedienperson"))
node_camera(("Kamera / Video"))
node_hailo{{"Hailo-Erkennung"}}
node_lorahw{{"LoRa-Modul"}}
node_broker{{"MQTT-Dienst"}}

node_operator -->|"bedient"| node_app
node_app -->|"liest und speichert"| node_settings
node_app -->|"bindet ein"| node_inputui
node_app -->|"bindet ein"| node_configui
node_configui -->|"nutzt"| node_roi
node_app -->|"bindet ein"| node_autoui
node_app -->|"bindet ein"| node_pipelineui
node_configui -->|"zeigt"| node_dialogs
node_operator -->|"wählt Eingabe"| node_inputui
node_operator -->|"setzt Geometrie"| node_roi
node_pipelineui -->|"startet Subprozess"| node_runtime
node_camera -->|"liefert Videobilder"| node_runtime
node_hailo -->|"erkennt Objekte"| node_runtime
node_runtime -->|"nutzt Schnittstellen"| node_compat
node_runtime -->|"übergibt Erkennungen"| node_tracking
node_runtime -->|"zeichnet optional auf"| node_recording
node_tracking -->|"liest Einstellungen"| node_config
node_tracking -->|"wertet Bewegungen aus"| node_counting
node_runtime -->|"zeichnet Ergebnisse"| node_visual
node_configui -->|"konfiguriert Zählung"| node_config
node_autoui -->|"startet Sammlung"| node_pipelineui
node_tracking -->|"protokolliert Tracks"| node_autocollect
node_autocollect -->|"schreibt Punktdaten"| node_csv
node_cluster -->|"liest Sammlungsdaten"| node_autocollect
node_loraloop -->|"formt Nachrichten"| node_loraformat
node_loraloop -.->|"sendet über LoRaWAN"| node_lorahw
node_mqtt -->|"nutzt Senderlogik"| node_loraloop
node_mqtt -.->|"publiziert"| node_broker

click node_app "https://github.com/friedrichsigel/visitorcounter/blob/main/core/app.py"
click node_settings "https://github.com/friedrichsigel/visitorcounter/blob/main/tabs/settings_store.py"
click node_inputui "https://github.com/friedrichsigel/visitorcounter/blob/main/tabs/input_tab.py"
click node_configui "https://github.com/friedrichsigel/visitorcounter/blob/main/tabs/config_tab.py"
click node_roi "https://github.com/friedrichsigel/visitorcounter/blob/main/config_tool/roi_config_app.py"
click node_autoui "https://github.com/friedrichsigel/visitorcounter/blob/main/tabs/autoconfig_tab.py"
click node_pipelineui "https://github.com/friedrichsigel/visitorcounter/blob/main/tabs/pipeline_control.py"
click node_dialogs "https://github.com/friedrichsigel/visitorcounter/blob/main/config_tool/ctk_dialogs.py"
click node_config "https://github.com/friedrichsigel/visitorcounter/blob/main/core/config.py"
click node_runtime "https://github.com/friedrichsigel/visitorcounter/blob/main/core/core.py"
click node_compat "https://github.com/friedrichsigel/visitorcounter/blob/main/utils/hailo_compat.py"
click node_tracking "https://github.com/friedrichsigel/visitorcounter/blob/main/core/tracking.py"
click node_counting "https://github.com/friedrichsigel/visitorcounter/blob/main/core/counting.py"
click node_visual "https://github.com/friedrichsigel/visitorcounter/blob/main/utils/visualization.py"
click node_autocollect "https://github.com/friedrichsigel/visitorcounter/blob/main/config_tool/auto_config.py"
click node_cluster "https://github.com/friedrichsigel/visitorcounter/blob/main/config_tool/auto_config_clustering.py"
click node_csv "https://github.com/friedrichsigel/visitorcounter/blob/main/utils/csv_utils.py"
click node_recording "https://github.com/friedrichsigel/visitorcounter/blob/main/core/recording.py"
click node_loraformat "https://github.com/friedrichsigel/visitorcounter/blob/main/lora/lora_message.py"
click node_loraloop "https://github.com/friedrichsigel/visitorcounter/blob/main/lora/lora_send_loop.py"
click node_mqtt "https://github.com/friedrichsigel/visitorcounter/blob/main/lora/mqtt_send_loop.py"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_app,node_settings,node_inputui,node_configui,node_roi,node_autoui,node_pipelineui,node_dialogs toneBlue
class node_config,node_runtime,node_compat,node_tracking,node_counting,node_visual toneAmber
class node_autocollect,node_cluster,node_csv toneMint
class node_recording,node_loraformat,node_loraloop,node_mqtt toneRose
class node_operator,node_camera,node_hailo,node_lorahw,node_broker toneIndigo
```

## Components

### Bedienung & Konfiguration

- [Steuer-App](https://github.com/friedrichsigel/visitorcounter/blob/main/core/app.py): `core/app.py`
- [App-Einstellungen](https://github.com/friedrichsigel/visitorcounter/blob/main/tabs/settings_store.py): `tabs/settings_store.py`
- [Eingabeauswahl](https://github.com/friedrichsigel/visitorcounter/blob/main/tabs/input_tab.py): `tabs/input_tab.py`
- [Geometrie-Seite](https://github.com/friedrichsigel/visitorcounter/blob/main/tabs/config_tab.py): `tabs/config_tab.py`
- [Geometrie-Editor](https://github.com/friedrichsigel/visitorcounter/blob/main/config_tool/roi_config_app.py): `config_tool/roi_config_app.py`
- [Auto-Konfig-Seite](https://github.com/friedrichsigel/visitorcounter/blob/main/tabs/autoconfig_tab.py): `tabs/autoconfig_tab.py`
- [Pipeline-Steuerung](https://github.com/friedrichsigel/visitorcounter/blob/main/tabs/pipeline_control.py): `tabs/pipeline_control.py`
- [Dialoge](https://github.com/friedrichsigel/visitorcounter/blob/main/config_tool/ctk_dialogs.py): `config_tool/ctk_dialogs.py`

### Erkennung & Zählung

- [Zählkonfiguration](https://github.com/friedrichsigel/visitorcounter/blob/main/core/config.py): `core/config.py`
- [Video-Pipeline](https://github.com/friedrichsigel/visitorcounter/blob/main/core/core.py): `core/core.py`
- [Hailo-Kompatibilität](https://github.com/friedrichsigel/visitorcounter/blob/main/utils/hailo_compat.py): `utils/hailo_compat.py`
- [Objektverfolgung](https://github.com/friedrichsigel/visitorcounter/blob/main/core/tracking.py): `core/tracking.py`
- [Geometrisches Zählen](https://github.com/friedrichsigel/visitorcounter/blob/main/core/counting.py): `core/counting.py`
- [Live-Visualisierung](https://github.com/friedrichsigel/visitorcounter/blob/main/utils/visualization.py): `utils/visualization.py`

### Auto-Konfiguration

- [Punktesammlung](https://github.com/friedrichsigel/visitorcounter/blob/main/config_tool/auto_config.py): `config_tool/auto_config.py`
- [Clustering-Auswertung](https://github.com/friedrichsigel/visitorcounter/blob/main/config_tool/auto_config_clustering.py): `config_tool/auto_config_clustering.py`
- [CSV-Hilfen](https://github.com/friedrichsigel/visitorcounter/blob/main/utils/csv_utils.py): `utils/csv_utils.py`

### Aufzeichnung & Übertragung

- [Debug-Aufzeichnung](https://github.com/friedrichsigel/visitorcounter/blob/main/core/recording.py): `core/recording.py`
- [LoRa-Nachrichtenformat](https://github.com/friedrichsigel/visitorcounter/blob/main/lora/lora_message.py): `lora/lora_message.py`
- [LoRa-Sender](https://github.com/friedrichsigel/visitorcounter/blob/main/lora/lora_send_loop.py): `lora/lora_send_loop.py`
- [MQTT-Sender](https://github.com/friedrichsigel/visitorcounter/blob/main/lora/mqtt_send_loop.py): `lora/mqtt_send_loop.py`

### Other components

- **Bedienperson**
- **Kamera / Video**
- **Hailo-Erkennung**
- **LoRa-Modul**
- **MQTT-Dienst**

## Connections

- Bedienperson → Steuer-App: bedient (evidence: `README.md`)
- Steuer-App → App-Einstellungen: liest und speichert (evidence: `core/app.py`)
- Steuer-App → Eingabeauswahl: bindet ein (evidence: `core/app.py`)
- Steuer-App → Geometrie-Seite: bindet ein (evidence: `core/app.py`)
- Geometrie-Seite → Geometrie-Editor: nutzt (evidence: `tabs/config_tab.py`)
- Steuer-App → Auto-Konfig-Seite: bindet ein (evidence: `core/app.py`)
- Steuer-App → Pipeline-Steuerung: bindet ein (evidence: `core/app.py`)
- Geometrie-Seite → Dialoge: zeigt (evidence: `tabs/config_tab.py`)
- Bedienperson → Eingabeauswahl: wählt Eingabe (evidence: `README.md`)
- Bedienperson → Geometrie-Editor: setzt Geometrie (evidence: `README.md`)
- Pipeline-Steuerung → Video-Pipeline: startet Subprozess (evidence: `tabs/pipeline_control.py`)
- Kamera / Video → Video-Pipeline: liefert Videobilder (evidence: `README.md`)
- Hailo-Erkennung → Video-Pipeline: erkennt Objekte (evidence: `core/core.py`)
- Video-Pipeline → Hailo-Kompatibilität: nutzt Schnittstellen (evidence: `core/core.py`)
- Video-Pipeline → Objektverfolgung: übergibt Erkennungen (evidence: `core/core.py`)
- Video-Pipeline → Debug-Aufzeichnung: zeichnet optional auf (evidence: `core/core.py`)
- Objektverfolgung → Zählkonfiguration: liest Einstellungen (evidence: `core/tracking.py`)
- Objektverfolgung → Geometrisches Zählen: wertet Bewegungen aus (evidence: `core/tracking.py`)
- Video-Pipeline → Live-Visualisierung: zeichnet Ergebnisse (evidence: `core/core.py`)
- Geometrie-Seite → Zählkonfiguration: konfiguriert Zählung (evidence: `README.md`)
- Auto-Konfig-Seite → Pipeline-Steuerung: startet Sammlung (evidence: `tabs/pipeline_control.py`)
- Objektverfolgung → Punktesammlung: protokolliert Tracks (evidence: `config_tool/auto_config.py`)
- Punktesammlung → CSV-Hilfen: schreibt Punktdaten (evidence: `config_tool/auto_config.py`)
- Clustering-Auswertung → Punktesammlung: liest Sammlungsdaten (evidence: `config_tool/auto_config_clustering.py`)
- LoRa-Sender → LoRa-Nachrichtenformat: formt Nachrichten (evidence: `lora/lora_send_loop.py`)
- LoRa-Sender → LoRa-Modul: sendet über LoRaWAN (evidence: `README.md`)
- MQTT-Sender → LoRa-Sender: nutzt Senderlogik (evidence: `lora/mqtt_send_loop.py`)
- MQTT-Sender → MQTT-Dienst: publiziert (evidence: `lora/mqtt_send_loop.py`)
