@bahnuhr sagte in Datenbank - welche ?:
@david-g sagte in Datenbank - welche ?:
auch abfragen über JS klappen gut)
zeig doch mal ein paar scripte (für mich als Muster)
Habe immer eine Blockly / JS kombination. Bei dem JS-Teil habe ich mir immer Hilfe im Forum geholt.
1
Hier schreibe ich Werte in die DB mit eigenem Zeitstempel:
[image: 1685735715092-1.png]
Inhalt der Funktion:
{
let statement = `
REPLACE INTO iobroker.ts_number
(id, ts, val, ack, _from, q)
VALUES ((SELECT id FROM iobroker.datapoints WHERE name = "${id}"), ${ts}, ${value}, ${ack}, ${from}, ${q})
`
sendTo("sql.0", "query", statement, e => {
if (e && e.error) {
log(e.error)
} else {
// log("Done!")
}
})
}
2
Hier lese ich die Werte eines definierten Zeitraumes aus und schreibe eine JSON (geht auch einfacher, aber die JSON für eCharts braucht immer noch das val und ts).
[image: 1685735884944-2.png]
Inhalt der Funktion:
getHistory('sql.0', {
id: dp,
start: start,
end: stop2,
// aggregate: 'm4',
timeout: 2000
}, function (err, result) {
if (err) console.error(err);
if (result) Liste = result;
});
3
Und dieses Skript sagt mir ob es sich lohnt zu tanken. Es lohnt sich, falls es in den letzte 3 Tagen keinen besseren Preis gab.
[image: 1685736265212-3.png]
Inhalt der Funktion:
on({id: "iot.0.services.custom_tanken", change: "any"}, async function (obj) {
var value = obj.state.val;
var oldValue = obj.oldState.val;
var end = new Date().getTime();
getHistory('sql.0', {
id: dp_benzinart_short,
start: end - (1000 * 60 * 60 * 24 * 3),
end: end,
// step: 1000*60*60*24,
ignoreNull: true,
aggregate: 'none',
timeout: 2000
}, function (err, result) {
if (err) console.error(err);
if (result) {
// log(JSON.stringify(result))
let helper=99;
for (var i = 0; i < result.length; i++) {
if(result[i].val!=null && result[i].val!="0" ) { if(Number(result[i].val) < helper) helper=Number(result[i].val)
// console.log(result[i].val + ' ' + new Date(result[i].ts).toISOString());
}
}
if(getState(dp_benzinart_short).val <= helper) {log ("momentaner wert ( "+getState(dp_benzinart_short).val+" ) ist kleiner/gleich " + helper )
log(helper.toString())
// if( getState("0_userdata.0.Tanken.Diesel_3_Tage").val )
setState("0_userdata.0.Tanken.Diesel_3_Tage",helper);
// benachrichtigung(helper)
benachrichtigung("Tanken lohnt sich")
} else{ setState("0_userdata.0.Tanken.Diesel_3_Tage",0);
log("momentaner wert ( "+getState(dp_benzinart_short).val+" ) ist größer " + helper )
benachrichtigung("Tanken lohnt sich nicht") }
}
});
});
/*
const myQuery = "select min(val) from iobroker.ts_number where id=38 and ts >= end - 259200000"
sendTo('sql.0', 'query', myQuery, function (err, data) {...}
*/
An den ganzen Funktionen war ich nicht wirklich beteiligt. Wie gesagt alles im Forum erarbeitet 👍