mirror of
https://github.com/fhem/fhem-mirror.git
synced 2025-05-04 22:19:38 +00:00
added support for set-extentions
git-svn-id: https://svn.fhem.de/fhem/trunk/fhem@5649 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
parent
87903df8d4
commit
66ef921f75
256
FHEM/10_IT.pm
256
FHEM/10_IT.pm
@ -6,9 +6,12 @@
|
|||||||
# Published under GNU GPL License
|
# Published under GNU GPL License
|
||||||
######################################################package main;
|
######################################################package main;
|
||||||
|
|
||||||
|
# $Id$
|
||||||
|
|
||||||
use strict;
|
use strict;
|
||||||
use warnings;
|
use warnings;
|
||||||
|
|
||||||
|
use SetExtensions;
|
||||||
|
|
||||||
my %codes = (
|
my %codes = (
|
||||||
"XMIToff" => "off",
|
"XMIToff" => "off",
|
||||||
@ -90,64 +93,59 @@ IT_Do_On_Till($@)
|
|||||||
sub
|
sub
|
||||||
IT_Set($@)
|
IT_Set($@)
|
||||||
{
|
{
|
||||||
my ($hash, @a) = @_;
|
my ($hash, $name, @a) = @_;
|
||||||
|
|
||||||
my $ret = undef;
|
my $ret = undef;
|
||||||
my $na = int(@a);
|
my $na = int(@a);
|
||||||
my $message;
|
my $message;
|
||||||
|
|
||||||
return "no set value specified" if($na < 2 || $na > 3);
|
return "no set value specified" if($na < 1);
|
||||||
|
|
||||||
my $c = $it_c2b{$a[1]};
|
my $list = "";
|
||||||
if(!defined($c)) {
|
$list .= "off:noArg on:noArg " if( AttrVal($name, "model", "") ne "itremote" );
|
||||||
|
$list .= "dimUp:noArg dimDown:noArg on-till" if( AttrVal($name, "model", "") eq "itdimmer" );
|
||||||
|
|
||||||
# Model specific set arguments
|
return SetExtensions($hash, $list, $name, @a) if( $a[0] eq "?" );
|
||||||
if(defined($attr{$a[0]}) && defined($attr{$a[0]}{"model"})) {
|
return SetExtensions($hash, $list, $name, @a) if( !grep( $_ =~ /^$a[0]($|:)/, split( ' ', $list ) ) );
|
||||||
my $mt = $models{$attr{$a[0]}{"model"}};
|
|
||||||
return "Unknown argument $a[1], choose one of "
|
|
||||||
if($mt && $mt eq "sender");
|
|
||||||
return "Unknown argument $a[1], choose one of $it_simple"
|
|
||||||
if($mt && $mt eq "simple");
|
|
||||||
}
|
|
||||||
return "Unknown argument $a[1], choose one of " .
|
|
||||||
join(" ", sort keys %it_c2b);
|
|
||||||
}
|
|
||||||
|
|
||||||
return IT_Do_On_Till($hash, @a) if($a[1] eq "on-till");
|
my $c = $it_c2b{$a[0]};
|
||||||
return "Bad time spec" if($na == 3 && $a[2] !~ m/^\d*\.?\d+$/);
|
|
||||||
|
return IT_Do_On_Till($hash, @a) if($a[0] eq "on-till");
|
||||||
|
return "Bad time spec" if($na == 2 && $a[1] !~ m/^\d*\.?\d+$/);
|
||||||
|
|
||||||
my $io = $hash->{IODev};
|
my $io = $hash->{IODev};
|
||||||
|
|
||||||
## Do we need to change RFMode to SlowRF??
|
## Do we need to change RFMode to SlowRF??
|
||||||
if(defined($attr{$a[0]}) && defined($attr{$a[0]}{"switch_rfmode"})) {
|
if(defined($attr{$name}) && defined($attr{$name}{"switch_rfmode"})) {
|
||||||
if ($attr{$a[0]}{"switch_rfmode"} eq "1") { # do we need to change RFMode of IODev
|
if ($attr{$name}{"switch_rfmode"} eq "1") { # do we need to change RFMode of IODev
|
||||||
my $ret = CallFn($io->{NAME}, "AttrFn", "set", ($io->{NAME}, "rfmode", "SlowRF"));
|
my $ret = CallFn($io->{NAME}, "AttrFn", "set", ($io->{NAME}, "rfmode", "SlowRF"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
## Do we need to change ITrepetition ??
|
## Do we need to change ITrepetition ??
|
||||||
if(defined($attr{$a[0]}) && defined($attr{$a[0]}{"ITrepetition"})) {
|
if(defined($attr{$name}) && defined($attr{$name}{"ITrepetition"})) {
|
||||||
$message = "isr".$attr{$a[0]}{"ITrepetition"};
|
$message = "isr".$attr{$name}{"ITrepetition"};
|
||||||
CUL_SimpleWrite($io, $message);
|
CUL_SimpleWrite($io, $message);
|
||||||
Log GetLogLevel($a[0],4), "IT set ITrepetition: $message for $io->{NAME}";
|
Log GetLogLevel($name,4), "IT set ITrepetition: $message for $io->{NAME}";
|
||||||
}
|
}
|
||||||
|
|
||||||
## Do we need to change ITfrequency ??
|
## Do we need to change ITfrequency ??
|
||||||
if(defined($attr{$a[0]}) && defined($attr{$a[0]}{"ITfrequency"})) {
|
if(defined($attr{$name}) && defined($attr{$name}{"ITfrequency"})) {
|
||||||
my $f = $attr{$a[0]}{"ITfrequency"}/26*65536;
|
my $f = $attr{$name}{"ITfrequency"}/26*65536;
|
||||||
my $f2 = sprintf("%02x", $f / 65536);
|
my $f2 = sprintf("%02x", $f / 65536);
|
||||||
my $f1 = sprintf("%02x", int($f % 65536) / 256);
|
my $f1 = sprintf("%02x", int($f % 65536) / 256);
|
||||||
my $f0 = sprintf("%02x", $f % 256);
|
my $f0 = sprintf("%02x", $f % 256);
|
||||||
|
|
||||||
my $arg = sprintf("%.3f", (hex($f2)*65536+hex($f1)*256+hex($f0))/65536*26);
|
my $arg = sprintf("%.3f", (hex($f2)*65536+hex($f1)*256+hex($f0))/65536*26);
|
||||||
Log GetLogLevel($a[0],4), "Setting ITfrequency (0D,0E,0F) to $f2 $f1 $f0 = $arg MHz";
|
Log GetLogLevel($name,4), "Setting ITfrequency (0D,0E,0F) to $f2 $f1 $f0 = $arg MHz";
|
||||||
CUL_SimpleWrite($hash, "if$f2$f1$f0");
|
CUL_SimpleWrite($hash, "if$f2$f1$f0");
|
||||||
}
|
}
|
||||||
|
|
||||||
my $v = join(" ", @a);
|
my $v = $name ." ". join(" ", @a);
|
||||||
$message = "is".uc($hash->{XMIT}.$hash->{$c});
|
$message = "is".uc($hash->{XMIT}.$hash->{$c});
|
||||||
|
|
||||||
## Log that we are going to switch InterTechno
|
## Log that we are going to switch InterTechno
|
||||||
Log GetLogLevel($a[0],2), "IT set $v";
|
Log GetLogLevel($name,2), "IT set $v";
|
||||||
(undef, $v) = split(" ", $v, 2); # Not interested in the name...
|
(undef, $v) = split(" ", $v, 2); # Not interested in the name...
|
||||||
|
|
||||||
## Send Message to IODev and wait for correct answer
|
## Send Message to IODev and wait for correct answer
|
||||||
@ -159,21 +157,21 @@ IT_Set($@)
|
|||||||
}
|
}
|
||||||
|
|
||||||
## Do we need to change ITrepetition back??
|
## Do we need to change ITrepetition back??
|
||||||
if(defined($attr{$a[0]}) && defined($attr{$a[0]}{"ITrepetition"})) {
|
if(defined($attr{$name}) && defined($attr{$name}{"ITrepetition"})) {
|
||||||
$message = "isr".$it_defrepetition;
|
$message = "isr".$it_defrepetition;
|
||||||
CUL_SimpleWrite($io, $message);
|
CUL_SimpleWrite($io, $message);
|
||||||
Log GetLogLevel($a[0],4), "IT set ITrepetition back: $message for $io->{NAME}";
|
Log GetLogLevel($name,4), "IT set ITrepetition back: $message for $io->{NAME}";
|
||||||
}
|
}
|
||||||
|
|
||||||
## Do we need to change ITfrequency back??
|
## Do we need to change ITfrequency back??
|
||||||
if(defined($attr{$a[0]}) && defined($attr{$a[0]}{"ITfrequency"})) {
|
if(defined($attr{$name}) && defined($attr{$name}{"ITfrequency"})) {
|
||||||
Log GetLogLevel($a[0],4), "Setting ITfrequency back to 433.92 MHz";
|
Log GetLogLevel($name,4), "Setting ITfrequency back to 433.92 MHz";
|
||||||
CUL_SimpleWrite($hash, "if0");
|
CUL_SimpleWrite($hash, "if0");
|
||||||
}
|
}
|
||||||
|
|
||||||
## Do we need to change RFMode back to HomeMatic??
|
## Do we need to change RFMode back to HomeMatic??
|
||||||
if(defined($attr{$a[0]}) && defined($attr{$a[0]}{"switch_rfmode"})) {
|
if(defined($attr{$name}) && defined($attr{$name}{"switch_rfmode"})) {
|
||||||
if ($attr{$a[0]}{"switch_rfmode"} eq "1") { # do we need to change RFMode of IODev
|
if ($attr{$name}{"switch_rfmode"} eq "1") { # do we need to change RFMode of IODev
|
||||||
my $ret = CallFn($io->{NAME}, "AttrFn", "set", ($io->{NAME}, "rfmode", "HomeMatic"));
|
my $ret = CallFn($io->{NAME}, "AttrFn", "set", ($io->{NAME}, "rfmode", "HomeMatic"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -383,6 +381,7 @@ IT_Parse($$)
|
|||||||
off
|
off
|
||||||
on
|
on
|
||||||
on-till # Special, see the note
|
on-till # Special, see the note
|
||||||
|
<li><a href="#setExtensions">set extensions</a> are supported.</li>
|
||||||
</pre>
|
</pre>
|
||||||
Examples:
|
Examples:
|
||||||
<ul>
|
<ul>
|
||||||
@ -493,7 +492,194 @@ IT_Parse($$)
|
|||||||
</ul>
|
</ul>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
=end html
|
=end html
|
||||||
|
|
||||||
|
=begin html_DE
|
||||||
|
|
||||||
|
<a name="IT"></a>
|
||||||
|
<h3>IT - InterTechno</h3>
|
||||||
|
<ul>
|
||||||
|
Das InterTechno 433MHZ Protokoll wird von einer Vielzahl von Geräten
|
||||||
|
benutzt. Diese gehören entweder zur Kategorie Sender/Sensoren oder zur
|
||||||
|
Kategorie Empfänger/Aktoren. Derzeit ist nur das SENDEN von InterTechno
|
||||||
|
Befehlen möglich, so dass dieses Modul nur die Bedienung von Geräten wie
|
||||||
|
Schalter, Dimmer usw. über ein <a href="#CUL">CUL</a> unterstützt; der
|
||||||
|
CUL muss daher bereits definiert sein.
|
||||||
|
|
||||||
|
<br><br>
|
||||||
|
|
||||||
|
<a name="ITdefine"></a>
|
||||||
|
<b>Define</b>
|
||||||
|
<ul>
|
||||||
|
<code>define <name> IT <housecode> <on-code> <off-code>
|
||||||
|
[<dimup-code>] [<dimdown-code>] </code>
|
||||||
|
<br>oder<br>
|
||||||
|
<code>define <name> IT <ITRotarySwitches|FLS100RotarySwitches> </code>
|
||||||
|
<br><br>
|
||||||
|
|
||||||
|
Der Wert von housecode ist abhängig vom verwendeten Gerät und besteht aus zehn Ziffern InterTechno-Code.
|
||||||
|
Da dieser ein tri-State-Protokoll ist, können die Ziffern jeweils 0/1/F annehmen.
|
||||||
|
<br>
|
||||||
|
Bit 11/12 werden für Schalten oder Dimmen verwendet. Da die Hersteller verschiedene Codes verwenden, können hier die
|
||||||
|
(2-stelligen) Codes für an, aus, heller und dunkler (on/off/dimup/dimdown) als tri-State-Ziffern (0/1/F) festgelegt werden.
|
||||||
|
<br>
|
||||||
|
Der Wert des ITRotary-Schalters setzt sich aus dem Wert des Buchstaben-Schalters A-P und dem numerischen Schalter 1-16
|
||||||
|
des InterTechno-Gerätes zusammen, z.B. A1 oder G12.
|
||||||
|
<br>
|
||||||
|
Der Wert des FLS100Rotary-Schalters setzt sich aus dem Wert des Schalters I,II,II,IV und dem numerischen Schalter 1-4
|
||||||
|
des InterTechno-Gerätes zusammen, z.B. I2 oder IV4.
|
||||||
|
<br>
|
||||||
|
Die Werte der ITRotary-Schalter und FLS100Rotary-Schalter werden intern in housecode-Werte umgewandelt.
|
||||||
|
<br>
|
||||||
|
<ul>
|
||||||
|
<li><code><housecode></code> 10 Ziffern lange tri-State-Zahl (0/1/F) abhängig vom benutzten Gerät.</li>
|
||||||
|
<li><code><on-code></code> 2 Ziffern lange tri-State-Zahl, die den Einschaltbefehl enthält;
|
||||||
|
die Zahl wird an den housecode angefügt, um den 12-stelligen IT-Sendebefehl zu bilden.</li>
|
||||||
|
<li><code><off-code></code> 2 Ziffern lange tri-State-Zahl, die den Ausschaltbefehl enthält;
|
||||||
|
die Zahl wird an den housecode angefügt, um den 12-stelligen IT-Sendebefehl zu bilden.</li>
|
||||||
|
<li>Der optionale <code><dimup-code></code> ist eine 2 Ziffern lange tri-State-Zahl, die den Befehl zum Heraufregeln enthält;
|
||||||
|
die Zahl wird an den housecode angefügt, um den 12-stelligen IT-Sendebefehl zu bilden.</li>
|
||||||
|
<li>Der optionale <code><dimdown-code></code> ist eine 2 Ziffern lange tri-State-Zahl, die den Befehl zum Herunterregeln enthält;
|
||||||
|
die Zahl wird an den housecode angefügt, um den 12-stelligen IT-Sendebefehl zu bilden.</li>
|
||||||
|
</ul>
|
||||||
|
<br>
|
||||||
|
|
||||||
|
Beispiele:
|
||||||
|
<ul>
|
||||||
|
<code>define lamp IT 01FF010101 11 00 01 10</code><br>
|
||||||
|
<code>define roll1 IT 111111111F 11 00 01 10</code><br>
|
||||||
|
<code>define otherlamp IT 000000000F 11 10 00 00</code><br>
|
||||||
|
<code>define otherroll1 IT FFFFFFF00F 11 10</code><br>
|
||||||
|
<code>define itswitch1 IT A1</code><br>
|
||||||
|
<code>define lamp IT J10</code><br>
|
||||||
|
<code>define flsswitch1 IT IV1</code><br>
|
||||||
|
<code>define lamp IT II2</code>
|
||||||
|
</ul>
|
||||||
|
</ul>
|
||||||
|
<br>
|
||||||
|
|
||||||
|
<a name="ITset"></a>
|
||||||
|
<b>Set </b>
|
||||||
|
<ul>
|
||||||
|
<code>set <name> <value> [<time>]</code>
|
||||||
|
<br><br>
|
||||||
|
wobei <code>value</code> eines der folgenden Schlüsselwörter ist:<br>
|
||||||
|
<pre>
|
||||||
|
dimdown
|
||||||
|
dimup
|
||||||
|
off
|
||||||
|
on
|
||||||
|
on-till # siehe Anmerkungen
|
||||||
|
<li>Die <a href="#setExtensions">set extensions</a> werden unterstützt.</li>
|
||||||
|
</pre>
|
||||||
|
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 off</code><br>
|
||||||
|
</ul>
|
||||||
|
<br>
|
||||||
|
Anmerkungen:
|
||||||
|
<ul>
|
||||||
|
<li>on-till erfordert eine Zeitangabe im "at"-Format (HH:MM:SS, HH:MM
|
||||||
|
oder { <perl code> }, wobei dieser Perl-Code eine Zeitangabe zurückgibt).
|
||||||
|
Ist die aktuelle Zeit größer als die Zeitangabe, wird der Befehl verworfen,
|
||||||
|
andernfalls wird ein Einschaltbefehl gesendet und für die Zeitangabe ein
|
||||||
|
Ausschaltbefehl mittels "at"-Befehl angelegt.
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</ul>
|
||||||
|
<br>
|
||||||
|
|
||||||
|
<b>Get</b> <ul>N/A (nicht vorhanden)</ul><br>
|
||||||
|
|
||||||
|
<a name="ITattr"></a>
|
||||||
|
<b>Attributes</b>
|
||||||
|
<ul>
|
||||||
|
<a name="IODev"></a>
|
||||||
|
<li>IODev<br>
|
||||||
|
Spezifiziert das physische Gerät, das die Ausstrahlung der Befehle für das
|
||||||
|
"logische" Gerät ausf??hrt. Ein Beispiel für ein physisches Gerät ist ein CUL.<br>
|
||||||
|
Anmerkung: Beim Start weist fhem einem InterTechno-Gerät kein IO-Gerät zu.
|
||||||
|
Das Attribut IODev ist daher IMMER zu setzen.</li><br>
|
||||||
|
|
||||||
|
<a name="eventMap"></a>
|
||||||
|
<li>eventMap<br>
|
||||||
|
Ersetzt Namen von Ereignissen und set Parametern. Die Liste besteht dabei
|
||||||
|
aus mit Doppelpunkt verbundenen Wertepaaren, die durch Leerzeichen getrennt
|
||||||
|
sind. Der erste Teil des Wertepaares ist der "alte" Wert, der zweite der neue/gewünschte.
|
||||||
|
Ist das erste Zeichen der Werteliste ein Komma (,) oder ein Schrägsstrich (/), wird
|
||||||
|
das Leerzeichen als Listenzeichen durch dieses ersetzt. Dies erlaubt die Benutzung
|
||||||
|
von Leerzeichen innerhalb der Werte.
|
||||||
|
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>
|
||||||
|
|
||||||
|
<li><a href="#do_not_notify">do_not_notify</a></li><br>
|
||||||
|
<a name="attrdummy"></a>
|
||||||
|
<li>dummy<br>
|
||||||
|
Mit der Eigenschaft dummy lassen sich Geräte definieren, die keine physikalischen Befehle
|
||||||
|
senden sollen. Verknüpfte notifys werden trotzdem ausgeführt. Damit kann z.B. auf Sendebefehle
|
||||||
|
reagiert werden, die über die Weboberfläche ausgelöst wurden, ohne dass der Befehl physikalisch
|
||||||
|
gesendet wurde.
|
||||||
|
</li><br>
|
||||||
|
|
||||||
|
<li><a href="#loglevel">loglevel</a></li><br>
|
||||||
|
|
||||||
|
<li><a href="#showtime">showtime</a></li><br>
|
||||||
|
|
||||||
|
<a name="model"></a>
|
||||||
|
<li>model<br>
|
||||||
|
Hiermit kann das Modell des IT-Geräts näher beschrieben werden. Diese
|
||||||
|
Eigenschaft wird (im Moment) nicht von fhem ausgewertet.
|
||||||
|
Mithilfe dieser Information können externe Programme oder Web-Interfaces
|
||||||
|
Geräteklassen unterscheiden, um geeignete Kommandos zu senden (z.B. "on"
|
||||||
|
oder "off" an Schalter, aber "dim..%" an Dimmer usw.). Die Schreibweise
|
||||||
|
der Modellbezeichnung sollten der dem Gerät mitgelieferten Dokumentation
|
||||||
|
in Kleinbuchstaben ohne Leerzeichen entsprechen.
|
||||||
|
Andere Zeichen als <code>a-z 0-9</code> und <code>-</code> (Bindestrich)
|
||||||
|
sollten vermieden werden. Dies ist die Liste der "offiziellen" Modelltypen:<br>
|
||||||
|
<b>Sender/Sensor</b>: itremote<br>
|
||||||
|
|
||||||
|
<b>Dimmer</b>: itdimmer<br>
|
||||||
|
|
||||||
|
<b>Empfänger/Actor</b>: itswitch
|
||||||
|
</li><br>
|
||||||
|
|
||||||
|
|
||||||
|
<a name="ignore"></a>
|
||||||
|
<li>ignore<br>
|
||||||
|
Durch das Setzen dieser Eigenschaft wird das Gerät nicht durch fhem beachtet,
|
||||||
|
z.B. weil es einem Nachbarn gehört. Aktivitäten dieses Gerätes erzeugen weder
|
||||||
|
Log-Einträge noch reagieren notifys darauf, erzeugte Kommandos werden ignoriert
|
||||||
|
(wie bei Verwendung des Attributes <a href="#attrdummy">dummy</a> werden keine
|
||||||
|
Signale gesendet). Das Gerät ist weder in der Ausgabe des list-Befehls enthalten
|
||||||
|
(außer es wird explizit aufgerufen), noch wird es bei Befehlen berücksichtigt,
|
||||||
|
die mit Platzhaltern in Namensangaben arbeiten (siehe <a href="#devspec">devspec</a>).
|
||||||
|
Sie werden weiterhin mit der speziellen devspec (Gerätebeschreibung) "ignored=1" gefunden.
|
||||||
|
</li><br>
|
||||||
|
|
||||||
|
</ul>
|
||||||
|
<br>
|
||||||
|
|
||||||
|
<a name="ITevents"></a>
|
||||||
|
<b>Erzeugte Ereignisse (Events):</b>
|
||||||
|
<ul>
|
||||||
|
Ein IT-Gerät kann folgende Ereignisse generieren:
|
||||||
|
<li>on</li>
|
||||||
|
<li>off</li>
|
||||||
|
<li>dimdown</li>
|
||||||
|
<li>dimup<br></li>
|
||||||
|
Welche Ereignisse erzeugt werden ist geräteabhängig und kann evtl. am Gerät eingestellt werden.
|
||||||
|
</ul>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
=end html_DE
|
||||||
|
|
||||||
=cut
|
=cut
|
||||||
|
Loading…
x
Reference in New Issue
Block a user