CRC in classdef berechnen

Begonnen von Guest, 05 August 2012, 10:57:47

Vorheriges Thema - Nächstes Thema

Guest

Originally posted by: <email address deleted>

Hallo allerseits

Hab nun ein bisschen mit FHEM und NetIO umhergespielt aber bin immer noch
Neuling. Auch in Sachen Perl.

Nun möchte ich meine SPS über die serielle Schnittstelle via NetIO mit
Ethersex YPORT aus fhem ansteuern.
Hardware funktioniert einwandfrei.

Die Grundidee ist ein ECMDDevice zu erstellen. Analog zu ONEWIRE.
Der SPS muss ich devID, Kanal und zu schaltendes Bit angeben.
Zusätzlich am Ende noch einen CRC den ich aus vorhergehendem String
generieren muss.

Wenn ich den CRC in der classdef berechnen will zeigt er in fhem die
commands on/off gar nicht an.

Wo kann ich die crc Berechnung machen,so dass ich in der fhem.cfg ein
Relais mit
RELAIS1 00 10 01 oder
RELAIS2 00 10 02 usw. definieren kann?

SPS.classdef sieht wie folgt aus. (funktioniert nicht)

send on cmd {
$msg = "@@"."$devID"."KSCIO 00"."$chan"."$bit";
$xor= chr(64);

for(my $i = 1; $i <= length($msg)-1; $i++){
      $xor = $xor ^ substr($msg,$i,1);}

$xor =~ s/(.)/sprintf("%X",ord($1))/eg;
print($msg.$xor);
}

send off cmd {} #TODO

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

Dr. Boris Neubert

                                             

Hallo,

Am 05.08.2012 10:57, schrieb NetIoR:
> Hab nun ein bisschen mit FHEM und NetIO umhergespielt aber bin immer
> noch Neuling. Auch in Sachen Perl.

bevor Du komplexe Sachen wie die unten beschriebene machst, solltest Du
unbedingt Perl lernen.

> SPS.classdef sieht wie folgt aus. (funktioniert nicht)
>
> send on cmd {
> $msg = "@@"."$devID"."KSCIO 00"."$chan"."$bit";
> $xor= chr(64);
>
> for(my $i = 1; $i <= length($msg)-1; $i++){
>       $xor = $xor ^ substr($msg,$i,1);}
>
> $xor =~ s/(.)/sprintf("%X",ord($1))/eg;
> print($msg.$xor);
> }
>
> send off cmd {} #TODO


1. Verbose auf 5 drehen und schauen, was im Log steht.
2. Das Perl-Skript muß in der classdef auf einer Zeile stehen.
3. Quoting-Regeln beherzigen - vermutlich muß das % gedoppekt werden (Du
siehst es am besten im Log).
4. Das print gehört da nicht hin. Du mußt vermutlich einfach $msg.$xor;
schreiben.
5. Erstmal einfach beginnen, und einen hartkodierten String an das Gerät
schicken und sehen, ob es damit funktioniert. Dann nach und nach
komplexere Skripten bauen.

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

Danke für das Feedback!

Das mit dem Hardcoded String hab ich gemacht und funktioniert einwandfrei
für ein Relais (on/off). :)
Die Perl Funktion zum bilden des Strangs funktioniert für sich auch. :)
Nur das Zusammenspiel klappt noch nicht.

Hab Verbose auf 5 gestellt alles in eine Zeile gepackt und das % verdoppelt.
Die Anweisung sieht nicht schlecht aus, bis auf die doppelten Semikolons.
Die sind so aber nicht in der Classdef. Werden die automatisch verdoppelt?
Was ist mit dem "explicit Package name" gemeint? Man beachte die Zeit, es
dauert jeweils 3 Sekunden für ein Zeichen.

Log sagt folgendes

