Hallo zusammen,
ich versuche gerade eine classdef für Ethersex PWM fertig zu machen und habe da ein wenig Probleme. Ich weiß nicht, wie ich die Daten der %state Variable in die
Hallo zusammen,
ich versuche gerade eine classdef für Ethersex PWM fertig zu machen und habe da ein wenig Probleme. Ich weiß nicht, wie ich die Daten der %state Variable in die postproc bekomme.
# Uebergabeparameter
params channel
set set params state
set set cmd {\
my $pwm_set = 255-(%state*255/100);\
sprintf("pwm set %channel %.0f\n", $pwm_set);\
}
set set expect "OK\n"
set set postproc {\
s/(.*)\n/$1/;\
my $hash = $defs{%NAME};\
my $pwm = $defs{%state};\
\
readingsSingleUpdate($hash, "pwm", $pwm, 1);\
\
}
get getdata cmd {"pwm set %channel\n"}
get getdata expect "(\d+)\n"
get getdata postproc {\
s/(.*)\n/$1/;\
my $hash = $defs{%NAME};\
\
my $pwm_raw = $1;\
my $pwm = sprintf("%.0f", (255-$pwm_raw)/255*100);\
\
readingsSingleUpdate($hash, "pwm", $pwm, 1);\
\
}
Kann mir da jemand helfen?
Ziel soll es sein, die Daten aus %state in $pwm zu schreiben:
set set postproc {\
s/(.*)\n/$1/;\
my $hash = $defs{%NAME};\
my $pwm = $defs{%state};\
\
readingsSingleUpdate($hash, "pwm", $pwm, 1);\
\
}
Ich habe in der 67_ECMDDevice.pm Datei die Debug Ausgabe erweitert:
ECMDDevice_ReplaceSpecials($%)
{
my ($s, %specials)= @_;
return $s unless(defined($s));
# perform macro substitution
foreach my $special (keys %specials) {
Debug "var= ".$special;
$s =~ s/$special/$specials{$special}/g;
}
return $s;
}
Dadurch werden dann alle zur Konfiguration möglichen Variablen ausgegeben.
2015.04.17 20:18:26 1: DEBUG>var= %TYPE
2015.04.17 20:18:26 1: DEBUG>var= %channel
2015.04.17 20:18:26 1: DEBUG>var= %state
2015.04.17 20:18:26 1: DEBUG>var= %NAME
2015.04.17 20:18:26 5: ECMDDevice: Analyze command >{ my $pwm_set = 255-(0*255/100); sprintf("pwm set a %.0f\n", $pwm_set);}<
2015.04.17 20:18:26 1: DEBUG>var= %TYPE
2015.04.17 20:18:26 1: DEBUG>var= %channel
2015.04.17 20:18:26 1: DEBUG>var= %NAME
2015.04.17 20:18:26 5: Postprocessing "OK\n" with perl command {s/^OK\n$/success/; "$_" eq "success" ? "ok" : "error"; }.
2015.04.17 20:18:26 5: Postprocessed value is "ok".
Wie man hier sehen kann, wird %state für den ECMDDevice Befehl zwar geetzt, danach für das Postprocessing jedoch nicht :(
Hallo zusammen,
ich habe das Problem gelöst.
Ich habe in der Sub Funktion ECMDDevice_Set und ECMDDevice_Get der Datei 67_ECMDDevice.pm eine Erweiterung vorgenommen, damit auch in der PostProc Funktion die %blabla durch entsprechende Daten ersetzt werden.
Erweiterung:
$postproc= ECMDDevice_ReplaceSpecials($postproc, %specials);
Hier ein Beispiel:
sub
ECMDDevice_Get($@)
{
my ($hash, @a)= @_;
my $name= $hash->{NAME};
my $type= $hash->{TYPE};
return "get $name needs at least one argument" if(int(@a) < 2);
my $cmdname= $a[1];
my $IOhash= $hash->{IODev};
my $classname= $hash->{fhem}{classname};
if(!defined($IOhash->{fhem}{classDefs}{$classname}{gets}{$cmdname})) {
my $gets= $IOhash->{fhem}{classDefs}{$classname}{gets};
return "$name error: unknown argument $cmdname, choose one of " .
(join " ", sort keys %$gets);
}
my $ecmd= $IOhash->{fhem}{classDefs}{$classname}{gets}{$cmdname}{cmd};
my $expect= $IOhash->{fhem}{classDefs}{$classname}{gets}{$cmdname}{expect};
my $params= $IOhash->{fhem}{classDefs}{$classname}{gets}{$cmdname}{params};
my $postproc= $IOhash->{fhem}{classDefs}{$classname}{gets}{$cmdname}{postproc};
my %specials= ECMDDevice_GetCachedSpecials($hash);
# add specials for command
if($params) {
shift @a; shift @a;
my @params= split('[\s]+', $params);
return "Wrong number of parameters." if($#a != $#params);
my $i= 0;
foreach my $param (@params) {
Log3 $hash, 5, "Parameter %". $param . " is " . $a[$i];
$specials{"%".$param}= $a[$i++];
}
}
$ecmd= ECMDDevice_ReplaceSpecials($ecmd, %specials);
$postproc= ECMDDevice_ReplaceSpecials($postproc, %specials);
my $r = ECMDDevice_AnalyzeCommand($hash, $ecmd);
my $v= IOWrite($hash, $r, $expect);
$v= ECMDDevice_PostProc($hash, $postproc, $v);
return ECMDDevice_Changed($hash, $cmdname, $v);
}
Es wäre super, wenn, insofern ok, wir dass dann auch in die Standard Version aufnehmen könnten.
Zitat von: afloria am 22 April 2015, 21:58:37
Es wäre super, wenn, insofern ok, wir dass dann auch in die Standard Version aufnehmen könnten.
Ich würde das auch begrüßen- aus dieser Funktion ergeben sich ne Menge neuer Möglichkeiten! ::)
Boris, wie siehst Du das?
Viele Grüße, Ricardo