Hinweis: Schöne Alternative für Charts/Plots mit Grafana und DBLog (MySQL)

Begonnen von Thyraz, 08 Oktober 2017, 15:02:38

Vorheriges Thema - Nächstes Thema

peterk_de

Hier noch der Trick für das "Discrete"-Plugin (umgeht einen ungefixten Bug bei der Auswertung von Strings, wie sie FHEM in Verbindung mit DBLog aber normalerweise produziert):

SQL:

SELECT
  UNIX_TIMESTAMP(TIMESTAMP) as time_sec,
  "Anwesenheit" as metric,
      case
        when VALUE = 'Ja' then 3
        when VALUE = 'Möglich' then 2
        when VALUE = 'Unbekannt' then 1
        when VALUE = 'Nein' then 0
        when VALUE is null then 0
    end as value
FROM history
WHERE READING="state" AND DEVICE="bad.oben.anwesenheit" AND $__timeFilter(TIMESTAMP)


Im Plugin dann im Tab "Mappings" entsprechende Mappings zurück anlegen ( 3 auf "Ja", 2 auf "Möglich") usw.

Ergebnis siehe Anhang.
FHEM auf Ubuntu-VM / 2xNUC Proxmox Cluster
UI: HomeKit, TabletUI, Grafana
IOdevs: 2xHueBridge, RaspiMatic-CCU, CUL868, 2xHarmonyHub, 6xRaspi-Roomnode mit CO2, VOC und lepresenced
Devices: 107xHomematic(IP), 96xPhilips Hue, 17xTECHEM, 12xBTLE, 8xSONOS, 2xHomeConnect, 1xShelly 3em, 1xNanoleaf ...

screetch82

hier mal zwei Beispiele für ein Dashboard für FHEM und dazu eins für eine Solarthermieanlage von Weishaupt (Daten sind in einer von FHEM separaten DB).
Grafana vereint beide Daten wunderbar, sodass ich mich nicht mit dem Mühsamen import von externen CSV logs kümmern muss.


f-zappa

Moin,
zuerst mal vielen Dank dafür, dass Du uns auf Grafana aufmerksam gemacht hast und schon so viel FHEM-spezifisches beschrieben hast. Ich habe inzwischen auch schon ein wenig herumgespielt, die Installation und Implementation geht ja wirklich umwerfend fix. Bei deiner Lösung zu "Plottabriss vermeiden" war ich aber etwas unglücklich damit, dass die eigentliche Abfrage vier mal redundant da steht. Sobald man etwas ändert, muss man die Änderung an verschiedenen Stellen vornehmen.

Zitat von: Thyraz am 12 Oktober 2017, 14:15:57
- Den letzte Datenpunkt vor dem angezeigten Zeitraum
- Den ersten Datenpunkt nach dem angezeigten Zeitraum (Bei einem Anzeigezeitraum bis zur aktuellen Zeit, oder bis in die Zukunft wird hier eben kein Datenpunkt gefunden)

Ich mache das so, indem ich in Subqueries zuerst das Zeitintervall erweitere und die Werte dann aus diesem erweiterten Intervall herausselektiere:

SELECT
  UNIX_TIMESTAMP(TIMESTAMP) as time_sec,
  VALUE as value,
  "Ventil" as metric
FROM history
WHERE READING="actuator" AND DEVICE="o2.rt.spielzimmer_heizung"
AND TIMESTAMP BETWEEN
    IFNULL((SELECT max(TIMESTAMP) from history where reading="actuator" and device="o2.rt.spielzimmer_heizung" and TIMESTAMP <= $__timeFrom()),$__timeFrom())
and IFNULL((SELECT min(TIMESTAMP) from history where reading="actuator" and device="o2.rt.spielzimmer_heizung" and TIMESTAMP >= $__timeTo()),$__timeTo() )


