Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. CSV Datei über VIS downloaden

    NEWS

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

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    CSV Datei über VIS downloaden

    This topic has been deleted. Only users with topic management privileges can see it.
    • V
      Vippis last edited by

      Hallo liebe Community,

      ich möchte per Javascript aus einer Benutzer-Auswahl von Messdaten aus meiner InfluxDB eine CSV Datei erstellen, die sich der User über die VIS-2 downloaden kann.

      Leider kann ich in den Pfad /opt/iobroker/iobroker-data/files/0_userdata.0 nicht schreiben.

      Ich bekomme immer:

      javascript.0	09:06:18.671	error	script.js.common.Export.Auswerten: Error: Permission denied
      javascript.0	09:06:18.671	error	at create_csv (script.js.common.Export.Auswerten:58:8)
      

      Gibt es einen alternativen Pfad, der auch vom Web-Server erreichbar ist?

      V 1 Reply Last reply Reply Quote 0
      • V
        Vippis @Vippis last edited by Vippis

        Ich antworte mal selbst:

        Ich lasse die CSV per Javascript im Verzeichnis /home/iobroker/export erstellen.

        In dem Verzeichnis lasse ich einen Python HTTP Server laufen

        python3 -m http.server 8083
        

        Das ganze kann man noch mit systemd als Service erstellen, damit der HTTP-Server auch beim Neustart läuft.

        Dazu ein .sh Script z.B. im Admin Verzeichnis erstellen:

        nano /home/admin/start_http_server.sh
        
        #!/bin/bash
        cd /home/iobroker/export
        python3 -m http.server 8083
        

        Skript ausführbar machen:

        chmod +x /home/admin/start_http_server.sh
        

        Service Datei erstellen:

        sudo nano /etc/systemd/system/httpserver.service
        
        [Unit]
        Description=Python HTTP Server
        After=network.target
        
        [Service]
        ExecStart=/home/admin/start_http_server.sh
        WorkingDirectory=/home/iobroker/export
        StandardOutput=inherit
        StandardError=inherit
        Restart=always
        User=admin
        
        [Install]
        WantedBy=multi-user.target
        

        Systemd neu laden:

        sudo systemctl daemon-reload
        

        Status prüfen:

        sudo systemctl status httpserver.service
        
        1 Reply Last reply Reply Quote 0
        • mickym
          mickym Most Active last edited by mickym

          Das ist doch nicht nötig.

          Wenn Du ein Javascript Anhänger bist, dann bist doch sicher auch Blockly Fan und damit kannst Du doch einfach unter 0-userdata.0 die Datei schreiben und auch wieder einlesen:

          28c0fd5b-75bc-4085-9934-797d9b2737d3-image.png

          Hier der Import:

          <xml xmlns="https://developers.google.com/blockly/xml">
           <block type="file_write" id="gNzu_(ze/H~)K3?=vJ78" x="-963" y="-487">
             <value name="OID">
               <shadow type="field_oid_meta" id="*0Jfj[A/:|]?4(Uqt~$e">
                 <field name="oid">0_userdata.0</field>
               </shadow>
             </value>
             <value name="FILE">
               <shadow type="text" id=".*U/X{)P;y(F378$#[}W">
                 <field name="TEXT">demo.json</field>
               </shadow>
             </value>
             <value name="DATA">
               <block type="text" id="ai0q5E:~/?tyex4Ij`|#">
                 <field name="TEXT">Spalte1;Spalte2;Spalte3</field>
               </block>
             </value>
             <next>
               <block type="file_read" id="XJ5lWSnU.|7bE4ukOep~">
                 <value name="OID">
                   <shadow type="field_oid_meta" id="FXhojWLZ*fbZ741*vVG;">
                     <field name="oid">0_userdata.0</field>
                   </shadow>
                 </value>
                 <value name="FILE">
                   <shadow type="text" id="*98Soid#CV,`24/gp9{a">
                     <field name="TEXT">demo.json</field>
                   </shadow>
                 </value>
                 <statement name="STATEMENT">
                   <block type="debug" id="R4iB/k3pl(66:Bl*^6;3">
                     <field name="Severity">info</field>
                     <value name="TEXT">
                       <shadow type="text" id="kkH$]yRfI2:pe-RIEVjb">
                         <field name="TEXT">test</field>
                       </shadow>
                       <block type="file_data" id="7EEYc5zto,iijgLdlmj/">
                         <field name="ATTR">data</field>
                       </block>
                     </value>
                   </block>
                 </statement>
               </block>
             </next>
           </block>
          </xml>
          

          2df1a426-f105-4e71-88aa-ae96d69ee3f8-image.png

          f750cb2b-c625-4473-b00d-e5dac17a94b9-image.png

          Wenn ich mir den JS Code anschaue, dann schaut der auch ganz simple aus:

          writeFile('0_userdata.0' /* Stammordner für Benutzerobjekte und Dateien */, String('demo.json'), 'Spalte1;Spalte2;Spalte3', (err) => {
            if (err) {
              console.error(err);
            }
          });
          readFile('0_userdata.0' /* Stammordner für Benutzerobjekte und Dateien */, String('demo.json'), (err, data, mimeType) => {
            if (err) {
              console.error(err);
            }
            console.info(data);
          });
          

          Das ist auf jeden Fall wesentlich resourcenschonender als einen zustätzlichen Webserver zu basteln.

          Im Übrigen kann man sich über die Schaltfläche den Ordner gleich raus suchen:
          57a38d1b-5ad1-47f7-8589-28c20955baa8-image.png

          Siehe auch hier: https://github.com/ioBroker/ioBroker.javascript/blob/master/docs/en/javascript.md#writefile

          Anscheinend kann man auch über den internen Webserver 8082 auf die Datei zugreifen und das funktioniert problemlos:

          a158768c-b953-4e1b-9117-9a5e06609f92-image.png

          1 Reply Last reply Reply Quote 0
          • mickym
            mickym Most Active last edited by

            Wahrscheinlich war Dein Fehler nur den vollständigen Pfad - anstatt nur den relativen Pfad ab files zu nutzen.

            V 1 Reply Last reply Reply Quote 0
            • V
              Vippis @mickym last edited by

              @mickym

              Ah super danke für die Info.

              In der Doku steht:

              The file that looks like '/subfolder/file.txt' will be stored under "/javascript/subfolder/file.txt" and can be accessed over web server with "http://ip:8082/javascript/subfolder/file.txt"

              const fs = require('node:fs');
              writeFile(null, '/subfolder/file.txt', data, (error) => {
                  log('file written');
              });
              
              
              V 1 Reply Last reply Reply Quote 0
              • V
                Vippis @Vippis last edited by

                @vippis

                Man muss halt das Node FS Modul nehmen 🙂

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

                Support us

                ioBroker
                Community Adapters
                Donate

                909
                Online

                31.7k
                Users

                79.7k
                Topics

                1.3m
                Posts

                2
                6
                237
                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