IoT-Automatisierung

Smart Parking IoT mit MQTT: Stellplatzsensoren, Belegungszählung und eine Live-Verfügbarkeitskarte

Ein praxisnaher Bauplan für Smart Parking mit IoT: Stellplatzsensoren auswählen, MQTT-Topics entwerfen, freie Plätze pro Zone aggregieren und eine Live-Karte im Browser über sicheren WebSocket ansteuern.

Smart-Parking-IoT-Diagramm mit Stellplatzsensoren in einem Parkhaus, die die Belegung an eine Live-Verfügbarkeitskarte melden
Probieren Sie es auf Ihrem eigenen MQTT-Broker ausHolen Sie sich im Free-Tarif einen privaten, verwalteten MQTT-Broker und starten Sie mit fertigen Codebeispielen.
Kostenlos testen Codebeispiele Keine Kreditkarte erforderlich

Smart-Parking-IoT-Systeme zeigen Autofahrern freie Plätze, bevor sie anfangen, Runden zu drehen, und zeigen Betreibern, wie ihre Parkflächen tatsächlich genutzt werden. Dieser Artikel führt durch einen vollständigen Entwurf: Stellplatzsensoren auswählen, MQTT-Topics strukturieren, freie Plätze pro Zone aggregieren und eine Live-Karte im Browser ansteuern, die sich in dem Moment aktualisiert, in dem ein Auto wegfährt.

Was ein Smart-Parking-System leisten muss

Ohne Marketing-Sprache hat ein Parkleitsystem vier Aufgaben:

  1. Erkennen, ob jeder Stellplatz belegt ist.
  2. Übertragen dieser Zustandsänderungen zuverlässig vom Feld ins Backend.
  3. Aggregieren einzelner Stellplätze zu Zahlen, die Menschen interessieren: freie Plätze pro Ebene, pro Zone, pro Parkhaus.
  4. Anzeigen des Ergebnisses auf Schildern, in Apps und auf Karten, nahezu in Echtzeit.

MQTT passt ganz natürlich zur Übertragungs- und Anzeigeschicht. Jeder Stellplatz ist ein retained Zustands-Topic, Aggregatoren abonnieren mit Wildcards, und Browser abonnieren über WebSocket für Live-Updates. Der Rest dieses Artikels folgt den Daten vom Asphalt bis zum Bildschirm.

Stellplatzsensoren auswählen

Sensortyp Funktionsweise Stärken Worauf zu achten ist
Magnetometer (im Boden oder als Oberflächen-Puck) Erkennt die Änderung des Erdmagnetfelds durch ein Auto Lange Batterielaufzeit, unabhängig von Licht und Wetter Störungen durch benachbarte Stellplätze, Kalibrierung nötig
Radar (kombiniert mit Magnetometer) Kurzstreckenreflexion am Fahrzeugunterboden Weniger Fehlerkennungen als ein reines Magnetometer Höhere Kosten und höherer Stromverbrauch
Ultraschall (Deckenmontage) Misst den Abstand zum Fahrzeugdach Einfach, in Tiefgaragen verbreitet, oft mit LED-Anzeige Benötigt Netzstrom und Innenmontage
Kamera mit Bildverarbeitungsmodell Eine Kamera deckt viele Stellplätze ab Geringe Kosten pro Stellplatz, kann Kennzeichen lesen Datenschutzvorgaben, Beleuchtung, Verarbeitung am Edge

Für offene Parkplätze und Stellplätze am Straßenrand sind batteriebetriebene Magnetometer- oder Radar-Pucks mit LoRaWAN oder NB-IoT die übliche Wahl. Tiefgaragen nutzen häufig Ultraschallsensoren an der Decke an einem kabelgebundenen Bus mit lokalem Gateway. Kamerasysteme veröffentlichen Ergebnisse statt Video: Das Edge-Gerät führt die Erkennung aus und veröffentlicht pro Stellplatz nur occupied oder free.

Verbindungswege zum Broker

Wie Sensoren den Broker erreichen, prägt die Architektur stärker als der Sensortyp:

  • LoRaWAN: Sensoren funken an Gateways, Gateways leiten an einen Netzwerkserver wie The Things Stack oder ChirpStack weiter, und der Netzwerkserver oder ein kleiner Bridge-Dienst veröffentlicht dekodierte Daten an Ihren Broker. Aus Hunderten Stellplätzen wird eine einzige MQTT-Verbindung. Den Bridging-Schritt beschreibt The Things Network mit MQTT.
  • NB-IoT oder LTE-M: Jeder Sensor kann sich direkt per MQTT verbinden oder über die Plattform des Netzbetreibers melden, die Sie dann anbinden.
  • Kabelgebundener Bus plus Gateway: Ein Gateway im Gebäude fragt Ultraschallsensoren ab und veröffentlicht Änderungen.
  • Edge-Kamera: Ein kleiner Rechner führt die Erkennung aus und veröffentlicht Ergebnisse pro Stellplatz.

