NEWS
Zustandsänderung DP von mehreren DPs über ID von Selektor?
-
@actionbyte sagte: innerhalb von z.B. 10 Sekunden den Zustand von 0 -> 1 ändern. Die IDs der geänderten DPs möchte ich eine Variabel schreiben, aber nur diese.
Vorschlag:
-
@actionbyte
Falls nur einmal zum Ende der Trigger-Serie erfasst werden soll, muss man eine Verzögerung verwenden. -
@actionbyte sagte in Zustandsänderung DP von mehreren DPs über ID von Selektor?:
Hi,
Szenario:
x-Datenpunkte von denen 1 oder mehrere innerhalb von z.B. 10 Sekunden den Zustand von 0 -> 1 ändern.
Die IDs der geänderten DPs möchte ich eine Variabel schreiben, aber nur diese.
Also nicht die, die eventuell schon vor der Änderung auf 1 waren oder gar innerhalb der 10 Sekunden auf 0 gewechselt haben.
Geht das mit ID von Selektor? Damit bekomme ich doch eigentlich nur alle DPs nach Trigger heraus die danach auf "true" stehen und nicht die Änderung 0 -> 1, richtig?Falsch.
Wenn du
- einen trigger auf eine Liste von ID’s setzt (wurde geändert)
- im trigger den Baustein ObjectID aus dem trigger Bereich nutzt
Kannst du damit feststellen welcher der datenpunkte sich geändert hat.
Nun geht es so:
- Variable “chagendstates” definieren, mit einer leeren Liste initialisieren
- Trigger auf die datenpunkte, wurde geändert
- Falls nicht timeout und ‘wert’ mache starte timeout in 10 Sekunden -.> Inhalt von changedstates in einem datenpunkt Schreiben, changedstates auf leere Liste setzen
- falls ‘wert’ mache: ‘objektID’ an ‘changedstates’ anhängen, sonst: nach ‘objektID’ in ‘changedstates’ suchen und aus der Liste entfernen.
Damit baut sich getriggert von der ersten Änderung eines DP auf wahr eine liste der datenpunkte auf die innerhalb der 10 Sekunden auf wahr gewechselt haben und nicht wieder auf falsch zurück sind.
Blockly beispielcode kann ich heute Abend liefern.
A.
-
Danke für die erstellten Beispiele. @Asgothian: Dein Script kann ich nur in Teilen praktisch nachvollziehen, der letzte Listenbaustein "remove #" kann ich so nicht einfügen, nicht vorhanden?
Ich möchte konkreter werden: wie schon häufig versucht möchte ich eine Begrüßung durch Alexa mittels Radar Adapter und Türkontakt. Eigentlich ziemlich einfach, allerdings möchte ich bei einer Anwesenheitsänderung erkenen wieviele Bewohner beim Trigger Türkontakt das Haus betrehten und eben nur eine oder mehrere Personen gleichzeitig begrüßen.
Ich erfasse also eine Änderung über Radar, warte 10 Sekunden ob noch jmd über radar sich anmeldet. Diese Änderungen (>=1) soll beim Trigger Türkontrakt dann korrekt ausgewertet werden, also "Hallo Peter!" oder eben "Hallo Peter und Maria!".Möglich das o.g. Konstrukt hierfür anzuwenden oder andere Lösung besser?
-
@actionbyte dafür ist es nutzbar.
Der Baustein mit “entferne…” ist eine der möglichen Einstellungen des “nimm” Bausteins in den Listen. Ich kann den leider heute nicht posten.
A.
-
@asgothian sagte in Zustandsänderung DP von mehreren DPs über ID von Selektor?:
Der Baustein mit “entferne…” ist eine der möglichen Einstellungen des “nimm” Bausteins in den Listen.
Gefunden, danke. Ich wusste nicht das der Baustein nach Auswahl die Struktur ändert, coole Sache.
Abgsehen davon habe ich schon ein Verständnisproblem beim Erfassen über den IDSelektor.Ich hoffe deine Vorgabe entsprechend halbwegs korrekt umgesetzt zu haben. Als Trigger nutze ich vorerst ein Zigbee Würfel und für den Versuch nehme ich die vorhande Aufzählung meiner Fenster (da brauche ich das ein oder andere nur öffnen anstatt die Handys ein- und auszuschalten oder meine Frau bitten muss unsere Wohung ständig zu verlassen
), jedoch liefert mir IVS unsinnige Ergebnisse.
Zudem ist mir nicht ganz klar wie der so gebaute Timeout die Ereignisse während der letzten 10 Sekunden festhalten soll, so wie jetzt konstruiert werden doch nur die Ergebnisse nach 3 Sekunden erfasst, oder habe ich das Setzen der Variabel Timeout falsch umgesetzt?
Ich habe da wohl noch etliche Fehler drin. -
@actionbyte da ich keinen Zugriff auf mein System hab musst du mir das Skript als Screenshot posten
A.
-
-
@actionbyte sagte in Zustandsänderung DP von mehreren DPs über ID von Selektor?:
Ich habe da wohl noch etliche Fehler drin.
Fangen wir mit den einfachen Fehlern an.
- wenn du 10 sekunden timeout willst dann solltest du auch 10 sekunden eintragen
- wenn du an eine Liste etwas anhängen willst, dann am besten einen Wert, keine Liste
- der Baustein "ausführen timeout" erzeugt eine Variable "timeout". Diese bekommt einen sogenannten "Handle". den zerstörst du dadurch das du die Variable manuell mit "wahr" und "falsch" beschreibst.
Leider habe ich bei meiner Antwort das das Konstrukt nutzbar ist übersehen das du Änderungen in der Vergangenheit prüfen willst. das macht das ganze komplex.
was du tun musst:
Trigger auf den Türkontakt. Darin (ggf. mit Timeout damit die Meldung nach Türöffnung kommt):- aktuelle Zeit holen, in variable speichern (als datum-objekt)
- durch die Liste der möglichen Personen durchgehen und prüfen:
- Wert vom ObjektID = wahr und aktuelle Zeit - letzte Änderung von ObjektId < (n*1000) (für n sekunden, 10000 für 10 sekunden). Wenn wahr, name des Mitbewohners an die liste anhängen. Damit stellst du sicher das nur die Mitbewohner begrüsst werden die in den letzten 10 sekunden "angemeldet" wurden. Je nach dem wie gut de Radar adapter bei dir geht musst du die Zeit etwas erhöhen.
- wenn das für alle Mitbewohner getan ist, die Nachricht mit der liste der in den letzten 10 sekunden eingetroffenen Mitbewohnern ausgeben.
A.
-
@actionbyte sagte: erkenen wieviele Bewohner beim Trigger Türkontakt das Haus betrehten
Dazu sollte es genügen, beim Schließen der Tür zu triggern und im Trigger zu prüfen, wessen Anwesenheit sich in den letzten 10 Sekunden von false auf true geändert hat.
Inhalt der JS-Funktion getName(id):
return getObject(id).common.name;
-
@paul53
Habe dein Script entsprechend umgesetzt:
Inhalt vom JS-Funktion "Objekt ermitteln":return getObject(Geraet_dp).common.name;
Abweichend zu deiner Vorgabe:
- Trigger (für mich hier zum Versuch)
- ID vom Selektor: noch immer meine Fensterauflistung die ich zum Testen verwende. Diese wird in anderen Scripten korrekt ausgewertet, daher sollte eine Änderung auch in diesem Script korrekt funktionieren.
Variabel "letzte Änderungt": ist die so richtig? Muss die noch anders beschrieben werden oder ist das auch ein "Handle"?
Wie wird die "Letzte Änderung" vom Zeitpunkt festgehalten und wie ist die Angabe <100000 zu verstehen? Mir fehlt hier die Angabe als Zeit an sich. Wenn das für das Script eindeutig als Zeit gesetzt wird, dann reden wir hier über ms?Nachdem ich ein Fenster geöffnet habe (Pedant Anwesenheit Mitbewohner kommt) und kurz danach (<100000 sollte lang genug sein) meinen Trigger starte, bleibt die Liste dennoch leider leer.
-
@actionbyte sagte: <100000 sollte lang genug sein
Du hast 1000000 ms eingetragen, was ca. 17 Minuten sind.
@actionbyte sagte in Zustandsänderung DP von mehreren DPs über ID von Selektor?:
Variabel "letzte Änderungt": ist die so richtig?
"letzte Änderung" ist eine vordefinierte lokale Variable, die den Zeitpunkt der letzten Änderung des Trigger-Datenpunktes enthält:
-
@paul53
Danke, meine falsche Variabel war das Problem, habe nun die lokale Triggervariabel genommen und Liste wird wie gewünscht erstellt.
Ich werde meine 17 Minuten jetzt der Praxis entsprechend auf < 1 Minute ändern und die Liste IDvS auf die Mitbewohner umstellen.