Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. Blockly Script -> ein Script für mehrere Trigger

    NEWS

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

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    Blockly Script -> ein Script für mehrere Trigger

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

      Hallo zusammen,
      ich möchte um eure Hilfe bitten.
      Derzeiz versuche ich ein (hier gefundenes) Script umzubasteln, mit dem ich mehrere AVM Lampen steuern kann.
      Das Problem ist, dass ich für eine Lampe ziemliche viele Wenn-Dann-Bedingungen schreiben muss um die unterschiedlichen Farbeinstellungen abzubilden.
      Für eine Lampe habe ich das fertig. Um das für weitere Lampen zu auch einzustellen, muss ich das Script bisher kopieren und in jeder Bedingung das Objekt-ID ändern.
      Ich habe in VIS für die 45 einzelnen Farben jeder Lampe ein DropDown-Feld und bearbeite damit einen Datenpunkt.

      Jetzt stellt sich mir die Frage: kann ich nicht alle Lampen mit dem Gleichen Script bearbeiten, indem ich zu Beginn abfrage welcher der Datenpunkte (also welcher Eintrag für welche Lampe) geändert wurde? danach möchte ich gerne das Script für die dazugehörigen Datenpunkt der entsprechenden Lampe ändern. Aber da fehlt es mir an Kenntis der möglichen Umsetzung.

      Ich versuche mal meine Idee eines Scrips darzustellen:

      1. Trigger (wenn Veränderung an Datenpunkt A oder B oder C oder....)
        Dann
        2 Prüfe welcher der Trigger wurde verändert ? (A oder B oder C....)
        Dann
      2. wenn z.B, B verändert wurde, dann ändere im folgenden den die Datenpunkte AVM.LampeB.Helligkeit
        (hierbei müsste der Wert "LampeB" eventuell eine Variable darstellen, die ich bei einem anderen Trigger halt ändern müsste.

      Könnt ihr euch vorstellen, was mein Problem ist?

      So mache ich es bisher... und da müsste halt noch etwas dazwischen...

      AVM-Lampe-Test.png

      Codierknecht David G. 2 Replies Last reply Reply Quote 0
      • Codierknecht
        Codierknecht Developer Most Active @cheffe last edited by

        @cheffe
        Das Zauberwort lautet "Funktionen".

        Das Prinzip:
        12e4e918-a3d3-4509-a467-63ebc6efce2e-image.png

        1 Reply Last reply Reply Quote 0
        • David G.
          David G. @cheffe last edited by

          @cheffe

          Oder einfach dort wo du im.

          @codierknecht sagte in Blockly Script -> ein Script für mehrere Trigger:

          @cheffe
          Das Zauberwort lautet "Funktionen".

          Das Prinzip:
          12e4e918-a3d3-4509-a467-63ebc6efce2e-image.png

          Das Problem liegt doch eher darin, dass Trigger und zu steuernder DP unterschiedlich sind wie ich es sehe?

          Codierknecht 1 Reply Last reply Reply Quote 0
          • Codierknecht
            Codierknecht Developer Most Active @David G. last edited by

            @david-g
            Es ging mir ums Prinzip.

            Welche Parameter jetzt sinnvoll sind und wo man die herbekommt, steht auf einem anderen Blatt.

            Wo kommen A, B, C her? Sind das eigene DP in 0_userdata? Dann könnte man den Ziel-DP in die Description dieses DP schreiben und mit an die Funktion übergeben.

            Oder man arbeitet mit einem bestimmten Namensschema, bei dem man Teile des Namens einfach ersetzt um damit das Ziel zu bestimmen.
            Viele Wege führen nach Rom ...

            David G. 1 Reply Last reply Reply Quote 0
            • David G.
              David G. @Codierknecht last edited by

              @codierknecht

              Ich würde vermutlich, jenachdem wie viele Lampen es sind die Funktion nehmen und diese dann je Lampe in einen eigenen trigger packen.

              In der Funktion kann man ja dann schnell alles leicht übergeben.

              Sind ja vermutlich keine 500 Lampen.

              C 1 Reply Last reply Reply Quote 0
              • C
                cheffe @David G. last edited by

                hallo und vielen Dank schonmal für die schnellen Antworten.
                Ich versuche nochmal etwas ausführlicher darzustellen.
                Ich habe hier bisher nur 3 Lampen. Vielleicht werden es aber noch mehr.
                Pro Lampe habe ich einen DAtenpunkt unter 0_userdata erstellt, die den Status 1-45 haben kann (für jede Farbe einen Code).
                Wenn dieser geändert wird (durch eine Nutzeränderung), dann soll ein Script anhand der Zahl entsprechend die Datenpunkte unter der AVM-Instanz ändern um die Farbe zu ändern.
                Das funktioniert auch soweit. Mein Screenshot oben ist nur ein Auszug, bei dem 2 von den 45 Änderungen zu sehen sind.
                Dieses Script kann ich natürlich jetzt kopieren und für die zweite und dritte Lampe auch die zu steuernden Einträge immer auswählen. Ist mir aber zu umständlich und für den heutigen Stand auch nicht zeitgemäß. Da muss es etwas besseres geben.

                Also möchte ich, dass mein Script zunächst auf eine Änderung von allen drei Datenpunkten unter 0_userdata reagiert.
                Wenn es eine Änderung feststellt, dann sollte ebenfalls problemlos feststellbar sein, welcher dieser (aktuell noch nur) 3 Datenpunkte geändert wurde.
                Anhand dessen soll dann geändert werden, welche zu steuernden Datenpunkte unter den AVM-Objekten geändert werden soll.
                Ich bekomme es halt nur noch nicht hin, wie ich das zu steuernde Objekt-ID "variabel" gestalten kann. Ob nun
                -fritzdect.0.DECT_130770174577-1.temperature
                oder
                -fritzdect.0.DECT_13077017*****-1.temperature
                (mit temperatur wird die Helligkeit der Lampe gesteuert)

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

                  @cheffe sagte: Pro Lampe habe ich einen DAtenpunkt unter 0_userdata erstellt

                  Verwende zwei korrespondierende ID-Listen und eine Liste mit den Farbtemperaturen (sind es wirklich 45?):

                  Blockly_temp.JPG

                  C 1 Reply Last reply Reply Quote 2
                  • C
                    cheffe @paul53 last edited by

                    @paul53

                    hallo, vielen Dank für deinen Vorschlag.
                    Ich finde die IDee gar nicht schlecht und würde gerne versuchen, sie anzupassen.
                    Leider müssen wir das noch etwas anpassen.
                    Es sind wirklich 45 Farben, und es wird noch etwas schwerer, denn es sind nich nur immer die Werte im gleichen Datenpunkt. Es sind bis zu 3 verschiedene Datenpunkte zu steuern, was es leider noch etwas schwieriger macht. Ich vermute, dass wir dann mit dem Datenpunkt "Temps" alleine so nicht arbeiten können.

                    Ich versuche mal hier das bisherige Script einzustellen:

                    man müsste also wohl leider noch prüfen ob der eingegebene Wert kleiner oder größer als 9 ist (unter 9 ist es weiß mit unterschiedliher helligkeit, danach sind es farben...)
                    Screenshot 2024-01-25 092923.png
                    und davon müsste ich abhängig machen, welcher Datenpunkt geändert werden muss...

                    so sieht es bisher bei mir aus
                    Screenshot 2024-01-25 092442.png

                    also sinngemäß:
                    -wenn der neue Wert des geänderten DAtenpunktes < 10, dann ändere die Temperatur, sonst ändere Hue und Saturation der entsprechenden Lampe.
                    und dann müsste die lange "wenn-Dann" Liste mit den Farbcodes aus meinem script da vermutlich einmal reinkopiert werden

                    könnt ihr mir da noch tipps geben, mit welchen BLocks ich arbeiten könnte?

                    Asgothian paul53 2 Replies Last reply Reply Quote 0
                    • Asgothian
                      Asgothian Developer @cheffe last edited by

                      @cheffe sagte in Blockly Script -> ein Script für mehrere Trigger:

                      -wenn der neue Wert des geänderten DAtenpunktes < 10, dann ändere die Temperatur, sonst ändere Hue und Saturation der entsprechenden Lampe.
                      und dann müsste die lange "wenn-Dann" Liste mit den Farbcodes aus meinem script da vermutlich einmal reinkopiert werden
                      könnt ihr mir da noch tipps geben, mit welchen BLocks ich arbeiten könnte?

                      ich empfehle folgendes:
                      Eine Liste mit den "basis" Datenpunkten für temp, hue, sat - sprich wenn die Lampe unter 0_userdata.0.raum.lampe.hue, 0_userdata.0.raum.lampe.sat, 0_userdata.0.raum.lampe.temp ihre DP's hat, dann steht in der Liste "0_userdata.0.raum" drin
                      An stelle der einfachen Liste "temps" eine Liste von Listen, in denen jeweils in der Reihenfolge Temp, hue, sat drin stehen. Dabei ist zu beachten: Wenn einer der Werte angesteuert werden soll, so steht da ein positiver wert. Soll er nicht angesteuert werden steht da -1. Zum befüllen der Liste kannst du den Baustein "Liste aus Text" nehmen, um da z.Bsp. "-1,0,100" oder "5600,-1,-1" rein zu schreiben.

                      Dann gibts Du diese Liste an die Funktion, und baust dir die ID entsprechend zusammen:
                      BasisID + ".temp" oder ".sat" oder ".hue", und setzt den State nur dann wenn der Wert der gesetzt werden soll > -1 ist.

                      A.

                      C 1 Reply Last reply Reply Quote 0
                      • C
                        cheffe @Asgothian last edited by

                        @asgothian
                        danke
                        leider verstehe ich es nicht ganz..
                        könntest du dir vorstellen deine idee in auszügen (!) als blockly script für mich darstellen?

                        Danke 😃

                        C 1 Reply Last reply Reply Quote 0
                        • C
                          cheffe @cheffe last edited by cheffe

                          hab mit den beiden liste mal angefangen... ich hoffe du meintest das so...

                          Screenshot 2024-01-25 102214.png

                          nur für den letzten Teil ieß ich nicht, wie ich das anstellen soll.. und was genau du damit meinst...
                          Dann gibts Du diese Liste an die Funktion, und baust dir die ID entsprechend zusammen:
                          BasisID + ".temp" oder ".sat" oder ".hue", und setzt den State nur dann wenn der Wert der gesetzt werden soll > -1 ist

                          soll ich das im oben angefangenen Script einbauen? oder schlägst du da was ganz neues vor?

                          Asgothian 1 Reply Last reply Reply Quote 0
                          • Asgothian
                            Asgothian Developer @cheffe last edited by Asgothian

                            @cheffe als blockly bauen kann ich es nicht - kein blockly wenn ich unterwegs bin 🙂

                            Aber das was du gemacht hast ist erst einmal korrekt.

                            Wenn du die obere Liste in eine Variable "AlleBasisIDs" speicherst, und die die untere Liste in eine Variable "AlleFarben" speicherst, dann:

                            Jetzt definierst du dir noch eine Variable "Zielwerte", und an stelle des

                            Screenshot 2024-01-25 at 10.27.39.png

                            kommt erst einmal eine Zuweisung auf diese Variable mit "in der Liste 'AlleFarben' nimm das 'idx'. element."
                            und eine Zuweisung auf eine neue Variable "BasisID" mit "in der Liste 'AlleBasisIDs' nimm das 'idx'. element."

                            Dann kommen 3 Schreibe Blöcke (der aus dem Screenshot), wobei sich die Einträge für ObjektID und Wert ändern, jeweils hinter einem "falls"

                            falls (in der Liste Zielwerte nimm das 1. Element > -1) - darin den Schreibe Block it ObjektID als "Erzeuge Text aus 'BasisID'" und '".Temp", und als Wert "in der Liste 'Zielwerte' nimm das 1. Element"

                            falls (in der Liste Zielwerte nimm das 2. Element > -1) - darin den Schreibe Block it ObjektID als "Erzeuge Text aus 'BasisID'" und '".hue, und als Wert "in der Liste 'Zielwerte' nimm das 2. Element"

                            falls (in der Liste Zielwerte nimm das 3. Element > -1) - darin den Schreibe Block it ObjektID als "Erzeuge Text aus 'BasisID'" und '".sat", und als Wert "in der Liste 'Zielwerte' nimm das 3. Element"

                            Ich hoffe das hilft erst einmal

                            C 1 Reply Last reply Reply Quote 0
                            • C
                              cheffe @Asgothian last edited by

                              @asgothian

                              hui... das fand ich jetzt nicht ganz einfach...
                              zunächst hatte ich noch die frage: "idx" ist auch eine selbst angelegte Variable, oder? Die habe ich bei mir anders genannt.

                              Mein Script sieht jetzt so aus... meintest du das so?

                              Screenshot 2024-01-25 112818.png

                              Asgothian 1 Reply Last reply Reply Quote 0
                              • Asgothian
                                Asgothian Developer @cheffe last edited by

                                @cheffe
                                Exakt.

                                Wichtig ist jetzt noch: der Datenpunkt für die Farbtemperatur muss jetzt z.Bsp. auch
                                fritzdect.0.DECT_130770174577-1.temp sein. Ansonsten müsstest du das .temp so anpassen das es zum Datenpunkt passt. Dito mit saturation und Hue

                                A.

                                C 1 Reply Last reply Reply Quote 0
                                • C
                                  cheffe @Asgothian last edited by

                                  @asgothian
                                  ja, das hab ich schon gemerkt und in ".temperature" und ".saturation" angepasst.
                                  Ich bekomme auch minimal Änderungen an der Farbe hin, es scheint also im Grunde zu funktionieren.
                                  Aktuell bekomme ich aber über mein Script nur eine Änderung hin, danach ändert sich nix mehr...
                                  muss ich das Script irgendwie nach Änderung "anhalten" , "beenden" oder neustarten?

                                  Asgothian 1 Reply Last reply Reply Quote 0
                                  • Asgothian
                                    Asgothian Developer @cheffe last edited by

                                    @cheffe Nein, aber ich denke du hast ein Problem mit dem "aktiven Schalter".

                                    Da du da die ID des Schalters rein schreibst ändert die sich nicht wenn du mit dem gleichen Schalter spielst.

                                    Lösung dazu: im Trigger den aktiven Schalter Datenpunkt auf "" setzen, und vor dem Ermitteln des Index schauen ob der "" ist - dann tust du nix.

                                    A.

                                    C 1 Reply Last reply Reply Quote 0
                                    • C
                                      cheffe @Asgothian last edited by

                                      @asgothian
                                      ich denke so meintest du?
                                      Screenshot 2024-01-25 124624.png

                                      was genau meinst du mit "Ermitteln des Index ...."?

                                      Asgothian 1 Reply Last reply Reply Quote 0
                                      • Asgothian
                                        Asgothian Developer @cheffe last edited by

                                        @cheffe sagte in Blockly Script -> ein Script für mehrere Trigger:

                                        @asgothian
                                        ich denke so meintest du?
                                        Screenshot 2024-01-25 124624.png

                                        was genau meinst du mit "Ermitteln des Index ...."?

                                        Nein - sorry, das was ich vorhin geschrieben hab war Unsinn.
                                        Du hast ja eine Liste an Schaltern von denen sich ein beliebiger ändert. Dementsprechend sollte das auch ohne
                                        Screenshot 2024-01-25 at 13.12.08.png
                                        mehrfach funktionieren. Da hab ich auf dem Weg raus nicht richtig gelesen.

                                        Genau bin ich noch nicht sicher warum es nicht geht. Bau doch mal einen Debug-Baustein in den Trigger und lass mitloggen wann der Anspricht und welche ObjektID den Trigger auslöst.

                                        A.

                                        C 1 Reply Last reply Reply Quote 0
                                        • C
                                          cheffe @Asgothian last edited by

                                          @asgothian

                                          wie muss ich den einbauen? was muss ich da einrichten?

                                          Asgothian 1 Reply Last reply Reply Quote 0
                                          • Asgothian
                                            Asgothian Developer @cheffe last edited by

                                            @cheffe es gibt unter System einen Baustein "debug output" oder so. Den einsetzen, die Nachricht über text-zusammensetzen zusammen basteln und an den Block hängen. Wichtig. diesen Baustein da mit einbauen:
                                            Screenshot 2024-01-25 at 13.40.17.png

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

                                            Support us

                                            ioBroker
                                            Community Adapters
                                            Donate

                                            949
                                            Online

                                            31.7k
                                            Users

                                            79.7k
                                            Topics

                                            1.3m
                                            Posts

                                            5
                                            24
                                            873
                                            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