HowTo: Analyse und Monitoring mit Grafana

Hier möchte ich ein kleines Mini-Tutorial zur Verfügung stellen, wie man recht einfach Daten aus Symcon in Grafana visualisiert oder analysiert. Ich werde in Grafana selbst nicht ins Detail gehen, sonder hier in erster Linie aufzeigen was man braucht und wie die Datenübergabe funktioniert. Habe mich mit Grafana auch erst ein paar Tage auseinandergesetzt und lerne noch täglich dazu. Für mich war das ganze aber einfacher als HighCharts, mit welchem ich nie so zurecht kam. Linux und oder Docker Kenntnisse sind hier Voraussetzungen. Ich selbst habe keiner Ahnung von Programmierung und bin daher immer von anderer Leute Kenntnis angewiesen. So mal als kleiner Disclaimer :smiley:

Als kleine Veranschaulichung ein Bildchen meiner Batterievisualisierung.

Was wird benötigt:

[ul]
[li]Symcon[/li][li]influxdb <-- Datenbank[/li][li]Grafana <-- Visu[/li][/ul]

auf welchen Systemen ihr diese 3 laufen lasst bleibt euch überlassen. Mein Favorit ist natürlich Docker, da ich sie alle auf meiner Synology Diskstation laufen lassen kann und mir um Backups oder defekte SD Karten keine Sorgen machen muss.

Raspi
Hier eine kleine Anleitung für die Installation von influxdb und Grafana.
Den „Telegraf“ Anteil könnt ihr in der Anleitung weglassen…
Ein Kollege hat diese Anleitung erfolgreich genutzt. Mehr kann ich zum Raspi jetzt aber nicht sagen, da ich alles im Docker laufen lasse, weshalb ich dort mehr ins Detail gehe.

Docker

docker run -d --name influxdb -p 8086:8086 -v /volume1/docker/influxdb:/var/lib/influxdb influxdb

Auf der Synology dem User SYSTEM RW Rechte für grafana Ordner geben ! Sonst läuft der Container nicht.

docker run -d --name grafana -p 3000:3000 -v /volume1/docker/grafana:/var/lib/grafana grafana/grafana

Das Datenbanksystem „influxdb“ hat selber keine Weboberfläche, welche aber auch nicht benötigt wird, da wir nur ein Commando zum anlegen einer Datenbank brauchen.

Datenbank „spannungen“ erstellen:

curl -i -XPOST http://IPADRESSE_influxdb:8086/query --data-urlencode "q=CREATE DATABASE spannungen"

Nun kommen wir zu dem symcon Anteil. Hier einmal vielen Dank an Stephan. Das Scypt habe ich aus seinem Blog.
Um in meinem Beispiel die Batteriespannung in die zuvor angelegte Datenbank „spannungen“ in influxdb zu schreiben legen wir ein Scypt an welches wir nachher bei Variablenaktualisierung triggern.

Zeile 2: IP Adresse und Datenbankname von influxdb
Zeile 4: Variable eintragen (Bei mir „Batteriespannung“ siehe Screenshot)
Zeile 9: Hier denkt ihr euch eine Struktur aus. Am besten legt ihr euch eine Exel Datei an um zu gucken wie für euch die Struktur nachher am besten passt. z.B. Tabllenblatt „sma“ (sma ist mein Hersteller der PV WR usw); Spalte „batterie“; Zeile „gesamt“; (value ← kann man auch bezeichnen wie man mag… )

<?
$out ="http://192.168.2.2:8086/write?db=spannungen";
 
$spannung = GetValueFloat(57296 /*[PHP_Module\SMA\Sunny Island 8.0H\Batteriespannung]*/) ;
$ch = curl_init($out);
 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1 );
curl_setopt($ch, CURLOPT_POST,           1 );
curl_setopt($ch, CURLOPT_POSTFIELDS,     "sma,SunnyIsland=batteriegesamt value=" . $spannung );
 
$result=curl_exec ($ch);
$error=curl_error($ch) ;
 
echo $result ;
echo $error ;
?>

