Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. ioBroker Allgemein
    4. #define in Blockly ? [geht nicht]

    NEWS

    • [erledigt] 15. 05. Wartungsarbeiten am ioBroker Forum

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    #define in Blockly ? [geht nicht]

    This topic has been deleted. Only users with topic management privileges can see it.
    • haus-automatisierung
      haus-automatisierung Developer Most Active @MartinSU last edited by

      @martinsu Das #define (als Makro) wird bei C ja vom Präprozessor überall ersetzt. So etwas gibt es in JavaScript nicht. Daher kann das auch niemand anbieten.

      In Blockly bleiben Dir also nur die Variablen. In JavaScript oder TypeScript würde man eine Konstante anlegen.

      const maxTemp = 50;
      
      Codierknecht 1 Reply Last reply Reply Quote 1
      • black.falcon87
        black.falcon87 last edited by

        Ich antworte mal laienhaft, da ich kein Entwickler / Programmierer bin, aber innerhalb von den Objekten in ioBroker gibt es ja den Bereich userdata in welchem jeder Benutzer seine eigenen Objekte anlegen kann.
        Mach dir doch dort einfach einen neuen Ordner namens "Defines" (oder wie auch immer du ihn nennen magst) und dort erzeugst du Datenpunkte. Jeder Datenpunkt ist dann eine Variable und die kannst du ihn verschiedenen Skripten verwenden.
        Änderst du den Wert des Datenpunktes unterhalb vom Ordner userdata, ändert sich der Wert ja auch in allen Skripten die mit diesem Wert arbeiten. Oder denke ich da jetzt zu einfach?

        MartinP 1 Reply Last reply Reply Quote 0
        • MartinP
          MartinP @black.falcon87 last edited by

          @black-falcon87

          1. das könnte man für scriptübergreifende "defines" vielleicht überlegen, mit skript-lokalen defines wird es unübersichtlich
          2. der Zugriff auf die Daten aus dem Userdata Tree wird sicherlich nicht ohne Aufwand erfolgen, wird ein wenig (wenn auch kaum merklich) mehr Rechenzeit kosten, als es einfach so zu machen, wie es @haus-automatisierung vorgeschlagen hat.
          1 Reply Last reply Reply Quote 0
          • Codierknecht
            Codierknecht Developer Most Active @haus-automatisierung last edited by

            @haus-automatisierung sagte in #define in Blockly ? [geht nicht]:

            In Blockly bleiben Dir also nur die Variablen. In JavaScript oder TypeScript würde man eine Konstante anlegen.

            Wäre ein Block "Konstante" nicht etwas für ein künftiges Update?

            @MartinSU
            Wie @haus-automatisierung schon schreibt, gibt es in der JS-Welt keinen Präprozessor, demnach auch keine Makros und somit kein #define.
            In der ganz großen Mehrheit der Sprachen macht man sowas mit Konstanten. Die erfüllen genau den von Dir gewünschten Zweck.

            OT:
            Es gab in der "DOS-International" mal den "Kilo-Mark-Wettbewerb". Um 1.024 DM gewinnen zu können durfte das eingereichte Programm (das Listing) max. 1.024 Byte groß sein.
            Da hat mal jemand ein komplexes Menüsystem programmiert (in ANSI-C). Damit das Listing die Größe nicht überschritt, hat der Kerl den Präprozessor komplett vergewaltigt.
            Das wimmelte nur so vor Konstrukten wie dem hier:

            #define f10 for(i=0;i<10;i++) {
            #define f20 for(i=0;i<20;i++) {
            #define a if (i > 0)
            // und noch jede Menge weitere
            

            Fast alles was mehr als 1x im Code vorkam, wurde durch Makros definiert.
            Im Code wurde dann nur noch f10, f20, a usw. aufgerufen.
            Konnte in der Form natürlich keine Sau lesen.

            MartinP 1 Reply Last reply Reply Quote 0
            • BananaJoe
              BananaJoe Most Active @MartinSU last edited by

              @martinsu mal einen Schritt zurück: in ioBroker würde ich für so etwas einen eigenen Datenpunkt unterhalb von 0_userdata.0 einsetzen. Da packe ich Parameter für Skripte hin um diese ggf. z.B. über eine VIS, Zeitpläne oder Sensoren ändern zu können.
              Das Skript holt sich am Anfang und bei Änderung den Wert, alternativ bei Verwendung innerhalb der Funktionen.
              Damit ich nicht 100 mal den Datenpunkt angeben muss definiere ich den einmal in einer Variablen und nutze diese dann im Rest des Skriptes:

              cbc7afe8-3289-4894-907d-ca6e911930fd-image.png

              Natürlich kann man sich so auch den Datenpunkt aus Textbausteinen zusammenbauen:
              f0ec11b7-a460-450d-82dc-8efc2cb3838b-image.png

              MartinSU 1 Reply Last reply Reply Quote 0
              • MartinSU
                MartinSU @BananaJoe last edited by

                Das ich so eine Reaktion auslöse, hätte ich nicht gedacht....
                Und so etwas wie bei dem "Kilo-Mark-Wettbewerb" wollte ich natürlich auch nicht.
                Ob DEFINE oder Konstante wäre auch relative egal.
                Warum nicht von anderen Sprachen lernen und so eine Art Präprozessor schaffen?
                Wäre es so schwer, bei einem "Script ausführen" die Ersetzungen vorzunehmen?
                Ich glaube, jetzt habe ich für genug Verwirrung gesorgt, danke für Eure Beteiligung.

                haus-automatisierung Asgothian Codierknecht 3 Replies Last reply Reply Quote 0
                • haus-automatisierung
                  haus-automatisierung Developer Most Active @MartinSU last edited by

                  @martinsu sagte in #define in Blockly ? [geht nicht]:

                  Ob DEFINE oder Konstante wäre auch relative egal.
                  Warum nicht von anderen Sprachen lernen und so eine Art Präprozessor schaffen?

                  ioBroker setzt auf nodejs auf. Da kann man nicht einfach irgendwelche Konzepte mal eben übernehmen: https://github.com/nodejs/node

                  Das würde alles nur komplizierter machen. Für welchen Mehrwert? Dass Scripts 1ms schneller laufen? Wenn wir so detailliert optimieren möchten, gibt es vorher tausende Stellen welche das eher verdient hätten.

                  Schau gerne den Code des js-controller oder JavaScript Adapters an und mach dort Vorschläge zur Performance-Optimierung. Das ist immer willkommen!

                  1 Reply Last reply Reply Quote 2
                  • Asgothian
                    Asgothian Developer @MartinSU last edited by

                    @martinsu sagte in #define in Blockly ? [geht nicht]:

                    Wäre es so schwer, bei einem "Script ausführen" die Ersetzungen vorzunehmen?

                    Ja.

                    Wie @haus-automatisierung geschrieben hat müsste man dafür das in nodeJS einbauen lassen, bzw. alternativ dazu eine JS-Adapter eigene Funktion als Präprozessor schreiben der jedes Skript beim starten einmal durchnudelt und verändert - dadurch entspricht dann das was der Benutzer lesen kann nicht mehr dem was ausgeführt wird.

                    Ich denke da stehen Aufwand und Ergebnis in keinem Sinnvollen Zusammenhang.

                    Das Thema mit einem "const" block könnte nochmal beleuchtet werden - allerdings nicht aus der Sicht der Performance-Verbesserung sondern der Absicherung. Das was als "const" definiert wird muss bei Definition mit einem Wert versehen werden und kann nicht an die Variablen-Blöcke zur Wert-Anpassung angedockt werden.

                    Damit liessen sich benannte Konstanten schaffen die nicht aus versehen in einem langen Blockly mit anderen Werten beschrieben werden können.

                    Auch das ist aber ein untergeordnetes Problem - bei komplexeren Problemen wird im Zweifelsfall dann doch direkt in JS geschrieben - und da hat man die Option bereits.

                    A.

                    1 Reply Last reply Reply Quote 2
                    • Codierknecht
                      Codierknecht Developer Most Active @MartinSU last edited by Codierknecht

                      @martinsu sagte in #define in Blockly ? [geht nicht]:

                      so eine Art Präprozessor schaffen?

                      Dazu müsstest Du NodeJS umbauen. Viel Vergnügen und Erfolg dabei 😁

                      Ich glaube, jetzt habe ich für genug Verwirrung gesorgt

                      Verwirrung nicht - das Konzept ist ja altbekannt.
                      Es wird allerdings (fast) nur in C/C++ verwendet. Auch C# kennt das nicht mehr.

                      Ob DEFINE oder Konstante wäre auch relative egal.

                      Es wurde ja schon mehrfach geschrieben: In NodeJS und so ziemlich allen anderen Sprachen gibt es dafür das Konzept der Konstanten.
                      Entweder wechselst Du von Blockly zu JS (wenn man von C kommt dürfte das nicht sonderlich schwierig sein), oder Du wartest, ob das demnächst mal in Blockly implementiert wird.

                      Aber: Die allermeisten Entwicklungen in ioBroker werden ehrenamtlich in der Freizeit gemacht. Da heißt es auch schon mal: Warten!

                      Warum nicht von anderen Sprachen lernen

                      C bzw. C++ sind 50 bzw. 40 Jahre alt.
                      Dann könnte man auch gleich hingehen und wieder die Zeiger-Verbiegerei einführen 😀

                      BananaJoe 1 Reply Last reply Reply Quote 3
                      • BananaJoe
                        BananaJoe Most Active @Codierknecht last edited by

                        @codierknecht sagte in #define in Blockly ? [geht nicht]:

                        Warum nicht von anderen Sprachen lernen

                        C bzw. C++ sind 50 bzw. 40 Jahre alt.
                        Dann könnte man auch gleich hingehen und wieder die Zeiger-Verbiegerei einführen

                        Bzw: Man hat ggf. gelernt und das bewusst weggelassen

                        Codierknecht 1 Reply Last reply Reply Quote 0
                        • Codierknecht
                          Codierknecht Developer Most Active @BananaJoe last edited by

                          @bananajoe sagte in #define in Blockly ? [geht nicht]:

                          Man hat ggf. gelernt und das bewusst weggelassen

                          In den Zeiten reiner Textbildschirme war das Verbiegen des Videozeigers einfach cool.
                          Im Sinne von Sicherheit ist das direkte Beschreiben von Speicherbereichen und Verbiegen von Zeigern aber 'ne mittelschwere Katastrophe. Das hat man ja nicht ohne Grund mittlerweile in vielen modernen Sprachen entfernt.
                          Auch das de-referenzieren von Zeigern ist problematisch (verpönt sowieso) und in vielen Sprachen nicht mehr möglich.

                          Wird aber so langsam reichlich O.T.

                          1 Reply Last reply Reply Quote 0
                          • MartinP
                            MartinP @Codierknecht last edited by MartinP

                            @codierknecht said in #define in Blockly ? [geht nicht]:

                            Wäre ein Block "Konstante" nicht etwas für ein künftiges Update?

                            Da bin ich mir nicht sicher - als eigenen Block hat man Konstanten ja schon - wenn auch unbenannt 😉 2bbf85a9-b427-4724-a50e-bdd06762b03a-grafik.png

                            Vielleicht das Definieren von Variablen etwas erweitern ("const" Haken zum checken, und ein "Preset-Wert")...
                            Möglicherweise müsste man dann aber in den Blöcken auch kennzeichnen, ob die Variable "const" ist ...

                            983d1750-8e03-465f-8a25-777c20379ca6-grafik.png

                            Ich denke, man sollte das aber aufklappbar hinter einem "Erweitert" Pfeil verbergen. Blockly soll ja einsteigerfreundlich bleiben ....

                            haus-automatisierung 1 Reply Last reply Reply Quote 0
                            • haus-automatisierung
                              haus-automatisierung Developer Most Active @MartinP last edited by

                              @martinp sagte in #define in Blockly ? [geht nicht]:

                              Vielleicht das Definieren von Variablen etwas erweitern ("const" Haken zum checken, und ein "Preset-Wert")...

                              Das wäre dann ein Feature Request in diesem Projekt: https://github.com/google/blockly

                              1 Reply Last reply Reply Quote 1
                              • First post
                                Last post

                              Support us

                              ioBroker
                              Community Adapters
                              Donate
                              FAQ Cloud / IOT
                              HowTo: Node.js-Update
                              HowTo: Backup/Restore
                              Downloads
                              BLOG

                              414
                              Online

                              31.6k
                              Users

                              79.5k
                              Topics

                              1.3m
                              Posts

                              7
                              14
                              594
                              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