Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. JavaScript
    5. http post tagkeys und fieldkeys

    NEWS

    • Neuer Blog: Fotos und Eindrücke aus Solingen

    • ioBroker@Smart Living Forum Solingen, 14.06. - Agenda added

    • ioBroker goes Matter ... Matter Adapter in Stable

    http post tagkeys und fieldkeys

    This topic has been deleted. Only users with topic management privileges can see it.
    • D
      DET last edited by

      Moin Zusammen,
      nutzte das Script von @haus-automatisierung zur Befühlung der influxDB

      // v0.1
      const axios = require('axios').default; 
      
      const token = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxx==';
      const measurement = 'PV-Anlage';
      const protocol = 'http';
      const host = 'xx.yy.zz.ww';
      const port = '8086';
      const org = 'SmartHome';
      const bucket = 'Energieversorgung';
      
      const loggingTemplate = {
          'alias.0.PV-Anlage.Hauptanlage_Victron.SLR1.MPPT1-West3.ELECTRIC_POWER': 'Leistung-West3',
          'alias.0.PV-Anlage.Hauptanlage_Victron.SLR1.MPPT1-West3.VOLTAGE': 'Spannung-West3',
          'alias.0.PV-Anlage.Hauptanlage_Victron.SLR1.MPPT2-Süd1.ELECTRIC_POWER': 'Leistung-Süd1',
          'alias.0.PV-Anlage.Hauptanlage_Victron.SLR1.MPPT2-Süd1.VOLTAGE': 'Spannung-Süd1',
          'alias.0.PV-Anlage.Hauptanlage_Victron.SLR1.MPPT3-Ost3.ELECTRIC_POWER': 'Leistung-Ost3',
          'alias.0.PV-Anlage.Hauptanlage_Victron.SLR1.MPPT3-Ost3.VOLTAGE': 'Spannung-Ost3',
          'alias.0.PV-Anlage.Hauptanlage_Victron.SLR1.MPPT4-Ost4.ELECTRIC_POWER': 'Leistung-Ost4',
          'alias.0.PV-Anlage.Hauptanlage_Victron.SLR1.MPPT4-Ost4.VOLTAGE': 'Spannung-Ost4',
          'alias.0.PV-Anlage.Hauptanlage_Victron.SLR2.MPPT1-Ost1.ELECTRIC_POWER': 'Leistung-Ost1',
          'alias.0.PV-Anlage.Hauptanlage_Victron.SLR2.MPPT1-Ost1.VOLTAGE': 'Spannung-Ost1',
          'alias.0.PV-Anlage.Hauptanlage_Victron.SLR2.MPPT2-Ost2.ELECTRIC_POWER': 'Leistung-Ost2',
          'alias.0.PV-Anlage.Hauptanlage_Victron.SLR2.MPPT2-Ost2.VOLTAGE': 'Spannung-Ost2',
          'alias.0.PV-Anlage.Hauptanlage_Victron.SLR2.MPPT3-West1.ELECTRIC_POWER': 'Leistung-West1',
          'alias.0.PV-Anlage.Hauptanlage_Victron.SLR2.MPPT3-West1.VOLTAGE': 'Spannung-West1',
          'alias.0.PV-Anlage.Hauptanlage_Victron.SLR2.MPPT4-West2.ELECTRIC_POWER': 'Leistung-West2',
          'alias.0.PV-Anlage.Hauptanlage_Victron.SLR2.MPPT4-West2.VOLTAGE': 'Spannung-West2',
      };
      
      const loggingObj = {};
      
      async function start() {
      
          console.log(`Starting "${measurement}" logging to ${protocol}://${host}:${port} into bucket "${bucket}" by org ${org}`);
      
          // Init loggingObj with current values
          for (let [objId, key] of Object.entries(loggingTemplate)) {
              const state = await getStateAsync(objId);
              if (state && !isNaN(state.val)) {
                  loggingObj[key] = state.val;
              } else {
                  loggingObj[key] = 0;
              }
          }
      
          on({ id: Object.keys(loggingTemplate), change: 'ne' }, async (obj) => {
              // Update value in loggingObj
              const key = loggingTemplate[obj.id];
              loggingObj[key] = obj.state.val;
      
              // Save Data
              const data = `${measurement} ${Object.keys(loggingObj)
                  .filter(key => !isNaN(loggingObj[key]))
                  .map((key) => `${key}=${loggingObj[key]}`)
                  .join(',')}`;
      
              if (data) {
                  // console.log(`Saving "${data}" to InfluxDB @ ${protocol}://${host}:${port}/`);
                  // console.dir(data);
      
                  const options = {
                      url: `${protocol}://${host}:${port}/api/v2/write?org=${org}&bucket=${bucket}`,
                      method: 'POST',
                      headers: {
                          'Authorization': `Token ${token}`,
                          'Content-Type': "text/plain; charset=utf-8"
                      },
                      timeout: 0,
                      data
                  }
                  
                  axios(options).catch(error=>console.log(error))
                  
                  //axios.post(`${protocol}://${host}:${port}/api/v2/write?bucket=${bucket}&org=${org}`, data, {
                  //    headers: {
                  //        'Content-Type': 'text/plain',
                  //        'Authorization': `Token ${token}`
                  //    }
                  //}).catch(err => {
                  //    console.error(err);
                  //});
              }
          });
      }
      start();
      

      Hier werden leider tagkey Informationen in fieldkeys mitverarbeitet. Was für die weitere Verarbeitung sehr hinderlich ist.

      Z.B. Leistung-West1 als fieldkey.
      Besser wären tagkeys: Ausrichtung=West,MPPT=1
      und als fieldkey: Leistung=500.00

      So könnten man mit der Filterfunktion in influxDB besser weiterarbeiten, zum Beispiel alle Leistungswerte einer bestimmten Ausrichtung addieren oder alle Leistungswerte eines Solarladeregler adieren.

      Nun müssen aber auch alle Daten den gleichen timestamp bekommen um sie dann sinnvoll zuverarbeiten.

      Im Line Protokoll von influxDB gibt es die Möglichkeit folgende Syntax anzuwenden:

      meassurment,tagkey1=tagvalue1,tagkey2=tagvalue2 fieldkey=fieldvalue timestamp
      meassurment,tagkey3=tagvalue3,tagkey4=tagvalue4 fieldkey=fieldvalue timestamp

      alles in einer Zeile und soweiter.
      Ich würde gern den timestamp weglassen, damit der Server den timestamp setzen kann.

      Da ich ein Newbie im programmieren bin und versuche mir, mit dieser Aufgabe, gerade JavaScript beizubringen überfordert mich das Ganze. Vielleich kann mir jemand auf die Sprünge helfen.
      Am besten wäre das ganze dynamisch zuhalten und nur im loggingTemplate zubestimmen welche und wielviel tags genutzt werden.

      Gruß DET

      haus-automatisierung 1 Reply Last reply Reply Quote 0
      • haus-automatisierung
        haus-automatisierung Developer Most Active @DET last edited by haus-automatisierung

        @det Ursprünglich war das Script ja mal so gedacht, dass man immer "alle Werte gemeinsam" loggt, damit diese alle den gleichen Zeitstempel haben. Siehe https://www.youtube.com/watch?v=rTLQ15Fy85U

        Jetzt nutzt Du das Script aber komplett anders und gar nicht mehr so wie vorgesehen. Die Leistung und Spannung der einzelnen Strings (?) hat ja nichts miteinander zu tun. Also warum sollten die Daten immer alle gleichzeitig gespeichert werden?

        Das könnte man über die normalen Objekt-Eigenschaften des InfluxDB-Adapters lösen. Also ganz ohne Script.

        Oder übersehe ich etwas.

        D 1 Reply Last reply Reply Quote 0
        • D
          DET @haus-automatisierung last edited by DET

          @haus-automatisierung Du hast recht, es wird etwas anders genutzt. Die Spannungswerte sind nicht so wichtig und müssen auch nicht unbedingt gemeinsam geloggt werden. aber die Powerwerte müssen schon gemeinsam geloggt werden, oder? Sonst bekomme ich doch keine saubere Summenkurve der Power über die Zeit hin. Jetzt sind sie unter verschiedenen Fieldkeys, die würde ich gern unter dem Fieldkey 'Power' speichern wollen um dann mit Hilfe der Tagvalues unterschiedliche Auswertungen durchzuführen. In dem Script sind noch nicht alle Powerwerte vorhanden sondern es kommen noch 3 weiter Wechselrichter mit weiteren MPPT's Power werten dazu.
          Ich benutze auch nicht den InfluxDB Adapter, die InfluxDB liegt in einem eigenen Docker-Container und nur über dein Script schreibe ich dort dorten rein.

          haus-automatisierung 1 Reply Last reply Reply Quote 0
          • haus-automatisierung
            haus-automatisierung Developer Most Active @DET last edited by haus-automatisierung

            @det Teste mal so:

            // v0.2
            const token = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxx==';
            const measurement = 'PV-Anlage';
            const protocol = 'http';
            const host = 'xx.yy.zz.ww';
            const port = '8086';
            const org = 'SmartHome';
            const bucket = 'Energieversorgung';
            
            const loggingTemplate = {
                // West
                'alias.0.PV-Anlage.Hauptanlage_Victron.SLR2.MPPT3-West1.ELECTRIC_POWER': {
                    field: 'Leistung',
                    tags: 'Ausrichtung=West1,MPPT=3',
                },
                'alias.0.PV-Anlage.Hauptanlage_Victron.SLR2.MPPT3-West1.VOLTAGE': {
                    field: 'Spannung',
                    tags: 'Ausrichtung=West1,MPPT=3',
                },
                'alias.0.PV-Anlage.Hauptanlage_Victron.SLR2.MPPT4-West2.ELECTRIC_POWER': {
                    field: 'Leistung',
                    tags: 'Ausrichtung=West2,MPPT=4',
                },
                'alias.0.PV-Anlage.Hauptanlage_Victron.SLR2.MPPT4-West2.VOLTAGE': {
                    field: 'Spannung',
                    tags: 'Ausrichtung=West2,MPPT=4',
                },
                'alias.0.PV-Anlage.Hauptanlage_Victron.SLR1.MPPT1-West3.ELECTRIC_POWER': {
                    field: 'Leistung',
                    tags: 'Ausrichtung=West3,MPPT=1',
                },
                'alias.0.PV-Anlage.Hauptanlage_Victron.SLR1.MPPT1-West3.VOLTAGE': {
                    field: 'Spannung',
                    tags: 'Ausrichtung=West3,MPPT=1',
                },
                // Süd
                'alias.0.PV-Anlage.Hauptanlage_Victron.SLR1.MPPT2-Süd1.ELECTRIC_POWER': {
                    field: 'Leistung',
                    tags: 'Ausrichtung=Sued1,MPPT=2',
                },
                'alias.0.PV-Anlage.Hauptanlage_Victron.SLR1.MPPT2-Süd1.VOLTAGE': {
                    field: 'Spannung',
                    tags: 'Ausrichtung=Sued1,MPPT=2',
                },
                // Ost
                'alias.0.PV-Anlage.Hauptanlage_Victron.SLR2.MPPT1-Ost1.ELECTRIC_POWER': {
                    field: 'Leistung',
                    tags: 'Ausrichtung=Ost1,MPPT=1',
                },
                'alias.0.PV-Anlage.Hauptanlage_Victron.SLR2.MPPT1-Ost1.VOLTAGE': {
                    field: 'Spannung',
                    tags: 'Ausrichtung=Ost1,MPPT=1',
                },
                'alias.0.PV-Anlage.Hauptanlage_Victron.SLR2.MPPT2-Ost2.ELECTRIC_POWER': {
                    field: 'Leistung',
                    tags: 'Ausrichtung=Ost2,MPPT=2',
                },
                'alias.0.PV-Anlage.Hauptanlage_Victron.SLR2.MPPT2-Ost2.VOLTAGE': {
                    field: 'Spannung',
                    tags: 'Ausrichtung=Ost2,MPPT=2',
                },
                'alias.0.PV-Anlage.Hauptanlage_Victron.SLR1.MPPT3-Ost3.ELECTRIC_POWER': {
                    field: 'Leistung',
                    tags: 'Ausrichtung=Ost3,MPPT=3',
                },
                'alias.0.PV-Anlage.Hauptanlage_Victron.SLR1.MPPT3-Ost3.VOLTAGE': {
                    field: 'Spannung',
                    tags: 'Ausrichtung=Ost3,MPPT=3',
                },
                'alias.0.PV-Anlage.Hauptanlage_Victron.SLR1.MPPT4-Ost4.ELECTRIC_POWER': {
                    field: 'Leistung',
                    tags: 'Ausrichtung=Ost4,MPPT=4',
                },
                'alias.0.PV-Anlage.Hauptanlage_Victron.SLR1.MPPT4-Ost4.VOLTAGE': {
                    field: 'Spannung',
                    tags: 'Ausrichtung=Ost4,MPPT=4',
                },
            };
            
            const loggingObj = {};
            
            async function start() {
             
                console.log(`Starting "${measurement}" logging to ${protocol}://${host}:${port} into bucket "${bucket}" by org ${org}`);
             
                // Init loggingObj with current values
                for (const objId of Object.keys(loggingTemplate)) {
                    const state = await getStateAsync(objId);
                    if (state && !isNaN(state.val)) {
                        loggingObj[objId] = state.val;
                    } else {
                        loggingObj[objId] = 0;
                    }
                }
             
                on({ id: Object.keys(loggingTemplate), change: 'ne' }, async (obj) => {
                    // Update value in loggingObj
                    loggingObj[obj.id] = obj.state.val;
             
                    // Save Data
                    const data = Object.keys(loggingTemplate)
                        .filter(objId => !isNaN(loggingObj[objId]))
                        .map(objId => `${measurement},${loggingTemplate[objId].tags} ${loggingTemplate[objId].field}=${loggingObj[objId]}`)
                        .join('\n');
             
                    if (data) {
                        // console.log(`Saving "${data}" to InfluxDB @ ${protocol}://${host}:${port}/`);
             
                        httpPost(
                            `${protocol}://${host}:${port}/api/v2/write?org=${org}&bucket=${bucket}`,
                            data,
                            {
                                headers: {
                                    'Authorization': `Token ${token}`,
                                    'Content-Type': 'text/plain; charset=utf-8'
                                },
                                timeout: 0,
                            }
                        );
                    }
                });
            }
            start();
            
            D 1 Reply Last reply Reply Quote 1
            • D
              DET @haus-automatisierung last edited by

              @haus-automatisierung Ja, es funktioniert für meine Bedürfnisse hervorragend, da es große Flexibiliät beinhaltet. Es müssen nur im loggingTemplate die benötigten tags und fields eingetragen werden.
              Vielen Dank für Deine Unterstützung.
              Gruß DET

              1 Reply Last reply Reply Quote 0
              • First post
                Last post

              Support us

              ioBroker
              Community Adapters
              Donate

              953
              Online

              31.8k
              Users

              80.0k
              Topics

              1.3m
              Posts

              communication javascript
              2
              5
              147
              Loading More Posts
              • Oldest to Newest
              • Newest to Oldest
              • Most Votes
              Reply
              • Reply as topic
              Log in to reply
              Community
              Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
              The ioBroker Community 2014-2023
              logo