NEWS
[gelöst] Falsche Durchschnittswerte
-
Hi,
ich versuche mich ein bissl in Javascript und scheitere gerade an dem Berechnen eines Durchschnitts:var rooms; var total = 0; var avg; // Aufzählung Raumtemperaturen rooms = [ getState("alias.0.Temperatur.Bad").val, getState("alias.0.Temperatur.Büro").val, getState("alias.0.Temperatur.Flur").val, getState("alias.0.Temperatur.Küche").val, getState("alias.0.Temperatur.Schlafzimmer").val, getState("alias.0.Temperatur.Wohnzimmer").val ]; // Durchschnittstemperatur berechnen on({ id: [ 'alias.0.Temperatur.Bad', 'alias.0.Temperatur.Büro', 'alias.0.Temperatur.Flur', 'alias.0.Temperatur.Küche', 'alias.0.Temperatur.Schlafzimmer', 'alias.0.Temperatur.Wohnzimmer', ], change: "ne" }, function (obj) { for (var n = 0; n < rooms.length; n++) { total += rooms[n]; } avg = total / rooms.length; setState("alias.0.Temperatur.Wohnung", avg); })Ich bekomme zwar einen Wert, dieser ist aber viel zu hoch.
Liegt das am Script?MFG
CrunkFX -
Hi,
ich versuche mich ein bissl in Javascript und scheitere gerade an dem Berechnen eines Durchschnitts:var rooms; var total = 0; var avg; // Aufzählung Raumtemperaturen rooms = [ getState("alias.0.Temperatur.Bad").val, getState("alias.0.Temperatur.Büro").val, getState("alias.0.Temperatur.Flur").val, getState("alias.0.Temperatur.Küche").val, getState("alias.0.Temperatur.Schlafzimmer").val, getState("alias.0.Temperatur.Wohnzimmer").val ]; // Durchschnittstemperatur berechnen on({ id: [ 'alias.0.Temperatur.Bad', 'alias.0.Temperatur.Büro', 'alias.0.Temperatur.Flur', 'alias.0.Temperatur.Küche', 'alias.0.Temperatur.Schlafzimmer', 'alias.0.Temperatur.Wohnzimmer', ], change: "ne" }, function (obj) { for (var n = 0; n < rooms.length; n++) { total += rooms[n]; } avg = total / rooms.length; setState("alias.0.Temperatur.Wohnung", avg); })Ich bekomme zwar einen Wert, dieser ist aber viel zu hoch.
Liegt das am Script?MFG
CrunkFX@CrunkFX sagte:
Wert, dieser ist aber viel zu hoch.
Wenn das funktioniert mit einem Array of functions: Du hast vergessen, die Variable total vor der Schleife auf 0 zu setzen.
EDIT: Weshalb ist "Temperatur.Wohnung" ein Alias und nicht "0_userdata.0.Temperatur.Wohnung" ?
-
@CrunkFX sagte:
Wert, dieser ist aber viel zu hoch.
Wenn das funktioniert mit einem Array of functions: Du hast vergessen, die Variable total vor der Schleife auf 0 zu setzen.
EDIT: Weshalb ist "Temperatur.Wohnung" ein Alias und nicht "0_userdata.0.Temperatur.Wohnung" ?
@paul53 Temperatur.Wohnung verweist auf 0_userdata.0.Temperatur.Wohnung somit hab ich alles in einem Ordner. Nun bleibt der Wert konstant bei 16.95. Den Fehler mit der 0 verstehe ich aber nun? Du meinst also, dass dieser Teil ein Problem ist:
rooms = [ getState("alias.0.Temperatur.Bad").val, getState("alias.0.Temperatur.Büro").val, getState("alias.0.Temperatur.Flur").val, getState("alias.0.Temperatur.Küche").val, getState("alias.0.Temperatur.Schlafzimmer").val, getState("alias.0.Temperatur.Wohnzimmer").val ];?
-
@paul53 Temperatur.Wohnung verweist auf 0_userdata.0.Temperatur.Wohnung somit hab ich alles in einem Ordner. Nun bleibt der Wert konstant bei 16.95. Den Fehler mit der 0 verstehe ich aber nun? Du meinst also, dass dieser Teil ein Problem ist:
rooms = [ getState("alias.0.Temperatur.Bad").val, getState("alias.0.Temperatur.Büro").val, getState("alias.0.Temperatur.Flur").val, getState("alias.0.Temperatur.Küche").val, getState("alias.0.Temperatur.Schlafzimmer").val, getState("alias.0.Temperatur.Wohnzimmer").val ];?
@CrunkFX sagte:
Du meinst also, dass dieser Teil ein Problem ist:
Nicht unbedingt, ich habe allerdings noch nie ein Array of functions verwendet und weiß nicht, ob das funktioniert. Ich vermute, dass der bei Script-Start eingelesene Wert erhalten bleibt.
@CrunkFX sagte in Falsche Durchschnittswerte:
Temperatur.Wohnung verweist auf 0_userdata.0.Temperatur.Wohnung
Es macht keinen Sinn, zu eigenen Datenpunkten einen Alias zu erzeugen (Ressourcen-Verschwendung).
-
@CrunkFX sagte:
Du meinst also, dass dieser Teil ein Problem ist:
Nicht unbedingt, ich habe allerdings noch nie ein Array of functions verwendet und weiß nicht, ob das funktioniert. Ich vermute, dass der bei Script-Start eingelesene Wert erhalten bleibt.
@CrunkFX sagte in Falsche Durchschnittswerte:
Temperatur.Wohnung verweist auf 0_userdata.0.Temperatur.Wohnung
Es macht keinen Sinn, zu eigenen Datenpunkten einen Alias zu erzeugen (Ressourcen-Verschwendung).
Es macht keinen Sinn, zu eigenen Datenpunkten einen Alias zu erzeugen (Ressourcen-Verschwendung).
Gut hab verstanden!
Weiterhin so funktioniert es jetzt:
var rooms; var avg; function mathMean(myList) { return myList.reduce(function (x, y) { return x + y; }) / myList.length; } // Durchschnittstemperatur berechnen on({ id: [ 'alias.0.Temperatur.Bad', 'alias.0.Temperatur.Büro', 'alias.0.Temperatur.Flur', 'alias.0.Temperatur.Küche', 'alias.0.Temperatur.Schlafzimmer', 'alias.0.Temperatur.Wohnzimmer', ], change: "ne" }, function (obj) { setState("0_userdata.0.Temperatur.Wohnung", (mathMean([ getState("alias.0.Temperatur.Bad").val, getState("alias.0.Temperatur.Büro").val, getState("alias.0.Temperatur.Flur").val, getState("alias.0.Temperatur.Küche").val, getState("alias.0.Temperatur.Schlafzimmer").val, getState("alias.0.Temperatur.Wohnzimmer").val]))) });So aber nicht:
var rooms; var avg; function mathMean(myList) { return myList.reduce(function (x, y) { return x + y; }) / myList.length; } // Aufzählung Raumtemperaturen rooms = [ getState("alias.0.Temperatur.Bad").val, getState("alias.0.Temperatur.Büro").val, getState("alias.0.Temperatur.Flur").val, getState("alias.0.Temperatur.Küche").val, getState("alias.0.Temperatur.Schlafzimmer").val, getState("alias.0.Temperatur.Wohnzimmer").val ]; // Durchschnittstemperatur berechnen on({ id: [ 'alias.0.Temperatur.Bad', 'alias.0.Temperatur.Büro', 'alias.0.Temperatur.Flur', 'alias.0.Temperatur.Küche', 'alias.0.Temperatur.Schlafzimmer', 'alias.0.Temperatur.Wohnzimmer', ], change: "ne" }, function (obj) { setState("0_userdata.0.Temperatur.Wohnung", (mathMean(rooms))) });Kannst du erkenne wieso? Mir fehlt einfach die Ahnung.
-
@paul53 Temperatur.Wohnung verweist auf 0_userdata.0.Temperatur.Wohnung somit hab ich alles in einem Ordner. Nun bleibt der Wert konstant bei 16.95. Den Fehler mit der 0 verstehe ich aber nun? Du meinst also, dass dieser Teil ein Problem ist:
rooms = [ getState("alias.0.Temperatur.Bad").val, getState("alias.0.Temperatur.Büro").val, getState("alias.0.Temperatur.Flur").val, getState("alias.0.Temperatur.Küche").val, getState("alias.0.Temperatur.Schlafzimmer").val, getState("alias.0.Temperatur.Wohnzimmer").val ];?
@CrunkFX
Ich würde es so angehen:const rooms = [ 'alias.0.Temperatur.Bad', 'alias.0.Temperatur.Büro', 'alias.0.Temperatur.Flur', 'alias.0.Temperatur.Küche', 'alias.0.Temperatur.Schlafzimmer', 'alias.0.Temperatur.Wohnzimmer', ]; const temps = []; function mean() { let total = 0; for (let n = 0; n < rooms.length; n++) { total += temps[n]; } return total / rooms.length; } for (let n = 0; n < rooms.length; n++) { temps[n] = getState(rooms[n]).val; } setState("0_userdata.0.Temperatur.Wohnung", mean(), true); on(rooms, function(dp) { let idx = rooms.indexOf(dp.id); temps[idx] = dp.state.val; setState("0_userdata.0.Temperatur.Wohnung", mean(), true); }); -
@CrunkFX
Ich würde es so angehen:const rooms = [ 'alias.0.Temperatur.Bad', 'alias.0.Temperatur.Büro', 'alias.0.Temperatur.Flur', 'alias.0.Temperatur.Küche', 'alias.0.Temperatur.Schlafzimmer', 'alias.0.Temperatur.Wohnzimmer', ]; const temps = []; function mean() { let total = 0; for (let n = 0; n < rooms.length; n++) { total += temps[n]; } return total / rooms.length; } for (let n = 0; n < rooms.length; n++) { temps[n] = getState(rooms[n]).val; } setState("0_userdata.0.Temperatur.Wohnung", mean(), true); on(rooms, function(dp) { let idx = rooms.indexOf(dp.id); temps[idx] = dp.state.val; setState("0_userdata.0.Temperatur.Wohnung", mean(), true); });@paul53 Das sieht schon besser aus, wann wird der Teil ausgeführt, dass kann ich nicht erkennen:
for (let n = 0; n < rooms.length; n++) { temps[n] = getState(rooms[n]).val; } setState("0_userdata.0.Temperatur.Wohnung", mean(), true); -
@paul53 Das sieht schon besser aus, wann wird der Teil ausgeführt, dass kann ich nicht erkennen:
for (let n = 0; n < rooms.length; n++) { temps[n] = getState(rooms[n]).val; } setState("0_userdata.0.Temperatur.Wohnung", mean(), true); -
@CrunkFX sagte:
wann wird der Teil ausgeführt, dass kann ich nicht erkennen:
Bei Script-Start. Es wird das Temperaturen-Array befüllt und anschließend der Mittelwert geschrieben.
Hey! Du scheinst an dieser Unterhaltung interessiert zu sein, hast aber noch kein Konto.
Hast du es satt, bei jedem Besuch durch die gleichen Beiträge zu scrollen? Wenn du dich für ein Konto anmeldest, kommst du immer genau dorthin zurück, wo du zuvor warst, und kannst dich über neue Antworten benachrichtigen lassen (entweder per E-Mail oder Push-Benachrichtigung). Du kannst auch Lesezeichen speichern und Beiträge positiv bewerten, um anderen Community-Mitgliedern deine Wertschätzung zu zeigen.
Mit deinem Input könnte dieser Beitrag noch besser werden 💗
Registrieren Anmelden