Skip to content
  • Home
  • Aktuell
  • Tags
  • 0 Ungelesen 0
  • Kategorien
  • Unreplied
  • Beliebt
  • GitHub
  • Docu
  • Hilfe
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Standard: (Kein Skin)
  • Kein Skin
Einklappen
ioBroker Logo

Community Forum

donate donate
  1. ioBroker Community Home
  2. Deutsch
  3. Skripten / Logik
  4. JavaScript
  5. Ordentlich Logging GPS-Daten influxDB Grafana Geomap Routen

NEWS

  • Neuer Blogbeitrag: Monatsrückblick - Dezember 2025 🎄
    BluefoxB
    Bluefox
    5
    1
    46

  • Weihnachtsangebot 2025! 🎄
    BluefoxB
    Bluefox
    24
    1
    1.4k

  • UPDATE 31.10.: Amazon Alexa - ioBroker Skill läuft aus ?
    apollon77A
    apollon77
    48
    3
    9.3k

Ordentlich Logging GPS-Daten influxDB Grafana Geomap Routen

Geplant Angeheftet Gesperrt Verschoben JavaScript
2 Beiträge 1 Kommentatoren 500 Aufrufe 2 Watching
  • Älteste zuerst
  • Neuste zuerst
  • Meiste Stimmen
Antworten
  • In einem neuen Thema antworten
