Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. WasserStrom

    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

    W
    • Profile
    • Following 0
    • Followers 0
    • Topics 2
    • Posts 11
    • Best 0
    • Groups 1

    WasserStrom

    @WasserStrom

    Starter

    0
    Reputation
    26
    Profile views
    11
    Posts
    0
    Followers
    0
    Following
    Joined Last Online

    WasserStrom Follow
    Starter

    Latest posts made by WasserStrom

    • RE: 24h-Verteilung des Verbrauchs über 1 Jahr in Grafana

      @ullij
      Hi, das war es nicht wonach ich suchte. Ich habe es jetzt herausgefunden.

      Ich habe es jetzt so gelöst, dass ich

      • einen Datenpunkt im Format number angelegt habe und in InfluxDB speichern lasse
      • im Skript bei jedem Aufruf alle historischen Daten lösche
      • im Skript 24 Daten (prozentualer Verbrauch zu dieser Tageszeit) speichere (und das "from" des Datenpunkts missbrauche um meinen eigenen Text/Beschreibung zu dem entsprechenden Wert/Verbrauch zu speichern)
      • in Grafana sowohl das "from" als auch "value" in einem Table anzeigen lasse (und die echte Zeit ausblende)

      So siehts jetzt in Grafana aus:
      33fb0238-980e-4184-8c43-78926abfa18f-grafik.png

      Das ist das Skript (JS-export vom blockly):

      var wert, ende, anfang, wert_prozentual, stundenanalyse, anzahl_datensaetze, i, result, zeit, stunde, j, zeitstempel, ursprung;
      
      function listsRepeat(value, n) {
       var array = [];
       for (var i = 0; i < n; i++) {
         array[i] = value;
       }
       return array;
      }
      
      
      // Statistik nach Tageszeit sortiert
      // Timeshift in Tagen [0]
      ende = parseFloat((new Date().getTime())) - parseFloat(0) * 86400000;
      // Dauer in Tage [7]
      anfang = parseFloat(ende) - parseFloat(7) * 86400000;
      wert_prozentual = listsRepeat(0, 24);
      sendTo("influxdb.0", "getHistory", {
        "id": 'javascript.0.energycounter.ec_pulses',
        "options": {start: anfang, end: ende, aggregate: "none"}
      }, async function (result) {
         stundenanalyse = listsRepeat(0, 24);
       anzahl_datensaetze = getAttr(result, 'result').length;
       var i_end = parseFloat(anzahl_datensaetze) - 1;
       var i_inc = 1;
       if (0 > i_end) {
         i_inc = -i_inc;
       }
       for (i = 0; i_inc >= 0 ? i <= i_end : i >= i_end; i += i_inc) {
         // .val=value       .ts=timestamp
         zeit = getAttr(result, (['result.',i,'.ts'].join('')));
         stunde = getDateObject(zeit).getHours();
         // Analyse in welcher Stunde des Tages der Energiepuls kam
         stundenanalyse[((parseFloat(stunde) + 1) - 1)] = parseFloat(stundenanalyse[((parseFloat(stunde) + 1) - 1)]) + 1;
       }
       console.log((['Tagesstatistik vom ',formatDate(getDateObject(anfang), "JJJJ.MM.TT SS:mm:ss.sss"),' bis ',formatDate(getDateObject(ende), "JJJJ.MM.TT SS:mm:ss.sss")].join('')));
       for (i = 0; i <= 23; i++) {
         wert = stundenanalyse[((parseFloat(i) + 1) - 1)];
         wert_prozentual[((parseFloat(i) + 1) - 1)] = Math.round((parseFloat((parseFloat(wert) / anzahl_datensaetze)) * 100)*10)/10;
         console.log(([i,' Uhr: ',wert_prozentual[((parseFloat(i) + 1) - 1)],' %'].join('')));
       }
       // Jetzt wird die Statistik in InfluxDB geschrieben
       sendTo("influxdb.0", "deleteAll", {
          "id": 'javascript.0.test.statistiker'
       });
       for (j = 0; j <= 23; j++) {
         zeitstempel = parseFloat(1685311202800) + parseFloat(j) * 60000;
         wert = wert_prozentual[((parseFloat(j) + 1) - 1)];
         console.log(('Ergebnis der Anbfrage: ' + String(wert)));
         ursprung = String(('' + j)) + ' Uhr';
         sendTo("influxdb.0", "storeState", {
            "id": 'javascript.0.test.statistiker',
            "state": {ts: zeitstempel, val: wert, ack: false, from: ursprung}
         }, async function (result) {
             // Rückmeldung von influxDB ausgeben:
           });
       }
       });
      

      Die zwei Queries in Grafana:

      SELECT "from" FROM "autogen"."javascript.0.test.statistiker" WHERE $timeFilter
      SELECT "value" FROM "autogen"."javascript.0.test.statistiker" WHERE $timeFilter
      

      Und hier die anderen Einstellungen (overrides und transformations) in Grafana:
      ea635dd2-270a-4690-8e64-e19f069e4483-grafik.png

      Wieso schreibe ich das so ausführlich? Vielleicht ist es ja auch für andere Leute interessant:

      • Grafana zur Visualisierung der Iobroker-Daten zu nutzen -> Grafana kann man auf dem PC installieren und so Ressourcen beim Iobroker-Rechner (zB Raspberry 1b bei mir) sparen
      • Beliebigen Text (zB. der letzte Emailabsender, die letzte Zeile der Iobroker-Log-Datei oder einen Zufallstext zur Begrüßung) im Grafana-Dashboard anzuzeigen (ist im Skript die Kategorie zB. "7 Uhr")

      Viel Spass damit! 🙂

      posted in Off Topic
      W
      WasserStrom
    • RE: Datenpunkt in influxdb speichern

      @djmarc75

      Vielen Dank! Wieder was gelernt 🙂

      posted in Einsteigerfragen
      W
      WasserStrom
    • RE: Datenpunkt in influxdb speichern

      @homoran

      Besten Dank. Tatsächlich funktioniert "storeState" nur mit konfigurierten Datenpunkten wie im folgenden Beispiel:

      sendTo('influxdb.0', 'storeState', {
          id: 'javascript.0.energycounter.ec_dailycounter',
          state: {ts: 1685311202820, val: 6, ack: false, from: 'system.adapter.whatever.0'}
      }, function (result) {
          console.log('added');
      });
      

      Aber beim "query" löst der Befehl "insert" auch bei konfiguriertem Datenpunkt nach wie vor dieselbe Fehlermeldung aus.

      Aber das ist nicht schlimm, ich komme erstmal mit "storeState" weiter.

      ps: Du kannst gerne den Schreibfehler im Thread-Titel korrigieren. Ich schaffe das nicht.

      posted in Einsteigerfragen
      W
      WasserStrom
    • Datenpunkt in influxdb speichern

      Hallo,

      ich versuche ohne Erfolg in einem Skript selbst einen Datenpunkt in influx mit dem Adapter influxdb zu speichern.

      In der Raspberry-Konsole bei Influx funktioniert es wunderbar:

      pi@raspberrypi:~ $ influx
      Connected to http://localhost:8086 version 1.8.10
      InfluxDB shell version: 1.8.10
      > use iobroker
      Using database iobroker
      > INSERT energy_consumption value=3
      > select * from energy_consumption
      name: energy_consumption
      time                hour value
      ----                ---- -----
      1685196703747955711 10   17
      1685197180244637788 11   90
      1685288023379343768 12   0
      1685349356267094122      3
      1685349386812894845      3
      1685349387563445028      3
      1685351947017987008      3
      

      Mit folgendem Javascript-Befehl unter iobroker:

      sendTo('influxdb.0', 'query', 'INSERT energy_consumption value=3', function (result) {
          if (result.error) {
              console.error(result.error);
          } else {
               console.log('Rows: ' + JSON.stringify(result.result[0]));
          }
      });
      

      Kommt folgende Fehlermeldung im Log:

      influxdb.0
      	2023-05-29 11:05:05.298	error	query: Error: error parsing query: found INSERT, expected SELECT, DELETE, SHOW, CREATE, DROP, EXPLAIN, GRANT, REVOKE, ALTER, SET, KILL at line 1, char 1
      

      Das funktioniert übrigens wunderbar:

      sendTo('influxdb.0', 'query', 'SELECT * FROM energy_consumption LIMIT 100', function (result) {
          if (result.error) {
              console.error(result.error);
          } else {
              // show result
               console.log('Rows: ' + JSON.stringify(result.result[0]));
          }
      });
      

      Was mache ich falsch?

      "storeState" des Adapters influxdb funktioniert auch nicht.
      Befehl:

      sendTo('influxdb.0', 'storeState', {
          id: 'energy_consumption',
          state: {val: 3}
      }, function (result) {
          console.log('added');
      });
      

      Fehlermeldung:

      influxdb.0
      	2023-05-29 11:26:57.652	warn	Error on writePoint("{"value":3,"time":null,"from":"","q":0,"ack":false}): Error: {"error":"unable to parse 'energy_consumption value=3,from=\"\",q=0,ack=false NaN': bad timestamp"} / "{\"error\":\"unable to parse 'energy_consumption value=3,from=\\\"\\\",q=0,ack=false NaN': bad timestamp\"}\n""
      
      posted in Einsteigerfragen
      W
      WasserStrom
    • RE: 24h-Verteilung des Verbrauchs über 1 Jahr in Grafana

      @ullij

      Sorry, ich musste die letzten Tage meine Iobroker-Installation reparieren, weil sie extrem langsam geworden war.

      Super Idee mit dem JSON und dann im Widget anzeigen. So sollte es gehen.

      Aber ich habe bei mir aus Performance-Gründen (ich habe einen Raspberry 1b) VIS ausgeschaltet und lasse alles auf Grafana anzeigen.

      Wie kann ich also ein Array/Liste (zB. {0.1;0.5;0.3;0.1}) oder von mir aus JSON in Grafana anzeigen lassen?
      Mit dem Histogramm statt Timeseries vielleicht?
      Gibt es eine Transformation, die aus einer Liste eine Wertefolge machen kann?

      Bisher habe beim probieren in Grafana noch keine Idee gefunden.

      posted in Off Topic
      W
      WasserStrom
    • RE: 24h-Verteilung des Verbrauchs über 1 Jahr in Grafana

      @ullij , @Lucifor1976

      Wow, das sind ja super Funktionen. Aber genau: ich suche eine Funktion, die alle Mittelwerte für zB. 1 Uhr über die letzten 365 Tage addiert. Was jetzt $timeFilter macht habe ich auch nach Recherche im Internet nicht ganz verstanden.

      Ich könnte natürlich auch mein Skript für die Analyse laufen lassen und dann mit falschen Zeitwerten (ein Wert für 1 Uhr, einen für 2 Uhr und so weiter) abspeichern. Kann man überhaupt die Zeitstempel der Datenwerte manipulieren?

      posted in Off Topic
      W
      WasserStrom
    • 24h-Verteilung des Verbrauchs über 1 Jahr in Grafana

      Hallo,

      ich habe mir ein Blockly gebaut, um die InfluxDB-Daten (Impulse vom Stromzähler) statistisch nach Tageszeit auszuwerten, um zu wissen, um wieviel Uhr meistens viel Strom verbraucht wird.

      Wie kann ich jetzt diese Tagesstatistik in Grafana darstellen lassen?
      Sollte ich am besten 1 Datenpunkt mit 24 Werten erzeugen? Die müsste ich beim nächsten Start des Skripts überschreiben... ich stehe auf dem Schlauch.

      Grüße,
      Philipp

      Das Ergebnis sieht so aus:

      22:20:53.074	info	javascript.0 (26023) script.js.tagesstatistik_wc: Tagesstatistik vom 01.05.22 bis 01.05.23
      22:20:53.078	info	javascript.0 (26023) script.js.tagesstatistik_wc: 0 Uhr: 0.4 %
      22:20:53.080	info	javascript.0 (26023) script.js.tagesstatistik_wc: 1 Uhr: 0.6 %
      22:20:53.082	info	javascript.0 (26023) script.js.tagesstatistik_wc: 2 Uhr: 1.2 %
      22:20:53.084	info	javascript.0 (26023) script.js.tagesstatistik_wc: 3 Uhr: 0.6 %
      22:20:53.086	info	javascript.0 (26023) script.js.tagesstatistik_wc: 4 Uhr: 1.2 %
      22:20:53.088	info	javascript.0 (26023) script.js.tagesstatistik_wc: 5 Uhr: 2.8 %
      22:20:53.089	info	javascript.0 (26023) script.js.tagesstatistik_wc: 6 Uhr: 2.4 %
      22:20:53.091	info	javascript.0 (26023) script.js.tagesstatistik_wc: 7 Uhr: 2.6 %
      22:20:53.094	info	javascript.0 (26023) script.js.tagesstatistik_wc: 8 Uhr: 14.2 %
      22:20:53.095	info	javascript.0 (26023) script.js.tagesstatistik_wc: 9 Uhr: 4 %
      22:20:53.098	info	javascript.0 (26023) script.js.tagesstatistik_wc: 10 Uhr: 2.4 %
      22:20:53.100	info	javascript.0 (26023) script.js.tagesstatistik_wc: 11 Uhr: 2 %
      22:20:53.101	info	javascript.0 (26023) script.js.tagesstatistik_wc: 12 Uhr: 5.6 %
      22:20:53.103	info	javascript.0 (26023) script.js.tagesstatistik_wc: 13 Uhr: 14.2 %
      22:20:53.105	info	javascript.0 (26023) script.js.tagesstatistik_wc: 14 Uhr: 4.4 %
      22:20:53.107	info	javascript.0 (26023) script.js.tagesstatistik_wc: 15 Uhr: 5.2 %
      22:20:53.108	info	javascript.0 (26023) script.js.tagesstatistik_wc: 16 Uhr: 13.6 %
      22:20:53.110	info	javascript.0 (26023) script.js.tagesstatistik_wc: 17 Uhr: 5.6 %
      22:20:53.112	info	javascript.0 (26023) script.js.tagesstatistik_wc: 18 Uhr: 10.2 %
      22:20:53.115	info	javascript.0 (26023) script.js.tagesstatistik_wc: 19 Uhr: 2.8 %
      22:20:53.116	info	javascript.0 (26023) script.js.tagesstatistik_wc: 20 Uhr: 1.8 %
      22:20:53.119	info	javascript.0 (26023) script.js.tagesstatistik_wc: 21 Uhr: 0.8 %
      22:20:53.120	info	javascript.0 (26023) script.js.tagesstatistik_wc: 22 Uhr: 1 %
      22:20:53.122	info	javascript.0 (26023) script.js.tagesstatistik_wc: 23 Uhr: 0.4 %
      

      Das Blockly sieht so aus:
      blockly_influxdb-statistik.png

      var ende, anfang, stundenanalyse, anzahl_datensaetze, i, result, zeit, wert, stunde;
      
      function listsRepeat(value, n) {
        var array = [];
        for (var i = 0; i < n; i++) {
          array[i] = value;
        }
        return array;
      }
      
      
      // Statistik nach Tageszeit sortiert
      // Timeshift in Tagen [0]
      ende = parseFloat((new Date().getTime())) - parseFloat(0) * 86400000;
      // Dauer in Tage [7]
      anfang = parseFloat(ende) - parseFloat(365) * 86400000;
      sendTo("influxdb.0", "getHistory", {
         "id": 'javascript.0.energycounter.ec_pulses',
         "options": {start: anfang, end: ende, aggregate: "none"}
      }, async function (result) {
          stundenanalyse = listsRepeat(0, 24);
        anzahl_datensaetze = getAttr(result, 'result').length;
        var i_end = parseFloat(anzahl_datensaetze) - 1;
        var i_inc = 1;
        if (0 > i_end) {
          i_inc = -i_inc;
        }
        for (i = 0; i_inc >= 0 ? i <= i_end : i >= i_end; i += i_inc) {
          // .val=value       .ts=timestamp
          zeit = getAttr(result, (['result.',i,'.ts'].join('')));
          stunde = getDateObject(zeit).getHours();
          stundenanalyse[((parseFloat(stunde) + 1) - 1)] = parseFloat(stundenanalyse[((parseFloat(stunde) + 1) - 1)]) + 1;
        }
        console.log((['Tagesstatistik vom ',formatDate(getDateObject(anfang), "DD.MM.YY"),' bis ',formatDate(getDateObject(ende), "DD.MM.YY")].join('')));
        for (i = 0; i <= 23; i++) {
          wert = stundenanalyse[((parseFloat(i) + 1) - 1)];
          console.log(([i,' Uhr: ',Math.round((parseFloat((parseFloat(wert) / anzahl_datensaetze)) * 100)*10)/10,' %'].join('')));
        }
        });
      

      posted in Off Topic
      W
      WasserStrom
    • RE: gezielt Werte aus InfluxDB mit Telegram verschicken

      @einencool

      Hi,

      ich kenne AhoiDTU nicht.
      Der "Yield.Day" hört sich aber schon mal gut an und mir scheint, dass du ihn schon in influxdb speicherst.

      Mit dem folgenden Blockly kannst du ihn aus influxDB auslesen und und über 7 Tage summieren.
      Das Versenden über Telegram funktioniert so, wie du es schon für die Einzelwerte geschafft hast.

      blockly_influxdb-anfrage.png

      var end, start, result, wertesumme, i, wert, zeit;
      
      
      // Get history from influxdb adapter
      end = (new Date().getTime());
      start = parseFloat(end) - parseFloat(7) * 3600000;
      sendTo("influxdb.0", "getHistory", {
        "id": 'AhoiDTU.0.Yield.Day',
        "options": {start: start, end: end, aggregate: "none"}
      }, async function (result) {
         console.log('Ergebnis der Abfrage:');
       // Rückmeldung von influxDB ausgeben:
       console.log(result);
       console.log('Die Einzelwerte:');
       wertesumme = 0;
       // Rückmeldung von influxDB auswerten:
       var i_end = parseFloat(getAttr(result, 'result').length) - 1;
       var i_inc = 1;
       if (0 > i_end) {
         i_inc = -i_inc;
       }
       for (i = 0; i_inc >= 0 ? i <= i_end : i >= i_end; i += i_inc) {
         wert = getAttr(result, (['result.',i,'.val'].join('')));
         wertesumme = (typeof wertesumme == 'number' ? wertesumme : 0) + wert;
         zeit = getAttr(result, (['result.',i,'.ts'].join('')));
         console.log((['Wert: ',wert,' Zeit: ',formatDate(getDateObject(zeit), "TT.MM.JJJJ SS:mm:ss")].join('')));
       }
       console.log(('Die Summe aller Werte: ' + String(wertesumme)));
       });
      

      Falls du übrigens die influxDB-Abfrage anpassen möchtest, ist hier die Hilfeseite:
      https://github.com/ioBroker/ioBroker.influxdb

      Grüße,
      Philipp

      posted in Skripten / Logik
      W
      WasserStrom
    • RE: npm ERR! engine Unsupported engine

      @thomas-braun

      Vielen Dank, das installieren der inoffiziellen nodejs-Version (nach der Anweisung in deiner Signatur) und dann das Ausführen des Installationsskripts hat geholfen!

      Ihr könnt ja gerne an geeigneter Stelle die Installationsbeschreibung ergänzen, dass bei ARM v6 Prozessoren die richtige nodejs vorab installiert sein muss.

      Ich bin gespannt, wie die Performance vom Iobroker auf dem Raspberry1 beim GPIO-Impulszählen von der Lichtschranke am Stromzähler ist. Das war halt das, was ich da hatte und kannte.

      posted in Installation
      W
      WasserStrom
    • RE: npm ERR! engine Unsupported engine

      @homoran
      Ich habe folgendes getan:

      • Raspberry Pi OS Lite (32 bit) frisch geladen und auf die SD-Karte geschrieben
      • Installation gestartet mit
      curl -sLf https://iobroker.net/install.sh | bash -
      
      • System update durchgeführt, da die oben genannte Fehlermeldung kam
      sudo apt update && sudo apt upgrade
      
      • Nochmal die Installationsroutine gestartet mit der selben Fehlermeldung
      npm ERR! notsup Required: {"node":">=14.14"}
      

      Beim Aufruf von iobroker kommt auch eine Fehlermeldung

      pi@raspberrypi:/opt/iobroker $ iobroker status
      internal/modules/cjs/loader.js:818
        throw err;
        ^
      Error: Cannot find module '/opt/iobroker/node_modules/iobroker.js-controller/iobroker.js'
      

      Sollte ich jetzt Anpassungen probieren, dass die Installationsroutine beim nächsten mal durchläuft oder sollte ich versuchen, iobroker einfach mit nodejs v12.22.12 zum laufen zu bringen?

      Ich hatte mich vor Jahren mit der Installation von nodejs auf einem Raspberry Pi Zero beschäftigt und da etwas von den "unofficial-builds" verwendet. Inwiefern würde mir jetzt https://unofficial-builds.nodejs.org/download/release/v19.7.0/ weiterhelfen?

      Sorry ich arbeite mich gerade nach einer inaktiven Zeit wieder in Iobroker/Raspberry-Themen ein.

      posted in Installation
      W
      WasserStrom
    Community
    Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
    The ioBroker Community 2014-2023
    logo