ECMD unter Windows: keine Antwort

Begonnen von Christian., 27 Oktober 2014, 20:53:14

Vorheriges Thema - Nächstes Thema

Christian.

Hallo zusammen,

ich versuche, ECMD unter Windows zum Laufen zu bekommen. Mein Problem ist, dass ich keine Rückmeldung auf Kommandos erhalte.

Hier ist der relevante Teil meiner Konfiguration:

fhem.cfg

define ecmd ECMD serial COM9@57600
attr ecmd classdefs temperatur=./data/temperatur.classdef
attr ecmd verbose 5
attr ecmd logTraffic 3


data/temperatur.classdef:

get value cmd { "get" }
get value expect ".*"


An COM9 ist ein Arduino Uno mit einem einfachen Echo-Sketch angeschlossen, der empfangene String wird also einfach wieder rausgeschrieben. Mit dem seriellen Monitor funktioniert das auch.

Arduino-Code:

String inputString = "";
void loop() {
  while (Serial.available()) {
    char inChar = (char) Serial.read();
    inputString += inChar;
    if (inChar == '\n') {
      Serial.println(inputString);
      inputString = "";
    }
  }
}


Das Kommando get ecmd raw "test" liefert

2014.10.27 20:29:47 3: ecmd: write "test", expect .*
2014.10.27 20:29:47 1: > DevIo_Expect
2014.10.27 20:29:47 5: SW: 74657374
2014.10.27 20:29:47 1: > DevIo_Expect: Wrote message test
2014.10.27 20:29:47 1: > DevIo_SimpleReadWithTimeout: name = ecmd, fd = , rin = ^A, timeout = 3, nfound = -1
2014.10.27 20:29:47 2: ecmd: first attempt to read timed out, trying to close and open the device.
2014.10.27 20:29:47 3: Opening ecmd device COM9
2014.10.27 20:29:47 3: Setting ecmd baudrate to 57600
2014.10.27 20:29:47 3: ecmd device opened
2014.10.27 20:29:47 5: SW: 74657374
2014.10.27 20:29:47 1: > DevIo_SimpleReadWithTimeout: name = ecmd, fd = , rin = ^A, timeout = 3, nfound = -1
2014.10.27 20:29:47 2: ecmd: second attempt to read timed out, this is an unrecoverable error.
2014.10.27 20:29:47 1: ecmd: no answer received (wrote "test", expected .*)
2014.10.27 20:29:47 1: PERL WARNING: Use of uninitialized value $answer in concatenation (.) or string at ./FHEM/66_ECMD.pm line 261.


Die mit einer spitzen Klammer beginnenden Log-Ausgaben habe ich zum Debuggen eingefügt.

FHEM läuft unter strawberry-perl-5.20.1.1-32bit-portable. Ich habe Win32-SerialPort-0.22 nach der Anleitung im Wiki installiert.

Zum Testen habe ich auch schonmal attr ecmd partial 2 probiert. Dabei ändert sich bis auf unzählige Debug-Ausgaben von > DevIo_SimpleReadWithTimeout aber nichts.

Es könnte gut sein, dass das Problem bereits beschrieben wurde, ich bin da aber nicht sicher. Ich vermute jedenfalls, das Problem hängt mit dem Zugriff auf die serielle Schnittstelle unter Windows zusammen.

Über Tipps würde ich mich sehr freuen.

Christian
Raspberry Pi 3 mit FHEM; Arduino Nano mit ConfigurableFirmata (S0-Stromzähler); nanoCUL (MAX!); SIGNALduino (RXB6, 433 MHz); eBus; RS485 & D0 (SolarView); DVB-T (Thermo-/Hygrometer); Z-Wave; ZigBee

Christian.

So, kaum den Beitrag abgeschickt, schon hab ich auch selbst was gefunden.

Win32::SerialPort war offenbar noch nicht richtig installiert. Ich habe von Hand die Verzeichnisse Win32 und Win32API in das Verzeichnis perl/lib kopiert. Damit erhalte ich eine Antwort auf mein get-Kommando. Soweit, so gut.

Jetzt bin ich aber auf ein weiteres Problem gestoßen, und zwar beim Empfangen von Daten ohne Anforderung (in der ECMD-Doku als spontaneous transmission bezeichnet). Ich habe folgende Änderungen gemacht:

data/temperatur.classdef:

reading r match ".*"
reading r postproc { $_ }


Arduino-Sketch:

void loop(){
delay(2000);
Serial.println("test");
}


Ich sehe an der TX-LED des Arduino, dass regelmäßig Daten versendet werden. In FHEM kommt aber leider nichts an, das Log bleibt leer.

Ich habe gesehen, dass im Modul ECMD die Funktion ECMD_Ready auskommentiert ist. Ich habe sie einkommentiert und wie folgt implementiert:
sub ECMD_Ready($)
{
  return 1;
}


Damit erhalte ich im Log:


