Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. JavaScript
    5. Js Script für externe MySQL Abfrage

    NEWS

    • Neuer Blog: Fotos und Eindrücke aus Solingen

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

    • ioBroker goes Matter ... Matter Adapter in Stable

    Js Script für externe MySQL Abfrage

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

      Hallo,

      hat jemand ein Js Script mit dem ich einen einzelnen Wert einer externen MySQL DB abfragen kann und in einen Datenpunkt schreiben kann?

      Reiner

      ACHIM BAECKER 1 Reply Last reply Reply Quote 0
      • ACHIM BAECKER
        ACHIM BAECKER @Reiner last edited by

        @reiner
        Für die Verbindung zur externen MySQL-DB würde ich erst einmal eine neue sql-Instanz anlegen und die Daten zur DB-Verbindung eintragen + testen.

        Beispiel Abfrage: (Das Ergebnis kommt als JSON String)

        var sql = 'SELECT MAX(iobroker.datapoints.id) AS Nummer FROM iobroker.datapoints';
        
            sendTo('sql.0', 'query', sql, function (result) {
        
            if (result.error) {
        
                console.error(result.error);
        
            } else {
        
                // Zeigt den Rückgabe JSON-String
                log('Rows: ' + JSON.stringify(result.result));
        
                // Auslesen des Feldes "Nummer" (SQL: 'AS Nummer')
                log('Nummer: ' + result.result[0].Nummer);
            }
        
            });
        
        
        Reiner 1 Reply Last reply Reply Quote 0
        • Reiner
          Reiner @ACHIM BAECKER last edited by

          @achim-baecker

          Hallo Achim,

          danke für den Vorschlag.

          Ich wollte eigentlich eines x beliebigens Wertes einer mysql Datenbank abfragen ohne den sql Adapter. Es handelt sich hierbei nicht um die DB von IoBroker.
          Es sollte eine reine Abfrage im Javaskript erfolgen der mir den Wert dann in einen Datenpunkt schreibt.

          haus-automatisierung 1 Reply Last reply Reply Quote 0
          • haus-automatisierung
            haus-automatisierung Developer Most Active @Reiner last edited by

            @reiner sagte in Js Script für externe MySQL Abfrage:

            Es sollte eine reine Abfrage im Javaskript erfolgen der mir den Wert dann in einen Datenpunkt schreibt.

            Dann könntest Du im JavaScript Adpater ein zusätzliches Paket von npm installieren lassen und dann alles selbst implementieren. z.B. https://www.w3schools.com/nodejs/nodejs_mysql_select.asp

            Reiner 1 Reply Last reply Reply Quote 0
            • Reiner
              Reiner @haus-automatisierung last edited by

              @haus-automatisierung

              Hallo,
              super, ich bin jetzt ein ganzes Stück weiter.
              Es fehlt lediglich das Ergebnis in einen Datenpunkt zu schreiben.

              con.connect(function(err) {
              if (err) throw err;
              con.query("SELECT Wert1 FROM Test1 WHERE Id = 1", function (err, result, fields) {
              if (err) throw err;
              console.log(result);
              });
              });

              Wie bekomme ich nun genau dieses Ergebnis in einen Datenpunkt geschrieben?

              haus-automatisierung 1 Reply Last reply Reply Quote 0
              • haus-automatisierung
                haus-automatisierung Developer Most Active @Reiner last edited by

                @reiner Ganz normal mit setState

                Reiner 1 Reply Last reply Reply Quote 0
                • Reiner
                  Reiner @haus-automatisierung last edited by

                  @haus-automatisierung Ja, aber wie?

                  haus-automatisierung 1 Reply Last reply Reply Quote 0
                  • haus-automatisierung
                    haus-automatisierung Developer Most Active @Reiner last edited by

                    @reiner Ich kann auch nur die Doku lesen 🙂

                    con.connect((err) => {
                    	if (err) throw err;
                    
                    	con.query('SELECT Wert1 FROM Test1 WHERE Id = 1', (err, results, fields) => {
                    		if (err) throw err;
                    
                    		setState('0_userdata.0.blabla', { val: results[0].Wert1, ack: true });
                    	});
                    });
                    

                    (hier im Forum getippt, also nicht getestet)

                    Reiner 2 Replies Last reply Reply Quote 0
                    • Reiner
                      Reiner @haus-automatisierung last edited by

                      @haus-automatisierung

                      Hallo,
                      die Lösung ist perfekt und funktioniert ohne Probleme.
                      Ein ganz grosses Dankeschön für deine Hilfe!

                      1 Reply Last reply Reply Quote 0
                      • Reiner
                        Reiner @haus-automatisierung last edited by

                        @haus-automatisierung

                        Hallo,
                        jetzt hat sich im laufenden Betrieb noch ein kleines Problem ergeben.
                        Wenn der Mysql Server neu gestartet oder nicht erreichbar ist bringt das Script logischerweise jede Menge Fehler. Ist aber nun der Mysql Server wieder online nimmt das Script seine Arbeit nicht mehr auf. Das Problem kann gelöst werden indem ich das Script stoppe und neu starte.

                        Meine Frage:
                        Gibt es eine Möglichkeit die Abfrage nur zu starten, wenn der Mysql Server auch online ist?

                        OliverIO haus-automatisierung 2 Replies Last reply Reply Quote 0
                        • OliverIO
                          OliverIO @Reiner last edited by

                          @reiner

                          die folgende Zeile rausnehmen

                          if (err) throw err;
                          

                          ggfs ersetzen mit, bin mir aber nicht sicher ob das funktioniert

                          if (err) log(err);
                          
                          Reiner 1 Reply Last reply Reply Quote 0
                          • Reiner
                            Reiner @OliverIO last edited by

                            @oliverio
                            Hallo,
                            das auskommentieren hat funktioniert. Jetzt läuft das Script auch nach einem Neustart der DB wieder von alleine.

                            Danke für die Hilfe!

                            1 Reply Last reply Reply Quote 0
                            • haus-automatisierung
                              haus-automatisierung Developer Most Active @Reiner last edited by

                              @reiner sagte in Js Script für externe MySQL Abfrage:

                              Gibt es eine Möglichkeit die Abfrage nur zu starten, wenn der Mysql Server auch online ist?

                              Dann würde ich das so machen:

                              con.connect((err) => {
                              	if (err) {
                              		console.log(err);
                              	} else {
                              		con.query('SELECT Wert1 FROM Test1 WHERE Id = 1', (err, results, fields) => {
                              			if (err) {
                              				console.error(err);
                              			} else {
                              				setState('0_userdata.0.blabla', { val: results[0].Wert1, ack: true });
                              			}
                              		});
                              	}
                              });
                              

                              Oder ein try/catch drumherum bauen und das throw drin lassen.

                              Reiner 1 Reply Last reply Reply Quote 0
                              • Reiner
                                Reiner @haus-automatisierung last edited by

                                @haus-automatisierung

                                Das hat alles wunderbar funktioniert.

                                Jetzt hätte ich noch einen Anwendungsfall.
                                Ist es auch möglich 2 Felder einer Zeile und mehrere Zeilen in einen Datenpunkt zu schreiben. Die Anzahl der Zeilen kann hier variieren.
                                Ebenfalls ist mir hier nicht klar welches Format der Datenpunkt haben muss.

                                haus-automatisierung 1 Reply Last reply Reply Quote 0
                                • haus-automatisierung
                                  haus-automatisierung Developer Most Active @Reiner last edited by

                                  @reiner Klar kannst Du auch Werte aus anderen Spalten schreiben. Einfach mit

                                  con.connect((err) => {
                                  	if (err) {
                                  		console.log(err);
                                  	} else {
                                  		con.query('SELECT Wert1, Wert2 FROM Test1 WHERE Id = 1', (err, results, fields) => {
                                  			if (err) {
                                  				console.error(err);
                                  			} else {
                                  				setState('0_userdata.0.blabla1', { val: results[0].Wert1, ack: true });
                                  				setState('0_userdata.0.blabla2', { val: results[0].Wert2, ack: true });
                                  			}
                                  		});
                                  	}
                                  });
                                  

                                  Wenn Du das Ergebnis aus mehreren Zeilen schreiben möchtest, dann kommt es darauf an was Du konkret vor hast. Also ob Du eine Schleife brauchst, weil Du die Anzahl der Zeilen nicht kennst usw.

                                  Reiner 1 Reply Last reply Reply Quote 0
                                  • Reiner
                                    Reiner @haus-automatisierung last edited by

                                    @haus-automatisierung
                                    Also die Anzahl der Zeilen ist nicht bekannt, dh diese ändert sich.
                                    Wenn ich das richtig verstanden habe muss ich für jeden Wert einen eigenen Datenpunkt im voraus erstellen. Das ist so gesehen kein Problem.

                                    Nur was mir nicht klar ist. Ich kann ja im Script keine Zeilen in der DB abfragen die gar nicht vorhanden sind. Und eine andere Sache ist wie kann ich dann zB in der Visualisierung nur die tatsächlich vorhandenen Werte anzeigen ohne das ich hier sehr viele Leerzeilen der leeren Datenpunkte habe.

                                    haus-automatisierung 1 Reply Last reply Reply Quote 0
                                    • haus-automatisierung
                                      haus-automatisierung Developer Most Active @Reiner last edited by

                                      @reiner sagte in Js Script für externe MySQL Abfrage:

                                      Wenn ich das richtig verstanden habe muss ich für jeden Wert einen eigenen Datenpunkt im voraus erstellen.

                                      Musst Du nicht - kann man auch per JavaScript. Aber daher die Frage, was Du konkret vor hast. Man kann ja auch mehrere Werte als JSON in einen Datenpunkt schreiben und später weiter verwenden usw.

                                      Ich möchte jetzt nicht empfehlen, hunderte Datenpunkte anzulegen ohne die Anforderung zu kennen.

                                      Reiner 1 Reply Last reply Reply Quote 0
                                      • Reiner
                                        Reiner @haus-automatisierung last edited by

                                        @haus-automatisierung
                                        Es geht darum Positionen die im Plus sind via Iobroker zu Visualisieren.
                                        Die Anzahl der Positionen die im Plus sind, sind bereits in der DB und je nachdem wie viele im Plus sind ändert sich die Anzahl der Zeilen in der DB. 1 Position im Plus = eine Zeile. 5 Positionen im Plus = 5 Zeilen.
                                        Die Felder die abgefragt werden sind "market" und "profit".

                                        Wenn zB 5 Zeilen vorhanden sind, sollen in der Visualisierung (Jarvis) auch 5 Zeilen erscheinen. Allerdings nur mit den Feldern "market" und "profit".

                                        Ich hoffe ich habe es verständlich erklärt.

                                        haus-automatisierung 1 Reply Last reply Reply Quote 0
                                        • haus-automatisierung
                                          haus-automatisierung Developer Most Active @Reiner last edited by

                                          @reiner Das würde ich über JSON lösen. Also alles in einen Datenpunkt schreiben und dann die Tabelle in Jarvis darstellen. Alles andere wäre ja total anstrengend.

                                          https://forum.iobroker.net/topic/30668/jarvis-v2-2-0-just-another-remarkable-vis/3868

                                          Reiner 2 Replies Last reply Reply Quote 0
                                          • Reiner
                                            Reiner @haus-automatisierung last edited by

                                            @haus-automatisierung
                                            Danke für den Hinweis.
                                            Ich werde mir das mal ansehen.

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

                                            Support us

                                            ioBroker
                                            Community Adapters
                                            Donate

                                            708
                                            Online

                                            31.8k
                                            Users

                                            79.9k
                                            Topics

                                            1.3m
                                            Posts

                                            4
                                            21
                                            1312
                                            Loading More Posts
                                            • Oldest to Newest
                                            • Newest to Oldest
                                            • Most Votes
                                            Reply
                                            • Reply as topic
                                            Log in to reply
                                            Community
                                            Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
                                            The ioBroker Community 2014-2023
                                            logo