| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945 |
- ##############################################
- # $Id: 10_FS20.pm 14888 2017-08-13 12:07:12Z rudolfkoenig $
- package main;
- use strict;
- use warnings;
- use SetExtensions;
- my %codes = (
- "00" => "off",
- "01" => "dim06%",
- "02" => "dim12%",
- "03" => "dim18%",
- "04" => "dim25%",
- "05" => "dim31%",
- "06" => "dim37%",
- "07" => "dim43%",
- "08" => "dim50%",
- "09" => "dim56%",
- "0a" => "dim62%",
- "0b" => "dim68%",
- "0c" => "dim75%",
- "0d" => "dim81%",
- "0e" => "dim87%",
- "0f" => "dim93%",
- "10" => "dim100%",
- "11" => "on", # Set to previous dim value (before switching it off)
- "12" => "toggle", # between off and previous dim val
- "13" => "dimup",
- "14" => "dimdown",
- "15" => "dimupdown",
- "16" => "timer",
- "17" => "sendstate",
- "18" => "off-for-timer",
- "19" => "on-for-timer",
- "1a" => "on-old-for-timer",
- "1b" => "reset",
- "1c" => "ramp-on-time", #time to reach the desired dim value on dimmers
- "1d" => "ramp-off-time", #time to reach the off state on dimmers
- "1e" => "on-old-for-timer-prev", # old val for timer, then go to prev. state
- "1f" => "on-100-for-timer-prev", # 100% for timer, then go to previous state
- );
- my %readonly = (
- "thermo-on" => 1,
- "thermo-off" => 1,
- );
- use vars qw(%fs20_c2b); # Peter would like to access it from outside
- my $fs20_simple ="off off-for-timer on on-for-timer reset timer toggle";
- my %models = (
- fs20fms => 'sender',
- fs20hgs => 'sender',
- fs20irl => 'sender',
- fs20kse => 'sender',
- fs20ls => 'sender',
- fs20pira => 'sender',
- fs20piri => 'sender',
- fs20piru => 'sender',
- fs20s16 => 'sender',
- fs20s20 => 'sender',
- fs20s4 => 'sender',
- fs20s4a => 'sender',
- fs20s4m => 'sender',
- fs20s4u => 'sender',
- fs20s4ub => 'sender',
- fs20s8 => 'sender',
- fs20s8m => 'sender',
- fs20sd => 'sender', # Sensor: Daemmerung
- fs20sn => 'sender', # Sensor: Naeherung
- fs20sr => 'sender', # Sensor: Regen
- fs20ss => 'sender', # Sensor: Sprache
- fs20str => 'sender', # Sensor: Thermostat+Regelung
- fs20tc1 => 'sender',
- fs20tc6 => 'sender', # TouchControl x 6
- fs20tfk => 'sender', # TuerFensterKontakt
- fs20tk => 'sender', # TuerKlingel
- fs20uts => 'sender', # Universal Thermostat Sender
- fs20ze => 'sender', # FunkTimer (ZeitEinheit?)
- fs20bf => 'sender', # BodenFeuchte
- fs20bs => 'sender', # Beschattung
- fs20si3 => 'sender', # 3 Kanal Schaltinterface
- dummySender => 'sender',
- fs20di => 'dimmer',
- fs20di10 => 'dimmer',
- fs20du => 'dimmer',
- dummyDimmer => 'dimmer',
- fs20as1 => 'simple',
- fs20as4 => 'simple',
- fs20ms2 => 'simple',
- fs20rgbsa => 'simple',
- fs20rst => 'simple',
- fs20rsu => 'simple',
- fs20sa => 'simple',
- fs20sig => 'simple',
- fs20sm4 => 'simple',
- fs20sm8 => 'simple',
- fs20st => 'simple',
- fs20st2 => 'simple',
- fs20su => 'simple',
- fs20sv => 'simple',
- fs20ue1 => 'simple',
- fs20usr => 'simple',
- fs20ws1 => 'simple',
- dummySimple => 'simple',
- );
- sub hex2four($);
- sub four2hex($$);
- sub
- FS20_Initialize($)
- {
- my ($hash) = @_;
- foreach my $k (keys %codes) {
- $fs20_c2b{$codes{$k}} = $k;
- }
- $hash->{Match} = "^81..(04|0c)..0101a001";
- $hash->{SetFn} = "FS20_Set";
- $hash->{DefFn} = "FS20_Define";
- $hash->{UndefFn} = "FS20_Undef";
- $hash->{ParseFn} = "FS20_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 ".
- "useSetExtensions:0,1 $readingFnAttributes " .
- "model:".join(",", sort keys %models);
- }
- sub
- FS20_Follow($$$$)
- {
- my ($name, $arg, $na, $val) = @_;
- ###########################################
- # Set the state of a device to off if on-for-timer is called
- if($modules{FS20}{ldata}{$name}) {
- CommandDelete(undef, $name . "_timer");
- delete $modules{FS20}{ldata}{$name};
- delete $defs{$name}->{TIMED_OnOff} if( $defs{$name} );
- }
- my $newState="";
- my $onTime = AttrVal($name, "follow-on-timer", undef);
- ####################################
- # following timers
- if(($arg eq "on" || $arg =~ m/dim/) && $na == 2 && $onTime) {
- $newState = "off";
- $val = $onTime;
- } elsif($arg =~ m/(on|off).*-for-timer/ && $na == 3 &&
- AttrVal($name, "follow-on-for-timer", undef)) {
- $newState = ($1 eq "on" ? "off" : "on");
- }
- if($newState) {
- my $to = sprintf("%02d:%02d:%02d", $val/3600, ($val%3600)/60, $val%60);
- $modules{FS20}{ldata}{$name} = $to;
- Log3 $name, 4, "Follow: +$to setstate $name $newState";
- CommandDefine(undef, $name."_timer at +$to ".
- "{readingsSingleUpdate(\$defs{'$name'},'state','$newState', 1);".
- "delete \$defs{'$name'}->{TIMED_OnOff}; undef}");
- if($defs{$name}) {
- $defs{$name}->{TIMED_OnOff} = {
- START=>time(),
- START_FMT=>TimeNow(),
- DURATION=>$val,
- CMD=>$arg
- }
- }
- }
- }
- ###################################
- sub
- FS20_Set($@)
- {
- my ($hash, @a) = @_;
- my $ret = undef;
- my $na = int(@a);
- return "no set value specified" if($na < 2);
- return "Readonly value $a[1]" if(defined($readonly{$a[1]}));
- if($na > 2 && $a[1] eq "dim") {
- $a[1] = ($a[2] eq "0" ? "off" : sprintf("dim%02d%%",$a[2]) );
- splice @a, 2, 1;
- $na = int(@a);
- }
- my $c = $fs20_c2b{$a[1]};
- my $name = $a[0];
- if(!defined($c)) {
- # Model specific set arguments
- my $list;
- if(defined($attr{$name}) && defined($attr{$name}{"model"})) {
- my $mt = $models{$attr{$name}{"model"}};
- $list = "" if($mt && $mt eq "sender");
- $list = $fs20_simple if($mt && $mt eq "simple");
- }
- $list = (join(" ", sort keys %fs20_c2b) . " dim:slider,0,6.25,100")
- if(!defined($list));
- return SetExtensions($hash, $list, @a)
- if(AttrVal($name, "useSetExtensions", 1));
- return "Unknown argument $a[1], choose one of $list";
- }
- SetExtensionsCancel($hash);
- return "Bad time spec" if($na == 3 && $a[2] !~ m/^\d*\.?\d+$/);
- my $v = join(" ", @a);
- Log3 $name, 3, "FS20 set $v";
- (undef, $v) = split(" ", $v, 2); # Not interested in the name...
- my $val;
- if($na == 3) { # Timed command.
- $c = sprintf("%02X", (hex($c) | 0x20)); # Set the extension bit
- ########################
- # Calculating the time.
- LOOP: for(my $i = 0; $i <= 12; $i++) {
- for(my $j = 0; $j <= 15; $j++) {
- $val = (2**$i)*$j*0.25;
- if($val >= $a[2]) {
- if($val != $a[2]) {
- Log3 $name, 2, "$name: changing timeout to $val from $a[2]";
- }
- $c .= sprintf("%x%x", $i, $j);
- last LOOP;
- }
- }
- }
- return "Specified timeout too large, max is 15360" if(length($c) == 2);
- }
- IOWrite($hash, "04", "010101" . $hash->{XMIT} . $hash->{BTN} . $c);
- ##########################
- # Look for all devices with the same code, and set state, timestamp
- my $code = "$hash->{XMIT} $hash->{BTN}";
- my $defptr = $modules{FS20}{defptr}{$code};
- foreach my $n (keys %{ $defptr }) {
- FS20_Follow($defptr->{$n}->{NAME}, $a[1], $na, $val);
- readingsSingleUpdate($defptr->{$n}, "state", $v, 1);
- }
- return $ret;
- }
- #############################
- sub
- FS20_Define($$)
- {
- my ($hash, $def) = @_;
- my @a = split("[ \t][ \t]*", $def);
- my $u = "wrong syntax: define <name> FS20 housecode " .
- "addr [fg addr] [lm addr] [gm FF]";
- return $u if(int(@a) < 4);
- 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) );
- return "Define $a[0]: wrong btn 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 $btncode = $a[3];
- $btncode = four2hex($btncode,2) if (length($btncode) == 4);
- $hash->{XMIT} = lc($housecode);
- $hash->{BTN} = lc($btncode);
- my $code = lc("$housecode $btncode");
- my $ncode = 1;
- my $name = $a[0];
- $hash->{CODE}{$ncode++} = $code;
- $modules{FS20}{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;
- $modules{FS20}{defptr}{$code}{$name} = $hash;
- }
- AssignIoPort($hash);
- }
- #############################
- sub
- FS20_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 %{ $modules{FS20}{defptr}{$c} }) {
- delete($modules{FS20}{defptr}{$c}{$dname})
- if($modules{FS20}{defptr}{$c}{$dname} == $hash);
- }
- }
- return undef;
- }
- sub
- FS20_Parse($$)
- {
- my ($hash, $msg) = @_;
- # Msg format:
- # 81 0b 04 f7 0101 a001 HHHH 01 00 11
- my $dev = substr($msg, 16, 4);
- my $btn = substr($msg, 20, 2);
- my $cde = substr($msg, 24, 2);
- my $dur = 0;
- my $cx = hex($cde);
- if($cx & 0x20) { # Timed command
- $dur = hex(substr($msg, 26, 2));
- my $i = ($dur & 0xf0) / 16;
- my $j = ($dur & 0xf);
- $dur = (2**$i)*$j*0.25;
- $cde = sprintf("%02x", $cx & ~0x20);
- }
- my $v = $codes{$cde};
- $v = "unknown_$cde" if(!defined($v));
- $v .= " $dur" if($dur);
- my $def = $modules{FS20}{defptr}{"$dev $btn"};
- if($def) {
- my @list;
- foreach my $n (keys %{ $def }) {
- my $lh = $def->{$n};
- $n = $lh->{NAME}; # It may be renamed
- return "" if(IsIgnored($n)); # Little strange.
- readingsSingleUpdate($lh, "state", $v, 1);
- Log3 $n, 4, "FS20 $n $v";
- if($modules{FS20}{ldata}{$n}) {
- CommandDelete(undef, $n . "_timer");
- delete $modules{FS20}{ldata}{$n};
- delete $lh->{TIMED_OnOff};
- }
- my $newState = "";
- if($v =~ m/(on|off).*-for-timer/ && $dur &&
- AttrVal($n, "follow-on-for-timer", undef)) {
- $newState = ($1 eq "on" ? "off" : "on");
- } elsif($v eq "on" && (my $d = AttrVal($n, "follow-on-timer", undef))) {
- $dur = $d;
- $newState = "off";
- }
- if($newState) {
- my $to = sprintf("%02d:%02d:%02d", $dur/3600, ($dur%3600)/60, $dur%60);
- Log3 $n, 4, "Follow: +$to setstate $n $newState";
- CommandDefine(undef, $n."_timer at +$to ".
- "{readingsSingleUpdate(\$defs{'$n'},'state','$newState', 1); ".
- "delete \$defs{'$n'}->{TIMED_OnOff}; undef}");
- $modules{FS20}{ldata}{$n} = $to;
- $lh->{TIMED_OnOff} = {
- START=>time(),
- START_FMT=>TimeNow(),
- DURATION=>$dur,
- CMD=>$v
- };
- }
- push(@list, $n);
- }
- return @list;
- } else {
- # Special FHZ initialization parameter. In Multi-FHZ-Mode we receive
- # it by the second FHZ
- return "" if($dev eq "0001" && $btn eq "00" && $cde eq "00");
- my $dev_four = hex2four($dev);
- my $btn_four = hex2four($btn);
- Log3 $hash, 3, "FS20 Unknown device $dev ($dev_four), " .
- "Button $btn ($btn_four) Code $cde ($v), please define it";
- return "UNDEFINED FS20_$dev$btn FS20 $dev $btn";
- }
- }
- #############################
- sub
- hex2four($)
- {
- my $v = shift;
- my $r = "";
- foreach my $x (split("", $v)) {
- $r .= sprintf("%d%d", (hex($x)/4)+1, (hex($x)%4)+1);
- }
- return $r;
- }
- #############################
- sub
- four2hex($$)
- {
- my ($v,$len) = @_;
- my $r = 0;
- foreach my $x (split("", $v)) {
- $r = $r*4+($x-1);
- }
- return sprintf("%0*x", $len,$r);
- }
- 1;
- =pod
- =item summary devices communicating via the ELV FS20 protocol
- =item summary_DE Anbindung von FS20 Geräten
- =begin html
- <a name="FS20"></a>
- <h3>FS20</h3>
- <ul>
- The FS20 protocol is used by a wide range of devices, which are either of
- the sender/sensor category or the receiver/actuator category. The radio
- (868.35 MHz) messages are either received through an <a href="#FHZ">FHZ</a>
- or an <a href="#CUL">CUL</a> device, so this must be defined first.
- <br><br>
- <a name="FS20define"></a>
- <b>Define</b>
- <ul>
- <code>define <name> FS20 <housecode> <button>
- [fg <fgaddr>] [lm <lmaddr>] [gm FF] </code>
- <br><br>
- The values of housecode, button, fg, lm, and gm can be either defined as
- hexadecimal value or as ELV-like "quad-decimal" value with digits 1-4. We
- will reference this ELV-like notation as ELV4 later in this document. You
- may even mix both hexadecimal and ELV4 notations, because FHEM can detect
- the used notation automatically by counting the digits.<br>
- <ul>
- <li><code><housecode></code> is a 4 digit hex or 8 digit ELV4 number,
- corresponding to the housecode address.</li>
- <li><code><button></code> is a 2 digit hex or 4 digit ELV4 number,
- corresponding to a button of the transmitter.</li>
- <li>The optional <code><fgaddr></code> specifies the function group.
- It is a 2 digit hex or 4 digit ELV address. The first digit of the hex
- address must be F or the first 2 digits of the ELV4 address must be
- 44.</li>
- <li>The optional <code><lmaddr></code> specifies the local
- master. It is a 2 digit hex or 4 digit ELV address. The last digit of the
- hex address must be F or the last 2 digits of the ELV4 address must be
- 44.</li>
- <li>The optional gm specifies the global master, the address must be FF if
- defined as hex value or 4444 if defined as ELV4 value.</li>
- </ul>
- <br>
- Examples:
- <ul>
- <code>define lamp FS20 7777 00 fg F1 gm F</code><br>
- <code>define roll1 FS20 7777 01</code><br>
- <code>define otherlamp FS20 24242424 1111 fg 4412 gm 4444</code><br>
- <code>define otherroll1 FS20 24242424 1114</code>
- </ul>
- </ul>
- <br>
- <a name="FS20set"></a>
- <b>Set </b>
- <ul>
- <code>set <name> <value> [<time>]</code>
- <br><br>
- where <code>value</code> is one of:<br>
- <ul><code>
- dim06% dim12% dim18% dim25% dim31% dim37% dim43% dim50%<br>
- dim56% dim62% dim68% dim75% dim81% dim87% dim93% dim100%<br>
- dimdown<br>
- dimup<br>
- dimupdown<br>
- off<br>
- off-for-timer<br>
- on # dimmer: set to value before switching it off<br>
- on-for-timer # see the note<br>
- on-old-for-timer # set to previous (before switching it on)<br>
- ramp-on-time # time to reach the desired dim value on dimmers<br>
- ramp-off-time # time to reach the off state on dimmers<br>
- reset<br>
- sendstate<br>
- timer<br>
- toggle # between off and previous dim val<br>
- </code></ul>
- The <a href="#setExtensions"> set extensions</a> are also supported.<br>
- <br>
- Examples:
- <ul>
- <code>set lamp on</code><br>
- <code>set lamp1,lamp2,lamp3 on</code><br>
- <code>set lamp1-lamp3 on</code><br>
- <code>set lamp on-for-timer 12</code><br>
- </ul>
- <br>
- Notes:
- <ul>
- <li>Use reset with care: the device forgets even the housecode.
- </li>
- <li>As the FS20 protocol needs about 0.22 seconds to transmit a
- sequence, a pause of 0.22 seconds is inserted after each command.
- </li>
- <li>The FS20ST switches on for dim*%, dimup. It does not respond to
- sendstate.</li>
- <li>If the timer is set (i.e. it is not 0) then on, dim*,
- and *-for-timer will take it into account (at least by the FS20ST).
- </li>
- <li>The <code>time</code> argument ranges from 0.25sec to 4 hours and 16
- minutes. As the time is encoded in one byte there are only 112
- distinct values, the resolution gets coarse with larger values. The
- program will report the used timeout if the specified one cannot be
- set exactly. The resolution is 0.25 sec from 0 to 4 sec, 0.5 sec
- from 4 to 8 sec, 1 sec from 8 to 16 sec and so on. If you need better
- precision for large values, use <a href="#at">at</a> which has a 1
- sec resolution.</li>
- </ul>
- </ul>
- <br>
- <b>Get</b> <ul>N/A</ul><br>
- <a name="FS20attr"></a>
- <b>Attributes</b>
- <ul>
- <a name="IODev"></a>
- <li>IODev<br>
- Set the IO or physical device which should be used for sending signals
- for this "logical" device. An example for the physical device is an FHZ
- or a CUL. Note: Upon startup FHEM assigns each logical device
- (FS20/HMS/KS300/etc) the last physical device which can receive data
- for this type of device. The attribute IODev needs to be used only if
- you attached more than one physical device capable of receiving signals
- for this logical device.</li><br>
- <a name="eventMap"></a>
- <li>eventMap<br>
- Replace event names and set arguments. The value of this attribute
- consists of a list of space separated values, each value is a colon
- separated pair. The first part specifies the "old" value, the second
- the new/desired value. If the first character is slash(/) or komma(,)
- then split not by space but by this character, enabling to embed spaces.
- Examples:<ul><code>
- attr store eventMap on:open off:closed<br>
- attr store eventMap /on-for-timer 10:open/off:closed/<br>
- set store open
- </code></ul>
- </li><br>
- <a name="attrdummy"></a>
- <li>dummy<br>
- Set the device attribute dummy to define devices which should not
- output any radio signals. Associated notifys will be executed if
- the signal is received. Used e.g. to react to a code from a sender, but
- it will not emit radio signal if triggered in the web frontend.
- </li><br>
- <a name="follow-on-for-timer"></a>
- <li>follow-on-for-timer<br>
- schedule a "setstate off;trigger off" for the time specified as argument to
- the on-for-timer command. Or the same with on, if the command is
- off-for-timer.
- </li><br>
- <a name="follow-on-timer"></a>
- <li>follow-on-timer<br>
- Like with follow-on-for-timer schedule a "setstate off;trigger off", but
- this time for the time specified as argument in seconds to this attribute.
- This is used to follow the pre-programmed timer, which was set previously
- with the timer command or manually by pressing the button on the device,
- see your manual for details. Works for on and dim commands.
- </li><br>
- <a name="model"></a>
- <li>model<br>
- The model attribute denotes the model type of the device.
- The attributes will (currently) not be used by the fhem.pl directly.
- It can be used by e.g. external programs or web interfaces to
- distinguish classes of devices and send the appropriate commands
- (e.g. "on" or "off" to a fs20st, "dim..%" to fs20du etc.).
- The spelling of the model names are as quoted on the printed
- documentation which comes which each device. This name is used
- without blanks in all lower-case letters. Valid characters should be
- <code>a-z 0-9</code> and <code>-</code> (dash),
- other characters should be ommited. Here is a list of "official"
- devices:<br><br>
- <b>Sender/Sensor</b>: fs20fms fs20hgs fs20irl fs20kse fs20ls
- fs20pira fs20piri fs20piru fs20s16 fs20s20 fs20s4 fs20s4a fs20s4m
- fs20s4u fs20s4ub fs20s8 fs20s8m fs20sd fs20sn fs20sr fs20ss
- fs20str fs20tc1 fs20tc6 fs20tfk fs20tk fs20uts fs20ze fs20bf fs20si3<br><br>
- <b>Dimmer</b>: fs20di fs20di10 fs20du<br><br>
- <b>Receiver/Actor</b>: fs20as1 fs20as4 fs20ms2 fs20rgbsa fs20rst
- fs20rsu fs20sa fs20sig fs20sm4 fs20sm8 fs20st fs20su fs20sv fs20ue1
- fs20usr fs20ws1
- </li><br>
- <a name="ignore"></a>
- <li>ignore<br>
- Ignore this device, e.g. if it belongs to your neighbour. The device
- won't trigger any FileLogs/notifys, issued commands will silently
- ignored (no RF signal will be sent out, just like for the <a
- href="#attrdummy">dummy</a> attribute). The device won't appear in the
- list command (only if it is explicitely asked for it), nor will it
- appear in commands which use some wildcard/attribute as name specifiers
- (see <a href="#devspec">devspec</a>). You still get them with the
- "ignored=1" special devspec.
- </li><br>
- <li><a href="#do_not_notify">do_not_notify</a></li>
- <li><a href="#showtime">showtime</a></li>
- <li><a href="#readingFnAttributes">readingFnAttributes</a></li>
- <li>useSetExtensions<br>
- Setting it to 0 you can disable using the Setextensions. Deffault is 1.
- </li><br>
- </ul>
- <br>
- <a name="FS20events"></a>
- <b>Generated events:</b>
- <ul>
- From an FS20 device you can receive one of the following events.
- <li>on</li>
- <li>off</li>
- <li>toggle</li>
- <li>dimdown</li>
- <li>dimup</li>
- <li>dimupdown</li>
- <li>on-for-timer</li>
- Which event is sent is device dependent and can sometimes configured on
- the device.
- </ul>
- </ul>
- =end html
- =begin html_DE
- <a name="FS20"></a>
- <h3>FS20</h3>
- <ul>
- Das FS20 Protokoll wird von einem großen Spektrum an Geräten
- verwendet. Diese stammen entweder aus der Kategorie Sensor/Sender oder
- Aktor/Empfänger. Die Funknachrichten (868.35 MHz) können mit einem
- <a href="#FHZ">FHZ</a> oder einem <a href="#CUL">CUL</a> empfangen werden.
- Dieses muss daher zuerst definiert werden.
- <br><br>
- <a name="FS20define"></a>
- <b>Define</b>
- <ul>
- <code>define <name> FS20 <housecode> <button>
- [fg <fgaddr>] [lm <lmaddr>] [gm FF] </code>
- <br><br>
- Die Werte housecode, button, fg, lm, und gm können entweder hexadezimal
- oder in der ELV-typischen quaternären Notation (Zahlen von 1-4)
- eingegeben werden.
- Hier und auch in späteren Beispielen wird als Referenz die ELV4
- Notation verwendet. Die Notationen können auch gemischt werden da FHEM
- die verwendete Notation durch zählen der Zeichen erkennt.<br>
- <ul>
- <li><code><housecode></code> ist eine 4 stellige Hex oder 8 stellige
- ELV4 Zahl, entsprechend der Hauscode Adresse.</li>
- <li><code><button></code> ist eine 2 stellige Hex oder 4 stellige ELV4
- Zahl, entsprechend dem Button des Transmitters.</li>
- <li>Optional definiert <code><fgaddr></code> die Funktionsgruppe mit
- einer 2 stelligen Hex oder 4 stelligen ELV4 Adresse. Bei Hex muss die
- erste Stelle F, bei ELV4 die ersten zwei Stellen 44 sein.</li>
- <li>Optional definiert <code><lmaddr></code> definiert einen local
- master mit einer 2 stelligen Hex oder 4 stelligen ELV4 Adresse. Bei Hex
- muss die letzte Stelle F, bei ELV4 die letzten zwei Stellen 44 sein.</li>
- <li>Optional definiert gm den global master. Die Adresse muss FF bei HEX
- und 4444 bei ELV4 Notation sein.</li>
- </ul>
- <br>
- Beispiele:
- <ul>
- <code>define lamp FS20 7777 00 fg F1 gm F</code><br>
- <code>define roll1 FS20 7777 01</code><br>
- <code>define otherlamp FS20 24242424 1111 fg 4412 gm 4444</code><br>
- <code>define otherroll1 FS20 24242424 1114</code>
- </ul>
- </ul>
- <br>
- <a name="FS20set"></a>
- <b>Set </b>
- <ul>
- <code>set <name> <value> [<time>]</code>
- <br><br>
- Wobei <code>value</code> einer der folgenden Werte sein kann:<br>
- <ul><code>
- dim06% dim12% dim18% dim25% dim31% dim37% dim43% dim50%<br>
- dim56% dim62% dim68% dim75% dim81% dim87% dim93% dim100%<br>
- dimdown<br>
- dimup<br>
- dimupdown<br>
- off<br>
- off-for-timer<br>
- on # dimmer: Setze auf diesen Wert vor dem Ausschalten<br>
- on-for-timer # Siehe Hinweise<br>
- on-old-for-timer # Setze zum vorherigen (vor dem Einschalten)<br>
- ramp-on-time # Zeit bis zum erreichen des gewünschten Dim-Wertes<br>
- ramp-off-time # Zeit bis zum Ausschalten bei Dimmern<br>
- reset<br>
- sendstate<br>
- timer<br>
- toggle # zwischen aus und dem letztern Dim-Wert<br>
- </code></ul><br>
- Die<a href="#setExtensions"> set extensions</a> sind ebenfalls
- unterstützt.<br>
- <br>
- Beispiele:
- <ul>
- <code>set lamp on</code><br>
- <code>set lamp1,lamp2,lamp3 on</code><br>
- <code>set lamp1-lamp3 on</code><br>
- <code>set lamp on-for-timer 12</code><br>
- </ul>
- <br>
- Hinweise:
- <ul>
- <li>reset nur mit Vorsicht verwenden: Auch der Hauscode wird
- gelöscht. </li>
- <li>Da das FS20 Protokoll 0.22Sek für eine Funksequenz benötigt
- wird nach jeder Ausführung eine Pause von 0.22Sek eingefügt.
- </li>
- <li>Das FS20ST schaltet für dim*% und dimup ein. Es reagiert nicht
- auf sendstate.</li>
- <li>Wenn ein Timer gesetzt ist (und dieser nicht 0 ist) werden on, dim*,
- und *-for-timer berücksichtigt (zumindest beim FS20ST). </li>
- <li>Das <code>time</code> Argument geht von 0.25Sek bis 4Std und 16Min.
- Da <code>time</code> nur mit einem Byte dargestellt wird ergeben sich
- hieraus nur 112 eindeutige Zeit-Werte die mit ansteigender
- größe immer gröber aufgelöst werden. Das Programm
- zeigt die exakte Restzeit an wenn die gewählte Auflösung
- nicht eindeutig war. Die Auflösung ist is 0.25Sek von 0 bis 4
- Sekunden, 0.5Sek von 4 bis 8Sek, 1Sek von 8 bis 16 Sek und so weiter.
- Wenn eine höhere Genauigkeit bei großen Werten gebraucht
- wird, dann hilft <a href="#at">at</a> mit einer Auflösung von
- 1Sek.</li>
- </ul>
- </ul>
- <br>
- <b>Get</b> <ul>N/A</ul><br>
- <a name="FS20attr"></a>
- <b>Attribute</b>
- <ul>
- <a name="IODev"></a>
- <li>IODev<br>
- Setzt das IO oder das physische Device welches zum Senden der Signale an
- dieses logische Device verwendet werden soll (Beispielsweise FHZ oder
- CUL). Hinweis: Beim Start weist FHEM jedem logischen Device das letzte
- physische Device zu, das Daten von diesem Typ empfangen kann. Das
- Attribut IODev muss nur gesetzt werden wenn mehr als ein physisches
- Device fähig ist Signale von diesem logischen Device zu empfangen.
- </li><br>
- <a name="eventMap"></a>
- <li>eventMap<br>
- Ersetze Event Namen und setze Argumente. Der Wert dieses Attributes
- besteht aus einer Liste von durch Leerzeichen getrennte Werten. Jeder
- Wert ist ein durch Doppelpunkt getrenntes Paar. Der erste Teil stellt den
- "alten" Wert, der zweite Teil den "neuen" Wert dar. Wenn der erste Wert
- ein Slash (/) oder ein Komma (,) ist, dann wird nicht durch Leerzeichen
- sondern durch das vorgestellte Zeichen getrennt.
- Beispiele:
- <ul><code>
- attr store eventMap on:open off:closed<br>
- attr store eventMap /on-for-timer 10:open/off:closed/<br>
- set store open
- </code></ul>
- </li><br>
- <a name="attrdummy"></a>
- <li>dummy<br>
- Setzt das Attribut dummy um Devices zu definieren, die keine Funksignale
- absetzen. Zugehörige notifys werden ausgeführt wenn das Signal
- empfangen wird. Wird beispielsweise genutzt um auf Code eines Sender zu
- reagieren, dennoch wird es auch dann kein Signal senden wenn es im Web
- Frontend getriggert wird.
- </li><br>
- <a name="follow-on-for-timer"></a>
- <li>follow-on-for-timer<br>
- Plant ein "setstate off;trigger off" für die angegebene Zeit als
- Argument zum on-for-timer Command. Oder das gleiche mit "on" wenn der
- Befehl "follow-off-for-timer" war.
- </li><br>
- <a name="follow-on-timer"></a>
- <li>follow-on-timer<br>
- Wie follow-on-for-timer plant es ein "setstate off;trigger off", aber
- diesmal als Argument in Sekunden zum Attribut. Wird verwendet um dem
- vorprogrammierten Timer zu folgen welcher vorher durch den timer-Befehl,
- oder manuell durch Drücken des Buttons gesetzt wurde. Im Handbuch
- finden sich noch mehr Informationen. Beachtet bei on und dim Befehlen.
- </li><br>
- <a name="model"></a>
- <li>model<br>
- Das "model" Attribut bezeichnet den Modelltyp des Gerätes. Dieses
- Attribut wird (derzeit) nicht direkt durch fhem.pl genutzt. Es kann
- beispielsweise von externen Programmen oder Webinterfaces genutzt werden
- um Geräteklassen zu unterscheiden und dazu passende Befehle zu senden
- (z.B. "on" oder "off" an ein fs20st, "dim..%" an ein fs20du etc.). Die
- Schreibweise des Modellnamens ist wie die in Anführungszeichen in
- der Anleitung gedruckte Bezeichnung die jedem Gerät beiliegt.
- Dieser Name wird ohne Leerzeichen ausschließlich in Kleinbuchstaben
- verwendet. Gültige Zeichen sind <code>a-z 0-9</code> und
- <code>-</code>, andere Zeichen sind zu vermeiden. Hier ist eine Liste der
- "offiziellen" Devices:<br><br>
- <b>Sender/Sensor</b>: fs20fms fs20hgs fs20irl fs20kse fs20ls
- fs20pira fs20piri fs20piru fs20s16 fs20s20 fs20s4 fs20s4a fs20s4m
- fs20s4u fs20s4ub fs20s8 fs20s8m fs20sd fs20sn fs20sr fs20ss
- fs20str fs20tc1 fs20tc6 fs20tfk fs20tk fs20uts fs20ze fs20bf fs20si3<br><br>
- <b>Dimmer</b>: fs20di fs20di10 fs20du<br><br>
- <b>Empfänger/Aktor</b>: fs20as1 fs20as4 fs20ms2 fs20rgbsa fs20rst
- fs20rsu fs20sa fs20sig fs20sm4 fs20sm8 fs20st fs20su fs20sv fs20ue1
- fs20usr fs20ws1
- </li><br>
- <a name="ignore"></a>
- <li>ignore<br>
- Ignoriere dieses Gerät, beispielsweise wenn es dem Nachbar
- gehört. Das Gerät wird keine FileLogs/notifys triggern,
- empfangene Befehle werden stillschweigend ignoriert (es wird kein
- Funksignal gesendet, wie auch beim <a href="#attrdummy">dummy</a>
- Attribut). Das Gerät wird weder in der Device-List angezeigt (es sei
- denn, es wird explizit abgefragt), noch wird es in Befehlen mit
- "Wildcard"-Namenspezifikation (siehe <a href="#devspec">devspec</a>)
- erscheinen. Es kann mit dem "ignored=1" devspec dennoch erreicht werden.
- </li><br>
- <li><a href="#do_not_notify">do_not_notify</a></li>
- <li><a href="#showtime">showtime</a></li>
- <li><a href="#readingFnAttributes">readingFnAttributes</a></li>
- <li>useSetExtensions<br>
- Falls es auf 0 gesetzt wird, werden die SetExtensions Befehle nicht
- angeboten. Die Voreinstellung ist 1.
- </li><br>
- </ul>
- <br>
- <a name="FS20events"></a>
- <b>Erzeugte Events:</b>
- <ul>
- Von einem FS20 Gerät können folgende Events empfangen werden:
- <li>on</li>
- <li>off</li>
- <li>toggle</li>
- <li>dimdown</li>
- <li>dimup</li>
- <li>dimupdown</li>
- <li>on-for-timer</li>
- Welches Event gesendet wird ist Geräteabhängig und kann manchmal
- auf dem Device konfiguriert werden.
- </ul>
- </ul>
- =end html_DE
- =cut
|