Schön wäre jetzt noch, wenn man auch die Werte für Reading und Device nur noch  an einer Stelle angeben müsste. Allerdings mag Grafana nicht, wenn ich vorab ein "SET @READING=blabla;" setze - man muss sich wohl auf ein Statement beschränken :( Vielleicht hat jemand dafür eine andere Idee? Mein SQL ist dürftig ...

Zitat
- Einen zusätzlichen virtuellen (nicht in MySQL vorhandenen) Datenpunkt, der den letzten Zustand in der Datenbank nimmt und ihn mit der aktuellen Zeit kombiniert.
  Dadurch wird der Plot auch nach dem letzten Wert in der DB noch bis zum aktuellen Zeitpunkt weitergezeichnet.

Den virtuellen Punkt kann meine Lösung leider nicht liefern. Das wäre noch das Zückerchen obendrauf. Allerdings  kann ich darauf noch am ehesten verzichten, weil da ja klar ist, dass der letzte Wert weiter gilt ...

peterk_de

f-zappa, das müsste man recht easy mit den grafana-templates lösen können, die Variablen in den Querys ermöglichen:

http://docs.grafana.org/reference/templating/

Du kannst dann sogar aussuchen, ob man die Variable direkt über ein dropdown in der GUI belegen kann oder nicht. Ist nicht ganz das was du tun willst aber vielleich sogar noch vielseitiger!?
FHEM auf Ubuntu-VM / 2xNUC Proxmox Cluster
UI: HomeKit, TabletUI, Grafana
IOdevs: 2xHueBridge, RaspiMatic-CCU, CUL868, 2xHarmonyHub, 6xRaspi-Roomnode mit CO2, VOC und lepresenced
Devices: 107xHomematic(IP), 96xPhilips Hue, 17xTECHEM, 12xBTLE, 8xSONOS, 2xHomeConnect, 1xShelly 3em, 1xNanoleaf ...

Thyraz

Beispiel: Bar Chart mit summierten, täglichen Betriebsstunden ohne Statistics Modul.

Jetzt mal ein etwas komplexerer Request.  :P

Anstatt Duration Values von dem  Statistics Modul loggen zu lassen,
sollen hier Summen-Zeiten direkt im MySQL Select berechnet werden.

Man erspart sich so zusätzliche Hilfswerte in der Datenbank.
Das Ganze ist natürlich weit rechenintensiver als fertige Werte aus der DB zu laden.

Als Beispiel dient ein Heizkreis meiner Fußbodenheizung, bei welchem ich sehen will wie lange pro Tag das Ventil geöffnet/geschlossen ist.
Das Ventil loggt bei jedem Schaltvorgang die Ventilstellung als 0 oder 1.
Im Bild unten im Anhang kann man sich das Ergebnis schon mal anschauen.

Nähern wir uns dem Problem Stück für Stück:

Hauptproblem ist die Summe der Zeiten zwischen zwei Einträgen direkt im Query berechnen zu lassen.
Wir verwenden hierfür Variablen um uns immer den letzten Wert zu merken und so die Differenz zu berechnen.

Zitat
SELECT
  TIMESTAMP as time_sec,
  VALUE as value,
  IF (IF (@ONTIME := TIMESTAMPDIFF(SECOND, TIMESTAMP, @OLDTIME), 1, 1) AND IF (@OLDTIME := TIMESTAMP, 1, 1), @ONTIME , 0) as on_time
FROM history
JOIN (SELECT @OLDTIME := NOW()) AS var
WHERE READING="Heizkreis_Schlafzimmer" AND DEVICE="Heizung" AND $__timeFilter(TIMESTAMP)
ORDER BY TIMESTAMP DESC
Der Trick hier ist, dass MySQL über jeden gefundenen Eintrag looped um die zurückgelieferte Tabelle mit den angeforderten time_sec, value und on_time Werten zu füllen.
Und zwar erst nachdem das ORDER BY TIMESTAMP DESC ausgeführt wurde.
Dadurch laufen wir rückwarts durch die Zeit.

Das liefert uns eine Tabelle, welche zusätzlich noch eine Spalte on_time hat.
Diese beinhaltet die Zeitspanne wie lang das jeweilige Signal aktiv geblieben ist bis der nächste Zeitstempel / Zustand eintritt.

Nehmen wir dieses Ergebnis nun als Datenquelle für einen weiteren Select um nur die Zeitspannen für den eingeschalteten (1) Zustand pro Tag zu addieren:
Zitat
SELECT
  DATE_FORMAT(time_sec, '%Y-%m-%d 00:00:00')) as time_sec,
  SUM(on_time) / 3600 as value
