ECMD, ECMDDEVICE, Kommunikation mit Mastervolt Wechselrichter

Begonnen von Knallkopp_02, 22 April 2020, 11:08:03

Vorheriges Thema - Nächstes Thema

Knallkopp_02

Hallo FHEM-Gemeinde,

nach langem hin und her, scheine ich nun die richtig Communicationsmethode für meinen Wechselrichter gefunden zu haben - Hoffendlich.

Leider ist die Doku zur Schnittstelle sehr spärlich, daher kann ich mit nur wenig Daten dienen, das was ich habe ist alle aus irgendwelchen Foren zusammen gesucht.

Ich habe folgendes für einen der Wechselrichter eingerichtet und taste mich nun langsam voran, stecke aber fest.


defmod Mastervolt_Communication ECMD serial /dev/ttyUSB1@9600
attr Mastervolt_Communication DbLogExclude .*
attr Mastervolt_Communication classdefs mastervolt.class=/opt/fhem/FHEM/mastervolt.cfg
attr Mastervolt_Communication logTraffic 5

setstate Mastervolt_Communication opened
setstate Mastervolt_Communication 2020-04-22 10:31:24 state opened


dies sieht für mich als Laie schonmal gut aus.

deweiteren habe ich folgendes konfiguriert, um überhaup mal Daten zu bekommen, dass das alles nicht stimmt, ist mir klar


################## mastervolt.cfg ###############
#
#!/usr/bin/perl
# Modell/Firmware/Seriennummer
get state cmd {"22 01 ff ff b4 00 00 00 d5"}
get state expect ".*"
get state postproc { my ($rval,$pval,$qval,$lval,$yval,$xval,$zval);\
my $hash  = $defs{"%NAME"};\
if( ($_ eq "")||($_ eq "no data stored") ){\
    $rval = "err";\
    $pval = "err";\
    $qval = "err";\
    $lval = "err";\
    $yval = "err";\
    $xval = "err";\
    $zval = "err";\
}else{\
    my @values=split(' ',$_);\
    $rval = sprintf("%5.2f °C",$values[0]);\
    $pval = ($values[1] == 1)?"ON":"OFF";\
    $qval = ($values[1] == 1)?65:0;\
    $lval = sprintf("%5.2f %%",$values[2]);\
    $yval = sprintf("%d",$values[3]);\
    $xval = sprintf("%5.2f %d %5.2f %d",\
      $values[0],$qval,$values[2],$values[3]);\
    $zval = sprintf("Coll.T %5.2f °C, %s",\
      $values[0],$pval);\
}\
readingsSingleUpdate($hash, "Coll.T", $rval, 1);\
readingsSingleUpdate($hash, "Pumpe", $pval, 1);\
readingsSingleUpdate($hash, "Pumpe.P", $qval." W", 1);\
readingsSingleUpdate($hash, "Load",  $lval, 1);\
readingsSingleUpdate($hash, "Yield", $yval, 1);\
readingsSingleUpdate($hash, "reading", $xval, 1);\
$zval; }



und das hier


defmod Mastervolt_1_6400 ECMDDevice mastervolt.class
attr Mastervolt_1_6400 DbLogExclude .*
attr Mastervolt_1_6400 IODev Mastervolt_Communication

setstate Mastervolt_1_6400 state Coll.T 22.00 °C, OFF
setstate Mastervolt_1_6400 2020-04-22 14:24:02 Coll.T 22.00 °C
setstate Mastervolt_1_6400 2020-04-22 14:24:02 Load  0.00 %
setstate Mastervolt_1_6400 2020-04-22 14:24:02 Pumpe OFF
setstate Mastervolt_1_6400 2020-04-22 14:24:02 Pumpe.P 0 W
setstate Mastervolt_1_6400 2020-04-22 14:24:02 Yield 0
setstate Mastervolt_1_6400 2020-04-22 14:24:02 reading 22.00 0  0.00 0
setstate Mastervolt_1_6400 2020-04-22 14:24:02 state state Coll.T 22.00 °C, OFF


Zum grundlegenden, was ich über die Wechselrichter weiß:

Einer der Anfragebefehl ist so aufgebaut:

ID WR Befehl Checksumme
22 01 ff ff b4 00 00 00 d5

daraufhin sollte es dann folgende Antwort geben wobei der Anfang die Anfrage beinhaltet und scheint immer aus 40 Hexwerten zu bestehen.

Model Seriennummer Firmware
22 01 ff ff b4 00 00 00 d5 ff ff 22 01 b4 fe 04 57 36 07 4a 03 06 e4 00 12 00 17 08 e5 00 54 00 29 08 e6 01 00 24 07 4f

