[Modul] Grafana

Beides gemacht, rote Linie ist weg.
Jetzt macht er etwas. Mal schauen was gleich passiert

Query Manager bricht wieder mit Timeout ab. Unter Data sind keine Daten.

Stats: total request time 30.3s
queries 4
number rows 0

Update: Ich habe jetzt mal alle Variablen bis auf eine gelöscht. Jetzt zeigt er mir was an. Laufzeit 28s bei 7 Tagen Zeitraum.
Ich versuche jetzt einmal eine weitere Variabe hinzuzufügen.

OK, also sobald eine zweite Variable dazu kommt, bekommt er keine Daten mehr.
Laufzeit bei einer Variablen 28sec, bei zwei Variablen schon bei 85sec.

Hat jemand eine Idee wie ich die Verarbeitungszeiten verbessern kann?
Minutenwerte der Variablen wären denke ich besser, aber wie kann ich diese am besten u d schnellsten Bearbeiten?

Hallo
Kannst du mal folgendes Testen wie lange bei dir eine Abfrage dauert.

$RecordLimit = IPS_GetOption('ArchiveRecordLimit');
echo "\nRecord Limit:" . $RecordLimit;

$RecordLimit = 10000;

$archiv = 25204;
$variable = 43687;

$start = time();
$werte = AC_GetLoggedValues($archiv, $variable, 0, time(), $RecordLimit);
$ende = time();
$diff = $ende - $start;
echo "\nLaufzeit : ". $diff . " Sekunden / Werte : " . count($werte);

$start = time();
$werte = AC_GetAggregatedValues($archiv, $variable, 5, 0,time(), $RecordLimit );   // 5-Minuetige Aggregation
$ende = time();
$diff = $ende - $start;
echo "\nLaufzeit : ". $diff . " Sekunden / Werte : " . count($werte);

Bei mir sieht das Ergebnis so aus :
Laufzeit : 0 Sekunden / Werte : 10000
Laufzeit : 0 Sekunden / Werte : 10001

Record Limit:10000
Laufzeit : 8 Sekunden / Werte : 10000
Warning: Read too many values when computing minutely aggregation in /mnt/data/symcon/scripts/37872.ips.php on line 18

Warning: count(): Parameter must be an array or an object that implements Countable in /mnt/data/symcon/scripts/37872.ips.php on line 21

Laufzeit : 8 Sekunden / Werte : 1

Ich war heute bei einem Kumpel der viel mit Grafana macht.
Er nutzt FHEM mit einer Datenbank. Geloggte Daten sind auch Sekundenwerte.
Bei ihm Funktioniert es ohne Probleme diese Werte in Grafana anzuzeigen und das fast Live. Glaube alle 5 oder 10s aktualisieren sich die Grafana Werte.

Warum funktioniert das in Verbindung mit Symcon nicht. :smirk:

Hallo
8 Sekunden fuer eine Datenbankabfrage ist schon ziemlich viel.
Bei mir sind 10000 Werte unter einer Sekunde.
Das hat nichts mit Grafana zu tun sondern mit der Datenbank.
Welche CPU Auslast hast du den im „Normalbetrieb“
Moeglich schon ziemlich viel CPU-Last, deshalb beim
Abrufen von Daten schon ausgelastet. Kannst du die mal checken?

Hier nochmal ein Script welche die Fehlermeldung nicht hat :

$archiv = 25204;
$variable = 43687;

for ($RecordLimit=10000;$RecordLimit>=1000;$RecordLimit=$RecordLimit-1000)
    {
    echo "\nRecord Limit:" . $RecordLimit;    
    $starttime = 0;
    
    $start = time();
    $werte = @AC_GetAggregatedValues($archiv, $variable, 5 , $starttime, time(), $RecordLimit);
    $ende = time();
    $diff = $ende - $start;
    if ( $werte === false )
            {
            $s = "Fehler";
            $startdata = 0;
            }
        else
            {
            $s = count($werte);
            $startdata = @$werte[$s-1]['TimeStamp'];
            }
        
    echo " Start : " .date('d.m.Y H:i:s',$startdata) . " Laufzeit : ". $diff . " Sekunden / Werte : " . $s ;

    
    }


Vor laengerer Zeit hatten wir schon das Thema mit der Fehlermeldung.
Liest mal hier und die Antwort von Niels

CPU Auslastung schwankt zwischen 12 und 25%.

Wenn ich dein Script ausführe, geht es kurz auf 51% Auslastung, dann aber wieder runter.