FROM (
   <hier wird das vorherige SELECT Statement eingefügt>
WHERE VALUE = "1"
GROUP by DATE_FORMAT(time_sec, '%Y-%m-%d')
- Gruppieren der Werte nach dem Tag an dem sie aufgetreten sind
- Nur Zeitspannen selektieren bei denen das Ventil an (1) war
- Summe der Zeitspannen pro Tag bilden.

Damit wäre die Aufgabe an sich erfüllt und wir könnten unser Diagramm so einsetzen. :)

Es sind dann aber doch noch 2 Fehler drin:
- Bisher werden Zeitspannen z.B. von 23:55 bis 0:05 komplett dem alten Tag angerechnet, statt 5min alter Tag / 5min neuer Tag. Wir müssen also vor dem Berechnen der Zeitdifferenzen für jeden Tag noch einen virtuellen Zeitstempel mit dem jeweils aktuellen Value bei 0:00 einfügen.
- Damit erhalten wir am Anfang eines jeden Tages einen sauberen Wert. Was noch fehlt ist ein letzter Eintrag für den letzten Tag des angezeigten Zeitraums. Wenn der Zeitraum am aktuellen Tag endet verlängern wir bis NOW(), sonst bis 0:00Uhr des Folgetages.

Im Netz habe ich ein nettes SELECT Statement gefunden, welches uns für 1970 bis 2200 für jeden Tag einen Datumsstempel liefert.
So sieht dann unsere Lösung für die 2 verbleibenden Probleme aus:
Zitat
(
   SELECT
     gen_date
   FROM
     (SELECT ADDDATE('1970-01-01',t4*10000 + t3*1000 + t2*100 + t1*10 + t0) gen_date FROM
       (SELECT 0 t0 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) t0,
       (SELECT 0 t1 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) t1,
       (SELECT 0 t2 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) t2,
       (SELECT 0 t3 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) t3,
       (SELECT 0 t4 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) t4
     ) v
   WHERE $__timeFilter(gen_date)
)
UNION
(
   SELECT IF (DATE($__timeTo()) = CURRENT_DATE(), NOW(), DATE_ADD(DATE($__timeTo(), INTERVAL 1 DAY)) as gen_date
)


Wenn wir das dann alles zusammenfügen, kommt Folgendes heraus:
(Das "geteilt durch 86400" und "mal 100" rechnet die Sekundenwerte dann in Prozent um.)
Zitat
SELECT
  UNIX_TIMESTAMP(DATE_FORMAT(time_sec, '%Y-%m-%d 00:00:00')) as time_sec,
  (SUM(on_time) / 86400) * 100 as value,
  "Schlafzimmer" as metric
FROM (
  # -- Differenz zwischen den Zeitwerten berechnen
  SELECT
    time_sec,
    VALUE,
    IF (IF (@ONTIME := TIMESTAMPDIFF(SECOND, time_sec, @OLDTIME), 1, 1) AND IF (@OLDTIME := time_sec, 1, 1) AND IF (@ONTIME IS NULL, 0,1), @ONTIME , 0) as on_time
  FROM (
    # -- Eigentliche Abfrage der Werte aus der DB --
    SELECT
      TIMESTAMP as time_sec,
      VALUE
    FROM history
    WHERE READING="Heizkreis_Schlafzimmer" AND DEVICE="Heizung" AND $__timeFilter(TIMESTAMP)
 
    UNION
 
    # -- Jeweils aktuell gültiger Wert für alle virtuellen Zeitstempel bestimmen --
    SELECT
      time_sec,
      ( SELECT VALUE
        FROM history
        WHERE READING="Heizkreis_Schlafzimmer" AND DEVICE="Heizung" AND TIMESTAMP <= time_sec
        ORDER BY TIMESTAMP DESC
        LIMIT 1
      ) as VALUE
    FROM (
      # -- Virtuelle Zeitstempel zu Beginn jeden Tages erstellen --
      SELECT
        time_sec
      FROM
        (SELECT ADDDATE('1970-01-01',t4*10000 + t3*1000 + t2*100 + t1*10 + t0) time_sec FROM
          (SELECT 0 t0 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) t0,
          (SELECT 0 t1 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) t1,
          (SELECT 0 t2 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) t2,
          (SELECT 0 t3 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) t3,
          (SELECT 0 t4 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) t4
        ) a
      WHERE $__timeFilter(time_sec)
   
      UNION
   
        # -- Virtuellen Zeitstempel für Endpunkt hinzufügen --
      SELECT IF (DATE($__timeTo()) = CURRENT_DATE(), NOW(), DATE_ADD(DATE($__timeTo()), INTERVAL 1 DAY)) as time_sec
    ) b
    ORDER BY time_sec DESC
  ) c
  JOIN (SELECT @OLDTIME := NOW()) AS var
) d
WHERE VALUE = "1"
GROUP by DATE(time_sec)
ORDER BY time_sec

Fazit: Die Vorlauftemperatur ist bei uns in der Übergangszeit eigentlich viel zu hoch.
Aber das kann man im Mehrfamilienhaus halt nicht immer für sich selbst optimieren. ;)
Fhem und MariaDB auf NUC6i5SYH in Proxmox Container (Ubuntu)
Zwave, Conbee II, Hue, Harmony, Solo4k, LaMetric, Echo, Sonos, Roborock S5, Nuki, Prusa Mini, Doorbird, ...

