Navigation

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

    NEWS

    • Neuer Blog: Fotos und Eindrücke aus Solingen

    • ioBroker@Smart Living Forum Solingen, 14.06. - Agenda added

    • ioBroker goes Matter ... Matter Adapter in Stable

    V
    • Profile
    • Following 0
    • Followers 0
    • Topics 10
    • Posts 44
    • Best 3
    • Groups 1

    Vippis

    @Vippis

    Starter

    3
    Reputation
    13
    Profile views
    44
    Posts
    0
    Followers
    0
    Following
    Joined Last Online

    Vippis Follow
    Starter

    Best posts made by Vippis

    • RE: Tasmota NeoPool per MQTT

      @mickym

      Boah man danke, bin da auf ein YT Video reingefallen ...

      https://www.youtube.com/watch?v=fZmAkQH5kiA

      Hab den Sonoff Adapter gelöscht und den MQTT Adapter installiert und dort kann man dann im Verzeichnis "cmnd" im Expertemodus (!!) eigene Commands anlegen.

      Z.B. NPFiltration mit value "1" schaltet die Pumpe ein.

      Funktioniert einwandfrei!

      posted in Einbindung von Geräten
      V
      Vippis
    • RE: SVG Animation: Regentonne mit animierter Wasserlinie

      Meine vorläufige Lösung nach Recherche:

      <head>
          
      <style>
      
          #container {
            width: 60px;
            height: 70px;
            position: relative;
            left: 50%;
            top: 50%;
            border-radius: 10px;
            /*box-shadow: 0px 0px 2px #000;*/
            transform: translate(-50%,-50%);
          
            overflow: hidden;
          }
          
          .wave-01 {
            position: absolute;
            width: 210%;
            height: 195%;
            left: -50%;
            top: 50%;
            background-color: rgba(0,190,255,0.4);
            border-radius: 60%;
            animation: rotate 3s linear infinite;
          }
      
      </style>
          
      </head>
      
      <body>
          <div id="container">
          <div class="wave-01"></div>
          </div>
      </body>
      
      
      
      

      66d25dc1-8ddb-403c-9912-4d3a608ad5f7-grafik.png

      Den Füllstand passt man dann über den Parameter "top" in "wave-01" an. Das mache ich dann per JS und schreibe den HTML-Code in einen Datenpunkt und binde ihn an das HTML Widget.

      Vorlage:
      https://codepen.io/dhintech/pen/WXKvzX

      posted in Visualisierung
      V
      Vippis
    • RE: "On" Subscripton: Funktionsaufruf mit Parameter

      Ich hab mir unter https://developer.husqvarnagroup.cloud einen frischen API Key erzeugt und bekomme jetzt keinen error 429 mehr

      posted in JavaScript
      V
      Vippis

    Latest posts made by Vippis

    • RE: CSV Datei über VIS downloaden

      @vippis

      Man muss halt das Node FS Modul nehmen 🙂

      posted in Skripten / Logik
      V
      Vippis
    • RE: CSV Datei über VIS downloaden

      @mickym

      Ah super danke für die Info.

      In der Doku steht:

      The file that looks like '/subfolder/file.txt' will be stored under "/javascript/subfolder/file.txt" and can be accessed over web server with "http://ip:8082/javascript/subfolder/file.txt"

      const fs = require('node:fs');
      writeFile(null, '/subfolder/file.txt', data, (error) => {
          log('file written');
      });
      
      
      posted in Skripten / Logik
      V
      Vippis
    • RE: Skript im VIS-2 Editor funktioniert nur im Editor

      @vippis

      Ich löse einmal auf. All Credits to ChatGPT 😁

      Damit sich das Dropdown Menü wie gewünscht auch in der Runtime Umgebung öffent, musste ich den Code in das HTML Widget in den Script Tag aufnehmen.

      Zusätzlich bestand dann das Problem, dass alle Checkbox Labels als "$undefined:$undefined" angezeigt wurden.

      Das Problem liegt daran, dass mein Browser Firefox anscheinend keine Template Strings im Code unterstützt.

      Ich musste die Variablen dann auf einfache String-Verkettung umstellen, dann funktioniert es.

      const checkboxId = "checkbox-" + bucket + "-" + measurement;
      label.textContent = bucket + ": " + measurement;
      

      Hier das vollständige, lauffähige HTML Widget, falls jemand etwas vergleichbares aufbauen möchte:

      <div id="dropdown-container">
          <!-- Button zum Öffnen des Dropdowns -->
          <button id="dropdown-toggle" class="btn_grafana_style">Messwerte auswählen ▼</button>
          
          <!-- Das Dropdown-Menü, das die Checkboxen enthält -->
          <div id="dropdown-menu" style="display: none; max-height: 70vh; overflow-y: auto; position: absolute; background-color: white; border: 1px solid #ccc; padding: 10px; margin-top: 5px;">
              <!-- Dynamische Inhalte der Checkboxen werden hier eingefügt -->
          </div>
      </div>
      <script>
          // IDs der Datenpunkte
      const sourceDataPoint = "0_userdata.0.Export.Verfügbare_Messwerte"; // JSON mit Messwerten
      const targetDataPoint = "0_userdata.0.Export.Ausgewählte_Messwerte"; // Array für ausgewählte Messwerte
      
      // Dropdown-Elemente
      const dropdownToggle = document.getElementById("dropdown-toggle");
      const dropdownMenu = document.getElementById("dropdown-menu");
      
      // Funktion: Dropdown anzeigen/verstecken
      dropdownToggle.addEventListener("click", (event) => {
          event.stopPropagation(); // Verhindert, dass der Klick das Schließen triggert
          dropdownMenu.style.display = dropdownMenu.style.display === "none" ? "block" : "none";
      });
      
      // Funktion: Schließt das Dropdown, wenn man außerhalb klickt
      document.addEventListener("click", (event) => {
          if (!dropdownMenu.contains(event.target) && event.target !== dropdownToggle) {
              dropdownMenu.style.display = "none";
          }
      });
      
      // Funktion: Verfügbare Messwerte laden und Checkboxen generieren
      function loadMeasurements() {
          vis.conn.getStates(sourceDataPoint, (err, state) => {
              if (err || !state[sourceDataPoint] || !state[sourceDataPoint].val) {
                  console.error("Fehler beim Laden der Messwerte:", err || "Keine Daten gefunden");
                  return;
              }
      
              // JSON-Daten parsen
              const data = JSON.parse(state[sourceDataPoint].val);
              
      
              // Dropdown leeren
              dropdownMenu.innerHTML = "";
      
              // Checkboxen für alle Messwerte generieren
              data.forEach((item) => {
                  const bucket = item.bucket;
                  item.measurements.forEach((measurement) => {
                      const checkboxId = "checkbox-" + bucket + "-" + measurement;
                      const checkboxContainer = document.createElement("div");
                      checkboxContainer.style.marginBottom = "5px";
      
                      const checkbox = document.createElement("input");
                      checkbox.type = "checkbox";
                      checkbox.id = checkboxId;
                      checkbox.dataset.bucket = bucket;
                      checkbox.dataset.measurement = measurement;
      
                      const label = document.createElement("label");
                      label.htmlFor = checkboxId;
                      label.textContent = bucket + ": " + measurement;
      
                      checkboxContainer.appendChild(checkbox);
                      checkboxContainer.appendChild(label);
                      dropdownMenu.appendChild(checkboxContainer);
                  });
              });
              
              // Event-Listener für Änderungen an den Checkboxen hinzufügen
              Array.from(dropdownMenu.querySelectorAll("input[type='checkbox']")).forEach((checkbox) => {
                  checkbox.addEventListener("change", saveSelection);
              });
          });
      }
      
      // Funktion: Auswahl speichern
      function saveSelection() {
          const selectedMeasurements = [];
      
          // Alle ausgewählten Checkboxen sammeln
          Array.from(dropdownMenu.querySelectorAll("input[type='checkbox']:checked")).forEach((checkbox) => {
              selectedMeasurements.push({
                  bucket: checkbox.dataset.bucket,
                  measurement: checkbox.dataset.measurement
              });
          });
      
          // Auswahl als JSON-String in den Ziel-Datenpunkt speichern
          vis.setValue(targetDataPoint, JSON.stringify(selectedMeasurements));
      }
      
      // Messwerte beim Start laden
      loadMeasurements();
      
      // Falls sich die verfügbaren Messwerte ändern, neu laden
      vis.conn.subscribe(sourceDataPoint, (id, state) => {
          if (id === sourceDataPoint && state) {
              loadMeasurements();
          }
      });
      
      </script>
      
      
      posted in Skripten / Logik
      V
      Vippis
    • RE: Skript im VIS-2 Editor funktioniert nur im Editor

      @vippis

      In der Browser Konsole erscheinen auch keine Fehlermeldungen. Anscheinend wird das Skript gar nicht geladen

      posted in Skripten / Logik
      V
      Vippis
    • Skript im VIS-2 Editor funktioniert nur im Editor

      Hallo liebe Community,

      ich möchte mit einem HTML Widget ein interaktives Dropdown Menü erstellen, wo der Nutzer einzelne Messwerte auswählen kann und die Auswahl in einem Datenpunkt gespeichert wird. Anschließend soll er auf "Auswerten" klicken können, dann werden die gewählten Messdaten aus der InfluxDB im gewählten Zeitraum gefischt und in einer CSV zum Download bereitgestellt.

      Die verfügbaren Messwerte liegen auch in einem Datenpunkt, die zuvor ein Crawler Skript erstellt hat.

      Mein Problem ist jetzt, dass der Javascript Code, der das Dropdown-Menü befüllen soll, nur im Editor der VIS-2 funktioniert im Runtime Modus, aber nicht im Browser (Firefox und Chrome geht beides nicht, sowie die IOBroker App auf iOS auch nicht).

      Woran kann das liegen?

      HTML-Widget:

      <div id="dropdown-container" style="position: relative; display: inline-block; width: 200px;">
          <!-- Button für das Dropdown -->
          <div id="dropdown-toggle" class="btn_grafana_style" style="position: relative; display: flex; align-items: center; justify-content: space-between; padding: 10px; cursor: pointer;">
              <span>Messwerte auswählen</span>
              <!-- Pfeil-Symbol -->
              <span id="dropdown-arrow" style="margin-left: 10px; font-size: 12px;">▼</span>
          </div>
      
          <!-- Dropdown-Menü -->
          <div id="dropdown-menu" style="position: absolute; top: 100%; left: 0; width: 100%; background-color: white; border: 1px solid #ccc; padding: 10px; z-index: 1000; max-height: 300px; overflow-y: auto; display: none;">
              <!-- Hier werden die Checkboxen dynamisch hinzugefügt -->
          </div>
      </div>
      
      

      Javascript Code im Bereich "Skripte" im VIS Editor:

      // IDs der Datenpunkte
      const sourceDataPoint = "0_userdata.0.Export.Verfügbare_Messwerte"; // JSON mit Messwerten
      const targetDataPoint = "0_userdata.0.Export.Ausgewählte_Messwerte"; // Array für ausgewählte Messwerte
      
      // Dropdown-Elemente
      const dropdownToggle = document.getElementById("dropdown-toggle");
      const dropdownMenu = document.getElementById("dropdown-menu");
      
      // Funktion: Dropdown anzeigen/verstecken
      dropdownToggle.addEventListener("click", (event) => {
          event.stopPropagation(); // Verhindert, dass der Klick das Schließen triggert
          dropdownMenu.style.display = dropdownMenu.style.display === "none" ? "block" : "none";
      });
      
      // Funktion: Schließt das Dropdown, wenn man außerhalb klickt
      document.addEventListener("click", (event) => {
          if (!dropdownMenu.contains(event.target) && event.target !== dropdownToggle) {
              dropdownMenu.style.display = "none";
          }
      });
      
      // Funktion: Verfügbare Messwerte laden und Checkboxen generieren
      function loadMeasurements() {
          vis.conn.getStates(sourceDataPoint, (err, state) => {
              if (err || !state[sourceDataPoint] || !state[sourceDataPoint].val) {
                  console.error("Fehler beim Laden der Messwerte:", err || "Keine Daten gefunden");
                  return;
              }
      
              // JSON-Daten parsen
              const data = JSON.parse(state[sourceDataPoint].val);
      
              // Dropdown leeren
              dropdownMenu.innerHTML = "";
      
              // Checkboxen für alle Messwerte generieren
              data.forEach((item) => {
                  const bucket = item.bucket;
                  item.measurements.forEach((measurement) => {
                      const checkboxId = `checkbox-${bucket}-${measurement}`;
                      const checkboxContainer = document.createElement("div");
                      checkboxContainer.style.marginBottom = "5px";
      
                      const checkbox = document.createElement("input");
                      checkbox.type = "checkbox";
                      checkbox.id = checkboxId;
                      checkbox.dataset.bucket = bucket;
                      checkbox.dataset.measurement = measurement;
      
                      const label = document.createElement("label");
                      label.htmlFor = checkboxId;
                      label.textContent = `${bucket}: ${measurement}`;
      
                      checkboxContainer.appendChild(checkbox);
                      checkboxContainer.appendChild(label);
                      dropdownMenu.appendChild(checkboxContainer);
                  });
              });
      
              // Event-Listener für Änderungen an den Checkboxen hinzufügen
              Array.from(dropdownMenu.querySelectorAll("input[type='checkbox']")).forEach((checkbox) => {
                  checkbox.addEventListener("change", saveSelection);
              });
          });
      }
      
      // Funktion: Auswahl speichern
      function saveSelection() {
          const selectedMeasurements = [];
      
          // Alle ausgewählten Checkboxen sammeln
          Array.from(dropdownMenu.querySelectorAll("input[type='checkbox']:checked")).forEach((checkbox) => {
              selectedMeasurements.push({
                  bucket: checkbox.dataset.bucket,
                  measurement: checkbox.dataset.measurement
              });
          });
      
          // Auswahl als JSON-String in den Ziel-Datenpunkt speichern
          vis.setValue(targetDataPoint, JSON.stringify(selectedMeasurements));
      }
      
      // Messwerte beim Start laden
      loadMeasurements();
      
      // Falls sich die verfügbaren Messwerte ändern, neu laden
      vis.conn.subscribe(sourceDataPoint, (id, state) => {
          if (id === sourceDataPoint && state) {
              loadMeasurements();
          }
      });
      
      

      Screenshot Dropdown Menü:

      4631b20a-d5fb-4f0a-8695-f9e670fff3aa-grafik.png

      Wie gesagt im Runtime Modus innerhalb des VIS-Editors funktioniert es einwandfrei, inkl. Speichern der ausgewählten Messwerte.

      Ich nutze VIS-2 2.9.64

      posted in Skripten / Logik
      V
      Vippis
    • RE: CSV Datei über VIS downloaden

      Ich antworte mal selbst:

      Ich lasse die CSV per Javascript im Verzeichnis /home/iobroker/export erstellen.

      In dem Verzeichnis lasse ich einen Python HTTP Server laufen

      python3 -m http.server 8083
      

      Das ganze kann man noch mit systemd als Service erstellen, damit der HTTP-Server auch beim Neustart läuft.

      Dazu ein .sh Script z.B. im Admin Verzeichnis erstellen:

      nano /home/admin/start_http_server.sh
      
      #!/bin/bash
      cd /home/iobroker/export
      python3 -m http.server 8083
      

      Skript ausführbar machen:

      chmod +x /home/admin/start_http_server.sh
      

      Service Datei erstellen:

      sudo nano /etc/systemd/system/httpserver.service
      
      [Unit]
      Description=Python HTTP Server
      After=network.target
      
      [Service]
      ExecStart=/home/admin/start_http_server.sh
      WorkingDirectory=/home/iobroker/export
      StandardOutput=inherit
      StandardError=inherit
      Restart=always
      User=admin
      
      [Install]
      WantedBy=multi-user.target
      

      Systemd neu laden:

      sudo systemctl daemon-reload
      

      Status prüfen:

      sudo systemctl status httpserver.service
      
      posted in Skripten / Logik
      V
      Vippis
    • CSV Datei über VIS downloaden

      Hallo liebe Community,

      ich möchte per Javascript aus einer Benutzer-Auswahl von Messdaten aus meiner InfluxDB eine CSV Datei erstellen, die sich der User über die VIS-2 downloaden kann.

      Leider kann ich in den Pfad /opt/iobroker/iobroker-data/files/0_userdata.0 nicht schreiben.

      Ich bekomme immer:

      javascript.0	09:06:18.671	error	script.js.common.Export.Auswerten: Error: Permission denied
      javascript.0	09:06:18.671	error	at create_csv (script.js.common.Export.Auswerten:58:8)
      

      Gibt es einen alternativen Pfad, der auch vom Web-Server erreichbar ist?

      posted in Skripten / Logik
      V
      Vippis
    • RE: Hohe Speicherauslastung IOBroker auf Raspberry Pi 5 8GB

      Die hohe RAM-Auslastung von python3 wird von Homeassistant verursacht.

      Nach dem Beenden liegt die Auslastung nur noch bei 5GB.

      Ich werde also überlegen ob ich Homeassistant (benutze ich nur als Erfüllungsgehilfe zur Steuerung meiner Dreame Saugroboter aus IOBroker) auf einem separaten PI laufen lasse oder ganz weglasse...

      posted in Error/Bug
      V
      Vippis
    • Hohe Speicherauslastung IOBroker auf Raspberry Pi 5 8GB

      Guten Tag liebe Community,

      ich habe eine merkwürdige sehr hohe Speicherauslastung auf meinem Pi5-8GB festgestellt.

      Auf dem Pi laufen:

      • Iobroker JS Controller 6.0.11, Node.js 18.20.4, NPM 10.7.0

      • Grafana 11.1.3

      • Influx 2.7.9

      • Docker 5.27.3.1 mit Homeassistent Container und einem kleinen Python Programm zur Steuerung meiner Pool-Wärmepumpe (alsavoctrl)

      Speicherauslastung: 82% über GUI, freier Speicher ca. 100-300MB vom RAM, 700MB vom SWAP file.

      Also wirklich hoch ...

      Mir fällt aber ein Python3 Programm auf mit ca. 3,6GB RAM Auslastung, siehe Screenshot.

      Wie kann ich herausfinden was das Programm ist???

      Screenshot von top:
      Screenshot 2024-09-29 083606.png

      ======================= SUMMARY =======================
                              v.2024-08-12
      
      
       Static hostname: iobroker
             Icon name: computer
      Operating System: Debian GNU/Linux 12 (bookworm)
                Kernel: Linux 6.6.31+rpt-rpi-2712
          Architecture: arm64
      
      Installation:           native
      Kernel:                 aarch64
      Userland:               64 bit
      Timezone:               Europe/Berlin (CEST, +0200)
      User-ID:                1000
      Display-Server:         false
      Boot Target:            multi-user.target
      
      Pending OS-Updates:     56
      Pending iob updates:    6
      
      Nodejs-Installation:
      /usr/bin/nodejs         v18.20.4
      /usr/bin/node           v18.20.4
      /usr/bin/npm            10.7.0
      /usr/bin/npx            10.7.0
      /usr/bin/corepack       0.28.0
      
      Recommended versions are nodejs 20.17.0 and npm 10.8.2
      Your nodejs installation is correct
      
      MEMORY:
                     total        used        free      shared  buff/cache   available
      Mem:            8.4G        6.2G        300M        5.8M        2.0G        2.2G
      Swap:           2.1G        2.1G         81K
      Total:           10G        8.3G        300M
      
      Active iob-Instances:   28
      Upgrade policy: none
      
      ioBroker Core:          js-controller           6.0.11
                              admin                   7.0.23
      
      ioBroker Status:        iobroker is running on this host.
      
      
      Objects type: jsonl
      States  type: jsonl
      
      Status admin and web instance:
      + system.adapter.admin.0                  : admin                 : iobroker                                 -  enabled, port: 8081, bind: 0.0.0.0 (SSL), run as: admin
      + system.adapter.web.0                    : web                   : iobroker                                 -  enabled, port: 8082, bind: 0.0.0.0, run as: admin
      
      Objects:                17033
      States:                 14140
      
      Size of iob-Database:
      
      29M     /opt/iobroker/iobroker-data/objects.jsonl
      29M     /opt/iobroker/iobroker-data/states.jsonl
      
      
      
      =================== END OF SUMMARY ====================
      
      posted in Error/Bug
      V
      Vippis
    • IOBroker VIS-2 Push Notifications in der VIS

      Hallo Community,
      gibt es eine Möglichkeit Push-Notifications direkt in der VIS darzustellen?

      Ich habe diese Möglichkeit als VIS-Command gefunden, aber das ist nicht was ich suche. Das erzeugt eine Meldung, die den kompletten Screen einnimmt. Ich möchte eher kleine Kacheln am Rand.

      setState('vis-2.0.control.command', { instance: '*', command: 'alert', data: "Test;;info"});
      

      Vom Verhalten wie @Scrounger Material Design Widgets für die VIS-1 in etwa:
      5845a70f-ba9b-40bd-ab3f-bac9cc8f9b50-grafik.png

      posted in Visualisierung
      V
      Vippis
    Community
    Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
    The ioBroker Community 2014-2023
    logo