Anmelden zum Antworten
Dieses Thema wurde gelöscht. Nur Nutzer mit entsprechenden Rechten können es sehen.
  • P Offline
    P Offline
    prorun
    schrieb am zuletzt editiert von prorun
    #1

    Moin Leute, ich möchte GPS-Daten per Java in die influxDB schreiben sodass latitude und longitude mit exakt gleichen Zeitstempel in ein Measurement geschrieben werden was mit folgendem Skript auch sehr gut klappt (vielen Dank an der Stelle an Matthias Kleine von haus-automatisierung).

    Jedoch habe ich folgendes Problem: die Werte latitude und longitude kommen etwas Zeitversetzt rein, manchmal nur mit einem Versatz von 2ms, aber das ist ausreichend dass zuerst eine falsche Kombination in die influx geschrieben wird - neue latitude mit altem longitude und 2ms später die richtige Kombination.

    Wie kann ich in dem folgendem Skript eine Verzögerung einbauen sodass nach Datenpunktaktualisierung 500ms abgewartet wird und danach erneut abgefragte Werte in die influx übertragen werden. Sodass zwar die erste Änderung an einem der beiden Datenpunkte (latitude, longitude) weiterhin das Skript trigger aber dann eine feste Zeit abgewartet wird bis die Werte geschrieben werden.

    Leider sind meine Java Kenntnisse nur begrenzt. Bitte helft mir. Dieses Thema interessiert bestimmt auch den ein oder anderen. Ein ordentliches Loggin von GPS-Daten ist schließlich ne feine Sache. Leider ist die Umsetzung gar nicht mal so trivial.

    // v0.1
    const axios = require('axios').default;
    
    const influxDbInstance = 'influxdb.0';
    const token = 'TOKEN';
    const measurement = 'Measurement';
    
    const loggingTemplate = {
        '0_userdata.0.test-number2': 'latitude',
        '0_userdata.0.test-number3': 'longitude',
    };
    
    const loggingObj = {};
    
    async function start() {
        const influxDbInstanceConfig = await getObjectAsync(`system.adapter.${influxDbInstance}`);
    
        const protocol = influxDbInstanceConfig.native.protocol;
        const host = influxDbInstanceConfig.native.host;
        const port = influxDbInstanceConfig.native.port;
        const org = influxDbInstanceConfig.native.organization;
        const bucket = influxDbInstanceConfig.native.dbname;
    
        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}/`);
    
                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();
    
    
    P 1 Antwort Letzte Antwort
    0
    • P prorun

      Moin Leute, ich möchte GPS-Daten per Java in die influxDB schreiben sodass latitude und longitude mit exakt gleichen Zeitstempel in ein Measurement geschrieben werden was mit folgendem Skript auch sehr gut klappt (vielen Dank an der Stelle an Matthias Kleine von haus-automatisierung).

      Jedoch habe ich folgendes Problem: die Werte latitude und longitude kommen etwas Zeitversetzt rein, manchmal nur mit einem Versatz von 2ms, aber das ist ausreichend dass zuerst eine falsche Kombination in die influx geschrieben wird - neue latitude mit altem longitude und 2ms später die richtige Kombination.

      Wie kann ich in dem folgendem Skript eine Verzögerung einbauen sodass nach Datenpunktaktualisierung 500ms abgewartet wird und danach erneut abgefragte Werte in die influx übertragen werden. Sodass zwar die erste Änderung an einem der beiden Datenpunkte (latitude, longitude) weiterhin das Skript trigger aber dann eine feste Zeit abgewartet wird bis die Werte geschrieben werden.

      Leider sind meine Java Kenntnisse nur begrenzt. Bitte helft mir. Dieses Thema interessiert bestimmt auch den ein oder anderen. Ein ordentliches Loggin von GPS-Daten ist schließlich ne feine Sache. Leider ist die Umsetzung gar nicht mal so trivial.

      // v0.1
      const axios = require('axios').default;
      
      const influxDbInstance = 'influxdb.0';
      const token = 'TOKEN';
      const measurement = 'Measurement';
      
      const loggingTemplate = {
          '0_userdata.0.test-number2': 'latitude',
          '0_userdata.0.test-number3': 'longitude',
      };
      
      const loggingObj = {};
      
      async function start() {
          const influxDbInstanceConfig = await getObjectAsync(`system.adapter.${influxDbInstance}`);
      
          const protocol = influxDbInstanceConfig.native.protocol;
          const host = influxDbInstanceConfig.native.host;
          const port = influxDbInstanceConfig.native.port;
          const org = influxDbInstanceConfig.native.organization;
          const bucket = influxDbInstanceConfig.native.dbname;
      
          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}/`);
      
                  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();
      
      
      P Offline
      P Offline
      prorun
      schrieb am zuletzt editiert von prorun
      #2

      Habe es jetzt gelöst bekommen.

      Mit folgendem Skript erhält man ein einziges Measurement was latitude und longitude mit exakt gleichen Zeitstempel enthält. Zusätzlich können latitude und longitude zeitversetzt eintrudeln - welcher Wert zuerst kommt ist dabei egal. In diesem Beispiel hier bis zu 10 Sekunden Versatz. Es wird also obwohl latitude und longitude in unterschiedlichen Datenpunkten liegen und bei Änderung beider Werte das Skript 2x triggert (bei Änderung von latitude und noch mal bei Änderung von longitude) immer nur einmal und nur die Kombination aus beiden neuen Werten in die influxDB geschrieben.

      Funktioniert jetzt einwandfrei. Hiermit ist es möglich Koordinaten sauber in der influxDB abzulegen um beispielsweise mit Grafana Routen daraus zu basteln.

      // v0.2
      const axios = require('axios').default;
       
      const influxDbInstance = 'influxdb.0';
      const token = 'TOKEN';
      const measurement = 'GPS-Test';
       
      const loggingTemplate = {
          '0_userdata.0.test-number2': 'lati',
          '0_userdata.0.test-number3': 'longi',
      };
      
      const loggingObj = {};
      
      async function start() {
          const influxDbInstanceConfig = await getObjectAsync(`system.adapter.${influxDbInstance}`);
      
          const protocol = influxDbInstanceConfig.native.protocol;
          const host = influxDbInstanceConfig.native.host;
          const port = influxDbInstanceConfig.native.port;
          const org = influxDbInstanceConfig.native.organization;
          const bucket = influxDbInstanceConfig.native.dbname;
      
          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;
              }
          }
      // Variable für Timeout sodass bei Wiederholung der vorherige Timeout abgebrochen werden kann
      let timeoutHandler;
      
      // Trigger-Bedingung (bei Änderung eines der DP (loggingTemplate))
      on({ id: Object.keys(loggingTemplate), change: 'ne' }, async (obj) => {
          // Update value in loggingObj
          const key = loggingTemplate[obj.id];
          loggingObj[key] = obj.state.val;
      
          // Lösche vorherigen Timeout, falls vorhanden
          if (timeoutHandler) {
              clearTimeout(timeoutHandler);
          }
      
          // Setze neuen Timeout
          timeoutHandler = setTimeout(async () => {
              // 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}/`);
      
                  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);
                  });
              }
          }, 10000); // 10.000 Millisekunden = 10 Sekunden
      });
      }
      start();
      

      Uns so hier sieht das ganze dann in Grafana mit dem Widget Geomap aus:
      2023-12-19 14_21_41-Window.png

      from(bucket: "iobroker")
        |> range(start: v.timeRangeStart, stop: v.timeRangeStop)
        |> filter(fn: (r)   => 
        r._measurement == "GPS-Test" and 
        r._field == "lati" or
        r._field == "longi" )
        |> pivot(rowKey:["_time"], columnKey: ["_field"], valueColumn: "_value")
        |> drop(columns: ["_start", "_stop", "_measurement"])
      
      1 Antwort Letzte Antwort
      1
      Antworten
      • In einem neuen Thema antworten
      Anmelden zum Antworten
      • Älteste zuerst
      • Neuste zuerst
      • Meiste Stimmen


      Support us

      ioBroker
      Community Adapters
      Donate

      347

      Online

      32.5k

      Benutzer

      81.7k

      Themen

      1.3m

      Beiträge
      Community
      Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen | Einwilligungseinstellungen
      ioBroker Community 2014-2025
      logo
      • Anmelden

      • Du hast noch kein Konto? Registrieren

      • Anmelden oder registrieren, um zu suchen
      • Erster Beitrag
        Letzter Beitrag
      0
      • Home
      • Aktuell
      • Tags
      • Ungelesen 0
      • Kategorien
      • Unreplied
      • Beliebt
      • GitHub
      • Docu
      • Hilfe