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.
    • BananaJoe
      BananaJoe Most Active @Beowolf last edited by BananaJoe

      @beowolf wenn du im Skript alle console.log Einträge auskommentieren würdest, wäre es "ruhiger"
      console.warn und console.error kannst du ja drin lassen um Fehler zu sehen

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

        @bananajoe

        Hast Du nen Plan, wie ich die Update Zeit auf den Tag bekomme?
        Irgendwo klein oben unten , rechts , links?
        Ich würde gerne sehen, wann die Daten sich zuletzt aktualisiert haben.

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

          @haselchen naja, ich nutze ja die VIS-Screenshot-Methode.
          Und habe das in die VIS eingebaut:
          ed7b80f7-d960-4ac6-8b35-3c938f218889-image.png
          d484f39e-d50b-4706-9c1b-1fd30b0c1dd6-image.png
          Und das auf einen der Datenpunkte dort:
          4cb56f01-4b0c-43d3-87a7-8c38ef7df6b5-image.png
          Die werden bei mir so alle 15 Sekunden aktualisiert (die Temperaturen), mir reicht das um zu sehen ob noch alles läuft.
          Alternativ eine JavaScript-Uhr

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

            Hier jetzt mal mein Skript zur Abfrage der Buttons mit etwas "ruhigerem" LOG.

            Es kann/muß ein Datenpunkt erstellt werden, der das Skript startet bzw. beendet.

            // HIER DIE IP ADRESSE VOM OEPL ACCESS POINT EINTRAGEN
            const serverIP = '192.168.49.186';  // 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_Erdgeschoss';  // Datenpunkt zur Steuerung des Skripts  - anhalten oder starten
            
            function ensureOpenEPaperLinkFolderExists(callback) {
                const OpenEPaperLinkFolderPath = '0_userdata.0.Tag_Buttons.Erdgeschoss';
                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, '')}`;
                        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();
            

            Grüße

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

              @bananajoe

              Ich mach das über ne YAML per HA.
              Irgendwie ne Idee was man da eintragen könnte für die update Anzeige?

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

                @haselchen naja, gibt es so etwas wie globale Variablen mit der aktuellen Uhrzeit? Oder einen Datenpunkt? sonst bau dir einen

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

                  @bananajoe

                  Ich guck mal was Github zu bieten hat. YAML ist nicht meine Welt .
                  Aber mal schauen , vielleicht werden wir beide am Ende Freunde 😜

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

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

                    YAML ist nicht meine Welt

                    ob nun JSON mit Klammern, Anführungsstrichen und Kommas oder YAML mit seinen Einrückungen ...
                    Ja, ich mag JSON auch lieber.

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

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

                      Hatte ich gelesen und auch auf Github den Kommentar zu dem „Problem“.
                      Finde ich ein wenig ignorant vom Entwickler eine Version rauszubringen, die augenscheinlich ein Kosmetikproblem hat und dann den Bug nicht beheben zu wollen .
                      Ich denke, dass wird ne Minutensache sein , den Fix online zu stellen.
                      Ich selber habe ewig damit verbracht , dass zu korrigieren.
                      Und ich denke viele werden sich das System zerschiessen bei der Korrektur.
                      Das Verhalten ist wirklich schade , weil ich echt viel von ihm halte.

                      Ich kann deinen Frust absolut nicht nachvollziehen.

                      Bitte bedenke, dass Entwickler bei Projekten – gerade Open-Source – oft Prioritäten setzen müssen. Auch wenn es "nur" ein kosmetischer Fehler ist, wird für jede Änderung Zeit in Tests und Qualitätssicherung investiert, um sicherzustellen, dass nichts anderes kaputtgeht. Das kann manchmal mehr Aufwand bedeuten, als es zunächst scheint.

                      Außerdem ist es gut möglich, dass der Code inzwischen weiterentwickelt wurde. Ein erneutes Kompilieren könnte nicht nur diesen kosmetischen Fehler beheben, sondern auch Verbesserungen oder Verschlechterungen mit sich bringen.

                      Letztendlich bleibt es schade, dass dieser Bug bisher nicht angegangen wurde, aber solche Abwägungen gehören leider zum Entwicklungsprozess dazu.

                      haselchen 1 Reply Last reply Reply Quote 2
                      • haselchen
                        haselchen Most Active @bimmi last edited by

                        @bimmi

                        Mir ging es hauptsächlich um die Reaktion des Entwicklers .
                        Wenn ein User höflich fragt und er dann „nö“ sagt.

                        A 1 Reply Last reply Reply Quote 1
                        • 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
                                            • First post
                                              Last post

                                            Support us

                                            ioBroker
                                            Community Adapters
                                            Donate

                                            1.0k
                                            Online

                                            31.7k
                                            Users

                                            79.7k
                                            Topics

                                            1.3m
                                            Posts

                                            42
                                            991
                                            235737
                                            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