[ModbusAttr] Umwandlung / Darstellung von Uhrzeiten

Begonnen von froy.de, 07 Januar 2016, 15:50:15

Vorheriges Thema - Nächstes Thema

froy.de

Hallo zusammen,

habe meine Waterkotte-WP (AI1+) über das Modbus-Modul an FHEM angeschlossen und kann inzwischen auch die meisten Werte problemlos auslesen.
Einige der Einstellungen bereiten jedoch noch Probleme bei der Umwandlung der ausgelesenen RAW-Daten in "lesbare" Informationen.
Beispiel:
Die Heizungs-, Kühlungs- oder auch Warmwasserfunktion kann optional an der WP auch nur innerhalb eines bestimmten Zeitfensters aktiviert werden. So wäre es beispielsweise möglich, die Heizungsfunktion nur zwischen 04:00 und 22:00 Uhr aktiv zu haben und zwischen 22:00 und 04:00 keine Heizung zu haben. Ob das in irgendeiner Weise sinnvoll ist oder nicht, sei für den Moment mal dahingestellt.
Zum Auslesen dienen gem. der Waterkotte-Software die Register mit den Nummern 1025 und 1041 (bei der Heizungsfunktion):
#   <name>HeatTimeOn</name>
#   <slaveaddr>1</slaveaddr>
#   <regplc>4</regplc>
#   <regaddr>1025</regaddr>
#   <regcnt>1</regcnt>
#   <datatype>VT_TIME</datatype>
#   <dataformat>%H:%M</dataformat>
#   <min>00:00</min>
#   <max>23:59</max>
#   <accesslev>3</accesslev>
#   <unit>  </unit>
#   <caption_EN>Time start</caption_EN>
#   <caption_DE>Zacatek</caption_DE>


Aktuell lese ich die Register folgendermaßen aus:

define ModBusLine Modbus /dev/ttyUSB0@9600
define WP ModbusAttr 1 300
attr WP obj-h1025-reading HeatTimeOn
attr WP obj-h1025-len 1
attr WP obj-h1025-revRegs 1
attr WP obj-h1025-format %x
attr WP obj-h1041-reading HeatTimeOff
attr WP obj-h1041-len 1
attr WP obj-h1041-revRegs 1
attr WP obj-h1041-format %x

Als Ergebnis bekommen ich bei einer Einstellung von 04:00 (Startzeit) und 22:00 (Endezeit) an der WP den Wert 400 (hex) für HeatTimeOn bzw. 1600 (hex) für HeatTimeOff geliefert.
Offensichtlich kodiert der Datentype VT_TIME die Uhrzeit als Stunde und Minute jeweils in einem Byte. Also, 1600 (hex) entspricht "22:00" und 400 (hex) entspricht "04:00".

Im ModbusModul gibt es zur Umwandlung des Readings in ein besser lesbares Datum die Möglichkeit mittels "-expr" den Wert quasi beliebig zu ändern.

Da ich (leider) ziemlicher Perl-Anfänger bin: Wie kann ich "-expr" einsetzen, damit aus meinem Reading "1600" am Ende ein "22:00" in der Anzeige wird?

Update 08.01.2016, 17:10:

Mittlerweile kann ich die Uhrzeit über "-expr" besser darstellen:
attr WP obj-h1489-format %s
attr WP obj-h1489-expr (( (($val>>8)) .":". (($val&0xff)) ))

Allerdings kommt dann z.B. bei "00:00" nur die Anzeige "0:0" heraus bzw. bei 4 Uhr früh "4:00". Hat jemand noch eine Idee, wie man die einzelnen Zahlen jeweils mit führender "0" anzeigen kann?

Update 08.01.2016, 18:13:

gelöst:
attr WP obj-h1489-expr (( sprintf("%02d:%02d", (( $val >> 8 )), (( $val & 0xff )) ) ))

bkuerby

#1
Hallo Froy,

da bist du jetzt selbst schneller gewesen. Ich wollte mich heute mal an der Wandlung versuchen.
Ich bin auch gerade dabei meine AI1+ zu koppeln. Leider scheitere ich noch an der Umwandlung der Werte.
Im Register 433 müsste eigentlich die Außentemperatur liegen. Ich bekomme auch eine Wert, der hat aber nicht annähernd etwas mit der Außentemperatur zu tun.
Welche Attribute hast du zur Wandlung verwendet?

Gruß
Bastian

Update 09.01.2016 00:27
Bin nach einigem try and error selbst drauf gekommen.
Außentemperatur liefert jetzt: 1.99617958068848

DerRuffi

Hallo,

