InfluxDB v2

Allgemeine Informationen zum Nachbau und zum Forum.
PV-Monitorung / PV Überwachung

Moderator: Ulrich

SchwanzusLongus
Beiträge: 18
Registriert: So 26. Feb 2023, 22:23

InfluxDB v2

Beitrag von SchwanzusLongus »

Hallo! Ich habe mir eine Function geschrieben, die mir die Solardaten nach InfluxDB v2 schreibt. Vielleicht hat Ulrich Lust, sie mit ins Projekt aufzunehmen :mrgreen:
Dazu in der

Code: Alles auswählen

user.config.php
diese Parameter anlegen:

Code: Alles auswählen

$InfluxBucket = "meinbucket";
$InfluxToken = "meinToken";
$InfluxOrg = "meineOrg";
Und dann in der

Code: Alles auswählen

funktionen.inc.php
diese Function hinterlegen:

Code: Alles auswählen

  /**************************************************************************
  //  Daten in die remote Influx v2 Datenbank schreiben
  //
  //
  **************************************************************************/

public function influx_remote($daten) {
    if (!isset($daten["zentralerTimestamp"])) {
        $daten["zentralerTimestamp"] = time();
    }
    
    // InfluxDB v2 Parameter prüfen
    if (!isset($daten["InfluxBucket"]) || !isset($daten["InfluxToken"]) || !isset($daten["InfluxOrg"])) {
        $this->log_schreiben("InfluxDB v2 Parameter fehlen (Bucket, Token oder Org)", "   ", 5);
        return false;
    }

    $query = "";
    
    // Statistikdaten übertragen (alle 10 Minuten)
    if (date("i") == '00' || date("i") == '10' || date("i") == '20' || date("i") == '30' || date("i") == '40' || date("i") == '50') {
        $this->log_schreiben("Alle 10 Minuten werden die Statistikdaten remote übertragen.", "   ", 5);
        
        $query = "Statistik Bezeichnung=\"WhTag\",Datum=\"".date('d.m.Y')."\",Woche=".date('W').",Monat=".date('n');
        $query .= ",Wochentag=\"".strftime('%A', time())."\"";
        $query .= ",Heute_TS=".mktime(0, 0, 0, date("m"), date("d"), date("Y"))."000000000";
        $query .= ",Gestern_TS=".mktime(0, 0, 0, date("m"), date("d") - 1, date("Y"))."000000000";
        $query .= ",DiesesJahr_TS=".mktime(0, 0, 0, 1, 1, date("Y"))."000000000";
        $query .= ",LetztesJahr_TS=".mktime(0, 0, 0, 1, 1, date("Y") - 1)."000000000";
        $query .= ",DieserMonat_TS=".mktime(0, 0, 0, date("m"), 1, date("Y"))."000000000";
        $query .= ",LetzterMonat_TS=".mktime(0, 0, 0, date("m") - 1, 1, date("Y"))."000000000";
        $query .= ",DieseWoche_TS=".strtotime("last monday", strtotime("tomorrow"))."000000000";
        $query .= ",LetzteWoche_TS=".strtotime("last monday -7 days", strtotime("tomorrow"))."000000000";
        $query .= ",TagImMonat=".date("j");
        $query .= ",TagImJahr=".(date("z") + 1);
        $query .= ",Jahr=".date("Y");
        $query .= ",Stunde=".date("G");
        $query .= "  ".$daten["zentralerTimestamp"];
        
        // InfluxDB v2 URL erstellen
        $url = $this->getInfluxV2Url($daten, '/api/v2/write');
        
        $i = 1;
        do {
            $ch = curl_init($url);
            curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
            curl_setopt($ch, CURLOPT_TIMEOUT, 15);
            curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 12);
            curl_setopt($ch, CURLOPT_PORT, $daten["InfluxPort"]);
            curl_setopt($ch, CURLOPT_POSTFIELDS, $query);
            
            // Token-Based Authentication für InfluxDB v2
            curl_setopt($ch, CURLOPT_HTTPHEADER, [
                'Authorization: Token ' . $daten["InfluxToken"],
                'Content-Type: text/plain'
            ]);
            
            if (isset($daten["InfluxSSL"]) && $daten["InfluxSSL"] == true) {
                curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
                curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
            }
            
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
            $result = curl_exec($ch);
            $rc_info = curl_getinfo($ch);
            
            if (curl_errno($ch)) {
                $this->log_schreiben("Curl Fehler! Statistikdaten nicht zur entfernten InfluxDB gesendet! Curl ErrNo. ".curl_errno($ch), "   ", 5);
            }
            
            if ($rc_info["http_code"] == 200 || $rc_info["http_code"] == 204) {
                break;
            }
            elseif ($rc_info["http_code"] == 401) {
                $this->log_schreiben("Influx Token ist ungültig oder hat nicht genügend Rechte.", "*  ", 5);
                break;
            }
            else {
                $this->log_schreiben("InfluxDB Fehler -> nochmal versuchen. HTTP Code: ".$rc_info["http_code"], "   ", 5);
                $i++;
                sleep(1);
                continue;
            }
            
            $i++;
            sleep(1);
        } while ($i < 3);
        
        curl_close($ch);
        unset($ch);
    }
    
    // Hauptdaten übertragen (nur bei Tageslicht oder wenn explizit erlaubt)
    if ($this->tageslicht("hamburg") || $daten["InfluxDaylight"] === false) {
        $this->log_schreiben("Aktuelle Daten: \n".print_r($daten, 1), "   ", 9);
        
        $query = $this->query_erzeugen($daten);
        if (isset($daten["ZusatzQuery"])) {
            $query = $daten["ZusatzQuery"]."\n".$query;
        }
        
        // InfluxDB v2 URL erstellen
        $url = $this->getInfluxV2Url($daten, '/api/v2/write');
        
        $i = 1;
        do {
            $ch = curl_init($url);
            curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
            curl_setopt($ch, CURLOPT_TIMEOUT, 15);
            curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 12);
            curl_setopt($ch, CURLOPT_PORT, $daten["InfluxPort"]);
            curl_setopt($ch, CURLOPT_POSTFIELDS, $query);
            
            // Token-Based Authentication für InfluxDB v2
            curl_setopt($ch, CURLOPT_HTTPHEADER, [
                'Authorization: Token ' . $daten["InfluxToken"],
                'Content-Type: text/plain'
            ]);
            
            if (isset($daten["InfluxSSL"]) && $daten["InfluxSSL"] == true) {
                curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
                curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
            }
            
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
            $result = curl_exec($ch);
            $rc_info = curl_getinfo($ch);
            
            if (curl_errno($ch)) {
                $this->log_schreiben("Curl Fehler! Daten nicht zur entfernten InfluxDB gesendet! No. ".curl_errno($ch), "   ", 5);
            }
            
            if ($rc_info["http_code"] == 200 || $rc_info["http_code"] == 204) {
                $this->log_schreiben("Daten zur entfernten InfluxDB [ ".$daten["InfluxBucket"]." ] gesendet. ", "*  ", 7);
                break;
            }
            elseif ($rc_info["http_code"] == 401) {
                $this->log_schreiben("Influx Token ist ungültig oder hat nicht genügend Rechte.", "*  ", 5);
                break;
            }
            else {
                $this->log_schreiben("InfluxDB Fehler -> nochmal versuchen. HTTP Code: ".$rc_info["http_code"], "   ", 5);
                $i++;
                sleep(1);
                continue;
            }
            
            $i++;
            sleep(1);
        } while ($i < 3);
        
        curl_close($ch);
    }
    
    return true;
}
Natürlich müssen in die Wechselrichter PHP auch noch die Parameter geladen werden:

Code: Alles auswählen

  $aktuelleDaten["InfluxBucket"] = $InfluxBucket;
  $aktuelleDaten["InfluxOrg"] = $InfluxOrg;
  $aktuelleDaten["InfluxToken"] = $InfluxToken;
Voilà:

Bild

Benutzeravatar
Ulrich
Administrator
Beiträge: 6552
Registriert: Sa 7. Nov 2015, 10:33
Wohnort: Essen
Hat sich bedankt: 164 Mal
Danksagung erhalten: 925 Mal

Re: InfluxDB v2

Beitrag von Ulrich »

Die Solaranzeige arbeitet mit der Influx Version 1.8.x
-----------------------------------------------------
Ulrich . . . . . . . . [ Admin ]

Zurück zu „Allgemeines“

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 0 Gäste