Skip to content
  • Recent
  • Tags
  • 0 Unread 0
  • Categories
  • Unreplied
  • Popular
  • 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

  • Default (No Skin)
  • No Skin
Collapse
Logo
  1. ioBroker Community Home
  2. Deutsch
  3. Praktische Anwendungen (Showcase)
  4. E-INK Display OpenEPaperLink - Displayanzeige mit Batterie

NEWS

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

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

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

E-INK Display OpenEPaperLink - Displayanzeige mit Batterie

Scheduled Pinned Locked Moved Praktische Anwendungen (Showcase)
1.0k Posts 47 Posters 343.0k Views 50 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • EisbaeeerE Eisbaeeer

    @diwoma Solange der Grafana eine Webseite macht, geht das genauso. Mit Chrome Headless einen screenshot machen und als Bild auf den Tag laden.

    chrome --headless --disable-gpu --screenshot https://meine-grafana-seite.html
    

    Für rpi und andere gibt es auch das Paket puppeteer.

    B Offline
    B Offline
    Beowolf
    wrote on last edited by
    #678

    @eisbaeeer

    Ich mache ja alle anderen Darstellungen mit VIS und dann weiter mit puppeteer.

    Nur wenn ich eine Darstellung von Grafana in VIS einbinde wir es auf den Displays nicht angezeigt.

    Allerding sind die Grafana-Sachen auch etwas farbig. Event. liegt es daran.

    Die Natur braucht nicht unseren Schutz, sie braucht unsere Abwesenheit.

    D 1 Reply Last reply
    1
    • B Beowolf

      @eisbaeeer

      Ich mache ja alle anderen Darstellungen mit VIS und dann weiter mit puppeteer.

      Nur wenn ich eine Darstellung von Grafana in VIS einbinde wir es auf den Displays nicht angezeigt.

      Allerding sind die Grafana-Sachen auch etwas farbig. Event. liegt es daran.

      D Offline
      D Offline
      diwoma
      wrote on last edited by
      #679

      @beowolf
      Ich glaube, Grafana kannst Du nur direkt von grafana holen, so wie es @Eisbaeeer geschrieben hat.
      Mit einem iFrame in die Vis eingebunden geht es wahrscheinlich nicht.

      -- diwoma

      ioBroker in LX-Container in Proxmox
      Zigbee-Coordinator: CC2652P2-TCP FW: 20230507

      1 Reply Last reply
      0
      • B Offline
        B Offline
        Beowolf
        wrote on last edited by
        #680

        Es scheint so. Mit einem iFrame geht es nicht.

        Die Natur braucht nicht unseren Schutz, sie braucht unsere Abwesenheit.

        1 Reply Last reply
        0
        • B Offline
          B Offline
          Beowolf
          wrote on last edited by Beowolf
          #681

          Ich habe ab chatgpt wieder ein wenig gequält.

          Es geht um die Abfrage der Buttons bei den schwarzen Displays.

          Diese meine ich

          https://github.com/OpenEPaperLink/OpenEPaperLink/wiki/2.9″-EL029H3WRA

          Hier das Skript

          // HIER DIE IP ADRESSE VOM OEPL ACCESS POINT EINTRAGEN
          const serverIP = '192.168.49.185';  // z.B. 192.168.1.71
          
          
          //Im Skript müssen noch zwei weiter Einträge event. der eigenen Umgebung angepasst werden
          // Zeile 17  -  "Datenpunkt zur Steuerung des Skripts"
          // Zeile 21  -  "Datenordner der empfangenen TAGs"
          // Zeile 176 -  "Diesen Eintrag auch noch entsprechend der eigenen Umgebung anpassen"
          
          // AB HIER NICHTS MEHR ÄNDERN!
          const WebSocket = require('ws');
          const http = require('http');
          const wsUrl = `ws://${serverIP}/ws`;  // WebSocket-URL
          
          let ws;
          let pingInterval;
          let scriptStopping = false;  // Flag, um zu prüfen, ob das Skript gestoppt wird
          
          const controlState = '0_userdata.0.Tag_Buttons.Button_Skript_Steuerung.Button_Tags_Erdgeschoss';  // Datenpunkt zur Steuerung des Skripts
          
          function ensureOpenEPaperLinkFolderExists(callback) {
              const OpenEPaperLinkFolderPath = '0_userdata.0.Tag_Buttons.Erdgeschoss'; // Datenordner der empfangenen TAGs
              getObject(OpenEPaperLinkFolderPath, (err, obj) => {
                  if (err || !obj) {
                      setObject(OpenEPaperLinkFolderPath, {
                          type: 'channel',
                          common: { name: 'Open E-Paper Link' },
                          native: {}
                      }, callback);
                  } else {
                      callback();
                  }
              });
          }
          
          function ensureChannelExists(path, alias, callback) {
              getObject(path, (err, obj) => {
                  if (err || !obj) {
                      setObject(path, {
                          type: 'channel',
                          common: { name: alias || 'Unbekanntes Gerät' },
                          native: {}
                      }, callback);
                  } else if (obj.common.name !== alias) {
                      extendObject(path, { common: { name: alias } }, callback);
                  } else {
                      callback();
                  }
              });
          }
          
          function createStateAndSet(statePath, value) {
              setObject(statePath, {
                  type: 'state',
                  common: {
                      name: statePath.split('.').pop(),
                      type: 'string',
                      role: 'value',
                      read: true,
                      write: true
                  },
                  native: {}
              }, (err) => {
                  if (!err) {
                      setState(statePath, String(value), true);
                  }
              });
          }
          
          function updateStateIfChanged(statePath, value) {
              getState(statePath, (err, state) => {
                  if (err || !state) {
                      createStateAndSet(statePath, String(value));
                  } else if (state.val !== String(value)) {
                      setState(statePath, String(value), true);
                  }
              });
          }
          
          function fetchDimensions(hwType, callback) {
              const hwTypeHex = hwType.toString(16).padStart(2, '0').toUpperCase();  // Convert hwType to two-digit uppercase hexadecimal
              const url = `http://${serverIP}/tagtypes/${hwTypeHex}.json`;
              http.get(url, (res) => {
                  let data = '';
                  res.on('data', (chunk) => data += chunk);
                  res.on('end', () => {
                      if (res.statusCode === 200) {
                          try {
                              const dimensions = JSON.parse(data);
                              callback(null, dimensions);
                          } catch (e) {
                              callback(`Error parsing JSON from ${url}: ${e}`);
                          }
                      } else {
                          callback(`HTTP Error ${res.statusCode} from ${url}`);
                      }
                  });
              }).on('error', (err) => {
                  callback(`Error fetching ${url}: ${err.message}`);
              });
          }
          
          function handleHWType(basePath, hwType) {
              createStateAndSet(`${basePath}.hwType`, String(hwType));  // Save hwType as a state
              fetchDimensions(hwType, (err, dimensions) => {
                  if (!err && dimensions) {
                      createStateAndSet(`${basePath}.height`, String(dimensions.height));
                      createStateAndSet(`${basePath}.width`, String(dimensions.width));
                      createStateAndSet(`${basePath}.name`, String(dimensions.name));
                      if (dimensions.colors) {
                          createStateAndSet(`${basePath}.colors`, String(dimensions.colors));
                      }
                      if (dimensions.colortable) {
                          createStateAndSet(`${basePath}.colortable`, JSON.stringify(dimensions.colortable));
                      }
                  } else {
                      console.error(`Failed to fetch or set dimensions for hwType ${hwType}: ${err}`);
                  }
              });
          }
          
          function connectWebSocket() {
              if (scriptStopping) {
                  return;  // Wenn das Skript gestoppt wird, keine Verbindung mehr herstellen
              }
          
              ws = new WebSocket(wsUrl);
              ws.on('open', function open() {
                  console.log('Verbunden mit WebSocket');
                  startHeartbeat();
              });
          
              ws.on('message', function incoming(data) {
                  console.log('Daten empfangen:', data);
                  if (data) {
                      try {
                          let parsedData = JSON.parse(data);
                          console.log('Verarbeitete Daten:', JSON.stringify(parsedData, null, 2));
                          handleData(parsedData);
                      } catch (err) {
                          console.error('Fehler bei der Verarbeitung der Daten:', err);
                      }
                  } else {
                      console.log('Keine Daten oder leere Nachricht empfangen');
                  }
              });
          
              ws.on('close', function close() {
                  if (!scriptStopping) {
                      console.log('WebSocket-Verbindung geschlossen, versuche neu zu verbinden...');
                      clearInterval(pingInterval);
                      setTimeout(connectWebSocket, 5000);
                  }
              });
          
              ws.on('error', function error(err) {
                  console.error('WebSocket-Fehler:', err);
              });
          }
          
          function startHeartbeat() {
              pingInterval = setInterval(() => {
                  if (ws.readyState === WebSocket.OPEN) {
                      ws.ping(() => console.log('Ping sent'));
                  }
              }, 10000); // Send ping every 10 seconds
          
              ws.on('pong', () => {
                  console.log('Pong received');
              });
          }
          
          function handleData(parsedData) {
              if (parsedData.tags && Array.isArray(parsedData.tags)) {
                  parsedData.tags.forEach(tag => {
                      let basePath = `0_userdata.0.Tag_Buttons.Erdgeschoss.${tag.mac.replace(/:/g, '')}`;  //Diesen Eintrag auch noch entsprechend der eigenen Umgebung anpassen
                      ensureChannelExists(basePath, tag.alias, () => {
                          Object.keys(tag).forEach(key => {
                              let statePath = `${basePath}.${key}`;
                              let value = tag[key];
                              updateStateIfChanged(statePath, value);
                              if (key === 'hwType') {
                                  handleHWType(basePath, tag.hwType);
                              }
                          });
                      });
                  });
              }
          }
          
          function disconnectWebSocket() {
              if (ws) {
                  ws.close();
                  ws = null;
              }
              clearInterval(pingInterval);
          }
          
          // Skript-Start und -Stopp basierend auf einem Datenpunkt steuern
          function setupScriptControl() {
              setObject(controlState, {
                  type: 'state',
                  common: {
                      name: 'EPaper Script Control',
                      type: 'boolean',
                      role: 'switch',
                      read: true,
                      write: true,
                      def: false
                  },
                  native: {}
              });
          
              on({id: controlState, change: 'ne'}, (obj) => {
                  const state = obj.state.val;
                  if (state) {
                      // Skript starten
                      scriptStopping = false;
                      ensureOpenEPaperLinkFolderExists(connectWebSocket);
                  } else {
                      // Skript stoppen
                      scriptStopping = true;
                      disconnectWebSocket();
                      console.log('Skript beendet durch Steuer-Datenpunkt');
                  }
              });
          }
          
          // Initiale Einrichtung
          setupScriptControl();
          

          Jetzt kann das Skript durch Setzen des Datenpunkts 0_userdata.0.ScriptControl.EPaperScript auf true oder false gestartet und gestoppt werden.

          Bei mir funktioniert es.

          Bitte die Einstellung im Skript beachten !!!

          Die Fehlermeldungen bei dem ersten Durchlauf sind wohl normal.

          Die Natur braucht nicht unseren Schutz, sie braucht unsere Abwesenheit.

          EisbaeeerE B 2 Replies Last reply
          1
          • B Beowolf

            Ich habe ab chatgpt wieder ein wenig gequält.

            Es geht um die Abfrage der Buttons bei den schwarzen Displays.

            Diese meine ich

            https://github.com/OpenEPaperLink/OpenEPaperLink/wiki/2.9″-EL029H3WRA

            Hier das Skript

            // HIER DIE IP ADRESSE VOM OEPL ACCESS POINT EINTRAGEN
            const serverIP = '192.168.49.185';  // z.B. 192.168.1.71
            
            
            //Im Skript müssen noch zwei weiter Einträge event. der eigenen Umgebung angepasst werden
            // Zeile 17  -  "Datenpunkt zur Steuerung des Skripts"
            // Zeile 21  -  "Datenordner der empfangenen TAGs"
            // Zeile 176 -  "Diesen Eintrag auch noch entsprechend der eigenen Umgebung anpassen"
            
            // AB HIER NICHTS MEHR ÄNDERN!
            const WebSocket = require('ws');
            const http = require('http');
            const wsUrl = `ws://${serverIP}/ws`;  // WebSocket-URL
            
            let ws;
            let pingInterval;
            let scriptStopping = false;  // Flag, um zu prüfen, ob das Skript gestoppt wird
            
            const controlState = '0_userdata.0.Tag_Buttons.Button_Skript_Steuerung.Button_Tags_Erdgeschoss';  // Datenpunkt zur Steuerung des Skripts
            
            function ensureOpenEPaperLinkFolderExists(callback) {
                const OpenEPaperLinkFolderPath = '0_userdata.0.Tag_Buttons.Erdgeschoss'; // Datenordner der empfangenen TAGs
                getObject(OpenEPaperLinkFolderPath, (err, obj) => {
                    if (err || !obj) {
                        setObject(OpenEPaperLinkFolderPath, {
                            type: 'channel',
                            common: { name: 'Open E-Paper Link' },
                            native: {}
                        }, callback);
                    } else {
                        callback();
                    }
                });
            }
            
            function ensureChannelExists(path, alias, callback) {
                getObject(path, (err, obj) => {
                    if (err || !obj) {
                        setObject(path, {
                            type: 'channel',
                            common: { name: alias || 'Unbekanntes Gerät' },
                            native: {}
                        }, callback);
                    } else if (obj.common.name !== alias) {
                        extendObject(path, { common: { name: alias } }, callback);
                    } else {
                        callback();
                    }
                });
            }
            
            function createStateAndSet(statePath, value) {
                setObject(statePath, {
                    type: 'state',
                    common: {
                        name: statePath.split('.').pop(),
                        type: 'string',
                        role: 'value',
                        read: true,
                        write: true
                    },
                    native: {}
                }, (err) => {
                    if (!err) {
                        setState(statePath, String(value), true);
                    }
                });
            }
            
            function updateStateIfChanged(statePath, value) {
                getState(statePath, (err, state) => {
                    if (err || !state) {
                        createStateAndSet(statePath, String(value));
                    } else if (state.val !== String(value)) {
                        setState(statePath, String(value), true);
                    }
                });
            }
            
            function fetchDimensions(hwType, callback) {
                const hwTypeHex = hwType.toString(16).padStart(2, '0').toUpperCase();  // Convert hwType to two-digit uppercase hexadecimal
                const url = `http://${serverIP}/tagtypes/${hwTypeHex}.json`;
                http.get(url, (res) => {
                    let data = '';
                    res.on('data', (chunk) => data += chunk);
                    res.on('end', () => {
                        if (res.statusCode === 200) {
                            try {
                                const dimensions = JSON.parse(data);
                                callback(null, dimensions);
                            } catch (e) {
                                callback(`Error parsing JSON from ${url}: ${e}`);
                            }
                        } else {
                            callback(`HTTP Error ${res.statusCode} from ${url}`);
                        }
                    });
                }).on('error', (err) => {
                    callback(`Error fetching ${url}: ${err.message}`);
                });
            }
            
            function handleHWType(basePath, hwType) {
                createStateAndSet(`${basePath}.hwType`, String(hwType));  // Save hwType as a state
                fetchDimensions(hwType, (err, dimensions) => {
                    if (!err && dimensions) {
                        createStateAndSet(`${basePath}.height`, String(dimensions.height));
                        createStateAndSet(`${basePath}.width`, String(dimensions.width));
                        createStateAndSet(`${basePath}.name`, String(dimensions.name));
                        if (dimensions.colors) {
                            createStateAndSet(`${basePath}.colors`, String(dimensions.colors));
                        }
                        if (dimensions.colortable) {
                            createStateAndSet(`${basePath}.colortable`, JSON.stringify(dimensions.colortable));
                        }
                    } else {
                        console.error(`Failed to fetch or set dimensions for hwType ${hwType}: ${err}`);
                    }
                });
            }
            
            function connectWebSocket() {
                if (scriptStopping) {
                    return;  // Wenn das Skript gestoppt wird, keine Verbindung mehr herstellen
                }
            
                ws = new WebSocket(wsUrl);
                ws.on('open', function open() {
                    console.log('Verbunden mit WebSocket');
                    startHeartbeat();
                });
            
                ws.on('message', function incoming(data) {
                    console.log('Daten empfangen:', data);
                    if (data) {
                        try {
                            let parsedData = JSON.parse(data);
                            console.log('Verarbeitete Daten:', JSON.stringify(parsedData, null, 2));
                            handleData(parsedData);
                        } catch (err) {
                            console.error('Fehler bei der Verarbeitung der Daten:', err);
                        }
                    } else {
                        console.log('Keine Daten oder leere Nachricht empfangen');
                    }
                });
            
                ws.on('close', function close() {
                    if (!scriptStopping) {
                        console.log('WebSocket-Verbindung geschlossen, versuche neu zu verbinden...');
                        clearInterval(pingInterval);
                        setTimeout(connectWebSocket, 5000);
                    }
                });
            
                ws.on('error', function error(err) {
                    console.error('WebSocket-Fehler:', err);
                });
            }
            
            function startHeartbeat() {
                pingInterval = setInterval(() => {
                    if (ws.readyState === WebSocket.OPEN) {
                        ws.ping(() => console.log('Ping sent'));
                    }
                }, 10000); // Send ping every 10 seconds
            
                ws.on('pong', () => {
                    console.log('Pong received');
                });
            }
            
            function handleData(parsedData) {
                if (parsedData.tags && Array.isArray(parsedData.tags)) {
                    parsedData.tags.forEach(tag => {
                        let basePath = `0_userdata.0.Tag_Buttons.Erdgeschoss.${tag.mac.replace(/:/g, '')}`;  //Diesen Eintrag auch noch entsprechend der eigenen Umgebung anpassen
                        ensureChannelExists(basePath, tag.alias, () => {
                            Object.keys(tag).forEach(key => {
                                let statePath = `${basePath}.${key}`;
                                let value = tag[key];
                                updateStateIfChanged(statePath, value);
                                if (key === 'hwType') {
                                    handleHWType(basePath, tag.hwType);
                                }
                            });
                        });
                    });
                }
            }
            
            function disconnectWebSocket() {
                if (ws) {
                    ws.close();
                    ws = null;
                }
                clearInterval(pingInterval);
            }
            
            // Skript-Start und -Stopp basierend auf einem Datenpunkt steuern
            function setupScriptControl() {
                setObject(controlState, {
                    type: 'state',
                    common: {
                        name: 'EPaper Script Control',
                        type: 'boolean',
                        role: 'switch',
                        read: true,
                        write: true,
                        def: false
                    },
                    native: {}
                });
            
                on({id: controlState, change: 'ne'}, (obj) => {
                    const state = obj.state.val;
                    if (state) {
                        // Skript starten
                        scriptStopping = false;
                        ensureOpenEPaperLinkFolderExists(connectWebSocket);
                    } else {
                        // Skript stoppen
                        scriptStopping = true;
                        disconnectWebSocket();
                        console.log('Skript beendet durch Steuer-Datenpunkt');
                    }
                });
            }
            
            // Initiale Einrichtung
            setupScriptControl();
            

            Jetzt kann das Skript durch Setzen des Datenpunkts 0_userdata.0.ScriptControl.EPaperScript auf true oder false gestartet und gestoppt werden.

            Bei mir funktioniert es.

            Bitte die Einstellung im Skript beachten !!!

            Die Fehlermeldungen bei dem ersten Durchlauf sind wohl normal.

            EisbaeeerE Offline
            EisbaeeerE Offline
            Eisbaeeer
            Developer
            wrote on last edited by
            #682

            Hat schon jemand das Blockly zum Screenshotten von request befreit?
            Nach update auf die neuste Version vom Controller wird request nicht mehr akzeptiert.

            Kein support per PM. Bitte im Forum Fragen stellen!

            BananaJoeB B 2 Replies Last reply
            0
            • EisbaeeerE Eisbaeeer

              Hat schon jemand das Blockly zum Screenshotten von request befreit?
              Nach update auf die neuste Version vom Controller wird request nicht mehr akzeptiert.

              BananaJoeB Online
              BananaJoeB Online
              BananaJoe
              Most Active
              wrote on last edited by BananaJoe
              #683

              @eisbaeeer ich hatte es versucht ... aber nicht hinbekommen. Zur Zeit triggere ich playwright alle 3 Minuten an, die Bilder landen in einem Ordner meines Webservers (läuft mit auf dem ioBroker Server auf Port 80) und die Tags stehen auf Image URL

              Dazu habe ich ein Python-Skript hinterlegt das 3 VIS-Seiten besucht und die Screenshots hinterlegt:

              #!/usr/bin/python3
              # -*- coding: utf-8 -*-
              import subprocess
              from playwright.sync_api import sync_playwright, Page, expect
              
              playwright = sync_playwright().start()
              
              #browser = playwright.chromium.launch()
              #browser = playwright.webkit.launch()
              browser = playwright.firefox.launch()
              context = browser.new_context(
                viewport={"width":800, "height":600},
                device_scale_factor=4,
              
              )
              page = context.new_page()
              
              # Schritt 1: Kühlschrank
              page.goto("http://192.168.1.8:60008/vis/index.html?openepaper#Kuehlschrank01")
              expect(page.get_by_text("Kuehlschrank01")).to_be_visible()
              #page.screenshot(path="/var/www/html/openepaper/Kuehlschrank01_4x.jpg",clip={"x":0,"y":0,"width":296,"height":128},quality=100,type="jpeg")
              page.screenshot(path="/var/www/html/openepaper/Kuehlschrank01_4x.png",clip={"x":0,"y":0,"width":296,"height":128},type="png")
              myconvert=subprocess.call(['/usr/bin/convert', '/var/www/html/openepaper/Kuehlschrank01_4x.png', '-sample', '296x128', '-quality', '100', '-sampling-factor', '4:4:4', '-brightness-contrast', '0x99', '/var/www/html/openepaper/Kuehlschrank01.jpg' ])
              
              # Schritt 2: Pylontech
              page.goto("http://192.168.1.8:60008/vis/index.html?openepaper#Pylontech")
              expect(page.get_by_text("Pylontech")).to_be_visible()
              #page.screenshot(path="/var/www/html/openepaper/Pylontech_4x.jpg",clip={"x":0,"y":0,"width":296,"height":128},quality=100,type="jpeg")
              page.screenshot(path="/var/www/html/openepaper/Pylontech_4x.png",clip={"x":0,"y":0,"width":296,"height":128},type="png")
              myconvert=subprocess.call(['/usr/bin/convert', '/var/www/html/openepaper/Pylontech_4x.png', '-sample', '296x128', '-quality', '100', '-sampling-factor', '4:4:4', '-brightness-contrast', '0x99', '/var/www/html/openepaper/Pylontech.jpg' ])
              
              # Schritt 3: Briefkasten
              page.goto("http://192.168.1.8:60008/vis/index.html?openepaper#Briefkasten")
              expect(page.get_by_text("Briefkasten")).to_be_visible()
              #page.screenshot(path="/var/www/html/openepaper/Briefkasten_4x.jpg",clip={"x":0,"y":0,"width":296,"height":128},quality=100,type="jpeg")
              page.screenshot(path="/var/www/html/openepaper/Briefkasten_4x.png",clip={"x":0,"y":0,"width":296,"height":128},type="png")
              myconvert=subprocess.call(['/usr/bin/convert', '/var/www/html/openepaper/Briefkasten_4x.png', '-sample', '296x128', '-quality', '100', '-sampling-factor', '4:4:4', '-brightness-contrast', '0x99', '/var/www/html/openepaper/Briefkasten.jpg' ])
              
              # Schritt 4: Fenster und Türen
              page.goto("http://192.168.1.8:60008/vis/index.html?openepaper#EingangstuerV2")
              expect(page.get_by_text("FensterTueren")).to_be_visible()
              #page.screenshot(path="/var/www/html/openepaper/FensterTueren_4x.jpg",clip={"x":0,"y":0,"width":400,"height":300},quality=100,type="jpeg")
              page.screenshot(path="/var/www/html/openepaper/FensterTueren_4x.png",clip={"x":0,"y":0,"width":400,"height":300},type="png")
              myconvert=subprocess.call(['/usr/bin/convert', '/var/www/html/openepaper/FensterTueren_4x.png', '-sample', '400x300', '-quality', '100', '-sampling-factor', '4:4:4', '-brightness-contrast', '0x99', '/var/www/html/openepaper/FensterTueren.jpg' ])
              
              
              browser.close()
              
              playwright.stop()
              
              

              und das ich per Blockly alle 3 Minuten triggere:
              664810da-ac2c-4098-8cfe-bda12090caa6-image.png

              In dem Skript gibt es Zeilen für alle 3 Browser, Firefox sah bei mir am besten aus. Playwright installiert alle 3 Engines.
              Die Screenshots werden doppelt so groß gefertigt und dann herunterskaliert, dafür muss Imagemagick evenfalls installiert sein (für den Befehl convert)

              ioBroker@Ubuntu 24.04 LTS (VMware) für: >260 Geräte, 5 Switche, 7 AP, 9 IP-Cam, 1 NAS 42TB, 1 ESXi 15TB, 4 Proxmox 1TB, 1 Hyper-V 44TB, 14 x Echo, 5x FireTV, 5 x Tablett/Handy VIS || >=157 Tasmota/Shelly || >=88 ZigBee || PV 8.1kW / Akku 14kWh || 2x USV 900/750W kaskadiert || Creality CR-10 SE 3D-Drucker

              B 1 Reply Last reply
              0
              • EisbaeeerE Eisbaeeer

                Hat schon jemand das Blockly zum Screenshotten von request befreit?
                Nach update auf die neuste Version vom Controller wird request nicht mehr akzeptiert.

                B Offline
                B Offline
                Beowolf
                wrote on last edited by
                #684

                @eisbaeeer sagte in E-INK Display OpenEPaperLink - Displayanzeige mit Batterie:

                Hat schon jemand das Blockly zum Screenshotten von request befreit?
                Nach update auf die neuste Version vom Controller wird request nicht mehr akzeptiert.

                Was ist daran falsch? Oder meinst du ein anderes Skript?

                https://forum.iobroker.net/topic/66380/e-ink-display-openepaperlink-displayanzeige-mit-batterie/586?_=1722257902094

                Grüße

                Die Natur braucht nicht unseren Schutz, sie braucht unsere Abwesenheit.

                EisbaeeerE 1 Reply Last reply
                0
                • B Beowolf

                  @eisbaeeer sagte in E-INK Display OpenEPaperLink - Displayanzeige mit Batterie:

                  Hat schon jemand das Blockly zum Screenshotten von request befreit?
                  Nach update auf die neuste Version vom Controller wird request nicht mehr akzeptiert.

                  Was ist daran falsch? Oder meinst du ein anderes Skript?

                  https://forum.iobroker.net/topic/66380/e-ink-display-openepaperlink-displayanzeige-mit-batterie/586?_=1722257902094

                  Grüße

                  EisbaeeerE Offline
                  EisbaeeerE Offline
                  Eisbaeeer
                  Developer
                  wrote on last edited by
                  #685

                  @beowolf Mit dem neusten js-controller läuft request und somit das Blockly Script nicht mehr.

                  Kein support per PM. Bitte im Forum Fragen stellen!

                  B ? 2 Replies Last reply
                  0
                  • EisbaeeerE Eisbaeeer

                    @beowolf Mit dem neusten js-controller läuft request und somit das Blockly Script nicht mehr.

                    B Offline
                    B Offline
                    Beowolf
                    wrote on last edited by Beowolf
                    #686

                    @eisbaeeer

                    Muß jetzt mal unwissend fragen. Mit js-controller meinst du den javaskript Adapter?

                    Die Natur braucht nicht unseren Schutz, sie braucht unsere Abwesenheit.

                    1 Reply Last reply
                    0
                    • EisbaeeerE Eisbaeeer

                      @beowolf Mit dem neusten js-controller läuft request und somit das Blockly Script nicht mehr.

                      ? Offline
                      ? Offline
                      A Former User
                      wrote on last edited by
                      #687

                      @eisbaeeer

                      hat mit dem js-controller weniger zu tun, nur der Javascript-Adapter unterstuetzt das lange depricated request nicht mehr im Blockly, dafuer gibts ja fuer Blockly httpget und post usw.. also genug alternativen.

                      Einfach mal in der Doku und hier im Forum nachlesen, da gibts auch genug Anleitungen zum umbauen.

                      1 Reply Last reply
                      0
                      • B Offline
                        B Offline
                        Beowolf
                        wrote on last edited by
                        #688

                        Genau für den Fall, weil "request" nicht mehr geht, hatte ich doch das Skript geändert.

                        Hier läuft es ohne Probleme mit der Java-Skriptversion 8.3.1

                        Die Natur braucht nicht unseren Schutz, sie braucht unsere Abwesenheit.

                        EisbaeeerE 1 Reply Last reply
                        1
                        • B Beowolf

                          Genau für den Fall, weil "request" nicht mehr geht, hatte ich doch das Skript geändert.

                          Hier läuft es ohne Probleme mit der Java-Skriptversion 8.3.1

                          EisbaeeerE Offline
                          EisbaeeerE Offline
                          Eisbaeeer
                          Developer
                          wrote on last edited by
                          #689

                          @beowolf sagte in E-INK Display OpenEPaperLink - Displayanzeige mit Batterie:

                          Genau für den Fall, weil "request" nicht mehr geht, hatte ich doch das Skript geändert.

                          Hier läuft es ohne Probleme mit der Java-Skriptversion 8.3.1

                          Top! Einfach ausgetauscht und läuft.
                          Danke!

                          Kein support per PM. Bitte im Forum Fragen stellen!

                          B 1 Reply Last reply
                          0
                          • EisbaeeerE Eisbaeeer

                            @beowolf sagte in E-INK Display OpenEPaperLink - Displayanzeige mit Batterie:

                            Genau für den Fall, weil "request" nicht mehr geht, hatte ich doch das Skript geändert.

                            Hier läuft es ohne Probleme mit der Java-Skriptversion 8.3.1

                            Top! Einfach ausgetauscht und läuft.
                            Danke!

                            B Offline
                            B Offline
                            Beowolf
                            wrote on last edited by
                            #690

                            @eisbaeeer

                            Aber bitte beachten. Ich hatte das Skript durch Chatgpt ändern lassen.

                            Ich habe keine Ahnung ob das "programmiertechnisch" alles so Top in Ordnung ist. 😊

                            Nur weil es funktioniert bedeutet es nicht, das es komplett richtig ist.

                            Die Natur braucht nicht unseren Schutz, sie braucht unsere Abwesenheit.

                            EisbaeeerE 1 Reply Last reply
                            1
                            • B Beowolf

                              @eisbaeeer

                              Aber bitte beachten. Ich hatte das Skript durch Chatgpt ändern lassen.

                              Ich habe keine Ahnung ob das "programmiertechnisch" alles so Top in Ordnung ist. 😊

                              Nur weil es funktioniert bedeutet es nicht, das es komplett richtig ist.

                              EisbaeeerE Offline
                              EisbaeeerE Offline
                              Eisbaeeer
                              Developer
                              wrote on last edited by Eisbaeeer
                              #691

                              @beowolf sagte in [E-INK Display OpenEPaperLink - Displayanzeige mit Batterie]

                              Nur weil es funktioniert bedeutet es nicht, das es komplett richtig ist.

                              Ich schau mir es noch an. Der erste Blick sah gut aus.

                              --- EDIT ---
                              Im Code ist nichts problematisches. Alles gut!

                              Kein support per PM. Bitte im Forum Fragen stellen!

                              B 1 Reply Last reply
                              1
                              • EisbaeeerE Eisbaeeer

                                @beowolf sagte in [E-INK Display OpenEPaperLink - Displayanzeige mit Batterie]

                                Nur weil es funktioniert bedeutet es nicht, das es komplett richtig ist.

                                Ich schau mir es noch an. Der erste Blick sah gut aus.

                                --- EDIT ---
                                Im Code ist nichts problematisches. Alles gut!

                                B Offline
                                B Offline
                                Beowolf
                                wrote on last edited by
                                #692

                                @eisbaeeer
                                Vielen Dank 😊

                                Die Natur braucht nicht unseren Schutz, sie braucht unsere Abwesenheit.

                                1 Reply Last reply
                                0
                                • B Beowolf

                                  Ich habe ab chatgpt wieder ein wenig gequält.

                                  Es geht um die Abfrage der Buttons bei den schwarzen Displays.

                                  Diese meine ich

                                  https://github.com/OpenEPaperLink/OpenEPaperLink/wiki/2.9″-EL029H3WRA

                                  Hier das Skript

                                  // HIER DIE IP ADRESSE VOM OEPL ACCESS POINT EINTRAGEN
                                  const serverIP = '192.168.49.185';  // z.B. 192.168.1.71
                                  
                                  
                                  //Im Skript müssen noch zwei weiter Einträge event. der eigenen Umgebung angepasst werden
                                  // Zeile 17  -  "Datenpunkt zur Steuerung des Skripts"
                                  // Zeile 21  -  "Datenordner der empfangenen TAGs"
                                  // Zeile 176 -  "Diesen Eintrag auch noch entsprechend der eigenen Umgebung anpassen"
                                  
                                  // AB HIER NICHTS MEHR ÄNDERN!
                                  const WebSocket = require('ws');
                                  const http = require('http');
                                  const wsUrl = `ws://${serverIP}/ws`;  // WebSocket-URL
                                  
                                  let ws;
                                  let pingInterval;
                                  let scriptStopping = false;  // Flag, um zu prüfen, ob das Skript gestoppt wird
                                  
                                  const controlState = '0_userdata.0.Tag_Buttons.Button_Skript_Steuerung.Button_Tags_Erdgeschoss';  // Datenpunkt zur Steuerung des Skripts
                                  
                                  function ensureOpenEPaperLinkFolderExists(callback) {
                                      const OpenEPaperLinkFolderPath = '0_userdata.0.Tag_Buttons.Erdgeschoss'; // Datenordner der empfangenen TAGs
                                      getObject(OpenEPaperLinkFolderPath, (err, obj) => {
                                          if (err || !obj) {
                                              setObject(OpenEPaperLinkFolderPath, {
                                                  type: 'channel',
                                                  common: { name: 'Open E-Paper Link' },
                                                  native: {}
                                              }, callback);
                                          } else {
                                              callback();
                                          }
                                      });
                                  }
                                  
                                  function ensureChannelExists(path, alias, callback) {
                                      getObject(path, (err, obj) => {
                                          if (err || !obj) {
                                              setObject(path, {
                                                  type: 'channel',
                                                  common: { name: alias || 'Unbekanntes Gerät' },
                                                  native: {}
                                              }, callback);
                                          } else if (obj.common.name !== alias) {
                                              extendObject(path, { common: { name: alias } }, callback);
                                          } else {
                                              callback();
                                          }
                                      });
                                  }
                                  
                                  function createStateAndSet(statePath, value) {
                                      setObject(statePath, {
                                          type: 'state',
                                          common: {
                                              name: statePath.split('.').pop(),
                                              type: 'string',
                                              role: 'value',
                                              read: true,
                                              write: true
                                          },
                                          native: {}
                                      }, (err) => {
                                          if (!err) {
                                              setState(statePath, String(value), true);
                                          }
                                      });
                                  }
                                  
                                  function updateStateIfChanged(statePath, value) {
                                      getState(statePath, (err, state) => {
                                          if (err || !state) {
                                              createStateAndSet(statePath, String(value));
                                          } else if (state.val !== String(value)) {
                                              setState(statePath, String(value), true);
                                          }
                                      });
                                  }
                                  
                                  function fetchDimensions(hwType, callback) {
                                      const hwTypeHex = hwType.toString(16).padStart(2, '0').toUpperCase();  // Convert hwType to two-digit uppercase hexadecimal
                                      const url = `http://${serverIP}/tagtypes/${hwTypeHex}.json`;
                                      http.get(url, (res) => {
                                          let data = '';
                                          res.on('data', (chunk) => data += chunk);
                                          res.on('end', () => {
                                              if (res.statusCode === 200) {
                                                  try {
                                                      const dimensions = JSON.parse(data);
                                                      callback(null, dimensions);
                                                  } catch (e) {
                                                      callback(`Error parsing JSON from ${url}: ${e}`);
                                                  }
                                              } else {
                                                  callback(`HTTP Error ${res.statusCode} from ${url}`);
                                              }
                                          });
                                      }).on('error', (err) => {
                                          callback(`Error fetching ${url}: ${err.message}`);
                                      });
                                  }
                                  
                                  function handleHWType(basePath, hwType) {
                                      createStateAndSet(`${basePath}.hwType`, String(hwType));  // Save hwType as a state
                                      fetchDimensions(hwType, (err, dimensions) => {
                                          if (!err && dimensions) {
                                              createStateAndSet(`${basePath}.height`, String(dimensions.height));
                                              createStateAndSet(`${basePath}.width`, String(dimensions.width));
                                              createStateAndSet(`${basePath}.name`, String(dimensions.name));
                                              if (dimensions.colors) {
                                                  createStateAndSet(`${basePath}.colors`, String(dimensions.colors));
                                              }
                                              if (dimensions.colortable) {
                                                  createStateAndSet(`${basePath}.colortable`, JSON.stringify(dimensions.colortable));
                                              }
                                          } else {
                                              console.error(`Failed to fetch or set dimensions for hwType ${hwType}: ${err}`);
                                          }
                                      });
                                  }
                                  
                                  function connectWebSocket() {
                                      if (scriptStopping) {
                                          return;  // Wenn das Skript gestoppt wird, keine Verbindung mehr herstellen
                                      }
                                  
                                      ws = new WebSocket(wsUrl);
                                      ws.on('open', function open() {
                                          console.log('Verbunden mit WebSocket');
                                          startHeartbeat();
                                      });
                                  
                                      ws.on('message', function incoming(data) {
                                          console.log('Daten empfangen:', data);
                                          if (data) {
                                              try {
                                                  let parsedData = JSON.parse(data);
                                                  console.log('Verarbeitete Daten:', JSON.stringify(parsedData, null, 2));
                                                  handleData(parsedData);
                                              } catch (err) {
                                                  console.error('Fehler bei der Verarbeitung der Daten:', err);
                                              }
                                          } else {
                                              console.log('Keine Daten oder leere Nachricht empfangen');
                                          }
                                      });
                                  
                                      ws.on('close', function close() {
                                          if (!scriptStopping) {
                                              console.log('WebSocket-Verbindung geschlossen, versuche neu zu verbinden...');
                                              clearInterval(pingInterval);
                                              setTimeout(connectWebSocket, 5000);
                                          }
                                      });
                                  
                                      ws.on('error', function error(err) {
                                          console.error('WebSocket-Fehler:', err);
                                      });
                                  }
                                  
                                  function startHeartbeat() {
                                      pingInterval = setInterval(() => {
                                          if (ws.readyState === WebSocket.OPEN) {
                                              ws.ping(() => console.log('Ping sent'));
                                          }
                                      }, 10000); // Send ping every 10 seconds
                                  
                                      ws.on('pong', () => {
                                          console.log('Pong received');
                                      });
                                  }
                                  
                                  function handleData(parsedData) {
                                      if (parsedData.tags && Array.isArray(parsedData.tags)) {
                                          parsedData.tags.forEach(tag => {
                                              let basePath = `0_userdata.0.Tag_Buttons.Erdgeschoss.${tag.mac.replace(/:/g, '')}`;  //Diesen Eintrag auch noch entsprechend der eigenen Umgebung anpassen
                                              ensureChannelExists(basePath, tag.alias, () => {
                                                  Object.keys(tag).forEach(key => {
                                                      let statePath = `${basePath}.${key}`;
                                                      let value = tag[key];
                                                      updateStateIfChanged(statePath, value);
                                                      if (key === 'hwType') {
                                                          handleHWType(basePath, tag.hwType);
                                                      }
                                                  });
                                              });
                                          });
                                      }
                                  }
                                  
                                  function disconnectWebSocket() {
                                      if (ws) {
                                          ws.close();
                                          ws = null;
                                      }
                                      clearInterval(pingInterval);
                                  }
                                  
                                  // Skript-Start und -Stopp basierend auf einem Datenpunkt steuern
                                  function setupScriptControl() {
                                      setObject(controlState, {
                                          type: 'state',
                                          common: {
                                              name: 'EPaper Script Control',
                                              type: 'boolean',
                                              role: 'switch',
                                              read: true,
                                              write: true,
                                              def: false
                                          },
                                          native: {}
                                      });
                                  
                                      on({id: controlState, change: 'ne'}, (obj) => {
                                          const state = obj.state.val;
                                          if (state) {
                                              // Skript starten
                                              scriptStopping = false;
                                              ensureOpenEPaperLinkFolderExists(connectWebSocket);
                                          } else {
                                              // Skript stoppen
                                              scriptStopping = true;
                                              disconnectWebSocket();
                                              console.log('Skript beendet durch Steuer-Datenpunkt');
                                          }
                                      });
                                  }
                                  
                                  // Initiale Einrichtung
                                  setupScriptControl();
                                  

                                  Jetzt kann das Skript durch Setzen des Datenpunkts 0_userdata.0.ScriptControl.EPaperScript auf true oder false gestartet und gestoppt werden.

                                  Bei mir funktioniert es.

                                  Bitte die Einstellung im Skript beachten !!!

                                  Die Fehlermeldungen bei dem ersten Durchlauf sind wohl normal.

                                  B Offline
                                  B Offline
                                  Beowolf
                                  wrote on last edited by
                                  #693

                                  @beowolf sagte in E-INK Display OpenEPaperLink - Displayanzeige mit Batterie:

                                  Ich habe ab chatgpt wieder ein wenig gequält.

                                  Es geht um die Abfrage der Buttons bei den schwarzen Displays.

                                  Diese meine ich

                                  https://github.com/OpenEPaperLink/OpenEPaperLink/wiki/2.9″-EL029H3WRA

                                  Hier das Skript

                                  // HIER DIE IP ADRESSE VOM OEPL ACCESS POINT EINTRAGEN
                                  const serverIP = '192.168.49.185';  // z.B. 192.168.1.71
                                  
                                  
                                  //Im Skript müssen noch zwei weiter Einträge event. der eigenen Umgebung angepasst werden
                                  // Zeile 17  -  "Datenpunkt zur Steuerung des Skripts"
                                  // Zeile 21  -  "Datenordner der empfangenen TAGs"
                                  // Zeile 176 -  "Diesen Eintrag auch noch entsprechend der eigenen Umgebung anpassen"
                                  
                                  // AB HIER NICHTS MEHR ÄNDERN!
                                  const WebSocket = require('ws');
                                  const http = require('http');
                                  const wsUrl = `ws://${serverIP}/ws`;  // WebSocket-URL
                                  
                                  let ws;
                                  let pingInterval;
                                  let scriptStopping = false;  // Flag, um zu prüfen, ob das Skript gestoppt wird
                                  
                                  const controlState = '0_userdata.0.Tag_Buttons.Button_Skript_Steuerung.Button_Tags_Erdgeschoss';  // Datenpunkt zur Steuerung des Skripts
                                  
                                  function ensureOpenEPaperLinkFolderExists(callback) {
                                      const OpenEPaperLinkFolderPath = '0_userdata.0.Tag_Buttons.Erdgeschoss'; // Datenordner der empfangenen TAGs
                                      getObject(OpenEPaperLinkFolderPath, (err, obj) => {
                                          if (err || !obj) {
                                              setObject(OpenEPaperLinkFolderPath, {
                                                  type: 'channel',
                                                  common: { name: 'Open E-Paper Link' },
                                                  native: {}
                                              }, callback);
                                          } else {
                                              callback();
                                          }
                                      });
                                  }
                                  
                                  function ensureChannelExists(path, alias, callback) {
                                      getObject(path, (err, obj) => {
                                          if (err || !obj) {
                                              setObject(path, {
                                                  type: 'channel',
                                                  common: { name: alias || 'Unbekanntes Gerät' },
                                                  native: {}
                                              }, callback);
                                          } else if (obj.common.name !== alias) {
                                              extendObject(path, { common: { name: alias } }, callback);
                                          } else {
                                              callback();
                                          }
                                      });
                                  }
                                  
                                  function createStateAndSet(statePath, value) {
                                      setObject(statePath, {
                                          type: 'state',
                                          common: {
                                              name: statePath.split('.').pop(),
                                              type: 'string',
                                              role: 'value',
                                              read: true,
                                              write: true
                                          },
                                          native: {}
                                      }, (err) => {
                                          if (!err) {
                                              setState(statePath, String(value), true);
                                          }
                                      });
                                  }
                                  
                                  function updateStateIfChanged(statePath, value) {
                                      getState(statePath, (err, state) => {
                                          if (err || !state) {
                                              createStateAndSet(statePath, String(value));
                                          } else if (state.val !== String(value)) {
                                              setState(statePath, String(value), true);
                                          }
                                      });
                                  }
                                  
                                  function fetchDimensions(hwType, callback) {
                                      const hwTypeHex = hwType.toString(16).padStart(2, '0').toUpperCase();  // Convert hwType to two-digit uppercase hexadecimal
                                      const url = `http://${serverIP}/tagtypes/${hwTypeHex}.json`;
                                      http.get(url, (res) => {
                                          let data = '';
                                          res.on('data', (chunk) => data += chunk);
                                          res.on('end', () => {
                                              if (res.statusCode === 200) {
                                                  try {
                                                      const dimensions = JSON.parse(data);
                                                      callback(null, dimensions);
                                                  } catch (e) {
                                                      callback(`Error parsing JSON from ${url}: ${e}`);
                                                  }
                                              } else {
                                                  callback(`HTTP Error ${res.statusCode} from ${url}`);
                                              }
                                          });
                                      }).on('error', (err) => {
                                          callback(`Error fetching ${url}: ${err.message}`);
                                      });
                                  }
                                  
                                  function handleHWType(basePath, hwType) {
                                      createStateAndSet(`${basePath}.hwType`, String(hwType));  // Save hwType as a state
                                      fetchDimensions(hwType, (err, dimensions) => {
                                          if (!err && dimensions) {
                                              createStateAndSet(`${basePath}.height`, String(dimensions.height));
                                              createStateAndSet(`${basePath}.width`, String(dimensions.width));
                                              createStateAndSet(`${basePath}.name`, String(dimensions.name));
                                              if (dimensions.colors) {
                                                  createStateAndSet(`${basePath}.colors`, String(dimensions.colors));
                                              }
                                              if (dimensions.colortable) {
                                                  createStateAndSet(`${basePath}.colortable`, JSON.stringify(dimensions.colortable));
                                              }
                                          } else {
                                              console.error(`Failed to fetch or set dimensions for hwType ${hwType}: ${err}`);
                                          }
                                      });
                                  }
                                  
                                  function connectWebSocket() {
                                      if (scriptStopping) {
                                          return;  // Wenn das Skript gestoppt wird, keine Verbindung mehr herstellen
                                      }
                                  
                                      ws = new WebSocket(wsUrl);
                                      ws.on('open', function open() {
                                          console.log('Verbunden mit WebSocket');
                                          startHeartbeat();
                                      });
                                  
                                      ws.on('message', function incoming(data) {
                                          console.log('Daten empfangen:', data);
                                          if (data) {
                                              try {
                                                  let parsedData = JSON.parse(data);
                                                  console.log('Verarbeitete Daten:', JSON.stringify(parsedData, null, 2));
                                                  handleData(parsedData);
                                              } catch (err) {
                                                  console.error('Fehler bei der Verarbeitung der Daten:', err);
                                              }
                                          } else {
                                              console.log('Keine Daten oder leere Nachricht empfangen');
                                          }
                                      });
                                  
                                      ws.on('close', function close() {
                                          if (!scriptStopping) {
                                              console.log('WebSocket-Verbindung geschlossen, versuche neu zu verbinden...');
                                              clearInterval(pingInterval);
                                              setTimeout(connectWebSocket, 5000);
                                          }
                                      });
                                  
                                      ws.on('error', function error(err) {
                                          console.error('WebSocket-Fehler:', err);
                                      });
                                  }
                                  
                                  function startHeartbeat() {
                                      pingInterval = setInterval(() => {
                                          if (ws.readyState === WebSocket.OPEN) {
                                              ws.ping(() => console.log('Ping sent'));
                                          }
                                      }, 10000); // Send ping every 10 seconds
                                  
                                      ws.on('pong', () => {
                                          console.log('Pong received');
                                      });
                                  }
                                  
                                  function handleData(parsedData) {
                                      if (parsedData.tags && Array.isArray(parsedData.tags)) {
                                          parsedData.tags.forEach(tag => {
                                              let basePath = `0_userdata.0.Tag_Buttons.Erdgeschoss.${tag.mac.replace(/:/g, '')}`;  //Diesen Eintrag auch noch entsprechend der eigenen Umgebung anpassen
                                              ensureChannelExists(basePath, tag.alias, () => {
                                                  Object.keys(tag).forEach(key => {
                                                      let statePath = `${basePath}.${key}`;
                                                      let value = tag[key];
                                                      updateStateIfChanged(statePath, value);
                                                      if (key === 'hwType') {
                                                          handleHWType(basePath, tag.hwType);
                                                      }
                                                  });
                                              });
                                          });
                                      }
                                  }
                                  
                                  function disconnectWebSocket() {
                                      if (ws) {
                                          ws.close();
                                          ws = null;
                                      }
                                      clearInterval(pingInterval);
                                  }
                                  
                                  // Skript-Start und -Stopp basierend auf einem Datenpunkt steuern
                                  function setupScriptControl() {
                                      setObject(controlState, {
                                          type: 'state',
                                          common: {
                                              name: 'EPaper Script Control',
                                              type: 'boolean',
                                              role: 'switch',
                                              read: true,
                                              write: true,
                                              def: false
                                          },
                                          native: {}
                                      });
                                  
                                      on({id: controlState, change: 'ne'}, (obj) => {
                                          const state = obj.state.val;
                                          if (state) {
                                              // Skript starten
                                              scriptStopping = false;
                                              ensureOpenEPaperLinkFolderExists(connectWebSocket);
                                          } else {
                                              // Skript stoppen
                                              scriptStopping = true;
                                              disconnectWebSocket();
                                              console.log('Skript beendet durch Steuer-Datenpunkt');
                                          }
                                      });
                                  }
                                  
                                  // Initiale Einrichtung
                                  setupScriptControl();
                                  

                                  Jetzt kann das Skript durch Setzen des Datenpunkts 0_userdata.0.ScriptControl.EPaperScript auf true oder false gestartet und gestoppt werden.

                                  Bei mir funktioniert es.

                                  Bitte die Einstellung im Skript beachten !!!

                                  Die Fehlermeldungen bei dem ersten Durchlauf sind wohl normal.

                                  Ich habe noch einmal zu diesem Skript eine Frage.

                                  Wenn ich die Buttons nutzen möchte, muß das Skript laufen.

                                  Wenn es aber läuft, habe ich das im Protokoll stehen:

                                  javascript.0	15:57:27.401	info	script.js.common.EPaper-Displays.Erdgeschoss.Buttons_der_Erdgeschoss_TAGs: Daten empfangen:
                                  javascript.0	15:57:27.402	info	script.js.common.EPaper-Displays.Erdgeschoss.Buttons_der_Erdgeschoss_TAGs: Verarbeitete Daten:
                                  javascript.0	15:57:28.822	info	script.js.common.EPaper-Displays.Erdgeschoss.Buttons_der_Erdgeschoss_TAGs: Ping sent
                                  javascript.0	15:57:28.928	info	script.js.common.EPaper-Displays.Erdgeschoss.Buttons_der_Erdgeschoss_TAGs: Pong received
                                  javascript.0	15:57:31.304	info	script.js.common.EPaper-Displays.Erdgeschoss.Buttons_der_Erdgeschoss_TAGs: Daten empfangen:
                                  javascript.0	15:57:31.304	info	script.js.common.EPaper-Displays.Erdgeschoss.Buttons_der_Erdgeschoss_TAGs: Verarbeitete Daten:
                                  javascript.0	15:57:31.726	info	script.js.common.EPaper-Displays.Erdgeschoss.Buttons_der_Erdgeschoss_TAGs: Daten empfangen:
                                  javascript.0	15:57:31.727	info	script.js.common.EPaper-Displays.Erdgeschoss.Buttons_der_Erdgeschoss_TAGs: Verarbeitete Daten:
                                  javascript.0	15:57:35.154	info	script.js.common.EPaper-Displays.Erdgeschoss.Buttons_der_Erdgeschoss_TAGs: Daten empfangen:
                                  javascript.0	15:57:35.155	info	script.js.common.EPaper-Displays.Erdgeschoss.Buttons_der_Erdgeschoss_TAGs: Verarbeitete Daten:
                                  javascript.0	15:57:35.651	info	script.js.common.EPaper-Displays.Erdgeschoss.Buttons_der_Erdgeschoss_TAGs: Daten empfangen:
                                  javascript.0	15:57:35.652	info	script.js.common.EPaper-Displays.Erdgeschoss.Buttons_der_Erdgeschoss_TAGs: Verarbeitete Daten:
                                  javascript.0	15:57:36.787	info	script.js.common.EPaper-Displays.Erdgeschoss.Buttons_der_Erdgeschoss_TAGs: Daten empfangen:
                                  javascript.0	15:57:36.788	info	script.js.common.EPaper-Displays.Erdgeschoss.Buttons_der_Erdgeschoss_TAGs: Verarbeitete Daten:
                                  javascript.0	15:57:38.823	info	script.js.common.EPaper-Displays.Erdgeschoss.Buttons_der_Erdgeschoss_TAGs: Ping sent
                                  javascript.0	15:57:38.854	info	script.js.common.EPaper-Displays.Erdgeschoss.Buttons_der_Erdgeschoss_TAGs: Pong received
                                  javascript.0	15:57:39.271	info	script.js.common.EPaper-Displays.Erdgeschoss.Buttons_der_Erdgeschoss_TAGs: Daten empfangen:
                                  javascript.0	15:57:39.272	info	script.js.common.EPaper-Displays.Erdgeschoss.Buttons_der_Erdgeschoss_TAGs: Verarbeitete Daten:
                                  javascript.0	15:57:40.007	info	script.js.common.EPaper-Displays.Erdgeschoss.Buttons_der_Erdgeschoss_TAGs: Daten empfangen:
                                  javascript.0	15:57:40.007	info	script.js.common.EPaper-Displays.Erdgeschoss.Buttons_der_Erdgeschoss_TAGs: Verarbeitete Daten:
                                  javascript.0	15:57:40.342	info	script.js.common.EPaper-Displays.Erdgeschoss.Buttons_der_Erdgeschoss_TAGs: Daten empfangen:
                                  javascript.0	15:57:40.343	info	script.js.common.EPaper-Displays.Erdgeschoss.Buttons_der_Erdgeschoss_TAGs: Verarbeitete Daten:
                                  javascript.0	15:57:41.007	info	script.js.common.EPaper-Displays.Erdgeschoss.Buttons_der_Erdgeschoss_TAGs: Daten empfangen:
                                  javascript.0	15:57:41.007	info	script.js.common.EPaper-Displays.Erdgeschoss.Buttons_der_Erdgeschoss_TAGs: Verarbeitete Daten:
                                  javascript.0	15:57:41.790	info	script.js.common.EPaper-Displays.Erdgeschoss.Buttons_der_Erdgeschoss_TAGs: Daten empfangen:
                                  javascript.0	15:57:41.790	info	script.js.common.EPaper-Displays.Erdgeschoss.Buttons_der_Erdgeschoss_TAGs: Verarbeitete Daten:
                                  javascript.0	15:57:42.276	info	script.js.common.EPaper-Displays.Erdgeschoss.Buttons_der_Erdgeschoss_TAGs: Daten empfangen:
                                  javascript.0	15:57:42.277	info	script.js.common.EPaper-Displays.Erdgeschoss.Buttons_der_Erdgeschoss_TAGs: Verarbeitete Daten:
                                  javascript.0	15:57:43.525	info	script.js.common.EPaper-Displays.Erdgeschoss.Buttons_der_Erdgeschoss_TAGs: Daten empfangen:
                                  javascript.0	15:57:43.526	info	script.js.common.EPaper-Displays.Erdgeschoss.Buttons_der_Erdgeschoss_TAGs: Verarbeitete Daten:
                                  javascript.0	15:57:44.582	info	script.js.common.EPaper-Displays.Erdgeschoss.Buttons_der_Erdgeschoss_TAGs: Daten empfangen:
                                  javascript.0	15:57:44.583	info	script.js.common.EPaper-Displays.Erdgeschoss.Buttons_der_Erdgeschoss_TAGs: Verarbeitete Daten:
                                  javascript.0	15:57:46.853	info	script.js.common.EPaper-Displays.Erdgeschoss.Buttons_der_Erdgeschoss_TAGs: Daten empfangen:
                                  javascript.0	15:57:46.854	info	script.js.common.EPaper-Displays.Erdgeschoss.Buttons_der_Erdgeschoss_TAGs: Verarbeitete Daten:
                                  javascript.0	15:57:48.441	info	script.js.common.EPaper-Displays.Erdgeschoss.Buttons_der_Erdgeschoss_TAGs: Daten empfangen:
                                  javascript.0	15:57:48.441	info	script.js.common.EPaper-Displays.Erdgeschoss.Buttons_der_Erdgeschoss_TAGs: Verarbeitete Daten:
                                  javascript.0	15:57:48.824	info	script.js.common.EPaper-Displays.Erdgeschoss.Buttons_der_Erdgeschoss_TAGs: Ping sent
                                  javascript.0	15:57:48.847	info	script.js.common.EPaper-Displays.Erdgeschoss.Buttons_der_Erdgeschoss_TAGs: Pong received
                                  javascript.0	15:57:50.673	info	script.js.common.EPaper-Displays.Erdgeschoss.Buttons_der_Erdgeschoss_TAGs: Daten empfangen:
                                  javascript.0	15:57:50.673	info	script.js.common.EPaper-Displays.Erdgeschoss.Buttons_der_Erdgeschoss_TAGs: Verarbeitete Daten:
                                  javascript.0	15:57:52.308	info	script.js.common.EPaper-Displays.Erdgeschoss.Buttons_der_Erdgeschoss_TAGs: Daten empfangen:
                                  javascript.0	15:57:52.308	info	script.js.common.EPaper-Displays.Erdgeschoss.Buttons_der_Erdgeschoss_TAGs: Verarbeitete Daten:
                                  javascript.0	15:57:52.501	info	script.js.common.EPaper-Displays.Erdgeschoss.Buttons_der_Erdgeschoss_TAGs: Daten empfangen:
                                  javascript.0	15:57:52.501	info	script.js.common.EPaper-Displays.Erdgeschoss.Buttons_der_Erdgeschoss_TAGs: Verarbeitete Daten:
                                  javascript.0	15:57:52.761	info	script.js.common.EPaper-Displays.Erdgeschoss.Buttons_der_Erdgeschoss_TAGs: Daten empfangen:
                                  javascript.0	15:57:52.762	info	script.js.common.EPaper-Displays.Erdgeschoss.Buttons_der_Erdgeschoss_TAGs: Verarbeitete Daten:
                                  javascript.0	15:57:55.489	info	script.js.common.EPaper-Displays.Erdgeschoss.Buttons_der_Erdgeschoss_TAGs: Daten empfangen:
                                  javascript.0	15:57:55.490	info	script.js.common.EPaper-Displays.Erdgeschoss.Buttons_der_Erdgeschoss_TAGs: Verarbeitete Daten:
                                  javascript.0	15:57:57.005	info	script.js.common.EPaper-Displays.Erdgeschoss.Buttons_der_Erdgeschoss_TAGs: Daten empfangen:
                                  javascript.0	15:57:57.005	info	script.js.common.EPaper-Displays.Erdgeschoss.Buttons_der_Erdgeschoss_TAGs: Verarbeitete Daten:
                                  javascript.0	15:57:57.257	info	script.js.common.EPaper-Displays.Erdgeschoss.Buttons_der_Erdgeschoss_TAGs: Daten empfangen:
                                  javascript.0	15:57:57.258	info	script.js.common.EPaper-Displays.Erdgeschoss.Buttons_der_Erdgeschoss_TAGs: Verarbeitete Daten:
                                  javascript.0	15:57:57.424	info	script.js.common.EPaper-Displays.Erdgeschoss.Buttons_der_Erdgeschoss_TAGs: Daten empfangen:
                                  javascript.0	15:57:57.425	info	script.js.common.EPaper-Displays.Erdgeschoss.Buttons_der_Erdgeschoss_TAGs: Verarbeitete Daten:
                                  javascript.0	15:57:57.594	info	script.js.common.EPaper-Displays.Erdgeschoss.Buttons_der_Erdgeschoss_TAGs: Daten empfangen:
                                  javascript.0	15:57:57.594	info	script.js.common.EPaper-Displays.Erdgeschoss.Buttons_der_Erdgeschoss_TAGs: Verarbeitete Daten:
                                  javascript.0	15:57:58.106	info	script.js.common.EPaper-Displays.Erdgeschoss.Buttons_der_Erdgeschoss_TAGs: Daten empfangen:
                                  javascript.0	15:57:58.107	info	script.js.common.EPaper-Displays.Erdgeschoss.Buttons_der_Erdgeschoss_TAGs: Verarbeitete Daten:
                                  javascript.0	15:57:58.234	info	script.js.common.EPaper-Displays.Erdgeschoss.Buttons_der_Erdgeschoss_TAGs: Daten empfangen:
                                  javascript.0	15:57:58.234	info	script.js.common.EPaper-Displays.Erdgeschoss.Buttons_der_Erdgeschoss_TAGs: Verarbeitete Daten:
                                  javascript.0	15:57:58.823	info	script.js.common.EPaper-Displays.Erdgeschoss.Buttons_der_Erdgeschoss_TAGs: Ping sent
                                  javascript.0	15:57:58.936	info	script.js.common.EPaper-Displays.Erdgeschoss.Buttons_der_Erdgeschoss_TAGs: Pong received
                                  javascript.0	15:57:59.522	info	script.js.common.EPaper-Displays.Erdgeschoss.Buttons_der_Erdgeschoss_TAGs: Daten empfangen:
                                  javascript.0	15:57:59.522	info	script.js.common.EPaper-Displays.Erdgeschoss.Buttons_der_Erdgeschoss_TAGs: Verarbeitete Daten:
                                  javascript.0	15:58:00.619	info	script.js.common.EPaper-Displays.Erdgeschoss.Buttons_der_Erdgeschoss_TAGs: Daten empfangen:
                                  javascript.0	15:58:00.620	info	script.js.common.EPaper-Displays.Erdgeschoss.Buttons_der_Erdgeschoss_TAGs: Verarbeitete Daten:
                                  javascript.0	15:58:02.135	info	script.js.common.EPaper-Displays.Erdgeschoss.Buttons_der_Erdgeschoss_TAGs: Daten empfangen:
                                  javascript.0	15:58:02.135	info	script.js.common.EPaper-Displays.Erdgeschoss.Buttons_der_Erdgeschoss_TAGs: Verarbeitete Daten:
                                  javascript.0	15:58:03.096	info	script.js.common.EPaper-Displays.Erdgeschoss.Buttons_der_Erdgeschoss_TAGs: Daten empfangen:
                                  javascript.0	15:58:03.096	info	script.js.common.EPaper-Displays.Erdgeschoss.Buttons_der_Erdgeschoss_TAGs: Verarbeitete Daten:
                                  
                                  

                                  Da ist also heftig was los.

                                  Gibt es keine Möglichkeit, das das Skript auf eine "Buttonbetätigung" wartet?

                                  Die Natur braucht nicht unseren Schutz, sie braucht unsere Abwesenheit.

                                  S 1 Reply Last reply
                                  0
                                  • B Beowolf

                                    @beowolf sagte in E-INK Display OpenEPaperLink - Displayanzeige mit Batterie:

                                    Ich habe ab chatgpt wieder ein wenig gequält.

                                    Es geht um die Abfrage der Buttons bei den schwarzen Displays.

                                    Diese meine ich

                                    https://github.com/OpenEPaperLink/OpenEPaperLink/wiki/2.9″-EL029H3WRA

                                    Hier das Skript

                                    // HIER DIE IP ADRESSE VOM OEPL ACCESS POINT EINTRAGEN
                                    const serverIP = '192.168.49.185';  // z.B. 192.168.1.71
                                    
                                    
                                    //Im Skript müssen noch zwei weiter Einträge event. der eigenen Umgebung angepasst werden
                                    // Zeile 17  -  "Datenpunkt zur Steuerung des Skripts"
                                    // Zeile 21  -  "Datenordner der empfangenen TAGs"
                                    // Zeile 176 -  "Diesen Eintrag auch noch entsprechend der eigenen Umgebung anpassen"
                                    
                                    // AB HIER NICHTS MEHR ÄNDERN!
                                    const WebSocket = require('ws');
                                    const http = require('http');
                                    const wsUrl = `ws://${serverIP}/ws`;  // WebSocket-URL
                                    
                                    let ws;
                                    let pingInterval;
                                    let scriptStopping = false;  // Flag, um zu prüfen, ob das Skript gestoppt wird
                                    
                                    const controlState = '0_userdata.0.Tag_Buttons.Button_Skript_Steuerung.Button_Tags_Erdgeschoss';  // Datenpunkt zur Steuerung des Skripts
                                    
                                    function ensureOpenEPaperLinkFolderExists(callback) {
                                        const OpenEPaperLinkFolderPath = '0_userdata.0.Tag_Buttons.Erdgeschoss'; // Datenordner der empfangenen TAGs
                                        getObject(OpenEPaperLinkFolderPath, (err, obj) => {
                                            if (err || !obj) {
                                                setObject(OpenEPaperLinkFolderPath, {
                                                    type: 'channel',
                                                    common: { name: 'Open E-Paper Link' },
                                                    native: {}
                                                }, callback);
                                            } else {
                                                callback();
                                            }
                                        });
                                    }
                                    
                                    function ensureChannelExists(path, alias, callback) {
                                        getObject(path, (err, obj) => {
                                            if (err || !obj) {
                                                setObject(path, {
                                                    type: 'channel',
                                                    common: { name: alias || 'Unbekanntes Gerät' },
                                                    native: {}
                                                }, callback);
                                            } else if (obj.common.name !== alias) {
                                                extendObject(path, { common: { name: alias } }, callback);
                                            } else {
                                                callback();
                                            }
                                        });
                                    }
                                    
                                    function createStateAndSet(statePath, value) {
                                        setObject(statePath, {
                                            type: 'state',
                                            common: {
                                                name: statePath.split('.').pop(),
                                                type: 'string',
                                                role: 'value',
                                                read: true,
                                                write: true
                                            },
                                            native: {}
                                        }, (err) => {
                                            if (!err) {
                                                setState(statePath, String(value), true);
                                            }
                                        });
                                    }
                                    
                                    function updateStateIfChanged(statePath, value) {
                                        getState(statePath, (err, state) => {
                                            if (err || !state) {
                                                createStateAndSet(statePath, String(value));
                                            } else if (state.val !== String(value)) {
                                                setState(statePath, String(value), true);
                                            }
                                        });
                                    }
                                    
                                    function fetchDimensions(hwType, callback) {
                                        const hwTypeHex = hwType.toString(16).padStart(2, '0').toUpperCase();  // Convert hwType to two-digit uppercase hexadecimal
                                        const url = `http://${serverIP}/tagtypes/${hwTypeHex}.json`;
                                        http.get(url, (res) => {
                                            let data = '';
                                            res.on('data', (chunk) => data += chunk);
                                            res.on('end', () => {
                                                if (res.statusCode === 200) {
                                                    try {
                                                        const dimensions = JSON.parse(data);
                                                        callback(null, dimensions);
                                                    } catch (e) {
                                                        callback(`Error parsing JSON from ${url}: ${e}`);
                                                    }
                                                } else {
                                                    callback(`HTTP Error ${res.statusCode} from ${url}`);
                                                }
                                            });
                                        }).on('error', (err) => {
                                            callback(`Error fetching ${url}: ${err.message}`);
                                        });
                                    }
                                    
                                    function handleHWType(basePath, hwType) {
                                        createStateAndSet(`${basePath}.hwType`, String(hwType));  // Save hwType as a state
                                        fetchDimensions(hwType, (err, dimensions) => {
                                            if (!err && dimensions) {
                                                createStateAndSet(`${basePath}.height`, String(dimensions.height));
                                                createStateAndSet(`${basePath}.width`, String(dimensions.width));
                                                createStateAndSet(`${basePath}.name`, String(dimensions.name));
                                                if (dimensions.colors) {
                                                    createStateAndSet(`${basePath}.colors`, String(dimensions.colors));
                                                }
                                                if (dimensions.colortable) {
                                                    createStateAndSet(`${basePath}.colortable`, JSON.stringify(dimensions.colortable));
                                                }
                                            } else {
                                                console.error(`Failed to fetch or set dimensions for hwType ${hwType}: ${err}`);
                                            }
                                        });
                                    }
                                    
                                    function connectWebSocket() {
                                        if (scriptStopping) {
                                            return;  // Wenn das Skript gestoppt wird, keine Verbindung mehr herstellen
                                        }
                                    
                                        ws = new WebSocket(wsUrl);
                                        ws.on('open', function open() {
                                            console.log('Verbunden mit WebSocket');
                                            startHeartbeat();
                                        });
                                    
                                        ws.on('message', function incoming(data) {
                                            console.log('Daten empfangen:', data);
                                            if (data) {
                                                try {
                                                    let parsedData = JSON.parse(data);
                                                    console.log('Verarbeitete Daten:', JSON.stringify(parsedData, null, 2));
                                                    handleData(parsedData);
                                                } catch (err) {
                                                    console.error('Fehler bei der Verarbeitung der Daten:', err);
                                                }
                                            } else {
                                                console.log('Keine Daten oder leere Nachricht empfangen');
                                            }
                                        });
                                    
                                        ws.on('close', function close() {
                                            if (!scriptStopping) {
                                                console.log('WebSocket-Verbindung geschlossen, versuche neu zu verbinden...');
                                                clearInterval(pingInterval);
                                                setTimeout(connectWebSocket, 5000);
                                            }
                                        });
                                    
                                        ws.on('error', function error(err) {
                                            console.error('WebSocket-Fehler:', err);
                                        });
                                    }
                                    
                                    function startHeartbeat() {
                                        pingInterval = setInterval(() => {
                                            if (ws.readyState === WebSocket.OPEN) {
                                                ws.ping(() => console.log('Ping sent'));
                                            }
                                        }, 10000); // Send ping every 10 seconds
                                    
                                        ws.on('pong', () => {
                                            console.log('Pong received');
                                        });
                                    }
                                    
                                    function handleData(parsedData) {
                                        if (parsedData.tags && Array.isArray(parsedData.tags)) {
                                            parsedData.tags.forEach(tag => {
                                                let basePath = `0_userdata.0.Tag_Buttons.Erdgeschoss.${tag.mac.replace(/:/g, '')}`;  //Diesen Eintrag auch noch entsprechend der eigenen Umgebung anpassen
                                                ensureChannelExists(basePath, tag.alias, () => {
                                                    Object.keys(tag).forEach(key => {
                                                        let statePath = `${basePath}.${key}`;
                                                        let value = tag[key];
                                                        updateStateIfChanged(statePath, value);
                                                        if (key === 'hwType') {
                                                            handleHWType(basePath, tag.hwType);
                                                        }
                                                    });
                                                });
                                            });
                                        }
                                    }
                                    
                                    function disconnectWebSocket() {
                                        if (ws) {
                                            ws.close();
                                            ws = null;
                                        }
                                        clearInterval(pingInterval);
                                    }
                                    
                                    // Skript-Start und -Stopp basierend auf einem Datenpunkt steuern
                                    function setupScriptControl() {
                                        setObject(controlState, {
                                            type: 'state',
                                            common: {
                                                name: 'EPaper Script Control',
                                                type: 'boolean',
                                                role: 'switch',
                                                read: true,
                                                write: true,
                                                def: false
                                            },
                                            native: {}
                                        });
                                    
                                        on({id: controlState, change: 'ne'}, (obj) => {
                                            const state = obj.state.val;
                                            if (state) {
                                                // Skript starten
                                                scriptStopping = false;
                                                ensureOpenEPaperLinkFolderExists(connectWebSocket);
                                            } else {
                                                // Skript stoppen
                                                scriptStopping = true;
                                                disconnectWebSocket();
                                                console.log('Skript beendet durch Steuer-Datenpunkt');
                                            }
                                        });
                                    }
                                    
                                    // Initiale Einrichtung
                                    setupScriptControl();
                                    

                                    Jetzt kann das Skript durch Setzen des Datenpunkts 0_userdata.0.ScriptControl.EPaperScript auf true oder false gestartet und gestoppt werden.

                                    Bei mir funktioniert es.

                                    Bitte die Einstellung im Skript beachten !!!

                                    Die Fehlermeldungen bei dem ersten Durchlauf sind wohl normal.

                                    Ich habe noch einmal zu diesem Skript eine Frage.

                                    Wenn ich die Buttons nutzen möchte, muß das Skript laufen.

                                    Wenn es aber läuft, habe ich das im Protokoll stehen:

                                    javascript.0	15:57:27.401	info	script.js.common.EPaper-Displays.Erdgeschoss.Buttons_der_Erdgeschoss_TAGs: Daten empfangen:
                                    javascript.0	15:57:27.402	info	script.js.common.EPaper-Displays.Erdgeschoss.Buttons_der_Erdgeschoss_TAGs: Verarbeitete Daten:
                                    javascript.0	15:57:28.822	info	script.js.common.EPaper-Displays.Erdgeschoss.Buttons_der_Erdgeschoss_TAGs: Ping sent
                                    javascript.0	15:57:28.928	info	script.js.common.EPaper-Displays.Erdgeschoss.Buttons_der_Erdgeschoss_TAGs: Pong received
                                    javascript.0	15:57:31.304	info	script.js.common.EPaper-Displays.Erdgeschoss.Buttons_der_Erdgeschoss_TAGs: Daten empfangen:
                                    javascript.0	15:57:31.304	info	script.js.common.EPaper-Displays.Erdgeschoss.Buttons_der_Erdgeschoss_TAGs: Verarbeitete Daten:
                                    javascript.0	15:57:31.726	info	script.js.common.EPaper-Displays.Erdgeschoss.Buttons_der_Erdgeschoss_TAGs: Daten empfangen:
                                    javascript.0	15:57:31.727	info	script.js.common.EPaper-Displays.Erdgeschoss.Buttons_der_Erdgeschoss_TAGs: Verarbeitete Daten:
                                    javascript.0	15:57:35.154	info	script.js.common.EPaper-Displays.Erdgeschoss.Buttons_der_Erdgeschoss_TAGs: Daten empfangen:
                                    javascript.0	15:57:35.155	info	script.js.common.EPaper-Displays.Erdgeschoss.Buttons_der_Erdgeschoss_TAGs: Verarbeitete Daten:
                                    javascript.0	15:57:35.651	info	script.js.common.EPaper-Displays.Erdgeschoss.Buttons_der_Erdgeschoss_TAGs: Daten empfangen:
                                    javascript.0	15:57:35.652	info	script.js.common.EPaper-Displays.Erdgeschoss.Buttons_der_Erdgeschoss_TAGs: Verarbeitete Daten:
                                    javascript.0	15:57:36.787	info	script.js.common.EPaper-Displays.Erdgeschoss.Buttons_der_Erdgeschoss_TAGs: Daten empfangen:
                                    javascript.0	15:57:36.788	info	script.js.common.EPaper-Displays.Erdgeschoss.Buttons_der_Erdgeschoss_TAGs: Verarbeitete Daten:
                                    javascript.0	15:57:38.823	info	script.js.common.EPaper-Displays.Erdgeschoss.Buttons_der_Erdgeschoss_TAGs: Ping sent
                                    javascript.0	15:57:38.854	info	script.js.common.EPaper-Displays.Erdgeschoss.Buttons_der_Erdgeschoss_TAGs: Pong received
                                    javascript.0	15:57:39.271	info	script.js.common.EPaper-Displays.Erdgeschoss.Buttons_der_Erdgeschoss_TAGs: Daten empfangen:
                                    javascript.0	15:57:39.272	info	script.js.common.EPaper-Displays.Erdgeschoss.Buttons_der_Erdgeschoss_TAGs: Verarbeitete Daten:
                                    javascript.0	15:57:40.007	info	script.js.common.EPaper-Displays.Erdgeschoss.Buttons_der_Erdgeschoss_TAGs: Daten empfangen:
                                    javascript.0	15:57:40.007	info	script.js.common.EPaper-Displays.Erdgeschoss.Buttons_der_Erdgeschoss_TAGs: Verarbeitete Daten:
                                    javascript.0	15:57:40.342	info	script.js.common.EPaper-Displays.Erdgeschoss.Buttons_der_Erdgeschoss_TAGs: Daten empfangen:
                                    javascript.0	15:57:40.343	info	script.js.common.EPaper-Displays.Erdgeschoss.Buttons_der_Erdgeschoss_TAGs: Verarbeitete Daten:
                                    javascript.0	15:57:41.007	info	script.js.common.EPaper-Displays.Erdgeschoss.Buttons_der_Erdgeschoss_TAGs: Daten empfangen:
                                    javascript.0	15:57:41.007	info	script.js.common.EPaper-Displays.Erdgeschoss.Buttons_der_Erdgeschoss_TAGs: Verarbeitete Daten:
                                    javascript.0	15:57:41.790	info	script.js.common.EPaper-Displays.Erdgeschoss.Buttons_der_Erdgeschoss_TAGs: Daten empfangen:
                                    javascript.0	15:57:41.790	info	script.js.common.EPaper-Displays.Erdgeschoss.Buttons_der_Erdgeschoss_TAGs: Verarbeitete Daten:
                                    javascript.0	15:57:42.276	info	script.js.common.EPaper-Displays.Erdgeschoss.Buttons_der_Erdgeschoss_TAGs: Daten empfangen:
                                    javascript.0	15:57:42.277	info	script.js.common.EPaper-Displays.Erdgeschoss.Buttons_der_Erdgeschoss_TAGs: Verarbeitete Daten:
                                    javascript.0	15:57:43.525	info	script.js.common.EPaper-Displays.Erdgeschoss.Buttons_der_Erdgeschoss_TAGs: Daten empfangen:
                                    javascript.0	15:57:43.526	info	script.js.common.EPaper-Displays.Erdgeschoss.Buttons_der_Erdgeschoss_TAGs: Verarbeitete Daten:
                                    javascript.0	15:57:44.582	info	script.js.common.EPaper-Displays.Erdgeschoss.Buttons_der_Erdgeschoss_TAGs: Daten empfangen:
                                    javascript.0	15:57:44.583	info	script.js.common.EPaper-Displays.Erdgeschoss.Buttons_der_Erdgeschoss_TAGs: Verarbeitete Daten:
                                    javascript.0	15:57:46.853	info	script.js.common.EPaper-Displays.Erdgeschoss.Buttons_der_Erdgeschoss_TAGs: Daten empfangen:
                                    javascript.0	15:57:46.854	info	script.js.common.EPaper-Displays.Erdgeschoss.Buttons_der_Erdgeschoss_TAGs: Verarbeitete Daten:
                                    javascript.0	15:57:48.441	info	script.js.common.EPaper-Displays.Erdgeschoss.Buttons_der_Erdgeschoss_TAGs: Daten empfangen:
                                    javascript.0	15:57:48.441	info	script.js.common.EPaper-Displays.Erdgeschoss.Buttons_der_Erdgeschoss_TAGs: Verarbeitete Daten:
                                    javascript.0	15:57:48.824	info	script.js.common.EPaper-Displays.Erdgeschoss.Buttons_der_Erdgeschoss_TAGs: Ping sent
                                    javascript.0	15:57:48.847	info	script.js.common.EPaper-Displays.Erdgeschoss.Buttons_der_Erdgeschoss_TAGs: Pong received
                                    javascript.0	15:57:50.673	info	script.js.common.EPaper-Displays.Erdgeschoss.Buttons_der_Erdgeschoss_TAGs: Daten empfangen:
                                    javascript.0	15:57:50.673	info	script.js.common.EPaper-Displays.Erdgeschoss.Buttons_der_Erdgeschoss_TAGs: Verarbeitete Daten:
                                    javascript.0	15:57:52.308	info	script.js.common.EPaper-Displays.Erdgeschoss.Buttons_der_Erdgeschoss_TAGs: Daten empfangen:
                                    javascript.0	15:57:52.308	info	script.js.common.EPaper-Displays.Erdgeschoss.Buttons_der_Erdgeschoss_TAGs: Verarbeitete Daten:
                                    javascript.0	15:57:52.501	info	script.js.common.EPaper-Displays.Erdgeschoss.Buttons_der_Erdgeschoss_TAGs: Daten empfangen:
                                    javascript.0	15:57:52.501	info	script.js.common.EPaper-Displays.Erdgeschoss.Buttons_der_Erdgeschoss_TAGs: Verarbeitete Daten:
                                    javascript.0	15:57:52.761	info	script.js.common.EPaper-Displays.Erdgeschoss.Buttons_der_Erdgeschoss_TAGs: Daten empfangen:
                                    javascript.0	15:57:52.762	info	script.js.common.EPaper-Displays.Erdgeschoss.Buttons_der_Erdgeschoss_TAGs: Verarbeitete Daten:
                                    javascript.0	15:57:55.489	info	script.js.common.EPaper-Displays.Erdgeschoss.Buttons_der_Erdgeschoss_TAGs: Daten empfangen:
                                    javascript.0	15:57:55.490	info	script.js.common.EPaper-Displays.Erdgeschoss.Buttons_der_Erdgeschoss_TAGs: Verarbeitete Daten:
                                    javascript.0	15:57:57.005	info	script.js.common.EPaper-Displays.Erdgeschoss.Buttons_der_Erdgeschoss_TAGs: Daten empfangen:
                                    javascript.0	15:57:57.005	info	script.js.common.EPaper-Displays.Erdgeschoss.Buttons_der_Erdgeschoss_TAGs: Verarbeitete Daten:
                                    javascript.0	15:57:57.257	info	script.js.common.EPaper-Displays.Erdgeschoss.Buttons_der_Erdgeschoss_TAGs: Daten empfangen:
                                    javascript.0	15:57:57.258	info	script.js.common.EPaper-Displays.Erdgeschoss.Buttons_der_Erdgeschoss_TAGs: Verarbeitete Daten:
                                    javascript.0	15:57:57.424	info	script.js.common.EPaper-Displays.Erdgeschoss.Buttons_der_Erdgeschoss_TAGs: Daten empfangen:
                                    javascript.0	15:57:57.425	info	script.js.common.EPaper-Displays.Erdgeschoss.Buttons_der_Erdgeschoss_TAGs: Verarbeitete Daten:
                                    javascript.0	15:57:57.594	info	script.js.common.EPaper-Displays.Erdgeschoss.Buttons_der_Erdgeschoss_TAGs: Daten empfangen:
                                    javascript.0	15:57:57.594	info	script.js.common.EPaper-Displays.Erdgeschoss.Buttons_der_Erdgeschoss_TAGs: Verarbeitete Daten:
                                    javascript.0	15:57:58.106	info	script.js.common.EPaper-Displays.Erdgeschoss.Buttons_der_Erdgeschoss_TAGs: Daten empfangen:
                                    javascript.0	15:57:58.107	info	script.js.common.EPaper-Displays.Erdgeschoss.Buttons_der_Erdgeschoss_TAGs: Verarbeitete Daten:
                                    javascript.0	15:57:58.234	info	script.js.common.EPaper-Displays.Erdgeschoss.Buttons_der_Erdgeschoss_TAGs: Daten empfangen:
                                    javascript.0	15:57:58.234	info	script.js.common.EPaper-Displays.Erdgeschoss.Buttons_der_Erdgeschoss_TAGs: Verarbeitete Daten:
                                    javascript.0	15:57:58.823	info	script.js.common.EPaper-Displays.Erdgeschoss.Buttons_der_Erdgeschoss_TAGs: Ping sent
                                    javascript.0	15:57:58.936	info	script.js.common.EPaper-Displays.Erdgeschoss.Buttons_der_Erdgeschoss_TAGs: Pong received
                                    javascript.0	15:57:59.522	info	script.js.common.EPaper-Displays.Erdgeschoss.Buttons_der_Erdgeschoss_TAGs: Daten empfangen:
                                    javascript.0	15:57:59.522	info	script.js.common.EPaper-Displays.Erdgeschoss.Buttons_der_Erdgeschoss_TAGs: Verarbeitete Daten:
                                    javascript.0	15:58:00.619	info	script.js.common.EPaper-Displays.Erdgeschoss.Buttons_der_Erdgeschoss_TAGs: Daten empfangen:
                                    javascript.0	15:58:00.620	info	script.js.common.EPaper-Displays.Erdgeschoss.Buttons_der_Erdgeschoss_TAGs: Verarbeitete Daten:
                                    javascript.0	15:58:02.135	info	script.js.common.EPaper-Displays.Erdgeschoss.Buttons_der_Erdgeschoss_TAGs: Daten empfangen:
                                    javascript.0	15:58:02.135	info	script.js.common.EPaper-Displays.Erdgeschoss.Buttons_der_Erdgeschoss_TAGs: Verarbeitete Daten:
                                    javascript.0	15:58:03.096	info	script.js.common.EPaper-Displays.Erdgeschoss.Buttons_der_Erdgeschoss_TAGs: Daten empfangen:
                                    javascript.0	15:58:03.096	info	script.js.common.EPaper-Displays.Erdgeschoss.Buttons_der_Erdgeschoss_TAGs: Verarbeitete Daten:
                                    
                                    

                                    Da ist also heftig was los.

                                    Gibt es keine Möglichkeit, das das Skript auf eine "Buttonbetätigung" wartet?

                                    S Do not disturb
                                    S Do not disturb
                                    stenmic
                                    wrote on last edited by stenmic
                                    #694

                                    Ich bin mir nicht sicher, ob es hier schon eine Lösung für nen Json-String gibt.
                                    Hab beim Durchlesen jedenfalls keine gefunden.

                                    Hier ist meine Lösung.

                                    Als erstes muss "axios" im Javascript Adapter hinzugefügt werden:
                                    2024-08-03 07 08 27.jpg

                                    Der Tag muss auf "Json template" eingestellt werden:
                                    2024-08-03 07 07 34.jpg

                                    Und hier das Blockly, sollte selbsterklärend sein:

                                    2024-08-03 07 06 18.jpg

                                    Die Funktion:
                                    2024-08-03 07 06 27.jpg

                                    Blockly:


                                    <xml xmlns="https://developers.google.com/blockly/xml">
                                    <variables>
                                    <variable id="^bhgSAw+X+YJvf?RhU3">AP_IP</variable> <variable id="uc8fh+2kjeHGm-/vox=3">TAG_MAC</variable> <variable id="$Ig5a7mq0|-|sEkjT7ur">JS</variable> </variables> <block type="procedures_defcustomnoreturn" id="l{VWT5d2R8(RDtcq_L|-" x="163" y="-787"> <mutation statements="false"> <arg name="AP_IP" varid="^bhgSAw+X+YJvf?RhU3"></arg>
                                    <arg name="TAG_MAC" varid="uc8fh+2kjeHGm-/vox=3"></arg>
                                    <arg name="JS" varid="$Ig5a7mq0|-|sEkjT7ur"></arg>
                                    </mutation>
                                    <field name="NAME">OpenEPaperJson</field>
                                    <field name="SCRIPT">Y29uc3QgYXhpb3MgPSByZXF1aXJlKCdheGlvcycpOw0KDQpjb25zdCBvYmogPSB7DQogIG1hYzogVEFHX01BQywNCiAganNvbjogSlMsDQp9Ow0KDQpjb25zdCBkYXRhID0gT2JqZWN0LmtleXMob2JqKQ0KICAubWFwKChrZXkpID0+IGAke2tleX09JHtlbmNvZGVVUklDb21wb25lbnQob2JqW2tleV0pfWApDQogIC5qb2luKCcmJyk7DQoNCmNvbnN0IG9wdGlvbnMgPSB7DQogIG1ldGhvZDogJ1BPU1QnLA0KICBoZWFkZXJzOiB7ICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJyB9LA0KICB1cmw6ICdodHRwOi8vJytBUF9JUCsnL2pzb251cGxvYWQnLA0KICBkYXRhDQp9Ow0KDQphd2FpdCBheGlvcyhvcHRpb25zKTsNCi8vY29uc29sZS5sb2cob3B0aW9ucyk7</field>
                                    <comment pinned="false" h="80" w="160">Beschreibe diese Funktion …</comment>
                                    </block>
                                    <block type="procedures_callcustomnoreturn" id="ZR0:KP{+eKkQUre=m" x="163" y="-737"> <mutation name="OpenEPaperJson"> <arg name="AP_IP"></arg> <arg name="TAG_MAC"></arg> <arg name="JS"></arg> </mutation> <value name="ARG0"> <block type="text" id="8m.We}frb),Frmeu7S(?"> <field name="TEXT">192.168.178.xxx</field> </block> </value> <value name="ARG1"> <block type="text" id="yk4}TL@=?^fe$@Tct/B">
                                    <field name="TEXT">0000021F1D31xxxx</field>
                                    </block>
                                    </value>
                                    <value name="ARG2">
                                    <block type="text" id="Jq[@4;8ac*CU/g}jB82I">
                                    <field name="TEXT">[ {"text": [5,5,"Bahnschrift 20","fonts/bahnschrift20",1]}, {"box": [10,30,20,20,1]}, {"box": [35,30,20,20,2]}, {"triangle": [60,30,60,50,80,40,1]}, {"text": [5,80,"Plain text glasstown_nbp_tf","glasstown_nbp_tf",1]}, {"text": [5,95,"Plain text 7x14_tf","7x14_tf",2]}, {"text": [5,110,"Plain text t0_14b_tf","t0_14b_tf",1]}, {"text": [135,5,"30","fonts/bahnschrift30",2]}, {"text": [215,5,"70","fonts/bahnschrift70",1]}, {"text": [150,80,"50","fonts/calibrib50",2,0]}, {"text": [205,60,"80","fonts/calibrib80",2]}, {"text": [90,35,"calibrib30","fonts/calibrib30",1]}, {"line": [10,120,290,120,1]}, {"line": [10,115,290,115,2]} ]</field>
                                    </block>
                                    </value>
                                    </block>
                                    </xml>

                                    Hier noch die Erklärung wie der json String aussehen muss

                                    1 Reply Last reply
                                    3
                                    • F Offline
                                      F Offline
                                      Freak
                                      wrote on last edited by
                                      #695

                                      Hallo Zusammen,

                                      ich habe ein Problem mit einem Tag.
                                      Ich hatte den Accesspoint einige Zeit außer Betrieb. Als ich ihn wieder verwenden wollte zeigte eines meiner Displays folgendes Bild:
                                      1.jpg

                                      Auch beim wechseln der Batterien scheint das Display nicht zu starten. Der Bildschirm bleibt immer gleich.
                                      Neue Batterien haben auch nicht geholfen.
                                      Alle anderen Tags funktionieren Tadellos mit dem Accesspoint.
                                      Gibt es einen Trick um den Tag aus dem Sleepmode zu holen?
                                      Batteriekontakte kurzschließen bringt leider auch nichts.

                                      Ich hoffe einer von euch kann mir weiterhelfen.

                                      danke

                                      BananaJoeB 1 Reply Last reply
                                      0
                                      • F Freak

                                        Hallo Zusammen,

                                        ich habe ein Problem mit einem Tag.
                                        Ich hatte den Accesspoint einige Zeit außer Betrieb. Als ich ihn wieder verwenden wollte zeigte eines meiner Displays folgendes Bild:
                                        1.jpg

                                        Auch beim wechseln der Batterien scheint das Display nicht zu starten. Der Bildschirm bleibt immer gleich.
                                        Neue Batterien haben auch nicht geholfen.
                                        Alle anderen Tags funktionieren Tadellos mit dem Accesspoint.
                                        Gibt es einen Trick um den Tag aus dem Sleepmode zu holen?
                                        Batteriekontakte kurzschließen bringt leider auch nichts.

                                        Ich hoffe einer von euch kann mir weiterhelfen.

                                        danke

                                        BananaJoeB Online
                                        BananaJoeB Online
                                        BananaJoe
                                        Most Active
                                        wrote on last edited by
                                        #696

                                        @freak Hast du zwischenzeitlich den Kanal gewechselt? Falls du den Tag vorher auf einen festen Kanal gestellt hast und das Roaming deaktiviert hattest, könnte das ein Problem sein.

                                        ioBroker@Ubuntu 24.04 LTS (VMware) für: >260 Geräte, 5 Switche, 7 AP, 9 IP-Cam, 1 NAS 42TB, 1 ESXi 15TB, 4 Proxmox 1TB, 1 Hyper-V 44TB, 14 x Echo, 5x FireTV, 5 x Tablett/Handy VIS || >=157 Tasmota/Shelly || >=88 ZigBee || PV 8.1kW / Akku 14kWh || 2x USV 900/750W kaskadiert || Creality CR-10 SE 3D-Drucker

                                        O 1 Reply Last reply
                                        0
                                        • F Offline
                                          F Offline
                                          Freak
                                          wrote on last edited by
                                          #697

                                          @BananaJoe Danke für deine Rückmeldung. Nein, daran habe ich nichts geändert. Schau ich mir aber nochmal an.

                                          Beim Einlegen der Batterien sollte ja normalerweise auch der Openepaperlink startbildschirm auf dem Display erscheinen, aber das passiert auch nicht. Ich habe eher die Vermutung, dass das Display gar nichts macht.

                                          D 1 Reply Last reply
                                          0
                                          Reply
                                          • Reply as topic
                                          Log in to reply
                                          • Oldest to Newest
                                          • Newest to Oldest
                                          • Most Votes


                                          Support us

                                          ioBroker
                                          Community Adapters
                                          Donate

                                          596

                                          Online

                                          32.4k

                                          Users

                                          81.4k

                                          Topics

                                          1.3m

                                          Posts
                                          Community
                                          Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
                                          ioBroker Community 2014-2025
                                          logo
                                          • Login

                                          • Don't have an account? Register

                                          • Login or register to search.
                                          • First post
                                            Last post
                                          0
                                          • Recent
                                          • Tags
                                          • Unread 0
                                          • Categories
                                          • Unreplied
                                          • Popular
                                          • GitHub
                                          • Docu
                                          • Hilfe