Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Praktische Anwendungen (Showcase)
    4. E-INK Display OpenEPaperLink - Displayanzeige mit Batterie

    NEWS

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

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    E-INK Display OpenEPaperLink - Displayanzeige mit Batterie

    This topic has been deleted. Only users with topic management privileges can see it.
    • A
      atc @haselchen last edited by

      @haselchen Ohne mich irgendwie einklinken zu wollen aber nun tue ich es doch ^^
      Er hat ja nicht "nö" gesagt sondern das er nur deswegen kein neues Release macht nur um diesen Fehler zu beseitigen, sprich v2.70a nur dafür, wie er ja auch sagte ist es bereits gefixt und wird im nächsten Release enthalten sein

      1 Reply Last reply Reply Quote 0
      • B
        Beowolf last edited by

        In den Einstellungen gibt es den Punkt "AP discovery method".

        Dort kann man zwischen "Multicast" und "Broadcast" wählen.

        Was ist das und wird es benötigt?

        M 1 Reply Last reply Reply Quote 0
        • M
          micklafisch @Beowolf last edited by

          @beowolf
          wenn du nur einen AP in Betrieb hast ist es egal. Erst wenn mehrere im gleichen Netz sind und die sich finden sollen dann ist die Einstellung wichtig.

          Manche Netze bzw. deren Router haben mit UDP Multicast Paketen Probleme, von daher wurde der UDP Broadcast eingebaut (damit wiederum geht dann aber z.b. kein VLAN/Subnetze).

          F B 2 Replies Last reply Reply Quote 1
          • F
            Flowski @micklafisch last edited by

            Jemand eine Idee woher man aktuell einen fertigen Access Point zu kaufen bekommt?

            Eisbaeeer A 2 Replies Last reply Reply Quote 0
            • B
              Beowolf @micklafisch last edited by

              @micklafisch
              Ich habe drei im Einsatz. Jede Etage hat einen eigenen.

              Ich bin dazu übergegangen, jedem TAG den festen Kanal zu seinem AP zu geben. Das läuft im Momemt am besten.

              1 Reply Last reply Reply Quote -1
              • Eisbaeeer
                Eisbaeeer Developer @Flowski last edited by

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

                Jemand eine Idee woher man aktuell einen fertigen Access Point zu kaufen bekommt?

                Ich hätte noch einen neuen hier liegen. Es ist ein Yellow_AP Zigbee & sub_GHz Modul. Also dualband.
                Post: https://forum.iobroker.net/post/1180802

                Meld dich mal per PM falls du Interesse hast.
                Gruß Lars

                1 Reply Last reply Reply Quote 0
                • B
                  bimmi last edited by

                  Gab wieder neue Firmware Version. Da muss glaub ich @BananaJoe wieder ran.

                  Für ap und die solum tags

                  Die Bildqualität leidet leider mit dem up und downscale 😅 es wird nie langweilig!

                  BananaJoe 1 Reply Last reply Reply Quote 0
                  • BananaJoe
                    BananaJoe Most Active @bimmi last edited by

                    @bimmi Schaue ich morgen mal an.
                    Mit welcher Lösung skalierst du im Moment? Ich nutze ja nur noch Playwright (wobei ich mal schauen muss, da müsste inzwischen endlich eine Version verfügbar sein die unter Ubuntu 24.04 läuft)

                    B 1 Reply Last reply Reply Quote 0
                    • B
                      bimmi @BananaJoe last edited by

                      @bananajoe ich nutze puppeteer in Verbindung mit convert. Es läuft auch super soweit.

                      Ich muss ebenfalls noch ein bisschen testen. Ist mir nur an einem Tag bisher aufgefallen und ich hab alle schon geupdatet.

                      BananaJoe 1 Reply Last reply Reply Quote 0
                      • A
                        atc @Flowski last edited by

                        @flowski Hier gibt es auch einen AP
                        https://www.kleinanzeigen.de/s-anzeige/50x-e-paper-elektronische-preisschild-2-6-und-2-2-/2902317130-168-2829

                        1 Reply Last reply Reply Quote 0
                        • BananaJoe
                          BananaJoe Most Active last edited by

                          @Eisbaeeer irgendwie zickt mein Yellow nach dem Upgrade herum:
                          8e408e48-b53f-44aa-a06a-e104b7d50e3d-image.png
                          3e114ad7-2991-4d79-8a61-df2da63bbec2-image.png
                          Die Anzeige ist ja auch neu ... meine ich. Auch auf meinem alten AP dauert das nun einige Sekunden bis die auf "Online" umspringt.
                          93075718-0bdc-496b-a8d8-4206fee40ef0-image.png
                          Was funktioniert und was nicht bin ich noch am schauen ...

                          A 1 Reply Last reply Reply Quote 0
                          • A
                            atc @BananaJoe last edited by

                            @bananajoe Es gibt derzeit einen Bug in der C6 Firmware,
                            Um den erst einmal zu Fixen diese 4 dateien einer alten C6 Firmware in den base Ordner vom AP hochladen und dann unter update "Update ESP32-C6" Klicken jedoch vorher den hacken von download latest version entfernen

                            https://github.com/OpenEPaperLink/OpenEPaperLink/tree/ddd043f44fae702f82c7132008a323d5e8301a0f/binaries/ESP32-C6

                            BananaJoe 1 Reply Last reply Reply Quote 1
                            • BananaJoe
                              BananaJoe Most Active @atc last edited by

                              @atc Danke, hast mir den Tag gerettet.
                              Ich hatte mir das schon gedacht (nachdem ich gesehen habe das in der aktuellen Version irgendeine Pin-Belegung geändert wurde) und war auf der Suche nach einer älteren, bin aber noch nicht fündig geworden.

                              1 Reply Last reply Reply Quote 0
                              • BananaJoe
                                BananaJoe Most Active @bimmi last edited by

                                @bimmi warum sollte sich da eigentlich was am Bild ändern nach dem Update?

                                1 Reply Last reply Reply Quote 0
                                • B
                                  Beowolf last edited by

                                  Ich habe drei von den yellow APs hier laufen. Damit habe ich keine Probleme.

                                  Ich hatte allerdings erst auf "Update latest Version" geklickt und musste danach noch einmal bei "Environment" den "ESP32_S3_16_8_YELLOW_AP" auswählen.
                                  Dann habe ich bei ESP32 und Filesystem das Update noch mal manuell angestossen.

                                  Habe 75 TAGs am laufen.

                                  72.jpg

                                  O BananaJoe 3 Replies Last reply Reply Quote 1
                                  • O
                                    oxident @Beowolf last edited by

                                    @beowolf 75 Tags? Hast Du damit tapeziert??

                                    B 1 Reply Last reply Reply Quote 0
                                    • BananaJoe
                                      BananaJoe Most Active @Beowolf last edited by

                                      @beowolf Ich hatte erst danach geschnallt das es schlich verstellt war, gibt ja auch schon ein Issue dazu auf Github:
                                      https://github.com/OpenEPaperLink/OpenEPaperLink/issues/409
                                      Und dann unten den ESP geupdated, das war wohl mein Problem

                                      gitpower2017 created this issue in OpenEPaperLink/OpenEPaperLink

                                      closed Repro-Bug after Update from 7.0 to 7.5? #409

                                      1 Reply Last reply Reply Quote 0
                                      • BananaJoe
                                        BananaJoe Most Active @Beowolf last edited by BananaJoe

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

                                        Habe 75 TAGs am laufen.

                                        Ist man da nicht recht viel mit Batteriewechseln beschäftigt? Wie behältst du da den Überblick wo ein Wechsel Notwendig ist? So etwas wie den Device-Watcher gibt es hier ja nicht.

                                        1 Reply Last reply Reply Quote 0
                                        • B
                                          Beowolf last edited by

                                          Die Batteriespannung kann ich mir aber holen.

                                          batterie.jpg

                                          Ich habe dieses Skript ja am laufen.

                                          // HIER DIE IP ADRESSE VOM OEPL ACCESS POINT EINTRAGEN
                                          const serverIP = 'xxx.xxx.xxx.xxx';  // z.B. 192.168.1.71
                                          
                                          // 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_Dachgeschoss';  // Datenpunkt zur Steuerung des Skripts
                                          
                                          function ensureOpenEPaperLinkFolderExists(callback) {
                                              const OpenEPaperLinkFolderPath = '0_userdata.0.Tag_Buttons.Dachgeschoss';
                                              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.Dachgeschoss.${tag.mac.replace(/:/g, '')}`;
                                                      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();
                                          
                                          BananaJoe 1 Reply Last reply Reply Quote 1
                                          • B
                                            Beowolf @oxident last edited by

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

                                            @beowolf 75 Tags? Hast Du damit tapeziert??

                                            Die sind nur alle am AP angemeldet. Nur zum Testen.

                                            1 Reply Last reply Reply Quote 1
                                            • First post
                                              Last post

                                            Support us

                                            ioBroker
                                            Community Adapters
                                            Donate

                                            1.1k
                                            Online

                                            31.7k
                                            Users

                                            79.7k
                                            Topics

                                            1.3m
                                            Posts

                                            42
                                            991
                                            236514
                                            Loading More Posts
                                            • Oldest to Newest
                                            • Newest to Oldest
                                            • Most Votes
                                            Reply
                                            • Reply as topic
                                            Log in to reply
                                            Community
                                            Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
                                            The ioBroker Community 2014-2023
                                            logo