Der Gateway-Ansatz lohnt sich nicht nur wegen der Kosten. Er hält die Zahl der Verbindungen niedrig, sodass selbst ein kleiner Broker-Tarif ein großes Parkhaus bewältigt, und der Stellplatzzustand ist trotzdem ein sauberes MQTT-Topic, wenn er Ihre Anwendungen erreicht.

Topic-Design für Smart Parking IoT

Eine Hierarchie, die die physische Anordnung abbildet, macht jede Abfrage zu einer Wildcard:

parking/<site>/<level>/<bay>/state          retained: {"occupied":true,"ts":1760600000}
parking/<site>/<level>/<bay>/battery        retained: 3.41
parking/<site>/<level>/summary              retained: {"free":37,"total":120}
parking/<site>/summary                      retained: {"free":112,"total":420}
parking/<site>/<level>/<bay>/availability   retained online/offline (gateway-reported)
  • parking/central/+/+/state umfasst jeden Stellplatz im Parkhaus „central“.
  • parking/+/summary ist die Kennzahl für jeden Standort, und mehr braucht ein stadtweites Parkleitschild nicht.

Das Prinzip entspricht dem Unified Namespace (UNS) aus der Industrie, bei dem die ISA-95-Hierarchie (Enterprise → Site → Area → Line → Cell) die Topic-Struktur vorgibt: Hier übernehmen Standort, Ebene und Stellplatz diese Rolle. Betreibt ein Werk einen eigenen Mitarbeiterparkplatz, lässt sich der Teilbaum sogar direkt in den UNS des Standorts einhängen, etwa unter acme/werk-ingolstadt/parken/ebene-1/b001/state.

Wenn sowohl Stellplatzzustände als auch Zusammenfassungen retained sind, zeigt eine neue App oder ein neues Schild sofort beim Verbinden korrekte Zahlen. Nehmen Sie einen Zeitstempel in den Payload auf, denn ein Stellplatz, der sich seit einem Tag nicht gemeldet hat, ist „unbekannt“, nicht „frei“.

Freie Plätze pro Ebene aggregieren

Ein Aggregator abonniert alle Stellplatzzustände, hält sie im Speicher und veröffentlicht bei jeder Änderung neue Zusammenfassungen. Diese Python-Version nutzt paho-mqtt 2.x und den öffentlichen MQTT-Broker, der für Tests und Prototypen gedacht ist, nicht für Produktionsdaten:

import json
import time
from collections import defaultdict
import paho.mqtt.client as mqtt

PREFIX = "connectmq/demo/p3v6z8"         # Ihr eigenes zufälliges Präfix
SITE = "central"
STALE_AFTER = 6 * 3600                    # Sekunden ohne Meldung = unbekannt
bays = {}                                 # (level, bay) -> {"occupied": bool, "ts": float}

def publish_summaries(client):
    now = time.time()
    per_level = defaultdict(lambda: {"free": 0, "occupied": 0, "unknown": 0, "total": 0})
    for (level, _), s in bays.items():
        bucket = per_level[level]
        bucket["total"] += 1
        if now - s["ts"] > STALE_AFTER:
            bucket["unknown"] += 1
        elif s["occupied"]:
            bucket["occupied"] += 1
        else:
            bucket["free"] += 1
    site = {"free": 0, "occupied": 0, "unknown": 0, "total": 0}
    for level, b in per_level.items():
        client.publish(f"{PREFIX}/parking/{SITE}/{level}/summary", json.dumps(b), qos=1, retain=True)
        for k in site:
            site[k] += b[k]
    client.publish(f"{PREFIX}/parking/{SITE}/summary", json.dumps(site), qos=1, retain=True)

def on_connect(client, userdata, flags, reason_code, properties):
    client.subscribe(f"{PREFIX}/parking/{SITE}/+/+/state", qos=1)

def on_message(client, userdata, msg):
    parts = msg.topic.split("/")
    level, bay = parts[-3], parts[-2]
    try:
        data = json.loads(msg.payload)
        bays[(level, bay)] = {"occupied": bool(data["occupied"]), "ts": float(data.get("ts", time.time()))}
    except (ValueError, KeyError):
        return
    publish_summaries(client)

client = mqtt.Client(mqtt.CallbackAPIVersion.VERSION2, client_id="parking-agg-p3v6z8")
client.on_connect = on_connect
client.on_message = on_message
client.connect("broker.connectmq.com", 1883, keepalive=60)
client.loop_forever()

Simulieren Sie ein paar Stellplätze im Terminal:

P=connectmq/demo/p3v6z8/parking/central
mosquitto_pub -h broker.connectmq.com -p 1883 -i sim-p3v6z8 -r -q 1 -t $P/l1/b001/state -m "{\"occupied\":true,\"ts\":$(date +%s)}"
mosquitto_pub -h broker.connectmq.com -p 1883 -i sim-p3v6z8 -r -q 1 -t $P/l1/b002/state -m "{\"occupied\":false,\"ts\":$(date +%s)}"
mosquitto_sub -h broker.connectmq.com -p 1883 -i view-p3v6z8 -t "$P/+/summary" -t "$P/summary" -v

Beachten Sie, dass das Demo-Präfix Ebenen hinzufügt: Das obige Stellplatz-Topic ist acht Ebenen tief, das Maximum, das der öffentliche MQTT-Broker zulässt. Auf einem privaten Broker würden Sie das Präfix weglassen und bei parking/ beginnen.

Bei einer großen Installation ist es verschwenderisch, jede Zusammenfassung bei jeder Änderung zu veröffentlichen. Bündeln Sie Updates alle ein bis zwei Sekunden, und wenn ein Aggregator nicht ausreicht, können sich mit MQTT 5 Shared Subscriptions in einem kostenpflichtigen Tarif mehrere Instanzen die Last teilen.

Die Live-Verfügbarkeitskarte

Der Browser verbindet sich über sicheren WebSocket und abonniert nur die Zusammenfassungen oder, für eine detaillierte Ebenenansicht, die Stellplatzzustände. Mit MQTT.js:

import mqtt from "mqtt";

const PREFIX = "connectmq/demo/p3v6z8/parking/central";
const client = mqtt.connect("wss://broker.connectmq.com:8084/mqtt", {
  clientId: "parking-map-" + Math.random().toString(16).slice(2, 8),
  protocolVersion: 5,
});

client.on("connect", () => {
  client.subscribe(`${PREFIX}/+/summary`, { qos: 1 });
  client.subscribe(`${PREFIX}/l1/+/state`, { qos: 0 });
});

client.on("message", (topic, payload) => {
  const data = JSON.parse(payload.toString());
  const parts = topic.split("/");
  if (topic.endsWith("/summary")) {
    const level = parts[parts.length - 2];
    const el = document.querySelector(`[data-level="${level}"] .free`);
    if (el) el.textContent = `${data.free} free of ${data.total}`;
  } else {
    const bay = parts[parts.length - 2];
    const cell = document.querySelector(`[data-bay="${bay}"]`);
    if (cell) cell.className = data.occupied ? "bay occupied" : "bay free";
  }
});

Mit einer Kartenbibliothek wie Leaflet würde derselbe Handler einen Marker pro Standort umfärben. Da die Zusammenfassungen retained sind, zeichnet die Karte den aktuellen Stand, sobald die Seite geladen ist. Unser Leitfaden zu MQTT über WebSocket behandelt Details zur Browserverbindung und zum Umgang mit Zugangsdaten, und das ist wichtig: Eine öffentliche Webseite darf niemals Zugangsdaten enthalten, mit denen sich auf Stellplatz-Topics veröffentlichen lässt.

Checkliste für die Inbetriebnahme

  1. Sensoren je nach Umgebung wählen: Pucks im Freien, Ultraschall in Gebäuden, Kameras dort, wo es der Datenschutz nach DSGVO erlaubt.
  2. LoRaWAN- oder kabelgebundene Netze über Gateways anbinden, um die Verbindungszahl niedrig zu halten.
  3. Stellplatzzustände und Zusammenfassungen retained speichern; Zeitstempel mitsenden.
  4. Stumme Sensoren als unbekannt behandeln und bei niedrigem Batteriestand alarmieren.
  5. Niemals Zugangsdaten mit Veröffentlichungsrechten an öffentliche Karten-Clients ausliefern; Zusammenfassungen stattdessen über Ihr eigenes Backend bereitstellen.
  6. TLS auf Port 8883 für Gateways und 8084 für Browser verwenden.
  7. Zustandsänderungen mit einem separaten Subscriber in einer Datenbank protokollieren, um die Belegung auszuwerten.

Häufige Fallstricke bei Parkplatzprojekten

Störungen durch Nachbarstellplätze. Ein großer Transporter kann das Magnetometer im nächsten Stellplatz beeinflussen. Kalibrieren Sie Sensoren nach der Installation und bevorzugen Sie bei engen Anordnungen kombinierte Magnetometer- und Radareinheiten.

Geisterbelegung. Schnee, stehendes Wasser oder ein heruntergefallener Metallgegenstand können einen Stellplatz tagelang belegt erscheinen lassen. Markieren Sie Stellplätze, deren Zustand sich ungewöhnlich lange nicht geändert hat, und prüfen Sie sie.

