Fragen zu EMCD und EMCDDevice

Begonnen von Guest, 02 November 2011, 21:16:26

Vorheriges Thema - Nächstes Thema

Guest

Originally posted by: <email address deleted>

Hallo,
ich versuche mit Hilfe von fhem meinen Hardwarezoo im Multimediaraum
zu dressieren. Als erstes möchte ich mit EMCD und EMCDDevice meinen
Beamer über RS232 ansteuern.
Einschalten, Ausschalten und Powerstatus auslesen geht schon. Leider
sind die Antworten vom Beamer alle binär, so das beim Device nicht
viel zu sehen ist.

Meine Frage: gibt es eine Möglichkeit, die Anwort vom Device in
Klartext umzusetzen? Vielleicht so generisch wie bei der cmd
Definition im class-file.

Oder muß ich dafür analog M232 oder LGTV vorgehen?

Die Antworten vom Beamer sehen so aus: (Kann man sich in der Hex-
Anzeige des Logs ansehen)

0x15 -> Befehl nicht verstanden
0x06 -> Set- oder Reset-command OK
0x1dxxxx -> Antwort auf get status command
0x1cxxxx -> Command kann nicht durchgeführt werden

cu
Helmut

--
To unsubscribe from this group, send email to
fhem-users+unsubscribe@googlegroups.com

Dr. Boris Neubert

                                             

Hallo Helmut,

Am 02.11.2011 21:16, schrieb helmut55:
> Meine Frage: gibt es eine Möglichkeit, die Anwort vom Device in
> Klartext umzusetzen? Vielleicht so generisch wie bei der cmd
> Definition im class-file.

ich kann Dir Hinweise geben, wie Du 67_ECMDDevice.pm erweitern kannst.

In ECMDDevice_Set und _Get kommt am Ende die Antwort in die Variable $v.
Diese Antwort muß dann aufbereitet (=gemäß einer Definition übersetzt)
werden. Hierbei ist zu beachten, daß ein mehrzeiliger Befehl (in der
Klassendefinition durch \n getrennt) mehrere Rückgabewerte hat, da er
Zeile für Zeile an das physische ECMD-Gerät gefüttert wird. Diese
Rückgabewerte werden mit Semikolons konkateniert (siehe ECMD_Write in
66_ECMD.pm).

Die Aufbereitung könntest Du über zusätzliche Einträge in der
Klassendefinition lösen:

get postprocess { }
set postprocess { }

In Ergänzung zu Example 2 aus der commandref.html z.B.

set on postprocess { s/OK;OK;OK;OK/on/ }

Dieses Beispiel würde aus den 4 OK-Antworten des ECMD einen Status
namens "on" erstellen.

Du mußt dann noch die Auswertung der Klassendefinitionen in
ECMD_EvalClassDef um die Verarbeitung der postprocess-Direktiven erweitern.

Hoffe, daß Dir das weiterhilft.

Viele Grüße
Boris

--
To unsubscribe from this group, send email to
fhem-users+unsubscribe@googlegroups.com
Globaler Moderator, Developer, aktives Mitglied des FHEM e.V. (Marketing, Verwaltung)
Bitte keine unaufgeforderten privaten Nachrichten!

Guest

Originally posted by: <email address deleted>

Hallo Boris,

vielen Dank für deine Hinweise.

Ich werde mal schauen, wie weit ich mit meinen perl-kenntnissen komme.

cu
Helmut

--
To unsubscribe from this group, send email to
fhem-users+unsubscribe@googlegroups.com

Guest

Originally posted by: <email address deleted>

Hallo Boris,

ich habe jetzt eine Lösung, welche die Antwort $v bearbeiten kann:

in 67_ECMD

                        } elsif($spec eq "postproc")
{
                                if($arg !~ m/^{.*}$/s)
{
                                        Log 1, "$name: postproc
command for $cmd $cmdname is not a perl
command.";
 
next;
                                }
                                $arg =~ s/^(\\\n|[ \t])*//;
# Strip space or \\n at the
begginning
                                $arg =~ s/[ \t]*
$//;
                                if($cmd eq "set")
{
                                        Log 5, "$name: set $cmdname
defined as
$arg";
                                        $hash->{fhem}{classDefs}
{$classname}{sets}{$cmdname}{postproc}=
$arg;
                                } elsif($cmd eq "get")
{
                                        Log 5, "$name: get $cmdname
defined as
$arg";
                                        $hash->{fhem}{classDefs}
{$classname}{gets}{$cmdname}{postproc}=
$arg;
                                }
                        }