peterk_de

Zitat von: f-zappa am 16 November 2017, 23:55:24
Moin,
zuerst mal vielen Dank dafür, dass Du uns auf Grafana aufmerksam gemacht hast und schon so viel FHEM-spezifisches beschrieben hast. Ich habe inzwischen auch schon ein wenig herumgespielt, die Installation und Implementation geht ja wirklich umwerfend fix. Bei deiner Lösung zu "Plottabriss vermeiden" war ich aber etwas unglücklich damit, dass die eigentliche Abfrage vier mal redundant da steht. Sobald man etwas ändert, muss man die Änderung an verschiedenen Stellen vornehmen.

...

Schön wäre jetzt noch, wenn man auch die Werte für Reading und Device nur noch  an einer Stelle angeben müsste. Allerdings mag Grafana nicht, wenn ich vorab ein "SET @READING=blabla;" setze - man muss sich wohl auf ein Statement beschränken :( Vielleicht hat jemand dafür eine andere Idee? Mein SQL ist dürftig ...


Ich habe da jetzt die Lösung, wie man Grafana die MySQL-Variablen unterjubeln kann - und man gleichzeitig die Template-Variablen von Grafana verwenden kann ^^ :

(
SELECT
  UNIX_TIMESTAMP(TIMESTAMP) as time_sec,
  VALUE as value,
  @label as metric
FROM history, ( SELECT @reading:="humidity", @device:=CONCAT([[room]],".wandthermostat_Weather"), @label:="Luftfeuchtigkeit") AS var
WHERE READING=@reading AND DEVICE=@device AND $__timeFilter(TIMESTAMP)
)

UNION

-- Kurve am Anfang um den letzten Wert vor dem aktuellen Zeitraum erweitern
(
  SELECT
    UNIX_TIMESTAMP(TIMESTAMP) as time_sec,
    VALUE as value,
    @label as metric
  FROM history
  WHERE READING=@reading AND DEVICE=@device AND TIMESTAMP <= $__timeFrom() -- Letzter Wert vor Anfangszeit des aktuellen Zeitraums
  ORDER BY TIMESTAMP DESC
  LIMIT 1   
)

UNION

-- Kurve mit nächstem Wert nach dem aktuellen Zeitraum erweitern
(
SELECT
    UNIX_TIMESTAMP(TIMESTAMP) as time_sec,
    VALUE as value,
    @label as metric
  FROM history
  WHERE READING=@reading AND DEVICE=@device AND TIMESTAMP >= $__timeTo() -- Letzten Wert im aktuellen Zeitraum holen
  ORDER BY TIMESTAMP ASC
  LIMIT 1 
)

UNION

-- Kurve mit letztem Wert der Kurve (nicht des gewählten Zeitraums) bis zum aktuellen Zeitpunkt erweitern
(
SELECT
    UNIX_TIMESTAMP(NOW()) as time_sec,
    VALUE as value,
    @label as metric
  FROM history
  WHERE READING=@reading AND DEVICE=@device
  ORDER BY TIMESTAMP DESC
  LIMIT 1
)

ORDER BY time_sec ASC


Man setzt Device / Reading jetzt nur noch einmal in dieser Zeile (alles andere bleibt immer gleich):

FROM history, ( SELECT @reading:="humidity", @device:=CONCAT([[room]],".wandthermostat_Weather"), @label:="Luftfeuchtigkeit") AS var

Hier verwende ich auch (als einzige Stelle) die Grafana-Template-Variable "room". Die ist vom Typ "Custom" (Definition oben über das Zahnrad --> Templating) und wird mit allen Raumkürzeln aus FHEM als Auswahlmöglichkeit definiert, in meinem Fall:

bad.oben, schlafzimmer, kueche, stube, bad.unten, kinderzimmer, flur.unten, keller, buero

Jetzt baut Grafana daraus - je nach Auswahl im Dropdownmenü oben im Panel, was nach Definition + Verwendung der Variablen automatisch erscheint - Devicenamenen wie bad.unten.wandthermostat_Weather oder schlafzimmer.wandthermostat_Weather usw. zusammen und die Linien werden schön von Anfang bis Ende des Diagramms durchgezogen.
FHEM auf Ubuntu-VM / 2xNUC Proxmox Cluster
UI: HomeKit, TabletUI, Grafana
IOdevs: 2xHueBridge, RaspiMatic-CCU, CUL868, 2xHarmonyHub, 6xRaspi-Roomnode mit CO2, VOC und lepresenced
Devices: 107xHomematic(IP), 96xPhilips Hue, 17xTECHEM, 12xBTLE, 8xSONOS, 2xHomeConnect, 1xShelly 3em, 1xNanoleaf ...

Thyraz

Fhem und MariaDB auf NUC6i5SYH in Proxmox Container (Ubuntu)
Zwave, Conbee II, Hue, Harmony, Solo4k, LaMetric, Echo, Sonos, Roborock S5, Nuki, Prusa Mini, Doorbird, ...

peterk_de

Thyraz na du hast da ja auch ein geniales Tool ausgegraben. Deine letzte Lösung (Berechnung der Zeitdifferenzen) hatte ich gerade angefangen, und da postest du es schon in fertig. Mein ehemaliger Datenbanken-Dozent wäre stolz auf dich ;-)

