Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. JavaScript
    5. Gelöst! Elemente nach Ereignis am Anfang eines Array [...]

    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

    Gelöst! Elemente nach Ereignis am Anfang eines Array [...]

    This topic has been deleted. Only users with topic management privileges can see it.
    • ?
      A Former User last edited by A Former User

      Guten Abend,

      irgendwie komme ich gerade nicht weiter. Und zwar möchte ich in einem Datenpunkt schreiben welche Tür/Fenster zuletzt geöffnet worden ist. Listen und so welche gerade geöffnet sind und wieviele usw. werden auch im Skript abgehandelt und das funktioniert auch. Aber beim Datenpunkt welche zuletzt geöffnet wurde geht er immer nach dem ABC und setzt somit immer was im ABC weiter hinten ist vorne ran.
      Habe es schon mit der ".unshift()" funktion probiert aber das klappt irgendwie nicht. Laut Beschreibung soll er dann ja das Element am Anfang des Arrays hinzufügen. Geht aber trotzdem nach dem ABC.
      Habe ich irgendwo ein Denkfehler? Hat jemand eine Idee was ich machen muss damit er das Element was zuletzt den Wert = 1 ausgibt auch im Datenpunkt am Anfang ausgibt? Alles was nach dem Komma kommt lasse ich ausgeblendet, so damit nur das erste Element angezeigt wird. Anbei zwei Schnipsel vom Code. Vielleicht hilft das.

      //Türen
      //Funktionen
      function count_doors() {
          let doorsOpen = 0;
          let doorsClosed = 0;
          let doorsTotal = 0;
          let list_doorsOpen = [];
          let last_doorOpened = [];
      
          let doors = getObject('enum.functions.' + aliasDoors).common.members;
      
      
      for (let i = 0; i < doors.length; i++) {
              let val_doors = getState(doors[i]).val;
              doorsTotal = (typeof doorsTotal == 'number' ? doorsTotal : 0) + 1;
                  if (val_doors == isOpen) {
                      doorsOpen = (typeof doorsOpen == 'number' ? doorsOpen : 0) + 1;
                      list_doorsOpen.push(getObject(doors[i]).common.name)
                      last_doorOpened.unshift(getObject(doors[i]).common.name)
                  }
          }
      
          //Datenpunkte befüllen
          setState(dp_number_doors_total, doorsTotal);
          setState(dp_number_doors_closed, doorsClosed);
          setState(dp_number_doors_open, doorsOpen);
      
          if (doorsOpen == 0) {
              setState(dp_list_doors_open, ('Alle Türen sind geschlossen.'))
          } 
          else if (doorsOpen == doorsTotal) {
              setState(dp_list_doors_open, ('Alle Türen sind geöffnet'))
          }
          else {
              setState(dp_list_doors_open, String(list_doorsOpen.join(', ')));
              setState(dp_door_last_opened, String(last_doorOpened.slice(0, 1)));
          }
      

      Vielen Dank schonmal fürn Input.

      Christian

      liv-in-sky paul53 2 Replies Last reply Reply Quote 0
      • liv-in-sky
        liv-in-sky @Guest last edited by liv-in-sky

        @ciddi89

        ich verstehe "das letzte" noch nicht ganz - meinst du das zeitlich - wahrschenlich nicht, dann müßtest du die zeit berechnen und dann danach sortieren

        das ganze läuft immer in der reihenfolge ab, wie die id's in doors drinstehen - da hast du eigentlich keinen mehrwert, wenn du das letzte an den anfang des array's schreibst - das letzte ist immer abhängig von der reihenfolge in doors

        doorsopen würde ich über die länge des arrays (list_doorsOpen.length) machen - gesamt ist die länge von doors (doors.length)

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

          @ciddi89 sagte: Datenpunkt schreiben welche Tür/Fenster zuletzt geöffnet worden ist.

          Das gehört nicht in die Funktion count_doors(), sondern in den Trigger. Dort steht auch der Name des Datenpunktes ohne getObject(id) zur Verfügung.

          @ciddi89 sagte in Elemente nach Ereignis am Anfang eines Array schreiben:

          let doors = getObject('enum.functions.' + aliasDoors).common.members;
          

          funktioniert ohne existsState(id) nur, wenn "members" nur Datenpunkte - keine Kanäle / Geräte - enthält. Andernfalls erhält man Warnungen.

          ? 1 Reply Last reply Reply Quote 0
          • ?
            A Former User @paul53 last edited by

            @paul53 said in Elemente nach Ereignis am Anfang eines Array schreiben:

            Das gehört nicht in die Funktion count_doors(), sondern in den Trigger.

            Das war es danke. Manchmal denkt man einfach zu kompliziert.

            Ich danke dir und @liv-in-sky für euer Input! 🙂

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

            Support us

            ioBroker
            Community Adapters
            Donate

            779
            Online

            31.8k
            Users

            80.0k
            Topics

            1.3m
            Posts

            3
            4
            514
            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