Uhrendrift. Stammen Zeitstempel von den Sensoren, lässt eine driftende Uhr frische Daten veraltet aussehen. Lassen Sie das Gateway oder den Netzwerkserver Nachrichten beim Eingang mit einem Zeitstempel versehen.

Zu häufig veröffentlichte Zusammenfassungen. Wenn Hunderte Schilder und Apps bei jeder einzelnen Stellplatzänderung eine Zusammenfassung erhalten, wird Bandbreite verschwendet. Begrenzen Sie die Rate der Zusammenfassungen und veröffentlichen Sie nur, wenn sich die Zahlen tatsächlich ändern.

Skalierung über ein einzelnes Parkhaus hinaus

Sobald mehrere Standorte unter parking/<site>/... veröffentlichen, abonniert ein stadtweites Parkleitschild parking/+/summary und sonst nichts. Das ist dasselbe Messaging-Muster wie in der umfassenderen Smart-City-IoT-Architektur, in der sich Parken, Beleuchtung und Luftqualität einen Broker teilen, aber in getrennten Teilbäumen bleiben. Temperaturempfindliche Logistik nutzt ein ähnliches Flottenmuster, wie in der Kühlkettenüberwachung beschrieben.

Wer den Broker selbst betreibt, kümmert sich um Patches, Zertifikate und Monitoring für ein System, auf das sich Autofahrer täglich verlassen. Ein verwalteter MQTT-Broker wie ConnectMQ übernimmt TLS, WebSocket-Endpunkte und Verbindungsverwaltung, während Sie im Live-Topic-Explorer des Portals verfolgen können, wie Stellplatzzustände eintreffen. Wenn Sie Hosting-Modelle vergleichen, hilft unsere Übersicht zum Ansatz des Cloud-MQTT-Brokers, und der Leitfaden zur IoT-Automatisierung sammelt verwandte Projekte.

Starten Sie Ihr Smart-Parking-Pilotprojekt auf ConnectMQ

Testen Sie eine Ebene mit einer Handvoll Sensoren und einem Gateway, veröffentlichen Sie an ConnectMQ und zeigen Sie die Live-Karte auf einem Testbildschirm. Erstellen Sie unter app.connectmq.com einen kostenlosen Serverless-Broker, ganz ohne Kreditkarte, und wechseln Sie zu einem kostenpflichtigen oder Dedicated-Tarif, wenn die Zahl der Stellplätze wächst.

Häufig gestellte Fragen

Wie viele MQTT-Verbindungen braucht ein Smart-Parking-System?

Meist weit weniger als es Stellplätze gibt. LoRaWAN-Netzwerkserver und Gateways in Gebäuden veröffentlichen für viele Sensoren über eine einzige Verbindung, sodass die Verbindungszahl mit Gateways und Apps skaliert, nicht mit Stellplätzen.

Welcher Sensor eignet sich am besten für Stellplätze im Freien?

Batteriebetriebene Magnetometer-Pucks, idealerweise kombiniert mit Radar zur Reduzierung von Fehlmessungen, sind im Freien die übliche Wahl, weil sie der Witterung standhalten und jahrelang mit einer Batterie auskommen.

Wie verhindere ich, dass die öffentliche Karte missbraucht wird?

Leiten Sie die Daten über Ihr eigenes Backend, zum Beispiel über einen kleinen Server, der die Zusammenfassungen abonniert und an die Seite weiterreicht. Betten Sie niemals Zugangsdaten in eine öffentliche Seite ein, mit denen sich auf Stellplatz- oder Zusammenfassungs-Topics veröffentlichen ließe.

Kann ich Kameras statt Stellplatzsensoren verwenden?

Ja. Ein Edge-Gerät führt die Erkennung aus und veröffentlicht nur die Belegung pro Stellplatz, niemals Video. Das hält die Bandbreite gering und hilft bei der Einhaltung der DSGVO, insbesondere wenn die Kamera Kennzeichen erfassen könnte.

Verwandte Artikel

Zigbee2MQTT einrichten: Vom Koordinator bis zum Dashboard

Installieren Sie Zigbee2MQTT mit Docker, konfigurieren Sie Koordinator und MQTT-Verbindung, lernen Sie Geräte an und benennen Sie sie um, steuern Sie sie per MQTT und zeigen Sie ihre Zustände auf einem Dashboard an, zuerst getestet auf einem kostenlosen öffentlichen MQTT-Broker.

8 Min. Lesezeit

Alle Artikel →

Ihr privater MQTT-Broker ist nur wenige Klicks entfernt

Konto anlegen, Broker-Zugangsdaten erhalten und das erste Gerät verbinden — ohne Server, die installiert, gepatcht oder skaliert werden müssen.