Skip to content
  • Home
  • Aktuell
  • Tags
  • 0 Ungelesen 0
  • Kategorien
  • Unreplied
  • Beliebt
  • GitHub
  • Docu
  • Hilfe
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Standard: (Kein Skin)
  • Kein Skin
Einklappen
ioBroker Logo

Community Forum

donate donate
  1. ioBroker Community Home
  2. Deutsch
  3. Skripten / Logik
  4. JavaScript
  5. Dynamisch erstellte Variablen.

NEWS

  • UPDATE 31.10.: Amazon Alexa - ioBroker Skill läuft aus ?
    apollon77A
    apollon77
    48
    3
    8.9k

  • Monatsrückblick – September 2025
    BluefoxB
    Bluefox
    13
    1
    2.3k

  • Neues Video "KI im Smart Home" - ioBroker plus n8n
    BluefoxB
    Bluefox
    16
    1
    3.4k

Dynamisch erstellte Variablen.

Geplant Angeheftet Gesperrt Verschoben JavaScript
43 Beiträge 7 Kommentatoren 2.8k Aufrufe 5 Watching
  • Älteste zuerst
  • Neuste zuerst
  • Meiste Stimmen
Antworten
  • In einem neuen Thema antworten
Anmelden zum Antworten
Dieses Thema wurde gelöscht. Nur Nutzer mit entsprechenden Rechten können es sehen.
  • P ptr

    Hallo zusammen,
    was ich brauche ist eine """DYNAMISCH GENERIERTE VARIABLE""". (für einen Timer, der später individuell wieder gestoppt werden muss).

    async function lautsprecher_schlummer_timer_multi(timer_name, timer_minuten) {
        console.log(''+timer_name+'-Timer');
        """DYNAMISCH GENERIERTE VARIABLE(z.B. der String aus timer_name-Inhalt)""" = setTimeout(async function () {await functionX()}, parseInt((parseFloat(timer_minuten) * 60000)));
    

    Sinn der Sache ist es ein Skript für alle Timer zu haben. Variabel wird dann nur über die variable "timer_name" eben der Name in die function übergeben, die dann genauso den Timer """DYNAMISCH GENERIERTE VARIABLE""" benennt. Später kann man dann individuell die Timer wieder stoppen, weil Sie eigene Namen haben.
    z.B. Egal welcher Lautsprecher angeschaltet wird, immer nach 4 Stunden wieder DIESEN Lautsprecher ausschalten.

    BananaJoeB Online
    BananaJoeB Online
    BananaJoe
    Most Active
    schrieb am zuletzt editiert von
    #2

    @ptr ich würde ein Array nehmen.

    Das Klugscheiße ich jetzt mal weil ich in anderen Sprachen das so machen.
    In 9 von 10 Fällen nutze ich ein 2-Dimensonales Array:

    Dim a_MeineTimer[1][3]    // [0][0] = Anzahl
                              // [x][1] = Gerät
                              // [x][2] = Zeiger Timer
    

    so in der Art. Wenn ein Timer hinzukommt erhöhe ich [0][0] um 1, mache einen ReDim und fülle die 2 neuen Variablen.
    Für die Prüfung arbeite ich das in einer Schleife ab.

    So, wie macht man das in JavaScript ...
    Das hier sieht ganz gut aus, insbesondere das Beispiel mit den 222 Likes wo eine Funktion genutzt wird: https://stackoverflow.com/questions/966225/how-can-i-create-a-two-dimensional-array-in-javascript

    Die Anzahl in [0][0] lässt du weg,
    Wie ein ReDim funktioniert weis ich (noch) nicht, aber du könntest ja z.B. auf 50 Stück vor dimensionieren ...
    In der Schleife gehts du immer alle 50 durch, zur Prüfung schaust du ob in [x][0] etwas drin steht, wenn ja ja gibt es den Zeiger auf den Timer in [x][1]. Ist der Abgelaufen setzt du [x][0] wieder auf ""

    Bin gespannt auf deine Lösung :-)

    ioBroker@Ubuntu 24.04 LTS (VMware) für: >260 Geräte, 5 Switche, 7 AP, 9 IP-Cam, 1 NAS 42TB, 1 ESXi 15TB, 4 Proxmox 1TB, 1 Hyper-V 48TB, 14 x Echo, 5x FireTV, 5 x Tablett/Handy VIS || >=160 Tasmota/Shelly || >=95 ZigBee || PV 8.1kW / Akku 14kWh || 2x USV 750W kaskadiert || Creality CR-10 SE 3D-Drucker

    1 Antwort Letzte Antwort
    0
    • P ptr

      Hallo zusammen,
      was ich brauche ist eine """DYNAMISCH GENERIERTE VARIABLE""". (für einen Timer, der später individuell wieder gestoppt werden muss).

      async function lautsprecher_schlummer_timer_multi(timer_name, timer_minuten) {
          console.log(''+timer_name+'-Timer');
          """DYNAMISCH GENERIERTE VARIABLE(z.B. der String aus timer_name-Inhalt)""" = setTimeout(async function () {await functionX()}, parseInt((parseFloat(timer_minuten) * 60000)));
      

      Sinn der Sache ist es ein Skript für alle Timer zu haben. Variabel wird dann nur über die variable "timer_name" eben der Name in die function übergeben, die dann genauso den Timer """DYNAMISCH GENERIERTE VARIABLE""" benennt. Später kann man dann individuell die Timer wieder stoppen, weil Sie eigene Namen haben.
      z.B. Egal welcher Lautsprecher angeschaltet wird, immer nach 4 Stunden wieder DIESEN Lautsprecher ausschalten.

      OliverIOO Offline
      OliverIOO Offline
      OliverIO
      schrieb am zuletzt editiert von
      #3

      @ptr
      Leider wieder ein Beispiel davon das jemand ein Teil der Lösung vorweg geben möcht ohne den gesamt Zusammenhang zu nennen.
      Versuche zu beschreiben was du am Ende zu erreichen versuchst.
      Evtl kommt dann eine ganz andere Lösung raus was du teilweise schon voraus denken versuchst

      Meine Adapter und Widgets
      TVProgram, SqueezeboxRPC, OpenLiga, RSSFeed, MyTime,, pi-hole2, vis-json-template, skiinfo, vis-mapwidgets, vis-2-widgets-rssfeed
      Links im Profil

      1 Antwort Letzte Antwort
      1
      • P ptr

        Hallo zusammen,
        was ich brauche ist eine """DYNAMISCH GENERIERTE VARIABLE""". (für einen Timer, der später individuell wieder gestoppt werden muss).

        async function lautsprecher_schlummer_timer_multi(timer_name, timer_minuten) {
            console.log(''+timer_name+'-Timer');
            """DYNAMISCH GENERIERTE VARIABLE(z.B. der String aus timer_name-Inhalt)""" = setTimeout(async function () {await functionX()}, parseInt((parseFloat(timer_minuten) * 60000)));
        

        Sinn der Sache ist es ein Skript für alle Timer zu haben. Variabel wird dann nur über die variable "timer_name" eben der Name in die function übergeben, die dann genauso den Timer """DYNAMISCH GENERIERTE VARIABLE""" benennt. Später kann man dann individuell die Timer wieder stoppen, weil Sie eigene Namen haben.
        z.B. Egal welcher Lautsprecher angeschaltet wird, immer nach 4 Stunden wieder DIESEN Lautsprecher ausschalten.

        ArmilarA Offline
        ArmilarA Offline
        Armilar
        Most Active Forum Testing
        schrieb am zuletzt editiert von
        #4

        @ptr

        ich bin ebenfalls der Ansicht, dass hier wesentliche Informationen verschwiegen worden sind.

        Die Lösung ist aus meiner Sicht denkbar einfach und fern von deinen aktuellen Gedanken.

        Sage uns doch mal kurz "welche Speaker" du "wie" ansprechen möchtest bzw. verzögert ausschalten möchtest. Evtl. hast du bereits ein vollständiges Skript und "keine Code-Fragmente".

        Mach kein Rätsel draus. könnte die Lösung echt beschleunigen...

        Ich sag es mal so: mehrdimensionale Arrays sind sicher cool, aber für so eine Lösung in der Regel nicht erforderlich. Ich denke du hast dich da aktuell gedanklich verrannt.

        Installationsanleitung, Tipps, Alias-Definitionen, FAQ für das Sonoff NSPanel mit lovelace UI unter ioBroker
        https://github.com/joBr99/nspanel-lovelace-ui/wiki

        Benutzt das Voting rechts unten im Beitrag wenn er euch geholfen hat.

        1 Antwort Letzte Antwort
        1
        • P Offline
          P Offline
          ptr
          schrieb am zuletzt editiert von
          #5

          @BananaJoe: Danke Dir für den schnelle Rückmeldung
          @armilar & @OliverIO: hier möglichst genau der Zweck der Sache:

          Zweck:
          2. Ich habe mehrere Sonos-Lautsprecher mit eigenen Timern (Trigger: falls .state = "play"), die unabhängig gestoppt und gestartet werden können.
          2. Das Problem ist erweiterbar, da ich ähnliche Problemstellungen auch in anderen Skriptbereichen habe. z.B. soll pro Raum auch ein "RaumAnwesenheit"-Timer getriggert werden, sobald die DPs "0_userdata.0...Anwesenheit" auf "true" gehen.

          Ursprung des Problems:
          Eigentlich Blockly. Hier gibt es keinen Timer-Funktionsblock der den Timernamen an den Triggernamen anpassen könnte. Nur hardcodiertes schreiben von hier "timeout":
          e0d98f69-b53b-4017-bdf3-db60e71f3716-image.png
          -> Blockly-Forum ist hier leider ohne Lösung aktuell, daher der Weg zu JS selbst.
          https://forum.iobroker.net/topic/59816/timer-mit-variable-als-namen-möglich
          (hier ist es soweit ich das erkenne, das gleiche Problem, jedoch nicht ein individueller Lautsprecher-Timer, sondern ein Anwesenheits-Timer)

          Hoffe das beantwortet schonmal Fragen.
          Falls ich etwas bestimmtes detaillieren soll mache ich das gerne.

          Hier noch das JS des Sonos-Boxenskripts. Es ist aktuell nicht sehr elegant & funktioniert auch nur für EINEN Timer gleichzeitig. Ich hoffe dieser Zwischenstand verwirrt nicht:

          var timer_minuten, timer_name, triggernder_raum, elemente_von_trigger, triggernder_lautsprecher_pfad, volume_object, standardvolume, minas_zimmer_schlummern, hobbyraum_schlummern, aktuelles_volume;
          
          
          // Alle Boxen: Trigger auf Aktivitätsänderung
          on({id: [].concat(Array.prototype.slice.apply($("channel[state.id=alias.0.*.*.Box1.state]"))), change: "ne", ack: true}, async function (obj) {
            var value = obj.state.val;
            var oldValue = obj.oldState.val;
            elemente_von_trigger = obj.id.split('.');
            triggernder_raum = elemente_von_trigger[3];
            triggernder_lautsprecher_pfad = elemente_von_trigger.slice(0, elemente_von_trigger.length - 1).join('.');
            volume_object = String(triggernder_lautsprecher_pfad) + '.volume';
            if ((obj.state ? obj.state.val : "") == 'play') {
              // Standardlautstärke festlegen
          
              switch (triggernder_raum) {
              	case 'Yunes_Zimmer':
                standardvolume = 10;
          
              		break;
              	case 'Minas_Zimmer':
                standardvolume = 14;
                // immer Schlummertimer setzen:
                timer_minuten = 30;
                (function () {if (minas_zimmer_schlummern) {clearTimeout(minas_zimmer_schlummern); minas_zimmer_schlummern = null;}})();
                minas_zimmer_schlummern = setTimeout(async function () {
                  // abgelaufen? dann ausfaden...
                  while (getState(volume_object).val > 0) {
                    aktuelles_volume = getState(volume_object).val;
                    setStateDelayed(volume_object, (Math.floor(parseFloat(aktuelles_volume) * 0.9)), false, parseInt(((0) || "").toString(), 10), true);
                    await wait(1000);
                  }
                  setStateDelayed((String(triggernder_lautsprecher_pfad) + '.pause'), true, false, parseInt(((0) || "").toString(), 10), true);
                  // anfaden beim nächsten play ermöglichen
                  setStateDelayed(volume_object, (Math.floor(parseFloat(standardvolume) * 0.6)), false, parseInt(((0) || "").toString(), 10), true);
                }, parseInt((parseFloat(timer_minuten) * 60000)));
          
              		break;
              	case 'Wohnzimmer':
                standardvolume = 14;
          
              		break;
              	case 'Hobbyraum':
                standardvolume = 14;
                // immer Schlummertimer setzen:
                timer_minuten = 30;
                (function () {if (hobbyraum_schlummern) {clearTimeout(hobbyraum_schlummern); hobbyraum_schlummern = null;}})();
                hobbyraum_schlummern = setTimeout(async function () {
                  // abgelaufen? dann ausfaden...
                  while (getState(volume_object).val > 0) {
                    aktuelles_volume = getState(volume_object).val;
                    setStateDelayed(volume_object, (Math.floor(parseFloat(aktuelles_volume) * 0.9)), false, parseInt(((0) || "").toString(), 10), true);
                    await wait(1000);
                  }
                  setStateDelayed((String(triggernder_lautsprecher_pfad) + '.pause'), true, false, parseInt(((0) || "").toString(), 10), true);
                  // anfaden beim nächsten play ermöglichen
                  setStateDelayed(volume_object, (Math.floor(parseFloat(standardvolume) * 0.6)), false, parseInt(((0) || "").toString(), 10), true);
                }, parseInt((parseFloat(timer_minuten) * 60000)));
          
              		break;
              	default:
                // falls triggered Box nicht aufgezählt ist
                standardvolume = 14;
          
              		break;
              }
              setStateDelayed(volume_object, standardvolume, false, parseInt(((0) || "").toString(), 10), true);
            } else {
              // anfaden beim nächsten play ermöglichen
              setStateDelayed(volume_object, (Math.floor(parseFloat(standardvolume) * 0.6)), false, parseInt(((0) || "").toString(), 10), true);
            }
          });
          
          OliverIOO 1 Antwort Letzte Antwort
          0
          • P ptr

            @BananaJoe: Danke Dir für den schnelle Rückmeldung
            @armilar & @OliverIO: hier möglichst genau der Zweck der Sache:

            Zweck:
            2. Ich habe mehrere Sonos-Lautsprecher mit eigenen Timern (Trigger: falls .state = "play"), die unabhängig gestoppt und gestartet werden können.
            2. Das Problem ist erweiterbar, da ich ähnliche Problemstellungen auch in anderen Skriptbereichen habe. z.B. soll pro Raum auch ein "RaumAnwesenheit"-Timer getriggert werden, sobald die DPs "0_userdata.0...Anwesenheit" auf "true" gehen.

            Ursprung des Problems:
            Eigentlich Blockly. Hier gibt es keinen Timer-Funktionsblock der den Timernamen an den Triggernamen anpassen könnte. Nur hardcodiertes schreiben von hier "timeout":
            e0d98f69-b53b-4017-bdf3-db60e71f3716-image.png
            -> Blockly-Forum ist hier leider ohne Lösung aktuell, daher der Weg zu JS selbst.
            https://forum.iobroker.net/topic/59816/timer-mit-variable-als-namen-möglich
            (hier ist es soweit ich das erkenne, das gleiche Problem, jedoch nicht ein individueller Lautsprecher-Timer, sondern ein Anwesenheits-Timer)

            Hoffe das beantwortet schonmal Fragen.
            Falls ich etwas bestimmtes detaillieren soll mache ich das gerne.

            Hier noch das JS des Sonos-Boxenskripts. Es ist aktuell nicht sehr elegant & funktioniert auch nur für EINEN Timer gleichzeitig. Ich hoffe dieser Zwischenstand verwirrt nicht:

            var timer_minuten, timer_name, triggernder_raum, elemente_von_trigger, triggernder_lautsprecher_pfad, volume_object, standardvolume, minas_zimmer_schlummern, hobbyraum_schlummern, aktuelles_volume;
            
            
            // Alle Boxen: Trigger auf Aktivitätsänderung
            on({id: [].concat(Array.prototype.slice.apply($("channel[state.id=alias.0.*.*.Box1.state]"))), change: "ne", ack: true}, async function (obj) {
              var value = obj.state.val;
              var oldValue = obj.oldState.val;
              elemente_von_trigger = obj.id.split('.');
              triggernder_raum = elemente_von_trigger[3];
              triggernder_lautsprecher_pfad = elemente_von_trigger.slice(0, elemente_von_trigger.length - 1).join('.');
              volume_object = String(triggernder_lautsprecher_pfad) + '.volume';
              if ((obj.state ? obj.state.val : "") == 'play') {
                // Standardlautstärke festlegen
            
                switch (triggernder_raum) {
                	case 'Yunes_Zimmer':
                  standardvolume = 10;
            
                		break;
                	case 'Minas_Zimmer':
                  standardvolume = 14;
                  // immer Schlummertimer setzen:
                  timer_minuten = 30;
                  (function () {if (minas_zimmer_schlummern) {clearTimeout(minas_zimmer_schlummern); minas_zimmer_schlummern = null;}})();
                  minas_zimmer_schlummern = setTimeout(async function () {
                    // abgelaufen? dann ausfaden...
                    while (getState(volume_object).val > 0) {
                      aktuelles_volume = getState(volume_object).val;
                      setStateDelayed(volume_object, (Math.floor(parseFloat(aktuelles_volume) * 0.9)), false, parseInt(((0) || "").toString(), 10), true);
                      await wait(1000);
                    }
                    setStateDelayed((String(triggernder_lautsprecher_pfad) + '.pause'), true, false, parseInt(((0) || "").toString(), 10), true);
                    // anfaden beim nächsten play ermöglichen
                    setStateDelayed(volume_object, (Math.floor(parseFloat(standardvolume) * 0.6)), false, parseInt(((0) || "").toString(), 10), true);
                  }, parseInt((parseFloat(timer_minuten) * 60000)));
            
                		break;
                	case 'Wohnzimmer':
                  standardvolume = 14;
            
                		break;
                	case 'Hobbyraum':
                  standardvolume = 14;
                  // immer Schlummertimer setzen:
                  timer_minuten = 30;
                  (function () {if (hobbyraum_schlummern) {clearTimeout(hobbyraum_schlummern); hobbyraum_schlummern = null;}})();
                  hobbyraum_schlummern = setTimeout(async function () {
                    // abgelaufen? dann ausfaden...
                    while (getState(volume_object).val > 0) {
                      aktuelles_volume = getState(volume_object).val;
                      setStateDelayed(volume_object, (Math.floor(parseFloat(aktuelles_volume) * 0.9)), false, parseInt(((0) || "").toString(), 10), true);
                      await wait(1000);
                    }
                    setStateDelayed((String(triggernder_lautsprecher_pfad) + '.pause'), true, false, parseInt(((0) || "").toString(), 10), true);
                    // anfaden beim nächsten play ermöglichen
                    setStateDelayed(volume_object, (Math.floor(parseFloat(standardvolume) * 0.6)), false, parseInt(((0) || "").toString(), 10), true);
                  }, parseInt((parseFloat(timer_minuten) * 60000)));
            
                		break;
                	default:
                  // falls triggered Box nicht aufgezählt ist
                  standardvolume = 14;
            
                		break;
                }
                setStateDelayed(volume_object, standardvolume, false, parseInt(((0) || "").toString(), 10), true);
              } else {
                // anfaden beim nächsten play ermöglichen
                setStateDelayed(volume_object, (Math.floor(parseFloat(standardvolume) * 0.6)), false, parseInt(((0) || "").toString(), 10), true);
              }
            });
            
            OliverIOO Offline
            OliverIOO Offline
            OliverIO
            schrieb am zuletzt editiert von OliverIO
            #6

            @ptr
            Ok danke.
            Ich würde im Skript außerhalb der Funktion (also ganz oben)
            eine Array Variable anlegen.
            Immer wenn du einen neuen Timer anlegst prüfst du in diesem Array anhand des namen des timers ob da schon ein Eintrag vorhanden ist. Wenn ja dann löschst du anhand des timerhandles in diesem Array den timer, startest den neuen timer und speicherst das neue handle wieder in diesem Array mit dem Namen

            Eine 2. Funktion löscht einfach nur den timer, anhand des handles welches über den Namen im Array gefunden wird.

            Ich bin gerade nicht am Rechner, daher kann ich dir keinen Code vorgeben. Wenn du es nicht selber hinbekommst, könnte ich ab morgen Abend mal schauen. Sind meines Erachtens aber nur wenige Zeilen

            Falls du diese Funktionen aus mehreren Skripten aufrufen willst, dann wird das glaube ich mit dem Array nicht funktionieren, da die Skripte in global ja alle nur vor das. Orhandene Skript kopiert wird und damit es nicht nur einen gemeinsamen speicherkontext gibt.
            Dann muss man den Inhalt des arrays in einem datenpunkt speichern und bei jedem Aufruf wieder aus dem datenpunkt lesen,

            Meine Adapter und Widgets
            TVProgram, SqueezeboxRPC, OpenLiga, RSSFeed, MyTime,, pi-hole2, vis-json-template, skiinfo, vis-mapwidgets, vis-2-widgets-rssfeed
            Links im Profil

            1 Antwort Letzte Antwort
            0
            • ArmilarA Offline
              ArmilarA Offline
              Armilar
              Most Active Forum Testing
              schrieb am zuletzt editiert von Armilar
              #7

              @ptr

              Du bist immer noch bei dem Problem und verschachtelst dein Problem auch noch.

              Ich würde dir gerne bei einer "Lösung" helfen, die wahrscheinlich komplett anders aussieht. Dazu brauchen wir aber die komplette Anforderung an die Lösung. Nicht das Problem...

              Fangen wir mal so an:

              • Du hast in mehreren Zimmern eine Sonos. Jede Sonos ist mit State unter Enums aufgeführt. Allerdings anscheinend auch ein gemeinsamer State mit einem Alias?
              • Du hast für jedes Zimmer eine Standardlautstärke definiert. Fading bei Play soll die Standardlautstärke auf max definieren.
              • Du hast jeweils für Anwesenheit einen Datenpunkt, je Zimmer in dem eine Sonos steht.
              • Du hast... etc.

              Was willst du in Abhängigkeit von welchen Ereignissen schalten und was ist der Auslöser mit welcher Aktion.

              Manchmal muss man seine Gedanken neu denken, wenn man fest steckt. "Keep it simple and smart"

              Installationsanleitung, Tipps, Alias-Definitionen, FAQ für das Sonoff NSPanel mit lovelace UI unter ioBroker
              https://github.com/joBr99/nspanel-lovelace-ui/wiki

              Benutzt das Voting rechts unten im Beitrag wenn er euch geholfen hat.

              P 1 Antwort Letzte Antwort
              0
              • ArmilarA Armilar

                @ptr

                Du bist immer noch bei dem Problem und verschachtelst dein Problem auch noch.

                Ich würde dir gerne bei einer "Lösung" helfen, die wahrscheinlich komplett anders aussieht. Dazu brauchen wir aber die komplette Anforderung an die Lösung. Nicht das Problem...

                Fangen wir mal so an:

                • Du hast in mehreren Zimmern eine Sonos. Jede Sonos ist mit State unter Enums aufgeführt. Allerdings anscheinend auch ein gemeinsamer State mit einem Alias?
                • Du hast für jedes Zimmer eine Standardlautstärke definiert. Fading bei Play soll die Standardlautstärke auf max definieren.
                • Du hast jeweils für Anwesenheit einen Datenpunkt, je Zimmer in dem eine Sonos steht.
                • Du hast... etc.

                Was willst du in Abhängigkeit von welchen Ereignissen schalten und was ist der Auslöser mit welcher Aktion.

                Manchmal muss man seine Gedanken neu denken, wenn man fest steckt. "Keep it simple and smart"

                P Offline
                P Offline
                ptr
                schrieb am zuletzt editiert von
                #8

                Habe das Skript jetzt etwas angepasst.

                1. Schritt:
                Versuche mich der Sache nun - einen Schritt zurück - einfacher zu nähern.

                Ich erstelle also erstmal zwei getrennte Timer hobbyraum_schlummern und minas_zimmer_schlummern. Diesen gebe ich den gleichen Code in die "nach-TImout"-Ausführung. Nur die Timerbezeichnungen sind also anders.
                Jeder Timer funktioniert für sich.
                Jedoch wenn ich beide Lautsprecher hintereinander starte, dann laufen ja zwei Timer los. Jedoch werden dann beide Timer auf den zweiten Trigger(bzw. Lautsprecher) angewendet. (Was man am entsprechenden Springen der Laufstärke während des Fadens erkennen kann und weil der erste Lautsprecher nicht ausfadet.)
                -> Das verstehe ich nicht, da ich dachte, dass pro Trigger (objektorientiert) eine weitere Instanz des Skripts gestartet wird.

                2. Schritt:
                @OliverIO: Das Array-Prinzip würde ich gerne direkt über die Datenbank von ioB anwenden. Also habe ich DPs angelegt: 0_userdata.0.[etage].[raum].Timer1. Diese können nun den Timer aufnehmen, wenn ich den DP mit dem Timer "{...}" schreibe. ID by Selektor liefert dann denn Array.
                Hier fehlt mir jedoch noch die Verbindung zur letzendlichen Bezeichnung des setTimeout. Für mich ist das aktuell irgendwie noch eine parallele Struktur. Ich denke ich verstehe nicht genau "wo" der Timer ist. vllt etwas schwer zu verstehen... Da überlege ich noch.

                var raeume_array, timer_minuten, timer_name, trig_raum, elemente_von_trigger, trig_raum_timer1, trig_lautsprecher_pfad, trig_lautsprecher_volume, volume_standard, minas_zimmer_schlummern, hobbyraum_schlummern, trig_lautsprecher_volume_aktueller_wert;
                
                
                // Alle Boxen: Trigger auf Aktivitätsänderung
                
                on({id: [].concat(Array.prototype.slice.apply($("channel[state.id=alias.0.*.*.Box1.state]"))), change: "ne", ack: true}, async function (obj) {
                  var value = obj.state.val;
                  var oldValue = obj.oldState.val;
                  // Elemente des Triggers rauslesen
                  elemente_von_trigger = obj.id.split('.');
                  // Raum ableiten
                  trig_raum = elemente_von_trigger[3];
                  trig_raum_timer1 = ['0_userdata.',elemente_von_trigger.slice(1, 4).join('.'),'.Timer1'].join('');
                  // Lautsprechervariablen ableiten
                  trig_lautsprecher_pfad = elemente_von_trigger.slice(0, elemente_von_trigger.length - 1).join('.');
                  trig_lautsprecher_volume = String(trig_lautsprecher_pfad) + '.volume';
                  // Differenzierung abh. von Raum:
                  if ((obj.state ? obj.state.val : "") == 'play') {
                
                    switch (trig_raum) {
                    	case 'Yunes_Zimmer':
                      volume_standard = 10;
                
                    		break;
                    	case 'Minas_Zimmer':
                      volume_standard = 14;
                      timer_minuten = 0.05;
                      console.log(trig_raum_timer1);
                      console.log(getState(trig_raum_timer1).val);
                      // Raum-Schlummertimer stoppen
                      (function () {if (minas_zimmer_schlummern) {clearTimeout(minas_zimmer_schlummern); minas_zimmer_schlummern = null;}})();
                      setStateDelayed(trig_raum_timer1, null, true, parseInt(((0) || "").toString(), 10), true);
                      console.log(getState(trig_raum_timer1).val);
                      // Raum-Schlummertimer starten
                      minas_zimmer_schlummern = setTimeout(async function () {
                        // Timer abgelaufen
                        setStateDelayed(trig_raum_timer1, minas_zimmer_schlummern, true, parseInt(((0) || "").toString(), 10), true);
                        console.log(trig_raum_timer1);
                        console.log(getState(trig_raum_timer1).val);
                        // Ausfaden...
                        while (getState(trig_lautsprecher_volume).val > 0) {
                          trig_lautsprecher_volume_aktueller_wert = getState(trig_lautsprecher_volume).val;
                          setStateDelayed(trig_lautsprecher_volume, (Math.floor(parseFloat(trig_lautsprecher_volume_aktueller_wert) * 0.9)), false, parseInt(((0) || "").toString(), 10), true);
                          await wait(1000);
                        }
                        setStateDelayed((String(trig_lautsprecher_pfad) + '.pause'), true, false, parseInt(((0) || "").toString(), 10), true);
                        // Anfaden beim nächsten play vorbereiten
                        setStateDelayed(trig_lautsprecher_volume, (Math.floor(parseFloat(volume_standard) * 0.6)), false, parseInt(((0) || "").toString(), 10), true);
                      }, parseInt((parseFloat(timer_minuten) * 60000)));
                
                    		break;
                    	case 'Wohnzimmer':
                      volume_standard = 14;
                
                    		break;
                    	case 'Hobbyraum':
                      volume_standard = 14;
                      timer_minuten = 0.05;
                      console.log(trig_raum_timer1);
                      console.log(getState(trig_raum_timer1).val);
                      // Raum-Schlummertimer stoppen
                      (function () {if (hobbyraum_schlummern) {clearTimeout(hobbyraum_schlummern); hobbyraum_schlummern = null;}})();
                      setStateDelayed(trig_raum_timer1, null, true, parseInt(((0) || "").toString(), 10), true);
                      console.log(getState(trig_raum_timer1).val);
                      // Raum-Schlummertimer starten
                      hobbyraum_schlummern = setTimeout(async function () {
                        // Timer abgelaufen
                        setStateDelayed(trig_raum_timer1, hobbyraum_schlummern, true, parseInt(((0) || "").toString(), 10), true);
                        console.log(getState(trig_raum_timer1).val);
                        // Ausfaden...
                        while (getState(trig_lautsprecher_volume).val > 0) {
                          trig_lautsprecher_volume_aktueller_wert = getState(trig_lautsprecher_volume).val;
                          setStateDelayed(trig_lautsprecher_volume, (Math.floor(parseFloat(trig_lautsprecher_volume_aktueller_wert) * 0.9)), false, parseInt(((0) || "").toString(), 10), true);
                          await wait(1000);
                        }
                        setStateDelayed((String(trig_lautsprecher_pfad) + '.pause'), true, false, parseInt(((0) || "").toString(), 10), true);
                        // Anfaden beim nächsten play vorbereiten
                        setStateDelayed(trig_lautsprecher_volume, (Math.floor(parseFloat(volume_standard) * 0.6)), false, parseInt(((0) || "").toString(), 10), true);
                      }, parseInt((parseFloat(timer_minuten) * 60000)));
                
                    		break;
                    	default:
                      volume_standard = 14;
                      // falls triggered Box nicht aufgezählt ist
                
                    		break;
                    }
                    setStateDelayed(trig_lautsprecher_volume, volume_standard, false, parseInt(((0) || "").toString(), 10), true);
                  } else {
                    // anfaden beim nächsten play ermöglichen
                    setStateDelayed(trig_lautsprecher_volume, (Math.floor(parseFloat(volume_standard) * 0.6)), false, parseInt(((0) || "").toString(), 10), true);
                  }
                });
                
                ArmilarA OliverIOO 2 Antworten Letzte Antwort
                0
                • P ptr

                  Habe das Skript jetzt etwas angepasst.

                  1. Schritt:
                  Versuche mich der Sache nun - einen Schritt zurück - einfacher zu nähern.

                  Ich erstelle also erstmal zwei getrennte Timer hobbyraum_schlummern und minas_zimmer_schlummern. Diesen gebe ich den gleichen Code in die "nach-TImout"-Ausführung. Nur die Timerbezeichnungen sind also anders.
                  Jeder Timer funktioniert für sich.
                  Jedoch wenn ich beide Lautsprecher hintereinander starte, dann laufen ja zwei Timer los. Jedoch werden dann beide Timer auf den zweiten Trigger(bzw. Lautsprecher) angewendet. (Was man am entsprechenden Springen der Laufstärke während des Fadens erkennen kann und weil der erste Lautsprecher nicht ausfadet.)
                  -> Das verstehe ich nicht, da ich dachte, dass pro Trigger (objektorientiert) eine weitere Instanz des Skripts gestartet wird.

                  2. Schritt:
                  @OliverIO: Das Array-Prinzip würde ich gerne direkt über die Datenbank von ioB anwenden. Also habe ich DPs angelegt: 0_userdata.0.[etage].[raum].Timer1. Diese können nun den Timer aufnehmen, wenn ich den DP mit dem Timer "{...}" schreibe. ID by Selektor liefert dann denn Array.
                  Hier fehlt mir jedoch noch die Verbindung zur letzendlichen Bezeichnung des setTimeout. Für mich ist das aktuell irgendwie noch eine parallele Struktur. Ich denke ich verstehe nicht genau "wo" der Timer ist. vllt etwas schwer zu verstehen... Da überlege ich noch.

                  var raeume_array, timer_minuten, timer_name, trig_raum, elemente_von_trigger, trig_raum_timer1, trig_lautsprecher_pfad, trig_lautsprecher_volume, volume_standard, minas_zimmer_schlummern, hobbyraum_schlummern, trig_lautsprecher_volume_aktueller_wert;
                  
                  
                  // Alle Boxen: Trigger auf Aktivitätsänderung
                  
                  on({id: [].concat(Array.prototype.slice.apply($("channel[state.id=alias.0.*.*.Box1.state]"))), change: "ne", ack: true}, async function (obj) {
                    var value = obj.state.val;
                    var oldValue = obj.oldState.val;
                    // Elemente des Triggers rauslesen
                    elemente_von_trigger = obj.id.split('.');
                    // Raum ableiten
                    trig_raum = elemente_von_trigger[3];
                    trig_raum_timer1 = ['0_userdata.',elemente_von_trigger.slice(1, 4).join('.'),'.Timer1'].join('');
                    // Lautsprechervariablen ableiten
                    trig_lautsprecher_pfad = elemente_von_trigger.slice(0, elemente_von_trigger.length - 1).join('.');
                    trig_lautsprecher_volume = String(trig_lautsprecher_pfad) + '.volume';
                    // Differenzierung abh. von Raum:
                    if ((obj.state ? obj.state.val : "") == 'play') {
                  
                      switch (trig_raum) {
                      	case 'Yunes_Zimmer':
                        volume_standard = 10;
                  
                      		break;
                      	case 'Minas_Zimmer':
                        volume_standard = 14;
                        timer_minuten = 0.05;
                        console.log(trig_raum_timer1);
                        console.log(getState(trig_raum_timer1).val);
                        // Raum-Schlummertimer stoppen
                        (function () {if (minas_zimmer_schlummern) {clearTimeout(minas_zimmer_schlummern); minas_zimmer_schlummern = null;}})();
                        setStateDelayed(trig_raum_timer1, null, true, parseInt(((0) || "").toString(), 10), true);
                        console.log(getState(trig_raum_timer1).val);
                        // Raum-Schlummertimer starten
                        minas_zimmer_schlummern = setTimeout(async function () {
                          // Timer abgelaufen
                          setStateDelayed(trig_raum_timer1, minas_zimmer_schlummern, true, parseInt(((0) || "").toString(), 10), true);
                          console.log(trig_raum_timer1);
                          console.log(getState(trig_raum_timer1).val);
                          // Ausfaden...
                          while (getState(trig_lautsprecher_volume).val > 0) {
                            trig_lautsprecher_volume_aktueller_wert = getState(trig_lautsprecher_volume).val;
                            setStateDelayed(trig_lautsprecher_volume, (Math.floor(parseFloat(trig_lautsprecher_volume_aktueller_wert) * 0.9)), false, parseInt(((0) || "").toString(), 10), true);
                            await wait(1000);
                          }
                          setStateDelayed((String(trig_lautsprecher_pfad) + '.pause'), true, false, parseInt(((0) || "").toString(), 10), true);
                          // Anfaden beim nächsten play vorbereiten
                          setStateDelayed(trig_lautsprecher_volume, (Math.floor(parseFloat(volume_standard) * 0.6)), false, parseInt(((0) || "").toString(), 10), true);
                        }, parseInt((parseFloat(timer_minuten) * 60000)));
                  
                      		break;
                      	case 'Wohnzimmer':
                        volume_standard = 14;
                  
                      		break;
                      	case 'Hobbyraum':
                        volume_standard = 14;
                        timer_minuten = 0.05;
                        console.log(trig_raum_timer1);
                        console.log(getState(trig_raum_timer1).val);
                        // Raum-Schlummertimer stoppen
                        (function () {if (hobbyraum_schlummern) {clearTimeout(hobbyraum_schlummern); hobbyraum_schlummern = null;}})();
                        setStateDelayed(trig_raum_timer1, null, true, parseInt(((0) || "").toString(), 10), true);
                        console.log(getState(trig_raum_timer1).val);
                        // Raum-Schlummertimer starten
                        hobbyraum_schlummern = setTimeout(async function () {
                          // Timer abgelaufen
                          setStateDelayed(trig_raum_timer1, hobbyraum_schlummern, true, parseInt(((0) || "").toString(), 10), true);
                          console.log(getState(trig_raum_timer1).val);
                          // Ausfaden...
                          while (getState(trig_lautsprecher_volume).val > 0) {
                            trig_lautsprecher_volume_aktueller_wert = getState(trig_lautsprecher_volume).val;
                            setStateDelayed(trig_lautsprecher_volume, (Math.floor(parseFloat(trig_lautsprecher_volume_aktueller_wert) * 0.9)), false, parseInt(((0) || "").toString(), 10), true);
                            await wait(1000);
                          }
                          setStateDelayed((String(trig_lautsprecher_pfad) + '.pause'), true, false, parseInt(((0) || "").toString(), 10), true);
                          // Anfaden beim nächsten play vorbereiten
                          setStateDelayed(trig_lautsprecher_volume, (Math.floor(parseFloat(volume_standard) * 0.6)), false, parseInt(((0) || "").toString(), 10), true);
                        }, parseInt((parseFloat(timer_minuten) * 60000)));
                  
                      		break;
                      	default:
                        volume_standard = 14;
                        // falls triggered Box nicht aufgezählt ist
                  
                      		break;
                      }
                      setStateDelayed(trig_lautsprecher_volume, volume_standard, false, parseInt(((0) || "").toString(), 10), true);
                    } else {
                      // anfaden beim nächsten play ermöglichen
                      setStateDelayed(trig_lautsprecher_volume, (Math.floor(parseFloat(volume_standard) * 0.6)), false, parseInt(((0) || "").toString(), 10), true);
                    }
                  });
                  
                  ArmilarA Offline
                  ArmilarA Offline
                  Armilar
                  Most Active Forum Testing
                  schrieb am zuletzt editiert von
                  #9

                  @ptr sagte in Dynamisch erstellte Variablen.:

                  0_userdata.0.[etage].[raum].Timer1

                  Wohl eher anders herum.

                  0_userdata.0.Timer mit einem Objekt oder JSON ;-) mixed-Type

                  Installationsanleitung, Tipps, Alias-Definitionen, FAQ für das Sonoff NSPanel mit lovelace UI unter ioBroker
                  https://github.com/joBr99/nspanel-lovelace-ui/wiki

                  Benutzt das Voting rechts unten im Beitrag wenn er euch geholfen hat.

                  P 1 Antwort Letzte Antwort
                  0
                  • ArmilarA Armilar

                    @ptr sagte in Dynamisch erstellte Variablen.:

                    0_userdata.0.[etage].[raum].Timer1

                    Wohl eher anders herum.

                    0_userdata.0.Timer mit einem Objekt oder JSON ;-) mixed-Type

                    P Offline
                    P Offline
                    ptr
                    schrieb am zuletzt editiert von ptr
                    #10

                    @armilar weißt Du warum Timer in dieser getrennten Form nicht funktioniert? Ist mir schleierhaft. Habe sogar das Skript aufgedoppelt und je eines pro Raum eingesetzt (also z.B. im Skript NUR Minas_Zimmer Auswahl möglich)-> das gleiche Ergebnis.... der Timer bleibt nicht bei seinem Raum, sondern geht immer auf den letzten Trigger... Wo hängen die Timer also zusammen??

                    ArmilarA 2 Antworten Letzte Antwort
                    0
                    • P ptr

                      Habe das Skript jetzt etwas angepasst.

                      1. Schritt:
                      Versuche mich der Sache nun - einen Schritt zurück - einfacher zu nähern.

                      Ich erstelle also erstmal zwei getrennte Timer hobbyraum_schlummern und minas_zimmer_schlummern. Diesen gebe ich den gleichen Code in die "nach-TImout"-Ausführung. Nur die Timerbezeichnungen sind also anders.
                      Jeder Timer funktioniert für sich.
                      Jedoch wenn ich beide Lautsprecher hintereinander starte, dann laufen ja zwei Timer los. Jedoch werden dann beide Timer auf den zweiten Trigger(bzw. Lautsprecher) angewendet. (Was man am entsprechenden Springen der Laufstärke während des Fadens erkennen kann und weil der erste Lautsprecher nicht ausfadet.)
                      -> Das verstehe ich nicht, da ich dachte, dass pro Trigger (objektorientiert) eine weitere Instanz des Skripts gestartet wird.

                      2. Schritt:
                      @OliverIO: Das Array-Prinzip würde ich gerne direkt über die Datenbank von ioB anwenden. Also habe ich DPs angelegt: 0_userdata.0.[etage].[raum].Timer1. Diese können nun den Timer aufnehmen, wenn ich den DP mit dem Timer "{...}" schreibe. ID by Selektor liefert dann denn Array.
                      Hier fehlt mir jedoch noch die Verbindung zur letzendlichen Bezeichnung des setTimeout. Für mich ist das aktuell irgendwie noch eine parallele Struktur. Ich denke ich verstehe nicht genau "wo" der Timer ist. vllt etwas schwer zu verstehen... Da überlege ich noch.

                      var raeume_array, timer_minuten, timer_name, trig_raum, elemente_von_trigger, trig_raum_timer1, trig_lautsprecher_pfad, trig_lautsprecher_volume, volume_standard, minas_zimmer_schlummern, hobbyraum_schlummern, trig_lautsprecher_volume_aktueller_wert;
                      
                      
                      // Alle Boxen: Trigger auf Aktivitätsänderung
                      
                      on({id: [].concat(Array.prototype.slice.apply($("channel[state.id=alias.0.*.*.Box1.state]"))), change: "ne", ack: true}, async function (obj) {
                        var value = obj.state.val;
                        var oldValue = obj.oldState.val;
                        // Elemente des Triggers rauslesen
                        elemente_von_trigger = obj.id.split('.');
                        // Raum ableiten
                        trig_raum = elemente_von_trigger[3];
                        trig_raum_timer1 = ['0_userdata.',elemente_von_trigger.slice(1, 4).join('.'),'.Timer1'].join('');
                        // Lautsprechervariablen ableiten
                        trig_lautsprecher_pfad = elemente_von_trigger.slice(0, elemente_von_trigger.length - 1).join('.');
                        trig_lautsprecher_volume = String(trig_lautsprecher_pfad) + '.volume';
                        // Differenzierung abh. von Raum:
                        if ((obj.state ? obj.state.val : "") == 'play') {
                      
                          switch (trig_raum) {
                          	case 'Yunes_Zimmer':
                            volume_standard = 10;
                      
                          		break;
                          	case 'Minas_Zimmer':
                            volume_standard = 14;
                            timer_minuten = 0.05;
                            console.log(trig_raum_timer1);
                            console.log(getState(trig_raum_timer1).val);
                            // Raum-Schlummertimer stoppen
                            (function () {if (minas_zimmer_schlummern) {clearTimeout(minas_zimmer_schlummern); minas_zimmer_schlummern = null;}})();
                            setStateDelayed(trig_raum_timer1, null, true, parseInt(((0) || "").toString(), 10), true);
                            console.log(getState(trig_raum_timer1).val);
                            // Raum-Schlummertimer starten
                            minas_zimmer_schlummern = setTimeout(async function () {
                              // Timer abgelaufen
                              setStateDelayed(trig_raum_timer1, minas_zimmer_schlummern, true, parseInt(((0) || "").toString(), 10), true);
                              console.log(trig_raum_timer1);
                              console.log(getState(trig_raum_timer1).val);
                              // Ausfaden...
                              while (getState(trig_lautsprecher_volume).val > 0) {
                                trig_lautsprecher_volume_aktueller_wert = getState(trig_lautsprecher_volume).val;
                                setStateDelayed(trig_lautsprecher_volume, (Math.floor(parseFloat(trig_lautsprecher_volume_aktueller_wert) * 0.9)), false, parseInt(((0) || "").toString(), 10), true);
                                await wait(1000);
                              }
                              setStateDelayed((String(trig_lautsprecher_pfad) + '.pause'), true, false, parseInt(((0) || "").toString(), 10), true);
                              // Anfaden beim nächsten play vorbereiten
                              setStateDelayed(trig_lautsprecher_volume, (Math.floor(parseFloat(volume_standard) * 0.6)), false, parseInt(((0) || "").toString(), 10), true);
                            }, parseInt((parseFloat(timer_minuten) * 60000)));
                      
                          		break;
                          	case 'Wohnzimmer':
                            volume_standard = 14;
                      
                          		break;
                          	case 'Hobbyraum':
                            volume_standard = 14;
                            timer_minuten = 0.05;
                            console.log(trig_raum_timer1);
                            console.log(getState(trig_raum_timer1).val);
                            // Raum-Schlummertimer stoppen
                            (function () {if (hobbyraum_schlummern) {clearTimeout(hobbyraum_schlummern); hobbyraum_schlummern = null;}})();
                            setStateDelayed(trig_raum_timer1, null, true, parseInt(((0) || "").toString(), 10), true);
                            console.log(getState(trig_raum_timer1).val);
                            // Raum-Schlummertimer starten
                            hobbyraum_schlummern = setTimeout(async function () {
                              // Timer abgelaufen
                              setStateDelayed(trig_raum_timer1, hobbyraum_schlummern, true, parseInt(((0) || "").toString(), 10), true);
                              console.log(getState(trig_raum_timer1).val);
                              // Ausfaden...
                              while (getState(trig_lautsprecher_volume).val > 0) {
                                trig_lautsprecher_volume_aktueller_wert = getState(trig_lautsprecher_volume).val;
                                setStateDelayed(trig_lautsprecher_volume, (Math.floor(parseFloat(trig_lautsprecher_volume_aktueller_wert) * 0.9)), false, parseInt(((0) || "").toString(), 10), true);
                                await wait(1000);
                              }
                              setStateDelayed((String(trig_lautsprecher_pfad) + '.pause'), true, false, parseInt(((0) || "").toString(), 10), true);
                              // Anfaden beim nächsten play vorbereiten
                              setStateDelayed(trig_lautsprecher_volume, (Math.floor(parseFloat(volume_standard) * 0.6)), false, parseInt(((0) || "").toString(), 10), true);
                            }, parseInt((parseFloat(timer_minuten) * 60000)));
                      
                          		break;
                          	default:
                            volume_standard = 14;
                            // falls triggered Box nicht aufgezählt ist
                      
                          		break;
                          }
                          setStateDelayed(trig_lautsprecher_volume, volume_standard, false, parseInt(((0) || "").toString(), 10), true);
                        } else {
                          // anfaden beim nächsten play ermöglichen
                          setStateDelayed(trig_lautsprecher_volume, (Math.floor(parseFloat(volume_standard) * 0.6)), false, parseInt(((0) || "").toString(), 10), true);
                        }
                      });
                      
                      OliverIOO Offline
                      OliverIOO Offline
                      OliverIO
                      schrieb am zuletzt editiert von
                      #11

                      @ptr

                      puh, da muss man das ganze skript restrukturieren.
                      das skript soll doch für verschiedene räume gleich funktionieren,
                      allerdings ist da generischer und raumspezifischer code gemischt.
                      ausserdem würde ich einzelne funktionalitäten in eigene funktionen auslagern.
                      so ist das schwer lesbar. also geht schon, ist aber aufwändig und damit auch wieder fehleranfällig

                      was mir auf die schnelle aufgefallen ist:
                      also immer wenn jemand play drückt, dann sollen die standard lautstärken gesetzt werden?
                      und dann noch zusätzlich wenn schlummern gesetzt ist, die lautstärke nach und nach runtergefahren werden.
                      das sind für mich 2 unabhängige funktionen, die man auch über separate trigger ansteuert.
                      wobei minas_zimmer_schlummern nirgends gelesen wird oder ich habs übersehen

                      Meine Adapter und Widgets
                      TVProgram, SqueezeboxRPC, OpenLiga, RSSFeed, MyTime,, pi-hole2, vis-json-template, skiinfo, vis-mapwidgets, vis-2-widgets-rssfeed
                      Links im Profil

                      1 Antwort Letzte Antwort
                      0
                      • P ptr

                        @armilar weißt Du warum Timer in dieser getrennten Form nicht funktioniert? Ist mir schleierhaft. Habe sogar das Skript aufgedoppelt und je eines pro Raum eingesetzt (also z.B. im Skript NUR Minas_Zimmer Auswahl möglich)-> das gleiche Ergebnis.... der Timer bleibt nicht bei seinem Raum, sondern geht immer auf den letzten Trigger... Wo hängen die Timer also zusammen??

                        ArmilarA Offline
                        ArmilarA Offline
                        Armilar
                        Most Active Forum Testing
                        schrieb am zuletzt editiert von Armilar
                        #12

                        @ptr

                        Weil ioBroker das so nicht vorgesehen hat und weil es auch keinen Sinn ergeben würde...

                        Beispiel:
                        Du legst einen Datenpunkt ("0_userdata.0.haus") an. Dieser Datenpunkt soll zum Beispiel ein komplettes JSON-Objekt aufnehmen, wie z.B. das nachfolgende (nur exemplarisch):

                        [
                           {
                              "etage":{
                                 "EG":[
                                    {
                                       "zimmer":"Wohnzimmer",
                                       "anwesend":true,
                                       "bewegung":true,
                                       "sonos_ip": "192"
                                    },
                                    {
                                       "zimmer":"Hobbyraum",
                                       "anwesend":false,
                                       "bewegung":true,
                                       "sonos_ip": "174"
                                    }
                                 ]
                              }
                           },
                           {
                              "etage":{
                                 "OG":[
                                    {
                                       "zimmer":"Yunes",
                                       "anwesend":false,
                                       "bewegung":false,
                                       "sonos_ip": "203"
                                    },
                                    {
                                       "zimmer":"Mina",
                                       "anwesend":true,
                                       "bewegung":true,
                                       "sonos_ip": "188"
                                    }
                                 ]
                              }
                           }
                        ]
                        

                        und exakt das schreibst du in den Datenpunkt...

                        Diese JSON lassen sich in Blockly, JavaScript oder TypeScript erstellen und auch wieder einlesen oder verändern...

                        Siehst du die Objektstruktur und Tiefe? Kann auch erweitert werden

                        Andererseits könntest du das gleiche auch als Einzelobjekte unter 0_userdata.haus anlegen. Und auf diese entsprechend eine Logik aufbauen.

                        Deshalb sage ich schon seit einer Weile... Schreibe mal alle Anforderungen zusammen. Danach ist es in der Regel ein Kinderspiel... also wenn du sie dann auch noch mitteilst, wäre es ein Traum...

                        Installationsanleitung, Tipps, Alias-Definitionen, FAQ für das Sonoff NSPanel mit lovelace UI unter ioBroker
                        https://github.com/joBr99/nspanel-lovelace-ui/wiki

                        Benutzt das Voting rechts unten im Beitrag wenn er euch geholfen hat.

                        1 Antwort Letzte Antwort
                        0
                        • P ptr

                          @armilar weißt Du warum Timer in dieser getrennten Form nicht funktioniert? Ist mir schleierhaft. Habe sogar das Skript aufgedoppelt und je eines pro Raum eingesetzt (also z.B. im Skript NUR Minas_Zimmer Auswahl möglich)-> das gleiche Ergebnis.... der Timer bleibt nicht bei seinem Raum, sondern geht immer auf den letzten Trigger... Wo hängen die Timer also zusammen??

                          ArmilarA Offline
                          ArmilarA Offline
                          Armilar
                          Most Active Forum Testing
                          schrieb am zuletzt editiert von Armilar
                          #13

                          @ptr

                          Noch ein Beispiel in tieferer Objekt-Struktur mit zusätzlicher Lautstärke:

                          [
                             {
                                "etage":{
                                   "EG":[
                                      {
                                         "zimmer":{
                                            "Wohnzimmer":[
                                               {
                                                  "anwesend":true,
                                                  "bewegung":true,
                                                  "lautstaerke":22,
                                                  "sonos_ip":"192"
                                               }
                                            ]
                                         }
                                      },
                                      {
                                         "zimmer":{
                                            "Hobbyraum":[
                                               {
                                                  "anwesend":false,
                                                  "bewegung":true,
                                                  "lautstaerke":18,
                                                  "sonos_ip":"174"
                                               }
                                            ]
                                         }
                                      }
                                   ]
                                }
                             },
                             {
                                "etage":{
                                   "OG":[
                                      {
                                         "zimmer":{
                                            "Yunes":[
                                               {
                                                  "anwesend":false,
                                                  "bewegung":false,
                                                  "lautstaerke":12,
                                                  "sonos_ip":"203"
                                               }
                                            ]
                                         }
                                      },
                                      {
                                         "zimmer":{
                                            "Mina":[
                                               {
                                                  "anwesend":true,
                                                  "bewegung":true,
                                                  "lautstaerke":10,
                                                  "sonos_ip":"188"
                                               }
                                            ]
                                         }
                                      }
                                   ]
                                }
                             }
                          ]
                          

                          Installationsanleitung, Tipps, Alias-Definitionen, FAQ für das Sonoff NSPanel mit lovelace UI unter ioBroker
                          https://github.com/joBr99/nspanel-lovelace-ui/wiki

                          Benutzt das Voting rechts unten im Beitrag wenn er euch geholfen hat.

                          1 Antwort Letzte Antwort
                          0
                          • OliverIOO Offline
                            OliverIOO Offline
                            OliverIO
                            schrieb am zuletzt editiert von
                            #14

                            ok, er scheint das Interesse verloren zu haben.

                            Meine Adapter und Widgets
                            TVProgram, SqueezeboxRPC, OpenLiga, RSSFeed, MyTime,, pi-hole2, vis-json-template, skiinfo, vis-mapwidgets, vis-2-widgets-rssfeed
                            Links im Profil

                            ArmilarA P 2 Antworten Letzte Antwort
                            0
                            • OliverIOO OliverIO

                              ok, er scheint das Interesse verloren zu haben.

                              ArmilarA Offline
                              ArmilarA Offline
                              Armilar
                              Most Active Forum Testing
                              schrieb am zuletzt editiert von
                              #15

                              @oliverio

                              hmm, sehe ich auch so ;-)

                              Installationsanleitung, Tipps, Alias-Definitionen, FAQ für das Sonoff NSPanel mit lovelace UI unter ioBroker
                              https://github.com/joBr99/nspanel-lovelace-ui/wiki

                              Benutzt das Voting rechts unten im Beitrag wenn er euch geholfen hat.

                              1 Antwort Letzte Antwort
                              0
                              • HomoranH Nicht stören
                                HomoranH Nicht stören
                                Homoran
                                Global Moderator Administrators
                                schrieb am zuletzt editiert von
                                #16

                                dann kann ich ja endlich diesen Thread kapern :joy:

                                ich habe nichts verstanden, nur der Titel entspricht einem lang gehegten Wunsch von mir.

                                ich würde gerne eine Liste einer Variablen zuweisen, deren Name dynamisch erzeugt werden soll.
                                Idee gehört hier in den Thread: https://forum.iobroker.net/post/826534

                                so sol die Liste so lange erweitert werden, wie die Daten zu einer Flugnummer gehören, falls mehrere Flüge im Beobachtungsfenster sind, sollen die Daten jeweils der richtigen Liste zugeordnet werden. Die Variable sollte deshalb möglichst der Flugnummer entsprechen.

                                So ganz zu Ende gedacht ist die Idee noch nicht, ich bastel meist nach trial & error.

                                Die Kernfrage ist erst einmal kann ich prinzipiell so Variablen erstellen (und nach Benutzung wieder löschen)?

                                kein Support per PN! - Fragen im Forum stellen - es gibt fast nichts, was nicht auch für andere interessant ist.

                                Benutzt das Voting rechts unten im Beitrag wenn er euch geholfen hat.

                                der Installationsfixer: curl -fsL https://iobroker.net/fix.sh | bash -

                                ArmilarA paul53P OliverIOO 4 Antworten Letzte Antwort
                                0
                                • HomoranH Homoran

                                  dann kann ich ja endlich diesen Thread kapern :joy:

                                  ich habe nichts verstanden, nur der Titel entspricht einem lang gehegten Wunsch von mir.

                                  ich würde gerne eine Liste einer Variablen zuweisen, deren Name dynamisch erzeugt werden soll.
                                  Idee gehört hier in den Thread: https://forum.iobroker.net/post/826534

                                  so sol die Liste so lange erweitert werden, wie die Daten zu einer Flugnummer gehören, falls mehrere Flüge im Beobachtungsfenster sind, sollen die Daten jeweils der richtigen Liste zugeordnet werden. Die Variable sollte deshalb möglichst der Flugnummer entsprechen.

                                  So ganz zu Ende gedacht ist die Idee noch nicht, ich bastel meist nach trial & error.

                                  Die Kernfrage ist erst einmal kann ich prinzipiell so Variablen erstellen (und nach Benutzung wieder löschen)?

                                  ArmilarA Offline
                                  ArmilarA Offline
                                  Armilar
                                  Most Active Forum Testing
                                  schrieb am zuletzt editiert von
                                  #17

                                  @homoran sagte in Dynamisch erstellte Variablen.:

                                  Die Kernfrage ist erst einmal kann ich prinzipiell so Variablen erstellen

                                  Natürlich nicht... Aber du kannst jederzeit einer Variable ein Objekt unterjubeln...

                                  Der Titel ist definitiv nicht sinnvoll benannt, auch wenn es ein langersehnter Wunsch von dir ist :joy:

                                  Installationsanleitung, Tipps, Alias-Definitionen, FAQ für das Sonoff NSPanel mit lovelace UI unter ioBroker
                                  https://github.com/joBr99/nspanel-lovelace-ui/wiki

                                  Benutzt das Voting rechts unten im Beitrag wenn er euch geholfen hat.

                                  HomoranH 1 Antwort Letzte Antwort
                                  1
                                  • HomoranH Homoran

                                    dann kann ich ja endlich diesen Thread kapern :joy:

                                    ich habe nichts verstanden, nur der Titel entspricht einem lang gehegten Wunsch von mir.

                                    ich würde gerne eine Liste einer Variablen zuweisen, deren Name dynamisch erzeugt werden soll.
                                    Idee gehört hier in den Thread: https://forum.iobroker.net/post/826534

                                    so sol die Liste so lange erweitert werden, wie die Daten zu einer Flugnummer gehören, falls mehrere Flüge im Beobachtungsfenster sind, sollen die Daten jeweils der richtigen Liste zugeordnet werden. Die Variable sollte deshalb möglichst der Flugnummer entsprechen.

                                    So ganz zu Ende gedacht ist die Idee noch nicht, ich bastel meist nach trial & error.

                                    Die Kernfrage ist erst einmal kann ich prinzipiell so Variablen erstellen (und nach Benutzung wieder löschen)?

                                    ArmilarA Offline
                                    ArmilarA Offline
                                    Armilar
                                    Most Active Forum Testing
                                    schrieb am zuletzt editiert von
                                    #18

                                    @homoran sagte in Dynamisch erstellte Variablen.:

                                    Idee gehört hier in den Thread

                                    Das könnte man aber doch mal zu Ende bringen.

                                    Installationsanleitung, Tipps, Alias-Definitionen, FAQ für das Sonoff NSPanel mit lovelace UI unter ioBroker
                                    https://github.com/joBr99/nspanel-lovelace-ui/wiki

                                    Benutzt das Voting rechts unten im Beitrag wenn er euch geholfen hat.

                                    1 Antwort Letzte Antwort
                                    1
                                    • ArmilarA Armilar

                                      @homoran sagte in Dynamisch erstellte Variablen.:

                                      Die Kernfrage ist erst einmal kann ich prinzipiell so Variablen erstellen

                                      Natürlich nicht... Aber du kannst jederzeit einer Variable ein Objekt unterjubeln...

                                      Der Titel ist definitiv nicht sinnvoll benannt, auch wenn es ein langersehnter Wunsch von dir ist :joy:

                                      HomoranH Nicht stören
                                      HomoranH Nicht stören
                                      Homoran
                                      Global Moderator Administrators
                                      schrieb am zuletzt editiert von
                                      #19

                                      @armilar sagte in Dynamisch erstellte Variablen.:

                                      @homoran sagte in Dynamisch erstellte Variablen.:

                                      Die Kernfrage ist erst einmal kann ich prinzipiell so Variablen erstellen

                                      Natürlich nicht... Aber du kannst jederzeit einer Variable ein Objekt unterjubeln...

                                      Der Titel ist definitiv nicht sinnvoll benannt, auch wenn es ein langersehnter Wunsch von dir ist :joy:

                                      Danke!
                                      Auch wenn es nicht das ist was ich hören wollte. Immerhin erklärt es warum ich vergeblich versucht hatte "mein" Thema darin zu finden.

                                      Mit einer dynamisch benannten Variable hätte ich mich nur einfacher getan. Ich weiß ja nicht einmal wie man ein Objekt unterjubelt, geschweige denn wie ich relativ einfach prüfe in welche Variable ich schreiben müsste.

                                      Danke!

                                      kein Support per PN! - Fragen im Forum stellen - es gibt fast nichts, was nicht auch für andere interessant ist.

                                      Benutzt das Voting rechts unten im Beitrag wenn er euch geholfen hat.

                                      der Installationsfixer: curl -fsL https://iobroker.net/fix.sh | bash -

                                      ArmilarA 1 Antwort Letzte Antwort
                                      1
                                      • HomoranH Homoran

                                        @armilar sagte in Dynamisch erstellte Variablen.:

                                        @homoran sagte in Dynamisch erstellte Variablen.:

                                        Die Kernfrage ist erst einmal kann ich prinzipiell so Variablen erstellen

                                        Natürlich nicht... Aber du kannst jederzeit einer Variable ein Objekt unterjubeln...

                                        Der Titel ist definitiv nicht sinnvoll benannt, auch wenn es ein langersehnter Wunsch von dir ist :joy:

                                        Danke!
                                        Auch wenn es nicht das ist was ich hören wollte. Immerhin erklärt es warum ich vergeblich versucht hatte "mein" Thema darin zu finden.

                                        Mit einer dynamisch benannten Variable hätte ich mich nur einfacher getan. Ich weiß ja nicht einmal wie man ein Objekt unterjubelt, geschweige denn wie ich relativ einfach prüfe in welche Variable ich schreiben müsste.

                                        Danke!

                                        ArmilarA Offline
                                        ArmilarA Offline
                                        Armilar
                                        Most Active Forum Testing
                                        schrieb am zuletzt editiert von Armilar
                                        #20

                                        @homoran

                                        Sehr gerne.

                                        Daher war mein Anliegen in diesem Topic ja auch, die Anforderungen zu finden um eine

                                        Ich würde dir gerne bei einer "Lösung" helfen, die wahrscheinlich komplett anders aussieht. Dazu brauchen wir aber die komplette Anforderung an die Lösung. Nicht das Problem...

                                        Lösung zu denken, die funktioniert ;-)

                                        Edit: Evtl. Code der sich selbst schreibt, aber ich denke das geht jetzt doch etwas zu weit :joy:

                                        Installationsanleitung, Tipps, Alias-Definitionen, FAQ für das Sonoff NSPanel mit lovelace UI unter ioBroker
                                        https://github.com/joBr99/nspanel-lovelace-ui/wiki

                                        Benutzt das Voting rechts unten im Beitrag wenn er euch geholfen hat.

                                        1 Antwort Letzte Antwort
                                        0
                                        • HomoranH Homoran

                                          dann kann ich ja endlich diesen Thread kapern :joy:

                                          ich habe nichts verstanden, nur der Titel entspricht einem lang gehegten Wunsch von mir.

                                          ich würde gerne eine Liste einer Variablen zuweisen, deren Name dynamisch erzeugt werden soll.
                                          Idee gehört hier in den Thread: https://forum.iobroker.net/post/826534

                                          so sol die Liste so lange erweitert werden, wie die Daten zu einer Flugnummer gehören, falls mehrere Flüge im Beobachtungsfenster sind, sollen die Daten jeweils der richtigen Liste zugeordnet werden. Die Variable sollte deshalb möglichst der Flugnummer entsprechen.

                                          So ganz zu Ende gedacht ist die Idee noch nicht, ich bastel meist nach trial & error.

                                          Die Kernfrage ist erst einmal kann ich prinzipiell so Variablen erstellen (und nach Benutzung wieder löschen)?

                                          paul53P Offline
                                          paul53P Offline
                                          paul53
                                          schrieb am zuletzt editiert von paul53
                                          #21

                                          @homoran sagte: Die Kernfrage ist erst einmal kann ich prinzipiell so Variablen erstellen (und nach Benutzung wieder löschen)?

                                          Nein. Ausweg: Array mit Objekten

                                          const obj = {Flugnummer: 'LH123', weitere_Attribute: 'abc'}
                                          

                                          Dann in einer Schleife die Objekte einlesen und die Flugnummer vergleichen.

                                          Bitte verzichtet auf Chat-Nachrichten, denn die Handhabung ist grauenhaft !
                                          Produktiv: RPi 2 mit S.USV, HM-MOD-RPI und SLC-USB-Stick mit root fs

                                          HomoranH CodierknechtC 2 Antworten Letzte Antwort
                                          1
                                          Antworten
                                          • In einem neuen Thema antworten
                                          Anmelden zum Antworten
                                          • Älteste zuerst
                                          • Neuste zuerst
                                          • Meiste Stimmen


                                          Support us

                                          ioBroker
                                          Community Adapters
                                          Donate

                                          775

                                          Online

                                          32.4k

                                          Benutzer

                                          81.6k

                                          Themen

                                          1.3m

                                          Beiträge
                                          Community
                                          Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen | Einwilligungseinstellungen
                                          ioBroker Community 2014-2025
                                          logo
                                          • Anmelden

                                          • Du hast noch kein Konto? Registrieren

                                          • Anmelden oder registrieren, um zu suchen
                                          • Erster Beitrag
                                            Letzter Beitrag
                                          0
                                          • Home
                                          • Aktuell
                                          • Tags
                                          • Ungelesen 0
                                          • Kategorien
                                          • Unreplied
                                          • Beliebt
                                          • GitHub
                                          • Docu
                                          • Hilfe