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

donate donate
  1. ioBroker Community Home
  2. Deutsch
  3. Visualisierung
  4. HTML Canvas Zeichnung Farbwerte aus DP übernehmen

NEWS

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

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

  • Weihnachtsangebot 2025! 🎄
    BluefoxB
    Bluefox
    25
    1
    2.2k

HTML Canvas Zeichnung Farbwerte aus DP übernehmen

Geplant Angeheftet Gesperrt Verschoben Visualisierung
27 Beiträge 3 Kommentatoren 1.6k Aufrufe 3 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.
  • dirk_1930D dirk_1930

    @oliverio @liv-in-sky

    Ich helfe mir jetzt, indem ich das Element mit Hilfe von Node-Canvas generiere. Damit bekomme ich ein PNG Bild, dass ich abspeichern möchte.

    Die Syntax zum abspeichern lautet:

    .pipe(fs.createWriteStream(path.join(__dirname, "day0.png")));
    

    Was muss ich hier als 'dirname' angeben, damit ich unter 0_userdata darauf zugreifen kann?

    In Visual Studio Code speichert er das dann im gleichen Ordner, nur im IOBroker meldet er __dirname is not defined

    OliverIOO Offline
    OliverIOO Offline
    OliverIO
    schrieb am zuletzt editiert von
    #18

    @dirk_1930

    du verwechselst client(browser) und server(iobroker)

    die geposteten befehle funktionieren nur unter node auf dem server.
    der browser kann diese befehle nicht.
    der server hat keinen zugriff auf die dom (document object model) des browsers.

    über javascript im browser kannst du einen download anstoßen und das bild dann abspeichern auf den server transferieren und dort dann an eine bestimmte stelle abspeichern. aber evtl ist eine andere vorgehensweise zielführender.
    warum willst du die grafik speichern? sie wird ja bei jedem aufruf immer neu gemalt
    zur archivierung? zur wiederverwendung? dann sollte man lieber die grafik auf dem server erzeugen.

    Meine Adapter und Widgets
    TVProgram, SqueezeboxRPC, OpenLiga, RSSFeed, MyTime,, pi-hole2, vis-json-template, skiinfo, vis-mapwidgets, vis-2-widgets-rssfeed
    Links im Profil

    dirk_1930D 1 Antwort Letzte Antwort
    0
    • OliverIOO OliverIO

      @dirk_1930

      du verwechselst client(browser) und server(iobroker)

      die geposteten befehle funktionieren nur unter node auf dem server.
      der browser kann diese befehle nicht.
      der server hat keinen zugriff auf die dom (document object model) des browsers.

      über javascript im browser kannst du einen download anstoßen und das bild dann abspeichern auf den server transferieren und dort dann an eine bestimmte stelle abspeichern. aber evtl ist eine andere vorgehensweise zielführender.
      warum willst du die grafik speichern? sie wird ja bei jedem aufruf immer neu gemalt
      zur archivierung? zur wiederverwendung? dann sollte man lieber die grafik auf dem server erzeugen.

      dirk_1930D Offline
      dirk_1930D Offline
      dirk_1930
      schrieb am zuletzt editiert von dirk_1930
      #19

      @oliverio
      Ich habe das als Script auf dem IOBroker laufen, nicht im Browser. Abgespeichert unter "common".

      Ich habe sehr viele Elemente, die gezeichnet werden, und habe festgestellt, dass der Browser dabei immer eine Gedenkminute einlegt.

      Ich würde mir die Elemente nach dem API Aufruf erstellen, und dann als Bild in der VIS einfügen.

      1 Antwort Letzte Antwort
      0
      • OliverIOO Offline
        OliverIOO Offline
        OliverIO
        schrieb am zuletzt editiert von
        #20

        @dirk_1930
        ah ok du bist auf server-seite gewechselt.

        Zum Speicherort: du kannst dir einen ort hier drunter suchen
        /opt/iobroker/iobroker-data/

        Wenn du die Datei über vis bzw den webserver von iobroker anzeigen lassen möchtest, musst du diese datei erst bekannt machen, sonst kennt der webserver die datei nicht.
        da bin ich nicht ganz so firm, evtl kann da jemand anderes helfen

        Meine Adapter und Widgets
        TVProgram, SqueezeboxRPC, OpenLiga, RSSFeed, MyTime,, pi-hole2, vis-json-template, skiinfo, vis-mapwidgets, vis-2-widgets-rssfeed
        Links im Profil

        dirk_1930D 1 Antwort Letzte Antwort
        0
        • OliverIOO OliverIO

          @dirk_1930
          ah ok du bist auf server-seite gewechselt.

          Zum Speicherort: du kannst dir einen ort hier drunter suchen
          /opt/iobroker/iobroker-data/

          Wenn du die Datei über vis bzw den webserver von iobroker anzeigen lassen möchtest, musst du diese datei erst bekannt machen, sonst kennt der webserver die datei nicht.
          da bin ich nicht ganz so firm, evtl kann da jemand anderes helfen

          dirk_1930D Offline
          dirk_1930D Offline
          dirk_1930
          schrieb am zuletzt editiert von dirk_1930
          #21

          @oliverio @liv-in-sky

          Ich habe jetzt

          __dirname = '/opt/iobroker/iobroker-data/files/vis.0'
          

          gesetzt, sehe aber im Dateimanager die Datei nicht (wie du schon vermutet hast)
          (über die Konsole sehe ich die Datei)

          Wer könnte mir jetzt dabei helfen?

          /// Nachtrag

          Man muss die writeFile Methode benutzen. Ich lese jetzt das File aus (welches mit dem Stream erzeugt wurde) und schreibe mit writeFile zurück.
          Problem ist jetzt, das der Stream noch nicht fertig ist, wenn der writeFile Befehl ausgeführt ist. Wie bekomme ich das hin, dass er wartet?

          console.log("Datei erstellen");
          
          let dateiName = 'day.png';
          __dirname = '/opt/iobroker/iobroker-data/files/vis.0/'
           canvas
             .createPNGStream()
             .pipe(fs.createWriteStream(path.join(__dirname,dateiName))); //png schreiben
           
          const picture= fs.readFileSync('/opt/iobroker/iobroker-data/files/vis.0/'+ dateiName); //liest linux-datei-system
          writeFile('vis.0', 'test.png', picture, function (error) { });   //schreibt in iobroker system
          
          
          OliverIOO 1 Antwort Letzte Antwort
          0
          • dirk_1930D dirk_1930

            @oliverio @liv-in-sky

            Ich habe jetzt

            __dirname = '/opt/iobroker/iobroker-data/files/vis.0'
            

            gesetzt, sehe aber im Dateimanager die Datei nicht (wie du schon vermutet hast)
            (über die Konsole sehe ich die Datei)

            Wer könnte mir jetzt dabei helfen?

            /// Nachtrag

            Man muss die writeFile Methode benutzen. Ich lese jetzt das File aus (welches mit dem Stream erzeugt wurde) und schreibe mit writeFile zurück.
            Problem ist jetzt, das der Stream noch nicht fertig ist, wenn der writeFile Befehl ausgeführt ist. Wie bekomme ich das hin, dass er wartet?

            console.log("Datei erstellen");
            
            let dateiName = 'day.png';
            __dirname = '/opt/iobroker/iobroker-data/files/vis.0/'
             canvas
               .createPNGStream()
               .pipe(fs.createWriteStream(path.join(__dirname,dateiName))); //png schreiben
             
            const picture= fs.readFileSync('/opt/iobroker/iobroker-data/files/vis.0/'+ dateiName); //liest linux-datei-system
            writeFile('vis.0', 'test.png', picture, function (error) { });   //schreibt in iobroker system
            
            
            OliverIOO Offline
            OliverIOO Offline
            OliverIO
            schrieb am zuletzt editiert von
            #22

            @dirk_1930
            in dem du den callback verwendest
            https://github.com/ioBroker/ioBroker.javascript/blob/11a8a28d70cb68a28b28440e41f0b2c9dbb7132d/docs/en/javascript.md#writefile

            Meine Adapter und Widgets
            TVProgram, SqueezeboxRPC, OpenLiga, RSSFeed, MyTime,, pi-hole2, vis-json-template, skiinfo, vis-mapwidgets, vis-2-widgets-rssfeed
            Links im Profil

            dirk_1930D 1 Antwort Letzte Antwort
            0
            • OliverIOO OliverIO

              @dirk_1930
              in dem du den callback verwendest
              https://github.com/ioBroker/ioBroker.javascript/blob/11a8a28d70cb68a28b28440e41f0b2c9dbb7132d/docs/en/javascript.md#writefile

              dirk_1930D Offline
              dirk_1930D Offline
              dirk_1930
              schrieb am zuletzt editiert von
              #23

              @oliverio

              … den nutze ich doch schon, oder nicht.

              OliverIOO 1 Antwort Letzte Antwort
              0
              • dirk_1930D dirk_1930

                @oliverio

                … den nutze ich doch schon, oder nicht.

                OliverIOO Offline
                OliverIOO Offline
                OliverIO
                schrieb am zuletzt editiert von
                #24

                @dirk_1930
                ah sorry, nicht genau genug gelesen.
                probier mal das folgende.
                mehr oder weniger das gleiche, aber weniger kompakt,
                dafür kann da das Ereignis abgegriffen werden, wenn der stream fertig geschrieben ist.
                ich habe es nur schnell zusammenkopiert und grob angepasst.
                kann noch fehler enthalten, aber das grundprinzip stimmt.

                console.log("Datei erstellen");
                 
                let dateiName = 'day.png';
                __dirname = '/opt/iobroker/iobroker-data/files/vis.0/';
                
                 
                const fs = require('fs')
                const out = fs.createWriteStream(__dirname + '/test.png')
                const stream = canvas.createPNGStream()
                stream.pipe(out)
                out.on('finish', () =>  {
                    console.log('The PNG file was written.');
                    const picture= fs.readFileSync('/opt/iobroker/iobroker-data/files/vis.0/'+ dateiName); 
                    writeFile('vis.0', 'test.png', picture, function (error) { });   
                )
                 
                

                Meine Adapter und Widgets
                TVProgram, SqueezeboxRPC, OpenLiga, RSSFeed, MyTime,, pi-hole2, vis-json-template, skiinfo, vis-mapwidgets, vis-2-widgets-rssfeed
                Links im Profil

                dirk_1930D 1 Antwort Letzte Antwort
                0
                • OliverIOO OliverIO

                  @dirk_1930
                  ah sorry, nicht genau genug gelesen.
                  probier mal das folgende.
                  mehr oder weniger das gleiche, aber weniger kompakt,
                  dafür kann da das Ereignis abgegriffen werden, wenn der stream fertig geschrieben ist.
                  ich habe es nur schnell zusammenkopiert und grob angepasst.
                  kann noch fehler enthalten, aber das grundprinzip stimmt.

                  console.log("Datei erstellen");
                   
                  let dateiName = 'day.png';
                  __dirname = '/opt/iobroker/iobroker-data/files/vis.0/';
                  
                   
                  const fs = require('fs')
                  const out = fs.createWriteStream(__dirname + '/test.png')
                  const stream = canvas.createPNGStream()
                  stream.pipe(out)
                  out.on('finish', () =>  {
                      console.log('The PNG file was written.');
                      const picture= fs.readFileSync('/opt/iobroker/iobroker-data/files/vis.0/'+ dateiName); 
                      writeFile('vis.0', 'test.png', picture, function (error) { });   
                  )
                   
                  
                  dirk_1930D Offline
                  dirk_1930D Offline
                  dirk_1930
                  schrieb am zuletzt editiert von
                  #25

                  @oliverio

                  Habe es noch etwas geändert und jetzt geht es wie gewünscht :+1: :blush:

                  Was würde ich nur ohne Euch machen...

                  let dateiName = 'dayTest.png';
                  __dirname = '/opt/iobroker/iobroker-data/files/vis.0/';
                  const out = fs.createWriteStream(__dirname + dateiName);
                  const stream = canvas.createPNGStream();
                  stream.pipe(out);
                  out.on('finish', () => {
                      const picture = fs.readFileSync(__dirname + dateiName);
                      writeFile('vis.0' , '/myfiles/img/' + dateiName, picture, function (error) { });
                      console.log('The PNG file was written.');
                  })
                  
                  liv-in-skyL 1 Antwort Letzte Antwort
                  0
                  • dirk_1930D dirk_1930

                    @oliverio

                    Habe es noch etwas geändert und jetzt geht es wie gewünscht :+1: :blush:

                    Was würde ich nur ohne Euch machen...

                    let dateiName = 'dayTest.png';
                    __dirname = '/opt/iobroker/iobroker-data/files/vis.0/';
                    const out = fs.createWriteStream(__dirname + dateiName);
                    const stream = canvas.createPNGStream();
                    stream.pipe(out);
                    out.on('finish', () => {
                        const picture = fs.readFileSync(__dirname + dateiName);
                        writeFile('vis.0' , '/myfiles/img/' + dateiName, picture, function (error) { });
                        console.log('The PNG file was written.');
                    })
                    
                    liv-in-skyL Offline
                    liv-in-skyL Offline
                    liv-in-sky
                    schrieb am zuletzt editiert von
                    #26

                    @dirk_1930 du könntest doch mal etwas zeigen,von dem, was du da gezaubert hast

                    mit dem programm : ScreenToGif https://www.screentogif.com/downloads.html -

                    wäre das schnell gemacht

                    nach einem gelösten Thread wäre es sinnvoll dies in der Überschrift des ersten Posts einzutragen [gelöst]-... Bitte benutzt das Voting rechts unten im Beitrag wenn er euch geholfen hat. Forum-Tools: PicPick https://picpick.app/en/download/ und ScreenToGif https://www.screentogif.com/downloads.html

                    dirk_1930D 1 Antwort Letzte Antwort
                    0
                    • liv-in-skyL liv-in-sky

                      @dirk_1930 du könntest doch mal etwas zeigen,von dem, was du da gezaubert hast

                      mit dem programm : ScreenToGif https://www.screentogif.com/downloads.html -

                      wäre das schnell gemacht

                      dirk_1930D Offline
                      dirk_1930D Offline
                      dirk_1930
                      schrieb am zuletzt editiert von
                      #27

                      @liv-in-sky
                      Gerne... allerdings bin ich noch weit davon entfernt fertig zu sein.
                      Ich nutze die API von Meteoblue. Dort gibt es den sogenannten Rain Spot, der die Niederschlagsverteilung innerhalb von 15 km um deinen Standort herum zeigt. Da die API nur einen Farbcodierten String liefert, musste ich das aufdröseln. Da ich nun wirklich nicht der begnadete Programmierer bin, braucht das halt ewig und es tauchen ständig neue Fragen und Wünsche / Ideen auf. Allerdings lernt man auf diese Art am Praxisprojekt auch am meisten.
                      So sehen die gerenderten Rainspots für die nächsten 5 Tage aus.
                      Da es jetzt auch noch stündliche Auflösungen gibt, dachte ich mir es macht mehr Sinn diese Bilder einmalig nach API Aufruf zu rendern und dann nur jeweils das Bild einzufügen. Sonst müsste ich ja unter Umständen dann bei x-HTML Widgets den Code ändern.
                      Wenn ich das ganze mal als Card fertig habe poste ich gerne einen Screenshot.

                      Screenshot 2022-03-15 075449.png

                      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

                      674

                      Online

                      32.6k

                      Benutzer

                      82.2k

                      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