Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. Blockly
    5. Script mit "externer" Datenquelle?

    NEWS

    • Wir empfehlen: Node.js 22.x

    • Neuer Blog: Fotos und Eindrücke aus Solingen

    • ioBroker goes Matter ... Matter Adapter in Stable

    Script mit "externer" Datenquelle?

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

      Hallo,

      ich nutze iobroker nun knapp 2 Jahre und möchte jetzt etwas tiefer in die "Programmierung" einsteigen. Bisher nutze ich nur kleinere Blockly-Scripte, wie "wenn der Aktor betätigt wird, schalte dieses Licht ein", oder "schalte die Heizung aus, wenn das Fenster geöffnet wird", usw.

      Jetzt kam mir die Idee, den CD-Spieler meiner Kinder gegen eine RFID-Jukebox zu ersetzen, wobei die Jukebox ein Amazon Echo ist und der RFID-Reader ein ESP8266 mit entsprechenden Modulen.

      Ich habe nun erreicht, dass beim Auflegen einer RFID-Karte ein MQTT-Datenpunkt mit der entsprechenden ID der Karte beschrieben wird. Auch habe ich ein Blockly, welches anhand dieser ID an Alexa den Befehl zum Abspielen einer Playlist schickt. Bei einigen wenigen Karten ist das so ja noch übersichtlich, aber sobald es in Richtung 20-30-50 Karten geht, wird das unübersichtlich zu pflegen.

      Aktuell sieht das Script mit nur zwei Karten-IDs so aus:
      a6ee8875-1a0a-4995-a94c-8d2051c5c572-image.png

      Jetzt kam mir der Gedanke, eine "externe" Datenquelle anzubinden. In dieser Datenquelle sind anhand der Karten-ID die Quelle (z.b. Spotify oder Amazon Music) und der zugehörige Alexa-Befehl hinterlegt (z.B. "Spiele Playlist Leo Lausemaus Folge 1"). Legt mein Sohn die Karte mit der ID 6970fbb2 auf, soll sich das Script aus der Datenquelle die Quelle und den Befehl für Alexa raussuchen und in die Variablen schreiben, welche dann im Script weiterverwendet werden.

      Wie erreiche ich das und mit welcher Datenquelle?
      In Powershell würde ich jetzt als Datenquelle vermutlich eine XML schreiben und diese dann zur Laufzeit einlesen. Hier bin ich allerdings überfragt.
      Auf meine Synology hätte ich eine MariaDB (MySQL), aber ich habe nichts gefunden, wie man sowas lösen könnte.
      Dann ist mir noch der Gedanke gekommen, dass ich ja die ganzen Karten als Datenpunkte unter userdata pflegen könnte, aber auch hier habe ich nichts gefunden, wie man einen ganzen Ordner einlesen kann und vor allem auch als zweidimensionalen Array speichern kann.

      Jemand eine Idee?

      Viele Grüße
      Tobias

      paul53 F 2 Replies Last reply Reply Quote 0
      • paul53
        paul53 @gfacek last edited by

        @gfacek sagte:

        wie man einen ganzen Ordner einlesen kann

        Das kann man mittels $Selector.

        1 Reply Last reply Reply Quote 0
        • F
          fastfoot @gfacek last edited by

          @gfacek
          Du kannst auch eine JSON Datei nehmen und diese in einen DP schreiben, oder wie im Beispiel in die Variable kopieren

          {"ids":{
          	"1":{"quelle":"Spotify","text":"dein Spotify-text"},
          	"2":{"quelle":"Alexa","text":"dein Alexa text"},
          	"3":{"quelle":"q3","text":"dein q3 text"},
          	"4":{"quelle":"q4","text":"dein q4 text"},
          	"5":{"quelle":"q5","text":"dein q5 text"},
          	"6":{"quelle":"q6","text":"dein q6 text"},
          	"7":{"quelle":"q7","text":"dein q7 text"}
          	}
          }
          


          Playlist.PNG

          <xml xmlns="https://developers.google.com/blockly/xml">
           <variables>
             <variable id="l_jvAv:PhxbM^cb/RDzo">playlist</variable>
             <variable id="qt6*k+lUe.p)g5:4]Nc,">rfid</variable>
             <variable id="$UBA1-GrM6`Q.9S*W!4~">attrQuelle</variable>
             <variable id="bNnZ60e)%r_{09Oa}Lh_">attrText</variable>
           </variables>
           <block type="variables_set" id="`uX%8zgL*1XT+w5dO]o:" x="187" y="163">
             <field name="VAR" id="l_jvAv:PhxbM^cb/RDzo">playlist</field>
             <value name="VALUE">
               <block type="text" id="=@ljuCt?@!uiRo77@`SY">
                 <field name="TEXT">{"ids":{ 	"1":{"quelle":"Spotify","text":"dein Spotify-text"}, 	"2":{"quelle":"Alexa","text":"dein Alexa text"}, 	"3":{"quelle":"q3","text":"dein q3 text"}, 	"4":{"quelle":"q4","text":"dein q4 text"}, 	"5":{"quelle":"q5","text":"dein q5 text"}, 	"6":{"quelle":"q6","text":"dein q6 text"}, 	"7":{"quelle":"q7","text":"dein q7 text"} 	} }</field>
               </block>
             </value>
             <next>
               <block type="variables_set" id="b_`OB:ogVoMrQ{HvSYBw">
                 <field name="VAR" id="qt6*k+lUe.p)g5:4]Nc,">rfid</field>
                 <value name="VALUE">
                   <block type="text" id="39IN.Ik}zL#]Y#!sC7a,">
                     <field name="TEXT">2</field>
                   </block>
                 </value>
                 <next>
                   <block type="variables_set" id="!M:5#dupo0Fsd]@`#CQt">
                     <field name="VAR" id="$UBA1-GrM6`Q.9S*W!4~">attrQuelle</field>
                     <value name="VALUE">
                       <block type="text_join" id="#WGT+[?V|Rc##$(%S3jJ" inline="true">
                         <mutation items="3"></mutation>
                         <value name="ADD0">
                           <block type="text" id="@ymonzpPZ1gibX,kY]wb">
                             <field name="TEXT">ids.</field>
                           </block>
                         </value>
                         <value name="ADD1">
                           <block type="variables_get" id="AG13{EZrkxczLuKdO)n(">
                             <field name="VAR" id="qt6*k+lUe.p)g5:4]Nc,">rfid</field>
                           </block>
                         </value>
                         <value name="ADD2">
                           <block type="text" id="d,sF0sWtB.x9mDbBtDP~">
                             <field name="TEXT">.quelle</field>
                           </block>
                         </value>
                       </block>
                     </value>
                     <next>
                       <block type="variables_set" id="1c:/p~P0FkQ.syX:-2O@">
                         <field name="VAR" id="bNnZ60e)%r_{09Oa}Lh_">attrText</field>
                         <value name="VALUE">
                           <block type="text_join" id="I`-50W-r=)C#iv?,YDR/" inline="true">
                             <mutation items="3"></mutation>
                             <value name="ADD0">
                               <block type="text" id="%1brly3:(B3|~9J|)`Gz">
                                 <field name="TEXT">ids.</field>
                               </block>
                             </value>
                             <value name="ADD1">
                               <block type="variables_get" id="{QDfoCc+VBsNR4-u;[^B">
                                 <field name="VAR" id="qt6*k+lUe.p)g5:4]Nc,">rfid</field>
                               </block>
                             </value>
                             <value name="ADD2">
                               <block type="text" id="t@A#1RS},[$v-j[IWnSx">
                                 <field name="TEXT">.text</field>
                               </block>
                             </value>
                           </block>
                         </value>
                         <next>
                           <block type="debug" id="Gtb^t/7imSvzEzF}4IOl" inline="true">
                             <field name="Severity">log</field>
                             <value name="TEXT">
                               <shadow type="text" id="!uXgISDN)EF.IN$o7XW,">
                                 <field name="TEXT">test</field>
                               </shadow>
                               <block type="get_attr" id="UxCy}eF6Qj!(aM;`I-h=">
                                 <value name="PATH">
                                   <shadow type="text" id="NGzF19.X17ubJ~]pFM_)">
                                     <field name="TEXT"></field>
                                   </shadow>
                                   <block type="variables_get" id="z4!MiXm5j6)f.-7L!c$d">
                                     <field name="VAR" id="$UBA1-GrM6`Q.9S*W!4~">attrQuelle</field>
                                   </block>
                                 </value>
                                 <value name="OBJECT">
                                   <block type="variables_get" id="A}@{-y?u|ePD)[eeRGh@">
                                     <field name="VAR" id="l_jvAv:PhxbM^cb/RDzo">playlist</field>
                                   </block>
                                 </value>
                               </block>
                             </value>
                             <next>
                               <block type="debug" id="n!H17p]i_3hn|Hiv;Ob-" inline="true">
                                 <field name="Severity">log</field>
                                 <value name="TEXT">
                                   <shadow type="text">
                                     <field name="TEXT">test</field>
                                   </shadow>
                                   <block type="get_attr" id="Oc(ALK1;`x.{vld0K76F">
                                     <value name="PATH">
                                       <shadow type="text" id="7O~EjP35uf])4ls6-`Xy">
                                         <field name="TEXT"></field>
                                       </shadow>
                                       <block type="variables_get" id="/=mQnU,c5hr_+o~BPKSq">
                                         <field name="VAR" id="bNnZ60e)%r_{09Oa}Lh_">attrText</field>
                                       </block>
                                     </value>
                                     <value name="OBJECT">
                                       <block type="variables_get" id="e}Tk7B4|w4Aa_v(vC90!">
                                         <field name="VAR" id="l_jvAv:PhxbM^cb/RDzo">playlist</field>
                                       </block>
                                     </value>
                                   </block>
                                 </value>
                               </block>
                             </next>
                           </block>
                         </next>
                       </block>
                     </next>
                   </block>
                 </next>
               </block>
             </next>
           </block>
          </xml>
          

          1 Reply Last reply Reply Quote 0
          • G
            gfacek last edited by

            Vielen Dank für die beiden Vorschläge. Ich schaue mir beides einmal an.

            @paul53
            Die Variante mit dem $Selector habe ich in irgendeinem Script schon einmal gesehen. Vielleich habe ich das noch irgendwo in meinen Drafts.

            @fastfoot
            Spontan ist das für mich am nachvollziehbarsten. Zumindest scheinbar die am schnellsten umsetzbare Lösung.

            1 Reply Last reply Reply Quote 0
            • G
              gfacek last edited by

              @fastfoot
              Puh, jetzt muss ich doch mal doof fragen. Grundsätzlich funktioniert dein Vorschlag.
              Ich habe variable "playlist" jetzt so wie bei dir manuell reinkopiert. Das läuft schon mal.
              Wenn ich das JSON jetzt in einen Datenpunkt verwalten möchte...wie würde ich das dann am geschicktesten machen?

              F 1 Reply Last reply Reply Quote 0
              • F
                fastfoot @gfacek last edited by

                @gfacek Du legst einen DP unter 0_userdata.0 an (type=string) und kopierst das json da rein. ich persönlich sehe da aber keinen Vorteil drin, weil es sich da super schlecht bearbeitenn lässt. Wenn du es dann doch aus einem textfile kopierst, kannst du es auch gleich in die Variable kopieren.

                1 Reply Last reply Reply Quote 0
                • G
                  gfacek last edited by gfacek

                  Ah, ok. Ich dachte, dass es sich dann ähnlich komfortabel verwalten lässt, wie in deinem Codeschnipsel oben. Aber hast recht, dann kann ich es gleich lieber in einer Textdatei verwalten und wenn ich Änderungen habe, einfach per Copy/Paste in die Variable stecken.

                  Insgesamt bin ich erstmal so zufrieden mit...vielen Dank!

                  So sieht es derzeit aus:
                  8e76ea32-fc7f-468d-9013-f3fb2e9484e5-image.png

                  var playlist, rfid, attrQuelle, attrText;
                  
                  
                  playlist = '{"ids":{ 	"6970fbb2":{"quelle":"Spotify","text":"Spiele Playlist Sommer"}, 	"a90212b4":{"quelle":"Alexa","text":"Spiele Lollipop"} 	} }';
                  on({id: "mqtt.0.rfid_reader.uid"/*/rfid_reader/uid*/, change: "any"}, function (obj) {
                    var value = obj.state.val;
                    var oldValue = obj.oldState.val;
                    console.log(('Karten-ID = ' + String((obj.state ? obj.state.val : ""))));
                    rfid = (obj.state ? obj.state.val : "");
                    attrQuelle = ['ids.',rfid,'.quelle'].join('');
                    attrText = ['ids.',rfid,'.text'].join('');
                    console.log((['Quelle = ',String(getAttr(playlist, attrQuelle)),'// Alexa-Befehl = ',String(getAttr(playlist, attrText))].join('')));
                    if (String(getAttr(playlist, attrQuelle)) == 'Spotify') {
                      setState("alexa2.0.Echo-Devices.G0911M1001330NV7.Music-Provider.Spotify-Playlist"/*Playlist to play with Spotify*/, (String(getAttr(playlist, attrText))));
                    }
                    if (String(getAttr(playlist, attrQuelle)) == 'AmazonMusic') {
                      setState("alexa2.0.Echo-Devices.G0911M1001330NV7.Music-Provider.Amazon-Music"/*Phrase to play with Amazon Music*/, (String(getAttr(playlist, attrText))));
                    }
                  });
                  

                  F 1 Reply Last reply Reply Quote 0
                  • F
                    fastfoot @gfacek last edited by

                    @gfacek Du kannst die Id's auch direkt von der Datei einlesen, falls sie in der Shell zugänglich ist
                    Playlist1.PNG

                    1 Reply Last reply Reply Quote 0
                    • G
                      gfacek last edited by

                      Coole Idee...muss ich mal gucken, was am Ende einfacher ist. Ob ich eher auf iobroker:8081 und dort unter Scripts gehe, oder ob ich irgendwie über winscp an die Datei im Filesystem vom iobroker gehe.
                      Wenn ich den Weg über die Anpassung des Scripts gehe, muss ich das dann auch speichern und somit wird die Variable dann auch gleich eingelesen.

                      Aktuell bin ich erstmal zufrieden mit der Lösung.

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

                      Support us

                      ioBroker
                      Community Adapters
                      Donate

                      821
                      Online

                      32.0k
                      Users

                      80.4k
                      Topics

                      1.3m
                      Posts

                      3
                      9
                      485
                      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