Skip to content
  • Home
  • Aktuell
  • Tags
  • 0 Ungelesen 0
  • Kategorien
  • Unreplied
  • Beliebt
  • GitHub
  • Docu
  • Hilfe
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Standard: (Kein Skin)
  • Kein Skin
Einklappen
ioBroker Logo

Community Forum

  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.2k

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

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

E-INK Display OpenEPaperLink - Displayanzeige mit Batterie

Geplant Angeheftet Gesperrt Verschoben Praktische Anwendungen (Showcase)
1.0k Beiträge 48 Kommentatoren 344.1k Aufrufe 52 Watching
  • Älteste zuerst
  • Neuste zuerst
  • Meiste Stimmen
Antworten
  • In einem neuen Thema antworten
Anmelden zum Antworten
Dieses Thema wurde gelöscht. Nur Nutzer mit entsprechenden Rechten können es sehen.
  • EisbaeeerE Eisbaeeer

    @oxident Es gibt Tags die nicht über Zigbee funken, sondern das 868MHz Band benutzen.
    Infos dazu auf openepaperlink unter Hardware.
    Grüße Lars

    B Offline
    B Offline
    bimmi
    schrieb am zuletzt editiert von
    #663

    @eisbaeeer leider noch recht buggy. Die Kommunikation mit c6 und dem cc1101 hat noch ein paar Probleme mit der queue. Bin seit der ersten Alpha mit dabei 868 Mhz.

    Gruß Bimmi

    iobroker in einer Proxmox Umgebung auf einem ausrangierten DELL OptiPlex 3080 24GB i5 in der VM auf SSD. Nutze den slaeh zigbee Router mit Tür- und Temperatursensoren von Aqara, viele Tasmota Devices, Unifi AP, Sprinklecontrol, günstige E-INK Displays, Adguard und noch vieles mehr 😬

    EisbaeeerE 1 Antwort Letzte Antwort
    0
    • B bimmi

      @eisbaeeer leider noch recht buggy. Die Kommunikation mit c6 und dem cc1101 hat noch ein paar Probleme mit der queue. Bin seit der ersten Alpha mit dabei 868 Mhz.

      EisbaeeerE Offline
      EisbaeeerE Offline
      Eisbaeeer
      Developer
      schrieb am zuletzt editiert von
      #664

      @bimmi Ja, das glaub ich. Die Binary war auch erst vor ein paar Tagen verfügbar. In dem Projekt tut sich noch sehr viel. Und ich glaube das wird nie fertig ;-)
      Welche Displays nutzt du mit SubGHz?
      Ich hab da eins mit 7" gefunden. Wenn ich nur wüsste, was ich da drauf anzeigen soll :-)

      Kein support per PM. Bitte im Forum Fragen stellen!

      B 1 Antwort Letzte Antwort
      0
      • EisbaeeerE Eisbaeeer

        @bimmi Ja, das glaub ich. Die Binary war auch erst vor ein paar Tagen verfügbar. In dem Projekt tut sich noch sehr viel. Und ich glaube das wird nie fertig ;-)
        Welche Displays nutzt du mit SubGHz?
        Ich hab da eins mit 7" gefunden. Wenn ich nur wüsste, was ich da drauf anzeigen soll :-)

        B Offline
        B Offline
        bimmi
        schrieb am zuletzt editiert von
        #665

        @eisbaeeer hehe ja aktuell zeig ich mir die Uhrzeit an :D einfach um festzustellen wann sich der AP aufhängt ;) Ich bin auch sehr froh, dass extrem viel an Energie da reingesteckt wird. Kann alles nur besser werden! Wenn man überlegt wie das am Anfang war...

        Ich habe hier Chroma74 Rot da!

        Gruß Bimmi

        iobroker in einer Proxmox Umgebung auf einem ausrangierten DELL OptiPlex 3080 24GB i5 in der VM auf SSD. Nutze den slaeh zigbee Router mit Tür- und Temperatursensoren von Aqara, viele Tasmota Devices, Unifi AP, Sprinklecontrol, günstige E-INK Displays, Adguard und noch vieles mehr 😬

        EisbaeeerE 1 Antwort Letzte Antwort
        0
        • B bimmi

          @eisbaeeer hehe ja aktuell zeig ich mir die Uhrzeit an :D einfach um festzustellen wann sich der AP aufhängt ;) Ich bin auch sehr froh, dass extrem viel an Energie da reingesteckt wird. Kann alles nur besser werden! Wenn man überlegt wie das am Anfang war...

          Ich habe hier Chroma74 Rot da!

          EisbaeeerE Offline
          EisbaeeerE Offline
          Eisbaeeer
          Developer
          schrieb am zuletzt editiert von
          #666

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

          Ich habe hier Chroma74 Rot da!

          :two_hearts:

          Kein support per PM. Bitte im Forum Fragen stellen!

          EisbaeeerE 1 Antwort Letzte Antwort
          1
          • EisbaeeerE Eisbaeeer

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

            Ich habe hier Chroma74 Rot da!

            :two_hearts:

            EisbaeeerE Offline
            EisbaeeerE Offline
            Eisbaeeer
            Developer
            schrieb am zuletzt editiert von Eisbaeeer
            #667

            Falls noch jemand einen Yellow_AP haben möchte (unterstützt Zigbee & SubGHz), ich habe noch einen einzigen. Danach wird es keine mehr geben. Alle weg.
            9d775c6c-c3d0-4220-bb7d-7f4d34250f77-20240628_224837.jpg
            b8101fb6-4514-44b9-b33b-c170191c04fd-20240628_230823.jpg

            3b61a957-ab61-49eb-a600-95cc89f16a42-20240628_234942.jpg

            Grüße Lars

            Kein support per PM. Bitte im Forum Fragen stellen!

            1 Antwort Letzte Antwort
            0
            • D Online
              D Online
              diwoma
              schrieb am zuletzt editiert von
              #668

              Hi Leute,
              Ich hätte mal eine allgemeine Frage:
              Wo bekommt Ihr die AP und vor allem die Tag's her?

              Ich habe anfangs auch damit herumgespielt und es hat mir gefallen.
              Aber nachdem von den 5 Tag die ich hatte nur mehr 2 funktionieren, habe ich das Projekt auf Eis gelegt.

              Aber ich würde gerne damit weiterarbeiten, wenn ich weitere Tag hätte.

              -- diwoma

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

              B 1 Antwort Letzte Antwort
              0
              • D diwoma

                Hi Leute,
                Ich hätte mal eine allgemeine Frage:
                Wo bekommt Ihr die AP und vor allem die Tag's her?

                Ich habe anfangs auch damit herumgespielt und es hat mir gefallen.
                Aber nachdem von den 5 Tag die ich hatte nur mehr 2 funktionieren, habe ich das Projekt auf Eis gelegt.

                Aber ich würde gerne damit weiterarbeiten, wenn ich weitere Tag hätte.

                B Offline
                B Offline
                Beowolf
                schrieb am zuletzt editiert von
                #669

                @diwoma

                Von 5 funktionieren nur noch 2?

                Was machst du mit den Dinger?

                APs wurden gerade etwas weiter oben angeboten. TAGs, schaue mal bei Youtube nach "open epaper" und dann nach dem Youtuber "Christophel". Einfach mal ansprechen.

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

                D 1 Antwort Letzte Antwort
                0
                • B Beowolf

                  @diwoma

                  Von 5 funktionieren nur noch 2?

                  Was machst du mit den Dinger?

                  APs wurden gerade etwas weiter oben angeboten. TAGs, schaue mal bei Youtube nach "open epaper" und dann nach dem Youtuber "Christophel". Einfach mal ansprechen.

                  D Online
                  D Online
                  diwoma
                  schrieb am zuletzt editiert von diwoma
                  #670

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

                  Was machst du mit den Dinger?

                  Wahrscheinlich zu oft resettet, weil ich damals Probleme mit dem AP hatte.

                  APs wurden gerade etwas weiter oben angeboten. TAGs, schaue mal bei Youtube nach "open epaper" und dann nach dem Youtuber "Christophel". Einfach mal ansprechen.

                  Christophel habe ich auf Youtube mal was geschrieben, aber darauf keine Antwort bekommen.
                  Und die restlichen laufen jetzt so einigermaßen. Deshalb ist das Projekt eingeschlafen.

                  Aber wenn ich wieder Tag's bekommen kann, würde ich daran weiterarbeiten.

                  -- diwoma

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

                  B 1 Antwort Letzte Antwort
                  0
                  • B Offline
                    B Offline
                    Beowolf
                    schrieb am zuletzt editiert von
                    #671

                    Ich hatte Aaron angefragt.

                    Er hat mir diese E-Mail Adresse gegeben.

                    eink@43u.de

                    Einfach antickern.

                    Er ist sehr nett und hilfsbereit.

                    Grüße

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

                    D 1 Antwort Letzte Antwort
                    0
                    • D diwoma

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

                      Was machst du mit den Dinger?

                      Wahrscheinlich zu oft resettet, weil ich damals Probleme mit dem AP hatte.

                      APs wurden gerade etwas weiter oben angeboten. TAGs, schaue mal bei Youtube nach "open epaper" und dann nach dem Youtuber "Christophel". Einfach mal ansprechen.

                      Christophel habe ich auf Youtube mal was geschrieben, aber darauf keine Antwort bekommen.
                      Und die restlichen laufen jetzt so einigermaßen. Deshalb ist das Projekt eingeschlafen.

                      Aber wenn ich wieder Tag's bekommen kann, würde ich daran weiterarbeiten.

                      B Offline
                      B Offline
                      bimmi
                      schrieb am zuletzt editiert von
                      #672

                      @diwoma oder über discord atc1441 anschreiben. Das ist Aaron.

                      Gruß Bimmi

                      iobroker in einer Proxmox Umgebung auf einem ausrangierten DELL OptiPlex 3080 24GB i5 in der VM auf SSD. Nutze den slaeh zigbee Router mit Tür- und Temperatursensoren von Aqara, viele Tasmota Devices, Unifi AP, Sprinklecontrol, günstige E-INK Displays, Adguard und noch vieles mehr 😬

                      1 Antwort Letzte Antwort
                      1
                      • B Offline
                        B Offline
                        Beowolf
                        schrieb am zuletzt editiert von
                        #673

                        Gibt es einen einfachen Weg um einen Grafana-Diagramm auf ein Display zu bekommen?

                        Ich bin mir nicht sicher, ob das mit dem Grafana Image Renderer geht. Läuft der auf einem Raspberry pi4?

                        Grüße

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

                        EisbaeeerE 1 Antwort Letzte Antwort
                        0
                        • B Beowolf

                          Ich hatte Aaron angefragt.

                          Er hat mir diese E-Mail Adresse gegeben.

                          eink@43u.de

                          Einfach antickern.

                          Er ist sehr nett und hilfsbereit.

                          Grüße

                          D Online
                          D Online
                          diwoma
                          schrieb am zuletzt editiert von
                          #674

                          @beowolf Danke, er hat schon geantwortet.

                          -- diwoma

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

                          1 Antwort Letzte Antwort
                          0
                          • B Beowolf

                            Gibt es einen einfachen Weg um einen Grafana-Diagramm auf ein Display zu bekommen?

                            Ich bin mir nicht sicher, ob das mit dem Grafana Image Renderer geht. Läuft der auf einem Raspberry pi4?

                            Grüße

                            EisbaeeerE Offline
                            EisbaeeerE Offline
                            Eisbaeeer
                            Developer
                            schrieb am zuletzt editiert von Eisbaeeer
                            #675

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

                            Gibt es einen einfachen Weg um einen Grafana-Diagramm auf ein Display zu bekommen?

                            Ich bin mir nicht sicher, ob das mit dem Grafana Image Renderer geht. Läuft der auf einem Raspberry pi4?

                            Grüße

                            Ich nutze VIS mit snapshot wie oben beschrieben. Geht wunderbar. Einfach im VIS die Werte auf der View ablegen und es wird auf dem Display dargestellt. Geht auch mit Graphen.
                            669bab7d-43cf-4ed2-b12d-9a81233e293f-20240626_154220.jpg

                            Kein support per PM. Bitte im Forum Fragen stellen!

                            1 Antwort Letzte Antwort
                            0
                            • D Online
                              D Online
                              diwoma
                              schrieb am zuletzt editiert von diwoma
                              #676

                              @eisbaeeer
                              Ich glaube aber, das wird nicht mit Grafana gehen, so wie die Frage war.
                              Da müsssen sicher Vis-spezifische Graphen gebaut werden

                              -- diwoma

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

                              EisbaeeerE 1 Antwort Letzte Antwort
                              0
                              • D diwoma

                                @eisbaeeer
                                Ich glaube aber, das wird nicht mit Grafana gehen, so wie die Frage war.
                                Da müsssen sicher Vis-spezifische Graphen gebaut werden

                                EisbaeeerE Offline
                                EisbaeeerE Offline
                                Eisbaeeer
                                Developer
                                schrieb am zuletzt editiert von Eisbaeeer
                                #677

                                @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.

                                Kein support per PM. Bitte im Forum Fragen stellen!

                                B 1 Antwort Letzte Antwort
                                0
                                • 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
                                  schrieb am zuletzt editiert von
                                  #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 Antwort Letzte Antwort
                                  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 Online
                                    D Online
                                    diwoma
                                    schrieb am zuletzt editiert von
                                    #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 Antwort Letzte Antwort
                                    0
                                    • B Offline
                                      B Offline
                                      Beowolf
                                      schrieb am zuletzt editiert von
                                      #680

                                      Es scheint so. Mit einem iFrame geht es nicht.

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

                                      1 Antwort Letzte Antwort
                                      0
                                      • B Offline
                                        B Offline
                                        Beowolf
                                        schrieb am zuletzt editiert von 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 Antworten Letzte Antwort
                                        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
                                          schrieb am zuletzt editiert von
                                          #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 Antworten Letzte Antwort
                                          0
                                          Antworten
                                          • In einem neuen Thema antworten
                                          Anmelden zum Antworten
                                          • Älteste zuerst
                                          • Neuste zuerst
                                          • Meiste Stimmen


                                          Support us

                                          ioBroker
                                          Community Adapters
                                          Donate

                                          650

                                          Online

                                          32.4k

                                          Benutzer

                                          81.4k

                                          Themen

                                          1.3m

                                          Beiträge
                                          Community
                                          Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen | Einwilligungseinstellungen
                                          ioBroker Community 2014-2025
                                          logo
                                          • Anmelden

                                          • Du hast noch kein Konto? Registrieren

                                          • Anmelden oder registrieren, um zu suchen
                                          • Erster Beitrag
                                            Letzter Beitrag
                                          0
                                          • Home
                                          • Aktuell
                                          • Tags
                                          • Ungelesen 0
                                          • Kategorien
                                          • Unreplied
                                          • Beliebt
                                          • GitHub
                                          • Docu
                                          • Hilfe