Files
modul-XiaomiSmartHome/71_XiaomiSmartHome_Device.pm
T0RST3N 8f98a8db63 Fix motion off, help now displayed
on motion sensor the turn off now only set when it is in motion
device sprecific help
replace CRLF with unix LF
2017-02-28 15:10:20 +01:00

141 lines
3.9 KiB
Perl

# 71_XiaomiSmartHome_Device.pm 2017-08-02 13:07:33Z torte $
package main;
use strict;
use warnings;
#####################################
sub XiaomiSmartHome_Device_Initialize($)
{
my ($hash) = @_;
$hash->{Match} = "^.+magnet|motion|sensor_ht";
$hash->{DefFn} = "XiaomiSmartHome_Device_Define";
#$hash->{SetFn} = "XiaomiSmartHome_Device_Set";
$hash->{UndefFn} = "XiaomiSmartHome_Device_Undef";
$hash->{ParseFn} = "XiaomiSmartHome_Device_Parse";
$hash->{AttrList} = "IODev follow-on-for-timer:1,0 follow-on-timer ".
"do_not_notify:1,0 ignore:1,0 dummy:1,0 showtime:1,0 valueFn:textField-long motionOffTimer:1,5,10 ".
$readingFnAttributes ;
}
#####################################
sub XiaomiSmartHome_Device_mot($$)
{
my ($hash, $mot) = @_;
InternalTimer(gettimeofday()+$mot, "XiaomiSmartHome_Device_on_timeout",$hash, 0);
# on-for-timer is now a on.
}
#####################################
sub XiaomiSmartHome_Device_on_timeout($){
my ($hash) = @_;
if ($hash->{STATE} eq 'motion') {
readingsSingleUpdate($hash, "state", "off", 1 );
}
}
#####################################
sub XiaomiSmartHome_Device_Parse($$) {
my ($io_hash, $msg) = @_;
my $decoded = decode_json($msg);
my $sid = $decoded->{'sid'};
my $model = $decoded->{'model'};
if (my $hash = $modules{XiaomiSmartHome_Device}{defptr}{$sid})
{
my $name = $hash->{NAME};
Log3 $name, 5, "$name: SID: " . $hash->{SID} . " " . $hash->{TYPE};
my @status = split('\"', $decoded->{'data'});
if ($status[1] eq 'status'){
Log3 $name, 3, "$name: Sensor: " . $hash->{MODEL} . " SID: " . $sid . " Status: " . $status[3];
readingsSingleUpdate($hash, "state", "$status[3]", 1 );
}
elsif($status[1] eq 'voltage'){
Log3 $name, 3, "$name: Sensor: " . $hash->{MODEL} . " SID: " . $sid . " Voltage: " . $status[3];
readingsSingleUpdate($hash, "voltage", "$status[3]", 1 );
}
elsif($status[1] eq 'temperature'){
Log3 $name, 3, "$name: Sensor: " . $hash->{MODEL} . " SID: " . $sid . " Temperature: " . $status[3];
readingsSingleUpdate($hash, "temperature", "$status[3]", 1 );
$status[3] =~ s/(^[-+]?\d+?(?=(?>(?:\d{2})+)(?!\d))|\G\d{2}(?=\d))/$1./g;
readingsSingleUpdate($hash, "temperatureP", "$status[3]", 1 );
}
elsif($status[1] eq 'humidity'){
Log3 $name, 3, "$name: Sensor: " . $hash->{MODEL} . " SID: " . $sid . " Humidity: " . $status[3];
readingsSingleUpdate($hash, "humidity", "$status[3]", 1 );
}
XiaomiSmartHome_Device_update($hash);
return $hash->{NAME};
}
else
{
return "UNDEFINED $sid XiaomiSmartHome_Device $model $sid";
}
}
#####################################
sub XiaomiSmartHome_Device_update($){
my ($hash) = @_;
my $model = $hash->{MODEL};
my $name = $hash->{NAME};
my $value_fn = AttrVal( $name, "valueFn", "" );
my $mot = AttrVal( $name, "motionOffTimer", "" );
if( $value_fn =~ m/^{.*}$/s ) {
my $LASTCMD = ReadingsVal($name,"lastCmd",undef);
my $value_fn = eval $value_fn;
Log3 $name, 3, $name .": valueFn: ". $@ if($@);
return undef if( !defined($value_fn) );
}
if( $model eq 'motion') {
XiaomiSmartHome_Device_mot($hash, $mot) if( $mot);
}
}
#####################################
sub XiaomiSmartHome_Device_Define($$) {
my ($hash, $def) = @_;
my ($name, $modul, $type, $sid) = split("[ \t]+", $def);
Log3 $name, 3, "$name: $modul $type $sid";
$hash->{TYPE} = $modul;
$hash->{MODEL} = $type;
$hash->{SID} = $sid;
$hash->{NAME} = $sid;
$hash->{STATE} = "initialized";
$modules{XiaomiSmartHome_Device}{defptr}{$sid} = $hash;
AssignIoPort($hash);
}
#####################################
sub XiaomiSmartHome_Device_Undef($)
{
my ($hash, $arg) = @_;
RemoveInternalTimer($hash);
delete($modules{XiaomiSmartHome_Device}{defptr}{$hash->{SID}});
return undef;
}
1;
#####################################
=pod
=begin html
<a name="XiaomiSmartHome_Device"></a>
<h3>XiaomiSmartHome_Device</h3>
=end html
=cut