NEWS
IF Vergleichsoperator als Variable
-
Moin Zusammen,
ich möchte die funktionierende Prüfung
if (getState('0_userdata.0.Smartmeter.AVG3MinutenWirkleistung').val > 1000) {
mit Variablen bzw. aus einem Array aufbauen
bis hierher bin ich schon gekommen
if (getState(myItems[i][2]).val > myItems[i][4]) {
leider schaffe ich es aber nicht auch den Vergleichsopetaror gegen eine Variable auszutauschen > oder später =< oder auch ==
if (getState(myItems[i][2]).val myItems[i][3] myItems[i][4]) {
In [i][3] ist '>' gesetzt
EDIT:
Alternativ würde ich gern auch eine Variable '>1000' nutzen -
@ostseeskipper sagte in IF Vergleichsoperator als Variable:
if (getState(myItems[i][2]).val myItems[i][3] myItems[i][4]) {
Das verstehe ich überhaupt nicht.
Schreib mal genauer, was du willst. -
@bahnuhr
ich möchte Vergleichsoperator in einer variable haben<
==
<>
=<
=>um a < b in einer schleife in
a > b
a == b
a <> b
usw prüfen zu lassenEDIT
in myItems[i][3] steht der Vergleichsoperator drin -
@ostseeskipper sagte in IF Vergleichsoperator als Variable:
if (getState(myItems[i][2]).val myItems[i][3] myItems[i][4]) {
Das funktioniert nicht.
Du kannst keine Programmkonstrukte (also operatoren)
gegen Variablen ersetzen.Wenn dann kannst du einen string zusammen bauen und mit eval interpretieren lassen,
was aber allgemein als böse/nicht tun angesehen wird.
du könntest über eine switch konstruktion alle operatoren aufführen, danach abfragen
und dann jeweils den richtigen operator direkt angeben. -
-
// Arrryzeile [0-Prio, 1-Aktiv, 2-Bedingung DP, 3-Vergleichsoperator, 4-Bedingung Wert, 5-Schalten DP, 6-mit welchen Wert, 7-Kommentar] myItems[0] = [1,true,'0_userdata.0.Smartmeter.AVG3MinutenWirkleistung','>',1000,'javascript.0.Anel.1.R3.Rel_Status',1, 'wenn PVÜ > 1000 dann Relais3 einschalten']; myItems[1] = [1,true,'0_userdata.0.Smartmeter.AVG3MinutenWirkleistung','<',400,'javascript.0.Anel.1.R3.Rel_Status',0, 'wenn PVÜ < 400 dann Relais3 ausschalten'];
heisst ich muss erst prüfen welcher Vergleichsoperator in der Arrayzeile gewünscht wird und muss dann in ein vorgefertigtes If .... gehen? Für jede Möglichkeit eine extra If Schleife bauen. Das ja unschön.
Wie geht das mit eval
if (getState('0_userdata.0.Smartmeter.AVG3MinutenWirkleistung').val > 1000)] {
Kann den damit so vorgebaut damit zum Vergleich übergeben?
-
@oliverio said in IF Vergleichsoperator als Variable:
Wenn dann kannst du einen string zusammen bauen und mit eval interpretieren lassen,
> was aber allgemein als böse/nicht tun angesehen wird.
du könntest über eine switch konstruktion alle operatoren aufführen, danach abfragen
und dann jeweils den richtigen operator direkt angeben.Hab es jetzt mit eval lauffähig und es macht was es soll.
Warum sollte man eval nicht nutzen?let myDebugLevel = "info"; let myItems =[]; // Arrryzeile [0-Prio, 1-Aktiv, 2-Bedingung DP, 3-Vergleichsoperator, 4-Bedingung Wert, 5-Schalten DP, 6-mit welchen Wert, 7-Kommentar] myItems[0] = [1,true,'0_userdata.0.Smartmeter.AVG3MinutenWirkleistung','>',1000,'javascript.0.Anel.1.R3.Rel_Status',1, 'wenn PVÜ > 1000 dann Relais3 einschalten']; myItems[1] = [1,true,'0_userdata.0.Smartmeter.AVG3MinutenWirkleistung','<',400,'javascript.0.Anel.1.R3.Rel_Status',0, 'wenn PVÜ < 400 dann Relais3 ausschalten']; function pvueL1(){ for (let i = 0; i < myItems.length; i++){ let myVergleich = ''; myVergleich = getState(myItems[i][2]).val +' '+ myItems[i][3]+' ' + myItems[i][4]; log("IF String "+ myVergleich,myDebugLevel); if (eval(myVergleich) == true) { log(("> Schwellwert wahr: Item "+ i +' '+ getState(myItems[i][2]).val)+' ' + myItems[i][3] +' '+ myItems[i][4],myDebugLevel); } else { log(("> ELSE Schwellwert falsch: Item "+ i+' ' + getState(myItems[i][2]).val)+' ' + myItems[i][3] +' '+ myItems[i][4],myDebugLevel); } }; };
-
https://stackoverflow.com/questions/86513/why-is-using-the-javascript-eval-function-a-bad-idea
Serien IFs immer mit demnhleichen Parameter ist dann besser mit switch
https://developer.mozilla.org/de/docs/Web/JavaScript/Reference/Statements/switch -
@oliverio
das Switch werd ich mir auf alle Fälle ansehen.