Nutzung von %state in postproc der classdef

Begonnen von Florian_GT, 13 April 2015, 21:10:12

Vorheriges Thema - Nächstes Thema

Florian_GT

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   
FHEM: Proxmox Server, FHEM in VM, pgSQL DB
Hardware: Ethersex (Pollin NETIO Boards), Diverse Tasmota MQTT Devices, Raspberry Pi Zero W Kameras, (Github RaspberryPiStreamingCamera), Zigbee2MQTT, ESPEasy

Development: UBA (Umwelt Bundesamt), BFS (Bundesamt für Strahlenschutz)

Florian_GT

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?
FHEM: Proxmox Server, FHEM in VM, pgSQL DB
Hardware: Ethersex (Pollin NETIO Boards), Diverse Tasmota MQTT Devices, Raspberry Pi Zero W Kameras, (Github RaspberryPiStreamingCamera), Zigbee2MQTT, ESPEasy

Development: UBA (Umwelt Bundesamt), BFS (Bundesamt für Strahlenschutz)

Florian_GT

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);\
\
}
FHEM: Proxmox Server, FHEM in VM, pgSQL DB
Hardware: Ethersex (Pollin NETIO Boards), Diverse Tasmota MQTT Devices, Raspberry Pi Zero W Kameras, (Github RaspberryPiStreamingCamera), Zigbee2MQTT, ESPEasy

Development: UBA (Umwelt Bundesamt), BFS (Bundesamt für Strahlenschutz)

Florian_GT

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 :(



FHEM: Proxmox Server, FHEM in VM, pgSQL DB
Hardware: Ethersex (Pollin NETIO Boards), Diverse Tasmota MQTT Devices, Raspberry Pi Zero W Kameras, (Github RaspberryPiStreamingCamera), Zigbee2MQTT, ESPEasy

Development: UBA (Umwelt Bundesamt), BFS (Bundesamt für Strahlenschutz)

Florian_GT

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.
FHEM: Proxmox Server, FHEM in VM, pgSQL DB
Hardware: Ethersex (Pollin NETIO Boards), Diverse Tasmota MQTT Devices, Raspberry Pi Zero W Kameras, (Github RaspberryPiStreamingCamera), Zigbee2MQTT, ESPEasy

Development: UBA (Umwelt Bundesamt), BFS (Bundesamt für Strahlenschutz)

kpwg

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