-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy path98_dummy.pm
228 lines (186 loc) · 5.71 KB
/
98_dummy.pm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
##############################################
# $Id: 98_dummy.pm 20665 2019-12-06 11:05:35Z rudolfkoenig $
package main;
use strict;
use warnings;
use SetExtensions;
sub
dummy_Initialize($)
{
my ($hash) = @_;
$hash->{SetFn} = "dummy_Set";
$hash->{DefFn} = "dummy_Define";
no warnings 'qw';
my @attrList = qw(
disable
disabledForIntervals
readingList
setExtensionsEvent:1,0
setList
useSetExtensions
);
use warnings 'qw';
$hash->{AttrList} = join(" ", @attrList)." $readingFnAttributes";
}
###################################
sub
dummy_Set($@)
{
my ($hash, @a) = @_;
my $name = shift @a;
return "no set value specified" if(int(@a) < 1);
my $setList = AttrVal($name, "setList", " ");
$setList =~ s/\n/ /g;
if(AttrVal($name,"useSetExtensions",undef)) {
my $a0 = $a[0]; $a0 =~ s/([.?*])/\\$1/g;
if($setList !~ m/\b$a0\b/) {
unshift @a, $name;
return SetExtensions($hash, $setList, @a)
}
SetExtensionsCancel($hash);
} else {
return "Unknown argument ?, choose one of $setList" if($a[0] eq "?");
}
return undef
if($attr{$name} && # Avoid checking it if only STATE is inactive
($attr{$name}{disable} || $attr{$name}{disabledForIntervals}) &&
IsDisabled($name));
my @rl = split(" ", AttrVal($name, "readingList", ""));
my $doRet;
eval {
if(@rl && grep /^$a[0]$/, @rl) {
my $v = shift @a;
readingsSingleUpdate($hash, $v, join(" ",@a), 1);
$doRet = 1;
}
};
return if($doRet);
my $v = join(" ", @a);
Log3 $name, 4, "dummy set $name $v";
$v = $hash->{SetExtensionsCommand}
if($hash->{SetExtensionsCommand} &&
AttrVal($name, "setExtensionsEvent", undef));
readingsSingleUpdate($hash,"state",$v,1);
return undef;
}
sub
dummy_Define($$)
{
my ($hash, $def) = @_;
my @a = split("[ \t][ \t]*", $def);
return "Wrong syntax: use define <name> dummy" if(int(@a) != 2);
return undef;
}
1;
=pod
=item helper
=item summary dummy device
=item summary_DE dummy Gerät
=begin html
<a id="dummy"></a>
<h3>dummy</h3>
<ul>
Define a dummy. A dummy can take via <a href="#set">set</a> any values.
Used for programming.
<br><br>
<a id="dummy-define"></a>
<h4>Define</h4>
<ul>
<code>define <name> dummy</code>
<br><br>
Example:
<ul>
<code>define myvar dummy</code><br>
<code>set myvar 7</code><br>
</ul>
</ul>
<br>
<a id="dummy-set"></a>
<h4>Set</h4>
<ul>
<code>set <name> <value></code><br>
Set any value.
</ul>
<br>
<a id="dummy-get"></a>
<h4>Get</h4> <ul>N/A</ul><br>
<a id="dummy-attr"></a>
<h4>Attributes</h4>
<ul>
<li><a href="#disable">disable</a></li>
<li><a href="#disabledForIntervals">disabledForIntervals</a></li>
<li><a id="dummy-attr-readingList">readingList</a><br>
Space separated list of readings, which will be set, if the first
argument of the set command matches one of them.</li>
<li><a id="dummy-attr-setList">setList</a><br>
Space separated list of commands, which will be returned upon "set name
?", so the FHEMWEB frontend can construct a dropdown and offer on/off
switches. Example: attr dummyName setList on off </li>
<li><a id="dummy-attr-useSetExtensions">useSetExtensions</a><br>
If set, and setList contains on and off, then the
<a href="#setExtensions">set extensions</a> are available.<br>
Side-effect: if set, only the specified parameters are accepted, even if
setList contains no on and off.</li>
<li><a id="dummy-attr-setExtensionsEvent">setExtensionsEvent</a><br>
If set, the event will contain the command implemented by SetExtensions
(e.g. on-for-timer 10), else the executed command (e.g. on).</li>
<li><a href="#readingFnAttributes">readingFnAttributes</a></li>
</ul>
<br>
</ul>
=end html
=begin html_DE
<a id="dummy"></a>
<h3>dummy</h3>
<ul>
Definiert eine Pseudovariable, der mit <a href="#set">set</a> jeder beliebige
Wert zugewiesen werden kann. Sinnvoll zum Programmieren.
<br><br>
<a id="dummy-define"></a>
<b>Define</b>
<ul>
<code>define <name> dummy</code>
<br><br>
Beispiel:
<ul>
<code>define myvar dummy</code><br>
<code>set myvar 7</code><br>
</ul>
</ul>
<br>
<a id="dummy-set"></a>
<b>Set</b>
<ul>
<code>set <name> <value></code><br>
Weist einen Wert zu.
</ul>
<br>
<a id="dummy-get"></a>
<b>Get</b> <ul>N/A</ul><br>
<a id="dummy-attr"></a>
<b>Attributes</b>
<ul>
<li><a href="#disable">disable</a></li>
<li><a href="#disabledForIntervals">disabledForIntervals</a></li>
<li><a name="readingList">readingList</a><br>
Leerzeichen getrennte Liste mit Readings, die mit "set" gesetzt werden
können.</li>
<li><a id="dummy-attr-setList">setList</a><br>
Liste mit Werten durch Leerzeichen getrennt. Diese Liste wird mit "set
name ?" ausgegeben. Damit kann das FHEMWEB-Frontend Auswahl-Menüs
oder Schalter erzeugen.<br> Beispiel: attr dummyName setList on off </li>
<li><a id="useSetExtensions">useSetExtensions</a><br>
Falls gesetzt, und setList enthält on und off, dann sind die <a
href="#setExtensions">set extensions</a> verfügbar.<br>
Seiteneffekt: falls gesetzt, werden nur die spezifizierten Parameter
akzeptiert, auch dann, wenn setList kein on und off enthält.</li>
<li><a id="setExtensionsEvent">setExtensionsEvent</a><br>
Falls gesetzt, enthält das Event den im SetExtensions
implementierten Befehl (z.Bsp. on-for-timer 10), sonst den
Ausgefürten (z.Bsp. on).</li>
<li><a href="#readingFnAttributes">readingFnAttributes</a></li>
</ul>
<br>
</ul>
=end html_DE
=cut