Script ausführen… es sollte kein Fehler erscheinen. Falls es ein Formatierungsfehler beim übergeben der Variable mit „Komma“ kommt, bitte Zeile 9 wie folgt abändern. (Bei mir gehts wie oben beschrieben… bei einem Kollegen nur mit Anpassung)

curl_setopt($ch, CURLOPT_POSTFIELDS,     "sma,SunnyIsland=batteriegesamt value=" . number_format($spannung/1,1,'.','') );

Wenn ihr wollt, könnt ihr im Terminal vom Docker Container über einen Befehl nachschauen ob euer Wert erfolgreich geschrieben wurde.

curl -G 'http://192.168.2.2:8086/query?pretty=true' --data-urlencode "db=spannungen" --data-urlencode "q=SELECT "value" FROM "sma" WHERE "SunnyIsland"='batteriegesam'"

Als Ergebnis erhaltet ihr dann den oder die geschriebenen Werte.

Grafana
Kommen wir nun zur Anzeige der Werte als Beispiel ein „SingleStat“ im Gauge Format.

Grafana erreicht ihr über http://IPADRESSE_GRAFANA:3000

Legt euch zu allererst ein neues Dashboard an… dann oben rechts „AddPanel“ -> „SingleStat“
Sollte dann so aussehen.

Nun klickt ihr oben auf die Bezeichnung…dann auf „Edit“

Datenbank auswählen und in der Queryabfrage die entsprechenden Felder per dropdown auswählen.
(Im folgenden Screenshot hab ich leicht andere Bezeichnungen als oben im Script… nicht wundern)

Im Reiter „Options“ hakt ihr „Gauges“

Es gibt noch viel mehr Möglichkeiten, aber dafür bitte in die Doku schauen oder sich auf der Grafana Seite Beispiele anschauen.

Hi thezepter,

vielen Dank für die Anleitung. Werde heute abend mal Testen :slight_smile:

Gruß

Hi thezepter,

Grafan Läuft :slight_smile: Cooles Teil.
Habe anstatt influxdb eine MySQL genommen (läuft sowieso auf der NAS).

Fazit:

Grafana + MySQL + Modul: IPSMySQLArchiv von Nall-chan = TOP!

Gruß

Wie cool ist das denn ?! Das hatte ich nicht auf dem Schirm. Schreibt das Modul einfach alle „gewünschten“ Variablen in eine MYSQL Datenbank ? Ist das ähnlich einfach ? Kann auf meiner Diskstation ja auch eine MySQL DB installieren.

Hi,

Schreibt das Modul einfach alle „gewünschten“ Variablen in eine MYSQL Datenbank ?

Ja :slight_smile:

Ist das ähnlich einfach ?

Noch einfacher :smiley:
Modul Installieren und die gewünschte Variablen eintragen.


Bei mir läuft MariaDB+phpMySQL was in der NAS im Packetcenter vorhanden ist.

Gruß

PS:

Danke an Nall-chan für das IPSMySQLArchiv Modul.

EDIT:

wie erstellt man ein Balkendiagramm in Grafana :confused:

Uii da werd ich mich dann mal dran machen…

Schau mal hier, da kannst du dir alle möglichen Diagramme anschauen und in der Demo auch editieren und gucken wie es geht.

Hallo Leute,

wie bekomme ich die Graphen ins IPSView?
Im WebFront werden die Angezeigt und im IPSView nicht.

Hat jemand ein Tipp?

Gruß

Hallo zusammen,

finde das mit GRAFANA extrem spannend, da ich hier sehr viel Potential gegenüber den bisherigen in IPS realisierten Chartdarstellungen (Highcharts, PHP-Charts, AM-Charts, …… , und auch die nativen von IP Symcon) sehe.

Ich habe bei meinen ersten Versuchen probiert, ob ich GRAFANA über die MySQL-Schnittstelle einbinden kann. Dazu nutze ich das Modul von Michael, um in eine MySQL-DB die IPS-Variablen übertragen zu können. Das klappt soweit auch ganz gut.

Anbei die Struktur beim Zugriff aus Access:

