Skip to content
  • Home
  • Recent
  • Tags
  • 0 Unread 0
  • Categories
  • Unreplied
  • Popular
  • 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

  • Default (No Skin)
  • No Skin
Collapse
ioBroker Logo

Community Forum

donate donate
  1. ioBroker Community Home
  2. Deutsch
  3. ioBroker Allgemein
  4. Button-Wert aus der Vis in Sql eintragen / speichern

NEWS

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

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

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

Button-Wert aus der Vis in Sql eintragen / speichern

Scheduled Pinned Locked Moved ioBroker Allgemein
33 Posts 5 Posters 2.9k Views 4 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • M MarcIO

    @oliverio

    Ich habe es versucht hat leider nicht ganz geklappt.

    Mein rss-feed Adapter ist noch bei 3.1 und up to date, Schreibfehler?

    OliverIOO Offline
    OliverIOO Offline
    OliverIO
    wrote on last edited by
    #14

    @marcio

    eins ist mir noch eingefallen, falls du auch nach Umstellung auf beta den adapter nicht findest.
    die minimum anforderung an den

    • iobroker ist minimum 5.0.19 und
    • admin ist minimum 6.17.14

    das sind anforderungen durch die iobroker leute, welche dann auch regelmäßig angemeckert werden, wenn das nicht angepasst wird.

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

    M 1 Reply Last reply
    0
    • OliverIOO OliverIO

      @marcio

      eins ist mir noch eingefallen, falls du auch nach Umstellung auf beta den adapter nicht findest.
      die minimum anforderung an den

      • iobroker ist minimum 5.0.19 und
      • admin ist minimum 6.17.14

      das sind anforderungen durch die iobroker leute, welche dann auch regelmäßig angemeckert werden, wenn das nicht angepasst wird.

      M Offline
      M Offline
      MarcIO
      wrote on last edited by MarcIO
      #15

      @oliverio

      Danke für die Info. Mir ist aufgefallen, dass ich Iobroker mal wieder updaten musste.

      Ich habe nun die 3.5 Version aber dein Code hat bei mir allerdings nicht funktioniert :/

      Hatte zunächst versucht deine Funktionen in meinem Skript zu integrieren, fehlgeschlagen. Danach habe ich zur Einfachheit nur die Variablen in deinem Skript mit meinen getauscht, erneut der selbe Fehler:

      91037737-a067-4dcf-82d9-e02371dd1b73-image.png

      So sah es bei mir aus. wie gesagt nur die Variablen und die Datenbank umgeschrieben, sonst müsste alles gleich sein:

      
      <style> 
         .btn {
             width:100%;
         }
      </style>
      <table>
         <tr>
             <th>id</th>
             <th>todo</th>
             <th>action</th>
         </tr>
      <% 
      let todos = await getTodo();
      for (let i=0;i<todos.length;i++) {
         let todo = todos[i];
      %>
         <tr>
             <td><%- todo.machine %></td>
             <td><%- todo.description %></v>
             <td><%- getButton(todo.machine,todo.status) %></td>
         </tr>
       
      <%    
      }
      window.jsontemplate={
       clicktodo:clicktodo  
      };
      %>
      </table>
       
      <%
       
      function getButton(machine,status){
         //debugger;
          let text="";
          switch (status) {
              case 0: // in Bearbeitung
                  text="in Bearbeitung";
                  break;
              case 1: // erleigt
                  text="erledigt";
                  break;
          }
          return '<button class="btn" onclick="window.jsontemplate.clicktodo(this)" data-id="'+machine+'" data-action="'+status+'">'+text+'</button>';
       }
       function clicktodo(el){
          //debugger;
          let machine = el.dataset.machine;
          let status = el.dataset.status;
          let nextstatus = status == 0 ? 1 : 0;
          setStatus(machine,nextstatus);
       }
       async function getTodo() {
          req = await sendToAsync("sql.2","query","select * from data.maintenance_interval");
          return req.result;
       }
       async function setStatus(machine,status) {
          req = await sendToAsync("sql.2","query","update data.maintenance_interval set status = "+status+" where data.machine = " + machine);
          vis.setValue("local_trigger",Math.random());
       }
        
       async function sendToAsync(instance, command, sendData) {
          console.log(`sendToAsync ${command} ${sendData}`);
          return new Promise((resolve, reject) => {
              try {
                  vis.conn.sendTo(instance, command, sendData, function (receiveData) {
                      resolve(receiveData);
                  });
              } catch (error) {
                  reject(error);
              }
          });
       }
       %>  
      

      Ich habe statt der id bei mir die Gerätbezeichnung gewählt, da ich in meinem Skript die ID nicht übernommen habe.

      OliverIOO 1 Reply Last reply
      0
      • M MarcIO

        @oliverio

        Danke für die Info. Mir ist aufgefallen, dass ich Iobroker mal wieder updaten musste.

        Ich habe nun die 3.5 Version aber dein Code hat bei mir allerdings nicht funktioniert :/

        Hatte zunächst versucht deine Funktionen in meinem Skript zu integrieren, fehlgeschlagen. Danach habe ich zur Einfachheit nur die Variablen in deinem Skript mit meinen getauscht, erneut der selbe Fehler:

        91037737-a067-4dcf-82d9-e02371dd1b73-image.png

        So sah es bei mir aus. wie gesagt nur die Variablen und die Datenbank umgeschrieben, sonst müsste alles gleich sein:

        
        <style> 
           .btn {
               width:100%;
           }
        </style>
        <table>
           <tr>
               <th>id</th>
               <th>todo</th>
               <th>action</th>
           </tr>
        <% 
        let todos = await getTodo();
        for (let i=0;i<todos.length;i++) {
           let todo = todos[i];
        %>
           <tr>
               <td><%- todo.machine %></td>
               <td><%- todo.description %></v>
               <td><%- getButton(todo.machine,todo.status) %></td>
           </tr>
         
        <%    
        }
        window.jsontemplate={
         clicktodo:clicktodo  
        };
        %>
        </table>
         
        <%
         
        function getButton(machine,status){
           //debugger;
            let text="";
            switch (status) {
                case 0: // in Bearbeitung
                    text="in Bearbeitung";
                    break;
                case 1: // erleigt
                    text="erledigt";
                    break;
            }
            return '<button class="btn" onclick="window.jsontemplate.clicktodo(this)" data-id="'+machine+'" data-action="'+status+'">'+text+'</button>';
         }
         function clicktodo(el){
            //debugger;
            let machine = el.dataset.machine;
            let status = el.dataset.status;
            let nextstatus = status == 0 ? 1 : 0;
            setStatus(machine,nextstatus);
         }
         async function getTodo() {
            req = await sendToAsync("sql.2","query","select * from data.maintenance_interval");
            return req.result;
         }
         async function setStatus(machine,status) {
            req = await sendToAsync("sql.2","query","update data.maintenance_interval set status = "+status+" where data.machine = " + machine);
            vis.setValue("local_trigger",Math.random());
         }
          
         async function sendToAsync(instance, command, sendData) {
            console.log(`sendToAsync ${command} ${sendData}`);
            return new Promise((resolve, reject) => {
                try {
                    vis.conn.sendTo(instance, command, sendData, function (receiveData) {
                        resolve(receiveData);
                    });
                } catch (error) {
                    reject(error);
                }
            });
         }
         %>  
        

        Ich habe statt der id bei mir die Gerätbezeichnung gewählt, da ich in meinem Skript die ID nicht übernommen habe.

        OliverIOO Offline
        OliverIOO Offline
        OliverIO
        wrote on last edited by OliverIO
        #16

        @marcio

        den fehler von dir konnte ich so nicht nachstellen.
        die fehlermeldung bedeutet, das das script die funktion getTodo nicht findet. Das könnte passieren, wenn zwischen Aufruf und Definition sich irgendein syntax oder strukturfehler eingeschlichen hat, so das der interpreter die funktion nicht mehr findet. in der von dir bereitgestellten version des templates war aber kein solcher fehler enthalten. bei mir hat das bis auf die folgenden fehler entsprechend funktioniert.
        bei dem verwendeten ejs template syntax kann durch die vermischung zwischen javascript und html sowas schon mal passieren, blöcke bspw einer schleife von html unterbrochen wird und dann eine schließende klammer etwas einsam dasteht.

        die folgenden 3 fehler bei deiner umstellung habe ich gefunden, die aber eigentlich den fehler aber nicht verursachen konnten

        1. zeile 43: attributnamen data-id und data-action müssen ebenfalls angepasst werden. sie korrespondieren zu den namen in zeile 47 und 48
        2. zeile 60: das update sql enthält einen fehler die where clause muss maintenance_interval.machine heißen. data ist der name der datenbank, die tabelle heißt maintenance_interval
        3. prüfe bitte auch nochmal, das du das widget json template 3 und nicht die version 2 verwendest. falls das in vis nicht sichtbar ist, bitte auf der konsole "iob upload all" ausführen.

        hier die angepasste version deines templates

        <style> 
           .btn {
               width:100%;
               white-space: nowrap;
           }
        </style>
        <table>
           <tr>
               <th>machine</th>
               <th>description</th>
               <th>status</th>
           </tr>
        <% 
        //debugger;
        let todos = await getTodo();
        for (let i=0;i<todos.length;i++) {
           let todo = todos[i];
        %>
           <tr>
               <td><%- todo.machine %></td>
               <td><%- todo.description %></v>
               <td><%- getButton(todo.machine,todo.status) %></td>
           </tr>
        <%    
        }
        window.jsontemplate={
         clicktodo:clicktodo  
        };
        %>
        </table>
        <%
        function getButton(machine,status){
           //debugger;
            let text="";
            switch (status) {
                case 0: // in Bearbeitung
                    text="in Bearbeitung";
                    break;
                case 1: // erleigt
                    text="erledigt";
                    break;
            }
            return '<button class="btn" onclick="window.jsontemplate.clicktodo(this)" data-machine="'+machine+'" data-status="'+status+'">'+text+'</button>';
         }
         function clicktodo(el){
            //debugger;
            let machine = el.dataset.machine;
            let status = el.dataset.status;
            let nextstatus = status == 0 ? 1 : 0;
            setStatus(machine,nextstatus);
         }
         async function getTodo() {
            req = await sendToAsync("sql.0","query","select * from data.maintenance_interval");
            console.log("jsontemplate getTodo: returned records: " + req.result.length);
            return req.result;
         }
         async function setStatus(machine,status) {
            //debugger;
            console.log("jsontemplate setStatus: update sql: update data.maintenance_interval set status = "+status+" where maintenance_interval.machine = " + machine);
            req = await sendToAsync("sql.0","query","update data.maintenance_interval set status = "+status+" where maintenance_interval.machine = " + machine);
            vis.setValue("local_trigger",Math.random());
         }
         async function sendToAsync(instance, command, sendData) {
            console.log(`sendToAsync ${command} ${sendData}`);
            return new Promise((resolve, reject) => {
                try {
                    vis.conn.sendTo(instance, command, sendData, function (receiveData) {
                        resolve(receiveData);
                    });
                } catch (error) {
                    reject(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

        M 1 Reply Last reply
        0
        • OliverIOO OliverIO

          @marcio

          den fehler von dir konnte ich so nicht nachstellen.
          die fehlermeldung bedeutet, das das script die funktion getTodo nicht findet. Das könnte passieren, wenn zwischen Aufruf und Definition sich irgendein syntax oder strukturfehler eingeschlichen hat, so das der interpreter die funktion nicht mehr findet. in der von dir bereitgestellten version des templates war aber kein solcher fehler enthalten. bei mir hat das bis auf die folgenden fehler entsprechend funktioniert.
          bei dem verwendeten ejs template syntax kann durch die vermischung zwischen javascript und html sowas schon mal passieren, blöcke bspw einer schleife von html unterbrochen wird und dann eine schließende klammer etwas einsam dasteht.

          die folgenden 3 fehler bei deiner umstellung habe ich gefunden, die aber eigentlich den fehler aber nicht verursachen konnten

          1. zeile 43: attributnamen data-id und data-action müssen ebenfalls angepasst werden. sie korrespondieren zu den namen in zeile 47 und 48
          2. zeile 60: das update sql enthält einen fehler die where clause muss maintenance_interval.machine heißen. data ist der name der datenbank, die tabelle heißt maintenance_interval
          3. prüfe bitte auch nochmal, das du das widget json template 3 und nicht die version 2 verwendest. falls das in vis nicht sichtbar ist, bitte auf der konsole "iob upload all" ausführen.

          hier die angepasste version deines templates

          <style> 
             .btn {
                 width:100%;
                 white-space: nowrap;
             }
          </style>
          <table>
             <tr>
                 <th>machine</th>
                 <th>description</th>
                 <th>status</th>
             </tr>
          <% 
          //debugger;
          let todos = await getTodo();
          for (let i=0;i<todos.length;i++) {
             let todo = todos[i];
          %>
             <tr>
                 <td><%- todo.machine %></td>
                 <td><%- todo.description %></v>
                 <td><%- getButton(todo.machine,todo.status) %></td>
             </tr>
          <%    
          }
          window.jsontemplate={
           clicktodo:clicktodo  
          };
          %>
          </table>
          <%
          function getButton(machine,status){
             //debugger;
              let text="";
              switch (status) {
                  case 0: // in Bearbeitung
                      text="in Bearbeitung";
                      break;
                  case 1: // erleigt
                      text="erledigt";
                      break;
              }
              return '<button class="btn" onclick="window.jsontemplate.clicktodo(this)" data-machine="'+machine+'" data-status="'+status+'">'+text+'</button>';
           }
           function clicktodo(el){
              //debugger;
              let machine = el.dataset.machine;
              let status = el.dataset.status;
              let nextstatus = status == 0 ? 1 : 0;
              setStatus(machine,nextstatus);
           }
           async function getTodo() {
              req = await sendToAsync("sql.0","query","select * from data.maintenance_interval");
              console.log("jsontemplate getTodo: returned records: " + req.result.length);
              return req.result;
           }
           async function setStatus(machine,status) {
              //debugger;
              console.log("jsontemplate setStatus: update sql: update data.maintenance_interval set status = "+status+" where maintenance_interval.machine = " + machine);
              req = await sendToAsync("sql.0","query","update data.maintenance_interval set status = "+status+" where maintenance_interval.machine = " + machine);
              vis.setValue("local_trigger",Math.random());
           }
           async function sendToAsync(instance, command, sendData) {
              console.log(`sendToAsync ${command} ${sendData}`);
              return new Promise((resolve, reject) => {
                  try {
                      vis.conn.sendTo(instance, command, sendData, function (receiveData) {
                          resolve(receiveData);
                      });
                  } catch (error) {
                      reject(error);
                  }
              });
           }
           %>  
          
          M Offline
          M Offline
          MarcIO
          wrote on last edited by MarcIO
          #17

          @oliverio

          Aso ok tut mir Leid habe nicht gesehen, dass ein JSON Template 3 gibt. Aber es funktioniert endlich, danke dafür!

          Ein kleines Problem habe ich leider immer noch. Nämlich fragst du ja die Datenbank mit der Funktion getTodo() ab. Meine Datenbank ist allerdings etwas anders als meine JSON-Datei, die ich ja eigentlich auswerten lassen möchte. Der Wert 'verbliebene Tage' beispielsweise ist ja ein errechneter Wert, das mach ich mit dem Skript oder auch Verknüpfungen mit andere Datenbanken kommen vor. Kann man mit der Funktion denn auch die JSON-Datei abfragen, statt die Datenbank?

          Oder halt direkt bei dem Template als Eingangsdaten die JSON übernehmen lassen. Die wird ja hier theoretisch komplett ignoriert

          1 Reply Last reply
          0
          • OliverIOO OliverIO

            @marcio

            Zeige bitte auch die Funktion queryMachinenames

            Ziel wäre, das alles in das Widget zu bekommen

            Habe auch gelesen, dass dieser Widget keine dynamischen Interaktionen zulässt, stimmt das?

            Eigentlich nicht. Allerdings muss man mit den eigenheiten von vis und dem template system umgehen. bspw wird der komplette inhalt immer komplett neu aufgebaut, wenn sich der inhalt eines datenpunkts ändert. sehr große häufige änderungen oder sehr aufwändige logik kann hier zu flackern des inhalts führen. allerdings sollte man sich dann auch eine andere Lösung überlegen. ansonsten kann man da alles einbauen was sonst in html auch geht.

            ich habe parallel mal noch ein update 3.5.0 veröffentlicht, das async/await funktionen im template zulässt, das macht den Umgang mit sendTo leichter. Auch hier ist ein Beispiel nun in der Dokumentation enthalten.

            OliverIOO Offline
            OliverIOO Offline
            OliverIO
            wrote on last edited by OliverIO
            #18

            @oliverio sagte in Button-Wert aus der Vis in Sql eintragen / speichern:

            Zeige bitte auch die Funktion queryMachinenames

            Leider hast du mir nie das Geheimnis verraten wie deine Datenbank aussieht.
            Daher habe ich den UseCase unabhängig entwickelt.

            für die verbliebenen/verbleibenden Tage meinst du sicherlich die Anzahl von Tagen, bis das Ereignis fällig wird. Dann hast du sicherlich auch ein Datum/timestamp wann das fällig ist?
            Willst du das nur für die Anzeige oder was meinst du mit auswerten?

            Es gibt nun 2 Möglichkeiten
            a) man lässt das die Datenbank berechnen, hat dann eine zusätzliche Spalte und zeigt die einfach in der Tabelle noch mit an. mysql/mariadb hat da einige funktionen. https://dev.mysql.com/doc/refman/8.4/en/date-calculations.html
            b) man ruft zusätzlich noch den timestamp mit ab und berechne das im json template

            wenn es noch andere Auswertung betrifft, das nicht zur Anzeige dient, dann würde ich eher zu a) tendieren oder in einem separaten javascript. aber da musst du mir erst mehr zum anwendungsfall erzählen.

            wie gesagt json template dient zur Anzeige von daten mit auch etwas komplexerer logik und wie hier gezeigt auch mit interaktion. man sollte das nun nicht als skript engine misbrauchen, die andere dinge macht die nicht zur anzeige der daten beitragen.

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

            M 1 Reply Last reply
            0
            • OliverIOO OliverIO

              @oliverio sagte in Button-Wert aus der Vis in Sql eintragen / speichern:

              Zeige bitte auch die Funktion queryMachinenames

              Leider hast du mir nie das Geheimnis verraten wie deine Datenbank aussieht.
              Daher habe ich den UseCase unabhängig entwickelt.

              für die verbliebenen/verbleibenden Tage meinst du sicherlich die Anzahl von Tagen, bis das Ereignis fällig wird. Dann hast du sicherlich auch ein Datum/timestamp wann das fällig ist?
              Willst du das nur für die Anzeige oder was meinst du mit auswerten?

              Es gibt nun 2 Möglichkeiten
              a) man lässt das die Datenbank berechnen, hat dann eine zusätzliche Spalte und zeigt die einfach in der Tabelle noch mit an. mysql/mariadb hat da einige funktionen. https://dev.mysql.com/doc/refman/8.4/en/date-calculations.html
              b) man ruft zusätzlich noch den timestamp mit ab und berechne das im json template

              wenn es noch andere Auswertung betrifft, das nicht zur Anzeige dient, dann würde ich eher zu a) tendieren oder in einem separaten javascript. aber da musst du mir erst mehr zum anwendungsfall erzählen.

              wie gesagt json template dient zur Anzeige von daten mit auch etwas komplexerer logik und wie hier gezeigt auch mit interaktion. man sollte das nun nicht als skript engine misbrauchen, die andere dinge macht die nicht zur anzeige der daten beitragen.

              M Offline
              M Offline
              MarcIO
              wrote on last edited by MarcIO
              #19

              @oliverio

              Die Geräte habe ich in einer separaten Tabelle, hier wird nur der Name abgefragt.

              function queryMachineNames(callback) {
                  sendTo(sqlInstanceMachines, 'query', queryMachineNamesSql, function(result) {
                      if (result.error) {
                          log("Fehler bei der SQL-Abfrage (Maschinennamen): " + result.error, 'error');
                          callback({});
                      } else {
                          const machineMap = {};
                          result.result.forEach(row => {
                              machineMap[row.id] = { name: row.name};
                          });
                          callback(machineMap);
                      }
                  });
              }
              

              Und so ist die Tabelle aufgebaut. Die Spalten ID und frequency kann man ignorieren, verwende ich nicht. Mit der machine_id hole ich den Gerätenamen und im Skript rechne ich noch mit einer Funktion aus der Spalte date die Anzahl der Tage bis zum Ereignis und formatiere das Datum in die deutsche Schreibweise.
              e9744b34-ed17-47fd-93e4-9012d08c437b-image.png

              Gäbe es denn keine Möglichkeit, die JSON-Datei anzuzeigen? Mir wäre es nur wichtig den Button als Funktion ins Template zu nehmen, der Rest ist ja bereits in meiner JSON-Datei fertig. So schaut die JSON aus, es würde nur der Status fehlen

              {
                  "id": 32,
                  "machine_name": "Auto",
                  "name": "Ölwechsel",
                  "description": "-",
                  "date": "20.07.2024",
                  "date_end": "21.07.2024",
                  "countdown": -241
                },
              
              OliverIOO 1 Reply Last reply
              0
              • M MarcIO

                @oliverio

                Die Geräte habe ich in einer separaten Tabelle, hier wird nur der Name abgefragt.

                function queryMachineNames(callback) {
                    sendTo(sqlInstanceMachines, 'query', queryMachineNamesSql, function(result) {
                        if (result.error) {
                            log("Fehler bei der SQL-Abfrage (Maschinennamen): " + result.error, 'error');
                            callback({});
                        } else {
                            const machineMap = {};
                            result.result.forEach(row => {
                                machineMap[row.id] = { name: row.name};
                            });
                            callback(machineMap);
                        }
                    });
                }
                

                Und so ist die Tabelle aufgebaut. Die Spalten ID und frequency kann man ignorieren, verwende ich nicht. Mit der machine_id hole ich den Gerätenamen und im Skript rechne ich noch mit einer Funktion aus der Spalte date die Anzahl der Tage bis zum Ereignis und formatiere das Datum in die deutsche Schreibweise.
                e9744b34-ed17-47fd-93e4-9012d08c437b-image.png

                Gäbe es denn keine Möglichkeit, die JSON-Datei anzuzeigen? Mir wäre es nur wichtig den Button als Funktion ins Template zu nehmen, der Rest ist ja bereits in meiner JSON-Datei fertig. So schaut die JSON aus, es würde nur der Status fehlen

                {
                    "id": 32,
                    "machine_name": "Auto",
                    "name": "Ölwechsel",
                    "description": "-",
                    "date": "20.07.2024",
                    "date_end": "21.07.2024",
                    "countdown": -241
                  },
                
                OliverIOO Offline
                OliverIOO Offline
                OliverIO
                wrote on last edited by OliverIO
                #20

                @marcio

                Klar könnte man auch die json anzeigen, wie sollte dann der Update und die darauffolgenden Anzeige der geänderten Daten erfolgen?
                Mit dem aktuellen Stand mit dem Template hast du nur 2 beteiligte Systeme (MySQL,vis). Wenn du es mit der json machen willst hast du 3 Systeme (MySQL,vis,json) die du aktuell halten musst

                Wenn du ein Datum speicherst würde ich das in einem technisch besser verarbeitbaren Format machen. Also entweder als JavaScript timestamp oder als iso Datum. Erst zur Anzeige wird dann nach deutsch umgewandelt

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

                M 1 Reply Last reply
                0
                • OliverIOO OliverIO

                  @marcio

                  Klar könnte man auch die json anzeigen, wie sollte dann der Update und die darauffolgenden Anzeige der geänderten Daten erfolgen?
                  Mit dem aktuellen Stand mit dem Template hast du nur 2 beteiligte Systeme (MySQL,vis). Wenn du es mit der json machen willst hast du 3 Systeme (MySQL,vis,json) die du aktuell halten musst

                  Wenn du ein Datum speicherst würde ich das in einem technisch besser verarbeitbaren Format machen. Also entweder als JavaScript timestamp oder als iso Datum. Erst zur Anzeige wird dann nach deutsch umgewandelt

                  M Offline
                  M Offline
                  MarcIO
                  wrote on last edited by
                  #21

                  @oliverio

                  Für mich schaut es so aus, also würde man nur die Daten aus der Datenbank anzeigen und der Update kommt eben auch von dort. Sonst hätte ich ja letztendlich nicht die leeren Spalten.

                  OliverIOO 1 Reply Last reply
                  0
                  • M MarcIO

                    @oliverio

                    Für mich schaut es so aus, also würde man nur die Daten aus der Datenbank anzeigen und der Update kommt eben auch von dort. Sonst hätte ich ja letztendlich nicht die leeren Spalten.

                    OliverIOO Offline
                    OliverIOO Offline
                    OliverIO
                    wrote on last edited by
                    #22

                    @marcio

                    Ja genau so ist es.
                    Aber genau das ist es doch auch was Du willst?

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

                    M 1 Reply Last reply
                    0
                    • OliverIOO OliverIO

                      @marcio

                      Ja genau so ist es.
                      Aber genau das ist es doch auch was Du willst?

                      M Offline
                      M Offline
                      MarcIO
                      wrote on last edited by
                      #23

                      @oliverio

                      Nein Nein ich glaub ich wurde missverstanden dabei. Was ich meine, ist, dass ich mit meinem Skript eine JSON-Datei erstelle, die unter den Objekten abgelegt wird (siehe Bild).
                      6d21175a-6e2c-41f1-b818-1a479f5c8ce5-image.png

                      Wenns möglich ist würde ich es weiterhin so haben, da wie gesagt meine errechneten Werte direkt in diese JSON eingetragen werden.

                      Hier ist ein kurzer Überblick, wie mein Workflow aussieht:
                      Datenbank → Skript im IoBroker → JSON-Datei → JSON-Template in der VIS.

                      mit dem Skript kann ich die Werte aus der Datenbank errechnen, umformen, etc und kann sie dann direkt mithilfe des JSON-Templates in der VIS anzeigen lassen. Ich bräuchte lediglich eine Funktion für den Statusbutton, der diesen in die Datenbank wieder eintragen kann, sodass dieser ja auch gespeichert wird.

                      OliverIOO 1 Reply Last reply
                      0
                      • M MarcIO

                        @oliverio

                        Nein Nein ich glaub ich wurde missverstanden dabei. Was ich meine, ist, dass ich mit meinem Skript eine JSON-Datei erstelle, die unter den Objekten abgelegt wird (siehe Bild).
                        6d21175a-6e2c-41f1-b818-1a479f5c8ce5-image.png

                        Wenns möglich ist würde ich es weiterhin so haben, da wie gesagt meine errechneten Werte direkt in diese JSON eingetragen werden.

                        Hier ist ein kurzer Überblick, wie mein Workflow aussieht:
                        Datenbank → Skript im IoBroker → JSON-Datei → JSON-Template in der VIS.

                        mit dem Skript kann ich die Werte aus der Datenbank errechnen, umformen, etc und kann sie dann direkt mithilfe des JSON-Templates in der VIS anzeigen lassen. Ich bräuchte lediglich eine Funktion für den Statusbutton, der diesen in die Datenbank wieder eintragen kann, sodass dieser ja auch gespeichert wird.

                        OliverIOO Offline
                        OliverIOO Offline
                        OliverIO
                        wrote on last edited by OliverIO
                        #24

                        @marcio
                        Wir werden sehen wo wir landen

                        Dann trage in das Widget den datenpunkt ein in der deine json gespeichert ist ein. Dann hast du den Inhalt im Widget verfügbar. In der Doku ist beschrieben unter welchem Namen du das abfragen kannst

                        https://github.com/oweitman/ioBroker.rssfeed?tab=readme-ov-file#templatesystem

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

                        M 1 Reply Last reply
                        0
                        • OliverIOO OliverIO

                          @marcio
                          Wir werden sehen wo wir landen

                          Dann trage in das Widget den datenpunkt ein in der deine json gespeichert ist ein. Dann hast du den Inhalt im Widget verfügbar. In der Doku ist beschrieben unter welchem Namen du das abfragen kannst

                          https://github.com/oweitman/ioBroker.rssfeed?tab=readme-ov-file#templatesystem

                          M Offline
                          M Offline
                          MarcIO
                          wrote on last edited by
                          #25

                          @oliverio

                          Sorry, dass ich mich so spät nochmal melde.
                          Ich habe es gestern Abend gemacht und da hatte es auch geklappt, allerdings kann ich den Status nicht mehr ändern und ich denke etwas stimmt mit der Datenbank nicht. Ich habe gestern den Befehl 'SET SQL_SAFE_UPDATES = 0;' gebraucht gehabt und da hatte alles gepasst. Dieser Befehl gilt ja aber nur für die eine Sitzung, dachte es liegt daran aber jetzt funktioniert es auch nicht mehr. Der User hat auch alle Schreiberechte, wundere mich grad warum es wieder nicht geht. Hast du denn eine Idee?

                          OliverIOO 1 Reply Last reply
                          0
                          • M MarcIO

                            @oliverio

                            Sorry, dass ich mich so spät nochmal melde.
                            Ich habe es gestern Abend gemacht und da hatte es auch geklappt, allerdings kann ich den Status nicht mehr ändern und ich denke etwas stimmt mit der Datenbank nicht. Ich habe gestern den Befehl 'SET SQL_SAFE_UPDATES = 0;' gebraucht gehabt und da hatte alles gepasst. Dieser Befehl gilt ja aber nur für die eine Sitzung, dachte es liegt daran aber jetzt funktioniert es auch nicht mehr. Der User hat auch alle Schreiberechte, wundere mich grad warum es wieder nicht geht. Hast du denn eine Idee?

                            OliverIOO Offline
                            OliverIOO Offline
                            OliverIO
                            wrote on last edited by
                            #26

                            @marcio

                            Und wie hast du gemerkt, dass es nicht funktioniert?
                            Gibt es Fehlermeldung?
                            Dieser Befehl stellt ja nur sicher, dass du nicht aus Versehen eine ganze Tabelle aktualisierst oder löscht. Während du lernst, ist es ganz okay. Aber im laufenden Betrieb brauchst du diesen Befehl nicht.
                            Am besten zeigst du mir den Befehl, der nicht funktioniert und eventuell eine Fehlermeldung liefert.
                            Hast du mittlerweile phpmyadmin installiert?
                            Alternativ, aber nicht so schön, kannst du SQL Befehle zum Testen auch direkt auf der Konsole ausführen. Dann ist sichergestellt, dass Fehlermeldungen auch wirklich angezeigt oder ausgegeben werden.

                            Auf dem Server, auf dem MySQL installiert ist, in der Konsole einfach mysql eintippen.
                            Danach kannst du die Datenbank auswählen und deine Select Statements eintragen.
                            Lese dazu aber noch mal im Internet die genaue Anwendung nach. Ein paar SQL Befehle solltest du dann schon kennen.
                            Aber wie gesagt phpmysql ist da viel angenehmer

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

                            M 1 Reply Last reply
                            0
                            • OliverIOO OliverIO

                              @marcio

                              Und wie hast du gemerkt, dass es nicht funktioniert?
                              Gibt es Fehlermeldung?
                              Dieser Befehl stellt ja nur sicher, dass du nicht aus Versehen eine ganze Tabelle aktualisierst oder löscht. Während du lernst, ist es ganz okay. Aber im laufenden Betrieb brauchst du diesen Befehl nicht.
                              Am besten zeigst du mir den Befehl, der nicht funktioniert und eventuell eine Fehlermeldung liefert.
                              Hast du mittlerweile phpmyadmin installiert?
                              Alternativ, aber nicht so schön, kannst du SQL Befehle zum Testen auch direkt auf der Konsole ausführen. Dann ist sichergestellt, dass Fehlermeldungen auch wirklich angezeigt oder ausgegeben werden.

                              Auf dem Server, auf dem MySQL installiert ist, in der Konsole einfach mysql eintippen.
                              Danach kannst du die Datenbank auswählen und deine Select Statements eintragen.
                              Lese dazu aber noch mal im Internet die genaue Anwendung nach. Ein paar SQL Befehle solltest du dann schon kennen.
                              Aber wie gesagt phpmysql ist da viel angenehmer

                              M Offline
                              M Offline
                              MarcIO
                              wrote on last edited by
                              #27

                              @oliverio

                              Und wie hast du gemerkt, dass es nicht funktioniert?
                              Gibt es Fehlermeldung?

                              Der Button aktualisiert sich nicht mehr, der Text darin bleibt gleich. Ja es gibt auch eine Fehlermeldung in der Konsole: TypeError: undefined is not an object (evaluating 'window.jsontemplate.clicktodo')
                              Den kann ich allerdings nicht nachvollziehen, weil sie gesagt, es zuvor eigentlich einwandfrei funktioniert hatte. Ich habe es zwar für ca. 10 Minuten getestet gehabt, aber merke eben erst, dass es nicht mehr will.

                              Hier der bisherige Zustand von dem JSON-Template:

                              <% 
                              let todo = data.map(el => {
                                return {
                                  ...el,
                                  color: parseInt(el.countdown) <= 20 ? "red"
                                         : parseInt(el.countdown) <= 35 ? "yellow"
                                         : "green",
                                };
                              });
                              %>
                              
                              <style>
                                table {
                                  border-collapse: separate;
                                  border-spacing: 0 4px;
                                  width: 100%;
                                  text-align: center;
                                }
                              
                                .rowBorder td {
                                  border-top: 2px solid var(--borderColor);
                                  border-bottom: 2px solid var(--borderColor);
                                  padding: 4px;
                                }
                              
                                .rowBorder td:first-child {
                                  border-left: 2px solid var(--borderColor);
                                }
                              
                                .rowBorder td:last-child {
                                  border-right: 2px solid var(--borderColor);
                                }
                              
                                h1, h2 {
                                  text-align: center;
                                }
                              
                                table th:last-child, table td:last-child {
                                  width: 160px;
                                }
                              </style>
                              
                              <table>
                                <thead>
                                  <tr>
                                    <th>Maschine</th>  
                                    <th>Wartungsname</th>
                                    <th>Beschreibung</th>
                                    <th>Startdatum</th>
                                    <th>verbliebene Tage</th>
                                    <th>Status</th>
                                  </tr>
                                </thead>
                                <tbody>
                                  <% todo.forEach(item => { %>
                                    <tr class="rowBorder" style="--borderColor: <%= item.color %>;">
                                      <td><%- item.machine_name %></td>
                                      <td><%- item.name %></td>
                                      <td><%- item.description %></td>
                                      <td><%- item.date %></td>
                                      <td><%- item.countdown %></td>
                                      <td><%- getButton(item.machine_id, item.status) %></td>
                                    </tr>
                                  <% }); %>
                                </tbody>
                              </table>
                              
                              <%
                              window.jsontemplate = {clicktodo: clicktodo};
                              
                              function getButton(machine_id, status) {
                                let text = "";
                                switch (status) {
                                  case 0:
                                    text = "nicht begonnen";
                                    break;
                                  case 1:
                                    text = "in Bearbeitung";
                                    break;
                                  case 2:
                                    text = "erledigt";
                                    break;
                                }
                                return '<button onclick="window.jsontemplate.clicktodo(this)" data-machine_id="' +machine_id+ '"data-status="'+status+'">'+text+'</button>';
                              }
                              
                              async function clicktodo(el) {
                                let machine_id = el.dataset.machine_id;
                                let status = parseInt(el.dataset.status);
                              
                                let nextstatus = (status === 0) ? 1 : (status === 1) ? 2 : 0;
                              
                                el.textContent = (nextstatus === 0) ? "nicht begonnen"
                                               : (nextstatus === 1) ? "in Bearbeitung"
                                               : "erledigt";
                                el.dataset.status = nextstatus;
                              
                                await setStatus(machine_id, nextstatus);
                              }
                              
                              async function setStatus(machine_id, status) {
                                console.log('Datenbank wird aktualisiert: Maschine ' +machine_id+ ', neuer Status ' +status);
                                const req = await sendToAsync("sql.2", "query", "UPDATE data.machine_maintenance_dates SET status = " +status+ " WHERE machine_id = '" +machine_id+ "'");
                                vis.setValue("local_trigger", Math.random());
                              }
                              
                              async function sendToAsync(instance, command, sendData) {
                                console.log('Sende Befehl: '+command+', Daten: ' +sendData);
                                return new Promise((resolve, reject) => {
                                  try {
                                    vis.conn.sendTo(instance, command, sendData, function (receiveData) {
                                      resolve(receiveData);
                                    });
                                  } catch (error) {
                                    reject(error);
                                  }
                                });
                              }
                              %>
                              

                              Ich habe eine kleine Anpassung. Es wird zwar der machine_name angezeigt, aber verglichen wird die Zeile mit der machine_id. Die ID ist natürlich in der JSON-Datei enthalten.

                              Nein ich habe kein phpadmin, mein Heimserver wurde mal von einem Kollegen eingerichtet.

                              1 Reply Last reply
                              0
                              • OliverIOO Offline
                                OliverIOO Offline
                                OliverIO
                                wrote on last edited by
                                #28

                                @marcio

                                Ok, also dann zunächst mal prüfen, ob der Click noch funktioniert.
                                Das machst du am besten in dem du in das Template in Zeile nach async function clicktodo
                                Eine Zeile mit

                                debugger;
                                

                                Einfügst.
                                Wenn du dann mit f12 die Browser developer Tools öffnest und einmal eine Klick zum statuswechsel ausführst, müsste das dann genau da stoppen. Wenn das funktioniert, dann debugger wieder entfernen.

                                Dann bitte auch mal das browser log und auch iobroker log prüfen, ob da Fehler auftauchen

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

                                M 1 Reply Last reply
                                0
                                • OliverIOO OliverIO

                                  @marcio

                                  Ok, also dann zunächst mal prüfen, ob der Click noch funktioniert.
                                  Das machst du am besten in dem du in das Template in Zeile nach async function clicktodo
                                  Eine Zeile mit

                                  debugger;
                                  

                                  Einfügst.
                                  Wenn du dann mit f12 die Browser developer Tools öffnest und einmal eine Klick zum statuswechsel ausführst, müsste das dann genau da stoppen. Wenn das funktioniert, dann debugger wieder entfernen.

                                  Dann bitte auch mal das browser log und auch iobroker log prüfen, ob da Fehler auftauchen

                                  M Offline
                                  M Offline
                                  MarcIO
                                  wrote on last edited by
                                  #29

                                  @oliverio

                                  debugger eingefügt, aber der selbe Fehler. Vermutlich bricht er schon vorher ab.
                                  Habe eben diesen Fehler im IoB-Log gesehen

                                  sql.2
                                  2025-03-26 17:35:38.938	error	Error: CREATE command denied to user 'my_user'@'xx.xx.xx' for table `machine_maintenance_dates`.`sources`
                                  
                                  sql.2
                                  2025-03-26 17:35:38.938	error	CREATE TABLE `machine_maintenance_dates`.sources (id INTEGER NOT NULL PRIMARY KEY AUTO_INCREMENT, name TEXT);
                                  

                                  ich geh mal davon aus ich habe gestern versehentlich meine Berechtigung rausgekickt

                                  OliverIOO 1 Reply Last reply
                                  0
                                  • M MarcIO

                                    @oliverio

                                    debugger eingefügt, aber der selbe Fehler. Vermutlich bricht er schon vorher ab.
                                    Habe eben diesen Fehler im IoB-Log gesehen

                                    sql.2
                                    2025-03-26 17:35:38.938	error	Error: CREATE command denied to user 'my_user'@'xx.xx.xx' for table `machine_maintenance_dates`.`sources`
                                    
                                    sql.2
                                    2025-03-26 17:35:38.938	error	CREATE TABLE `machine_maintenance_dates`.sources (id INTEGER NOT NULL PRIMARY KEY AUTO_INCREMENT, name TEXT);
                                    

                                    ich geh mal davon aus ich habe gestern versehentlich meine Berechtigung rausgekickt

                                    OliverIOO Offline
                                    OliverIOO Offline
                                    OliverIO
                                    wrote on last edited by OliverIO
                                    #30

                                    @marcio

                                    Ja genau, Berechtigung.
                                    Aber warum create?
                                    Das macht man nur einmal.
                                    Damit legt man eine neue tabelle an.
                                    Wenn die mal existiert benötigt man das nicht wieder.

                                    Wahrscheinlich ist das aber auch der Fehler für Update.
                                    MySQL hat ein fein granulares berechtigungssystem. Da kann man relativ viel machen.

                                    https://gridscale.io/community/tutorials/mysql-benutzer-rechte-zuweisen/

                                    Also mit irgendeinem Client musst du arbeiten.
                                    Wenn nicht mit phpmyadmin, dann halt auf der Konsole mit dem Programm mysql
                                    https://dev.mysql.com/doc/mysql-getting-started/en/
                                    Dort dann ab der Überschrift
                                    Some Basic Operations with MySQL

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

                                    R 1 Reply Last reply
                                    0
                                    • OliverIOO OliverIO

                                      @marcio

                                      Ja genau, Berechtigung.
                                      Aber warum create?
                                      Das macht man nur einmal.
                                      Damit legt man eine neue tabelle an.
                                      Wenn die mal existiert benötigt man das nicht wieder.

                                      Wahrscheinlich ist das aber auch der Fehler für Update.
                                      MySQL hat ein fein granulares berechtigungssystem. Da kann man relativ viel machen.

                                      https://gridscale.io/community/tutorials/mysql-benutzer-rechte-zuweisen/

                                      Also mit irgendeinem Client musst du arbeiten.
                                      Wenn nicht mit phpmyadmin, dann halt auf der Konsole mit dem Programm mysql
                                      https://dev.mysql.com/doc/mysql-getting-started/en/
                                      Dort dann ab der Überschrift
                                      Some Basic Operations with MySQL

                                      R Online
                                      R Online
                                      Ralf 2
                                      wrote on last edited by
                                      #31

                                      @oliverio @MarcIO
                                      Als Client benutze ich zumeist die MySQLWorkbench: https://www.mysql.com/products/workbench/

                                      Viele arbeiten auch mit HeidiSQL: https://www.heidisql.com/

                                      Wenn man mit SQL arbeiten will sind beide empfehlenswert.

                                      Gruß Ralf

                                      M 1 Reply Last reply
                                      0
                                      • R Ralf 2

                                        @oliverio @MarcIO
                                        Als Client benutze ich zumeist die MySQLWorkbench: https://www.mysql.com/products/workbench/

                                        Viele arbeiten auch mit HeidiSQL: https://www.heidisql.com/

                                        Wenn man mit SQL arbeiten will sind beide empfehlenswert.

                                        M Offline
                                        M Offline
                                        MarcIO
                                        wrote on last edited by
                                        #32

                                        @ralf-2

                                        Benutze ebenso MySQLWorkbench, kann mich bisher ebenso kaum beschweren.

                                        Ich habe allerdings grad ein kleines Problem, habe das Passwort falsch in Erinnerung für meinen root user. Ohne den kann ich meinen aktiven User keine Rechte zuteilen. Müsste es irgendwo aufgeschrieben haben, muss erstmal fündig werden.

                                        OliverIOO 1 Reply Last reply
                                        0
                                        • M MarcIO

                                          @ralf-2

                                          Benutze ebenso MySQLWorkbench, kann mich bisher ebenso kaum beschweren.

                                          Ich habe allerdings grad ein kleines Problem, habe das Passwort falsch in Erinnerung für meinen root user. Ohne den kann ich meinen aktiven User keine Rechte zuteilen. Müsste es irgendwo aufgeschrieben haben, muss erstmal fündig werden.

                                          OliverIOO Offline
                                          OliverIOO Offline
                                          OliverIO
                                          wrote on last edited by
                                          #33

                                          @marcio

                                          https://dev.mysql.com/doc/refman/8.4/en/resetting-permissions.html

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

                                          1 Reply Last reply
                                          0
                                          Reply
                                          • Reply as topic
                                          Log in to reply
                                          • Oldest to Newest
                                          • Newest to Oldest
                                          • Most Votes


                                          Support us

                                          ioBroker
                                          Community Adapters
                                          Donate
                                          FAQ Cloud / IOT
                                          HowTo: Node.js-Update
                                          HowTo: Backup/Restore
                                          Downloads
                                          BLOG

                                          906

                                          Online

                                          32.4k

                                          Users

                                          81.5k

                                          Topics

                                          1.3m

                                          Posts
                                          Community
                                          Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen | Einwilligungseinstellungen
                                          ioBroker Community 2014-2025
                                          logo
                                          • Login

                                          • Don't have an account? Register

                                          • Login or register to search.
                                          • First post
                                            Last post
                                          0
                                          • Home
                                          • Recent
                                          • Tags
                                          • Unread 0
                                          • Categories
                                          • Unreplied
                                          • Popular
                                          • GitHub
                                          • Docu
                                          • Hilfe