Skip to content
  • Aktuell
  • Tags
  • 0 Ungelesen 0
  • Kategorien
  • Unreplied
  • Beliebt
  • 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

  • Standard: (Kein Skin)
  • Kein Skin
Einklappen
ioBroker Logo
  1. ioBroker Community Home
  2. Deutsch
  3. ioBroker Allgemein
  4. Zurücksetzen einzelner Datenpunkte im SQL-Adapter

NEWS

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

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

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

Zurücksetzen einzelner Datenpunkte im SQL-Adapter

Geplant Angeheftet Gesperrt Verschoben ioBroker Allgemein
87 Beiträge 16 Kommentatoren 13.0k Aufrufe 14 Watching
  • Älteste zuerst
  • Neuste zuerst
  • Meiste Stimmen
Antworten
  • In einem neuen Thema antworten
Anmelden zum Antworten
Dieses Thema wurde gelöscht. Nur Nutzer mit entsprechenden Rechten können es sehen.
  • BananaJoeB BananaJoe

    @metaxa was du mit der 83 meinst weis ich nicht - es sind 83 Datenpunkte ohne Fahrschein.
    Das dein Export 1,2GB groß ist heißt auch nicht viel - die SQL Datei ist eine Textdatei welche die Anweisungen zum Import enthält. Die ist dadurch schon mal größer als die eigentlichen Daten.
    Allerdings sehe ich da Datenpunkte vom Typ String - das könnten Platzfresser sein wenn diese viele lange Einträge haben.

    javascript.0 2023-02-02 23:33:12.902 warn script.js.010_Testen.SQL_Datenpunkte_löschen: DB id: 102 (type: 1) -> number: 0, string: 100, bool: 0 | ioBroker id: 'device-reminder.0.Dishwasher.messageDP'
    
    javascript.0 2023-02-02 23:33:12.804 warn script.js.010_Testen.SQL_Datenpunkte_löschen: DB id: 100 (type: 0) -> number: 100, string: 0, bool: 0 | ioBroker id: 'sonoff.0.Kueche-LED-Power-32.ENERGY_Yesterday'
    

    So, die beiden Datenpunkte dort nehme ich als Beispiel.
    Du musst auf die Shell / in die Bash / per puTTY auf den ioBroker.

    Dort musst du die Eingabeaufforderung von MySQL starten:

    mysql -uandreas -p ioBroker
    

    -uandreas = Benutzername andreas
    -p = du willst ein Passwort eingeben
    ioBroker = Name der Datenbank mit der du dich verbinden willst.
    Er fragt nach dem Passwort, danach hast du einen Prompt:

    Welcome to the MariaDB monitor.  Commands end with ; or \g.
    Your MariaDB connection id is 64731
    Server version: 10.6.11-MariaDB-0ubuntu0.22.04.1 Ubuntu 22.04
    
    Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
    
    Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
    
    MariaDB [iobroker]>
    

    Bei mir steht MariaDB, bei dir eventuell auch oder MySQL, die funktionieren beide gleich.
    [iobroker] heisst das die Datenbank ausgewählt ist.

    Kleiner Test:

    MariaDB [iobroker]> show tables;
    +--------------------+
    | Tables_in_iobroker |
    +--------------------+
    | datapoints         |
    | sources            |
    | ts_bool            |
    | ts_counter         |
    | ts_number          |
    | ts_string          |
    +--------------------+
    6 rows in set (0,001 sec)
    

    Das sind die Tabellen in denen die Daten liegen. Aus denen können wir die Daten mit den obigen Informationen aus dem Log löschen:

    javascript.0 2023-02-02 23:33:12.902 warn script.js.010_Testen.SQL_Datenpunkte_löschen: DB id: 102 (type: 1) -> number: 0, string: 100, bool: 0 | ioBroker id: 'device-reminder.0.Dishwasher.messageDP'
    

    device-reminder.0.Dishwasher.messageDP hat in der Datenbank die id 102 (DB id: 102 (type: 1))
    Und Daten in der ts_string Tabelle (number: 0, string: 100, bool: 0)

    kurze Kontrolle:

    MariaDB [iobroker]> select * from datapoints where id=102;
    +-----+----------------------------------------+------+
    | id  | name                                   | type |
    +-----+----------------------------------------+------+
    | 102 | device-reminder.0.Dishwasher.messageDP |    1 |
    +-----+----------------------------------------+------+
    1 row in set (0,001 sec)
    

    Ok, stimmt, also löschen der Werte aus ts_string und aus datapoints:

    delete from ts_bool where id=102;
    delete from datapoints where id=102; 
    

    Beim ersten Befehl sollte in der Zusammenfassung stehen wie viele Datensätze er gelöscht hat,
    beim 2. Befehl sollte es immer 1 (einer) sein weil es ja nur einen Eintrag gibt.

    Der erste Befehl ist es der dein System in die Knie zwingen kann wenn er dort viel löschen muss.
    Dazu komme ich weiter unten noch einmal.

    javascript.0 2023-02-02 23:33:12.804 warn script.js.010_Testen.SQL_Datenpunkte_löschen: DB id: 100 (type: 0) -> number: 100, string: 0, bool: 0 | ioBroker id: 'sonoff.0.Kueche-LED-Power-32.ENERGY_Yesterday'
    

    sonoff.0.Kueche-LED-Power-32.ENERGY_Yesterday hat in der Datenbank die id 100 (DB id: 100 (type: 01))
    Und Daten in der ts_number Tabelle (number: 100, string: 0, bool: 0)

    Beim löschen eben die andere Tabelle:

    delete from ts_number where id=100;
    delete from datapoints where id=100; 
    

    und bei bool wäre es eben ts_bool
    Wenn du mit allen fertig bist kannst du per exit die Konsole wieder verlassen.

    So, nun zu dem "in die Knie gehen".
    Variante 1 ist den ioBroker vorher zu stoppen

    sudo systemctl stop iobroker
    

    Dann das löschen machen. Wenn es länger dauert, dauert es eben länger - Abwarten bis der Prompt wiederkommt. Das wird meist recht flott gehen - aber du wirst da ein oder mehrere Monster haben wo es dauern wird.

    Variante 2 ist das löschen zu limitieren:

    delete from ts_number where id=100 limit 5000;
    

    würde nur die ersten 5.000 Datensätze löschen. Dabei wird das System / ein oder mehrere CPU-Kerne kurz auf Anschlag gehen und der Prompt kommt dann wieder. Als Ergebnis sollte da so etwas stehen:

    5000 row in set (4,321 sec)
    

    Ist die Zahl kleiner als dein Limit oder sogar 0 hast du alles gelöscht in der Tabelle. Ansonsten musst du das wiederholen.

    Ob 5000 oder 50 so der 100.000 die richtige Zahl für dein System ist kann ich dir nicht sagen. Vermutlich kannst du bei ts_number eher höher greifen, bei ts_string erst einmal niedriger.
    Meine Geräte die einmal die Minute liefern mit 6 Monate Aufzeichnung haben 42.000 Datensätze.
    Einer der Temperaturfühler hat alle 5 Sekunden gemeldet ... 280.000
    der Shelly 3EM liefert alle 3 Sekunden und hat bei mir 2.673.105 Datensätze - pro Phase.

    Beim Abfragen des letzteren ging bei mir die CPU für einen Moment auf 100%. (aber nicht auf allen Kernen)
    Wie viele es sind könntest du mit dem Befehl hier testen, der ging schon schneller:

    MariaDB [iobroker]> select COUNT(*) from ts_number where id=58;
    +----------+
    | COUNT(*) |
    +----------+
    |  2673128 |
    +----------+
    1 row in set (3,609 sec)
    

    Halt 4 Sekunden vollgas. Wenn ich die Abfrage wie im Skript mache (select COUNT(*) from ts_number where id=58;) dann sind es schon ca. 11 Sekunden, also 3 mal so "schlimm"

    metaxaM Offline
    metaxaM Offline
    metaxa
    schrieb am zuletzt editiert von metaxa
    #52

    @bananajoe sagte in Zurücksetzen einzelner Datenpunkte im SQL-Adapter:

    Wahnsinn der und vor allem dein Aufwand!

    Ich hatte nach einer Lösung direkt auf meiner Syno im Web-UI gesucht. iO für paar Stunden lahm zu legen macht Stress zu Hause.

    1 MyAdmin öffnen und die gewünschte DB auswählen
    d67403bd-056c-4627-860e-5762c045927f-image.png
    2 Rechts den Reiter SQL wählen
    7071a611-ee03-405a-b144-ef3fe849b165-image.png

    3 Hier kommt dann deine Arbeit nach deinem Skript voll zum Tragen!

    @bananajoe sagte in Zurücksetzen einzelner Datenpunkte im SQL-Adapter:

    delete from ts_number where id=100;
    delete from datapoints where id=100;
    

    4 Trockentraining
    482af665-cf3c-460d-b244-1ef77672509c-image.png

    5 Ergebnis
    ea242999-803a-4fad-8bdf-c6c9abf503d6-image.png

    6 Wenn das Ergebnis plausibel erscheint, anstelle simulieren, rechts mit "OK" löschen.
    dd874b67-6a59-40cf-ad12-4c41b0de8bc0-image.png

    1 Antwort Letzte Antwort
    0
    • GaspodeG Offline
      GaspodeG Offline
      Gaspode
      schrieb am zuletzt editiert von Gaspode
      #53

      @bananajoe

      Erst noch mal vielen Dank für dein Engagement!

      Ich hab das Zählen bzw. Ermitteln optimiert, ich hoffe es ist OK, wenn ich in dem Script Änderungen mache. Ich lade jetzt zum Zählen nicht mehr alle Records, sondern nutze count(*) zum Zählen. Dann muss ioBroker intern keine riesigen Dictionaries aufbauen. Bei mir dauert das Ermitteln so nur noch ein paar Sekunden und es scheint zu stimmen.

      // SQL_Delete_Dead_Objects
      // V0.5
      //
      // Changelog:
      // ----------
      // 10.08.2019 V0.1   Scrounger   erste Version welche nicht mehr existierende Datenpunkte anzeigt           https://forum.iobroker.net/post/289821
      // 03.05.2022 V0.2   andi2055    erweitert das die Daten auch aus der Datenbank gelöscht werden             https://forum.iobroker.net/post/798291
      // 01.02.2023 V0.3   BananaJoe   umgestellt das nun Datenpunkte ohne SQL-Protokollierung gefunden werden    https://forum.iobroker.net/post/939101
      // 02.02.2023 V0.4   BananaJoe   SQL-Instanz Konfigurierbar / Datenbankname konfigurierbar
      // 03.02.2023 V0.5   Gaspode     Speicherverbrauch beim Zählen optimiert durch Verwendung von count(*)
      
      // Einstellungen:
      // Hier das löschen einschalten! false = nur anzeigen / true = anzeigen und wirklich löschen
      const activate_delete = false;
      
      // Name der SQL-Instanz, normalerweiser sql.0
      const sql_instance = 'sql.0';
      // Name der SQL-Datenbank - Groß und Kleinschreibung beachten!
      const sql_dbname = 'iobroker';
      
      // Funktion zum Suchen und Löschen
      async function wartung() {
          try {
              // Alle Datenpunkte holen bei welchen die SQL-Protokollierung aktiv ist:
              let datapointsActiveArray = new Array();
              let datapointsActiceStrings = "";
              await sendTo(sql_instance, 'getEnabledDPs', {}, function (result) {
                  Object.entries(result).forEach((entry) => {
                      const [key, value] = entry;
                      //console.log(`${key}`);
                      datapointsActiceStrings = datapointsActiceStrings + `${key}` + ";";
                  });
                  //console.log(datapointsActiceStrings);
                  datapointsActiveArray = datapointsActiceStrings.split(';');
              });
      
              // alle Datenpunkte aus Db holen
              let datapoints = await getQueryResult(`SELECT name, id, type FROM ${sql_dbname}.datapoints`);
              if (datapoints) {
                  let count = 0;
                  let sum = 0;
      
                  // Datenpunkte durchlaufen
                  for (const datapoint of datapoints) {
                      // prüfen ob kein Objekt in ioBroker existiert
                      // if (!getObject(datapoint.name)) {
      
                      // prüfen ob SQL-Protokollierung nicht aktiv ist
                      if (!datapointsActiveArray.includes(datapoint.name)) {
                          count++;
      
                          // Daten des Datenpunktes in Tabelle 'ts_bool' zählen
                          let countBool = 0;
                          let booleanTableItems = await getQueryResult(`SELECT count(*) as cnt FROM ${sql_dbname}.ts_bool WHERE id = ${datapoint.id}`);
                          if (booleanTableItems && booleanTableItems[0].cnt > 0) {
                              countBool = booleanTableItems[0].cnt;
                              if (activate_delete) {
                                  sendTo(sql_instance, 'query', `DELETE FROM ${sql_dbname}.ts_bool WHERE id = ${datapoint.id}`, function (result) {
                                      if (result.error) {
                                          console.error(result.error);
                                      } else {
                                          // show result
                                          console.log('Rows: ' + JSON.stringify(result.result));
                                      }
                                  });
                              }
                          }
      
                          // Daten des Datenpunktes in Tabelle 'ts_number' zählen
                          let countNumber = 0;
                          let numberTableItems = await getQueryResult(`SELECT count(*) as cnt FROM ${sql_dbname}.ts_number WHERE id = ${datapoint.id}`);
                          if (numberTableItems && numberTableItems[0].cnt > 0) {
                              countNumber = numberTableItems[0].cnt;
                              if (activate_delete) {
                                  sendTo(sql_instance, 'query', `DELETE FROM ${sql_dbname}.ts_number WHERE id = ${datapoint.id}`, function (result) {
                                      if (result.error) {
                                          console.error(result.error);
                                      } else {
                                          // show result
                                          console.log('Rows: ' + JSON.stringify(result.result));
                                      }
                                  });
                              }
                          }
      
                          // Daten des Datenpunktes in Tabelle 'ts_string' zählen
                          let countString = 0;
      
                          let stringTableItems = await getQueryResult(`SELECT count(*) as cnt FROM ${sql_dbname}.ts_string WHERE id = ${datapoint.id}`);
      
                          if (stringTableItems && stringTableItems[0].cnt > 0) {
      
                              countString = stringTableItems[0].cnt;
      
                              if (activate_delete) {
                                  sendTo(sql_instance, 'query', `DELETE FROM ${sql_dbname}.ts_string WHERE id = ${datapoint.id}`, function (result) {
                                      if (result.error) {
                                          console.error(result.error);
                                      } else {
                                          // show result
                                          console.log('Rows: ' + JSON.stringify(result.result));
                                      }
                                  });
                              }
                          }
      
                          if (activate_delete) {
                              sendTo(sql_instance, 'query', `DELETE FROM ${sql_dbname}.datapoints WHERE id = ${datapoint.id}`, function (result) {
                                  if (result.error) {
                                      console.error(result.error);
                                  } else {
                                      // show result
                                      console.log('Rows: ' + JSON.stringify(result.result));
                                  }
                              });
                          }
      
                          console.warn(`DB id: ${datapoint.id} (type: ${datapoint.type}) -> number: ${countNumber}, string: ${countString}, bool: ${countBool} | ioBroker id: '${datapoint.name}'`);
                          sum = sum + countBool + countNumber + countString;
                      }
                  }
                  console.warn(`${count} Objects found, that not exist anymore in ioBroker, sum of items in tables: ${sum.toLocaleString().replace(/,/g, ".")}`);
              }
          } catch (err) {
              console.error(`[wartung] error: ${err.message}`);
              console.error(`[wartung] stack: ${err.stack}`);
          }
      }
      
      async function getQueryResult(query) {
          return new Promise((resolve, reject) => {
              sendTo(sql_instance, 'query', query, function (result) {
                  if (!result.error) {
                      resolve(result.result);
                  } else {
                      resolve(null);
                  }
              });
          });
      }
      
      wartung();
      

      Jetzt wäre es noch toll, wenn man einbeziehen könnte, ob für ein State ein Alias vergeben wurde.

      metaxaM BananaJoeB 2 Antworten Letzte Antwort
      2
      • GaspodeG Gaspode

        @bananajoe

        Erst noch mal vielen Dank für dein Engagement!

        Ich hab das Zählen bzw. Ermitteln optimiert, ich hoffe es ist OK, wenn ich in dem Script Änderungen mache. Ich lade jetzt zum Zählen nicht mehr alle Records, sondern nutze count(*) zum Zählen. Dann muss ioBroker intern keine riesigen Dictionaries aufbauen. Bei mir dauert das Ermitteln so nur noch ein paar Sekunden und es scheint zu stimmen.

        // SQL_Delete_Dead_Objects
        // V0.5
        //
        // Changelog:
        // ----------
        // 10.08.2019 V0.1   Scrounger   erste Version welche nicht mehr existierende Datenpunkte anzeigt           https://forum.iobroker.net/post/289821
        // 03.05.2022 V0.2   andi2055    erweitert das die Daten auch aus der Datenbank gelöscht werden             https://forum.iobroker.net/post/798291
        // 01.02.2023 V0.3   BananaJoe   umgestellt das nun Datenpunkte ohne SQL-Protokollierung gefunden werden    https://forum.iobroker.net/post/939101
        // 02.02.2023 V0.4   BananaJoe   SQL-Instanz Konfigurierbar / Datenbankname konfigurierbar
        // 03.02.2023 V0.5   Gaspode     Speicherverbrauch beim Zählen optimiert durch Verwendung von count(*)
        
        // Einstellungen:
        // Hier das löschen einschalten! false = nur anzeigen / true = anzeigen und wirklich löschen
        const activate_delete = false;
        
        // Name der SQL-Instanz, normalerweiser sql.0
        const sql_instance = 'sql.0';
        // Name der SQL-Datenbank - Groß und Kleinschreibung beachten!
        const sql_dbname = 'iobroker';
        
        // Funktion zum Suchen und Löschen
        async function wartung() {
            try {
                // Alle Datenpunkte holen bei welchen die SQL-Protokollierung aktiv ist:
                let datapointsActiveArray = new Array();
                let datapointsActiceStrings = "";
                await sendTo(sql_instance, 'getEnabledDPs', {}, function (result) {
                    Object.entries(result).forEach((entry) => {
                        const [key, value] = entry;
                        //console.log(`${key}`);
                        datapointsActiceStrings = datapointsActiceStrings + `${key}` + ";";
                    });
                    //console.log(datapointsActiceStrings);
                    datapointsActiveArray = datapointsActiceStrings.split(';');
                });
        
                // alle Datenpunkte aus Db holen
                let datapoints = await getQueryResult(`SELECT name, id, type FROM ${sql_dbname}.datapoints`);
                if (datapoints) {
                    let count = 0;
                    let sum = 0;
        
                    // Datenpunkte durchlaufen
                    for (const datapoint of datapoints) {
                        // prüfen ob kein Objekt in ioBroker existiert
                        // if (!getObject(datapoint.name)) {
        
                        // prüfen ob SQL-Protokollierung nicht aktiv ist
                        if (!datapointsActiveArray.includes(datapoint.name)) {
                            count++;
        
                            // Daten des Datenpunktes in Tabelle 'ts_bool' zählen
                            let countBool = 0;
                            let booleanTableItems = await getQueryResult(`SELECT count(*) as cnt FROM ${sql_dbname}.ts_bool WHERE id = ${datapoint.id}`);
                            if (booleanTableItems && booleanTableItems[0].cnt > 0) {
                                countBool = booleanTableItems[0].cnt;
                                if (activate_delete) {
                                    sendTo(sql_instance, 'query', `DELETE FROM ${sql_dbname}.ts_bool WHERE id = ${datapoint.id}`, function (result) {
                                        if (result.error) {
                                            console.error(result.error);
                                        } else {
                                            // show result
                                            console.log('Rows: ' + JSON.stringify(result.result));
                                        }
                                    });
                                }
                            }
        
                            // Daten des Datenpunktes in Tabelle 'ts_number' zählen
                            let countNumber = 0;
                            let numberTableItems = await getQueryResult(`SELECT count(*) as cnt FROM ${sql_dbname}.ts_number WHERE id = ${datapoint.id}`);
                            if (numberTableItems && numberTableItems[0].cnt > 0) {
                                countNumber = numberTableItems[0].cnt;
                                if (activate_delete) {
                                    sendTo(sql_instance, 'query', `DELETE FROM ${sql_dbname}.ts_number WHERE id = ${datapoint.id}`, function (result) {
                                        if (result.error) {
                                            console.error(result.error);
                                        } else {
                                            // show result
                                            console.log('Rows: ' + JSON.stringify(result.result));
                                        }
                                    });
                                }
                            }
        
                            // Daten des Datenpunktes in Tabelle 'ts_string' zählen
                            let countString = 0;
        
                            let stringTableItems = await getQueryResult(`SELECT count(*) as cnt FROM ${sql_dbname}.ts_string WHERE id = ${datapoint.id}`);
        
                            if (stringTableItems && stringTableItems[0].cnt > 0) {
        
                                countString = stringTableItems[0].cnt;
        
                                if (activate_delete) {
                                    sendTo(sql_instance, 'query', `DELETE FROM ${sql_dbname}.ts_string WHERE id = ${datapoint.id}`, function (result) {
                                        if (result.error) {
                                            console.error(result.error);
                                        } else {
                                            // show result
                                            console.log('Rows: ' + JSON.stringify(result.result));
                                        }
                                    });
                                }
                            }
        
                            if (activate_delete) {
                                sendTo(sql_instance, 'query', `DELETE FROM ${sql_dbname}.datapoints WHERE id = ${datapoint.id}`, function (result) {
                                    if (result.error) {
                                        console.error(result.error);
                                    } else {
                                        // show result
                                        console.log('Rows: ' + JSON.stringify(result.result));
                                    }
                                });
                            }
        
                            console.warn(`DB id: ${datapoint.id} (type: ${datapoint.type}) -> number: ${countNumber}, string: ${countString}, bool: ${countBool} | ioBroker id: '${datapoint.name}'`);
                            sum = sum + countBool + countNumber + countString;
                        }
                    }
                    console.warn(`${count} Objects found, that not exist anymore in ioBroker, sum of items in tables: ${sum.toLocaleString().replace(/,/g, ".")}`);
                }
            } catch (err) {
                console.error(`[wartung] error: ${err.message}`);
                console.error(`[wartung] stack: ${err.stack}`);
            }
        }
        
        async function getQueryResult(query) {
            return new Promise((resolve, reject) => {
                sendTo(sql_instance, 'query', query, function (result) {
                    if (!result.error) {
                        resolve(result.result);
                    } else {
                        resolve(null);
                    }
                });
            });
        }
        
        wartung();
        

        Jetzt wäre es noch toll, wenn man einbeziehen könnte, ob für ein State ein Alias vergeben wurde.

        metaxaM Offline
        metaxaM Offline
        metaxa
        schrieb am zuletzt editiert von metaxa
        #54

        @gaspode Cool!
        Das Trockentraining dauert bei mir ca. 3 Minuten. Löschen traue ich mich nicht wirklich aus dem iO heraus.

        @BananaJoe & @Gaspode
        Wäre es möglich am Ende des Trockendurchlaufs eine Liste auszugeben, z.B.:

        delete from ts_number where id=10;
        delete from datapoints where id=10;
        delete from ts_number where id=11;
        delete from datapoints where id=11;
        delete from ts_string where id=14;
        delete from datapoints where id=14;
        delete from ts_bool where id=17;
        delete from datapoints where id=17;
        

        LG, mxa

        GaspodeG 1 Antwort Letzte Antwort
        0
        • metaxaM metaxa

          @gaspode Cool!
          Das Trockentraining dauert bei mir ca. 3 Minuten. Löschen traue ich mich nicht wirklich aus dem iO heraus.

          @BananaJoe & @Gaspode
          Wäre es möglich am Ende des Trockendurchlaufs eine Liste auszugeben, z.B.:

          delete from ts_number where id=10;
          delete from datapoints where id=10;
          delete from ts_number where id=11;
          delete from datapoints where id=11;
          delete from ts_string where id=14;
          delete from datapoints where id=14;
          delete from ts_bool where id=17;
          delete from datapoints where id=17;
          

          LG, mxa

          GaspodeG Offline
          GaspodeG Offline
          Gaspode
          schrieb am zuletzt editiert von
          #55

          @metaxa said in Zurücksetzen einzelner Datenpunkte im SQL-Adapter:

          Das Trockentraining dauert bei mir ca. 3 Minuten. Löschen traue ich mich nicht wirklich aus dem iO heraus.

          Das Löschen wird durch meine Änderung auch nicht beeinflusst.

          metaxaM 1 Antwort Letzte Antwort
          1
          • GaspodeG Gaspode

            @bananajoe

            Erst noch mal vielen Dank für dein Engagement!

            Ich hab das Zählen bzw. Ermitteln optimiert, ich hoffe es ist OK, wenn ich in dem Script Änderungen mache. Ich lade jetzt zum Zählen nicht mehr alle Records, sondern nutze count(*) zum Zählen. Dann muss ioBroker intern keine riesigen Dictionaries aufbauen. Bei mir dauert das Ermitteln so nur noch ein paar Sekunden und es scheint zu stimmen.

            // SQL_Delete_Dead_Objects
            // V0.5
            //
            // Changelog:
            // ----------
            // 10.08.2019 V0.1   Scrounger   erste Version welche nicht mehr existierende Datenpunkte anzeigt           https://forum.iobroker.net/post/289821
            // 03.05.2022 V0.2   andi2055    erweitert das die Daten auch aus der Datenbank gelöscht werden             https://forum.iobroker.net/post/798291
            // 01.02.2023 V0.3   BananaJoe   umgestellt das nun Datenpunkte ohne SQL-Protokollierung gefunden werden    https://forum.iobroker.net/post/939101
            // 02.02.2023 V0.4   BananaJoe   SQL-Instanz Konfigurierbar / Datenbankname konfigurierbar
            // 03.02.2023 V0.5   Gaspode     Speicherverbrauch beim Zählen optimiert durch Verwendung von count(*)
            
            // Einstellungen:
            // Hier das löschen einschalten! false = nur anzeigen / true = anzeigen und wirklich löschen
            const activate_delete = false;
            
            // Name der SQL-Instanz, normalerweiser sql.0
            const sql_instance = 'sql.0';
            // Name der SQL-Datenbank - Groß und Kleinschreibung beachten!
            const sql_dbname = 'iobroker';
            
            // Funktion zum Suchen und Löschen
            async function wartung() {
                try {
                    // Alle Datenpunkte holen bei welchen die SQL-Protokollierung aktiv ist:
                    let datapointsActiveArray = new Array();
                    let datapointsActiceStrings = "";
                    await sendTo(sql_instance, 'getEnabledDPs', {}, function (result) {
                        Object.entries(result).forEach((entry) => {
                            const [key, value] = entry;
                            //console.log(`${key}`);
                            datapointsActiceStrings = datapointsActiceStrings + `${key}` + ";";
                        });
                        //console.log(datapointsActiceStrings);
                        datapointsActiveArray = datapointsActiceStrings.split(';');
                    });
            
                    // alle Datenpunkte aus Db holen
                    let datapoints = await getQueryResult(`SELECT name, id, type FROM ${sql_dbname}.datapoints`);
                    if (datapoints) {
                        let count = 0;
                        let sum = 0;
            
                        // Datenpunkte durchlaufen
                        for (const datapoint of datapoints) {
                            // prüfen ob kein Objekt in ioBroker existiert
                            // if (!getObject(datapoint.name)) {
            
                            // prüfen ob SQL-Protokollierung nicht aktiv ist
                            if (!datapointsActiveArray.includes(datapoint.name)) {
                                count++;
            
                                // Daten des Datenpunktes in Tabelle 'ts_bool' zählen
                                let countBool = 0;
                                let booleanTableItems = await getQueryResult(`SELECT count(*) as cnt FROM ${sql_dbname}.ts_bool WHERE id = ${datapoint.id}`);
                                if (booleanTableItems && booleanTableItems[0].cnt > 0) {
                                    countBool = booleanTableItems[0].cnt;
                                    if (activate_delete) {
                                        sendTo(sql_instance, 'query', `DELETE FROM ${sql_dbname}.ts_bool WHERE id = ${datapoint.id}`, function (result) {
                                            if (result.error) {
                                                console.error(result.error);
                                            } else {
                                                // show result
                                                console.log('Rows: ' + JSON.stringify(result.result));
                                            }
                                        });
                                    }
                                }
            
                                // Daten des Datenpunktes in Tabelle 'ts_number' zählen
                                let countNumber = 0;
                                let numberTableItems = await getQueryResult(`SELECT count(*) as cnt FROM ${sql_dbname}.ts_number WHERE id = ${datapoint.id}`);
                                if (numberTableItems && numberTableItems[0].cnt > 0) {
                                    countNumber = numberTableItems[0].cnt;
                                    if (activate_delete) {
                                        sendTo(sql_instance, 'query', `DELETE FROM ${sql_dbname}.ts_number WHERE id = ${datapoint.id}`, function (result) {
                                            if (result.error) {
                                                console.error(result.error);
                                            } else {
                                                // show result
                                                console.log('Rows: ' + JSON.stringify(result.result));
                                            }
                                        });
                                    }
                                }
            
                                // Daten des Datenpunktes in Tabelle 'ts_string' zählen
                                let countString = 0;
            
                                let stringTableItems = await getQueryResult(`SELECT count(*) as cnt FROM ${sql_dbname}.ts_string WHERE id = ${datapoint.id}`);
            
                                if (stringTableItems && stringTableItems[0].cnt > 0) {
            
                                    countString = stringTableItems[0].cnt;
            
                                    if (activate_delete) {
                                        sendTo(sql_instance, 'query', `DELETE FROM ${sql_dbname}.ts_string WHERE id = ${datapoint.id}`, function (result) {
                                            if (result.error) {
                                                console.error(result.error);
                                            } else {
                                                // show result
                                                console.log('Rows: ' + JSON.stringify(result.result));
                                            }
                                        });
                                    }
                                }
            
                                if (activate_delete) {
                                    sendTo(sql_instance, 'query', `DELETE FROM ${sql_dbname}.datapoints WHERE id = ${datapoint.id}`, function (result) {
                                        if (result.error) {
                                            console.error(result.error);
                                        } else {
                                            // show result
                                            console.log('Rows: ' + JSON.stringify(result.result));
                                        }
                                    });
                                }
            
                                console.warn(`DB id: ${datapoint.id} (type: ${datapoint.type}) -> number: ${countNumber}, string: ${countString}, bool: ${countBool} | ioBroker id: '${datapoint.name}'`);
                                sum = sum + countBool + countNumber + countString;
                            }
                        }
                        console.warn(`${count} Objects found, that not exist anymore in ioBroker, sum of items in tables: ${sum.toLocaleString().replace(/,/g, ".")}`);
                    }
                } catch (err) {
                    console.error(`[wartung] error: ${err.message}`);
                    console.error(`[wartung] stack: ${err.stack}`);
                }
            }
            
            async function getQueryResult(query) {
                return new Promise((resolve, reject) => {
                    sendTo(sql_instance, 'query', query, function (result) {
                        if (!result.error) {
                            resolve(result.result);
                        } else {
                            resolve(null);
                        }
                    });
                });
            }
            
            wartung();
            

            Jetzt wäre es noch toll, wenn man einbeziehen könnte, ob für ein State ein Alias vergeben wurde.

            BananaJoeB Online
            BananaJoeB Online
            BananaJoe
            Most Active
            schrieb am zuletzt editiert von
            #56

            @gaspode Cool. Hatte ich auch schon dran gedacht, war mir dann aber zeitlich schon zu spät.
            Wir so von mir übernommen

            ioBroker@Ubuntu 24.04 LTS (VMware) für: >260 Geräte, 5 Switche, 7 AP, 9 IP-Cam, 1 NAS 42TB, 1 ESXi 15TB, 4 Proxmox 1TB, 1 Hyper-V 44TB, 14 x Echo, 5x FireTV, 5 x Tablett/Handy VIS || >=157 Tasmota/Shelly || >=88 ZigBee || PV 8.1kW / Akku 14kWh || 2x USV 900/750W kaskadiert || Creality CR-10 SE 3D-Drucker

            1 Antwort Letzte Antwort
            0
            • GaspodeG Gaspode

              @metaxa said in Zurücksetzen einzelner Datenpunkte im SQL-Adapter:

              Das Trockentraining dauert bei mir ca. 3 Minuten. Löschen traue ich mich nicht wirklich aus dem iO heraus.

              Das Löschen wird durch meine Änderung auch nicht beeinflusst.

              metaxaM Offline
              metaxaM Offline
              metaxa
              schrieb am zuletzt editiert von
              #57

              @Gaspode
              Wie meinst du das?
              Deine coole Änderung bezieht sich nur auf den Trockendurchlauf?

              BananaJoeB GaspodeG 2 Antworten Letzte Antwort
              0
              • metaxaM metaxa

                @Gaspode
                Wie meinst du das?
                Deine coole Änderung bezieht sich nur auf den Trockendurchlauf?

                BananaJoeB Online
                BananaJoeB Online
                BananaJoe
                Most Active
                schrieb am zuletzt editiert von
                #58

                @metaxa sagte in Zurücksetzen einzelner Datenpunkte im SQL-Adapter:

                @Gaspode
                Wie meinst du das?
                Deine coole Änderung bezieht sich nur auf den Trockendurchlauf?

                Das Problem beim löschen bleibt, nur das ermitteln der Anzahl der zu löschenden Werte ist optimiert worden

                ioBroker@Ubuntu 24.04 LTS (VMware) für: >260 Geräte, 5 Switche, 7 AP, 9 IP-Cam, 1 NAS 42TB, 1 ESXi 15TB, 4 Proxmox 1TB, 1 Hyper-V 44TB, 14 x Echo, 5x FireTV, 5 x Tablett/Handy VIS || >=157 Tasmota/Shelly || >=88 ZigBee || PV 8.1kW / Akku 14kWh || 2x USV 900/750W kaskadiert || Creality CR-10 SE 3D-Drucker

                metaxaM 1 Antwort Letzte Antwort
                1
                • metaxaM metaxa

                  @Gaspode
                  Wie meinst du das?
                  Deine coole Änderung bezieht sich nur auf den Trockendurchlauf?

                  GaspodeG Offline
                  GaspodeG Offline
                  Gaspode
                  schrieb am zuletzt editiert von
                  #59

                  @metaxa said in Zurücksetzen einzelner Datenpunkte im SQL-Adapter:

                  Deine coole Änderung bezieht sich nur auf den Trockendurchlauf?

                  @bananajoe said in Zurücksetzen einzelner Datenpunkte im SQL-Adapter:

                  Das Problem beim löschen bleibt, nur das ermitteln der Anzahl der zu löschenden Werte ist optimiert worden

                  Exakt.

                  1 Antwort Letzte Antwort
                  1
                  • BananaJoeB BananaJoe

                    @metaxa sagte in Zurücksetzen einzelner Datenpunkte im SQL-Adapter:

                    @Gaspode
                    Wie meinst du das?
                    Deine coole Änderung bezieht sich nur auf den Trockendurchlauf?

                    Das Problem beim löschen bleibt, nur das ermitteln der Anzahl der zu löschenden Werte ist optimiert worden

                    metaxaM Offline
                    metaxaM Offline
                    metaxa
                    schrieb am zuletzt editiert von metaxa
                    #60

                    @bananajoe
                    ah ok! Umsomehr wäre dann am Ende des TRockendurchlaufs eine kopierbare Liste für mich der Hit! Die könnte ich dann hier
                    6fd3894f-d2dc-424b-b3a0-eb582bf479cf-image.png
                    einfügen und ausführen. Aus Sicherheitsgründen kleinere Stücke.

                    Ist aber händisch mit dem io-Log auch kein großartiges Problem, bin schon mitten drinnen.

                    Bei manchen Datenpunkten mit vielen Einträgen in der DB muss ich beim Löschen limitieren:

                    delete from ts_number where id=156 limit 500000;
                    delete from datapoints where id=156;
                    

                    DANKE für Eure Arbeit und Überlegungen!

                    1 Antwort Letzte Antwort
                    0
                    • GaspodeG Offline
                      GaspodeG Offline
                      Gaspode
                      schrieb am zuletzt editiert von Gaspode
                      #61

                      Hallo,

                      noch zwei Ergänzungen:

                      • Wenn ein Alias für einen Datenpunkt vergeben ist, wird das berücksichtigt
                      • Am Ende eines Trockenlaufs werden SQL Delete Statements zum manuellen Löschen ausgegeben

                      Dabei habe ich noch einen kleinen Fehler am Anfang korrigiert: sendTo kann nicht mit await verwendet werden, dafür gibt es inzwischen die Funktion sendToAsync. Da diese leider im Moment noch einen Fehler hat, hab ich dafür eine Ersatzfunktion eingefügt. Ein GitHub Issue dafür gibt es schon und der Fehler wird in der nächsten Version des Javascript Adapters korrigiert sein.
                      In der Praxis hat das Verwenden von sentTo wohl keine Probleme gemacht, da der erste SQL Befehl lange genug dauerte, sodass die Liste rechtzeitig gefüllt werden konnte.

                      // SQL_Delete_Dead_Objects
                      // V0.5
                      //
                      // Changelog:
                      // ----------
                      // 10.08.2019 V0.1   Scrounger   erste Version welche nicht mehr existierende Datenpunkte anzeigt           https://forum.iobroker.net/post/289821
                      // 03.05.2022 V0.2   andi2055    erweitert das die Daten auch aus der Datenbank gelöscht werden             https://forum.iobroker.net/post/798291
                      // 01.02.2023 V0.3   BananaJoe   umgestellt das nun Datenpunkte ohne SQL-Protokollierung gefunden werden    https://forum.iobroker.net/post/939101
                      // 02.02.2023 V0.4   BananaJoe   SQL-Instanz Konfigurierbar / Datenbankname konfigurierbar
                      // 03.02.2023 V0.5   Gaspode     Speicherverbrauch beim Zählen optimiert durch Verwendung von count(*)
                      // 03.02.2023 V0.5   Gaspode     Wenn für einen Datenpunkt ein Alias vergeben ist, wird das
                      //                               anstelle des Datenpunktnamens verwendet.
                      // 03.02.2023 V0.5   Gaspode     Am Ende eines Trockenlaufs werden SQL Befehle zum manuellen Löschen 
                      //                               ausgegeben.
                      
                      // Einstellungen:
                      // Hier das löschen einschalten! false = nur anzeigen / true = anzeigen und wirklich löschen
                      const activate_delete = false;
                      
                      // Name der SQL-Instanz, normalerweiser sql.0
                      const sql_instance = 'sql.0';
                      // Name der SQL-Datenbank - Groß und Kleinschreibung beachten!
                      const sql_dbname = 'iobroker';
                      
                      // Ersatzfunktion, weil sendToAsync im Scripting-Adapter derzeit (6.1.4) buggy ist:
                      async function mySendToAsync(_adapter, cmd, msg) {
                          return new Promise((resolve, reject) => {
                              sendTo(_adapter, cmd, msg, res => {
                                  if (!res || res.error) {
                                      reject(res ? res.error : new Error('Unknown error'));
                                  } else {
                                      resolve(res);
                                  }
                              });
                          });
                      }
                      
                      
                      // Funktion zum Suchen und Löschen
                      async function wartung() {
                          try {
                              let sqlDeleteStatements = new Array();
                      
                              // Alle Datenpunkte holen bei welchen die SQL-Protokollierung aktiv ist:
                              let datapointsActiveArray = new Array();
                              const result = await mySendToAsync(sql_instance, 'getEnabledDPs', {});
                      
                              for (const i in result) {
                                  datapointsActiveArray.push(result[i].aliasId.length == 0 ? i : result[i].aliasId);
                              }
                      
                              // alle Datenpunkte aus Db holen
                              let datapoints = await getQueryResult(`SELECT name, id, type FROM ${sql_dbname}.datapoints`);
                              if (datapoints) {
                                  let count = 0;
                                  let sum = 0;
                      
                                  // Datenpunkte durchlaufen
                                  for (const datapoint of datapoints) {
                                      // prüfen ob kein Objekt in ioBroker existiert
                                      // if (!getObject(datapoint.name)) {
                      
                                      // prüfen ob SQL-Protokollierung nicht aktiv ist
                                      if (!datapointsActiveArray.includes(datapoint.name)) {
                                          count++;
                      
                                          // Daten des Datenpunktes in Tabelle 'ts_bool' zählen
                                          let countBool = 0;
                                          let booleanTableItems = await getQueryResult(`SELECT count(*) as cnt FROM ${sql_dbname}.ts_bool WHERE id = ${datapoint.id}`);
                                          if (booleanTableItems && booleanTableItems[0].cnt > 0) {
                                              countBool = booleanTableItems[0].cnt;
                                              if (activate_delete) {
                                                  sendTo(sql_instance, 'query', `DELETE FROM ${sql_dbname}.ts_bool WHERE id = ${datapoint.id}`, function (result) {
                                                      if (result.error) {
                                                          console.error(result.error);
                                                      } else {
                                                          // show result
                                                          console.log('Rows: ' + JSON.stringify(result.result));
                                                      }
                                                  });
                                              }
                                              else {
                                                  sqlDeleteStatements.push(`DELETE FROM ${sql_dbname}.ts_bool WHERE id = ${datapoint.id};`);
                                              }
                                          }
                      
                                          // Daten des Datenpunktes in Tabelle 'ts_number' zählen
                                          let countNumber = 0;
                                          let numberTableItems = await getQueryResult(`SELECT count(*) as cnt FROM ${sql_dbname}.ts_number WHERE id = ${datapoint.id}`);
                                          if (numberTableItems && numberTableItems[0].cnt > 0) {
                                              countNumber = numberTableItems[0].cnt;
                                              if (activate_delete) {
                                                  sendTo(sql_instance, 'query', `DELETE FROM ${sql_dbname}.ts_number WHERE id = ${datapoint.id}`, function (result) {
                                                      if (result.error) {
                                                          console.error(result.error);
                                                      } else {
                                                          // show result
                                                          console.log('Rows: ' + JSON.stringify(result.result));
                                                      }
                                                  });
                                              }
                                              else {
                                                  sqlDeleteStatements.push(`DELETE FROM ${sql_dbname}.ts_number WHERE id = ${datapoint.id};`);
                                              }
                                          }
                      
                                          // Daten des Datenpunktes in Tabelle 'ts_string' zählen
                                          let countString = 0;
                      
                                          let stringTableItems = await getQueryResult(`SELECT count(*) as cnt FROM ${sql_dbname}.ts_string WHERE id = ${datapoint.id}`);
                      
                                          if (stringTableItems && stringTableItems[0].cnt > 0) {
                      
                                              countString = stringTableItems[0].cnt;
                      
                                              if (activate_delete) {
                                                  sendTo(sql_instance, 'query', `DELETE FROM ${sql_dbname}.ts_string WHERE id = ${datapoint.id}`, function (result) {
                                                      if (result.error) {
                                                          console.error(result.error);
                                                      } else {
                                                          // show result
                                                          console.log('Rows: ' + JSON.stringify(result.result));
                                                      }
                                                  });
                                              }
                                              else {
                                                  sqlDeleteStatements.push(`DELETE FROM ${sql_dbname}.ts_string WHERE id = ${datapoint.id};`);
                                              }
                                          }
                      
                                          if (activate_delete) {
                                              sendTo(sql_instance, 'query', `DELETE FROM ${sql_dbname}.datapoints WHERE id = ${datapoint.id}`, function (result) {
                                                  if (result.error) {
                                                      console.error(result.error);
                                                  } else {
                                                      // show result
                                                      console.log('Rows: ' + JSON.stringify(result.result));
                                                  }
                                              });
                                          }
                                          else {
                                              sqlDeleteStatements.push(`DELETE FROM ${sql_dbname}.datapoints WHERE id = ${datapoint.id};`);
                                          }
                      
                                          console.warn(`DB id: ${datapoint.id} (type: ${datapoint.type}) -> number: ${countNumber}, string: ${countString}, bool: ${countBool} | ioBroker id: '${datapoint.name}'`);
                                          sum = sum + countBool + countNumber + countString;
                                      }
                                  }
                                  console.warn(`${count} Objects found, that not exist anymore in ioBroker, sum of items in tables: ${sum.toLocaleString().replace(/,/g, ".")}`);
                      
                                  if (!activate_delete) {
                                      console.log('Löschen war bei diesem Durchlauf nicht aktiviert. Du kannst die Daten mit den folgenden Kommandos manuell in SQL löschen:');
                                      sqlDeleteStatements.forEach(element => console.log(element));
                                  }
                              }
                          } catch (err) {
                              console.error(`[wartung] error: ${err.message}`);
                              console.error(`[wartung] stack: ${err.stack}`);
                          }
                      }
                      
                      async function getQueryResult(query) {
                          return new Promise((resolve, reject) => {
                              sendTo(sql_instance, 'query', query, function (result) {
                                  if (!result.error) {
                                      resolve(result.result);
                                  } else {
                                      resolve(null);
                                  }
                              });
                          });
                      }
                      
                      wartung();
                      
                      metaxaM liv-in-skyL BananaJoeB 3 Antworten Letzte Antwort
                      3
                      • GaspodeG Gaspode

                        Hallo,

                        noch zwei Ergänzungen:

                        • Wenn ein Alias für einen Datenpunkt vergeben ist, wird das berücksichtigt
                        • Am Ende eines Trockenlaufs werden SQL Delete Statements zum manuellen Löschen ausgegeben

                        Dabei habe ich noch einen kleinen Fehler am Anfang korrigiert: sendTo kann nicht mit await verwendet werden, dafür gibt es inzwischen die Funktion sendToAsync. Da diese leider im Moment noch einen Fehler hat, hab ich dafür eine Ersatzfunktion eingefügt. Ein GitHub Issue dafür gibt es schon und der Fehler wird in der nächsten Version des Javascript Adapters korrigiert sein.
                        In der Praxis hat das Verwenden von sentTo wohl keine Probleme gemacht, da der erste SQL Befehl lange genug dauerte, sodass die Liste rechtzeitig gefüllt werden konnte.

                        // SQL_Delete_Dead_Objects
                        // V0.5
                        //
                        // Changelog:
                        // ----------
                        // 10.08.2019 V0.1   Scrounger   erste Version welche nicht mehr existierende Datenpunkte anzeigt           https://forum.iobroker.net/post/289821
                        // 03.05.2022 V0.2   andi2055    erweitert das die Daten auch aus der Datenbank gelöscht werden             https://forum.iobroker.net/post/798291
                        // 01.02.2023 V0.3   BananaJoe   umgestellt das nun Datenpunkte ohne SQL-Protokollierung gefunden werden    https://forum.iobroker.net/post/939101
                        // 02.02.2023 V0.4   BananaJoe   SQL-Instanz Konfigurierbar / Datenbankname konfigurierbar
                        // 03.02.2023 V0.5   Gaspode     Speicherverbrauch beim Zählen optimiert durch Verwendung von count(*)
                        // 03.02.2023 V0.5   Gaspode     Wenn für einen Datenpunkt ein Alias vergeben ist, wird das
                        //                               anstelle des Datenpunktnamens verwendet.
                        // 03.02.2023 V0.5   Gaspode     Am Ende eines Trockenlaufs werden SQL Befehle zum manuellen Löschen 
                        //                               ausgegeben.
                        
                        // Einstellungen:
                        // Hier das löschen einschalten! false = nur anzeigen / true = anzeigen und wirklich löschen
                        const activate_delete = false;
                        
                        // Name der SQL-Instanz, normalerweiser sql.0
                        const sql_instance = 'sql.0';
                        // Name der SQL-Datenbank - Groß und Kleinschreibung beachten!
                        const sql_dbname = 'iobroker';
                        
                        // Ersatzfunktion, weil sendToAsync im Scripting-Adapter derzeit (6.1.4) buggy ist:
                        async function mySendToAsync(_adapter, cmd, msg) {
                            return new Promise((resolve, reject) => {
                                sendTo(_adapter, cmd, msg, res => {
                                    if (!res || res.error) {
                                        reject(res ? res.error : new Error('Unknown error'));
                                    } else {
                                        resolve(res);
                                    }
                                });
                            });
                        }
                        
                        
                        // Funktion zum Suchen und Löschen
                        async function wartung() {
                            try {
                                let sqlDeleteStatements = new Array();
                        
                                // Alle Datenpunkte holen bei welchen die SQL-Protokollierung aktiv ist:
                                let datapointsActiveArray = new Array();
                                const result = await mySendToAsync(sql_instance, 'getEnabledDPs', {});
                        
                                for (const i in result) {
                                    datapointsActiveArray.push(result[i].aliasId.length == 0 ? i : result[i].aliasId);
                                }
                        
                                // alle Datenpunkte aus Db holen
                                let datapoints = await getQueryResult(`SELECT name, id, type FROM ${sql_dbname}.datapoints`);
                                if (datapoints) {
                                    let count = 0;
                                    let sum = 0;
                        
                                    // Datenpunkte durchlaufen
                                    for (const datapoint of datapoints) {
                                        // prüfen ob kein Objekt in ioBroker existiert
                                        // if (!getObject(datapoint.name)) {
                        
                                        // prüfen ob SQL-Protokollierung nicht aktiv ist
                                        if (!datapointsActiveArray.includes(datapoint.name)) {
                                            count++;
                        
                                            // Daten des Datenpunktes in Tabelle 'ts_bool' zählen
                                            let countBool = 0;
                                            let booleanTableItems = await getQueryResult(`SELECT count(*) as cnt FROM ${sql_dbname}.ts_bool WHERE id = ${datapoint.id}`);
                                            if (booleanTableItems && booleanTableItems[0].cnt > 0) {
                                                countBool = booleanTableItems[0].cnt;
                                                if (activate_delete) {
                                                    sendTo(sql_instance, 'query', `DELETE FROM ${sql_dbname}.ts_bool WHERE id = ${datapoint.id}`, function (result) {
                                                        if (result.error) {
                                                            console.error(result.error);
                                                        } else {
                                                            // show result
                                                            console.log('Rows: ' + JSON.stringify(result.result));
                                                        }
                                                    });
                                                }
                                                else {
                                                    sqlDeleteStatements.push(`DELETE FROM ${sql_dbname}.ts_bool WHERE id = ${datapoint.id};`);
                                                }
                                            }
                        
                                            // Daten des Datenpunktes in Tabelle 'ts_number' zählen
                                            let countNumber = 0;
                                            let numberTableItems = await getQueryResult(`SELECT count(*) as cnt FROM ${sql_dbname}.ts_number WHERE id = ${datapoint.id}`);
                                            if (numberTableItems && numberTableItems[0].cnt > 0) {
                                                countNumber = numberTableItems[0].cnt;
                                                if (activate_delete) {
                                                    sendTo(sql_instance, 'query', `DELETE FROM ${sql_dbname}.ts_number WHERE id = ${datapoint.id}`, function (result) {
                                                        if (result.error) {
                                                            console.error(result.error);
                                                        } else {
                                                            // show result
                                                            console.log('Rows: ' + JSON.stringify(result.result));
                                                        }
                                                    });
                                                }
                                                else {
                                                    sqlDeleteStatements.push(`DELETE FROM ${sql_dbname}.ts_number WHERE id = ${datapoint.id};`);
                                                }
                                            }
                        
                                            // Daten des Datenpunktes in Tabelle 'ts_string' zählen
                                            let countString = 0;
                        
                                            let stringTableItems = await getQueryResult(`SELECT count(*) as cnt FROM ${sql_dbname}.ts_string WHERE id = ${datapoint.id}`);
                        
                                            if (stringTableItems && stringTableItems[0].cnt > 0) {
                        
                                                countString = stringTableItems[0].cnt;
                        
                                                if (activate_delete) {
                                                    sendTo(sql_instance, 'query', `DELETE FROM ${sql_dbname}.ts_string WHERE id = ${datapoint.id}`, function (result) {
                                                        if (result.error) {
                                                            console.error(result.error);
                                                        } else {
                                                            // show result
                                                            console.log('Rows: ' + JSON.stringify(result.result));
                                                        }
                                                    });
                                                }
                                                else {
                                                    sqlDeleteStatements.push(`DELETE FROM ${sql_dbname}.ts_string WHERE id = ${datapoint.id};`);
                                                }
                                            }
                        
                                            if (activate_delete) {
                                                sendTo(sql_instance, 'query', `DELETE FROM ${sql_dbname}.datapoints WHERE id = ${datapoint.id}`, function (result) {
                                                    if (result.error) {
                                                        console.error(result.error);
                                                    } else {
                                                        // show result
                                                        console.log('Rows: ' + JSON.stringify(result.result));
                                                    }
                                                });
                                            }
                                            else {
                                                sqlDeleteStatements.push(`DELETE FROM ${sql_dbname}.datapoints WHERE id = ${datapoint.id};`);
                                            }
                        
                                            console.warn(`DB id: ${datapoint.id} (type: ${datapoint.type}) -> number: ${countNumber}, string: ${countString}, bool: ${countBool} | ioBroker id: '${datapoint.name}'`);
                                            sum = sum + countBool + countNumber + countString;
                                        }
                                    }
                                    console.warn(`${count} Objects found, that not exist anymore in ioBroker, sum of items in tables: ${sum.toLocaleString().replace(/,/g, ".")}`);
                        
                                    if (!activate_delete) {
                                        console.log('Löschen war bei diesem Durchlauf nicht aktiviert. Du kannst die Daten mit den folgenden Kommandos manuell in SQL löschen:');
                                        sqlDeleteStatements.forEach(element => console.log(element));
                                    }
                                }
                            } catch (err) {
                                console.error(`[wartung] error: ${err.message}`);
                                console.error(`[wartung] stack: ${err.stack}`);
                            }
                        }
                        
                        async function getQueryResult(query) {
                            return new Promise((resolve, reject) => {
                                sendTo(sql_instance, 'query', query, function (result) {
                                    if (!result.error) {
                                        resolve(result.result);
                                    } else {
                                        resolve(null);
                                    }
                                });
                            });
                        }
                        
                        wartung();
                        
                        metaxaM Offline
                        metaxaM Offline
                        metaxa
                        schrieb am zuletzt editiert von metaxa
                        #62

                        @gaspode

                        Mega!!!!!!!

                        javascript.0 (2778652) script.js.010_Testen.SQL_3_Datenpunkte_löschen: Löschen war bei diesem Durchlauf nicht aktiviert. Du kannst die Daten mit den folgenden Kommandos manuell in SQL löschen:

                        Herzlichen Dank!

                        GaspodeG 1 Antwort Letzte Antwort
                        0
                        • metaxaM metaxa

                          @gaspode

                          Mega!!!!!!!

                          javascript.0 (2778652) script.js.010_Testen.SQL_3_Datenpunkte_löschen: Löschen war bei diesem Durchlauf nicht aktiviert. Du kannst die Daten mit den folgenden Kommandos manuell in SQL löschen:

                          Herzlichen Dank!

                          GaspodeG Offline
                          GaspodeG Offline
                          Gaspode
                          schrieb am zuletzt editiert von Gaspode
                          #63

                          @metaxa said in Zurücksetzen einzelner Datenpunkte im SQL-Adapter:

                          Herzlichen Dank!

                          Gerne. Und den Tippfehler hab ich auch gleich korrigiert (munuell -> manuell). 😄

                          1 Antwort Letzte Antwort
                          1
                          • GaspodeG Gaspode

                            Hallo,

                            noch zwei Ergänzungen:

                            • Wenn ein Alias für einen Datenpunkt vergeben ist, wird das berücksichtigt
                            • Am Ende eines Trockenlaufs werden SQL Delete Statements zum manuellen Löschen ausgegeben

                            Dabei habe ich noch einen kleinen Fehler am Anfang korrigiert: sendTo kann nicht mit await verwendet werden, dafür gibt es inzwischen die Funktion sendToAsync. Da diese leider im Moment noch einen Fehler hat, hab ich dafür eine Ersatzfunktion eingefügt. Ein GitHub Issue dafür gibt es schon und der Fehler wird in der nächsten Version des Javascript Adapters korrigiert sein.
                            In der Praxis hat das Verwenden von sentTo wohl keine Probleme gemacht, da der erste SQL Befehl lange genug dauerte, sodass die Liste rechtzeitig gefüllt werden konnte.

                            // SQL_Delete_Dead_Objects
                            // V0.5
                            //
                            // Changelog:
                            // ----------
                            // 10.08.2019 V0.1   Scrounger   erste Version welche nicht mehr existierende Datenpunkte anzeigt           https://forum.iobroker.net/post/289821
                            // 03.05.2022 V0.2   andi2055    erweitert das die Daten auch aus der Datenbank gelöscht werden             https://forum.iobroker.net/post/798291
                            // 01.02.2023 V0.3   BananaJoe   umgestellt das nun Datenpunkte ohne SQL-Protokollierung gefunden werden    https://forum.iobroker.net/post/939101
                            // 02.02.2023 V0.4   BananaJoe   SQL-Instanz Konfigurierbar / Datenbankname konfigurierbar
                            // 03.02.2023 V0.5   Gaspode     Speicherverbrauch beim Zählen optimiert durch Verwendung von count(*)
                            // 03.02.2023 V0.5   Gaspode     Wenn für einen Datenpunkt ein Alias vergeben ist, wird das
                            //                               anstelle des Datenpunktnamens verwendet.
                            // 03.02.2023 V0.5   Gaspode     Am Ende eines Trockenlaufs werden SQL Befehle zum manuellen Löschen 
                            //                               ausgegeben.
                            
                            // Einstellungen:
                            // Hier das löschen einschalten! false = nur anzeigen / true = anzeigen und wirklich löschen
                            const activate_delete = false;
                            
                            // Name der SQL-Instanz, normalerweiser sql.0
                            const sql_instance = 'sql.0';
                            // Name der SQL-Datenbank - Groß und Kleinschreibung beachten!
                            const sql_dbname = 'iobroker';
                            
                            // Ersatzfunktion, weil sendToAsync im Scripting-Adapter derzeit (6.1.4) buggy ist:
                            async function mySendToAsync(_adapter, cmd, msg) {
                                return new Promise((resolve, reject) => {
                                    sendTo(_adapter, cmd, msg, res => {
                                        if (!res || res.error) {
                                            reject(res ? res.error : new Error('Unknown error'));
                                        } else {
                                            resolve(res);
                                        }
                                    });
                                });
                            }
                            
                            
                            // Funktion zum Suchen und Löschen
                            async function wartung() {
                                try {
                                    let sqlDeleteStatements = new Array();
                            
                                    // Alle Datenpunkte holen bei welchen die SQL-Protokollierung aktiv ist:
                                    let datapointsActiveArray = new Array();
                                    const result = await mySendToAsync(sql_instance, 'getEnabledDPs', {});
                            
                                    for (const i in result) {
                                        datapointsActiveArray.push(result[i].aliasId.length == 0 ? i : result[i].aliasId);
                                    }
                            
                                    // alle Datenpunkte aus Db holen
                                    let datapoints = await getQueryResult(`SELECT name, id, type FROM ${sql_dbname}.datapoints`);
                                    if (datapoints) {
                                        let count = 0;
                                        let sum = 0;
                            
                                        // Datenpunkte durchlaufen
                                        for (const datapoint of datapoints) {
                                            // prüfen ob kein Objekt in ioBroker existiert
                                            // if (!getObject(datapoint.name)) {
                            
                                            // prüfen ob SQL-Protokollierung nicht aktiv ist
                                            if (!datapointsActiveArray.includes(datapoint.name)) {
                                                count++;
                            
                                                // Daten des Datenpunktes in Tabelle 'ts_bool' zählen
                                                let countBool = 0;
                                                let booleanTableItems = await getQueryResult(`SELECT count(*) as cnt FROM ${sql_dbname}.ts_bool WHERE id = ${datapoint.id}`);
                                                if (booleanTableItems && booleanTableItems[0].cnt > 0) {
                                                    countBool = booleanTableItems[0].cnt;
                                                    if (activate_delete) {
                                                        sendTo(sql_instance, 'query', `DELETE FROM ${sql_dbname}.ts_bool WHERE id = ${datapoint.id}`, function (result) {
                                                            if (result.error) {
                                                                console.error(result.error);
                                                            } else {
                                                                // show result
                                                                console.log('Rows: ' + JSON.stringify(result.result));
                                                            }
                                                        });
                                                    }
                                                    else {
                                                        sqlDeleteStatements.push(`DELETE FROM ${sql_dbname}.ts_bool WHERE id = ${datapoint.id};`);
                                                    }
                                                }
                            
                                                // Daten des Datenpunktes in Tabelle 'ts_number' zählen
                                                let countNumber = 0;
                                                let numberTableItems = await getQueryResult(`SELECT count(*) as cnt FROM ${sql_dbname}.ts_number WHERE id = ${datapoint.id}`);
                                                if (numberTableItems && numberTableItems[0].cnt > 0) {
                                                    countNumber = numberTableItems[0].cnt;
                                                    if (activate_delete) {
                                                        sendTo(sql_instance, 'query', `DELETE FROM ${sql_dbname}.ts_number WHERE id = ${datapoint.id}`, function (result) {
                                                            if (result.error) {
                                                                console.error(result.error);
                                                            } else {
                                                                // show result
                                                                console.log('Rows: ' + JSON.stringify(result.result));
                                                            }
                                                        });
                                                    }
                                                    else {
                                                        sqlDeleteStatements.push(`DELETE FROM ${sql_dbname}.ts_number WHERE id = ${datapoint.id};`);
                                                    }
                                                }
                            
                                                // Daten des Datenpunktes in Tabelle 'ts_string' zählen
                                                let countString = 0;
                            
                                                let stringTableItems = await getQueryResult(`SELECT count(*) as cnt FROM ${sql_dbname}.ts_string WHERE id = ${datapoint.id}`);
                            
                                                if (stringTableItems && stringTableItems[0].cnt > 0) {
                            
                                                    countString = stringTableItems[0].cnt;
                            
                                                    if (activate_delete) {
                                                        sendTo(sql_instance, 'query', `DELETE FROM ${sql_dbname}.ts_string WHERE id = ${datapoint.id}`, function (result) {
                                                            if (result.error) {
                                                                console.error(result.error);
                                                            } else {
                                                                // show result
                                                                console.log('Rows: ' + JSON.stringify(result.result));
                                                            }
                                                        });
                                                    }
                                                    else {
                                                        sqlDeleteStatements.push(`DELETE FROM ${sql_dbname}.ts_string WHERE id = ${datapoint.id};`);
                                                    }
                                                }
                            
                                                if (activate_delete) {
                                                    sendTo(sql_instance, 'query', `DELETE FROM ${sql_dbname}.datapoints WHERE id = ${datapoint.id}`, function (result) {
                                                        if (result.error) {
                                                            console.error(result.error);
                                                        } else {
                                                            // show result
                                                            console.log('Rows: ' + JSON.stringify(result.result));
                                                        }
                                                    });
                                                }
                                                else {
                                                    sqlDeleteStatements.push(`DELETE FROM ${sql_dbname}.datapoints WHERE id = ${datapoint.id};`);
                                                }
                            
                                                console.warn(`DB id: ${datapoint.id} (type: ${datapoint.type}) -> number: ${countNumber}, string: ${countString}, bool: ${countBool} | ioBroker id: '${datapoint.name}'`);
                                                sum = sum + countBool + countNumber + countString;
                                            }
                                        }
                                        console.warn(`${count} Objects found, that not exist anymore in ioBroker, sum of items in tables: ${sum.toLocaleString().replace(/,/g, ".")}`);
                            
                                        if (!activate_delete) {
                                            console.log('Löschen war bei diesem Durchlauf nicht aktiviert. Du kannst die Daten mit den folgenden Kommandos manuell in SQL löschen:');
                                            sqlDeleteStatements.forEach(element => console.log(element));
                                        }
                                    }
                                } catch (err) {
                                    console.error(`[wartung] error: ${err.message}`);
                                    console.error(`[wartung] stack: ${err.stack}`);
                                }
                            }
                            
                            async function getQueryResult(query) {
                                return new Promise((resolve, reject) => {
                                    sendTo(sql_instance, 'query', query, function (result) {
                                        if (!result.error) {
                                            resolve(result.result);
                                        } else {
                                            resolve(null);
                                        }
                                    });
                                });
                            }
                            
                            wartung();
                            
                            liv-in-skyL Offline
                            liv-in-skyL Offline
                            liv-in-sky
                            schrieb am zuletzt editiert von
                            #64

                            @gaspode
                            @BananaJoe

                            lief durch - hat gefunden und gelöscht - keine fehler - 👍

                            nach einem gelösten Thread wäre es sinnvoll dies in der Überschrift des ersten Posts einzutragen [gelöst]-... Bitte benutzt das Voting rechts unten im Beitrag wenn er euch geholfen hat. Forum-Tools: PicPick https://picpick.app/en/download/ und ScreenToGif https://www.screentogif.com/downloads.html

                            GaspodeG 1 Antwort Letzte Antwort
                            0
                            • liv-in-skyL liv-in-sky

                              @gaspode
                              @BananaJoe

                              lief durch - hat gefunden und gelöscht - keine fehler - 👍

                              GaspodeG Offline
                              GaspodeG Offline
                              Gaspode
                              schrieb am zuletzt editiert von
                              #65

                              @liv-in-sky said in Zurücksetzen einzelner Datenpunkte im SQL-Adapter:

                              lief durch - hat gefunden und gelöscht - keine fehler -

                              Freut mich.

                              Evtl. könnte man etwas in der Form ja als "Purge" oder so in den SQL Adapter einbauen. Dafür müsste natürlich das Lastproblem beim Löschen gelöst sein und man müsste es gut für andere Datenbank-Typen testen.

                              liv-in-skyL 1 Antwort Letzte Antwort
                              0
                              • GaspodeG Gaspode

                                @liv-in-sky said in Zurücksetzen einzelner Datenpunkte im SQL-Adapter:

                                lief durch - hat gefunden und gelöscht - keine fehler -

                                Freut mich.

                                Evtl. könnte man etwas in der Form ja als "Purge" oder so in den SQL Adapter einbauen. Dafür müsste natürlich das Lastproblem beim Löschen gelöst sein und man müsste es gut für andere Datenbank-Typen testen.

                                liv-in-skyL Offline
                                liv-in-skyL Offline
                                liv-in-sky
                                schrieb am zuletzt editiert von
                                #66

                                @gaspode denke, da wäre apollon77 der ansprechpartner

                                nach einem gelösten Thread wäre es sinnvoll dies in der Überschrift des ersten Posts einzutragen [gelöst]-... Bitte benutzt das Voting rechts unten im Beitrag wenn er euch geholfen hat. Forum-Tools: PicPick https://picpick.app/en/download/ und ScreenToGif https://www.screentogif.com/downloads.html

                                GaspodeG 1 Antwort Letzte Antwort
                                0
                                • liv-in-skyL liv-in-sky

                                  @gaspode denke, da wäre apollon77 der ansprechpartner

                                  GaspodeG Offline
                                  GaspodeG Offline
                                  Gaspode
                                  schrieb am zuletzt editiert von
                                  #67

                                  @liv-in-sky said in Zurücksetzen einzelner Datenpunkte im SQL-Adapter:

                                  @gaspode denke, da wäre apollon77 der ansprechpartner

                                  Ja denke ich auch. Ich will ihn nur nicht damit belasten, solange das nicht etwas konkreter ist. 🙂

                                  1 Antwort Letzte Antwort
                                  1
                                  • A Offline
                                    A Offline
                                    andi2055
                                    schrieb am zuletzt editiert von andi2055
                                    #68

                                    https://github.com/ioBroker/ioBroker.sql/issues/247

                                    Ihr könnt ja nochmal genau beschreiben was wir möchten (nicht einzeln löschen) und "voten"...
                                    Danke für die Updates!

                                    PS: auch mal prüfen ob das hilft/mittlerweile funktioniert (bei mir zeitlich aktuell schwierig)
                                    https://github.com/ioBroker/ioBroker.sql/issues/207

                                    1 Antwort Letzte Antwort
                                    0
                                    • P Offline
                                      P Offline
                                      PrinzEisenherz1
                                      schrieb am zuletzt editiert von
                                      #69

                                      Hi zusammen, mal ne Frage.
                                      Gibt es diese Möglichkeit auch für influxdb?

                                      Gruß Johnny

                                      Intel-NUC mit ProxMox: ioBroker,SQL, logging Strom- Gas- u. Wasserzähler;10Zoll Tab im Flur für VIS; weiteres: Homematic CCU2, Homeduino, Kameras, selbstgebaute Wetterstation;

                                      1 Antwort Letzte Antwort
                                      0
                                      • GaspodeG Gaspode

                                        Hallo,

                                        noch zwei Ergänzungen:

                                        • Wenn ein Alias für einen Datenpunkt vergeben ist, wird das berücksichtigt
                                        • Am Ende eines Trockenlaufs werden SQL Delete Statements zum manuellen Löschen ausgegeben

                                        Dabei habe ich noch einen kleinen Fehler am Anfang korrigiert: sendTo kann nicht mit await verwendet werden, dafür gibt es inzwischen die Funktion sendToAsync. Da diese leider im Moment noch einen Fehler hat, hab ich dafür eine Ersatzfunktion eingefügt. Ein GitHub Issue dafür gibt es schon und der Fehler wird in der nächsten Version des Javascript Adapters korrigiert sein.
                                        In der Praxis hat das Verwenden von sentTo wohl keine Probleme gemacht, da der erste SQL Befehl lange genug dauerte, sodass die Liste rechtzeitig gefüllt werden konnte.

                                        // SQL_Delete_Dead_Objects
                                        // V0.5
                                        //
                                        // Changelog:
                                        // ----------
                                        // 10.08.2019 V0.1   Scrounger   erste Version welche nicht mehr existierende Datenpunkte anzeigt           https://forum.iobroker.net/post/289821
                                        // 03.05.2022 V0.2   andi2055    erweitert das die Daten auch aus der Datenbank gelöscht werden             https://forum.iobroker.net/post/798291
                                        // 01.02.2023 V0.3   BananaJoe   umgestellt das nun Datenpunkte ohne SQL-Protokollierung gefunden werden    https://forum.iobroker.net/post/939101
                                        // 02.02.2023 V0.4   BananaJoe   SQL-Instanz Konfigurierbar / Datenbankname konfigurierbar
                                        // 03.02.2023 V0.5   Gaspode     Speicherverbrauch beim Zählen optimiert durch Verwendung von count(*)
                                        // 03.02.2023 V0.5   Gaspode     Wenn für einen Datenpunkt ein Alias vergeben ist, wird das
                                        //                               anstelle des Datenpunktnamens verwendet.
                                        // 03.02.2023 V0.5   Gaspode     Am Ende eines Trockenlaufs werden SQL Befehle zum manuellen Löschen 
                                        //                               ausgegeben.
                                        
                                        // Einstellungen:
                                        // Hier das löschen einschalten! false = nur anzeigen / true = anzeigen und wirklich löschen
                                        const activate_delete = false;
                                        
                                        // Name der SQL-Instanz, normalerweiser sql.0
                                        const sql_instance = 'sql.0';
                                        // Name der SQL-Datenbank - Groß und Kleinschreibung beachten!
                                        const sql_dbname = 'iobroker';
                                        
                                        // Ersatzfunktion, weil sendToAsync im Scripting-Adapter derzeit (6.1.4) buggy ist:
                                        async function mySendToAsync(_adapter, cmd, msg) {
                                            return new Promise((resolve, reject) => {
                                                sendTo(_adapter, cmd, msg, res => {
                                                    if (!res || res.error) {
                                                        reject(res ? res.error : new Error('Unknown error'));
                                                    } else {
                                                        resolve(res);
                                                    }
                                                });
                                            });
                                        }
                                        
                                        
                                        // Funktion zum Suchen und Löschen
                                        async function wartung() {
                                            try {
                                                let sqlDeleteStatements = new Array();
                                        
                                                // Alle Datenpunkte holen bei welchen die SQL-Protokollierung aktiv ist:
                                                let datapointsActiveArray = new Array();
                                                const result = await mySendToAsync(sql_instance, 'getEnabledDPs', {});
                                        
                                                for (const i in result) {
                                                    datapointsActiveArray.push(result[i].aliasId.length == 0 ? i : result[i].aliasId);
                                                }
                                        
                                                // alle Datenpunkte aus Db holen
                                                let datapoints = await getQueryResult(`SELECT name, id, type FROM ${sql_dbname}.datapoints`);
                                                if (datapoints) {
                                                    let count = 0;
                                                    let sum = 0;
                                        
                                                    // Datenpunkte durchlaufen
                                                    for (const datapoint of datapoints) {
                                                        // prüfen ob kein Objekt in ioBroker existiert
                                                        // if (!getObject(datapoint.name)) {
                                        
                                                        // prüfen ob SQL-Protokollierung nicht aktiv ist
                                                        if (!datapointsActiveArray.includes(datapoint.name)) {
                                                            count++;
                                        
                                                            // Daten des Datenpunktes in Tabelle 'ts_bool' zählen
                                                            let countBool = 0;
                                                            let booleanTableItems = await getQueryResult(`SELECT count(*) as cnt FROM ${sql_dbname}.ts_bool WHERE id = ${datapoint.id}`);
                                                            if (booleanTableItems && booleanTableItems[0].cnt > 0) {
                                                                countBool = booleanTableItems[0].cnt;
                                                                if (activate_delete) {
                                                                    sendTo(sql_instance, 'query', `DELETE FROM ${sql_dbname}.ts_bool WHERE id = ${datapoint.id}`, function (result) {
                                                                        if (result.error) {
                                                                            console.error(result.error);
                                                                        } else {
                                                                            // show result
                                                                            console.log('Rows: ' + JSON.stringify(result.result));
                                                                        }
                                                                    });
                                                                }
                                                                else {
                                                                    sqlDeleteStatements.push(`DELETE FROM ${sql_dbname}.ts_bool WHERE id = ${datapoint.id};`);
                                                                }
                                                            }
                                        
                                                            // Daten des Datenpunktes in Tabelle 'ts_number' zählen
                                                            let countNumber = 0;
                                                            let numberTableItems = await getQueryResult(`SELECT count(*) as cnt FROM ${sql_dbname}.ts_number WHERE id = ${datapoint.id}`);
                                                            if (numberTableItems && numberTableItems[0].cnt > 0) {
                                                                countNumber = numberTableItems[0].cnt;
                                                                if (activate_delete) {
                                                                    sendTo(sql_instance, 'query', `DELETE FROM ${sql_dbname}.ts_number WHERE id = ${datapoint.id}`, function (result) {
                                                                        if (result.error) {
                                                                            console.error(result.error);
                                                                        } else {
                                                                            // show result
                                                                            console.log('Rows: ' + JSON.stringify(result.result));
                                                                        }
                                                                    });
                                                                }
                                                                else {
                                                                    sqlDeleteStatements.push(`DELETE FROM ${sql_dbname}.ts_number WHERE id = ${datapoint.id};`);
                                                                }
                                                            }
                                        
                                                            // Daten des Datenpunktes in Tabelle 'ts_string' zählen
                                                            let countString = 0;
                                        
                                                            let stringTableItems = await getQueryResult(`SELECT count(*) as cnt FROM ${sql_dbname}.ts_string WHERE id = ${datapoint.id}`);
                                        
                                                            if (stringTableItems && stringTableItems[0].cnt > 0) {
                                        
                                                                countString = stringTableItems[0].cnt;
                                        
                                                                if (activate_delete) {
                                                                    sendTo(sql_instance, 'query', `DELETE FROM ${sql_dbname}.ts_string WHERE id = ${datapoint.id}`, function (result) {
                                                                        if (result.error) {
                                                                            console.error(result.error);
                                                                        } else {
                                                                            // show result
                                                                            console.log('Rows: ' + JSON.stringify(result.result));
                                                                        }
                                                                    });
                                                                }
                                                                else {
                                                                    sqlDeleteStatements.push(`DELETE FROM ${sql_dbname}.ts_string WHERE id = ${datapoint.id};`);
                                                                }
                                                            }
                                        
                                                            if (activate_delete) {
                                                                sendTo(sql_instance, 'query', `DELETE FROM ${sql_dbname}.datapoints WHERE id = ${datapoint.id}`, function (result) {
                                                                    if (result.error) {
                                                                        console.error(result.error);
                                                                    } else {
                                                                        // show result
                                                                        console.log('Rows: ' + JSON.stringify(result.result));
                                                                    }
                                                                });
                                                            }
                                                            else {
                                                                sqlDeleteStatements.push(`DELETE FROM ${sql_dbname}.datapoints WHERE id = ${datapoint.id};`);
                                                            }
                                        
                                                            console.warn(`DB id: ${datapoint.id} (type: ${datapoint.type}) -> number: ${countNumber}, string: ${countString}, bool: ${countBool} | ioBroker id: '${datapoint.name}'`);
                                                            sum = sum + countBool + countNumber + countString;
                                                        }
                                                    }
                                                    console.warn(`${count} Objects found, that not exist anymore in ioBroker, sum of items in tables: ${sum.toLocaleString().replace(/,/g, ".")}`);
                                        
                                                    if (!activate_delete) {
                                                        console.log('Löschen war bei diesem Durchlauf nicht aktiviert. Du kannst die Daten mit den folgenden Kommandos manuell in SQL löschen:');
                                                        sqlDeleteStatements.forEach(element => console.log(element));
                                                    }
                                                }
                                            } catch (err) {
                                                console.error(`[wartung] error: ${err.message}`);
                                                console.error(`[wartung] stack: ${err.stack}`);
                                            }
                                        }
                                        
                                        async function getQueryResult(query) {
                                            return new Promise((resolve, reject) => {
                                                sendTo(sql_instance, 'query', query, function (result) {
                                                    if (!result.error) {
                                                        resolve(result.result);
                                                    } else {
                                                        resolve(null);
                                                    }
                                                });
                                            });
                                        }
                                        
                                        wartung();
                                        
                                        BananaJoeB Online
                                        BananaJoeB Online
                                        BananaJoe
                                        Most Active
                                        schrieb am zuletzt editiert von
                                        #70

                                        @gaspode Ich habe gerade bei mir 28 Shelly 1PM umorganisiert und dadurch jede Menge alter, verwaister SQL-Aufzeichnungen gehabt.

                                        Und das Skript hat prima funktioniert - einfach noch mal Danke an dieser Stelle!

                                        ioBroker@Ubuntu 24.04 LTS (VMware) für: >260 Geräte, 5 Switche, 7 AP, 9 IP-Cam, 1 NAS 42TB, 1 ESXi 15TB, 4 Proxmox 1TB, 1 Hyper-V 44TB, 14 x Echo, 5x FireTV, 5 x Tablett/Handy VIS || >=157 Tasmota/Shelly || >=88 ZigBee || PV 8.1kW / Akku 14kWh || 2x USV 900/750W kaskadiert || Creality CR-10 SE 3D-Drucker

                                        1 Antwort Letzte Antwort
                                        1
                                        • T Offline
                                          T Offline
                                          thof69
                                          schrieb am zuletzt editiert von
                                          #71

                                          Hallo zusammen,

                                          erstmal danke für das Skript, so etwas habe ich gesucht! 👍

                                          Leider erhalte ich aber beim ausführen des Skripts die Fehler

                                          javascript.0 2023-06-24 09:00:47.962 error script.js.th.DB_bereinigen: [wartung] stack: TypeError: Cannot read properties of undefined (reading 'length') at wartung (script.js.th.DB_bereinigen:50:58) at processTicksAndRejections (node:internal/process/task_queues:95:5)

                                          javascript.0 2023-06-24 09:00:47.962 error script.js.th.DB_bereinigen: [wartung] error: Cannot read properties of undefined (reading 'length')

                                          Hat jemand eine Idee, woran das liegen könnte?

                                          GaspodeG BananaJoeB 2 Antworten Letzte Antwort
                                          0
                                          Antworten
                                          • In einem neuen Thema antworten
                                          Anmelden zum Antworten
                                          • Älteste zuerst
                                          • Neuste zuerst
                                          • Meiste Stimmen


                                          Support us

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

                                          752

                                          Online

                                          32.4k

                                          Benutzer

                                          81.4k

                                          Themen

                                          1.3m

                                          Beiträge
                                          Community
                                          Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
                                          ioBroker Community 2014-2025
                                          logo
                                          • Anmelden

                                          • Du hast noch kein Konto? Registrieren

                                          • Anmelden oder registrieren, um zu suchen
                                          • Erster Beitrag
                                            Letzter Beitrag
                                          0
                                          • Aktuell
                                          • Tags
                                          • Ungelesen 0
                                          • Kategorien
                                          • Unreplied
                                          • Beliebt
                                          • GitHub
                                          • Docu
                                          • Hilfe