Beliebige Differenz mit DbLog

Begonnen von Pnemenz, 15 Mai 2015, 23:01:28

Vorheriges Thema - Nächstes Thema

Pnemenz

Gibt es eine Möglichkeit mit DbLog die Differenz eines Readings in einer freien Zeiteinheit zu bilden? Ich stelle mir zwei Varianten vor:
1)   Eingabe von Startpunkt und Endpunkt --> Ergebnis ist die Differenz von ältestem Wert und Jüngstem Wert des Readings innerhalb dieser Zeitspanne.
2)   Ohne Startpunkt und Endpunkt dafür ein Parameter der die Länge des Zeitraums bestimmt. In diesem Falle soll der Endpunkt der Ausführungszeitraum der Abfrage sein.

Zum Beispiel soll die Eingabe get DbLog - - - - wetterstation:regen::delta:1d die Differenz des Niederschlags in den letzten 24 Stunden ergeben.

Die Eingabe get DbLog - - - - wetterstation:regen::delta:1w würde die Niederschlagsmenge der letzen Woche ergeben.

Gemeinsam mit DOIF könnte ich damit einfach die Entscheidung treffen ob zum gegenwärtigen Zeitpunkt Bewässerung nötig ist oder nicht bzw. wieviel Bewässerung nötig ist.

Eine weitere delta Funktion habe ich bisher auch nicht gefunden: ich möchte in meiner Grafik zur Wetterstation den Niederschlag darstellen. Dazu brauche ich die Differenz zwischen den jeweilig benachbarten Messwerten.

Gibt es diese Funktion oder ist das möglich sie ins DbLog bzw in den LogProxy zu integrieren?

Peter

Phill

Hallo,
Also mit sql ist so einiges möglich.

Was brint dir denn in deinem Fall die Differenz der Niederschlagswerte zweier beliebiger Zeitpunkte? ... Garnichts.
Ich komm in deinem Fall mit dem Begriff Differenz nicht klar. Du bräuchtest doch eher eine summe, da du ja wissen willst wieviel regen gefallen ist in einer bestimmten Zeit.

Mein Vorschlag du bildest einen Mittelwert (mit z.B. Statistics oder Average) um zu sehen wieviel regen durchschnittlich in den letzten Tagen Wochen wie auch immer gefallen ist.

Gruß Phill
Homebrew 1-Wire / HomeMatic Mix - Cubietruck mit FHEM als Server - Raspberry PI 3 als Informationsanzeige im MagicMirror Stil - Raspberry Pi 1 als Klingelanlage - VDR

Mein Modul: Talk2Fhem - Mein Tipp: https://forum.fhem.de/index.php/topic,82442.0.html

Pnemenz

Hallo Phill,

Zitat von: Phill am 16 Mai 2015, 02:04:30
Was brint dir denn in deinem Fall die Differenz der Niederschlagswerte zweier beliebiger Zeitpunkte? ... Garnichts.

Ich komm in deinem Fall mit dem Begriff Differenz nicht klar. Du bräuchtest doch eher eine summe, da du ja wissen willst wieviel regen gefallen ist in einer bestimmten Zeit.

Der Regensensor ist ein Zähler. Wenn es regnet wird der Niederschalg im 0,3mm Schritten gezählt. Daher ist die Summe seit Anbeginn des Messens mit diesem Sensor bei jedem Messvorgang in der Datenbank. Deswegen ist die Niederschlagsmenge in einem bestimmtem Zeitraum der Sensorwert am Ende des Zeitraumes - dem Sensorwert am Anfang des Zeitraumes. Das bezeichne ich als Differenz.

Zitat von: Phill am 16 Mai 2015, 02:04:30
Mein Vorschlag du bildest einen Mittelwert (mit z.B. Statistics oder Average) um zu sehen wieviel regen durchschnittlich in den letzten Tagen Wochen wie auch immer gefallen ist.

Der Durchschnittliche Niederschlag bring mir zur Berechnung der benötigten Bewässerung nichts.

Ein Beinspiel:
1) Der Rasen soll pro Woche mit 20 mm Wasser versorgt sein.
2) Die Bewässerungsanlage macht pro Stunde 20mm Niederschlag.

Wenn es weniger als 20 mm geregnet hat der Rasen am Mittwoch um 7:00 in der Früh bewässert werden. Die Bewässerungsdauer soll abhängig des Niederschlags der letzen Woche zwischen 0 Minuten und einer Stunde sein.

