Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. Blockly
    5. Wort in Liste suchen und wenn vorhanden, Eintrag ändern

    NEWS

    • Wir empfehlen: Node.js 22.x

    • Neuer Blog: Fotos und Eindrücke aus Solingen

    • ioBroker goes Matter ... Matter Adapter in Stable

    Wort in Liste suchen und wenn vorhanden, Eintrag ändern

    This topic has been deleted. Only users with topic management privileges can see it.
    • M
      Matthias I last edited by

      Liebe Community,

      ich habe eine Liste und möchte gerne die Listeneinträge auf "Schlagwörter" durchsuchen.
      Wenn ein solches gefunden wird, dann möchte ich gerne den gesamten Listeneintrag ersetzen.

      Man kann eine Liste zwar auf das Vorkommen von "Schlagwörtern" durchsuchen, jedoch erhält man als Ausgabe dann die Textstelle (z.B. 20, bedeutet, dass das Schlagwort ab Zeichen 20 beginnt), aber nicht in welchem Listeneintrag sich das Wort befindet um dieses dann zu ersetzten.

      Ist so etwas umsetzbar?

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

        @matthias-i
        Deine Informationen sind etwas dürftig.
        Was ist das für eine "Liste". Welches Format und wo kommt die her?

        https://forum.iobroker.net/topic/51555/hinweise-für-gute-forenbeiträge/1

        M 1 Reply Last reply Reply Quote 0
        • M
          Matthias I @Codierknecht last edited by

          @codierknecht
          Entschuldige bitte, ich versuche es mal etwas genauer zu beschreiben:

          Zunächst ein paar Daten: Ich nutze einen RP4 mit Node.js: v16.19.1 und JS 4.0.24

          Hier jetzt noch etwas Kontext:

          Ich möchte gerne diverse Sprachausgaben (z.B. Wäsche fertig / Post ist da / ...) auf wahlweise einem oder mehreren Smartspeakern ausgeben lassen.

          Hierzu habe in meiner Vis ein inventwo-Checkbox/Radiobutton Widget mit derzeit 4 Auswahlmöglichkeiten integriert.
          Bild_2023-03-02_103351931.png

          Jedem Raum habe ich in den Objekten unter userdaten einen eigenen Datenpunkt vom Typ boolean angelegt, sodass diese über das Widget dann entweder auf "true" oder "false" gesetzt werden. Des Weiteren habe ich diese Datenpunkte einer Funktion zugewiesen.

          Mit Hilfe des idSelktor-Bausteines prüfe ich jetzt den Zustand aller Datenpunkte in der Funktion auf den Wert "true" und lasse mir eine Liste mit den Objekt-ids erstellen und in einer ebenfalls unter userdaten angelegten Variablen als eigenen Datenpunkt (json) speichern.
          Dies funktioniert und sieht dann so aus:

          [
            "0_userdata.0.Sprachansagen.Speaker_Buero",
            "0_userdata.0.Sprachansagen.Speaker_Kueche"
          ]
          

          Um jetzt die Sprachausgaben auch wirklich nur in den ausgewählten Räumen stattfinden zu lassen müsste ich in dem obigen json nach den Namen der Räume wie z.B. "Buero" suchen.
          Wird der Name gefunden, so möchte ich gerne den gesamten ersten Eintrag der Liste

          "0_userdata.0.Sprachansagen.Speaker_Buero"
          

          durch die Objekt-ID des Smartspeakers ersetzen.

          Ziel ist es, dass ich eine Liste erhalte, in der dann ausschließlich die Objekt-IDs der Smartspeaker enthalten sind, die ich in der Vis aktiviert habe.
          Die kann ich dann in einer Schleife so abarbeiten lassen und den Wert jeweils auf den Ausgabetext setzen lassen.

          Ich hoffe du kannst es nun besser nachvollziehen und mir weiterhelfen.

          Vielen Dank!

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

            @matthias-i sagte in Wort in Liste suchen und wenn vorhanden, Eintrag ändern:

            0_userdata.0.Sprachansagen.Speaker_

            OK, Du hast also ein Array in einem DP gespeichert. Das kann man ja durcheiern.
            Wie heissen denn die DP für die Speaker? Endet deren Name dann auch immer auf Buero oder Kueche ?

            M 1 Reply Last reply Reply Quote 0
            • M
              Matthias I @Codierknecht last edited by

              @codierknecht
              Für die DP der Speaker verwende ich Aliase, die die Namen "Büro" und "Küche" tragen.
              (mir ist schonmal einer kaputt gegangen und das Ändern aller Programme hat mich dazu veranlasst fortan Aliase zu nutzen)
              Ich könnte die Aliase aber auch in "Buero" und "Kueche" umändern.

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

                @matthias-i sagte in Wort in Liste suchen und wenn vorhanden, Eintrag ändern:

                Ich könnte die Aliase aber auch in "Buero" und "Kueche" umändern.

                Das solltest Du auf jeden Fall machen - Umlaute sind böse 😉

                Im Prinzip sollte das dann so funktionieren:
                21ee7801-9aa0-4c1c-afdb-473a7096b192-image.png

                M 1 Reply Last reply Reply Quote 0
                • M
                  Matthias I @Codierknecht last edited by

                  @codierknecht
                  Vielen Dank für deine Hilfe!!!
                  Werde es nachher testen und mich dann melden ob es geklappt hat 👍

                  Dürfte ich dich in dem Zusammenhang auch fragen, wie man es anstellt, dass er mir in der Ursprungsliste statt

                  [
                    "0_userdata.0.Sprachansagen.Speaker_Buero",
                    "0_userdata.0.Sprachansagen.Speaker_Kueche"
                  ]
                  

                  auch nur

                  [
                    "Buero",
                    "Kueche"
                  ]
                  

                  ausgibt? Das wäre eleganter und würde dein Blockly vereinfachen.

                  Die ursprüngliche Liste wird mit folgendem Blockly erstellt:
                  Bild_2023-03-02_112425434.png

                  Homoran Codierknecht 2 Replies Last reply Reply Quote 0
                  • Homoran
                    Homoran Global Moderator Administrators @Matthias I last edited by Homoran

                    @matthias-i dann musst du das zerlegen (nimm Teil ab....) schon in diesem Schritt bei füge als letzes... machen

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

                      @matthias-i sagte in Wort in Liste suchen und wenn vorhanden, Eintrag ändern:

                      Dürfte ich dich in dem Zusammenhang auch fragen, wie man es anstellt, dass er mir in der Ursprungsliste statt

                      So wie in meinem Blockly: Nimm eine Hilfsvariable und packe dort mit "im Text x nimm Teil ab" nur den letzten Teil rein. Dann fügst Du den Inhalt dieser Variablen an die Liste an.

                      M 1 Reply Last reply Reply Quote 0
                      • M
                        Matthias I @Codierknecht last edited by

                        @codierknecht
                        Den ersten Teil habe ich erfolgreich hinbekommen. Es werden nur die Räume ausgegeben 😊
                        Blockly2.PNG

                        Leider funktioniert das erstellen der IDs in der zweiten Schleife noch nicht richtig, da hier nicht auf ein Element zugegriffen wird, sondern auf alle.
                        Der Datenpunkt "Speaker_aktiviert" ist vom Typ her als json definiert.

                        Blockly3.PNG

                        Könntet ihr mir bitte sagen, was ich falsch mache?

                        Homoran paul53 2 Replies Last reply Reply Quote 0
                        • Homoran
                          Homoran Global Moderator Administrators @Matthias I last edited by

                          @matthias-i du musst die neue Liste erst splitten nach , und dann entsprechend das i-te Element nehmen

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

                            @matthias-i sagte: was ich falsch mache?

                            Die Schleifen-Variable (Räume) an den Text anhängen - nicht die Liste.

                            Blockly_temp.JPG

                            M 1 Reply Last reply Reply Quote 0
                            • M
                              Matthias I @paul53 last edited by

                              @paul53
                              Das hat geklappt, super! Danke!
                              Ich erhalte jetzt die passenden IDs in einer Liste.
                              Nur für mein Verständnis, d.h. die Schleifenvariable entspricht dann während der Iteration dem Listenelement, richtig?

                              Versuche ich jetzt die Ausgabe zu realisieren (Blockly s.u.) indem ich die Variable "Ansagetext" ändere, erhalte ich immer folgenden error und keine Sprachausgabe:
                              Bild_2023-03-02_223454705.png

                              Die Variable alias.0.Sprachausgabe.Alexa_Devices.Buero ist als string definiert.

                              Blockly4.PNG

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

                                @matthias-i
                                Einer Variablen kann man in JS keinen expliziten Typen "zuweisen". JS ist untypisiert - die Typen werden implizit ermittelt.

                                Du hast hier wieder das gleiche Problem produziert.
                                Wenn Du durch die Liste iterierst, enthält i die einzelnen ID's - nicht "Wert vom Objekt x".

                                Vorausgesetzt, die Liste in "Speaker_ID_Liste" enthält eine Liste der zu verwendenden Lautsprecher, wäre es so richtiger:
                                7ab71c3a-d9b8-44ef-b6e2-601402a52331-image.png
                                Allerdings verstehe ich nicht, warum in "Wert" hier gerade eine 29 und kein Text steht, wie es der Name "Ansagetext" vermuten lässt.

                                M 1 Reply Last reply Reply Quote 0
                                • M
                                  Matthias I @Codierknecht last edited by

                                  @codierknecht
                                  Vielen Dank, jetzt hab ichs verstanden und es funktioniert 🙂
                                  Der Wert Test29 war nur zum internen Test, der wird jetzt natürlich durch sinnvolle Phrasen ersetzt 😉

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

                                  Support us

                                  ioBroker
                                  Community Adapters
                                  Donate

                                  815
                                  Online

                                  32.0k
                                  Users

                                  80.5k
                                  Topics

                                  1.3m
                                  Posts

                                  4
                                  15
                                  571
                                  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