2012.08.05 14:52:38 5: ECMDDevice: Analyze command >{$msg = "@"."$devID"."KSCIO 00"."$chan"."$bit";;$xor= chr(64);;for(my $i = 1;; $i <= length($msg)-1;; $i++){$xor = $xor ^ substr($msg,$i,1);;}$xor =~ s/(.)/sprintf("%X",ord($1))/eg;;$msg.$xor;;}<
2012.08.05 14:52:38 5: Bewaesserung sending Global symbol "$msg" requires explicit package name at (eval 21) line 1.
2012.08.05 14:52:41 5:
2012.08.05 14:52:41 5: Bewaesserung sending Global symbol "$devID" requires explicit package name at (eval 21) line 1.
2012.08.05 14:52:44 5:
2012.08.05 14:52:44 5: Bewaesserung sending Global symbol "$chan" requires explicit package name at (eval 21) line 1.
2012.08.05 14:52:47 5:
2012.08.05 14:52:47 5: Bewaesserung sending Global symbol "$bit" requires explicit package name at (eval 21) line 1.
2012.08.05 14:52:50 5:
2012.08.05 14:52:50 5: Bewaesserung sending Global symbol "$xor" requires explicit package name at (eval 21) line 1.
2012.08.05 14:52:53 5:
2012.08.05 14:52:53 5: Bewaesserung sending Global symbol "$msg" requires explicit package name at (eval 21) line 1.
2012.08.05 14:52:56 5:
2012.08.05 14:52:56 5: Bewaesserung sending syntax error at (eval 21) line 1, at EOF
2012.08.05 14:52:59 5:
2012.08.05 14:52:59 5: Bewaesserung sending Global symbol "$xor" requires explicit package name at (eval 21) line 1.
2012.08.05 14:53:02 5:
2012.08.05 14:53:02 5: Bewaesserung sending Global symbol "$xor" requires explicit package name at (eval 21) line 1.
2012.08.05 14:53:05 5:
2012.08.05 14:53:05 5: Bewaesserung sending Global symbol "$msg" requires explicit package name at (eval 21) line 1.
2012.08.05 14:53:08 5:
2012.08.05 14:53:08 5: Bewaesserung sending Global symbol "$xor" requires explicit package name at (eval 21) line 1.
2012.08.05 14:53:11 5:
2012.08.05 14:53:11 5: Bewaesserung sending Global symbol "$msg" requires explicit package name at (eval 21) line 1.
2012.08.05 14:53:14 5:
2012.08.05 14:53:14 5: Bewaesserung sending Global symbol "$xor" requires explicit package name at (eval 21) line 1.
2012.08.05 14:53:17 5:
2012.08.05 14:53:17 5: Triggering RELAIS10_1 (1 changes)


Gruss und nochmals vielen Dank für den Support!


Am Sonntag, 5. August 2012 11:50:22 UTC+2 schrieb Boris:
>
> Hallo,
>
> Am 05.08.2012 10:57, schrieb NetIoR:
> > Hab nun ein bisschen mit FHEM und NetIO umhergespielt aber bin immer
> > noch Neuling. Auch in Sachen Perl.
>
> bevor Du komplexe Sachen wie die unten beschriebene machst, solltest Du
> unbedingt Perl lernen.
>
> > SPS.classdef sieht wie folgt aus. (funktioniert nicht)
> >
> > send on cmd {
> > $msg = "@@"."$devID"."KSCIO 00"."$chan"."$bit";
> > $xor= chr(64);
> >
> > for(my $i = 1; $i <= length($msg)-1; $i++){
> >       $xor = $xor ^ substr($msg,$i,1);}
> >
> > $xor =~ s/(.)/sprintf("%X",ord($1))/eg;
> > print($msg.$xor);
> > }
> >
> > send off cmd {} #TODO
>
>
> 1. Verbose auf 5 drehen und schauen, was im Log steht.
> 2. Das Perl-Skript muß in der classdef auf einer Zeile stehen.
> 3. Quoting-Regeln beherzigen - vermutlich muß das % gedoppekt werden (Du
> siehst es am besten im Log).
> 4. Das print gehört da nicht hin. Du mußt vermutlich einfach $msg.$xor;
> schreiben.
> 5. Erstmal einfach beginnen, und einen hartkodierten String an das Gerät
> schicken und sehen, ob es damit funktioniert. Dann nach und nach
> komplexere Skripten bauen.
>
> Viele Grüße
> Boris
>

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

Dr. Boris Neubert

                                             

Hallo,

Am 05.08.2012 15:05, schrieb NetIoR:
> Hab Verbose auf 5 gestellt alles in eine Zeile gepackt und das % verdoppelt.
> Die Anweisung sieht nicht schlecht aus, bis auf die doppelten
> Semikolons. Die sind so aber nicht in der Classdef. Werden die
> automatisch verdoppelt?

ja, macht der automatisch, weil bei der Auswertung daraus wieder
einzelne werden.

> Was ist mit dem "explicit Package name" gemeint? Man beachte die Zeit,

Die Variablem sind nicht deklariert. Du mußt ein my davor tun. Und wo
wird $devID gesetzt und $chan und $bit usw.?

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>

Hi Boris

Danke für den Tipp, bin wieder einen Schritt weiter.
Der mit DevID, chan und bit war mein Fehler... Diese werden die an die
classdef übergeben. Das heisst da kommt ein % anstatt ein $.
Zudem hatte ich die Parameter durch , getrennt. Jetzt kommt folgendes im
LOG.

Die Parameter werden nun sauber übergeben und die anderen Meldungen tauchen
dank den "my" auch nicht mehr auf.
Aber einer bleibt noch...

