NEWS
Variablen dynamisch erzeugen
-
Hallo zusammen,
ich würde gerne per globalen Script alle Variablen/States ermitteln welche per Funktion enum.functions.$sys_var definiert sind und diese als einzelne Variablen in allen Scripts zu Verfügung stellen. In meinem alten System (IP-Symcon) hatte ich dies per PHP Script als global include laufen und nach der foreach Schleife einen extract(sys_var). Leider bin Ich in Javascript noch nicht fit genug.
Beispiel:
Das script läuft durch und würde nun die Alexa Lautstärke als Variable zurück spielen. Genre kann der Name oder Ident entsprechend angepasst werden z.b. lautstaerke_alexa wenn es das einfacher macht. Könnte da jemand bitte helfen? -
@freakyfreaky sagte: Funktion enum.functions.$sys_var
Das $-Zeichen in der ID ist kontraproduktiv, da es bei RegExp das Ende bildet. Alle Datenpunkte mit der Funktion enum.functions.sys_var können per Selektor ermittelt werden:
const sys_vars = $('*(functions=sys_var)');
-
Hi Paul,
vielen Dank für die fixe Hilfe. Das $-Zeichen muss nicht sein und habe Ich ersetzt.
Als Ergebnis erhalte Ich nun:{'0':'0_userdata.0.Systemvariablen.Alexa.Lautstärke','length':1}
Wie kann ich damit weiter arbeiten, wie z.b: setState / getState
Grüße Andy
-
@freakyfreaky sagte: Wie kann ich damit weiter arbeiten
Mittels Schleife
sys_vars.each(function(id, i) { // setState(id, wert); });
oder als Trigger
sys_vars.on(function(dp) { let wert = dp.state.val; });
-
Hi Paul,
das Problem ist, dass Ich damit keine eindeutige Zuordnung hinbekomme. Sobald ich eine neue Systemvariable im Baum hinzufüge, kann sich die ID in der Auflistung ändern. Daher war der ursprüngliche Denkansatz, dass das globale Script die Variablen per Funktionsbezeichnung wie von dir beschrieben durchgeht und dann fixe Variablen übergibt. Somit könnte ich in einem anderen Script dann einfach beispielweise per setState dieses setzen, ohne jedesmal alle Variablen zu ermitteln
So sieht mein heutiges Array als Output aus dem PHP Syript aus.
//Array Overview Array ( [sys_anwesenheit] => 24989 /*[Systemvariablen\Anwesenheit]*/ [sys_last_change_anwesenheit] => 51767 /*[Systemvariablen\Anwesenheit\Last Change Anwesenheit]*/ [sys_last_notify_anwesenheit] => 53775 /*[Systemvariablen\Anwesenheit\Last Notify Anwesenheit]*/ [sys_hauszustand] => 36501 /*[Systemvariablen\Hauszustand]*/ [sys_besuchsdauer] => 24899 /*[Systemvariablen\Hauszustand\Besuchsmodus\Besuchsdauer]*/ [sys_nachtmodus] => 55178 /*[Systemvariablen\Nachtmodus]*/ )
Nutzung in anderen Scripts:
// Nachtmodus an kein script start if (GetValue($sys_nachtmodus) == false){ }
Da er die Objekt ID kennt, kann es entsprechend den Wert auslesen und vergleichen.
-
@freakyfreaky sagte: Array als Output aus dem PHP Syript aus.
Was sind das für Zahlenwerte (z.B. 24989)?
-
Sorry für die fehlenden Infos. Ist schon spät.
Das sind die Objekt ID´s welche IP Symcon nutzt. Ist vergleichbar mit der ID in ioBroker. Wie gesagt Ich versuche nur die Funktionalität irgendwie nachzustellen. Eventuell geht es auch gar nicht, oder Ich denk zu kompliziert. -
@freakyfreaky sagte: Das sind die Objekt ID´s welche IP Symcon nutzt.
Die IDs in ioBroker sind nicht so abstrakt, sondern haben eine Struktur, die allerdings nicht einheitlich ist, sondern Adapter spezifisch. Außerdem gibt es noch die Funktion getIdByName(name), falls die Namen eindeutig sind.
-
@freakyfreaky
Anmerkung: Unter "0_userdata.0" und unter "alias.0" bestimmt man selbst die ID-Struktur. Eine Übersetzung in einen "sprechenden" Variablenbezeichner ist also nicht nötig und die automatische Erzeugung in Javascript auch nicht möglich (höchstens als Objekt). -
Hi Paul,
vielen Dank für den Austausch. Der Ansatz mit getIdByName hilft mir weiter.
Gibt es auch ein getIdById?Dann könnte ich die ID eineindeutig machen und den Text trotzdem lesbar. Ansonsten verbiege Ich mir den Alias. Das geht auch
-
@freakyfreaky sagte: Gibt es auch ein getIdById?
?? Der Name soll ermittelt werden?
let Name = getObject(id).common.name;
@freakyfreaky sagte in Variablen dynamisch erzeugen:
die ID eineindeutig machen und den Text trotzdem lesbar.
Die ID in ioBroker ist eindeutig.
-
Vielen Dank