Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Visualisierung
    4. FileUpload vom PC(Tablet) in die VIS

    NEWS

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

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    FileUpload vom PC(Tablet) in die VIS

    This topic has been deleted. Only users with topic management privileges can see it.
    • liv-in-sky
      liv-in-sky last edited by

      es handelt sich um eine art mini-datei manager für die vis

      es können files direkt vom pc-browser oder tablet-browser über eine vis-view hochgeladen werden

      AApossis (118).gif

      einrichtung:

      • im filesystem unter /opt/iobroker/iobroker-data/files/vis.0 den ordner PicFromBrowserUpload anlegen
      cd  /opt/iobroker/iobroker-data/files/vis.0
      mkdir PicFromBrowserUpload
      chmod 777 PicFromBrowserUpload
      

      widgets zum import (inventwo widgets muss als adpter installiert sein):

      [{"tpl":"tplImage","data":{"g_fixed":false,"g_visibility":false,"g_css_font_text":false,"g_css_background":false,"g_css_shadow_padding":false,"g_css_border":false,"g_gestures":false,"g_signals":false,"g_last_change":false,"visibility-cond":"==","visibility-val":1,"visibility-groups-action":"hide","refreshInterval":"0","signals-cond-0":"==","signals-val-0":true,"signals-icon-0":"/vis/signals/lowbattery.png","signals-icon-size-0":0,"signals-blink-0":false,"signals-horz-0":0,"signals-vert-0":0,"signals-hide-edit-0":false,"signals-cond-1":"==","signals-val-1":true,"signals-icon-1":"/vis/signals/lowbattery.png","signals-icon-size-1":0,"signals-blink-1":false,"signals-horz-1":0,"signals-vert-1":0,"signals-hide-edit-1":false,"signals-cond-2":"==","signals-val-2":true,"signals-icon-2":"/vis/signals/lowbattery.png","signals-icon-size-2":0,"signals-blink-2":false,"signals-horz-2":0,"signals-vert-2":0,"signals-hide-edit-2":false,"lc-type":"last-change","lc-is-interval":true,"lc-is-moment":false,"lc-format":"","lc-position-vert":"top","lc-position-horz":"right","lc-offset-vert":0,"lc-offset-horz":0,"lc-font-size":"12px","lc-font-family":"","lc-font-style":"","lc-bkg-color":"","lc-color":"","lc-border-width":"0","lc-border-style":"","lc-border-color":"","lc-border-radius":10,"lc-zindex":0,"src":"{0_userdata.0.UPLOADinVIS.uploadBase64}"},"style":{"left":"497px","top":"61px","width":"306px","height":"409px"},"widgetSet":"basic"},{"tpl":"tplHtml","data":{"g_fixed":false,"g_visibility":false,"g_css_font_text":true,"g_css_background":false,"g_css_shadow_padding":false,"g_css_border":false,"g_gestures":false,"g_signals":false,"g_last_change":false,"visibility-cond":"==","visibility-val":1,"visibility-groups-action":"hide","refreshInterval":"0","signals-cond-0":"==","signals-val-0":true,"signals-icon-0":"/vis/signals/lowbattery.png","signals-icon-size-0":0,"signals-blink-0":false,"signals-horz-0":0,"signals-vert-0":0,"signals-hide-edit-0":false,"signals-cond-1":"==","signals-val-1":true,"signals-icon-1":"/vis/signals/lowbattery.png","signals-icon-size-1":0,"signals-blink-1":false,"signals-horz-1":0,"signals-vert-1":0,"signals-hide-edit-1":false,"signals-cond-2":"==","signals-val-2":true,"signals-icon-2":"/vis/signals/lowbattery.png","signals-icon-size-2":0,"signals-blink-2":false,"signals-horz-2":0,"signals-vert-2":0,"signals-hide-edit-2":false,"lc-type":"last-change","lc-is-interval":true,"lc-is-moment":false,"lc-format":"","lc-position-vert":"top","lc-position-horz":"right","lc-offset-vert":0,"lc-offset-horz":0,"lc-font-size":"12px","lc-font-family":"","lc-font-style":"","lc-bkg-color":"","lc-color":"","lc-border-width":"0","lc-border-style":"","lc-border-color":"","lc-border-radius":10,"lc-zindex":0,"html":"Zeigt das Bild  - gespeichert als Base64-Datei im Datenpunkt<br>"},"style":{"left":"428px","top":"13px","width":"441px","height":"75px","font-weight":"bold","text-align":"center"},"widgetSet":"basic"},{"tpl":"i-vis-jsontable","data":{"g_fixed":false,"g_visibility":false,"g_css_font_text":false,"g_css_background":false,"g_css_shadow_padding":false,"g_css_border":false,"g_gestures":false,"g_signals":false,"g_last_change":false,"visibility-cond":"==","visibility-val":1,"visibility-groups-action":"hide","iTblRowLimit":"100","iTableRefreshRate":"0","iColCount":"2","iColShow1":"true","iTblTextAlign1":"left","iTblCellFormat1":"normal","iTblCellImageSize1":"200","iTblCellBooleanCheckbox1":"false","iTblCellBooleanColorFalse1":"#ff0000","iTblCellBooleanColorTrue1":"#00ff00","iTblCellNumberDecimals1":"2","iTblCellNumberDecimalSeperator1":".","iTblCellNumberThousandSeperator1":",","iTblCellThresholdsDp1":"","iTblCellThresholdsText1":"","iOpacityAll":"1","iTblRowEvenColor":"#d2d0d0","iTblRowUnevenColor":"#f6f7f2","iTblHeaderColor":"#d3caca","iRowSpacing":"10","iTblRowEvenTextColor":"#000000","iTblRowUnevenTextColor":"#000000","iTblHeaderTextColor":"#000000","iBorderSize":"0","iBorderStyleLeft":"none","iBorderStyleRight":"none","iBorderStyleUp":"none","iBorderStyleDown":"none","iBorderColor":"#ffffff","signals-cond-0":"==","signals-val-0":true,"signals-icon-0":"/vis/signals/lowbattery.png","signals-icon-size-0":0,"signals-blink-0":false,"signals-horz-0":0,"signals-vert-0":0,"signals-hide-edit-0":false,"signals-cond-1":"==","signals-val-1":true,"signals-icon-1":"/vis/signals/lowbattery.png","signals-icon-size-1":0,"signals-blink-1":false,"signals-horz-1":0,"signals-vert-1":0,"signals-hide-edit-1":false,"signals-cond-2":"==","signals-val-2":true,"signals-icon-2":"/vis/signals/lowbattery.png","signals-icon-size-2":0,"signals-blink-2":false,"signals-horz-2":0,"signals-vert-2":0,"signals-hide-edit-2":false,"lc-type":"last-change","lc-is-interval":true,"lc-is-moment":false,"lc-format":"","lc-position-vert":"top","lc-position-horz":"right","lc-offset-vert":0,"lc-offset-horz":0,"lc-font-size":"12px","lc-font-family":"","lc-font-style":"","lc-bkg-color":"","lc-color":"","lc-border-width":"0","lc-border-style":"","lc-border-color":"","lc-border-radius":10,"lc-zindex":0,"oid":"0_userdata.0.UPLOADinVIS.VerzeichnisUploads","iColShow2":"true","iTblTextAlign2":"left","iTblCellFormat2":"normal","iTblCellImageSize2":"200","iTblCellBooleanCheckbox2":"false","iTblCellBooleanColorFalse2":"#ff0000","iTblCellBooleanColorTrue2":"#00ff00","iTblCellNumberDecimals2":"2","iTblCellNumberDecimalSeperator2":".","iTblCellNumberThousandSeperator2":",","iTblCellThresholdsDp2":"","iTblCellThresholdsText2":""},"style":{"left":"31px","top":"575px","width":"372px","height":"336px"},"widgetSet":"vis-inventwo"},{"tpl":"tplHtml","data":{"g_fixed":false,"g_visibility":false,"g_css_font_text":true,"g_css_background":false,"g_css_shadow_padding":false,"g_css_border":false,"g_gestures":false,"g_signals":false,"g_last_change":false,"visibility-cond":"==","visibility-val":1,"visibility-groups-action":"hide","refreshInterval":"0","signals-cond-0":"==","signals-val-0":true,"signals-icon-0":"/vis/signals/lowbattery.png","signals-icon-size-0":0,"signals-blink-0":false,"signals-horz-0":0,"signals-vert-0":0,"signals-hide-edit-0":false,"signals-cond-1":"==","signals-val-1":true,"signals-icon-1":"/vis/signals/lowbattery.png","signals-icon-size-1":0,"signals-blink-1":false,"signals-horz-1":0,"signals-vert-1":0,"signals-hide-edit-1":false,"signals-cond-2":"==","signals-val-2":true,"signals-icon-2":"/vis/signals/lowbattery.png","signals-icon-size-2":0,"signals-blink-2":false,"signals-horz-2":0,"signals-vert-2":0,"signals-hide-edit-2":false,"lc-type":"last-change","lc-is-interval":true,"lc-is-moment":false,"lc-format":"","lc-position-vert":"top","lc-position-horz":"right","lc-offset-vert":0,"lc-offset-horz":0,"lc-font-size":"12px","lc-font-family":"","lc-font-style":"","lc-bkg-color":"","lc-color":"","lc-border-width":"0","lc-border-style":"","lc-border-color":"","lc-border-radius":10,"lc-zindex":0,"html":"Zeigt die aktuellen Files in Directory<br>Ist ein Inventwo-Json Widget\n<br>im Ordner: /opt/iobroker/iobroker-data/files/vis.0/PicFromBrowserUpload"},"style":{"left":"36px","top":"467px","width":"622px","height":"75px","font-weight":"bold"},"widgetSet":"basic"},{"tpl":"tplHtml","data":{"g_fixed":false,"g_visibility":false,"g_css_font_text":false,"g_css_background":false,"g_css_shadow_padding":false,"g_css_border":true,"g_gestures":false,"g_signals":false,"g_last_change":false,"visibility-cond":"==","visibility-val":1,"visibility-groups-action":"hide","refreshInterval":"0","signals-cond-0":"==","signals-val-0":true,"signals-icon-0":"/vis/signals/lowbattery.png","signals-icon-size-0":0,"signals-blink-0":false,"signals-horz-0":0,"signals-vert-0":0,"signals-hide-edit-0":false,"signals-cond-1":"==","signals-val-1":true,"signals-icon-1":"/vis/signals/lowbattery.png","signals-icon-size-1":0,"signals-blink-1":false,"signals-horz-1":0,"signals-vert-1":0,"signals-hide-edit-1":false,"signals-cond-2":"==","signals-val-2":true,"signals-icon-2":"/vis/signals/lowbattery.png","signals-icon-size-2":0,"signals-blink-2":false,"signals-horz-2":0,"signals-vert-2":0,"signals-hide-edit-2":false,"lc-type":"last-change","lc-is-interval":true,"lc-is-moment":false,"lc-format":"","lc-position-vert":"top","lc-position-horz":"right","lc-offset-vert":0,"lc-offset-horz":0,"lc-font-size":"12px","lc-font-family":"","lc-font-style":"","lc-bkg-color":"","lc-color":"","lc-border-width":"0","lc-border-style":"","lc-border-color":"","lc-border-radius":10,"lc-zindex":0,"html":"<input type=\"file\" id=\"imgload\" >\n<img src=\"#\" id=\"imgshow\" align=\"left\" height=\"100px\">\n\n<script>\n$('document').ready(function () {\n    $(\"#imgload\").change(function () {\n        if (this.files && this.files[0]) {\n            var reader = new FileReader();\n            reader.onload = function (e) {\n                $('#imgshow').attr('src', e.target.result);\n            }\n            reader.readAsDataURL(this.files[0]);\n        }\n    });\n});\n\n$('document').ready(function () {\n    $(\"#imgload\").change(function () {\n        if (this.files && this.files[0]) {\n            console.log(this.files[0]);\n           \n            var reader = new FileReader();\n            \n            reader.onload = function (e) {\n               let buffer= e.target.result;\n              /* console.log(buffer);*/\n              /* sendFile(buffer);*/\n               vis.setValue('0_userdata.0.UPLOADinVIS.uploadBase64',buffer);\n            }\n            reader.readAsDataURL(this.files[0]);\n        }\n    });\n});\n$('document').ready( function () {\n    var nameOfPic;\n    $(\"#imgload\").change(function () {\n        if (this.files && this.files[0]) {\n            console.log(this.files[0].name);\n             nameOfPic=this.files[0].name;  \n      \n            var reader = new FileReader();\n            reader.onload = async function (e) {\n               let buffer= e.target.result;\n            await schreibeDP(buffer).then(schreibeDP2(nameOfPic));\n            \n            }\n            reader.readAsArrayBuffer(this.files[0]);\n        }\n    });\n});\n\nasync function schreibeDP(buffer){\n    vis.setValue('0_userdata.0.UPLOADinVIS.myArrBuff',buffer);\n}\nasync function schreibeDP2(nameOfPic){\n    vis.setValue('0_userdata.0.UPLOADinVIS.FileNameUpload',nameOfPic);\n}\n    \n</script>"},"style":{"left":"46px","top":"50px","width":"392px","height":"374px","border-width":"2px","border-radius":"15px","border-style":"solid"},"widgetSet":"basic"}]
      

      datenpunkte einrichten
      ich wähle hier mal einen JSON import über den object-tab im admin
      wird unter 0_userdata.0.UPLOADinVIS.json angelegt
      0_userdata.0.UPLOADinVIS.json

      und als letztes brauchen wir noch ein blockly script

      <xml xmlns="https://developers.google.com/blockly/xml">
       <variables>
         <variable id="Rnza4X/zYJ1]_({Ro$?U">x</variable>
         <variable id="+PpwhrR{%?2KI!xXhMUS">nameOfPic</variable>
       </variables>
       <block type="on" id=")RW%:%]1+M4dISTG^!A." x="663" y="112">
         <field name="OID">0_userdata.0.UPLOADinVIS.FileNameUpload</field>
         <field name="CONDITION">any</field>
         <field name="ACK_CONDITION"></field>
         <statement name="STATEMENT">
           <block type="procedures_callcustomnoreturn" id="or+eJnf6F=#:bsPNJ(%f">
             <mutation name="etwas tun">
               <arg name="x"></arg>
               <arg name="nameOfPic"></arg>
             </mutation>
             <value name="ARG0">
               <block type="get_value" id="Nr.zE/gU[`Ea0VwmWIJ.">
                 <field name="ATTR">val</field>
                 <field name="OID">0_userdata.0.UPLOADinVIS.myArrBuff</field>
               </block>
             </value>
             <value name="ARG1">
               <block type="on_source" id="];ub?tqjbC5B?gVH$*XW">
                 <field name="ATTR">state.val</field>
               </block>
             </value>
           </block>
         </statement>
       </block>
       <block type="procedures_defcustomnoreturn" id="I4%?Y:hyE7@m3q(dzpIs" x="612" y="412">
         <mutation statements="false">
           <arg name="x" varid="Rnza4X/zYJ1]_({Ro$?U"></arg>
           <arg name="nameOfPic" varid="+PpwhrR{%?2KI!xXhMUS"></arg>
         </mutation>
         <field name="NAME">etwas tun</field>
         <field name="SCRIPT">Y29uc3QgZnMgPSByZXF1aXJlKCdmcycpOw0KbGV0IG15QXJyRmlsZXM9W10gDQpsZXQgY291bnRlcj0wIA0KIA0KIGxvZygic2NocmVpYmUgZmlsZSBtaXQgIiArIG5hbWVPZlBpYykNCg0Kd3JpdGVGaWxlKCd2aXMuMCcsIi9QaWNGcm9tQnJvd3NlclVwbG9hZC8iK25hbWVPZlBpYyxCdWZmZXIuZnJvbSh4KSwgZnVuY3Rpb24gKCl7DQoNCg0KZnMucmVhZGRpcignL29wdC9pb2Jyb2tlci9pb2Jyb2tlci1kYXRhL2ZpbGVzL3Zpcy4wL1BpY0Zyb21Ccm93c2VyVXBsb2FkJywgKGVyciwgZmlsZXMpID0+IHsNCiAgaWYgKGVycikNCiAgICBjb25zb2xlLmxvZyhlcnIpOw0KICBlbHNlIHsNCiAgICBjb25zb2xlLmxvZygiXG5DdXJyZW50IGRpcmVjdG9yeSBmaWxlbmFtZXM6Iik7DQogICAgZmlsZXMuZm9yRWFjaChmaWxlID0+IHsNCiAgICAgIGNvbnNvbGUubG9nKGZpbGUpO2NvdW50ZXIrKztteUFyckZpbGVzLnB1c2goeyJBbnphaGwiOmNvdW50ZXIsIkZpbGVuYW1lIjpmaWxlfSkNCiAgICB9KQ0KICB9DQogIA0KICBsb2coSlNPTi5zdHJpbmdpZnkoZmlsZXMpKQ0KICBzZXRTdGF0ZSgnMF91c2VyZGF0YS4wLlVQTE9BRGluVklTLlZlcnplaWNobmlzVXBsb2FkcycsSlNPTi5zdHJpbmdpZnkobXlBcnJGaWxlcykpDQp9KQ0KDQogfSApDQoNCg==</field>
         <comment pinned="false" h="80" w="160">Beschreibe diese Funktion …</comment>
       </block>
      </xml>
      

      liv-in-sky 1 Reply Last reply Reply Quote 3
      • liv-in-sky
        liv-in-sky @liv-in-sky last edited by

        @sigi234

        ich denke, wir müssen für einen iobroker auf windows nur das blockly umschreiben - ich muss das mal ausprobieren - oder weißt du, wie man den pfad im script unter windows richtig angibt

        sigi234 1 Reply Last reply Reply Quote 0
        • sigi234
          sigi234 Forum Testing Most Active @liv-in-sky last edited by sigi234

          @liv-in-sky sagte in FileUpload vom PC(Tablet) in die VIS:

          @sigi234

          ich denke, wir müssen für einen iobroker auf windows nur das blockly umschreiben - ich muss das mal ausprobieren - oder weißt du, wie man den pfad im script unter windows richtig angibt

          Bin gerade dabei.

          Originalpfad zu meinen Host:

          C:\Program Files\iobroker\Home\iobroker-data\files\vis.0\PicFromBrowserUpload
          
          17:23:41.747	info	javascript.0 (5716) script.js.Liv.Upload: schreibe file mit Screenshot (4270).png
          17:23:41.759	info	javascript.0 (5716) script.js.Liv.Upload: {'errno':-4058,'code':'ENOENT','syscall':'scandir','path':'C:\\C:\\Program Files\\iobroker\\Home\\iobroker-data\\files\\vis.0\\PicFromBrowserUpload'}
          17:23:41.759	info	javascript.0 (5716) script.js.Liv.Upload: undefined
          

          Test 2

          Pfad:

          '/Program Files/iobroker/Home/iobroker-data/files/vis.0/PicFromBrowserUpload'
          
          javascript.0 (5716) Stop script script.js.Liv.Upload
          17:26:49.631	info	javascript.0 (5716) Start javascript script.js.Liv.Upload
          17:26:49.634	info	javascript.0 (5716) script.js.Liv.Upload: registered 1 subscription and 0 schedules
          17:27:04.762	info	javascript.0 (5716) script.js.Liv.Upload: schreibe file mit Screenshot (4270).png
          17:27:04.772	info	javascript.0 (5716) script.js.Liv.Upload: Current directory filenames:
          17:27:04.772	info	javascript.0 (5716) script.js.Liv.Upload: Screenshot (4270).png
          17:27:04.772	info	javascript.0 (5716) script.js.Liv.Upload: ["Screenshot (4270).png"]
          

          Screenshot (4275)_LI.jpg

          Screenshot (4276).png

          Schaut schon gut aus.

          liv-in-sky 2 Replies Last reply Reply Quote 0
          • liv-in-sky
            liv-in-sky @sigi234 last edited by

            @sigi234 ok

            geht auch so:

            Image 1.png

            1 Reply Last reply Reply Quote 0
            • liv-in-sky
              liv-in-sky @sigi234 last edited by liv-in-sky

              @sigi234

              man kann auch im blockly einen anderen pfad zu einem anderen verzeichnis angeben, falls man seine bilder für die vis in einem bestimmten ordner gesammelt hat - das ganze ist ja ein kleiner vis-datei-manager - halt nur für uploads

              die bilder sind im dateimanager der vis zu sehen und auswählbar 🙂

              zu ändern wäre dann:

              Image 1.png

              O 1 Reply Last reply Reply Quote 0
              • O
                onweb @liv-in-sky last edited by

                @liv-in-sky

                Sieht sehr professionell aus und um es perfekt zu machen mit eigenen widgets 👍
                Super Arbeit und danke.

                Leider bekomme ich diese nicht angezeigt, womöglich war mein Import der widgets zum import (inventwo widgets muss als adpter installiert sein) über object-tab im admin nicht richtig bzw. erfolgreich.

                Nach dem Import sehe ich 5 neue Objekte von 0 bis 4 am unteren Rand.
                Im Editor finde ich die leider dann nicht.

                Mache ich wohl irgend etwas falsch

                liv-in-sky 1 Reply Last reply Reply Quote 0
                • liv-in-sky
                  liv-in-sky @onweb last edited by

                  @onweb sagte in FileUpload vom PC(Tablet) in die VIS:

                  Leider bekomme ich diese nicht angezeigt, womöglich war mein Import der widgets zum import (inventwo widgets muss als adpter installiert sein) über object-tab im admin nicht richtig bzw. erfolgreich.

                  die widgets werden im vis-editor importiert - nicht im object tab


                  AApossis (119).gif

                  die datenpunkte werden im object-tab im admin importiert


                  AApossis (120).gif

                  O 1 Reply Last reply Reply Quote 0
                  • O
                    onweb @liv-in-sky last edited by

                    @liv-in-sky

                    Danke hat mir sehr geholfen. Werde jetzt schauen, wie dich die Bilder markiere und über SQL ImageDaten anbinde.
                    Wenn ich den Scripterweiterung diesbezüglich angepasst/zum laufen habe, werde ich hier was reinstellen.

                    Jedenfalls sieht es echt nach viel Erfahrung/Wissen mit ioBroker aus, Kompliment

                    liv-in-sky 1 Reply Last reply Reply Quote 0
                    • liv-in-sky
                      liv-in-sky @onweb last edited by liv-in-sky

                      @onweb sagte in FileUpload vom PC(Tablet) in die VIS:

                      SQL ImageDaten

                      kenne das nicht - was genau hast du da vor 🙂

                      bilder in einer mysql /sql speichern ? das script erzeugt eh ein sog. arraybuffer - heißt auch blob - ist in einem datenpunkt als object gepeichert 0_userdata.0.UPLOADinVIS.myArrBuff

                      evtl kannst du das verwenden - ich weiß nicht, wie man bilder in einer sql datenbank speichert - aber evtl über ein solches object

                      O 1 Reply Last reply Reply Quote 0
                      • O
                        onweb @liv-in-sky last edited by onweb

                        @liv-in-sky

                        Ich habe dein blocky mal komplett als JS umgesetzt.

                        Dies erspart dann zusätzlich den Import der Datenpunkte im object-tab und vereinfacht für mich die Weiterarbeit.

                        // JavaScript Document
                        const efC = false; // forceCreation ein/aus
                        // *****************************************************************************
                        
                        const strUpload = "0_userdata.0.UPLOADinVIS." ;
                        const subPfad =  "/PicFromBrowserUpload";
                        const strPfad =   "/opt/iobroker/iobroker-data/files/vis.0" + subPfad ;
                        
                        createState (strUpload + "FileNameUpload" , "0", efC, { read: true, write: true, name:  "FileNameUpload" , type: "string", def: 0 });
                        createState (strUpload + "uploadBase64" , "0", efC, { read: true, write: true, name:  "uploadBase64" , type: "string", def: 0 });
                        
                        createState (strUpload + "VerzeichnisUploads" , "0", efC, { read: true, write: true, name:  "VerzeichnisUploads" , type: "string", def: 0 });
                        createState (strUpload + "myArrBuff" , "0", efC, { read: true, write: true, name:  "myArrBuff" , type: "string", def: 0 });
                        
                        createState (strUpload + "FileNameUploadOld" , "0", efC, { read: true, write: true, name:  "FileNameUploadOld" , type: "string", def: 0 });
                        
                        //######### Ab hier Funktion  ########
                        FileUpload();               //Einmalig zur Initialisierung der Variablen
                        
                        schedule("*/1 * * * * *" , FileUpload);   // Jede Sekunde
                        
                        function FileUpload()
                        {
                           var nameOfPic = getState (strUpload + "FileNameUpload").val  ;
                           var nameOfPicOld = getState (strUpload + "FileNameUploadOld").val  ;
                           
                           if ( nameOfPic != nameOfPicOld )  // Bei änderung 
                           {
                               var x = getState (strUpload + "myArrBuff").val  ;
                              
                               const fs = require('fs');
                               let myArrFiles=[] 
                               let counter=0 
                        
                               log("schreibe file mit " + nameOfPic)
                        
                               writeFile('vis.0',subPfad + "/"+nameOfPic,Buffer.from(x), function ()
                               {
                        
                                   fs.readdir(strPfad, (err, files) => 
                                   {
                                       if (err)
                                           console.log(err);
                                       else 
                                       {
                                           console.log("\nCurrent directory filenames:");
                                           files.forEach(file => 
                                           {       
                                               console.log(file);
                                               counter++;
                                               myArrFiles.push({"Anzahl":counter,"Filename":file})
                                           })
                                       }
                         
                                       log(JSON.stringify(files))
                                       setState(strUpload + "VerzeichnisUploads",JSON.stringify(myArrFiles))
                                   })
                        
                               })
                          
                           }
                           setState(strUpload + "FileNameUploadOld",nameOfPic);
                        }
                        

                        Was ich noch mache, ich werde die Fotos nur temporär dort im Ordner speichern.
                        Zusätzlich gibt es Eingabefelder mit Informationen zu Zeit, Ort, Anlass (Urlaub; Ausflug, Feier...), Personen,...

                        Dann kopiere ich die Bilder mit einem "Save-Button" in einen Unterordner z.B.: "Name = Ort" und speichere die Informationen zu den Bildern und den Endpfad (also nicht das Bildfile) in der Datenbank.

                        liv-in-sky 3 Replies Last reply Reply Quote 0
                        • liv-in-sky
                          liv-in-sky @onweb last edited by liv-in-sky

                          @onweb
                          für mich war es wichtig, das die bilder für die vis zur verfügung stehen (es geht dabei mehr um symbolbilder für die vis) - wenn du diese nicht brauchst, kannst du anstatt des writrFile auch ein fs.writeFile verwenden und es in ein anderes verzeichnis (evtl anderer Server) schreiben

                          wenn du zuerst mit writeFile in die iobroker-datenbank scheibst, verbraucht das platz - kommt natürlich darauf an, wie viele bilder du verarbeitest und speicherst . löscht du die bilder vom vis.0 verzeichnis verbleiben sie aber evtl.in der iobroker-datenbank - das weiß ich nicht wirklich - ist so 'ne vermutung

                          wenn es um normale fotos geht, mußt du eigentlich nicht in vis.0 schreiben

                          1 Reply Last reply Reply Quote 0
                          • liv-in-sky
                            liv-in-sky @onweb last edited by

                            @onweb das mit dem speichern , der bilddateien in sql habe ich eh noch nicht hinbekommen - irgendwie muss man das bildarray, welches in unserem datenpunkt liegt nochml verwandeln, damit man es als blob speichern kann - den sql befehl dafür bekomme ich nicht hin

                            von daher ist es gut, dass du nur den filenamen/pfad sicherst 🙂

                            1 Reply Last reply Reply Quote 0
                            • liv-in-sky
                              liv-in-sky @onweb last edited by liv-in-sky

                              @onweb

                              habe dein script nochmals angesehen:

                              • warum ein schedule - jede sekunde - da verbrauchst du nur resourcen - trigger auf filenameupload datenpunkt- der sagt dir, wenn etwas neues da ist - wenn der geschrieben ist, sind die anderen dp auch schon geschrieben und fertig zum "benutzen"
                                bei schedule kann es sein, dass du eine alte datei (myArrBuff) mit einem neuen namen bekommst (fileNameUpload )

                              • bei deinem script wird , wenn die dp noch nicht erstellt wurden, einige warnungen im log auftauchen. das script läuft schneller, als die dp angelegt wurden - erst nach einem erneuten start des scriptes läuft es ohne warnungen - die dp erstellung und das aufrufen der function muss syncronisiert werden - ist kein großes problem, da man meistens nur einmal die dp ersstellt

                              wenn du den trigger umgestellt hast, brauchst du nur den "extra aufruf" der funktion in zeile 18 mit einem setTimeout um 3 sek verzögern - dann kommen auch keine warnungen bei ersten script start

                              O 1 Reply Last reply Reply Quote 0
                              • O
                                onweb @liv-in-sky last edited by

                                @liv-in-sky
                                Achja guter Hinweis.
                                Die dp schreibst erst Async zum Schluss im Script. Ist alles unklar wann genau fertig.

                                Da hilft wahrscheinlich auch nicht, wenn ich da hinter einen Trigger einbauen würde.
                                Also werde ich besser einen TimeOut einbauen, wie du geschrieben hast.

                                liv-in-sky 1 Reply Last reply Reply Quote 0
                                • liv-in-sky
                                  liv-in-sky @onweb last edited by liv-in-sky

                                  @onweb sagte in FileUpload vom PC(Tablet) in die VIS:

                                  Die dp schreibst erst Async zum Schluss im Script. Ist alles unklar wann genau fertig.

                                  alles ist fertig, wenn der dp filenameupload geschrieben ist - daher der trigger darauf - im orginal blockly ist doch der trigger auch auf den dp.- der schedule macht da wenig sinn.

                                  der aufruf FileUpload(); muss auch nicht sein, der gehört in den trigger, nach der function definition - der muss nur aufgerufen werden, wenn sich der dp filenameupload ändert - dnn kannst du die eigenen dp auch anlegen - ohne timeout, da das script beim start nur die dp anlegt und dann wartet, bis getriggert wird

                                  hast du mal alle dp gelöscht und dein script aufgerufen ? dann siehst du was im log passiert - fehler und warnungen, weil die dp noch nicht fertig sind, wenn die function läuft und weil ja noch kein file upgeloaded wurde und dadurch die function kein "futter" hat - weil dp leer sind

                                  O 1 Reply Last reply Reply Quote 0
                                  • O
                                    onweb @liv-in-sky last edited by onweb

                                    @liv-in-sky
                                    Ach ja, den Trigger habe ich doch auch

                                    var nameOfPic = getState (strUpload + "FileNameUpload").val  ;
                                       var nameOfPicOld = getState (strUpload + "FileNameUploadOld").val  ;
                                       
                                       if ( nameOfPic != nameOfPicOld )  // Bei änderung 
                                       {
                                    ....
                                    .
                                    setState(strUpload + "FileNameUploadOld",nameOfPic);
                                    

                                    if ( nameOfPic != nameOfPicOld ) reagiert auf die Änderung von FileNameUpload.

                                    Also sollte es eigentlich doch passen.

                                    Die Fehlermeldung beim ersten Aufruf kommt daher, dass das Objekt für FileNameUploadOld noch nicht da ist und erst beim ersten mal angelegt werden muss.

                                    1 Reply Last reply Reply Quote 0
                                    • First post
                                      Last post

                                    Support us

                                    ioBroker
                                    Community Adapters
                                    Donate

                                    538
                                    Online

                                    31.7k
                                    Users

                                    79.7k
                                    Topics

                                    1.3m
                                    Posts

                                    template
                                    3
                                    16
                                    1012
                                    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