Ankündigung

Einklappen
Keine Ankündigung bisher.

Einbindung von Modbus TCP

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

  • teddytornado
    antwortet
    Zitat von Bonze Beitrag anzeigen
    vl könntest du ja ein struct für dein gerät erstellen, und zur verfügung stellen ..
    Hi, sorry für die späte Rückmeldung. Ich habe noch ein wenig rumgebastelt und bin jetzt soweit fertig. Was meinst Du mit einem "Struct" zur Verfügung stellen? Meine Item Datei der E3DC S10? Es fehlen noch einige Dinge aber bei mir sieht diese jetzt so aus. Vielleicht hilft es dem einen oderen anderen weiter:

    Code:
    %YAML 1.1
    ---
    
    PHOTOVOLATIK:
    
        Hersteller:
            type: str
            name: Hersteller
            modBusAddress: 40003
            modBusDataType: string16
            name: Hersteller
        Modell:
            type: str
            name: Modell
            modBusAddress: 40019
            modBusDataType: string16
        Seriennummer:
            type: str
            name: Seriennummer
            modBusAddress: 40035
            modBusDataType: string16
        Firmware:
            type: str
            name: Firmware
            modBusAddress: 40051
            modBusDataType: string16
        Photovoltaikleistung:
            type: num
            name: Photovoltaikleistung
            #enforce_updates: True
            modBusAddress: 40067
            modBusDataType: int16
            database: 'init'
            database_maxage: 360
        Batterieleistung:
            type: num
            name: Batterieleistung
            #enforce_updates: True
            modBusAddress: 40069
            modBusDataType: int16
            database: 'init'
            database_maxage: 360
        Batterieladezustand:
            type: num
            name: Batterieladezustand
            #enforce_updates: True
            modBusAddress: 40082
            modBusDataType: int16
            database: 'init'
            database_maxage: 360    
        Hausverbrauch:
            type: num
            name: Hausverbrauch
            #enforce_updates: True
            modBusAddress: 40071
            modBusDataType: int16
            database: 'init'
            database_maxage: 360
        Netzuebergabepunkt:
            type: num
            name: Netzuebergabepunkt
            #enforce_updates: True
            modBusAddress: 40073
            modBusDataType: int16
            database: 'init'
            database_maxage: 360
        Autarkie:
            type: num
            name: Autarkie
            modBusAddress: 40081
            modBusDataType: uint16
            eval: (value>>8)&0xff
        Notstrom:
            type: num
            name: Notstrom
            modBusAddress: 40083
            modBusDataType: int16
        String1Power:
            type: num
            name: String1Power
            #enforce_updates: True
            modBusAddress: 40101
            modBusDataType: int16
            database: 'init'
            database_maxage: 360
        String1Voltage:
            type: num
            name: String1Voltage
            #enforce_updates: True
            modBusAddress: 40095
            modBusDataType: int16
            database: 'init'
            database_maxage: 360
        String1Strom:
            type: num
            name: String1Strom
            #enforce_updates: True
            modBusAddress: 40098
            modBusDataType: int16
            database: 'init'
            database_maxage: 360
        String2Power:
            type: num
            name: String2Power
            #enforce_updates: True
            modBusAddress: 40102
            modBusDataType: int16
            database: 'init'
            database_maxage: 360
        String2Voltage:
            type: num
            name: String2Voltage
            #enforce_updates: True
            modBusAddress: 40096
            modBusDataType: int16
            database: 'init'
            database_maxage: 360
        String2Strom:
            type: num
            name: String2Strom
            #enforce_updates: True
            modBusAddress: 40099
            modBusDataType: int16
            database: 'init'
            database_maxage: 360
        Wallboxleistung:
            type: num
            name: Wallboxleistung
           #enforce_updates: True
           modBusAddress: 40077
            modBusDataType: int16
            database: 'init'
            database_maxage: 360
        Wallboxverbrauch:
            type: num
            name: Wallboxverbrauch
            #enforce_updates: True
            modBusAddress: 40079
            modBusDataType: int16
            database: 'init'
            database_maxage: 360
    
        name: PV-Anlage
        sv_page: room
        sv_img: scene_solar_panel.svg
    
        Info_Wechselrichter:
            name: Wechselrichter
            sv_widget: "Hersteller: {{ basic.print('', 'PHOTOVOLATIK.Hersteller', 'html') }} <br>
                Modell: {{ basic.print('', 'PHOTOVOLATIK.Modell', 'html') }} <br>
                Seriennumer: {{ basic.print('', 'PHOTOVOLATIK.Seriennummer', 'html') }} <br>
                Firmware: {{ basic.print('', 'PHOTOVOLATIK.Firmware', 'html') }} <br>"
                
        Daten_Wechselrichter:
            name: PV-Daten
            sv_widget: "PV-Leistung: {{ basic.print('', 'PHOTOVOLATIK.Photovoltaikleistung', 'W', '', [50,16000], ['red', 'green']) }} <br>
                Batterieleistung: {{ basic.print('', 'PHOTOVOLATIK.Batterieleistung', 'W') }} <br>
                Hausverbrauch: {{ basic.print('', 'PHOTOVOLATIK.Hausverbrauch', 'W') }} <br>
                Netzuebergabepunkt: {{ basic.print('', 'PHOTOVOLATIK.Netzuebergabepunkt', 'W', '', [1,50000], ['green', 'red', 'red']) }} <br>
                Batterieladezustand: {{ basic.print('', 'PHOTOVOLATIK.Batterieladezustand', '%', '', [30,40], ['red', 'orange', 'green']) }} <br>            
                Autarkie: {{ basic.print('', 'PHOTOVOLATIK.Autarkie', '%') }} <br>
                Notstromstatus: {{ basic.print('', 'PHOTOVOLATIK.Notstrom', '') }} <br>
                String 1 (Nord/West): {{ basic.print('', 'PHOTOVOLATIK.String1Power', 'W') }} / {{ basic.print('', 'PHOTOVOLATIK.String1Voltage', 'V') }} / {{ basic.print('', 'PHOTOVOLATIK.String1Strom', 'A') }} <br>
                String 2 (Ost/Süd): {{ basic.print('', 'PHOTOVOLATIK.String2Power', 'W') }} / {{ basic.print('', 'PHOTOVOLATIK.String2Voltage', 'V') }} / {{ basic.print('', 'PHOTOVOLATIK.String2Strom', 'A') }}"
        
        Plot1:
            name: Photovoltaikleistungschart
            sv_widget: "{{ plot.period('', 'PHOTOVOLATIK.Photovoltaikleistung', 'avg', '24h', '', '', '', '', '', '', '', '', 'advanced', '', '', '', '', '') }}"
            
        Plot2:
            name: Batterieleistungschart
            sv_widget: "{{ plot.period('', 'PHOTOVOLATIK.Batterieleistung', 'avg', '24h', '', '', '', '', '', '', '', '', 'advanced', '', '', '', '', '') }}"    
        
        Plot3:  
            name: Batterieladezustandschart
            sv_widget: "{{ plot.period('', 'PHOTOVOLATIK.Batterieladezustand', 'avg', '24h', '', '', '', '', '', '', '', '', 'advanced', '', '', '', '', '') }}"
        
        Plot4:  
            name: Hausverbrauchchart
            sv_widget: "{{ plot.period('', 'PHOTOVOLATIK.Hausverbrauch', 'avg', '24h', '', '', '', '', '', '', '', '', 'advanced', '', '', '', '', '') }}"
    
        Plot5:  
            name: Leistungschart am Netzuebergabepunkt
            sv_widget: "{{ plot.period('', 'PHOTOVOLATIK.Netzuebergabepunkt', 'avg', '24h', '', '', '', '', '', '', '', '', 'advanced', '', '', '', '', '') }}"
        
        Plot6:
            name: String 1 (Nord/West)
            sv_widget: "{{ plot.period('', 'PHOTOVOLATIK.String1Power', 'avg', '24h', '', '', '', '', '', '', '', '', 'advanced', '', '', '', '', '') }}"        
    
        Plot7:
            name: String 2 (Ost/Süd)
            sv_widget: "{{ plot.period('', 'PHOTOVOLATIK.String2Power', 'avg', '24h', '', '', '', '', '', '', '', '', 'advanced', '', '', '', '', '') }}"
    Bild1.pngBild2.png
    Zuletzt geändert von teddytornado; 18.03.2022, 14:36.

    Einen Kommentar schreiben:


  • ooUrmeloo
    antwortet
    Zitat von ivande ivande Beitrag anzeigen
    Runden sollte auch ohne extra-Item jedoch mit Eval machbar sein.

    das mit dem Runden ist mir auch schon aufgefallen. Mir ist nur nicht eingefallen auf wie viele Kommastellen gerundet werden sollte? Das wird bei jedem individuell sein. evtl. Abhängig vom modBusFactor- Attribut, oder mit einen weiteren zusätzlichen Attribut?
    Bei mir würden 2 Kommastellen vollkommen ausreichen. Konfigurierbar wäre natürlich schick, ich hab's jetzt aber so umgesetzt. Scheint zu funktionieren:

    Code:
    paradigma:
         Aussentemperatur:
            type: num
            name: AT
            enforce_updates: True
            modBusObjectType: InputRegister
            modBusAddress: 0000
            modBusFactor: 0.1
            modBusDataType: int16
            eval: round(value, 2)
            eval_trigger: paradigma.Aussentemperatur
            # database_maxage: 365
            database: yes

    Einen Kommentar schreiben:


  • ooUrmeloo
    antwortet
    Zitat von ivande Beitrag anzeigen
    beim Starten von SH ist das Item photovoltaik.Speicher_Status noch leer, also value ''
    Genau. Ich habe das auch. Wenn Du SH startest, bringt der Lookup eine Warnmeldung.
    Wenn sich der 'Speicher_Status' das erste Mal ändert und der eval getriggert wird, ist alles gut, und bleibt auch gut.

    Mach's wie ich, erste Warnung ignorieren und dann läuft's wunderbar
    So oft startet man SH ja nicht neu ... wenn's mal stabil läuft

    Einen Kommentar schreiben:


  • ivande
    antwortet
    Zitat von knx75knx Beitrag anzeigen
    Item Photovoltaik.Speicher_Status.Text: problem evaluating 'sh.Photovoltaik.Speicher_Status.Text.lookup()[value]': ''
    die Fehlermeldung kam auch bei mir unmittelbar nach dem Start von SH. Ich habe die Meldung (bisher) einfach ignoriert.

    Grund für die Meldung dürfte sein:
    Beim Starten von SH ist das Item photovoltaik.Speicher_Status noch leer, also value ''

    du könntest versuchen noch '':'' in das initial_value rein zu schreiben. (2xeinfaches Anführungszeichen vor und nach dem Doppelpunkt)


    initial_value: "{'':'', 0: 'Aus', 1: 'Standby', 2: 'Init', 3: 'Laden', 4: 'Entladen', 5: 'Fehler', 6: 'Leerlauf', 7: 'sieben', 8: 'acht', 9: 'neun', 10: 'Energiesparmodus'}"
    Zuletzt geändert von ivande; 20.02.2022, 21:40.

    Einen Kommentar schreiben:


  • Msinn
    antwortet
    Der besagt, dass Dein eval Ausdruck im Item Photovoltaik.Speicher_Status.Text einen Fehler hat.
    Evtl. hat value einen Wert, der im dict Deines lookup Items nicht vorkommt. Un da sicher zu gehen, solltest Du mit der .get() Methode auf das dict zugreifen.

    Probiere doch den eval Ausdruck in der Admin GUI im eval Syntax Prüfer aus. Wenn er da dann die gewünschten Ergebisse liefert, setzt Du ihn in die Item Definition ein.

    Einen Kommentar schreiben:


  • knx75knx
    antwortet
    Hallo zusammen,

    um meinen Solaredge Wechselrichter mit modbus_tcp (1.0.6) auszulesen, habe ich mich an der example.yaml auf der Plugin Seite bei Git orientiert.
    Das Auslesen aller Werte entsprechend dem Sunspec Protokoll funktioniert soweit auch tadellos.
    Ich wundere mich gerade über einen Log-Eintrag bei dessen Interpretation ich nicht weiter komme und hoffe hier noch einen passenden Tipp zu bekommen:

    Im Detail geht es um die Lookup Table, die anhand einer Dezimalzahl einen Text zurück gibt:

    Meine yaml:
    Code:
    Speicher_Status:
       type: num
       name: S_Status
       modBusAddress: 59782
       modBusDataType: uint32
       Text:
          type: str
          eval_trigger: Photovoltaik.Speicher_Status
          eval: sh..lookup()[value]
          lookup:
             type: dict
             initial_value: "{0: 'Aus', 1: 'Standby', 2: 'Init', 3: 'Laden', 4: 'Entladen', 5: 'Fehler', 6: 'Leerlauf', 7: 'sieben', 8: 'acht', 9: 'neun', 10: 'Energiesparmodus'}"
    Bildschirmfoto 2022-02-20 um 12.24.10.png

    Die Auflösung 10 = Energiesparmodus funktioniert soweit

    In der Log Datei finde ich dennoch eine Meldung:

    Code:
    WARNING  lib.item.item       Item Photovoltaik.Speicher_Status.Text: problem evaluating 'sh.Photovoltaik.Speicher_Status.Text.lookup()[value]': ''
    Hat jemand einen Tipp was es mit dem Log-Eintrag auf sich hat?

    Gruß
    Andre

    Einen Kommentar schreiben:


  • teddytornado
    antwortet
    Zitat von ivande Beitrag anzeigen
    hast du evtl. einen Link auf deine Hersteller-Unterlagen? Weshalb das mit den int32 nicht passt würde mich schon interessieren? (Könnte ja durchaus auch im Plugin noch etwas nicht stimmen)
    Modbus/TCP-Schnittstelle der E3/DC GmbH E3/DC GmbH Rechtliche Bestimmungen Änderungshistorie Datum Änderung Bemerkung Bearbeiter Erstellung der Dokumentationen Version 1.0 HWD Tippfehler

    Einen Kommentar schreiben:


  • ivande
    antwortet
    Zitat von teddytornado Beitrag anzeigen
    Die Leistungswerte musste ich von int32 auf int16 wechseln obwohl der Hersteller was anderes sagt. Egal, die Werte stimmen jetzt alle ;-)
    hast du evtl. einen Link auf deine Hersteller-Unterlagen? Weshalb das mit den int32 nicht passt würde mich schon interessieren? (Könnte ja durchaus auch im Plugin noch etwas nicht stimmen)

    Einen Kommentar schreiben:


  • ivande
    antwortet
    Zitat von Tom Bombadil Beitrag anzeigen
    Was mich jetzt mal am Rande interessiert: Wie macht der aus einem "16-bit-String" eine Zeichenkette wie "E3/DC GmbH"??? Oder ist String16 = 16 Byte (hab mir jetzt die Quellen des Plugins nicht angesehen)?
    /tom
    Code:
    if dataType.lower() == 'string':
        words = int(bits/2) # bei string: bits = bytes !! string16 -> 16Byte - 8 words
    die String-Länge kann deshalb flexibel angegeben werden:

    String16 wird als String mit 16Bytes interpretiert, also 8 Word-Register werden gelesen.
    String32 wird als String mit 32Bytes interpretiert, also 16 Word-Register werden gelesen.


    Zitat von ooUrmeloo ooUrmeloo Beitrag anzeigen
    Könnte man gleich noch eine Rundungs-Funktion mit einbauen, damit man solche Temperaturen vermeiden kann (bzw. nicht mit einem Extra-Item (per eval) korrigieren muss - oder geht das einfacher?)?
    Runden sollte auch ohne extra-Item jedoch mit Eval machbar sein.

    das mit dem Runden ist mir auch schon aufgefallen. Mir ist nur nicht eingefallen auf wie viele Kommastellen gerundet werden sollte? Das wird bei jedem individuell sein. evtl. Abhängig vom modBusFactor- Attribut, oder mit einen weiteren zusätzlichen Attribut?

    Zitat von Tom Bombadil Beitrag anzeigen
    Diese N+1 Problematik
    die werde ich wohl in die Dokumentation aufnehmen müssen..


    Zuletzt geändert von ivande; 13.02.2022, 19:03.

    Einen Kommentar schreiben:


  • Bonze
    antwortet
    vl könntest du ja ein struct für dein gerät erstellen, und zur verfügung stellen ..

    Einen Kommentar schreiben:


  • teddytornado
    antwortet
    Zitat von ooUrmeloo Beitrag anzeigen
    Das hätte ich jetzt auch Mal gesagt. "Probier" doch Mal etwas rum mit +/- 1.

    Ist der String wirklich 16bit? Könnte evtl. auch daran liegen?! 32bit werden bei Modbus m.W. nach auf zwei Register aufgeteilt. Bei mir trifft das zumindest bei einigen numerischen Parametern zu. Das könnte evtl. auch das Problem bei deinen nicht passenden Leistungen/Verbräuchen sein ... wenn du das noch hast. Laut Screenshot sind die ja 32bit.
    Hat jetzt alles geklappt! Danke noch mal. Ich muss grundsätzlich die Adresse -1 nehmen. Die Leistungswerte musste ich von int32 auf int16 wechseln obwohl der Hersteller was anderes sagt. Egal, die Werte stimmen jetzt alle ;-)

    e3dc.png

    Einen Kommentar schreiben:


  • Tom Bombadil
    antwortet
    Zitat von ooUrmeloo Beitrag anzeigen
    Ist der String wirklich 16bit?
    Was mich jetzt mal am Rande interessiert: Wie macht der aus einem "16-bit-String" eine Zeichenkette wie "E3/DC GmbH"??? Oder ist String16 = 16 Byte (hab mir jetzt die Quellen des Plugins nicht angesehen)?
    /tom

    Einen Kommentar schreiben:


  • ooUrmeloo
    antwortet
    Das hätte ich jetzt auch Mal gesagt. "Probier" doch Mal etwas rum mit +/- 1.

    Ist der String wirklich 16bit? Könnte evtl. auch daran liegen?! 32bit werden bei Modbus m.W. nach auf zwei Register aufgeteilt. Bei mir trifft das zumindest bei einigen numerischen Parametern zu. Das könnte evtl. auch das Problem bei deinen nicht passenden Leistungen/Verbräuchen sein ... wenn du das noch hast. Laut Screenshot sind die ja 32bit.

    Einen Kommentar schreiben:


  • Tom Bombadil
    antwortet
    Siehe #80 - das ist IMHO kein Problem des Plugins. Es macht einen Unterschied, ob der Hersteller die Register ab 0 oder 1 adressiert, das ist nicht 'genormt':

    Zitat von Sipple Beitrag anzeigen
    Diese N+1 Problematik ist so alt wie ModBus selbst. Je nachdem, wie der Hersteller des Geräts das eben implementiert hat. Mal so, mal so. Leider. Manche fangen halt bei 0 an zu zählen, manche bei 1. Meistens besch... dokumentiert und wenn es dann auch noch gemischt ist, dann wird's unangenehm.
    Ggf. musst Du also bei jedem dokumentierten Register 1 abziehen ...

    /tom

    Einen Kommentar schreiben:


  • teddytornado
    antwortet
    Zitat von ooUrmeloo Beitrag anzeigen

    Hast Du mal ein anderes Tool zum auslesen versucht? Ich habe z.B. qModMaster für Windows ausprobiert. Da kann man auch sehen, was "ankommt". Das hat bei mir auf Anhieb funkioniert. Fehlt bei den numerischen Werten evtl. ein Faktor? Bei mir muss ich mit "0.1" multiplizieren, um das richtige Ergebnis zu bekommen.
    Bei den Strings weiß ich nicht, habe ich keine ...
    Hi,

    vielen Dank für den Tipp! Ich habe nun festgestellt, dass irgendwas mit der Adressierung nicht richtig im Plugin funktioniert.
    Wenn ich z.B. über den QModMaster die Adresse 40004 abfrage, kommt genau der richtige String "E3/DC GmbH" zurück wie in der Dokumentation beschrieben.
    Mache ich das ganze über das modbus_tcp plugin kommt lediglch "/DC GmbH". Wenn ich allerdings als Adresse 40003 verwende kommt der ganze String. Hier stimmt doch irgendwas nicht?!?

    modbus_tcp.png
    Angehängte Dateien

    Einen Kommentar schreiben:

Lädt...
X