Antworten
Apr 08, 2021 - 19:16
Apr 08, 2021 - 19:57
hatte eine ähnliche Problematik bei meinen scripten zur Alarmanlage. Bin mit den Promis und Promise.all Funktionen eigentlich ganz gut zurecht gekommen.
Von auf 08.04.2021 20:33:20 | Gefällt mir (0) | Melden
Das hatte ich mal vor zwei Jahren probiert, da gingen diese Funktionen noch nicht im Automation Manager. Ich stehe mit den Dingern auch auf Kriegsfuss :-(
Bin halt eher ein C++ Mensch. Hättest Du ein Beispiel? Das wär Klasse
Gruss
Peter
Von auf 08.04.2021 20:41:35 | Gefällt mir (0) | Melden
ja ich schau mal nach, wird aber diese Woche bei mir nicht mehr klappen. Ich melde mich...
Was zuletzt nicht funktionierte waren die asynch-Funktionen, welche das handling noch einfacher machen würden. Vielleicht sind die ja inzwischen implementiert.
Von auf 08.04.2021 20:58:40 | Gefällt mir (0) | Melden
Super, danke
Von auf 10.04.2021 13:19:35 | Gefällt mir (0) | Melden
Hallo,
hab mal wahllos ein Stück Programmcode aus einem script herauskopiert in welchem ich auf callbacks warte, bevor weiterverfahren wird. In den promise.all Abschnitten könntest Du nun die Reaktion auf bestimmte Rückmeldungen oder Rückmeldegruppen programmieren. Der Programmcode ist nicht relevant, wollte nur die Auswertung der Promise() zeigen.
Vielleicht hilft das ja weiter. Ob das alles so 100% richtig ist weiß ich leider auch nicht, aber es läuft seit langer Zeit einwandfrei.
Das funktioniert übrigends auch in For..Next Schleifen.
function transfer(mText,tuerStatus_PH,fensterStatus_PH,alarmAnlageStatus,alarmOrder,alarmObjText) { //neue Ergebnisse an Systemvariablen übergeben
console.log('Transfer start');
PT001 = new Promise((resolve, reject) => {
var AAscharf = '42@off';
if((alarmAnlageStatus & 0X0001)>0) {
AAscharf = '42@on';
}
else{
executeDeviceCommand(//Alarmanlage Unscharf als Bit melden
"Alarmanlage",
"AAScharf",
{"value":"off"},
function(err) {
err && console.error(err.message);
}
);
}
executeDeviceCommand(
"Alarmanlage",
"AAnlageSchnittstelle[1.1.24]",
{"value":AAscharf},
function(err, status) {
if (err) {
reject(err);
return;
}
resolve(status);
}
);
});
PT002= new Promise((resolve, reject) => {
var AKoffen = '43@off';
if((alarmAnlageStatus & 0X0010)>0) {
AKoffen = '43@on';
}
executeDeviceCommand(
"Alarmanlage",
"AAnlageSchnittstelle[1.1.24]",
{"value":AKoffen},
function(err, status) {
if (err) {
reject(err);
return;
}
resolve(status);
}
);
});
PT003= new Promise((resolve, reject) => {
.......irgendwelcher Programmcode......
resolve(status);
PT004= new Promise((resolve, reject) => {
.......irgendwelcher Programmcode......
resolve(status);
.........usw ... bis PT009
"hier geht es weiter wenn PT004 bis PT009 beendet......."
Promise.all([PT004,PT005,PT006,PT007,PT008,PT009]).then(() => {
executeMacro(
"System",
"Seite aktualisieren",
function(err) {
err && console.error(err.message);
}
);
});
"hier geht es schon weiter wenn PT003 beendet ist......."
Promise.all([PT003]).then(() => { //
console.log('Promise all Transfer 1 ');
executeMacro(
"System",
"Seite aktualisieren",
function(err) {
err && console.error(err.message);
}
);
});
}//function transfer
über den Promise.all([....]) hast Du eigentlich Deine Rückmeldungen der Callbacks
Von auf 11.04.2021 20:39:30 | Gefällt mir (0) | Melden
Hallo hw-020
geht auch bei mir im Prinzip. Mein Problem bleibt aber: wenn ich GetDeviceStatus in einer Schleife aufrufe, habe ich ja nur eine Funktion auf die ich ein PROMISE anwenden kann. Das ganze läuft sauber durch und ich bekomme bei - sagen wir - 30 Aufrufen auch 30 Ergebnisse und kann diese am Ende auch verarbeiten, aber ich kenne die Reihenfolge nicht. Das erste Ergebnis in der Liste muss nicht das des ersten Aufrufes sein.
Ich habe mich mal an den Support gewandt. Am einfachsten wäre es wohl eine ID beim Callback mitzugeben, die man später wieder zurückbekommt. Dann wäre die Zurodnung kein Problem
Danke für Dein Hilfe
LoeffleP
Von auf 11.04.2021 20:54:09 | Gefällt mir (0) | Melden
Nur so, ohne es zu probiert zu haben oder länger darüber nachgedacht zu haben. Kannst Du die Abfragen nicht in eine Funktion packen. Diese in einer Schleife aufrufen und jedem Aufruf einen eigenen Promise übergeben? Diese dann nach der Schleife über Promise.all oder gezielte Promise-Abfragen auswerten?
Von auf 11.04.2021 21:02:42 | Gefällt mir (0) | Melden
Das habe ich versucht...Werde nächste Woche meinen Neffen nerven. Meine Javascript Kenntnisse scheinen da nicht auszureichen. Werde wohlnauf meine alten Tage einen Kurs besuchen müssen 😀
Von auf 12.04.2021 10:04:05 | Gefällt mir (0) | Melden
Wär schön wenn Du die Antwort vom Support veröffentlichen könntest
Von auf 18.04.2021 20:07:02 | Gefällt mir (0) | Melden
Hallo zusammen
erstmal ein grosses Dankeschön an den Support. Bereits am Dienstag kam ein Lösungsvorschlag den ich umsetzen konnte, Eigentlich war es ganz einfach, aber wenn man es nicht weiss......
Die Lösung ist folgende:
Man muss die getDeviceStatus Funktion in eine andere Funktion einbauen (mit allem was davor und danach passieren soll. Dieser Funktion kann man nun Parameter mitgeben. Wenn wir mal von einer Schleife ausgehen, nennen wir die Funktion einfach next().
Ich habe nun eine globale Variable JSI.deviceList, in der alle Parameter die man zum Aufruf von getDeviceStatus braucht als Array drin sind. Ausserdem habe ich ein zweites Array statResults als globale Variable in der ich die Ergebnisse (state) speichern möchte.
sieht also nun so aus:
var next = function(i) {
if (i >= JSI.deviceList.length) {
// Done.
return;
}
var device = JSI.deviceList[i];
getDeviceStatus(
device.ROOM,
device.SENSOR,
{ value: device.STATE },
function(err, status) {
err && console.error(err.message);
console.log(i + ":" + status);
numDev -= 1;
statResults[i] = status;
next(i + 1);
}
);
};
// Begin.
next(0);
Jetzt kann man sich Fragen woher Javascript weiss, dass i bei einem bestimmten Callback einen bestimmten Wert hat. Aber da habe ich was gefunden, ich zitiere hier:
Da es in JavaScript Ereignisse gibt, deren Funktionalität auch wieder über Funktionsaufrufe definiert werden, können Situationen entstehen, in denen Werte verfügbar sein müssen, obwohl ihre "Herstellung" längst abgeschlossen ist und eigentlich die Variablen nicht mehr existieren dürften. Hier kommt nun das Kapseln von Werten in einer Funktion zum Einsatz, einer sogenannten Closure, also einer Funktion, innerhalb derer ein Wert in einer Variable noch bekannt ist, obwohl der übergeordnete Kontext längst abgearbeitet wurde.
Nochmals vielen Dank an alle
Beste Grüsse
Peter
Von auf 19.04.2021 16:12:55 | Gefällt mir (0) | Melden
Hallo Peter
Vielen Dank dass Du die Antwort veröffentlicht hast
Ich meine Du kommst trotzdem nicht ohne Promise aus, oder woher weißt Du wann alles erledigt und Du Dein resultarray auswerten kannst
Von auf 19.04.2021 22:09:02 | Gefällt mir (0) | Melden
Ah ja, das habe ich nicht beschrieben. Wie Du oben siehst gibt es noch eine Variable numDev , ebenfalls global definiert und die belege ich am Anfang mit der Anzahl der abzufragenden Devices, Im Callback wird, wie man oben sieht, eins abgezogen.
Noch immer in der Callback-Routine ist ein einfacher if (numDev === 0) { führe die ende Verarbeitung aus...}
Von auf 19.04.2021 22:14:00 | Gefällt mir (0) | Melden
ok, interessant, jetzt bin ich bei Dir. Muss ich unbedingt ausprobieren....
Neuen Kommentar hinzufügen
Apr 08, 2021 - 20:31
Also definitv nichts was man "per Hand" machen möchte. Wie gesagt, im Prinzip geht es ja, aber die Pflege ist aufwändig und jetzt möchte ich das ganze besser automatisieren
Von auf 08.04.2021 21:03:08 | Gefällt mir (0) | Melden
Also ich selber schiebe nur 10 Werte vom NEO Server per Skript zum archivieren an ein angebundenes System. Da das nur ein Skript ist das zyklisch ausgeführt wird, geht das noch von der Einrichtung und der Übersichtlichkeit. Die Daten werden bei mir in IP-Symcon automatisch archiviert, reaggregiert und dann wieder NEO als Graph zur Anzeige in einem Webseitenelement zur Verfügung gestellt. Andere Daten logge ich gleich direkt in IP-Symcon, das ist ein einzelner Mausklick und dann werden die Werte gespeichert und können dann in NEO als dynamische Graphen angezeigt werden. Die Intervalle und die Daten selber können dann zur Anzeige frei in NEO gewählt werden bzw. auch einzelne Datensätze dynamisch in NEO ein/ausgeblendet werden.
Neuen Kommentar hinzufügen
Neuen Kommentar hinzufügen