Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. MarcIO

    NEWS

    • ioBroker goes Matter ... Matter Adapter in Stable

    • 15. 05. Wartungsarbeiten am ioBroker Forum

    • Monatsrückblick - April 2025

    M
    • Profile
    • Following 0
    • Followers 0
    • Topics 6
    • Posts 74
    • Best 0
    • Groups 1

    MarcIO

    @MarcIO

    Starter

    0
    Reputation
    12
    Profile views
    74
    Posts
    0
    Followers
    0
    Following
    Joined Last Online

    MarcIO Follow
    Starter

    Latest posts made by MarcIO

    • RE: Button-Wert aus der Vis in Sql eintragen / speichern

      @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.

      posted in ioBroker Allgemein
      M
      MarcIO
    • RE: Button-Wert aus der Vis in Sql eintragen / speichern

      @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

      posted in ioBroker Allgemein
      M
      MarcIO
    • RE: Button-Wert aus der Vis in Sql eintragen / speichern

      @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.

      posted in ioBroker Allgemein
      M
      MarcIO
    • RE: Button-Wert aus der Vis in Sql eintragen / speichern

      @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?

      posted in ioBroker Allgemein
      M
      MarcIO
    • RE: Button-Wert aus der Vis in Sql eintragen / speichern

      @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.

      posted in ioBroker Allgemein
      M
      MarcIO
    • RE: Button-Wert aus der Vis in Sql eintragen / speichern

      @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.

      posted in ioBroker Allgemein
      M
      MarcIO
    • RE: Button-Wert aus der Vis in Sql eintragen / speichern

      @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
        },
      
      posted in ioBroker Allgemein
      M
      MarcIO
    • RE: Button-Wert aus der Vis in Sql eintragen / speichern

      @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

      posted in ioBroker Allgemein
      M
      MarcIO
    • RE: Button-Wert aus der Vis in Sql eintragen / speichern

      @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.

      posted in ioBroker Allgemein
      M
      MarcIO
    • RE: Button-Wert aus der Vis in Sql eintragen / speichern

      @oliverio

      Ich habe es versucht hat leider nicht ganz geklappt.

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

      posted in ioBroker Allgemein
      M
      MarcIO
    Community
    Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
    The ioBroker Community 2014-2023
    logo