NEWS
( gelöst ) Ordnernamen auslesen und in Datenpunkt schreiben
-
Ich möchte gerne meine Ordnerstruktur auslesen
0_userdata.0.Gasanbieter
dort befinden sich mehrere Ordner von Gasanbietern
Diese Ordnernamen möchte ich gerne in den Datenpunkt
0_userdata.0.Gasanbieter.Gasanbieter_Liste
schreibenich habe folgendes Skript soweit zusammen gebastelt. Leider bleibt der Datenpunkt leer und das Skript schreibt folgenden Fehler
javascript.0 01:49:14.704 info
Stopping script
javascript.0 01:49:14.920 info
start JavaScript (Javascript/js)
javascript.0 01:49:14.948 info
--- START ABGLEICH: WERTE AUS DATENPUNKTEN LESEN ---
javascript.0 01:49:14.954 info
registered 0 subscriptions, 1 schedule, 0 messages, 0 logs and 0 file subscriptions
javascript.0 01:49:34.949 error
SCHWERER FEHLER: Das getObjects-Result ist leer oder fehlerhaft (Timeout?). Bitte JS-Adapter neustarten.
javascript.0 01:49:34.950 info
--- ENDE ABGLEICH: WERTE AUS DATENPUNKTEN LESEN ---Das Skript sieht so aus
/** * FINALE VERSION: Sucht Ordner, liest den Wert des Datenpunkts ORDNERNAME.ORDNERNAME aus * und schreibt diesen Wert in die Zielliste. */ const parentId = '0_userdata.0.Gasanbieter.'; const targetId = '0_userdata.0.Gasanbieter'; const excludePrefix = 'gasanbieter_'; // Führt die Liste einmalig beim Skriptstart aus updateGasanbieterList(); // Führt die Liste jeden Tag um Mitternacht aus (Cron-Job) schedule('0 0 * * *', updateGasanbieterList); async function updateGasanbieterList() { log('--- START ABGLEICH: WERTE AUS DATENPUNKTEN LESEN ---', 'info'); // 1. ASYNCHRONE FUNKTION ZUM ABFRUFEN DER OBJEKTE sendTo('javascript.0', 'getObjects', { id: parentId + '*', limit: 1000 }, async (result) => { // Beachten Sie das 'async' hier, um await nutzen zu können if (result && result.result) { const objectIds = Object.keys(result.result); log(`Gefundene Objekte insgesamt: ${objectIds.length}`, 'info'); const folderNamesToRead = new Set(); // Zuerst alle relevanten Ordnernamen sammeln objectIds.forEach(id => { const obj = result.result[id]; // Nur Objekte vom Typ 'channel' oder 'device' (Ordner) berücksichtigen. if (obj && (obj.type === 'channel' || obj.type === 'device')) { if (id.startsWith(parentId) && id !== parentId) { const relativeId = id.substring(parentId.length); const folderName = relativeId.split('.')[0]; if (folderName && folderName.length > 0) { if (!folderName.startsWith(excludePrefix)) { folderNamesToRead.add(folderName); } } } } }); const uniqueValues = []; const folderNamesArray = Array.from(folderNamesToRead); log(`Gefundene relevante Ordnernamen: ${JSON.stringify(folderNamesArray)}`, 'info'); // 2. ALLE WERTE ASYNCHRON AUSLESEN for (const name of folderNamesArray) { // Die ID des Zieldatenpunktes zusammensetzen: 0_userdata.0.Gasanbieter.ORDNERNAME.ORDNERNAME const stateIdToRead = parentId + name + '.' + name; try { // getForeignStateAsync muss im Skript aktiviert sein (Standard) const state = await getForeignStateAsync(stateIdToRead); if (state && state.val !== null && state.val !== undefined) { // Den Wert (val) zur finalen Liste hinzufügen uniqueValues.push(String(state.val)); log(`Wert von ${stateIdToRead} erfolgreich gelesen: ${state.val}`, 'debug'); } else { log(`WARNUNG: Datenpunkt ${stateIdToRead} existiert nicht oder hat keinen Wert.`, 'warn'); } } catch (e) { log(`FEHLER beim Lesen von ${stateIdToRead}: ${e.message}`, 'error'); } } // 3. ERGEBNIS SPEICHERN const resultString = JSON.stringify(uniqueValues); log(`Final gefilterte Liste der Werte: ${resultString}`, 'info'); setForeignState(targetId, resultString, true); log(`Liste in ${targetId} gespeichert.`, 'info'); } else { log('SCHWERER FEHLER: Das getObjects-Result ist leer oder fehlerhaft (Timeout?). Bitte JS-Adapter neustarten.', 'error'); } log('--- ENDE ABGLEICH: WERTE AUS DATENPUNKTEN LESEN ---', 'info'); }); }Hat das schonmal jemand hinbekommen?
VG
Thomas -
du kannst mal das probieren. den rest müsstest du selbst hinbekommen
let prefix = '0_userdata.0.Gasanbieter.'; let dp=$(prefix+"*"); console.log(dp);https://github.com/ioBroker/ioBroker.javascript/blob/master/docs/en/javascript.md#---selector
-
@oliverio sagte in Ordnernamen auslesen und in Datenpunkt schreiben:
let prefix = '0_userdata.0.Gasanbieter.'; let dp=$(prefix+"*"); console.log(dp);
Hallo
so der Hinweis hat mich zumindest auf einige Fehler noch in meinen Datenpunktnamen gebracht. Damit konnte ich dann den Fehler immer weiter eingrenzen, so das es jetzt klappt
Danke