Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Visualisierung
    4. HTML Canvas Zeichnung Farbwerte aus DP übernehmen

    NEWS

    • Neuer Blog: Fotos und Eindrücke aus Solingen

    • ioBroker@Smart Living Forum Solingen, 14.06. - Agenda added

    • ioBroker goes Matter ... Matter Adapter in Stable

    HTML Canvas Zeichnung Farbwerte aus DP übernehmen

    This topic has been deleted. Only users with topic management privileges can see it.
    • dirk_1930
      dirk_1930 @OliverIO last edited by 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

      OliverIO 1 Reply Last reply Reply Quote 0
      • OliverIO
        OliverIO @dirk_1930 last edited by

        @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_1930 1 Reply Last reply Reply Quote 0
        • dirk_1930
          dirk_1930 @OliverIO last edited by dirk_1930

          @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 Reply Last reply Reply Quote 0
          • OliverIO
            OliverIO last edited by

            @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_1930 1 Reply Last reply Reply Quote 0
            • dirk_1930
              dirk_1930 @OliverIO last edited by 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
              
              
              OliverIO 1 Reply Last reply Reply Quote 0
              • OliverIO
                OliverIO @dirk_1930 last edited by

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

                dirk_1930 1 Reply Last reply Reply Quote 0
                • dirk_1930
                  dirk_1930 @OliverIO last edited by

                  @oliverio

                  … den nutze ich doch schon, oder nicht.

                  OliverIO 1 Reply Last reply Reply Quote 0
                  • OliverIO
                    OliverIO @dirk_1930 last edited by

                    @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_1930 1 Reply Last reply Reply Quote 0
                    • dirk_1930
                      dirk_1930 @OliverIO last edited by

                      @oliverio

                      Habe es noch etwas geändert und jetzt geht es wie gewünscht 👍 😊

                      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-sky 1 Reply Last reply Reply Quote 0
                      • liv-in-sky
                        liv-in-sky @dirk_1930 last edited by

                        @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_1930 1 Reply Last reply Reply Quote 0
                        • dirk_1930
                          dirk_1930 @liv-in-sky last edited by

                          @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 Reply Last reply Reply Quote 1
                          • First post
                            Last post

                          Support us

                          ioBroker
                          Community Adapters
                          Donate

                          794
                          Online

                          31.9k
                          Users

                          80.2k
                          Topics

                          1.3m
                          Posts

                          3
                          27
                          1049
                          Loading More Posts
                          • Oldest to Newest
                          • Newest to Oldest
                          • Most Votes
                          Reply
                          • Reply as topic
                          Log in to reply
                          Community
                          Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
                          The ioBroker Community 2014-2023
                          logo