Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. Nochmal: Globale Variable

    NEWS

    • ioBroker@Smart Living Forum Solingen, 14.06. - Agenda added

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    Nochmal: Globale Variable

    This topic has been deleted. Only users with topic management privileges can see it.
    • U
      ulistermclane last edited by

      Hallo,

      ich baue gerade eine Steuerung für unser Ferienhaus: Heizung ein/ausschalten, Frostüberwachung etc. Der Datenaustausch soll über SMS erfolgen. Dazu habe ich ein GSM Modul über den seriellen Port des Raspi (auf dem iobroker läuft) angeschlossen. Softwaretechnisch nutze ich das Nodejs Modul serialport bzw. serialport-gsm - funktioniert soweit. Nun möchte ich nicht alle Funktionen, die die SMS Kommunikation nutzen, in ein Skript packen (das würde dann sehr lang und unübersichtlich). Ich möchte also von verschiedenen Skripten aus auf ein globales Objekt 'port' bzw. 'modem' zugreifen (siehe https://serialport.io/docs/en/guide-usage bzw. https://github.com/zabsalahid/serialport-gsm). Ich kann den Code nicht einfach kopieren, da der serielle Port mit dem GSM Modul ja nur einmal vorhanden ist und man deshalb nicht mehrfach zugreifen kann. Gibt es dazu eine Lösung? Ich bin leider (noch) kein JavaScript Guru 😉

      Danke für einen Hinweis!

      1 Reply Last reply Reply Quote 0
      • U
        ulistermclane last edited by

        Update: der in node.js definierte Export / Import Mechanismus via module.exports und require funktioniert leider nicht, da das exportierende Script nicht gefunden wird - wo im Dateisystem liegen aber die Scripte? Ansonsten würde das mein Problem lösen. Auch der Mechanismus über GLOBALS geht nicht - Schade!

        1 Reply Last reply Reply Quote 0
        • paul53
          paul53 last edited by

          Wenn Du das NPM-Modul "serialport-gsm" in Javascript nutzen möchtest, musst Du es in die Konfigration der Javascript-Instanz unter "Zusätzliche NPM-Module" eintragen. Es wird dann automatisch installiert. Die Nutzung des Modules ist auf https://github.com/zabsalahid/serialport-gsm beschrieben.

          1 Reply Last reply Reply Quote 0
          • U
            ulistermclane last edited by

            Ja das ist klar und funktioniert auch. Mein Problem ist, dass ich aus mehreren Skripten auf die Modem-Schnittstelle zugreifen möchte. D.h. ich muss die modem bzw. port Objekte global sichtbar machen.

            1 Reply Last reply Reply Quote 0
            • paul53
              paul53 last edited by paul53

              @ulistermclane:

              aus mehreren Skripten auf die Modem-Schnittstelle zugreifen möchte.

              Dann schaffe Dir dafür Datenpunkte, die zur Kommunkation zu dem Skript mit dem require("serialport-gsm") dienen.

              1 Reply Last reply Reply Quote 0
              • U
                ulistermclane last edited by

                ok, werde ich so machen - finde ich aber ziemlich umständlich. Ich werde also

                • 2 states mit den zu sendenden bzw. empfangenen SMS Daten erzeugen

                • 2 Eventhandler schreiben die das Senden bzw. Empfangen erledigen
                  Trotzdem danke für den Hinweis!

                Was mich aber dennoch interessiert: warum funktionieren die Standard Node.js Methoden module.export / require nicht?

                1 Reply Last reply Reply Quote 0
                • paul53
                  paul53 last edited by paul53

                  @ulistermclane:

                  warum funktionieren die Standard Node.js Methoden module.export / require nicht?

                  Funktioniert die wirklich nicht ? Ich habe dies noch nicht getestet. In welches Verzeichnis hast Du Dein Modul gepackt ?

                  1 Reply Last reply Reply Quote 0
                  • U
                    ulistermclane last edited by

                    Alle Module stehen in einem Verzeichnis namens 'Testscripts'. Wenn ich dann versuche, das Objekt mit````
                    var modem = require('./Hauptsteuerung').modem

                    1 Reply Last reply Reply Quote 0
                    • paul53
                      paul53 last edited by paul53

                      @ulistermclane:

                      Deshalb meine Frage, wo die Scripte eigentlich im Dateibaum gespeichert werden.

                      Eigene Module solltest Du in einem eigenen Verzeichnis unter /opt/iobroker/node_modules/iobroker.javascript/node_modules/ speichern. Habe es gerade probiert: Funktioniert.

                      const test = require('lib/test.js');
                      
                      log(test().result);
                      
                      
                      1 Reply Last reply Reply Quote 0
                      • U
                        ulistermclane last edited by

                        Danke für den Hinweis. Das heißt dann aber: iobroker Scripts != Javascript Modul - oder?

                        1 Reply Last reply Reply Quote 0
                        • M
                          Marty56 last edited by

                          Ein bisschen Off- Topic. Ich finde die Steuerung über SMS interessant und auch für mich ist das eine Anwendung.

                          Könntest Du sagen, welches GSM Serial Modul genau Du verwendest und ggf. auch welchen Provider?

                          1 Reply Last reply Reply Quote 0
                          • M
                            Marty56 last edited by

                            Ich habe das mit dem eigenen Module mal ausprobiert und es scheint zu funktionieren.

                            Der Ansatz scheint aber einen großen Nachteil zu haben, nämlich, dass das Module nur einmal geladen wird, wenn es noch nicht vorhanden ist oder auch bei Neustart des Javascript Adapters

                            D.h. falls ich Änderungen in dem Module mache, muss ich immer den Javascript Adapter neu starten, was ziemlich umständlich ist.

                            Ich habe keinen Weg gefunden, ein neues Laden des Modules im Script zu erzwingen, jedesmal, wenn das Script neu gestartet wird.

                            1 Reply Last reply Reply Quote 0
                            • paul53
                              paul53 last edited by

                              Damit die eigenen Module bei einem Update nicht verloren gehen bzw. im Minimal-Backup mit gesichert werden, sollten sie im Verzeichnis iobroker-data gespeichert werden. Ich habe dafür das Verzeichnis modules erstellt. Der Aufruf eigener Module sieht dann so aus:

                              const test = require('../../../iobroker-data/modules/test.js');
                              
                              log(test().result);
                              
                              
                              1 Reply Last reply Reply Quote 1
                              • First post
                                Last post

                              Support us

                              ioBroker
                              Community Adapters
                              Donate

                              549
                              Online

                              31.7k
                              Users

                              79.6k
                              Topics

                              1.3m
                              Posts

                              3
                              13
                              2076
                              Loading More Posts
                              • Oldest to Newest
                              • Newest to Oldest
                              • Most Votes
                              Reply
                              • Reply as topic
                              Log in to reply
                              Community
                              Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
                              The ioBroker Community 2014-2023
                              logo