Antwort auf dein Script:

Record Limit:10000 Start : 01.01.1970 01:00:00 Laufzeit : 8 Sekunden / Werte : Fehler
Record Limit:9000 Start : 01.01.1970 01:00:00 Laufzeit : 4 Sekunden / Werte : Fehler
Record Limit:8000 Start : 01.01.1970 01:00:00 Laufzeit : 5 Sekunden / Werte : Fehler
Record Limit:7000 Start : 01.01.1970 01:00:00 Laufzeit : 4 Sekunden / Werte : Fehler
Record Limit:6000 Start : 01.01.1970 01:00:00 Laufzeit : 4 Sekunden / Werte : Fehler
Record Limit:5000 Start : 01.01.1970 01:00:00 Laufzeit : 4 Sekunden / Werte : Fehler
Record Limit:4000 Start : 01.01.1970 01:00:00 Laufzeit : 2 Sekunden / Werte : Fehler
Record Limit:3000 Start : 01.01.1970 01:00:00 Laufzeit : 2 Sekunden / Werte : Fehler
Record Limit:2000 Start : 01.01.1970 01:00:00 Laufzeit : 1 Sekunden / Werte : Fehler
Record Limit:1000 Start : 01.01.1970 01:00:00 Laufzeit : 2 Sekunden / Werte : Fehler

Vielleicht magst mal die anderen Stufen probieren

Aggregationsstufe	
AGGREGATIONSSTUFE	BESCHREIBUNG
0	Stündliche Aggregation
(00:00 - 59:59)
1	Tägliche Aggregation
(00:00:00 - 23:59:59)
2	Wöchentliche Aggregation
(Montag 00:00:00 - Sonntag 23:59:59)
3	Monatliche Aggregation
(Erster Monatstag 00:00:00 - Letzter Monatstag 23:59:59)
4	Jährliche Aggregation
(01.01. 00:00:00 - 31.12. 23:59:59)
5	5-Minütige Aggregation (Aus Rohdaten berechnet)
6	1-Minütige Aggregation (Aus Rohdaten berechnet)

In dieser Zeile :

$werte = @AC_GetAggregatedValues($archiv, $variable, 5 , $starttime, time(), $RecordLimit);

Bei den Aggregationsstufen 0-4 ist die Laufzeit 0 Sekunden.
5 und 6 laufen auf einen Fehler.
Das ist doch Mist.

5 und 6 werden aus den Rohwerten beim Aufruf berechnet.
Nach meiner Rechnung hast du pro Tag 43200 Werte.
Wenn du die als nicht Aggregated Werte ausliest kriegts du nur 10000 (MaxLimit)
Also folgendes Script liefert dir 10000 Werte aber nicht den ganzen Tag.
Mal die Startzeit auf 4 Stunden stellen, da solltest du alle Werte bekommen.
In welcher Zeit ?

$archiv = 25204;
$variable = 43687;

    
$starttime = time() - ( 24*60*60 );     // 24 Stunden zurueck
    
$start = time() ;
$werte = AC_GetLoggedValues($archiv, $variable,  $starttime, time(),0);
$ende = time();
$diff = $ende - $start;
    
$s = count($werte);
$startdata = @$werte[$s-1]['TimeStamp'];
             
echo "Start : " .date('d.m.Y H:i:s',$startdata) . " Laufzeit : ". $diff . " Sekunden / Werte : " . $s ;   

Start : 17.07.2022 11:25:43 Laufzeit : 1 Sekunden / Werte : 10000

1 „Gefällt mir“

10000 ist das normale Limit. Wenn man keine Agg-Stufe will gibt er genau 10000
zurueck , Startzeit ist dementsprechend.
Man kann dieses Limit in den Spezialschaltern erhoehen.
Lies dir mal diesen Thread durch

Ich noch mal, mit meinem letzten Versuch mit Grafana zu arbeiten.
Folgende Abfrage eine Variable die sekündlich geloggt wird.
Zeitraum in Grafana 5 Minuten.
Payload Aggregationsstufe 0

Im Log sagt er
18.07.2022, 16:40:45 | GetAdditionalData[468] | Input-$Aggregationsstufe[0]
18.07.2022, 16:40:45 | GetAdditionalData[505] | Output-Aggregationsstufe[-1]
18.07.2022, 16:40:45 | CheckZeitraumForAggregatedValues[565] | Keine Aggregation uebergeben
18.07.2022, 16:40:45 | CheckZeitraumForAggregatedValues[613] | Anzahl Tage:0.0034722222222222 Aggreagationsstufe:99 Aggregationstype:0