Als Ausgabe bekomme ich wie oben zu sehen "22.00 °C", also die ersten beiden Zeichen, manchmal auch nur die 2, also das erste Zeichen.

Was ich nicht genau weiß, wie ich die Anfrage genau stellen muß? Das ist in den Quellen die ich sehr unterschiedlich von "22 01 ..." über "2201..." zu "CHR(&H22).CHR(.&H01)..."

Die Konfiguration habe ich aus dem EBUS-ECMD Wiki, dort habe ich zum testen die einfachste Version genommen um erstmal zu schauen, ob und was ich bekomme.

Später werde ich warscheinlich die ECMD Classdefinition Heizkreis als Vorlage nehmen, um alle Werte zu bekommen und dann nach belieben zusammen zu setzen, weil zb. 00 54 00 ist die Seriennummer in umgekehrter Reihenfolge geteilt durch 100 - bitte nicht fragen, warum das so ist.

wie bekomme ich jetzt schonmal die gesamte Antwort wäre meine Frage, das würde mir warscheinlich schonmal helfen.

Gruß Knallkopp_02
Ich bin kein Programmierer und habe keine Ahnung.

Raspberry PI 3B+ mit HM-MOD-RPI-PCB,     
HM-TC-IT-WM-W-EU, HM-CC-RT-DN, HM-SEC-SCo
Raspberry PI 3B+ mit 7" Touchdisplay

Dr. Boris Neubert

Hallo,

Du musst mit dem expect die gesamte Nachricht genau matchen, also diese vielen Hex-Zahlen mit Spaces dazwischen, nicht nur einen beliebigen String matchen.

Viele Grüße
Boris
Globaler Moderator, Developer, aktives Mitglied des FHEM e.V. (Marketing, Verwaltung)
Bitte keine unaufgeforderten privaten Nachrichten!

Knallkopp_02

#2
Nach langem Testen bekomme ich grade zum ersten mal im Log folgende Ausgabe:


Mastervolt_Communication: unexpected answer 2 (\062) received (wrote 22 01 ff ff b4 00 00 00 d5 (\062\062\040\060\061\040\146\146\040\146\146\040\142\064\040\060\060\040\060\060\040\060\060\040\144\065), expected .)


Daraus lese ich, wie du schon sagtest, das er etwas anderes erwartet, aber was genau verstehe ich nicht. Habe mich versucht mit einem Regex Editor weiter zu hangeln, aber das hat nicht geklappt.

Habe solche Sachen wie "....*", "....+" "(.\d\d\d)" "^(.\d\d\d)*" getestet, leider nicht mit gewünschtem Erfolg. Im Editor sieht es immer gut aus und er zeigt mir den gesamten Inhalt als Match an, wenn ich es aber einbinde bekomme ich immer nur das erste Zeichen angezeigt.

Bin aber auch kein Regex Experte.
Was mich ebenso wundert, ist das die ganzen Zeichen ja anscheinend in Octal Werten geschrieben und gelesen werden, kann man das irgendwie ändern, oder muss ich dann diese Werte nachher wieder in was für mich verwertbare umändern?

Ich brauche erstmal alle Werte, also den gesamten Inhalt, damit ich auch überhaupt sehen kann, ob es die Antwort ist, oder was anderes.

Gruß Knallkopp_02
Ich bin kein Programmierer und habe keine Ahnung.

Raspberry PI 3B+ mit HM-MOD-RPI-PCB,     
HM-TC-IT-WM-W-EU, HM-CC-RT-DN, HM-SEC-SCo
Raspberry PI 3B+ mit 7" Touchdisplay

Dr. Boris Neubert

Hallo,

EMCD loggt immer den Text und hintendran in Klammern alle Zeichen nochmal oktal.

Es führt kein Weg daran vorbei, dass Du Dich in reguläre Ausdrücke einarbeitest.

Ansatzpunkt:

([0-9a-f]{2} ){39}[0-9a-f]{2}

Viele Grüße
Boris
Globaler Moderator, Developer, aktives Mitglied des FHEM e.V. (Marketing, Verwaltung)
Bitte keine unaufgeforderten privaten Nachrichten!

Knallkopp_02

Danke für die schnelle Antwort Boris,

ich verstehe sogar deinen regulären Ausdruck, wäre nur nie auf die Idee gekommen, den so zu erstellen.

Das Problem besteht aber weiterhin, und was komisch ist, die Antwort im Log wechselt manchmal zwischen folgenden beiden:


2020.04.23 12:19:19 1: Mastervolt_Communication: unexpected answer 22 (\062\062) received (wrote 22 01 ff ff b4 00 00 00 d5 (\062\062\040\060\061\040\146\146\040\146\146\040\142\064\040\060\060\040\060\060\040\060\060\040\144\065), expected (([0-9a-f]{2} ){39}[0-9a-f]{2}))



