NEWS

[Experimentell] JS-Controller compact mode


  • Wir arbeiten gerade an neuem JS-Controller Mode - "Compact".

    In diesem Modus startet js-controller alle Adapter (die diesen Modus unterstützen) in dem selben Prozess wie js-controller.

    Dabei gewinnt man speicher, die für gemeinsame npm Module benutz wird, aber verliert an der Stabilität.

    Per Adapter spart man minimum 40MB RAM. Dieses Modus ist für die Systeme mit wenig Speicher gedacht. Z.b Raspi Zero mit 512 MB.

    Aktuell können und sollten nur die erfahrene Entwickler diesen Modus ausprobieren. Ich denke, ab März werden dann keine neue Adapter akzeptiert ohne Unterstützung für diesen Modus.

    Ich konnte ca. 8 Adapter in einer Stunde umbauen. Dafür muss man folgendes tun:

    1. io-package.json => common.compact = true setzen.

    2. main.js modifizieren

    War

         const adapter = new utils.Adapter({
              name: ...,
              stateChange: function () {...},
              ...
         });
    
    

    Ändern auf:

         let adapter;
         function startAdapter(options) {
              options = options || {};
              Object.assign(options, {
                   name: ...,
                   stateChange: function () {...},
                   ...
              });
              adapter = new utils.Adapter(options);
    
              return adapter;
         });
    
    

    Und ganz am Ende von der Datei:

    // If started as allInOne/compact mode => return function to create instance
    if (module && module.parent) {
        module.exports = startAdapter;
    } else {
        // or start the instance directly
        startAdapter();
    } 
    
    

    3. Alle process.exit ersetzen auf:

       adapter.terminate ? adapter.terminate() : process.exit()
    
    

    4. Um diesen Modus bei js-controller zu aktivieren sollte man in iobroker-data/iobroker.json => system.compact = true setzen. (wie hier https://github.com/ioBroker/ioBroker.js … t.json#L12)

    Natürlich diesen Modus unterstützt nur der js-controller vom git (branch master) : https://github.com/ioBroker/ioBroker.js ... /master

    Wenn Ihr Eure Adapter umgebaut habt bitte eine kurze Info in https://docs.google.com/spreadsheets/d/ ... sp=sharing eintragen. Hier auch bitte "Planned" reinschreiben wenn man einen/seinen Adapter startet und Status eintragen

  • Developer

    Für TypeScript-Entwickler kann das Ganze so aussehen:

    2.: src/main.ts

    let adapter: ioBroker.Adapter;
    function startAdapter(options: Partial <iobroker.adapteroptions>= {}) {
    	return adapter = utils.adapter({
    		// Default options
    		...options,
    		// custom options
    		name: "my-adapter",
    		// ...
    	});
    }
    
    // ...
    
    if (module && module.parent) {
    	// Export startAdapter in compact mode
    	module.exports = startAdapter;
    } else {
    	// Otherwise start the adapter immediately
    	startAdapter();
    }</iobroker.adapteroptions> 
    

  • Wir nehmen übrigens auch seeeehr gern PRs für ioBroker Adapter an falls jemand schneller als Bluefox mit Umbauen ist ;-))

    Wer langeweile hat kann ggf durch http://download.iobroker.net/list.html# … =1&filter= gehen und von oben nach unten arbeiten 😉


  • Developer

    Super, vielen Dank für diese Erweiterung!

    @Bluefox:

    In diesem Modus startet js-controller alle Adapter (die diesen Modus unterstützen) in dem selben Prozess wie js-controller. `
    Aus "Systemoptimierungs-Sicht" stellt sich mir hier noch die Frage, ob es zukünftig auch angedacht ist, einzelne Adapter auszuschließen zu können, also in separaten Prozessen zu betreiben, während man die "stabilen" Adapter im selben Prozess wie der JS-Controller laufen lässt…

    Dann wäre das nämlich auch eine tolle Option für User, deren Raspi an der Speicherobergrenze von 1 GB ist. Sie könnten dann die stabilen Adapter alle im selben Prozess halten, und die paar problematischen (falls es die gibt), die mal abschmieren, ausschließen...

    Nur so eine Idee...


  • Developer

    🙂 8-)

  • Developer Most Active

    wird dann der einzelstart bzw restart eines Adapters noch gehen ??


  • Erst einmal muss man den compact Mode für den JS:Controller einschalten. Wenn er aus ist werden alle Adapter gestartet wie bisher auch. Also alle die VMs und genug RAM haben werden wohl das weiter so nutzen wie jetzt.

    Mit dem oben verlinkten Admin-Issue und der Erweiterung darin könnte man dann pro Instanz auch bei aktiviertem compact-Mode entscheiden welche Instanz wie läuft. Und wenn man https://github.com/ioBroker/ioBroker.js … issues/303 noch macht wirds noch flexibler 🙂

    Auf Low-Memory Systemen kann der compact Mode genutzt werden

  • Developer

    @arteck:

    wird dann der einzelstart bzw restart eines Adapters noch gehen ?? `

    Aktuell nicht, soll aber noch behoben werden.


  • Gleich mal ne Frage zur Version, ich habe gesehen, das im latest wieder js-controller 1.5.3 angeboten wird. Läuft die Version nun problemlos, oder sollte man da besser bei 1.4.2 bleiben?


  • Uups auch nicht Absicht. Sage es bluefox.

    Gesendet vom Handy …


  • Alles klar und danke für die Info.


  • For All: Ich habe eine Zeile oben im Initialen Post gefixt:

    > typeof module !== undefined muss entweder typeof module !== "undefined" oder module != undefined oder einfach nur module sein.


  • Koordiniering der Implementierung in alle Adapter: https://docs.google.com/spreadsheets/d/ … sp=sharing


  • Update compact Mode: aktuellste GitHub Version 1.6.0 sollte stoppen von compact-adatern und auch prozess-umbenennen gefixt haben

  • Starter

    Hallo zusammen,

    ich würde auch gern meine Adapter (lgtv, lgtv11, hp-ilo, enet) ändern.

    Allerdings habe ich den zu ändern Code

         const adapter = new utils.Adapter({
              name: ...,
              stateChange: function () {...},
              ...
         });
    
    

    So in keinen meiner Adapter drin. Alle meine Adapter sind vom Aufbau im Prinzip gleich. Kann da mal jemand schauen und mir sagen was ich wo ändern muss? Den Eintrag in der JSON sehe ich nicht als Problem.


  • … er geschrieben dann überlegt :oops:


  • @SchuetzeSchulz:

    Hallo zusammen,

    ich würde auch gern meine Adapter (lgtv, lgtv11, hp-ilo, enet) ändern.

    Allerdings habe ich den zu ändern Code

         const adapter = new utils.Adapter({
              name: ...,
              stateChange: function () {...},
              ...
         });
    
    

    So in keinen meiner Adapter drin. Alle meine Adapter sind vom Aufbau im Prinzip gleich. Kann da mal jemand schauen und mir sagen was ich wo ändern muss? Den Eintrag in der JSON sehe ich nicht als Problem. `

    Kann dir gerne im Laufe des Tages mal deinen ioBroker.lgtv anpassen und dir einen PR schicken?

    Dort hast du z.B. in Zeile 161 sowas wie ..

    adapter.on('stateChange', function (id, state)
    { ... }
    

    .. und das müsste u.a. halt ersetzt werden. 8-)

  • Starter

    @BasGo:

    Kann dir gerne im Laufe des Tages mal deinen ioBroker.lgtv anpassen und dir einen PR schicken? `

    Das wäre super. Dann würde ich das für die anderen Adapter übernehmen wollen.

    Vielen Dank schon mal im Voraus!

Suggested Topics

2.2k
Online

35.2k
Users

41.1k
Topics

566.1k
Posts