×

Ein Warnsystem, das auch dann funktioniert, wenn alles andere ausfällt

Ich arbeite an einem einfachen, aber genialen Warnsystem für Katastrophen und Krisen – speziell für den „Worst Case“, also dann, wenn der Strom tagelang ausfällt und Handys, Internet, Radio und Fernsehen tot sind.

Warum überhaupt?

  • Offizielle Warnsysteme wie MoWaS (z. B. Apps, Sirenen, Fernsehen, Internet) funktionieren gut – aber nur, solange Strom und Netz da sind.
  • Bei einem echten Blackout oder Cyberangriff sind all diese Systeme sehr schnell lahmgelegt.
  • Dann gibt es keine verlässliche Möglichkeit mehr, die Bevölkerung zu informieren. Die Sirene macht zwar Krach, aber keiner weiß, warum.

Was ist meine Idee?

Ich entwickle ein kleines, autarkes Gerät, das Warnungen auch dann weitergeben kann, wenn alles andere ausgefallen ist.

  • Es braucht keinen Internetanschluss.
  • Es läuft wochenlang mit Akku oder Powerbank.
  • Es empfängt Warnmeldungen nicht nur über WLAN, sondern auch über einen eigenen Funkkanal (LoRa).
  • Mehrere Geräte bilden ein Netzwerk („Mesh“), das Warnungen untereinander weiterleitetganz ohne zentrale Technik, Server oder Stromnetz.
  • Wenn irgendwo noch jemand eine Warnung ins System bringt (zum Beispiel ein Nachbar mit Satelliteninternet oder ein Feuerwehrwagen im Ort), verbreitet sich die Nachricht automatisch im ganzen Gebiet.
  • Die Geräte machen im Alltag nichts – aber wenn wirklich Gefahr besteht, lösen sie Alarm aus .
  • Jeder kann so ein Gerät zu Hause, im Wohnwagen oder in der Firma betreiben – einfach aufstellen, einschalten, fertig.

Was bringt das?

  • Die Warnkette bleibt erhalten, auch wenn der Blackout Tage oder Wochen dauert.
  • Die Geräte sind preiswert, sparsam und robust.
  • Sie bieten eine echte Rückmeldung: Wer so ein Gerät hat, weiß, dass die Warnung angekommen ist.
  • Jeder kann mitmachen – je mehr Geräte im Gebiet, desto sicherer und weiter reichen die Warnungen.

Warum mache ich das?

Ich finde, Katastrophenschutz muss unabhängig und für alle zugänglich sein.
Mein System ist kein Konkurrenzprodukt zu MoWaS oder den Apps – es ist eine sinnvolle Ergänzung, damit auch in den schlimmsten Situationen niemand von Informationen abgeschnitten ist.


Du möchtest mehr wissen, mitmachen oder das Thema weiterverbreiten?
Ich freue mich auf Kontakt – je mehr mitdenken, desto sicherer werden wir!

Wie viele LoRa-Mesh-Nodes braucht Deutschland?

Stell dir vor, du wolltest ein Netz aus Warnfunk-Knoten (Nodes) so über Deutschland verteilen, dass jeder Haushalt, jedes Dorf, jede Stadt garantiert eine Warnung erhält – und das, auch wenn Strom, Internet und Mobilfunk ausfallen.
Die Technologie heißt LoRa, ein Funkstandard, der mit extrem wenig Strom kilometerweit Nachrichten senden kann.
Wie viele Nodes bräuchte es, um ganz Deutschland zuverlässig zu versorgen?

Die Rechnung:

  • Deutschland hat etwa 357.000 km² Fläche.
  • Ein einzelner LoRa-Node deckt im Freifeld (also auf dem Land, ohne Häuser) etwa einen Kreis von 5 km Radius sicher ab.
  • Die Fläche eines solchen Kreises beträgt etwa 78 km².
  • Das bedeutet:
    357.000 km² / 78 km² ≈ 4.570 Nodes.
  • Da in Städten und Tälern die Reichweite viel geringer ist, muss man hier doppelt bis dreifach so viele Nodes einplanen – für absolute Sicherheit.

In der Realität:

  • Für Städte, tiefe Täler und Indoor-Sicherheit solltest du insgesamt von 8.000 bis 10.000 Nodes für ganz Deutschland ausgehen.

Damit hätten wir ein Netz, das selbst bei Ausfall einzelner Nodes noch funktioniert, weil jede Nachricht über das Mesh immer mehrere Wege nehmen kann.


2. Rechenformel für beliebige Regionen

