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

  • UPDATE 31.10.: Amazon Alexa - ioBroker Skill läuft aus ?
    apollon77A
    apollon77
    48
    3
    8.8k

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

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

E-INK Display OpenEPaperLink - Displayanzeige mit Batterie

Scheduled Pinned Locked Moved Praktische Anwendungen (Showcase)
1.0k Posts 49 Posters 348.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.
  • haselchenH haselchen

    @atc

    Ähm, ich hab nix gemacht. Ich schwöre :flushed:
    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.

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

    @haselchen

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

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

    haselchenH 1 Reply Last reply
    0
    • B Beowolf

      @haselchen

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

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

      @beowolf

      Was für einen Sinn soll das haben?

      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

      B S 2 Replies Last reply
      0
      • haselchenH haselchen

        @beowolf

        Was für einen Sinn soll das haben?

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

        @haselchen
        Keinen Dunst. :confused:

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

        1 Reply Last reply
        0
        • haselchenH haselchen

          @beowolf

          Was für einen Sinn soll das haben?

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

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

          EisbaeeerE 1 Reply Last reply
          0
          • S sameOne

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

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

            @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

            Kein support per PM. Bitte im Forum Fragen stellen!

            1 Reply Last reply
            1
            • EisbaeeerE Offline
              EisbaeeerE Offline
              Eisbaeeer
              Developer
              wrote on last edited by Eisbaeeer
              #930

              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();
              });    
              
              

              Kein support per PM. Bitte im Forum Fragen stellen!

              B K 2 Replies Last reply
              1
              • EisbaeeerE 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 Offline
                B Offline
                Beowolf
                wrote on last edited by Beowolf
                #931

                @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

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

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

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

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

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

                  EisbaeeerE 1 Reply Last reply
                  0
                  • B 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. :face_with_rolling_eyes:

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

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

                    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();
                    });    
                    

                    Kein support per PM. Bitte im Forum Fragen stellen!

                    B 3 Replies Last reply
                    1
                    • 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
                      #934

                      @eisbaeeer

                      Ich bekomme diese Fehlermeldung:

                      16.4.2025, 08:17:13.006	[error]: javascript.0 (294193) script.js.common.EPaper-Displays.Allgemein.Aufgabendisplays.ToDo_Liste_2_neu compile failed:
                      
                      at script.js.common.EPaper-Displays.Allgemein.Aufgabendisplays.ToDo_Liste_2_neu:97
                      16.4.2025, 08:19:22.774	[error]: javascript.0 (294193) script.js.common.EPaper-Displays.Allgemein.Aufgabendisplays.ToDo_Liste_2_neu compile failed:
                      
                      at script.js.common.EPaper-Displays.Allgemein.Aufgabendisplays.ToDo_Liste_2_neu:97
                      16.4.2025, 08:20:26.759	[error]: javascript.0 (294193) script.js.common.EPaper-Displays.Allgemein.Aufgabendisplays.ToDo_Liste_2_neu compile failed:
                      
                      at script.js.common.EPaper-Displays.Allgemein.Aufgabendisplays.ToDo_Liste_2_neu:97
                      

                      wenn ich dieses unten eingebe

                      on("sonoff.0.Schreibtischleuchte.POWER", function(obj) {
                          await takeScreenshots();
                      });
                      

                      Was mache ich falsch?

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

                      EisbaeeerE 1 Reply Last reply
                      0
                      • B Beowolf

                        @eisbaeeer

                        Ich bekomme diese Fehlermeldung:

                        16.4.2025, 08:17:13.006	[error]: javascript.0 (294193) script.js.common.EPaper-Displays.Allgemein.Aufgabendisplays.ToDo_Liste_2_neu compile failed:
                        
                        at script.js.common.EPaper-Displays.Allgemein.Aufgabendisplays.ToDo_Liste_2_neu:97
                        16.4.2025, 08:19:22.774	[error]: javascript.0 (294193) script.js.common.EPaper-Displays.Allgemein.Aufgabendisplays.ToDo_Liste_2_neu compile failed:
                        
                        at script.js.common.EPaper-Displays.Allgemein.Aufgabendisplays.ToDo_Liste_2_neu:97
                        16.4.2025, 08:20:26.759	[error]: javascript.0 (294193) script.js.common.EPaper-Displays.Allgemein.Aufgabendisplays.ToDo_Liste_2_neu compile failed:
                        
                        at script.js.common.EPaper-Displays.Allgemein.Aufgabendisplays.ToDo_Liste_2_neu:97
                        

                        wenn ich dieses unten eingebe

                        on("sonoff.0.Schreibtischleuchte.POWER", function(obj) {
                            await takeScreenshots();
                        });
                        

                        Was mache ich falsch?

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

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

                        wenn ich dieses unten eingebe
                        Copy to Clipboard on("sonoff.0.Schreibtischleuchte.POWER", function(obj) { await takeScreenshots(); });
                        Was mache ich falsch?

                        Uuups, sorry. Das await muss weg.

                        on("sonoff.0.Schreibtischleuchte.POWER", function(obj) {
                            takeScreenshots();
                        });
                        

                        Kein support per PM. Bitte im Forum Fragen stellen!

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

                          So ganz rund läuft das aber noch nicht.

                          Ich habe einmal Display 1 dieses:

                          
                          // #############################################
                          // 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.49.38:8082/vis/index.html?E-Paper-Allgemein#ToDo_Liste_1';	// Eure View oder URL vom Bild						// URL zur View
                          const targetWidth = 800;												// Breite des Displays
                          const targetHeight = 480;												// 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 = "#w00047"										// Letztes Widget in der View
                          const inputPath = "/tmp/epaperTag.jpg";									// Screenshot temporär
                          const uploadUrl = 'http://192.168.49.185/imgupload';						// IP-Adresse Accesspoint anpassen
                          const macAddress = '000004B4FED2BC9B';									// 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!
                          // #############################################
                          

                          Display 2 dieses

                          
                          // #############################################
                          // 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.49.38:8082/vis/index.html?E-Paper-Allgemein#Todo_Liste_2';	// Eure View oder URL vom Bild						// URL zur View
                          const targetWidth = 800;												// Breite des Displays
                          const targetHeight = 480;												// 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 = "#w00049"										// Letztes Widget in der View
                          const inputPath = "/tmp/epaperTag.jpg";									// Screenshot temporär
                          const uploadUrl = 'http://192.168.49.185/imgupload';						// IP-Adresse Accesspoint anpassen
                          const macAddress = '000005EFDF77BC98';									// 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!
                          // #############################################
                          

                          Auf beiden Displays erscheint der selbe Inhalt.

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

                          B 1 Reply Last reply
                          0
                          • B Beowolf

                            So ganz rund läuft das aber noch nicht.

                            Ich habe einmal Display 1 dieses:

                            
                            // #############################################
                            // 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.49.38:8082/vis/index.html?E-Paper-Allgemein#ToDo_Liste_1';	// Eure View oder URL vom Bild						// URL zur View
                            const targetWidth = 800;												// Breite des Displays
                            const targetHeight = 480;												// 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 = "#w00047"										// Letztes Widget in der View
                            const inputPath = "/tmp/epaperTag.jpg";									// Screenshot temporär
                            const uploadUrl = 'http://192.168.49.185/imgupload';						// IP-Adresse Accesspoint anpassen
                            const macAddress = '000004B4FED2BC9B';									// 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!
                            // #############################################
                            

                            Display 2 dieses

                            
                            // #############################################
                            // 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.49.38:8082/vis/index.html?E-Paper-Allgemein#Todo_Liste_2';	// Eure View oder URL vom Bild						// URL zur View
                            const targetWidth = 800;												// Breite des Displays
                            const targetHeight = 480;												// 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 = "#w00049"										// Letztes Widget in der View
                            const inputPath = "/tmp/epaperTag.jpg";									// Screenshot temporär
                            const uploadUrl = 'http://192.168.49.185/imgupload';						// IP-Adresse Accesspoint anpassen
                            const macAddress = '000005EFDF77BC98';									// 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!
                            // #############################################
                            

                            Auf beiden Displays erscheint der selbe Inhalt.

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

                            Fehler gefunden.

                            Diese Zeile muß natürlich auch angepasst werden.

                            const inputPath = "/tmp/<TAG_Bildername>.jpg";   			// Screenshot temporär
                            

                            Grüße

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

                            1 Reply Last reply
                            1
                            • EisbaeeerE 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();
                              });    
                              
                              
                              K Offline
                              K Offline
                              KeDi
                              wrote on last edited by
                              #938

                              @eisbaeeer für welche Version des Puppeteer Adapters ist das Script?
                              Ich nutze seit ewigen Zeiten die 0.2.8 weil ich hierfür ein funktionierendes hatte und danach nichts mehr klappte. Im Grunde würde ich gerne endlich mal auf die 0.4.0 aktualisieren.

                              EisbaeeerE B 2 Replies Last reply
                              0
                              • K KeDi

                                @eisbaeeer für welche Version des Puppeteer Adapters ist das Script?
                                Ich nutze seit ewigen Zeiten die 0.2.8 weil ich hierfür ein funktionierendes hatte und danach nichts mehr klappte. Im Grunde würde ich gerne endlich mal auf die 0.4.0 aktualisieren.

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

                                @kedi Ich nutze die aktuelle puppeteer stable. Das Problem, dass das "alte" Blockly nicht mehr funktioniert hat lag aber am js-controller. Das Script sollte mit aktuellen Stable repo funktionieren.

                                Kein support per PM. Bitte im Forum Fragen stellen!

                                1 Reply Last reply
                                0
                                • K KeDi

                                  @eisbaeeer für welche Version des Puppeteer Adapters ist das Script?
                                  Ich nutze seit ewigen Zeiten die 0.2.8 weil ich hierfür ein funktionierendes hatte und danach nichts mehr klappte. Im Grunde würde ich gerne endlich mal auf die 0.4.0 aktualisieren.

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

                                  @kedi
                                  Ich benutze 0.4.0 - läuft. :+1:

                                  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
                                    #941

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

                                    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 () => {
                                    

                                    Wenn ich das mache, werden auch die Displays alle 5 Minuten neu aktualisiert. Obwohl kein neuer Inhalt vorliegt.
                                    Liegt das daran, das ein Bild übertragen wird welches sich minimal vom vorangegangenen Bild unterscheidet?

                                    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
                                      #942

                                      Noch ein "Verständnisproblem"!

                                      Wenn das Skript einen aktualisierten Screenshot erstellt, erscheint die Datei sofort wie erwartet im Ordner /tmp/ auf meinem Raspberry.

                                      Tja, und dann war es das.

                                      So wie ich das verstehe, soll die Datei doch dann zum AP gesendet werden, richtig? Nach "http://192.168.49.185/imgupload".

                                      Gibt es das Verzeichnis auf dem AP?

                                      Die Displays bemerken es anscheinend (flackern usw. als ob etwas neues kommt). Der Bildschirminhalt wird aber nicht aktualisiert.

                                      Wo ist da das Problem ?

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

                                      EisbaeeerE 1 Reply Last reply
                                      0
                                      • B Beowolf

                                        Noch ein "Verständnisproblem"!

                                        Wenn das Skript einen aktualisierten Screenshot erstellt, erscheint die Datei sofort wie erwartet im Ordner /tmp/ auf meinem Raspberry.

                                        Tja, und dann war es das.

                                        So wie ich das verstehe, soll die Datei doch dann zum AP gesendet werden, richtig? Nach "http://192.168.49.185/imgupload".

                                        Gibt es das Verzeichnis auf dem AP?

                                        Die Displays bemerken es anscheinend (flackern usw. als ob etwas neues kommt). Der Bildschirminhalt wird aber nicht aktualisiert.

                                        Wo ist da das Problem ?

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

                                        @beowolf Ich verwende eigentlich, bis auf die Temperaturanzeige, immer nur ereignisgesteuerte Uploads. Also immer nur, wenn sich ein Objekt in iobroker ändert. Spart Batterien. Wenn ich zyklisch, also alle 5 min aktualisiere, wird mir auch das Bild auf dem Display angezeigt. Du solltest das auch auf dem AP sehen, wenn ein neues Bild zur Übertragung anliegt. Das Verzeichnis passt schon. Die Daten werden über POST übertragen, deshalb kannst du da auch nicht mit dem Browser drauf zugreifen.

                                        Kein support per PM. Bitte im Forum Fragen stellen!

                                        1 Reply Last reply
                                        0
                                        • 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
                                          Reply
                                          • Reply as topic
                                          Log in to reply
                                          • Oldest to Newest
                                          • Newest to Oldest
                                          • Most Votes


                                          Support us

                                          ioBroker
                                          Community Adapters
                                          Donate

                                          840

                                          Online

                                          32.4k

                                          Users

                                          81.5k

                                          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