mirror of
https://github.com/fhem/fhem-mirror.git
synced 2024-11-22 02:59:49 +00:00
add fht8v valve servo support (necessary modification to CUL.pm pending)
git-svn-id: https://svn.fhem.de/fhem/trunk@496 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
parent
8ddd07ab22
commit
81b23068b1
247
fhem/contrib/11_FHT8V.pm
Executable file
247
fhem/contrib/11_FHT8V.pm
Executable file
@ -0,0 +1,247 @@
|
||||
#############################################
|
||||
package main;
|
||||
|
||||
use strict;
|
||||
use warnings;
|
||||
|
||||
use vars qw(%fht8v_c2b); # would Peter like to access it from outside too? ;-)
|
||||
|
||||
# defptr{XMIT BTN}{DEVNAME} -> Ptr to global defs entry for this device
|
||||
my %defptr;
|
||||
|
||||
# my %follow;
|
||||
|
||||
sub
|
||||
FHT8V_Initialize($)
|
||||
{
|
||||
my ($hash) = @_;
|
||||
|
||||
# $hash->{Match} = "^([0-9]{2}:2[0-9A-F]{3} )*([0-9]{2}:2[0-9A-F]{3})\$";
|
||||
$hash->{SetFn} = "FHT8V_Set";
|
||||
$hash->{DefFn} = "FHT8V_Define";
|
||||
$hash->{UndefFn} = "FHT8V_Undef";
|
||||
$hash->{AttrList} = "IODev do_not_notify:1,0 dummy:1,0 showtime:1,0 loglevel:0,1,2,3,4,5,6";
|
||||
|
||||
}
|
||||
|
||||
|
||||
###################################
|
||||
sub FHT8V_valve_position(@)
|
||||
{
|
||||
my ($hash, @a) = @_;
|
||||
my $na = int(@a);
|
||||
my $v;
|
||||
|
||||
my $arg2_percent=0;
|
||||
if ( $na > 3 ) {
|
||||
$arg2_percent=$a[3] eq "%";
|
||||
}
|
||||
if ( $a[2] =~ m/^[0-9]{1,3}%$/ || $a[2] =~ m/^[0-9]{1,3}$/ && $arg2_percent ) {
|
||||
my $num;
|
||||
if ( $arg2_percent ) {
|
||||
$num=$a[2];
|
||||
} else {
|
||||
$num=substr($a[2],0,-1);
|
||||
}
|
||||
return "Out of range." if ( $num > 100 || $num < 0 );
|
||||
$num=255 if ( $num == 100 );
|
||||
$v=sprintf("%.0f",2.56*$num);
|
||||
} else {
|
||||
return "Argument hast invalid value \"$a[2]\"." if ( $a[2] !~ m/^[0-9]{1,3}$/ );
|
||||
return "Out of range. Range: 0..255." if ( $a[2] > 255 || $a[2] < 0 );
|
||||
$v = $a[2];
|
||||
}
|
||||
|
||||
Log GetLogLevel($a[2],2), "FHT8V $a[0]: v: $v";
|
||||
|
||||
IOWrite($hash, "", sprintf("T".$hash->{XMIT}."%02X26%02X",$hash->{NO}, $v)) # CUL hack
|
||||
if($hash->{IODev} && $hash->{IODev}->{TYPE} eq "CUL");
|
||||
|
||||
$hash->{STATE}=sprintf("%d%%", $v*0.390625);
|
||||
return undef;
|
||||
}
|
||||
|
||||
sub FHT8V_beep(@)
|
||||
{
|
||||
my ($hash, @a) = @_;
|
||||
|
||||
IOWrite($hash, "", sprintf("T".$hash->{XMIT}."%02X2E00",$hash->{NO})) # CUL hack
|
||||
if($hash->{IODev} && $hash->{IODev}->{TYPE} eq "CUL");
|
||||
|
||||
$hash->{STATE}="beep";
|
||||
return undef;
|
||||
}
|
||||
|
||||
sub FHT8V_open(@)
|
||||
{
|
||||
my ($hash, @a) = @_;
|
||||
|
||||
IOWrite($hash, "", sprintf("T".$hash->{XMIT}."%02X2100",$hash->{NO})) # CUL hack
|
||||
if($hash->{IODev} && $hash->{IODev}->{TYPE} eq "CUL");
|
||||
|
||||
$hash->{STATE}="open";
|
||||
return undef;
|
||||
}
|
||||
|
||||
sub FHT8V_off(@)
|
||||
{
|
||||
my ($hash, @a) = @_;
|
||||
|
||||
IOWrite($hash, "", sprintf("T".$hash->{XMIT}."%02X2000",$hash->{NO})) # CUL hack
|
||||
if($hash->{IODev} && $hash->{IODev}->{TYPE} eq "CUL");
|
||||
|
||||
$hash->{STATE}="off";
|
||||
return undef;
|
||||
}
|
||||
|
||||
sub FHT8V_close(@)
|
||||
{
|
||||
my ($hash, @a) = @_;
|
||||
|
||||
IOWrite($hash, "", sprintf("T".$hash->{XMIT}."%02X2200",$hash->{NO})) # CUL hack
|
||||
if($hash->{IODev} && $hash->{IODev}->{TYPE} eq "CUL");
|
||||
|
||||
$hash->{STATE}="close";
|
||||
return undef;
|
||||
}
|
||||
|
||||
sub
|
||||
FHT8V_assign(@)
|
||||
{
|
||||
my ($hash, @a) = @_;
|
||||
my $na = int(@a);
|
||||
my $v = 0;
|
||||
|
||||
if ( $na > 2 ) {
|
||||
return "Parameter \"".$a[3]."\" defining offset must be numerical." if ( $a[3] !~ /[0-9]+/ );
|
||||
$v=int($a[3]);
|
||||
}
|
||||
IOWrite($hash, "", sprintf("T".$hash->{XMIT}."%02X2F%02X",$hash->{NO},$v)) # CUL hack
|
||||
if($hash->{IODev} && $hash->{IODev}->{TYPE} eq "CUL");
|
||||
|
||||
# not sure if this is nessesary but I saw it in the documentation...
|
||||
IOWrite($hash, "", sprintf("T".$hash->{XMIT}."%02X2600",$hash->{NO},$v)) # CUL hack
|
||||
if($hash->{IODev} && $hash->{IODev}->{TYPE} eq "CUL");
|
||||
$hash->{STATE}="assigning";
|
||||
return undef;
|
||||
}
|
||||
|
||||
sub
|
||||
FHT8V_Set($@)
|
||||
{
|
||||
my ($hash, @a) = @_;
|
||||
my $na = int(@a);
|
||||
|
||||
return "Parameter missing" if ( $na < 2 );
|
||||
if ( $_[2] eq "valve" ) {
|
||||
return FHT8V_valve_position(@_);
|
||||
}
|
||||
if ( $_[2] eq "open" ) {
|
||||
return FHT8V_open(@_);
|
||||
}
|
||||
if ( $_[2] eq "close" ) {
|
||||
return FHT8V_close(@_);
|
||||
}
|
||||
if ( $_[2] eq "beep" ) {
|
||||
return FHT8V_beep(@_);
|
||||
}
|
||||
if ( $_[2] eq "assign" ) {
|
||||
return FHT8V_assign(@_);
|
||||
}
|
||||
if ( $_[2] eq "off" ) {
|
||||
return FHT8V_off(@_);
|
||||
}
|
||||
return "Could not set undefined parameter \"".$_[2]."\".";
|
||||
}
|
||||
|
||||
|
||||
#############################
|
||||
sub
|
||||
FHT8V_Define($$)
|
||||
{
|
||||
my ($hash, $def) = @_;
|
||||
my @a = split("[ \t][ \t]*", $def);
|
||||
my $na = int(@a);
|
||||
|
||||
my $u = "wrong syntax: define <name> FHT8V housecode " .
|
||||
"addr";
|
||||
|
||||
return $u if( $na < 3 );
|
||||
return "Define $a[0]: wrong housecode format: specify a 4 digit hex value ".
|
||||
"or an 8 digit quad value"
|
||||
if( ($a[2] !~ m/^[a-f0-9]{4}$/i) && ($a[2] !~ m/^[1-4]{8}$/i) );
|
||||
|
||||
if ( $na > 3 ) {
|
||||
return "Define $a[0]: wrong valve address format: specify a 2 digit hex value " .
|
||||
"or a 4 digit quad value"
|
||||
if( ($a[3] !~ m/^[a-f0-9]{2}$/i) && ($a[3] !~ m/^[1-4]{4}$/i) );
|
||||
}
|
||||
|
||||
my $housecode = $a[2];
|
||||
$housecode = four2hex($housecode,4) if (length($housecode) == 8);
|
||||
|
||||
my $valve_number = 1;
|
||||
if ( $na > 3 ) {
|
||||
my $valve_number = $a[3];
|
||||
$valve_number = four2hex($valve_number,2) if (length($valve_number) == 4);
|
||||
}
|
||||
|
||||
$hash->{XMIT} = lc($housecode);
|
||||
$hash->{NO} = lc($valve_number);
|
||||
|
||||
my $code = "$housecode $valve_number";
|
||||
my $ncode = 1;
|
||||
my $name = $a[0];
|
||||
|
||||
$hash->{CODE}{$ncode++} = $code;
|
||||
$defptr{$code}{$name} = $hash;
|
||||
|
||||
for(my $i = 4; $i < int(@a); $i += 2) {
|
||||
|
||||
return "No address specified for $a[$i]" if($i == int(@a)-1);
|
||||
|
||||
$a[$i] = lc($a[$i]);
|
||||
if($a[$i] eq "fg") {
|
||||
return "Bad fg address for $name, see the doc"
|
||||
if( ($a[$i+1] !~ m/^f[a-f0-9]$/) && ($a[$i+1] !~ m/^44[1-4][1-4]$/));
|
||||
} elsif($a[$i] eq "lm") {
|
||||
return "Bad lm address for $name, see the doc"
|
||||
if( ($a[$i+1] !~ m/^[a-f0-9]f$/) && ($a[$i+1] !~ m/^[1-4][1-4]44$/));
|
||||
} elsif($a[$i] eq "gm") {
|
||||
return "Bad gm address for $name, must be ff"
|
||||
if( ($a[$i+1] ne "ff") && ($a[$i+1] ne "4444"));
|
||||
} else {
|
||||
return $u;
|
||||
}
|
||||
|
||||
my $grpcode = $a[$i+1];
|
||||
if (length($grpcode) == 4) {
|
||||
$grpcode = four2hex($grpcode,2);
|
||||
}
|
||||
|
||||
$code = "$housecode $grpcode";
|
||||
$hash->{CODE}{$ncode++} = $code;
|
||||
$defptr{$code}{$name} = $hash;
|
||||
}
|
||||
$hash->{TYPE}="FHT8V";
|
||||
AssignIoPort($hash);
|
||||
}
|
||||
|
||||
#############################
|
||||
sub
|
||||
FHT8V_Undef($$)
|
||||
{
|
||||
my ($hash, $name) = @_;
|
||||
foreach my $c (keys %{ $hash->{CODE} } ) {
|
||||
$c = $hash->{CODE}{$c};
|
||||
|
||||
# As after a rename the $name my be different from the $defptr{$c}{$n}
|
||||
# we look for the hash.
|
||||
foreach my $dname (keys %{ $defptr{$c} }) {
|
||||
delete($defptr{$c}{$dname}) if($defptr{$c}{$dname} == $hash);
|
||||
}
|
||||
}
|
||||
return undef;
|
||||
}
|
||||
|
||||
1;
|
Loading…
Reference in New Issue
Block a user