Die Union-Lösung für den Plottabriss versuche ich ansonsten performancemäßig mal noch zu optimieren, durch das mehrfache Sortieren ist die sehr ineffizient.
FHEM auf Ubuntu-VM / 2xNUC Proxmox Cluster
UI: HomeKit, TabletUI, Grafana
IOdevs: 2xHueBridge, RaspiMatic-CCU, CUL868, 2xHarmonyHub, 6xRaspi-Roomnode mit CO2, VOC und lepresenced
Devices: 107xHomematic(IP), 96xPhilips Hue, 17xTECHEM, 12xBTLE, 8xSONOS, 2xHomeConnect, 1xShelly 3em, 1xNanoleaf ...

andies

Zitat von: Thyraz am 11 Oktober 2017, 11:21:48
Ja, gibt in der Doku eine Sektion zum Sharen.
Das beinhaltet verschiedene Embed Lösungen, aber auch direkte PNG Erstellung eines Diagramms.

Hier ein Beispiel mit Link auf die Online-Demo von Grafana...
Aber mit genau welchem Befehl versendest Du das innerhalb von Telegram? Ich kriege da nur Fehlermeldungen, file not found etc.


Gesendet von iPad mit Tapatalk Pro
FHEM 6.1 auf RaspPi3 (Raspbian:  6.1.21-v8+; Perl: v5.32.1)
SIGNALduino (433 MHz) und HM-UART (868 MHz), Sonoff, Blitzwolf, Somfy RTS, CAME-Gartentor, Volkszähler, Keyence-Sensor, Homematic-Sensoren und -thermostat, Ferraris-Zähler für Wasseruhr, Openlink-Nachbau Viessmann

