Die Anwendung wird über data/config.json konfiguriert.
{
"app": {},
"api": {},
"admin": {},
"alerts": {
"webhooks": [],
"emails": []
},
"machines": []
}
appBeispiel:
{
"name": "Getränkeautomat Monitor",
"timezone": "Europe/Berlin",
"dashboard_refresh_seconds": 15,
"default_from_email": "monitor@example.local",
"base_path": ""
}
Felder:
name
timezone
dashboard_refresh_seconds
default_from_email
mail()base_path
/domain.de/auswertung/: "/auswertung"Beispiel für einen Betrieb unter https://domain.de/auswertung/:
{
"name": "Getränkeautomat Monitor",
"timezone": "Europe/Berlin",
"dashboard_refresh_seconds": 15,
"default_from_email": "monitor@example.local",
"base_path": "/auswertung"
}
apiBeispiel:
{
"bearer_token": "demo-esp32-token"
}
Felder:
bearer_token
adminBeispiel:
{
"username": "admin",
"password_hash": "$2y$10$..."
}
Felder:
username
password_hash
alerts.webhooksBeispiel:
[
{
"id": "lager-webhook",
"name": "Lager Webhook",
"url": "https://example.com/hooks/lager",
"enabled": true,
"headers": {
"X-App-Token": "replace-me"
}
}
]
Felder:
id
name
url
enabled
headers
alerts.emailsBeispiel:
[
{
"id": "lager-team",
"name": "Lager Team",
"address": "lager@example.com",
"enabled": true
}
]
Felder:
id
name
address
enabled
machinesHier werden alle Automaten definiert.
Beispiel:
[
{
"id": "automat-lobby",
"name": "Lobby Automat",
"location": "Erdgeschoss",
"slots": []
}
]
Felder:
id
name
location
slots
machines[].slotsJedes Fach repräsentiert einen Sensor und eine zugeordnete Produktposition.
Beispiel:
{
"sensor_id": "fach-a1",
"label": "A1",
"product_name": "Cola 0,5l",
"full_distance_mm": 80,
"empty_distance_mm": 360,
"distance_per_unit": 40,
"alert_below_units": 2
}
Felder:
sensor_id
label
product_name
full_distance_mm
empty_distance_mm
distance_per_unit
alert_below_units
Hinweis: Webhook- und Email-Alarme werden global über die alerts.webhooks und alerts.emails Konfiguration gesteuert. Alle aktivierten Webhooks und Emails erhalten Alarmbenachrichtigungen.
Für eine brauchbare Bestandsschätzung sollten pro Fach mindestens diese Werte sauber kalibriert werden:
full_distance_mm eintragen.empty_distance_mm eintragen.distance_per_unit eintragen.alert_below_units festlegen.Die Konfiguration unterstützt verschiedene Webhook-Typen:
Standard-Webhook, der ein JSON-Payload mit allen relevanten Informationen sendet.
{
"label": "lager-webhook",
"name": "Lager Webhook",
"type": "generic",
"url": "https://example.com/hooks/lager",
"enabled": true,
"headers": {
"X-App-Token": "your-token"
}
}
Spezieller Webhook für Telegram-Benachrichtigungen. Sendet formatierte Nachrichten mit Markdown.
{
"label": "telegram-alerts",
"name": "Telegram Alerts",
"type": "telegram",
"url": "https://api.telegram.org/bot<YOUR_BOT_TOKEN>/sendMessage",
"enabled": true,
"bot_token": "123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11",
"chat_id": "-100123456789"
}
Alarmziele werden global über alerts.webhooks und alerts.emails konfiguriert. Alle aktivierten Webhooks und Emails erhalten Benachrichtigungen bei Alarmen.
Das macht die Konfiguration wartbarer, weil Alarmziele zentral geändert werden können.
machine_id und sensor_id niemals nachträglich leichtfertig ändern