NEWS
Anpassung eines Scripts / Hilfe benötigt
-
@opöl sagte: Wenn ich sie verstehe, komme ich vielleicht weiter.
Ich habe Kommentar ergänzt.
Wo wird die Variabledatenpunkt
deklariert und gesetzt? Habe ich nicht gefunden.
Funktioniert es so?function verschiebe_verbrauch_objekt(von, nach) { $(userdir + 'Einspeisung.*.' + von).each(function (id) { const verbrauch = getState(id).val; if (verbrauch != null) { setState(id.replace(von, nach), verbrauch, true); // Schreibe Verbrauch in "nach" } setState(id, 0, true); // Setze "von" zurück }); }
Überprüfe den Selektor mit
log($(userdir + 'Einspeisung.*.heute'));
am Skriptende.
-
@paul53 ,
"userdir" + "datenpunkt" sind Benamsungen aus dem originalen Script. Die habe ich auskommentiert (vielleicht nicht komplett), weil sich sie in meinem Script nicht verwende.
Meine Quell- und Zieldatenpunktordner sind:var quelldatenpunkt = ["0_userdata.0.Einspeisung.PV-Erzeugung-Counter", "0_userdata.0.Einspeisung.PV-Eigenverbrauch-Counter", "0_userdata.0.Einspeisung.PV-Einspeisung-Counter"]; var zieldatenpunkt = ["0_userdata.0.Einspeisung.PV-Erzeugung", "0_userdata.0.Einspeisung.PV-Eigenverbrauch", "0_userdata.0.Einspeisung.PV-Einspeisung"];
indiziert mit dem index (anz1) sowie den daran hängenden Datenpunkten
var objekt = ["gesamt", "dieses_jahr", "letztes_jahr", "letzter_monat", "dieser_monat", "letzte_woche", "diese_woche", "gestern", "heute", "alter_wert", "aktueller_wert"];
indiziert mit dem Index (anz2).
Daher hatte ich es in Zeile 177 mit
$('state[id=' + zieldatenpunkt[anz1]+ '*.*.' + von + ']').each(function (id, anz2) {
versucht, was aber nicht klappt.
Ich möchte also einen Wert von z.B.
zieldatenpunkt[anz1].heute
nach
zieldatenpunkt[anz1].gestern
verschieben und dann
zieldatenpunkt[anz1].heute
auf "0" setzen.
Und das ganze dann in einer Schleife für die Zieldatenpunkte 1-3 aus dem 1. Array und für die Objekte heute, diese_woche- dieser_monat und dieses_jahr.
Und genau da komme ich mit der Funktion ins schleudern, weil ich die Syntax nicht blicke.
Vielleicht habe ich mich da missverständlich ausgedrückt.
Gruß
-
@opöl sagte: was aber nicht klappt.
Woher kommt
anz1
?
So funktioniert der Selektor nicht. Prüfe den von mir geposteten Selektor. Er sollte 3 Datenpunkt-IDs mit "heute" liefern.$(userdir + 'Einspeisung.*.heute').each(function(id) { log(id); });
Wenn du das Array
zieldatenpunkt
verwenden willst, musst du es direkt mit dem Array machen:function verschiebe_verbrauch_objekt(von, nach) { zieldatenpunkt.forEach(function(id) { const verbrauch = getState(id + '.' + von).val; if (verbrauch != null) { setState(id + '.' + nach), verbrauch, true); // Schreibe Verbrauch in "nach" } setState(id + '.' + von, 0, true); // Setze "von" zurück }); }
oder mit Schleife "for of"
function verschiebe_verbrauch_objekt(von, nach) { for(let id of zieldatenpunkt) { const verbrauch = getState(id + '.' + von).val; if (verbrauch != null) { setState(id + '.' + nach), verbrauch, true); // Schreibe Verbrauch in "nach" } setState(id + '.' + von, 0, true); // Setze "von" zurück } }
-
@paul53 ,
die Variablen anz1 und anz2 sind in Zeile 30/31 definiert und indizieren die Objekte in den Arrays. Siehe ab Zeile 48 „Anlegen der Datenpunkte“.
Wenn ich so drüber nachdenke, muss eigentlich zieldatenpunkt(anz1).objekt(8) nach
zieldatenpunkt(anz1).objekt(7) in einer Schleife von anz1 =0 bis anz1= 2 verschoben werden, also von heute nach gestern. Der 1. Wert im Array hat ja den Index 0.Ich kann Deinen Vorschlag erst morgen testen. Ich melde mich dann. Vielen Dank erst einmal.
Gruß
-
@opöl
Du mal so als Anregung.
Für sowas sind Datenbanken prädestiniert.
Man schreibt regelmäßig nur die rohdaten in die Datenbank.
Zu einem späteren Zeitpunkt kann man die dann schön aggregieren nach verschiedenen Zeitscheiben, vergleichen, etc.
Alles dynamisch -
@opöl
Das was @OliverIO schreibt.
Und wenn es darum geht, dass diese "Datenbank" (Influx, MySQL, MariaDB etc.) bestimmte Werte (Tagesverbrauch) nur 1x am Tag protokollieren soll, kann man den Wert (z.B.ENERGY_Today
) per Script um 23:59 in einen eigenen DP schreiben und diesen historisieren. So hat man dann pro Tag genau 1 Wert mit passendem Timestamp in der DB.Der Vorteil von Datenbanken: Damit hat man dann echte Langzeitwerte, die man zu einem beliebigen Zeitpunkt über beliebige Zeiträume aggregieren kann.
-
das ist doch genau das, was ich erreichen möchte. Die Rohdaten stehen bereits in der influx DB und sollen für die grafische Auswertung zu bestimmten Zeitpunkten in separate Datenpunkte (Woche, Monat...) geschrieben werden.
Mir hat das Wissen über die Funktionsweise der "for each" Methode gefehlt. Habe ich mir inzwischen angelesen und mit @paul53 's Anregung:
function verschiebe_verbrauch_objekt(von, nach) { zieldatenpunkt.forEach(function(id) { const verbrauch = getState(id + '.' + von).val; // Hole Verbrauch "von" console.error("id= " + id); console.error("Verbrauch= " + verbrauch); if (verbrauch != null) { setState(id + '.' + nach, verbrauch, true); // Schreibe Verbrauch in "nach" } setState(id + '.' + von, 0, true); // Setze "von" zurück }); }
sowie eines zeitgesteuerten Aufrufs dieser Funktion in meinem Script wurden die Datenpunkte "heute" nach "gestern" kopiert und im Anschluss auf "0" gesetzt, also genau das, was ich erreichen wollte.
Ich lasse das jetzt mal bis Sonntag laufen, bis dahin sollte ich dann die täglichen und die ersten wöchentlichen Aktualisierungen haben.
Wenn alles klappt, setze ich diesen Thread dann auf "gelöst", andernfalls melde ich mich nochmal. Vielen Dank an Euch alle.
Gruß
-
@paul53 ,
die Tageswerte wurden seit dem 10.1. alle wie geplant aktualisiert bzw. zurückgesetzt und am Sonntag um 23:59 wurden ebenfalls die Datenpunkte "letzte_woche" aktualisiert und die DPs "diese_woche" genullt. Deine Funktion tut also, was ich möchte. Vielen Dank für Deine Hilfe.
Ich hätte da aber noch abschließend zwei Verständnis Fragen:
- Beim Anlegen der DPs per Script habe ich bereits früher einen Flüchtigkeitsfehler eingebaut, den ich erst jetzt bemerkt habe. Statt der DP Namen habe ich beim Anlegen der DPs die Beschreibung in die Definition geschrieben. Kann ich das nachträglich im Script korrigieren oder werden dann die DPs noch einmal neu angelegt und die bisher gespeicherten Werte sind weg?
Siehe Zeile 2 -> Objekt Array (Namen der DPs) und Zeile 14 -> DP Name.
// Verbrauchs Objekte var objekt = ["gesamt", "dieses_jahr", "letztes_jahr", "letzter_monat", "dieser_monat", "letzte_woche", "diese_woche", "gestern", "heute", "alter_wert", "aktueller_wert"]; // Beschreibung der Objekte var beschreibung = ["Gesamt", "Aktuelles Jahr", "Letztes Jahr", "Letzter Monat", "Aktueller Monat", "Letzte Woche", "Aktuelle Woche", "Gestern", "Heute", "Messwert alt", "Messwert neu"]; // Erstelle die benötigten Datenpunkte function datenpunkte_erstellen() { // Anzahl der Quelldatenpunkt Ordner for (anz1 = 0; anz1 < quelldatenpunkt.length ; anz1++) { var initial_wert = 0.0; // Anzahl der neuen Datenpunkte for (anz2 = 0; anz2 < objekt.length; anz2++) { createState(zieldatenpunkt[anz1] + "." + objekt[anz2], initial_wert, ueberschreiben, { name: beschreibung[anz2], <-- Hier sollte "objekt[anz2]" stehen, also die Objekt Namen aus dem Array desc: beschreibung[anz2], type: "number", role: "value.power", unit: "Wh" }); } } }
So sieht z.B. der DP 0_userdata.0.Einspeisung.PV-Erzeugung.letzte_woche aus:
{ "common": { "name": "Letzte Woche", "desc": "Letzte Woche", "type": "number", "role": "value.power", "unit": "Wh",
- Warum steht in Deiner Funktion
function verschiebe_verbrauch_objekt(von, nach) { zieldatenpunkt.forEach(function(id) { const verbrauch = getState(id + '.' + von).val; if (verbrauch != null) { setState(id + '.' + nach), verbrauch, true); // Schreibe Verbrauch in "nach" } setState(id + '.' + von, 0, true); // Setze "von" zurück }); }
die Zeile 7 nicht innerhalb der "If" Anweisung, also vor der geschlossenen Klammer in Zeile 6?
In meinem Fall (Quelldatenpunkte sind vorhanden) kann der Verbrauch doch nicht "null" zurück liefern. Verbrauch = null kann doch nur vorkommen, wenn es zu einem Array Wert keinen "von" Wert gibt, dann muss dieser aber auch nicht zurückgesetzt werden. Oder andersrum: Nur wenn "von" existiert und einen Wert hat, muss "nach" aktualisiert und "von" resettet werden.
Ich würde mich freuen, wenn Du mich da noch kurz abholen könntest.Nochmals Danke und Gruß
- Beim Anlegen der DPs per Script habe ich bereits früher einen Flüchtigkeitsfehler eingebaut, den ich erst jetzt bemerkt habe. Statt der DP Namen habe ich beim Anlegen der DPs die Beschreibung in die Definition geschrieben. Kann ich das nachträglich im Script korrigieren oder werden dann die DPs noch einmal neu angelegt und die bisher gespeicherten Werte sind weg?
-
@opöl sagte: Kann ich das nachträglich im Script korrigieren
Korrigiere es besser im Tab "Objekte" (Bleistift rechts).
@opöl sagte in Anpassung eines Scripts / Hilfe benötigt:
Zeile 7 nicht innerhalb der "If" Anweisung
... weil ich es so aus dem Original-Skript übernommen habe.
EDIT: Verbrauchswerte sind Zahlen, weshalb ich den Vergleich
verbrauch
!= null ohnehin nicht verstanden habe. Er dürfte immer erfüllt sein. -
@paul53 ,
ich denke, das wurde eingefügt, weil ja die Schleife für alle Werte des Arrays durchlaufen wird, unabhängig davon, ob es einen „von“ und „nach“ Datenpunkt gibt. Z.B. für den DP „gesamt“ gibt es keine Notwendigkeit, Werte zu verschieben. Ergo gibt es „von“ nicht und daher wird von einem nicht existierenden DP ein „null“ zurückgegeben. Da entfällt aber auch die Notwendigkeit, etwas nicht existentes zu nullen.
Die If Anweisung wirkt quasi als Filter, damit nur da verschoben und genullt wird, wo das benötigt wird.So zumindest mein Verständnis…
Ich probiere es mal aus.
Gruß
-
@opöl sagte: unabhängig davon, ob es einen „von“ und „nach“ Datenpunkt gibt.
Ich habe mir nicht das komplette Skript angesehen.