Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. [gelöst]Variablen Übergabe aus MODBUS an Homematic

    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

    [gelöst]Variablen Übergabe aus MODBUS an Homematic

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

      @paul53:

      Vorschlag:

      const idSrc = "modbus.0.holdingRegisters.214_REG_HC_TEMP_IN2";
      const idDst = "hm-rega.0.31793";
      
      setState(idDst, getState(idSrc).val); // Scriptstart
      
      on(idSrc, idDst); // Aktualisierung bei Wertänderung
      ```` `  
      

      super, das klappt.

      EDIT:

      ! Mühsam ernährt sich das Eichhörnchen… bin ja noch Anfänger, habe ne Menge gelesen, aber noch nicht alles verstanden. Die Änderungen mit on{} hingegen schon... 🙂
      ! Wie bekomme ich aber den Austausch z.B. alle 15min hin? im Blockly brech ich mir die Finger, bekomme von der Idee her als Bsp:

      Intervall = setInterval(function () {
      .....
      }, 900000);
      >! ````
      >! und dann? ich kann ja nicht 1:1 copy & paste machen - kann doch nicht richtig sein - die Fkt on in einem Zeitintervall aufzurufen…
      ich war zu doof. Ich rufe das Skript jetzt alle 15min auf:
      ```
      `[code]Intervall = setInterval(function () {
      	setState(idDst, getState(idSrc).val);
      },900000);
      [/code]`
      richtig?
      ```
      1 Reply Last reply Reply Quote 0
      • M
        mguenther last edited by

        Ist eine Übergabe eigentlich auch in beide Richtungen möglich? so in etwa?

        const idSrc1 = "modbus.0.holdingRegisters.214_REG_HC_TEMP_IN2";
        const idDst1 = "hm-rega.0.31793";
        const idSrc2 = "modbus.0.holdingRegisters.213_REG_HC_TEMP_IN1";
        const idDst2 = "hm-rega.0.31794";
        const idSrc3 = "hm-rega.0.31807";
        const idDst3 = "modbus.0.holdingRegisters.100_REG_FAN_SPEED_LEVEL";
        
        Intervall = setInterval(function () {
        	setState(idDst1, getState(idSrc1).val); // Scriptstart
        	setState(idDst2, getState(idSrc2).val); // Scriptstart
         	setState(idDst3, getState(idSrc3).val); // Scriptstart
            }, 900000);
        

        mein "hm-rega.0.31807" nimmt den Wert nicht an… 😞

        kann das intervall eigentlich auch in einr Schleife ausgeführt werden? Wahrscheinlich muss ich den Variablenname irgendwie zusammensetzen

        sowas in etwa:

        for i=1 to 3

        setState(idDst_i, getState(idSrc_i).val); // Scriptstart

        ohje, lang ists her mit meinen Programmierkenntnissen..

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

          @mguenther:

          Ich rufe das Skript jetzt alle 15min auf: `
          Weshalb das ? Eine Aktualisierung des Wertes in der SV genügt immer dann, wenn sich der Wert der Quelle ändert. Das macht

          on(idSrc, idDst); // Aktualisierung bei Wertänderung
          

          @mguenther:

          Ist eine Übergabe eigentlich auch in beide Richtungen möglich? so in etwa? `
          Ja.
          @mguenther:

          mein "hm-rega.0.31807" nimmt den Wert nicht an… 😞 `
          Das ist die Quelle (idSrc3).
          @mguenther:

          kann das intervall eigentlich auch in einr Schleife ausgeführt werden? Wahrscheinlich muss ich den Variablenname irgendwie zusammensetzen `
          Nein, den Variablennamen kann man nicht zusammensetzen.

          1 Reply Last reply Reply Quote 0
          • M
            mguenther last edited by

            @paul53:

            Weshalb das ? Eine Aktualisierung des Wertes in der SV genügt immer dann, wenn sich der Wert der Quelle ändert. Das macht

            on(idSrc, idDst); // Aktualisierung bei Wertänderung
            ```` `  
            

            Modbus prüft alle 5sek(?) den Status und schreibt den WErt quasi neu. Dieser wird dann auch immer an die CCU übertragen. Ich dachte, ich ruf aber nur alle 15min den Wert auf, um die CCU nicht "vollzuballern"…

            Ich übertrage ja auch nicht nur ein Wert, sondern eben mehrere...

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

              @mguenther:

              Modbus prüft alle 5sek(?) den Status und schreibt den WErt quasi neu. `
              Es wird sich aber nicht alle 5 s der <u>Wert</u> ändern ? Es wird nur getriggert und an die CCU gesendet, wenn sich der Wert ändert !

              1 Reply Last reply Reply Quote 0
              • M
                mguenther last edited by

                doch, genau das geschieht. Hätte ich vorher auch nicht gedacht. z.B. springt ein Wert immer um 22.1°. Mal ist er 22.2°, mal 22.1°, dann wieder 22.0° usw. Ich hatte zuerst gesucht, ob ich z.B. die Temperatur nur in 0.5er Schritten mir auswerten lassen kann, habs aber nicht hinbekommen.

                hier mal ein Screenshot der Variablen in HM:
                6305_prot_hm.png

                teilweise sind es sogar auch 2sec. Die 5 sec waren von mir vorhin geschätzt…

                1 Reply Last reply Reply Quote 0
                • M
                  mguenther last edited by

                  gibt es ne Möglichkeit, den Wert auf 0.5° zu runden? Ich kenne von früher noch die Möglichkeit mit Wert verdoppeln (22.2 –> 44.4), runden (44.4 --> 44.0), halbieren (44.0 -> 22.0) oder 21.7 --> 43,4, 43.4 -->43, 43-->21.5

                  nur, wie setz ich das um?

                  der Rest klappt übrigens spitze - danke dir....

                  1 Reply Last reply Reply Quote 0
                  • M
                    mguenther last edited by

                    etwas googlen und Grips anstrengen sollte auch noch bei mir helfen:

                    EDIT:

                    […]

                    const idSrc1 = "modbus.0.holdingRegisters.214_REG_HC_TEMP_IN2";
                    const idDst1 = "hm-rega.0.31793";
                    const idSrc2 = "modbus.0.holdingRegisters.213_REG_HC_TEMP_IN1";
                    const idDst2 = "hm-rega.0.31794";
                    const idSrc3 = "hm-rega.0.31807";
                    const idDst3 = "modbus.0.holdingRegisters.100_REG_FAN_SPEED_LEVEL";
                    
                    var idSrc1_1 = Math.round(getState(idSrc1).val*2)/2;
                    var idSrc2_1 = Math.round(getState(idSrc2).val*2)/2;
                    setState(idDst1, idSrc1_1); // Scriptstart
                    setState(idDst2, idSrc2_1); // Scriptstart
                    setState(idDst3, getState(idSrc3).val); // Scriptstart
                    on(idSrc1_1, idDst1); // Aktualisierung bei Wertänderung
                    on(idSrc2_1, idDst2); // Aktualisierung bei Wertänderung
                    on(idSrc3, idDst3); // Aktualisierung bei Wertänderung
                    

                    so müsste es funktioneren

                    danke paul

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

                      @mguenther:

                      gibt es ne Möglichkeit, den Wert auf 0.5° zu runden? `

                      val1 = Math.round(2 * val1) / 2;
                      
                      1 Reply Last reply Reply Quote 0
                      • M
                        mguenther last edited by

                        @paul53:

                        @mguenther:

                        gibt es ne Möglichkeit, den Wert auf 0.5° zu runden? `

                        val1 = Math.round(2 * val1) / 2;
                        ```` `  
                        

                        habe in dem Post über dir "meine" Lsg abgeändert. Danke an dich!! Spitzenforum hier…

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

                          @mguenther:

                          dachte, so müsste es funktioneren `
                          Leider nicht so richtig.

                          const idSrc1 = "modbus.0.holdingRegisters.214_REG_HC_TEMP_IN2";
                          const idDst1 = "hm-rega.0.31793";
                          const idSrc2 = "modbus.0.holdingRegisters.213_REG_HC_TEMP_IN1";
                          const idDst2 = "hm-rega.0.31794";
                          const idSrc3 = "hm-rega.0.31807";
                          const idDst3 = "modbus.0.holdingRegisters.100_REG_FAN_SPEED_LEVEL";
                          
                          var val1 = Math.round(2 * getState(idSrc1).val) / 2;
                          var val2 = Math.round(2 * getState(idSrc2).val) / 2;
                          
                          setState(idDst1, val1); // Scriptstart
                          setState(idDst2, val2); // Scriptstart
                          setState(idDst3, getState(idSrc3).val); // Scriptstart
                          
                          on(idSrc1, function(dp) {
                             var val = Math.round(2 * dp.state.val) / 2;
                             if(val != val1) {
                                setState(idDst1, val);
                                val1 = val;
                             }   
                          });
                          on(idSrc2, function(dp) {
                             var val = Math.round(2 * dp.state.val) / 2;
                             if(val != val2) {
                                setState(idDst2, val);
                                val2 = val;
                             }   
                          });
                          on(idSrc3, idDst3); // Aktualisierung bei Wertänderung
                          
                          
                          1 Reply Last reply Reply Quote 0
                          • M
                            mguenther last edited by

                            habs gerade gemerkt - Ich probiere es weiter… 😄

                            EDIT:

                            funzt... danke!

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

                            Support us

                            ioBroker
                            Community Adapters
                            Donate

                            422
                            Online

                            31.9k
                            Users

                            80.2k
                            Topics

                            1.3m
                            Posts

                            3
                            17
                            3695
                            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