Nodes_needed = (Fläche in km²) / (π × Reichweite²)

  • π ≈ 3,14
  • Reichweite = Radius in km (z. B. 5 km)
  • Immer aufrunden und einen Sicherheitsfaktor 1,5–2 einbauen (für Funklöcher, Überlappung)!

Beispiel: Landkreis Göttingen

  • Fläche ca. 1.176 km²
  • Nodes: 1.176 / (3,14 × 25) ≈ 15
  • Mit Redundanz (×2): ca. 30 Nodes für den Landkreis Göttingen

wabe Ein Warnsystem, das auch dann funktioniert, wenn alles andere ausfällt

Mein LoRa-Mesh-Projekt für Katastrophenfälle

Stromausfall, Blackout, Netzstörung – Szenarien, die uns alle betreffen können. Was viele nicht wissen: Moderne Warnsysteme wie MoWaS, Katwarn oder NINA sind in solchen Situationen selbst auf Strom und Internet angewiesen. Fällt beides aus, gibt es keine Warn-App, kein Cell Broadcast, keine Webseiten und oft auch keine Radio- oder TV-Sender mehr.

Aber wie erreichen wir Menschen dann noch mit wichtigen Warnungen – zum Beispiel bei Unwettern, Chemieunfällen oder Großschadenslagen?

Mein Ansatz: Ein dezentrales Warnnetz für den Notfall

Seit einiger Zeit arbeite ich an einem eigenen, unabhängigen Warnsystem auf Basis von LoRa-Mesh-Funk. Die Idee:

  • Kleine, günstige Geräte empfangen Warnungen (z. B. von MoWaS) über Funk und können sie untereinander weiterleiten – auch ohne Internet und Stromnetz.
  • Mit Akku oder Powerbank betrieben, laufen sie wochenlang autark.
  • Die Warnung kann über einen Lautsprecher per Sprachausgabe vorgelesen werden – ganz ohne Display, damit auch Menschen ohne Smartphone oder mit Sehschwäche erreicht werden.

Je mehr Menschen und Orte mitmachen, desto dichter wird das Netz – und desto sicherer kommt die Warnung überall an.

Wie funktioniert das?

Die Geräte verbinden sich zu einem „Mesh“:

  • Empfangt ein Gerät eine Warnung, funkt es sie an die Nachbarn weiter.
  • So breitet sich die Warnung wie ein Schneeballsystem aus – bis sie jeden Haushalt, jedes Dorf, jede Schule erreicht.

Schon mit ca. 10.000 solcher Nodes (Knotenpunkte) könnte man ganz Deutschland flächendeckend abdecken – unabhängig von zentralen Servern, Providern oder dem Stromnetz. Jeder zusätzliche Knoten macht das Netz robuster gegen Ausfälle.

Mein Ziel

Ich möchte zeigen, dass sichere Warnung auch dann noch möglich ist, wenn alles andere versagt.
Mein System ist kein Ersatz, sondern eine wichtige Ergänzung zur offiziellen Infrastruktur – und offen für alle, die mitbauen, ausprobieren oder unterstützen wollen!

Die Hardware: Einfach, günstig, genial robust

Herzstück meines Warnsystems sind kleine, stromsparende Mikrocontroller vom Typ ESP32. Diese Alleskönner kosten nur wenige Euro und sind weltweit millionenfach erprobt.

Was steckt im Gerät?

  • ESP32: Das „Gehirn“ des Geräts. Steuert alles, braucht kaum Strom und läuft auch mit Akku oder Powerbank viele Tage.
  • LoRa-Modul: Ein Funkmodul, das Nachrichten kilometerweit senden und empfangen kann – viel weiter als WLAN oder Bluetooth. Die Module funktionieren auch dort, wo kein Handynetz mehr ist.
  • Akku und USB-C-Ladeanschluss: Damit bleibt das Gerät auch bei Stromausfall wochenlang aktiv. Aufladen kann man per Powerbank, Solar oder jedem Handy-Ladegerät.
  • Lautsprecher (und kleiner Verstärker): So kann die Warnmeldung nicht nur als Signalton, sondern auch als Sprachausgabe laut und verständlich wiedergegeben werden – für alle im Haus, ganz ohne Display.
  • (Optional: Display): Wer möchte, kann zusätzlich ein kleines Display verbauen, um die Warnmeldung auch zu lesen.
  • Tasten/LEDs: Für Bedienung, Quittierung und Statusanzeige.

Alle Komponenten sind robust und günstig im Elektronikhandel zu bekommen. Es gibt keine Spezialteile, keine Abhängigkeit von einer Firma – jeder kann sich so ein Gerät nachbauen oder mit einfachen Mitteln reparieren.

Die Software ist Open Source – so kann die Community die Geräte ständig verbessern, anpassen und testen.


