NEWS
(gelöst) Datenpunkt aus MS SQL Datenbank ->undefined
-
Hallo Zusammen,
ich habe mir ein Skript zusammengebastelt, welches alle 10s den neuesten Wert eines Datenpunktes aus einer My SQL Datenbank ausliest.
Vorgehen:- SQL Adapter installiert
- Datenbank verbunden
- Neuen Datenpunkt im ioBroker erstellt
- Skript geschrieben welches eine SQL Abfrage an die Datenbank schickt und den Rückgabewert in den erstellten Datenpunkt schreibt, falls sich dieser geändert hat (Code siehe unten)
Das klappt alles prima. Der Zahlenwert wird in die Variable geschrieben.
So, nun zum Problem:
ich habe das gleiche bei einer MS SQL Datenbank machen wollen. Dafür habe ich:- eine neue Instanz des SQL Adapters Installiert
- Diese mit der Datenbank verbunden
- Neuen Datenpunkt im ioBroker erstellt
- Skript an die neuen Variablen angepasst (Code siehe unten)
Jetzt gibt mir das Skript im log immer "undefined" zurück und im Datenpunkt steht (null), statt dass der Zahlenwert aus der Datenbank ausgegeben wird.
Nach zweitägiger Recherche habe ich immernoch keine Lösung. Ich hoffe mir kann jemand helfen das Problem zu finden.
Code für MySQL (dieser hier funktioniert):
schedule("*/10 * * * * *", async function () { // Zeitsteuerung -> alle 10 Sekunden; ("*/20 * * * * *") -> Das wäre alle 20 Sekunden // sendTo Befehl sendet hier eine Anfrage an die SQL-Datenbank in Form eines SQL-Befehls; das Ergebnis der Abfrage wird in die Variable "result" geschrieben sendTo('sql.0','query','SELECT value FROM Datenbankname.readings WHERE datapoint_id=29 ORDER BY timestamp DESC LIMIT 1',function (result) { if (result.error) { console.error(result.error); } else if (Number(JSON.stringify(result.result[0].value)) != getState("0_userdata.0.SGM47_Zykluszeit_Ist").val){ // Prüfung ob sich der Wert seit der letzten abfrage geändert hat //console.log("Datenbank " + Number(JSON.stringify(result.result[0].value))); //console.log("ioBroker " + getState("0_userdata.0.SGM47_Zykluszeit_Ist").val); setState("0_userdata.0.SGM47_Zykluszeit_Ist",Number(JSON.stringify(result.result[0].value))); //neuer Wert wird in einen Datenpunkt im ioBroker geschrieben log(JSON.stringify(result.result[0].value)) } }); }); code_text
Code für MS SQL (dieser hier gibt "undefined" zurück):
schedule("*/10 * * * * *", async function () { // Zeitsteuerung -> alle 10 Sekunden; ("*/20 * * * * *") -> Das wäre alle 20 Sekunden // sendTo Befehl sendet hier eine Anfrage an die SQL-Datenbank in Form eines SQL-Befehls; das Ergebnis der Abfrage wird in die Variable "result" geschrieben await this.sendTo('sql.1','query','SELECT TOP(1) channel1 FROM Datenbank1.dbo.slaveData WHERE slaveId=15 ORDER BY datStart DESC',function (result) { if (result.error) { console.error(result.error); } else if (Number(JSON.stringify(result.result[0].value)) != getState("0_userdata.0.SGM47_channel1").val){ // Prüfung ob sich der Wert seit der letzten abfrage geändert hat //console.log("Datenbank " + Number(JSON.stringify(result.result[0].value))); //console.log("ioBroker " + getState("0_userdata.0.SGM47_Zykluszeit_Ist").val); setState("0_userdata.0.SGM47_channel1",Number(JSON.stringify(result.result[0].value))); //neuer Wert wird in einen Datenpunkt im ioBroker geschrieben log(JSON.stringify(result.result[0].value)) } }); });
-
@hutmacherin sagte in Datenpunkt aus MS SQL Datenbank einlesen ergibt undefined:
log(JSON.stringify(result))
Ich würde das einsetzen um zu sehen, ob in result steht was falsch gelaufen ist.
-
@hutmacherin sagte in Datenpunkt aus MS SQL Datenbank einlesen ergibt undefined:
SELECT TOP(1)
Ich habe bei sql da noch nie eine Klammer drum gemacht. Funktioniert das? Probier mal
SELECT TOP 1 ..
-
Erstmal vielen Dank für die schnelle Rückmeldung!
@ticaki
da bringt er "javascript.0 (12764) script.js.Daten_aus_MS_Datenbank_einlesen: {"error":null,"result":[{"channel1":20}]}"Leute, ihr seid der Hammer!
Kann ja keiner ahnen, dass ich statt "value" "channel1" schreiben muss.
Hab das ersetzt und es klappt!!@haus-automatisierung Ohne Klammer klappt es genauso wie mit Klammer. Scheint egal zu sein.
Ich bin so froh ...war schon am verzweifeln.
Danke an euch.