NEWS
2 Punkt Regler
-
Guten Morgen,
ich habe mich hier an dieses Skript gehalten. https://forum.iobroker.net/topic/1087/2-punkt-regler-heizung?loggedin=trueIch habe kein HM sondern die Option die Temp über Netatmo zu bekommen und über einen Shelly das Relais zu steuern.
Mein Versuch ist dieser hier:
// 2-Punkt-Regler Raumheizung // Variablen erstellen createState('Heizung.MeinZimmer_2Punkt_HZ', { name: 'MeinZimmer_2Punkt_HZ' }); setState('Heizung.MeinZimmer_2Punkt_HZ', false); createState('Heizung.MeinZimmer_Sollwert_HZ', { name: 'MeinZimmer_Sollwert_HZ' }); setState('Heizung.MeinZimmer_Sollwert_HZ', 23.0); // halbe Hysterese in K var hh = 0.1; var xid = getIdByName('netatmo.0.Dijonstraße.MeinZimmer.Temperature.Temperature'/*Temperature*/); var wid = getIdByName('javascript.0.Heizung.MeinZimmer_Sollwert_HZ'/*MeinZimmer Sollwert HZ*/); var yid = getIdByName("javascript.0.Heizung.MeinZimmer_2Punkt_HZ"); var x = getState(xid).val; // Istwert in °C var w = getState(wid).val; // Sollwert in °C console.log(x); function hys() { if (x <= w - hh) setState(yid, true); else if (x >= w + hh) setState(yid, false); } hys(); // Script start on(xid, function(dp) { x = dp.state.val; hys(); }); on(wid, function(dp) { w = dp.state.val; hys(); });
Als erstes erstelle ich mir die beiden States Sollwert und Heizen 2 Punkt. Wobei der nur zum Test ist. Im Final kann ich eigentlich direkt den Shelly State schalte.
Ist mein Skript soweit ok?
Ich bekomme im Log warnungen.javascript.0 2021-02-15 11:06:17.729 info (1101) script.js.Skripte.Heizung_MeinZimmer: registered 2 subscriptions and 0 schedules javascript.0 2021-02-15 11:06:17.727 info (1101) script.js.Skripte.Heizung_MeinZimmer: null javascript.0 2021-02-15 11:06:17.727 warn (1101) at script.js.Skripte.Heizung_MeinZimmer:21:9 javascript.0 2021-02-15 11:06:17.725 warn (1101) getState "undefined" not found (3) javascript.0 2021-02-15 11:06:17.724 warn (1101) at script.js.Skripte.Heizung_MeinZimmer:20:9 javascript.0 2021-02-15 11:06:17.721 warn (1101) getState "undefined" not found (3) javascript.0 2021-02-15 11:06:17.701 info (1101) Start javascript script.js.Skripte.Heizung_MeinZimmer
Ich habe zu beginn einfach mal die States nach erstellung definiert, damit die nicht NULL sind.
Danke schön.
-
@matze1708 sagte:
var xid = getIdByName('netatmo.0.Dijonstraße.MeinZimmer.Temperature.Temperature'/*Temperature*/); var wid = getIdByName('javascript.0.Heizung.MeinZimmer_Sollwert_HZ'/*MeinZimmer Sollwert HZ*/); var yid = getIdByName("javascript.0.Heizung.MeinZimmer_2Punkt_HZ");
Wenn die Datenpunkt-IDs angegeben werden, darf nicht getIdByName(name) verwendet werden. Richtig:
var xid = 'netatmo.0.Dijonstraße.MeinZimmer.Temperature.Temperature'/*Temperature*/; var wid = 'javascript.0.Heizung.MeinZimmer_Sollwert_HZ'/*MeinZimmer Sollwert HZ*/; var yid = "javascript.0.Heizung.MeinZimmer_2Punkt_HZ";
-
Danke, was gelernt! Ging dann scheinbar auf anhieb.
Muss es jetzt noch in den Yahka rein setzten.
Danke.
-
Hallo, nochmal eine Ergänzung.
Wenn ich noch einbauen möchte, dass ich die Heizung abstellen mag.
Sagen wir bei 1 oder 3 darf sie laufen. sonst nicht.
Wie baue ich das ein?!
Habe ergänzt um
createState('Heizung.MeinZimmer_HeatingState', { name: 'MeinZimmer__HeatingState' }); setState('Heizung.MeinZimmer_HeatingState', 1);
// 2-Punkt-Regler Raumheizung // Variablen erstellen createState('Heizung.MeinZimmer_2Punkt_HZ', { name: 'MeinZimmer_2Punkt_HZ' }); setState('Heizung.MeinZimmer_2Punkt_HZ', false); createState('Heizung.MeinZimmer_HeatingState', { name: 'MeinZimmer__HeatingState' }); setState('Heizung.MeinZimmer_HeatingState', 1); createState('Heizung.MeinZimmer_Sollwert_HZ', { name: 'MeinZimmer_Sollwert_HZ' }); setState('Heizung.MeinZimmer_Sollwert_HZ', 23.0); // halbe Hysterese in K var hh = 0.1; var xid = 'netatmo.0.Dijonstraße.MeinZimmer.Temperature.Temperature'/*Temperature*/; var wid = 'javascript.0.Heizung.MeinZimmer_Sollwert_HZ'/*MeinZimmer Sollwert HZ*/; var yid = "javascript.0.Heizung.MeinZimmer_2Punkt_HZ"; var hsid = "javascript.0.Heizung.MeinZimmer_HeatingState"; var x = getState(xid).val; // Istwert in °C var w = getState(wid).val; // Sollwert in °C var hs = getState(hsid).val; // Heating State function hys() { if (x <= w - hh) setState(yid, true); else if (x >= w + hh) setState(yid, false); } hys(); // Script start on(xid, function(dp) { x = dp.state.val; hys(); }); on(wid, function(dp) { w = dp.state.val; hys(); });
Aber wo lasse ich das am besten laufen, dass mein Skript das auch mitbekommt, wann auf einen anderen Status gestellt wird und der setState vom 2 Punkt auf false gehen soll?!
Danke.
-
@matze1708 sagte: bei 1 oder 3 darf sie laufen. sonst nicht.
function hys() { if (x <= w - hh && (hs == 1 || hs == 3)) setState(yid, true); else if (x >= w + hh) setState(yid, false); }
und den zusätzlichen Trigger:
on(hsid, function(dp) { hs = dp.state.val; if(hs != 1 && hs != 3) setState(yid, false); });
-
@paul53 said in 2 Punkt Regler:
on(hsid, function(dp) { hs = dp.state.val; if(hs == 1 || hs == 3) hys(); else setState(yid, false); });
DANKE !!
So hatte ich es fast in der Function nur das ich die 2 Bedingung nicht in Klammern gesetzt habe, was mir aber jetzt logisch erscheint.
Das ich denn unten aber nochmal abfeuern muss, da bin ich nicht drauf gekommen. Aber auch klar.
Danke schön.