From ca47564cdcc9f76c946cce20d82d2ba75696adb7 Mon Sep 17 00:00:00 2001 From: klausw <> Date: Sun, 5 Mar 2017 01:36:56 +0000 Subject: [PATCH] 52_I2C_PCF8574: replaced smartmatch, enhanced compatibility with FRM git-svn-id: https://svn.fhem.de/fhem/trunk@13601 2b470e98-0d58-463d-a4d8-8e2adae1ed80 --- fhem/FHEM/52_I2C_PCF8574.pm | 332 +++++++++++++++++++----------------- 1 file changed, 171 insertions(+), 161 deletions(-) diff --git a/fhem/FHEM/52_I2C_PCF8574.pm b/fhem/FHEM/52_I2C_PCF8574.pm index d566e0552..65d60fbb7 100644 --- a/fhem/FHEM/52_I2C_PCF8574.pm +++ b/fhem/FHEM/52_I2C_PCF8574.pm @@ -17,43 +17,54 @@ sub I2C_PCF8574_Initialize($) { #$hash->{Match} = ".*"; $hash->{DefFn} = "I2C_PCF8574_Define"; - $hash->{InitFn} = 'I2C_PCF8574_Init'; + $hash->{InitFn} = 'I2C_PCF8574_Init'; $hash->{AttrFn} = "I2C_PCF8574_Attr"; $hash->{SetFn} = "I2C_PCF8574_Set"; - $hash->{StateFn} = "I2C_PCF8574_State"; + $hash->{StateFn} = "I2C_PCF8574_State"; $hash->{GetFn} = "I2C_PCF8574_Get"; $hash->{UndefFn} = "I2C_PCF8574_Undef"; - $hash->{ParseFn} = "I2C_PCF8574_Parse"; + #$hash->{ParseFn} = "I2C_PCF8574_Parse"; $hash->{I2CRecFn} = "I2C_PCF8574_I2CRec"; $hash->{AttrList} = "IODev do_not_notify:1,0 ignore:1,0 showtime:1,0 ". "poll_interval OnStartup ". "InputPorts:multiple-strict,0,1,2,3,4,5,6,7 ". + "InvrtPorts:multiple-strict,0,1,2,3,4,5,6,7 ". "$readingFnAttributes"; } ################################### sub I2C_PCF8574_Set($@) { # - my ($hash, @a) = @_; + my ($hash, @a) = @_; my $name =$a[0]; - my $cmd = $a[1]; - my $val = $a[2]; - my @inports = sort(split( " ",AttrVal($name, "InputPorts", ""))); + my $cmd = $a[1]; + my $val = $a[2]; + my %sendpackage = ( i2caddress => $hash->{I2C_Address}, direction => "i2cwrite" ); if ( $cmd && $cmd =~ m/^P(ort|)((0|)[0-7])(,(P|)(ort|)((0|)[0-7])){0,7}$/i) { return "wrong value: $val for \"set $name $cmd\" use one of: off, on" unless(exists($setsP{$val})); my @scmd = split(",", $cmd); + my $scms = 0; my $msg = undef; foreach (@scmd) { $_ =~ tr/[a-zA-Z]//d; #Nummer aus String extrahieren - $msg .= (defined $msg ? "," : "") . "Port" . $_ if ( $_ ~~ @inports ); #Pruefen ob entsprechender Port Input ist + $msg .= (defined $msg ? "," : "") . "Port" . $_ if ( ((1 << $_) & $hash->{helper}{InputPorts}) != 0 ); #Pruefen ob entsprechender Port Input ist + $scms |= 1 << $_; + #Log3 $hash, 1, "$hash->{NAME} test: $_|$scms|@scmd|"; } return "$name error: $msg is defined as input" if $msg; my $sbyte = 0; foreach (0..7) { - if ($_ ~~ @inports) { #Port der als Input konfiguriert ist wird auf 1 gesetzt - $sbyte += 1 << (1 * $_); - } elsif( $_ ~~ @scmd ) { #Port der geaendert werden soll + #if ($_ ~~ @inports) { #Port der als Input konfiguriert ist wird auf 1 gesetzt + ##if ( grep { $_ eq $clientAddress} @inports ) { #test + # $sbyte += 1 << (1 * $_); + #} elsif( $_ ~~ @scmd ) { #Port der geaendert werden soll + # $sbyte += $setsP{$val} << (1 * $_); + #} else { #alle anderen Portwerte werden den Readings entnommen + # $sbyte += $setsP{ReadingsVal($name,'Port'.$_,"off")} << (1 * $_); #->sonst aus dem Reading holen + #} + if( ((1 << $_) & $scms) != 0 ) { #Port der geaendert werden soll $sbyte += $setsP{$val} << (1 * $_); + Log3 $hash, 5, "$hash->{NAME} Port$_ soll auf $val gesetzt werden"; } else { #alle anderen Portwerte werden den Readings entnommen $sbyte += $setsP{ReadingsVal($name,'Port'.$_,"off")} << (1 * $_); #->sonst aus dem Reading holen } @@ -62,41 +73,38 @@ sub I2C_PCF8574_Set($@) { # } elsif ( $cmd && $cmd eq "setfromreading" ) { my $sbyte = 0; foreach (0..7) { - if ($_ ~~ @inports) { #Port der als Input konfiguriert ist wird auf 1 gesetzt - $sbyte += 1 << (1 * $_); - } else { #alle anderen Portwerte werden den Readings entnommen + #if ($_ ~~ @inports) { #Port der als Input konfiguriert ist wird auf 1 gesetzt + # $sbyte += 1 << (1 * $_); + #} else { #alle anderen Portwerte werden den Readings entnommen $sbyte += $setsP{ReadingsVal($name,'Port'.$_,"off")} << (1 * $_); - } + #} } $sendpackage{data} = $sbyte; } else { my $list = undef; foreach (0..7) { - next if ( $_ ~~ @inports ); #Inputs ueberspringen + #next if ( $_ ~~ @inports ); #Inputs ueberspringen + next if ( ((1 << $_) & $hash->{helper}{InputPorts}) != 0 ); #Inputs ueberspringen ohne Smartmatch $list .= "Port" . $_ . ":" . join(',', (sort { $setsP{ $a } <=> $setsP{ $b } } keys %setsP) ) . " "; } return "Unknown argument $a[1], choose one of " . $list if defined $list; return "Unknown argument $a[1]"; } + Log3 $hash, 5, "$hash->{NAME} Output: 0b" . sprintf("%08b",$sendpackage{data}); + Log3 $hash, 5, "$hash->{NAME} Inverts: 0b" . sprintf("%08b",$hash->{helper}{InvrtPorts}); + Log3 $hash, 5, "$hash->{NAME} Inputs: 0b" . sprintf("%08b",$hash->{helper}{InputPorts}); + $sendpackage{data} = ($sendpackage{data} ^ ($hash->{helper}{InvrtPorts} ||= 0) ) | ($hash->{helper}{InputPorts} ||= 0); + Log3 $hash, 5, "$hash->{NAME} Result: 0b" . sprintf("%08b",$sendpackage{data}); return "$name: no IO device defined" unless ($hash->{IODev}); - my $phash = $hash->{IODev}; - my $pname = $phash->{NAME}; - CallFn($pname, "I2CWrtFn", $phash, \%sendpackage); - ########################################################## - # IOWrite($hash, \%sendpackage); - ########################################################## - - ########################################################## - # Look for all devices with the same code, and set state, timestamp - #my $code = "$hash->{I2C_Address} $hash->{BTN}"; - #my $code = "$hash->{NAME} $hash->{I2C_Address}"; - #my $tn = TimeNow(); - #my $defptr = $modules{I2C_PCF8574}{defptr}{$code}; - #foreach my $n (keys %{ $defptr }) { - # readingsSingleUpdate($defptr->{$n}, "state", $v, 1); - # } - ########################################################## - return undef; + my $phash = $hash->{IODev}; + my $pname = $phash->{NAME}; + CallFn($pname, "I2CWrtFn", $phash, \%sendpackage); + I2C_PCF8574_Get($hash, $name) if $phash->{TYPE} ne "RPII2C"; # Bei allen IODevs ausser RPII2C Daten zuruecklesen, da diese sondt nicht aktualisiert werden + #Log3 $hash, 1, "$hash->{NAME} IODev Typ: $phash->{TYPE}"; + #%sendpackage = (); + #%sendpackage = ( i2caddress => $hash->{I2C_Address}, direction => "i2cread"); + #CallFn($pname, "I2CWrtFn", $phash, \%sendpackage); + return undef; } ################################### sub I2C_PCF8574_Get($@) { @@ -106,18 +114,15 @@ sub I2C_PCF8574_Get($@) { #%sendpackage = ( direction => "i2cread", id => (defined( $hash->{ID} )? $hash->{ID} : "00"), i2caddress => $hash->{I2C_Address}); %sendpackage = ( i2caddress => $hash->{I2C_Address}, direction => "i2cread"); return "$name: no IO device defined" unless ($hash->{IODev}); - #neu: ueber CallFn auf eigene Funktion my $phash = $hash->{IODev}; - my $pname = $phash->{NAME}; + my $pname = $phash->{NAME}; CallFn($pname, "I2CWrtFn", $phash, \%sendpackage); - #alt: fuer IOWrite - #IOWrite($hash, \%sendpackage); } ################################### sub I2C_PCF8574_Attr(@) { # my ($command, $name, $attr, $val) = @_; my $hash = $defs{$name}; - my $msg = ''; + my $msg = undef; if ($command && $command eq "set" && $attr && $attr eq "IODev") { if ($main::init_done and (!defined ($hash->{IODev}) or $hash->{IODev}->{NAME} ne $val)) { main::AssignIoPort($hash,$val); @@ -138,12 +143,36 @@ sub I2C_PCF8574_Attr(@) { # } } elsif ($attr && $attr eq "InputPorts") { if ( defined($val) ) { - my @inp = split(" ", $val); - foreach (@inp) { - $msg = "wrong value: $_ for \"set $name $attr\" use space separated numbers 0-7" unless ($_ >= 0 && $_ < 8); + my @tmp = split(/\D+/, $val); + my $tmpattr; + foreach (@tmp) { + if ($_ =~ /^[0-7]$/) { + $tmpattr += 1 << (1 * $_); + } else { + $msg = "wrong value: $_ for \"attr $name $attr\" use comma separated numbers 0-7"; + } } + $hash->{helper}{$attr} = $tmpattr unless defined $msg; + } else { + $hash->{helper}{$attr} = 0; } - } elsif ($attr && $attr eq "OnStartup") { + } elsif ($attr && $attr eq "InvrtPorts") { + if ( defined($val) ) { + my @tmp = split(/\D+/, $val); + my $tmpattr; + foreach (@tmp) { + if ($_ =~ /^[0-7]$/) { + $tmpattr += 1 << (1 * $_); + } else { + $msg = "wrong value: $_ for \"attr $name $attr\" use comma separated numbers 0-7"; + } + } + $hash->{helper}{$attr} = $tmpattr unless defined $msg; + } else { + #delete $hash->{helper}{$attr} if defined $hash->{helper}{$attr}; + $hash->{helper}{$attr} = 0; + } + }elsif ($attr && $attr eq "OnStartup") { if (defined $val) { foreach (split (/,/,$val)) { my @pair = split (/=/,$_); @@ -159,6 +188,8 @@ sub I2C_PCF8574_Define($$) { # my ($hash, $def) = @_; my @a = split("[ \t]+", $def); $hash->{STATE} = 'defined'; + $hash->{helper}{InvrtPorts} = 0; + $hash->{helper}{InputPorts} = 0; if ($main::init_done) { eval { I2C_PCF8574_Init( $hash, [ @a[ 2 .. scalar(@a) - 1 ] ] ); }; return I2C_PCF8574_Catch($@) if $@; @@ -174,45 +205,34 @@ sub I2C_PCF8574_Init($$) { # return "Define: Wrong syntax. Usage:\n" . "define I2C_PCA9532 "; } - - if (defined (my $address = shift @$args)) { - $hash->{I2C_Address} = $address =~ /^0.*$/ ? oct($address) : $address; - } else { - return "$name I2C Address not valid"; - } - - #fuer die Nutzung von IOWrite - #my $code = ( defined( $hash->{ID} )? $hash->{ID} : "00" ) . " " . $hash->{I2C_Address}; - #my $ncode = 1; - #my $name = $a[0]; - #$hash->{CODE}{$ncode++} = $code; - #$modules{I2C_PCF8574}{defptr}{$code}{$name} = $hash; - - AssignIoPort($hash); + if (defined (my $address = shift @$args)) { + $hash->{I2C_Address} = $address =~ /^0.*$/ ? oct($address) : $address; + } else { + return "$name I2C Address not valid"; + } + AssignIoPort($hash); $hash->{STATE} = 'Initialized'; I2C_PCF8574_Set($hash, $name, "setfromreading"); - return; } ################################### sub I2C_PCF8574_Catch($) { - my $exception = shift; - if ($exception) { - $exception =~ /^(.*)( at.*FHEM.*)$/; - return $1; - } - return undef; + my $exception = shift; + if ($exception) { + $exception =~ /^(.*)( at.*FHEM.*)$/; + return $1; + } + return undef; } ################################### sub I2C_PCF8574_State($$$$) { #reload readings at FHEM start my ($hash, $tim, $sname, $sval) = @_; Log3 $hash, 4, "$hash->{NAME}: $sname kann auf $sval wiederhergestellt werden $tim"; if ($sname =~ m/^Port[0-7]$/i) { - my $po = $sname; #noch ändern + my $po = $sname; #noch �ndern $po =~ tr/[a-zA-Z]//d; #Nummer aus String extrahieren - - my @inports = sort(split(/ /,AttrVal($hash->{NAME}, "InputPorts", ""))); - unless ( $po ~~ @inports) { + #my @inports = sort(split(/\D+/,AttrVal($hash->{NAME}, "InputPorts", ""))); + unless ( ((1 << $po) & $hash->{helper}{InputPorts}) != 0 ) { my %onstart = split /[,=]/, AttrVal($hash->{NAME}, "OnStartup", ""); if ( exists($onstart{$po}) && exists($setsP{$onstart{$po}})) { Log3 $hash, 5, "$hash->{NAME}: $sname soll auf $onstart{$po} gesetzt werden"; @@ -222,7 +242,6 @@ sub I2C_PCF8574_State($$$$) { #reload readings at FHEM start $hash->{READINGS}{$sname}{VAL} = $sval; $hash->{READINGS}{$sname}{TIME} = $tim; } - } else { Log3 $hash, 5, "$hash->{NAME}: $sname ist Eingang"; } @@ -231,107 +250,90 @@ sub I2C_PCF8574_State($$$$) { #reload readings at FHEM start } ################################### sub I2C_PCF8574_Undef($$) { # - my ($hash, $name) = @_; - if ( defined (AttrVal($hash->{NAME}, "poll_interval", undef)) ) { - RemoveInternalTimer($hash); - } - #foreach my $c (keys %{ $hash->{CODE} } ) { - # $c = $hash->{CODE}{$c}; - # my $c = ( defined( $hash->{ID} )? $hash->{ID} : "00" ) . " " . $hash->{I2C_Address}; - # As after a rename the $name my be different from the $defptr{$c}{$n} - # we look for the hash. - # foreach my $dname (keys %{ $modules{I2C_PCF8574}{defptr}{$c} }) { - # delete($modules{I2C_PCF8574}{defptr}{$c}{$dname}) - # if($modules{I2C_PCF8574}{defptr}{$c}{$dname} == $hash); - # } - # } - return undef; + my ($hash, $name) = @_; + RemoveInternalTimer($hash) if ( defined (AttrVal($hash->{NAME}, "poll_interval", undef)) ); + return undef; } ################################### -sub I2C_PCF8574_Poll($) { #for attr poll_intervall -> readout pin values - my ($hash) = @_; - my $name = $hash->{NAME}; - # Read values - I2C_PCF8574_Get($hash, $name); - my $pollInterval = AttrVal($hash->{NAME}, 'poll_interval', 0); - if ($pollInterval > 0) { - InternalTimer(gettimeofday() + ($pollInterval * 60), 'I2C_PCF8574_Poll', $hash, 0); - } +sub I2C_PCF8574_Poll($) { # for attr poll_intervall -> readout pin values + my ($hash) = @_; + I2C_PCF8574_Get($hash, $hash->{NAME}); # Read values + my $pollInterval = AttrVal($hash->{NAME}, 'poll_interval', 0); + InternalTimer(gettimeofday() + ($pollInterval * 60), 'I2C_PCF8574_Poll', $hash, 0) if ($pollInterval > 0); } ################################### -sub I2C_PCF8574_I2CRec($@) { # ueber CallFn vom physical aufgerufen +sub I2C_PCF8574_I2CRec($@) { # ueber CallFn vom physical aufgerufen my ($hash, $clientmsg) = @_; my $name = $hash->{NAME}; my $phash = $hash->{IODev}; my $pname = $phash->{NAME}; - while ( my ( $k, $v ) = each %$clientmsg ) { #erzeugen von Internals fuer alle Keys in $clientmsg die mit dem physical Namen beginnen - $hash->{$k} = $v if $k =~ /^$pname/ ; - } + while ( my ( $k, $v ) = each %$clientmsg ) { #erzeugen von Internals fuer alle Keys in $clientmsg die mit dem physical Namen beginnen + $hash->{$k} = $v if $k =~ /^$pname/ ; + } my $sval; - if ($clientmsg->{direction} && $clientmsg->{$pname . "_SENDSTAT"} && $clientmsg->{$pname . "_SENDSTAT"} eq "Ok") { + if ($clientmsg->{direction} && $clientmsg->{$pname . "_SENDSTAT"} && $clientmsg->{$pname . "_SENDSTAT"} eq "Ok") { readingsBeginUpdate($hash); - if ($clientmsg->{direction} eq "i2cread" && defined($clientmsg->{received})) { # =~ m/^(0x|)[0-9A-F]{1,2}$/xi) { + if ($clientmsg->{direction} eq "i2cread" && defined($clientmsg->{received})) { + readingsBulkUpdate($hash, 'state', $clientmsg->{received}); + $clientmsg->{received} ^= $hash->{helper}{InvrtPorts}; foreach (0..7) { - #$sval = hex($clientmsg->{received}) & (1 << $_); $sval = $clientmsg->{received} & (1 << $_); - $sval = $sval == 0 ? "off" :"on"; - readingsBulkUpdate($hash, 'Port'.$_ , $sval) if (ReadingsVal($name,'Port'.$_,"") ne $sval); - } - readingsBulkUpdate($hash, 'state', $clientmsg->{received}); - } elsif ($clientmsg->{direction} eq "i2cwrite" && defined($clientmsg->{data})) { # =~ m/^(0x|)[0-9A-F]{1,2}$/xi) { - my @inports = sort(split( " ",AttrVal($name, "InputPorts", ""))); - foreach (0..7) { - #$sval = hex($clientmsg->{data}) & (1 << $_); - $sval = $clientmsg->{data} & (1 << $_); - $sval = $sval == 0 ? "off" :"on"; - readingsBulkUpdate($hash, 'Port'.$_ , $sval) unless (ReadingsVal($name,'Port'.$_,"") eq $sval || $_ ~~ @inports ); - } - readingsBulkUpdate($hash, 'state', $clientmsg->{data}); + $sval = $sval == 0 ? "off" :"on"; + readingsBulkUpdate($hash, 'Port'.$_ , $sval) if (ReadingsVal($name,'Port'.$_,"") ne $sval); + } + } elsif ($clientmsg->{direction} eq "i2cwrite" && defined($clientmsg->{data})) { + #my @inports = sort(split( /\D+/,AttrVal($name, "InputPorts", ""))); + readingsBulkUpdate($hash, 'state', $clientmsg->{data}); + $clientmsg->{data} ^= $hash->{helper}{InvrtPorts}; + foreach (0..7) { + $sval = $clientmsg->{data} & (1 << $_); + $sval = $sval == 0 ? "off" :"on"; + readingsBulkUpdate($hash, 'Port'.$_ , $sval) unless (ReadingsVal($name,'Port'.$_,"") eq $sval);# || $_ ~~ @inports ); + } + } + readingsEndUpdate($hash, 1); } - #readingsBulkUpdate($hash, 'state', join(" ", $clientmsg->{received})); - readingsEndUpdate($hash, 1); - } } ################################### -sub I2C_PCF8574_Parse($$) { #wird ueber dispatch vom physical device aufgerufen (dispatch wird im mom nicht verwendet) - my ($hash, $msg) = @_; - my($sid, $addr, @msg) = split(/ /,$msg); - #Log3 $hash, 4, "Vom Netzerparse $hash->{NAME}: sid: $sid, Msg: @msg"; - - my $def = $modules{I2C_PCF8574}{defptr}{"$sid $addr"}; - if($def) { - my @list; - foreach my $n (keys %{ $def }) { - my $lh = $def->{$n}; # Hash bekommen - $n = $lh->{NAME}; # It may be renamed - return "" if(IsIgnored($n)); # Little strange. - ################################################ - my $cde = join(" ",@msg); - my $sval; - readingsBeginUpdate($lh); - if ( int(@msg) == 1) { - for (my $i = 0; $i < 8; $i++) { - #$sval = hex($cde) & (1 << $i); - $sval = $cde & (1 << $i); - $sval = $sval == 0 ? "0" :"1"; - readingsBulkUpdate($lh, 'P'.$i , $sval) if (ReadingsVal($n,'P'.$i,2) ne $sval); - } - } - readingsBulkUpdate($lh, 'state', join(" ", @msg)); - readingsEndUpdate($lh, 1); - ################################################ - Log3 $n, 4, "I2C_PCF8574 $n $cde"; - - push(@list, $n); - } - return @list; - - } else { - Log3 $hash, 3, "I2C_PCF8574 Unknown device $addr Id $sid"; - #return "UNDEFINED I2C_PCF8574_$addr$sid I2C_PCF8574 $addr $sid"; - } - -} +#sub I2C_PCF8574_Parse($$) { #wird ueber dispatch vom physical device aufgerufen (dispatch wird im mom nicht verwendet) +# my ($hash, $msg) = @_; +# my($sid, $addr, @msg) = split(/ /,$msg); +# #Log3 $hash, 4, "Vom Netzerparse $hash->{NAME}: sid: $sid, Msg: @msg"; +# +# my $def = $modules{I2C_PCF8574}{defptr}{"$sid $addr"}; +# if($def) { +# my @list; +# foreach my $n (keys %{ $def }) { +# my $lh = $def->{$n}; # Hash bekommen +# $n = $lh->{NAME}; # It may be renamed +# return "" if(IsIgnored($n)); # Little strange. +# ################################################ +# my $cde = join(" ",@msg); +# my $sval; +# readingsBeginUpdate($lh); +# if ( int(@msg) == 1) { +# for (my $i = 0; $i < 8; $i++) { +# #$sval = hex($cde) & (1 << $i); +# $sval = $cde & (1 << $i); +# $sval = $sval == 0 ? "0" :"1"; +# readingsBulkUpdate($lh, 'P'.$i , $sval) if (ReadingsVal($n,'P'.$i,2) ne $sval); +# } +# } +# readingsBulkUpdate($lh, 'state', join(" ", @msg)); +# readingsEndUpdate($lh, 1); +# ################################################ +# Log3 $n, 4, "I2C_PCF8574 $n $cde"; +# +# push(@list, $n); +# } +# return @list; +# +# } else { +# Log3 $hash, 3, "I2C_PCF8574 Unknown device $addr Id $sid"; +# #return "UNDEFINED I2C_PCF8574_$addr$sid I2C_PCF8574 $addr $sid"; +# } +# +#} ################################### 1; @@ -396,9 +398,13 @@ sub I2C_PCF8574_Parse($$) { #wird ueber dispatch vom physical device aufgerufen Default: -, valid values: decimal number

  • InputPorts
    - Space separated list of Portnumers that are used as Inputs
    + Comma separated list of Portnumers that are used as Inputs
    Ports in this list can't be written
    - Default: no, valid values: 0 1 2 .. 7

    + Default: -, valid values: 0 - 7

    +
  • +
  • InvrtPorts
    + Comma separated list of Portnumers that will be inverted
    + Default: -, valid values: 0 - 7

  • OnStartup
    Comma separated list of output ports and their desired state after start
    @@ -473,9 +479,13 @@ sub I2C_PCF8574_Parse($$) { #wird ueber dispatch vom physical device aufgerufen Standard: -, gültige Werte: Dezimalzahl

  • InputPorts
    - Durch Leerzeichen getrennte Portnummern die als Inputs genutzt werden.
    + Durch Komma getrennte Portnummern die als Inputs genutzt werden.
    Ports in dieser Liste können nicht geschrieben werden.
    - Standard: no, gültige Werte: 0 1 2 .. 7

    + Standard: -, gültige Werte: 0 - 7

    +
  • +
  • InvrtPorts
    + Durch Komma getrennte Portnummern die invertiert werden.
    + Standard: -, gültige Werte: 0 - 7

  • OnStartup
    Durch Komma getrennte Output Ports und ihr gewünschter Status nach dem Start.
    @@ -492,4 +502,4 @@ sub I2C_PCF8574_Parse($$) { #wird ueber dispatch vom physical device aufgerufen =end html_DE -=cut \ No newline at end of file +=cut