NEWS
MS-SQL Daten in State schreiben
-
Hallo liebe Gemeinde,
ich habe folgendes Hürde.
Ich habe auf einem Testsystem SQL-Server 2019 installiert und auch iobroker als Windows-Version auf der selben Kiste, damit die Datenbankabfrage per localhost funktioniert und ich nichts weiter aufbohren muss.Im SQL existiert eine Datenbank "sag" mit der Tabelle "dbo.tgcs"(temporäre guest codes), die ich abfragen möchte. Ich habe mir nun des sql Adapter, javascript und awtrix-light installiert und den sql adapter mit dem SQL Server verbunden. Den user, den ich verwende hat mit der Hersteller mit extra nur "read-only" Rechten versehen.
Hintergrund:
die Datenbank hat eine Spalte "validfrom" und "comfortcode". Dies ist ein Code, der an dem jeweiligen Tag Gültigkeit hat für ein Türschließsystem.
Das ganze möchte ich gerne in einen State speichern für den jeweiligen Tag und das per awtrix-light (von Matthias Kleine) an eine Ulanzi TC001 senden. (Ich denke das schaffe ich alleine).Wo ich aber stolpere ist am sql Coden. Ich habe es bisher geschafft per JS Skript folgendenes Ergebnis zu bekommen:
sendTo('sql.0', 'query', 'use sag SELECT validfrom, comfortcode FROM dbo.tgcs WHERE DATEADD(DAY, 0, DATEDIFF(DAY, 0, validfrom)) = DATEADD(DAY, 0, DATEDIFF(DAY, 0, GETDATE()))', function (result) { if (result.error) { console.error(result.error); } else { // show result console.log('Rows: ' + JSON.stringify(result.result)); } });
Als Ergebnis erhalte ich dann:
javascript.0 12:45:13.925 info script.js.common.test_mssql: Rows: [{"validfrom":"2025-02-10T07:00:00.000Z","comfortcode":2779}]
Also korrekt das heutige Datum und ensprechender Tür-Code.
Nun möchte ich gerne das Datumsformat in DD.MM.YYYY umwandeln und das ganze in ein State "heutiges_Datum oder current_date" schreiben lassen (also Datum und Code), damit ich das für die Ulanzi hernehmen kann.
Wäre toll, wenn mich hier jemand unterstützen könnte.
Viele Grüße
Alex -
@babba79 sagte: in DD.MM.YYYY umwandeln
setState(idDatum, formatDate(result.result[0].validfrom, 'DD.MM.YYYY'));
-
@paul53
wo genau setze ich das im Skript? -
@babba79 sagte: wo genau setze ich das im Skript?
Anstelle von oder unter Zeile 7.
Die VariableidDatum
muss die ID von State "heutiges_Datum" enthalten. -
@paul53
Ich habe mir die States manuell angelegt.
validfrom=string
comfortcode=Zahl
und das Skript so angepasst: (jedoch mit Fehlermeldung)
sendTo('sql.0', 'query', 'use sag SELECT validfrom, comfortcode FROM dbo.tgcs WHERE DATEADD(DAY, 0, DATEDIFF(DAY, 0, validfrom)) = DATEADD(DAY, 0, DATEDIFF(DAY, 0, GETDATE()))', function (result) { if (result.error) { console.error(result.error); } else { // show result console.log('Rows: ' + JSON.stringify(result.result)); setState(0.userdata.heutiges_datum.validfrom, formatDate(result.result[0].validfrom, 'DD.MM.YYYY')); } });
Fehler im Javaskript-Adapter:
javascript.0 13:21:42.245 info Stopping script script.js.common.test_mssql javascript.0 13:21:42.246 info Start JavaScript script.js.common.test_mssql (Javascript/js) javascript.0 13:21:42.246 error script.js.common.test_mssql compile failed: at script.js.common.test_mssql:9
-
@babba79 sagte: mit Fehlermeldung
Die ID ist falsch. Richtig: 0_userdata.0.heutiges_datum.validfrom
Im Tab "Protokolle" sind weitere Informationen zu finden. -
-
@paul53 sagte in MS-SQL Daten in State schreiben:
0_userdata.0.heutiges_datum.validfrom
sorry hatte mich vertippt.
Aber gleiche Fehlermeldung.Protokoll:
javascript.0 2025-02-10 13:37:29.590 error at process.processImmediate (node:internal/timers:485:21) javascript.0 2025-02-10 13:37:29.590 error at Immediate._onImmediate (C/:ioBroker\node_modules\iobroker.javascript\main.js:1732:17) javascript.0 2025-02-10 13:37:29.590 error at C:\ioBroker\node_modules\iobroker.javascript\main.js:2322:17 javascript.0 2025-02-10 13:37:29.590 error at prepareScript (C:\ioBroker\node_modules\iobroker.javascript\main.js:2224:37) javascript.0 2025-02-10 13:37:29.590 error at createVM (C:\ioBroker\node_modules\iobroker.javascript\main.js:1956:21) javascript.0 2025-02-10 13:37:29.590 error at new Script (node:vm:117:7) javascript.0 2025-02-10 13:37:29.590 error SyntaxError: Numeric separator can not be used after leading 0. javascript.0 2025-02-10 13:37:29.590 error ^ javascript.0 2025-02-10 13:37:29.590 error setState(0_userdata.0.heutiges_datum.validfrom, formatDate(result.result[0].validfrom, 'DD.MM.YYYY')); javascript.0 2025-02-10 13:37:29.590 error script.js.common.test_mssql compile failed: at script.js.common.test_mssql:9 javascript.0 2025-02-10 13:37:29.590 info Start JavaScript script.js.common.test_mssql (Javascript/js) javascript.0 2025-02-10 13:37:28.822 info Stopping script script.js.common.test_mssql
-
setState('0_userdata.0.heutiges_datum.validfrom', formatDate(result.result[0].validfrom, 'DD.MM.YYYY'), true); setState('0_userdata.0.heutiges_datum.comfortcode', result.result[0].comfortcode, true);
-
@paul53
weltklasse....ich feier dich!
Tausend dank für deine Hilfe.
-
@paul53
eine kleine Frage hätte ich noch.Kann ich in Zeile 3
'use sag SELECT validfrom, comfortcode FROM dbo.tgcs WHERE DATEADD(DAY, 0, DATEDIFF(DAY, 0, validfrom)) = DATEADD(DAY, 0, DATEDIFF(DAY, 0, GETDATE()))', function (result) {
vorgaukeln, dass es morgen ist? Ich habe ein cron oben im Skript gesetzt, dass das Skript täglich um 0 Uhr startet.
'{"time":{"exactTime":true,"start":"00:00"},"period":{"days":1}}'
Aber um nicht bis morgen zu warten um es besser zu testen, würde ich gerne manche Tage schon mal testen.
Danke für eure Unterstützung.So sieht das ganze jetzt bei mir aus:
-
@babba79 sagte: vorgaukeln, dass es morgen ist?
Von SQL habe ich keine Ahnung.
-
@paul53
Try´n Error hats gebracht....Total simpel when man SQL Coden kannich kanns jedenfalls nicht.
+1 Tag (+1 an der Stelle im Skript einfügen)
'use sag SELECT validfrom, comfortcode FROM dbo.tgcs WHERE DATEADD(DAY, 0, DATEDIFF(DAY, 0, validfrom)) = DATEADD(DAY, 0, DATEDIFF(DAY, 0, GETDATE()))+1', function (result) {
- 2 Tage
'use sag SELECT validfrom, comfortcode FROM dbo.tgcs WHERE DATEADD(DAY, 0, DATEDIFF(DAY, 0, validfrom)) = DATEADD(DAY, 0, DATEDIFF(DAY, 0, GETDATE()))+2', function (result) {
Edit:
Ich versuche gerade das Skript nach einem Zeitplan auszuführen, bekomme es aber irgenwie nicht hin. Habe oben rechts über die Uhr sowohl den Wizard, als auch Einfach versucht. Zum test auch jede Minute. Tut sich aber nichts.Ich hab auch versucht den javascript Adapter alle Minute neuzustarten....Das klappt ist aber nicht ganz Sinn der Sache. (Denke ich)
Hat jemand eine Idee?'{"time":{"exactTime":true,"start":"01:00"},"period":{"days":1,"dows":"[1, 2, 3, 4, 5]"}}' sendTo('sql.0', 'query', 'use sag SELECT validfrom, comfortcode FROM dbo.tgcs WHERE DATEADD(DAY, 0, DATEDIFF(DAY, 0, validfrom)) = DATEADD(DAY, 0, DATEDIFF(DAY, 0, GETDATE()))', function (result) { if (result.error) { console.error(result.error); } else { // show result console.log('Rows: ' + JSON.stringify(result.result)); setState('0_userdata.0.heutiges_datum.validfrom', formatDate(result.result[0].validfrom, 'DD.MM.YY'), true); setState('0_userdata.0.heutiges_datum.comfortcode', result.result[0].comfortcode, true); } });