Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. JavaScript
    5. Mehrere Variablen übergeben (Stapelverarbeitung)

    NEWS

    • Neuer Blog: Fotos und Eindrücke aus Solingen

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

    • ioBroker goes Matter ... Matter Adapter in Stable

    Mehrere Variablen übergeben (Stapelverarbeitung)

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

      Hallo zusammen,

      mit JS und Blockly habe ich noch nicht viel zu tun. Wie ist es möglich mehrere Variablen von einem Objekt in ein anderes zu schieben und diese aktualisieren sich bei Wertänderung?

      Beispiel:
      ich hab im Objekt "mqtt/0/Wechselrichter/..." 20 Variablen mit Real und Bool. Diese möchte ich in ein anderes Objekt "beckhoff/0/plc/..." schieben. Dabei sollen sich die Werte wenn möglich zyklisch oder bei Wertänderung aktualisieren.

      Ich habe hierzu auch schon ein Beispiel gefunden. Allerdings nur für eine Variable. Muss ich jetzt für jede Variable ein script anlegen? Das geht doch bestimmt auch einfacher.

      // Wert lesen
      const idSrc = 'mqtt.0.inverter.HM1500.ch0.YieldTotal'/*inverter/HM1500/ch0/YieldTotal*/;
      // Wert schreiben
      const idDst = 'beckhoff.0.plc.GVL_iobroker.stPhotovoltaik.iYieldTotal'/*iYieldTotal [REAL]*/;
       
      // Skriptstart
      setState(idDst, getState(idSrc).val);
       
      // Aktualisierung bei Wertänderung
      on(idSrc, function(dp) {
         setState(idDst, dp.state.val);
      });
      
      paul53 1 Reply Last reply Reply Quote 0
      • paul53
        paul53 @blackforst last edited by paul53

        @blackforst sagte: Das geht doch bestimmt auch einfacher.

        Man kann zwei korrespondierende ID-Arrays erstellen.

        const idsSrc = [ 
           'mqtt.0.inverter.HM1500.ch0.YieldTotal'/*inverter/HM1500/ch0/YieldTotal*/,
           // usw.
        ];
        const idsDst = [
           'beckhoff.0.plc.GVL_iobroker.stPhotovoltaik.iYieldTotal'/*iYieldTotal [REAL]*/,
           // usw.
        ];
        
        // Skriptstart
        for(let i = 0; i < idsSrc.length; i++) {
           setState(idsDst[i], getState(idsSrc[i]).val);
        }
        
        // Wertänderung
        on(idsSrc, function(dp) {
           let idx = idsSrc.indexOf(dp.id);
           setState(idsDSt[idx], dp.state.val);
        });
        
        B 1 Reply Last reply Reply Quote 0
        • B
          blackforst @paul53 last edited by

          @paul53 Aktualisiert er dann auch die Werte innerhalb des Arrays bzw. Struct? Wenn sich dann z.B. auch nur ein Wert davon ändert?

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

            @blackforst sagte: Aktualisiert er dann auch die Werte innerhalb des Arrays bzw. Struct? Wenn sich dann z.B. auch nur ein Wert davon ändert?

            Es kann (zu einem Zeitpunkt) immer nur ein Datenpunkt triggern. Vom aktuellen Trigger-DP wird der Index in das Array ermittelt und der zugehörige Ziel-DP mit dem Wert des Trigger-DP geschrieben. Die Arrays enthalten keine Werte, sondern Datenpunkt-IDs.

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

              @paul53 Hallo paul53, ich habe jetzt ein bisschen probiert. Hast du da ein Beispiel in wie das in iobroker und JS aussieht?
              Ich möchte aus der mqtt-Struktur die PV Panel 1-4 in die PLC-Struktur schieben.

              Gruß
              blackfrost
              mqtt.png plc.png

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

                @blackforst

                PV-Panel 1 ist "ch0"?

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

                  @paul53 Ch0 sind die Werte des Wechselrichters

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

                    @blackforst sagte: Ch0 sind die Werte des Wechselrichters

                    Also "ch1" bis "ch4"?
                    Ohne das kleine "i" in der Ziel-ID wäre es sehr einfach mit einem $-Selektor und replace():

                    const idsSrc = $('mqtt.0.inverter.HM1500.ch*');
                    
                    idsSrc.on(function(dp) {
                        if(!dp.id.includes('.ch0.')) {
                            let idDst = dp.id.replace('mqtt.0.inverter.HM1500.ch', 'beckhoff.0.plc.GVL_iobroker.stPhotovoltaik.stPhotoZelle');
                            setState(idDst, dp.state.val);
                        }
                    });
                    

                    Mit dem kleinen "i" erstelle zwei Arrays mit je 24 Datenpunkt-IDs in gleicher Reihenfolge.

                    EDIT: Oder verwende für jedes Panel einen eigenen Trigger:

                    $('mqtt.0.inverter.HM1500.ch1.*').on(function(dp) {
                        let idDst = dp.id.replace('mqtt.0.inverter.HM1500.ch1.', 'beckhoff.0.plc.GVL_iobroker.stPhotovoltaik.stPhotoZelle1.i');
                        setState(idDst, dp.state.val);
                    });
                    
                    $('mqtt.0.inverter.HM1500.ch2.*').on(function(dp) {
                        let idDst = dp.id.replace('mqtt.0.inverter.HM1500.ch2.', 'beckhoff.0.plc.GVL_iobroker.stPhotovoltaik.stPhotoZelle2.i');
                        setState(idDst, dp.state.val);
                    });
                    
                    $('mqtt.0.inverter.HM1500.ch3.*').on(function(dp) {
                        let idDst = dp.id.replace('mqtt.0.inverter.HM1500.ch3.', 'beckhoff.0.plc.GVL_iobroker.stPhotovoltaik.stPhotoZelle3.i');
                        setState(idDst, dp.state.val);
                    });
                    
                    $('mqtt.0.inverter.HM1500.ch4.*').on(function(dp) {
                        let idDst = dp.id.replace('mqtt.0.inverter.HM1500.ch4.', 'beckhoff.0.plc.GVL_iobroker.stPhotovoltaik.stPhotoZelle4.i');
                        setState(idDst, dp.state.val);
                    });
                    
                    1 Reply Last reply Reply Quote 0
                    • First post
                      Last post

                    Support us

                    ioBroker
                    Community Adapters
                    Donate

                    903
                    Online

                    31.9k
                    Users

                    80.1k
                    Topics

                    1.3m
                    Posts

                    javascript
                    2
                    8
                    374
                    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