Hi Leute, dies ist mein erster Post, wenn also was nicht ganz konform ist pls have mercy ![:stuck_out_tongue_winking_eye: 😜](https://forum.iobroker.net/plugins/nodebb-plugin-emoji/emoji/android/1f61c.png?v=23itn9135ab)
Zu aller erst einmal mein usecase:
Ich möchte ein Skript schreiben, dass auf einen Channel schaut und darauf reagiert, wenn neue Objekte angelegt werden. In dem Fall ein Alexa Device, welches im Channel Alarms die Alarme drin hat. Wenn ich das Skript starte, soll es also alle Datenpunkte im Alarm Channel durchsehen, ob es einen aktiven Alarm gibt. Wenn ja soll ein schedule erstellt werden, der mir das Licht schon 30 Min vor dem Wecker an macht.
Das Problem
Jetzt ist mit beim Verwenden des $ selektors aber aufgefallen, dass dieser einmal beim JS-Adapter restart alle Objekte zu merken scheint und sich danach nicht mehr updated. Wenn ich also einen Alarm lösche oder einen neuen hinzufüge, merkt dies der $ Selektor nicht. Sogar wenn ich das Skript neu starte, erkennt der Selektor die neuen Werte nicht. Erst bei einem kompletten Adapter restart werden die neuen Werte erkannt.
Ist das per design so? Gibts da einen Workaround?
Trying to fix it
Wenn ich nun die on()
subscribe Funktion mit einer Regex verwende, geht dies einwandfrei neue noch nicht existierende Objekte zu erkennen. Jedoch kann die on
methode ja nicht bei script start schon alle Alarme des devices durchsehen, sondern nur auf changes reagieren ![:thinking_face: 🤔](https://forum.iobroker.net/plugins/nodebb-plugin-emoji/emoji/android/1f914.png?v=23itn9135ab)
Let's see the code
Ich denke ein paar Zeilen code sagen mehr als 1000 worte, deswegen hier mein Skript code:
const timeSelector = $(`channel[state.id=${ECHO_ALARM_PFAD}.*.time]`);
// gibt mir nur die alarme aus, die zum JS-Adapter restart verfügbar waren
timeSelector.each(async (val) => {
const enabledId = val.replace('time', 'enabled');
const devicePath = val.replace('.time', '');
const enabled = (await getStateAsync(enabledId)).val;
const time = (await getStateAsync(val)).val.split(':');
removeOrRefreshSchedule(devicePath, time, enabled);
});
Was allerdings schon funzt ist, wenn das script mal läuft, dann kann ich mit der on
Funktion auf neu hinzugefügte Alarme sehr wohl reagieren, doch das problem ist, sobald man das Script restarted, werden die neuen Alarme wieder gelöscht, weil die Datenpunkte ja erst im nachhinein hinzugefügt wurden ![:thinking_face: 🤔](https://forum.iobroker.net/plugins/nodebb-plugin-emoji/emoji/android/1f914.png?v=23itn9135ab)
// das hier funzt einwandfrei wenn man neue datenpunkte added/removed
on({ id: enabledRegex, change: 'ne' }, async ({ id, state: { val } }) => {
const timeId = id.replace('enabled', 'time');
const devicePath = id.replace('.enabled', '');
const time = (await getStateAsync(timeId)).val.split(':');
removeOrRefreshSchedule(devicePath, time, val);
});
Vielen Dank im Voraus schon mal für eure Antworten ![:raised_hands: 🙌](https://forum.iobroker.net/plugins/nodebb-plugin-emoji/emoji/android/1f64c.png?v=23itn9135ab)