mirror of
https://github.com/fhem/fhem-mirror.git
synced 2025-03-03 16:56:54 +00:00
- Dimmer function of X10 module changed to match FS20 dimmer functions.
git-svn-id: https://svn.fhem.de/fhem/trunk@632 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
parent
1eefac1a3f
commit
63a5cd353c
@ -572,8 +572,8 @@
|
|||||||
window and windowsensor (M.Fischer)
|
window and windowsensor (M.Fischer)
|
||||||
- feature: autocreate.pm (create undefined RF devices, logs and plots)
|
- feature: autocreate.pm (create undefined RF devices, logs and plots)
|
||||||
- feature: on-for-timer added for X10 modules (Boris)
|
- feature: on-for-timer added for X10 modules (Boris)
|
||||||
- bugfix: pgm3: Better check of availability of google-weather (MartinH)
|
- bugfix: pgm3: Better check of availability of google-weather (MartinH)
|
||||||
- feature: pgm3: DBLog added for everything except UserDefs
|
- feature: pgm3: DBLog added for everything except UserDefs
|
||||||
(Gerhard Pfeffer / MartinH)
|
(Gerhard Pfeffer / MartinH)
|
||||||
- feature: pgm2 style changes, SVG in background, optional compression
|
- feature: pgm2 style changes, SVG in background, optional compression
|
||||||
|
|
||||||
@ -586,3 +586,4 @@
|
|||||||
- bugfix: DST change: absolute at and relative sunrise fix
|
- bugfix: DST change: absolute at and relative sunrise fix
|
||||||
- feature: FHEMWEB javascript additions for SVG plots (click on lines/labels)
|
- feature: FHEMWEB javascript additions for SVG plots (click on lines/labels)
|
||||||
- feature: FHEMWEB smallscreen attribute
|
- feature: FHEMWEB smallscreen attribute
|
||||||
|
- feature: Dimmer function of X10 module changed to match FS20 dimmer functions.
|
@ -23,6 +23,25 @@
|
|||||||
#
|
#
|
||||||
################################################################
|
################################################################
|
||||||
|
|
||||||
|
|
||||||
|
#
|
||||||
|
# Internals introduced in this module:
|
||||||
|
# MODEL distinguish between different X10 device types
|
||||||
|
# BRIGHT brightness level of dimmer devices in units of microdims (0..210)
|
||||||
|
#
|
||||||
|
# Readings introduced in this module:
|
||||||
|
# state function and argument of last command
|
||||||
|
# onoff inherited from switch interface (0= on, 1= off)
|
||||||
|
# dimmer inherited from dimmer interface (0= dark, 100= bright)
|
||||||
|
#
|
||||||
|
# Setters introduced in this module:
|
||||||
|
# on inherited from switch interface
|
||||||
|
# off inherited from switch interface
|
||||||
|
# dimmer inherited from dimmer interface (0= dark, 100= bright)
|
||||||
|
# dimdown inherited from dimmer interface
|
||||||
|
# dimup inherited from dimmer interface
|
||||||
|
#
|
||||||
|
|
||||||
package main;
|
package main;
|
||||||
|
|
||||||
use strict;
|
use strict;
|
||||||
@ -73,6 +92,7 @@ my %functions_set = ( "on" => 0,
|
|||||||
"off" => 0,
|
"off" => 0,
|
||||||
"dimup" => 1,
|
"dimup" => 1,
|
||||||
"dimdown" => 1,
|
"dimdown" => 1,
|
||||||
|
"dimto" => 1,
|
||||||
"on-till" => 1,
|
"on-till" => 1,
|
||||||
"on-for-timer" => 1,
|
"on-for-timer" => 1,
|
||||||
);
|
);
|
||||||
@ -80,9 +100,9 @@ my %functions_set = ( "on" => 0,
|
|||||||
|
|
||||||
my %models = (
|
my %models = (
|
||||||
lm12 => 'dimmer',
|
lm12 => 'dimmer',
|
||||||
lm15 => 'simple',
|
lm15 => 'switch',
|
||||||
am12 => 'simple',
|
am12 => 'switch',
|
||||||
tm13 => 'simple',
|
tm13 => 'switch',
|
||||||
);
|
);
|
||||||
|
|
||||||
my @lampmodules = ('lm12','lm15'); # lamp modules
|
my @lampmodules = ('lm12','lm15'); # lamp modules
|
||||||
@ -117,6 +137,84 @@ X10_SetState($$$$)
|
|||||||
return undef;
|
return undef;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#############################
|
||||||
|
sub
|
||||||
|
X10_StateMachine($$$$)
|
||||||
|
{
|
||||||
|
my($hash, $time, $function, $argument)= @_;
|
||||||
|
|
||||||
|
# the following changes between (onoff,bright) states were
|
||||||
|
# experimentally observed for a Busch Timac Ferndimmer 2265
|
||||||
|
# bright and argument are measured in brightness steps
|
||||||
|
# from 0 (0%) to 210 (100%).
|
||||||
|
# for convenience, we connect the off state with a 210 bright state
|
||||||
|
#
|
||||||
|
# initial on off dimup d dimdown d
|
||||||
|
# -------------------------------------------------------------------------
|
||||||
|
# (on,x) -> (on,x) (off,210) (on,x+d) (on,x-d)
|
||||||
|
# (off,210) -> (on,210) (off,210) (on,210) (on,210-d)
|
||||||
|
|
||||||
|
my $onoff;
|
||||||
|
my $bright;
|
||||||
|
|
||||||
|
|
||||||
|
if(defined($hash->{ONOFF})) {
|
||||||
|
$onoff= $hash->{ONOFF};
|
||||||
|
} else {
|
||||||
|
$onoff= 0; }
|
||||||
|
if(defined($hash->{BRIGHT})) {
|
||||||
|
$bright= $hash->{BRIGHT};
|
||||||
|
} else {
|
||||||
|
$bright= 0; }
|
||||||
|
#Log 1, $hash->{NAME} . " initial state ($onoff,$bright)";
|
||||||
|
|
||||||
|
if($onoff) {
|
||||||
|
# initial state (on,bright)
|
||||||
|
if($function eq "on") {
|
||||||
|
} elsif($function eq "off") {
|
||||||
|
$onoff= 0; $bright= 210;
|
||||||
|
} elsif($function eq "dimup") {
|
||||||
|
$bright+= $argument;
|
||||||
|
if($bright> 210) { $bright= 210 };
|
||||||
|
} elsif($function eq "dimdown") {
|
||||||
|
$bright-= $argument;
|
||||||
|
if($bright< 0) { $bright= 0 };
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
# initial state (off,bright)
|
||||||
|
if($function eq "on") {
|
||||||
|
$onoff= 1; $bright= 210;
|
||||||
|
} elsif($function eq "off") {
|
||||||
|
$onoff= 0; $bright= 210;
|
||||||
|
} elsif($function eq "dimup") {
|
||||||
|
$onoff= 1; $bright= 210;
|
||||||
|
} elsif($function eq "dimdown") {
|
||||||
|
$onoff= 1;
|
||||||
|
$bright= 210-$argument;
|
||||||
|
if($bright< 0) { $bright= 0 };
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#Log 1, $hash->{NAME} . " final state ($onoff,$bright)";
|
||||||
|
|
||||||
|
$hash->{ONOFF}= $onoff;
|
||||||
|
$hash->{BRIGHT}= $bright;
|
||||||
|
$hash->{READINGS}{onoff}{TIME}= $time;
|
||||||
|
$hash->{READINGS}{onoff}{VAL}= $onoff;
|
||||||
|
$hash->{READINGS}{dimmer}{TIME}= $time;
|
||||||
|
$hash->{READINGS}{dimmer}{VAL}= int(1000.0*$bright/210.0+0.5)/10.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#############################
|
||||||
|
sub
|
||||||
|
X10_LevelToDims($)
|
||||||
|
{
|
||||||
|
# 22= 100%
|
||||||
|
my ($level)= @_;
|
||||||
|
my $dim= int(22*$level/100.0+0.5);
|
||||||
|
return $dim;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
#############################
|
#############################
|
||||||
sub
|
sub
|
||||||
X10_Do_On_Till($@)
|
X10_Do_On_Till($@)
|
||||||
@ -237,10 +335,29 @@ X10_Set($@)
|
|||||||
if($function =~ m/^dim/) {
|
if($function =~ m/^dim/) {
|
||||||
return "Cannot dim $name (model $model)" if($models{$model} ne "dimmer");
|
return "Cannot dim $name (model $model)" if($models{$model} ne "dimmer");
|
||||||
my $arg= $a[2];
|
my $arg= $a[2];
|
||||||
return "Wrong argument $arg, use 0..22" if($arg !~ m/^[0-9]{1,2}$/);
|
return "Wrong argument $arg, use 0..100" if($arg !~ m/^[0-9]{1,3}$/);
|
||||||
return "Wrong argument $arg, use 0..22" if($arg>22);
|
return "Wrong argument $arg, use 0..100" if($arg>100);
|
||||||
$dim= $arg;
|
if($function eq "dimto") {
|
||||||
}
|
# translate dimmer command to dimup/dimdown command
|
||||||
|
my $bright= 210;
|
||||||
|
if(defined($hash->{BRIGHT})) { $bright= $hash->{BRIGHT} };
|
||||||
|
$arg= $arg-100.0*$bright/210.0;
|
||||||
|
if($arg> 0) {
|
||||||
|
$function= "dimup";
|
||||||
|
$dim= X10_LevelToDims($arg);
|
||||||
|
} else {
|
||||||
|
$function= "dimdown";
|
||||||
|
$dim= X10_LevelToDims(-$arg);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$dim= X10_LevelToDims($arg);
|
||||||
|
}
|
||||||
|
|
||||||
|
# the meaning of $dim= 0, 1 is unclear
|
||||||
|
# if we encounter the need for dimming by such a small amount, we
|
||||||
|
# ignore it
|
||||||
|
if($dim< 2) { return "Dim amount too small" };
|
||||||
|
};
|
||||||
|
|
||||||
# send command to CM11
|
# send command to CM11
|
||||||
X11_Write($hash, $function, $dim) if(!IsDummy($a[0]));
|
X11_Write($hash, $function, $dim) if(!IsDummy($a[0]));
|
||||||
@ -255,6 +372,7 @@ X10_Set($@)
|
|||||||
$hash->{STATE} = $v;
|
$hash->{STATE} = $v;
|
||||||
$hash->{READINGS}{state}{TIME} = $tn;
|
$hash->{READINGS}{state}{TIME} = $tn;
|
||||||
$hash->{READINGS}{state}{VAL} = $v;
|
$hash->{READINGS}{state}{VAL} = $v;
|
||||||
|
X10_StateMachine($hash, $tn, $function, int(210.0*$dim/22.0+0.5));
|
||||||
|
|
||||||
return undef;
|
return undef;
|
||||||
}
|
}
|
||||||
@ -289,6 +407,13 @@ X10_Define($$)
|
|||||||
$hash->{HOUSE} = $housecode;
|
$hash->{HOUSE} = $housecode;
|
||||||
$hash->{UNIT} = $unitcode;
|
$hash->{UNIT} = $unitcode;
|
||||||
|
|
||||||
|
if($models{$model} eq "switch") {
|
||||||
|
$hash->{INTERFACES}= "switch"
|
||||||
|
}
|
||||||
|
elsif($models{$model} eq "dimmer") {
|
||||||
|
$hash->{INTERFACES}= "dimmer"
|
||||||
|
};
|
||||||
|
|
||||||
if(defined($modules{X10}{defptr}{$housecode}{$unitcode})) {
|
if(defined($modules{X10}{defptr}{$housecode}{$unitcode})) {
|
||||||
return "Error: duplicate X10 device $housecode $unitcode definition " .
|
return "Error: duplicate X10 device $housecode $unitcode definition " .
|
||||||
$hash->{NAME} . " (previous: " .
|
$hash->{NAME} . " (previous: " .
|
||||||
@ -378,16 +503,17 @@ X10_Parse($$)
|
|||||||
$value = "$value $dim" ;
|
$value = "$value $dim" ;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
my $unknown_unitcodes= '';
|
my $unknown_unitcodes= '';
|
||||||
|
my $tn= TimeNow();
|
||||||
foreach my $unitcode (@unitcodes) {
|
foreach my $unitcode (@unitcodes) {
|
||||||
my $h= $modules{X10}{defptr}{$housecode}{$unitcode};
|
my $h= $modules{X10}{defptr}{$housecode}{$unitcode};
|
||||||
if($h) {
|
if($h) {
|
||||||
my $name= $h->{NAME};
|
my $name= $h->{NAME};
|
||||||
$h->{CHANGED}[0] = $value;
|
$h->{CHANGED}[0] = $value;
|
||||||
$h->{STATE} = $value;
|
$h->{STATE} = $value;
|
||||||
$h->{READINGS}{state}{TIME} = TimeNow();
|
$h->{READINGS}{state}{TIME} = $tn;
|
||||||
$h->{READINGS}{state}{VAL} = $value;
|
$h->{READINGS}{state}{VAL} = $value;
|
||||||
|
X10_StateMachine($h, $tn, $function, $arg);
|
||||||
Log GetLogLevel($name,2), "X10 $name $value";
|
Log GetLogLevel($name,2), "X10 $name $value";
|
||||||
push(@list, $name);
|
push(@list, $name);
|
||||||
} else {
|
} else {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user