NEWS
If Then mehrfach [gelöst]
-
Hi,
ich habe ein Ausrufezeichen im Script. Funktionieren tut es.Mein HMIP Windmesser soll mein VIS Dashboard mit textuellem Windinformationen in Beaufort versorgen. Wie gesagt, funktionieren tut es, aber...
var Beaufort = 'undefined'; if (0 < windspeedakt && windspeedakt < 1) {var Beaufort='Windstill';} if (1 < windspeedakt && windspeedakt < 6) {var Beaufort='leiser Zug';} if (6 < windspeedakt && windspeedakt < 12) {var Beaufort='leichte Briese';} if (12 < windspeedakt && windspeedakt < 20) {var Beaufort='schwacher Wind';} if (20 < windspeedakt && windspeedakt < 29) {var Beaufort='mäßiger Wind';} if (29 < windspeedakt && windspeedakt < 39) {var Beaufort='frischer Wind';} if (39 < windspeedakt && windspeedakt < 50) {var Beaufort='starker Wind';} if (50 < windspeedakt && windspeedakt < 62) {var Beaufort='steifer Wind';} if (62 < windspeedakt && windspeedakt < 75) {var Beaufort='stürmischer Wind';} if (75 < windspeedakt && windspeedakt < 89) {var Beaufort='Sturm';} if (89 < windspeedakt && windspeedakt < 103) {var Beaufort='schwerer Sturm';} if (103 < windspeedakt && windspeedakt < 118) {var Beaufort='orkanartiger Sturm';} if (windspeedakt > 118) {var Beaufort='Orkan';} setState("status_Wind.Beaufort", Beaufort);
Vielen Dank
Carsten -
..........
-
und wie lautet die Frage?
-
@htrecksler
Danke für die schnelle Antwort.Ist das die richtige Art, eine If-Then Abfrage zu machen? Gibt es eine "richtigere"? Wenn das Blockly schon sagt, "Ausrufezeichen", dann ist dort doch was im Argen, oder?
-
ich hab jetzt gerade nicht so viel Zeit, und ich kenn ja den Rest des Scriptes nicht (wo wird aufgerufen, wie oft wird das benötigt...)
In jedem Fall würde ich mir eine Funktion schreiben die den Text ermittelt. Der Funktion dann die aktuelle Windgeschwindigkeit übergeben und dann die einzelnen Stärken prüfen, angefangen bei Windstill. Bei einem Treffer dann aus der Funktion herausspringen....
Und wenn es öfter gebraucht wird würde ich das dann in einem "globalen" script (aber das wirklich nur wenn man es häufiger in verschiedenen Scripten benötigt) umsetzen.Wie gesagt, ich muss weg, aber wenn bis heute Abend noch kein anderer reagiert hat (das ist eigentlich genau das richtige für Paul :-)) dann ...
-
mach doch mal ein bild deines blockly
-
@ceng Die Variable Beaufort nur einmal deklarieren !
-
Was machst du wenn der Wind = 20 ist.
Dann läuft das Script ins Leere.Also mal ein <= oder >= setzen.
Weiterhin könntest du mit "else if" arbeiten, dann hast du nur jeweils eine Werteangabe.
Also ungefähr so:
if (windspeedakt < 1) { Beaufort = "Windstill"; } else if (windspeedakt < 6) { Beaufort = "leiser Zug"; } else if (windspeedakt < 12) { Beaufort = "leichte Brise"; } ... else { Beaufort = "Orkan"};
mfg
-
@bahnuhr
Nachdem ich Dein Scriptschnipsel gesehen habe, passte ich mein Script folgendermassen an und siehe da, die Ausrufezeichen sind weg. Ich darf nur einmal "var beaufort" schreiben...var aktuellerWind = getState("hm-rpc.2.0017D709AE3070.1.WIND_SPEED"/*HmIP-SWO-B 0017D709AE3070:1.WIND_SPEED*/).val; var loggen = false; // = false, wenn kein Logging gewünscht var timestamp = Date(); var timestampUnix = Math.round(+new Date()/1000); createState('status_Wind.Windstatus', 'INITIAL', {type: 'string'}); // Wetterstatus createState('status_Wind.Beaufort', 'INITIAL', {type: 'string'}); // Wetterstatus createState('status_Wind.timestampaktWind', 'INITIAL', {type: 'string'}); // Ausführungsdatum createState('status_Wind.timestampaktWindUnix', timestampUnix, {type: 'number'});// Ausführungsdatum Unix Format createState('status_Wind.windspeedakt', 0, {type: 'number'}); // aktuelle Windgeschwindigkeit createState('status_Wind.timestamp1Wind', 'INITIAL', {type: 'string'}); // Ausführungsdatum createState('status_Wind.windspeed1', 0, {type: 'number'}); // letzte Windgeschwindigkeit createState('status_Wind.timestamp2Wind', 'INITIAL', {type: 'string'}); // Ausführungsdatum createState('status_Wind.windspeed2', 0, {type: 'number'}); // vorletzte Windgeschwindigkeit createState('status_Wind.timestamp3Wind', 'INITIAL', {type: 'string'}); // Ausführungsdatum createState('status_Wind.windspeed3', 0, {type: 'number'}); // vorvorletzte Windgeschwindigkeit function windstate() { var windspeedakt = getState("hm-rpc.2.0017D709AE3070.1.WIND_SPEED"/*HmIP-SWO-B 0017D709AE3070:1.WIND_SPEED*/).val; // Windgeschwindigkeit var windspeed1 = getState("javascript.0.status_Wind.windspeedakt"/*status_Wind.windspeedakt*/).val; // letzte Windgeschwindigkeit var windspeed2 = getState("javascript.0.status_Wind.windspeed1"/*status_Wind.windspeedakt*/).val; // vorletzte Windgeschwindigkeit var windspeed3 = getState("javascript.0.status_Wind.windspeed2"/*status_Wind.windspeedakt*/).val; // vorletzte Windgeschwindigkeit var winddurchschnitt = ( windspeedakt + windspeed1 + windspeed2 + windspeed3 ) / 4; var timestampaktWind = timestamp; var timestampaktWindUnix= getState("javascript.0.status_Wind.timestampaktWindUnix").val; var timestamp1Wind = getState("javascript.0.status_Wind.timestampaktWind"/*status_Wind.windspeedakt*/).val; // Zeit letzte Windgeschwindigkeit var timestamp2Wind = getState("javascript.0.status_Wind.timestamp1Wind"/*status_Wind.windspeedakt*/).val; // Zeit vorletzte Windgeschwindigkeit var timestamp3Wind = getState("javascript.0.status_Wind.timestamp2Wind"/*status_Wind.windspeedakt*/).val; // Zeit vorvorletzte Windgeschwindigkeit var timediff = timestampUnix-timestampaktWindUnix; var Beaufort = 'undefined'; if (0 < windspeedakt && windspeedakt < 1) {Beaufort='Windstill';} if (1 < windspeedakt && windspeedakt < 6) {Beaufort='leiser Zug';} if (6 < windspeedakt && windspeedakt < 12) {Beaufort='leichte Briese';} if (12 < windspeedakt && windspeedakt < 20) {Beaufort='schwacher Wind';} if (20 < windspeedakt && windspeedakt < 29) {Beaufort='mäßiger Wind';} if (29 < windspeedakt && windspeedakt < 39) {Beaufort='frischer Wind';} if (39 < windspeedakt && windspeedakt < 50) {Beaufort='starker Wind';} if (50 < windspeedakt && windspeedakt < 62) {Beaufort='steifer Wind';} if (62 < windspeedakt && windspeedakt < 75) {Beaufort='stürmischer Wind';} if (75 < windspeedakt && windspeedakt < 89) {Beaufort='Sturm';} if (89 < windspeedakt && windspeedakt < 103) { Beaufort='schwerer Sturm';} if (103 < windspeedakt && windspeedakt < 118) {Beaufort='orkanartiger Sturm';} if (windspeedakt > 118) {Beaufort='Orkan';} setState("status_Wind.Beaufort", Beaufort); // Schreibt Beaufort Bezeichnung setState("status_Wind.timestampaktWind", timestampaktWind); // Schreibt Datum des Ausführung setState("status_Wind.timestampaktWindUnix", timestampUnix); // Schreibt Datum des Ausführung zur Berechung setState("status_Wind.timestamp1Wind", timestamp1Wind); // überträgt Datum des letzten Ausführung setState("status_Wind.timestamp2Wind", timestamp2Wind); // überträgt Datum des vorletzten Ausführung setState("status_Wind.timestamp3Wind", timestamp3Wind); // überträgt Datum des vorvorletzten Ausführung setState("status_Wind.windspeedakt", windspeedakt); setState("status_Wind.windspeed1", windspeed1); setState("status_Wind.windspeed2", windspeed2); setState("status_Wind.windspeed3", windspeed3); if(loggen) log("Zeitdifferenz seit letztem Status: " + timediff); if(loggen) log("Aktueller Wind: " + windspeedakt); if(loggen) log("1 Wind: " + windspeed1); if(loggen) log("2 Wind: " + windspeed2); if(loggen) log("3 Wind: " + windspeed3); if(loggen) log("Durchschnitt: " + winddurchschnitt); //if (windspeedakt>20){"status_Wind.Wetterstatus", 'Windig'} } windstate(); on( {id: 'hm-rpc.2.0017D709AE3070.1.WIND_SPEED', change: "ne"}, function (obj) { windstate(); console.log('Windspeed changed'); });
-
@paul53
Ok, was bedeutet "nur einmal deklarieren". Mit dem Beispiel von Bahnuhr wurde mir Deine Aussage dann klar. -
@bahnuhr sagte in If Then mehrfach [gelöst]:
Was machst du wenn der Wind = 20 ist.
Dann läuft das Script ins Leere.Das Problem hast du aber immer noch.
-
@ceng Die Abfrage kann vereinfacht werden, da nur eine Variable gesetzt wird, die beliebig oft überschrieben werden kann.
var Beaufort = 'Windstill'; if (1 < windspeedakt) Beaufort = 'leiser Zug'; if (6 < windspeedakt) Beaufort = 'leichte Briese'; if (12 < windspeedakt) Beaufort = 'schwacher Wind'; if (20 < windspeedakt) Beaufort = 'mäßiger Wind'; if (29 < windspeedakt) Beaufort = 'frischer Wind'; if (39 < windspeedakt) Beaufort = 'starker Wind'; if (50 < windspeedakt) Beaufort = 'steifer Wind'; if (62 < windspeedakt) Beaufort = 'stürmischer Wind'; if (75 < windspeedakt) Beaufort = 'Sturm'; if (89 < windspeedakt) Beaufort = 'schwerer Sturm'; if (103 < windspeedakt) Beaufort = 'orkanartiger Sturm'; if (windspeedakt > 118) Beaufort = 'Orkan';
-
Paul,
die Werte passen aber nicht zu den Werten vom TE.Bei 5 wollte er z.B. "leiser Zug"; bei dir steht jetzt "leichte Briese"
Aber egal, muss er halt anpassen so wie er es will.
mfg
-
-
TE:
if (0 < windspeedakt && windspeedakt < 1) {var Beaufort='Windstill';} if (1 < windspeedakt && windspeedakt < 6) {var Beaufort='leiser Zug';} if (6 < windspeedakt && windspeedakt < 12) {var Beaufort='leichte Briese';}
Paul:
if (1 < windspeedakt) Beaufort = 'leiser Zug'; if (6 < windspeedakt) Beaufort = 'leichte Briese'; if (12 < windspeedakt) Beaufort = 'schwacher Wind';
Bei Wert 5 ergibt oben was anderes als unten.
Oder lese ich falsch.
Ist aber auch nicht schlimm, kann er ja ändern. -
@bahnuhr sagte:
Bei Wert 5 ergibt oben was anderes als unten.
Wirklich ? Wert 5 ergibt in beiden Fällen "leiser Zug".
-
@paul53 sagte in If Then mehrfach [gelöst]:
Wirklich ? Wert 5 ergibt in beiden Fällen "leiser Zug".
Ok, hast recht. Hab falsch gelesen.
Entschuldigung. -
Wäre ein "switch - case" nicht die bessere Wahl?
So in der Art:
switch (windspeedakt) { case < 6: Beaufort = 'leichte Briese; break; case <12: Beaufort = 'schwacher Wind'; break; ... default: Beaufort = "irgendwas".; break;
-
case funktioniert auch.
Aber vielleicht könnte mal ein Experte sagen, ob es da eine bessere Methode gibt.
Für mich hätte "if", "else if" oder case den gleichen Effekt.
Gibts da eine Auswahl "was ist besser ?" -
@bahnuhr sagte in If Then mehrfach [gelöst]:
case funktioniert auch.
Aber vielleicht könnte mal ein Experte sagen, ob es da eine bessere Methode gibt.
Für mich hätte "if", "else if" oder case den gleichen Effekt.
Gibts da eine Auswahl "was ist besser ?""Switch - Case" ist in der Ausführung schneller, meinte ich mal gehört zu haben. Das liegt wohl daran, dass der Compiler beim Kompilieren den Code effizienter gestalten kann.
Alternative wäre noch eine LookUp-Table, aber das funktioniert meines Wissens nicht mit Vergleichsoperatoren <, > sondern nur mit ===.