Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. Bitfield übersetzen/konvertieren

    NEWS

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

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    Bitfield übersetzen/konvertieren

    This topic has been deleted. Only users with topic management privileges can see it.
    • D
      darkbrain85 @paul53 last edited by darkbrain85

      @paul53

      Das scheint vorerst zu klappen! Ich konnte jetzt spontan nur die Pumpen testen, da ich den Verdichter nicht unnötig starten will, aber es sieht gut aus!

      Vielen vielen Dank für Deine Unterstützung! 👍

      Edit: Jetzt konnte ich fast alle Werte testen! Läuft!

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

        @paul53

        Hallo
        Ich stelle mich eigentlich bei copy&paste nicht so schusselig an, aber nun habe ich doch etwas viel Zeit mit lesen und probieren aufgewendet und wäre um direkte Hilfe froh.

        Ich möchte den Betriebsstatus (sowie weitere Daten) meines Stiebel-Eltron Wärmepumpen ISG auslesen und in er InfluxDB speichern und die Informationen zur neunen E3/DC PV-Anlage gegenüber zu stellen.

        Ich denke ich habe alles wie beschrieben eingetragen und entsprechend angepasst. Aber auch bei mir sind alle Werte aus JS auf false.

        Wenn ich diese Werte parallel in node-red (16Bit Array) auslese habe ich den 2. Wert auf true.

        Ich vermute, ich habe ein Durcheinander mit der ID oder Namen im JS gemacht.
        Ich habe schon mehrere Varianten ausprobiert aber nun seh ich vor lauter Bäumen den Wald nicht mehr.

        Nachfolgend Screenshots meiner Eingaben.

        Bildschirmfoto 2021-05-20 um 19.35.03.png
        Bildschirmfoto 2021-05-20 um 19.33.54.png
        Bildschirmfoto 2021-05-20 um 19.35.41.png
        Bildschirmfoto 2021-05-20 um 19.34.36.png

        Danke vielmal

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

          @schwabe_ch
          Die ID des Triggers stimmt nicht.

          const idModbus = 'modbus.0.inputRegisters.32500_Betriebstatus';
          

          Als Zielordner würde ich angeben:

          const idWp = '0_userdata.0.Waermepumpe.Betriebstatus.';
          

          Bitte Code immer in Code tags posten!

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

            @paul53

            Danke für die superschnelle Antwort. 😉

            Ich habe alles vorhandene entfernt und "neu angefangen".
            Dabei ist schon mal ein Fehler von mir aufgefallen. Betriebsstatus mit 2 * s. 😞

            // Binärwert 12 Bit decodieren und in Datenpunkte schreiben
            const idModbus = 'modbus.0.inputRegisters.32500_Betriebsstatus'; // ID zuweisen !
            const idWP = '0_userdata.0.Waermepumpe.Betriebsstatus.';
            const idsWP = [
               'B0_HK1_Pumpe',
               'B1_HK2_Pumpe',
               'B2_Aufheizprogramm',
               'B3_NHZ_Stufen_in_Betieb',
               'B4_WP_im_Heizbetrieb',
               'B5_WP_im_Warmwasserbetrieb',
               'B6_Verdichter_in_Betrieb',
               'B7_Sommerbetrieb_aktiv',
               'B8_Kuehlbetrieb_aktiv',
               'B9_Abtauen',
               'B10_Silentmode1',
               'B11_Silentmode2'
            ];
            
            for(let i = 0; i < idsWP.length; i++) {
               createState(idWP + idsWP[i], false, {type: 'boolean', name: idsWP[i], read: true, write: false});
            }
            
            on(idModbus, function(dp) {
               let val = dp.state.val;
               for(let i = 0; i < idsWP.length; i++) {
                   setState(idWP + idsWP[i], !!(val & 1), true);
                   val = val >> 1;
               }
            });
            

            Das Ergebnis ist jedoch immer noch alles "false".

            Bildschirmfoto 2021-05-24 um 11.36.07.png

            Node-red zeigt mir aber

            24.5.2021, 11:33:56node: 7702536.90156ac
            msg.payload : array[16]
            array[16]
            [0 … 9]
            0: false
            1: true
            2: false
            3: false
            4: false
            5: false
            6: false
            7: false
            8: false
            9: false
            [10 … 15]
            10: false
            11: false
            12: false
            13: false
            14: false
            15: false

            Was wiederum mit "modbus.0.inputRegisters.32500_Betriebsstatus" als Ausgabewert 2 übereinstimmen würde.

            Liegt es evtl. am Datentype - Unsigned 16 bit

            Bildschirmfoto 2021-05-24 um 11.58.38.png

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

              @schwabe_ch sagte: Das Ergebnis ist jedoch immer noch alles "false".

              Hat sich denn der Wert von "modbus.0.inputRegisters.32500_Betriebsstatus" mal geändert? Es wird nur bei Wertänderung getriggert.

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

                @schwabe_ch
                Wenn schon bei Skriptstart die richtigen Werte gesetzt werden sollen, verwende eine Funktion, die auch bei Skriptstart aufgerufen wird.

                // Binärwert 12 Bit decodieren und in Datenpunkte schreiben
                const idModbus = 'modbus.0.inputRegisters.32500_Betriebsstatus'; // ID zuweisen !
                const idWP = '0_userdata.0.Waermepumpe.Betriebsstatus.';
                const idsWP = [
                   'B0_HK1_Pumpe',
                   'B1_HK2_Pumpe',
                   'B2_Aufheizprogramm',
                   'B3_NHZ_Stufen_in_Betieb',
                   'B4_WP_im_Heizbetrieb',
                   'B5_WP_im_Warmwasserbetrieb',
                   'B6_Verdichter_in_Betrieb',
                   'B7_Sommerbetrieb_aktiv',
                   'B8_Kuehlbetrieb_aktiv',
                   'B9_Abtauen',
                   'B10_Silentmode1',
                   'B11_Silentmode2'
                ];
                
                function word2bits(val) {
                   for(let i = 0; i < idsWP.length; i++) {
                       if(existsState(idWP + idsWP[i])) setState(idWP + idsWP[i], !!(val & 1), true);
                       else createState(idWP + idsWP[i], !!(val & 1), {type: 'boolean', name: idsWP[i], read: true, write: false});
                       val = val >> 1;
                   }
                }
                 
                word2bits(getState(idModbus).val); // Skriptstart
                on(idModbus, function(dp) {
                   word2bits(dp.state.val);
                });
                
                S H 2 Replies Last reply Reply Quote 0
                • S
                  Schwabe_CH @paul53 last edited by

                  @paul53

                  Ein grosses DANKESCHÖN !! 😉

                  bfc2c3de-2eed-4cba-9a6b-e71d3de1b0cd-image.png

                  Bildschirmfoto 2021-05-24 um 13.15.19.png

                  Nun kann ich weitermachen mit meinem kleinen Projekt.

                  Noch einen schönen Pfingstmontag.

                  mickym 1 Reply Last reply Reply Quote 0
                  • mickym
                    mickym Most Active @Schwabe_CH last edited by

                    @schwabe_ch Wenn Du eh mit NodeRed arbeitest, da gibts eine tolle Buffer Node. 😉

                    S 1 Reply Last reply Reply Quote 1
                    • S
                      Schwabe_CH @mickym last edited by

                      @mickym
                      Danke für den Hinweis.
                      „Mit Nodered arbeitest“ das wäre zu schön, für den Moment war es das Produkt welches mir im Zusammenhang mit Modbus als erstes in die Finger kam. Wir haben seit 2 Monaten eine E3/DC Pro . Damit fing das ganze an. Nun taste ich mich langsam vor.
                      Buffer Node? Hast Du mir wohl einen Link dazu, unter suchen erhalte ich 50 Seiten 😎 wo finde ich mehr Informationen?

                      mickym 1 Reply Last reply Reply Quote 0
                      • mickym
                        mickym Most Active @Schwabe_CH last edited by mickym

                        @schwabe_ch
                        Man muss bissi ausprobieren, aber ich finde die Node ziemlich mächtig. Anhand der Screenshots kannst Dir ja schon mal ein Eindruck verschaffen und ist ja auch schnell installiert bzw. wieder deinstalliert.

                        https://flows.nodered.org/node/node-red-contrib-buffer-parser

                        Auf der Seite sind auch einige Beispielflows zum Testen.

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

                          @paul53 Hi danke für das Skript,
                          funktioniert einwandfrei zum Lesen. Gibt es noch eine Möglichkeit dass ich auch Schreiben kann in die Einzelnen Bit? Ich will darüber ein und aus befehle an eine Steuerung mit Codesys schicken.
                          Viele Grüße Helmut

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

                            @helmutlinner sagte: Möglichkeit dass ich auch Schreiben kann in die Einzelnen Bit?

                            Siehe hier.

                            function writeBit(val, set, bit) {
                               let x = 1  << bit;
                               if(set) return val | x;
                               return val & ~x;
                            }
                            
                            1 Reply Last reply Reply Quote 0
                            • wendy2702
                              wendy2702 @darkbrain85 last edited by wendy2702

                              @darkbrain85 sagte in Bitfield übersetzen/konvertieren:

                              Hi!

                              Ich habe ein kniffeliges Problem, bei dem ihr mir sicher behilflich sein könnte.

                              Ich lese meine Waterkotte Wärmepumpe per Modbus aus. Dabei erhalte ich auch diverse Werte. Funktioniert sehr gut.

                              Den Zustand einzelner Komponenten kann ich allerdings nur als bitfield in einem gemeinsamen Register abrufen. Hier erhalte ich einen Integer Wert den ich entsprechend interpretieren müsste.
                              Hier mal die Liste aus der Doku:

                              521d80f2-9fb9-4fa1-8e78-15e4b396b5bb-image.png

                              Ich müsste also den Integer Wert übersetzen und dann die einzelnen Zustände zuordnen.
                              Beim Betrieb der Heizungsumwälzpumpe erhalte ich z.B. den Wert 2.

                              Gibt es dafür irgendwo ein Beispiel, oder kann mir da jemand auf die Sprünge helfen?

                              Danke Euch jetzt schon!

                              Ist zwar schon was älter aber gerade erst gesehen.

                              Kannst du mir sagen welche WP das ist, welches Register und wie eingestellt im Adapter?

                              Hast du eine Übersicht über alle Register die man lesen/schreiben kann?

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

                              Support us

                              ioBroker
                              Community Adapters
                              Donate

                              1.0k
                              Online

                              31.7k
                              Users

                              79.7k
                              Topics

                              1.3m
                              Posts

                              javascript
                              6
                              19
                              1343
                              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