@mschaeffler/node-red-bthome 1.0.0 → 1.1.0
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/btevent.js +37 -12
- package/bthome.html +8 -1
- package/bthome.js +66 -8
- package/package.json +1 -1
package/btevent.js
CHANGED
|
@@ -4,15 +4,19 @@ class BtEvent {
|
|
|
4
4
|
this._events = {};
|
|
5
5
|
this._prefix = prefix;
|
|
6
6
|
}
|
|
7
|
-
pushEvent(type,event)
|
|
7
|
+
pushEvent(type,event,data=null)
|
|
8
8
|
{
|
|
9
|
+
if( event && data !== null )
|
|
10
|
+
{
|
|
11
|
+
event = `${event}|${data}`;
|
|
12
|
+
}
|
|
9
13
|
switch( typeof this._events[type] )
|
|
10
14
|
{
|
|
11
15
|
case "undefined":
|
|
12
16
|
this._events[type] = event;
|
|
13
17
|
break;
|
|
14
18
|
case "string":
|
|
15
|
-
this._events[type] = [this._events[type]];
|
|
19
|
+
this._events[type] = [ this._events[type] ];
|
|
16
20
|
// fall through
|
|
17
21
|
case "object":
|
|
18
22
|
this._events[type].push( event );
|
|
@@ -21,26 +25,47 @@ class BtEvent {
|
|
|
21
25
|
}
|
|
22
26
|
eventMessages(name)
|
|
23
27
|
{
|
|
24
|
-
|
|
28
|
+
function pushResult(type,event,index=null)
|
|
29
|
+
{
|
|
30
|
+
if( event )
|
|
31
|
+
{
|
|
32
|
+
const help = event.split( '|' );
|
|
33
|
+
let payload = { type: type, event: help[0] };
|
|
34
|
+
let topic;
|
|
35
|
+
if( index === null )
|
|
36
|
+
{
|
|
37
|
+
topic = `${prefix}${name}/${help[0]}`;
|
|
38
|
+
}
|
|
39
|
+
else
|
|
40
|
+
{
|
|
41
|
+
topic = `${prefix}${name}/${index}/${help[0]}`;
|
|
42
|
+
payload.id = index;
|
|
43
|
+
}
|
|
44
|
+
if( help[1] !== undefined )
|
|
45
|
+
{
|
|
46
|
+
payload.data = help[1];
|
|
47
|
+
}
|
|
48
|
+
result.push( {
|
|
49
|
+
topic: topic,
|
|
50
|
+
payload: payload
|
|
51
|
+
} );
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
let result = [];
|
|
56
|
+
const prefix = this._prefix;
|
|
25
57
|
for( const t in this._events )
|
|
26
58
|
{
|
|
27
59
|
const event = this._events[t];
|
|
28
60
|
if( typeof event == "string" )
|
|
29
61
|
{
|
|
30
|
-
|
|
31
|
-
{
|
|
32
|
-
result.push( { topic: `${this._prefix}${name}/${event}`, payload: { type: t, event: event } } );
|
|
33
|
-
}
|
|
62
|
+
pushResult( t, event );
|
|
34
63
|
}
|
|
35
64
|
else
|
|
36
65
|
{
|
|
37
66
|
for( const i in event )
|
|
38
67
|
{
|
|
39
|
-
|
|
40
|
-
{
|
|
41
|
-
const index = Number( i ) + 1;
|
|
42
|
-
result.push( { topic: `${this._prefix}${name}/${index}/${event[i]}`, payload: { type: t, id: index, event: event[i] } } );
|
|
43
|
-
}
|
|
68
|
+
pushResult( t, event[i], Number( i ) + 1 );
|
|
44
69
|
}
|
|
45
70
|
}
|
|
46
71
|
}
|
package/bthome.html
CHANGED
|
@@ -9,7 +9,8 @@
|
|
|
9
9
|
statusPrefix:{value:""},
|
|
10
10
|
eventPrefix:{value:""},
|
|
11
11
|
contextVar:{value:"bthome",required:true},
|
|
12
|
-
contextStore:{value:"none",required:true}
|
|
12
|
+
contextStore:{value:"none",required:true},
|
|
13
|
+
batteryState:{value:true,required:true}
|
|
13
14
|
},
|
|
14
15
|
inputs:1,
|
|
15
16
|
outputs:2,
|
|
@@ -90,6 +91,10 @@
|
|
|
90
91
|
<label for="node-input-contextVar"><i class="fa fa-database"></i> Context-Variable</label>
|
|
91
92
|
<input type="text" id="node-input-contextVar"></input>
|
|
92
93
|
</div>
|
|
94
|
+
<div class="form-row">
|
|
95
|
+
<label for="node-input-batteryState"><i class="fa fa-"></i> battery is state</label>
|
|
96
|
+
<input type="checkbox" id="node-input-batteryState" style="display:inline-block; width:20px; vertical-align:baseline;">
|
|
97
|
+
</div>
|
|
93
98
|
</script>
|
|
94
99
|
|
|
95
100
|
<script type="text/x-red" data-help-name="bthome">
|
|
@@ -181,6 +186,8 @@
|
|
|
181
186
|
<dd> name of the variable in flow context storage.</dd>
|
|
182
187
|
<dt>Contextstore <span class="property-type">string</span></dt>
|
|
183
188
|
<dd> context store to be used.</dd>
|
|
189
|
+
<dt>battery is state <span class="property-type">Boolean</span></dt>
|
|
190
|
+
<dd> battery level is included in state mesage.</dt>
|
|
184
191
|
</dl>
|
|
185
192
|
|
|
186
193
|
<h4>Device-Configuration</h4>
|
package/bthome.js
CHANGED
|
@@ -15,6 +15,7 @@ module.exports = function(RED) {
|
|
|
15
15
|
this.eventPrefix = config.eventPrefix ? config.eventPrefix +'/' : "";
|
|
16
16
|
this.contextVar = config.contextVar ?? "bthome";
|
|
17
17
|
this.contextStore = config.contextStore ?? "none";
|
|
18
|
+
this.batteryState = Boolean( config.batteryState );
|
|
18
19
|
this.data = {};
|
|
19
20
|
this.statistics = { ok:0, dup:0, old:0, err:0 };
|
|
20
21
|
node.status( "" );
|
|
@@ -113,17 +114,34 @@ module.exports = function(RED) {
|
|
|
113
114
|
decipher.final();
|
|
114
115
|
}
|
|
115
116
|
|
|
116
|
-
function
|
|
117
|
+
function decodeMsg()
|
|
117
118
|
{
|
|
118
|
-
|
|
119
|
+
let counter = {};
|
|
120
|
+
|
|
121
|
+
function setData(name,value)
|
|
119
122
|
{
|
|
120
|
-
item.data
|
|
123
|
+
if( item.data === undefined )
|
|
124
|
+
{
|
|
125
|
+
item.data = {};
|
|
126
|
+
}
|
|
127
|
+
switch( typeof counter[name] )
|
|
128
|
+
{
|
|
129
|
+
case "undefined":
|
|
130
|
+
counter[name] = 1;
|
|
131
|
+
item.data[name] = value;
|
|
132
|
+
break;
|
|
133
|
+
case "boolean":
|
|
134
|
+
case "number":
|
|
135
|
+
case "string":
|
|
136
|
+
item.data[name] = [ item.data[name] ];
|
|
137
|
+
// fall through
|
|
138
|
+
case "object":
|
|
139
|
+
counter[name]++;
|
|
140
|
+
item.data[name].push( value );
|
|
141
|
+
break;
|
|
142
|
+
}
|
|
121
143
|
}
|
|
122
|
-
item.data[name] = value;
|
|
123
|
-
}
|
|
124
144
|
|
|
125
|
-
function decodeMsg()
|
|
126
|
-
{
|
|
127
145
|
rawdata = new Rawdata( rawdata );
|
|
128
146
|
while( rawdata.length() > 0 )
|
|
129
147
|
{
|
|
@@ -134,11 +152,32 @@ module.exports = function(RED) {
|
|
|
134
152
|
pid = rawdata.getUInt8();
|
|
135
153
|
break;
|
|
136
154
|
case 0x01:
|
|
137
|
-
|
|
155
|
+
if( node.batteryState )
|
|
156
|
+
{
|
|
157
|
+
setData( "battery", rawdata.getUInt8() );
|
|
158
|
+
delete item.battery;
|
|
159
|
+
}
|
|
160
|
+
else
|
|
161
|
+
{
|
|
162
|
+
item.battery = rawdata.getUInt8();
|
|
163
|
+
delete item.data?.battery;
|
|
164
|
+
}
|
|
165
|
+
break;
|
|
166
|
+
case 0x04:
|
|
167
|
+
setData( "pressure", rawdata.getUInt24() * 0.01 );
|
|
138
168
|
break;
|
|
139
169
|
case 0x05:
|
|
140
170
|
setData( "lux", rawdata.getUInt24() * 0.01 );
|
|
141
171
|
break;
|
|
172
|
+
case 0x08:
|
|
173
|
+
setData( "dewpoint", rawdata.getInt16() * 0.01 );
|
|
174
|
+
break;
|
|
175
|
+
case 0x0C:
|
|
176
|
+
setData( "voltage", rawdata.getUInt16() * 0.001 );
|
|
177
|
+
break;
|
|
178
|
+
case 0x20:
|
|
179
|
+
setData( "rain", Boolean( rawdata.getUInt8() ) );
|
|
180
|
+
break;
|
|
142
181
|
case 0x21:
|
|
143
182
|
events.pushEvent( "motion", rawdata.getEnum( ["","motion"] ) );
|
|
144
183
|
break;
|
|
@@ -159,15 +198,33 @@ module.exports = function(RED) {
|
|
|
159
198
|
case 0x3A:
|
|
160
199
|
events.pushEvent( "button", rawdata.getEnum( ["","S","SS","SSS","L"] ) );
|
|
161
200
|
break;
|
|
201
|
+
case 0x3C:
|
|
202
|
+
events.pushEvent( "dimmer", rawdata.getEnum( ["","Left","Right"] ), rawdata.getUInt8() );
|
|
203
|
+
break;
|
|
162
204
|
case 0x3F:
|
|
163
205
|
setData( "tilt", rawdata.getInt16() * 0.1 );
|
|
164
206
|
break;
|
|
165
207
|
case 0x40:
|
|
166
208
|
setData( "distance", rawdata.getUInt16() );
|
|
167
209
|
break;
|
|
210
|
+
case 0x44:
|
|
211
|
+
setData( "wind", rawdata.getUInt16() * 0.01 );
|
|
212
|
+
break;
|
|
168
213
|
case 0x45:
|
|
169
214
|
setData( "temperature", rawdata.getInt16() * 0.1 );
|
|
170
215
|
break;
|
|
216
|
+
case 0x46:
|
|
217
|
+
setData( "uv", rawdata.getUInt8() * 0.1 );
|
|
218
|
+
break;
|
|
219
|
+
case 0x5E:
|
|
220
|
+
setData( "direction", rawdata.getUInt16() * 0.01 );
|
|
221
|
+
break;
|
|
222
|
+
case 0x5F:
|
|
223
|
+
setData( "precipitation", rawdata.getUInt16() * 0.1 );
|
|
224
|
+
break;
|
|
225
|
+
case 0x60:
|
|
226
|
+
setData( "channel", rawdata.getUInt8() );
|
|
227
|
+
break;
|
|
171
228
|
case 0xF0:
|
|
172
229
|
item.typeId = rawdata.getUInt16();
|
|
173
230
|
break;
|
|
@@ -191,6 +248,7 @@ module.exports = function(RED) {
|
|
|
191
248
|
rawdata.reset();
|
|
192
249
|
}
|
|
193
250
|
}
|
|
251
|
+
//console.log(counter)
|
|
194
252
|
}
|
|
195
253
|
|
|
196
254
|
function checkPid()
|