2020.04.23 12:20:17 1: Mastervolt_Communication: unexpected answer 2 (\062) received (wrote 22 01 ff ff b4 00 00 00 d5 (\062\062\040\060\061\040\146\146\040\146\146\040\142\064\040\060\060\040\060\060\040\060\060\040\144\065), expected (([0-9a-f]{2} ){39}[0-9a-f]{2}))


habe es auch ohne die zusätzliche Klammer (xxx) außen drum herum gestestet, gleiches Ergebniss.

Ebenso ob die Anfrage mit LEERZEICHEN oder ohne gesendet werden muss (regulärer Ausdruck natürlich angepasst), gleiche Ergebniss.

Was mir aufgefallen ist, wenn ich die Abfrage in FHEM starte, dann braucht er unterschiedlich lang, wenn er 22 ausspuckt dauert die Abfrage länger, was ja auch verständlich wäre.

Gruß Knallkopp_02
Ich bin kein Programmierer und habe keine Ahnung.

Raspberry PI 3B+ mit HM-MOD-RPI-PCB,     
HM-TC-IT-WM-W-EU, HM-CC-RT-DN, HM-SEC-SCo
Raspberry PI 3B+ mit 7" Touchdisplay

pejonp

#5
Hi,

Ich hatte hier mal etwas gemacht, vielleicht bringt es dich etwas weiter (https://forum.fhem.de/index.php/topic,42793.msg351541.html#msg351541)

Hattest du noch mal mit Modbus weitergemacht ?

Pejonp
LaCrossGW 868MHz:WT470+TFA+TX37-IT+EMT7110+W136+WH25A HP1003+WH2621
SignalD(CC1101):Bresser+WS-0101(868MHz WH1080)+Velux KLF200+MAX!+HM-MOD-UART:Smoke HM-SEC-SD+VITOSOLIC 200 RESOL VBUS-LAN+SolarEdge SE5K(Modbus)+Sonnen!eco8(10kWh)+TD3511+DRT710M(Modbus)+ZigBee+Z-Wave+MQTT+vitoconnect

Dr. Boris Neubert

Bitte noch das Attribut partial einbeziehen.

Danach bitte mal die aktuelle Device-Konfiguration, Klassendefinition und einen Mitschnitt mit Attribut logTraffic 9 hier posten.
Globaler Moderator, Developer, aktives Mitglied des FHEM e.V. (Marketing, Verwaltung)
Bitte keine unaufgeforderten privaten Nachrichten!

Knallkopp_02

Hallo pejonp,

bei mir hat sich herausgestellt, das es kein Modbus ist, mit welchem kommuniziert wird. Es ist einen einfache Serielle Verbindung, Trotzdem Danke für die Hilfe, werden in den anderen Posts dazu noch etwas Schreiben.

Und nun zu dir Boris,
der Tip mit dem partial war der richtige, ich bekommen nun zumindest eine längere Antwort, wenn auch nicht die, die ich will.
Das liegt aber warscheinlich an meiner Anfrage, die Falsch ist, werde dies nun näher unter die Lupe nehmen und bei Fragen oder Fertigstellung hier Antworten.

BTW meintest du nicht logTraffic 5, weil das ist das maximum, was ich einstellen kann aus dem Pulldown

Erstmal vielen Dank an Euch alle.

Gruß Knallkopp_02
Ich bin kein Programmierer und habe keine Ahnung.

Raspberry PI 3B+ mit HM-MOD-RPI-PCB,     
HM-TC-IT-WM-W-EU, HM-CC-RT-DN, HM-SEC-SCo
Raspberry PI 3B+ mit 7" Touchdisplay

Knallkopp_02

#8
Nun geht es doch weiter mit Fragen,

Vornweg, wie schon geschrieben bekomme ich eine Antwort, wenn auch nicht die richtige, ich will aber schon mal versuchen eine Ausgabe in Fhem zu bekommen.


11 01 ff ff b4 00 00 00 c4


das bekomme ich als Antwort in Fhem.
Fehm loggt einen "unexpected answer", verstehe ich, erwartet weden HEX 40 Zeichen, bekommen tut es 9.

wenn ich folgenden Code nehme bekomme ich eine zerlegte Ausgabe was ja schonmal gut ist


################## mastervolt.cfg ###############
#
#!/usr/bin/perl
# Modell/Firmware/Seriennummer
get state cmd {"11 01 ff ff b4 00 00 00 c4"}
get state expect "([0-9a-f]{2} ){39}[0-9a-f]{2}"
get state postproc { my ($model,$serial,$firmware,$lval,$yval,$xval,$zval);\
        my $hash  = $defs{"%NAME"};\
        if( ($_ eq "")||($_ eq "no data stored") ){\
                $model = "err";\
                $serial = "err";\
                $firmware = "err";\
                $lval = "err";\
                $yval = "err";\
                $xval = "err";\
                $zval = "err";\
        }else{\
                my @values=split(' ',$_);\
                $model = $values[0];\
                $serial = $values[1];\
                $firmware = $values[2];\
                $lval = sprintf("%5.2f %%",$values[2]);\
                $yval = sprintf("%d",$values[3]);\
                $xval = sprintf("%s",$values[0],$firmware,$values[2],$values[3]);\
                $zval = sprintf("$_",$values[0],$serial);\
        }\
        readingsSingleUpdate($hash, "Model", $model, 1);\
        readingsSingleUpdate($hash, "Seriennummer", $serial, 1);\
        readingsSingleUpdate($hash, "Firmware", $firmware, 1);\
        readingsSingleUpdate($hash, "Load",  $lval, 1);\
        readingsSingleUpdate($hash, "Yield", $yval, 1);\
        readingsSingleUpdate($hash, "reading", $xval, 1);\
        $zval;\
}


Dort sind nun zu viele Daten drin, also habe ich ihn gestutzt, dann bekomme ich aber nur "state 11 01 ff ff b4 00 00 00 c4", mehr nicht.
Ich dachte eigendlich ich hätte wenigstens etwas verstanden, aber irgendwie funktioniert es nicht.


################## mastervolt.cfg ###############
#
#!/usr/bin/perl
# Modell/Firmware/Seriennummer
get state cmd {"11 01 ff ff b4 00 00 00 c4"}
get state expect "([0-9a-f]{2} ){39}[0-9a-f]{2}"
get state postproc { my ($model,$serial,$firmware);\
        my $hash  = $defs{"%NAME"};\
        if( ($_ eq "")||($_ eq "no data stored") ){\
                $model = "err";\
                $serial = "err";\
                $firmware = "err";\
#                $lval = "err";\
#                $yval = "err";\
#                $xval = "err";\
#                $zval = "err";\
        }else{\
                my @values=split(' ',$_);\
                $model = $values[0];\
                $serial = $values[1];\
                $firmware = $values[2];\
#                $lval = sprintf("%5.2f %%",$values[2]);\
#                $yval = sprintf("%d",$values[3]);\
#                $xval = sprintf("%s",$values[0],$firmware,$values[2],$values[3]);\
#                $zval = sprintf("$_",$values[0],$serial);\
        }\
        readingsSingleUpdate($hash, "Model", $model, 1);\
        readingsSingleUpdate($hash, "Seriennummer", $serial, 1);\
        readingsSingleUpdate($hash, "Firmware", $firmware, 1);\
#        readingsSingleUpdate($hash, "Load",  $lval, 1);\
#        readingsSingleUpdate($hash, "Yield", $yval, 1);\
        readingsSingleUpdate($hash, "reading", $_, 1);\
#        $zval;\
}



Was mache ich jetzt wieder falsch, ich habe oben bei "get state postproc" die überflüssigen Variable heraus genommen und unten auskommentiert.

!!!EDIT!!!
Ich habe noch etwas gefunden, was evtl bei der Anfrage helfen kann, wie sie Aufgebaut werden sollte hier mal der Link https://github.com/langemeijer/mastervolt-php/blob/master/MasterVolt.php

Ebenso habe ich nochmal in meinen Scripten von damals unter Win 7 32bit geschaut, und da ist mir das in die Hände gefallen.


Sub CommandOpenPort()
    Dim intPortID As Integer ' Ex. 1, 2, 3, 4 for COM1 - COM4
    Dim lngStatus As Long

   
     intPortID = 3

    ' Open COM port
    lngStatus = CommOpen(intPortID, "COM" & CStr(intPortID), _
        "baud=9600 parity=N data=8 stop=1")
       
       
End Sub
Sub CommandSendDataFirmware()

    Dim intPortID As Integer ' Ex. 1, 2, 3, 4 for COM1 - COM4
    Dim lngStatus As Long
    Dim strData As String


    intPortID = 3
    strData = Chr(&H22) & Chr(&H1) & Chr(&HFF) & Chr(&HFF) & Chr(&HB4) & Chr(&H0) & Chr(&H0) & Chr(&H0) & Chr(&HD5)
    'strData = Chr(&H21) & Chr(&H1) & Chr(&HFF) & Chr(&HFF) & Chr(&HB4) & Chr(&H0) & Chr(&H0) & Chr(&H0) & Chr(&HD4)
    'strData = Chr(&HB1) & Chr(&H0) & Chr(&HFF) & Chr(&HFF) & Chr(&HB4) & Chr(&H0) & Chr(&H0) & Chr(&H0) & Chr(&H63)
    'strData = Chr(&H11) & Chr(&H1) & Chr(&HFF) & Chr(&HFF) & Chr(&HB4) & Chr(&H0) & Chr(&H0) & Chr(&H0) & Chr(&HC4)
   
    'strData = Chr(&H22) & Chr(&H1) & Chr(&HFF) & Chr(&HFF) & Chr(&HB6) & Chr(&H0) & Chr(&H0) & Chr(&H0) & Chr(&HD7)
   
    'Write data
    lngStatus = CommWrite(intPortID, strData)
   
    sleep 2000


End Sub
Sub CommandReceiveDataFirmware()

    Dim intPortID As Integer ' Ex. 1, 2, 3, 4 for COM1 - COM4
    Dim lngStatus As Long
    Dim strData As String
   
    intPortID = 3
    lngStatus = CommRead(intPortID, strData, 1024)
   
    MsgBox lngStatus & " Zeichen empfangen !"
   
    strData = ShowHexCode(strData)
   
    MsgBox strData
   
    Dim WrdArray() As String
    Dim text_string As String
    Dim var1 As String
    Dim seriennummer As String
    Dim datum As String
    Dim fw1 As String
       
'____Info
    'text_string = "22 1 ff ff b4 0 0 0 d5 ff ff 22 1 b4 fe 4 57 36 7 4a 3 6 e4 0 12 0 17 8 e5 0 54 0 29 8 e6 1 0 24 7 4f"
    'text_string = "22 1 ff ff B4 0 0 0 d4 ff ff 22 1 b4 fe 4 57 36 7 a4 3 6 e4 0 12 0 17 8 e5 0 54 0 29 8 e6 1 0 24 7 4f"
    'text_string = "b1 0 ff ff b4 0 0 0 63 ff ff b1 0 b4 dc 4 41 4f 5 49 35 11 e4 0 13 3 28 9 e5 0 4 9 40 9 e6 0 1 24 7 df"
    'text_string = "11 1 ff ff b4 0 0 0 c4 ff ff 11 1 b4 dc 4 41 32 8 49 16 95 e4 0 13 3 28 9 e5 0 4 9 40 9 e6 0 1 24 7 8b"
'____Daten

    strData = UCase(strData)
   
    WrdArray() = Split(strData, " ")
   
    If WrdArray(14) = "DB" Then
        MsgBox "XS2000", , "Wechselrichter Modell"
    ElseIf WrdArray(14) = "DC" Then
        MsgBox "XS3200", , "Wechselrichter Modell"
    ElseIf WrdArray(14) = "FF" Then
        MsgBox "XS4300", , "Wechselrichter Modell"
    ElseIf WrdArray(14) = "FE" Then
        MsgBox "XS6500", , "Wechselrichter Modell"
    Else: MsgBox "Error, Modell nicht gefunden", , "Wechselrichter Modell"
    End If

    seriennummer = Chr(CLng("&H" & WrdArray(16))) & Chr(CLng("&H" & WrdArray(17))) & Format(WrdArray(18), "00") & Chr(CLng("&H" & WrdArray(19))) & Format(WrdArray(20), "00") & Format(WrdArray(21), "00")
    MsgBox seriennummer, , "Seriennummer"
    'datum = WrdArray(22) & WrdArray(23) & WrdArray(24) '& WrdArray(25) & WrdArray(26) & WrdArray(27) & WrdArray(28) & WrdArray(29) & WrdArray(30) & WrdArray(31) & WrdArray(32) & WrdArray(33) & WrdArray(34) & WrdArray(35) & WrdArray(36) & WrdArray(37) & WrdArray(38)
    'MsgBox datum
    fw1 = WrdArray(31) & WrdArray(30) & WrdArray(29)
    fw1 = fw1 / 100
    MsgBox fw1, , "Firmware 1"

End Sub

!!!/EDIT!!!

Lieben Gruß
Ich bin kein Programmierer und habe keine Ahnung.

Raspberry PI 3B+ mit HM-MOD-RPI-PCB,     
HM-TC-IT-WM-W-EU, HM-CC-RT-DN, HM-SEC-SCo
Raspberry PI 3B+ mit 7" Touchdisplay

Dr. Boris Neubert

Hallo,

wenn Du 40 Hex-Zahlen erwartest aber nur 9 bekommst, kann es nicht funktionieren.

Bitte immer die aktuelle Device-Konfiguration, Klassendefinition und einen Mitschnitt des Verkehrs mit Attribut logTraffic 5 posten, sonst ist das eine Raterei, die ich nicht mehr mitmache.

Grüße
Boris
Globaler Moderator, Developer, aktives Mitglied des FHEM e.V. (Marketing, Verwaltung)
Bitte keine unaufgeforderten privaten Nachrichten!

Knallkopp_02

Ich versuche aktuell eine passende Antwort vom Wechselrichter zu bekommen, anscheinend stelle ich nicht die richtige Frage , bzw nicht in der richtigen Art.

Hoffe das ich das hinbekomme.

Gruß und Danke
Ich bin kein Programmierer und habe keine Ahnung.

Raspberry PI 3B+ mit HM-MOD-RPI-PCB,     
HM-TC-IT-WM-W-EU, HM-CC-RT-DN, HM-SEC-SCo
Raspberry PI 3B+ mit 7" Touchdisplay

Knallkopp_02

#11
Hallo Boris, erstmal noch ein herzliches Danke an Dich. Ich versteh natürlich, das es unheimlich schwer ist jemandem zu helfen, der eigendlich nicht weiß was er tut, und dazu noch wenige Infos geben kann.

Hier jetzt meine aktuellen Daten die ich dir nennen kann mit der Hoffnung, dass du trotzdem damit etwas anfangen kannst.
Es kommt jetzt zumindest etwas an, die Länge beträgt schonmal die gewünschten 40 Zeichen, nur in einer Kodierung die nicht stimmt. Zumindest teilweise - einen Teil erkenne ich als Seriennummer - es ist komisch.


defmod Mastervolt_Communication ECMD serial /dev/ttyUSB1@9600
attr Mastervolt_Communication DbLogExclude .*
attr Mastervolt_Communication autoReopen 1
attr Mastervolt_Communication classdefs mastervolt.class=/opt/fhem/FHEM/mastervolt.cfg
attr Mastervolt_Communication logTraffic 5
attr Mastervolt_Communication partial 1

setstate Mastervolt_Communication opened
setstate Mastervolt_Communication 2020-04-28 12:29:31 state opened



defmod Mastervolt_1_6400 ECMDDevice mastervolt.class
attr Mastervolt_1_6400 DbLogExclude .*
attr Mastervolt_1_6400 IODev Mastervolt_Communication

setstate Mastervolt_1_6400 state "���


leider werden die Zeichen hier nicht alle übernommen im State, aber dafür in der Zeile aus dem Log


Mastervolt_Communication: unexpected answer "\001���\000\000\000���"\001��\004W6\aJ\003\006�\000Q\0010\020�\000$\006B\020�\000\001$\a� (\042\001\377\377\264\000\000\000\325\377\377\042\001\264\376\004\127\066\007\112\003\006\344\000\121\001\060\020\345\000\044\006\102\020\346\000\001\044\007\247) received (wrote "\001���\000\000\000� (\042\001\377\377\264\000\000\000\325), expected ([0-9a-f]{2} ){39}[0-9a-f]{2})



################## mastervolt.cfg ###############
#
#!/usr/bin/perl
# Modell/Firmware/Seriennummer
# Wechselrichter 1
get state cmd {pack("(H2)*", split(/ /, '22 01 ff ff b4 00 00 00 d5'))}

#erwartete Antwort so oder vergleichbar von Wechselrichter 1 "22 01 ff ff b4 00 00 00 d5 ff ff 22 01 b4 fe 04 57 36 07 4a 03 06 e4 00 12 00 17 08 e5 00 54 00 29 08 e6 01 00 24 07 4f"

get state expect "([0-9a-f]{2} ){39}[0-9a-f]{2}"
get state postproc {
        my ($model,$serial,$firmware,$lval,$yval,$xval,$zval);\
        my $hash  = $defs{"%NAME"};\
        if( ($_ eq "") ){\
                $model = "err";\
                $serial = "err";\
                $firmware = "err";\
                $lval = "err";\
                $yval = "err";\
                $xval = "err";\
                $zval = "err";\
        }else{\
                my @values=split(' ',$_);\
                $model = $values[14];\
                $serial = chr(hex($values[16])).chr(hex($values[17])).$values[18].chr(hex($values[19])).$values[20].$
                $firmware = ($values[31].$values[30].$values[29]);\
                $lval = sprintf("%5.2f %%",$values[2]);\
                $yval = sprintf("%d",$values[3]);\
                $xval = sprintf("%s",$values[0],$firmware,$values[2],$values[3]);\
                $zval = sprintf("$_",$values[0],$serial);\
        }\
        readingsSingleUpdate($hash, "Model", $model, 1);\
        readingsSingleUpdate($hash, "Seriennummer", $serial, 1);\
        readingsSingleUpdate($hash, "Firmware", $firmware, 1);\
        readingsSingleUpdate($hash, "Load",  $lval, 1);\
        readingsSingleUpdate($hash, "Yield", $yval, 1);\
        readingsSingleUpdate($hash, "reading", $xval, 1);\
#       readingsSingleUpdate($hash, "reading", unpack("H*", $_));\
        $zval;\
}


ich weiß, dass in der cfg noch viel Schrott drin ist, aber das sind Sachen vom Testen.

Meine Frage ist eigendlich, wie bekomme ich jetzt eine Hex als Antwort, damit ich damit weiterverarbeiten kann und zb ein Array mit den einzelwerten füllen kann.

Gruß Knallkopp_02
Ich bin kein Programmierer und habe keine Ahnung.

Raspberry PI 3B+ mit HM-MOD-RPI-PCB,     
HM-TC-IT-WM-W-EU, HM-CC-RT-DN, HM-SEC-SCo
Raspberry PI 3B+ mit 7" Touchdisplay

Dr. Boris Neubert

Hallo,

Danke für die Angaben. Bitte schicke beim nächsten Mal den vollen Abschnitt aus dem Log zu einer Abfrage (get) mit. Da müssten mehr Zeilen sein. Ggf. nach einem attr global verbose 5

Die Antwort sieht nach Bitmüll aus. Stimmen die Baudrate und die Einstellungen des seriellen Ports?

Grüße
Boris
Globaler Moderator, Developer, aktives Mitglied des FHEM e.V. (Marketing, Verwaltung)
Bitte keine unaufgeforderten privaten Nachrichten!

Knallkopp_02

#13
Hallo Borris, das mit dem Verbose 5 hatte ich vergessen wieder an zu schalten.

hier der Log


2020.04.28 13:41:43 5: Cmd: >get Mastervolt_1_6400 state<
2020.04.28 13:41:43 5: ECMDDevice: Analyze command >{pack("(H2)*", split(/ /, '22 01 ff ff b4 00 00 00 d5'))}<
2020.04.28 13:41:44 3: Setting Mastervolt_Communication serial parameters to 9600,8,N,1
2020.04.28 13:41:44 1: /dev/ttyUSB1 reappeared (Mastervolt_Communication)
2020.04.28 13:41:44 5: Starting notify loop for Mastervolt_Communication, 1 event(s), first is CONNECTED
2020.04.28 13:41:44 4: DbLog DBLogging -> ################################################################
2020.04.28 13:41:44 4: DbLog DBLogging -> ###              start of new Logcycle                       ###
2020.04.28 13:41:44 4: DbLog DBLogging -> ################################################################
2020.04.28 13:41:44 4: DbLog DBLogging -> number of events received: 1 for device: Mastervolt_Communication
2020.04.28 13:41:44 4: DbLog DBLogging -> check Device: Mastervolt_Communication , Event: CONNECTED
2020.04.28 13:41:44 5: DbLog DBLogging -> parsed Event: Mastervolt_Communication , Event: CONNECTED
2020.04.28 13:41:44 5: DbLog DBLogging -> DbLogExclude of "Mastervolt_Communication": .*
2020.04.28 13:41:44 5: End notify loop for Mastervolt_Communication
2020.04.28 13:41:44 5: Mastervolt_Communication: sending command "\001���\000\000\000� (\042\001\377\377\264\000\000\000\325)
2020.04.28 13:41:44 5: Mastervolt_Communication: write "\001���\000\000\000� (\042\001\377\377\264\000\000\000\325), expect ([0-9a-f]{2} ){39}[0-9a-f]{2}
2020.04.28 13:41:44 5: SW: 2201ffffb4000000d5
2020.04.28 13:41:45 5: Mastervolt_Communication: read "\001���\000\000\000���"\001��\004W6\aJ\003\006�\000Q\0010\020�\000$\006B\020�\000\001$\a� (\042\001\377\377\264\000\000\000\325\377\377\042\001\264\376\004\127\066\007\112\003\006\344\000\121\001\060\020\345\000\044\006\102\020\346\000\001\044\007\247)
2020.04.28 13:41:45 1: Mastervolt_Communication: unexpected answer "\001���\000\000\000���"\001��\004W6\aJ\003\006�\000Q\0010\020�\000$\006B\020�\000\001$\a� (\042\001\377\377\264\000\000\000\325\377\377\042\001\264\376\004\127\066\007\112\003\006\344\000\121\001\060\020\345\000\044\006\102\020\346\000\001\044\007\247) received (wrote "\001���\000\000\000� (\042\001\377\377\264\000\000\000\325), expected ([0-9a-f]{2} ){39}[0-9a-f]{2})
2020.04.28 13:41:45 5: Mastervolt_Communication: received answer "\001���\000\000\000���"\001��\004W6\aJ\003\006�\000Q\0010\020�\000$\006B\020�\000\001$\a� (\042\001\377\377\264\000\000\000\325\377\377\042\001\264\376\004\127\066\007\112\003\006\344\000\121\001\060\020\345\000\044\006\102\020\346\000\001\044\007\247)
2020.04.28 13:41:45 5: Starting notify loop for Mastervolt_1_6400, 2 event(s), first is "\001���\000\000\000���"\001��\004W6\aJ\003\006�\000Q\0010\020�\000$\006B\020�\000\001$\a�
2020.04.28 13:41:45 4: DbLog DBLogging -> ################################################################
2020.04.28 13:41:45 4: DbLog DBLogging -> ###              start of new Logcycle                       ###
2020.04.28 13:41:45 4: DbLog DBLogging -> ################################################################
2020.04.28 13:41:45 4: DbLog DBLogging -> number of events received: 2 for device: Mastervolt_1_6400
2020.04.28 13:41:45 4: DbLog DBLogging -> check Device: Mastervolt_1_6400 , Event: "������"��W6J�Q0�$B�$�
2020.04.28 13:41:45 5: DbLog DBLogging -> parsed Event: Mastervolt_1_6400 , Event: "������"��W6J�Q0�$B�$�
2020.04.28 13:41:45 5: DbLog DBLogging -> DbLogExclude of "Mastervolt_1_6400": .*
2020.04.28 13:41:45 4: DbLog DBLogging -> check Device: Mastervolt_1_6400 , Event: state: state "������"��W6J�Q0�$B�$�
2020.04.28 13:41:45 5: DbLog DBLogging -> parsed Event: Mastervolt_1_6400 , Event: state: state "������"��W6J�Q0�$B�$�
2020.04.28 13:41:45 5: DbLog DBLogging -> DbLogExclude of "Mastervolt_1_6400": .*
2020.04.28 13:41:45 5: End notify loop for Mastervolt_1_6400
2020.04.28 13:41:45 4: WEB: /fhem?detail=Mastervolt_1_6400&dev.getMastervolt_1_6400=Mastervolt_1_6400&cmd.getMastervolt_1_6400=get&arg.getMastervolt_1_6400=state&val.getMastervolt_1_6400=&XHR=1&addLinks=1&fwcsrf=csrf_252263432535426&fw_id=177 / RL:68 / text/plain; charset=UTF-8 / Content-Encoding: gzip
/ Cache-Control: no-cache, no-store, must-revalidate


Was ich über die Schnittstelle weiß: Bautrate: 9600, Parität N, Datenbits 8, Stopbits 1.

Das habe ich auch so in Fhem eingestellt wie man in der 3 Zeile vom Log sehen kann.

Datenmüll will ich nicht so jetzt nicht sagen, denn "W6J" sieht nach meiner Seriennummer "W607J0306" aus nur irgendwie anders Kodiert

Wenn ich die beiden anderen Wechselrichter abfrage, ist an der gleichen Stelle auch die entsprechnende Seriennummer zu lesen.

leider wird nach dem Senden der Antwort hier im Forum etwas umkonvertiert ich habe zb die "07" aus der Seriennummer  vor dem Absenden in einem Zeichen Stehen, welches ein Viereck ist mit 0007, ist mit der "03" und"06" das gleiche.

Wird die Antwort automatisch konvertiert? weil das wäre die Seriennummer so wie ich sie erwartet hätte "57 36 07 4a 03 06" wobei  das rote dann mit chr(hex($wert)) konvertiert würde.

Gruß Knallkopp_02

Ich bin kein Programmierer und habe keine Ahnung.

Raspberry PI 3B+ mit HM-MOD-RPI-PCB,     
HM-TC-IT-WM-W-EU, HM-CC-RT-DN, HM-SEC-SCo
Raspberry PI 3B+ mit 7" Touchdisplay

Dr. Boris Neubert

Oh Mann, mir dämmert es.

Die Kommunikation ist nicht ASCII sondern binär. Und wenn Du 22 01 ff ff b4 00 00 00 d5 schreibst, meinst Du 9 binäre Bytes, die an das Gerät geschickt werden, und nicht etwa die 27 Bytes des vorgenannten Strings.

Bitte bestätige, dass die Kommunikation byteweise binär abläuft.

Mit dem Pattern Matching wird es dann eklig. Aber wenn Du 39 Bytes erwartest, sollte .{39} reichen.
Globaler Moderator, Developer, aktives Mitglied des FHEM e.V. (Marketing, Verwaltung)
Bitte keine unaufgeforderten privaten Nachrichten!