Wenn ich den command von unten im Perl Interpreter eingebe, wobei ich die
Doppelten Semikolons je eins lösche und eine neue Zeile mach, ausser bei
der for Bedingung und am schluss ein print einfüge gibts genau das aus was
ich brauch!
Ist möglicherweise dass Problem dass bei der Bedingung der for-Schlaufe
keine Semikolons eingefügt werden sollten?

Gruss und Dank

2012.08.05 16:05:38 5: ECMDDevice: Analyze command >{my $msg = "@"."00"."KSCIO 00"."10"."01";;my $xor= chr(64);;for(my $i = 1;; $i <= length($msg)-1;; $i++){$xor = $xor ^ substr($msg,$i,1);;}$xor =~ s/(.)/sprintf("%X",ord($1))/eg;;$msg.$xor;;}<
2012.08.05 16:05:38 5: Bewaesserung sending syntax error at (eval 20) line 1, at EOF


Am Sonntag, 5. August 2012 15:37:27 UTC+2 schrieb Boris:
>
> Hallo,
>
> Am 05.08.2012 15:05, schrieb NetIoR:
> > Hab Verbose auf 5 gestellt alles in eine Zeile gepackt und das %
> verdoppelt.
> > Die Anweisung sieht nicht schlecht aus, bis auf die doppelten
> > Semikolons. Die sind so aber nicht in der Classdef. Werden die
> > automatisch verdoppelt?
>
> ja, macht der automatisch, weil bei der Auswertung daraus wieder
> einzelne werden.
>
> > Was ist mit dem "explicit Package name" gemeint? Man beachte die Zeit,
>
> Die Variablem sind nicht deklariert. Du mußt ein my davor tun. Und wo
> wird $devID gesetzt und $chan und $bit usw.?
>
> Grüße
> Boris
>

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

Dr. Boris Neubert

                                             

Hallo,

Am 05.08.2012 16:37, schrieb NetIoR:
> 2012.08.05 16:05:38 5: ECMDDevice: Analyze command >{my $msg =
> "@"."00"."KSCIO 00"."10"."01";;my $xor= chr(64);;for(my $i = 1;; $i
> <= length($msg)-1;; $i++){$xor = $xor ^ substr($msg,$i,1);;}$xor =~
> s/(.)/sprintf("%X",ord($1))/eg;;$msg.$xor;;}<


Die geschweiften Klammern machen noch ein Problem, denke ich mal.

Gehe doch bitte mal in fhem.pl in die sub AnalyzePerlCommand.

Schreibe dort bitte vor die Zeile

  my $ret = eval $cmd;

eine neue Zeile

  Log 1, "DEBUG >$cmd<";

Dann fhem neu starten und schauen, was da denn geloggt wird.

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

Hab die Zeile eingefügt und fhem neu gestartet. Mir scheint der Debug
Ausdruck zeigt dasselbe wie der cmd der übergeben wird.
aber in der sub AnalyzePerlCommand wird ja auch nur was mit Zeiten gemacht.
Gibt es noch ein Problem dass sub Semicolon nicht aufgerufen wird in meinem
Fall und dann die Semicolons zuviel sind?

2012.08.05 17:28:41 5: ECMDDevice: Analyze command >{my $msg = "@"."00"."KSCIO 00"."10"."01";;my $xor= chr(64);;for(my $i = 1;; $i <= length($msg)-1;; $i++){$xor = $xor ^ substr($msg,$i,1);;}$xor =~ s/(.)/sprintf("%X",ord($1))/eg;;$msg.$xor;;}<
2012.08.05 17:28:41 1: DEBUG >{my $msg = "@"."00"."KSCIO 00"."10"."01";;my $xor= chr(64);;for(my $i = 1;; $i <= length($msg)-1;; $i++){$xor = $xor ^ substr($msg,$i,1);;}$xor =~ s/(.)/sprintf("%X",ord($1))/eg;;$msg.$xor;;}<
2012.08.05 17:28:41 5: Bewaesserung sending syntax error at (eval 20) line 1, at EOF




Am Sonntag, 5. August 2012 17:19:15 UTC+2 schrieb Boris:
>
> Hallo,
>
> Am 05.08.2012 16:37, schrieb NetIoR:
> > 2012.08.05 16:05:38 5: ECMDDevice: Analyze command >{my $msg =
> > "@"."00"."KSCIO 00"."10"."01";;my $xor= chr(64);;for(my $i = 1;; $i
> > <= length($msg)-1;; $i++){$xor = $xor ^ substr($msg,$i,1);;}$xor =~
> > s/(.)/sprintf("%X",ord($1))/eg;;$msg.$xor;;}<
>
>
> Die geschweiften Klammern machen noch ein Problem, denke ich mal.
>
> Gehe doch bitte mal in fhem.pl in die sub AnalyzePerlCommand.
>
> Schreibe dort bitte vor die Zeile
>
>   my $ret = eval $cmd;
>
> eine neue Zeile
>
>   Log 1, "DEBUG >$cmd<";
>
> Dann fhem neu starten und schauen, was da denn geloggt wird.
>
> Grüße
> Boris
>

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

