NEWS
Bitte Hilfe beim Erstellen einer kleinen Programmzeile
-
@TH-G sagte:
Grundlast nicht in einen anderen Namen Ist ändern
Dann kann ich Dir ohne Kenntnis des Scripts nicht helfen.
-
Es geht um dieses Skript
https://raw.githubusercontent.com/Maverick78de/SMA_forecast_charging/master/bat_regelung_2.0.js
-
@TH-G
grundlast wird an 2 Stellen verwendet. Wie willst Du das ohne Eingriff in das Script (Update) anpassen ? -
Ich hatte die Hoffnung, Grundlast einfach zu erhöhen, wenn die Kühlung aktiv ist bzw. wenn nicht, wieder auf den Grundwert zurückzugehen.
Der statische Teil des Skripts ändert sich in der Regel nicht. Bei Updates muss nur der Teil danach neu rein kopiert werden.
-
@TH-G sagte:
Der statische Teil des Skripts ändert sich in der Regel nicht. Bei Updates muss nur der Teil danach neu rein kopiert werden.
"BETRIEBSSTATUS.KUEHLEN" ist aber dynamisch, muss also auch in der zyklischen Funktion ausgewertet werden. Oder Du baust vor der zyklischen Funktion einen Trigger ein.
if(getState('stiebel-isg.0.Info.STATUS.BETRIEBSSTATUS.KUEHLEN').val) grundlast += 3000; on('stiebel-isg.0.Info.STATUS.BETRIEBSSTATUS.KUEHLEN', function(dp) { if(dp.state.val) grundlast += 3000; else grundlast -= 3000; });
-
Danke
Das ganze Skript wird doch zyklisch abgefragt
var Interval = setInterval(function () { processing(); /*start processing in interval*/ }, (update*1000));
Das bedeute doch dann auch, dass die Grundlast ständig angepasst wird oder?
-
@TH-G sagte:
Das bedeute doch dann auch, dass die Grundlast ständig angepasst wird oder?
Nicht ständig, sondern nur bei Umschaltung auf "Kühlen". Die Änderung von grundlast muss vor der Deklaration der zyklisch aufgerufenen Funktion processing() erfolgen (vor Zeile 63).
-
Sorry Paul wenn ich anstrengend bin aber ich möchte es gerne verstehen.
Wenn das gesamte Skript alle 1000 ms abgefragt wird, wird doch auch der Status von Kühlen angefragt oder?
Ah ich verstehe. In dem Skript wird erst ab Zeile 63 alle 1000 abgefragt.
-
@TH-G sagte:
Wenn das gesamte Skript alle 1000 ms abgefragt wird, wird doch auch der Status von Kühlen angefragt oder?
Nein, es wird nur die Funktion processing() zyklisch abgearbeitet. Alles davor nicht. Kühlen wird bisher nicht abgefragt, deshalb muss es vor Zeile 63 ergänzt werden.
-
Wenn ich dein Script nach Zeile 63 einbaue, würde es doch zyklisch abgefragt werden oder?
Noch eine andere Frage. Warum steht hinter val kein true? Woher weiss das Skript das Kühlung aktiv ist?
-
@TH-G sagte:
Wenn ich dein Script nach Zeile 63 einbaue, würde es doch zyklisch abgefragt werden oder?
Ja, das wäre aber kontraproduktiv. Mein Vorschlag passt die Variable grundlast per Trigger an, wenn sich der Status von Kühlen ändert. Bau es anstelle der leeren Zeile 62 ein.
if(getState('stiebel-isg.0.Info.STATUS.BETRIEBSSTATUS.KUEHLEN').val) grundlast += 3000; on('stiebel-isg.0.Info.STATUS.BETRIEBSSTATUS.KUEHLEN', function(dp) { // triggert bei Änderung des Status Kühlen if(dp.state.val) grundlast += 3000; else grundlast -= 3000; }); // ab hier Programmcode, nichts ändern! function processing() {
@TH-G sagte in Bitte Hilfe beim Erstellen einer kleinen Programmzeile:
Woher weiss das Skript das Kühlung aktiv ist?
Weil dann der Wert des Datenpunktes true ist.
-
Habe ich in Zeile 62 eingefügt. Folgende Warnung kommt dann:
7.8.2020, 16:14:46.668 [info ]: javascript.0 (31544) Stop script script.js.common.SMA_Bat_Regelung_2_1
7.8.2020, 16:14:46.682 [info ]: javascript.0 (31544) Start javascript script.js.common.SMA_Bat_Regelung_2_1
7.8.2020, 16:14:46.731 [warn ]: javascript.0 (31544) at script.js.common.SMA_Bat_Regelung_2_1:62:4
7.8.2020, 16:14:46.735 [info ]: javascript.0 (31544) script.js.common.SMA_Bat_Regelung_2_1: registered 1 subscription and 0 schedules -
@TH-G
Ich hatte getState falsch geschrieben (inzwischen korrigiert). -
Warnung ist immer noch da:
// PV-WR Register Definition, nur bei Bedarf anpassen var PV_Dev_Type = ModBusPV + ".inputRegisters.30053_DevTypeId", /*Typnummer*/ PVWR_limit = ModBusPV + ".holdingRegisters.41255_WNomPrc"; if(getState('stiebel-isg.0.Info.STATUS.BETRIEBSSTATUS.KUEHLEN').val) grundlast += 3000; on('stiebel-isg.0.Info.STATUS.BETRIEBSSTATUS.KUEHLEN', function(dp) { // triggert bei Änderung des Status Kühlen if(dp.state.val) grundlast += 3000; else grundlast -= 3000; }); // ab hier Programmcode, nichts ändern! function processing() { // Start der Parametrierung
-
@TH-G sagte:
Warnung ist immer noch da
Schau mal im Tab "Log" nach. Dort gibt es meist mehr Informationen. Ist die Datenpunkt-ID richtig geschrieben ?
-
Ja der DP ist richtig: stiebel-isg.0.Info.STATUS.BETRIEBSSTATUS.KUEHLEN
javascript.0 2020-08-07 16:25:44.150 warn (31544) at script.js.common.SMA_Bat_Regelung_2_1:62:4
javascript.0 2020-08-07 16:25:44.145 warn (31544) getState "stiebel-isg.0.Info.STATUS.BETRIEBSSTATUS.KUEHLEN" not found (3) -
@TH-G sagte:
"stiebel-isg.0.Info.STATUS.BETRIEBSSTATUS.KUEHLEN" not found (3)
Die Warnung sagt aus, dass der Datenpunkt nicht gefunden wurde.
-
Verstehe aber er ist da und nutze diesen auch für VIS und da wird es richtig angezeigt.
Der DP ist auch über die Kopierfuktion kopiert worden, damit es keine Schreibfehler gibt.
-
@TH-G
Poste mal die RAW-Ansicht des Objektes in Code tags. -
Hallo Paul,
es gab für VIS damals auch das Problem, das es nicht möglich ist, ein leeres Feld zu triggern. Kann das hier auch das Problem sein?
https://forum.iobroker.net/topic/34677/triggern-dp-ohne-wert-nicht-möglich-true-leer-stiebel-isg/53
AlCalzone schrieb damals dazu:
Der Adapter nutzt die expire-Funktion, um states automatisch nach gewisser Zeit zurück (auf null) zu setzen. Scheint als bekommt der JS-Adapter diese Änderung nicht mit.
{ "from": "system.adapter.stiebel-isg.0", "user": "system.user.admin", "ts": 1592375626112, "common": { "name": "KÜHLEN", "type": "boolean", "unit": "", "role": "indicator.state", "read": true, "write": false }, "native": {}, "acl": { "object": 1636, "owner": "system.user.admin", "ownerGroup": "system.group.administrator", "state": 1636 }, "_id": "stiebel-isg.0.Info.STATUS.BETRIEBSSTATUS.KUEHLEN", "type": "state" }