Skip to content
  • Home
  • 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

Community Forum

donate donate
  1. ioBroker Community Home
  2. Deutsch
  3. Skripten / Logik
  4. Zugriff auf eigene MySQL-Datenbank

NEWS

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

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

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

Zugriff auf eigene MySQL-Datenbank

Geplant Angeheftet Gesperrt Verschoben Skripten / Logik
11 Beiträge 5 Kommentatoren 6.6k Aufrufe
  • Ä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.
  • frankjokeF Offline
    frankjokeF Offline
    frankjoke
    schrieb am zuletzt editiert von
    #2

    Hatte mir mal 'n script geschrieben um auf das MySQL History zurückzugreifen (und von einem anderen System Daten zu importieren).

    `var myServer = {
            host     : 'localhost',
            port     : 0,
            user     : 'iobroker',
            password : 'iobroker',
            database : 'iobroker',
            mydebug  : true,
        };
    
    function MySQL(options) {
        if (!(this instanceof MySQL)) return new MySQL(options);
        if (!options) throw 'MySQL configuration options not set!';
    
        this.opt = options;
        this.connection = null;
        this.sqt = ["ts_number","ts_string","ts_bool"];
        this.sqd = null;
        this.sqf = null;
    
        var that = this;
    
        that.end = function(callback) {
            if (that.connection) {
                that.connection.end(callback);
                that.connection = null;
            } else
                log("No connection to stop!");
        };
    
        that.getConn = function() { return that.connection; };
        that.getSqt = function() { return that.sqt; };
        that.getSqd = function() { return that.sqd; };
        that.getSqf = function() { return that.sqf; };
        that.getOpt = function() { return that.opt; };
    
        that.convArr = function(arr,name) {
            o = {};
            for (var i=0; i<arr.length; 0/++i)/{/var/e="arr[i];" if/(e[name])/o[e[name]]="e;" }/return/o;/};/that.start="function" (callback)/conn="mysql.createConnection(that.opt);" (that.connection)/that.stopconnection();/conn.connect(function/(err)/that.connection="null;" callback/&&/callback(err);/else/that.querymysql("select/*/from/sources",/function(rows,fields)/(!rows)/callback(fields);/that.sqf="that.convArr(rows,&quot;name&quot;);" if(that.opt.mydebug)/logj("from/table",that.sqf);/datapoints",/that.sqd="that.convArr(rows,&quot;name&quot;);" logj("datapoints/table",that.sqd);/callback(null);/});/that.querymysql="function(query,callback)" if(!that.connection)/logj("no/connection/to/mysql!",that.opt,"warn");/null;/(query.substr(-1,1)/!="=" ';')/query="query" +/";";/logs("start/query:/"+/query,"debug2","darkgreen");/nexttick();/that.connection.query(query,/function(err,/rows,/fields)/logj("query/sql/err:",err);/callback(null,err);/f="fields" ||/[];/r="rows.length" 0;/logs("success/returned/"+f.length/"/colums/and/datasets","debug2","green");/console.log('the/solution/is:/'+/rows[0].name);/callback(rows,fields);/that.getidn="function(ids)" if(!that.sqd)/logs("no/sqd/data/found/in/mysql.getidn()!");/idn="that.sqd[ids];" (!idn)/logs("id/not/found,/findentry:"+ids,"warn");/idn;/that.gettyp="function(idn)" if(!idn)/mysql.gettyp()!");/table="that.sqt[idn.type];" (!table)/tt="[&quot;number&quot;,&quot;boolean&quot;,&quot;string&quot;].indexOf(idn.type);" (tt<0)/logj("type/findentry:",idn,"warn");/table;/that.findentry="function(ids,ts,callback,opt)" (!callback/!ids/!ts)/logs("wrong/arguments/mysql.findentry(id,ts,callback,opt)!");/(idn)/logs("type/findentry:"+idn.ytpe,"warn");/+"/where/ts=" + ts +" id="+idn.id;
                that.queryMySQL(sql,function(rows,fields) {
                    if (callback &amp;&amp; rows &amp;&amp; fields &amp;&amp; rows.length>0) {
                        var cnt = rows[0]['COUNT(*)'];
    //                    logs(" rows/was/+cnt);/(!cnt/cnt="==0)" callback(null,opt);/callback(ids,opt);/get/history/optionally/limited/by/fro0m/timestamts/timestamps./no/then/until/now,/anf/all/that.gethistory="function(ids,callback,from_ts,to_ts)" if(!callback/!ids)/mysql.gethistory(id,ts,callback,opt)!");/idt="that.getTyp(idn);">=" + from_ts;
                else {
                    if(from_ts > to_ts) {
                        var i = from_ts;
                        from_ts = to_ts;
                        to_ts = i;
                    }
                sql += " AND ts>="+ from_ts + " AND ts<=" + to_ts;
                }
            }
            that.queryMySQL(sql, callback);
        };
    
        that.addToHistory = function(ids,item,callback) {
            if(!callback || !item)
                return logs("Wrong arguments in MySQL.addToHistory(ids,item,callback)!");
            if(that.opt.mydebug)
                logj("MySQL.addToHistory "+ ids ,item,"debug2","darkgreen");
            var idn = that.getIdn(ids);
            var idt = that.getTyp(item);
            var idf = that.sqf[item.from] || 1;
            var query = "INSERT INTO "+ idt +" (id, ts, val, ack, _from, q) VALUES(" 
                    + idn.id + ", "             // id
                    + item.ts + ", "       
                    + item.val + ", " 
                    + (item.ack ? item.ack : 0) + ", "
                    + (idf.id ? idf.id : 1)  + ", "                 // _from, in my case 1 =: system.adapter.javascript.0, 5 = .1!
                    + (item.q ? item.q : 0) + ") ON DUPLICATE KEY UPDATE val="
                    + item.val + ", ack=" 
                    + (item.ack ? item.ack : 0) +", q="
                    + (item.q ? item.q : 0) + ", _from="
                    + (idf.id ? idf.id : 1) + ";";
            that.queryMySQL(query,function(rows, fields) {
                if (!rows) {
                    logj("addToHistory err with query "+query,fields,"warn");
                    callback && callback(null,fields);
                } else
                    callback && callback(rows,fields);
    
            });
    
        };
    }</arr.length;>` 
    
    Im Prinzip sollte vieles andere auch funktionieren...
    
    Ah, ja, die options sind MyServer.... meiner Testmaschine müssen adaptiert werden.[/tt][/i]
    

    Frank,

    NUC's, VM's und Raspi's unter Raspian, Ubuntu und Debian zum Testen.
    Adapter die ich selbst beigesteuert habe: BMW, broadlink2, radar2, systeminfo, km200, xs1 und einige im Anmarsch!

    1 Antwort Letzte Antwort
    0
    • K Offline
      K Offline
      Kamikaze
      schrieb am zuletzt editiert von
      #3

      Vielen Dank für die schnelle Antwort.

      Da ich noch nicht so richtig viel Erfahrung mit javascript habe, muß ich noch eine Frage hinterher schieben.

      Hast du auch noch ein Beispiel für die Nutzung dieser Routinen? Den grundlegenden Aufbau habe ich verstanden, aber die jeweilige Nutzung aufgrund der Objekt-Orientierung noch nicht.

      Danke

      1 Antwort Letzte Antwort
      0
      • frankjokeF Offline
        frankjokeF Offline
        frankjoke
        schrieb am zuletzt editiert von
        #4

        Kamikaze,

        Das script ist ziemlich auf die sql-history zuigeschnitten.

        Am wichtigsten ist:

        	// start code
                var conn = mysql.createConnection(that.opt);
        
                if (that.connection) 
                    that.stopConnection();
        
                conn.connect(function (err) {
                    if (err) {
                        that.connection = null;
                        return callback && callback(err);
                    } else {
                        that.connection = conn;
                    }
           // Der Rest von start ist history-spezifisch und 'callback && callback(null)'  könnte schon hier aufgerufen werden
        
         // und dann Query
        
             that.queryMySQL = function(query,callback) {
        
                if(!that.connection) {
                    logj("No connection to MySQL!",that.opt,"warn");
                    return null;
                }
        
                if (query.substr(-1,1) !== ';')
                    query = query + ";";
                if(that.opt.mydebug)
                    logs("Start Query: "+ query,"debug2","darkgreen");
        //        nextTick();
                that.connection.query(query, function(err, rows, fields) {
                    if (err) {
                        if(that.opt.mydebug)
                            logj("Query SQL Err:",err);
                        callback(null,err);
                    } else {
                        if(that.opt.mydebug) {
                            var f = fields || [];
                            var r = rows.length || 0;
                            logs("Success returned "+f.length + " colums and " + 0 + " datasets","debug2","green");
                        }
                        //console.log('The solution is: '+ rows[0].name);
                        callback(rows,fields);
                    }
                });
        
            };
        
        

        Alle Abfragen/Änderungen/… werden mit der Query und SQL-Befehlen gemacht.

        p.s.: logj= wandelt das 2. Argument in ein JSON-String an und hängts dann an den log-Text an...

        In der Funktion addHistory, getHistory oder findEntry siehst du wie ein SQL-Statement aufgebaut wird das entweder Daten in die Datenbank speichert oder herausholt.

        Meine Scripts haben nur diese drei Routinen aufgerufen um die Historydaten zu manipulieren, alle anderen Aufrufe waren nur mit

            var mySql = new MySQL(myServerURL);
            mySql.start(function(err) {
            	// mach hier was wenn kein Err
            	// z.B
            	mySql.queryMySQL (query, function (rows,fields) {
                // bearbeite Ergebnis von query 
                });
            });
        
        

        Auf dem git vom mysql npm-package kannst du mehr über das Interface nachlesen welche ich verwendet habe: https://github.com/mysqljs/mysql

        Frank,

        NUC's, VM's und Raspi's unter Raspian, Ubuntu und Debian zum Testen.
        Adapter die ich selbst beigesteuert habe: BMW, broadlink2, radar2, systeminfo, km200, xs1 und einige im Anmarsch!

        1 Antwort Letzte Antwort
        0
        • K Offline
          K Offline
          Kamikaze
          schrieb am zuletzt editiert von
          #5

          Hallo,

          jetzt habe ich alles was ich brauche. Vielen Dank für deine Hilfe. Der Hinweis mit git hat mir doch sehr geholfen. Jetzt habe ich die erste Verbindung herstellen können und auf die Tabellen zugreifen können. Die Basis steht. Jetzt geht es an die Einzelheiten.

          Da deine Lösung sehr auf die History getrimmt ist, werde ich diese zwar nicht verwenden, ich konnte mir aber alle wichtigen Vorgehensweisen herausziehen.

          Grüsse

          1 Antwort Letzte Antwort
          0
          • M Offline
            M Offline
            MadTrinity
            schrieb am zuletzt editiert von
            #6

            Hallo,

            möchte auch gerne aus meiner mySQL Datenbank werte auslesen um diese dann in Vis anzuzeigen.

            Leider habe ich Null erfahrung in Sachen javascript Ibroker und so, ich habe obiges script kopiert unter myServer die Daten meiner Datenbank eingegeben, beim Ausführen steht im Log nur startMySQL. Bin davon ausgegangen das die Tabellen und deren Inhalte jetzt unter Objekte zu verfügung stehen.

            Kann mir bitte einer erklären wie ich auf meine Daten auslesen kann?

            1 Antwort Letzte Antwort
            0
            • D Offline
              D Offline
              dtp
              schrieb am zuletzt editiert von
              #7

              Sagt mal, wieso macht ihr das denn nicht mit dem Flot-Adapter?

              Mich würde aber mal interessieren, ob es möglich ist, per Skript die Werte eines bestimmten Datenpunkts der SQL-Datenbank für ein definierbares Zeitfenster zu löschen, denn das geht ja meines Wissens leider nicht direkt über den SQL-Adpater, oder?

              ioBroker im Docker-Container auf Synology DiskStation DS718+, HomeMatic IP über CCU3, IKEA Dirigera inkl. Matter, Apple Homekit, Amazon Alexa.

              1 Antwort Letzte Antwort
              0
              • DutchmanD Offline
                DutchmanD Offline
                Dutchman
                Developer Most Active Administrators
                schrieb am zuletzt editiert von
                #8

                Doch geht, siehe docu :

                 Custom queries
                
                The user can execute custom queries on tables from javascript adapter:
                
                sendTo('sql.0', 'query', 'SELECT * FROM datapoints', function (result) {
                    if (result.error) {
                        console.error(result.error);
                    } else {
                        // show result
                         console.log('Rows: ' + JSON.stringify(result.result));
                    }
                });
                Or get entries for the last hour for ID=system.adapter.admin.0.memRss
                
                sendTo('sql.0', 'query', 'SELECT id FROM datapoints WHERE name="system.adapter.admin.0.memRss"', function (result) {
                    if (result.error) {
                        console.error(result.error);
                    } else {
                        // show result
                        console.log('Rows: ' + JSON.stringify(result.result));
                        var now = new Date();
                        now.setHours(-1);
                        sendTo('sql.0', 'query', 'SELECT * FROM ts_number WHERE ts >= ' + now.getTime() + ' AND id=' + result.result[0].id, function (result) {
                            console.log('Rows: ' + JSON.stringify(result.result));
                        });
                    }
                });
                

                Musst dir halt nur selber den query zusammen basteln

                https://github.com/ioBroker/ioBroker.sq … /README.md

                Sent from my iPhone using Tapatalk

                1 Antwort Letzte Antwort
                0
                • M Offline
                  M Offline
                  MadTrinity
                  schrieb am zuletzt editiert von
                  #9

                  Hi,

                  kann mir bitte einer ein Beispiel posten wie ich die Daten aus meiner MySQL Datenbank in Iobroker Objekte nutzen kann.

                  Meine mySQL Daten wären folgende

                  mysqlhost = localhost

                  mysqluser = me

                  mysqlpwd = passwort

                  mysqldb = Haus

                  jetzt würde ich gerne "wirkleistung" From "strom_snapshot" abfragen und dann bei IObroker unter Objekte speichern um die Werte dann unter Vis anzuzeigen.

                  Die Daten schreibe ich meist mit Phyton in die Datenbank, kann man nicht schon von dort aus die Daten an Iobroker senden habe irgenwas mit curl gelesene aber bekomme das ohne hilfe leider nicht hin.

                  Vielen Dank vorab

                  1 Antwort Letzte Antwort
                  0
                  • DutchmanD Offline
                    DutchmanD Offline
                    Dutchman
                    Developer Most Active Administrators
                    schrieb am zuletzt editiert von
                    #10

                    Da du schon mit Python schreibst schau dir das hier Mal an damit könntest du direkt mit deinem Python Script den api-call ausführen

                    https://github.com/ioBroker/ioBroker.si … /README.md

                    Sent from my iPhone using Tapatalk

                    1 Antwort Letzte Antwort
                    0
                    • M Offline
                      M Offline
                      MadTrinity
                      schrieb am zuletzt editiert von
                      #11

                      Wunderbar das funktioniert.

                      Schönen Dank

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


                      Support us

                      ioBroker
                      Community Adapters
                      Donate

                      467

                      Online

                      32.4k

                      Benutzer

                      81.5k

                      Themen

                      1.3m

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

                      • Du hast noch kein Konto? Registrieren

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