NEWS
sendTo sql State is not valid
-
Hallo Zusammen,
Ich bastel mir gerade ein Script mit Blockly um die Deutschland API bzgl. der Gasspeicherfüllstände anzusprechen.
Die klappt auch einwandfrei, sodass ich an die Zeitstempel und die Füllstände komme.
Diese will ich nun via sendTo an meine SQL Datenbank zu senden. Der Adapter ist als sql.1 installiert.
Wenn ich nun aber das Skript ausführe kommt folgender Fehler für jedes Zeitstempel/Wert Paar:javascript.0 (216) script.js.MyScripts.Gasspeicher_Füllstände: {'error':'1 errors happened while storing data','errors':['State \'{ts: 1681689600000, val: 64.53, ack: false, from: 'system.adapter.javascript.0'}\' for 0_userdata.0.Datenpunkte.BundesAPI.Gasspeicherfüllstand is not valid'],'successCount':0}
In Blockly sieht das wie folgt aus:
Und das ist das generierte Skript
var i, Position_Trennzeichen, Zeitstempel, result, Fuellstand; try { require("request")('https://www.dashboard-deutschland.de/api/tile/indicators?ids=tile_1667227714015', async function (error, response, result) { var i_list = getAttr((function () { try {return JSON.parse(result);} catch(e) {return {};}})(), '0.json.components.0.chart.series.0.data'); for (var i_index in i_list) { i = i_list[i_index]; Position_Trennzeichen = ('' + i).indexOf(',') + 1; Zeitstempel = ('' + i).slice(0, parseFloat(Position_Trennzeichen) - 1); Fuellstand = ('' + i).slice(((parseFloat(Position_Trennzeichen) + 1) - 1), ('' + i).length); console.debug((['Zeitstempel: ',Zeitstempel,'\n','Füllstand: ',Fuellstand,' %'].join(''))); sendTo("sql.1", "storeState", { "id": '0_userdata.0.Datenpunkte.BundesAPI.Gasspeicherfüllstand', "state": ['{ts: ',parseFloat(Zeitstempel),', val: ',parseFloat(Fuellstand),', ack: false, from: \'system.adapter.javascript.0\'}'].join('') }, async function (result) { console.log(result); }); console.log("sql.1: " + ""); } }).on("error", function (e) {console.error(e);}); } catch (e) { console.error(e); }
Habt Ihr eine Idee, wo der Fehler herkommt? Ich sehe es nicht.
Vielen Dank, Martin
-
@kopierwichtel
Ich mag mich täuschen (weil ich das selbst noch nicht gemacht habe), aber übergibt man dem SQL-Adapter nicht ein SQL-Statement?
Also etwas in der Art:INSERT INTO iobroker.ts_numbers VALUES(XX, YY, ZZ)
Ich sehe in Deinem Script nirgends einen Tabellennamen o.ä.
Also ich als Adapter wüsste gar nicht, wo ich was hinschreiben sollte. -
@codierknecht
Lt. Doku müsste der Adapter über sendTo funktionieren. -
@kopierwichtel
Jepp - geht offenbar auch, aber das sieht ganz anders aus:sendTo('history.0', 'storeState', { id: 'mbus.0.counter.xxx', state: [ {ts: 1589458809352, val: 123, ack: false, from: 'system.adapter.whatever.0', ...}, {ts: 1589458809353, val: 123, ack: false, from: 'system.adapter.whatever.0', ...} ] }, result => console.log('added'));
Du hast da an allen möglichen und unmöglichen Stellen Anführungszeichen (einfache und doppelte) eingebaut, die da offenbar nicht hingehören.
-
@codierknecht
das die vielen Anführungszeichen im Code stehen liegt an den Variablen die genutzt werden:Zeit stempel und Fuellstand sind Variablen die aus dem JSON befüllt werden.
Ich teste aber mal was passiert wenn ich einfach den Zeitstempel und den Wert hart reinschreibe
-
Ich habe es jetzt tatsächlich mal mit dem direkten SQL statement versucht. Damit hat es funktioniert
Die Anzahl der offenen SQL verbindungen scheint zwar ein Problem zu sein, aber das ist feintuning. -
@kopierwichtel
Frei nach dem Motto: "Was man nicht selbst macht, taugt auch nix"