NEWS
SQL - Wert per Script speichern
-
Hallo,
lt. github Beschreibung kann man einen Wert speichern:
Nur fehlt in der Beschreibung ein Script-Schnipsel.
Habt ihr mal so einen für mich.
Mit:
sendTo('sql.0', 'storeState', [ {id: 'javascript.0.Sonstige.xxx.Gesamt', state: {val: 1, ts: 1619970069038}} ], result => console.log('gespeichert'));
funktioniert es nicht.
-
@bahnuhr Habe es auch mal versucht, konnte nur Werte für DPs anlegen, welche schon über den Adapter angelegt waren. Eigene konnte ich nicht anlegen, es kommt immer der Fehler: Cannot read property 'type' of undefined
Versuch datapoints anlegen funktioniert 2021-05-03 18:01:08.221 - debug: sql.0 (15961) Insert into iobroker.datapoints (name,type) VALUES ("0_userdata.0.Power1","0"); 2021-05-03 18:01:08.227 - debug: sql.0 (15961) sendTo "query" to system.adapter.javascript.0 from system.adapter.sql.0 Werte hinzufügen funktioniert nicht 2021-05-03 18:00:37.744 - warn: sql.0 (15961) States system pmessage io.messagebox.system.adapter.sql.0 {"command":"storeState","message":{"id":"0_userdata.0.Power1","state":{"val":3,"ts":1620054476092,"ack":true}},"from":"system.adapter.javascript.0","callback":{"message":{"id":"0_userdata.0.Power1","state":{"val":3,"ts":1620054476092,"ack":true}},"id":2870,"ack":false,"time":1620057637742},"_id":1419704} Cannot read property 'type' of undefined 2021-05-03 18:00:37.747 - warn: sql.0 (15961) TypeError: Cannot read property 'type' of undefined
Mit dem Datenpunkt, der schon angelegt war durch den Adapter über die History funktioniert es:
2021-05-03 17:57:27.311 - debug: sql.0 (15961) storeState 1 item 2021-05-03 17:57:27.311 - debug: sql.0 (15961) pushValueIntoDB called for alexa2.0.History.summary (type: 1, ID: 1) and state: {"val":3,"ts":1620054476092,"ack":true} 2021-05-03 17:57:27.312 - debug: sql.0 (15961) prepareTaskCheckTypeAndDbId CALLED for alexa2.0.History.summary 2021-05-03 17:57:27.312 - debug: sql.0 (15961) pushValueIntoDB-prepareTaskCheckTypeAndDbId RESULT for alexa2.0.History.summary (type: 1, ID: 1) and state: {"val":3,"ts":1620054476092,"ack":true} 2021-05-03 17:57:27.313 - debug: sql.0 (15961) INSERT INTO `iobroker`.ts_string (id, ts, val, ack, _from, q) VALUES(1, 1620054476093, '3', 1, 0, 0); 2021-05-03 17:57:27.314 - debug: sql.0 (15961) sendTo "storeState" to system.adapter.javascript.0 from system.adapter.sql.0
Vielleicht kann sich @apollon77 sich das mal anschauen?
Verwendete Befehle:
sendTo('sql.0', 'query', 'Insert into iobroker.datapoints (name,type) VALUES ("0_userdata.0.Power1","0"); ', function (result) { if (result.error) { console.error(result.error); } else { // show result console.log('Rows: ' + JSON.stringify(result.result)); } }); sendTo('sql.0', 'storeState', {id: '0_userdata.0.Power1', state: {val: 3, ts: 1620054476092,ack:true}} , result => console.log('gespeichert'));
-
@bahnuhr Vielleicht guck ich falsch aber die [] sind doch irgendwie zu viel bei Dir, oder? Das ist doch kein Array?
-
Also ja, es geht nur IDs für die auch History aktiviert ist weil die Werte nur in der History landen (quasi am restlichen System vorbei - das ist primär dazu gedacht historische Werte bei einer Migration von einem History-System zu einem anderen (history->sql/influxdb oder so) zu übertragen.
Was wollt Ihr denn damit anstellen? ;-))
Zu dem Error nehme ich gern ein Issue beim Adapter das man es abfangen kann.
Wenn ich es korrket verstehe geht das Speichern von einem wert mit
sendTo('sql.0', 'storeState', {id: 'javascript.0.Sonstige.xxx.Gesamt', state: {val: 1, ts: 1619970069038}}, result => console.log('gespeichert'));
mehrere Werte mit
sendTo('sql.0', 'storeState', {id: 'javascript.0.Sonstige.xxx.Gesamt', state: [{val: 1, ts: 1619970069038}}, {...}], result => console.log('gespeichert'));
-
@ahnungsbefreit sagte in SQL - Wert per Script speichern:
@bahnuhr Vielleicht guck ich falsch aber die [] sind doch irgendwie zu viel bei Dir, oder? Das ist doch kein Array?
Hast wohl recht.
Ich habe das Beispiel von git:
sendTo('sql.0', 'delete', [ {id: 'mbus.0.counter.xxx, state: {ts: 1589458809352}, {id: 'mbus.0.counter.yyy, state: {ts: 1589458809353} ], result => console.log('deleted'));
geändert auf storeState.
Vielleicht stimmt ja auch die git Seite nicht ?!?!?
Danke an dich.
Dein Script läuft. -
@mcu Also ne Insert query geht auch aber das geht dann noch mehr an allem vorbei ... da verspreche ich gar nix
-
@apollon77 sagte in SQL - Wert per Script speichern:
Was wollt Ihr denn damit anstellen? ;-))
Ich möchte Werte in einen Datenpunkt schreiben mit einem veränderten (alten) ts.
(Hintergrund: Wenn ich mal einen vergessen habe einzutragen, dass ich diesen dann mit dem richtigen ts eingetragen bekomme)
Und dieser Datenpunkt will ich dann anzeigen lassen per flot.Geht das irgendwie anders?
-
@apollon77 Laut Adapter-Beschreibung:
The given IDs are not checked against the ioBroker database and do not need to be set up there, but can only be accessed directly.
Da kommt man schon auf die Idee, das keine Voraussetzungen notwendig sind. Vielleicht die Doku anpassen und den Hinweis auf die notwenige History-Einstellung (aktiv) erwähnen.
Und gleich die Beispiele, die du oben schon angezeigt hast.
Vielen Dank. -
@apollon77 Hatte ich nur zum Testen gemacht, da es kein 'ADD'-Befehl in dem Adapter gibt. So habe ich herausgefunden, dass es noch andere Abhängigkeiten geben muss.
Die Daten werden aber so angelegt. Also es funktioniert.
Offene Frage: Muss die History vom DP dauerhaft aktiv sein, um einen neuen Wert über die Befehle speichern zu können (denn dann werden ja sowieso automatisch alle Wert vom DP gespeichert in SQL-DB), oder nur einmalig beim Anlegen oder für das Anlegen von dem DP in der SQL-DB?
-
@bahnuhr Ne das ist ja ok
-
@mcu Es wird nur das initialisiert was auch aktiviert ist. Alles andere "kennt" der Adapter nicht.
-
@apollon77 sagte in SQL - Wert per Script speichern:
@bahnuhr Ne das ist ja ok
Versteh ich jetzt nicht.
Wenn ich einen Wert eintrage mit o.g. kleine Script wird dieser Wert ja in die Datenbank von sql geschrieben.
Zumindest kann ich diesen auslesen (mit einem anderen Script.In dem Datenpunkt in iob werden diese Werte aber nicht angezeigt.
-
@bahnuhr Ich hab nur gemeint das der Anwendungsfall ok ist das Feature zu nutzen
-
Ne andere Frage zu sql.
Wenn ich mit einem kleinen Script den ts ausrechne, klappt dies einwandfrei mit folgender Ausnahme:
Wenn das Datum vor 2000 liegt, dann wird offensichtlich ein falscher ts erzeugt.
Wenn ich diesen erzeugten ts eingebe im Internet scheint er aber richtig zu sein.
Nur in einem flot erscheint der Punkt nicht !?Script:
var theDate = new Date("30 december 1999"); if (logging) log (theDate.getTime());
Warum ist der ts bei Daten vor 2000 falsch (oder zumindest im flot) ?
Oder was muss man anders machen.
Oder liegt es an flot ? -
@bahnuhr was kommt da denn für ein Wert raus?
Kann es sein das der kleiner als 946681200000 wird?
WIr haben vor einigen Jahren mal intern die Daten von "Zeitstempel in Sekunden" auf "Zeistempel in Millisekunden" umgestellt.
Die Erkennung läuft so:Wenn Wert < 946681200000 dann annahme es ist in Sekunden und wir nehmen wert intern "*1000"
Daher wenn du nen Wert < 946681200000 hast mache ihn / 1000 (der code korrigiert das dann)
-
@apollon77 sagte in SQL - Wert per Script speichern:
Daher wenn du nen Wert < 946681200000 hast mache ihn / 1000 (der code korrigiert das dann)
Klappt nicht.
Im Script habe ich folgendes eingebaut:ts_wert = theDate.getTime(); if (ts_wert < 946681200000) { ts_wert = ts_wert / 1000 };
Wie du im log sieht, schreibe ich Werte bis 1995 zurück. Und der ts wird durch 1000 geteilt.
javascript.0 2021-05-05 19:25:19.790 info (21611) script.js.Scripte.Sonstige.abc: 912380400 javascript.0 2021-05-05 19:25:19.790 info (21611) script.js.Scripte.Sonstige.abc: 21 -164.5 -143.5 javascript.0 2021-05-05 19:25:19.790 info (21611) script.js.Scripte.Sonstige.abc: 30 november 1998 javascript.0 2021-05-05 19:25:19.789 info (21611) script.js.Scripte.Sonstige.abc: 909702000 javascript.0 2021-05-05 19:25:19.789 info (21611) script.js.Scripte.Sonstige.abc: 15.3 -165.2 -149.9 javascript.0 2021-05-05 19:25:19.789 info (21611) script.js.Scripte.Sonstige.abc: 30 october 1998 javascript.0 2021-05-05 19:25:19.788 info (21611) script.js.Scripte.Sonstige.abc: 907106400 javascript.0 2021-05-05 19:25:19.788 info (21611) script.js.Scripte.Sonstige.abc: 20.7 -180.4 -159.7 javascript.0 2021-05-05 19:25:19.788 info (21611) script.js.Scripte.Sonstige.abc: 30 september 1998 javascript.0 2021-05-05 19:25:19.787 info (21611) script.js.Scripte.Sonstige.abc: 904428000 javascript.0 2021-05-05 19:25:19.787 info (21611) script.js.Scripte.Sonstige.abc: 19.4 -181.4 -162 javascript.0 2021-05-05 19:25:19.786 info (21611) script.js.Scripte.Sonstige.abc: 30 august 1998 javascript.0 2021-05-05 19:25:19.786 info (21611) script.js.Scripte.Sonstige.abc: 901749600 javascript.0 2021-05-05 19:25:19.785 info (21611) script.js.Scripte.Sonstige.abc: 43.7 -181.9 -138.2 javascript.0 2021-05-05 19:25:19.785 info (21611) script.js.Scripte.Sonstige.abc: 30 july 1998 javascript.0 2021-05-05 19:25:19.785 info (21611) script.js.Scripte.Sonstige.abc: 899157600 javascript.0 2021-05-05 19:25:19.784 info (21611) script.js.Scripte.Sonstige.abc: 40.6 -182.6 -142 javascript.0 2021-05-05 19:25:19.784 info (21611) script.js.Scripte.Sonstige.abc: 30 june 1998 javascript.0 2021-05-05 19:25:19.783 info (21611) script.js.Scripte.Sonstige.abc: 896479200 javascript.0 2021-05-05 19:25:19.783 info (21611) script.js.Scripte.Sonstige.abc: 36.2 -188.3 -152.1 javascript.0 2021-05-05 19:25:19.783 info (21611) script.js.Scripte.Sonstige.abc: 30 may 1998 javascript.0 2021-05-05 19:25:19.782 info (21611) script.js.Scripte.Sonstige.abc: 893887200 javascript.0 2021-05-05 19:25:19.782 info (21611) script.js.Scripte.Sonstige.abc: 33.7 -188.8 -155.1 javascript.0 2021-05-05 19:25:19.782 info (21611) script.js.Scripte.Sonstige.abc: 30 april 1998
Im flot werden diese jedoch nicht angezeigt.
Alles was älter als 2000 ist kommt nicht in flot an.Muss ich noch etwas anderes beachten?
-
Nachtrag:
Wenn ich die gespeicherten Werte per Script abrufe:
sendTo('sql.0', 'query', 'SELECT id FROM datapoints WHERE name="javascript.0.Sonstige.xxxxxx"', function (result) { if (result.error) { console.error(result.error); } else { console.log('Rows: ' + JSON.stringify(result.result)); var now = new Date(); now.setHours(-10000000); sendTo('sql.0', 'query', 'SELECT * FROM ts_number WHERE id=' + result.result[0].id, function (result) { console.log('Rows: ' + JSON.stringify(result.result)); }); } });
dann wird ausgegeben:
{"id":177,"ts":820278000000,"val":-366.7,"ack":1,"_from":0,"q":0},{"id":177,"ts":822956400000,"val":-388.9,"ack":1,"_from":0,"q":0},{"id":177,"ts":825462000000,"val":-411.1,"ack":1,"_from":0,"q":0},{"id":177,"ts":828140400000,"val":-411.1,"ack":1,"_from":0,"q":0},{"id":177,"ts":830815200000,"val":-410.5,"ack":1,"_from":0,"q":0},{"id":177,"ts":833407200000,"val":-409.9,"ack":1,"_from":0,"q":0},{"id":177,"ts":836085600000,"val":-329.5,"ack":1,"_from":0,"q":0},{"id":177,"ts":838677600000,"val":-329.4,"ack":1,"_from":0,"q":0},{"id":177,"ts":841356000000,"val":-323.7,"ack":1,"_from":0,"q":0},{"id":177,"ts":844034400000,"val":-300.3,"ack":1,"_from":0,"q":0},{"id":177,"ts":846630000000,"val":-293.7,"ack":1,"_from":0,"q":0},{"id":177,"ts":849308400000,"val":-283.4,"ack":1,"_from":0,"q":0},{"id":177,"ts":851900400000,"val":-267.7,"ack":1,"_from":0,"q":0},{"id":177,"ts":854578800000,"val":-267.3,"ack":1,"_from":0,"q":0},{"id":177,"ts":857084400000,"val":-261.5,"ack":1,"_from":0,"q":0},{"id":177,"ts":859676400000,"val":-251.2,"ack":1,"_from":0,"q":0},{"id":177,"ts":862351200000,"val":-245.7,"ack":1,"_from":0,"q":0},{"id":177,"ts":864943200000,"val":-245.1,"ack":1,"_from":0,"q":0},{"id":177,"ts":867621600000,"val":-236.4,"ack":1,"_from":0,"q":0},{"id":177,"ts":870213600000,"val":-236.9,"ack":1,"_from":0,"q":0},{"id":177,"ts":872892000000,"val":-235.6,"ack":1,"_from":0,"q":0},{"id":177,"ts":875570400000,"val":-228.1,"ack":1,"_from":0,"q":0},{"id":177,"ts":878166000000,"val":-227.4,"ack":1,"_from":0,"q":0},{"id":177,"ts":880844400000,"val":-216.7,"ack":1,"_from":0,"q":0},
Folglich werden (wei von apollon gesagt) die 3x 0 wieder angehängt.
Aber die Werte kommen trotzdem in flot nicht an (siehe oben).
Liegt das Problem bei flot (und nicht bei sql) ??
-
Hallo an alle.
Nochmal die Frage ganz konkret.
Werte vor 01.01.2000 werden in sql gespeichert.
Wie bekommt man es hin, dass diese auch angezeigt werden in flot ? -
Ich könnte mir vorstellen das das hier der Grund ist
Das denke ich macht keinen Sinn weil die Daten ja aus der DB kommen.
Nimm das mal bitte Testweise bei dir raus. tuts dann?
-
@apollon77 sagte in SQL - Wert per Script speichern:
...weil die Daten ja aus der DB kommen.
das macht auch anders keinen Sinn, die Prüfung müsste auf
< 946681200
lauten, nicht< 946681200000
. Auch 946681199999 sind immer noch ms