NEWS
Gelöst! Elemente nach Ereignis am Anfang eines Array [...]
-
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
-
@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)
-
@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.
-
@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!