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. Gleitender Durchschnitt, Min., Max. über def. Zeitraum

NEWS

  • Weihnachtsangebot 2025! 🎄
    BluefoxB
    Bluefox
    12
    1
    331

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

  • Monatsrückblick – September 2025
    BluefoxB
    Bluefox
    14
    1
    2.3k

Gleitender Durchschnitt, Min., Max. über def. Zeitraum

Geplant Angeheftet Gesperrt Verschoben Skripten / Logik
javascript
113 Beiträge 20 Kommentatoren 26.4k Aufrufe 20 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.
  • sigi234S sigi234

    @paul53 sagte in Gleitender Durchschnitt, Min., Max. über def. Zeitraum:

    @sigi234
    Du kannst mal die erweiterte Funktion testen, die ein JSON mit Werten erzeugen soll. Den Datenpunkt zu idTable musst Du erzeugen und die ID im Skript deklarieren und zuweisen.

    //Berechnung der Werte
    function calcStatData() {
       if (!listStatData || (idData.length != listStatData.length)) {
            initializeStatData();
       }
        //logDebug('starting calcStatData');
       var table = []; 
       for (var i = 0; i < idData.length; i++) {
          var obj = {};
          var sensor = listStatData[i].value.split('.');
          obj.Sensor = sensor[4] + ' ' + sensor[3];
          listStatData[i].data.pop(); //Remove the last element of an array
          var x = parseFloat(getState(idData[i][0]).val);
          obj.Wert = x;
          listStatData[i].data.unshift(x); //Add new items to the beginning of an array
          setState(listStatData[i].value, x);
          var min = x;
          var max = x;
          var sum = 0.0;
          for (var j = 0; j < statDataLength24; j++) {
             var s = parseFloat(listStatData[i].data[j]);
             if (s < min) min = s;
             if (s > max) max = s;
             sum += s;
             if (j == (statDataLength1-1)) {
                setState(listStatData[i].min1h, min);
                setState(listStatData[i].max1h, max);
                setState(listStatData[i].mean1h, round(sum / statDataLength1, 2));     
             }
          }
          setState(listStatData[i].min24h, min);
          setState(listStatData[i].max24h, max);
          setState(listStatData[i].mean24h, round(sum / statDataLength24, 2));   
          setState(listStatData[i].median24h, getMedian(listStatData[i].data));
          obj.Min_24h = min;
          obj.Max_24h = max;
          obj.Mean_24h = round(sum / statDataLength24, 2);
          obj.Median_24h = getMedian(listStatData[i].data);
          table[i] = obj; 
       }
       setState(dpData, JSON.stringify(listStatData));
       setState(idTable, JSON.stringify(table), true);
    }
    

    Danke, also Skript ist nicht mein Ding, aber ich versuche es mal.Ist das ein eigens Skript oder gehört es in meines?

    Also hier: setState(idTable, JSON.stringify(table), true); muss der neue DP rein

    und die ID im Skript deklarieren und zuweisen?

    paul53P Offline
    paul53P Offline
    paul53
    schrieb am zuletzt editiert von
    #81

    @sigi234 sagte:

    Ist das ein eigens Skript oder gehört es in meines?

    Das ist eine erweiterte Funktion calcStatData(), die Teil Deines Skriptes ist.

    @sigi234 sagte in Gleitender Durchschnitt, Min., Max. über def. Zeitraum:

    die ID im Skript deklarieren und zuweisen?

    Ziemlich am Anfang des Skriptes (Vorschlag)

    const idTable = 'javascript.0.Status.Tabelle'; 
    createState(idTable, '', {type: 'string'});
    

    Bitte verzichtet auf Chat-Nachrichten, denn die Handhabung ist grauenhaft !
    Produktiv: RPi 2 mit S.USV, HM-MOD-RPI und SLC-USB-Stick mit root fs

    sigi234S 1 Antwort Letzte Antwort
    0
    • paul53P paul53

      @sigi234 sagte:

      Ist das ein eigens Skript oder gehört es in meines?

      Das ist eine erweiterte Funktion calcStatData(), die Teil Deines Skriptes ist.

      @sigi234 sagte in Gleitender Durchschnitt, Min., Max. über def. Zeitraum:

      die ID im Skript deklarieren und zuweisen?

      Ziemlich am Anfang des Skriptes (Vorschlag)

      const idTable = 'javascript.0.Status.Tabelle'; 
      createState(idTable, '', {type: 'string'});
      
      sigi234S Online
      sigi234S Online
      sigi234
      Forum Testing Most Active
      schrieb am zuletzt editiert von sigi234
      #82

      @paul53 sagte in Gleitender Durchschnitt, Min., Max. über def. Zeitraum:

      @sigi234 sagte:

      Ist das ein eigens Skript oder gehört es in meines?

      Ok, habe es so gemacht: Edit 2

      // ########################################################################################################
      // Berechnung von gleitendem Durchschnitt, Minimum und Maximum über einen Zeitraum
      // Version 1.4.1
      // ########################################################################################################
      "use strict";
      const idTable = 'javascript.0.Status.Tabelle'; 
      createState(idTable, '', {type: 'string'});
      //
      //
      //
      // Berechnet Min/Max, Durschschnitt und Median über die letzten 24h.
      // Berechnet Min/Max, Durschschnitt über die letzte 1h.
      //
      // IDs aller benötigten Datenpunkte
      //
      // Als Array im Array mit folgendem Format:
      //  1\.   original Datenpunktname
      //  2\.  neuer Datenpunktname
      //         Beispiel:   javascript.0.Status.Temperatur.Außen
      //                  javascript.0.Status.Luftfeuchtigkeit.Außen
      //  3\.   Beschreibung des Messwertes (zur Erzeugung neue Datenpunkte)
      //         Beispliele:   Temperatur
      //                  Luftfeuchtigkeit
      //   4\.  Einheit (zur Erzeugung neue Datenpunkte)
      //         Beispiele:   °C, %
      //
      // Ist beliebig erweiterbar und für beliebige Werte nutzbar.
      // Beispiel 1:
      // const idData = [['hm-rpc.3.CUX3200312.1.TEMPERATURE','javascript.0.Status.Temperatur.Außen','Temperatur','°C'],
      //                 ['hm-rpc.3.CUX9002580.1.HUMIDITY'   ,'javascript.0.Status.Luftfeuchtigkeit.Außen','Luftfeuchtigkeit','%']];
      //
      // Beispiel 2:
      // const idData = [['hm-rpc.3.CUX3200312.1.TEMPERATURE','javascript.0.Status.Außen.Temperatur','Temperatur','°C'],
      //                 ['hm-rpc.3.CUX9002580.1.HUMIDITY'   ,'javascript.0.Status.Außen.Luftfeuchtigkeit','Luftfeuchtigkeit','%'],
      //                 ['hm-rpc.3.CUX4007637.1.Data'   ,'javascript.0.Status.Außen.Lichtstärke','Lichtstärke','lux']];
      //
      const idData = [['hm-rpc.1.OEQ0670648.1.TEMPERATURE','javascript.0.Status.Temperatur.Bad','Temperatur','°C'],
                      ['hm-rpc.1.OEQ0670648.1.HUMIDITY','javascript.0.Status.Luftfeuchtigkeit.Bad','Luftfeuchtigkeit','%'],
                      ['daswetter.0.NextHours.Location_1.Day_1.current.temp_value','javascript.0.Status.Temperatur.Außen','Temperatur','°C'],
                      ['daswetter.0.NextHours.Location_1.Day_1.current.humidity_value','javascript.0.Status.Luftfeuchtigkeit.Außen','Luftfeuchtigkeit','%'],
                      ];
       
      //Datenpunkt zur Speicherung aller internen Daten
      const dpData='javascript.0.Status.Statistic';
       
      // ########################################################################################################
      // Implementierung -- hier nichts mehr ändern
      // ########################################################################################################
       
      // globale Konstanten
      const tc = 10;         // Abtastrate in Minuten
       
      const statDataLength24 = Math.round((24 * 60) / tc); // Anzahl der Werte für 24h
      const statDataLength1 = Math.round(60 / tc); // Anzahl der Werte für stündlich
       
      // globale Variablen
      var listStatData;  //interne Speicherung aller Werte
       
      //Funktion zum einmaligem initialisieren aller Datenpunkte
      function initializeStatData() {
       
         // Datenpunkt zur Speicherung der internen Werte erzeugen
         createState(dpData, 0, false, {
            name: "StatisticData",
            read: true,
            write: true,
            desc: 'Statistische Daten',
            type: 'string',
            def: '',
            role: 'json'        
         });
       
         //internes Array initialisieren
          var needInit = false;
         try {
            listStatData = JSON.parse(getState(dpData).val);
         } catch (ex) {
            needInit = true;
         }
         if (needInit || !listStatData || (listStatData.length < idData.length)) {
            listStatData = new Array(idData.length); 
         }
         //logDebug('initializeStatData for', dpData, listStatData);
       
         for (var i = 0; i < idData.length; i++) {
              if (!listStatData[i]) { listStatData[i] = {}; }
              listStatData[i].value       = idData[i][1];
              listStatData[i].max24h		= idData[i][1] + '.Max_24h';
              listStatData[i].min24h		= idData[i][1] + '.Min_24h';
              listStatData[i].mean24h		= idData[i][1] + '.Mean_24h';
              listStatData[i].median24h	= idData[i][1] + '.Median_24h';
      	listStatData[i].max1h		= idData[i][1] + '.Max_1h';
      	listStatData[i].min1h		= idData[i][1] + '.Min_1h';
      	listStatData[i].mean1h		= idData[i][1] + '.Mean_1h';
       
      	createState(listStatData[i].value, 0, false, {
                  name: idData[i][2],
                  read: true,
                  write: true,
                  desc: idData[i][2]+ ' Aktueller Wert',
            	    type: 'number',
                  def: 0,
                  unit: idData[i][3],
                  role: 'value'
      	});
       
      	createState(listStatData[i].max24h, 0, false, {
                  name: 'Maximum_24h',
                  read: true,
                  write: true,
                  desc: idData[i][2] + ' Maximum',
                  type: 'number',
                  def: 0,
                  unit: idData[i][3],
                  role: 'value'
             });
       
             createState(listStatData[i].min24h, 0, false, {
                  name: 'Minimum_24h',
                  read: true,
                  write: true,
                  desc: idData[i][2] + ' Minimum',
                  type: 'number',
                  def: 0,
      	    unit: idData[i][3],
                  role: 'value'
             });
       
             createState(listStatData[i].mean24h, 0, false, {
                  name: 'Mittelwert_24h',
                  read: true,
                  write: true,
                  desc: idData[i][2] + ' Mittelwert',
                  type: 'number',
                  def: 0,
                  unit: idData[i][3],
                  role: 'value'
            });
       
            createState(listStatData[i].median24h, 0, false, {
                  name: 'Median_24h',
                  read: true,
                  write: true,
                  desc: idData[i][2] + ' Median',
                  type: 'number',
                  def: 0,
      	        unit: idData[i][3],
                  role: 'value'
            });
       
            createState(listStatData[i].max1h, 0, false, {
                  name: 'Maximum_1h',
                  read: true,
                  write: true,
                  desc: idData[i][2] + ' Maximum',
                  type: 'number',
                  def: 0,
                  unit: idData[i][3],
                  role: 'value'
            });
       
            createState(listStatData[i].min1h, 0, false, {
                  name: 'Minimum_1h',
                  read: true,
                  write: true,
                  desc: idData[i][2] + ' Minimum',
                  type: 'number',
                  def: 0,
                  unit: idData[i][3],
                  role: 'value'
            });
       
            createState(listStatData[i].mean1h, 0, false, {
                  name: 'Mittelwert_1h',
                  read: true,
                  write: true,
             	    desc: idData[i][2] + ' Mittelwert',
                  type: 'number',
                  def: 0,
      	    unit: idData[i][3],
      	    role: 'value'
            });
       
            if (needInit || !listStatData[i].data || (listStatData[i].data.length != statDataLength24)) {
                  listStatData[i].data	= new Array(statDataLength24);
       
                  // 1\. Script start: Liste und String-Datenpunkt füllen
                  var x = getState(idData[i][0]).val;
                  for (var j = 0; j < statDataLength24; j++) {
                  listStatData[i].data[j] = x;
               }
       
                //logDebug(listStatData[i], i);
                  setStateDelayed(listStatData[i].value, x, false, 1000);
                  setStateDelayed(listStatData[i].min24h, x, false, 1000);
                  setStateDelayed(listStatData[i].max24h, x, false, 1000);
                  setStateDelayed(listStatData[i].mean24h, x, false, 1000);
                  setStateDelayed(listStatData[i].median24h, x, false, 1000);
                  setStateDelayed(listStatData[i].min1h, x, false, 1000);
                  setStateDelayed(listStatData[i].max1h, x, false, 1000);
                  setStateDelayed(listStatData[i].mean1h, x, false, 1000);
            }      
         }
         setState(dpData, JSON.stringify(listStatData));         
      }
       
      //Berechnung der Werte
       function calcStatData() {
          if (!listStatData || (idData.length != listStatData.length)) {
               initializeStatData();
          }
           //logDebug('starting calcStatData');
          var table = []; 
          for (var i = 0; i < idData.length; i++) {
             var obj = {};
             var sensor = listStatData[i].value.split('.');
             obj.Sensor = sensor[4] + ' ' + sensor[3];
             listStatData[i].data.pop(); //Remove the last element of an array
             var x = parseFloat(getState(idData[i][0]).val);
             obj.Wert = x;
             listStatData[i].data.unshift(x); //Add new items to the beginning of an array
             setState(listStatData[i].value, x);
             var min = x;
             var max = x;
             var sum = 0.0;
             for (var j = 0; j < statDataLength24; j++) {
                var s = parseFloat(listStatData[i].data[j]);
                if (s < min) min = s;
                if (s > max) max = s;
                sum += s;
                if (j == (statDataLength1-1)) {
                   setState(listStatData[i].min1h, min);
                   setState(listStatData[i].max1h, max);
                   setState(listStatData[i].mean1h, round(sum / statDataLength1, 2));     
                }
             }
             setState(listStatData[i].min24h, min);
             setState(listStatData[i].max24h, max);
             setState(listStatData[i].mean24h, round(sum / statDataLength24, 2));   
             setState(listStatData[i].median24h, getMedian(listStatData[i].data));
             obj.Min_24h = min;
             obj.Max_24h = max;
             obj.Mean_24h = round(sum / statDataLength24, 2);
             obj.Median_24h = getMedian(listStatData[i].data);
             table[i] = obj; 
          }
          setState(dpData, JSON.stringify(listStatData));
          setState(idTable, JSON.stringify(table), true);
       } 
       
      function getMedian(args) {
        if (!args.length) {return 0}
        var numbers = args.slice(0).sort((a,b) => a - b);
        var middle = Math.floor(numbers.length / 2);
        var isEven = numbers.length % 2 === 0;
        return isEven ? (numbers[middle] + numbers[middle - 1]) / 2 : numbers[middle];
      }
       
      /**
       * round a number
       * @param    value  to round
       * @param    exp    exponent to round
       * @returns         the round number
       */
      function round(value, exp) {
        if (typeof exp === 'undefined' || +exp === 0)
          return Math.round(value);
       
        value = +value;
        exp = +exp;
       
        if (isNaN(value) || !(typeof exp === 'number' && exp % 1 === 0))
          return NaN;
       
        // Shift
        var values = value.toString().split('e');
        value = Math.round(+(values[0] + 'e' + (values[1] ? (+values[1] + exp) : exp)));
       
        // Shift back
        var values = value.toString().split('e');
        return +(values[0] + 'e' + (values[1] ? (+values[1] - exp) : -exp));
      }
       
      initializeStatData();
       
      schedule('*/' + tc + ' * * * *', function () {
         calcStatData();
      });
      

      Bitte benutzt das Voting rechts unten im Beitrag wenn er euch geholfen hat.
      Immer Daten sichern!

      paul53P 1 Antwort Letzte Antwort
      0
      • sigi234S sigi234

        @paul53 sagte in Gleitender Durchschnitt, Min., Max. über def. Zeitraum:

        @sigi234 sagte:

        Ist das ein eigens Skript oder gehört es in meines?

        Ok, habe es so gemacht: Edit 2

        // ########################################################################################################
        // Berechnung von gleitendem Durchschnitt, Minimum und Maximum über einen Zeitraum
        // Version 1.4.1
        // ########################################################################################################
        "use strict";
        const idTable = 'javascript.0.Status.Tabelle'; 
        createState(idTable, '', {type: 'string'});
        //
        //
        //
        // Berechnet Min/Max, Durschschnitt und Median über die letzten 24h.
        // Berechnet Min/Max, Durschschnitt über die letzte 1h.
        //
        // IDs aller benötigten Datenpunkte
        //
        // Als Array im Array mit folgendem Format:
        //  1\.   original Datenpunktname
        //  2\.  neuer Datenpunktname
        //         Beispiel:   javascript.0.Status.Temperatur.Außen
        //                  javascript.0.Status.Luftfeuchtigkeit.Außen
        //  3\.   Beschreibung des Messwertes (zur Erzeugung neue Datenpunkte)
        //         Beispliele:   Temperatur
        //                  Luftfeuchtigkeit
        //   4\.  Einheit (zur Erzeugung neue Datenpunkte)
        //         Beispiele:   °C, %
        //
        // Ist beliebig erweiterbar und für beliebige Werte nutzbar.
        // Beispiel 1:
        // const idData = [['hm-rpc.3.CUX3200312.1.TEMPERATURE','javascript.0.Status.Temperatur.Außen','Temperatur','°C'],
        //                 ['hm-rpc.3.CUX9002580.1.HUMIDITY'   ,'javascript.0.Status.Luftfeuchtigkeit.Außen','Luftfeuchtigkeit','%']];
        //
        // Beispiel 2:
        // const idData = [['hm-rpc.3.CUX3200312.1.TEMPERATURE','javascript.0.Status.Außen.Temperatur','Temperatur','°C'],
        //                 ['hm-rpc.3.CUX9002580.1.HUMIDITY'   ,'javascript.0.Status.Außen.Luftfeuchtigkeit','Luftfeuchtigkeit','%'],
        //                 ['hm-rpc.3.CUX4007637.1.Data'   ,'javascript.0.Status.Außen.Lichtstärke','Lichtstärke','lux']];
        //
        const idData = [['hm-rpc.1.OEQ0670648.1.TEMPERATURE','javascript.0.Status.Temperatur.Bad','Temperatur','°C'],
                        ['hm-rpc.1.OEQ0670648.1.HUMIDITY','javascript.0.Status.Luftfeuchtigkeit.Bad','Luftfeuchtigkeit','%'],
                        ['daswetter.0.NextHours.Location_1.Day_1.current.temp_value','javascript.0.Status.Temperatur.Außen','Temperatur','°C'],
                        ['daswetter.0.NextHours.Location_1.Day_1.current.humidity_value','javascript.0.Status.Luftfeuchtigkeit.Außen','Luftfeuchtigkeit','%'],
                        ];
         
        //Datenpunkt zur Speicherung aller internen Daten
        const dpData='javascript.0.Status.Statistic';
         
        // ########################################################################################################
        // Implementierung -- hier nichts mehr ändern
        // ########################################################################################################
         
        // globale Konstanten
        const tc = 10;         // Abtastrate in Minuten
         
        const statDataLength24 = Math.round((24 * 60) / tc); // Anzahl der Werte für 24h
        const statDataLength1 = Math.round(60 / tc); // Anzahl der Werte für stündlich
         
        // globale Variablen
        var listStatData;  //interne Speicherung aller Werte
         
        //Funktion zum einmaligem initialisieren aller Datenpunkte
        function initializeStatData() {
         
           // Datenpunkt zur Speicherung der internen Werte erzeugen
           createState(dpData, 0, false, {
              name: "StatisticData",
              read: true,
              write: true,
              desc: 'Statistische Daten',
              type: 'string',
              def: '',
              role: 'json'        
           });
         
           //internes Array initialisieren
            var needInit = false;
           try {
              listStatData = JSON.parse(getState(dpData).val);
           } catch (ex) {
              needInit = true;
           }
           if (needInit || !listStatData || (listStatData.length < idData.length)) {
              listStatData = new Array(idData.length); 
           }
           //logDebug('initializeStatData for', dpData, listStatData);
         
           for (var i = 0; i < idData.length; i++) {
                if (!listStatData[i]) { listStatData[i] = {}; }
                listStatData[i].value       = idData[i][1];
                listStatData[i].max24h		= idData[i][1] + '.Max_24h';
                listStatData[i].min24h		= idData[i][1] + '.Min_24h';
                listStatData[i].mean24h		= idData[i][1] + '.Mean_24h';
                listStatData[i].median24h	= idData[i][1] + '.Median_24h';
        	listStatData[i].max1h		= idData[i][1] + '.Max_1h';
        	listStatData[i].min1h		= idData[i][1] + '.Min_1h';
        	listStatData[i].mean1h		= idData[i][1] + '.Mean_1h';
         
        	createState(listStatData[i].value, 0, false, {
                    name: idData[i][2],
                    read: true,
                    write: true,
                    desc: idData[i][2]+ ' Aktueller Wert',
              	    type: 'number',
                    def: 0,
                    unit: idData[i][3],
                    role: 'value'
        	});
         
        	createState(listStatData[i].max24h, 0, false, {
                    name: 'Maximum_24h',
                    read: true,
                    write: true,
                    desc: idData[i][2] + ' Maximum',
                    type: 'number',
                    def: 0,
                    unit: idData[i][3],
                    role: 'value'
               });
         
               createState(listStatData[i].min24h, 0, false, {
                    name: 'Minimum_24h',
                    read: true,
                    write: true,
                    desc: idData[i][2] + ' Minimum',
                    type: 'number',
                    def: 0,
        	    unit: idData[i][3],
                    role: 'value'
               });
         
               createState(listStatData[i].mean24h, 0, false, {
                    name: 'Mittelwert_24h',
                    read: true,
                    write: true,
                    desc: idData[i][2] + ' Mittelwert',
                    type: 'number',
                    def: 0,
                    unit: idData[i][3],
                    role: 'value'
              });
         
              createState(listStatData[i].median24h, 0, false, {
                    name: 'Median_24h',
                    read: true,
                    write: true,
                    desc: idData[i][2] + ' Median',
                    type: 'number',
                    def: 0,
        	        unit: idData[i][3],
                    role: 'value'
              });
         
              createState(listStatData[i].max1h, 0, false, {
                    name: 'Maximum_1h',
                    read: true,
                    write: true,
                    desc: idData[i][2] + ' Maximum',
                    type: 'number',
                    def: 0,
                    unit: idData[i][3],
                    role: 'value'
              });
         
              createState(listStatData[i].min1h, 0, false, {
                    name: 'Minimum_1h',
                    read: true,
                    write: true,
                    desc: idData[i][2] + ' Minimum',
                    type: 'number',
                    def: 0,
                    unit: idData[i][3],
                    role: 'value'
              });
         
              createState(listStatData[i].mean1h, 0, false, {
                    name: 'Mittelwert_1h',
                    read: true,
                    write: true,
               	    desc: idData[i][2] + ' Mittelwert',
                    type: 'number',
                    def: 0,
        	    unit: idData[i][3],
        	    role: 'value'
              });
         
              if (needInit || !listStatData[i].data || (listStatData[i].data.length != statDataLength24)) {
                    listStatData[i].data	= new Array(statDataLength24);
         
                    // 1\. Script start: Liste und String-Datenpunkt füllen
                    var x = getState(idData[i][0]).val;
                    for (var j = 0; j < statDataLength24; j++) {
                    listStatData[i].data[j] = x;
                 }
         
                  //logDebug(listStatData[i], i);
                    setStateDelayed(listStatData[i].value, x, false, 1000);
                    setStateDelayed(listStatData[i].min24h, x, false, 1000);
                    setStateDelayed(listStatData[i].max24h, x, false, 1000);
                    setStateDelayed(listStatData[i].mean24h, x, false, 1000);
                    setStateDelayed(listStatData[i].median24h, x, false, 1000);
                    setStateDelayed(listStatData[i].min1h, x, false, 1000);
                    setStateDelayed(listStatData[i].max1h, x, false, 1000);
                    setStateDelayed(listStatData[i].mean1h, x, false, 1000);
              }      
           }
           setState(dpData, JSON.stringify(listStatData));         
        }
         
        //Berechnung der Werte
         function calcStatData() {
            if (!listStatData || (idData.length != listStatData.length)) {
                 initializeStatData();
            }
             //logDebug('starting calcStatData');
            var table = []; 
            for (var i = 0; i < idData.length; i++) {
               var obj = {};
               var sensor = listStatData[i].value.split('.');
               obj.Sensor = sensor[4] + ' ' + sensor[3];
               listStatData[i].data.pop(); //Remove the last element of an array
               var x = parseFloat(getState(idData[i][0]).val);
               obj.Wert = x;
               listStatData[i].data.unshift(x); //Add new items to the beginning of an array
               setState(listStatData[i].value, x);
               var min = x;
               var max = x;
               var sum = 0.0;
               for (var j = 0; j < statDataLength24; j++) {
                  var s = parseFloat(listStatData[i].data[j]);
                  if (s < min) min = s;
                  if (s > max) max = s;
                  sum += s;
                  if (j == (statDataLength1-1)) {
                     setState(listStatData[i].min1h, min);
                     setState(listStatData[i].max1h, max);
                     setState(listStatData[i].mean1h, round(sum / statDataLength1, 2));     
                  }
               }
               setState(listStatData[i].min24h, min);
               setState(listStatData[i].max24h, max);
               setState(listStatData[i].mean24h, round(sum / statDataLength24, 2));   
               setState(listStatData[i].median24h, getMedian(listStatData[i].data));
               obj.Min_24h = min;
               obj.Max_24h = max;
               obj.Mean_24h = round(sum / statDataLength24, 2);
               obj.Median_24h = getMedian(listStatData[i].data);
               table[i] = obj; 
            }
            setState(dpData, JSON.stringify(listStatData));
            setState(idTable, JSON.stringify(table), true);
         } 
         
        function getMedian(args) {
          if (!args.length) {return 0}
          var numbers = args.slice(0).sort((a,b) => a - b);
          var middle = Math.floor(numbers.length / 2);
          var isEven = numbers.length % 2 === 0;
          return isEven ? (numbers[middle] + numbers[middle - 1]) / 2 : numbers[middle];
        }
         
        /**
         * round a number
         * @param    value  to round
         * @param    exp    exponent to round
         * @returns         the round number
         */
        function round(value, exp) {
          if (typeof exp === 'undefined' || +exp === 0)
            return Math.round(value);
         
          value = +value;
          exp = +exp;
         
          if (isNaN(value) || !(typeof exp === 'number' && exp % 1 === 0))
            return NaN;
         
          // Shift
          var values = value.toString().split('e');
          value = Math.round(+(values[0] + 'e' + (values[1] ? (+values[1] + exp) : exp)));
         
          // Shift back
          var values = value.toString().split('e');
          return +(values[0] + 'e' + (values[1] ? (+values[1] - exp) : -exp));
        }
         
        initializeStatData();
         
        schedule('*/' + tc + ' * * * *', function () {
           calcStatData();
        });
        
        paul53P Offline
        paul53P Offline
        paul53
        schrieb am zuletzt editiert von
        #83

        @sigi234 sagte :

        javascript.0.Status.Tabelle

        Funktioniert es, so dass Du den Datenpunkt "javascript.0.Status.Tabelle" in Vis verwenden kannst ?

        Bitte verzichtet auf Chat-Nachrichten, denn die Handhabung ist grauenhaft !
        Produktiv: RPi 2 mit S.USV, HM-MOD-RPI und SLC-USB-Stick mit root fs

        sigi234S 1 Antwort Letzte Antwort
        1
        • paul53P paul53

          @sigi234 sagte :

          javascript.0.Status.Tabelle

          Funktioniert es, so dass Du den Datenpunkt "javascript.0.Status.Tabelle" in Vis verwenden kannst ?

          sigi234S Online
          sigi234S Online
          sigi234
          Forum Testing Most Active
          schrieb am zuletzt editiert von
          #84

          @paul53 sagte in Gleitender Durchschnitt, Min., Max. über def. Zeitraum:

          @sigi234 sagte :

          javascript.0.Status.Tabelle

          Funktioniert es, so dass Du den Datenpunkt "javascript.0.Status.Tabelle" in Vis verwenden kannst ?

          Ja, Danke einfach perfekt..........:+1:

          Screenshot (3657).png

          Bitte benutzt das Voting rechts unten im Beitrag wenn er euch geholfen hat.
          Immer Daten sichern!

          1 Antwort Letzte Antwort
          0
          • K Offline
            K Offline
            klassisch
            Most Active
            schrieb am zuletzt editiert von
            #85

            Das sieht ja super aus!
            Fehlt nur noch die Standardabweichung.
            Mein Geigerzähler hat seit Oktober 2017 schon 4 Fehlalarme produziert, weil ich wohl die Grenzen etwas zu stramm habe. Da hülfe wohl die Kenntnis der Standardabweichung.

            1 Antwort Letzte Antwort
            0
            • K Offline
              K Offline
              kai_enet
              schrieb am zuletzt editiert von
              #86

              Hallo zusammen,

              sorry für Anfängerfragen - aber habe erst diese Woche mit iobroker angefangen:

              Hat schon jemand den export von history Daten benutzt (https://github.com/ioBroker/ioBroker.history/blob/master/docs/de/README.md - "Zugriff auf History Werte mit JavaScript") um damit für Sensoren eine Gleitmittelung bzw min max der letzten x Werte durchzuführen ?

              Wäre für ein Beispiel dankbar...

              paul53P 1 Antwort Letzte Antwort
              0
              • K kai_enet

                Hallo zusammen,

                sorry für Anfängerfragen - aber habe erst diese Woche mit iobroker angefangen:

                Hat schon jemand den export von history Daten benutzt (https://github.com/ioBroker/ioBroker.history/blob/master/docs/de/README.md - "Zugriff auf History Werte mit JavaScript") um damit für Sensoren eine Gleitmittelung bzw min max der letzten x Werte durchzuführen ?

                Wäre für ein Beispiel dankbar...

                paul53P Offline
                paul53P Offline
                paul53
                schrieb am zuletzt editiert von
                #87

                @kai_enet sagte:

                Wäre für ein Beispiel dankbar

                Mit 'history.0' anstelle 'sql.0'

                Bitte verzichtet auf Chat-Nachrichten, denn die Handhabung ist grauenhaft !
                Produktiv: RPi 2 mit S.USV, HM-MOD-RPI und SLC-USB-Stick mit root fs

                1 Antwort Letzte Antwort
                0
                • M Offline
                  M Offline
                  martin
                  schrieb am zuletzt editiert von martin
                  #88

                  Ich habe das Skript mit meinen Xiaomi Sensoren unter "const idData" gefüttert und ansonsten nichts verändert.

                  `// ########################################################################################################
                  // Berechnung von gleitendem Durchschnitt, Minimum und Maximum über einen Zeitraum
                  // Version 1.4.1
                  // ########################################################################################################
                  "use strict";
                  //
                  //
                  // Berechnet Min/Max, Durschschnitt und Median über die letzten 24h.
                  // Berechnet Min/Max, Durschschnitt über die letzte 1h.
                  //
                  // IDs aller benötigten Datenpunkte
                  //
                  // Als Array im Array mit folgendem Format:
                  //  1\.   original Datenpunktname
                  //  2\.  neuer Datenpunktname
                  //         Beispiel:   javascript.0.Status.Temperatur.Außen
                  //                  javascript.0.Status.Luftfeuchtigkeit.Außen
                  //  3\.   Beschreibung des Messwertes (zur Erzeugung neue Datenpunkte)
                  //         Beispliele:   Temperatur
                  //                  Luftfeuchtigkeit
                  //   4\.  Einheit (zur Erzeugung neue Datenpunkte)
                  //         Beispiele:   °C, %
                  //
                  // Ist beliebig erweiterbar und für beliebige Werte nutzbar.
                  // Beispiel 1:
                  // const idData = [['hm-rpc.3.CUX3200312.1.TEMPERATURE','javascript.0.Status.Temperatur.Außen','Temperatur','°C'],
                  //                 ['hm-rpc.3.CUX9002580.1.HUMIDITY'   ,'javascript.0.Status.Luftfeuchtigkeit.Außen','Luftfeuchtigkeit','%']];
                  //
                  // Beispiel 2:
                  // const idData = [['hm-rpc.3.CUX3200312.1.TEMPERATURE','javascript.0.Status.Außen.Temperatur','Temperatur','°C'],
                  //                 ['hm-rpc.3.CUX9002580.1.HUMIDITY'   ,'javascript.0.Status.Außen.Luftfeuchtigkeit','Luftfeuchtigkeit','%'],
                  //                 ['hm-rpc.3.CUX4007637.1.Data'   ,'javascript.0.Status.Außen.Lichtstärke','Lichtstärke','lux']];
                  //
                  const idData = [['mihome.0.devices.weather_v1_158d0002c8f3ab.temperature','javascript.0.Status.Temperatur.Balkon','Temperatur','°C'],
                                  ['mihome.0.devices.weather_v1_158d0002c8f3ab.humidity','javascript.0.Status.Luftfeuchtigkeit.Balkon','Luftfeuchtigkeit','%'];
                                 
                   
                  //Datenpunkt zur Speicherung aller internen Daten
                  const dpData='javascript.0.Status.Statistic';
                   
                  // ########################################################################################################
                  // Implementierung -- hier nichts mehr ändern
                  // ########################################################################################################
                   
                  // globale Konstanten
                  const tc = 10;         // Abtastrate in Minuten
                   
                  const statDataLength24 = Math.round((24 * 60) / tc); // Anzahl der Werte für 24h
                  const statDataLength1 = Math.round(60 / tc); // Anzahl der Werte für stündlich
                   
                  // globale Variablen
                  var listStatData;  //interne Speicherung aller Werte
                   
                  //Funktion zum einmaligem initialisieren aller Datenpunkte
                  function initializeStatData() {
                   
                     // Datenpunkt zur Speicherung der internen Werte erzeugen
                     createState(dpData, 0, false, {
                        name: "StatisticData",
                        read: true,
                        write: true,
                        desc: 'Statistische Daten',
                        type: 'string',
                        def: '',
                        role: 'json'        
                     });
                   
                     //internes Array initialisieren
                      var needInit = false;
                     try {
                        listStatData = JSON.parse(getState(dpData).val);
                     } catch (ex) {
                        needInit = true;
                     }
                     if (needInit || !listStatData || (listStatData.length < idData.length)) {
                        listStatData = new Array(idData.length); 
                     }
                     //logDebug('initializeStatData for', dpData, listStatData);
                   
                     for (var i = 0; i < idData.length; i++) {
                          if (!listStatData[i]) { listStatData[i] = {}; }
                          listStatData[i].value       = idData[i][1];
                          listStatData[i].max24h		= idData[i][1] + '.Max_24h';
                          listStatData[i].min24h		= idData[i][1] + '.Min_24h';
                          listStatData[i].mean24h		= idData[i][1] + '.Mean_24h';
                          listStatData[i].median24h	= idData[i][1] + '.Median_24h';
                  	listStatData[i].max1h		= idData[i][1] + '.Max_1h';
                  	listStatData[i].min1h		= idData[i][1] + '.Min_1h';
                  	listStatData[i].mean1h		= idData[i][1] + '.Mean_1h';
                   
                  	createState(listStatData[i].value, 0, false, {
                              name: idData[i][2],
                              read: true,
                  	        write: true,
                              desc: idData[i][2]+ ' Aktueller Wert',
                        	    type: 'number',
                              def: 0,
                              unit: idData[i][3],
                              role: 'value'
                  	});
                   
                  	createState(listStatData[i].max24h, 0, false, {
                              name: 'Maximum_24h',
                              read: true,
                              write: true,
                              desc: idData[i][2] + ' Maximum',
                              type: 'number',
                              def: 0,
                              unit: idData[i][3],
                              role: 'value'
                         });
                   
                         createState(listStatData[i].min24h, 0, false, {
                              name: 'Minimum_24h',
                              read: true,
                              write: true,
                              desc: idData[i][2] + ' Minimum',
                              type: 'number',
                              def: 0,
                  	    unit: idData[i][3],
                              role: 'value'
                         });
                   
                         createState(listStatData[i].mean24h, 0, false, {
                              name: 'Mittelwert_24h',
                              read: true,
                              write: true,
                              desc: idData[i][2] + ' Mittelwert',
                              type: 'number',
                              def: 0,
                              unit: idData[i][3],
                              role: 'value'
                        });
                   
                        createState(listStatData[i].median24h, 0, false, {
                              name: 'Median_24h',
                              read: true,
                              write: true,
                              desc: idData[i][2] + ' Median',
                              type: 'number',
                              def: 0,
                  	        unit: idData[i][3],
                              role: 'value'
                        });
                   
                        createState(listStatData[i].max1h, 0, false, {
                              name: 'Maximum_1h',
                              read: true,
                              write: true,
                              desc: idData[i][2] + ' Maximum',
                              type: 'number',
                              def: 0,
                              unit: idData[i][3],
                              role: 'value'
                        });
                   
                        createState(listStatData[i].min1h, 0, false, {
                              name: 'Minimum_1h',
                              read: true,
                              write: true,
                              desc: idData[i][2] + ' Minimum',
                              type: 'number',
                              def: 0,
                              unit: idData[i][3],
                              role: 'value'
                        });
                   
                        createState(listStatData[i].mean1h, 0, false, {
                              name: 'Mittelwert_1h',
                              read: true,
                              write: true,
                         	    desc: idData[i][2] + ' Mittelwert',
                              type: 'number',
                              def: 0,
                  	    unit: idData[i][3],
                  	    role: 'value'
                        });
                   
                        if (needInit || !listStatData[i].data || (listStatData[i].data.length != statDataLength24)) {
                              listStatData[i].data	= new Array(statDataLength24);
                   
                              // 1\. Script start: Liste und String-Datenpunkt füllen
                              var x = getState(idData[i][0]).val;
                              for (var j = 0; j < statDataLength24; j++) {
                              listStatData[i].data[j] = x;
                           }
                   
                            //logDebug(listStatData[i], i);
                              setStateDelayed(listStatData[i].value, x, false, 1000);
                              setStateDelayed(listStatData[i].min24h, x, false, 1000);
                              setStateDelayed(listStatData[i].max24h, x, false, 1000);
                              setStateDelayed(listStatData[i].mean24h, x, false, 1000);
                              setStateDelayed(listStatData[i].median24h, x, false, 1000);
                              setStateDelayed(listStatData[i].min1h, x, false, 1000);
                              setStateDelayed(listStatData[i].max1h, x, false, 1000);
                              setStateDelayed(listStatData[i].mean1h, x, false, 1000);
                        }      
                     }
                     setState(dpData, JSON.stringify(listStatData));         
                  }
                   
                  //Berechnung der Werte
                  function calcStatData() {
                     if (!listStatData || (idData.length != listStatData.length)) {
                          initializeStatData();
                     }
                      //logDebug('starting calcStatData');
                   
                     for (var i = 0; i < idData.length; i++) {
                   
                        listStatData[i].data.pop(); //Remove the last element of an array
                        var x = parseFloat(getState(idData[i][0]).val);
                        listStatData[i].data.unshift(x); //Add new items to the beginning of an array
                        setState(listStatData[i].value, x);
                   
                        var min = x;
                        var max = x;
                        var sum = 0.0;
                        for (var j = 0; j < statDataLength24; j++) {
                           var s = parseFloat(listStatData[i].data[j]);
                           if (s < min) min = s;
                           if (s > max) max = s;
                           sum += s;
                           if (j == (statDataLength1-1)) {
                              setState(listStatData[i].min1h, min);
                              setState(listStatData[i].max1h, max);
                              setState(listStatData[i].mean1h, round(sum / statDataLength1, 2));     
                           }
                        }
                        setState(listStatData[i].min24h, min);
                        setState(listStatData[i].max24h, max);
                        setState(listStatData[i].mean24h, round(sum / statDataLength24, 2));   
                        setState(listStatData[i].median24h, getMedian(listStatData[i].data));
                     }
                     setState(dpData, JSON.stringify(listStatData));
                  }    
                   
                  function getMedian(args) {
                    if (!args.length) {return 0}
                    var numbers = args.slice(0).sort((a,b) => a - b);
                    var middle = Math.floor(numbers.length / 2);
                    var isEven = numbers.length % 2 === 0;
                    return isEven ? (numbers[middle] + numbers[middle - 1]) / 2 : numbers[middle];
                  }
                   
                  /**
                   * round a number
                   * @param    value  to round
                   * @param    exp    exponent to round
                   * @returns         the round number
                   */
                  function round(value, exp) {
                    if (typeof exp === 'undefined' || +exp === 0)
                      return Math.round(value);
                   
                    value = +value;
                    exp = +exp;
                   
                    if (isNaN(value) || !(typeof exp === 'number' && exp % 1 === 0))
                      return NaN;
                   
                    // Shift
                    var values = value.toString().split('e');
                    value = Math.round(+(values[0] + 'e' + (values[1] ? (+values[1] + exp) : exp)));
                   
                    // Shift back
                    var values = value.toString().split('e');
                    return +(values[0] + 'e' + (values[1] ? (+values[1] - exp) : -exp));
                  }
                   
                  initializeStatData();
                   
                  schedule('*/' + tc + ' * * * *', function () {
                     calcStatData();
                  });`
                  

                  Es werden aber keine Datenpunkte erzeugt.

                  Im Log finde ich nur:

                  javascript.0	2020-09-30 18:14:21.682	info	(16357) script.js.Meine_Scripts.Temperatur_Min_Max: registered 0 subscriptions and 0 schedules
                  javascript.0	2020-09-30 18:14:21.671	info	(16357) Start javascript script.js.Meine_Scripts.Temperatur_Min_Max
                  
                  paul53P 1 Antwort Letzte Antwort
                  0
                  • M martin

                    Ich habe das Skript mit meinen Xiaomi Sensoren unter "const idData" gefüttert und ansonsten nichts verändert.

                    `// ########################################################################################################
                    // Berechnung von gleitendem Durchschnitt, Minimum und Maximum über einen Zeitraum
                    // Version 1.4.1
                    // ########################################################################################################
                    "use strict";
                    //
                    //
                    // Berechnet Min/Max, Durschschnitt und Median über die letzten 24h.
                    // Berechnet Min/Max, Durschschnitt über die letzte 1h.
                    //
                    // IDs aller benötigten Datenpunkte
                    //
                    // Als Array im Array mit folgendem Format:
                    //  1\.   original Datenpunktname
                    //  2\.  neuer Datenpunktname
                    //         Beispiel:   javascript.0.Status.Temperatur.Außen
                    //                  javascript.0.Status.Luftfeuchtigkeit.Außen
                    //  3\.   Beschreibung des Messwertes (zur Erzeugung neue Datenpunkte)
                    //         Beispliele:   Temperatur
                    //                  Luftfeuchtigkeit
                    //   4\.  Einheit (zur Erzeugung neue Datenpunkte)
                    //         Beispiele:   °C, %
                    //
                    // Ist beliebig erweiterbar und für beliebige Werte nutzbar.
                    // Beispiel 1:
                    // const idData = [['hm-rpc.3.CUX3200312.1.TEMPERATURE','javascript.0.Status.Temperatur.Außen','Temperatur','°C'],
                    //                 ['hm-rpc.3.CUX9002580.1.HUMIDITY'   ,'javascript.0.Status.Luftfeuchtigkeit.Außen','Luftfeuchtigkeit','%']];
                    //
                    // Beispiel 2:
                    // const idData = [['hm-rpc.3.CUX3200312.1.TEMPERATURE','javascript.0.Status.Außen.Temperatur','Temperatur','°C'],
                    //                 ['hm-rpc.3.CUX9002580.1.HUMIDITY'   ,'javascript.0.Status.Außen.Luftfeuchtigkeit','Luftfeuchtigkeit','%'],
                    //                 ['hm-rpc.3.CUX4007637.1.Data'   ,'javascript.0.Status.Außen.Lichtstärke','Lichtstärke','lux']];
                    //
                    const idData = [['mihome.0.devices.weather_v1_158d0002c8f3ab.temperature','javascript.0.Status.Temperatur.Balkon','Temperatur','°C'],
                                    ['mihome.0.devices.weather_v1_158d0002c8f3ab.humidity','javascript.0.Status.Luftfeuchtigkeit.Balkon','Luftfeuchtigkeit','%'];
                                   
                     
                    //Datenpunkt zur Speicherung aller internen Daten
                    const dpData='javascript.0.Status.Statistic';
                     
                    // ########################################################################################################
                    // Implementierung -- hier nichts mehr ändern
                    // ########################################################################################################
                     
                    // globale Konstanten
                    const tc = 10;         // Abtastrate in Minuten
                     
                    const statDataLength24 = Math.round((24 * 60) / tc); // Anzahl der Werte für 24h
                    const statDataLength1 = Math.round(60 / tc); // Anzahl der Werte für stündlich
                     
                    // globale Variablen
                    var listStatData;  //interne Speicherung aller Werte
                     
                    //Funktion zum einmaligem initialisieren aller Datenpunkte
                    function initializeStatData() {
                     
                       // Datenpunkt zur Speicherung der internen Werte erzeugen
                       createState(dpData, 0, false, {
                          name: "StatisticData",
                          read: true,
                          write: true,
                          desc: 'Statistische Daten',
                          type: 'string',
                          def: '',
                          role: 'json'        
                       });
                     
                       //internes Array initialisieren
                        var needInit = false;
                       try {
                          listStatData = JSON.parse(getState(dpData).val);
                       } catch (ex) {
                          needInit = true;
                       }
                       if (needInit || !listStatData || (listStatData.length < idData.length)) {
                          listStatData = new Array(idData.length); 
                       }
                       //logDebug('initializeStatData for', dpData, listStatData);
                     
                       for (var i = 0; i < idData.length; i++) {
                            if (!listStatData[i]) { listStatData[i] = {}; }
                            listStatData[i].value       = idData[i][1];
                            listStatData[i].max24h		= idData[i][1] + '.Max_24h';
                            listStatData[i].min24h		= idData[i][1] + '.Min_24h';
                            listStatData[i].mean24h		= idData[i][1] + '.Mean_24h';
                            listStatData[i].median24h	= idData[i][1] + '.Median_24h';
                    	listStatData[i].max1h		= idData[i][1] + '.Max_1h';
                    	listStatData[i].min1h		= idData[i][1] + '.Min_1h';
                    	listStatData[i].mean1h		= idData[i][1] + '.Mean_1h';
                     
                    	createState(listStatData[i].value, 0, false, {
                                name: idData[i][2],
                                read: true,
                    	        write: true,
                                desc: idData[i][2]+ ' Aktueller Wert',
                          	    type: 'number',
                                def: 0,
                                unit: idData[i][3],
                                role: 'value'
                    	});
                     
                    	createState(listStatData[i].max24h, 0, false, {
                                name: 'Maximum_24h',
                                read: true,
                                write: true,
                                desc: idData[i][2] + ' Maximum',
                                type: 'number',
                                def: 0,
                                unit: idData[i][3],
                                role: 'value'
                           });
                     
                           createState(listStatData[i].min24h, 0, false, {
                                name: 'Minimum_24h',
                                read: true,
                                write: true,
                                desc: idData[i][2] + ' Minimum',
                                type: 'number',
                                def: 0,
                    	    unit: idData[i][3],
                                role: 'value'
                           });
                     
                           createState(listStatData[i].mean24h, 0, false, {
                                name: 'Mittelwert_24h',
                                read: true,
                                write: true,
                                desc: idData[i][2] + ' Mittelwert',
                                type: 'number',
                                def: 0,
                                unit: idData[i][3],
                                role: 'value'
                          });
                     
                          createState(listStatData[i].median24h, 0, false, {
                                name: 'Median_24h',
                                read: true,
                                write: true,
                                desc: idData[i][2] + ' Median',
                                type: 'number',
                                def: 0,
                    	        unit: idData[i][3],
                                role: 'value'
                          });
                     
                          createState(listStatData[i].max1h, 0, false, {
                                name: 'Maximum_1h',
                                read: true,
                                write: true,
                                desc: idData[i][2] + ' Maximum',
                                type: 'number',
                                def: 0,
                                unit: idData[i][3],
                                role: 'value'
                          });
                     
                          createState(listStatData[i].min1h, 0, false, {
                                name: 'Minimum_1h',
                                read: true,
                                write: true,
                                desc: idData[i][2] + ' Minimum',
                                type: 'number',
                                def: 0,
                                unit: idData[i][3],
                                role: 'value'
                          });
                     
                          createState(listStatData[i].mean1h, 0, false, {
                                name: 'Mittelwert_1h',
                                read: true,
                                write: true,
                           	    desc: idData[i][2] + ' Mittelwert',
                                type: 'number',
                                def: 0,
                    	    unit: idData[i][3],
                    	    role: 'value'
                          });
                     
                          if (needInit || !listStatData[i].data || (listStatData[i].data.length != statDataLength24)) {
                                listStatData[i].data	= new Array(statDataLength24);
                     
                                // 1\. Script start: Liste und String-Datenpunkt füllen
                                var x = getState(idData[i][0]).val;
                                for (var j = 0; j < statDataLength24; j++) {
                                listStatData[i].data[j] = x;
                             }
                     
                              //logDebug(listStatData[i], i);
                                setStateDelayed(listStatData[i].value, x, false, 1000);
                                setStateDelayed(listStatData[i].min24h, x, false, 1000);
                                setStateDelayed(listStatData[i].max24h, x, false, 1000);
                                setStateDelayed(listStatData[i].mean24h, x, false, 1000);
                                setStateDelayed(listStatData[i].median24h, x, false, 1000);
                                setStateDelayed(listStatData[i].min1h, x, false, 1000);
                                setStateDelayed(listStatData[i].max1h, x, false, 1000);
                                setStateDelayed(listStatData[i].mean1h, x, false, 1000);
                          }      
                       }
                       setState(dpData, JSON.stringify(listStatData));         
                    }
                     
                    //Berechnung der Werte
                    function calcStatData() {
                       if (!listStatData || (idData.length != listStatData.length)) {
                            initializeStatData();
                       }
                        //logDebug('starting calcStatData');
                     
                       for (var i = 0; i < idData.length; i++) {
                     
                          listStatData[i].data.pop(); //Remove the last element of an array
                          var x = parseFloat(getState(idData[i][0]).val);
                          listStatData[i].data.unshift(x); //Add new items to the beginning of an array
                          setState(listStatData[i].value, x);
                     
                          var min = x;
                          var max = x;
                          var sum = 0.0;
                          for (var j = 0; j < statDataLength24; j++) {
                             var s = parseFloat(listStatData[i].data[j]);
                             if (s < min) min = s;
                             if (s > max) max = s;
                             sum += s;
                             if (j == (statDataLength1-1)) {
                                setState(listStatData[i].min1h, min);
                                setState(listStatData[i].max1h, max);
                                setState(listStatData[i].mean1h, round(sum / statDataLength1, 2));     
                             }
                          }
                          setState(listStatData[i].min24h, min);
                          setState(listStatData[i].max24h, max);
                          setState(listStatData[i].mean24h, round(sum / statDataLength24, 2));   
                          setState(listStatData[i].median24h, getMedian(listStatData[i].data));
                       }
                       setState(dpData, JSON.stringify(listStatData));
                    }    
                     
                    function getMedian(args) {
                      if (!args.length) {return 0}
                      var numbers = args.slice(0).sort((a,b) => a - b);
                      var middle = Math.floor(numbers.length / 2);
                      var isEven = numbers.length % 2 === 0;
                      return isEven ? (numbers[middle] + numbers[middle - 1]) / 2 : numbers[middle];
                    }
                     
                    /**
                     * round a number
                     * @param    value  to round
                     * @param    exp    exponent to round
                     * @returns         the round number
                     */
                    function round(value, exp) {
                      if (typeof exp === 'undefined' || +exp === 0)
                        return Math.round(value);
                     
                      value = +value;
                      exp = +exp;
                     
                      if (isNaN(value) || !(typeof exp === 'number' && exp % 1 === 0))
                        return NaN;
                     
                      // Shift
                      var values = value.toString().split('e');
                      value = Math.round(+(values[0] + 'e' + (values[1] ? (+values[1] + exp) : exp)));
                     
                      // Shift back
                      var values = value.toString().split('e');
                      return +(values[0] + 'e' + (values[1] ? (+values[1] - exp) : -exp));
                    }
                     
                    initializeStatData();
                     
                    schedule('*/' + tc + ' * * * *', function () {
                       calcStatData();
                    });`
                    

                    Es werden aber keine Datenpunkte erzeugt.

                    Im Log finde ich nur:

                    javascript.0	2020-09-30 18:14:21.682	info	(16357) script.js.Meine_Scripts.Temperatur_Min_Max: registered 0 subscriptions and 0 schedules
                    javascript.0	2020-09-30 18:14:21.671	info	(16357) Start javascript script.js.Meine_Scripts.Temperatur_Min_Max
                    
                    paul53P Offline
                    paul53P Offline
                    paul53
                    schrieb am zuletzt editiert von
                    #89

                    @martin sagte:

                    and 0 schedules

                    Ganz zu Beginn und am Ende sind Zeichen `, die da nicht hin gehören.

                    Bitte verzichtet auf Chat-Nachrichten, denn die Handhabung ist grauenhaft !
                    Produktiv: RPi 2 mit S.USV, HM-MOD-RPI und SLC-USB-Stick mit root fs

                    M 1 Antwort Letzte Antwort
                    0
                    • paul53P paul53

                      @martin sagte:

                      and 0 schedules

                      Ganz zu Beginn und am Ende sind Zeichen `, die da nicht hin gehören.

                      M Offline
                      M Offline
                      martin
                      schrieb am zuletzt editiert von martin
                      #90

                      @paul53 said in Gleitender Durchschnitt, Min., Max. über def. Zeitraum:

                      d am Ende sind Zeich

                      Danke!

                      Jetzt kommt eine ganze Reihe an Warnungen mit denen ich nichts anfangen kann:

                      javascript.0	2020-09-30 18:55:11.308	info	(16357) script.js.Meine_Scripts.Temperatur_Min_Max: registered 0 subscriptions and 1 schedule
                      javascript.0	2020-09-30 18:55:11.300	warn	(16357) at script.js.Meine_Scripts.Temperatur_Min_Max:271:1
                      javascript.0	2020-09-30 18:55:11.299	warn	(16357) at initializeStatData (script.js.Meine_Scripts.Temperatur_Min_Max:199:4)
                      javascript.0	2020-09-30 18:55:11.299	warn	(16357) at setState (/opt/iobroker/node_modules/iobroker.javascript/lib/sandbox.js:1358:20)
                      javascript.0	2020-09-30 18:55:11.296	warn	(16357) State "javascript.0.Status.Statistic" not found
                      javascript.0	2020-09-30 18:55:11.290	warn	(16357) at script.js.Meine_Scripts.Temperatur_Min_Max:271:1
                      javascript.0	2020-09-30 18:55:11.289	warn	(16357) at initializeStatData (script.js.Meine_Scripts.Temperatur_Min_Max:71:33)
                      javascript.0	2020-09-30 18:55:11.285	warn	(16357) getState "javascript.0.Status.Statistic" not found (3)
                      javascript.0	2020-09-30 18:55:11.242	info	(16357) Start javascript script.js.Meine_Scripts.Temperatur_Min_Max
                      javascript.0	2020-09-30 18:55:11.078	info	(16357) Stop script script.js.Meine_Scripts.Temperatur_Min_Max
                      
                      paul53P 2 Antworten Letzte Antwort
                      0
                      • M martin

                        @paul53 said in Gleitender Durchschnitt, Min., Max. über def. Zeitraum:

                        d am Ende sind Zeich

                        Danke!

                        Jetzt kommt eine ganze Reihe an Warnungen mit denen ich nichts anfangen kann:

                        javascript.0	2020-09-30 18:55:11.308	info	(16357) script.js.Meine_Scripts.Temperatur_Min_Max: registered 0 subscriptions and 1 schedule
                        javascript.0	2020-09-30 18:55:11.300	warn	(16357) at script.js.Meine_Scripts.Temperatur_Min_Max:271:1
                        javascript.0	2020-09-30 18:55:11.299	warn	(16357) at initializeStatData (script.js.Meine_Scripts.Temperatur_Min_Max:199:4)
                        javascript.0	2020-09-30 18:55:11.299	warn	(16357) at setState (/opt/iobroker/node_modules/iobroker.javascript/lib/sandbox.js:1358:20)
                        javascript.0	2020-09-30 18:55:11.296	warn	(16357) State "javascript.0.Status.Statistic" not found
                        javascript.0	2020-09-30 18:55:11.290	warn	(16357) at script.js.Meine_Scripts.Temperatur_Min_Max:271:1
                        javascript.0	2020-09-30 18:55:11.289	warn	(16357) at initializeStatData (script.js.Meine_Scripts.Temperatur_Min_Max:71:33)
                        javascript.0	2020-09-30 18:55:11.285	warn	(16357) getState "javascript.0.Status.Statistic" not found (3)
                        javascript.0	2020-09-30 18:55:11.242	info	(16357) Start javascript script.js.Meine_Scripts.Temperatur_Min_Max
                        javascript.0	2020-09-30 18:55:11.078	info	(16357) Stop script script.js.Meine_Scripts.Temperatur_Min_Max
                        
                        paul53P Offline
                        paul53P Offline
                        paul53
                        schrieb am zuletzt editiert von
                        #91

                        @martin
                        In Zeile 35 fehlt am Ende (vor dem Semikolon) eine schließende eckige Klammer.

                        Bitte verzichtet auf Chat-Nachrichten, denn die Handhabung ist grauenhaft !
                        Produktiv: RPi 2 mit S.USV, HM-MOD-RPI und SLC-USB-Stick mit root fs

                        M 1 Antwort Letzte Antwort
                        0
                        • paul53P paul53

                          @martin
                          In Zeile 35 fehlt am Ende (vor dem Semikolon) eine schließende eckige Klammer.

                          M Offline
                          M Offline
                          martin
                          schrieb am zuletzt editiert von
                          #92

                          @paul53 said in Gleitender Durchschnitt, Min., Max. über def. Zeitraum:

                          @martin
                          In Zeile 35 fehlt am Ende (vor dem Semikolon) eine schließende eckige Klammer.

                          Das habe ich auch gerade gefunden. :-)

                          Jetzt kommen die Warnungen (siehe oben - habe den Beitrag bearbeitet).

                          1 Antwort Letzte Antwort
                          0
                          • M martin

                            @paul53 said in Gleitender Durchschnitt, Min., Max. über def. Zeitraum:

                            d am Ende sind Zeich

                            Danke!

                            Jetzt kommt eine ganze Reihe an Warnungen mit denen ich nichts anfangen kann:

                            javascript.0	2020-09-30 18:55:11.308	info	(16357) script.js.Meine_Scripts.Temperatur_Min_Max: registered 0 subscriptions and 1 schedule
                            javascript.0	2020-09-30 18:55:11.300	warn	(16357) at script.js.Meine_Scripts.Temperatur_Min_Max:271:1
                            javascript.0	2020-09-30 18:55:11.299	warn	(16357) at initializeStatData (script.js.Meine_Scripts.Temperatur_Min_Max:199:4)
                            javascript.0	2020-09-30 18:55:11.299	warn	(16357) at setState (/opt/iobroker/node_modules/iobroker.javascript/lib/sandbox.js:1358:20)
                            javascript.0	2020-09-30 18:55:11.296	warn	(16357) State "javascript.0.Status.Statistic" not found
                            javascript.0	2020-09-30 18:55:11.290	warn	(16357) at script.js.Meine_Scripts.Temperatur_Min_Max:271:1
                            javascript.0	2020-09-30 18:55:11.289	warn	(16357) at initializeStatData (script.js.Meine_Scripts.Temperatur_Min_Max:71:33)
                            javascript.0	2020-09-30 18:55:11.285	warn	(16357) getState "javascript.0.Status.Statistic" not found (3)
                            javascript.0	2020-09-30 18:55:11.242	info	(16357) Start javascript script.js.Meine_Scripts.Temperatur_Min_Max
                            javascript.0	2020-09-30 18:55:11.078	info	(16357) Stop script script.js.Meine_Scripts.Temperatur_Min_Max
                            
                            paul53P Offline
                            paul53P Offline
                            paul53
                            schrieb am zuletzt editiert von
                            #93

                            @martin sagte:

                            State "javascript.0.Status.Statistic" not found

                            Der Datenpunkt existiert nicht.

                            Bitte verzichtet auf Chat-Nachrichten, denn die Handhabung ist grauenhaft !
                            Produktiv: RPi 2 mit S.USV, HM-MOD-RPI und SLC-USB-Stick mit root fs

                            M 1 Antwort Letzte Antwort
                            0
                            • paul53P paul53

                              @martin sagte:

                              State "javascript.0.Status.Statistic" not found

                              Der Datenpunkt existiert nicht.

                              M Offline
                              M Offline
                              martin
                              schrieb am zuletzt editiert von
                              #94

                              @paul53
                              Oha. Ich dachte den legt er selbst an.
                              Wie muss der denn aussehen? Zahl oder sonst was?

                              paul53P 2 Antworten Letzte Antwort
                              0
                              • M martin

                                @paul53
                                Oha. Ich dachte den legt er selbst an.
                                Wie muss der denn aussehen? Zahl oder sonst was?

                                paul53P Offline
                                paul53P Offline
                                paul53
                                schrieb am zuletzt editiert von
                                #95

                                @martin sagte:

                                Ich dachte den legt er selbst an.

                                Laut Script wird dieser DP zuerst erzeugt. Schau mal im Tab "Objekte" nach.

                                Bitte verzichtet auf Chat-Nachrichten, denn die Handhabung ist grauenhaft !
                                Produktiv: RPi 2 mit S.USV, HM-MOD-RPI und SLC-USB-Stick mit root fs

                                M 1 Antwort Letzte Antwort
                                0
                                • paul53P paul53

                                  @martin sagte:

                                  Ich dachte den legt er selbst an.

                                  Laut Script wird dieser DP zuerst erzeugt. Schau mal im Tab "Objekte" nach.

                                  M Offline
                                  M Offline
                                  martin
                                  schrieb am zuletzt editiert von
                                  #96

                                  @paul53 Nein, da ist er nicht vorhanden.

                                  M 1 Antwort Letzte Antwort
                                  0
                                  • M martin

                                    @paul53
                                    Oha. Ich dachte den legt er selbst an.
                                    Wie muss der denn aussehen? Zahl oder sonst was?

                                    paul53P Offline
                                    paul53P Offline
                                    paul53
                                    schrieb am zuletzt editiert von
                                    #97

                                    @martin sagte:

                                    Wie muss der denn aussehen?

                                    Siehe Zeilen 58 bis 66.

                                    Bitte verzichtet auf Chat-Nachrichten, denn die Handhabung ist grauenhaft !
                                    Produktiv: RPi 2 mit S.USV, HM-MOD-RPI und SLC-USB-Stick mit root fs

                                    1 Antwort Letzte Antwort
                                    0
                                    • M martin

                                      @paul53 Nein, da ist er nicht vorhanden.

                                      M Offline
                                      M Offline
                                      martin
                                      schrieb am zuletzt editiert von
                                      #98

                                      @martin Kommando zurück. Habe das Skript nochmal neu gestartet. Jetzt ist der Datenpunkt da.

                                      M 1 Antwort Letzte Antwort
                                      0
                                      • M martin

                                        @martin Kommando zurück. Habe das Skript nochmal neu gestartet. Jetzt ist der Datenpunkt da.

                                        M Offline
                                        M Offline
                                        martin
                                        schrieb am zuletzt editiert von martin
                                        #99

                                        Mittlerweile sind alle DP da.
                                        Danke für deine Hilfe!

                                        paul53P 1 Antwort Letzte Antwort
                                        0
                                        • M martin

                                          Mittlerweile sind alle DP da.
                                          Danke für deine Hilfe!

                                          paul53P Offline
                                          paul53P Offline
                                          paul53
                                          schrieb am zuletzt editiert von
                                          #100

                                          @martin sagte:

                                          als Zahl darstellen?

                                          Das sind Zahlen. Mit Vis kenne ich mich nicht wirklich aus.

                                          Bitte verzichtet auf Chat-Nachrichten, denn die Handhabung ist grauenhaft !
                                          Produktiv: RPi 2 mit S.USV, HM-MOD-RPI und SLC-USB-Stick mit root fs

                                          1 Antwort Letzte Antwort
                                          0
                                          Antworten
                                          • In einem neuen Thema antworten
                                          Anmelden zum Antworten
                                          • Älteste zuerst
                                          • Neuste zuerst
                                          • Meiste Stimmen


                                          Support us

                                          ioBroker
                                          Community Adapters
                                          Donate

                                          422

                                          Online

                                          32.5k

                                          Benutzer

                                          81.6k

                                          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