Thyraz

@andies ich nutze Telegram nicht, schätze aber mal du musst das File erst downloaden um es dann verschicken zu können.

Weiß nicht ob es da ein passendes Modul gibt.
Mit wget könnte es evtl. auch funktionieren.

Da das Generieren des Bildes ja etwas dauern könnte sollte es auf alle Fälle async passieren, damit es FHEM nicht blockiert.

@Peter optimiere gerne alles was verbesserungswürdig ist, passe das dann gern in meinen Posts an.
Was in MySQL von der Performance gut oder böse ist, erkenne ich als Laie leider noch nicht so recht.

Bin ja schon froh, dass ich überhaupt eine Lösung für diverse Problemstellungen hinbekommen habe.
Versuche die Probleme halt immer in kleine Häppchen aufzuteilen um diese dann per Google und Stackoverflow gelöst zu bekommen.

Das letzte Beispiel hat mir aber einige Kopfschmerzen bereitet.  :P

Grüße,
Tobias
Fhem und MariaDB auf NUC6i5SYH in Proxmox Container (Ubuntu)
Zwave, Conbee II, Hue, Harmony, Solo4k, LaMetric, Echo, Sonos, Roborock S5, Nuki, Prusa Mini, Doorbird, ...

andies

Zitat von: Thyraz am 18 November 2017, 10:24:34
@andies ich nutze Telegram nicht, schätze aber mal du musst das File erst downloaden um es dann verschicken zu können.
Hi Tobias, daran hatte ich nicht gedacht. Leider geht
wget http://raspfhem.fritz.box:3000/render/dashboard/db/temperaturen?panelId=2

nicht, das speichert mir eine html-Datei
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
    <meta name="viewport" content="width=device-width">
    <meta name="theme-color" content="#000">

    <title>Grafana</title>

                <base href="/" />


                  <link rel="stylesheet" href="public/build/grafana.dark.css?v4.6.1">


    <link rel="icon" type="image/png" href="public/img/fav32.png">
    <link rel="mask-icon" href="public/img/grafana_mask_icon.svg" color="#F05A28">
        </head>

        <body ng-cloak>
                <grafana-app class="grafana-app">

                        <aside class="sidemenu-wrapper">
                                <sidemenu ng-if="contextSrv.sidemenu"></sidemenu>
                        </aside>

                        <div class="page-alert-list">
                                <div ng-repeat='alert in dashAlerts.list' class="alert-{{alert.severity}} alert">
                                        <div class="alert-icon"><i class="{{alert.icon}}"></i></div>
                                        <div class="alert-body">
                                                <div class="alert-title">{{alert.title}}</div>
                                                <div class="alert-text" ng-bind='alert.text'></div>
                                        </div>
                                        <button type="button" class="alert-close" ng-click="dashAlerts.clear(alert)">
                                                <i class="fa fa fa-remove"></i>
                                        </button>
                                </div>
                        </div>

                        <div ng-view class="main-view"></div>
                        <footer class="footer">
                                <div class="row text-center">
