@Norwegen60 sagte in objekt-Werte in tabelle darstellen:
um aktuelle Werte anzuzeigen, die DB immer wieder abfragen müsste und das ist resourcenaufwändig
Wenn du mit MS SQL gut umgehen kannst, geht es auch anders. Ich habe ein Javascript, das kurz vor Mitternacht automatisch läuft und die Daten tageweise verdichtet. Dabei werden sie mit einer Stored Procedure direkt in der Datenbank
in separate Tabellen geschrieben, die wenig Platz brauchen. Die Stored Procedure:
Spoiler
DELIMITER $$
CREATE OR REPLACE PROCEDURE iobroker.sp_tagesbilanz(
OUT AnzDS INT
)
-- CALL iobroker.sp_tagesbilanz(@AnzDS);
BEGIN
-- Fehlerbehandlung
DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN
INSERT INTO iobroker.strombilanz_log (logtime, message)
VALUES (NOW(), 'SQLEXCEPTION in sp_strombilanz');
END;
SET SQL_SAFE_UPDATES = 0;
SET AnzDS = (
SELECT Count(ID) AS Anz
FROM iobroker.vw_number
WHERE id IN (119,179,180,181,182,183) AND DATE_FORMAT(tsDate, '%Y-%m-%d') NOT IN (
SELECT DATE_FORMAT(tag, '%Y-%m-%d') FROM iobroker.strombilanz));
SELECT AnzDS;
INSERT INTO iobroker.ofenlaufzeit (datum, wert)
SELECT DATE_FORMAT(tsDate, '%Y-%m-%d') as datum, SUM(val) as wert
FROM iobroker.vw_number
WHERE id = 177 AND DATE_FORMAT(tsDate, '%Y-%m-%d') NOT IN (SELECT DATE_FORMAT(datum, '%Y-%m-%d') FROM iobroker.ofenlaufzeit)
GROUP BY DATE_FORMAT(tsDate, '%Y-%m-%d')
ORDER BY DATE_FORMAT(tsDate, '%Y-%m-%d');
INSERT INTO iobroker.strombilanz (tag, pv, haus, eauto, gen, nots, akku, gesamt, autark)
SELECT DATE_FORMAT(tsDate, '%Y-%m-%d'),
IFNULL(CAST(MAX(CASE WHEN id = 181 THEN val END) AS INT), 0) as pv,
IFNULL(CAST(MAX(CASE WHEN id = 183 THEN val END) AS INT) * -1, 0) as haus,
IFNULL(CAST(MAX(CASE WHEN id = 180 THEN val END) AS INT) * -1000, 0) as eauto,
IFNULL(CAST(MAX(CASE WHEN id = 179 THEN val END) AS INT) * -1000, 0) as gen,
IFNULL(CAST(MAX(CASE WHEN id = 182 THEN val END) AS INT) * -1, 0) as nots,
IFNULL(CAST(AVG(CASE WHEN id = 119 THEN val END) AS INT), 0) as akku, 0, 0
FROM iobroker.vw_number
WHERE id IN (119,179,180,181,182,183) AND DATE_FORMAT(tsDate, '%Y-%m-%d') NOT IN (SELECT DATE_FORMAT(tag, '%Y-%m-%d') FROM iobroker.strombilanz)
GROUP BY DATE_FORMAT(tsDate, '%Y-%m-%d');
UPDATE iobroker.strombilanz
SET gesamt = (pv + haus + eauto + gen + nots),
autark = IF((pv + haus + eauto + gen + nots) > 0, 1, 0);
-- Logging
INSERT INTO iobroker.strombilanz_log (logtime, message)
VALUES (NOW(), CONCAT('sp_strombilanz erfolgreich ausgeführt'));
DELETE
FROM iobroker.strombilanz_log
WHERE CAST(logtime AS DATETIME) < CAST(now() - INTERVAL 10 DAY AS DATETIME);
SET SQL_SAFE_UPDATES = 1;
END$$
DELIMITER ;
Die sehr detaillierten Ursprungsdaten werden dann gelöscht. Dieses Skript schreibt dann die gewünschten Analysedaten als JSON in Datenpunkte. Ein Auszug daraus:
Spoiler
//-------- Tagesbilanz erstellen ----------------------------------------------
async function sendToAsync() {
return new Promise((resolve, reject) => {
sendTo('sql.0', 'query', 'CALL iobroker.sp_tagesbilanz(@AnzDS);', result => {
if (result.error) {reject(result.error);}
else {resolve(result.result)}
});
});
}
try {
const result = await sendToAsync()
console.log('Die sp_tagesbilanz hat ' + JSON.stringify(result) + ' Datensätze erstellt'); // ' + getAttr(JSON.parse(result),'AnzDS') + '
//-------- Strombilanz gesamt ----------------------------------------------------------------------------------------
strSQL = "SELECT DATE_FORMAT (tag, '%Y-%m-%d') AS Tag, " +
"ROUND(SUM(pv) / 1000.0,1) AS PV, " +
"ROUND(SUM(haus) / 1000.0,1) AS Haus, " +
"ROUND(SUM(eauto) / 1000.0,1) AS eAuto, " +
"ROUND(SUM(gen) / 1000.0,1) AS Gen, " +
"ROUND(SUM(nots) / 1000.0,1) AS Nots, " +
"ROUND(SUM(gesamt) / 1000.0,1) AS gesamt, " +
"ROUND(AVG(akku)) AS Hausakku, " +
"ROUND(AVG(autark)) AS autark " +
"FROM iobroker.strombilanz " +
"GROUP BY DATE_FORMAT (tag, '%Y-%m-%d') " +
"ORDER BY DATE_FORMAT (tag, '%Y-%m-%d') desc;";
sendTo('sql.0', 'query', strSQL, function (result) {
if (result.error) {
console.error(result.error);
} else {
MyTrigger (idStrombilanzTage,JSON.stringify(result.result));
}
});
[Nachtrag1]
Ich habe als Selbständiger 30 Jahre lang MS SQL-Datenbanken entwickelt und bin heute noch begeistert vom Automatisierungsgrad, der Datenkonsistenz, der Ressourcenschonung, etc.
[Nachtrag2]
Zur Darstellung im VIS-2 verwende ich das Widget "Basic Table".