GRAFANA_Access.jpg

Bei der Definition des Dashboards komme ich aber nicht weiter, da GRAFANA bei SELECT nur Column:ID und nicht Column:value zulässt. Na ja, die aufsummierten IDs darzustellen, macht dann auch nicht gerade Freude

Anbei noch das von GRAFANA gebaute SQL-Statement dazu:

GRAFANA_SQL+.jpg

Für hilfreiche Hinweise wäre ich sehr dankbar.

Gruss
Bernd

Hi Bernd,

da musste ich auch Suchen.
du musst auf :id Klicken (nicht auf Column) und bekommst die Auswahl zwischen id & value.

graph.PNG

Gruß

Ich hab seit dem ich das SQL Modul nutze gaaanz andere Probleme ^^ Ip symcon kommt nicht mehr aus dem Pott. 1 Sec. in symcon sind 20-30 sec. in Echtzeit :banghead:

Es liegt am Modul „Nall-chan/IPSMySQLArchiv“ <— deaktiviert und alles rennt wieder. Schade…

Kann ich also nicht nutzen. Ich hab einige Variablen hinzugefügt, darunter auch Leistungswerte meines Stromzählers, der sekündlich pro Phase neue Werte bekommt. Ist symcon so schwach, oder liegt es an dem Modul oder an der Datenbank ? puhhh

Ich frag mal im Modulthread bei Michael nach.

Hi thezepter,

alleine am IPSMySQLArchiv-Modul sollte es nicht liegen. Bei mir läuft seit heute Grafana mit MySQL im Testbetrieb (Screenshot meiner Heizung weiter unten) ohne Probleme (sewo, danke für den Tip mit ID/Value). Meine aktuelle Konfiguration ist aber eine etwas andere, ist nur eine Spielwiese bei der ich die Teilkomponenten auf einer HW vereinigen will/muss.

[ul]
[li]Ein Raspberry 3 sammelt die Daten der Sensoren mit IP Symcon 5 ein und schreibt sie mit IPSMySQLArchiv in eine MySQL DB[/li][li]Die MySQL DB liegt physikalisch auf einer QNAP[/li][li]Grafana wiederum läuft auf einem ASUS TinkerS und holt sich die Daten von der QNAP[/li][/ul]
Der Raspberry 3 schreibt so aktuell um die 30 Variablen in die MySQL DB und die CPU Load ist seit dem Einrichten des Moduls kaum merklich nach oben gegangen. Wobei bei mir kein Sensor im Sekundentakt abgefragt wird.

Gruss
Bernd

Grafana.jpg

Jo, habs gerade bei nem Kumpel probiert der noch mehr wegschreibt an Variablen und da läuft symcon auf dem PI3+ und SQL auf der synology.

EDIT:

Liegt nicht am Docker oder Raspi und auch nicht an meinem symcon. Hab gerade ein jungfräuliches Symcon ohne alles auf einem Pi laufen lassen… Auch eine andere Datenbank auf der Diskstaion bringt keine Abhilfe… selbes Problem.

Danke erstmal für die Super Idee mit Grafana und das Beispiel!

ich hab das ganze mal in ne Funktion zum copy und pasten gepackt.
Für n Modul fehlt mir einfach die Kenntnis. :banghead:

Ich denk mal es ist selbsterklärend und basiert auf dem Beispiel von thezepter

Grafana und die InfluxDb laufen bei mir auf einem Viruellen Ubuntu.
Wer hier hilfe beim einrichten braucht, darf sich gerne melden.


/*Write2InfluxDb by SCS-Showtec GbR
Basierend auf Idee und Beispiel von "thezepter"
Jakob-Degen-Straße 64
73614 Schorndorf
 Autor :Johannes Holzwarth
Verison 1.1 21.02.2019*/ 

function Write2Influx($id, $host, $db, $system, $category, $valuename)
{
$out ='http://'.$host.':8086/write?db='.$db.'';
 

$ch = curl_init($out);
 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1 );
curl_setopt($ch, CURLOPT_POST,           1 );