FHEM 6.1 auf RaspPi3 (Raspbian:  6.1.21-v8+; Perl: v5.32.1)
SIGNALduino (433 MHz) und HM-UART (868 MHz), Sonoff, Blitzwolf, Somfy RTS, CAME-Gartentor, Volkszähler, Keyence-Sensor, Homematic-Sensoren und -thermostat, Ferraris-Zähler für Wasseruhr, Openlink-Nachbau Viessmann

andies

FHEM 6.1 auf RaspPi3 (Raspbian:  6.1.21-v8+; Perl: v5.32.1)
SIGNALduino (433 MHz) und HM-UART (868 MHz), Sonoff, Blitzwolf, Somfy RTS, CAME-Gartentor, Volkszähler, Keyence-Sensor, Homematic-Sensoren und -thermostat, Ferraris-Zähler für Wasseruhr, Openlink-Nachbau Viessmann

andies

Ich habe eine Frage. Mein Tiefkühlschrank ist kaputt und wird notgedrungen via Sonoff TH10 betrieben. Nun würde ich mir gern die Temperaturen und die Zeiten, in denen der Kompressor läuft, anzeigen lassen. Und zwar so, dass man die Temperaturkurve während der Kompressorlaufzeit einfach "ausfüllt". Das Ausfüllen schaffe ich nicht.

Das Device sieht so aus:
Internals:
   IODev      Mosquitto
   NAME       Sonoff_TH10a
   NR         107
   STATE      -15.8 °C / 94 %
   TYPE       MQTT_DEVICE
   Helper:
     DBLOG:
       myTemperature:
         DbLog:
           TIME       1511105824.57732
           VALUE      -15.8
       mypower:
         DbLog:
           TIME       1511105824.57732
           VALUE      1
   READINGS:
     2017-11-19 16:37:04   AM2301_Humidity 98.9
     2017-11-19 16:37:04   AM2301_Temperature -15.8
     2017-11-19 12:11:49   LWT             Online
     2017-11-19 16:37:04   POWER           on
     2017-11-19 16:37:04   SENSOR          {"Time":"2017-11-19T16:37:04", "AM2301":{"Temperature":-15.800, "Humidity":98.9}, "TempUnit":"C"}
     2017-11-19 16:37:04   TempUnit        C
     2017-11-19 16:37:04   Time            2017-11-19T16:37:04
     2017-11-19 16:37:04   Uptime          4
     2017-11-19 16:37:04   Vcc             3.124
     2017-11-19 16:37:04   Wifi_AP         1
     2017-11-19 16:37:04   Wifi_RSSI       46
     2017-11-19 16:37:04   myTemperature   -15.8
     2017-11-19 16:37:04   mypower         1
     2017-11-19 16:27:04   state           on
     2017-11-19 16:37:04   transmission-state incoming publish received
   message_ids:
   publishSets:
     :
       topic      cmnd/sonoff_th10a/POWER
       values:
         on
         off
   sets:
     off
     on
   subscribe:
     tele/sonoff_th10a/LWT
     tele/sonoff_th10a/SENSOR
     tele/sonoff_th10a/STATE
   subscribeExpr:
     ^tele\/sonoff_th10a\/LWT$
     ^tele\/sonoff_th10a\/SENSOR$
     ^tele\/sonoff_th10a\/STATE$
   subscribeReadings:
     tele/sonoff_th10a/LWT:
       cmd
       name       LWT
     tele/sonoff_th10a/SENSOR:
       cmd
       name       SENSOR
     tele/sonoff_th10a/STATE:
       cmd
       name       STATE
