FENECON-Speicher mit Modbus auslesen

Begonnen von Fischei, 01 Oktober 2015, 08:54:31

Vorheriges Thema - Nächstes Thema

Fischei

Hallo zusammen,

wir haben einen FENECON-Speicher, bei dem man laut Hersteller die Daten via Modbus/RS485 auslesen kann. Ich hab den Speicher jetzt folgendermaßen angeschlossen:
Speicher -> USB-Verlängerung -> Adapterplatine -> USB-RS485-Adapter -> serielles Kabel -> serielles Kabel -> USB-RS485-Adapter -> Adapterplatine -> USB-Verlängerung -> Raspberry Pi

Leider bekomme ich die Speicherladung noch nicht aus dem Speicher. Modbus und ModbusAttr steht auf opened.

So sieht meine fhem.cfg aus:
define ModbusRS485 Modbus /dev/ttyUSB0@9600
define PWP ModbusAttr 1 30
attr PWP userattr IODev dev-i-defFormat dev-i-defLen dev-i-defPoll dev-i-defUnpack dev-i-read obj-i10143-reading verbose
attr PWP IODev ModbusRS485
attr PWP dev-i-defFormat %.1f
attr PWP dev-i-defLen 1
attr PWP dev-i-defPoll 1
attr PWP dev-i-defUnpack f>
attr PWP dev-i-read 4
attr PWP obj-i10143-reading Speicher
attr PWP verbose 5


2015.09.30 21:31:53 3: Opening ModbusRS485 device /dev/ttyUSB0
2015.09.30 21:31:53 3: Setting ModbusRS485 baudrate to 9600
2015.09.30 21:31:53 3: ModbusRS485 device opened
2015.09.30 21:31:53 3: PWP: defined with id 1, interval 30, destination ModbusRS485, protocol RTU
2015.09.30 21:31:53 1: Including ./log/fhem.save
2015.09.30 21:31:54 5: PWP: GetUpdate called
2015.09.30 21:31:54 5: PWP: GetUpdate objects from attributes: i10143
2015.09.30 21:31:54 5: PWP: GetUpdate full object list: i10143
2015.09.30 21:31:54 5: PWP: GetUpdate check i10143 => Speicher, poll = 1, last = 0
2015.09.30 21:31:54 5: PWP: GetUpdate will request Speicher
2015.09.30 21:31:54 5: PWP: GetUpdate tries to combine read commands
2015.09.30 21:31:54 5: PWP: GetUpdate: combine for i is 1
2015.09.30 21:31:54 5: ModbusRS485: Send adds fcode 4 for Speicher to queue: 0104279f00010b50 pdu 04279f0001
2015.09.30 21:31:58 5: PWP: UpdateGetSetList full object list: i10143
2015.09.30 21:31:58 5: PWP: UpdateSetList: setList=
2015.09.30 21:31:58 5: PWP: UpdateSetList: getList=


Zusätzliche Angaben vom Hersteller:
- Modbus-Adresse ist 10143
- Die seriellen Parameter sind im Wesentlichen: Baudrate 9600; Modbus-Unitid 4, Datenbits 8, Stopbit 1, Parity none

Wenn ich es richtig verstanden habe, dann wird die Abfrage schon an den Speicher geschickt, es werden aber keine Daten zurück gegeben.
Kann es evtl auch noch an der Verkabelung liegen oder steht hier die Verbindung schon?

Hat hier jemand eine Idee?

Wenn Interesse besteht kann ich auch noch ein Foto von der Verkabelung machen und Links für das benötigte Zubehör posten.

Viele Grüße
Michael

StefanStrobel

Hallo Michael,

Das opened bei den Geräten in Fhem bedeutet hier leider nur, dass die serielle Schnittstelle geöffnet werden konnte und nicht dass auch Daten übertragen werden.
Dein Problem kann daher sehr viele Ursachen haben. Angefangen bei der Verkabelung und den Adaptern: ich finde es seltsam dass das Gerät einen USB Anschluss hat und darüber per Adapter ein Modbus Slave sein soll.
Dann könnte es an den Adressen oder am Objekttyp liegen. Wenn es z.B. Holding Register sind und keine Input Register wäre das i falsch und müsste ein h sein.
Falls dann doch was gelesen wird, dann passt der Unpack Code f nicht zu einem 16 bit Wert. Ein Float sollte zumindest 32 bit haben und damit über zwei Rgister gehen. Len müsste dann 2 sein.
Leider schicken sehr viele Modbus Geräte keine Fehlermeldungen wenn eine Adresse nicht stimmt sondern schweigen einfach.
Ich würde zunächst die Verkabelung hinterfragen. Was für einen Adapter hast Du denn am Speicher?
Soll das laut Hersteller wirklich am USB Anschluss am Gerät angeschlossen werden?