$vartype = IPS_GetVariable($id)['VariableType'];
/*0: Boolean, 1: Integer, 2: Float, 3: String*/
//echo $vartype.' ';
switch ($vartype){

case 0:
$value = GetValueBoolean($id) ;
if ($value == true){
curl_setopt($ch, CURLOPT_POSTFIELDS,     $system.','.$category.'='.$valuename.' value=1');
}
else{
curl_setopt($ch, CURLOPT_POSTFIELDS,     $system.','.$category.'='.$valuename.' value=0');
}
//echo 'es war ein bool ';
break;

case 1:
$value = GetValueInteger($id) ;
curl_setopt($ch, CURLOPT_POSTFIELDS,     $system.','.$category.'='.$valuename.' value=' .$value);
break;

case 2:
$value = GetValueFloat($id) ;
curl_setopt($ch, CURLOPT_POSTFIELDS,     $system.','.$category.'='.$valuename.' value=' .  number_format($value/1,1,'.','') );
//echo 'es war ein float ';
break;

}

 
$result=curl_exec ($ch);
$error=curl_error($ch) ;
 
echo $result ;
echo $error ;
//echo $system.','.$category.'='.$valuename.' value=' .  number_format($floatvalue/1,1,'.','');
}

$host = 'xxx.xxx.xxx.xxx';
Write2Influx(123456, $host, 'werte', 'Heizung', 'HeizkreisUg', 'Vorlauf'); // kopieren und die Bezeichnungen den eigenen Bedürfnissen und Werten anpassen

:smiley: :loveips: Danke Dir ! Da meine Synology mit SQL gerade extreme Probleme macht, kommt mir das natürlich recht :smiley:
Wenn da noch jemand ein Modul draus macht wo man per Auswahl die Variablen hinzufügen könnte und die Beschreibungen der Felder wäre das richtig nice :loveips: :smiley:

Aber gerne doch. Ich sollte mir das Wissen übers Module bauen echt mal aneignen… Aber ohne dass mir das jemand zeigt blick ich das nur schwer. Mit nachlesen usw. vergeht mir bei sowas immer schnell die Lust wenns nicht zu nem Erfolg führt. Ich hau euch noch n paar Screenshots als Motivation um die Ohren :smiley:

Sehr spannendes Thema, vielen Dank!

@ScsShowtec <— wie oft triggerst du das Script ? Schreibst du alles in eine Datenbank oder teilst du das auf ?

Hab es gerade mal mit ca 25 Variablen ausprobiert… Die Scriptlaufzeit leigt zwischen 4 und 10 Sekunden… Puhh das ist mir zu lange wenn man „live“ Daten sehen möchte. Kann man das irgendwie so programmieren, dass sich nur jede geänderte hinterlegte Variable in die Datenbank schreibt ? und ich auch dann fast live Daten angezeigt bekomme ? Das wiederum geht wahrscheinlich nur mit einem Modul oder ?

Irgend etwas scheint bei dir nicht zu stimmen. Ich habe 52 Variablen die ich wegschreibe. Ich trigger das Skript alle 10 Sekunden und die Lauftzeit beträgt bei mir 140ms.
Sorry das ich so „blöd“ frage aber du hast die Funktion an sich scho nur einmal oben stehen und nicht für jede Variable mitkopiert?
Sei mir bitte nicht böse aber ich frage so dumm weil du ein paar einträge früher erwähnst dass du im Programmieren nicht so fit bist :slight_smile:
Ich kopier dir hier mal mein aktuell so laufendes Skript, mit etwas weniger Funktionsaufrufen, rein…

Falls du eine Variable bei änderung schreiben willst, musst du die Funktion in ein extra Skript packen und jedes mal das Skript mit der enthaltenen Funkition mit require einbinden. Das Skript in dem du die Funktion wiederum aufrufst, triggerst du dann bei änderung. Falls es probleme gibt --> gerne PN

So muss das aussehn:


/*EINMAL DIE FUNKTION*/
function Write2Influx($id, $host, $db, $system, $category, $valuename)
{
$out ='http://'.$host.':8086/write?db='.$db.'';
 

$ch = curl_init($out);
 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1 );