ich habe ein ganz ähnliches Anliegen wie mein Vorredner. Ich möchte das Modbus Modul verwenden um meine Helios Lüftungsanlage zu steuern.
Allerdings verlangt Helios Hex-Code als Eingabe/Ausgabe.
Hier die Helios Spezifikationen:
https://www.google.de/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&cad=rja&uact=8&ved=0ahUKEwj8mKHWqMDKAhUj83IKHafWBjIQFgggMAA&url=https%3A%2F%2Fwww.heliosventilatoren.de%2Fmbv%2Fkwl-modbus_gateway_82269_0714_d_e_f.pdf&usg=AFQjCNEtrizMe3rNInXk5IVXy4prF8Bdrg&sig2=NwHNyPL_XKiCNsBke9Fc-w

Mit dem Programm Modpoll kann ich schon die Heliosanlage ansteuern:
modpoll -m tcp -a 180 -t4:hex -r 1 -0 -1 -o 2.0 192.168.27.24 0x7630 0x3031 0x3031 0x3D30 0x0000
Der Hex Code bedeutet "v00101=0" und schaltet in diesem Beispiel den Lüfter auf Automatik. Da in diesem Beispiel 5 Register erwartet werden gibt es am Ende noch die "NUL".

Da ich nun absoluter Neuling in Sachen Perl bin, frage ich mal in die Runde, wie man das in FHEM umsetzen könnte.
Als Anfang würde ich gerne das oben genannte Beispiel per fhem in das Register schreiben.

Gruß,
DerRuffi

DerRuffi

Ich habe einen kleinen Fortschritt erziehlt.
Der folgende Code liest immerhin das erste Register als 4-stelligen Hex-Code aus:

define MD ModbusAttr 180 30 192.168.27.24:502 TCP
attr MD dev-h-read 3
attr MD dev-h-write 16
attr MD dev-h-defPoll 1     
attr MD dev-h-defShowGet 1   

attr MD obj-h1-reading Helios_Temp
attr MD obj-h1-len 4
attr MD obj-h1-format %x


Die Ausgabe ist in diesem Fall "7630".
Es fehlen mir aber nun noch die folgenden Registerwerte. Bei Modpoll kann ich dies über die Option -c # Number of values to poll (1-100, 1 is default) steuern.

Wenn ich statt "obj-h1*" "obj-h2*" definiere, gibt fhem auch "7630" aus.

Kann jemand helfen?

froy.de

Hallo bkuerby,

sorry, habe das Forum ein paar Tage nicht angeschaut... - bist aber ohnehin schon selbst auf eine Lösung gekommen.

Ich kämpfe mich mit den unterschiedlichen Registern und Werten auch Schritt für Schritt voran. In meinem Setup habe ich einen RasPi mit FHEM per Serial-zu-USB-Adapter an der Waterkotte und eine FHEM-VM auf dem QNAP. Die FHEM-VM ist quasi der "Haupt-FHEM" und holt sich die Messwerte vom RasPi. Zukünftig sollen dann noch weitere FHEM-Instanzen über Netzwerk angeschlossen werden, um die Lüftungsanlage und Stromzähler auch auslesen zu können.

Meine aktuelle Konfiguration als Auszug im Anhang:

       
  • bis ca. Zeile 1313 die FHEM-Config vom RasPi
  • ab ca. Zeile 1317 die FHEM-Config von der FHEM-VM
Die Liste der möglichen Readings habe ich von hier: http://schumann-haustechnik.de/service/download-service/index.php4

Mit einer Dashboard-Konfiguration kommt dann so etwas wie im PNG-Screenshot raus.

Da das Modbus-Modul das für die Waterkotte notwendige Ändern der Werte ("*-bswap") für die Funktion zum Schreiben anscheinend noch nicht unterstützt, habe ich mich bislang auf's Auslesen konzentriert.

Wenn alle Werte ausgelesen werden, ist der Plan, als nächstes ein eigenes Modul für das Waterkotte-Modell zu schreiben, aber zum Schreiben von Modulen fehlt mir noch die Erfahrung...

Gruß

Marco

froy.de

Hallo DerRuffi,

lt. dem verlinkten PDF kommen bei einer korrekten Abfrage immer 16 Bytes zurück. Wenn ich ModbusAttr richtig verstanden habe, ist "ein" Register immer ein 16-Bit-Wert. Um die 16 Bytes zu lesen, müsstest Du also auch 8 Register  (16 Bytes / 2 Bytes pro Register) lesen.
In Deinem Beispiel liest Du jedoch nur
attr MD obj-h1-len 4
also 4 Register.
Was kommt denn raus, wenn Du
attr MD obj-h1-len 8
versuchst?
Zusätzlich könntest Du auch noch versuchen, den Rückgabewert zunächst mal als (lesbare) Zeichenkette zu erhalten:
attr WP obj-h1-format %.16s
attr WP obj-h1-len 8
attr WP obj-h1-poll 1
attr WP obj-h1-reading Helios_Temp
attr WP obj-h1-unpack (a*)


