node-red-contrib-huemagic 5.0.0 → 5.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +6 -1
- package/README.md +20 -1
- package/huemagic/hue-buttons.html +212 -3
- package/huemagic/hue-buttons.js +94 -2
- package/huemagic/locales/de/hue-buttons.html +2 -0
- package/huemagic/locales/de/hue-buttons.json +21 -1
- package/huemagic/locales/el/hue-buttons.html +2 -0
- package/huemagic/locales/el/hue-buttons.json +21 -1
- package/huemagic/locales/en/hue-buttons.html +2 -0
- package/huemagic/locales/en/hue-buttons.json +21 -1
- package/huemagic/locales/es/hue-buttons.html +2 -0
- package/huemagic/locales/es/hue-buttons.json +21 -1
- package/huemagic/locales/fr/hue-buttons.html +2 -0
- package/huemagic/locales/fr/hue-buttons.json +21 -1
- package/huemagic/locales/it/hue-buttons.html +2 -0
- package/huemagic/locales/it/hue-buttons.json +21 -1
- package/huemagic/locales/nl/hue-buttons.html +2 -0
- package/huemagic/locales/nl/hue-buttons.json +21 -1
- package/huemagic/locales/pl/hue-buttons.html +2 -0
- package/huemagic/locales/pl/hue-buttons.json +21 -1
- package/huemagic/locales/pt/hue-buttons.html +2 -0
- package/huemagic/locales/pt/hue-buttons.json +21 -1
- package/huemagic/locales/tr/hue-buttons.html +2 -0
- package/huemagic/locales/tr/hue-buttons.json +21 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -2,7 +2,12 @@
|
|
|
2
2
|
|
|
3
3
|
# Changelog
|
|
4
4
|
|
|
5
|
-
### v5.0.
|
|
5
|
+
### v5.0.1 (latest)
|
|
6
|
+
|
|
7
|
+
* The "Hue Buttons" node can now be given additional outputs, each one triggered by a range of buttons and a certain action — the start of a press, the end of a short press, the end of a long press once it lasted long enough, or repeatedly while a long press is still running. One switch can drive several flows without a Switch node behind it ([#455](https://github.com/Foddy/node-red-contrib-huemagic/pull/455)) (thx @FredBlo)
|
|
8
|
+
* The status of the "Hue Buttons" node now also shows how long a button was held down
|
|
9
|
+
|
|
10
|
+
### v5.0.0
|
|
6
11
|
|
|
7
12
|
> **Attention!** HueMagic v5 requires **Node.js 18+** and **Node-RED v3+**. The "Hue Group" node now speaks the CLIP/v2 API instead of the legacy API, and the alert effect on the "Hue Light" & "Hue Group" nodes is now played by the bridge itself, which also restores the previous state on its own. Your existing flows keep working as they are — no reconfiguration needed.
|
|
8
13
|
|
package/README.md
CHANGED
|
@@ -493,6 +493,20 @@ Select the pre-configured Hue Bridge and hit the search button to find all the a
|
|
|
493
493
|
|
|
494
494
|
If you do not select a switch/button and use the node configuration in this way, the node works in the so-called "universal mode". In this mode, the node receives and outputs all status messages of the same type.
|
|
495
495
|
|
|
496
|
+
### Additional outputs
|
|
497
|
+
|
|
498
|
+
Under "Additional outputs" you can give the node one further output per range of buttons. Each of these outputs is triggered by the actions you tick for it:
|
|
499
|
+
|
|
500
|
+
|Setting|Description|
|
|
501
|
+
|--|--|
|
|
502
|
+
| From / To | The range of buttons this output listens to, e.g. `1` to `4` for all four keys of a Hue Dimmer Switch |
|
|
503
|
+
| Start press | Fires the moment a key is pressed down, before it is known whether a short or a long press is coming |
|
|
504
|
+
| Short press ended | Fires when a key was released within half a second |
|
|
505
|
+
| Long press ended when > | Fires when a key was released after having been held down for at least the given number of milliseconds |
|
|
506
|
+
| Long press (while pressed) | Fires repeatedly, roughly every half second, for as long as the key is still held down |
|
|
507
|
+
|
|
508
|
+
The first output of the node always receives every event, exactly as it did before, so existing flows keep working unchanged. The additional outputs only receive a copy of the message when the button range **and** the action match, which saves the Switch node that used to sit behind the node.
|
|
509
|
+
|
|
496
510
|
### Get status
|
|
497
511
|
|
|
498
512
|
Outputs the current status of the switch/button as soon as a `msg.payload` object with the following content has been passed to the node. Alternatively, you can also press the button in the Node-RED interface without having to pass a message to the node beforehand.
|
|
@@ -1177,7 +1191,12 @@ If the status of the node has changed via a certain command, the entire command
|
|
|
1177
1191
|
|
|
1178
1192
|
# Changelog
|
|
1179
1193
|
|
|
1180
|
-
### v5.0.
|
|
1194
|
+
### v5.0.1 (latest)
|
|
1195
|
+
|
|
1196
|
+
* The "Hue Buttons" node can now be given additional outputs, each one triggered by a range of buttons and a certain action — the start of a press, the end of a short press, the end of a long press once it lasted long enough, or repeatedly while a long press is still running. One switch can drive several flows without a Switch node behind it ([#455](https://github.com/Foddy/node-red-contrib-huemagic/pull/455)) (thx @FredBlo)
|
|
1197
|
+
* The status of the "Hue Buttons" node now also shows how long a button was held down
|
|
1198
|
+
|
|
1199
|
+
### v5.0.0
|
|
1181
1200
|
|
|
1182
1201
|
> **Attention!** HueMagic v5 requires **Node.js 18+** and **Node-RED v3+**. The "Hue Group" node now speaks the CLIP/v2 API instead of the legacy API, and the alert effect on the "Hue Light" & "Hue Group" nodes is now played by the bridge itself, which also restores the previous state on its own. Your existing flows keep working as they are — no reconfiguration needed.
|
|
1183
1202
|
|
|
@@ -36,6 +36,13 @@
|
|
|
36
36
|
<span data-i18n="hue-buttons.config.onlycommands-node" style="flex: 1; margin-left: 8px;"></span>
|
|
37
37
|
</div>
|
|
38
38
|
</div>
|
|
39
|
+
<div class="form-row">
|
|
40
|
+
<i class="fa fa-sign-out"></i> <b><span data-i18n="hue-buttons.config.add-outputs"></span></b>
|
|
41
|
+
</div>
|
|
42
|
+
<div class="form-row node-input-rule-container-row" style="width:100%">
|
|
43
|
+
<input type="hidden" id="node-input-outputs"/>
|
|
44
|
+
<ol id="node-input-rule-container"></ol>
|
|
45
|
+
</div>
|
|
39
46
|
</script>
|
|
40
47
|
|
|
41
48
|
<script type="text/javascript">
|
|
@@ -48,7 +55,9 @@
|
|
|
48
55
|
sensorid: { value:"", required: false },
|
|
49
56
|
skipevents: { value: false },
|
|
50
57
|
initevents: { value: false },
|
|
51
|
-
onlycommands: { value: false }
|
|
58
|
+
onlycommands: { value: false },
|
|
59
|
+
rules: { value: [] },
|
|
60
|
+
outputs: { value: 1 }
|
|
52
61
|
},
|
|
53
62
|
align: 'left',
|
|
54
63
|
icon: "hue-buttons.svg",
|
|
@@ -63,8 +72,35 @@
|
|
|
63
72
|
inputLabels: function() {
|
|
64
73
|
return this._("hue-buttons.node.input");
|
|
65
74
|
},
|
|
66
|
-
outputLabels: function() {
|
|
67
|
-
|
|
75
|
+
outputLabels: function(index) {
|
|
76
|
+
let rule = (this.rules || [])[index-1];
|
|
77
|
+
let label = '';
|
|
78
|
+
if (rule) {
|
|
79
|
+
if (rule.buttonFrom == rule.buttonTo) {
|
|
80
|
+
label = this._('hue-buttons.config.outputlabel-btn-from' , {'from' : rule.buttonFrom});
|
|
81
|
+
} else {
|
|
82
|
+
label = this._('hue-buttons.config.outputlabel-btn-from-to' , {'from' : rule.buttonFrom, 'to' : rule.buttonTo});
|
|
83
|
+
}
|
|
84
|
+
let onEvents = [];
|
|
85
|
+
if (rule.onStartPress) {
|
|
86
|
+
onEvents.push (' - ' + this._('hue-buttons.config.outputlabel-btn-startpress'));
|
|
87
|
+
}
|
|
88
|
+
if (rule.onEndShortPress) {
|
|
89
|
+
onEvents.push (' - ' + this._('hue-buttons.config.outputlabel-btn-shortpress'));
|
|
90
|
+
}
|
|
91
|
+
if (rule.onEndLongPress) {
|
|
92
|
+
onEvents.push (' - ' + this._('hue-buttons.config.outputlabel-btn-longpress' , {'duration' : (rule.minLongPressDuration/1000).toFixed(1).toString()}) );
|
|
93
|
+
}
|
|
94
|
+
if (rule.onDuringLongPress) {
|
|
95
|
+
onEvents.push (' - ' + this._('hue-buttons.config.outputlabel-btn-longpresswhile') );
|
|
96
|
+
}
|
|
97
|
+
if (onEvents.length) {
|
|
98
|
+
label += ' ' + this._('hue-buttons.config.outputlabel-btn-on') + '\n' + onEvents.join ('\n');
|
|
99
|
+
}
|
|
100
|
+
} else {
|
|
101
|
+
label = this._('hue-buttons.node.output');
|
|
102
|
+
}
|
|
103
|
+
return label;
|
|
68
104
|
},
|
|
69
105
|
oneditprepare: function()
|
|
70
106
|
{
|
|
@@ -189,7 +225,180 @@
|
|
|
189
225
|
searchAndSelect();
|
|
190
226
|
}
|
|
191
227
|
});
|
|
228
|
+
|
|
229
|
+
// ADVANCED ADDITIONAL OUTPUTS
|
|
230
|
+
// Styles used in button range container
|
|
231
|
+
$("style").append("#node-input-rule-container .buttonrule-fromtolabel {display:inline-block; width:100px; margin-left: 20px;}");
|
|
232
|
+
$("style").append("#node-input-rule-container .buttonrule-checkbox {display:inline-block; width:22px; margin-left:0px; vertical-align:baseline;}");
|
|
233
|
+
$("style").append("#node-input-rule-container .buttonrule-select {width:60px; height: 23px; padding: 2px 2px; margin-left: 25px; margin-right: 35px; text-align: center;}");
|
|
234
|
+
$("style").append("#node-input-rule-container .buttonrule-checkbox-label {width: auto; margin-bottom: 2px;}");
|
|
235
|
+
// Output order can be updated to keep linked junctions correctly connected. To do so, a reserved item must contains
|
|
236
|
+
// outputs re-directions (if outputs are a,b,c,d, after configuring, new outputs are z,a,c, then 'node-input-outputs'
|
|
237
|
+
// must now be {"0":"1", "1":"-1", "2":"2", "3":"-1", "someRandomNo":"0"}.
|
|
238
|
+
var outputOrderIndexOnOpen = {};
|
|
239
|
+
function rebuildOutputIndexes (rulesUI) {
|
|
240
|
+
// Build new outputs : assume all which were defined before are 'deleted' (if not, they will be re-assigned right after)
|
|
241
|
+
let orderedRulesIndex = {'0':'0'}; // first output is always static, afterwards always index using i+1 therefore
|
|
242
|
+
Object.entries(outputOrderIndexOnOpen).forEach ((ruleIndex) => {orderedRulesIndex[ruleIndex[1]+1] = -1;});
|
|
243
|
+
// Parse each rule : if it existed before, build index transfer (Initial -> To), if new just indicate new index 'usage'
|
|
244
|
+
rulesUI.each(function(i) {
|
|
245
|
+
let ruleUI = $(this);
|
|
246
|
+
let curRowID = ruleUI.find("[id^=node-input-buttonFrom_]").attr('id').split("_").pop(); // row id is appended to each item, so gather it after the '_'
|
|
247
|
+
if (outputOrderIndexOnOpen.hasOwnProperty(curRowID)) {
|
|
248
|
+
// This rule existed on open, build index .initial -> .toCurrent
|
|
249
|
+
orderedRulesIndex[outputOrderIndexOnOpen[curRowID]+1] = i+1;
|
|
250
|
+
} else {
|
|
251
|
+
// This is a new rule : just add its final index using its rowID
|
|
252
|
+
orderedRulesIndex[curRowID] = i+1;
|
|
253
|
+
}
|
|
254
|
+
// Re-number them in UI (output number)
|
|
255
|
+
ruleUI.find(".node-input-rule-index").html(i+2);
|
|
256
|
+
});
|
|
257
|
+
$("#node-input-outputs").val(JSON.stringify(orderedRulesIndex));
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
$("#node-input-rule-container").css('min-height','350px').css('min-width','450px').editableList({
|
|
261
|
+
addButton: scope._('hue-buttons.config.add-outputs-btn-addnew'),
|
|
262
|
+
header: $("<div style='background:#EFEFEF; display:grid; grid-template-columns:135px 1fr 90px 30px'>"
|
|
263
|
+
+"<div style='margin-left: 30px; display: inline-grid; margin-top: 5px; font-weight:bold'>" + scope._('hue-buttons.config.add-outputs-range') + "</div>"
|
|
264
|
+
+"<div style='display: inline-grid; margin-top: 5px; font-weight:bold'>" + scope._('hue-buttons.config.add-outputs-newflow') + "</div>"
|
|
265
|
+
+"<div style='display: inline-grid; justify-self: end; margin-top: 5px; font-weight:bold'>" + scope._('hue-buttons.config.add-outputs-nr') + "</div>"
|
|
266
|
+
+"</div>"),
|
|
267
|
+
|
|
268
|
+
addItem: function (container, i, rules) {
|
|
269
|
+
let uniqueRowID = Math.floor((0x99999-0x10000)*Math.random()).toString()
|
|
270
|
+
if (!rules.hasOwnProperty('rule')) {
|
|
271
|
+
rules.rule = {};
|
|
272
|
+
} else {
|
|
273
|
+
// Rule existed before (=on load, keep its initial index)
|
|
274
|
+
outputOrderIndexOnOpen[uniqueRowID] = i;
|
|
275
|
+
}
|
|
276
|
+
var rule = rules.rule;
|
|
277
|
+
|
|
278
|
+
// When object is new, apply default values
|
|
279
|
+
if (!rule.hasOwnProperty('buttonFrom')) {
|
|
280
|
+
rule.buttonFrom = '1';
|
|
281
|
+
}
|
|
282
|
+
if (!rule.hasOwnProperty('buttonTo')) {
|
|
283
|
+
rule.buttonTo = '4';
|
|
284
|
+
}
|
|
285
|
+
if (!rule.hasOwnProperty('onEndShortPress')) {
|
|
286
|
+
rule.onEndShortPress = true;
|
|
287
|
+
}
|
|
288
|
+
if (!rule.hasOwnProperty('onEndLongPress')) {
|
|
289
|
+
rule.onEndLongPress = true;
|
|
290
|
+
}
|
|
291
|
+
if (!rule.hasOwnProperty('minLongPressDuration')) {
|
|
292
|
+
rule.minLongPressDuration = 1000;
|
|
293
|
+
}
|
|
294
|
+
// ROW 1 : 'From label' & checkbox 'Start press'
|
|
295
|
+
let row1 = $('<div/>').appendTo(container);
|
|
296
|
+
row1.append('<span class="buttonrule-fromtolabel">' + scope._('hue-buttons.config.add-outputs-btn-from') + '</span>');
|
|
297
|
+
let field_onStartPress = $('<input/>',{id:"node-input-onStartPress_" + uniqueRowID,type:"checkbox", class:"buttonrule-checkbox"}).appendTo(row1);
|
|
298
|
+
row1.append('<label class="buttonrule-checkbox-label" for="node-input-onStartPress_' + uniqueRowID + '">' + scope._('hue-buttons.config.add-outputs-startpress') + '</label>');
|
|
299
|
+
// ROW1 : output info (rightest part)
|
|
300
|
+
let finalspan = $('<span/>',{style:"float: right;margin-top: 6px;"}).appendTo(row1);
|
|
301
|
+
finalspan.append('<i class="fa fa-sign-out"></i><span class="node-input-rule-index">'+(i+2)+'</span>');
|
|
302
|
+
// ROW 2 : 'From list' & checkbox 'End short press'
|
|
303
|
+
let row2 = $('<div/>').appendTo(container);
|
|
304
|
+
let field_buttonFrom = $('<select/>',{id:"node-input-buttonFrom_" + uniqueRowID, class:"buttonrule-select"}).appendTo(row2);
|
|
305
|
+
let field_onEndShortPress = $('<input/>',{id:"node-input-onEndShortPress_" + uniqueRowID, type:"checkbox", class:"buttonrule-checkbox"}).appendTo(row2);
|
|
306
|
+
row2.append('<label class="buttonrule-checkbox-label" for="node-input-onEndShortPress_' + uniqueRowID + '">' + scope._('hue-buttons.config.add-outputs-shortpress') + '</label>');
|
|
307
|
+
// ROW 3 : 'To label' & checkbox 'End long press after [xx] seconds'
|
|
308
|
+
let row3 = $('<div/>').appendTo(container);
|
|
309
|
+
row3.append('<span class="buttonrule-fromtolabel">' + scope._('hue-buttons.config.add-outputs-btn-to') + '</span>');
|
|
310
|
+
let field_onEndLongPress = $('<input/>',{id:"node-input-onEndLongPress_" + uniqueRowID, type:"checkbox", class:"buttonrule-checkbox"}).appendTo(row3);
|
|
311
|
+
row3.append('<label class="buttonrule-checkbox-label" for="node-input-onEndLongPress_' + uniqueRowID + '" style="width:unset";>' + scope._('hue-buttons.config.add-outputs-longpress') + ' </label>');
|
|
312
|
+
let field_minLongPressDuration = $('<input/>',{id:"node-input-minLongPressDuration_" + uniqueRowID, type:"text",style:"height:23px; width:55px; padding: 2px 2px;"}).appendTo(row3);
|
|
313
|
+
row3.append('<label class="buttonrule-checkbox-label" for="node-input-minLongPressDuration_' + uniqueRowID + '">  ms</label>');
|
|
314
|
+
// ROW 4 : 'To list' & checkbox 'During long press'
|
|
315
|
+
let row4 = $('<div/>').appendTo(container);
|
|
316
|
+
let field_buttonTo = $('<select/>',{id:"node-input-buttonTo_" + uniqueRowID, class:"buttonrule-select"}).appendTo(row4);
|
|
317
|
+
let field_onDuringLongPress = $('<input/>',{id:"node-input-onDuringLongPress_" + uniqueRowID, type:"checkbox", class:"buttonrule-checkbox"}).appendTo(row4);
|
|
318
|
+
row4.append('<label class="buttonrule-checkbox-label" for="node-input-onDuringLongPress_' + uniqueRowID + '">' + scope._('hue-buttons.config.add-outputs-longpresswhile') + '</label>');
|
|
319
|
+
|
|
320
|
+
// Build all 0-10 choices to both fields inputs
|
|
321
|
+
for (let i = 1; i <= 10; i++) {
|
|
322
|
+
field_buttonFrom.append($("<option></option>").val(i.toString()).text(i.toString()));
|
|
323
|
+
field_buttonTo.append($("<option></option>").val(i.toString()).text(i.toString()));
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
// Events : When From & To selector is changed, ensure range remains OK
|
|
327
|
+
field_buttonFrom.on ("change", function() {
|
|
328
|
+
if (parseInt(field_buttonFrom.val()) > parseInt(field_buttonTo.val())) {
|
|
329
|
+
field_buttonTo.val(field_buttonFrom.val());
|
|
330
|
+
}
|
|
331
|
+
});
|
|
332
|
+
field_buttonTo.on ("change", function() {
|
|
333
|
+
if (parseInt(field_buttonFrom.val()) > parseInt(field_buttonTo.val())) {
|
|
334
|
+
field_buttonFrom.val(field_buttonTo.val());
|
|
335
|
+
}
|
|
336
|
+
});
|
|
337
|
+
|
|
338
|
+
// Copy memory info back on fields
|
|
339
|
+
field_buttonFrom.val (rule.buttonFrom.toString());
|
|
340
|
+
field_buttonTo.val (rule.buttonTo.toString());
|
|
341
|
+
field_minLongPressDuration.val (rule.minLongPressDuration.toString());
|
|
342
|
+
// Checkboxes
|
|
343
|
+
field_onStartPress.prop ('checked', rule.onStartPress);
|
|
344
|
+
field_onEndShortPress.prop ('checked', rule.onEndShortPress);
|
|
345
|
+
field_onEndLongPress.prop ('checked', rule.onEndLongPress);
|
|
346
|
+
field_onDuringLongPress.prop ('checked', rule.onDuringLongPress);
|
|
347
|
+
// Update outputs (number of outputs and how the changed since onLoad)
|
|
348
|
+
rebuildOutputIndexes ($("#node-input-rule-container").editableList('items'));
|
|
349
|
+
},
|
|
350
|
+
removeItem: function (rule) {
|
|
351
|
+
// Update outputs (number of outputs and how the changed since onLoad)
|
|
352
|
+
rebuildOutputIndexes ($("#node-input-rule-container").editableList('items'));
|
|
353
|
+
},
|
|
354
|
+
sortItems: function (rules) {
|
|
355
|
+
// Update outputs (number of outputs and how the changed since onLoad)
|
|
356
|
+
rebuildOutputIndexes (rules);
|
|
357
|
+
},
|
|
358
|
+
sortable: true,
|
|
359
|
+
removable: true
|
|
360
|
+
});
|
|
361
|
+
|
|
362
|
+
// Add all previously saved rules back to UI List
|
|
363
|
+
let savedRules = this.rules || [];
|
|
364
|
+
for (let i = 0 ; i < savedRules.length ; i++) {
|
|
365
|
+
$("#node-input-rule-container").editableList('addItem',{rule:savedRules[i], i:i});
|
|
366
|
+
}
|
|
367
|
+
|
|
368
|
+
// An empty list never runs through addItem, so the output map has to be written once here
|
|
369
|
+
rebuildOutputIndexes ($("#node-input-rule-container").editableList('items'));
|
|
370
|
+
},
|
|
371
|
+
|
|
372
|
+
oneditresize: function(size) {
|
|
373
|
+
let rows = $("#dialog-form>div:not(.node-input-rule-container-row)");
|
|
374
|
+
let height = size.height;
|
|
375
|
+
for (let i = 0 ; i<rows.length ; i++) {
|
|
376
|
+
height -= $(rows[i]).outerHeight(true);
|
|
377
|
+
}
|
|
378
|
+
let editorRow = $("#dialog-form>div.node-input-rule-container-row");
|
|
379
|
+
height -= (parseInt(editorRow.css("marginTop"))+parseInt(editorRow.css("marginBottom")));
|
|
380
|
+
height += 40;
|
|
381
|
+
$("#node-input-rule-container").editableList('height',height);
|
|
382
|
+
},
|
|
383
|
+
|
|
384
|
+
oneditsave: function() {
|
|
385
|
+
let rules = $("#node-input-rule-container").editableList('items');
|
|
386
|
+
let node = this;
|
|
387
|
+
node.rules = [];
|
|
388
|
+
rules.each (function (i) {
|
|
389
|
+
let rule = $(this);
|
|
390
|
+
let savedRule = {};
|
|
391
|
+
savedRule.buttonFrom = parseInt(rule.find("[id^=node-input-buttonFrom_]").val());
|
|
392
|
+
savedRule.buttonTo = parseInt(rule.find("[id^=node-input-buttonTo_]").val());
|
|
393
|
+
savedRule.onStartPress = rule.find("[id^=node-input-onStartPress_]").prop("checked");
|
|
394
|
+
savedRule.onEndShortPress = rule.find("[id^=node-input-onEndShortPress_]").prop("checked");
|
|
395
|
+
savedRule.onEndLongPress = rule.find("[id^=node-input-onEndLongPress_]").prop("checked");
|
|
396
|
+
savedRule.onDuringLongPress = rule.find("[id^=node-input-onDuringLongPress_]").prop("checked");
|
|
397
|
+
savedRule.minLongPressDuration = parseInt(rule.find("[id^=node-input-minLongPressDuration_]").val()) || 0;
|
|
398
|
+
node.rules.push (savedRule);
|
|
399
|
+
});
|
|
192
400
|
},
|
|
401
|
+
|
|
193
402
|
button: {
|
|
194
403
|
enabled: function() {
|
|
195
404
|
return (this.sensorid && this.sensorid.length > 1)
|
package/huemagic/hue-buttons.js
CHANGED
|
@@ -2,6 +2,28 @@ module.exports = function(RED)
|
|
|
2
2
|
{
|
|
3
3
|
"use strict";
|
|
4
4
|
|
|
5
|
+
//
|
|
6
|
+
// DOES A BUTTON EVENT MATCH THE RULE OF AN ADDITIONAL OUTPUT?
|
|
7
|
+
function matchesRule(buttonState, rule)
|
|
8
|
+
{
|
|
9
|
+
// BUTTON OUTSIDE THE RANGE THE RULE WATCHES?
|
|
10
|
+
if(buttonState.button < parseInt(rule.buttonFrom) || buttonState.button > parseInt(rule.buttonTo)) { return false; }
|
|
11
|
+
|
|
12
|
+
switch (buttonState.actionType)
|
|
13
|
+
{
|
|
14
|
+
case "PRESS_START":
|
|
15
|
+
return !!rule.onStartPress;
|
|
16
|
+
case "SHORT":
|
|
17
|
+
return !!rule.onEndShortPress;
|
|
18
|
+
case "LONG_ONGOING":
|
|
19
|
+
return !!rule.onDuringLongPress;
|
|
20
|
+
case "LONG":
|
|
21
|
+
return (!!rule.onEndLongPress && buttonState.actionDuration >= (parseInt(rule.minLongPressDuration) || 0));
|
|
22
|
+
default:
|
|
23
|
+
return false;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
|
|
5
27
|
function HueButtons(config)
|
|
6
28
|
{
|
|
7
29
|
RED.nodes.createNode(this, config);
|
|
@@ -16,6 +38,9 @@ module.exports = function(RED)
|
|
|
16
38
|
// SAVE LAST COMMAND
|
|
17
39
|
this.lastCommand = null;
|
|
18
40
|
|
|
41
|
+
// SAVE THE LAST STATE OF EVERY DEVICE AND BUTTON
|
|
42
|
+
scope.buttonLastStates = {};
|
|
43
|
+
|
|
19
44
|
//
|
|
20
45
|
// CLOSE NODE
|
|
21
46
|
this.on('close', function()
|
|
@@ -57,6 +82,54 @@ module.exports = function(RED)
|
|
|
57
82
|
{
|
|
58
83
|
const hasEvent = (currentState.payload.button !== false || currentState.payload.rotation !== false);
|
|
59
84
|
|
|
85
|
+
// TRACK THE STATE OF THE PRESSED BUTTON, WHICH GIVES THE ADDITIONAL OUTPUTS THEIR PRESS DURATION
|
|
86
|
+
let buttonState = {};
|
|
87
|
+
|
|
88
|
+
if(currentState.payload.button !== false)
|
|
89
|
+
{
|
|
90
|
+
// EVERY DEVICE NUMBERS ITS BUTTONS FROM 1, SO THE STATE HAS TO BE KEPT PER DEVICE AND BUTTON
|
|
91
|
+
const buttonKey = info.id + ":" + currentState.payload.button;
|
|
92
|
+
buttonState = scope.buttonLastStates[buttonKey] || {};
|
|
93
|
+
|
|
94
|
+
switch (currentState.payload.action)
|
|
95
|
+
{
|
|
96
|
+
case "initial_press":
|
|
97
|
+
// START OF A SHORT OR A LONG PRESS
|
|
98
|
+
buttonState = { actionType: "PRESS_START", actionStart: Date.now() };
|
|
99
|
+
break;
|
|
100
|
+
|
|
101
|
+
case "long_press":
|
|
102
|
+
case "repeat":
|
|
103
|
+
// THE BRIDGE SENDS THIS EVENT EVERY 0.5 SECONDS WHILE THE BUTTON IS STILL HELD DOWN
|
|
104
|
+
buttonState.actionType = "LONG_ONGOING";
|
|
105
|
+
buttonState.actionEnd = Date.now();
|
|
106
|
+
break;
|
|
107
|
+
|
|
108
|
+
case "short_release":
|
|
109
|
+
case "double_short_release":
|
|
110
|
+
// PRESS SHORTER THAN 0.5 SECONDS
|
|
111
|
+
buttonState.actionType = "SHORT";
|
|
112
|
+
buttonState.actionStart = Date.now();
|
|
113
|
+
buttonState.actionEnd = Date.now();
|
|
114
|
+
break;
|
|
115
|
+
|
|
116
|
+
case "long_release":
|
|
117
|
+
// RELEASE AFTER A LONG PRESS
|
|
118
|
+
buttonState.actionType = "LONG";
|
|
119
|
+
buttonState.actionEnd = Date.now();
|
|
120
|
+
break;
|
|
121
|
+
|
|
122
|
+
default:
|
|
123
|
+
// UNKNOWN ACTION, MUST NOT INHERIT THE TYPE OF THE PREVIOUS ONE
|
|
124
|
+
buttonState.actionType = false;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
buttonState.button = currentState.payload.button;
|
|
128
|
+
buttonState.actionDuration = (buttonState.actionEnd - buttonState.actionStart) || 0;
|
|
129
|
+
|
|
130
|
+
scope.buttonLastStates[buttonKey] = buttonState;
|
|
131
|
+
}
|
|
132
|
+
|
|
60
133
|
// SEND MESSAGE
|
|
61
134
|
if(!config.skipevents && hasEvent && (config.initevents || info.suppressMessage == false) && (!config.onlycommands || scope.lastCommand !== null))
|
|
62
135
|
{
|
|
@@ -66,8 +139,21 @@ module.exports = function(RED)
|
|
|
66
139
|
currentState.command = scope.lastCommand;
|
|
67
140
|
}
|
|
68
141
|
|
|
142
|
+
// COPY THE EVENT TO EVERY ADDITIONAL OUTPUT THAT ASKED FOR IT
|
|
143
|
+
let outputs = [currentState];
|
|
144
|
+
|
|
145
|
+
if(currentState.payload.button !== false)
|
|
146
|
+
{
|
|
147
|
+
const rules = Array.isArray(config.rules) ? config.rules : [];
|
|
148
|
+
|
|
149
|
+
for (let i = 0; i < rules.length; i++)
|
|
150
|
+
{
|
|
151
|
+
outputs[i+1] = matchesRule(buttonState, rules[i]) ? RED.util.cloneMessage(currentState) : null;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
|
|
69
155
|
// SEND STATE
|
|
70
|
-
scope.send(
|
|
156
|
+
scope.send(outputs);
|
|
71
157
|
|
|
72
158
|
// RESET LAST COMMAND
|
|
73
159
|
scope.lastCommand = null;
|
|
@@ -94,6 +180,9 @@ module.exports = function(RED)
|
|
|
94
180
|
var action = "";
|
|
95
181
|
switch (currentState.payload.action)
|
|
96
182
|
{
|
|
183
|
+
case "initial_press":
|
|
184
|
+
action = "action-started";
|
|
185
|
+
break;
|
|
97
186
|
case "repeat":
|
|
98
187
|
action = "action-repeated";
|
|
99
188
|
break;
|
|
@@ -113,7 +202,10 @@ module.exports = function(RED)
|
|
|
113
202
|
action = "action-pressed";
|
|
114
203
|
}
|
|
115
204
|
|
|
116
|
-
|
|
205
|
+
// THE DURATION IS ONLY KNOWN WHILE AND AFTER A BUTTON WAS HELD DOWN
|
|
206
|
+
statusText = (buttonState.actionDuration > 0)
|
|
207
|
+
? RED._("hue-buttons.node.button-status-duration", { button: currentState.payload.button, action: RED._("hue-buttons.node." + action), duration: (buttonState.actionDuration / 1000).toFixed(1) })
|
|
208
|
+
: RED._("hue-buttons.node.button-status", { button: currentState.payload.button, action: RED._("hue-buttons.node." + action) });
|
|
117
209
|
}
|
|
118
210
|
|
|
119
211
|
scope.status({fill: "blue", shape: "dot", text: statusText });
|
|
@@ -7,6 +7,8 @@ Wählen Sie die vorkonfigurierte Hue Bridge und klicken Sie auf die Suchschaltfl
|
|
|
7
7
|
|
|
8
8
|
Wenn Sie keinen Schalter auswählen und die Node-Konfiguration so anwenden, arbeitet der Node im sogenannten „Universalmodus“. In diesem Modus empfängt der Node alle Statusmitteilungen desselben Typs und gibt diese aus.
|
|
9
9
|
|
|
10
|
+
Unter „Zusätzliche Ausgänge“ können Sie pro Tastenbereich einen Ausgang hinzufügen, der jeweils durch eine bestimmte Aktion ausgelöst wird (Beginn eines Drucks, Ende eines kurzen Drucks, Ende eines langen Drucks, sobald dieser mindestens die eingestellte Dauer erreicht hat, oder wiederholt, während ein langer Druck andauert). Der erste Ausgang des Nodes erhält wie bisher immer jedes Ereignis; die zusätzlichen Ausgänge erhalten nur dann eine Kopie der Nachricht, wenn sowohl der Tastenbereich als auch die Aktion übereinstimmen.
|
|
11
|
+
|
|
10
12
|
### Status abrufen
|
|
11
13
|
|
|
12
14
|
Gibt den aktuellen Status des Schalters aus, sobald ein `msg.payload`-Objekt mit folgendem Inhalt an den Node übergeben wurde. Sie können alternativ auch den Button in der Node-RED-Oberfläche betätigen, ohne vorher eine Nachricht an den Node übergeben zu müssen.
|
|
@@ -12,7 +12,25 @@
|
|
|
12
12
|
"button": "Button",
|
|
13
13
|
"universalevents": "Universelle Ereignisse",
|
|
14
14
|
"universalevents-node": "Empfängt alle Nachrichten von anderen Nodes des gleichen Typs (nur im Universalmodus)",
|
|
15
|
-
"bridge": "Bridge"
|
|
15
|
+
"bridge": "Bridge",
|
|
16
|
+
"add-outputs": "Zusätzliche Ausgänge...",
|
|
17
|
+
"add-outputs-range": "Tastenbereich...",
|
|
18
|
+
"add-outputs-newflow": "Neuen Ablauf auslösen bei...",
|
|
19
|
+
"add-outputs-nr": "Ausgang Nr.",
|
|
20
|
+
"add-outputs-btn-from": "Von...",
|
|
21
|
+
"add-outputs-btn-to": "Bis...",
|
|
22
|
+
"add-outputs-startpress": "Druck beginnt",
|
|
23
|
+
"add-outputs-shortpress": "Kurzer Druck beendet",
|
|
24
|
+
"add-outputs-longpress": "Langer Druck beendet nach >",
|
|
25
|
+
"add-outputs-longpresswhile": "Langer Druck (während gedrückt)",
|
|
26
|
+
"add-outputs-btn-addnew": "neuen Tastenbereich hinzufügen",
|
|
27
|
+
"outputlabel-btn-from": "Taste #__from__",
|
|
28
|
+
"outputlabel-btn-from-to": "Tasten #__from__ bis #__to__",
|
|
29
|
+
"outputlabel-btn-on": "bei:",
|
|
30
|
+
"outputlabel-btn-startpress": "Druck beginnt",
|
|
31
|
+
"outputlabel-btn-shortpress": "Kurzer Druck beendet",
|
|
32
|
+
"outputlabel-btn-longpress": "Langer Druck (>__duration__s)",
|
|
33
|
+
"outputlabel-btn-longpresswhile": "Langer Druck (während gedrückt)"
|
|
16
34
|
},
|
|
17
35
|
"node": {
|
|
18
36
|
"title": "Hue Buttons",
|
|
@@ -32,9 +50,11 @@
|
|
|
32
50
|
"action-longreleased": "lang gedrückt",
|
|
33
51
|
"action-repeated": "wiederholt",
|
|
34
52
|
"action-doublepressed": "doppelt gedrückt",
|
|
53
|
+
"action-started": "Druck begonnen",
|
|
35
54
|
"dial-clockwise": "Drehrad ↻ __degrees__°",
|
|
36
55
|
"dial-counterclockwise": "Drehrad ↺ __degrees__°",
|
|
37
56
|
"button-status": "Taste #__button__ (__action__)",
|
|
57
|
+
"button-status-duration": "Taste #__button__ (__action__, __duration__s)",
|
|
38
58
|
"error-no-switchmode": "Dieses Gerät hat keinen einstellbaren Schaltermodus.",
|
|
39
59
|
"error-invalid-switchmode": "Ungültiger Schaltermodus. Dieses Gerät unterstützt: __modes__"
|
|
40
60
|
}
|
|
@@ -7,6 +7,8 @@
|
|
|
7
7
|
|
|
8
8
|
Αν δεν επιλέξετε διακόπτη ή κουμπί και χρησιμοποιήσετε έτσι τις ρυθμίσεις του κόμβου, ο κόμβος λειτουργεί στη λεγόμενη «καθολική λειτουργία». Σε αυτήν τη λειτουργία ο κόμβος λαμβάνει και εκπέμπει όλα τα μηνύματα κατάστασης ίδιου τύπου.
|
|
9
9
|
|
|
10
|
+
Στο πεδίο «Πρόσθετες έξοδοι» μπορείτε να προσθέσετε μία έξοδο ανά εύρος κουμπιών, η καθεμία ενεργοποιούμενη από μια συγκεκριμένη ενέργεια (έναρξη πατήματος, τέλος σύντομου πατήματος, τέλος παρατεταμένου πατήματος όταν έχει διαρκέσει τουλάχιστον όσο η ρυθμισμένη διάρκεια, ή επαναλαμβανόμενα ενόσω το παρατεταμένο πάτημα βρίσκεται σε εξέλιξη). Η πρώτη έξοδος του κόμβου λαμβάνει πάντα κάθε συμβάν, όπως και πριν· οι πρόσθετες έξοδοι λαμβάνουν αντίγραφο του μηνύματος μόνο όταν ταιριάζουν τόσο το εύρος κουμπιών όσο και η ενέργεια.
|
|
11
|
+
|
|
10
12
|
### Ανάκτηση κατάστασης
|
|
11
13
|
|
|
12
14
|
Εξάγει την τρέχουσα κατάσταση του διακόπτη ή του κουμπιού μόλις σταλεί στον κόμβο ένα αντικείμενο `msg.payload` με το παρακάτω περιεχόμενο. Εναλλακτικά μπορείτε να πατήσετε το κουμπί στο περιβάλλον του Node-RED, χωρίς να χρειάζεται να στείλετε πρώτα μήνυμα στον κόμβο.
|
|
@@ -12,7 +12,25 @@
|
|
|
12
12
|
"input-name": "Όνομα κουμπιού",
|
|
13
13
|
"searching": "Αναζήτηση Hue Buttons…",
|
|
14
14
|
"none-found": "Δεν βρέθηκε κανένα Hue Button!",
|
|
15
|
-
"button": "Κουμπί"
|
|
15
|
+
"button": "Κουμπί",
|
|
16
|
+
"add-outputs": "Πρόσθετες έξοδοι...",
|
|
17
|
+
"add-outputs-range": "Εύρος κουμπιών...",
|
|
18
|
+
"add-outputs-newflow": "Ενεργοποίηση νέας ροής σε...",
|
|
19
|
+
"add-outputs-nr": "Έξοδος αρ.",
|
|
20
|
+
"add-outputs-btn-from": "Από...",
|
|
21
|
+
"add-outputs-btn-to": "Έως...",
|
|
22
|
+
"add-outputs-startpress": "Έναρξη πατήματος",
|
|
23
|
+
"add-outputs-shortpress": "Τέλος σύντομου πατήματος",
|
|
24
|
+
"add-outputs-longpress": "Τέλος παρατεταμένου πατήματος όταν >",
|
|
25
|
+
"add-outputs-longpresswhile": "Παρατεταμένο πάτημα (ενόσω πατημένο)",
|
|
26
|
+
"add-outputs-btn-addnew": "προσθήκη νέου εύρους κουμπιών",
|
|
27
|
+
"outputlabel-btn-from": "κουμπί #__from__",
|
|
28
|
+
"outputlabel-btn-from-to": "κουμπιά #__from__ έως #__to__",
|
|
29
|
+
"outputlabel-btn-on": "σε:",
|
|
30
|
+
"outputlabel-btn-startpress": "Έναρξη πατήματος",
|
|
31
|
+
"outputlabel-btn-shortpress": "Τέλος σύντομου πατήματος",
|
|
32
|
+
"outputlabel-btn-longpress": "Παρατεταμένο πάτημα (>__duration__s)",
|
|
33
|
+
"outputlabel-btn-longpresswhile": "Παρατεταμένο πάτημα (ενόσω πατημένο)"
|
|
16
34
|
},
|
|
17
35
|
"node": {
|
|
18
36
|
"not-configured": "μη ρυθμισμένο",
|
|
@@ -28,9 +46,11 @@
|
|
|
28
46
|
"action-longreleased": "απελευθέρωση μετά από παρατεταμένο πάτημα",
|
|
29
47
|
"action-repeated": "επαναλήφθηκε",
|
|
30
48
|
"action-doublepressed": "διπλό πάτημα",
|
|
49
|
+
"action-started": "έναρξη πατήματος",
|
|
31
50
|
"dial-clockwise": "Επιλογέας ↻ __degrees__°",
|
|
32
51
|
"dial-counterclockwise": "Επιλογέας ↺ __degrees__°",
|
|
33
52
|
"button-status": "Κουμπί #__button__ (__action__)",
|
|
53
|
+
"button-status-duration": "Κουμπί #__button__ (__action__, __duration__s)",
|
|
34
54
|
"input": "ερώτημα κατάστασης",
|
|
35
55
|
"output": "πατημένο κουμπί",
|
|
36
56
|
"error-no-id": "Δώστε ένα έγκυρο αναγνωριστικό (διακόπτη).",
|
|
@@ -7,6 +7,8 @@ Select the pre-configured Hue Bridge and hit the search button to find all the a
|
|
|
7
7
|
|
|
8
8
|
If you do not select a switch/button and use the node configuration in this way, the node works in the so-called "universal mode". In this mode, the node receives and outputs all status messages of the same type.
|
|
9
9
|
|
|
10
|
+
Under "Additional outputs" you can add one output per range of buttons, each triggered by a specific action (start of press, end of a short press, end of a long press once it lasted at least the configured duration, or repeatedly while a long press is ongoing). The first output of the node always receives every event, exactly as before; the additional outputs only receive a copy of the message when both the button range and the action match.
|
|
11
|
+
|
|
10
12
|
### Get status
|
|
11
13
|
|
|
12
14
|
Outputs the current status of the switch/button as soon as a `msg.payload` object with the following content has been passed to the node. Alternatively, you can also press the button in the Node-RED interface without having to pass a message to the node beforehand.
|
|
@@ -12,7 +12,25 @@
|
|
|
12
12
|
"button": "Button",
|
|
13
13
|
"universalevents": "Universal Events",
|
|
14
14
|
"universalevents-node": "Receives all messages from other nodes of the same type (only in universal mode)",
|
|
15
|
-
"bridge": "Bridge"
|
|
15
|
+
"bridge": "Bridge",
|
|
16
|
+
"add-outputs": "Additional outputs...",
|
|
17
|
+
"add-outputs-range": "Buttons range...",
|
|
18
|
+
"add-outputs-newflow": "Trigger a new flow on...",
|
|
19
|
+
"add-outputs-nr": "Output n°",
|
|
20
|
+
"add-outputs-btn-from": "From...",
|
|
21
|
+
"add-outputs-btn-to": "To...",
|
|
22
|
+
"add-outputs-startpress": "Start press",
|
|
23
|
+
"add-outputs-shortpress": "Short press ended",
|
|
24
|
+
"add-outputs-longpress": "Long press ended when >",
|
|
25
|
+
"add-outputs-longpresswhile": "Long press (while pressed)",
|
|
26
|
+
"add-outputs-btn-addnew": "add new buttons range",
|
|
27
|
+
"outputlabel-btn-from": "button #__from__",
|
|
28
|
+
"outputlabel-btn-from-to": "buttons #__from__ to #__to__",
|
|
29
|
+
"outputlabel-btn-on": "on :",
|
|
30
|
+
"outputlabel-btn-startpress": "Start press",
|
|
31
|
+
"outputlabel-btn-shortpress": "Short press ended",
|
|
32
|
+
"outputlabel-btn-longpress": "Long press (>__duration__s)",
|
|
33
|
+
"outputlabel-btn-longpresswhile": "Long press (while pressed)"
|
|
16
34
|
},
|
|
17
35
|
"node": {
|
|
18
36
|
"title": "Hue Buttons",
|
|
@@ -32,9 +50,11 @@
|
|
|
32
50
|
"error-not-available": "The button/switch is not yet available. Please wait until HueMagic has established a connection with the bridge or check whether the resource ID in the configuration is valid.",
|
|
33
51
|
"action-repeated": "repeated",
|
|
34
52
|
"action-doublepressed": "double pressed",
|
|
53
|
+
"action-started": "press started",
|
|
35
54
|
"dial-clockwise": "Dial ↻ __degrees__°",
|
|
36
55
|
"dial-counterclockwise": "Dial ↺ __degrees__°",
|
|
37
56
|
"button-status": "Button #__button__ (__action__)",
|
|
57
|
+
"button-status-duration": "Button #__button__ (__action__, __duration__s)",
|
|
38
58
|
"error-no-switchmode": "This device has no configurable switch mode.",
|
|
39
59
|
"error-invalid-switchmode": "Invalid switch mode. This device supports: __modes__"
|
|
40
60
|
}
|
|
@@ -7,6 +7,8 @@ Seleccione el Hue Bridge preconfigurado y haga clic en el botón de búsqueda pa
|
|
|
7
7
|
|
|
8
8
|
Si no selecciona ningún interruptor o botón y utiliza así la configuración del nodo, el nodo funciona en el llamado «modo universal». En este modo, el nodo recibe y emite todos los mensajes de estado del mismo tipo.
|
|
9
9
|
|
|
10
|
+
En «Salidas adicionales» puede añadir una salida por cada rango de botones, activada cada una por una acción concreta (inicio de la pulsación, fin de una pulsación corta, fin de una pulsación larga una vez alcanzada la duración configurada, o de forma repetida mientras la pulsación larga está en curso). La primera salida del nodo sigue recibiendo siempre todos los eventos, como antes; las salidas adicionales solo reciben una copia del mensaje cuando coinciden tanto el rango de botones como la acción.
|
|
11
|
+
|
|
10
12
|
### Consultar el estado
|
|
11
13
|
|
|
12
14
|
Emite el estado actual del interruptor o botón en cuanto se transfiere al nodo un objeto `msg.payload` con el siguiente contenido. Como alternativa, también puede pulsar el botón en la interfaz de Node-RED sin tener que enviar antes ningún mensaje al nodo.
|
|
@@ -12,7 +12,25 @@
|
|
|
12
12
|
"input-name": "Nombre del botón",
|
|
13
13
|
"searching": "Buscando Hue Buttons…",
|
|
14
14
|
"none-found": "¡No se ha encontrado ningún Hue Button!",
|
|
15
|
-
"button": "Botón"
|
|
15
|
+
"button": "Botón",
|
|
16
|
+
"add-outputs": "Salidas adicionales...",
|
|
17
|
+
"add-outputs-range": "Rango de botones...",
|
|
18
|
+
"add-outputs-newflow": "Activar un nuevo flujo en...",
|
|
19
|
+
"add-outputs-nr": "Salida n.°",
|
|
20
|
+
"add-outputs-btn-from": "Desde...",
|
|
21
|
+
"add-outputs-btn-to": "Hasta...",
|
|
22
|
+
"add-outputs-startpress": "Inicio de la pulsación",
|
|
23
|
+
"add-outputs-shortpress": "Fin de pulsación corta",
|
|
24
|
+
"add-outputs-longpress": "Fin de pulsación larga cuando >",
|
|
25
|
+
"add-outputs-longpresswhile": "Pulsación larga (mientras se mantiene)",
|
|
26
|
+
"add-outputs-btn-addnew": "añadir nuevo rango de botones",
|
|
27
|
+
"outputlabel-btn-from": "botón #__from__",
|
|
28
|
+
"outputlabel-btn-from-to": "botones #__from__ a #__to__",
|
|
29
|
+
"outputlabel-btn-on": "en:",
|
|
30
|
+
"outputlabel-btn-startpress": "Inicio de la pulsación",
|
|
31
|
+
"outputlabel-btn-shortpress": "Fin de pulsación corta",
|
|
32
|
+
"outputlabel-btn-longpress": "Pulsación larga (>__duration__s)",
|
|
33
|
+
"outputlabel-btn-longpresswhile": "Pulsación larga (mientras se mantiene)"
|
|
16
34
|
},
|
|
17
35
|
"node": {
|
|
18
36
|
"not-configured": "sin configurar",
|
|
@@ -28,9 +46,11 @@
|
|
|
28
46
|
"action-longreleased": "soltado tras mantener",
|
|
29
47
|
"action-repeated": "repetido",
|
|
30
48
|
"action-doublepressed": "pulsado dos veces",
|
|
49
|
+
"action-started": "inicio de pulsación",
|
|
31
50
|
"dial-clockwise": "Rueda ↻ __degrees__°",
|
|
32
51
|
"dial-counterclockwise": "Rueda ↺ __degrees__°",
|
|
33
52
|
"button-status": "Botón n.º __button__ (__action__)",
|
|
53
|
+
"button-status-duration": "Botón n.º __button__ (__action__, __duration__s)",
|
|
34
54
|
"input": "consulta de estado",
|
|
35
55
|
"output": "botón pulsado",
|
|
36
56
|
"error-no-id": "Indique un ID de interruptor válido.",
|
|
@@ -7,6 +7,8 @@ Sélectionnez le Hue Bridge préconfiguré et cliquez sur le bouton de recherche
|
|
|
7
7
|
|
|
8
8
|
Si vous ne sélectionnez aucun interrupteur ou bouton et utilisez la configuration du nœud de cette manière, le nœud fonctionne dans ce que l'on appelle le « mode universel ». Dans ce mode, le nœud reçoit et émet tous les messages de statut du même type.
|
|
9
9
|
|
|
10
|
+
Dans « Sorties supplémentaires », vous pouvez ajouter une sortie par plage de boutons, chacune déclenchée par une action précise (début de l'appui, fin d'un appui court, fin d'un appui long une fois qu'il a duré au moins la durée configurée, ou de façon répétée pendant qu'un appui long est en cours). La première sortie du nœud reçoit toujours chaque événement, comme auparavant ; les sorties supplémentaires ne reçoivent une copie du message que lorsque la plage de boutons et l'action correspondent toutes les deux.
|
|
11
|
+
|
|
10
12
|
### Interroger le statut
|
|
11
13
|
|
|
12
14
|
Émet le statut actuel de l'interrupteur ou du bouton dès qu'un objet `msg.payload` ayant le contenu suivant est transmis au nœud. Vous pouvez également appuyer sur le bouton dans l'interface Node-RED sans avoir à transmettre au préalable un message au nœud.
|
|
@@ -12,7 +12,25 @@
|
|
|
12
12
|
"input-name": "Nom du bouton",
|
|
13
13
|
"searching": "Recherche de Hue Buttons…",
|
|
14
14
|
"none-found": "Aucun Hue Button trouvé !",
|
|
15
|
-
"button": "Bouton"
|
|
15
|
+
"button": "Bouton",
|
|
16
|
+
"add-outputs": "Sorties supplémentaires...",
|
|
17
|
+
"add-outputs-range": "Plage de boutons...",
|
|
18
|
+
"add-outputs-newflow": "Déclencher un nouveau flux sur...",
|
|
19
|
+
"add-outputs-nr": "Sortie n°",
|
|
20
|
+
"add-outputs-btn-from": "De...",
|
|
21
|
+
"add-outputs-btn-to": "À...",
|
|
22
|
+
"add-outputs-startpress": "Début de l'appui",
|
|
23
|
+
"add-outputs-shortpress": "Fin d'appui court",
|
|
24
|
+
"add-outputs-longpress": "Fin d'appui long quand >",
|
|
25
|
+
"add-outputs-longpresswhile": "Appui long (pendant le maintien)",
|
|
26
|
+
"add-outputs-btn-addnew": "ajouter une nouvelle plage de boutons",
|
|
27
|
+
"outputlabel-btn-from": "bouton #__from__",
|
|
28
|
+
"outputlabel-btn-from-to": "boutons #__from__ à #__to__",
|
|
29
|
+
"outputlabel-btn-on": "sur :",
|
|
30
|
+
"outputlabel-btn-startpress": "Début de l'appui",
|
|
31
|
+
"outputlabel-btn-shortpress": "Fin d'appui court",
|
|
32
|
+
"outputlabel-btn-longpress": "Appui long (>__duration__s)",
|
|
33
|
+
"outputlabel-btn-longpresswhile": "Appui long (pendant le maintien)"
|
|
16
34
|
},
|
|
17
35
|
"node": {
|
|
18
36
|
"not-configured": "non configuré",
|
|
@@ -28,9 +46,11 @@
|
|
|
28
46
|
"action-longreleased": "relâché après maintien",
|
|
29
47
|
"action-repeated": "répété",
|
|
30
48
|
"action-doublepressed": "double appui",
|
|
49
|
+
"action-started": "début d'appui",
|
|
31
50
|
"dial-clockwise": "Molette ↻ __degrees__°",
|
|
32
51
|
"dial-counterclockwise": "Molette ↺ __degrees__°",
|
|
33
52
|
"button-status": "Bouton n° __button__ (__action__)",
|
|
53
|
+
"button-status-duration": "Bouton n° __button__ (__action__, __duration__s)",
|
|
34
54
|
"input": "interrogation du statut",
|
|
35
55
|
"output": "bouton appuyé",
|
|
36
56
|
"error-no-id": "Veuillez indiquer un ID de interrupteur valide.",
|
|
@@ -7,6 +7,8 @@ Selezioni il Hue Bridge preconfigurato e faccia clic sul pulsante di ricerca per
|
|
|
7
7
|
|
|
8
8
|
Se non seleziona alcun interruttore o pulsante e utilizza così la configurazione del nodo, il nodo funziona nella cosiddetta «modalità universale». In questa modalità il nodo riceve ed emette tutti i messaggi di stato dello stesso tipo.
|
|
9
9
|
|
|
10
|
+
In «Uscite aggiuntive» può aggiungere un'uscita per ogni intervallo di pulsanti, ciascuna attivata da un'azione specifica (inizio della pressione, fine di una pressione breve, fine di una pressione prolungata una volta raggiunta la durata configurata, oppure ripetutamente mentre una pressione prolungata è in corso). La prima uscita del nodo continua a ricevere sempre ogni evento, come prima; le uscite aggiuntive ricevono una copia del messaggio solo quando corrispondono sia l'intervallo di pulsanti sia l'azione.
|
|
11
|
+
|
|
10
12
|
### Richiedere lo stato
|
|
11
13
|
|
|
12
14
|
Emette lo stato attuale dell'interruttore o del pulsante non appena al nodo viene trasmesso un oggetto `msg.payload` con il seguente contenuto. In alternativa può anche premere il pulsante nell'interfaccia di Node-RED senza dover inviare prima un messaggio al nodo.
|
|
@@ -12,7 +12,25 @@
|
|
|
12
12
|
"input-name": "Nome del pulsante",
|
|
13
13
|
"searching": "Ricerca di Hue Buttons…",
|
|
14
14
|
"none-found": "Nessun Hue Button trovato!",
|
|
15
|
-
"button": "Pulsante"
|
|
15
|
+
"button": "Pulsante",
|
|
16
|
+
"add-outputs": "Uscite aggiuntive...",
|
|
17
|
+
"add-outputs-range": "Intervallo di pulsanti...",
|
|
18
|
+
"add-outputs-newflow": "Attiva un nuovo flusso su...",
|
|
19
|
+
"add-outputs-nr": "Uscita n.",
|
|
20
|
+
"add-outputs-btn-from": "Da...",
|
|
21
|
+
"add-outputs-btn-to": "A...",
|
|
22
|
+
"add-outputs-startpress": "Inizio pressione",
|
|
23
|
+
"add-outputs-shortpress": "Fine pressione breve",
|
|
24
|
+
"add-outputs-longpress": "Fine pressione prolungata quando >",
|
|
25
|
+
"add-outputs-longpresswhile": "Pressione prolungata (mentre premuto)",
|
|
26
|
+
"add-outputs-btn-addnew": "aggiungi nuovo intervallo di pulsanti",
|
|
27
|
+
"outputlabel-btn-from": "pulsante #__from__",
|
|
28
|
+
"outputlabel-btn-from-to": "pulsanti #__from__ - #__to__",
|
|
29
|
+
"outputlabel-btn-on": "su:",
|
|
30
|
+
"outputlabel-btn-startpress": "Inizio pressione",
|
|
31
|
+
"outputlabel-btn-shortpress": "Fine pressione breve",
|
|
32
|
+
"outputlabel-btn-longpress": "Pressione prolungata (>__duration__s)",
|
|
33
|
+
"outputlabel-btn-longpresswhile": "Pressione prolungata (mentre premuto)"
|
|
16
34
|
},
|
|
17
35
|
"node": {
|
|
18
36
|
"not-configured": "non configurato",
|
|
@@ -28,9 +46,11 @@
|
|
|
28
46
|
"action-longreleased": "rilasciato dopo pressione prolungata",
|
|
29
47
|
"action-repeated": "ripetuto",
|
|
30
48
|
"action-doublepressed": "premuto due volte",
|
|
49
|
+
"action-started": "inizio pressione",
|
|
31
50
|
"dial-clockwise": "Rotella ↻ __degrees__°",
|
|
32
51
|
"dial-counterclockwise": "Rotella ↺ __degrees__°",
|
|
33
52
|
"button-status": "Pulsante n. __button__ (__action__)",
|
|
53
|
+
"button-status-duration": "Pulsante n. __button__ (__action__, __duration__s)",
|
|
34
54
|
"input": "richiesta di stato",
|
|
35
55
|
"output": "pulsante premuto",
|
|
36
56
|
"error-no-id": "Indichi un ID interruttore valido.",
|
|
@@ -7,6 +7,8 @@ Selecteer de vooraf geconfigureerde Hue Bridge en klik op de zoekknop om alle be
|
|
|
7
7
|
|
|
8
8
|
Als u geen schakelaar of knop selecteert en de nodeconfiguratie zo gebruikt, werkt de node in de zogenoemde "universele modus". In deze modus ontvangt en verstuurt de node alle statusberichten van hetzelfde type.
|
|
9
9
|
|
|
10
|
+
Onder "Extra uitgangen" kunt u per knoppenbereik een uitgang toevoegen, elk geactiveerd door een specifieke actie (begin van indrukken, einde van kort indrukken, einde van lang indrukken zodra dit minstens de ingestelde duur heeft geduurd, of herhaaldelijk terwijl lang indrukken bezig is). De eerste uitgang van de node ontvangt zoals voorheen altijd elke gebeurtenis; de extra uitgangen ontvangen alleen een kopie van het bericht wanneer zowel het knoppenbereik als de actie overeenkomen.
|
|
11
|
+
|
|
10
12
|
### Status opvragen
|
|
11
13
|
|
|
12
14
|
Geeft de huidige status van de schakelaar of knop uit zodra een `msg.payload`-object met de volgende inhoud aan de node is doorgegeven. U kunt ook op de knop in de Node-RED-interface drukken zonder eerst een bericht naar de node te sturen.
|
|
@@ -12,7 +12,25 @@
|
|
|
12
12
|
"input-name": "Naam van de knop",
|
|
13
13
|
"searching": "Hue Buttons zoeken…",
|
|
14
14
|
"none-found": "Geen Hue Button gevonden!",
|
|
15
|
-
"button": "Knop"
|
|
15
|
+
"button": "Knop",
|
|
16
|
+
"add-outputs": "Extra uitgangen...",
|
|
17
|
+
"add-outputs-range": "Knoppenbereik...",
|
|
18
|
+
"add-outputs-newflow": "Nieuwe flow starten bij...",
|
|
19
|
+
"add-outputs-nr": "Uitgang nr.",
|
|
20
|
+
"add-outputs-btn-from": "Van...",
|
|
21
|
+
"add-outputs-btn-to": "Tot...",
|
|
22
|
+
"add-outputs-startpress": "Begin van indrukken",
|
|
23
|
+
"add-outputs-shortpress": "Kort indrukken beëindigd",
|
|
24
|
+
"add-outputs-longpress": "Lang indrukken beëindigd wanneer >",
|
|
25
|
+
"add-outputs-longpresswhile": "Lang indrukken (terwijl ingedrukt)",
|
|
26
|
+
"add-outputs-btn-addnew": "nieuw knoppenbereik toevoegen",
|
|
27
|
+
"outputlabel-btn-from": "knop #__from__",
|
|
28
|
+
"outputlabel-btn-from-to": "knoppen #__from__ t/m #__to__",
|
|
29
|
+
"outputlabel-btn-on": "bij:",
|
|
30
|
+
"outputlabel-btn-startpress": "Begin van indrukken",
|
|
31
|
+
"outputlabel-btn-shortpress": "Kort indrukken beëindigd",
|
|
32
|
+
"outputlabel-btn-longpress": "Lang indrukken (>__duration__s)",
|
|
33
|
+
"outputlabel-btn-longpresswhile": "Lang indrukken (terwijl ingedrukt)"
|
|
16
34
|
},
|
|
17
35
|
"node": {
|
|
18
36
|
"not-configured": "niet geconfigureerd",
|
|
@@ -28,9 +46,11 @@
|
|
|
28
46
|
"action-longreleased": "losgelaten na vasthouden",
|
|
29
47
|
"action-repeated": "herhaald",
|
|
30
48
|
"action-doublepressed": "dubbel ingedrukt",
|
|
49
|
+
"action-started": "begin van indrukken",
|
|
31
50
|
"dial-clockwise": "Draaiknop ↻ __degrees__°",
|
|
32
51
|
"dial-counterclockwise": "Draaiknop ↺ __degrees__°",
|
|
33
52
|
"button-status": "Knop nr. __button__ (__action__)",
|
|
53
|
+
"button-status-duration": "Knop nr. __button__ (__action__, __duration__s)",
|
|
34
54
|
"input": "statusopvraging",
|
|
35
55
|
"output": "ingedrukte knop",
|
|
36
56
|
"error-no-id": "Geef een geldig schakelaar-ID op.",
|
|
@@ -7,6 +7,8 @@ Wybierz skonfigurowany Hue Bridge i kliknij przycisk wyszukiwania, aby znaleźć
|
|
|
7
7
|
|
|
8
8
|
Jeśli nie wybierzesz przełącznika ani przycisku i użyjesz konfiguracji węzła w ten sposób, węzeł działa w tzw. „trybie uniwersalnym”. W tym trybie węzeł odbiera i wysyła wszystkie komunikaty stanu tego samego typu.
|
|
9
9
|
|
|
10
|
+
W sekcji „Dodatkowe wyjścia” możesz dodać jedno wyjście na każdy zakres przycisków, z których każde jest wyzwalane przez określone działanie (początek naciśnięcia, koniec krótkiego naciśnięcia, koniec długiego naciśnięcia po osiągnięciu skonfigurowanego czasu trwania, lub cyklicznie podczas trwania długiego naciśnięcia). Pierwsze wyjście węzła nadal zawsze otrzymuje każde zdarzenie, tak jak dotychczas; dodatkowe wyjścia otrzymują kopię komunikatu tylko wtedy, gdy pasują zarówno zakres przycisków, jak i działanie.
|
|
11
|
+
|
|
10
12
|
### Odczyt stanu
|
|
11
13
|
|
|
12
14
|
Zwraca bieżący stan przełącznika lub przycisku, gdy tylko do węzła zostanie przekazany obiekt `msg.payload` o następującej zawartości. Możesz też nacisnąć przycisk w interfejsie Node-RED, bez wcześniejszego wysyłania komunikatu do węzła.
|
|
@@ -12,7 +12,25 @@
|
|
|
12
12
|
"input-name": "Nazwa przycisku",
|
|
13
13
|
"searching": "Wyszukiwanie Hue Buttons…",
|
|
14
14
|
"none-found": "Nie znaleziono żadnego Hue Button!",
|
|
15
|
-
"button": "Przycisk"
|
|
15
|
+
"button": "Przycisk",
|
|
16
|
+
"add-outputs": "Dodatkowe wyjścia...",
|
|
17
|
+
"add-outputs-range": "Zakres przycisków...",
|
|
18
|
+
"add-outputs-newflow": "Uruchom nowy przepływ przy...",
|
|
19
|
+
"add-outputs-nr": "Wyjście nr",
|
|
20
|
+
"add-outputs-btn-from": "Od...",
|
|
21
|
+
"add-outputs-btn-to": "Do...",
|
|
22
|
+
"add-outputs-startpress": "Początek naciśnięcia",
|
|
23
|
+
"add-outputs-shortpress": "Koniec krótkiego naciśnięcia",
|
|
24
|
+
"add-outputs-longpress": "Koniec długiego naciśnięcia po >",
|
|
25
|
+
"add-outputs-longpresswhile": "Długie naciśnięcie (podczas trzymania)",
|
|
26
|
+
"add-outputs-btn-addnew": "dodaj nowy zakres przycisków",
|
|
27
|
+
"outputlabel-btn-from": "przycisk #__from__",
|
|
28
|
+
"outputlabel-btn-from-to": "przyciski #__from__ do #__to__",
|
|
29
|
+
"outputlabel-btn-on": "przy:",
|
|
30
|
+
"outputlabel-btn-startpress": "Początek naciśnięcia",
|
|
31
|
+
"outputlabel-btn-shortpress": "Koniec krótkiego naciśnięcia",
|
|
32
|
+
"outputlabel-btn-longpress": "Długie naciśnięcie (>__duration__s)",
|
|
33
|
+
"outputlabel-btn-longpresswhile": "Długie naciśnięcie (podczas trzymania)"
|
|
16
34
|
},
|
|
17
35
|
"node": {
|
|
18
36
|
"not-configured": "nieskonfigurowany",
|
|
@@ -28,9 +46,11 @@
|
|
|
28
46
|
"action-longreleased": "zwolniony po przytrzymaniu",
|
|
29
47
|
"action-repeated": "powtórzony",
|
|
30
48
|
"action-doublepressed": "naciśnięty dwukrotnie",
|
|
49
|
+
"action-started": "początek naciśnięcia",
|
|
31
50
|
"dial-clockwise": "Pokrętło ↻ __degrees__°",
|
|
32
51
|
"dial-counterclockwise": "Pokrętło ↺ __degrees__°",
|
|
33
52
|
"button-status": "Przycisk nr __button__ (__action__)",
|
|
53
|
+
"button-status-duration": "Przycisk nr __button__ (__action__, __duration__s)",
|
|
34
54
|
"input": "zapytanie o stan",
|
|
35
55
|
"output": "naciśnięty przycisk",
|
|
36
56
|
"error-no-id": "Podaj prawidłowy identyfikator: przełącznik.",
|
|
@@ -7,6 +7,8 @@ Selecione o Hue Bridge pré-configurado e clique no botão de pesquisa para enco
|
|
|
7
7
|
|
|
8
8
|
Se não selecionar nenhum interruptor ou botão e utilizar assim a configuração do nó, o nó funciona no chamado «modo universal». Neste modo, o nó recebe e emite todas as mensagens de estado do mesmo tipo.
|
|
9
9
|
|
|
10
|
+
Em «Saídas adicionais» pode adicionar uma saída por cada intervalo de botões, cada uma acionada por uma ação específica (início da pressão, fim de uma pressão curta, fim de uma pressão longa assim que esta tenha durado pelo menos a duração configurada, ou repetidamente enquanto uma pressão longa está em curso). A primeira saída do nó continua a receber sempre todos os eventos, tal como antes; as saídas adicionais só recebem uma cópia da mensagem quando o intervalo de botões e a ação correspondem.
|
|
11
|
+
|
|
10
12
|
### Consultar o estado
|
|
11
13
|
|
|
12
14
|
Emite o estado atual do interruptor ou botão assim que for transmitido ao nó um objeto `msg.payload` com o seguinte conteúdo. Em alternativa, também pode premir o botão na interface do Node-RED sem ter de enviar previamente uma mensagem ao nó.
|
|
@@ -12,7 +12,25 @@
|
|
|
12
12
|
"input-name": "Nome do botão",
|
|
13
13
|
"searching": "A procurar Hue Buttons…",
|
|
14
14
|
"none-found": "Nenhum Hue Button encontrado!",
|
|
15
|
-
"button": "Botão"
|
|
15
|
+
"button": "Botão",
|
|
16
|
+
"add-outputs": "Saídas adicionais...",
|
|
17
|
+
"add-outputs-range": "Intervalo de botões...",
|
|
18
|
+
"add-outputs-newflow": "Acionar um novo fluxo em...",
|
|
19
|
+
"add-outputs-nr": "Saída n.º",
|
|
20
|
+
"add-outputs-btn-from": "De...",
|
|
21
|
+
"add-outputs-btn-to": "Até...",
|
|
22
|
+
"add-outputs-startpress": "Início da pressão",
|
|
23
|
+
"add-outputs-shortpress": "Fim de pressão curta",
|
|
24
|
+
"add-outputs-longpress": "Fim de pressão longa quando >",
|
|
25
|
+
"add-outputs-longpresswhile": "Pressão longa (enquanto premido)",
|
|
26
|
+
"add-outputs-btn-addnew": "adicionar novo intervalo de botões",
|
|
27
|
+
"outputlabel-btn-from": "botão #__from__",
|
|
28
|
+
"outputlabel-btn-from-to": "botões #__from__ a #__to__",
|
|
29
|
+
"outputlabel-btn-on": "em:",
|
|
30
|
+
"outputlabel-btn-startpress": "Início da pressão",
|
|
31
|
+
"outputlabel-btn-shortpress": "Fim de pressão curta",
|
|
32
|
+
"outputlabel-btn-longpress": "Pressão longa (>__duration__s)",
|
|
33
|
+
"outputlabel-btn-longpresswhile": "Pressão longa (enquanto premido)"
|
|
16
34
|
},
|
|
17
35
|
"node": {
|
|
18
36
|
"not-configured": "não configurado",
|
|
@@ -28,9 +46,11 @@
|
|
|
28
46
|
"action-longreleased": "solto após ser mantido",
|
|
29
47
|
"action-repeated": "repetido",
|
|
30
48
|
"action-doublepressed": "premido duas vezes",
|
|
49
|
+
"action-started": "início da pressão",
|
|
31
50
|
"dial-clockwise": "Roda ↻ __degrees__°",
|
|
32
51
|
"dial-counterclockwise": "Roda ↺ __degrees__°",
|
|
33
52
|
"button-status": "Botão n.º __button__ (__action__)",
|
|
53
|
+
"button-status-duration": "Botão n.º __button__ (__action__, __duration__s)",
|
|
34
54
|
"input": "consulta de estado",
|
|
35
55
|
"output": "botão premido",
|
|
36
56
|
"error-no-id": "Indique um ID de interruptor válido.",
|
|
@@ -7,6 +7,8 @@
|
|
|
7
7
|
|
|
8
8
|
Bir anahtar veya düğme seçmez ve düğüm yapılandırmasını bu şekilde kullanırsanız, düğüm «evrensel mod» adı verilen modda çalışır. Bu modda düğüm aynı türdeki tüm durum mesajlarını alır ve yayınlar.
|
|
9
9
|
|
|
10
|
+
«Ek çıkışlar» altında her düğme aralığı için, belirli bir eylemle (basmanın başlangıcı, kısa basmanın sona ermesi, yapılandırılan süre kadar sürdükten sonra uzun basmanın sona ermesi veya uzun basma devam ederken tekrar tekrar) tetiklenen bir çıkış ekleyebilirsiniz. Düğümün ilk çıkışı öncekiyle aynı şekilde her zaman tüm olayları alır; ek çıkışlar yalnızca hem düğme aralığı hem de eylem eşleştiğinde mesajın bir kopyasını alır.
|
|
11
|
+
|
|
10
12
|
### Durumu sorgulama
|
|
11
13
|
|
|
12
14
|
Düğüme aşağıdaki içeriğe sahip bir `msg.payload` nesnesi iletildiğinde anahtarın veya düğmenin güncel durumunu verir. Alternatif olarak, önce düğüme bir mesaj göndermeden Node-RED arayüzündeki düğmeye de basabilirsiniz.
|
|
@@ -12,7 +12,25 @@
|
|
|
12
12
|
"input-name": "Düğme adı",
|
|
13
13
|
"searching": "Hue Buttons aranıyor…",
|
|
14
14
|
"none-found": "Hiç Hue Button bulunamadı!",
|
|
15
|
-
"button": "Düğme"
|
|
15
|
+
"button": "Düğme",
|
|
16
|
+
"add-outputs": "Ek çıkışlar...",
|
|
17
|
+
"add-outputs-range": "Düğme aralığı...",
|
|
18
|
+
"add-outputs-newflow": "Şunda yeni bir akış tetikle...",
|
|
19
|
+
"add-outputs-nr": "Çıkış no.",
|
|
20
|
+
"add-outputs-btn-from": "Başlangıç...",
|
|
21
|
+
"add-outputs-btn-to": "Bitiş...",
|
|
22
|
+
"add-outputs-startpress": "Basmanın başlangıcı",
|
|
23
|
+
"add-outputs-shortpress": "Kısa basma sona erdi",
|
|
24
|
+
"add-outputs-longpress": "Uzun basma sona erdiğinde >",
|
|
25
|
+
"add-outputs-longpresswhile": "Uzun basma (basılı tutulurken)",
|
|
26
|
+
"add-outputs-btn-addnew": "yeni düğme aralığı ekle",
|
|
27
|
+
"outputlabel-btn-from": "düğme #__from__",
|
|
28
|
+
"outputlabel-btn-from-to": "düğmeler #__from__ - #__to__",
|
|
29
|
+
"outputlabel-btn-on": "şurada:",
|
|
30
|
+
"outputlabel-btn-startpress": "Basmanın başlangıcı",
|
|
31
|
+
"outputlabel-btn-shortpress": "Kısa basma sona erdi",
|
|
32
|
+
"outputlabel-btn-longpress": "Uzun basma (>__duration__s)",
|
|
33
|
+
"outputlabel-btn-longpresswhile": "Uzun basma (basılı tutulurken)"
|
|
16
34
|
},
|
|
17
35
|
"node": {
|
|
18
36
|
"not-configured": "yapılandırılmadı",
|
|
@@ -28,9 +46,11 @@
|
|
|
28
46
|
"action-longreleased": "uzun basıştan sonra bırakıldı",
|
|
29
47
|
"action-repeated": "tekrarlandı",
|
|
30
48
|
"action-doublepressed": "çift basıldı",
|
|
49
|
+
"action-started": "basma başladı",
|
|
31
50
|
"dial-clockwise": "Çevirme ↻ __degrees__°",
|
|
32
51
|
"dial-counterclockwise": "Çevirme ↺ __degrees__°",
|
|
33
52
|
"button-status": "Düğme #__button__ (__action__)",
|
|
53
|
+
"button-status-duration": "Düğme #__button__ (__action__, __duration__s)",
|
|
34
54
|
"input": "durum sorgusu",
|
|
35
55
|
"output": "basılan düğme",
|
|
36
56
|
"error-no-id": "Lütfen geçerli bir anahtar kimliği girin.",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "node-red-contrib-huemagic",
|
|
3
|
-
"version": "5.0.
|
|
3
|
+
"version": "5.0.1",
|
|
4
4
|
"description": "Philips Hue nodes to control bridges, lights, groups, scenes, rules, automations, buttons, switches, dials, doorbells, speakers, motion sensors, cameras, contact sensors, temperature sensors, light level sensors and the Hue Play HDMI Sync Box using Node-RED.",
|
|
5
5
|
"author": "foddy",
|
|
6
6
|
"homepage": "https://github.com/Foddy/node-red-contrib-huemagic",
|