curl_setopt($ch, CURLOPT_POST,           1 );

$vartype = IPS_GetVariableCompatibility($id)['VariableType'];
/*0: Boolean, 1: Integer, 2: Float, 3: String*/
//echo $vartype.' ';
switch ($vartype){

case 0:
$value = GetValueBoolean($id) ;
if ($value == true){
curl_setopt($ch, CURLOPT_POSTFIELDS,     $system.','.$category.'='.$valuename.' value=1');
}
else{
curl_setopt($ch, CURLOPT_POSTFIELDS,     $system.','.$category.'='.$valuename.' value=0');
}
//echo 'es war ein bool ';
break;

case 1:
$value = GetValueInteger($id) ;
curl_setopt($ch, CURLOPT_POSTFIELDS,     $system.','.$category.'='.$valuename.' value=' .$value);
break;

case 2:
$value = GetValueFloat($id) ;
curl_setopt($ch, CURLOPT_POSTFIELDS,     $system.','.$category.'='.$valuename.' value=' .  number_format($value/1,1,'.','') );
//echo 'es war ein float ';
break;

}

 
$result=curl_exec ($ch);
$error=curl_error($ch) ;
 
echo $result ;
echo $error ;
//echo $system.','.$category.'='.$valuename.' value=' .  number_format($floatvalue/1,1,'.','');
}
/*AB HIER ERST KOPIEREN*/
$host = '192.168.23.222';
Write2Influx(49082 /*[Heizung\Dp\Vorlauftemperatur Heizkreis Ug\Vorlauftemperatur]*/, $host, 'werte', 'Heizung', 'HeizkreisUg', 'Vorlauf');
Write2Influx(51821 /*[Heizung\Dp\Vorlauftemperatur Kessel\Vorlauftemperatur Kessel]*/, $host, 'werte', 'Heizung', 'Kessel', 'Vorlauftemp');
Write2Influx(39940 /*[Heizung\Dp\Rücklauftemperatur Heizkreis Ug\Rücklauftemperatur]*/, $host, 'werte', 'Heizung', 'HeizkreisUg', 'Ruecklauf');
Write2Influx(30510 /*[Heizung\Dp\Rücklauftemperatur Kessel\Rücklauftemperatur Kessel]*/, $host, 'werte', 'Heizung', 'Kessel', 'RuecklaufKessel');
Write2Influx(45963 /*[Heizung\Dp\Sollwert Kessel\Sollwert Kessel]*/, $host, 'werte', 'Heizung', 'Kessel', 'SollwertLeistung');
Write2Influx(32535 /*[Heizung\Dp\Kessel Vorlauf errechnet\Kessel Vorlauf errechnet]*/, $host, 'werte', 'Heizung', 'Kessel', 'TempErrechnet');
Write2Influx(29715 /*[Allgemein\Aussentemperatur\Aut]*/, $host, 'werte', 'Allgemein', 'Temperaturen', 'Aut');

Write2Influx(53604 /*[UG\Partyraum\Lüftung\Istwerte\Ist1\Zuluft\Leistung]*/, $host, 'werte', 'Ug', 'Lueftung', 'SollwertZuluftventilator');
Write2Influx(24929 /*[UG\Partyraum\Lüftung\Istwerte\Ist2\Regeln\Wrg Sollwert]*/, $host, 'werte', 'Ug', 'Lueftung', 'SollwertWrg');
Write2Influx(12812 /*[UG\Partyraum\Lüftung\Regelventil\Sollwert]*/, $host, 'werte', 'Ug', 'Lueftung', 'SollwertRegelventil');
Write2Influx(23447 /*[UG\Partyraum\Lüftung\Zulufttemperatur\Temperatur]*/, $host, 'werte', 'Ug', 'Lueftung', 'Zulufttemp');

Ok, dann liegt es an meiner Diskstation und dem ausgelastetem Volume… total nervig :frowning:

<?

