Skip to content
  • Home
  • Aktuell
  • Tags
  • 0 Ungelesen 0
  • Kategorien
  • Unreplied
  • Beliebt
  • GitHub
  • Docu
  • Hilfe
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Standard: (Kein Skin)
  • Kein Skin
Einklappen
ioBroker Logo

Community Forum

donate donate
  1. ioBroker Community Home
  2. Deutsch
  3. Skripten / Logik
  4. JavaScript
  5. Skript aufteilen möglich?

NEWS

  • Monatsrückblick Januar/Februar 2026 ist online!
    BluefoxB
    Bluefox
    17
    1
    538

  • Jahresrückblick 2025 – unser neuer Blogbeitrag ist online! ✨
    BluefoxB
    Bluefox
    17
    1
    5.4k

  • Neuer Blogbeitrag: Monatsrückblick - Dezember 2025 🎄
    BluefoxB
    Bluefox
    13
    1
    1.4k

Skript aufteilen möglich?

Geplant Angeheftet Gesperrt Verschoben JavaScript
16 Beiträge 9 Kommentatoren 306 Aufrufe 9 Watching
  • Älteste zuerst
  • Neuste zuerst
  • Meiste Stimmen
Antworten
  • In einem neuen Thema antworten
Anmelden zum Antworten
Dieses Thema wurde gelöscht. Nur Nutzer mit entsprechenden Rechten können es sehen.
  • BertDerKleineB BertDerKleine

    @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.

    HomoranH Nicht stören
    HomoranH Nicht stören
    Homoran
    Global Moderator Administrators
    schrieb am zuletzt editiert von
    #5

    @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?

    kein Support per PN! - Fragen im Forum stellen -
    Benutzt das Voting rechts unten im Beitrag wenn er euch geholfen hat.
    Das Forum freut sich über eine Spende. Benutzt dazu den Spendenbutton im Header. Danke!
    der Installationsfixer: curl -fsL https://iobroker.net/fix.sh | bash -

    1 Antwort Letzte Antwort
    1
    • BertDerKleineB BertDerKleine

      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.

      OliverIOO Offline
      OliverIOO Offline
      OliverIO
      schrieb am zuletzt editiert von
      #6

      @BertDerKleine

      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.

      Meine Adapter und Widgets
      TVProgram, SqueezeboxRPC, OpenLiga, RSSFeed, MyTime,, pi-hole2, vis-json-template, skiinfo, vis-mapwidgets, vis-2-widgets-rssfeed
      Links im Profil

      OliverIOO 1 Antwort Letzte Antwort
      3
      • T Nicht stören
        T Nicht stören
        ticaki
        schrieb am zuletzt editiert von
        #7

        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.

        Weather-Warnings Espresense NSPanel-Lovelace-ui Tagesschau

        Spenden

        1 Antwort Letzte Antwort
        0
        • ofri2607O Online
          ofri2607O Online
          ofri2607
          schrieb am zuletzt editiert von
          #8

          @bertderkleine
          Meinst du in der Richtung https://forum.iobroker.net/post/1316079

          1 Antwort Letzte Antwort
          0
          • BertDerKleineB BertDerKleine

            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.

            arteckA Offline
            arteckA Offline
            arteck
            Developer Most Active
            schrieb am zuletzt editiert von
            #9

            @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

            zigbee hab ich, zwave auch, nuc's genauso und HA auch

            BananaJoeB 1 Antwort Letzte Antwort
            0
            • arteckA arteck

              @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

              BananaJoeB Online
              BananaJoeB Online
              BananaJoe
              Most Active
              schrieb zuletzt editiert von
              #10

              @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

              ioBroker@Ubuntu 24.04 LTS (VMware) für: >260 Geräte, 5 Switche, 7 AP, 10 IP-Cam, 1 NAS 42TB, 1 ESXi 15TB, 4 Proxmox 1TB, 1 Hyper-V 48TB, 14 x Echo, 5x FireTV, 5 x Tablett/Handy VIS || >=160 Tasmota/Shelly || >=95 ZigBee || PV 8.1kW / Akku 14kWh || 2x USV APC 750W kaskadiert || Creality CR-10 SE 3D-Drucker

              BertDerKleineB 1 Antwort Letzte Antwort
              1
              • ilovegymI Offline
                ilovegymI Offline
                ilovegym
                schrieb zuletzt editiert von
                #11

                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…

                ilovegym66 – ioBroker Projekte & Automationen
                GitHub: https://github.com/Ilovegym66 | Austausch im Discord: https://discord.gg/yC65zjr5uq

                1 Antwort Letzte Antwort
                0
                • T Nicht stören
                  T Nicht stören
                  ticaki
                  schrieb zuletzt editiert von
                  #12

                  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 :) )

                  Weather-Warnings Espresense NSPanel-Lovelace-ui Tagesschau

                  Spenden

                  1 Antwort Letzte Antwort
                  0
                  • BananaJoeB BananaJoe

                    @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

                    BertDerKleineB Online
                    BertDerKleineB Online
                    BertDerKleine
                    schrieb zuletzt editiert von BertDerKleine
                    #13

                    @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.

                    HomoranH 1 Antwort Letzte Antwort
                    0
                    • OliverIOO OliverIO

                      @BertDerKleine

                      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.

                      OliverIOO Offline
                      OliverIOO Offline
                      OliverIO
                      schrieb zuletzt editiert von
                      #14

                      @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.

                      Meine Adapter und Widgets
                      TVProgram, SqueezeboxRPC, OpenLiga, RSSFeed, MyTime,, pi-hole2, vis-json-template, skiinfo, vis-mapwidgets, vis-2-widgets-rssfeed
                      Links im Profil

                      1 Antwort Letzte Antwort
                      1
                      • T Nicht stören
                        T Nicht stören
                        ticaki
                        schrieb zuletzt editiert von ticaki
                        #15

                        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)

                        Weather-Warnings Espresense NSPanel-Lovelace-ui Tagesschau

                        Spenden

                        1 Antwort Letzte Antwort
                        0
                        • BertDerKleineB BertDerKleine

                          @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.

                          HomoranH Nicht stören
                          HomoranH Nicht stören
                          Homoran
                          Global Moderator Administrators
                          schrieb zuletzt editiert von
                          #16

                          @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.

                          kein Support per PN! - Fragen im Forum stellen -
                          Benutzt das Voting rechts unten im Beitrag wenn er euch geholfen hat.
                          Das Forum freut sich über eine Spende. Benutzt dazu den Spendenbutton im Header. Danke!
                          der Installationsfixer: curl -fsL https://iobroker.net/fix.sh | bash -

                          1 Antwort Letzte Antwort
                          0
                          Antworten
                          • In einem neuen Thema antworten
                          Anmelden zum Antworten
                          • Älteste zuerst
                          • Neuste zuerst
                          • Meiste Stimmen


                          Support us

                          ioBroker
                          Community Adapters
                          Donate

                          568

                          Online

                          32.7k

                          Benutzer

                          82.5k

                          Themen

                          1.3m

                          Beiträge
                          Community
                          Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen | Einwilligungseinstellungen
                          ioBroker Community 2014-2025
                          logo
                          • Anmelden

                          • Du hast noch kein Konto? Registrieren

                          • Anmelden oder registrieren, um zu suchen
                          • Erster Beitrag
                            Letzter Beitrag
                          0
                          • Home
                          • Aktuell
                          • Tags
                          • Ungelesen 0
                          • Kategorien
                          • Unreplied
                          • Beliebt
                          • GitHub
                          • Docu
                          • Hilfe