HowTo: Analyse und Monitoring mit Grafana

Hab die nächsten Tage wenig Zeit. auf einem anderen System würde das ganze sicher sauber laufen. Ich muss nur gucken wie ich vom langsamen btrfs zu ext4 komme ohne viel Arbeit zu investieren. Auf der Diskstation läuft alles was ich brauche und noch viel mehr ^^ Puhhhh
Ich hab noch 1… 2Raspis rumliegen. Aber das ganze würde mein Ziel verfehlen alles auf der DS laufen zu lassen was ja auch gehen müsste. Ich muss nur das Volume Problem lösen.

Ähh ich bin immer noch am probieren aber bekomme dein Script nicht mehr zum laufen. Warum auch immer… es lief ja schon mal.

Fatal error:  Uncaught Error: Call to undefined function IPS_GetVariableCompatibility() in /var/lib/symcon/scripts/21498.ips.php:20
Stack trace:
#0 /var/lib/symcon/scripts/21498.ips.php(58): Write2Influx(28645, '192.168.2.2', 'symcon', 'pv', 'sunnyisland', 'betriebszustand')
#1 {main}
  thrown in /var/lib/symcon/scripts/21498.ips.php on line 20

Weiß du warum ?
Mein einzelscript auf dem deins basiert funktioniert noch :confused:

Hallo Zusammen, danke für die tolle Vorarbeit. Grafana mit Influx und IPS funktioniert wunderbar.
Einbindung der Graphen ins Webfront ist auch kein Problem, nur im IPSVIEW bekomme ich sie nicht angezeigt. Hat das schon jemand von euch gemacht?

Beste Grüße,
Tom

Rückmeldung wegen meiner Probleme mit der Volume Auslastung und dem hinterlaufendem symcon ^^

Es lag nicht an btrfs. Hatte alles nach mehren Tagen Arbeit auf ext4 umgezogen und es hat nichts gebracht.
Trotz regelmäßigen positiven SMART Checks, hatten 2 Festplatten „Raw_Read_Error_Rate“ > 0.
Hatte mich der Synology Support drauf gebracht. Wenn ich immer positive SMART Tests erhalte schau ich da im Detail auch nicht weiter… Naja…
Beide Platten raus… 2 neue rein und jetzt auch gleich wieder auf ext4 und alles schnurrt wie ein Kätzchen. Alles rennt wieder wie es soll. Keine Probleme mit Datenbanken etc.

Jetzt bin ich auf das MySQL umgestiegen. Aber klasse das wir hier beide Möglichkeiten haben :smiley:

Nabend sewo,

sag mal hast du eine Idee wie ich in Grafana den Stromverbrauch der letzten 7 Tage darstellen kann ? So wie mit Symcon Boardmitteln.
Einfache Balkenanzeige.

Ich bekomme es zum verrecken nicht hin.
Habe alle Daten in der SQL Datenbank. Zähler in kWh vorhanden.

Gruß
zeppi

Kannst du dein Script bitte im Beitrag anpassen ?
Dr.Niels hat mir geholfen.

Das Skript sieht so nicht korrekt aus. IPS_GetVariableCompatibility gibt keinen VariableType zurück, dafür solltest du IPS_GetVariable benutzen. Wenn du also IPS_GetVariableCompatibility einfach durch IPS_GetVariable ersetzt, dann sollte es wieder funktionieren.

Um doch einmal die Kompatibilitätsfunktionen zu benutzen, musst du den entsprechenden Spezialschalter aktivieren. Das ist hier aber meiner Meinung nach kein guter Ansatz.

Hatte wohl zu irgendeinem Zeitpunkt den Spezialschalter aktiviert, denn nur mit diesem funktioniert die Funktion IPS_GetVariableCompatibility

Ohne Spezialschalter gehts mit IPS_GetVariable

:smiley:

Hallo,

danke für die Anleitung, die werde ich auch mal umsetzen.

Früher hatte ich HC mit IPS benutzt, aber nachdem ich wieder auf IPS umgestiegen bin, hab ich mich HC noch nicht wieder genähert.

Da wir in der Firma Grafana nutze, ist es naheliegent, es zuhause in IPS auch einzubinden.

Ich werde berichten, schönes Regenwetter-Projekt

Hallo allen,

ich wärme den Fred mal auf :slight_smile:

Ich hab ein kleines Problem mit dem Script und irgentwie komme ich nicht weiter:

IP-Symcon läuft auf einer Linux-VM
InfluxDB läuft auf einer weiteren Linux-VM