/*Write2InfluxDb by SCS-Showtec GbR 
Basierend auf Idee und Beispiel von "thezepter" 
Jakob-Degen-Straße 64 
73614 Schorndorf 
 Autor :Johannes Holzwarth 
Verison 1.0 13.01.2019*/  

function Write2Influx($id, $host, $db, $system, $category, $valuename) 
{ 
$out ='http://'.$host.':8086/write?db='.$db.''; 
  

$ch = curl_init($out); 
  
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1 ); 
curl_setopt($ch, CURLOPT_POST,           1 ); 

$vartype = IPS_GetVariableCompatibility($id)['VariableType']; 
/*0: Boolean, 1: Integer, 2: Float, 3: String*/ 
echo $vartype.' '; 
switch ($vartype){ 

case 0: 
$value = GetValueBoolean($id) ; 
if ($value == true){ 
curl_setopt($ch, CURLOPT_POSTFIELDS,     $system.','.$category.'='.$valuename.' value=1'); 
} 
else{ 
curl_setopt($ch, CURLOPT_POSTFIELDS,     $system.','.$category.'='.$valuename.' value=0'); 
} 
echo 'es war ein bool '; 
break; 

case 1: 
$value = GetValueInteger($id) ; 
curl_setopt($ch, CURLOPT_POSTFIELDS,     $system.','.$category.'='.$valuename.' value=' .$value); 
break; 

case 2: 
$value = GetValueFloat($id) ; 
curl_setopt($ch, CURLOPT_POSTFIELDS,     $system.','.$category.'='.$valuename.' value=' .  number_format($value/1,1,'.','') ); 
echo 'es war ein float '; 
break; 

} 

  
$result=curl_exec ($ch); 
$error=curl_error($ch) ; 
  
echo $result ; 
echo $error ; 
} 