Dr. Boris Neubert

                                             

Hallo,

Am 05.08.2012 17:40, schrieb NetIoR:
> aber in der sub AnalyzePerlCommand wird ja auch nur was mit Zeiten
> gemacht. Gibt es noch ein Problem dass sub Semicolon nicht aufgerufen

insbesondere steht dort "eval"... ;-)

> wird in meinem Fall und dann die Semicolons zuviel sind?

Es liegt wohl an den überschüssigen Semikolons im for(). Die bekommst Du
da auch nicht weg. Sie kommen in fhem.pl in EvalSpecials() über
SemicolonEscape hinein.

Hierzu gab es in fhem-devel eine Diskussion zwischen mir und Rudi, warum
das so sein muß und wie aufwendig es wäre, das zu beheben.

Ich denke, ich werde demnächst mal den Code in einer abgewandelten Form
nach ECMD_Device portieren, um diesen Anstoß von Rückfragen zu
eliminieren. Das kann aber dauern und vielleicht kommt es nie.

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

Wart mal. ich schau mal ob ich das irgendwie anders verschleifen kann, so
dass keine for schleife verwendet wird und auch keine semicolons.
dazu brauch ich aber noch etwas zeit...

melde mich.

Vielen Dank schonmal!

Am Sonntag, 5. August 2012 19:20:11 UTC+2 schrieb Boris:
>
> Hallo,
>
> Am 05.08.2012 17:40, schrieb NetIoR:
> > aber in der sub AnalyzePerlCommand wird ja auch nur was mit Zeiten
> > gemacht. Gibt es noch ein Problem dass sub Semicolon nicht aufgerufen
>
> insbesondere steht dort "eval"... ;-)
>
> > wird in meinem Fall und dann die Semicolons zuviel sind?
>
> Es liegt wohl an den überschüssigen Semikolons im for(). Die bekommst Du
> da auch nicht weg. Sie kommen in fhem.pl in EvalSpecials() über
> SemicolonEscape hinein.
>
> Hierzu gab es in fhem-devel eine Diskussion zwischen mir und Rudi, warum
> das so sein muß und wie aufwendig es wäre, das zu beheben.
>
> Ich denke, ich werde demnächst mal den Code in einer abgewandelten Form
> nach ECMD_Device portieren, um diesen Anstoß von Rückfragen zu
> eliminieren. Das kann aber dauern und vielleicht kommt es nie.
>
> Viele Grüße
> Boris
>

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

rudolfkoenig

                                                   

> Wart mal. ich schau mal ob ich das irgendwie anders verschleifen kann, so
> dass keine for schleife verwendet wird und auch keine semicolons.
> dazu brauch ich aber noch etwas zeit...

Waer der Aufruf einer Rortine in einem 99_MyUtils.pm keine Loesung?

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

Guest

Originally posted by: <email address deleted>

Hallo
Hab einfach die for-Schelife durch ein do while ersetzt... ;)
Jetzt wird der CRC berechnet und der String korrekt verschickt.
SPS schaltet!

Ihr seid super!!! Vielen Dank.

Am Sonntag, 5. August 2012 19:44:06 UTC+2 schrieb Rudolf Koenig:
>
> > Wart mal. ich schau mal ob ich das irgendwie anders verschleifen kann,
> so
> > dass keine for schleife verwendet wird und auch keine semicolons.
> > dazu brauch ich aber noch etwas zeit...
>
> Waer der Aufruf einer Rortine in einem 99_MyUtils.pm keine Loesung?
>

Am Sonntag, 5. August 2012 19:44:06 UTC+2 schrieb Rudolf Koenig:
>
> > Wart mal. ich schau mal ob ich das irgendwie anders verschleifen kann,
> so
> > dass keine for schleife verwendet wird und auch keine semicolons.
> > dazu brauch ich aber noch etwas zeit...
>
> Waer der Aufruf einer Rortine in einem 99_MyUtils.pm keine Loesung?
>

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

Guest

Originally posted by: <email address deleted>

Hallo nochmals

So, hab grad noch getestet.
Es lassen sich nun alle Relais (26Stk) und Transistorausgänge(16Stk) der
SPS durch eine Simple Definition in der fhem.cfg definieren und ansteuern!

Als nächstes folgt der postproc für die Ausgänge, aber da hat's ja
Beispiele... dann das Zurücklesen der Zustände der Ausgänge und der
Eingänge (42Stk)

Nochmals vielen Dank.

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