NEWS
dynamischer Inhalt für Trigger
-
Hei zusammen.
Kurze Beschreibung meines Problems:
-
In einer View (VIS1) ist ein MDW-ListObjekt, welches ich durch ein JSON fülle. Es werden versch. Daten angezeigt, unter anderem der Bool-Wert Status. (Liste aller offenen Aufgaben: Name und Nummer der Aufgabe, Status)
-
Wenn nun in einem der Datensätze der Status geändert wird, soll der Inhalt einiger dieser Felder des "Datensatzes" in eine Reihe von anderen DP übertragen werden.
Was funktioniert:
Für die Auswahl, welcher Datensatz sich in der Liste geändert hat, habe ich eine funktionierende Lösung.
Auch der restliche Prozess, Daten berechnen und übertragen läuft.
Wenn sich nichts verändert, läuft der Prozess. Die Liste wurde angelegt und im Trigger hinterlegt.Die Frage:
Wenn nun der Umfang der Liste sich ändert (es kommt eine neue Aufgabe hinzu), muss sich auch der Inhalt der Variable des Triggers verändern. Das geht aber nicht, da dieses Script erst ja mit dem Auslösen des Triggers startet.
Jetzt habe ich den Inhalt in einen DP geschrieben und wollte per Wert von Object ID den DP als Parameter für den Trigger auslesen. Geht wohl aber nicht, da hier keine DPs genommen werden sollen.Wie kann ich nun einen quasi dynamischen Inhalt als Parameter für einen Trigger hinterlegen?
Ich dachte ggf per globaler Variable, aber das bekam ich nicht hin.
-
-
@mottimuc
Hallo,
ich glaube ich habe so etwas ähnliches vor kurzem gelöst, jedenfalls wenn ich deine Frage richtig verstehe .
Jedoch nicht mit einer Aufgabenliste, sondern mit einem Kalender in den ich (aktuell) maximal 10 Termine eintragen kann.
Dazu habe ich mir einen Objektbaum angelegt mit 10 Ordnern in denen jeweils alle notwendigen Datenpunkte angelegt sind um mit dem Kalender arbeiten zu können.
Als Trigger habe ich in meinem Fall tatsächlich ein paar globale Variablen genommen die in der VIS als Butten angelegt sind
(z.B. neuen Termin von den Eingabemasken übernehmen oder Eintrag löschen).
Um hier nicht ein unendlich langes Blockly-Script zu bauen bin ich dann allerdings auf Java-Script ausgewichen, da man hier die Datenpunkte dynamisch anpassen kann - soweit ich das Sehe ist so etwas mit Blockly nicht möglich (wenn doch weis ich jedenfalls nicht wie )So sieht z.B. der Code aus mit dem ich die Daten aus den Eingabemasken in VIS in den nächsten freien Kalenderplatz schreibe - Wie gesagt, das Skript wird über einen Butten ausgelöst. Andere Skripte aus dem Projekt starten aber z.B. Zeitgesteuert um täglich zu prüfen ob eines der Einträge in den nächsten Tagen ansteht um eine Meldung rauszuschicken.
var max = getState('0_userdata.0.Kalender.Max_Eintraege').val; var n = 1; var pfad; var ende = false; while (n <= max && ende == false){ pfad = "0_userdata.0.Kalender.Eintraege." + n + ".bez"; if (getState(pfad).val == "") { setState(pfad, getState('0_userdata.0.Kalender.Eingabe_Bezeichnung').val); pfad = '0_userdata.0.Kalender.Eintraege.' + n + '.dat'; setState(pfad, formatDate(getDateObject(getState('0_userdata.0.Kalender.Eingabe_Datum').val), 'DD.MM.YY')); pfad = '0_userdata.0.Kalender.Eintraege.' + n + '.dat-end'; setState(pfad, formatDate(getDateObject(getState('0_userdata.0.Kalender.Eingabe_Enddatum').val), 'DD.MM.YY')); pfad = '0_userdata.0.Kalender.Eintraege.' + n + '.tim'; setState(pfad, getState('0_userdata.0.Kalender.Eingabe_Uhrzeit').val); pfad = '0_userdata.0.Kalender.Eintraege.' + n + '.kon'; if(getState('0_userdata.0.Kalender.Eingabe_Enddatum').val == ""){ setState(pfad, getDateObject(getState('0_userdata.0.Kalender.Eingabe_Datum').val).getTime()); } else{ setState(pfad, getDateObject(getState('0_userdata.0.Kalender.Eingabe_Enddatum').val).getTime()); } ende = true; } else{ n++; } }
Zur Erklärung:
Das Skript setzt die Variable "pfad" zuerst auf auf den Datenpunkt des ersten Eintrags und prüft ob das String-Feld "bez" leer ist, wenn ja, schreibt er alle Daten aus den Eingabemasken in die entsprechenden Felder des 1. Eintrags.
Ist der erste Eintrag nicht leer wird die variable "n" um eins erhöht und die while-Schleife wird erneut begonnen. Nun ist der Pfad auf den 2. Eintrag gesetzt und wieder findet eine Prüfung statt. Die Schleife wird solange durchlaufen bis ein freier Platz gefunden wurde oder die maximale Anzahl an Einträgen erreicht wurde.Den Datenpunkt für den Trigger so zu gestalten ist natürlich auch möglich. Jedoch musst du dann auch dieses Skript erst wieder starten - Meiner Meinung nach bleibt hier nur ein zeitlicher Start (z.B. einmal am Tag oder alle paar Minuten) oder eben über die Überwachung verschiedener fest definierter Datenpunkte.
Beim Löschen stand ich auch vor dem Problem, dass ich nicht alle 10 Datenpunkte zum löschen permanent überwachen wollte. So habe ich einen Bestätigen-Butten eingebaut, welchen ich dann überwache.
Bedeutet: immer wenn der Bestätigen Butten auf "true" gesetzt wird fängt ein Skript an zu laufen und überprüft über eine ähnliche Schleifenfunktion welche Einträge denn nun gelöscht werden sollen.Wenn die Maximale Anzahl begrenzt ist (und selbst wenn es ein paar hundert Datenpunkte wären) sollte sich das aber in jedem Fall über ein solches Skript mit Schleifenfunktion umsetzen lassen.
PS: wenn sehr viele Datenpunkte angelegt werden müssen, die immer nach dem gleichen Schema benannt sind, ist auch hier ein Java-Skript mit z.B. einer while-Schleife und der Funktion zum anlegen von Datenpunkten sehr zu empfehlen um sich viel Arbeit zu ersparen (bei Bedarf kann ich das auch gern teilen).
Ich hoffe ich habe ungefähr das getroffen was du gern umsetzen möchtest und der Lösungsansatz hilft dir ein wenig weiter
Viele Grüße
René -
@mottimuc sagte: Wenn nun der Umfang der Liste sich ändert (es kommt eine neue Aufgabe hinzu), muss sich auch der Inhalt der Variable des Triggers verändern.
Verstehe ich es richtig, dass sich die Anzahl der IDs zum Triggern dynamisch ändert? Dann muss man RegExp zum Triggern verwenden.
-
@paul53 sagte in dynamischer Inhalt für Trigger:
Verstehe ich es richtig, dass sich die Anzahl der IDs zum Triggern dynamisch ändert? Dann muss man RegExp zum Triggern verwenden.
ja, ich möchte den on Ausdruck, welcher heute auf eine Liste zeigt, die ich mit ID vom Selektor hergestellt habe dynamisieren. Diese Liste soll sich erweitern, wenn weitere Objekte dazukommen, oder wegfallen.
Bedeutet, dass ich an einer anderen Stelle per Selektor den Array berechne möchte und dann aber in dem ON-Script verwenden möchte. Die Übergabe dieses Elementes bekomme ich irgendwie nicht gelöst.
Ich arbeite mich so langsam in die JS Programmierung ein, allg. sind meine Programmierkenntnisse etwas "eingerostet".
Was meinst Du damit, dass man ein RegExp zum Triggern nehmen müsste? Ich lese mich da mal morgen ein:[https://www.smarthome-tricks.de/software-iobroker/iobroker-trigger-auf-einen-ordner-erstellen/](Link Adresse)
https://forum.iobroker.net/topic/954/frage-regexp-in-on[Link Text](Link Adresse)zudem schau ich mir nochmals den Prozess an. ggf finde ich andere TriggerPunkte, die es erlauben würden, hier eine andere Lösung einzusetzen.
Viele Grüße Michael
-
@paul53 sagte in dynamischer Inhalt für Trigger:
Dann muss man RegExp zum Triggern verwenden
Hallo Paul,
danke für den Hinweis, bzw Fingerzeit. Ich hab mit den Reg Exp. nun am Sonntag mal rumgespielt und verschiedene Trigger erfolgreich ausprobiert.
Was ich noch nicht (zeitlich) geschafft habe, ist diese in den Workflow sauber einzubetten. Kommt wahrscheinlich noch.
Dann dokumentiere ich den Part und setze die Anfrage aus erledigt.Merci!
VG Michael