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. Visualisierung
  4. X/Y Plots in VIS2 views

NEWS

  • Jahresrückblick 2025 – unser neuer Blogbeitrag ist online! ✨
    BluefoxB
    Bluefox
    16
    1
    1.9k

  • Neuer Blogbeitrag: Monatsrückblick - Dezember 2025 🎄
    BluefoxB
    Bluefox
    13
    1
    905

  • Weihnachtsangebot 2025! 🎄
    BluefoxB
    Bluefox
    25
    1
    2.2k

X/Y Plots in VIS2 views

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

    Ich habe seit gut einem Monat eine Wärmepumpe (Buderus WLW186) und quäle mich etwas mit dem Herantasten an die Vorlaufgrenze, ab der es in der Bude nicht mehr warm genug wird...

    Jedes Grad weniger Vorlauftemperatur bringt ein wenig mehr Effizienz der Wärmepumpe.

    Was mich da behindert, ist, dass es trotz einem ziemliche Stapel Dokumentation, den die Installateure dagelassen haben nicht so ganz nachvollziehbar ist, wie sich welche "Stellschrauben" im Detail auf die Vorlauftemperatur auswirken...
    Heizkurve mit Fußpunkt und Komfortpunkt, Temperatur für "Heizen" und "Absenken" gehen wohl in die Berechnung der Vorlauftemperatur ein....

    Ich nutze EMS-ESP, um der Anlage auf die Finger zu schauen. Habe schon festgestellt, dass die Vorlauftemperatur nicht direkt der Außentemperatur folgt, sondern der "gedämpften Außentemperatur", das Auf-und Ab ist bei dieser wirklich deutlich glatter, und eilt der realen Temperatur um ca 2 Stunden hinterher.
    Das soll wohl die "Trägheit" des Gebäudes abbilden ...

    Im EMS-ESP-Adapter gibt es sowohl die Soll-Vorlauftemperatur, als auch die gedämpfte Außentemperatur als Datenpunkt.

    Ich würde gerne dieses als Grafik mit Außentemperatur auf der X-Achse, und Vorlauftemperatur auf der Y-Achse mit allen im Verlauf erfassten Wertepaaren darstellen.
    Wenn ich dann meine, genug Werte gesammelt zu haben, und wieder an den Stellschrauben drehen will, sollte die Grafik "genullt" werden können, und man erfasst die sich ergebende neue Heizkurve mit einiger Geduld über die dann kommenden Kalt und Warmfronten über gesammelte Wertepaare gedämpfteAußentemperatur -> Vorlauftemperatur.

    Gibt es irgendwelche Bordmittel über Adapter, um solche X/Y Graphen zu generieren, und in VIS2 Views einzubetten?

    Derzeit erfasse ich die Wertepaare mit einem Blockly Script, hänge sie am Ende an eine Textdatei an, und werte sie extern mit Gnuplot aus...
    Es wäre auch eine Lösung, mit Cronjob und Gnuplot eine Grafikdatei zu erzeugen, und diese dann in einen Vis View einzubetten.

    Intel(R) Celeron(R) CPU N3000 @ 1.04GHz 8G RAM 480G SSD
    Virtualization : unprivileged lxc container (debian 12 on Proxmox 8.4.14)
    Linux pve 6.8.12-16-pve
    6 GByte RAM für den Container
    Fritzbox 6591 FW 8.03 (Vodafone Leih-Box)
    Remote-Access über Wireguard der Fritzbox

    M 1 Antwort Letzte Antwort
    0
    • MartinPM MartinP

      Ich habe seit gut einem Monat eine Wärmepumpe (Buderus WLW186) und quäle mich etwas mit dem Herantasten an die Vorlaufgrenze, ab der es in der Bude nicht mehr warm genug wird...

      Jedes Grad weniger Vorlauftemperatur bringt ein wenig mehr Effizienz der Wärmepumpe.

      Was mich da behindert, ist, dass es trotz einem ziemliche Stapel Dokumentation, den die Installateure dagelassen haben nicht so ganz nachvollziehbar ist, wie sich welche "Stellschrauben" im Detail auf die Vorlauftemperatur auswirken...
      Heizkurve mit Fußpunkt und Komfortpunkt, Temperatur für "Heizen" und "Absenken" gehen wohl in die Berechnung der Vorlauftemperatur ein....

      Ich nutze EMS-ESP, um der Anlage auf die Finger zu schauen. Habe schon festgestellt, dass die Vorlauftemperatur nicht direkt der Außentemperatur folgt, sondern der "gedämpften Außentemperatur", das Auf-und Ab ist bei dieser wirklich deutlich glatter, und eilt der realen Temperatur um ca 2 Stunden hinterher.
      Das soll wohl die "Trägheit" des Gebäudes abbilden ...

      Im EMS-ESP-Adapter gibt es sowohl die Soll-Vorlauftemperatur, als auch die gedämpfte Außentemperatur als Datenpunkt.

      Ich würde gerne dieses als Grafik mit Außentemperatur auf der X-Achse, und Vorlauftemperatur auf der Y-Achse mit allen im Verlauf erfassten Wertepaaren darstellen.
      Wenn ich dann meine, genug Werte gesammelt zu haben, und wieder an den Stellschrauben drehen will, sollte die Grafik "genullt" werden können, und man erfasst die sich ergebende neue Heizkurve mit einiger Geduld über die dann kommenden Kalt und Warmfronten über gesammelte Wertepaare gedämpfteAußentemperatur -> Vorlauftemperatur.

      Gibt es irgendwelche Bordmittel über Adapter, um solche X/Y Graphen zu generieren, und in VIS2 Views einzubetten?

      Derzeit erfasse ich die Wertepaare mit einem Blockly Script, hänge sie am Ende an eine Textdatei an, und werte sie extern mit Gnuplot aus...
      Es wäre auch eine Lösung, mit Cronjob und Gnuplot eine Grafikdatei zu erzeugen, und diese dann in einen Vis View einzubetten.

      M Online
      M Online
      MCU
      schrieb am zuletzt editiert von
      #2

      @MartinP flexCharts-Adapter

      http://192.168.178.XXX:8082/flexcharts/echarts.html?source=state&id=0_userdata.0.wp.xy.chart&refresh=10&darkmode=auto
      

      [
        [
          12.5,
          24
        ],
        [
          11.8,
          24.3
        ],
        [
          10.9,
          24.8
        ],
        [
          10.1,
          25.2
        ],
        [
          9.4,
          25.7
        ],
        [
          8.6,
          26.1
        ],
        [
          7.9,
          26.6
        ],
        [
          7.1,
          27.1
        ],
        [
          6.4,
          27.6
        ],
        [
          5.6,
          28
        ],
        [
          4.9,
          28.7
        ],
        [
          4.1,
          29.2
        ],
        [
          3.4,
          29.7
        ],
        [
          2.6,
          30.3
        ],
        [
          1.9,
          30.8
        ],
        [
          1.1,
          31.4
        ],
        [
          0.4,
          32
        ],
        [
          -0.3,
          32.6
        ],
        [
          -1.1,
          33.1
        ],
        [
          -1.8,
          33.7
        ],
        [
          -2.6,
          34.2
        ],
        [
          -3.3,
          34.8
        ],
        [
          -4.1,
          35.4
        ],
        [
          -4.8,
          36
        ],
        [
          -5.6,
          36.7
        ],
        [
          -6.3,
          37.3
        ],
        [
          -7.1,
          38
        ],
        [
          0,
          0
        ]
      ]
      

      /***********************
      * X/Y-Scatter für Heizkurve (VIS2 via FlexCharts)
      *  - sammelt Paare: gedämpfte AT (X) -> Soll-VL (Y)
      *  - "Nullen" per Reset-State
      ***********************/
      
      const DP_X = 'ems-esp.0.DEIN_GERAET.dampedOutsideTemp';   // <-- anpassen
      const DP_Y = 'ems-esp.0.DEIN_GERAET.flowTempSetpoint';    // <-- anpassen
      
      const STATE_POINTS = '0_userdata.0.wp.xy.points';
      const STATE_CHART  = '0_userdata.0.wp.xy.chart';
      const STATE_RESET  = '0_userdata.0.wp.xy.reset';
      
      const SAMPLE_SECONDS = 60;     // Abtastrate
      const MAX_POINTS     = 4000;   // Begrenzung (DB-frei bleiben)
      const DEC_X          = 1;      // Rundung
      const DEC_Y          = 1;
      
      function round(v, d) {
       const p = Math.pow(10, d);
       return Math.round(v * p) / p;
      }
      
      function safeParseJson(str, fallback) {
       try { return JSON.parse(str); } catch (e) { return fallback; }
      }
      
      function buildOption(points) {
       return {
         animation: false,
         grid: { left: 60, right: 20, top: 40, bottom: 55 },
         tooltip: { trigger: 'item' }, // zeigt [x,y] automatisch
         xAxis: {
           type: 'value',
           name: 'gedämpfte AT [°C]',
           nameLocation: 'middle',
           nameGap: 35
         },
         yAxis: {
           type: 'value',
           name: 'Soll-VL [°C]',
           nameLocation: 'middle',
           nameGap: 45
         },
         dataZoom: [
           { type: 'inside' },
           { type: 'slider', height: 18 }
         ],
         series: [{
           name: 'Heizkurve (Messpunkte)',
           type: 'scatter',
           symbolSize: 6,
           data: points
         }]
       };
      }
      
      function writeChart(points) {
       const option = buildOption(points);
       setState(STATE_CHART, JSON.stringify(option), true);
      }
      
      function loadPoints() {
       const s = getState(STATE_POINTS);
       const raw = s && s.val ? String(s.val) : '[]';
       const arr = safeParseJson(raw, []);
       return Array.isArray(arr) ? arr : [];
      }
      
      function savePoints(points) {
       setState(STATE_POINTS, JSON.stringify(points), true);
       writeChart(points);
      }
      
      function addSample() {
       if(existsState(DP_X) && existsState(DP_Y)){
         const sx = getState(DP_X);
       
         const sy = getState(DP_Y);
         const x = sx ? Number(sx.val) : NaN;
         const y = sy ? Number(sy.val) : NaN;
      
         if (!Number.isFinite(x) || !Number.isFinite(y)) return;
      
         const px = round(x, DEC_X);
         const py = round(y, DEC_Y);
      
         const points = loadPoints();
      
         // optional: Duplikate vermeiden (gleicher Punkt wie zuletzt)
         const last = points.length ? points[points.length - 1] : null;
         if (last && last[0] === px && last[1] === py) return;
      
         points.push([px, py]);
      
         // Limit
         if (points.length > MAX_POINTS) {
             points.splice(0, points.length - MAX_POINTS);
         }
      
         savePoints(points);
       }else{
           log('DPs sind nicht vorhanden')
       }
      }
      
      // States anlegen (falls nicht vorhanden)
      createState(STATE_POINTS, '[]', { type: 'string', role: 'json', read: true, write: true });
      createState(STATE_CHART,  '{}', { type: 'string', role: 'json', read: true, write: true });
      createState(STATE_RESET,  false, { type: 'boolean', role: 'button', read: true, write: true });
      
      // Initial
      writeChart(loadPoints());
      
      // Sampling
      setInterval(addSample, SAMPLE_SECONDS * 1000);
      
      // Reset-Handling ("nullen")
      on({ id: STATE_RESET, change: 'ne' }, obj => {
       if (obj.state && obj.state.val === true) {
         savePoints([]);
         setState(STATE_RESET, false, true);
       }
      });
      
      

      NUC i7 64GB mit Proxmox ---- Jarvis Infos Aktualisierungen der Doku auf Instagram verfolgen -> mcuiobroker Instagram
      Wenn Euch mein Vorschlag geholfen hat, bitte rechts "^" klicken.

      1 Antwort Letzte Antwort
      0
      • MartinPM Online
        MartinPM Online
        MartinP
        schrieb am zuletzt editiert von
        #3

        Hmm, bei mir gibt es noch eine Falle ... Derzeit wird eine Umschaltung vorgenommen Tags 21.0°C Temperatur Nachts 19,5°C...

        Eigentlich braucht man da noch eine "Weiche" die in zwei "Sammelbehälter" eintütet...

        Also Tagsüber savePointsDay() und Nachts savePointsNight() in Abhängigkeit von hc1.seltemp

        bei meinen Basteleien hat sich aber herausgestellt, dass das manchmal nicht richtig synchronisiert umgeschaltet wird ... deshalb werden Vorlauf/Außentemperaturpaare nicht immer der richtigen "seltemp" zugeordnet ...
        Muss da wohl noch ein wenig basteln, aber Dein Code ist da eine schöne Grundlage... Vielen Dank dafür.

        Intel(R) Celeron(R) CPU N3000 @ 1.04GHz 8G RAM 480G SSD
        Virtualization : unprivileged lxc container (debian 12 on Proxmox 8.4.14)
        Linux pve 6.8.12-16-pve
        6 GByte RAM für den Container
        Fritzbox 6591 FW 8.03 (Vodafone Leih-Box)
        Remote-Access über Wireguard der Fritzbox

        1 Antwort Letzte Antwort
        0
        • MartinPM Online
          MartinPM Online
          MartinP
          schrieb am zuletzt editiert von MartinP
          #4

          Bin bisher nicht dazu gekommen, das umzustellen.
          Aktuell schreibe ich in eine Datei, und alle 2 Stunden liest ein Cron Job die Datei und schreibt eine mit Gnuplot erzeugte Datei in einen "Grünen" Ordner von iobroker.

          Hier meine Probleme, die ich bisher behoben habe

          Datenpunktpaar-Erhebung

          Die interessierenden Datenpunkt-Änderungen kommen in einer sehr unvorteilhaften Reihenfolgen

          • Raum-Wunschtemperatur-Umschaltungen (Tag/Nachtbetrieb Umschaltung) - Zuerst wird die geänderte Soll-Vorlauf-Temperatur gemeldet, und DANN die neue Wunschtemperatur. Da die Wunschtemperatur als "Weiche" dient, die Wertepaare entweder an die Nacht- oder die Tag-Heizkurvendatei anzuhängen, ist das unvorteilhaft.
          • Änderung der Soll-Vorlauftemperatur aufgrund einer Änderung der gedämpften Außentemperatur - Zuerst wird die Soll-Vorlauftemperatur und DANN die gedämpfte Außentemperatur gemeldet.

          Ich habe das durch verzögertes Anlegen des neuen Wertepaares (gedämpfte Außentemperatur - Soll-Vorlauftemperatur) nach erneutem Einlesen des Status Quo zu diesem Zeitpunkt realisiert.

          bb283cde-10c7-4250-8b1e-f8cf11d9e40a-grafik.png

          Ablegen einer Grafikdatei

          Das erledigt ein cron getriggertes Script, das alle zwei Stunden ausgeführt wird.

          33 */2 * * * bash ~/gitea/iobroker_shellscripte/write_heizkurve.sh
          

          Das Script sieht so aus:

           #!/usr/bin/env bash
           /usr/bin/gnuplot -c ~/gitea/iobroker_shellscripte/heizkurven_cli.plt
           /usr/bin/iob file write ~/heizkurven.png /vis-2.0/Spielwiese
          

          Das gnuplot script

          # invoke with gnuplot -c ...
          # write file with iobroker file write ./heizkurven.png 
          # Work on /opt/iobroker/iobroker-data/files/0_userdata.0
          cd '/opt/iobroker/iobroker-data/files/0_userdata.0'
          set terminal png
          set output '~/heizkurven.png'
          set xrange [20:-10]
          set yrange [20:60]
          set title 'Eingestellte Heizkurven'
          set ylabel 'Vorlauftemperatur'
          set xlabel 'Aussentemperatur'
          set pointsize 0.1
          set xtics 5
          set ytics 5
          set grid
          set timestamp
          plot 'heizkurvenpunkte_21.txt' with lines,\
               'heizkurvenpunkte_19_5.txt' with lines,\
               'heizkurve_ref_20_22_10_55_nocomf.txt' with lines,\
               'heizkurve_ref_20_19_10_52_nocomf.txt' with lines
          

          Anschauen kann ich mir die letzte Version im Browser über ...

          http://192.168.2.201:8082/vis-2.0/Spielwiese/heizkurven.png

          Habe es auch in einen Vis2 View eingebettet, aber die png anzuschauen, macht fast mehr Spaß, weil man da zoomen kann.

          Leider ist die Temperatur gerade recht stabil, noch nicht viel Abdeckung, insbesonder für die Nacht ...

          Als Hilfslinien habe ich schon einmal die vermuteten Heizkurve für Tag und Nacht eingebunden.

          Tags ist die Wunsch-Temperatur (Buderus-Vorgabe-Wert) 21°C, Nachts 19,5°C

          Heizkurve ist

          Auß/Vorl. 20/22, 55/-10

          Die 2,5°C Nachtabsenkung bringen nach bisherigem Urteil eine 3 °C nach unten verschobene Heizkurve.

          3362d489-d5b0-475c-898b-63e13d848f97-grafik.png

          Intel(R) Celeron(R) CPU N3000 @ 1.04GHz 8G RAM 480G SSD
          Virtualization : unprivileged lxc container (debian 12 on Proxmox 8.4.14)
          Linux pve 6.8.12-16-pve
          6 GByte RAM für den Container
          Fritzbox 6591 FW 8.03 (Vodafone Leih-Box)
          Remote-Access über Wireguard der Fritzbox

          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

          302

          Online

          32.6k

          Benutzer

          82.2k

          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