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.
    • B
      Beowolf @haselchen last edited by

      @haselchen
      Also für mich sieht das wie ein mUpdate-Button aus. 🤠

      2,811.jpg

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

        @beowolf

        🤔

        Verflixt und zugenäht.
        Den habe ich gar nicht.
        Also , die Anzeige .
        Ich hasse den inneren Monk 🤣

        Solange rumprobieren bis einheitliche Versionsnummern da stehen 😎

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

          @haselchen Es gibt derzeit einen Bug welcher das update Fehlschlägen lässt wenn es nicht im Chrome Browser durchgeführt wird.
          Um wieder auf die aktuelle Version zu kommen kannst du via install.openepaperlink.de die alte Version wieder flashen und dann mit Chrome Browser auf die neuste Version updaten. Sichere deine Einstellungen vorher die werden bei Installation via install... gelöscht

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

            Ich hatte hier auch Probleme mit dem Anlernen von neuen TAGs.

            Wenn bei Repro dieses steht "OpenEPaperLink/OpenEPaperLink" werden TAGs besser angelernt.

            Da stand schon mal etwas anderes. was habe ich vergessen. 🙄

            Aber event. liegt es auch an den TAGs die ich hier habe.

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

              Hi @atc

              Ich meine das steht auch so in dem Changelog.
              Deswegen habe ich das schon so gemacht .
              Update im Chrome Browser.
              Gibt es da eine Reihenfolge ?
              Erst ESP dann Filesystem oder umgekehrt ?

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

                Ich mache immer erst ESP und dann das Filesystem.

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

                  @beowolf

                  So hatte ich es auch gemacht.
                  Ich probier nachher nochmal weiter rum….

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

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

                    @haselchen Es gibt derzeit einen Bug welcher das update Fehlschlägen lässt wenn es nicht im Chrome Browser durchgeführt wird.
                    ....

                    Ich habe es unter Firefox gemacht. Also nur das Update.

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

                      Die "normale" reihenfolge wäre da erst ESP und dann das Filesystem.

                      Am meisten probleme machen Apple geräte wärend eines updates

                      @haselchen reporte gerne mal ob es nach weiteren versuchen richtig läuft

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

                        @atc

                        Ähm, ich hab nix gemacht. Ich schwöre 😳
                        Siehst es ja auch auf meinem Screenshot, die unterschiedlichen Versionen.
                        Eben ruf ich die Update Seite auf des AP und:

                        a75feb34-66ac-45ac-9b59-823d0b799426-grafik.png

                        Alles okay.
                        Das soll einer verstehen.....

                        Ich schliesse mein Issue auf Github.

                        A B 2 Replies Last reply Reply Quote 1
                        • A
                          atc @haselchen last edited by

                          @haselchen Ja gut 😄
                          Besser so als das es nicht läuft 🙂

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

                            @haselchen

                            Ich habe etwas weiter unten bei "ESP32-C6 Firmware" noch auf "001f" aktualisiert.

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

                              @beowolf

                              Was für einen Sinn soll das haben?

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

                                @haselchen
                                Keinen Dunst. 😕

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

                                  @haselchen Die ESP32-C6 firmware ist das RF-Modul und hat in letzter zeit nicht viele updates bekommen ausser in richtung des SubGhz, wenn dieses also nicht genutzt wird ist auch eine "alte" firmware OK.

                                  Eisbaeeer 1 Reply Last reply Reply Quote 0
                                  • Eisbaeeer
                                    Eisbaeeer Developer @atc last edited by Eisbaeeer

                                    @atc Ich musste das letzte Mal die ESP32-C6 als binary selbst herunterladen, auf den AP hochladen und manuell updaten. Das interne laden der ESP32-C6 firmware hat nicht funktioniert. Ich werde meinen mal updaten.

                                    Edit:
                                    Diesmal scheint es zu funktionieren.
                                    98250f71-eca8-4e4e-aa59-681324e8aaac-image.png

                                    1 Reply Last reply Reply Quote 1
                                    • Eisbaeeer
                                      Eisbaeeer Developer last edited by Eisbaeeer

                                      Für alle, die wieder mit dem Puppeteer Adapter ihre E-Papers beschicken wollen. Sollte selbsterklärend sein.

                                      // #############################################
                                      // Author:  Eisbaeeer
                                      // Date:    20250415
                                      // Version: 0.1 :   Convert from Blockly to js
                                      //
                                      // Benötigt: 
                                      // - Puppeteer Adapter
                                      // - Chrome Headless
                                      //
                                      // Ab hier die Anpassungen vornehmen!
                                      
                                      const urlOfVISView = 'http://192.168.1.200:8082/vis/?OpenEpaper#Tag2';	// Eure View oder URL vom Bild						// URL zur View
                                      const targetWidth = 296;												// Breite des Displays
                                      const targetHeight = 128;												// Höhe des Displays
                                      const cutoutX = 0;													    // Abstand Pixel von links für Screenshot
                                      const cutoutY = 0;														// Abstand Pixel von oben für Screenshot
                                      const pquality = 100;	                                                // Bildqualität
                                      const waitForSelector = "#w00017"										// Letztes Widget in der View
                                      const inputPath = "/tmp/<TAG_Bildername>.jpg";									// Screenshot temporär
                                      const uploadUrl = 'http://<AP-IPAddress>/imgupload';						// IP-Adresse Accesspoint anpassen
                                      const macAddress = '0000021EEB013B10';									// MAC-Adresse des Displays anpassen
                                      const ditherValue = 0; 												    // Setze den Dither-Wert (Farbanpassungen: 0 = View hat gleiche Farben | 1 = View hat andere Farben als das Display
                                      
                                      // Anpassungen für die Trigger ganz unten. (Zeiten oder Trigger einrichten)
                                      // ENDE Anpassungen! Ab hier nichts mehr ändern!
                                      // #############################################
                                      
                                      
                                      // Requirements
                                      const puppeteer = require('puppeteer');
                                      const axios = require('axios');
                                      const fs = require('fs');
                                      const FormData = require('form-data');
                                      
                                      async function takeScreenshots() {
                                          sendTo('puppeteer.0', 'screenshot', {
                                              url: urlOfVISView,                     
                                              path: inputPath,     
                                              width: targetWidth,                      
                                              height: targetHeight,                    
                                              quality: pquality,                   
                                           
                                              waitOption: {
                                                  waitForSelector: waitForSelector,  
                                                  waitForTimeout: 20000              
                                              },
                                           
                                              fullPage: false,                       
                                           
                                              clip: {         
                                                  x: cutoutX,                        
                                                  y: cutoutY,                        
                                                  width: targetWidth,                
                                                  height: targetHeight               
                                              }
                                          })
                                          sendScreenshotToTag()
                                          };
                                      
                                      function sendScreenshotToTag(){
                                      	
                                      	async function uploadImage() {
                                      		try {
                                      			// Prüfen, ob die Datei existiert
                                      			if (!fs.existsSync(inputPath)) {
                                      			throw new Error(`Datei nicht gefunden: ${inputPath}`);
                                      		}
                                      	// FormData erstellen
                                      	const form = new FormData();
                                      	form.append("mac", macAddress);
                                      	form.append("dither", ditherValue); // Dither-Parameter hinzufügen
                                      	form.append("file", fs.createReadStream(inputPath));
                                      	// POST-Anfrage senden
                                      	const response = await axios.post(uploadUrl, form, {
                                      	headers: {
                                      		...form.getHeaders(),
                                      	},
                                      	});
                                      
                                      	console.log('Upload erfolgreich:', response.data);
                                      	} catch (error) {
                                      	if (error.response) {
                                      		console.error('Server-Antwort:', error.response.status, error.response.data);
                                      	} else if (error.request) {
                                      		console.error('Keine Antwort erhalten:', error.request);
                                      	} else {
                                      		console.error('Fehler beim Hochladen:', error.message);
                                      	}
                                      	}
                                      	}
                                      	uploadImage();
                                      	}
                                      
                                      schedule("*/5 * * * *", async () => {
                                          await takeScreenshots();
                                      });    
                                      
                                      
                                      B K 2 Replies Last reply Reply Quote 2
                                      • B
                                        Beowolf @Eisbaeeer last edited by Beowolf

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

                                        const uploadUrl = 'http://192.168.1.180/imgupload'; // IP-Adresse Accesspoint anpassen

                                        Vielen Dank für das Skript.

                                        Die Zeile mit dem "imgupload" - muß da nur die IP-Adresse angepasst werden?

                                        Was passiert, wenn zwei Sripte gleichzeitig ein Bild hochladen?

                                        Und noch was.

                                        Die Zeilen:

                                        const cutoutX = 0;
                                        const cutoutY = 0;
                                        

                                        Bleib es da auf "0" oder muß dort die "Fläche" eingegeben werden die man habn möchte?

                                        Also z.B.

                                        const cutoutX = 384;
                                        const cutoutY = 168;
                                        

                                        Grüße

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

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

                                          Die Zeile mit dem "imgupload" - muß da nur die IP-Adresse angepasst werden?
                                          Was passiert, wenn zwei Sripte gleichzeitig ein Bild hochladen?

                                          Ich antworte mir mal selber. 🙄

                                          Habe das mal bei zweit TAGs probiert. Die wechseln nun ständig die Bilder hin und her.

                                          Eisbaeeer 1 Reply Last reply Reply Quote 0
                                          • Eisbaeeer
                                            Eisbaeeer Developer @Beowolf last edited by Eisbaeeer

                                            Ok, ich erklär doch noch kurz, wie das Script zu befüllen ist.

                                            Für jede View (HTML Seite), die man anzeigen möchte benötigt man ein separates Script. Einfach das Script kopieren und anpassen.
                                            In dem Script wird genau ein Screenshot erzeugt und auf ein Display gesendet. Möchte man mehrere Displays mit dem selben Bild ansteuern, müsste man den Teil "function sendScreenshotToTag()" erweitern. Wer sich das nicht zutraut, einfach das Script kopieren und die MAC-Addresse des TAG´s anpassen.

                                            Zu den Einstellungen:
                                            In dem Beispiel wollen wir den roten Kasten auf dem Display anzeigen.

                                            276c8243-5352-4f7e-8028-5a348df922bd-image.png

                                            Grün: Abstand des Screenshots von links
                                            Gelb: Abstand des Screenshots von oben
                                            Violet: Größe des Screenshots
                                            Blau: Höhe des Screenshots

                                            Was auf jeden Fall auf Eure Umgebung angepasst werden muss:
                                            urlOfVISView: Das ist die URL, von der der Screenshot gemacht werden soll. Kann auch eine Webseite sein.
                                            targetWidht: Das hängt von Eurem Display ab (Breite des Displays)
                                            targetHeigth: Das hängt von Eurem Display ab (Höhe des Displays)
                                            waitForSelector: Puppeteer wartet vor dem Screenshot, bis dieses Element vollständig geladen ist. Bei externen Seiten, also nicht VIS Seiten muss das angepasst werden.
                                            inputPath: Das ist der Dateiname des Screenshots. Hier muss sich der Name pro Script unterscheiden!
                                            uploadUrl: Hier müsst ihr die IP-Adresse von Eurem AccessPoint eintragen. http://<AP-IPAddress>/imgupload
                                            macAddress: Die MAC-Addresse von Eurem TAG

                                            Im Scirpt-Beispiel wird alle 5 Minuten ein Screenshot gesendet. Wollt ihr das ändern, müsst ihr ganz unten den Scheduler anpassen.

                                            Beispiel alle 5 Minuten:

                                            schedule("*/5 * * * *", async () => {
                                            

                                            Beispiel alle 30 Minuten:

                                            schedule("*/30 * * * *", async () => {
                                            

                                            Beipiel jede Stunde zur vollen Stunde:

                                            schedule("0 * * * *", async () => {
                                            

                                            usw.

                                            Gut beschrieben hier:

                                            * * * * * auszuführender Befehl
                                            ┬ ┬ ┬ ┬ ┬
                                            │ │ │ │ │
                                            │ │ │ │ └──── Wochentag (0-7, Sonntag ist 0 oder 7)
                                            │ │ │ └────── Monat (1-12)
                                            │ │ └──────── Tag (1-31)
                                            │ └────────── Stunde (0-23)
                                            └──────────── Minute (0-59)
                                            

                                            Wenn ihr auf ein Ereignis reagieren wollt, dann würde das so aussehen:

                                            Im Script den Scheduler tauschen:

                                            schedule("*/5 * * * *", async () => {
                                            

                                            gegen:

                                            on("hm-rpc.0.LEQ03420032.1.STATE", function(obj) {
                                            

                                            wobei der grüne Teil Euer Status ist, auf den ihr reagieren wollt. Also z.B. ein Relais Zustand oder ein Fensterkontakt (hier im Beispiel ein Fensterkontakt). Immer wenn sich dieser Status aktualisiert, wird dann ein Screenshot erstellt.

                                            Falls es noch Fragen gibt, gerne hier stellen.

                                            // #############################################
                                            // Author:  Eisbaeeer
                                            // Date:    20250415
                                            // Version: 0.1 :   Convert from Blockly to js
                                            //
                                            // Benötigt: 
                                            // - Puppeteer Adapter
                                            // - Chrome Headless
                                            //
                                            // Ab hier die Anpassungen vornehmen!
                                             
                                            const urlOfVISView = 'http://192.168.1.200:8082/vis/?OpenEpaper#Tag2';	// Eure View oder URL vom Bild						// URL zur View
                                            const targetWidth = 296;												// Breite des Displays
                                            const targetHeight = 128;												// Höhe des Displays
                                            const cutoutX = 0;													    // Abstand Pixel von links für Screenshot
                                            const cutoutY = 0;														// Abstand Pixel von oben für Screenshot
                                            const pquality = 100;	                                                // Bildqualität
                                            const waitForSelector = "#w00017"										// Letztes Widget in der View
                                            const inputPath = "/tmp/<TAG_Bildername>.jpg";									// Screenshot temporär
                                            const uploadUrl = 'http://<AP-IPAddress>/imgupload';						// IP-Adresse Accesspoint anpassen
                                            const macAddress = '0000021EEB013B10';									// MAC-Adresse des Displays anpassen
                                            const ditherValue = 0; 												    // Setze den Dither-Wert (Farbanpassungen: 0 = View hat gleiche Farben | 1 = View hat andere Farben als das Display
                                             
                                            // Anpassungen für die Trigger ganz unten. (Zeiten oder Trigger einrichten)
                                            // ENDE Anpassungen! Ab hier nichts mehr ändern!
                                            // #############################################
                                             
                                             
                                            // Requirements
                                            const puppeteer = require('puppeteer');
                                            const axios = require('axios');
                                            const fs = require('fs');
                                            const FormData = require('form-data');
                                             
                                            async function takeScreenshots() {
                                                sendTo('puppeteer.0', 'screenshot', {
                                                    url: urlOfVISView,                     
                                                    path: inputPath,     
                                                    width: targetWidth,                      
                                                    height: targetHeight,                    
                                                    quality: pquality,                   
                                                 
                                                    waitOption: {
                                                        waitForSelector: waitForSelector,  
                                                        waitForTimeout: 20000              
                                                    },
                                                 
                                                    fullPage: false,                       
                                                 
                                                    clip: {         
                                                        x: cutoutX,                        
                                                        y: cutoutY,                        
                                                        width: targetWidth,                
                                                        height: targetHeight               
                                                    }
                                                })
                                                sendScreenshotToTag()
                                                };
                                             
                                            function sendScreenshotToTag(){
                                            	
                                            	async function uploadImage() {
                                            		try {
                                            			// Prüfen, ob die Datei existiert
                                            			if (!fs.existsSync(inputPath)) {
                                            			throw new Error(`Datei nicht gefunden: ${inputPath}`);
                                            		}
                                            	// FormData erstellen
                                            	const form = new FormData();
                                            	form.append("mac", macAddress);
                                            	form.append("dither", ditherValue); // Dither-Parameter hinzufügen
                                            	form.append("file", fs.createReadStream(inputPath));
                                            	// POST-Anfrage senden
                                            	const response = await axios.post(uploadUrl, form, {
                                            	headers: {
                                            		...form.getHeaders(),
                                            	},
                                            	});
                                             
                                            	console.log('Upload erfolgreich:', response.data);
                                            	} catch (error) {
                                            	if (error.response) {
                                            		console.error('Server-Antwort:', error.response.status, error.response.data);
                                            	} else if (error.request) {
                                            		console.error('Keine Antwort erhalten:', error.request);
                                            	} else {
                                            		console.error('Fehler beim Hochladen:', error.message);
                                            	}
                                            	}
                                            	}
                                            	uploadImage();
                                            	}
                                             
                                            schedule("*/5 * * * *", async () => {
                                                await takeScreenshots();
                                            });    
                                            
                                            B 3 Replies Last reply Reply Quote 1
                                            • First post
                                              Last post

                                            Support us

                                            ioBroker
                                            Community Adapters
                                            Donate

                                            896
                                            Online

                                            31.7k
                                            Users

                                            79.8k
                                            Topics

                                            1.3m
                                            Posts

                                            43
                                            993
                                            253852
                                            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