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. [Gelöst]Subscribe/on und Arrays

NEWS

  • Neuer Blogbeitrag: Monatsrückblick - Dezember 2025 🎄
    BluefoxB
    Bluefox
    10
    1
    175

  • Weihnachtsangebot 2025! 🎄
    BluefoxB
    Bluefox
    24
    1
    1.4k

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

[Gelöst]Subscribe/on und Arrays

Geplant Angeheftet Gesperrt Verschoben Skripten / Logik
5 Beiträge 3 Kommentatoren 1.3k Aufrufe
  • Ä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.
  • W Offline
    W Offline
    Wallauer
    schrieb am zuletzt editiert von
    #1

    Hallo zusammen,

    ich bin gerade dabei, von FHEM auf ioBroker zu wechseln und habe ein kleines Problem mit einem ersten kleinen Script, welches die letzte Öffnung des jeweiligen Fenstersensors in einen state wegschreiben soll.

    Die states habe ich alle entsprechend angelegt (siehe ganz unten) und es funktioniert auch, bis auf eine "Kleinigkeit". Egal welches Fenster ich öffne, es wird immer in die states von fs.length - 1 geschrieben, also KellerTuer.

    `var fs = [];
    fs.push({id:"OEQ0XXXX1", name:"GaesteWC"});
    fs.push({id:"MEQ0XXXX2", name:"Bad"});
    fs.push({id:"MEQ0XXXX3", name:"BueroTerrassenTuer"});
    fs.push({id:"OEQ0XXXX4", name:"Buero"});
    fs.push({id:"MEQ0XXXX5", name:"KuecheTerrassenTuer"});
    fs.push({id:"OEQ0XXXX6", name:"Kueche"});
    fs.push({id:"MEQ0XXXX7", name:"WohnzimmerTerrassenTuer"});
    fs.push({id:"OEQ0XXXX8", name:"WohnzimmerGartenLinks"});
    fs.push({id:"OEQ0XXXX9", name:"WohnzimmerGartenRechts"});
    fs.push({id:"OEQ0XXX10", name:"WohnzimmerStrasseLinks"});
    fs.push({id:"OEQ0XXX11", name:"WohnzimmerStrasseRechts"});
    fs.push({id:"OEQ0XXX12", name:"SchlafzimmerLinks"});
    fs.push({id:"OEQ0XXX13", name:"SchlafzimmerRechts"});
    fs.push({id:"MEQ0XXX14", name:"EingangsTuer"});
    fs.push({id:"OEQ0XXX15", name:"KellerTreppe"});
    fs.push({id:"OEQ0XXX16", name:"KellerDusche"});
    fs.push({id:"OEQ0XXX17", name:"KellerZimmerRechts"});
    fs.push({id:"OEQ0XXX18", name:"KellerZimmerLinks"});
    fs.push({id:"OEQ0XXX19", name:"KellerTuer"});
    
    for (var i=0; i<fs.length; i++){/var/triggername="hm-rpc.0." +/fs[i].id/".1.state";/setnamea="Fenstersensoren." fs[i].name/".open";/setnameb="Fenstersensoren." ".lastopen";/log("trigger:/"/setnamea:/setnameb:/setnameb);/on({id:/triggername,/change:/"ne"},/function(obj)/{/setstate(setnamea,/obj.state.val);/if(obj.state.val="==" true){/zeitpunkt="formatDate(obj.state.ts," "dd.mm.yyyy/hh:mm");/setstate(setnameb,/zeitpunkt);/}/});/<e=""></fs.length;>`
    
    P.S.: Ich bin mir bewusst, dass es über RegExp auch einfacher geht, aber es geht mir hier erstmal um ein Grundverständnis, warum
    
    die in der Schleife angelegten subscribes nicht, wie vom mir erwartet, funktionieren. 
    
    Die jeweiligen Objekte unter javascript.0 sehen folgendermaßen aus:
    `~~[code]~~/* Einmaliges Anlegen der Objekte
    
    for (var i=0; i<fs.length; i++){/var/name="Fenstersensoren." +/fs[i].name;/createstate(name,/fs[i].id);/createstate(name/".open",/false,/{read:/true,/write:/name:/"fenster/offen?",/type:/"boolean",/def:/false});/".lowbat",/"batterie/leer/?",/".lastopen",/"n/a",/"beschreibung",/"string",/a"});/}/*/<e=""></fs.length;>`[/i][/i][/code][/i][/i][/i]
    
    1 Antwort Letzte Antwort
    0
    • AlCalzoneA Offline
      AlCalzoneA Offline
      AlCalzone
      Developer
      schrieb am zuletzt editiert von
      #2

      @Wallauer:

      Egal welches Fenster ich öffne, es wird immer in die states von fs.length - 1 geschrieben, also KellerTuer. `
      Ja, das ist bei JavaScript und Schleifen so ein ding. Zu dem Zeitpunkt wo deine on-Funktion ausgeführt wird, ist i = fs.length-1.

      Du hast zwei (drei) Möglichkeiten:

      1. Wenn dein NodeJS neu genug ist, ersetze alle "var" durch "let" und es sollte funktionieren.

      2. Aktualisiere dein NodeJS und zurück zu 1. ;)

      3. Ansonsten lagere den Schleifeninhalt in eine eigene Funktion aus:

      `var fs = [];
      fs.push({id:"OEQ0XXXX1", name:"GaesteWC"});
      fs.push({id:"MEQ0XXXX2", name:"Bad"});
      fs.push({id:"MEQ0XXXX3", name:"BueroTerrassenTuer"});
      fs.push({id:"OEQ0XXXX4", name:"Buero"});
      fs.push({id:"MEQ0XXXX5", name:"KuecheTerrassenTuer"});
      fs.push({id:"OEQ0XXXX6", name:"Kueche"});
      fs.push({id:"MEQ0XXXX7", name:"WohnzimmerTerrassenTuer"});
      fs.push({id:"OEQ0XXXX8", name:"WohnzimmerGartenLinks"});
      fs.push({id:"OEQ0XXXX9", name:"WohnzimmerGartenRechts"});
      fs.push({id:"OEQ0XXX10", name:"WohnzimmerStrasseLinks"});
      fs.push({id:"OEQ0XXX11", name:"WohnzimmerStrasseRechts"});
      fs.push({id:"OEQ0XXX12", name:"SchlafzimmerLinks"});
      fs.push({id:"OEQ0XXX13", name:"SchlafzimmerRechts"});
      fs.push({id:"MEQ0XXX14", name:"EingangsTuer"});
      fs.push({id:"OEQ0XXX15", name:"KellerTreppe"});
      fs.push({id:"OEQ0XXX16", name:"KellerDusche"});
      fs.push({id:"OEQ0XXX17", name:"KellerZimmerRechts"});
      fs.push({id:"OEQ0XXX18", name:"KellerZimmerLinks"});
      fs.push({id:"OEQ0XXX19", name:"KellerTuer"});
      
      function buildTrigger(trigger) {
          var triggername = "hm-rpc.0." + trigger.id + ".1.STATE";
          var setnameA = "Fenstersensoren." + trigger.name + ".open";
          var setnameB = "Fenstersensoren." + trigger.name + ".lastopen";
          //log("Trigger: " + triggername + " setnameA: " + setnameA + " setnameB: " + setnameB);
          on({id: triggername, change: "ne"}, function(obj) {
             setState(setnameA, obj.state.val); 
             if(obj.state.val === true){
                 var zeitpunkt = formatDate(obj.state.ts, "DD.MM.YYYY hh:mm");
                 setState(setnameB, zeitpunkt);
             }
          });
      }
      
      for (var i=0; i<fs.length; i++){/buildtrigger(fs[i]);/}/<e=""></fs.length;>`
      
      Es würde auch gehen, wenn du direkt auf ein Array der State-IDs lauschst und dann in Abhängigkeit von der ID des geänderten States die richtige Aktion wählst.[/i]
      

      Warum `sudo` böse ist: https://forum.iobroker.net/post/17109

      1 Antwort Letzte Antwort
      0
      • W Offline
        W Offline
        Wallauer
        schrieb am zuletzt editiert von
        #3

        Vielen Dank für die schnelle Antwort AlCalzone,

        Du hast meinen Sonntag gerettet ;-)

        1 Antwort Letzte Antwort
        0
        • apollon77A Offline
          apollon77A Offline
          apollon77
          schrieb am zuletzt editiert von
          #4

          Alternativ ( so mache ich es an ein paar stellen) mach ein Mapping Objekt. Key=en überwachten statenamen ( wie dein Array das erst nur vollständig mit „hm-rpc. …” und value die zielvariable. Dann kannst du in der on-Funktion obj.id nehmen und einfach genetisch die zielvariable auslesen

          Beitrag hat geholfen? Votet rechts unten im Beitrag :-) https://paypal.me/Apollon77 / https://github.com/sponsors/Apollon77

          • Debug-Log für Instanz einschalten? Admin -> Instanzen -> Expertenmodus -> Instanz aufklappen - Loglevel ändern
          • Logfiles auf Platte /opt/iobroker/log/… nutzen, Admin schneidet Zeilen ab
          1 Antwort Letzte Antwort
          0
          • AlCalzoneA Offline
            AlCalzoneA Offline
            AlCalzone
            Developer
            schrieb am zuletzt editiert von
            #5

            Sowas meinte ich mit > in Abhängigkeit von der ID des geänderten States die richtige Aktion ;)

            Warum `sudo` böse ist: https://forum.iobroker.net/post/17109

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


            Support us

            ioBroker
            Community Adapters
            Donate

            602

            Online

            32.5k

            Benutzer

            81.7k

            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