[erledigt] ECMD / ECMDDevice: Einlesen mehrteiliger längerer Antworten

Begonnen von Hermann20, 07 März 2015, 09:22:10

Vorheriges Thema - Nächstes Thema

Hermann20

Hallo,

ich nutze ECMD/ECMDDevice zur Kommunikation mit meiner Heizungssteuerung. Das Einlesen einfacher kurzer Antworten wie z.B. "22.5\r" für eine Temperatur funktioniert wunderbar.

Aber bei längeren Antworten erhalte ich lediglich den Anfang.

Bei der Abfrage der ID eines Onewire-Sensors erhalte ich nur den ersten Teil:
0x10 0xc6

Wenn ich FHEM stoppe und über KiTTY direkt auf die serielle Schnittstelle zugreife, sehe ich die vollständige Antwort:
0x10 0xc6 0xda 0x5f 0x02 0x08 0x00 0x4e

Es ist also kein Problem der Heizungssteuerung oder der Hardware (Raspberry, RS232-Treiber).
Die Antwort kommt in einem Rutsch, daher waren meine Versuche mit partial und timeout nicht erfolgreich.
Ich bin noch nicht an der Aufteilung bzw. Interpretation der Antwort. Mit expect ".*" sollte ich doch zunächst alles bekommen. An dieser Stelle habe ich auch schon andere Varianten erfolglos ausprobiert.

Kann mir vielleicht jemand einen Tipp geben?

Gruß Hermann
NUC12i3, Proxmox VE, Ubuntu 24.04, FHEM (aktuell): 2 HMUART, ca. 50 HM Devices, ca. 10 Devices über MQTT, 4 DECT200 über FBAHAHTTP, Heizungssteuerung über RS232, HMCCU, Telegram
CCU3, RaspberryMatic (aktuell): ca. 10 HmIP Devices

Icinger

Ich bekomm von meinem Stromzähler auch mehrzeilige Info übers ECMD rein.

Habe das bei mir so gelöst, dass ich auch auf ".*" expecte und damit eine Sub() in der myUtils aufrufe.
In der Sub wird alles aneinandergehängt und dann pro Zeilenumbruch ausgewertet.

