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

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

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

  • Neues Video "KI im Smart Home" - ioBroker plus n8n
    BluefoxB
    Bluefox
    16
    1
    3.5k

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

Geplant Angeheftet Gesperrt Verschoben Skripten / Logik
javascript
113 Beiträge 20 Kommentatoren 26.3k 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.
  • 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
                                        • S Offline
                                          S Offline
                                          SiKo
                                          schrieb am zuletzt editiert von
                                          #101

                                          Hallo zusammen,

                                          ich habe jetzt hier meinen "Quelldatenpunk" vom Netatmo Crawler eingetragen und als Ziel für die neuen DP 0_Userdata.0.Wetter.
                                          Es wird jedoch folgendes erstellt: Hat Jemand einen Tipp für mich.

                                          808a1677-33f0-4cb1-897b-686459d58c81-image.png

                                          d6dfb2af-a614-4754-98b5-ff2bf49a4577-image.png

                                          // 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 = ['netatmo-crawler.0.stationData.70:ee:50:15:e2:1e.temperature','0_userdata.0.Wetter.Temperatur.Netatmo','Temperatur','°C'];
                                                         
                                           
                                          //Datenpunkt zur Speicherung aller internen Daten
                                          const dpData='0_userdata.0.Wetter';
                                           
                                          // ########################################################################################################
                                          // 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();
                                          });
                                          
                                          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

                                          825

                                          Online

                                          32.4k

                                          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