Gruß
    Stefan

Fischei

Hallo Stefan,

sorry für die späte Rückmeldung aber ich war privat ein bisschen im Stress.
Aber dafür hab ich gute Nachrichten, ich hab es jetzt hinbekommen. Danke für deine Hilfe. Als Erstes hatte ich noch einen Fehler in der Verkabelung, hier hatte eine Ader keinen Kontakt. Ich hab dann vom Hersteller folgendes Python-Script bekommen, mit dem ich es mal ohne FHEM testen konnte:
from pymodbus.client.sync import ModbusSerialClient as ModbusClient

import logging
logging.basicConfig()
log = logging.getLogger()
log.setLevel(logging.DEBUG)


client = ModbusClient(method='rtu', port='/dev/ttyUSB0', stopbits=1, bytesize=8, parity='N', baudrate=9600, timeout=10)
client.connect()

request = client.read_holding_registers(address=10143, count=1, unit=4)
print request
print request.registers[0]

client.close()


Hier hatte es mit der richtigen Verkabelung funktioniert.
In FHEM hab ich mich dann noch ein bisschen gespielt und mit folgenden Werten funktioniert es dann:
define ModbusRS485 Modbus /dev/ttyUSB0@9600
define Speicher ModbusAttr 4 60
attr Speicher userattr IODev dev-h-defPoll dev-h-defShowGet dev-h-read event-on-change-reading obj-h10143-reading
attr Speicher IODev ModbusRS485
attr Speicher dev-h-defPoll 1
attr Speicher dev-h-defShowGet 1
attr Speicher dev-h-read 3
attr Speicher event-on-change-reading *
attr Speicher obj-h10143-reading 10143-BSMU_Battery_Stack_Overall_SOC

Hauptproblem war die ID 1 beim "define Speicher ModbusAttr 1 60" hier hab ich eine 4 gesetzte und dann hat es funktioniert.
Bezüglich dem Format und der Länge kann ich setzen was ich will, die Daten kommen immer zurück. Mit Float halt dann mit Nachkommastellen aber die sind immer Null. Von den insgesamt ca 200 Werten kann ich jetzt schon ca 100 auslesen. Die restlichen muss ich mir noch genauer anschauen, evtl stimmt hier doch was nicht mit dem Format. Aber das Wichtigste hab ich jetzt schon mal. Danke dir für dein super Modul.

Zu deiner Frage: Ich verwende folgenden Adapter: http://www.amazon.de/gp/product/B007VZY4CW?psc=1&redirect=true&ref_=oh_aui_detailpage_o02_s00

Danke und viele Grüße
Michael

Fischei

#3
Hallo,

also das Auslesen funktioniert bestens. Aber ein kleines Problem habe ich noch:

Bei ein paar Werten kommt ab und zu ein komplett falscher Wert zurück.
z.B. beim produzierten Strom über die PV-Anlage bekomme ich normalerweise immer aufsteigende Werte, also 4535.1, 4535.2, 4535.3 usw.
Aber ca. 1 bis 3 mal am Tag bekomme ich dann z.B. nur 15 zurück. Zum gleichen Zeitpunkt bekomme ich hier auch bei anderen Werten komplett falsche Werte. Es sieht für mich irgendwie nach einer Verschiebung aus. Hat hier noch wer eine Idee?

Oder gibt es eine Möglichkeit, dass z.B. nur Werte mit einer Abweichung von z.B. -+20% zum aktuellen Reading gespeichert werden?


Edit:
Hab mir jetzt mal einen Wert genauer angeschaut. Entweder handelt es sich um eine Verschiebung oder FHEM kommt hier beim Abspeichern der Readings durcheinander. Siehe Screenshot. Der Wert (45298) vom Reading 10154-... ist komplett falsch und hätte eigentlich unter dem 11224-... Reading abgespeichert werden sollen.

@Stefan: Hattest du schon mal so einen Fall?

(http://fs5.directupload.net/images/151019/xzfxvuha.jpg)

StefanStrobel

Hallo Michael,

ich habe gerade erst zufällig Deine Frage gesehen.
Ist das Problem noch aktuell?
Falls ja, könntest Du mal die Konfiguration und einen Auszug aus dem Log mit verbose 5 posten?

Gruß
   Stefan