Mit DB-Log kann ich die delta-Werte (= Differenz zwischen 1. Wert und letztem Wert) für Tage oder Stunden ausgeben. Die haben aber fixe Start und Endpunkte und geben die delta werte pro Tagt (oder Stunde) aus und nicht sie Summe der delta Werte. Ich möchte aber, um bei dem Beispiel zu bleiben,  Mittwoch um 7:00 wissen, wieviel niederschlag war seit letzem Mittwoch 7:00.

Daher der Wunsch nach einer delta-Funktion mit frei konfigurierbaren Start- und Endzeiten.

Die zweite Funktion ist für das Darstellen der Niederschläge. Mittels der delta-h Funktion kann ich die Niederschlagssumme / Stunde darstellen. Ich messe aber alle 5 Minuten und würde das gerne abbilden. Daher brauche ich jeweils die Differenz zweier benachbarter Messwerte. Damit wird die Auflösung der Darstellung des Niederschlags höher.

Ich gebe zu, das ist nur weils schöner aussieht 8)

Peter

Phill

#3
Ah, jetzt macht es Sinn.  :)

Mit SQL sollte das wirklich gehen. Du kannst ja mit set userCommand ein SQL Statement abgeben und über userCommandResult das Ergebnis auslesen.

So sollte bei mysql die Syntax sein.
SELECT VALUE - ( SELECT VALUE
FROM history
WHERE DEVICE = 'wetterstation' AND READING = 'regen' AND TIMESTAMP >= (NOW() - INTERVAL 10 HOUR)
ORDER BY DATE(TIMESTAMP) ASC LIMIT 0,1 )
FROM history
WHERE DEVICE = 'wetterstation' AND READING = 'regen'
ORDER BY DATE(TIMESTAMP) DESC LIMIT 0,1;


Zur Erklärung.
Das sind zwei abfragen. Die erste Abfrage gibt den aktuellen Wer aus und davon wird die Abfrage in der Klammer abgezogen, die den ersten Wert vor 10 Stunden zurück gibt.

Das Statement INTERVAL ist sehr umfangreich, kann also auch Week und Day usw.

Gruß Phill
Homebrew 1-Wire / HomeMatic Mix - Cubietruck mit FHEM als Server - Raspberry PI 3 als Informationsanzeige im MagicMirror Stil - Raspberry Pi 1 als Klingelanlage - VDR

Mein Modul: Talk2Fhem - Mein Tipp: https://forum.fhem.de/index.php/topic,82442.0.html

Pnemenz

Das SQL-Statement ist nicht das Problem, ich habe ein ähnliches, vielleicht nicht ganz so Elegantes.

Dir Frage ist, ob der Modulautor diese Funktion nicht einbauen kann. Um in einem DOIF die Berechnung zu Verwenden ist es doch sehr umständlich zuerst mit set userCommand die Abfrage abzusetzen, mit einem weiteren Befehl den Wert auslesen und dann die Zeit zu berechnen und schalten.

Ich habe mein SQL-Statement in das Modul eingebaut, das ist aber auch keine gute Lösung, da ich dann dieses Modul nicht mehr updaten kann. Abgesehen davon bin ich kein guter Programierer und daher ist die Lösung nicht besonders  Elegant.

Peter

Phill

ZitatDir Frage ist, ob der Modulautor diese Funktion nicht einbauen kann. Um in einem DOIF die Berechnung zu Verwenden ist es doch sehr umständlich zuerst mit set userCommand die Abfrage abzusetzen, mit einem weiteren Befehl den Wert auslesen und dann die Zeit zu berechnen und schalten.
Da gebe ich dir Recht es ist wirklich umständlich. Nur wenn man das Modul erweitert wo fängt man an und wo hört man auf. Ich glaube nicht das solche Auswertefunktionen in nächster Zeit kommen werden. Wenn sich da aber einer ran trauen würde wäre das natürlich toll.

Du kannst mit Perl direkt auf das Modul zugreifen um deine SQL Statements abzugeben, das sollte dir vielleicht helfen etwas flexibler zu werden.
{ my @a = $defs{"LOGDB_DEVICE"}{DBH}->selectrow_array("SQL STATEMENT") }
Hierbei wird die SQL Antwort in dem Array @a gespeichert. Das lässt sich dann beliebig weiter verwenden.
LOGDB_DEVICE natürlich durch deinen Devicenamen ersetzen.

Gruß

Homebrew 1-Wire / HomeMatic Mix - Cubietruck mit FHEM als Server - Raspberry PI 3 als Informationsanzeige im MagicMirror Stil - Raspberry Pi 1 als Klingelanlage - VDR

Mein Modul: Talk2Fhem - Mein Tipp: https://forum.fhem.de/index.php/topic,82442.0.html