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

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

Community Forum

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

NEWS

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

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

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

E-INK Display OpenEPaperLink - Displayanzeige mit Batterie

Geplant Angeheftet Gesperrt Verschoben Praktische Anwendungen (Showcase)
1.0k Beiträge 48 Kommentatoren 343.8k Aufrufe 52 Watching
  • Älteste zuerst
  • Neuste zuerst
  • Meiste Stimmen
Antworten
  • In einem neuen Thema antworten
Anmelden zum Antworten
Dieses Thema wurde gelöscht. Nur Nutzer mit entsprechenden Rechten können es sehen.
  • 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
    schrieb am zuletzt editiert von
    #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 Antwort Letzte Antwort
    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
      schrieb am zuletzt editiert von
      #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 Antworten Letzte Antwort
      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
        schrieb am zuletzt editiert von
        #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 Antwort Letzte Antwort
        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
          schrieb am zuletzt editiert von
          #940

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

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

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

                            @eisbaeeer

                            Adapter wäre cool.

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

                            1 Antwort Letzte Antwort
                            0
                            • B Offline
                              B Offline
                              Beowolf
                              schrieb am zuletzt editiert von
                              #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 Antwort Letzte Antwort
                              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
                                schrieb am zuletzt editiert von
                                #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 Antwort Letzte Antwort
                                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
                                  schrieb am zuletzt editiert von 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 Antwort Letzte Antwort
                                  0
                                  • M Offline
                                    M Offline
                                    M-A-X
                                    schrieb am zuletzt editiert von
                                    #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 Antwort Letzte Antwort
                                    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
                                      schrieb am zuletzt editiert von
                                      #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 Antwort Letzte Antwort
                                      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
                                        schrieb am zuletzt editiert von 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 Antworten Letzte Antwort
                                        0
                                        • HomoranH Nicht stören
                                          HomoranH Nicht stören
                                          Homoran
                                          Global Moderator Administrators
                                          schrieb am zuletzt editiert von 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 Antwort Letzte Antwort
                                          1
                                          Antworten
                                          • In einem neuen Thema antworten
                                          Anmelden zum Antworten
                                          • Älteste zuerst
                                          • Neuste zuerst
                                          • Meiste Stimmen


                                          Support us

                                          ioBroker
                                          Community Adapters
                                          Donate

                                          819

                                          Online

                                          32.4k

                                          Benutzer

                                          81.4k

                                          Themen

                                          1.3m

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

                                          • Du hast noch kein Konto? Registrieren

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