in 67_EMCDDevice: beim get und set:

        my $postproc= $IOhash->{fhem}{classDefs}{$classname}{gets}
{$cmdname}{postproc};


        if($postproc)
{
           $postproc= EvalSpecials($postproc,
%specials);
           Log 5, "Postproc :".
$postproc;
 
eval($postproc);
        }

mit dem eval($postproc) bin ich noch unglücklich weil man wissen muss,
dass die Antwort in $v steht, aber mit meinen perlkenntnissen habe ich
nix anderes zum laufen gebracht.


meine .class sieht so aus:

    # Command definitions PJ-
TX100
#
Aufbau:.
# HEAD    5
byte
# CRC     2
byte
#
DATA
#  ACTION 2
byte
#  TYPE   2
byte
#  CODE   2
byte
.
# HEAD "\xbe\xef
\x03\x06\x00"
#
ACTIONS
#  SET
"\x01\x00"
#  GET
"\x02\x00"
#  INC
"\x04\x00"
#  DEC
"\x05\x00"
#  EXE
"\x06\x00"


get power_state cmd {"\xbe\xef
\x03\x06\x00\x19\xd3\x02\x00\x00\x60\x00\x00"}
set power_on    cmd {"\xbe\xef\x03\x06\x00\xba
\xd2\x01\x00\x00\x60\x01\x00"}
set power_off   cmd {"\xbe\xef\x03\x06\x00\x2a
\xd3\x01\x00\x00\x60\x00\x00"}

get power_state postproc {$v =~ s/\x15/Invalid command/;$v =~ s/\x1c/
Error/;$v =~ s/\x1d\x00\x00/Off/;$v =~ s/\x1d\x01\x00/On/;$v =~ s/\x1d
\x02\x00/Cool down/}
get power_on    postproc {$v =~ s/\x15/Invalid command/;$v =~ s/\x1c/
Error/;$v =~ s/\x06/
OK/ }
get power_off   postproc {$v =~ s/\x15/Invalid command/;$v =~ s/\x1c/
Error/;$v =~ s/\x06/
OK/ }

#
 
Viele Grüße
Helmut

--
To unsubscribe from this group, send email to
fhem-users+unsubscribe@googlegroups.com

Guest

Originally posted by: <email address deleted>

Sorry, Boris

das copy und paste sieht ja schrecklich aus.
Gibt es eine Möglichkeit Code-schnipsel anders zu posten/formatieren?

cu
Helmut

--
To unsubscribe from this group, send email to
fhem-users+unsubscribe@googlegroups.com

Dr. Boris Neubert

                                             

Hallo Helmut,

Am 04.11.2011 08:54, schrieb helmut55:
> Gibt es eine Möglichkeit Code-schnipsel anders zu posten/formatieren?

ist mir nicht bekannt. Wenn Du mir bitte die veränderte Datei und eine
Muster-Classdef schickst, schaue ich mir das ganze gerne an, teste es
und checke es ein.

Viele Grüße
Boris

--
To unsubscribe from this group, send email to
fhem-users+unsubscribe@googlegroups.com
Globaler Moderator, Developer, aktives Mitglied des FHEM e.V. (Marketing, Verwaltung)
Bitte keine unaufgeforderten privaten Nachrichten!

Guest

Originally posted by: <email address deleted>

Hallo Boris,

hast Email

Viele Grüße
Helmut

--
To unsubscribe from this group, send email to
fhem-users+unsubscribe@googlegroups.com

Dr. Boris Neubert

                                             

Hallo,

Helmut und ich haben ECMD so erweitert, daß man ein Postprocessing
definieren kann. Eine Rückantwort des Gerätes wird dadurch vor der
Weiterverarbeitung durch fhem noch mit Perl-Kommandos nachbehandelt. Das
ist z.B. nützlich, um aus binären Rückantworten menschenlesbare OK- oder
ERROR-Zustände zu generieren. Seit eben ist im SVN auch eine Variante,
die mit Fortsetzungszeilen (Backslash am Zeilenende) umgehen kann.
Natürlich alles dokumentiert in der commandref.html.

Viel Spaß damit!
Boris

--
To unsubscribe from this group, send email to
fhem-users+unsubscribe@googlegroups.com
Globaler Moderator, Developer, aktives Mitglied des FHEM e.V. (Marketing, Verwaltung)
Bitte keine unaufgeforderten privaten Nachrichten!

Guest

Originally posted by: <email address deleted>

Hallo,

funktioniert bei mir einwandfrei.
Danke für eure arbeit.

MfG

Volker

--
To unsubscribe from this group, send email to
fhem-users+unsubscribe@googlegroups.com