Morgen, ich bin auch auf der Suche nach einem Regenmesser denn ich vorzugsweise an Homematic Wired anschliessen kann.
Hättet ihr den einen oder andern Vorschlag ![]()
Nun der oben genannte MIsol verrichtete nach wie vor problemlos seinen Dienst und daher ist alles geschriebenen immer noch gültig.
Selbstverständlich kannst du als Impulsschnittstelle auch ein dementsprechendes HM Gerät verwenden.
Ist zwar schon eine Zeit lang her, aber der RG-11 ist auch zum messen des Niederschlag geeignet, jedoch ohne Impulsschnittstelle?
Da würde ich „Radio Eriwan“ sagen
, im Prinzip nein. Der RG-11 ist zwar sehr empfindlich, aber ein anderer Sensor mit „Heizplatte“ ist schneller.
Hängt also vom Bedarf bzw. der notwendigen Reaktionszeit ab. Wobei der Unterschied je nach Regenmenge bei vielen Sekunden bis wenigen Minuten ist.
Du musst den Impuls abnehmen und erkennen.
Was die Messgenauigkeit betrifft, würde es mir reichen den Tagesniederschlag zu erkennen/messen.
Sprich den Regen der letzten 24h/bzw. von zb. gestern Dienstag ![]()
Bin auch für Produktvorschläge dankbar.
3 Beiträge wurden in ein existierendes Thema verschoben: Erfassung Reedkontakte Regenmesser
Aus der Idee den “analogen” Regenmesser in ein intelligentes Teil zu verwandeln bin ich auf ein interessantes Produkt gestoßen: Regenmesser WLAN Aqua-Scope RANWIE01.
Zugegeben, das Teil ist jetzt nicht gerade ein Schnäppchen, aber es kommt mit WiFi und MQTT Schnittstelle. Lt. Hersteller soll es locker 2 Jahre laufen im Batteriebetrieb. Die Funktion ist eine alther bekannte Lösung mit Reed-Kontakt und Wippe.
Am vergangenen Wochenende ist der Regenmesser nun eingetroffen und wurde erstmal konventionell in Betrieb genommen. Eine auf die wesentlichen Dinge reduzierte APP ist ebenfalls verfügbar über app.aqua-scope.com
Der Sensor liefert mir auch bereits die Werte in Symcon rein. Aktuell bastele ich noch ein Skript für die Bereitstellung der Daten auf einer externen Webseite. Die Idee ist, dass alle 15 Minuten per Skript eine JSON-Datei auf dem Webserver abgelegt wird und dann per HTML-Widget angezeigt wird. Ist als Info auf unserer “Dorf-Homepage” gedacht, da wir immer wieder über die Regenmengen diskutieren (ist so auf dem Land
).
Selbstverständlich stelle ich dann hier die Skripte für Symcon und das HTML-Widget rein.
Hier schon mal ein Vorgeschmack auf das Widget:
Bis dann
Ansgar
Wie versprochen hier das Skript zum Upload auf einen Webserver mit aktivem Wordpress sowie das HTML-Widget für die Webseite.
wordpress_widget_orginal.html.txt (10,6 KB)
symcon_regen_upload_orig_20260610.php.txt (14,9 KB)
<?php
// ============================================================
// Aqua-Scope Regenmesser → WordPress JSON-Upload
// IP Symcon Skript – per Timer alle 15 Minuten ausführen
// ============================================================
//
// VORAUSSETZUNG IN IP-SYMCON:
// Die raintotal-Variable muss archiviert sein (Logging aktiviert):
// Variable editieren → "Alle Variablenänderungen aufzeichnen"
// Der Aggregationstyp ist NICHT relevant – die Auswertung erfolgt
// über AC_GetLoggedValues (Differenzberechnung), weil die Zähler-
// Aggregation bei sporadisch sendenden Sensoren nicht zuverlässig
// funktioniert.
//
// EINRICHTUNG:
// 1. IDs unten eintragen
// 2. FTP-Zugangsdaten eintragen
// 3. Ereignis → Zyklisch → alle 15 Min. → dieses Skript
//
// DIAGNOSE: $debug = true setzen (siehe unten) schreibt die
// berechneten Werte ins Meldungsfenster (IPS_LogMessage).
// ============================================================
// ── 1. VARIABLEN-IDs (bitte anpassen) ───────────────────────
// ID der raintotal-Variable (fortlaufender Zähler seit Batteriewechsel)
// Wird verwendet für: Tagessumme, letzte 24h, letzte 7 Tage
$varID_Regen = 12345;
// ID der rainlevel-Variable (Regen pro 15-Min-Intervall, nur bei Regen gesendet)
// Wird verwendet für: Regenintensität
$varID_RainLevel = 12348; // Variablen-ID eintragen
// ── WICHTIG: Auflösungsfaktor der Messwippe ─────────────────
// raintotal und rainlevel zählen KIPPUNGEN der Messwippe, nicht mm!
// Jede Kippung entspricht 0,5 mm Niederschlag (Auflösung RANWIE01).
// Alle Rohwerte werden daher mit diesem Faktor multipliziert.
// (Die Sensor-Dokumentation bezeichnet die Werte fälschlich als mm.)
$mm_pro_kippung = 0.5;
// ID der Archiv-Instanz (zu finden unter Kern → Archiv)
$archivID = 12300;
// Temperatur (°C) – optional, 0 = nicht vorhanden
$varID_Temperatur = 12346;
// Starkregenalarm (Boolean) – optional, 0 = nicht vorhanden
$varID_StarkregenAlarm = 0;
// ID der battery-Variable des Sensors
// Das battery-Feld des RANWIE01 liefert den Verbrauch in mAs seit Batteriewechsel
$varID_BatterieVerbrauch = 0; // Variablen-ID eintragen
// Batteriekonfiguration
// 2 × AAA Lithium (je 1,5 V / 1200 mAh) in REIHE geschaltet:
// Spannung addiert sich (3 V), Kapazität bleibt 1200 mAh
$batterie_kapazitaet_mah = 1200; // Gesamtkapazität bei Reihenschaltung
$batterie_warnschwelle = 0.80; // Warnung ab 80 % Verbrauch
// Anzeigename des Standorts (erscheint als Überschrift im Widget)
$standort = 'Ostfildern';
// Diagnose-Modus: true = berechnete Werte werden ins Meldungsfenster
// geschrieben (zur Fehlersuche), false = normaler Betrieb
$debug = false;
// ── 2. FTP-ZUGANGSDATEN (bitte anpassen) ────────────────────
$ftp_host = 'ftp.deinwebserver.de';
$ftp_port = 21;
$ftp_user = 'dein-ftp-benutzer';
$ftp_pass = 'dein-ftp-passwort';
// Zielpfad auf dem Webserver (relativ zum FTP-Root)
$ftp_zieldatei = '/www/wp-content/uploads/regen-daten.json';
// ── 3. LOKALE DATEI-PFADE ────────────────────────────────────
$dir_scripts = IPS_GetKernelDir() . 'scripts/';
$datei_history = $dir_scripts . 'regen_history.json'; // Tageswerte für Balkendiagramm
$datei_backup = $dir_scripts . 'regen_aktuell.json'; // Letztes hochgeladenes JSON
// ============================================================
// AB HIER NICHTS MEHR ÄNDERN
// ============================================================
$jetzt = time();
$datum_text = date('d.m.Y', $jetzt);
$zeit_text = date('H:i', $jetzt);
$heute_key = date('Y-m-d', $jetzt);
// ── Regenwerte per Differenzberechnung aus AC_GetLoggedValues ───────────
// raintotal ist ein sporadischer Zähler (nur bei Regen + 6h-Heartbeat).
// AC_GetAggregatedValues funktioniert nicht zuverlässig bei so wenigen
// Rohdaten. Stattdessen: letzten bekannten Wert VOR dem Startzeitpunkt
// mit aktuellem Wert (bzw. letztem Wert vor Endzeitpunkt) vergleichen.
//
// AC_GetLoggedValues gibt Werte ABSTEIGEND zurück (neuester zuerst).
// → reset() = neuester Wert, end() = ältester Wert im Fenster.
// Hilfsfunktion: gültiger Zählerstand zum Zeitpunkt $timestamp
// Strategie: letzten archivierten Wert VOR $timestamp suchen.
// Falls keiner vorhanden (Sensor neu / Trockenperiode ohne Heartbeat):
// ersten Wert NACH $timestamp nehmen – das ist dann der Startwert
// der frühestmöglich bekannt ist.
function zaehlerstandZum($archivID, $varID, $timestamp) {
// Letzter Wert vor dem Zeitpunkt (bis 60 Tage zurück)
$vor = AC_GetLoggedValues($archivID, $varID, $timestamp - (60 * 86400), $timestamp, 0);
if (!empty($vor)) {
// Absteigend sortiert → reset() = zeitlich nächster vor $timestamp
return reset($vor)['Value'];
}
// Kein Wert davor → ersten Wert danach nehmen (bedeutet 0 mm bis dahin)
$nach = AC_GetLoggedValues($archivID, $varID, $timestamp, $timestamp + (60 * 86400), 0);
if (!empty($nach)) {
// Aufsteigend? Absteigend? Sicherheitshalber min() nehmen
$werte = array_column($nach, 'Value');
return min($werte);
}
return null;
}
$mitternacht_heute = mktime(0, 0, 0, date('n'), date('j'), date('Y'));
// Heute: Zählerstand genau zu Mitternacht
// Differenz in Kippungen × mm_pro_kippung = mm Niederschlag
$start_heute = zaehlerstandZum($archivID, $varID_Regen, $mitternacht_heute);
$regen_heute = ($start_heute !== null)
? round(max(0, GetValue($varID_Regen) - $start_heute) * $mm_pro_kippung, 1)
: 0.0;
// Letzte 24h rollierend: alle Archivwerte der letzten 24h holen und die
// positiven Deltas zwischen aufeinanderfolgenden Werten aufsummieren.
// Zusätzlich den Übergang vom letzten Wert VOR dem 24h-Fenster einbeziehen.
// Gibt es keine Werte → null (kein Regen in den letzten 24h).
$werte_24h = AC_GetLoggedValues($archivID, $varID_Regen, $jetzt - 86400, $jetzt, 0);
if (empty($werte_24h)) {
$start_24h = null;
$regen_24h = null; // Keine Archivwerte → kein Regen in den letzten 24h
} else {
// Absteigend sortiert → umkehren für chronologische Reihenfolge
$werte_24h_asc = array_reverse($werte_24h);
$regen_24h = 0.0;
for ($i = 1; $i < count($werte_24h_asc); $i++) {
$delta = $werte_24h_asc[$i]['Value'] - $werte_24h_asc[$i-1]['Value'];
if ($delta > 0) $regen_24h += $delta; // nur positive Deltas (Zähler steigt)
}
// Übergang vom letzten bekannten Wert vor dem 24h-Fenster einbeziehen
$start_24h = zaehlerstandZum($archivID, $varID_Regen, $jetzt - 86400);
if ($start_24h !== null) {
$erster_delta = $werte_24h_asc[0]['Value'] - $start_24h;
if ($erster_delta > 0) $regen_24h += $erster_delta;
}
// Kippungen → mm
$regen_24h = round($regen_24h * $mm_pro_kippung, 1);
}
// Letzte 7 Tage: Zählerstand zu Beginn des Tages vor 6 Tagen
$start_7tage = zaehlerstandZum($archivID, $varID_Regen, $mitternacht_heute - (6 * 86400));
$regen_7tage = ($start_7tage !== null)
? round(max(0, GetValue($varID_Regen) - $start_7tage) * $mm_pro_kippung, 1)
: $regen_heute;
// ── Diagnose-Ausgabe (nur wenn $debug = true) ────────────────
// Ausgabe per echo – sichtbar wenn das Skript manuell in der
// Konsole ausgeführt wird (Reiter "Ausgabe").
if ($debug) {
$aktuell = GetValue($varID_Regen);
echo "── Diagnose " . date('d.m.Y H:i:s') . " ──\n";
echo "Aktueller raintotal-Wert: $aktuell Kippungen (= " . ($aktuell * $mm_pro_kippung) . " mm)\n";
echo "HEUTE: Start=$start_heute → $regen_heute mm\n";
echo "24H: Start=$start_24h → $regen_24h mm\n";
echo "7 TAGE: Start=$start_7tage → $regen_7tage mm\n";
// rainlevel-Timing für Intensitätsprüfung
if ($varID_RainLevel > 0) {
$rl_info = IPS_GetVariable($varID_RainLevel);
$rl_alter = $jetzt - $rl_info['VariableUpdated'];
echo "rainlevel: Wert=" . GetValue($varID_RainLevel) .
" | Updated vor " . round($rl_alter / 60, 1) . " Min" .
" | Changed vor " . round(($jetzt - $rl_info['VariableChanged']) / 60, 1) . " Min\n";
}
// Rohwerte der letzten 24h auflisten
$debug_24h = AC_GetLoggedValues($archivID, $varID_Regen, $jetzt - 86400, $jetzt, 0);
echo "Rohwerte 24h (" . count($debug_24h) . " Einträge):\n";
foreach (array_reverse($debug_24h) as $w) {
echo " " . date('d.m H:i', $w['TimeStamp']) . " → " . $w['Value'] . " mm\n";
}
echo "── Ende Diagnose ──\n";
}
// ── Regenintensität berechnen aus rainlevel ─────────────────
// rainlevel = Kippungen der Messwippe im letzten 15-Min-Intervall
// Umrechnung: Kippungen × mm_pro_kippung = mm im Intervall
// Hochrechnung auf mm/h: × 4 (4 × 15 Min = 60 Min)
// Beispiel: rainlevel=2 → 2 × 0,5 mm × 4 = 4 mm/h
//
// WICHTIG: Der Sensor sendet rainlevel nur solange es regnet.
// Hört der Regen auf, kommt KEIN neuer Wert mehr – die Variable
// behält ihren letzten Wert. Daher prüfen wir das Alter der letzten
// Aktualisierung: ist sie älter als ein Intervall (15 Min + Puffer),
// gilt der Regen als beendet → Intensität 0.
$intervall_puffer = 20 * 60; // 20 Minuten (15-Min-Intervall + 5 Min Puffer)
if ($varID_RainLevel > 0) {
$var_info = IPS_GetVariable($varID_RainLevel);
$letzte_aktual = $var_info['VariableUpdated']; // Unix-Zeitstempel der letzten Aktualisierung
$alter = $jetzt - $letzte_aktual;
if ($alter <= $intervall_puffer) {
// Aktueller Wert ist frisch → Intensität berechnen
$intensitaet = round(GetValue($varID_RainLevel) * $mm_pro_kippung * 4, 1);
} else {
// Letzter rainlevel-Wert ist veraltet → kein aktueller Regen
$intensitaet = 0.0;
}
} else {
$intensitaet = null;
}
// ── Weitere Messwerte ────────────────────────────────────────
$temperatur = ($varID_Temperatur > 0) ? round(GetValue($varID_Temperatur), 1) : null;
$starkregen = ($varID_StarkregenAlarm > 0) ? (bool)GetValue($varID_StarkregenAlarm) : false;
// Batteriestatus ermitteln
// Priorität 1: battery-Feld direkt vom Sensor (0–100 %)
// Priorität 2: Berechnung über mAs-Zähler
// battery-Feld des RANWIE01 = mAs-Verbrauch seit Batteriewechsel
// Beispiel aus Doku: {"battery":"20721"} = 20721 mAs = 5.75 mAh verbraucht
// → bei 1200 mAh Kapazität ≈ 0.5 % verbraucht
if ($varID_BatterieVerbrauch > 0) {
$verbrauch_mas = GetValue($varID_BatterieVerbrauch); // mAs seit Batteriewechsel
$verbrauch_mah = $verbrauch_mas / 3600; // mAs → mAh
$verbrauch_pct = $verbrauch_mah / $batterie_kapazitaet_mah; // Anteil 0.0–1.0
$batterie_ok = ($verbrauch_pct < $batterie_warnschwelle); // true = noch OK
$batterie_pct = round($verbrauch_pct * 100, 1); // für Logmeldung
} else {
$batterie_ok = null;
$batterie_pct = null;
}
// ── Tages-History für Balkendiagramm (14 Tage) ──────────────
// Für vergangene Tage: Tageswert via AC_GetAggregatedValues (Stufe 1 = täglich)
$history = [];
if (file_exists($datei_history)) {
$raw = @file_get_contents($datei_history);
if ($raw) $history = json_decode($raw, true) ?: [];
}
// Heutigen Wert immer aktualisieren
$history[$heute_key] = [
'datum' => $datum_text,
'regen_mm' => $regen_heute,
];
// Vergangene 13 Tage auffüllen, falls noch nicht vorhanden
// Für abgeschlossene Tage: Differenz zwischen Zählerstand um Mitternacht
// des Tages und Zählerstand um Mitternacht des Folgetags
for ($d = 1; $d <= 13; $d++) {
$tag_ts = mktime(0, 0, 0, date('n'), date('j') - $d, date('Y')); // Mitternacht Tag
$folgetag_ts = mktime(0, 0, 0, date('n'), date('j') - $d + 1, date('Y')); // Mitternacht Folgetag
$tag_key = date('Y-m-d', $tag_ts);
if (!isset($history[$tag_key])) {
// Zählerstand zu Beginn und Ende des Tages
$start = zaehlerstandZum($archivID, $varID_Regen, $tag_ts);
$ende = zaehlerstandZum($archivID, $varID_Regen, $folgetag_ts);
if ($start !== null && $ende !== null) {
$mm = round(max(0, $ende - $start) * $mm_pro_kippung, 1);
} else {
$mm = 0.0;
}
$history[$tag_key] = [
'datum' => date('d.m.Y', $tag_ts),
'regen_mm' => $mm,
];
}
}
ksort($history);
$history = array_slice($history, -14, null, true);
file_put_contents($datei_history, json_encode($history, JSON_PRETTY_PRINT));
// ── JSON zusammenstellen ─────────────────────────────────────
$daten = [
'aktualisiert' => $jetzt,
'datum' => $datum_text,
'zeit' => $zeit_text,
'standort' => $standort,
'regen_heute_mm' => $regen_heute,
'regen_24h_mm' => $regen_24h,
'regen_7tage_mm' => $regen_7tage,
'intensitaet_mmh' => $intensitaet,
'temperatur' => $temperatur,
'starkregen_alarm' => $starkregen,
'batterie_ok' => $batterie_ok,
'history' => array_values($history),
];
$json_inhalt = json_encode($daten, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
// Lokales Backup
file_put_contents($datei_backup, $json_inhalt);
// ── Per FTP hochladen ────────────────────────────────────────
$ftp = @ftp_connect($ftp_host, $ftp_port, 10);
if (!$ftp) {
IPS_LogMessage('RegenUpload', 'FTP-Verbindung fehlgeschlagen: ' . $ftp_host);
return;
}
if (!@ftp_login($ftp, $ftp_user, $ftp_pass)) {
IPS_LogMessage('RegenUpload', 'FTP-Login fehlgeschlagen');
ftp_close($ftp);
return;
}
ftp_pasv($ftp, true);
$tmp = tempnam(sys_get_temp_dir(), 'regen_');
file_put_contents($tmp, $json_inhalt);
$erfolg = ftp_put($ftp, $ftp_zieldatei, $tmp, FTP_ASCII);
unlink($tmp);
ftp_close($ftp);
if ($erfolg) {
$bat_log = ($batterie_pct !== null) ? ' | Batterie: ' . $batterie_pct . '% verbraucht (' . ($batterie_ok ? 'OK' : 'LEER') . ')' : '';
IPS_LogMessage('RegenUpload', sprintf(
'OK – Heute: %s mm | 24h: %s mm | 7 Tage: %s mm | Intensität: %s mm/h%s (%s %s)',
$regen_heute, $regen_24h, $regen_7tage, $intensitaet, $bat_log, $datum_text, $zeit_text
));
} else {
IPS_LogMessage('RegenUpload', 'FTP-Upload fehlgeschlagen! Ziel: ' . $ftp_zieldatei);
}
Hallo,
ich habe mir den gleichen Sensor gekauft, habe aber noch das Problem die Daten via MQTT in die Symcon zu bekommen. Was muss ich hier beachten? Kann mir hier jemand helfen? Ich habe bereits einen MQTT Client erfolgreich eingerichtet, der die Daten meinen openWB Wallbox empfängt.
Hallo,
hast du denn im Regenmesser (https://app.aqua-scope.com) deine MQTT Schnittstelle aus Symcon eingetragen?
- Serveradresse
- Benutzername
- Passwort
Zunächst brauchst du in Symcon einen MQTT-Server Socket. Dann kannst du über den MQTT-Konfigurator deine Variablen erstellen, die der Sensor liefert. Die Variablen werden dann automatisch angelegt:
„Raintotal“ muss noch geloggt werden in den Variableneinstellungen und die Aggregation auf ‚Zähler‘ umgestellt werden unter ‚Archiv‘:
Anschließend kannst du mit der aufgezeichneten Variable machen wass du willst.
Bei Frage bitte gerne melden.
BG
Ansgar
hier noch mein aktuelles Script in Symcon für die Aggregation der Daten und den Upload auf einen beliebigen Webserver und die aktuelle Version des Wordpress-Widgets
wordpress_widget.html.txt (14,3 KB)
:
symcon_regen_upload_20260618.php.txt (18,6 KB)
Das sieht dann so aus auf der Webseite:
Hallo Ansgar,
erstmal vielen Dank für deine Antwort.
Ja ich habe MQTT in der Aqua Scope App aktiviert:
Die IP ist die meiner Symcon
Im MQTT Explorer sehe ich auch keine Nachricht, von meinen Sensor, IP 192.168.100.26, dieser geht immer auf Timeout.
Ich habe den Sensor bereits auf das minimalste Intervall eingestellt (30s):
Mein MQTT Server in der Symcon schaut so aus, da werden nur Nachrichten/Signale meiner Wallbox angezeigt:
Ich komme also gar nicht zu dem Schritt die Symcon-Variablen anzulegen.
Viele Grüße
Fabian
Du hast meines erachtens keinen MQTT Server (MQTT-Broker) auf deinem Symcon laufen. Schau mal hier ist alles beschrieben: MQTT-Server — Symcon :: Automatisierungssoftware
Bei mir sieht das so aus:
Server-Socket:
MQTT-Server:
Bitte mal schauen ob du überhaupt einen Broker laufen hast auf Symcon.
BG
Ansgar