Bei mir sieht das dann so aus:
sub ProcessVoltcraft($$)
{

        my ($name,$stri)=@_;
    my $hash  = $defs{$name};
    $VoltcraftString=$VoltcraftString.$stri;
    Log3 $hash,5,"Voltrcraft received: $stri";
#    Log 1,"TotalString: ".$VoltcraftString;
#    return "Test";
return undef if(index($VoltcraftString,chr(13).chr(10)) == -1);
readingsBeginUpdate($hash);
    while(index($VoltcraftString,chr(13).chr(10)) ne -1)
    {
      my $rmsg="";
      $rmsg = substr($VoltcraftString, 0, index($VoltcraftString,chr(13).chr(10)));
#      my $rs = substr($rmsg,index($rmsg,"(")+1,index($rmsg,")")-1);
#      $rs=substr($rs,0,index($rs,"*k")-1);
Log3 $hash,5,"Msg-Parse: $rmsg";
  if ($rmsg=~ /.*?(\/EFR5\\EFR-M4-DRV004101222)/) {fhem("set Strom Init2"),1}
      if ($rmsg=~ /1-0:1\.8\.0\*255\((.*?)\*.*/)      { readingsBulkUpdate($hash, "energy_total"  ,$1 + 82064.35); }
      if ($rmsg=~ /1-0:2\.1\.7\*255\((.*?)\*.*/)      { readingsBulkUpdate($hash, "Einspeisung_L1",$1); }
      if ($rmsg=~ /1-0:4\.1\.7\*255\((.*?)\*.*/)      { readingsBulkUpdate($hash, "Einspeisung_L2",$1); }
      if ($rmsg=~ /1-0:6\.1\.7\*255\((.*?)\*.*/)      { readingsBulkUpdate($hash, "Einspeisung_L3",$1); }
      if ($rmsg=~ /1-0:21\.7\.255\*255\((.*?)\*.*/)   { readingsBulkUpdate($hash, "current_L1"    ,$1); }
      if ($rmsg=~ /1-0:41\.7\.255\*255\((.*?)\*.*/)   { readingsBulkUpdate($hash, "current_L2"    ,$1); }
      if ($rmsg=~ /1-0:61\.7\.255\*255\((.*?)\*.*/)   { readingsBulkUpdate($hash, "current_L3"    ,$1); }
      if ($rmsg=~ /1-0:1\.7\.255\*255\((.*?)\*.*/)    { readingsBulkUpdate($hash, "current"       ,$1 ); }
  if ($rmsg=~ /0-0:96\.1\.255\*255\((.*?)\).*/)   { readingsBulkUpdate($hash, "Seriennummer"  ,$1); } #|index($rmsg, "0-0:96.1.255*255") != -1

# 1-0:0.0.0*255(GETTONE)   - Eigentumsnummer (max 20 zeichen)
# 1-0:1.8.0*255(17483.88*kWh) - Zählerstand in kWh mit 6 Vor- und 2 Nachkommastellen
# 1-0:2.1.7*255(07568.01*kWh) - momentan eingespeiste Leistung Phase 1
# 1-0:4.1.7*255(02636.12*kWh) - momentan eingespeiste Leistung Phase 2
# 1-0:6.1.7*255(07279.74*kWh) - momentan eingespeiste Leistung Phase 3
# 1-0:21.7.255*255(0000.2264*kW) - momentan bezogene Leistung Phase 1
# 1-0:41.7.255*255(0000.0123*kW) - momentan bezogene Leistung Phase 2
# 1-0:61.7.255*255(0000.1857*kW) - momentan bezogene Leistung Phase 3
# 1-0:1.7.255*255(0000.4252*kW)  - bezogene Leistung, Summe aller Phasen
# 1-0:96.5.5*255(@) - Status - Bit [6] --> 0=Leerlauf, 1=oberhalb Anlauf
#                            Bit [5] --> gesetzt bei Ausfall von L1
#                             Bit [4] --> gesetzt bei Ausfall von L2
#                              Bit [3] --> gesetzt bei Ausfall von L3
#                            Bit [2] --> reserviert, immer 0
#                              Bit [1] --> Telegramm wird synchron imfesten zeitraster gesendet
#                            Bit [0] --> 0=kein Fehler, 1=Fehler
# 0-0:96.1.255*255(11400158) - Seriennummer (max 20 Zeichen)

       $VoltcraftString = substr($VoltcraftString, index($VoltcraftString,chr(13).chr(10))+2);;
      Log 5,"SplitString: $rmsg";
    }
    readingsEndUpdate($hash,1);
    Log3 undef,5,"TotalString: $VoltcraftString";
    return(0);
}


lg, Ici
Verwende deine Zeit nicht mit Erklärungen. Die Menschen hören (lesen) nur, was sie hören (lesen) wollen. (c) Paulo Coelho

Hermann20

Danke für die schnelle Antwort, Du bist ja schneller als der Schall.

Ich bin leider noch nicht so weit, die Antwort zu interpretieren. Ich scheitere am Empfang, will sagen, ich bekomme nur den ersten Teil. Bei mir handelt es sich um eine Zeile mit einem "\r" als Abschluss am Ende.

Gruß Hermann
NUC12i3, Proxmox VE, Ubuntu 24.04, FHEM (aktuell): 2 HMUART, ca. 50 HM Devices, ca. 10 Devices über MQTT, 4 DECT200 über FBAHAHTTP, Heizungssteuerung über RS232, HMCCU, Telegram
CCU3, RaspberryMatic (aktuell): ca. 10 HmIP Devices

Dr. Boris Neubert

Zitat von: Hermann20 am 07 März 2015, 09:22:10
Kann mir vielleicht jemand einen Tipp geben?

Bitte zunächst die Mindestanforderung an die Qualifikation von Fragen zu ECMD erfüllen:

http://forum.fhem.de/index.php/topic,25748.0.html

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

Hermann20

Danke für den Hinweis und entschuldige bitte die unvollständige Fragestellung.

mein define:
define NetIO ECMD serial /dev/ttyAMA0@19200
attr NetIO classdefs HeizungCD=/opt/fhem/ECMD/Heizung.classdef
attr NetIO logTraffic 5
attr NetIO room Heizung
attr NetIO timeout 2

define HZG ECMDDevice HeizungCD
attr HZG IODev NetIO
attr HZG group HZG NetIO
attr HZG room Heizung
attr HZG webCmd Ta:Vor:Rueck:Des:Time


Auszug aus der classdef:
set CmdQuery cmd {"q %qNr\r"}
set CmdQuery params qNr
set CmdQuery expect ".*"

An dieser Stelle habe ich noch keine Nachbearbeitung, ich kann die vollständige Antwort ja noch nicht einlesen.

Ich habe die Log-Level (allgemein und für ECMD) auf 5 gesetzt. Hier der entsprechende Auszug aus dem Log-File bei Ausführung eines "g 30\r":
2015.03.07 18:30:31 5: Cmd: >{ReadingsVal("HZG","CmdQuery","")}<
2015.03.07 18:30:31 4: 14976:FHEMWEB:192.168.6.15:49983: /fhem?cmd={ReadingsVal(%22HZG%22,%22CmdQuery%22,%22%22)}&XHR=1 / RL:29 / text/plain; charset=UTF-8 / Content-Encoding: gzip
/
2015.03.07 18:30:37 4: HTTP FHEMWEB:192.168.6.15:49983 GET /fhem&detail=HZG&dev.setHZG=HZG&cmd.setHZG=set&arg.setHZG=CmdQuery&val.setHZG=30
2015.03.07 18:30:37 5: Cmd: >set HZG CmdQuery 30<
2015.03.07 18:30:37 5: ECMDDevice: Analyze command >{"q 30\r"}<
2015.03.07 18:30:37 5: NetIO: sending command "q 30\r"
2015.03.07 18:30:37 5: NetIO: write "q 30\r", expect .*
2015.03.07 18:30:37 5: SW: 712033300d
2015.03.07 18:30:37 5: NetIO: read "0x10 0x4"
2015.03.07 18:30:37 5: NetIO: received answer "0x10 0x4"
2015.03.07 18:30:37 5: Triggering HZG (2 changes)
2015.03.07 18:30:37 5: Notify loop for HZG CmdQuery: 0x10 0x4
2015.03.07 18:30:37 5: NetIO: read "2 0xfc 0x45 0x02 0x08 0x00 0x3f\r"
2015.03.07 18:30:37 5: NetIO: Spontaneously received "2 0xfc 0x45 0x02 0x08 0x00 0x3f\r"
2015.03.07 18:30:37 5: NetIO dispatch 2 0xfc 0x45 0x02 0x08 0x00 0x3f
2015.03.07 18:30:37 4: HTTP FHEMWEB:192.168.6.15:49983 GET /fhem?detail=HZG
2015.03.07 18:30:37 4: 14976:FHEMWEB:192.168.6.15:49983: /fhem?detail=HZG / RL:2905 / text/html; charset=UTF-8 / Content-Encoding: gzip
/
2015.03.07 18:30:37 4: Connection closed for FHEMWEB:192.168.6.15:49997: EOF


Im Log-File sieht eine kürzere Antwort (auf einen anderen Befehl) so aus:
2015.03.07 18:46:34 5: Cmd: >{ReadingsVal("HZG","CmdQuery","")}<
2015.03.07 18:46:34 4: 14976:FHEMWEB:192.168.6.15:50100: /fhem?cmd={ReadingsVal(%22HZG%22,%22CmdQuery%22,%22%22)}&XHR=1 / RL:25 / text/plain; charset=UTF-8 / Content-Encoding: gzip
/
2015.03.07 18:46:41 4: HTTP FHEMWEB:192.168.6.15:50100 GET /fhem&detail=HZG&dev.setHZG=HZG&cmd.setHZG=set&arg.setHZG=CmdQuery&val.setHZG=20
2015.03.07 18:46:41 5: Cmd: >set HZG CmdQuery 20<
2015.03.07 18:46:41 5: ECMDDevice: Analyze command >{"q 20\r"}<
2015.03.07 18:46:41 5: NetIO: sending command "q 20\r"
2015.03.07 18:46:41 5: NetIO: write "q 20\r", expect .*
2015.03.07 18:46:41 5: SW: 712032300d
2015.03.07 18:46:41 5: NetIO: read "360\r"
2015.03.07 18:46:41 5: NetIO: received answer "360\r"
2015.03.07 18:46:41 5: Triggering HZG (2 changes)
2015.03.07 18:46:41 5: Notify loop for HZG CmdQuery: 360
2015.03.07 18:46:41 4: HTTP FHEMWEB:192.168.6.15:50100 GET /fhem?detail=HZG
2015.03.07 18:46:41 4: 14976:FHEMWEB:192.168.6.15:50100: /fhem?detail=HZG / RL:2907 / text/html; charset=UTF-8 / Content-Encoding: gzip
/
2015.03.07 18:46:41 4: Connection closed for FHEMWEB:192.168.6.15:50086: EOF

Das ist in Ordnung, es handelt sich nur um einen Wert (360).

Bei meinem Problem (längere Antwort) wird aus mir nicht erkennbarem Grund die Antwort aufgeteilt und der zweite Teil verworfen ("Spontaneously received")?

Gruß Hermann
NUC12i3, Proxmox VE, Ubuntu 24.04, FHEM (aktuell): 2 HMUART, ca. 50 HM Devices, ca. 10 Devices über MQTT, 4 DECT200 über FBAHAHTTP, Heizungssteuerung über RS232, HMCCU, Telegram
CCU3, RaspberryMatic (aktuell): ca. 10 HmIP Devices

Dr. Boris Neubert

Hallo Hermann,

das ist hilfreich gewesen.

Aus der Commandref:
Zitat
partial <seconds>
Some physical ECMD devices split readings and replies into several transmissions. If the partial attribute is set, this behavior is accounted for as follows: (a) If a reply is expected for a get or set command, FHEM collects transmissions from the physical ECMD device until either the reply matches the expected reply or the time in seconds given with the partial attribute has expired. (b) If a spontaneous transmission does not match the regular expression for any reading, the transmission is recorded and prepended to the next transmission. If the line is quiet for longer than the time in seconds given with the partial attribute, the recorded transmission is discarded. Use regular expressions that produce exact matches.

Du musst also das partial-Attribut setzen UND den regulären Ausdruck für das CmdQuery-expect auf das erwartete Ergebnis anpassen. So etwas wie (0x[0-9a-f]{2} ){7}0x[0-9a-f]{2}\r, oder, besser verständlich, 0x?? 0x?? 0x?? 0x?? 0x?? 0x?? 0x?? 0x??\r.

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

Hermann20

Hallo Boris,

herzlichen Dank für die Antwort und den Tipp, ich habe das partial-Attribut gesetzt und expect geändert.

So funktioniert es viel besser.
2015.03.07 19:37:58 4: HTTP FHEMWEB:192.168.6.15:50362 GET /fhem&detail=HZG&dev.setHZG=HZG&cmd.setHZG=set&arg.setHZG=CmdQuery&val.setHZG=30
2015.03.07 19:37:58 5: Cmd: >set HZG CmdQuery 30<
2015.03.07 19:37:58 5: ECMDDevice: Analyze command >{"q 30\r"}<
2015.03.07 19:37:58 5: NetIO: sending command "q 30\r"
2015.03.07 19:37:58 5: NetIO: write "q 30\r", expect 0x?? 0x?? 0x?? 0x?? 0x?? 0x?? 0x?? 0x??\r
2015.03.07 19:37:58 5: SW: 712033300d
2015.03.07 19:38:01 5: NetIO: read "0x10 0x42 0xfc 0x45 0x02 0x08 0x00 0x3f\r"
2015.03.07 19:38:01 1: NetIO: unexpected answer "0x10 0x42 0xfc 0x45 0x02 0x08 0x00 0x3f\r" received (wrote "q 30\r", expected 0x?? 0x?? 0x?? 0x?? 0x?? 0x?? 0x?? 0x??\r)
2015.03.07 19:38:01 5: NetIO: received answer "0x10 0x42 0xfc 0x45 0x02 0x08 0x00 0x3f\r"
2015.03.07 19:38:01 5: Triggering HZG (2 changes)
2015.03.07 19:38:01 5: Notify loop for HZG CmdQuery: 0x10 0x42 0xfc 0x45 0x02 0x08 0x00 0x3f
2015.03.07 19:38:02 4: HTTP FHEMWEB:192.168.6.15:50362 GET /fhem?detail=HZG
2015.03.07 19:38:02 4: 14976:FHEMWEB:192.168.6.15:50362: /fhem?detail=HZG / RL:2923 / text/html; charset=UTF-8 / Content-Encoding: gzip


Eine Frage bleibt noch: Woher komm das "unexpected answer"? Erst nach Ablauf der Zeit, steht aktuell auf 3 Sekunden, geht es weiter.

Gruß Hermann
NUC12i3, Proxmox VE, Ubuntu 24.04, FHEM (aktuell): 2 HMUART, ca. 50 HM Devices, ca. 10 Devices über MQTT, 4 DECT200 über FBAHAHTTP, Heizungssteuerung über RS232, HMCCU, Telegram
CCU3, RaspberryMatic (aktuell): ca. 10 HmIP Devices

Hermann20

Nachtrag:

Ich habe expect mal in ".*\r" geändert.

Jetzt ist das "unexpected answer" und das Warten auf timeout weg. Da habe ich mich vermutlich irgendwie vertan.
2015.03.07 20:03:15 4: HTTP FHEMWEB:192.168.6.15:50518 GET /fhem&detail=HZG&dev.setHZG=HZG&cmd.setHZG=set&arg.setHZG=CmdQuery&val.setHZG=30
2015.03.07 20:03:15 5: Cmd: >set HZG CmdQuery 30<
2015.03.07 20:03:15 5: ECMDDevice: Analyze command >{"q 30\r"}<
2015.03.07 20:03:15 5: NetIO: sending command "q 30\r"
2015.03.07 20:03:15 5: NetIO: write "q 30\r", expect .*\r
2015.03.07 20:03:15 5: SW: 712033300d
2015.03.07 20:03:15 5: NetIO: read "0x10 0x42 0xfc 0x45 0x02 0x08 0x00 0x3f\r"
2015.03.07 20:03:15 5: NetIO: received answer "0x10 0x42 0xfc 0x45 0x02 0x08 0x00 0x3f\r"
2015.03.07 20:03:15 5: Triggering HZG (2 changes)
2015.03.07 20:03:15 5: Notify loop for HZG CmdQuery: 0x10 0x42 0xfc 0x45 0x02 0x08 0x00 0x3f
2015.03.07 20:03:15 4: HTTP FHEMWEB:192.168.6.15:50518 GET /fhem?detail=HZG
2015.03.07 20:03:15 4: 14976:FHEMWEB:192.168.6.15:50518: /fhem?detail=HZG / RL:2922 / text/html; charset=UTF-8 / Content-Encoding: gzip


Nochmals herzlichen Dank, nun komme ich (vorerst) alleine weiter.

Gruß Hermann
NUC12i3, Proxmox VE, Ubuntu 24.04, FHEM (aktuell): 2 HMUART, ca. 50 HM Devices, ca. 10 Devices über MQTT, 4 DECT200 über FBAHAHTTP, Heizungssteuerung über RS232, HMCCU, Telegram
CCU3, RaspberryMatic (aktuell): ca. 10 HmIP Devices

Dr. Boris Neubert

Zitat von: Hermann20 am 07 März 2015, 20:01:05
Eine Frage bleibt noch: Woher komm das "unexpected answer"? Erst nach Ablauf der Zeit, steht aktuell auf 3 Sekunden, geht es weiter.

Sorry, ich war durcheinander. Das Regexp wäre natürlich

0x.. 0x.. 0x.. 0x.. 0x.. 0x.. 0x.. 0x..\r

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

Hermann20

Hätte ich ja auch selber drauf kommen können.
Diese Syntax ist völliges Neuland für mich.
Aber eine Baustelle nach der anderen, ich arbeite daran.

Gruß Hermann
NUC12i3, Proxmox VE, Ubuntu 24.04, FHEM (aktuell): 2 HMUART, ca. 50 HM Devices, ca. 10 Devices über MQTT, 4 DECT200 über FBAHAHTTP, Heizungssteuerung über RS232, HMCCU, Telegram
CCU3, RaspberryMatic (aktuell): ca. 10 HmIP Devices