package main; use strict; use warnings; use SetExtensions; sub AliRF_Parse($$); sub AliRF_Initialize($) { my ($hash) = @_; $hash->{Match} = "^\\S+\\s+5"; #$hash->{SetFn} = "AliRF_Set"; #$hash->{GetFn} = "AliRF_Get"; $hash->{DefFn} = "AliRF_Define"; $hash->{UndefFn} = "AliRF_Undef"; $hash->{FingerprintFn} = "AliRF_Fingerprint"; $hash->{ParseFn} = "AliRF_Parse"; $hash->{AttrFn} = "AliRF_Attr"; $hash->{AttrList} = "IODev". " $readingFnAttributes"; } sub AliRF_Define($$) { my ($hash, $def) = @_; my @a = split("[ \t][ \t]*", $def); if(@a != 3 ) { my $msg = "wrong syntax: define AliRF "; Log3 undef, 2, $msg; return $msg; } $a[2] =~ m/^([\da-f]{6})$/i; return "$a[2] is not a valid AliRF address" if( !defined($1) ); my $name = $a[0]; my $addr = $a[2]; #return "$addr is not a 1 byte hex value" if( $addr !~ /^[\da-f]{2}$/i ); #return "$addr is not an allowed address" if( $addr eq "00" ); return "AliRF device $addr already used for $modules{AliRF}{defptr}{$addr}->{NAME}." if( $modules{AliRF}{defptr}{$addr} && $modules{AliRF}{defptr}{$addr}->{NAME} ne $name ); $hash->{addr} = $addr; $modules{AliRF}{defptr}{$addr} = $hash; AssignIoPort($hash); if(defined($hash->{IODev}->{NAME})) { Log3 $name, 3, "$name: I/O device is " . $hash->{IODev}->{NAME}; } else { Log3 $name, 1, "$name: no I/O device"; } #$attr{$name}{devStateIcon} = 'on:on:toggle off:off:toggle *.:light_question:off' if( !defined( $attr{$name}{devStateIcon} ) ); #$attr{$name}{webCmd} = 'on:off:toggle:statusRequest' if( !defined( $attr{$name}{webCmd} ) ); #CommandAttr( undef, "$name userReadings consumptionTotal:consumption monotonic {ReadingsVal(\$name,'consumption',0)}" ) if( !defined( $attr{$name}{userReadings} ) ); return undef; } ##################################### sub AliRF_Undef($$) { my ($hash, $arg) = @_; my $name = $hash->{NAME}; my $addr = $hash->{addr}; delete( $modules{AliRF}{defptr}{$addr} ); return undef; } ##################################### sub AliRF_Get($@) { my ($hash, $name, $cmd, @args) = @_; return "\"get $name\" needs at least one parameter" if(@_ < 3); my $list = ""; return "Unknown argument $cmd, choose one of $list"; } sub AliRF_Fingerprint($$) { my ($name, $msg) = @_; return ( "", $msg ); } sub AliRF_Parse($$) { my ($hash, $msg) = @_; my $name = $hash->{NAME}; #return undef if( $msg !~ m/^[\dA-F]{12,}$/ ); my( @bytes, $addr,$motion ); if( $msg =~ m/^OK/ ) { @bytes = split( ' ', substr($msg, 6) ); $addr = sprintf( "%06X", $bytes[0] ); $motion = $bytes[1] & 0x01; } else { DoTrigger($name, "UNKNOWNCODE $msg"); Log3 $name, 3, "$name: Unknown code $msg, help me!"; return undef; } my $raddr = $addr; my $rhash = $modules{AliRF}{defptr}{$raddr}; my $rname = $rhash?$rhash->{NAME}:$raddr; if( !$modules{AliRF}{defptr}{$raddr} ) { Log3 $name, 3, "AliRF Unknown device $rname, please define it"; #return undef if( $raddr eq "00" ); return "UNDEFINED AliRF_$rname AliRF $raddr"; } #CommandAttr( undef, "$rname userReadings consumptionTotal:consumption monotonic {ReadingsVal($rname,'consumption',0)}" ) if( !defined( $attr{$rname}{userReadings} ) ); my @list; push(@list, $rname); $rhash->{AliRF_lastRcv} = TimeNow(); readingsBeginUpdate($rhash); readingsBulkUpdate($rhash, "motion", $motion); readingsEndUpdate($rhash,1); return @list; } sub AliRF_Attr(@) { my ($cmd, $name, $attrName, $attrVal) = @_; return undef; } 1; =pod =begin html

AliRF

=end html =cut