Ankündigung

Einklappen
Keine Ankündigung bisher.

Einbindung von Modbus TCP

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

  • ivande
    antwortet
    Ich habe als Plugin-Testobjekt eine Siemens LOGO und den Solaredge Wechselrichter genommen, und auch mal Multi-Instanz probiert.
    Mit der LOGO kann ich auch die verschiedene Typen (Coil, DiscreteInput, InputRegister, HoldingRegister) auslesen. Komischerweise sind die Addressen dort um 1 zu hoch,..

    Zitat von ooUrmeloo Beitrag anzeigen
    die Außentemperatur und eine weitere Vorlauftemperatur funktioniert
    bei den InputRegistern scheint dann die Addresse wiederum zu stimmen,.. (0-Außentemp, 1 Vorlauftemp.)

    mit der LOGO kann ich dann auch das Schreiben von Register angehen/testen kann, (da kann zumindest nicht viel schief gehen, wenn ich das falsche Register schreibe). Das wird aber noch ein bisschen dauern.

    Einen Kommentar schreiben:


  • ooUrmeloo
    antwortet
    Zitat von ivande Beitrag anzeigen

    Du könntest bitte versuchen die Coil Adressen um 1 zu erhöhen also TestC0-Addresse:9996 + TestC1-Addresse:9997
    Sieht gut aus. Das könnte es gewesen sein.

    2022-02-03_23h04_04.png

    Ich versuche morgen mal noch ein paar andere Register.

    Vielen Dank nochmal für Deine Hilfe!!

    Einen Kommentar schreiben:


  • ivande
    antwortet
    Zitat von ooUrmeloo Beitrag anzeigen
    Jetzt geht's (wieder). Auch die Außentemperatur und eine weitere Vorlauftemperatur funktioniert.
    👍


    Zitat von ooUrmeloo Beitrag anzeigen
    IllegalAddress) register:9995
    es scheint die Adresse 9995 nicht zu geben:

    Du könntest bitte versuchen die Coil Adressen um 1 zu erhöhen also TestC0-Addresse:9996 + TestC1-Addresse:9997


    Einen Kommentar schreiben:


  • ooUrmeloo
    antwortet
    Zitat von ivande Beitrag anzeigen

    ich hab gerade noch mal diese Version von git heruntergeladen, bei mir startet das Plugin.. die plugin.yaml sollte nur 113 Zeilen haben:
    Sorry, mein Fehler ... da hab ich was beim Download verbockt ...
    Jetzt geht's (wieder). Auch die Außentemperatur und eine weitere Vorlauftemperatur funktioniert.

    Auch der zweite Coil Wert wird ausgelesen wobei der m.E. "True" sein sollte?! Der erste aber bringt noch eine Fehlermeldung:

    Code:
    2022-02-03  21:40:49 ERROR    plugins.modbus_tcp  read error: Exception Response(129, 1, IllegalAddress) register:9995 registerCount:1 slaveUnit:1
    und Webinterface:

    2022-02-03_21h45_05.png

    Einen Kommentar schreiben:


  • ivande
    antwortet
    Zitat von ooUrmeloo Beitrag anzeigen
    line 164
    ich hab gerade noch mal diese Version von git heruntergeladen, bei mir startet das Plugin.. die plugin.yaml sollte nur 113 Zeilen haben:

    Code:
    # Metadata for the Smart-Plugin
    plugin:
        # Global plugin attributes
        type: gateway
        description:
            de: 'Plugin zur Geräte-Anbindung über ModBus an SmartHomeNG'
            en: 'Plugin to connect via modbus with SmartHomeNG'
        maintainer: ivande
        tester: 'n/a'
        state: ready
        keywords: modbus_tcp
        documentation: https://github.com/smarthomeNG/plugins/blob/develop/modbus_tcp/user_doc.rst
        support: https://knx-user-forum.de/forum/supportforen/smarthome-py/1154368-einbindung-von-modbus-tcp
        version: 1.0.4a                 # Plugin version
        sh_minversion: 1.8             # minimum shNG version to use this plugin
        py_minversion: 3.6  
        multi_instance: True           # plugin supports multi instance
        restartable: unknown
        classname: modbus_tcp          # class containing the plugin
    
    parameters:
        host:
            type: ipv4
            description:
                de: 'IP Adresse des Modbus-Geraetes'
                en: 'IP address from the modbus-device'
                
        port:
            type: num
            description:
                de: 'modbus Port'
                en: 'modbus port'
    
        cycle:
            type: num
            default: 300
            description:
                de: 'Update Zyklus in Sekunden'
                en: 'Update cycle in seconds'
                
        slaveUnit:
            type: num
            default: 1
            description:
                de: 'Slave-Addresse der zu lesenden Modbus-Einheit'
                en: 'slave-address of the Modbus-Unit to read'
    
    item_attributes:
        modBusObjectType:
            type: str
            default: 'HoldingRegister'
            description:
                de: 'Auswahl welcher Objekt-Type gelesen werden soll'
                en: 'Selection of which object type should be read '
            valid_list:
            - 'Coil'
            - 'DiscreteInput'
            - 'InputRegister'
            - 'HoldingRegister'
        
        modBusAddress:
            type: num
            description:
                de: 'Register Adresse welche gelesen werden soll'
                en: 'register address to read'
    
        modBusUnit:
            type: num
            default: 1  # als default wird die slaveUnit aus der plugin-Konfig verwendet
            description:
                de: 'Slave-Addresse der zu lesenden Modbus-Einheit (Unit aus der plugin-Konfig wird überschrieben)'
                en: 'slave-address of the Modbus-Unit to read - (Value from plugin config will be overwritten)'
                
        modBusDataType:
            type: str
            default: 'uint16'
            description:
                de: 'Datentyp vom zu lesenden Register (bit, int16 uint16 int32 unit32 float32 string16 stringNN)'
                en: 'datatype from register to read (bit, int16 uint16 int32 unit32 float32 string16 stringNN)'
    
        modBusByteOrder:
            type: str
            default: 'Endian.Big'
            description:
                de: 'Endian.Big oder Endial.Little'
                en: 'Endian.Big or Endial.Little'
            valid_list:
            - 'Endian.Big'
            - 'Endial.Little'
                
        modBusWordOrder:
            type: str
            default: 'Endian.Big'
            description:
                de: 'Endian.Big oder Endial.Little'
                en: 'Endian.Big or Endial.Little'
            valid_list:
            - 'Endian.Big'
            - 'Endial.Little'
    
        modBusFactor:
            type: num
            default: 1
            description:
                de: 'Faktor mit welchem der gelesene Register-Wert multipliziert wird'
                en: 'Factor by which the read register value is multiplied'
    
    item_structs: NONE
    
    plugin_functions: NONE
    
    logic_parameters: NONE
    Zitat von ooUrmeloo Beitrag anzeigen
    hat die Außentemperatur nicht funktioniert
    erscheint die Aussentemp. im Webinterface? gibt es einen read-error?
    Zuletzt geändert von ivande; 03.02.2022, 17:32.

    Einen Kommentar schreiben:


  • ooUrmeloo
    antwortet
    mit der Version 1.0.4a läuft bei mir das Plugin nicht mehr ...

    Code:
    2022-02-03 13:59:21 WARNING lib.shyaml Unable to correct line number for yaml-file error. Wrong line number is ng values are not allowed here
    in "<unicode string>", line 164, column 65:
    ... e" content="{&quot;version&quot;: &quot;4&quot;, &quot;rollouts& ...
    ^ (line: 164
    2022-02-03 13:59:21 ERROR lib.shyaml YAML-file load error in /usr/local/smarthome/plugins/modbus_tcp/plugin.yaml:
    mapping values are not allowed here
    in "<unicode string>", line 164, column 65:
    ... e" content="{&quot;version&quot;: &quot;4&quot;, &quot;rollouts& ...
    ^ (line: 164)
    NOTE: Look for the error at the expected <block end>, near the second specified line number
    2022-02-03 13:59:21 ERROR lib.plugin Plugins, section modbus_tcp: class_name is not defined
    2022-02-03 13:59:35 WARNING lib.metadata Item 'paradigma.TestInputRegister', attribute 'modBusObjectType': Attribute is undefined and has value 'InputRegister' (defined in paradigma.yaml)
    2022-02-03 13:59:35 WARNING lib.metadata Item 'paradigma.TestInputRegister', attribute 'modBusAddress': Attribute is undefined and has value '9997' (defined in paradigma.yaml)
    2022-02-03 13:59:35 WARNING lib.metadata Item 'paradigma.TestInputRegister', attribute 'modBusFactor': Attribute is undefined and has value '0.1' (defined in paradigma.yaml)
    2022-02-03 13:59:35 WARNING lib.metadata Item 'paradigma.TestInputRegister', attribute 'modBusDataType': Attribute is undefined and has value 'int16' (defined in paradigma.yaml)
    2022-02-03 13:59:35 WARNING lib.metadata Item 'paradigma.TestHoldingRegister', attribute 'modBusAddress': Attribute is undefined and has value '9998' (defined in paradigma.yaml)
    2022-02-03 13:59:35 WARNING lib.metadata Item 'paradigma.TestHoldingRegister', attribute 'modBusFactor': Attribute is undefined and has value '0.1' (defined in paradigma.yaml)
    2022-02-03 13:59:35 WARNING lib.metadata Item 'paradigma.TestHoldingRegister', attribute 'modBusDataType': Attribute is undefined and has value 'int16' (defined in paradigma.yaml)
    2022-02-03 13:59:35 WARNING lib.metadata Item 'paradigma.TestCoil0', attribute 'modBusObjectType': Attribute is undefined and has value 'Coil' (defined in paradigma.yaml)
    2022-02-03 13:59:35 WARNING lib.metadata Item 'paradigma.TestCoil0', attribute 'modBusAddress': Attribute is undefined and has value '9995' (defined in paradigma.yaml)
    2022-02-03 13:59:35 WARNING lib.metadata Item 'paradigma.TestCoil0', attribute 'modBusDataType': Attribute is undefined and has value 'bit' (defined in paradigma.yaml)
    2022-02-03 13:59:35 WARNING lib.metadata Item 'paradigma.TestCoil1', attribute 'modBusObjectType': Attribute is undefined and has value 'Coil' (defined in paradigma.yaml)
    2022-02-03 13:59:35 WARNING lib.metadata Item 'paradigma.TestCoil1', attribute 'modBusAddress': Attribute is undefined and has value '9996' (defined in paradigma.yaml)
    2022-02-03 13:59:35 WARNING lib.metadata Item 'paradigma.TestCoil1', attribute 'modBusDataType': Attribute is undefined and has value 'bit' (defined in paradigma.yaml)
    mit der Item Konfig hat die Außentemperatur nicht funktioniert:

    Code:
    Aussentemperatur:
      type: num
      name: AT
      enforce_updates: True
      modBusObjectType: InputRegister
      modBusAddress: 0
      modBusFactor: 0.1
      modBusDataType: int16
    wobei ich auch andere Bus Adressen versucht hatte.

    Einen Kommentar schreiben:


  • ivande
    antwortet
    Dass "Input Register" und "Holding Register" gelesen werden ist doch schon mal etwas..
    Außentemperatur sollte dann eigentlich gehen.. schick mal die Item-Konfig der Außentemp.


    Ich hab nochmal ein paar Kleine Änderungen hochgeladen Version 1.0.4a (__init__ + plugin.yaml ersetzten)

    Gruß Ivan

    Einen Kommentar schreiben:


  • ooUrmeloo
    antwortet
    Danke!! Sieht schon mal gut aus! 😀

    "Input Register" und "Holding Register" scheinen zumindest mit den Test-Registern zu funktionieren. Die erwarteten Werte werden regelmäßig ausgelesen, siehe auch Screenshot. Ich habe testhalber auch mal versucht, die Außentemperatur auszulesen aber das Register funktioniert (noch?) nicht.

    Mit den "Coils" scheint es - wie befürchtet - noch Probleme zu geben.

    Auszug log hier:

    Code:
    2022-02-03 11:48:37 ERROR plugins.modbus_tcp read error: Exception Response(129, 1, IllegalAddress) register:9995 registerCount:1 slaveUnit:1
    2022-02-03 11:48:37 ERROR plugins.modbus_tcp something went wrong in the poll_device function: 'bool' object has no attribute 'decode_bits'
    und Screenshot vom Webinterface:

    2022-02-03_11h41_56.png

    Einen Kommentar schreiben:


  • ivande
    antwortet
    Zitat von ooUrmeloo Beitrag anzeigen
    Klar, teste ich natürlich sehr gerne!
    hier auf meinem plugin-Fork wäre ein Test-Version - wenn möglich mit folgenden Registern:


    Code:
    paradigma:
        TestInputRegister:
            type: num
            name: TestIR
            enforce_updates: True
            modBusObjectType: InputRegister
            modBusAddress: 9997
            modBusFactor: 0.1
            modBusDataType: int16
        TestHoldingRegister:
            type: num
            name: TestHR
            enforce_updates: True
            # modBusObjectType: HoldingRegister (default)
            modBusAddress: 9998
            modBusFactor: 0.1
            modBusDataType: int16
        TestCoil0:
            type: bool
            name: TestC0
            enforce_updates: True
            modBusObjectType: Coil
            modBusAddress: 9995
            modBusDataType: bit
        TestCoil1:
            type: bool
            name: TestC1
            enforce_updates: True
            modBusObjectType: Coil
            modBusAddress: 9996
            modBusDataType: bit


    wäre super wenn du die Log-Ausgabe und evtl. einen sceenshot vom Webinterface schicken kannst (wenn zumindest ein paar der Register gelesen werden)
    Am ehesten wird es Probleme mit den "Coil" geben,.. da ich das bei mir nicht testen konnte,..

    Gruß Ivan

    Einen Kommentar schreiben:


  • ooUrmeloo
    antwortet
    Zitat von ivande Beitrag anzeigen

    Das lesen der Coils, Input Registers und Holding Registers müsste ich erst ins Plugin einbauen, das müsste ich in 1-2Tagen schaffen.. Wenn Du mir das dann testen könntest wäre super,..
    Klar, teste ich natürlich sehr gerne! Ich würde das Plugin ja gerne nutzen
    Ich dachte, die Funktionscodes können über die Adressen/Register abgebildet werden: Coils: 0xxxx, Input Registers: 3xxxx, Holding Registers: 4xxxx, ....
    Das geht aber nicht.

    Vielen Dank schon mal vorab!

    Einen Kommentar schreiben:


  • ivande
    antwortet
    Anhang A: Verfügbare Datenpunkte
    Die Datenpunkte des Reglers sind gemäß des Modbus-Standards in die 3 Modbus-Tabellen Coils, Input Registers und Holding Registers gruppiert, für die jeweils eigene Lese- und Schreibbefehle (Funktionscodes) verwendet werden. Die zu verwendenden Funktionscodes sind bei der jeweiligen Tabelle angegeben.
    Das lesen der Coils, Input Registers und Holding Registers müsste ich erst ins Plugin einbauen, das müsste ich in 1-2Tagen schaffen.. Wenn Du mir das dann testen könntest wäre super,..

    Einen Kommentar schreiben:


  • ooUrmeloo
    antwortet
    Danke. Nochmal ein guter Hinweis. In der Anleitung steht das nicht so im Klartext aber am Anfang eine Art "Übersetzung" (auf Seite 7).

    Hier auf der Seite ganz unten gibt's das PDF zum Modbus:
    https://www.paradigma.de/produkte/re...ystacomfortll/

    Klappt auf Anhieb trotzdem nicht. Muss morgen nochmal ran ...

    Einen Kommentar schreiben:


  • ivande
    antwortet
    ich denke du versuchst eine modBusAddresse (=Register) zu lesen, welche die Steuerung nicht kennt. In der Modbus-Anleitung deiner Stuerung müssten die Register folgendermaßen aufgelistet sein (ich weiß jetzt nicht ob dies mit deiner Steuerung übereinstimmt)

    paradigma.jpg
    also für die Außentemperatur:

    modBusAddress: 30001

    evtl schickst Du den Link deiner Anleitung oder die Datei, dass ich mir diese ansehen kann.
    Zuletzt geändert von ivande; 01.02.2022, 22:47.

    Einen Kommentar schreiben:


  • ooUrmeloo
    antwortet
    Zitat von ivande Beitrag anzeigen

    ich würde Dir empfehlen das modbus_tcp -Plugin aus dem develop-Branch zu testen.
    Danke! Das hat mir schon mal einen Schritt weiter geholfen. Mit der V 1.0.3 läuft der Plugin und ich bekomme auch das Webinterface dargestellt und er zeigt "Verbunden".
    Jetzt kämpfe ich noch mit dem Einlesen der Werte. Grundsätzlich habe ich m.E. alle Einstellungen (in einer Paradigma Beschreibung) hier.
    Über das Windows Tool QModMaster kann ich die Werte auch auslesen.

    Ich steh gerade aber auf dem Schlauch. Wie setzt sich denn die 'modBusAddress' zusammen?

    Ich habe per Anleitung einen Funktionscode zum Lesen: "0x04 Read Input Registers" und dann ein- bzw. zweistellige Adressen für die einzelnen Daten, bei mir alle in int16 mit Faktor 0,1 (Modbus Unit ID ist 1).
    0x04 hex ist für mich 4 dec, also sollte die Adresse irgendwas mit 4xxxx o.ä. sein ?!? Tut aber nicht ...

    Was mache ich falsch?

    Auszug aus dem yaml:

    Code:
    paradigma:
      Aussentemperatur:
        type: num
        name: Aussentemperatur
        enforce_updates: True
        modBusAddress: 40100
        modBusFactor: 0.1
        modBusDataType: int16
    Fehlermeldung aus dem log:

    Code:
    2022-02-01 21:36:49 ERROR plugins.modbus_tcp something went wrong in the poll_device function: 'ExceptionResponse' object has no attribute 'registers'


    Einen Kommentar schreiben:


  • ivande
    antwortet
    Zitat von ooUrmeloo Beitrag anzeigen
    Hallo zusammen,

    ich habe gerade sukzessive von Smartvisu 3.1 -> 3.2 und danach auch ShNG 1.82 -> 1.9 aktualisiert und wollte jetzt das neue Modbus_tcp Plugin nutzen, um auf meine Paradigma Heizungs- und Solaranlage zuzugreifen.

    Für das Modbus_tcp Plugin habe ich noch fehlerfrei pymodbus installiert und pip aktualisiert (da gab's ne Fehlermeldung dazu mit dem Hinweis dazu).

    Allerdings bekomme ich jetzt folgende Fehlermeldungen:
    Code:
    2022-02-01 12:57:18 ERROR lib.metadata plugin 'modbus_tcp' version differs between Python code (1.0.1) and metadata (1.0.0)
    
    
    2022-02-01 13:58:08 ERROR plugins.modbus_tcp something went wrong in the poll_device function: 'ExceptionResponse' object has no attribute 'registers'
    2022-02-01 13:58:14 ERROR cherrypy.error.1708919952 [01/Feb/2022:13:58:14] HTTP
    Traceback (most recent call last):
    File "/home/smarthome/.local/lib/python3.7/site-packages/cherrypy/_cprequest.py", line 638, in respond
    self._do_respond(path_info)
    File "/home/smarthome/.local/lib/python3.7/site-packages/cherrypy/_cprequest.py", line 697, in _do_respond
    response.body = self.handler()
    File "/home/smarthome/.local/lib/python3.7/site-packages/cherrypy/lib/encoding.py", line 219, in __call__
    self.body = self.oldhandler(*args, **kwargs)
    File "/home/smarthome/.local/lib/python3.7/site-packages/cherrypy/_cpdispatch.py", line 54, in __call__
    return self.callable(*self.args, **self.kwargs)
    File "/usr/local/smarthome/plugins/modbus_tcp/__init__.py", line 331, in index
    _regToRead=sorted(self.plugin._regToRead, key=lambda k: int(k)),
    File "/home/smarthome/.local/lib/python3.7/site-packages/jinja2/environment.py", line 1090, in render
    self.environment.handle_exception()
    File "/home/smarthome/.local/lib/python3.7/site-packages/jinja2/environment.py", line 832, in handle_exception
    reraise(*rewrite_traceback_stack(source=source))
    File "/home/smarthome/.local/lib/python3.7/site-packages/jinja2/_compat.py", line 28, in reraise
    raise value.with_traceback(tb)
    File "/usr/local/smarthome/plugins/modbus_tcp/webif/templates/index.html", line 44, in top-level template code
    {% set tab1title = "<strong>" ~ p.get_shortname() ~ " readed registers </strong> (" ~ _regToRead|length ~ ")" %}
    File "/usr/local/smarthome/modules/http/webif/gtemplates/base_plugin.html", line 183, in top-level template code
    {% if scroll_heading is not defined %}
    File "/usr/local/smarthome/modules/http/webif/gtemplates/base.html", line 1, in top-level template code
    {% block doc -%}
    File "/usr/local/smarthome/modules/http/webif/gtemplates/base.html", line 4, in block "doc"
    {%- block html %}
    File "/usr/local/smarthome/modules/http/webif/gtemplates/base.html", line 79, in block "html"
    {% block body -%}
    File "/usr/local/smarthome/modules/http/webif/gtemplates/base.html", line 82, in block "body"
    {% block content -%}
    File "/usr/local/smarthome/modules/http/webif/gtemplates/base_plugin.html", line 57, in block "content"
    {% block headtable %}
    File "/usr/local/smarthome/plugins/modbus_tcp/webif/templates/index.html", line 37, in block "headtable"
    <td class="py-1">{{ p._pollStatus.last_dt.strftime('%d.%m.%Y %H:%M:%S %Z') }} ({{ p._pollStatus.regCount }})</td>
    File "/home/smarthome/.local/lib/python3.7/site-packages/jinja2/environment.py", line 471, in getattr
    return getattr(obj, attribute)
    jinja2.exceptions.UndefinedError: 'dict object' has no attribute 'last_dt'
    Kann damit jemand was damit anfangen und mir weiterhelfen?
    Wie kann ich " ... version differs between Python code (1.0.1) and metadata (1.0.0)" lösen?
    Die Version 1.0.1 kommt mit Shng 1.9. Wie bekomme ich die metadata auch auf 1.0.1?
    im modbus_tcp -Plugin (1.9. - master) ist leider ein Fehler in der plugin.yaml dort sollte in Zeile 14 auch 1.0.1 bei der Version stehen

    version: 1.0.1 # Plugin version

    ich würde Dir empfehlen das modbus_tcp -Plugin aus dem develop-Branch zu testen.
    Zuletzt geändert von ivande; 08.02.2022, 09:32.

    Einen Kommentar schreiben:

Lädt...
X