Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. JavaScript
    5. Dynamisch erstellte Variablen.

    NEWS

    • Neuer Blog: Fotos und Eindrücke aus Solingen

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

    • ioBroker goes Matter ... Matter Adapter in Stable

    Dynamisch erstellte Variablen.

    This topic has been deleted. Only users with topic management privileges can see it.
    • Armilar
      Armilar Most Active Forum Testing @Codierknecht last edited by

      @codierknecht sagte in Dynamisch erstellte Variablen.:

      kann ich die mit recordoder struct vergleichen?

      Records und Tuples, wenn @Homoran denn mindestens eine Variable zuässt 😉

      let myRecord = #{ a: 1, b: 2, c: 2};
      let recordKeys = Object.keys(myRecord); // Returns ['a', 'b', 'c'];
      
      let myTuple = #[1, 2, 3, 4, 5];
      for(const i of myTuple) {
          console.log(i);
      }
      
      1 Reply Last reply Reply Quote 0
      • OliverIO
        OliverIO @Homoran last edited by

        @homoran
        und woher kommt die information wie die flugnummer genau lautet? die musst du ja in eine variable speichern, die dann weiterverwendet wird.
        die beiden flugnummern habe ich nur beispielhaft vordefiniert, damit es klarer wird.
        wenn du wiederverwendbaren code hast, dann hast du da nur eine variable

        hier ein bisschen besser strukturierter code

        var flights={}; //initialisieren der Hauptvariable, die alles enthält
        addData("ab1234","Meine Informationen 1");
        addData("cd5678",{name: "Ich bin ein Objekt"});
        console.log(flights);
        deleteData("ab1234");
        console.log(flights);
        
        function addData(flightnumber,data) {
            flights[flightnumber] = data;
        }
        function deleteData(flightnumber) {
            delete flights[flightnumber];
        }
        
        
        Homoran 1 Reply Last reply Reply Quote 1
        • paul53
          paul53 @Codierknecht last edited by

          @codierknecht sagte: Die "Objekte" von denen ihr hier sprecht ... kann ich die mit record oder struct vergleichen?

          Ja.

          1 Reply Last reply Reply Quote 1
          • Homoran
            Homoran Global Moderator Administrators @OliverIO last edited by Homoran

            @oliverio sagte in Dynamisch erstellte Variablen.:

            und woher kommt die information wie die flugnummer genau lautet? d

            die sendet mir der Flieger über Funk zu 🙂

            { "now" : 1668369287.4, "messages" : 4842861, "aircraft" : [ {"hex":"406b0a","mlat":[],"tisb":[],"messages":9,"seen":13.0,"rssi":-26.7}, {"hex":"3c49ee","flight":"CFG069 ","alt_baro":9075,"alt_geom":9375,"gs":307.0,"ias":250,"tas":286,"mach":0.444,"track":259.7,"track_rate":0.00,"roll":0.7,"mag_heading":257.2,"baro_rate":-1568,"geom_rate":-1600,"squawk":"1000","nav_qnh":1013.3,"nav_altitude_mcp":7008,"lat":51.176225,"lon":7.089844,"nic":6,"rc":926,"seen_pos":2.2,"version":0,"nac_p":6,"nac_v":0,"sil":2,"sil_type":"unknown","mlat":[],"tisb":[],"messages":155,"seen":0.1,"rssi":-24.7}, {"hex":"44006c","flight":"AUA3SV ","alt_baro":31575,"alt_geom":32575,"gs":433.0,"ias":291,"tas":466,"mach":0.792,"track":124.9,"track_rate":0.00,"roll":0.0,"mag_heading":122.5,"baro_rate":1216,"geom_rate":1184,"squawk":"1000","category":"A3","nav_qnh":1012.8,"nav_altitude_mcp":35008,"lat":51.361771,"lon":7.286979,"nic":8,"rc":186,"seen_pos":16.6,"version":2,"nic_baro":1,"nac_p":9,"nac_v":1,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"mlat":[],"tisb":[],"messages":1705,"seen":12.9,"rssi":-26.0}, {"hex":"3c4d68","flight":"DLH2MT ","alt_baro":34200,"alt_geom":35250,"gs":425.0,"ias":275,"tas":462,"mach":0.792,"track":135.7,"track_rate":0.00,"roll":0.2,"mag_heading":132.9,"baro_rate":736,"geom_rate":832,"squawk":"1000","category":"A3","nav_qnh":1012.8,"nav_altitude_mcp":36992,"nav_heading":132.2,"lat":51.045319,"lon":7.311773,"nic":8,"rc":186,"seen_pos":0.4,"version":2,"nic_baro":1,"nac_p":9,"nac_v":1,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"mlat":[],"tisb":[],"messages":1170,"seen":0.0,"rssi":-21.1}, {"hex":"4ca27f","version":0,"sil_type":"unknown","mlat":[],"tisb":[],"messages":48,"seen":129.3,"rssi":-26.8}, {"hex":"4aca69","flight":"SAS51B ","alt_baro":35000,"alt_geom":36025,"gs":438.2,"ias":265,"tas":452,"mach":0.780,"track":40.7,"track_rate":0.03,"roll":-0.2,"mag_heading":46.1,"baro_rate":-64,"geom_rate":-64,"squawk":"5515","emergency":"none","category":"A3","nav_qnh":1013.6,"nav_altitude_mcp":35008,"nav_altitude_fms":35008,"nav_modes":["autopilot","vnav","tcas"],"lat":51.066036,"lon":6.481018,"nic":8,"rc":186,"seen_pos":2.2,"version":2,"nic_baro":1,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"mlat":[],"tisb":[],"messages":3819,"seen":0.5,"rssi":-24.9}, {"hex":"89610a","category":"A5","version":2,"sil_type":"perhour","mlat":[],"tisb":[],"messages":382,"seen":49.8,"rssi":-26.6}, {"hex":"4cad39","category":"A3","version":2,"sil_type":"perhour","mlat":[],"tisb":[],"messages":705,"seen":111.8,"rssi":-27.0}, {"hex":"4d22e7","mlat":[],"tisb":[],"messages":28,"seen":212.1,"rssi":-28.3}, {"hex":"44034b","alt_baro":38025,"ias":247,"mach":0.780,"mag_heading":333.8,"baro_rate":128,"geom_rate":160,"version":0,"nac_p":8,"sil":2,"sil_type":"unknown","mlat":[],"tisb":[],"messages":82,"seen":0.1,"rssi":-26.8}, {"hex":"407cd4","version":2,"sil_type":"perhour","mlat":[],"tisb":[],"messages":631,"seen":193.6,"rssi":-26.6}, {"hex":"3c65d9","category":"A3","version":2,"sil_type":"perhour","mlat":[],"tisb":[],"messages":826,"seen":106.4,"rssi":-26.7}, {"hex":"4a0661","version":0,"sil_type":"unknown","mlat":[],"tisb":[],"messages":220,"seen":263.1,"rssi":-27.5}, {"hex":"4072ea","version":0,"sil_type":"unknown","mlat":[],"tisb":[],"messages":74,"seen":107.2,"rssi":-26.4}, {"hex":"4b1807","flight":"SWR70T ","alt_baro":35000,"alt_geom":36000,"gs":423.3,"ias":268,"tas":456,"mach":0.788,"track":149.3,"track_rate":0.00,"roll":-0.7,"mag_heading":143.1,"baro_rate":32,"geom_rate":-64,"squawk":"1000","category":"A3","nav_qnh":1012.8,"nav_altitude_mcp":35008,"nav_heading":143.4,"lat":50.553030,"lon":7.289800,"nic":8,"rc":186,"seen_pos":0.3,"version":2,"nic_baro":1,"nac_p":11,"nac_v":1,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"mlat":[],"tisb":[],"messages":4456,"seen":0.0,"rssi":-23.0}, {"hex":"3964ec","flight":"TVF7449 ","alt_baro":38000,"alt_geom":38950,"gs":459.3,"ias":247,"tas":444,"mach":0.780,"track":218.2,"track_rate":0.00,"roll":-0.4,"mag_heading":211.3,"baro_rate":0,"geom_rate":0,"squawk":"3527","category":"A3","nav_qnh":1013.6,"nav_altitude_mcp":36992,"nav_altitude_fms":38000,"nav_heading":210.9,"lat":50.559586,"lon":6.376696,"nic":8,"rc":186,"seen_pos":12.8,"version":2,"nic_baro":1,"nac_p":9,"nac_v":1,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"mlat":[],"tisb":[],"messages":6761,"seen":10.5,"rssi":-26.2}, {"hex":"471fa2","category":"A3","version":2,"sil_type":"perhour","mlat":[],"tisb":[],"messages":279,"seen":51.8,"rssi":-27.2}, {"hex":"471f6c","category":"A3","version":2,"sil_type":"perhour","mlat":[],"tisb":[],"messages":1540,"seen":201.5,"rssi":-26.6}, {"hex":"47c1f7","category":"A3","version":2,"sil_type":"perhour","mlat":[],"tisb":[],"messages":5932,"seen":83.6,"rssi":-25.8}, {"hex":"3c5ee1","alt_baro":14525,"alt_geom":15575,"gs":339.1,"track":150.1,"baro_rate":-960,"squawk":"3417","category":"A3","nav_qnh":1012.8,"nav_altitude_mcp":10016,"lat":50.638081,"lon":7.644332,"nic":8,"rc":186,"seen_pos":43.4,"version":2,"nic_baro":1,"nac_p":9,"nac_v":1,"sil":3,"sil_type":"perhour","mlat":[],"tisb":[],"messages":4361,"seen":10.3,"rssi":-26.9}, {"hex":"c027d1","flight":"ACA7211 ","alt_baro":30000,"alt_geom":30850,"gs":502.5,"ias":296,"tas":462,"mach":0.780,"track":292.0,"track_rate":0.00,"roll":-0.2,"mag_heading":290.7,"baro_rate":0,"geom_rate":0,"squawk":"2501","emergency":"none","category":"A5","nav_qnh":1013.6,"nav_altitude_mcp":30016,"nav_altitude_fms":30000,"nav_heading":291.1,"lat":51.033263,"lon":6.121445,"nic":8,"rc":186,"seen_pos":33.7,"version":2,"nic_baro":1,"nac_p":11,"nac_v":2,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"mlat":[],"tisb":[],"messages":8930,"seen":0.9,"rssi":-26.5}, {"hex":"06a2e2","category":"A5","version":2,"sil_type":"perhour","mlat":[],"tisb":[],"messages":1410,"seen":237.1,"rssi":-25.1}, {"hex":"471f51","category":"A3","version":2,"sil_type":"perhour","mlat":[],"tisb":[],"messages":1032,"seen":287.4,"rssi":-22.6}, {"hex":"3c55c3","category":"A3","version":2,"sil_type":"perhour","mlat":[],"tisb":[],"messages":1134,"seen":276.4,"rssi":-26.6}, {"hex":"471f96","category":"A3","version":2,"sil_type":"perhour","mlat":[],"tisb":[],"messages":3065,"seen":295.1,"rssi":-26.2}, {"hex":"400942","category":"A3","version":2,"sil_type":"perhour","mlat":[],"tisb":[],"messages":1542,"seen":174.5,"rssi":-26.0}, {"hex":"4ca569","category":"A3","version":2,"sil_type":"perhour","mlat":[],"tisb":[],"messages":1605,"seen":126.2,"rssi":-26.5}, {"hex":"a826e9","category":"A5","version":2,"sil_type":"perhour","mlat":[],"tisb":[],"messages":3619,"seen":162.4,"rssi":-24.2} ] } 
            

            daraus extrahiere und berechne ich

             },
              {
                "Kennung": "BPO140  ",
                "Hoehe": 419,
                "Bodenabstand": 4397,
                "Entfernung": 4417,
                "Position": "50.xyz44,7.abc498"
              },
            
            OliverIO 1 Reply Last reply Reply Quote 0
            • OliverIO
              OliverIO @Codierknecht last edited by

              @codierknecht sagte in Dynamisch erstellte Variablen.:

              In anderen Sprachen würde ich dafür eine Collection nehmen.

              collection entspricht in js einem set
              https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Set?retiredLocale=de

              1 Reply Last reply Reply Quote 1
              • OliverIO
                OliverIO @Homoran last edited by

                @homoran sagte in Dynamisch erstellte Variablen.:

                {                                                                                                                                                                                "Kennung": "BPO140  ",                                                                                                                                                                                "Hoehe": 419,                                                                                                                                                                                "Bodenabstand": 4397,                                                                                                                                                                                "Entfernung": 4417,                                                                                                                                                                                "Position": "50.xyz44,7.abc498"                                                                                                                                                                              },
                

                ja, da liest man dann die kennung aus für den schlüssel und speichert genau das abgebildete wie oben gezeigt dem flights zu.
                dem ausschnitt nach sieht es so aus das es aus einem array of objects stammt.
                willst du die dann der reihe nach abarbeiten?

                Homoran 1 Reply Last reply Reply Quote 0
                • Homoran
                  Homoran Global Moderator Administrators @OliverIO last edited by Homoran

                  @oliverio im Moment bekomme ich alle 10 Sekunden einen Datensatz (ggf. zwei oder drei, wenn sich z.b. noch so ein Polizeihubschrauber im Auswahlbereich befindet).
                  diese logge und konseviere ich. Ist aber zu viel.
                  Screenshot_20221113-211711_Firefox.jpg
                  daher möchte ich nur den Datensatz (je Flug) in den DP schreiben, bei dem sich der Flieger am dichtesten bei mir befindet. um Flugnumner, Höhe und Timestamp zu dokumentieren.
                  dafür schreibe ich (wollte ich schreiben) diese Datensätze in ein Array je Flug.
                  Das kann dann nach der Auswertung verworfen werden.

                  so mein Plan.

                  OliverIO 1 Reply Last reply Reply Quote 1
                  • OliverIO
                    OliverIO @Homoran last edited by

                    @homoran
                    kannst du auch machen.
                    der direktzugriff auf einen bestimmten datensatz
                    https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/findIndex

                    oder
                    das entfernen eines bestimmten datensatzes ist dann ein wenig aufwändiger
                    https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/splice?retiredLocale=de

                    Homoran 1 Reply Last reply Reply Quote 1
                    • Homoran
                      Homoran Global Moderator Administrators @OliverIO last edited by

                      @oliverio danke! das sehe ich mir morgen mal an

                      1 Reply Last reply Reply Quote 0
                      • P
                        ptr @OliverIO last edited by

                        @oliverio @Armilar
                        so, habe das Problem jetzt nochmal als übersichtliches Skript zusammengestellt. Das Skript funktioniert, puh.
                        Die Vielzahl der "var"s bitte ignorieren, werden aktuell noch nicht verwendet.

                        Die Frage ist nun: Ich habe 4 Lautsprecher mit denen das gleiche passieren soll (nur mit anderen Timerwerten, Lautstärkewerten).
                        So wie das Skript das jetzt transparent macht. Wie kann ich das elegant zusammenfassen? Der Zweck ist: jede case-Ausführung wird noch deutlich länger werden. Da wird der Code dann sehr unübersichtlich wenn ich immer alles bei jedem case hinschreiben muss - wenn es ja eh gleich ist.
                        sobald ich alles aus den cases per function rausziehe, klappt es nichtmehr. Wenn das hilft, kann ich das natürlich auch nochmal schicken.
                        So das mal der Zwischenstand.

                        var trigger, elemente_von_trigger, trig_raum, trig_raum_timer1, raum_timer_definition, trig_lautsprecher_pfad, trig_lautsprecher_volume_aktueller_wert, timeout, timeout2, timeout3, timeout4, trig_lautsprecher_volume, volume_standard;
                        
                        
                        on({id: [].concat(Array.prototype.slice.apply($("channel[state.id=alias.0.*.Lautsprecher1.state]"))), change: "ne", ack: true}, async function (obj) {
                          var value = obj.state.val;
                          var oldValue = obj.oldState.val;
                          console.log(obj.id);
                        
                          switch (obj.id) {
                          	case 'alias.0.OG.Yunes_Zimmer.Lautsprecher1.state':
                            if ((obj.state ? obj.state.val : "") == 'play') {
                              setStateDelayed('alias.0.OG.Yunes_Zimmer.Lautsprecher1.volume', 14, false, parseInt(((0) || "").toString(), 10), true);
                              (function () {if (timeout) {clearTimeout(timeout); timeout = null;}})();
                              timeout = setTimeout(async function () {
                                setStateDelayed(obj.id, 'stop', false, parseInt(((0) || "").toString(), 10), true);
                              }, 1800000);
                            }
                        
                          		break;
                          	case 'alias.0.OG.Minas_Zimmer.Lautsprecher1.state':
                            if ((obj.state ? obj.state.val : "") == 'play') {
                              setStateDelayed('alias.0.OG.Minas_Zimmer.Lautsprecher1.volume', 14, false, parseInt(((0) || "").toString(), 10), true);
                              (function () {if (timeout2) {clearTimeout(timeout2); timeout2 = null;}})();
                              timeout2 = setTimeout(async function () {
                                setStateDelayed(obj.id, 'stop', false, parseInt(((0) || "").toString(), 10), true);
                              }, 1800000);
                            }
                        
                          		break;
                          	case 'alias.0.KG.Hobbyraum.Lautsprecher1.state':
                            if ((obj.state ? obj.state.val : "") == 'play') {
                              setStateDelayed('alias.0.KG.Hobbyraum.Lautsprecher1.volume', 14, false, parseInt(((0) || "").toString(), 10), true);
                              (function () {if (timeout3) {clearTimeout(timeout3); timeout3 = null;}})();
                              timeout3 = setTimeout(async function () {
                                setStateDelayed(obj.id, 'stop', false, parseInt(((0) || "").toString(), 10), true);
                              }, 14400000);
                            }
                        
                          		break;
                          	case 'alias.0.EG.Wohnzimmer.Lautsprecher1.state':
                            if ((obj.state ? obj.state.val : "") == 'play') {
                              setStateDelayed('alias.0.EG.Wohnzimmer.Lautsprecher1.volume', 14, false, parseInt(((0) || "").toString(), 10), true);
                              (function () {if (timeout4) {clearTimeout(timeout4); timeout4 = null;}})();
                              timeout4 = setTimeout(async function () {
                                setStateDelayed(obj.id, 'stop', false, parseInt(((0) || "").toString(), 10), true);
                              }, 14400000);
                            }
                        
                          		break;
                          }
                        });
                        
                        Codierknecht OliverIO 2 Replies Last reply Reply Quote 0
                        • Codierknecht
                          Codierknecht Developer Most Active @ptr last edited by Codierknecht

                          @ptr
                          Grundregel: Don't repeat yourself!
                          Alles was sich immer wieder wiederholt (copy & paste) ist ein Kandidat für das Auslagern in eine Funktion.

                          Hab' gerade gesehen, dass Du da mit verschiedenen Timern arbeitest.
                          Muss ich mir mal genauer anschauen ...

                          P.S.: Ich will ja nicht meckern, aber bei der Einrückung kann man den Code fast nicht lesen 😉

                          1 Reply Last reply Reply Quote 0
                          • OliverIO
                            OliverIO @ptr last edited by OliverIO

                            @ptr

                            so mal ein schnellschuss ohne es selbst geprüft zu haben
                            da können noch fehler drin sein, aber das grundprinzip müsste klar werden.
                            das was @Codierknecht sagte ist korrekt.
                            jede wiederholung birgt gefahren neuer fehler. wahrscheinlich hast du dich selbst mit dem code schon schwer getan dich zurecht zu finden.
                            auch hier könnte man noch weiter optimieren (die timerbehandlung gefällt mir da noch nicht. sieht aus wie ein codeschnipsel den du irgendwo gefunden und da reinkopiert hast. dürfte aber schon funktionieren.

                            var rooms = {
                                "Yunes_Zimmer": {
                                    "volume": 14,
                                    "volume_dp":"alias.0.OG.Yunes_Zimmer.Lautsprecher1.volume",
                                    "state_dp": "alias.0.OG.Yunes_Zimmer.Lautsprecher1.state",
                                    "timer": null
                                },
                                "Minas_Zimmer": {
                                    "volume": 14,
                                    "volume_dp":"alias.0.OG.Minas_Zimmer.Lautsprecher1.volume",
                                    "state_dp": "alias.0.OG.Minas_Zimmer.Lautsprecher1.state",
                                    "timer": null
                                },
                                "Hobbyraum": {
                                    "volume": 14,
                                    "volume_dp":"alias.0.KG.Hobbyraum.Lautsprecher1.volume",
                                    "state_dp": "alias.0.KG.Hobbyraum.Lautsprecher1.state",
                                    "timer": null
                                },
                                "Wohnzimmer": {
                                    "volume": 14,
                                    "volume_dp":"alias.0.EG.Wohnzimmer.Lautsprecher1.volume",
                                    "state_dp": "alias.0.EG.Wohnzimmer.Lautsprecher1.state",
                                    "timer": null
                                }
                            }
                            function doSleep(room) {
                                var room_config = rooms[room];
                                setStateDelayed(room_config['volume_dp'], room_config['volume'], false, parseInt(((0) || "").toString(), 10), true);
                                (function () { if (room_config['timer']) { clearTimeout(room_config['timer']); room_config['timer'] = null; } })();
                                room_config['timer'] = setTimeout(async function () {
                                    setStateDelayed(room_config['state_dp'], 'stop', false, parseInt(((0) || "").toString(), 10), true);
                                }, 1800000);
                            }
                            
                            on({ id: [].concat(Array.prototype.slice.apply($("channel[state.id=alias.0.*.Lautsprecher1.state]"))), change: "ne", ack: true }, async function (obj) {
                                var value = obj.state.val;
                                var oldValue = obj.oldState.val;
                                console.log(obj.id);
                                var room = obj.id.split(".")[3];
                                if ((obj.state ? obj.state.val : "") == 'play') {
                                    doSleep(room);
                                }
                            }
                            
                            

                            die entwicklungsumgebung zu javascript im javascript adapter ist nicht ideal. erst recht nicht für anfänger.
                            evtl. liest du dir mal das durch und wechselst zu vs code
                            https://forum.iobroker.net/topic/40633/tester-gesucht-visual-studio-code-extension-für-iobroker

                            in vs code kann man viel besser debuggen und entwickeln.
                            ich selbst hab die extension noch nicht getestet. aber es gibt welche die das gut finden

                            Codierknecht 1 Reply Last reply Reply Quote 0
                            • Codierknecht
                              Codierknecht Developer Most Active @OliverIO last edited by

                              @oliverio
                              Ah, Du verwaltest die Timer mit im jeweiligen Raum 👍

                              OliverIO 1 Reply Last reply Reply Quote 0
                              • OliverIO
                                OliverIO @Codierknecht last edited by

                                @codierknecht
                                ja dann ist alles beieinander und im debuggingfall lässt sich das leicht ausgeben

                                P 1 Reply Last reply Reply Quote 1
                                • P
                                  ptr @OliverIO last edited by

                                  @oliverio danke. ich schaue es mir an!

                                  P 1 Reply Last reply Reply Quote 0
                                  • P
                                    ptr @ptr last edited by

                                    @OliverIO: Warum wird die function ausfuehren_nach-timeout nie ausgeführt? wo liegt der Haken?
                                    & vielen Dank für das (eigentlich) gemachte Bettchen, dass ich als Vorlage verwendet habe.

                                    Es ist noch zuviel drin. timer_dp hat z.B. noch keinen Zweck.

                                    var timer_dauer_in_sek, timer_name, timer_dauer_in_millisek, timer_minuten, timer_sekunden, timer_trigger_array, timer1_name;
                                    
                                    async function multitimer_function(timer_name, timer_dauer_in_millisek) {
                                        console.log('...js-start');
                                    
                                        var multitimer = {
                                            "hobbyraum_timer": {
                                                "timer_dp":"0_userdata.0.KG.Hobbyraum.Timer1",
                                                "timer": null
                                            },
                                            "abstellraum_timer": {
                                                "timer_dp":"0_userdata.0.KG.Abstellraum.Timer1",
                                                "timer": null
                                            },
                                            "hauswirtschaftsraum_timer": {
                                                "timer_dp":"0_userdata.0.KG.Hauswirtschaftsraum.Timer1",
                                                "timer": null
                                            },
                                            "technikraum_timer": {
                                                "timer_dp":"0_userdata.0.KG.Technikraum.Timer1",
                                                "timer": null
                                            },
                                            "kg-flur_timer": {
                                                "timer_dp":"0_userdata.0.KG.KG-Flur.Timer1",
                                                "timer": null
                                            },
                                            "kg-treppe_timer": {
                                                "timer_dp":"0_userdata.0.TR.KG-Treppe.Timer1",
                                                "timer": null
                                            },
                                        }
                                        function tueroeffnung_ohne_bewegung(timer_name) {
                                            var timer_parameters = multitimer['hobbyraum_timer'];
                                            // stoppt den "timer":
                                            (function () { if (timer_parameters['timer']) { clearTimeout(timer_parameters['timer']); timer_parameters['timer'] = null; } })();
                                            // "timer" wird gesetzt:
                                            timer_parameters['timer'] = setTimeout(async function () {
                                                await ausfuehren_nach_timeout(timer_name);
                                                console.log('.........................');
                                            }, parseInt(timer_dauer_in_millisek));
                                        }
                                    
                                        console.log('...js-ende');
                                    }
                                    
                                    async function ausfuehren_nach_timeout(timer_name) {
                                      console.log((String(timer_name) + ' ist abgelaufen'));
                                    }
                                    
                                    
                                    timer_dauer_in_sek = 0.3;
                                    timer_dauer_in_millisek = parseFloat(timer_dauer_in_sek) * 1000;
                                    timer_trigger_array = ['hobbyraum_timer', 'abstellraum_timer', 'hauswirtschaftsraum_timer', 'technikraum_timer', 'kg-flur_timer', 'kg-treppe_timer'];
                                    for (var timer_name_index in timer_trigger_array) {
                                      timer_name = timer_trigger_array[timer_name_index];
                                      console.log(timer_name);
                                      timer_name = timer_name;
                                      await multitimer_function(timer_name, timer_dauer_in_sek);
                                      await wait(1000);
                                    }
                                    
                                    OliverIO 1 Reply Last reply Reply Quote 0
                                    • OliverIO
                                      OliverIO @ptr last edited by

                                      @ptr
                                      Im Detail muss ich das morgen mal ausprobieren.
                                      Generell sehe ich in deinem Code aber 2 Problembereiche zu dem du dir die Konzepte mal nochmal durchlesen solltest

                                      1. scope
                                        https://developer.mozilla.org/en-US/docs/Glossary/Scope?retiredLocale=de
                                        Du definierst manche variablen innerhalb von Funktionen (bspw multitimer) obwohl ich den Eindruck habe das sie außerhalb einer Funktion definiert werden sollte.
                                        Im verlinkten Artikel liest du, das variablen immer nur sichtbar innerhalb eines scopes sind und von außerhalb nicht adressierst ist.
                                        Dann gibt es noch den asynchronen Funktionsausfall, der ebenfalls eine andere Art von scope erzeugt, wie man eigentlich so erwartet.
                                        Wird ein scope verlassen, bspw weil die Funktion abgearbeitet ist, dann wird der scope zerstört und die Daten sind verloren. Beim erneuten Aufruf der Funktion wird ein neuer scope erzeugt. Die früheren darin verfügbaren Daten sind weg.

                                      Auch deine mehrfach ineinander verschachtelten Funktionen sind schon möglich. Als Anfänger würde ich das aber nicht machen, da sonst der Überblick über die scopes schwierig ist und uU den Kopf zur Explosion bringt.
                                      Mit einem guten debugger sieht man das (bspw vs Code). Aber die scriptoberfläche von Iobroker ist da nicht sought geeignet.

                                      1. Verwendung von promises, await und async
                                        https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise?retiredLocale=de
                                        https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/await
                                        https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function

                                      Await kann nur bei Funktionen verwendet werden, die auch ein promise zurückgeben. Settimeout gibt aber nur das Timer Handle zurück. Daher funktioniert await da nicht.

                                      Wenn du eine strikte Reihenfolge bestimmter Schritte als Ergebnis von asynchroner Abarbeitung einhalten willst musst du dich erst recht noch mehr mit promises beschäftigen, da das der Mechanismus der Wahl dafür ist.

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

                                      Support us

                                      ioBroker
                                      Community Adapters
                                      Donate

                                      717
                                      Online

                                      31.8k
                                      Users

                                      80.0k
                                      Topics

                                      1.3m
                                      Posts

                                      7
                                      43
                                      1878
                                      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