############################################# # $Id$ package main; use strict; use warnings; sub FHT8V_Initialize($) { my ($hash) = @_; $hash->{DefFn} = "FHT8V_Define"; $hash->{SetFn} = "FHT8V_Set"; $hash->{GetFn} = "FHT8V_Get"; $hash->{AttrList} = "IODev dummy:1,0 ignore:1,0 ". $readingFnAttributes; } ############################# sub FHT8V_Define($$) { my ($hash, $def) = @_; my @a = split("[ \t][ \t]*", $def); my $n = $a[0]; return "wrong syntax: define FHT8V housecode [IODev|FHTID]" if(@a < 3); return "wrong housecode format: specify a 4 digit hex value " if(($a[2] !~ m/^[a-f0-9]{4}$/i)); my $fhtid; if(@a > 3 && $defs{$a[3]}) { $hash->{IODev} = $defs{$a[3]}; } else { AssignIoPort($hash); $fhtid = $a[3] if($a[3]); } return "$n: No IODev found" if(!$hash->{IODev}); $fhtid = $hash->{IODev}->{FHTID} if(!$fhtid); return "$n: Wrong IODev $hash->{IODev}{NAME}, has no FHTID" if(!$fhtid); ##################### # Check if the address corresponds to the CUL my $ioaddr = hex($fhtid); my $myaddr = hex($a[2]); my ($io1, $io0) = (int($ioaddr/255), $ioaddr % 256); my ($my1, $my0) = (int($myaddr/255), $myaddr % 256); if($my1 < $io1 || $my1 > $io1+7 || $io0 != $my0) { my $vals = ""; for(my $m = 0; $m <= 7; $m++) { $vals .= sprintf(" %2x%2x", $io1+$m, $io0); } return sprintf("Wrong housecode: must be one of$vals"); } $hash->{addr} = uc($a[2]); $hash->{idx} = sprintf("%02X", $my1-$io1); $hash->{STATE} = "defined"; return ""; } sub FHT8V_Set($@) { my ($hash, @a) = @_; my $n = $hash->{NAME}; return "Need a parameter for set" if(@a < 2); my $arg = $a[1]; if($arg eq "valve" ) { return "Set valve needs a numeric parameter between 0 and 100" if(@a != 3 || $a[2] !~ m/^\d+$/ || $a[2] < 0 || $a[2] > 100); Log3 $n, 3, "FHT8V set $n $arg $a[2]"; $hash->{STATE} = sprintf("%d %%", $a[2]); readingsSingleUpdate($hash, "valve", $a[2], 1); IOWrite($hash, "", sprintf("T%s0026%02X", $hash->{addr}, $a[2]*2.55)); } elsif ($arg eq "pair" ) { Log3 $n, 3, "FHT8V set $n $arg"; IOWrite($hash, "", sprintf("T%s002f00", $hash->{addr})); } elsif ($arg eq "decalc" ) { Log3 $n, 3, "FHT8V set $n $arg"; $hash->{STATE} = "lime-protection"; IOWrite($hash, "", sprintf("T%s000A00", $hash->{addr})); } else { return "Unknown argument $a[1], choose one of valve pair decalc" } return ""; } sub FHT8V_Get($@) { my ($hash, @a) = @_; my $n = $hash->{NAME}; return "Need a parameter for get" if(@a < 2); my $arg = $a[1]; if($arg eq "valve" ) { my $io = $hash->{IODev}; my $msg = CallFn($io->{NAME}, "GetFn", $io, (" ", "raw", "T10")); my $idx = $hash->{idx}; return int(hex($1)/2.55) if($msg =~ m/$idx:26(..)/); return "N/A"; } return "Unknown argument $a[1], choose one of valve" } 1; =pod =item summary module for the FHT8v controlled directly by a culfw device =item summary_DE Anbindung von FHT8v Ventilen über ein culfw Gerät =begin html

FHT8V

=end html =begin html_DE

FHT8V

=end html_DE =cut