From 0dc2dd403ff6bad4c2da3d2536b1ec2e7437eb12 Mon Sep 17 00:00:00 2001 From: klauswitt <> Date: Mon, 7 Apr 2014 19:55:22 +0000 Subject: [PATCH] set for multiple ports Umlaute git-svn-id: https://svn.fhem.de/fhem/trunk/fhem@5478 2b470e98-0d58-463d-a4d8-8e2adae1ed80 --- FHEM/52_I2C_PCF8574.pm | 29 ++++++++++++++++++----------- 1 file changed, 18 insertions(+), 11 deletions(-) diff --git a/FHEM/52_I2C_PCF8574.pm b/FHEM/52_I2C_PCF8574.pm index fd04b81eb..03b004b5b 100644 --- a/FHEM/52_I2C_PCF8574.pm +++ b/FHEM/52_I2C_PCF8574.pm @@ -36,22 +36,25 @@ sub I2C_PCF8574_Set($@) { # my $val = $a[2]; my @inports = sort(split( " ",AttrVal($name, "InputPorts", ""))); my %sendpackage = ( i2caddress => $hash->{I2C_Address}, direction => "i2cwrite" ); - if ( $cmd && $cmd =~ m/^Port((0|)[0-7])$/i) { + 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})); - substr($cmd,0,4,""); #Nummer aus String extrahieren - return "$name error: Port$cmd is defined as input" if ( $cmd ~~ @inports ); #Pruefen ob entsprechender Port Input ist + my @scmd = split(",", $cmd); + foreach (@scmd) { + $_ =~ tr/[a-zA-Z]//d; #Nummer aus String extrahieren + #substr($_,0,4,""); #Nummer aus String extrahieren + return "$name error: Port$cmd is defined as input" if ( $_ ~~ @inports ); #Pruefen ob entsprechender Port Input ist + } my $sbyte = 0; foreach (0..7) { - if ($_ == $cmd) { #Port der geaendert werden soll - $sbyte += $setsP{$val} << (1 * $_); - } elsif ($_ ~~ @inports) {#Port der als Input konfiguriert ist wird auf 1 gesetzt + if ($_ ~~ @inports) {#Port der als Input konfiguriert ist wird auf 1 gesetzt $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 } } - #$sendpackage{data} = sprintf("%.2X",$sbyte); $sendpackage{data} = $sbyte; } else { my $list = undef; @@ -290,13 +293,13 @@ sub I2C_PCF8574_Parse($$) { #wird ueber dispatch vom physical device aufgerufen Define
define <name> I2C_PCF8574 <I2C Address>
<I2C Address>
is an 2 digit hexadecimal value<I2C Address>
is without direction bitset <name> <port> <value>
set <name> <port[,port[...]]> <value>
<port>
is one of Port0 to Port7 and <value>
is one of:set mod1 Port4 on
set mod1 Port4,Port6 off
set mod1 Port4,6 on
define <name> I2C_PCF8574 <I2C Address>
<I2C Address>
ist ein zweistelliger Hex-Wert<I2C Address>
ist ohne das Richtungsbitset <name> <port> <value>
set <name> <port[,port[...]]> <value>
<port>
kann Port0 bis Port7 annehmen und <value>
folgende Werte:set mod1 Port4 on
set mod1 Port4,Port6 off
set mod1 Port4,6 on