2014.10.27 21:46:28 3: ecmd: read "<nothing>"
2014.10.27 21:46:28 3: ecmd: read "<nothing>"
2014.10.27 21:46:28 3: ecmd: read "<nothing>"
2014.10.27 21:46:28 3: ecmd: read "<nothing>"
2014.10.27 21:46:29 3: ecmd: read "<nothing>"
2014.10.27 21:46:29 3: ecmd: read "<nothing>"
2014.10.27 21:46:29 3: ecmd: read "<nothing>"
2014.10.27 21:46:29 3: ecmd: read "test\r\n"
2014.10.27 21:46:29 5: ecmd: Spontaneously received "test\r\n"
2014.10.27 21:46:29 5: ecmd dispatch test^M

2014.10.27 21:46:29 5: ecmd: match regex .* for reading r of device demo_ecmd_device with class temperatur
2014.10.27 21:46:29 5: Postprocessing "test\r\n" with perl command { $_ }.
2014.10.27 21:46:29 5: Postprocessed value is "test\r\n".
2014.10.27 21:46:29 5: postprocessed value is test^M

2014.10.27 21:46:29 3: ecmd: read "<nothing>"
2014.10.27 21:46:29 3: ecmd: read "<nothing>"
2014.10.27 21:46:29 3: ecmd: read "<nothing>"
2014.10.27 21:46:29 3: ecmd: read "<nothing>"
2014.10.27 21:46:29 3: ecmd: read "<nothing>"


Das gefällt mir schon besser. Aber die häufigen Lesevorgänge möchte ich vermeiden. Ich vermute, dass einfach eine vernünftige Implementierung von ECMD_Ready fehlt.

  • Kann jemand diese Vermutung bestätigen?
  • Ist eine Implementierung von ECMD_Ready geplant?
Raspberry Pi 3 mit FHEM; Arduino Nano mit ConfigurableFirmata (S0-Stromzähler); nanoCUL (MAX!); SIGNALduino (RXB6, 433 MHz); eBus; RS485 & D0 (SolarView); DVB-T (Thermo-/Hygrometer); Z-Wave; ZigBee

Christian.

Ich habe gerade eine Implementierung von ECMD_Ready im Thread ECMD mit Readfunktion gefunden:

sub ECMD_Ready($) {
  my ($hash) = @_;
  return ECMD_OpenDev($hash, 1) if($hash->{STATE} eq "disconnected");
  my $po = $hash->{USBDev};
  my ($BlockingFlags, $InBytes, $OutBytes, $ErrorFlags) = $po->status;
  return ($InBytes>0 || $hash->{PARTIAL} =~ m/\n/);
}


Die funktioniert bei mir. Ich habe den Thread überflogen und gelesen, dass Boris nicht alle dort vorgeschlagenen Änderungen übernehmen möchte. Wäre die Übernahme von ECMD_Ready denn möglich? Ich möchte nach Möglichkeit keine Änderungen an FHEM-Modulen machen.
Raspberry Pi 3 mit FHEM; Arduino Nano mit ConfigurableFirmata (S0-Stromzähler); nanoCUL (MAX!); SIGNALduino (RXB6, 433 MHz); eBus; RS485 & D0 (SolarView); DVB-T (Thermo-/Hygrometer); Z-Wave; ZigBee

Dr. Boris Neubert

Hallo,

anbei eine Version mit ECMD_Ready. Kannst Du das mal bitte testen und hier eine Rückmeldung geben?

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

Christian.

Hallo Boris,

ich habe das Modul gerade kurz getestet, es funktioniert gut.

Ich hatte ja vorher schon mit ullis Implementierung von ECMD_Ready gearbeitet; sicherheitshalber habe ich mal ein diff gemacht (oben die Variante von ulli, unten Deine):
44c44
< sub ECMD_Ready($);
---
> #sub ECMD_Ready($);
160c160
<   return ECMD_OpenDev($hash, 1)
---
>   return DevIo_OpenDev($hash, 1, "ECMD_DoInit")
161a162
>
168c169
<   return ($InBytes>0 || $hash->{PARTIAL} =~ m/\n/);
---
>   return ($InBytes && $InBytes>0);
169a171
>


Mich wundert, dass ECMD_Ready funktioniert, obwohl es noch auskommentiert ist. Die anderen Abweichungen kann ich nicht beurteilen, da wirst Du besser wissen, welche Variante vernünftiger ist. Das aber nur zur Info, denn wie bereits geschrieben funktionieren beide Varianten in meiner Testumgebung.
Raspberry Pi 3 mit FHEM; Arduino Nano mit ConfigurableFirmata (S0-Stromzähler); nanoCUL (MAX!); SIGNALduino (RXB6, 433 MHz); eBus; RS485 & D0 (SolarView); DVB-T (Thermo-/Hygrometer); Z-Wave; ZigBee

Dr. Boris Neubert

Hallo,

Danke für das schnelle Feedback!

Es ist nur die Forward-Deklaration auskommentiert. Das habe ich jetzt noch geändert und eingecheckt.

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

Christian.

Raspberry Pi 3 mit FHEM; Arduino Nano mit ConfigurableFirmata (S0-Stromzähler); nanoCUL (MAX!); SIGNALduino (RXB6, 433 MHz); eBus; RS485 & D0 (SolarView); DVB-T (Thermo-/Hygrometer); Z-Wave; ZigBee