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 -
@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 ];
?
-
@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.
-
@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);
-
@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.
-
@paul53 Super vielen Dank das funktioniert, ich werd mir das mal auseinandernehmen um zu verstehen, was du da gebaut hast.