2
0
mirror of https://github.com/fhem/fhem-mirror.git synced 2025-04-22 20:24:36 +00:00

added attribute OnStartup

updated commandref

git-svn-id: https://svn.fhem.de/fhem/trunk@6210 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
klauswitt 2014-07-06 21:38:51 +00:00
parent 34b2e470d0
commit 95de4abcf3

View File

@ -20,12 +20,13 @@ sub I2C_PCF8574_Initialize($) {
$hash->{InitFn} = 'I2C_PCF8574_Init'; $hash->{InitFn} = 'I2C_PCF8574_Init';
$hash->{AttrFn} = "I2C_PCF8574_Attr"; $hash->{AttrFn} = "I2C_PCF8574_Attr";
$hash->{SetFn} = "I2C_PCF8574_Set"; $hash->{SetFn} = "I2C_PCF8574_Set";
$hash->{StateFn} = "I2C_PCF8574_State";
$hash->{GetFn} = "I2C_PCF8574_Get"; $hash->{GetFn} = "I2C_PCF8574_Get";
$hash->{UndefFn} = "I2C_PCF8574_Undef"; $hash->{UndefFn} = "I2C_PCF8574_Undef";
$hash->{ParseFn} = "I2C_PCF8574_Parse"; $hash->{ParseFn} = "I2C_PCF8574_Parse";
$hash->{I2CRecFn} = "I2C_PCF8574_I2CRec"; $hash->{I2CRecFn} = "I2C_PCF8574_I2CRec";
$hash->{AttrList} = "IODev do_not_notify:1,0 ignore:1,0 showtime:1,0 ". $hash->{AttrList} = "IODev do_not_notify:1,0 ignore:1,0 showtime:1,0 ".
"poll_interval InputPorts ". "poll_interval InputPorts OnStartup ".
"$readingFnAttributes"; "$readingFnAttributes";
} }
################################### ###################################
@ -57,6 +58,16 @@ sub I2C_PCF8574_Set($@) { #
} }
} }
$sendpackage{data} = $sbyte; $sendpackage{data} = $sbyte;
} 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
$sbyte += $setsP{ReadingsVal($name,'Port'.$_,"off")} << (1 * $_);
}
}
$sendpackage{data} = $sbyte;
} else { } else {
my $list = undef; my $list = undef;
foreach (0..7) { foreach (0..7) {
@ -103,9 +114,16 @@ sub I2C_PCF8574_Get($@) {
} }
################################### ###################################
sub I2C_PCF8574_Attr(@) { # sub I2C_PCF8574_Attr(@) { #
my (undef, $name, $attr, $val) = @_; my ($command, $name, $attr, $val) = @_;
my $hash = $defs{$name}; my $hash = $defs{$name};
my $msg = ''; my $msg = '';
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);
my @def = split (' ',$hash->{DEF});
I2C_PCF8574_Init($hash,\@def) if (defined ($hash->{IODev}));
}
}
if ($attr eq 'poll_interval') { if ($attr eq 'poll_interval') {
if ( defined($val) ) { if ( defined($val) ) {
if ( looks_like_number($val) && $val > 0) { if ( looks_like_number($val) && $val > 0) {
@ -124,6 +142,14 @@ sub I2C_PCF8574_Attr(@) { #
$msg = "wrong value: $_ for \"set $name $attr\" use space separated numbers 0-7" unless ($_ >= 0 && $_ < 8); $msg = "wrong value: $_ for \"set $name $attr\" use space separated numbers 0-7" unless ($_ >= 0 && $_ < 8);
} }
} }
} elsif ($attr && $attr eq "OnStartup") {
if (defined $val) {
foreach (split (/,/,$val)) {
my @pair = split (/=/,$_);
$msg = "wrong value: $_ for \"attr $hash->{NAME} $attr\" use comma separated <port>=on|off|last where <port> = 0 - 7"
unless ( scalar(@pair) == 2 && ($pair[0] =~ m/^[0-7]$/i && ( $pair[1] eq "last" || exists($setsP{$pair[1]}) ) ) );
}
}
} }
return $msg return $msg
} }
@ -163,6 +189,8 @@ sub I2C_PCF8574_Init($$) { #
AssignIoPort($hash); AssignIoPort($hash);
$hash->{STATE} = 'Initialized'; $hash->{STATE} = 'Initialized';
I2C_PCF8574_Set($hash, $name, "setfromreading");
return; return;
} }
################################### ###################################
@ -175,6 +203,32 @@ sub I2C_PCF8574_Catch($) {
return undef; 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
$po =~ tr/[a-zA-Z]//d; #Nummer aus String extrahieren
my @inports = sort(split(/ /,AttrVal($hash->{NAME}, "InputPorts", "")));
unless ( $po ~~ @inports) {
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";
readingsSingleUpdate($hash,$sname, $onstart{$po}, 1);
} else {
Log3 $hash, 5, "$hash->{NAME}: $sname soll auf Altzustand: $sval gesetzt werden";
$hash->{READINGS}{$sname}{VAL} = $sval;
$hash->{READINGS}{$sname}{TIME} = $tim;
}
} else {
Log3 $hash, 5, "$hash->{NAME}: $sname ist Eingang";
}
}
return undef;
}
###################################
sub I2C_PCF8574_Undef($$) { # sub I2C_PCF8574_Undef($$) { #
my ($hash, $name) = @_; my ($hash, $name) = @_;
if ( defined (AttrVal($hash->{NAME}, "poll_interval", undef)) ) { if ( defined (AttrVal($hash->{NAME}, "poll_interval", undef)) ) {
@ -341,6 +395,11 @@ sub I2C_PCF8574_Parse($$) { #wird ueber dispatch vom physical device aufgerufen
Ports in this list can't be written<br> Ports in this list can't be written<br>
Default: no, valid values: 0 1 2 .. 7<br><br> Default: no, valid values: 0 1 2 .. 7<br><br>
</li> </li>
<li>OnStartup<br>
Comma separated list of output ports and their desired state after start<br>
Without this atribut all output ports will set to last state<br>
Default: -, valid values: <port>=on|off|last where <port> = 0 - 7<br><br>
</li>
<li><a href="#IODev">IODev</a></li> <li><a href="#IODev">IODev</a></li>
<li><a href="#ignore">ignore</a></li> <li><a href="#ignore">ignore</a></li>
<li><a href="#do_not_notify">do_not_notify</a></li> <li><a href="#do_not_notify">do_not_notify</a></li>
@ -412,6 +471,11 @@ sub I2C_PCF8574_Parse($$) { #wird ueber dispatch vom physical device aufgerufen
Ports in dieser Liste k&ouml;nnen nicht geschrieben werden.<br> Ports in dieser Liste k&ouml;nnen nicht geschrieben werden.<br>
Standard: no, g&uuml;ltige Werte: 0 1 2 .. 7<br><br> Standard: no, g&uuml;ltige Werte: 0 1 2 .. 7<br><br>
</li> </li>
<li>OnStartup<br>
Durch Komma getrennte Output Ports und ihr gew&uuml;nschter Status nach dem Start.<br>
Ohne dieses Attribut werden alle Ausg&auml;nge nach dem Start auf den letzten Status gesetzt.<br>
Standard: -, g&uuml;ltige Werte: <port>=on|off|last wobei <port> = 0 - 7<br><br>
</li>
<li><a href="#IODev">IODev</a></li> <li><a href="#IODev">IODev</a></li>
<li><a href="#ignore">ignore</a></li> <li><a href="#ignore">ignore</a></li>
<li><a href="#do_not_notify">do_not_notify</a></li> <li><a href="#do_not_notify">do_not_notify</a></li>