Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. JavaScript
    5. [gelöst] Falsche Durchschnittswerte

    NEWS

    • ioBroker@Smart Living Forum Solingen, 14.06. - Agenda added

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    [gelöst] Falsche Durchschnittswerte

    This topic has been deleted. Only users with topic management privileges can see it.
    • CrunkFX
      CrunkFX Forum Testing last edited by 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

      paul53 1 Reply Last reply Reply Quote 0
      • paul53
        paul53 @CrunkFX last edited by paul53

        @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 1 Reply Last reply Reply Quote 0
        • CrunkFX
          CrunkFX Forum Testing @paul53 last edited by

          @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 2 Replies Last reply Reply Quote 0
          • paul53
            paul53 @CrunkFX last edited by paul53

            @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 1 Reply Last reply Reply Quote 0
            • CrunkFX
              CrunkFX Forum Testing @paul53 last edited by CrunkFX

              @paul53

              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.

              1 Reply Last reply Reply Quote 0
              • paul53
                paul53 @CrunkFX last edited by

                @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 1 Reply Last reply Reply Quote 1
                • CrunkFX
                  CrunkFX Forum Testing @paul53 last edited by

                  @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 1 Reply Last reply Reply Quote 0
                  • paul53
                    paul53 @CrunkFX last edited by

                    @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.

                    CrunkFX 1 Reply Last reply Reply Quote 1
                    • CrunkFX
                      CrunkFX Forum Testing @paul53 last edited by

                      @paul53 Super vielen Dank das funktioniert, ich werd mir das mal auseinandernehmen um zu verstehen, was du da gebaut hast.

                      1 Reply Last reply Reply Quote 0
                      • First post
                        Last post

                      Support us

                      ioBroker
                      Community Adapters
                      Donate

                      969
                      Online

                      31.7k
                      Users

                      79.7k
                      Topics

                      1.3m
                      Posts

                      2
                      9
                      260
                      Loading More Posts
                      • Oldest to Newest
                      • Newest to Oldest
                      • Most Votes
                      Reply
                      • Reply as topic
                      Log in to reply
                      Community
                      Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
                      The ioBroker Community 2014-2023
                      logo