Ankündigung

Einklappen
Keine Ankündigung bisher.

LBS: 19001034 InfluxDB Batch Writer

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    LBS: 19001034 InfluxDB Batch Writer

    Feedback bitte hier her
    Gruß
    Michael

    #2
    Hi,

    Mich wundert das hier noch kein Feedback gibt.
    Naja dann fangen wir mal an ;-)

    Erstmal Danke für den LBS!


    1.)
    Wie hast du das mit der Retention Policy gelöst?
    Die Daten die ich erstmal schreiben will sind relativ wenige ..aber da fallen mir bestimmt noch mehr sinnvolle geschichten ein.

    2.)
    Wäre es nicht sinnvoller wenn das value jedes Datensatzes das einzelne Metric triggert?
    Weil so schreibe ich ja alle "Datenpunkte" immer zum gleichen moment!?

    LG
    Zuletzt geändert von trollmar; 29.01.2018, 19:42.
    Jean-Luc Picard: "Things are only impossible until they are not."

    Kommentar


      #3
      Freut mich das es jemand gebrsuchen kann.
      1. gar nicht, im Moment bin ich der auffassung das ich das nicht brauche da die Datenmengen fuer aktuelle Festplatten nicht so Gigantisch sind.

      2. Das ist absicht Deswegen ja "Batch" im Namen.
      Es gibt noch einen LBS der das genau so macht, aber ich schreibe relative viele Daten im Sekundentakt die aber alle den gleichen Tomestamp haben und da will ich nicht fuer jede Metric eine TCP Verbindung aufbauen.

      Bei mir gent hauptsaechlich die PV Anlage (1s) und die WP (60s) darueber im die DB.
      Gruß
      Michael

      Kommentar


        #4
        Danke für die Erklärung!
        LG
        Jean-Luc Picard: "Things are only impossible until they are not."

        Kommentar


          #5
          Hallo!

          Bei mir funktionierte das einfügen in Version 0.2 per Line Protokoll nicht, der Fehler war "Undefined variable: ch".

          Als fix habe ich die initialisierung aus dem nicht Line Protokol teil genommen:

          vorher:
          Code:
          logging($id, "Sending Line Protocol:", $data);
          $url = $protocol."://$host:$port/write?db=$db_name".$E[46]['value'];
          curl_setopt($ch, CURLOPT_URL, $url);
          curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-type: text/plain', 'Content-Length: '.strlen($data)));
          nachher:
          Code:
          logging($id, "Sending Line Protocol:", $data);
          $url = $protocol."://$host:$port/write?db=$db_name".$E[46]['value'];
          
          $ch = curl_init();
          
          curl_setopt($ch, CURLOPT_URL, $url);
          curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-type: text/plain', 'Content-Length: '.strlen($data)));
          Vielleicht kannst du das bei Gelegenheit fixen und aktualiseren.

          Danke und Grüße
          David

          Kommentar


            #6
            Ach nochwas:

            Ich habe bei mir in allen KO Notizen die in die InfluxDB fliegen sollen, einen Bezeichner hinterlegt, der sieht so aus:
            Code:
            {influxdb[Klima,Raum=Arbeiten,Position=FBH StatusStellwert={value}]}
            Ging bei mir recht zügig, da ich alle meine GAs und Onewire Elemente in Excel organisiert habe und damit recht schnell die Bezeichner erzeugen kann.

            Nun lasse ich alle 5 Minuten eine Logik laufen, die mir per SQL Skript die Daten aus dem RAMKo holt und die Daten schon als LineProtokoll aufbereitet und dann mittels Batch Writer komplett in Influx schreibt. Erste Tests dafür sehen ganz gut aus.

            Wenn das für andere auch interessant sein sollte, kurz melden, dann poste ich Details und ein paar Screenshots dazu.

            Grüße
            David

            Kommentar


              #7
              Zitat von kingolli Beitrag anzeigen
              Wenn das für andere auch interessant sein sollte, kurz melden, dann poste ich Details und ein paar Screenshots dazu.
              Klingt nach der klasse Idee, darum melde ich mich hiermit kurz

              Kommentar


                #8
                Hallo!

                Wie geschrieben, hab ich in die Notizen den Platzhalter "
                {influxdb[Klima,Raum=Arbeiten,Position=FBH StatusStellwert={value}]}" eingefügt, die Metric und die Tags kann man ja setzen wie man es braucht.

                Dann habe ich den Logikbaustein "19001971 - SELECT from mysql database" so verändert, das ich nur noch ein komplettes SQL Statement an E10 übergebe und ein entsprechendes Result (A10) bekomme (den Baustein brauche ich mehrfach, u.a. für die Aufbereitung von Monatsverbräuchen und der Rückgabe als Tabelle). Da kommt folgendes SQL Statement rein
                Code:
                SELECT
                   CONCAT('',replace(replace(replace(text, '{value}', value),'{influxdb[', ''),']}', ''), ' ', visuts * 1000, '\n' )
                FROM
                   RAMko
                WHERE
                   text like '%{influxdb[%' AND
                   not value is null;
                Damit hole ich einmal pro Minute für alle oben erwähnten Platzhalter die Werte und packe sie in einen String, diesen übergebe ich anschliessend an den Eingang Line Protocol das Influx Batch Writer Bausteins. Vorteil ist, dass ich den Timestamp von Edomi verwende, falls es keine Änderungen gab, wird der Wert auch nicht neu in Influx geschrieben.

                Sieht in der Logik dann so aus:
                InfluxDB.png

                Lässt sich natürlich nach belieben anpassen, ich hab bspw. die Werte von meinem Grillthermometer die ich in Influx aufzeichne, da kann man dann den Platzhalter anpassen oder manuell speichern usw.

                Bei Fragen einfach nochmal melden...

                Grüße
                David

                Kommentar


                  #9
                  kingolli super LBS, macht "fast" genau das was ich erwarte.
                  Besteht die Möglichkeit das auch eine "0" geschrieben wird?
                  Ich möchte gerne das Signal von der Wetterstation für Regen in die Datenbank schreiben. Solange eine "1" kommt wird die sauber geschrieben aber bei einer "0" wird nichts an die DB übergeben.


                  Gruß Chris

                  Kommentar


                    #10
                    Zitat von ChrisChros Beitrag anzeigen
                    kingolli
                    Besteht die Möglichkeit das auch eine "0" geschrieben wird?
                    Hallo Chris!

                    Da hat sich bei mir einiges getan, ich such das mal raus und poste es hier.

                    Grüße
                    David
                    Zuletzt geändert von kingolli; 17.12.2021, 20:59.

                    Kommentar


                      #11
                      Also, die Notizen habe ich etwas angepasst, die haben jetzt den Aufbau eines JSON Strings, so kann ich mehrere Informationen in den Notizen unterbringen:

                      Code:
                      {"influxdb":"Klima,Raum=Arbeiten,Position=FBHTemperatur={value}"}
                      Ich habe mir eine Erweiterung in MySQL installiert um diese Sachen zu lesen/interpretieren:
                      https://shlomi-noach.github.io/commo...son_value.html

                      Da ist auch die Doku für die Installation zu finden.

                      Durch die Änderungen der DB Struktur in Edomi sind die Notizen jetzt nicht mehr in der Live, sondern nur noch im Projekt. Das heißt, der Aufruf hat sich geändert:
                      Code:
                      SELECT
                            CONCAT('',replace(common_schema.extract_json_value (text,'influxdb'), '{value}', CAST(IFNULL(RAMko.value, 0) as double)), ' ', visuts * 1000, '\n' )
                      FROM
                             RAMko INNER JOIN
                                  edomiProject.editKo ON editKo.id = RAMko.id
                       WHERE
                            text like '%"influxdb":%}' AND
                            not RAMko.value is null;
                      Falls du das verwenden möchtest, einfach hinten das "AND not RAMKo.value is null" weglassen, dann kommen alle Werte und im Fall von NULL wird 0 eingesetzt.

                      Grüße
                      David
                      Zuletzt geändert von kingolli; 17.12.2021, 21:12.

                      Kommentar


                        #12
                        kingolli danke für deine Erklärung. Leider verstehe ich nur Bahnhof 😫

                        Bei mir sieht es aktuell so aus:
                        Bildschirmfoto 2021-12-18 um 13.29.08.png

                        Ich habe weiter oben gesehen, das du den LBS19001971 verwendest um den oben beschrieben SQL Statement an deinen LBS an E9 zu übergeben. Das ist dafür damit auch eine "0" übertragen wird?
                        Eventuell kannst du noch mal beschreiben was und vor allem wo und wie die oben genannte MySQL Erweiterung installiert werden muss.

                        Danke.
                        Gruß Chris

                        Kommentar


                          #13
                          Ach jetzt... der LBS ist gar nicht von mir!

                          Wenn ich alles richtig verstehe, könntest du aber im Bereich um Zeile 275 folgendes einfügen:

                          Code:
                          $data="";
                          for($i = 10; $i < 45; $i=$i+4) {
                          
                            /* ab hier einfügen */
                            /* Null durch 0 ersetzen */
                            if ($E[$i+1]['value']){
                              $E[$i+1]['value'] = 0;
                            }
                            /* bis hier */
                          
                            if ($E[$i]['value'] && $E[$i+1]['value'] && $E[$i+3]['value']!=''){
                              if ($E[47]['value']==1 && is_numeric($E[$i+1]['value'])==false) {
                                $data.=$E[$i]['value'] . ($E[$i+2]['value'] ? ",".$E[$i+2]['value'] : "") . " ". $E[$i+3]['value']."=".'"'.$E[$i+1]['value'].'"'."\n";
                              } else {
                                $data.=$E[$i]['value'] . ($E[$i+2]['value'] ? ",".$E[$i+2]['value'] : "") . " ". $E[$i+3]['value']."=".$E[$i+1]['value']."\n";
                              }
                            }
                          }
                          Vermutlich ist es geschickt, den Inhalt in ein neues, eigenes LBS zu kopieren mit der o.g. Änderung.

                          Kommst du damit weiter?

                          Grüße
                          David

                          Kommentar


                            #14
                            Danke, ich werde es mal testen und berichten.

                            UPDATE:
                            scheint leider nicht zu funktionieren. Nach dem Einfügen deiner Zeilen sende der LBS keine Daten mehr an die InfluxDB. Gleichzeitig gibt der LBS an A1 keine Fehler aus.

                            Im Log sieht das ganze dann so aus:
                            2021-12-18 16:30:47 825862 13180 debug EXE19001034 [v0.1]: e10 & e11 set?
                            2021-12-18 16:30:47 826128 13180 debug EXE19001034 [v0.1]: data:
                            2021-12-18 16:30:47 826150 13180 debug EXE19001034 [v0.1]: ================ ARRAY/OBJECT START ================
                            2021-12-18 16:30:47 826169 13180 debug EXE19001034 [v0.1]: ""
                            2021-12-18 16:30:47 826180 13180 debug EXE19001034 [v0.1]: ================ ARRAY/OBJECT END ================
                            Nachdem ich deine Zeilen wieder gelöscht hatte wurden die Daten wieder versendet:
                            2021-12-18 16:36:12 502413 19651 debug EXE19001034 [v0.1]: e10 & e11 set?
                            2021-12-18 16:36:12 502722 19651 debug EXE19001034 [v0.1]: data:
                            2021-12-18 16:36:12 502744 19651 debug EXE19001034 [v0.1]: ================ ARRAY/OBJECT START ================
                            2021-12-18 16:36:12 502763 19651 debug EXE19001034 [v0.1]: "InfluxDB_Wetterdaten Au\u00dfentemperatur=4.1\nInfluxDB_Wetterdaten Luftdruck=1036.0555141602\nInfluxDB_Wetterdaten Luftfeuchte_relativ=87.6\nInfluxDB_Wetterdaten Helligkeit=32\n"
                            2021-12-18 16:36:12 502777 19651 debug EXE19001034 [v0.1]: ================ ARRAY/OBJECT END ================
                            Zuletzt geändert von ChrisChros; 18.12.2021, 16:40.

                            Kommentar


                              #15
                              Sorry, da fehlt ein Ausrufezeichen (=NOT) vor der Bedingung vom IF


                              Code:
                              $data="";
                              for($i = 10; $i < 45; $i=$i+4) {
                              
                                /* ab hier einfügen */
                                /* Null durch 0 ersetzen */
                                if (!$E[$i+1]['value']){
                                  $E[$i+1]['value'] = 0;
                                }
                                /* bis hier */
                              
                                if ($E[$i]['value'] && $E[$i+1]['value'] && $E[$i+3]['value']!=''){
                                  if ($E[47]['value']==1 && is_numeric($E[$i+1]['value'])==false) {
                                    $data.=$E[$i]['value'] . ($E[$i+2]['value'] ? ",".$E[$i+2]['value'] : "") . " ". $E[$i+3]['value']."=".'"'.$E[$i+1]['value'].'"'."\n";
                                  } else {
                                    $data.=$E[$i]['value'] . ($E[$i+2]['value'] ? ",".$E[$i+2]['value'] : "") . " ". $E[$i+3]['value']."=".$E[$i+1]['value']."\n";
                                  }
                                }
                              }
                              Bitte mal testen.

                              Grüße
                              David

                              Kommentar

                              Lädt...
                              X