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

  • Default (No Skin)
  • No Skin
Collapse
ioBroker Logo

Community Forum

donate donate
  1. ioBroker Community Home
  2. Deutsch
  3. Praktische Anwendungen (Showcase)
  4. E-INK Display OpenEPaperLink - Displayanzeige mit Batterie

NEWS

  • Jahresrückblick 2025 – unser neuer Blogbeitrag ist online! ✨
    BluefoxB
    Bluefox
    17
    1
    2.8k

  • Neuer Blogbeitrag: Monatsrückblick - Dezember 2025 🎄
    BluefoxB
    Bluefox
    13
    1
    1.1k

  • Weihnachtsangebot 2025! 🎄
    BluefoxB
    Bluefox
    25
    1
    2.4k

E-INK Display OpenEPaperLink - Displayanzeige mit Batterie

Scheduled Pinned Locked Moved Praktische Anwendungen (Showcase)
1.0k Posts 49 Posters 365.9k Views 52 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • B Offline
    B Offline
    Beowolf
    wrote on last edited by
    #944

    Schon klar.

    Aber wenn die Datei doch schon im /tmp/ Ordner auf meinem Raspberry liegt, warum wird die Anzeige dann nicht aktualisiert?

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

    BananaJoeB 1 Reply Last reply
    0
    • B Beowolf

      Schon klar.

      Aber wenn die Datei doch schon im /tmp/ Ordner auf meinem Raspberry liegt, warum wird die Anzeige dann nicht aktualisiert?

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

      @beowolf Auch der AP prüft ob sich was geändert hat, solltest du im Log des AP sehen.
      Wenn sich nichts bzw. zu wenig ändert, sendet der nicht. Nur eine kleine Zahl anders reicht nicht immer.

      Edit:

      Im Log des AP steht dann so etwas wie

      20:46:16 new image is the same as current image. not updating tag.
      

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

      B 1 Reply Last reply
      0
      • BananaJoeB BananaJoe

        @beowolf Auch der AP prüft ob sich was geändert hat, solltest du im Log des AP sehen.
        Wenn sich nichts bzw. zu wenig ändert, sendet der nicht. Nur eine kleine Zahl anders reicht nicht immer.

        Edit:

        Im Log des AP steht dann so etwas wie

        20:46:16 new image is the same as current image. not updating tag.
        
        B Offline
        B Offline
        Beowolf
        wrote on last edited by Beowolf
        #946

        @bananajoe
        So, ich habe jetzt mal das alles ein wenig beobachtet.

        Das Display gibt den Inhalt von "todoist" wieder.

        Ich versuche mal den Ablauf zu beschreiben.

        1. In der Liste steht zu Anfang kein Eintrag - Display ist auch leer

        2. Ich tätige den 1. Eintrag bei "todoist"

        Der Eintrag wird direkt (habe das Intervall auf 1 Minute stehen damit ich nicht immer so lange warten muß - hat aber keinen Einfluß auf das Geschehen) an ioBroker gesendet.

        1. Dein Skript reagiert auf die Änderung und macht einen screenshot der VIS. Die dazugehörige VIS-Seite zeigt auch den Eintrag so wie es soll.

        2. Die jpg-Datei wird im /tmp/ Ordner erstellt. Mit dem richtigen Eintrag.

        3. Jetzt fängt das Display an zu flackern um den neuen Inhalt anzuzeigen.

        4. Display bleibt ABER leer.

        Das LOG vom AP zeigt:

        21:18:24 000005EFDF77BC98 reports xfer complete
        21:18:24 000005EFDF77BC98 block request /current/000005EFDF77BC98_437868.pending block 0, len 2623 checksum 8612
        21:18:11 new image: /current/000005EFDF77BC98_437868.pending
        21:18:07 Updating 000005EFDF77BC98
        

        Jetzt kommt das kuriose.

        1. Ich mache einen zweiten Eintrag unter "todoist".

        2. Wieder reagiert ioBroker.

        3. Macht den screenshot von der VIS-Seite die alles korrekt anzeigt.

        4. Datei wird richtig erstellt.

        5. Display fängt wieder an zu flackern.

        6. JETZT erscheint auf dem Display der ERSTE Eintrag.

        ---- Mache ich jetzt einen dritten Eintrag --- Durchlauf ist wieder der selbe.

        Jetzt erscheint der zweite Eintrag.

        Das aktuelle Bild liegt im tmp Ordner, der AP nimmt aber das vorherige.

        Ich kann das immer und immer wieder machen. Der Ablauf ist immer gleich.

        Kann es sein, das die Reihenfolge des Ablaufs nicht stimmt? Das der AP erst das Bild von der letzten Aktualisierung bekommt, und DANN erst das neue Bild von dem jetzt aktuellen Stand?

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

        1 Reply Last reply
        0
        • EisbaeeerE 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 Offline
          B Offline
          Beowolf
          wrote on last edited by Beowolf
          #947

          @eisbaeeer

          Ich habe das Skript ein wenig verändert. Ich hoffe das das ok für dich ist.

          // #############################################
          // Author:  Eisbaeeer
          // Date:    20250415
          // Version: 0.2 : Verbesserte async-Logik, Timing, saubere Struktur
          // Version: 0.3 : ordentlichem await, sauberen async-Aufrufen und besserer Struktur
          //
          // Benötigt: 
          // - Puppeteer Adapter
          // - Chrome Headless
          //
          // Ab hier die Anpassungen vornehmen!
          
          const urlOfVISView = 'http://192.168.49.38:8082/vis/index.html?E-Paper-Allgemein#ToDo_Liste_1'; // URL zur View
          const targetWidth = 800;                         // Breite des Displays
          const targetHeight = 480;                        // Höhe des Displays
          const cutoutX = 0;                               // Abstand Pixel von links
          const cutoutY = 0;                               // Abstand Pixel von oben
          const pquality = 100;                            // Bildqualität
          const waitForSelector = "#w00047";               // Letztes Widget in der View
          const inputPath = "/tmp/todoliste1.jpg";         // Screenshot-Pfad
          const uploadUrl = 'http://192.168.49.185/imgupload'; // IP-Adresse Accesspoint
          const macAddress = '000004B4FED2BC9B';           // MAC-Adresse des Displays
          const ditherValue = 0;                           // Dither-Wert (0 = Farben gleich)
          
          // ENDE Anpassungen! Ab hier nichts mehr ändern!
          // #############################################
          
          const axios = require('axios');
          const fs = require('fs');
          const FormData = require('form-data');
          
          async function takeScreenshotAndUpload() {
              try {
                  // Screenshot machen und warten, bis abgeschlossen
                  await new Promise((resolve, reject) => {
                      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
                          }
                      }, (res) => {
                          if (res && res.error) {
                              reject(new Error(res.error));
                          } else {
                              resolve();
                          }
                      });
                  });
          
                  // Kurze Wartezeit, um sicherzugehen, dass Datei geschrieben wurde
                  await new Promise(r => setTimeout(r, 1000));
          
                  await uploadImage();
              } catch (err) {
                  console.error('Fehler bei Screenshot oder Upload:', err.message);
              }
          }
          
          async function uploadImage() {
              try {
                  if (!fs.existsSync(inputPath)) {
                      throw new Error(`Datei nicht gefunden: ${inputPath}`);
                  }
          
                  const form = new FormData();
                  form.append("mac", macAddress);
                  form.append("dither", ditherValue.toString());
                  form.append("file", fs.createReadStream(inputPath));
          
                  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);
                  }
              }
          }
          
          // Trigger: Reagiere auf Änderung im Datenpunkt
          on("javascript.0.Todoist.Kleines Gartenhaus", function (obj) {
              takeScreenshotAndUpload();
          });
          

          Jetzt werden die Änderungen die ich bei todoist mache auch direkt und richtig übernommen.

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

          EisbaeeerE 1 Reply Last reply
          1
          • B Beowolf

            @eisbaeeer

            Ich habe das Skript ein wenig verändert. Ich hoffe das das ok für dich ist.

            // #############################################
            // Author:  Eisbaeeer
            // Date:    20250415
            // Version: 0.2 : Verbesserte async-Logik, Timing, saubere Struktur
            // Version: 0.3 : ordentlichem await, sauberen async-Aufrufen und besserer Struktur
            //
            // Benötigt: 
            // - Puppeteer Adapter
            // - Chrome Headless
            //
            // Ab hier die Anpassungen vornehmen!
            
            const urlOfVISView = 'http://192.168.49.38:8082/vis/index.html?E-Paper-Allgemein#ToDo_Liste_1'; // URL zur View
            const targetWidth = 800;                         // Breite des Displays
            const targetHeight = 480;                        // Höhe des Displays
            const cutoutX = 0;                               // Abstand Pixel von links
            const cutoutY = 0;                               // Abstand Pixel von oben
            const pquality = 100;                            // Bildqualität
            const waitForSelector = "#w00047";               // Letztes Widget in der View
            const inputPath = "/tmp/todoliste1.jpg";         // Screenshot-Pfad
            const uploadUrl = 'http://192.168.49.185/imgupload'; // IP-Adresse Accesspoint
            const macAddress = '000004B4FED2BC9B';           // MAC-Adresse des Displays
            const ditherValue = 0;                           // Dither-Wert (0 = Farben gleich)
            
            // ENDE Anpassungen! Ab hier nichts mehr ändern!
            // #############################################
            
            const axios = require('axios');
            const fs = require('fs');
            const FormData = require('form-data');
            
            async function takeScreenshotAndUpload() {
                try {
                    // Screenshot machen und warten, bis abgeschlossen
                    await new Promise((resolve, reject) => {
                        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
                            }
                        }, (res) => {
                            if (res && res.error) {
                                reject(new Error(res.error));
                            } else {
                                resolve();
                            }
                        });
                    });
            
                    // Kurze Wartezeit, um sicherzugehen, dass Datei geschrieben wurde
                    await new Promise(r => setTimeout(r, 1000));
            
                    await uploadImage();
                } catch (err) {
                    console.error('Fehler bei Screenshot oder Upload:', err.message);
                }
            }
            
            async function uploadImage() {
                try {
                    if (!fs.existsSync(inputPath)) {
                        throw new Error(`Datei nicht gefunden: ${inputPath}`);
                    }
            
                    const form = new FormData();
                    form.append("mac", macAddress);
                    form.append("dither", ditherValue.toString());
                    form.append("file", fs.createReadStream(inputPath));
            
                    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);
                    }
                }
            }
            
            // Trigger: Reagiere auf Änderung im Datenpunkt
            on("javascript.0.Todoist.Kleines Gartenhaus", function (obj) {
                takeScreenshotAndUpload();
            });
            

            Jetzt werden die Änderungen die ich bei todoist mache auch direkt und richtig übernommen.

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

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

            @eisbaeeer

            Ich habe das Skript ein wenig verändert. Ich hoffe das das ok für dich ist.

            Aber klar ist das in Ordnung! Davon lebt ja die Community!
            Ich hab jetzt das ganze in eine Funktion gepackt und werte auch noch aus, ob der Screenshot auch funktioniert hat. Das ganze ist jetzt auch schneller, weil keine Wartezeit mehr enthalten ist.

            Die Trigger hab ich noch in den Editierbereich gepackt. Jetzt muss man nur noch im oberen Bereich alle Einstellungen editieren oder um Trigger ergänzen.

            Wer das Script schon benutzt muss nur seine Trigger von unten nach oben packen und alles ab "ENDE Anpassungen ...." ersetzten.

            Bin gerade noch in Kontakt mit dem Adapter Entwickler von:
            https://github.com/DrozmotiX/ioBroker.open-epaper-link

            Eventuell bekommen wir das ganze in den Adapter integriert ;-)

            // #############################################
            // Author:  Eisbaeeer
            // Date:    20250415
            // Version  0.2 :   Bugfix async pictures 
            // Version: 0.1 :   Convert from Blockly to js
            //
            // Benötigt: 
            // - Puppeteer Adapter
            // - Chrome Headless
            //
            // #############################################
            // 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"										// Screenshot Qualität
            const inputPath = "/tmp/epaperTag01.jpg";								// Screenshot temporär
            const uploadUrl = 'http://192.168.1.180/imgupload';						// IP-Adresse Accesspoint anpassen
            const macAddress = '0000021F7E2C3B12';									// MAC-Adresse des Displays anpassen
            const ditherValue = 1; 												    // Setze den Dither-Wert (Farbanpassungen: 0 = View hat gleiche Farben | 1 = View hat andere Farben als das Display
            
            // Hier werden die Trigger eingestellt (wann ein Screenshot erstellt werden soll)
            
            // Hier im Beispiel alle 15 Minuten 
            schedule("*/15 * * * *", async () => {
                takeScreenshots();
            });
                
            // Hier auf einen STATE im userdata.0
            on("0_userdata.0.TESTING.STATE",function(obj) {
                takeScreenshots();
            });
            
            // Hier auf einen STATE von Homematic Türkontakt
            on("hm-rpc.0.LEQ9129032.1.STATE",function(obj) {
                takeScreenshots();
            });    
            
            // 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() {
                console.log("*** function takeScreenshot");
                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               
                    }
                }, obj => {
                  if (obj.error) {
                    log(`Error taking screenshot: ${obj.error.message}`, 'error');
                  } else {
                    // the binary representation of the image is contained in `obj.result`
                    log(`Successfully took screenshot: ${obj.result}`);
                    console.log("*** upload Image");
                    // uploading Screenshot
                    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();
                }
                })
            }
             
            

            Kein support per PM. Bitte im Forum Fragen stellen!

            B 1 Reply Last reply
            0
            • EisbaeeerE Eisbaeeer

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

              @eisbaeeer

              Ich habe das Skript ein wenig verändert. Ich hoffe das das ok für dich ist.

              Aber klar ist das in Ordnung! Davon lebt ja die Community!
              Ich hab jetzt das ganze in eine Funktion gepackt und werte auch noch aus, ob der Screenshot auch funktioniert hat. Das ganze ist jetzt auch schneller, weil keine Wartezeit mehr enthalten ist.

              Die Trigger hab ich noch in den Editierbereich gepackt. Jetzt muss man nur noch im oberen Bereich alle Einstellungen editieren oder um Trigger ergänzen.

              Wer das Script schon benutzt muss nur seine Trigger von unten nach oben packen und alles ab "ENDE Anpassungen ...." ersetzten.

              Bin gerade noch in Kontakt mit dem Adapter Entwickler von:
              https://github.com/DrozmotiX/ioBroker.open-epaper-link

              Eventuell bekommen wir das ganze in den Adapter integriert ;-)

              // #############################################
              // Author:  Eisbaeeer
              // Date:    20250415
              // Version  0.2 :   Bugfix async pictures 
              // Version: 0.1 :   Convert from Blockly to js
              //
              // Benötigt: 
              // - Puppeteer Adapter
              // - Chrome Headless
              //
              // #############################################
              // 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"										// Screenshot Qualität
              const inputPath = "/tmp/epaperTag01.jpg";								// Screenshot temporär
              const uploadUrl = 'http://192.168.1.180/imgupload';						// IP-Adresse Accesspoint anpassen
              const macAddress = '0000021F7E2C3B12';									// MAC-Adresse des Displays anpassen
              const ditherValue = 1; 												    // Setze den Dither-Wert (Farbanpassungen: 0 = View hat gleiche Farben | 1 = View hat andere Farben als das Display
              
              // Hier werden die Trigger eingestellt (wann ein Screenshot erstellt werden soll)
              
              // Hier im Beispiel alle 15 Minuten 
              schedule("*/15 * * * *", async () => {
                  takeScreenshots();
              });
                  
              // Hier auf einen STATE im userdata.0
              on("0_userdata.0.TESTING.STATE",function(obj) {
                  takeScreenshots();
              });
              
              // Hier auf einen STATE von Homematic Türkontakt
              on("hm-rpc.0.LEQ9129032.1.STATE",function(obj) {
                  takeScreenshots();
              });    
              
              // 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() {
                  console.log("*** function takeScreenshot");
                  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               
                      }
                  }, obj => {
                    if (obj.error) {
                      log(`Error taking screenshot: ${obj.error.message}`, 'error');
                    } else {
                      // the binary representation of the image is contained in `obj.result`
                      log(`Successfully took screenshot: ${obj.result}`);
                      console.log("*** upload Image");
                      // uploading Screenshot
                      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();
                  }
                  })
              }
               
              
              B Offline
              B Offline
              Beowolf
              wrote on last edited by
              #949

              @eisbaeeer

              Adapter wäre cool.

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

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

                @eisbaeeer
                Ich habe ja diese TAGs

                displ3.jpg

                Die haben ja zwei Tasten. Der AP reagiert bzw. zeigt es auch an, das sie bestätigt worden sind.

                Gibt es da mittlerweile eine Möglichkeit diese zu erfassen und in ioBroker zu verwenden?

                Solum NEWTON 2.9 BWR

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

                EisbaeeerE 1 Reply Last reply
                0
                • B Beowolf

                  @eisbaeeer
                  Ich habe ja diese TAGs

                  displ3.jpg

                  Die haben ja zwei Tasten. Der AP reagiert bzw. zeigt es auch an, das sie bestätigt worden sind.

                  Gibt es da mittlerweile eine Möglichkeit diese zu erfassen und in ioBroker zu verwenden?

                  Solum NEWTON 2.9 BWR

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

                  @beowolf sagte in [E-INK Display OpenEPaperLink

                  Gibt es da mittlerweile eine Möglichkeit diese zu erfassen und in ioBroker zu verwenden?

                  Solum NEWTON 2.9 BWR

                  Ja, du brauchst den iobroker Adapter. Dort wird der Tastendruck registriert.

                  Kein support per PM. Bitte im Forum Fragen stellen!

                  B 1 Reply Last reply
                  0
                  • EisbaeeerE Eisbaeeer

                    @beowolf sagte in [E-INK Display OpenEPaperLink

                    Gibt es da mittlerweile eine Möglichkeit diese zu erfassen und in ioBroker zu verwenden?

                    Solum NEWTON 2.9 BWR

                    Ja, du brauchst den iobroker Adapter. Dort wird der Tastendruck registriert.

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

                    @eisbaeeer
                    Den hatte ich schon. Der hing dann aber immer nach einer gewissen Zeit.

                    Ich hatte auch schon dieses Skript

                    https://github.com/slimline33/OpenEPaperLink-IOBROKER-JavaScript/blob/main/OpenEPaperLink-Websocket

                    Dann ist aber extrem viel "Datenverkehr" über den javaskript Adapter.

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

                    1 Reply Last reply
                    0
                    • M Offline
                      M Offline
                      M-A-X
                      wrote on last edited by
                      #953

                      Hi.
                      Da unser Standard billig Außenthermometer den Geist aufgegeben hat (die LCD Segmente sind reihenweise ausgefallen), suche ich eine einfache Möglichkeit die eh schon vorhandene Außentemperatur aus iobroker anzeigen zu lassen. Dabei steht das Display im Sichtberich, sodass es optisch einigermaßen ok aussehen sollte.
                      Ich habe hier einen thread gefunden bei dem es darum geht eink Preisdisplays umzuflashen. Did links zu fertigen Angeboten sind jedoch offline oder die Angebote ausverkauft. Außerdem scheint es mir, dass ich da zusätzlich zum Display der Temperatur noch eine Art Router brauche. Das ganze möchte ich gerne umgehen.
                      Ich habe an der Stelle, wo das Display hin soll keine Strom und auch keine Bedarf mehr als nur die Temperatur anzuzeigen, sodass nen tablet mit bis absoluter Overkill (preislich und zur Einrichtung) wäre.
                      Hat jemand einen Tipp? Oder bin ich nur zu blöd ein Angebot zu finden ohne dass das Display dann sehr gebastelt aussieht.
                      Vielen Dank im Voraus
                      Max

                      haselchenH 1 Reply Last reply
                      0
                      • M M-A-X

                        Hi.
                        Da unser Standard billig Außenthermometer den Geist aufgegeben hat (die LCD Segmente sind reihenweise ausgefallen), suche ich eine einfache Möglichkeit die eh schon vorhandene Außentemperatur aus iobroker anzeigen zu lassen. Dabei steht das Display im Sichtberich, sodass es optisch einigermaßen ok aussehen sollte.
                        Ich habe hier einen thread gefunden bei dem es darum geht eink Preisdisplays umzuflashen. Did links zu fertigen Angeboten sind jedoch offline oder die Angebote ausverkauft. Außerdem scheint es mir, dass ich da zusätzlich zum Display der Temperatur noch eine Art Router brauche. Das ganze möchte ich gerne umgehen.
                        Ich habe an der Stelle, wo das Display hin soll keine Strom und auch keine Bedarf mehr als nur die Temperatur anzuzeigen, sodass nen tablet mit bis absoluter Overkill (preislich und zur Einrichtung) wäre.
                        Hat jemand einen Tipp? Oder bin ich nur zu blöd ein Angebot zu finden ohne dass das Display dann sehr gebastelt aussieht.
                        Vielen Dank im Voraus
                        Max

                        haselchenH Offline
                        haselchenH Offline
                        haselchen
                        Most Active
                        wrote on last edited by
                        #954

                        @m-a-x

                        https://forum.iobroker.net/topic/66380/e-ink-display-openepaperlink-displayanzeige-mit-batterie/952

                        @Homoran
                        @Negalein
                        @Samson71

                        Kann einer von euch bitte diesen Thread in den oben verlinkten integrieren.

                        Dankeschön

                        Synology DS218+ & 2 x Fujitsu Esprimo (VM/Container) + FritzBox7590 + 2 AVM 3000 Repeater & Homematic & HUE & Osram & Xiaomi, NPM 10.9.4, Nodejs 22.21.0 ,JS Controller 7.0.7 ,Admin 7.7.19

                        M 1 Reply Last reply
                        0
                        • haselchenH haselchen

                          @m-a-x

                          https://forum.iobroker.net/topic/66380/e-ink-display-openepaperlink-displayanzeige-mit-batterie/952

                          @Homoran
                          @Negalein
                          @Samson71

                          Kann einer von euch bitte diesen Thread in den oben verlinkten integrieren.

                          Dankeschön

                          M Offline
                          M Offline
                          M-A-X
                          wrote on last edited by M-A-X
                          #955

                          @haselchen hi, genau den thread meinte ich. Da geht es aber darum eine Art Router ans laufen zu bringen und dann ein billig Display zu Flashen und einzubinden, etc.
                          Ich suche eine fertige Lösung. Wenn es die nicht gibt, reicht mir das als Antwort :)
                          Edit: an der von dir verlinkten Lösung gefällt mir nicht: zusätzlicher Router (Strom Verbrauch und mehr Hardware), die displays sehen sehr oft / immer billig aus (kein Gehäuse oder nur ein seitlich offenes).

                          HomoranH haselchenH B 3 Replies Last reply
                          0
                          • HomoranH Do not disturb
                            HomoranH Do not disturb
                            Homoran
                            Global Moderator Administrators
                            wrote on last edited by Homoran
                            #956

                            erledigt

                            kein Support per PN! - Fragen im Forum stellen - es gibt fast nichts, was nicht auch für andere interessant ist.

                            Benutzt das Voting rechts unten im Beitrag wenn er euch geholfen hat.

                            der Installationsfixer: curl -fsL https://iobroker.net/fix.sh | bash -

                            haselchenH 1 Reply Last reply
                            1
                            • HomoranH Homoran

                              erledigt

                              haselchenH Offline
                              haselchenH Offline
                              haselchen
                              Most Active
                              wrote on last edited by
                              #957

                              @atc

                              Hast Du eine Idee für den User @M-A-X ?

                              Synology DS218+ & 2 x Fujitsu Esprimo (VM/Container) + FritzBox7590 + 2 AVM 3000 Repeater & Homematic & HUE & Osram & Xiaomi, NPM 10.9.4, Nodejs 22.21.0 ,JS Controller 7.0.7 ,Admin 7.7.19

                              S 1 Reply Last reply
                              0
                              • M M-A-X

                                @haselchen hi, genau den thread meinte ich. Da geht es aber darum eine Art Router ans laufen zu bringen und dann ein billig Display zu Flashen und einzubinden, etc.
                                Ich suche eine fertige Lösung. Wenn es die nicht gibt, reicht mir das als Antwort :)
                                Edit: an der von dir verlinkten Lösung gefällt mir nicht: zusätzlicher Router (Strom Verbrauch und mehr Hardware), die displays sehen sehr oft / immer billig aus (kein Gehäuse oder nur ein seitlich offenes).

                                HomoranH Do not disturb
                                HomoranH Do not disturb
                                Homoran
                                Global Moderator Administrators
                                wrote on last edited by
                                #958

                                @m-a-x ich hab diese Kombination
                                2016_03_04_hm_kopfbild.jpg

                                kein Support per PN! - Fragen im Forum stellen - es gibt fast nichts, was nicht auch für andere interessant ist.

                                Benutzt das Voting rechts unten im Beitrag wenn er euch geholfen hat.

                                der Installationsfixer: curl -fsL https://iobroker.net/fix.sh | bash -

                                1 Reply Last reply
                                0
                                • haselchenH haselchen

                                  @atc

                                  Hast Du eine Idee für den User @M-A-X ?

                                  S Offline
                                  S Offline
                                  sameOne
                                  wrote on last edited by
                                  #959

                                  @haselchen
                                  Einen Access Point braucht man da derzeit immer, da die Displays ein extra stromsparendes Protokoll sprechen muss auch die AP Seite das können und es gibt hier derzeit noch keine direkte Integration in Raspi, HA etc.

                                  Hier aber dennoch nen derzeitiger funktionierender link zu Displays und AP:
                                  https://www.kleinanzeigen.de/s-anzeige/2-66-bwr-epaper-display-geflasht-mit-openepaperlink-preisschild/3015200420-168-2829

                                  1 Reply Last reply
                                  0
                                  • M M-A-X

                                    @haselchen hi, genau den thread meinte ich. Da geht es aber darum eine Art Router ans laufen zu bringen und dann ein billig Display zu Flashen und einzubinden, etc.
                                    Ich suche eine fertige Lösung. Wenn es die nicht gibt, reicht mir das als Antwort :)
                                    Edit: an der von dir verlinkten Lösung gefällt mir nicht: zusätzlicher Router (Strom Verbrauch und mehr Hardware), die displays sehen sehr oft / immer billig aus (kein Gehäuse oder nur ein seitlich offenes).

                                    haselchenH Offline
                                    haselchenH Offline
                                    haselchen
                                    Most Active
                                    wrote on last edited by
                                    #960

                                    @m-a-x

                                    Siehe Antwort über mir

                                    Synology DS218+ & 2 x Fujitsu Esprimo (VM/Container) + FritzBox7590 + 2 AVM 3000 Repeater & Homematic & HUE & Osram & Xiaomi, NPM 10.9.4, Nodejs 22.21.0 ,JS Controller 7.0.7 ,Admin 7.7.19

                                    1 Reply Last reply
                                    1
                                    • M M-A-X

                                      @haselchen hi, genau den thread meinte ich. Da geht es aber darum eine Art Router ans laufen zu bringen und dann ein billig Display zu Flashen und einzubinden, etc.
                                      Ich suche eine fertige Lösung. Wenn es die nicht gibt, reicht mir das als Antwort :)
                                      Edit: an der von dir verlinkten Lösung gefällt mir nicht: zusätzlicher Router (Strom Verbrauch und mehr Hardware), die displays sehen sehr oft / immer billig aus (kein Gehäuse oder nur ein seitlich offenes).

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

                                      @m-a-x sagte in E-INK Display OpenEPaperLink - Displayanzeige mit Batterie:

                                      Edit: an der von dir verlinkten Lösung gefällt mir nicht: zusätzlicher Router (Strom Verbrauch und mehr Hardware), die displays sehen sehr oft / immer billig aus (kein Gehäuse oder nur ein seitlich offenes).

                                      Nichts für ungut, aber ob ein ESP32 jetzt "den" Stromverbrauch hat? Nun gut.

                                      Displays billig? Schau dir diese an

                                      displ1.jpg
                                      Anzeige steht gerade auf dem Kopf.
                                      displ2.jpg
                                      IMG_20240529_091954.jpg

                                      Weder billig noch offen.

                                      Was möchtest du denn noch mehr?

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

                                      EisbaeeerE 1 Reply Last reply
                                      2
                                      • B Beowolf

                                        @m-a-x sagte in E-INK Display OpenEPaperLink - Displayanzeige mit Batterie:

                                        Edit: an der von dir verlinkten Lösung gefällt mir nicht: zusätzlicher Router (Strom Verbrauch und mehr Hardware), die displays sehen sehr oft / immer billig aus (kein Gehäuse oder nur ein seitlich offenes).

                                        Nichts für ungut, aber ob ein ESP32 jetzt "den" Stromverbrauch hat? Nun gut.

                                        Displays billig? Schau dir diese an

                                        displ1.jpg
                                        Anzeige steht gerade auf dem Kopf.
                                        displ2.jpg
                                        IMG_20240529_091954.jpg

                                        Weder billig noch offen.

                                        Was möchtest du denn noch mehr?

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

                                        So, eben noch realisiert. Müllkalender Erinnerungsdisplay ;-)
                                        Ein Tag vorher wird die Anzeige Rot, sonst weißer Hintergrund mit schwarzer Schrift als Ankündigung.
                                        Verwendete Adapter:

                                        • ical
                                        • trashschedule

                                        95a879fd-951c-4514-9483-600f08151dc7-20250418_224126.jpg

                                        Kein support per PM. Bitte im Forum Fragen stellen!

                                        haselchenH B 2 Replies Last reply
                                        2
                                        • EisbaeeerE Eisbaeeer

                                          So, eben noch realisiert. Müllkalender Erinnerungsdisplay ;-)
                                          Ein Tag vorher wird die Anzeige Rot, sonst weißer Hintergrund mit schwarzer Schrift als Ankündigung.
                                          Verwendete Adapter:

                                          • ical
                                          • trashschedule

                                          95a879fd-951c-4514-9483-600f08151dc7-20250418_224126.jpg

                                          haselchenH Offline
                                          haselchenH Offline
                                          haselchen
                                          Most Active
                                          wrote on last edited by haselchen
                                          #963

                                          @eisbaeeer

                                          Geht auch über den Googlekalender.
                                          Implementierung auf der Weboberfläche der Tags.
                                          Da haste dann die nächsten Termine alle und die aktuellen dann in rot.
                                          Geschmacksache, aber für mich informativer , da mehrere Termine zu sehen sind 😜

                                          IMG_3352.jpeg

                                          Schön auf dem Gäste WC, lesen vertreibt die Zeit 🤣

                                          Synology DS218+ & 2 x Fujitsu Esprimo (VM/Container) + FritzBox7590 + 2 AVM 3000 Repeater & Homematic & HUE & Osram & Xiaomi, NPM 10.9.4, Nodejs 22.21.0 ,JS Controller 7.0.7 ,Admin 7.7.19

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


                                          Support us

                                          ioBroker
                                          Community Adapters
                                          Donate

                                          649

                                          Online

                                          32.6k

                                          Users

                                          82.3k

                                          Topics

                                          1.3m

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

                                          • Don't have an account? Register

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