NEWS
Skript aufteilen möglich?
-
@Homoran sagte in Skript aufteilen möglich?:
was genau meinst du damit?
Langes Javaskript in zwei kleinere Skripte aufteilen. Soll trotzdem noch weiter funktionieren. zB Hauptfunktionen in A, Nebenfunktionen in B oder was auch immer als Splitkriterium.
@BertDerKleine sagte in Skript aufteilen möglich?:
@Homoran sagte in Skript aufteilen möglich?:
was genau meinst du damit?
Langes Javaskript in zwei kleinere Skripte aufteilen. Soll trotzdem noch weiter funktionieren. zB Hauptfunktionen in A, Nebenfunktionen in B oder was auch immer als Splitkriterium.
Was willst du damit bewirken?
Was macht das "lange" Skript?
Hat es nur "zu viele" Zeilen?
kann man das dann ggf. über den Aufruf von immer gleichen Funktionen kürzen? -
Hallo,
gibt es heute in 2026 eine Möglichkeit, ein größeres Skript in mehrere Module aufzuteilen?Ich habe nur einen 8 Jahre alten Thread gefunden dazu, damals ging es noch nicht.
Am besten zeigst du mal dein Script, dann kann man bessere Empfehlungen abgeben.
Bitte auch mal schreiben warum du aufteilen möchtest obwohl es so funktioniert. -
Es gibt im Forum mehrere Topics die sich damit befassen und es gelöst haben. Ich weiß aber nicht mehr wie und ich finde sie auch nicht mit der suche.
-
@bertderkleine
Meinst du in der Richtung https://forum.iobroker.net/post/1316079 -
Hallo,
gibt es heute in 2026 eine Möglichkeit, ein größeres Skript in mehrere Module aufzuteilen?Ich habe nur einen 8 Jahre alten Thread gefunden dazu, damals ging es noch nicht.
@BertDerKleine sagte in Skript aufteilen möglich?:
gibt es heute in 2026 eine Möglichkeit, ein größeres Skript in mehrere Module aufzuteilen?
Ich habe nur einen 8 Jahre alten Thread gefunden dazu, damals ging es noch nicht.
was soll das heissen.. ein script kannst du immer aufteilen, warum auch nicht
muss man nur wissen nur wie
-
@BertDerKleine sagte in Skript aufteilen möglich?:
gibt es heute in 2026 eine Möglichkeit, ein größeres Skript in mehrere Module aufzuteilen?
Ich habe nur einen 8 Jahre alten Thread gefunden dazu, damals ging es noch nicht.
was soll das heissen.. ein script kannst du immer aufteilen, warum auch nicht
muss man nur wissen nur wie
@arteck sagte in Skript aufteilen möglich?:
was soll das heissen.. ein script kannst du immer aufteilen, warum auch nicht
muss man nur wissen nur wie
Genau dem "wie" hat er doch gefragt :-) Wenn du es weist ... nur zu
-
Ich mach das z.bsp. bei meinem Unifi-API Script, da schreibe ich mir Werte in verschiedene Index.json , die ich dann mit anderen scripts auswerte. So spare ich mir States und hab das etwas getrennt, was für die Selektivität besser ist.
Andererseits ist die Struktur und Kommentarfunktion im Script wichtig, damit man weiß, was man da verbrochen hat.. solange die Funktionen nicht selbsterklärend sind… -
Alle Möglichkeiten aufzuzählen macht das ganze imho nur unübersichtlich - der TE sollte sich dazu mal melden (der javascript-adapter hat auch ein messagesystem :) )
-
@arteck sagte in Skript aufteilen möglich?:
was soll das heissen.. ein script kannst du immer aufteilen, warum auch nicht
muss man nur wissen nur wie
Genau dem "wie" hat er doch gefragt :-) Wenn du es weist ... nur zu
@BananaJoe sagte in Skript aufteilen möglich?:
Genau dem "wie" hat er doch gefragt :-) Wenn du es weist ... nur zu
Richtig!
Ich wiederhole nochmal was die Intention ist:
Langes Javaskript in zwei kleinere Skripte aufteilen. Soll trotzdem noch weiter funktionieren. zB Hauptfunktionen in A, Nebenfunktionen in B oder was auch immer als Splitkriterium.Soweit ich das in dem Uraltthread gelesen habe, werden alle globalen Skripte immer überall mitgeladen. Das gefällt mir nicht, daher sind simple globale Skripte keine Antwort auf meine Frage.
Nachdem hier bisher keine besonders hilfreichen Tips kamen, habe ich die Maschinen gefragt und die sind der Meinung, man könnte das mit "onMessage / messageToAsync." lösen.
Beispiel wäre so ein Szenario, wo ich eine Hilfsfunktion eben in ein zweites lokales Skript auslagere:
// === Skript A: History Helper === // Liefert Durchschnitt + Median eines Datenpunkts für ein Zeitfenster onMessage('getHistoryStats', async (data, callback) => { const { stateId, hours } = data; // z.B. { stateId: '0_userdata.0.temperatur', hours: 24 } if (!stateId || !hours) { return callback({ error: 'stateId und hours fehlen' }); } const end = Date.now(); const start = end - hours * 60 * 60 * 1000; getHistory(stateId, { start: start, end: end, aggregate: 'none', // alle Rohwerte holen (für Median nötig) count: 0 // kein Limit }, (err, result) => { if (err) { log(`[HistoryHelper] Fehler bei ${stateId}: ${err}`, 'error'); return callback({ error: err.toString() }); } // Nur gültige Werte const values = result .map(r => r.val) .filter(v => v !== null && v !== undefined && !isNaN(v)); if (values.length === 0) { return callback({ average: null, median: null, count: 0 }); } // Durchschnitt const average = values.reduce((a, b) => a + b, 0) / values.length; // Median const sorted = [...values].sort((a, b) => a - b); const mid = Math.floor(sorted.length / 2); const median = sorted.length % 2 === 0 ? (sorted[mid - 1] + sorted[mid]) / 2 : sorted[mid]; log(`[HistoryHelper] ${stateId} | ${values.length} Werte | Ø ${average.toFixed(2)} | Median ${median.toFixed(2)}`); callback({ average: Number(average.toFixed(2)), median: Number(median.toFixed(2)), count: values.length }); }); }); log('✅ History-Helper gestartet – wartet auf "getHistoryStats" Nachrichten');und das Hauptskript:
// === Skript B: Daily Report === // Wird jeden Tag um 23:59 ausgelöst, holt für zwei Datenpunkte die Stats // und verschickt eine E-Mail const dp1 = '0_userdata.0.temperatur_wohnzimmer'; // ← hier deine ersten DP-ID const dp2 = '0_userdata.0.feuchtigkeit_bad'; // ← hier deine zweite DP-ID // Trigger: jeden Tag um 23:59 (Tagesende) schedule('59 23 * * *', async () => { log('🕙 Tagesende – starte History-Statistik...'); const hours = 24; // letze 24 Stunden try { // Parallele Abfragen (schnell) const [res1, res2] = await Promise.all([ messageToAsync( { instance: 0, script: 'script.js.history_helper', message: 'getHistoryStats' }, { stateId: dp1, hours: hours } ), messageToAsync( { instance: 0, script: 'script.js.history_helper', message: 'getHistoryStats' }, { stateId: dp2, hours: hours } ) ]); // E-Mail zusammenbauen const text = ` Tagesbericht – letzte 24 Stunden (${new Date().toLocaleDateString('de-DE')}) ${dp1}: • Durchschnitt: ${res1.average ?? '—'} • Median: ${res1.median ?? '—'} • Werte: ${res1.count} ${dp2}: • Durchschnitt: ${res2.average ?? '—'} • Median: ${res2.median ?? '—'} • Werte: ${res2.count} `.trim(); // E-Mail versenden (E-Mail-Adapter muss konfiguriert sein!) sendTo('email.0', 'send', { to: 'deine@email.de', // ← deine Empfängeradresse subject: 'ioBroker Tagesbericht ' + new Date().toLocaleDateString('de-DE'), text: text }); log('✅ E-Mail mit History-Statistik versendet'); } catch (e) { log(`❌ Fehler im Daily-Report: ${e}`, 'error'); } }); log('✅ Daily-Report-Skript geladen – Cron-Job um 23:59 aktiv');Ist das also der beste Weg, um die Aufgabe aus Post #3 und in diesem Beispiel zu lösen, wenn ich ein Skript aufteilen will und die Funktionen ohne "globale Skripte" anderswo wiederverwenden will?
So könnte ich den Durchschnittsberechner auslagern.
-
Am besten zeigst du mal dein Script, dann kann man bessere Empfehlungen abgeben.
Bitte auch mal schreiben warum du aufteilen möchtest obwohl es so funktioniert.@BertDerKleine sagte in Skript aufteilen möglich?:
Nachdem hier bisher keine besonders hilfreichen Tips kamen
viel mitwirkung war von deiner seite allerdings auch nicht da
@oliverio sagte in Skript aufteilen möglich?:
Am besten zeigst du mal dein Script, dann kann man bessere Empfehlungen abgeben.
Bitte auch mal schreiben warum du aufteilen möchtest obwohl es so funktioniert. -
Nächstes Mal beschreibe etwas mehr was du vorhast - das Messagesystem hab ich in meinem letzten Beitrag erwähnt. Wieso soll ich aber da viel Text zu schreiben wenn ich nicht weiß ob es passen könnte.
Wäre mir aber zu komplex - würde es wie ilovegym mit states und json machen. (vielleicht macht er es auch mit fs - das wäre mir dann zu umständlich)
-
@BananaJoe sagte in Skript aufteilen möglich?:
Genau dem "wie" hat er doch gefragt :-) Wenn du es weist ... nur zu
Richtig!
Ich wiederhole nochmal was die Intention ist:
Langes Javaskript in zwei kleinere Skripte aufteilen. Soll trotzdem noch weiter funktionieren. zB Hauptfunktionen in A, Nebenfunktionen in B oder was auch immer als Splitkriterium.Soweit ich das in dem Uraltthread gelesen habe, werden alle globalen Skripte immer überall mitgeladen. Das gefällt mir nicht, daher sind simple globale Skripte keine Antwort auf meine Frage.
Nachdem hier bisher keine besonders hilfreichen Tips kamen, habe ich die Maschinen gefragt und die sind der Meinung, man könnte das mit "onMessage / messageToAsync." lösen.
Beispiel wäre so ein Szenario, wo ich eine Hilfsfunktion eben in ein zweites lokales Skript auslagere:
// === Skript A: History Helper === // Liefert Durchschnitt + Median eines Datenpunkts für ein Zeitfenster onMessage('getHistoryStats', async (data, callback) => { const { stateId, hours } = data; // z.B. { stateId: '0_userdata.0.temperatur', hours: 24 } if (!stateId || !hours) { return callback({ error: 'stateId und hours fehlen' }); } const end = Date.now(); const start = end - hours * 60 * 60 * 1000; getHistory(stateId, { start: start, end: end, aggregate: 'none', // alle Rohwerte holen (für Median nötig) count: 0 // kein Limit }, (err, result) => { if (err) { log(`[HistoryHelper] Fehler bei ${stateId}: ${err}`, 'error'); return callback({ error: err.toString() }); } // Nur gültige Werte const values = result .map(r => r.val) .filter(v => v !== null && v !== undefined && !isNaN(v)); if (values.length === 0) { return callback({ average: null, median: null, count: 0 }); } // Durchschnitt const average = values.reduce((a, b) => a + b, 0) / values.length; // Median const sorted = [...values].sort((a, b) => a - b); const mid = Math.floor(sorted.length / 2); const median = sorted.length % 2 === 0 ? (sorted[mid - 1] + sorted[mid]) / 2 : sorted[mid]; log(`[HistoryHelper] ${stateId} | ${values.length} Werte | Ø ${average.toFixed(2)} | Median ${median.toFixed(2)}`); callback({ average: Number(average.toFixed(2)), median: Number(median.toFixed(2)), count: values.length }); }); }); log('✅ History-Helper gestartet – wartet auf "getHistoryStats" Nachrichten');und das Hauptskript:
// === Skript B: Daily Report === // Wird jeden Tag um 23:59 ausgelöst, holt für zwei Datenpunkte die Stats // und verschickt eine E-Mail const dp1 = '0_userdata.0.temperatur_wohnzimmer'; // ← hier deine ersten DP-ID const dp2 = '0_userdata.0.feuchtigkeit_bad'; // ← hier deine zweite DP-ID // Trigger: jeden Tag um 23:59 (Tagesende) schedule('59 23 * * *', async () => { log('🕙 Tagesende – starte History-Statistik...'); const hours = 24; // letze 24 Stunden try { // Parallele Abfragen (schnell) const [res1, res2] = await Promise.all([ messageToAsync( { instance: 0, script: 'script.js.history_helper', message: 'getHistoryStats' }, { stateId: dp1, hours: hours } ), messageToAsync( { instance: 0, script: 'script.js.history_helper', message: 'getHistoryStats' }, { stateId: dp2, hours: hours } ) ]); // E-Mail zusammenbauen const text = ` Tagesbericht – letzte 24 Stunden (${new Date().toLocaleDateString('de-DE')}) ${dp1}: • Durchschnitt: ${res1.average ?? '—'} • Median: ${res1.median ?? '—'} • Werte: ${res1.count} ${dp2}: • Durchschnitt: ${res2.average ?? '—'} • Median: ${res2.median ?? '—'} • Werte: ${res2.count} `.trim(); // E-Mail versenden (E-Mail-Adapter muss konfiguriert sein!) sendTo('email.0', 'send', { to: 'deine@email.de', // ← deine Empfängeradresse subject: 'ioBroker Tagesbericht ' + new Date().toLocaleDateString('de-DE'), text: text }); log('✅ E-Mail mit History-Statistik versendet'); } catch (e) { log(`❌ Fehler im Daily-Report: ${e}`, 'error'); } }); log('✅ Daily-Report-Skript geladen – Cron-Job um 23:59 aktiv');Ist das also der beste Weg, um die Aufgabe aus Post #3 und in diesem Beispiel zu lösen, wenn ich ein Skript aufteilen will und die Funktionen ohne "globale Skripte" anderswo wiederverwenden will?
So könnte ich den Durchschnittsberechner auslagern.
@BertDerKleine sagte in Skript aufteilen möglich?:
Ich wiederhole nochmal was die Intention ist:
Langes Javaskript in zwei kleinere Skripte aufteilen. Soll trotzdem noch weiter funktionieren. zB Hauptfunktionen in A, Nebenfunktionen in B oder was auch immer als Splitkriterium.
Leider hat diese "Beschreibung" keinerlei Aussagekraft, was du mit "lang" und "weiter funktionieren" meinen könntest.