NEWS

Max /Mintemperatur aus influxdb mit gethistory

  • Starter

    Hallo zusammen,
    per modbus werden verschiedene Temperaturwerte in eine influxdb gespeichert. Per Flot kann ich mir den Verlauf auch wunderbar ansehen. Ich möchte nun per Skript den Max- und Min-Wert der letzten 24h ausgeben. Prinzipiell klapt aus auch, allerdings nicht über 24h. Da springt die End-Zeit.

    var dateStart = new Date().getTime()-86400000;
    var dateEnd = new Date().getTime();
    
    var maxKoll = -100;
    var minKoll = 100;
    var maxAussen = -100;
    var minAussen = 100;
    
    sendTo('influxdb.0', 'getHistory', {
        id: 'modbus.0.holdingRegisters.1_TemperaturKollektoren',
        options: {
            start:      dateStart,
            end:        dateEnd,
            aggregate: 'none' // or 'none' to get raw values
        }
    }, function (result) {
        for (var i = 0; i < result.result.length; i++) {
            //console.log(result.result[i].val + ' ' + new Date(result.result[i].ts).toISOString());
            if (result.result[i].val > maxKoll) {
                maxKoll = result.result[i].val;
            }
            if (result.result[i].val < minKoll) {
                minKoll = result.result[i].val;
            }
            if (i == 0) {
                console.log('First Value '+ result.result[i].val + ' ' + new Date(result.result[i].ts).toISOString())
            }
            if (i == result.result.length -1) {
                console.log('Last Value '+ result.result[i].val + ' ' + new Date(result.result[i].ts).toISOString())
            }
        }
        console.log('Max Kollektoren: '+ maxKoll);
        console.log('Min Kollektoren: '+ minKoll);
    });
    
    
    15:12:16.674	info	javascript.0 script.js.common.TemperaturMinMax: First Value 41.2 2019-02-17T14:11:41.535Z
    15:12:16.674	info	javascript.0 script.js.common.TemperaturMinMax: Last Value -5 2019-02-18T06:11:28.084Z
    15:12:16.674	info	javascript.0 script.js.common.TemperaturMinMax: Max Kollektoren: 41.4
    15:12:16.674	info	javascript.0 script.js.common.TemperaturMinMax: Min Kollektoren: -5.8
    
    
    

    Hat jemand eine Idee woran das liegen könnte? Die Systemzeit ist korrekt eingetragen.

    Gruß
    Ben

  • Kategorie Mod

    @Trikolon
    Das habe ich bei mir umgesetzt und das javascript aus dem Forum hier genommen --> siehe hier
    funktioniert perfekt musst nur die Datenpunkte ändern und die DB (sql.0)

    Kannst du nutzen um auch 7 Tage, Monat, 30 tage etc. zu machen.


  • Hallo,

    ich bekomme das Script aus dem Link mit einer InfluxDB nicht zum laufen.

    ! ````
    // -----------------------------------------------------------------------------
    // ----- Abfragen von Werten aus der Datenbank (SQL) ---------------------------
    // -----------------------------------------------------------------------------
    ! // ----- Datenpunkt der ausgelesen werden soll ---------------------------------
    var id = "javascript.0.Wetterstation.Aussentemperatur";
    // ----- Datenpunkte in die gespeichert werden soll ----------------------------
    var maxid = 'javascript.0.Statistik.Aussentemp.Max24';
    var minid = 'javascript.0.Statistik.Aussentemp.Min24';
    var dt = 24; // Zeitraum in Stunden
    dt = dt36001000; // Zeitraum umrechnen in ??
    ! // ----- Datenpunkte anlegen ---------------------------------------------------
    createState(maxid, " ");
    createState(minid, " ");
    log('1. ) Datenpunkte angelegt ');
    ! SQLAbfrage(id);
    ! //----- SQL-Abfrage durchführen
    function SQLAbfrage () {
    log('2. ) Datenpunkt => ' + id);
    log('2a.) Abfrage => SELECT * FROM datapoints WHERE name = '' + id + ''');
    sendTo('influxdb.0', 'query', 'SELECT * FROM ioBmaster.datapoints WHERE name = '' + id + ''', GetResults);
    }
    //---------------------------------------
    ! function GetResults (dpoint) {
    log('3. ) Funktion -> GetResults aufrufen');
    var end_time = new Date().getTime();
    var start_time = new Date().getTime() - dt;
    log('3a.) Startzeit : ' + start_time);
    log('3b.) Endzeit : ' + end_time);
    log(' Datenpunkt: ' + dpoint.result);
    log('3c.) result : ' + JSON.stringify(dpoint.result) + ' -//- ' + start_time);
    log(' Datenpunkt: ' + dpoint.result[0].id + ' ---//--- ' + dpoint.result[0].name);
    sendTo('influxdb.0', 'query', 'SELECT Round(Min(val),1) As MinVal FROM ioBmaster.ts_number WHERE ts >= ' + start_time + ' AND id=' + dpoint.result[0].id + ' GROUP BY id',minimum);
    sendTo('influxdb.0', 'query', 'SELECT Round(Max(val),1) As MaxVal FROM ioBmaster.ts_number WHERE ts >= ' + start_time + ' AND id=' + dpoint.result[0].id + ' GROUP BY id',maximum);
    }
    ! //----- Werte schreiben (maximum, minimum)
    //----- minimum
    function minimum(result) {
    log('min )Funktion -> ' + JSON.stringify(result.result));
    setState(minid, result.result[0].MinVal);
    }
    //----- maximum
    function maximum(result) {
    log('max )Funktion -> ' + JSON.stringify(result.result));
    setState(maxid, result.result[0].MaxVal);
    log('---- fertig -----------------------------------------');
    

    Endet mit Error:

    javascript.0	2020-12-18 22:04:12.920	info	(3004) Stop script script.js.common.Skript_1
    javascript.0	2020-12-18 22:04:09.753	error	(3004) at process._tickCallback (internal/process/next_tick.js:68:7)
    javascript.0	2020-12-18 22:04:09.753	error	(3004) at promise.then (/opt/iobroker/node_modules/standard-as-callback/built/index.js:19:49)
    javascript.0	2020-12-18 22:04:09.753	error	(3004) at tryCatcher (/opt/iobroker/node_modules/standard-as-callback/built/utils.js:11:23)
    javascript.0	2020-12-18 22:04:09.753	error	(3004) at client.get (/opt/iobroker/node_modules/iobroker.js-controller/lib/states/statesInRedis.js:616:17)
    javascript.0	2020-12-18 22:04:09.753	error	(3004) at adapter.getForeignState (/opt/iobroker/node_modules/iobroker.javascript/main.js:1140:17)
    javascript.0	2020-12-18 22:04:09.752	error	(3004) at createProblemObject (/opt/iobroker/node_modules/iobroker.javascript/main.js:1559:17)
    javascript.0	2020-12-18 22:04:09.752	error	(3004) at prepareScript (/opt/iobroker/node_modules/iobroker.javascript/main.js:1503:37)
    javascript.0	2020-12-18 22:04:09.752	error	(3004) at createVM (/opt/iobroker/node_modules/iobroker.javascript/main.js:1280:28)
    javascript.0	2020-12-18 22:04:09.752	error	(3004) at Object.createScript (vm.js:277:10)
    javascript.0	2020-12-18 22:04:09.752	error	(3004) at new Script (vm.js:83:7)
    javascript.0	2020-12-18 22:04:09.752	error	(3004) SyntaxError: Unexpected token var
    javascript.0	2020-12-18 22:04:09.752	error	(3004) ^^^
    javascript.0	2020-12-18 22:04:09.752	error	(3004) var id = "javascript.0.Wetterstation.Aussentemperatur";
    javascript.0	2020-12-18 22:04:09.752	error	at script.js.common.Skript_1:6
    javascript.0	2020-12-18 22:04:09.752	error	(3004) script.js.common.Skript_1 compile failed:
    javascript.0	2020-12-18 22:04:09.752	info	(3004) Start javascript script.js.common.Skript_1
    

    Kannst du mir helfen?

  • Kategorie Mod

    @sonystar sagte in Max /Mintemperatur aus influxdb mit gethistory:

    javascript.0.Wetterstation.Aussentemperatur

    Mhhh error 3004 - unexpected token sagt mir grad nix.

    Gibt es den denn Datenpunkt javascript.0.Wetterstation.Aussentemperatur ?
    Wenn ja wie ist dieser definiert ?


  • @sonystar
    Das Script ist verstümmelt. Lösche alle "! " am Anfang der Zeilen, in denen es vorhanden ist.
    Zeile 11

    dt = dt36001000; // Zeitraum umrechnen in ??
    

    ändern

    dt = dt * 3600 * 1000; // Zeitraum umrechnen in ms
    

  • @Segway @paul53
    Dankeschön schonmal.
    Jetzt komme ich schonmal ein paar Zeilen weiter:

    javascript.0	2020-12-18 22:14:53.647	info	(3004) Stop script script.js.common.Skript_1
    javascript.0	2020-12-18 22:14:51.485	error	(3004) at process._tickCallback (internal/process/next_tick.js:68:7)
    javascript.0	2020-12-18 22:14:51.485	error	(3004) at promise.then (/opt/iobroker/node_modules/standard-as-callback/built/index.js:19:49)
    javascript.0	2020-12-18 22:14:51.485	error	(3004) at tryCatcher (/opt/iobroker/node_modules/standard-as-callback/built/utils.js:11:23)
    javascript.0	2020-12-18 22:14:51.485	error	(3004) at client.get (/opt/iobroker/node_modules/iobroker.js-controller/lib/states/statesInRedis.js:616:17)
    javascript.0	2020-12-18 22:14:51.485	error	(3004) at adapter.getForeignState (/opt/iobroker/node_modules/iobroker.javascript/main.js:1140:17)
    javascript.0	2020-12-18 22:14:51.485	error	(3004) at createProblemObject (/opt/iobroker/node_modules/iobroker.javascript/main.js:1559:17)
    javascript.0	2020-12-18 22:14:51.485	error	(3004) at prepareScript (/opt/iobroker/node_modules/iobroker.javascript/main.js:1503:37)
    javascript.0	2020-12-18 22:14:51.485	error	(3004) at createVM (/opt/iobroker/node_modules/iobroker.javascript/main.js:1280:28)
    javascript.0	2020-12-18 22:14:51.485	error	(3004) at Object.createScript (vm.js:277:10)
    javascript.0	2020-12-18 22:14:51.485	error	(3004) at new Script (vm.js:83:7)
    javascript.0	2020-12-18 22:14:51.485	error	(3004) SyntaxError: missing ) after argument list
    javascript.0	2020-12-18 22:14:51.485	error	(3004) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    javascript.0	2020-12-18 22:14:51.485	error	(3004) log('2a.) Abfrage => SELECT * FROM datapoints WHERE name = '' + id + ''');
    javascript.0	2020-12-18 22:14:51.485	error	at script.js.common.Skript_1:20
    javascript.0	2020-12-18 22:14:51.485	error	(3004) script.js.common.Skript_1 compile failed:
    javascript.0	2020-12-18 22:14:51.484	info	(3004) Start javascript script.js.common.Skript_1
    

    Scheint eine Klammer zu fehlen? Wo muss ich die setzten?

  • Kategorie Mod

    @sonystar

    habe meines mal kopiert. sieht so aus

    // -----------------------------------------------------------------------------
    // ----- Abfragen von Werten aus der Datenbank (SQL) ---------------------------
    // -----------------------------------------------------------------------------
    
    // ----- Datenpunkt der ausgelesen werden soll ---------------------------------
    var id = "hm-rpc.1.KEQxxxxxxx.1.TEMPERATURE";
    // ----- Datenpunkte in die gespeichert werden soll ----------------------------
    var maxid = 'javascript.0.Datenpunkte.Temp_Aussen.Statistik_Luft_Aussen_Max24';
    var minid = 'javascript.0.Datenpunkte.Temp_Aussen.Statistik_Luft_Aussen_Min24';
    var dt = 24;                // Zeitraum in Stunden
        dt = dt*3600*1000;      // Zeitraum umrechnen in ??
    
    // ----- Datenpunkte anlegen ---------------------------------------------------
    createState(maxid, " ");
    createState(minid, " ");
    //log('1. ) Datenpunkte angelegt ');
    
    SQLAbfrage(id);
    
    //-----  SQL-Abfrage durchführen
    function SQLAbfrage () {
    //    log('2. ) Datenpunkt => ' + id);
    //    log('2a.) Abfrage    => SELECT * FROM datapoints WHERE name = \'' + id + '\'');
        sendTo('sql.0', 'query', 'SELECT * FROM iobroker.datapoints WHERE name = \'' + id + '\'', GetResults);
    }
    //---------------------------------------
    
    function GetResults (dpoint) {
    //    log('3. ) Funktion -> GetResults aufrufen');
        var end_time =   new Date().getTime();
        var start_time = new Date().getTime() - dt;
    //    log('3a.) Startzeit : ' + start_time);
    //    log('3b.) Endzeit   : ' + end_time);
    //    log('     Datenpunkt: ' + dpoint.result);
    //    log('3c.) result    : ' + JSON.stringify(dpoint.result) + ' -//- ' + start_time);
    //    log('     Datenpunkt: ' + dpoint.result[0].id + ' ---//--- ' + dpoint.result[0].name);
        sendTo('sql.0', 'query', 'SELECT Round(Min(val),1) As MinVal FROM iobroker.ts_number WHERE ts >= ' + start_time + ' AND id=' + dpoint.result[0].id + ' GROUP BY id',minimum);
        sendTo('sql.0', 'query', 'SELECT Round(Max(val),1) As MaxVal FROM iobroker.ts_number WHERE ts >= ' + start_time + ' AND id=' + dpoint.result[0].id + ' GROUP BY id',maximum);
    }
    
    //-----  Werte schreiben (maximum, minimum)
    //-----  minimum
    function minimum(result) {
    //  log('min )Funktion -> ' + JSON.stringify(result.result));
      setState(minid, result.result[0].MinVal);
    }
    //-----  maximum
    function maximum(result) {
    //    log('max )Funktion -> ' + JSON.stringify(result.result));
        setState(maxid, result.result[0].MaxVal);
    //    log('---- fertig -----------------------------------------');
        
    }
    //---------------------------------------
    
    // ----- Funktion jede Minute aufrufen
    schedule("*/5 * * * *", function(){SQLAbfrage(id);});
    

  • @Segway

    Nachdem ich das Script jetzt angepasst habe auf Influx kommt folgendes raus:

    javascript.0	2020-12-18 22:36:36.669	warn	at processImmediate (timers.js:658:5)
    javascript.0	2020-12-18 22:36:36.669	warn	at tryOnImmediate (timers.js:676:5)
    javascript.0	2020-12-18 22:36:36.669	warn	at runCallback (timers.js:705:18)
    javascript.0	2020-12-18 22:36:36.669	warn	at Immediate.setImmediate (/opt/iobroker/node_modules/iobroker.js-controller/lib/states/statesInRedis.js:234:41)
    javascript.0	2020-12-18 22:36:36.669	warn	at change (/opt/iobroker/node_modules/iobroker.js-controller/lib/adapter.js:5297:71)
    javascript.0	2020-12-18 22:36:36.669	warn	at Object.GetResults [as cb] (script.js.common.Skript_3:37:154)
    javascript.0	2020-12-18 22:36:36.669	warn	(3004) TypeError: Cannot read property 'id' of undefined
    javascript.0	2020-12-18 22:36:36.669	warn	(3004) States system pmessage io.messagebox.system.adapter.javascript.0 {"command":"query","message":{"result":[],"error":"Invalid call"},"from":"system.adapter.influxdb.0","callback":{"message":"SEL
    influxdb.0	2020-12-18 22:36:36.664	error	(3024) query: Error: error parsing query: found NAME, expected identifier, string, number, bool at line 1, char 41
    javascript.0	2020-12-18 22:36:36.663	info	(3004) script.js.common.Skript_3: registered 0 subscriptions and 1 schedule
    javascript.0	2020-12-18 22:36:36.652	info	(3004) Start javascript script.js.common.Skript_3
    

    Hier das Script:

    // -----------------------------------------------------------------------------
    // ----- Abfragen von Werten aus der Datenbank (SQL) ---------------------------
    // -----------------------------------------------------------------------------
     
    // ----- Datenpunkt der ausgelesen werden soll ---------------------------------
    var id = "javascript.0.Wetterstation.Aussentemperatur";
    // ----- Datenpunkte in die gespeichert werden soll ----------------------------
    var maxid = 'javascript.0.Statistik.Temp_Aussen_Max24';
    var minid = 'javascript.0.Statistik.Temp_Aussen_Min24';
    var dt = 24;                // Zeitraum in Stunden
        dt = dt*3600*1000;      // Zeitraum umrechnen in ms
     
    // ----- Datenpunkte anlegen ---------------------------------------------------
    createState(maxid, " ");
    createState(minid, " ");
    //log('1. ) Datenpunkte angelegt ');
     
    SQLAbfrage(id);
     
    //-----  SQL-Abfrage durchführen
    function SQLAbfrage () {
    //    log('2. ) Datenpunkt => ' + id);
    //    log('2a.) Abfrage    => SELECT * FROM datapoints WHERE name = \'' + id + '\'');
        sendTo('influxdb.0', 'query', 'SELECT * FROM iobroker.datapoints WHERE name = \'' + id + '\'', GetResults);
    }
    //---------------------------------------
     
    function GetResults (dpoint) {
    //    log('3. ) Funktion -> GetResults aufrufen');
        var end_time =   new Date().getTime();
        var start_time = new Date().getTime() - dt;
    //    log('3a.) Startzeit : ' + start_time);
    //    log('3b.) Endzeit   : ' + end_time);
    //    log('     Datenpunkt: ' + dpoint.result);
    //    log('3c.) result    : ' + JSON.stringify(dpoint.result) + ' -//- ' + start_time);
    //    log('     Datenpunkt: ' + dpoint.result[0].id + ' ---//--- ' + dpoint.result[0].name);
        sendTo('influxdb.0', 'query', 'SELECT Round(Min(val),1) As MinVal FROM iobroker.ts_number WHERE ts >= ' + start_time + ' AND id=' + dpoint.result[0].id + ' GROUP BY id',minimum);
        sendTo('influxdb.0', 'query', 'SELECT Round(Max(val),1) As MaxVal FROM iobroker.ts_number WHERE ts >= ' + start_time + ' AND id=' + dpoint.result[0].id + ' GROUP BY id',maximum);
    }
     
    //-----  Werte schreiben (maximum, minimum)
    //-----  minimum
    function minimum(result) {
    //  log('min )Funktion -> ' + JSON.stringify(result.result));
      setState(minid, result.result[0].MinVal);
    }
    //-----  maximum
    function maximum(result) {
    //    log('max )Funktion -> ' + JSON.stringify(result.result));
        setState(maxid, result.result[0].MaxVal);
    //    log('---- fertig -----------------------------------------');
        
    }
    //---------------------------------------
     
    // ----- Funktion jede Minute aufrufen
    schedule("*/5 * * * *", function(){SQLAbfrage(id);});
    
    
  • Kategorie Mod

    @sonystar
    Irgendwas passt da nicht.

    Den Datenpunkt den du auslesen möchtest ist ja unter javascript .0 usw
    Macht das Sinn?
    Normalerweise kommt der Datenpunkt doch von einem Messgerät wie zB bei mir von einem Homemtaic Temp/Humidity Gerät! Dieses lese ich dann aus.
    Dein Datenpunkt ist ja anscheinend selber angelegt daher die Frage wie das konfiguriert ist


  • @Segway
    Nee das passt schon so.

    {
      "common": {
        "name": "Temperatur Außen",
        "type": "number",
        "role": "state",
        "unit": "°C",
        "custom": {
          "influxdb.0": {
            "enabled": true,
            "changesOnly": true,
            "debounce": "1000",
            "retention": 0,
            "changesRelogInterval": "1800",
            "changesMinDelta": 0,
            "storageType": "Number",
            "aliasId": ""
          }
        }
      },
      "native": {
        "name": "Temperatur Außen",
        "type": "number",
        "role": "state",
        "unit": "°C"
      },
      "type": "state",
      "from": "system.adapter.javascript.0",
      "user": "system.user.admin",
      "ts": 1606934334904,
      "_id": "javascript.0.Wetterstation.Aussentemperatur",
      "acl": {
        "object": 1636,
        "state": 1636,
        "owner": "system.user.admin",
        "ownerGroup": "system.group.administrator"
      }
    }
    

    Unbenannt.png

Suggested Topics

1.1k
Online

35.1k
Users

41.1k
Topics

564.9k
Posts