In der InlfuxDB sind zwei Datenbanken angelegt, „telegraf“ und „ipsymcon“.

In die Telegraf-DB schreib der Telegraf-Agent auf den Linux-VM und meiner NAS erfolgreich die ganzen Daten rein, das funktioniert wunderbar.
In die Ipsymcon-DB soll dann das nachfolgenden Script hier aus dem Thread diverse Daten für Temperatur usw. reinschreiben.
Es passiert aber nichts, die Datenbank ist leer.

Das Script gibt beim manuellen Aufruf auf keinen Fehler raus, aber irgentwas ist das falsch, vermuttlich von mir falsch konfiguriert, vielleicht kann mir jemand helfen:


/*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 = '10.0.1.24';
Write2Influx(10695, $host, 'werte', 'ipsymcon', 'Temperatur', 'IST-Temperatur');
Write2Influx(50044, $host, 'werte', 'ipsymcon', 'Luftfeuchte', 'IST-Luftfeuchte');
Write2Influx(53070, $host, 'werte', 'ipsymcon', 'Temperatur', 'IST-Temperatur');
Write2Influx(19797, $host, 'werte', 'ipsymcon', 'Luftfeuchte', 'IST-Luftfeuchte');
Write2Influx(56294, $host, 'werte', 'ipsymcon', 'Temperatur', 'IST-Temperatur');
Write2Influx(47829, $host, 'werte', 'ipsymcon', 'Luftfeuchte', 'IST-Luftfeuchte');
Write2Influx(12143, $host, 'werte', 'ipsymcon', 'Temperatur', 'IST-Temperatur');
Write2Influx(22893, $host, 'werte', 'ipsymcon', 'Luftfeuchte', 'IST-Luftfeuchte');  
Write2Influx(12247, $host, 'werte', 'ipsymcon', 'Temperatur', 'SOLL-Temperatur');  
Write2Influx(52811, $host, 'werte', 'ipsymcon', 'Status', 'Status');  
Write2Influx(34666, $host, 'werte', 'ipsymcon', 'Temperatur', 'IST-Temperatur');
Write2Influx(40842, $host, 'werte', 'ipsymcon', 'Luftfeuchte', 'IST-Luftfeuchte');
Write2Influx(37620, $host, 'werte', 'ipsymcon', 'Temperatur', 'SOLL-Temperatur');  
Write2Influx(50860, $host, 'werte', 'ipsymcon', 'Status', 'Status');
Write2Influx(16676, $host, 'werte', 'ipsymcon', 'Temperatur', 'IST-Temperatur');
Write2Influx(57978, $host, 'werte', 'ipsymcon', 'Luftfeuchte', 'IST-Luftfeuchte');  
Write2Influx(31603, $host, 'werte', 'ipsymcon', 'Temperatur', 'SOLL-Temperatur');  
Write2Influx(55703, $host, 'werte', 'ipsymcon', 'Status', 'Status');
Write2Influx(31931, $host, 'werte', 'ipsymcon', 'Temperatur', 'IST-Temperatur');
Write2Influx(29130, $host, 'werte', 'ipsymcon', 'Luftfeuchte', 'IST-Luftfeuchte');  
Write2Influx(10849, $host, 'werte', 'ipsymcon', 'Temperatur', 'SOLL-Temperatur');  
Write2Influx(47549, $host, 'werte', 'ipsymcon', 'Status', 'Status');
Write2Influx(44422, $host, 'werte', 'ipsymcon', 'Temperatur', 'IST-Temperatur');
Write2Influx(24858, $host, 'werte', 'ipsymcon', 'Luftfeuchte', 'IST-Luftfeuchte');
Write2Influx(13938, $host, 'werte', 'ipsymcon', 'Temperatur', 'SOLL-Temperatur');  
Write2Influx(58295, $host, 'werte', 'ipsymcon', 'Status', 'Status');
Write2Influx(12918, $host, 'werte', 'ipsymcon', 'Temperatur', 'IST-Temperatur');
Write2Influx(11380, $host, 'werte', 'ipsymcon', 'Luftfeuchte', 'IST-Luftfeuchte');  
Write2Influx(25033, $host, 'werte', 'ipsymcon', 'Temperatur', 'SOLL-Temperatur');  
Write2Influx(18779, $host, 'werte', 'ipsymcon', 'Status', 'Status');
Write2Influx(26844, $host, 'werte', 'ipsymcon', 'Status', 'Status');

EDIT: alles zurück, ich hab den Fehler, =>. $host, ‚werte‘, ‚ipsymcon‘, ‚Temperatur‘, ‚SOLL-Temperatur‘); , der dB-Name steht an 2. Stelle, dann funktioniert es auch sofort.

Manchmal muss mal 5 mal draufschauen um eine Fehler zu sehen :banghead:

Kein Wunder, ist ja auch total verwirrend. In InfluxDB gibt es:

Bucket
measurementName
fieldKey
fieldValue
(und auch noch Tags)

Vielleicht baut mal einer in InfluxDB-Modul.

1 „Gefällt mir“
<?
// InfluxDB v2.6.1  Schreiben eines Float-Wertes aus einer IPS-Variablen
$url = "http://yourInfluxUrl";
$port = "8086"; // Standard Port ist 8086
$apiKey = "xxxxxxxxxxxxxxxxx"; // gibts im Influx Admin Panel
$bucket = "yourBucket";  // eigenes Bucket aus Admin Panel (entspricht der Datenbank in MySQL)
$measurement  = "yourMeasurement";  // beliebig (entspricht der Tabelle in MySQL)
$tagKey = "yourTagKey"; // beliebige Metadaten/Kategorien
$tagValue = "yourTagValue"; // beliebige Metadaten/Kategorien
$fieldKey =  "yourFieldKey"; // Beschreibung der IPS-Variable
$fieldValue = GetValueFloat(your_ips_variable_id); // Wert der IPS-Variable

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "$url:$port/write?db=$bucket");
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
    "Authorization: Token $apiKey",
    "Content-Type: application/json"
));


curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, "$measurement,$tagKey=$tagValue $fieldKey=".$fieldValue) ;

$response = curl_exec($ch);
curl_close($ch);

?>
 
Noch ein Script zum Löschen von Datensätzen.
Im Beispiel werden alle Datensätze von Gestern bis Heute und bestimmten Measurement
aus dem angegebenen Bucket gelöscht.

<?php
// InfluxDB v2.6.1 Daten löschen
$influxUrl = "http://yourInfluxUrl";
$influxPort = "8086";
$apiKey = "yourApiKey";
$organization = "yourOrganizationName";
$bucket = "yourBucket";
$measurement = "yourMeasurement";
$heute = date(DATE_RFC3339);  // bis wann loeschen? spezielles Timeformat erforderlich!
$gestern = date_create('-1 day')->format(DATE_RFC3339); // ab wann loeschen? 



$url = "$influxUrl:$influxPort/api/v2/delete?bucket=$bucket&org=$organization";
$data = array(
    "predicate" => "_measurement=$measurement",
    "start" => "$gestern",
    "stop" => "$heute"
);

$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
    "Content-Type: application/json",
    "Authorization: Token $apiKey"
));

$response = curl_exec($ch);
curl_close($ch);

if ($response === false) {
    echo 'Curl error: ' . curl_error($ch);
} else {
    echo 'Response: ' . $response;
    echo 'URL: ' . $url;
      echo "\n";
    echo 'gelöscht wird von: ' . $gestern;
    echo  "\n";
    echo 'bis: ' . $heute;
}
1 „Gefällt mir“

Noch ein Beispiel um 5 IPS-Variablen auf eimal in InfluxDB zu speichern.
Alle Variablen werden unter dem gleichen Bucket,Measurement und Tag gespeichert.
Die Laufzeit des Scripts lag bei 132ms.

$fieldKey1 =  "temperatur";
$fieldKey2 =  "luftfeuchtigkeit";
$fieldKey3 =  "windgeschwindigkeit";
$fieldKey4 =  "regenmenge";
$fieldKey5 =  "literheute";
$fieldValue1 = GetValueFloat(50715);
$fieldValue2 = GetValueInteger(32051);
$fieldValue3 = GetValueFloat(25046);
$fieldValue4 = GetValueInteger(48616);
$fieldValue5 = GetValueFloat(53960);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "$url:$port/write?db=$bucket");
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
    "Authorization: Token $apiKey",
    "Content-Type: application/json"
));
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, "$measurement,$tagKey=$tagValue $fieldKey1=".$fieldValue1.",$fieldKey2=".$fieldValue2. ",$fieldKey3=".$fieldValue3. ",$fieldKey4=".$fieldValue4. ",$fieldKey5=".$fieldValue5) ;

$response = curl_exec($ch);
curl_close($ch);

2 „Gefällt mir“