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:
parent
34b2e470d0
commit
95de4abcf3
@ -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önnen nicht geschrieben werden.<br>
|
Ports in dieser Liste können nicht geschrieben werden.<br>
|
||||||
Standard: no, gültige Werte: 0 1 2 .. 7<br><br>
|
Standard: no, gültige Werte: 0 1 2 .. 7<br><br>
|
||||||
</li>
|
</li>
|
||||||
|
<li>OnStartup<br>
|
||||||
|
Durch Komma getrennte Output Ports und ihr gewünschter Status nach dem Start.<br>
|
||||||
|
Ohne dieses Attribut werden alle Ausgänge nach dem Start auf den letzten Status gesetzt.<br>
|
||||||
|
Standard: -, gü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>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user