Ankündigung

Einklappen
Keine Ankündigung bisher.

LBS19001586 ModBus Read GENERIC

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    #16
    Wie immer: Sehr gerne!
    Du hast mir gestern und heute ein paar Mal ein Lächeln damit geschenkt.

    Ich bin dankbar für die Challenge. Hat die ein oder andere Unschärfe ans Licht gebracht und vor allem die beiden Code-Ergänzungen.

    Aber noch cooler ist, wenn Du jetzt auch Werte hast. Bin sehr gespannt auf Deine Rückmeldungen der nächsten Tagen zu Stabilität, Robustheit oder auch Änderungswünschen.

    Nachtrag: V0.2 ist online - geändert sind nur die Prüfungen auf E8. Funktional kein Unterschied, wenn E8 korrekt versorgt wird. Daher keine Not für ein Update.
    Zuletzt geändert von saegefisch; 20.05.2021, 17:54. Grund: Nachtrag

    Kommentar


      #17
      Funktioniert erstklassig! Die geringe CPU-Last ist, meiner Meinung nach, das absolute Highlight!

      Jetzt gehts dran alle Modbus-Register die interessant sind, aus dem Wechselrichter zu extrahieren

      Screenshot 2021-05-22 123530.png

      Kommentar


        #18
        Hi Jann,

        klasse! Danke für Deine Rückmeldung. Mittlerweile ist übrigens V0.3 da und hat die wunden Punkte hoffentlich nachhaltig geheilt, auf die Du mich gestupst hast. Funktional ist's aber egal, wenn E8 korrekt gefüllt wird.

        Zur Systemlast: In der Tat war das fast meine größte Motivation, nach einer anderen Bibliothek zu suchen. Ich konnte nicht verstehen warum ein so banaler Prozess mir vergleichsweise auffällige "Sägezähne" ins CPU-Diagramm geschossen hat. Ich sehe dort auch den größten Vorteil, aber war zunächst unsicher, ob mein Eindruck sich auch in anderen Systemen so zeigt und habe es bewusst nicht so heraus gestellt bei der Vorstellung. Schön, dass es so auffällig war, dass es Dir ohne Hinweis auffiel! Das freut mich ganz besonders, dieses Ziel offenbar erreicht zu haben. Tatsächlich ist der Prozess kaum zu spüren, sofern man die Zeit an E4 nicht über Gebühr klein wählt.

        Die andere Motivation war, dass ModBus eigentlich ein Standard ist und - wie z.B. MQTT - eigentlich (SW-architektonisch) keine spezifischen LBS brauchen sollte. Wenn es den unbedingt spezifisch sein soll, dann dahinter. Aber die größte Freiheit hat man, mit ein paar eigenen nach gelagerten "Division/Konstante" und "Wenn-dann-sonst VARIABEL", denn...

        ... ich wollte im LiveView so flexibel sein, "mal eben kurz" und so einfach wie möglich neue Register zu versuchen, die man in der Doku findet. Denn die meisten Geräte haben eine Info-Schatz, den man sonst nicht hebt - siehe z.B. die ganzen Status-Infos des SMA-SI zum Zustand von System und Netz.

        Viel Spaß mit Deiner Register-Doku!

        Kommentar


          #19
          saegefisch
          ich habe deinen LBS auch mal installiert um mein E3/DC auszulesen. Verbindung wird soweit aufgebaut, nur kann ich aktuell mit den Werten nicht wirklich was anfangen.
          Zu Testzwecken versuche ich aktuell nur einen Wert auszulesen, PV-Leistung, Register 40068
          Bildschirmfoto 2021-05-24 um 10.55.08.png
          Dabei wird ein Wert ausgegeben der nicht richtig sein kann. Vergleichen tuhe ich die Werte, die ich von dem E3/DC-LBS ausgegeben bekomme.
          Bildschirmfoto 2021-05-24 um 11.05.29.png
          Eigentlich sollte der Wert 6997 sein, bei deinem wird aber nur 603 ausgegeben.

          ​Ein Programm wir qModMaster kann ich von meinem Rechner nicht verwenden, da sich dieser in einem anderen Subnet befindet und das E3DC dann keine Verbindung zulässt.

          Kannst du mir eventuell Hilfestellung geben wie ich mit deinem LBS an die richtigen Werte ran komme?

          UPDATE:
          Irgendwie scheine ich einen Offset von -2 zu haben. Ich muss bisher alle Registerwerte -2 nehmen um den richtigen wert zu bekommen.
          Zuletzt geändert von ChrisChros; 24.05.2021, 12:20.

          Kommentar


            #20
            Spannend. Lieben Dank für's testen und für Deine Rückmeldung. Und immerhin sprechen Sie schon mal miteinander... Den Rest bekommen wir auch noch zum Laufen.

            Wie sieht denn E8 bei Dir aus für Register 40068?
            Du bekommst mit 40066 richtige Werte? Hast Du mal mit dem Endian an E9 experimentiert mit Werten 0..3 (und richtigem Register). Sollte auch im LIveView gehen: E 1= 0. E9 setzen, E1 = 1. Da sind die 4 Optionen schnell probiert.
            Wäre mir auch plausibel bei dem Fehlerbild. Was sagt den die Doku zu Deinem Gerät zum richtigen Endian?
            Zuletzt geändert von saegefisch; 24.05.2021, 13:29.

            Kommentar


              #21
              Mit dem endian habe ich bisher noch nicht experimentiert. Was bewirkt E9 eigentlich, die Anleitung ist für mich als Laie nicht selbsterklärend. Werde ich aber mal testen.
              Bin grade dabei zu testen einen uint16-Wert in bit-Werte zu zerlegen. Mal schauen ob das klappt.

              UPDATE:
              bezüglich den bit-Werte habe ich noch so mein Problem. Der Json-String sieht wie folgt bei mir aus:
              Code:
              [ { "address" : "40084", "type" : "bit", "bit":"00" "name" : "EMS-Status Bit 0" },{ "address" : "40084", "type" : "bit", "bit":"01" "name" : "EMS-Status Bit 1" },{ "address" : "40084", "type" : "bit", "bit":"02" "name" : "EMS-Status Bit 2" },{ "address" : "40084", "type" : "bit", "bit":"03" "name" : "EMS-Status Bit 3" },{ "address" : "40084", "type" : "bit", "bit":"04" "name" : "EMS-Status Bit 4" },{ "address" : "40084", "type" : "bit", "bit":"05" "name" : "EMS-Status Bit 5" },{ "address" : "40084", "type" : "bit", "bit":"06" "name" : "EMS-Status Bit 6" },{ "address" : "40084", "type" : "bit", "bit":"07" "name" : "EMS-Status Bit 7" } ]
              Wenn ich das Register 40084 als unit16 auslesen bekomme ich den Wert 132 ausgeben, was auch korrekt zusein scheint. Beim Versuch dieses Register in seine bits zu zerlegen, bekomme ich bei deinem LBS keinen Json-Sting an A1 ausgegeben.
              Zuletzt geändert von ChrisChros; 24.05.2021, 13:52.

              Kommentar


                #22
                Endian scheint keinen Einfluss bei mir zu haben

                Zitat von saegefisch Beitrag anzeigen
                Was sagt den die Doku zu Deinem Gerät zum richtigen Endian?
                Bezüglich Endian ist in meiner Doku nichts erwähnt. Es wird nur erwähnt da je nach Abfragesoftware es einen Offset geben kann.
                Bildschirmfoto 2021-05-24 um 15.14.37.png
                Zuletzt geändert von ChrisChros; 24.05.2021, 14:25.

                Kommentar


                  #23
                  Zum Endian: https://de.wikipedia.org/wiki/Byte-Reihenfolge
                  Wenn ein Ergebnis aus mehr als einem Byte besteht (zB. bei int32 aus 4 Bytes) ist die Frage, in welcher Reihenfolge sie verarbeitet/zusammen gesetzt werden: aus ABCD kann da halt CDAB werden oder BADC.
                  Plakatives Pendant zum Endian: In manchen Teilen Deutschland, die einen sagen "...der Max Mustermann hat doch...", andernorts sagen sie "...der Mustermann Max hat doch ..." Aber was ist, wenn der Kerl Paul Walther heißt und in der Nachbarschaft auch ein Walther Paul wohnt? Oder "drei-viertel acht" <-> "viertel vor Acht". Wenn man das nicht genau versteht, hat man eine andere Zeit/Ergebnis.

                  Dass die Register auch mal +/- 1-2 Register-Offset sind, find' ich schon erstaunlich. Aber sei's drum. Das habe ich vorher noch nie gehört, aber mein Modbus-Erfahrungsschatz ist auch begrenzt. Allerdings waren Register schon zu PEEK/POKE-Zeiten 6802 eines Apple II oder C64 eigentlich eindeutig und es verwundert mich, warum ein Gerät heute da "fuzzy" sein sollte...
                  Egal: wenn man es damit hin bekommen würde... zu Register 40068 nochmal. Bitte versuch' mal
                  Code:
                  40068;"PV-Leistung [W]";int32
                  je mit Endian E9 = 0 bis E9 = 3.

                  Zum Bit-Typ: die Nomenklatur zu meinem LBS braucht "bit_00"bis bit_15". also z.B. (oder entsprechend als JSON)

                  Code:
                  40084;"EMS-Status Bit 0";bit_00
                  40084;"EMS-Status Bit 1";bit_01
                  ...
                  Zuletzt geändert von saegefisch; 24.05.2021, 20:49.

                  Kommentar


                    #24
                    Viertel vor acht, ist aber „Dreiviertel Acht“. Viertel acht ist 7:15 /klugscheissermodus aus

                    Kommentar


                      #25
                      Da haben wir es - ich bin mit einem anderen "Endian" aufgewachsen"... besser hätte man das Endian-Problem nicht zeigen können, Micha! YMMD

                      Kommentar


                        #26
                        Hallo saegefisch
                        hier mal die Ergebnisse von dem Test mit den verschiedenen Endian-Einstellungen direkt am Ausgang A1:
                        Code:
                        E8: 40068;"PV-Leistung [W]";int32 / E9: 0 => {"PV-Leistung [W]":"65296"}
                        E8: 40068;"PV-Leistung [W]";int32 / E9: 1 => {"PV-Leistung [W]":"-16711680"}
                        E8: 40068;"PV-Leistung [W]";int32 / E9: 2 => []
                        E8: 40068;"PV-Leistung [W]";int32 / E9: 3 => keine Ausgabe
                        Zum Vergleich hier mal mit dem Modbus Register 40066:
                        Code:
                        E8: 40066;"PV-Leistung [W]";int32 / E9: 0 => {"PV-Leistung [W]":"499"}
                        E8: 40066;"PV-Leistung [W]";int32 / E9: 1 => {"PV-Leistung [W]":"32374784"}
                        E8: 40066;"PV-Leistung [W]";int32 / E9: 2 => []
                        E8: 40066;"PV-Leistung [W]";int32 / E9: 3 => keine Ausgabe
                        Wenn der LBS keinen Ausgabewert liefert steht folgendes im Log-File:
                        2021-05-26 08:19:42 650702 2048 debug LBS19001586 [v0.3]: Modus Read GENERIC LBS started (2505)
                        2021-05-26 08:19:42 652020 2048 debug LBS19001586 [v0.3]: Modus Read GENERIC EXEC Daemon start initiated (2505)
                        2021-05-26 08:19:42 655122 2048 debug LBS19001586 [v0.3]: Modus Read GENERIC LBS ended (2505)
                        2021-05-26 08:19:53 748310 2048 debug LBS19001586 [v0.3]: Modus Read GENERIC LBS started (2505)
                        2021-05-26 08:19:53 748605 2048 debug LBS19001586 [v0.3]: Modus Read GENERIC LBS ended (2505)
                        Der Richtige Wert sind die 499, alles andere kann ich nicht wirklich zuordnen.
                        Zuletzt geändert von ChrisChros; 27.05.2021, 06:44.

                        Kommentar


                          #27
                          Hallo,

                          zunächst schonmal "Danke" für den tollen LBS. Mit der "alten" Modbus Bibliothek hatte ich auch so meine Probleme.
                          Ich habe mal versucht deinen LBS ans laufen zu bekommen. Mein Stromzähler liefert auf 40001 und 40003 jeweils die aktuellen Zählerwerte für Bezug und Lieferung (uint32).
                          E8 schaut demnach so aus: 40001;"EnergieBezug";uint32;40003;"EnergieLieferun g";uint32
                          Die restlichen Eingänge sollten ebenfalls passen. Ich habe die Standardwerte nur bei der IP und der Slave ID angepasst.

                          Leider bekomme ich am Ausgang immer nur eine leere Ausgabe: []

                          Hast du vielleicht eine Idee was ich falsch mache? Nachfolgend die Debug Ausgabe:

                          Code:
                          Modus Read GENERIC EXEC Daemon start initiated (75)
                          2021-05-26 21:29:05 982887 7729 debug LBS19001586 [v0.3]: Modus Read GENERIC LBS ended (75)
                          2021-05-26 21:29:06 111330 7738 debug EXE19001586 [v0.3]: Daten wurden als CSV geliefert (75)
                          2021-05-26 21:29:06 112451 7738 debug EXE19001586 [v0.3]: data_array: (75) 2021-05-26 21:29:06 112881 7738 debug EXE19001586 [v0.3]: ================ ARRAY/OBJECT START ================
                          2021-05-26 21:29:06 112961 7738 debug EXE19001586 [v0.3]: ["40001","EnergieBezug","uint32","40003","EnergieLi eferung","uint32"]
                          2021-05-26 21:29:06 113001 7738 debug EXE19001586 [v0.3]: ================ ARRAY/OBJECT END ================
                          2021-05-26 21:29:06 114931 7738 debug EXE19001586 [v0.3]: Register: (75)
                          2021-05-26 21:29:06 115041 7738 debug EXE19001586 [v0.3]: ================ ARRAY/OBJECT START ================
                          2021-05-26 21:29:06 115072 7738 debug EXE19001586 [v0.3]: [{"address":"40001","name":"EnergieBezug","type":"u int32","uri":"10.10.10.17:502","unitId":1},{"addre ss":"40003","name":"EnergieLieferung","type":"uint 32","uri":"10.10.10.17:502","unitId":1}]
                          2021-05-26 21:29:06 115097 7738 debug EXE19001586 [v0.3]: ================ ARRAY/OBJECT END ================
                          2021-05-26 21:29:06 121995 7738 debug EXE19001586 [v0.3]: Anzahl Register gesamt angefragt: 2 (75)
                          2021-05-26 21:29:06 122637 7738 debug EXE19001586 [v0.3]: Anzahl Requests ergeben sich gesamt: 1 (75) 2021-05-26 21:29:06 123455 7738 debug EXE19001586 [v0.3]: Anzahl Requests in Chunk 1 : 1 (75)
                          2021-05-26 21:29:06 619816 7738 debug EXE19001586 [v0.3]: unerwünscht: (75)
                          2021-05-26 21:29:06 619956 7738 debug EXE19001586 [v0.3]: ================ ARRAY/OBJECT START ================
                          2021-05-26 21:29:06 619992 7738 debug EXE19001586 [v0.3]: ["-2147483648","2147483648","4026531840","4294967295"]
                          2021-05-26 21:29:06 620016 7738 debug EXE19001586 [v0.3]: ================ ARRAY/OBJECT END ================
                          2021-05-26 21:29:06 621947 7738 debug EXE19001586 [v0.3]: Ersatz: (75)
                          2021-05-26 21:29:06 622076 7738 debug EXE19001586 [v0.3]: ================ ARRAY/OBJECT START ================
                          2021-05-26 21:29:06 622104 7738 debug EXE19001586 [v0.3]: "0" 2021-05-26 21:29:06 622147 7738 debug EXE19001586 [v0.3]: ================ ARRAY/OBJECT END ================
                          2021-05-26 21:29:06 623843 7738 debug EXE19001586 [v0.3]: JSON: [] (75)
                          Danke und viele Grüße
                          Hias

                          Kommentar


                            #28
                            ChrisChros :
                            - das vierte Beispiel sollte E9 = 3 sein mit keiner Ausgabe und dem Log? Ich kann Deine Log-Ausgabe reproduzieren. Da muss ich mal bei der Library forschen, warum das nicht geht.
                            - Richtige Werte kann es immer nur mit dem richtigen Endian geben Daher scheint für Dich Endian E9 = 0 richtig zu sein.
                            - Warum Dein Register -2 sein muss, also 40066 statt 40068, erschließt sich mir auch nicht. Aber wenn der Hersteller das schon selber schreibt... wenn es konsistent -2 ist, ist's ja fast schon wieder ok.
                            - Hast Du die Endians auch mal mit +2 versucht, also 40070. Nur so zur Vollständigkeit.
                            - wenn wir saubere Erkenntnisse haben und Du vielleicht stabile Ergebnisse für Dein Gerät hast, würde ich das in der Hilfe des LBS auch erwähnen.

                            h1as
                            ​Auch Dir schon mal Danke für's testen. Wer GENERIC behauptet, muss auch liefern...
                            Insgesamt stelle ich bei dem Blick auf Dein Log fest: Ich muss etwas Text ergänzen, um die Ausgabe selbsterklärender zu machen... mit V0.4. Mag aber WE werden, weil gerade beruflich sehr unter Feuer und am Freitag Impfung ansteht...

                            Ganz unten im Log müsste hinter JSON die Rückgabewerte stehen. Da steht nur [] - nicht einmal eine leer geschweifte Klammer. Das ist irgendwie wenig. Bin aus der Ferne auch etwas ratlos. Die Ersatzwerte habe nicht gegriffen, das würde ausgegeben und würde auch mindestens die Register mit "0" liefern.

                            Was mir auffiel: In der Array-Ausgabe nach "Register (75) haben die Typen ein SPACE, z.B. "u int32". Ich vermute mal, das ist ein Kopierfehler hier in den Forenbeitrag, richtig?

                            Im edomi-Error-log war auch nichts zeitgleich?​
                            Du bist Dir mit IP, Port und auch gerade der ID = 1 sicher? Andere Lösungen/LBS kommen damit an Daten?
                            Mal Endian E9 = 2 versucht? Was sagt die Doku Deines Geräts zum Endian?
                            Ich denke nicht, dass es was bringt, aber am Ende der Schleife zum Abfragen der Register
                            Code:
                            $i++;
                            usleep($request_wait*1000);
                            steht darüber ein auskommentierter logging eintrag
                            Code:
                            //logging($id, 'Response Daten: ',$response->getData());
                            Bitte mal dekommentieren und testen.

                            Falls das alles nix hilft, würde ich mal die Script-Lösung versuchen. Da hat man die pure Ausgabe. Vielleicht gibt es Fehler, die ich unterdrücke, hier aber wichtig wären. Dann würde ich die Ausgabe ergänzen im Log
                            Zuletzt geändert von saegefisch; 27.05.2021, 00:14.

                            Kommentar


                              #29
                              Zitat von saegefisch Beitrag anzeigen
                              das vierte Beispiel sollte E9 = 3 sein mit keiner Ausgabe und dem Log
                              Danke für den Hinweis, habe ich korrigiert. Sollte natürlich E9 = 3 heißen.

                              Zitat von saegefisch Beitrag anzeigen
                              Hast Du die Endians auch mal mit +2 versucht, also 40070. Nur so zur Vollständigkeit.
                              Andere Register habe ich auch schon getestet mit einem ähnlichen Ergebnis. Zumindest bei den Registern mit Datentyp Int32 muss ich bei allen -2 im Register und Endian 0 berücksichtigen.
                              Andere Datentypen muss ich erst noch testen und werde hier dann Rückmeldung geben.

                              Kommentar


                                #30
                                saegefisch
                                So wirklich konsistent ist das alles nicht.
                                Bisher bei allen Int32 Registern muss ich -2 rechnen. Bei den Uint16 Werten passen einige Register wie in der Dokumentation angegeben, andere Register mit Datentyp Unit16 muss ich -1 rechnen.

                                Ich werde das ganze mal noch mit dem Modbus Adapter im ioBroker testen ob sich das hier ähnlich verhält.
                                Zuletzt geändert von ChrisChros; 27.05.2021, 10:17.

                                Kommentar

                                Lädt...
                                X