$host = '192.168.2.2'; 
Write2Influx(28645 /*[PHP_Module\SMA\Sunny Island 8.0H\selbstauslesen\Betriebszustand\Wert]*/, $host, 'symcon', 'pv', 'sunnyisland', 'betriebszustand'); // kopieren und die Bezeichnungen den eigenen Bedürfnissen und Werten anpassen  
Write2Influx(39535 /*[PHP_Module\SMA\Sunny Island 8.0H\selbstauslesen\Abgegebene Leistung Batterie Gesamt\Wert]*/, $host, 'symcon', 'pv', 'sunnyisland', 'abgabegesamt');
Write2Influx(43920 /*[PHP_Module\SMA\Sunny Island 8.0H\selbstauslesen\Aktuelle Kapazität SOC\Wert]*/, $host, 'symcon', 'pv', 'sunnyisland', 'soc');
Write2Influx(48435 /*[PHP_Module\SMA\Sunny Island 8.0H\selbstauslesen\Aktuelle Kapazität SOH\Wert]*/, $host, 'symcon', 'pv', 'sunnyisland', 'soh');
Write2Influx(38129 /*[PHP_Module\SMA\Sunny Island 8.0H\selbstauslesen\Anzahl Volladungen\Wert]*/, $host, 'symcon', 'pv', 'sunnyisland', 'anzahlvolladungen');
Write2Influx(42708 /*[PHP_Module\SMA\Sunny Island 8.0H\selbstauslesen\Aufgenommene Leistung Batterie Gesamt\Wert]*/, $host, 'symcon', 'pv', 'sunnyisland', 'aufnahmegesamt');
Write2Influx(13982 /*[PHP_Module\SMA\Sunny Island 8.0H\selbstauslesen\Batterieladung (-) Entladung (+) Leistung\Wert]*/, $host, 'symcon', 'pv', 'sunnyisland', 'ladenentladen_W');
Write2Influx(15014 /*[PHP_Module\SMA\Sunny Island 8.0H\selbstauslesen\Batterieladung (-) Entladung (+) Strom\Wert]*/, $host, 'symcon', 'pv', 'sunnyisland', 'ladenentladen_A');
Write2Influx(28490 /*[PHP_Module\SMA\Sunny Island 8.0H\selbstauslesen\Battery state of charge for protection mode\Wert]*/, $host, 'symcon', 'pv', 'sunnyisland', 'socschutz');
Write2Influx(52646 /*[PHP_Module\SMA\Sunny Island 8.0H\selbstauslesen\Energiesparmodus aktiviert (1129=Yes  1130=No)\Wert]*/, $host, 'symcon', 'pv', 'sunnyisland', 'powersafemode');
Write2Influx(18721 /*[PHP_Module\SMA\Sunny Island 8.0H\selbstauslesen\Fehler Ladezustand\Wert]*/, $host, 'symcon', 'pv', 'sunnyisland', 'socfehler');
Write2Influx(59083 /*[PHP_Module\SMA\Sunny Island 8.0H\selbstauslesen\Nennkapazitätsdurchsätze\Wert]*/, $host, 'symcon', 'pv', 'sunnyisland', 'anzahlladungsdurchs');
Write2Influx(24323 /*[PHP_Module\SMA\Sunny Island 8.0H\selbstauslesen\Obere Kapzitätsgrenze für Wiedereinspeisung\Wert]*/, $host, 'symcon', 'pv', 'sunnyisland', 'oberesocgrenzechargein');
Write2Influx(42655 /*[PHP_Module\SMA\Sunny Island 8.0H\selbstauslesen\Untere Kapzitätsgrenze für Einspeisesperre\Wert]*/, $host, 'symcon', 'pv', 'sunnyisland', 'unteresocgrenzechargestop');
Write2Influx(39691 /*[PHP_Module\SMA\Sunny Island 8.0H\selbstauslesen\Untere Entladegrenze für Eigenverbrauchsbereich\Wert]*/, $host, 'symcon', 'pv', 'sunnyisland', 'minselfdischarg');
Write2Influx(36215 /*[PHP_Module\SMA\Sunny Island 8.0H\selbstauslesen\Zeit bis zur nächsten Ausgleichsladung\Wert]*/, $host, 'symcon', 'pv', 'sunnyisland', 'zeitbisausgleichsla');
Write2Influx(39414 /*[PHP_Module\SMA\Sunny Island 8.0H\selbstauslesen\Zeit bis zur nächsten Vollladung\Wert]*/, $host, 'symcon', 'pv', 'sunnyisland', 'zeitbisvolla');
Write2Influx(26603 /*[PHP_Module\SMA\Sunny Island 8.0H\Netzfrequenz]*/, $host, 'symcon', 'pv', 'sunnyisland', 'netzfrequenz');
Write2Influx(17718 /*[PHP_Module\SMA\Sunny Island 8.0H\Netzspannung L1 gegen N]*/, $host, 'symcon', 'pv', 'sunnyisland', 'netzspannung');
Write2Influx(28063 /*[PHP_Module\SMA\Sunny Island 8.0H\Batterietemperatur]*/, $host, 'symcon', 'pv', 'sunnyisland', 'batttemp');
Write2Influx(57296 /*[PHP_Module\SMA\Sunny Island 8.0H\Batteriespannung]*/, $host, 'symcon', 'pv', 'sunnyisland', 'battspannung');
Write2Influx(35685 /*[PHP_Module\SMA\Sunny Island 8.0H\Zustand Wartungsladung der Batterie]*/, $host, 'symcon', 'pv', 'sunnyisland', 'zustwartladung');


?>

Laufzeit… 23 Sekunden ! Ich KOTZ ab… Ich vermute es liegt am btrfs Dateisystem… hätte damals ext4 nehmen sollen :frowning:

Scheint wohl so. Hast n Raspb oder so über auf dem du ne Testdatenbank erstellen kannst?

Es darf mich gern jmd verbessern aber soweit ich weiss kann es durchaus an deinem Dateisystem liegen.
ext4 ist laut meinem Kenntnisstand „langsamer“ als btrfs bzw. letzteres verlangt mehr Cpu Leistung.

Ich weiss nicht mein genaues Dateisystem aber ich denke es ist auch ext4.
System ist bei mir n virtuelles Ubuntu Server 16.04LTS mit 4gb Ram.