#if defined(ESP8266)
  #include <SoftwareSerial.h>
#endif
#include <vector>

// -------- PIN-Definitionen --------
#if defined(ESP32)
  #define LORA_RX   16
  #define LORA_TX   17
  #define LORA_M0   22
  #define LORA_M1   23
  // #define LORA_AUX  21
  HardwareSerial LoRaSerial(2);
#elif defined(ESP8266)
  #define LORA_RX   12    // D6 (GPIO12)
  #define LORA_TX   14    // D5 (GPIO14)
  #define LORA_M0   4     // D2 (GPIO4)
  #define LORA_M1   5     // D1 (GPIO5)
  #define LORA_AUX  13    // D7 (GPIO13) AUX Status
  SoftwareSerial LoRaSerial(LORA_RX, LORA_TX);
#endif

std::vector<String> recentIDs;

void waitForLoRaReady() {
#ifdef LORA_AUX
  while (digitalRead(LORA_AUX) == LOW) {
    delay(1);
  }
#endif
}

void addRecentID(String id) {
  if (recentIDs.size() > 25) recentIDs.erase(recentIDs.begin());
  recentIDs.push_back(id);
}

bool isKnownID(String id) {
  for (auto &item : recentIDs) {
    if (item == id) return true;
  }
  return false;
}

void setLoRaNormalMode() {
  digitalWrite(LORA_M0, LOW);
  digitalWrite(LORA_M1, LOW);
  delay(20);
  waitForLoRaReady();
}

void setLoRaConfigMode() {
  digitalWrite(LORA_M0, HIGH);
  digitalWrite(LORA_M1, HIGH);
  delay(20);
  waitForLoRaReady();
}

void setup() {
  Serial.begin(9600);
  LoRaSerial.begin(9600);

  pinMode(LORA_M0, OUTPUT);
  pinMode(LORA_M1, OUTPUT);
#ifdef LORA_AUX
  pinMode(LORA_AUX, INPUT);
#endif

  setLoRaNormalMode();

  Serial.println("DX-LR03 Mesh Node bereit!");
  Serial.println("AT-Kommandos: AT+... (autom. Moduswechsel)");
  Serial.println("Normale Nachrichten: ID;Zeit;Signatur;Gruppe;Landkreis;Typ;Text;Instr");
}

void handleATCommand(String cmd) {
  setLoRaConfigMode();
  LoRaSerial.print(cmd + "\r\n");
  waitForLoRaReady();

  unsigned long t0 = millis();
  while (millis() - t0 < 800) {  
    if (LoRaSerial.available()) {
      String resp = LoRaSerial.readStringUntil('\n');
      resp.trim();
      if (resp.length()) {
        Serial.println(resp);  // Modulantwort an PC/Toolkit zurück
      }
    }
  }
  setLoRaNormalMode();
}

void loop() {
  // ----------- Seriell vom PC -----------
  if (Serial.available()) {
    String line = Serial.readStringUntil('\n');
    line.trim();
    if (line.length()) {
      // Ist das ein AT-Kommando für LoRa-Konfig?
      if (line.startsWith("AT+LORA_CFGMODE")) {
        setLoRaConfigMode();
        Serial.println("[ESP] Modul in AT-Konfig-Modus.");
        return;
      }
      if (line.startsWith("AT+LORA_NORMODE")) {
        setLoRaNormalMode();
        Serial.println("[ESP] Modul in Normalbetrieb.");
        return;
      }
      if (line.startsWith("AT+READPARAM")) {
        setLoRaConfigMode();
        // Lies wichtigsten Parameter aus (Beispiel: Adresse)
        LoRaSerial.print("AT+ADDRESS?\r\n");
        delay(120);
        while (LoRaSerial.available()) {
          String resp = LoRaSerial.readStringUntil('\n');
          resp.trim();
          if (resp.length()) Serial.println(resp);
        }
        setLoRaNormalMode();
        return;
      }
      if (line.startsWith("AT+")) {
        // Jedes weitere AT+... wird direkt ans LoRa-Modul als Befehl gegeben
        handleATCommand(line);
        return;
      }
      // Normale Nachricht (ID immer erstes Feld, nie ACK weiterleiten)
      int sep = line.indexOf(';');
      if (sep > 0) {
        String id = line.substring(0, sep);
        if (line.startsWith("ACK;")) {
          // Niemals ACK ins Mesh! Nur Rückmeldung an PC
          Serial.println("[INFO] ACK empfangen, nicht weitergeleitet.");
          return;
        }
        if (!isKnownID(id)) {
          waitForLoRaReady();
          LoRaSerial.println(line);
          waitForLoRaReady();
          addRecentID(id);
          Serial.println("[PC->LoRa] Gesendet: " + line);
          Serial.print("ACK;"); Serial.print(id); Serial.println(";OK");
        } else {
          Serial.println("[INFO] Bereits gesendet (ID bekannt)");
          Serial.print("ACK;"); Serial.print(id); Serial.println(";FEHLER");
        }
      } else {
        Serial.println("[ERROR] Keine gültige ID im Telegramm!");
        Serial.print("ACK;??;FEHLER\n");
      }
    }
  }

  // ----------- Empfang von LoRa -----------
  if (LoRaSerial.available()) {
    String loraMsg = LoRaSerial.readStringUntil('\n');
    loraMsg.trim();
    if (loraMsg.length()) {
      // ACKs niemals weiterleiten!
      if (loraMsg.startsWith("ACK;")) {
        Serial.println("[INFO] ACK empfangen, nicht weitergeleitet.");
        return;
      }
      int sep = loraMsg.indexOf(';');
      if (sep > 0) {
        String id = loraMsg.substring(0, sep);
        if (!isKnownID(id)) {
          Serial.println("[LoRa->PC] Neu empfangen: " + loraMsg);
          addRecentID(id);
          waitForLoRaReady();
          LoRaSerial.println(loraMsg);
          waitForLoRaReady();
        } else {
          Serial.println("[INFO] Bereits empfangen (ID bekannt)");
        }
      }
    }
  }

  delay(5);
}
#include <WiFi.h>
#include <HTTPClient.h>
#include <ArduinoJson.h>
#include <SPI.h>
#include <LoRa.h>