Wenn das alles klappt, sollte lt. PDF-Doku so etwas wie
V00104=25.500000
zurück kommen. Anschließend musst Du "nur" noch aus der Zeichenkette ab "=" den Zahlenwert extrahieren.

Gruß

Marco

DerRuffi

Hallo Marco,

Durch deinen Vorschlag konnte ich einen String erfolreich auslesen.
Für eine Objektlänge von 8 bekomme ich "v00004=" und für eine Länge von 16 "v00004=27.01.201" als Ergebnis.
Laut Helios Refernz beträgt der "Count" dieser Variablen 9. Die Variable ist die Systemzeit.
Wenn ich die Länge noch weiter hochsetze wird allerdings nicht die noch fehlende Ziffer "6" angezeigt.

Der nächste Schritt ist nun das Schreiben von Registern. Die Helios Routine verlangt, dass man die abzufragende Variable zunächst einmal schreibt (das habe ich bisher über Modpoll gemacht):
"vxxxxx\0"
Variablen umschreiben kann man wie folgt:
"vxxxxx=yyyyy...\0"

Marco, wie lautet der Umkehrbefehl für "attr WP obj-h1-unpack (a*)", um aus einem String den Hex Code in richtigem Format zu erzeugen?

Vielen Dank,
Niklas

froy.de

Hallo Niklas,

ich habe zwar bislang noch keine Werte geschrieben, schätze aber, dass -unpack hier nicht verwendet wird.
Offenbar ist bei ModbusAttr angedacht, die Umwandlung der vom Benutzer ausgewählten Werte mittels -setexpr zu vorzunehmen.
Aus einer Zeichenkette wie z.B. "v00004\0", müsste der entsprechende HEX-Wert für die -setexpr mit
obj-xy-setexpr (( unpack("H*", $val )))
gesetzt werden können. Da sollte dann "76303030303400" heraus kommen.

Ich habe nochmal in die verlinkte Doku reingeschaut und weiß auch nicht mehr, wie ich auf die 16 Bytes Rückgabewert komme. Das macht keinen Sinn; ab Seite 11 (Kapitel 11) stehen ja die einzelnen Variablen drin und auch der "count", der angibt, wie lang der Rückgabewert ("Register") sein wird.

Beim Register v0104 (Temperatur Außenluft) ist der count (-len) 8, beim Datum v00004 ist der count (-len) 9. Also "eigentlich" sollte bei der Länge "9" auch das komplette Datum mit vierstelliger Jahreszahl zurückkommen.

Die Helios-Anlage scheint ja insofern besonders zu sein, als dass man erstmal die auszulesende Variable in ein Register schreiben muss, bevor man den Wert aus dem gleichen Register auslesen kann. Wie man das mit ModbusAttr umsetzt, weiß ich leider nicht.

Ggf. mal den Autor ("StefanStrobel") des Modbus-Moduls fragen?

Gruß

Marco

fhem_TS

Hallo,

ZitatBeim Register v0104 (Temperatur Außenluft) ist der count (-len) 8, beim Datum v00004 ist der count (-len) 9. Also "eigentlich" sollte bei der Länge "9" auch das komplette Datum mit vierstelliger Jahreszahl zurückkommen.

das Problem der fehlenden Ziffer kann durch ändern von
attr WP obj-h1-format %.16s
auf
attr WP obj-h1-format %.20s
gelöst werden.

Beim Lesen des Registers gibt die Helios nur einen Fehler zurück wenn zu wenige Register ausgelesen werden (z.B. 8 statt 9).
Bei zu vielen Registern wird durch "0000" aufgefüllt.

Gruß
Tobias
fhem@RPi3
FS20 <-> Busware CUL
Homematic <-> HM-USB

mischi

Zitat von: froy.de am 24 Januar 2016, 13:45:40
Die Liste der möglichen Readings habe ich von hier: http://schumann-haustechnik.de/service/download-service/index.php4
Du bist für mich der Held des Tages, danach habe ich schon sehr lange gesucht. Danke! Jetzt schaue ich mich erstmal Deine Konfiguration an, ich habe auch einen WCPU Regler an meiner Waterkotte Wärmepumpe.

StefanStrobel

Hallo Marco,

Ich habe revRegs und bSwapRegs jetzt auch für das Schreiben von Werten ins Modbus-Modul eingebaut.
Damit solltest Du auch Werte der Waterkotte ändern können.

https://forum.fhem.de/index.php/topic,25315.300.html

Gruss
    Stefan