Attributes:
   IODev      Mosquitto
   devStateIcon .*:noIcon:noFhemwebLink
   group      Messung
   publishSet on off  cmnd/sonoff_th10a/POWER
   room       Info
   stateFormat {sprintf ("%.1f °C / %.0f %%", ReadingsNum($name,"myTemperature",0), ReadingsVal($name,"AM2301_Humidity",0)-5)}
   subscribeReading_LWT tele/sonoff_th10a/LWT
   subscribeReading_SENSOR tele/sonoff_th10a/SENSOR
   subscribeReading_STATE tele/sonoff_th10a/STATE
   userReadings myTemperature {ReadingsNum($name, "AM2301_Temperature", 0)}, mypower {if (ReadingsVal($name, "POWER", "") eq "off") {return 0} elsif (ReadingsVal($name, "POWER", "") eq "on") {return 1} }
   verbose    2
   webCmd     on:off

und die wichtigen Daten stehen in mypower und myTemperature. Bisher habe ich nur
SELECT
    UNIX_TIMESTAMP(TIMESTAMP) as time_sec,
    AVG(VALUE) as value,
    "Sonoff" as metric
  FROM history
  WHERE READING="myTemperature" AND DEVICE="Sonoff_TH10a" AND $__timeFilter(TIMESTAMP)
  GROUP BY UNIX_TIMESTAMP(TIMESTAMP) DIV 600

und dann fehlt das ausfüllen.

Ich könnte ein weiteres device mit mypower*myTemperature anlegen und das füllen, aber geht es nicht mit mySQL?
FHEM 6.1 auf RaspPi3 (Raspbian:  6.1.21-v8+; Perl: v5.32.1)
SIGNALduino (433 MHz) und HM-UART (868 MHz), Sonoff, Blitzwolf, Somfy RTS, CAME-Gartentor, Volkszähler, Keyence-Sensor, Homematic-Sensoren und -thermostat, Ferraris-Zähler für Wasseruhr, Openlink-Nachbau Viessmann

SeppiDeluxe

Hallo zusammen,

mit Interesse verfolge ich diesen Thread und habe auch schon meine FHEM Installation erweitert. Standards wie Kurververläufe oder Statisktiken sind kein Thema.
Ich beiße mir an einem Thema die Zähne aus.

Zustände!!

Szenario: Bad Temp, Feucht und so weiter jetzt in Konbination die Lüfterstufe (start/stop Zustände in der LogDB). Auf der DB Seit Abfrage mit

SELECT
      UNIX_TIMESTAMP(TIMESTAMP) as time_sec,
    case
      when VALUE = 'start' then 1
      when VALUE = 'stop' then 0
    end as value,
    "Lüfter" as metric
  FROM history
  WHERE READING="getG1" AND DEVICE="KNX_0101030"

alles schick. Gibt ne schöne Tabelle. Jetzt aber der Transfer nd ie Grafana Welt... ich kriegs nicht hin. Also keien schöne Binärkurve (Stufe) mit 1  oder 0.

Hat irgendjemand das Thema bereits im Einsatz oder einen Ansatz für mich danke euch. Ich denke, die HErausforderung liegt ind er Werteinterpolation das die Zustädne nur für einen Zeitstempel exitieren. Dazwischen müsste bis zum Wechsel der Zustand gehalten wwrden und das krieg ich nciht in die Diagramme rüber.

Danke euch Sebastian

peterk_de

Hi Seppi,

doch genau so geht das, dein Code sieht vollkommen korrekt aus, so mache ich das auch z.B. für meine Bewegungssensoren, die nur "motion" oder "noMotion" liefern. Dass die Werte dann "gehalten" werden machst du über die Option "Staircase line" (Tab Display -> Series Override -> Deine Metric ("Lüfter") hinzufügen -> Staircase Line 1.
FHEM auf Ubuntu-VM / 2xNUC Proxmox Cluster
UI: HomeKit, TabletUI, Grafana
IOdevs: 2xHueBridge, RaspiMatic-CCU, CUL868, 2xHarmonyHub, 6xRaspi-Roomnode mit CO2, VOC und lepresenced
Devices: 107xHomematic(IP), 96xPhilips Hue, 17xTECHEM, 12xBTLE, 8xSONOS, 2xHomeConnect, 1xShelly 3em, 1xNanoleaf ...