#define LORA_SCK  5
#define LORA_MISO 19
#define LORA_MOSI 27
#define LORA_SS   18
#define LORA_RST  14
#define LORA_DIO0 26

const char* ssid     = "DEIN_SSID";
const char* password = "DEIN_PW";
const char* api_url  = "http://DEINE-API/endpoint.json";

String lastMsgId = "";

void setup() {
  Serial.begin(115200);
  pinMode(13, OUTPUT); // Piezo Buzzer

  // WLAN verbinden
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("\nWLAN verbunden!");

  // LoRa initialisieren
  SPI.begin(LORA_SCK, LORA_MISO, LORA_MOSI, LORA_SS);
  LoRa.setPins(LORA_SS, LORA_RST, LORA_DIO0);
  if (!LoRa.begin(868E6)) {
    Serial.println("LoRa Fehler!");
    while (1);
  }
  Serial.println("LoRa bereit");
}

void loop() {
  // 1. API prüfen
  if (WiFi.status() == WL_CONNECTED) {
    HTTPClient http;
    http.begin(api_url);
    int httpCode = http.GET();
    if (httpCode == 200) {
      String payload = http.getString();
      DynamicJsonDocument doc(2048);
      DeserializationError error = deserializeJson(doc, payload);
      if (!error) {
        String id = doc["identifier"];
        String headline = doc["info"][0]["headline"];
        // Nur bei neuer Warnung!
        if (id != lastMsgId) {
          alarmiere(headline);
          lastMsgId = id;
          // LoRa weiterfunken:
          LoRa.beginPacket();
          LoRa.print(payload); 
          LoRa.endPacket();
        }
      }
    }
    http.end();
  }

  // 2. LoRa empfangen
  int packetSize = LoRa.parsePacket();
  if (packetSize) {
    String recv = "";
    while (LoRa.available()) {
      recv += (char)LoRa.read();
    }
    DynamicJsonDocument doc(2048);
    DeserializationError error = deserializeJson(doc, recv);
    if (!error) {
      String id = doc["identifier"];
      String headline = doc["info"][0]["headline"];
      // Prüfe auf neue ID:
      if (id != lastMsgId) {
        alarmiere(headline);
        lastMsgId = id;
        // Wieder ins Mesh senden:
        LoRa.beginPacket();
        LoRa.print(recv);
        LoRa.endPacket();
      }
    }
  }

  delay(3000); // alle 3 Sekunden checken
}

void alarmiere(String text) {
  // Piepton 2 Sekunden
  tone(13, 1500, 2000);
  Serial.print("ALARM: ");
  Serial.println(text);
  // TTS
}

Das System lässt sich auch prima erweitern mit Co2 Messungen , UV Index oder Temperatur. So hätte man alles in einer Hand ob Umweltschutz oder Kat-Warnungen. Bis Dato würde so ein Gerät im eigenbau, was nur kleine Lötarbeiten braucht für 10€ Umsetzen, je nach Ausführung.

Das hast du vielleicht verpasst