Hook Laufzeit 30s

Für mich sieht es danach aus als wenn er die Aggregationsstufe nicht beachtet. Vielleicht täusche ich mich auch.
Verstehen tue ich nicht, das eine Abfrage von 5 Minuten geloggter Werte aus der Datenbank 30s dauert.

Hallo
Das $ Zeichen sollte da nicht stehen sondern nur Input-Aggregationsstufe[0]

OK, $ entfernt. Kürzesteste Laufzeit ist mit Stufe 4 = 15-20 Sekunden.
Manchmal braucht Stufe 4 allerdings 30 Sekunden und ich bekomme keine Daten in Grafana.
Schneller scheint es wohl mit der Symcon Datenbank nicht zu funktionieren. Oder es liegt an der Symbox. FHEM in Verbindung mit deiner InfluxDB auf einem Raspberry kann das viel schneller. Schade.
Stufe 5 und 6 funktionieren gar nicht, Log sieht wie folgt aus:

TXT: 20.07.2022, 13:01:14 | ProcessHookData[241] | Target:19441,Stromzähler Leistung Gesamt[Tasmota IR Lesekopf]

TXT: 20.07.2022, 13:01:14 | ProcessHookData[275] | From:20.07.2022 07:01:13 - To:20.07.2022 13:01:13

TXT: 20.07.2022, 13:01:14 | ProcessHookData[286] | Startime:20.07.2022 13:01:13

TXT: 20.07.2022, 13:01:14 | ProcessHookData[304] | Data ID:19441

TXT: 20.07.2022, 13:01:14 | GetAdditionalData[468] | Input-Aggregationsstufe[5]

TXT: 20.07.2022, 13:01:14 | GetAdditionalData[505] | Output-Aggregationsstufe[5]

TXT: 20.07.2022, 13:01:14 | GetAdditionalData[505] | Output-Resolution[-1]

TXT: 20.07.2022, 13:01:14 | GetAdditionalData[505] | Output-DataOffset[0]

TXT: 20.07.2022, 13:01:14 | GetAdditionalData[505] | Output-TimeOffset[0]

TXT: 20.07.2022, 13:01:14 | CheckZeitraumForAggregatedValues[559] | 5-Minuetige Aggregation

TXT: 20.07.2022, 13:01:14 | CheckZeitraumForAggregatedValues[613] | Anzahl Tage:0.25 Aggreagationsstufe:5 Aggregationstype:0

TXT: 20.07.2022, 13:01:14 | GetArchivData[871] | GetAggregatedValues:5-15912-19441-1658293273-1658314873

TXT: 20.07.2022, 13:01:15 | ProcessHookData[426] | Data String ALL :

TXT: 20.07.2022, 13:01:15 | ProcessHookData[441] | Hook Endtime:20.07.2022 13:01:15

TXT: 20.07.2022, 13:01:15 | ProcessHookData[442] | Hook Laufzeit:1 Sekunden

TXT: 20.07.2022, 13:01:17 | ProcessHookData[426] | Data String ALL :

TXT: 20.07.2022, 13:01:17 | ProcessHookData[441] | Hook Endtime:20.07.2022 13:01:17

TXT: 20.07.2022, 13:01:17 | ProcessHookData[442] | Hook Laufzeit:3 Sekunden

Gibt es eigentlich die Möglichkeit, nur den aktuellen Wert in der Datenbank abzufragen und den in Grafana anzuzeigen? Dann sollte es doch eine kurze Abfragezeit geben, da er nur ein Datenpunkt abruft. So stelle ich mir das als Laie vor.

Hallo
Bei diesem Log hat die Abfrage doch nur 1 Sekunde gebraucht und die Laufzeit vom Hook
war insgesamt 3 Sekunden !?
Das mit dem letzten Wert muss ich mir anschauen.

Es kommen aber keine Werte zurück.

Was passiert wenn du folgendes Script ausfuehrst ( Sind die Variablen im Log)

$werte = AC_GetAggregatedValues (15912,19441,5,1658293273,1658293273,0);
print_r($werte);

Antwort:

Array
(
[0] => Array
(
[Duration] => 300
[TimeStamp] => 1658293200
[Avg] => -2518.0216666667
[MinTime] => 1658293493
[Min] => -2609.8
[MaxTime] => 1658293200
[Max] => -2455.4
)

)

Nur ein Datensatz bei 6 Stunden ? Das kann nicht normal sein!