MQTT interface... time for some testing. Where are my experts?
-
toggledbitswrote on Nov 24, 2021, 5:05 PM last edited by toggledbits Nov 24, 2021, 12:06 PM
The template file is not relevant for version number, look at MQTTController.js.
Can you show me the rest of your config for this entity/Tasmota node?
Also you don't need to make a custom template just to add
init
. You can use the stock template and putinit
in the configuration (e.g. next touses_template
). -
Ah, of cource.
For now it's"pooltemp": name: "Pooltemp" topic: "Pooltemp" source: "DS18B20" uses_template: my_tasmota_sensor_temperature
Best guessing I've tried this
"pooltemp": name: "Pooltemp" topic: "Pooltemp" source: "DS18B20" init: - topic: "cmnd/%topic%/STATUS" payload: 10 type: raw uses_template: tasmota_sensor_temperature
-
You need to make sure the response to that command actually includes the data you want. I've found that some Tasmota devices return incomplete state on this query. For example, I have a node set up with two relays, and this query does not provide the state of the two relays. The alternate choice, then, is to send
cmnd/%topic%Power
with no payload, and the node replies with aRESULT
topic and the current state (which the template understands).My guess is this issue is moot, however, if you're using an MQTT broker that supports QoS and retain.
-
xAPPOreplied to toggledbits on Jan 7, 2022, 2:23 AM last edited by xAPPO Jan 6, 2022, 9:28 PM
I'm really sorry but I'm failing getting this running - It seems to not be able to find the MQTT files on startup. Running in Docker and have created the correct directory structure with files. It can read my edited config yaml files from home/kevin/reactor/config OK. Permissions are OK.
Have a lot of MQTT experience but not so hot on Linux/Docker this was my run command
docker run --name reactor -d --restart on-failure -p 8111:8111 -v /home/kevin/reactor:/var/reactor --mount type=bind,src=/etc/localtime,target=/etc/localtime toggledbits/reactor:latest-generic-amd64
[latest-22004]2022-01-07T02:08:16.554Z <Structure:INFO> Structure#1 loading controller interface mqtt (MQTTController) [latest-22004]2022-01-07T02:08:16.560Z <MQTTController:null> Module MQTTController v21361 [latest-22004]2022-01-07T02:08:16.561Z <Controller:CRIT> Controller: failed to load mqtt implementation file:///var/reactor/ext/MQTTController/MQTTController.js: [Error]Error: Cannot find module 'mqtt' Require stack: - /var/reactor/ext/MQTTController/MQTTController.js [latest-22004]2022-01-07T02:08:16.562Z <Controller:CRIT> Error: Cannot find module 'mqtt' Require stack: - /var/reactor/ext/MQTTController/MQTTController.js Error: Cannot find module 'mqtt' Require stack: - /var/reactor/ext/MQTTController/MQTTController.js ...
-
Did you just drop it in the folder, or did you go through all the installation steps? The message logged suggests that step 5 wasn't completed.
-
I followed the instructions. Including step 5. I have a feeling I saw an error at some stage in that install so I will revisit that step and report back.
-
This is what I see when running step5 ./install.sh
Installing dependencies... make: Entering directory '/home/kevin/reactor/ext/MQTTController/node_modules/in otify/build' CXX(target) Release/obj.target/inotify/src/bindings.o In file included from ../src/bindings.cc:2:0: ../src/bindings.h:10:27: error: ‘Handle’ has not been declared static void Initialize(Handle<Object> target); ^~~~~~ ../src/bindings.h:10:33: error: expected ‘,’ or ‘...’ before ‘<’ token static void Initialize(Handle<Object> target); ^ ../src/bindings.cc:11:27: error: variable or field ‘Initialize’ declared void void Inotify::Initialize(Handle<Object> exports) { ^~~~~~ ../src/bindings.cc:11:27: error: ‘Handle’ was not declared in this scope ../src/bindings.cc:11:27: note: suggested alternative: ‘rand_r’ void Inotify::Initialize(Handle<Object> exports) { ^~~~~~ rand_r ../src/bindings.cc:11:40: error: expected primary-expression before ‘>’ token void Inotify::Initialize(Handle<Object> exports) { ^ ../src/bindings.cc:11:42: error: ‘exports’ was not declared in this scope void Inotify::Initialize(Handle<Object> exports) { ^~~~~~~ ../src/bindings.cc: In static member function ‘static Nan::NAN_METHOD_RETURN_TYP E NodeInotify::Inotify::AddWatch(Nan::NAN_METHOD_ARGS_TYPE)’: ../src/bindings.cc:146:43: error: no matching function for call to ‘v8::Value::T oObject()’ Local<Object> args_ = info[0]->ToObject(); ^ In file included from /home/kevin/.cache/node-gyp/12.20.0/include/node/node.h:67 :0, from ../src/node_inotify.h:5, from ../src/bindings.h:4, from ../src/bindings.cc:2: /home/kevin/.cache/node-gyp/12.20.0/include/node/v8.h:2672:44: note: candidate: v8::MaybeLocal<v8::Object> v8::Value::ToObject(v8::Local<v8::Context>) const V8_WARN_UNUSED_RESULT MaybeLocal<Object> ToObject( ^~~~~~~~ /home/kevin/.cache/node-gyp/12.20.0/include/node/v8.h:2672:44: note: candidate expects 1 argument, 0 provided In file included from /home/kevin/.cache/node-gyp/12.20.0/include/node/v8-intern al.h:14:0, from /home/kevin/.cache/node-gyp/12.20.0/include/node/v8.h:27, from /home/kevin/.cache/node-gyp/12.20.0/include/node/node.h:6 , from ../src/node_inotify.h:5, from ../src/bindings.h:4, from ../src/bindings.cc:2: /home/kevin/.cache/node-gyp/12.20.0/include/node/v8.h:2686:31: note: candidate: v8::Local<v8::Object> v8::Value::ToObject(v8::Isolate*) const Local<Object> ToObject(Isolate* isolate) const); ^ /home/kevin/.cache/node-gyp/12.20.0/include/node/v8config.h:328:3: note: in defi nition of macro ‘V8_DEPRECATED’ declarator __attribute__((deprecated(message))) ^~~~~~~~~~ /home/kevin/.cache/node-gyp/12.20.0/include/node/v8.h:2686:31: note: candidate expects 1 argument, 0 provided Local<Object> ToObject(Isolate* isolate) const); ^ /home/kevin/.cache/node-gyp/12.20.0/include/node/v8config.h:328:3: note: in defi nition of macro ‘V8_DEPRECATED’ declarator __attribute__((deprecated(message))) ^~~~~~~~~~ ../src/bindings.cc:149:27: error: no matching function for call to ‘v8::Object:: Has(v8::Local<v8::String>&)’ if (!args_->Has(path_sym)) { ^ In file included from /home/kevin/.cache/node-gyp/12.20.0/include/node/node.h:67 :0, from ../src/node_inotify.h:5, from ../src/bindings.h:4, from ../src/bindings.cc:2: /home/kevin/.cache/node-gyp/12.20.0/include/node/v8.h:3590:37: note: candidate: v8::Maybe<bool> v8::Object::Has(v8::Local<v8::Context>, v8::Local<v8::Value>) V8_WARN_UNUSED_RESULT Maybe<bool> Has(Local<Context> context, ^~~ /home/kevin/.cache/node-gyp/12.20.0/include/node/v8.h:3590:37: note: candidate expects 2 arguments, 1 provided /home/kevin/.cache/node-gyp/12.20.0/include/node/v8.h:3596:37: note: candidate: v8::Maybe<bool> v8::Object::Has(v8::Local<v8::Context>, uint32_t) V8_WARN_UNUSED_RESULT Maybe<bool> Has(Local<Context> context, uint32_t index) ; ^~~ /home/kevin/.cache/node-gyp/12.20.0/include/node/v8.h:3596:37: note: candidate expects 2 arguments, 1 provided ../src/bindings.cc:154:31: error: no matching function for call to ‘v8::Object:: Has(v8::Local<v8::String>&)’ if (!args_->Has(callback_sym) || ^ In file included from /home/kevin/.cache/node-gyp/12.20.0/include/node/node.h:67 :0, from ../src/node_inotify.h:5, from ../src/bindings.h:4, from ../src/bindings.cc:2: /home/kevin/.cache/node-gyp/12.20.0/include/node/v8.h:3590:37: note: candidate: v8::Maybe<bool> v8::Object::Has(v8::Local<v8::Context>, v8::Local<v8::Value>) V8_WARN_UNUSED_RESULT Maybe<bool> Has(Local<Context> context, ^~~ /home/kevin/.cache/node-gyp/12.20.0/include/node/v8.h:3590:37: note: candidate expects 2 arguments, 1 provided /home/kevin/.cache/node-gyp/12.20.0/include/node/v8.h:3596:37: note: candidate: v8::Maybe<bool> v8::Object::Has(v8::Local<v8::Context>, uint32_t) V8_WARN_UNUSED_RESULT Maybe<bool> Has(Local<Context> context, uint32_t index) ; ^~~ /home/kevin/.cache/node-gyp/12.20.0/include/node/v8.h:3596:37: note: candidate expects 2 arguments, 1 provided ../src/bindings.cc:155:28: warning: ‘v8::Local<v8::Value> v8::Object::Get(v8::Lo cal<v8::Value>)’ is deprecated: Use maybe version [-Wdeprecated-declarations] !args_->Get(callback_sym)->IsFunction()) { ^ In file included from /home/kevin/.cache/node-gyp/12.20.0/include/node/v8-intern al.h:14:0, from /home/kevin/.cache/node-gyp/12.20.0/include/node/v8.h:27, from /home/kevin/.cache/node-gyp/12.20.0/include/node/node.h:6 , from ../src/node_inotify.h:5, from ../src/bindings.h:4, from ../src/bindings.cc:2: /home/kevin/.cache/node-gyp/12.20.0/include/node/v8.h:3553:51: note: declared he re V8_DEPRECATED("Use maybe version", Local<Value> Get(Local<Value> key)); ^ /home/kevin/.cache/node-gyp/12.20.0/include/node/v8config.h:328:3: note: in defi nition of macro ‘V8_DEPRECATED’ declarator __attribute__((deprecated(message))) ^~~~~~~~~~ ../src/bindings.cc:160:32: error: no matching function for call to ‘v8::Object:: Has(v8::Local<v8::String>&)’ if (!args_->Has(watch_for_sym)) { ^ In file included from /home/kevin/.cache/node-gyp/12.20.0/include/node/node.h:67 :0, from ../src/node_inotify.h:5, from ../src/bindings.h:4, from ../src/bindings.cc:2: /home/kevin/.cache/node-gyp/12.20.0/include/node/v8.h:3590:37: note: candidate: v8::Maybe<bool> v8::Object::Has(v8::Local<v8::Context>, v8::Local<v8::Value>) V8_WARN_UNUSED_RESULT Maybe<bool> Has(Local<Context> context, ^~~ /home/kevin/.cache/node-gyp/12.20.0/include/node/v8.h:3590:37: note: candidate expects 2 arguments, 1 provided /home/kevin/.cache/node-gyp/12.20.0/include/node/v8.h:3596:37: note: candidate: v8::Maybe<bool> v8::Object::Has(v8::Local<v8::Context>, uint32_t) V8_WARN_UNUSED_RESULT Maybe<bool> Has(Local<Context> context, uint32_t index) ; ^~~ /home/kevin/.cache/node-gyp/12.20.0/include/node/v8.h:3596:37: note: candidate expects 2 arguments, 1 provided ../src/bindings.cc:163:33: warning: ‘v8::Local<v8::Value> v8::Object::Get(v8::Lo cal<v8::Value>)’ is deprecated: Use maybe version [-Wdeprecated-declarations] if (!args_->Get(watch_for_sym)->IsInt32()) { ^ In file included from /home/kevin/.cache/node-gyp/12.20.0/include/node/v8-intern al.h:14:0, from /home/kevin/.cache/node-gyp/12.20.0/include/node/v8.h:27, from /home/kevin/.cache/node-gyp/12.20.0/include/node/node.h:6 , from ../src/node_inotify.h:5, from ../src/bindings.h:4, from ../src/bindings.cc:2: /home/kevin/.cache/node-gyp/12.20.0/include/node/v8.h:3553:51: note: declared he re V8_DEPRECATED("Use maybe version", Local<Value> Get(Local<Value> key)); ^ /home/kevin/.cache/node-gyp/12.20.0/include/node/v8config.h:328:3: note: in defi nition of macro ‘V8_DEPRECATED’ declarator __attribute__((deprecated(message))) ^~~~~~~~~~ ../src/bindings.cc:166:36: warning: ‘v8::Local<v8::Value> v8::Object::Get(v8::Lo cal<v8::Value>)’ is deprecated: Use maybe version [-Wdeprecated-declarations] mask |= args_->Get(watch_for_sym)->Int32Value(); ^ In file included from /home/kevin/.cache/node-gyp/12.20.0/include/node/v8-intern al.h:14:0, from /home/kevin/.cache/node-gyp/12.20.0/include/node/v8.h:27, from /home/kevin/.cache/node-gyp/12.20.0/include/node/node.h:6 , from ../src/node_inotify.h:5, from ../src/bindings.h:4, from ../src/bindings.cc:2: /home/kevin/.cache/node-gyp/12.20.0/include/node/v8.h:3553:51: note: declared he re V8_DEPRECATED("Use maybe version", Local<Value> Get(Local<Value> key)); ^ /home/kevin/.cache/node-gyp/12.20.0/include/node/v8config.h:328:3: note: in defi nition of macro ‘V8_DEPRECATED’ declarator __attribute__((deprecated(message))) ^~~~~~~~~~ ../src/bindings.cc:166:50: error: no matching function for call to ‘v8::Value::I nt32Value()’ mask |= args_->Get(watch_for_sym)->Int32Value(); ^ In file included from /home/kevin/.cache/node-gyp/12.20.0/include/node/node.h:67 :0, from ../src/node_inotify.h:5, from ../src/bindings.h:4, from ../src/bindings.cc:2: /home/kevin/.cache/node-gyp/12.20.0/include/node/v8.h:2709:40: note: candidate: v8::Maybe<int> v8::Value::Int32Value(v8::Local<v8::Context>) const V8_WARN_UNUSED_RESULT Maybe<int32_t> Int32Value(Local<Context> context) const ; ^~~~~~~~~~ /home/kevin/.cache/node-gyp/12.20.0/include/node/v8.h:2709:40: note: candidate expects 1 argument, 0 provided ../src/bindings.cc:172:45: warning: ‘v8::Local<v8::Value> v8::Object::Get(v8::Lo cal<v8::Value>)’ is deprecated: Use maybe version [-Wdeprecated-declarations] String::Utf8Value path(args_->Get(path_sym)); ^ In file included from /home/kevin/.cache/node-gyp/12.20.0/include/node/v8-intern al.h:14:0, from /home/kevin/.cache/node-gyp/12.20.0/include/node/v8.h:27, from /home/kevin/.cache/node-gyp/12.20.0/include/node/node.h:6 , from ../src/node_inotify.h:5, from ../src/bindings.h:4, from ../src/bindings.cc:2: /home/kevin/.cache/node-gyp/12.20.0/include/node/v8.h:3553:51: note: declared he re V8_DEPRECATED("Use maybe version", Local<Value> Get(Local<Value> key)); ^ /home/kevin/.cache/node-gyp/12.20.0/include/node/v8config.h:328:3: note: in defi nition of macro ‘V8_DEPRECATED’ declarator __attribute__((deprecated(message))) ^~~~~~~~~~ ../src/bindings.cc:172:46: error: no matching function for call to ‘v8::String:: Utf8Value::Utf8Value(v8::Local<v8::Value>)’ String::Utf8Value path(args_->Get(path_sym)); ^ In file included from /home/kevin/.cache/node-gyp/12.20.0/include/node/node.h:67 :0, from ../src/node_inotify.h:5, from ../src/bindings.h:4, from ../src/bindings.cc:2: /home/kevin/.cache/node-gyp/12.20.0/include/node/v8.h:3135:5: note: candidate: v 8::String::Utf8Value::Utf8Value(v8::Isolate*, v8::Local<v8::Value>) Utf8Value(Isolate* isolate, Local<v8::Value> obj); ^~~~~~~~~ /home/kevin/.cache/node-gyp/12.20.0/include/node/v8.h:3135:5: note: candidate expects 2 arguments, 1 provided ../src/bindings.cc:182:61: warning: ‘v8::Local<v8::Value> v8::Object::Get(v8::Lo cal<v8::Value>)’ is deprecated: Use maybe version [-Wdeprecated-declarations] inotify->handle()->Set(descriptor, args_->Get(callback_sym)); ^
-
IN two posts because was too long - sorry
In file included from /home/kevin/.cache/node-gyp/12.20.0/include/node/v8-intern al.h:14:0, from /home/kevin/.cache/node-gyp/12.20.0/include/node/v8.h:27, from /home/kevin/.cache/node-gyp/12.20.0/include/node/node.h:6 , from ../src/node_inotify.h:5, from ../src/bindings.h:4, from ../src/bindings.cc:2: /home/kevin/.cache/node-gyp/12.20.0/include/node/v8.h:3553:51: note: declared he re V8_DEPRECATED("Use maybe version", Local<Value> Get(Local<Value> key)); ^ /home/kevin/.cache/node-gyp/12.20.0/include/node/v8config.h:328:3: note: in defi nition of macro ‘V8_DEPRECATED’ declarator __attribute__((deprecated(message))) ^~~~~~~~~~ ../src/bindings.cc:182:62: warning: ‘bool v8::Object::Set(v8::Local<v8::Value>, v8::Local<v8::Value>)’ is deprecated: Use maybe version [-Wdeprecated-declaratio ns] inotify->handle()->Set(descriptor, args_->Get(callback_sym)); ^ In file included from /home/kevin/.cache/node-gyp/12.20.0/include/node/v8-intern al.h:14:0, from /home/kevin/.cache/node-gyp/12.20.0/include/node/v8.h:27, from /home/kevin/.cache/node-gyp/12.20.0/include/node/node.h:6 , from ../src/node_inotify.h:5, from ../src/bindings.h:4, from ../src/bindings.cc:2: /home/kevin/.cache/node-gyp/12.20.0/include/node/v8.h:3499:22: note: declared he re bool Set(Local<Value> key, Local<Value> value)); ^ /home/kevin/.cache/node-gyp/12.20.0/include/node/v8config.h:328:3: note: in defi nition of macro ‘V8_DEPRECATED’ declarator __attribute__((deprecated(message))) ^~~~~~~~~~ ../src/bindings.cc: In static member function ‘static Nan::NAN_METHOD_RETURN_TYP E NodeInotify::Inotify::RemoveWatch(Nan::NAN_METHOD_ARGS_TYPE)’: ../src/bindings.cc:195:31: error: no matching function for call to ‘v8::Value::I nt32Value()’ watch = info[0]->Int32Value(); ^ In file included from /home/kevin/.cache/node-gyp/12.20.0/include/node/node.h:67 :0, from ../src/node_inotify.h:5, from ../src/bindings.h:4, from ../src/bindings.cc:2: /home/kevin/.cache/node-gyp/12.20.0/include/node/v8.h:2709:40: note: candidate: v8::Maybe<int> v8::Value::Int32Value(v8::Local<v8::Context>) const V8_WARN_UNUSED_RESULT Maybe<int32_t> Int32Value(Local<Context> context) const ; ^~~~~~~~~~ /home/kevin/.cache/node-gyp/12.20.0/include/node/v8.h:2709:40: note: candidate expects 1 argument, 0 provided ../src/bindings.cc: In static member function ‘static void NodeInotify::Inotify: :Callback(uv_poll_t*, int, int)’: ../src/bindings.cc:262:86: warning: ‘bool v8::Object::Set(v8::Local<v8::Value>, v8::Local<v8::Value>)’ is deprecated: Use maybe version [-Wdeprecated-declaratio ns] >Set(Nan::New<String>("watch").ToLocalChecked(), Nan::New<Integer>(event->wd)); ^ In file included from /home/kevin/.cache/node-gyp/12.20.0/include/node/v8-intern al.h:14:0, from /home/kevin/.cache/node-gyp/12.20.0/include/node/v8.h:27, from /home/kevin/.cache/node-gyp/12.20.0/include/node/node.h:6 , from ../src/node_inotify.h:5, from ../src/bindings.h:4, from ../src/bindings.cc:2: /home/kevin/.cache/node-gyp/12.20.0/include/node/v8.h:3499:22: note: declared he re bool Set(Local<Value> key, Local<Value> value)); ^ /home/kevin/.cache/node-gyp/12.20.0/include/node/v8config.h:328:3: note: in defi nition of macro ‘V8_DEPRECATED’ declarator __attribute__((deprecated(message))) ^~~~~~~~~~ ../src/bindings.cc:263:87: warning: ‘bool v8::Object::Set(v8::Local<v8::Value>, v8::Local<v8::Value>)’ is deprecated: Use maybe version [-Wdeprecated-declaratio ns] Set(Nan::New<String>("mask").ToLocalChecked(), Nan::New<Integer>(event->mask)); ^ In file included from /home/kevin/.cache/node-gyp/12.20.0/include/node/v8-intern al.h:14:0, from /home/kevin/.cache/node-gyp/12.20.0/include/node/v8.h:27, from /home/kevin/.cache/node-gyp/12.20.0/include/node/node.h:6 , from ../src/node_inotify.h:5, from ../src/bindings.h:4, from ../src/bindings.cc:2: /home/kevin/.cache/node-gyp/12.20.0/include/node/v8.h:3499:22: note: declared he re bool Set(Local<Value> key, Local<Value> value)); ^ /home/kevin/.cache/node-gyp/12.20.0/include/node/v8config.h:328:3: note: in defi nition of macro ‘V8_DEPRECATED’ declarator __attribute__((deprecated(message))) ^~~~~~~~~~ ../src/bindings.cc:264:91: warning: ‘bool v8::Object::Set(v8::Local<v8::Value>, v8::Local<v8::Value>)’ is deprecated: Use maybe version [-Wdeprecated-declaratio ns] Nan::New<String>("cookie").ToLocalChecked(), Nan::New<Integer>(event->cookie)); ^ In file included from /home/kevin/.cache/node-gyp/12.20.0/include/node/v8-intern al.h:14:0, from /home/kevin/.cache/node-gyp/12.20.0/include/node/v8.h:27, from /home/kevin/.cache/node-gyp/12.20.0/include/node/node.h:6 , from ../src/node_inotify.h:5, from ../src/bindings.h:4, from ../src/bindings.cc:2: /home/kevin/.cache/node-gyp/12.20.0/include/node/v8.h:3499:22: note: declared he re bool Set(Local<Value> key, Local<Value> value)); ^ /home/kevin/.cache/node-gyp/12.20.0/include/node/v8config.h:328:3: note: in defi nition of macro ‘V8_DEPRECATED’ declarator __attribute__((deprecated(message))) ^~~~~~~~~~ ../src/bindings.cc:267:104: warning: ‘bool v8::Object::Set(v8::Local<v8::Value>, v8::Local<v8::Value>)’ is deprecated: Use maybe version [-Wdeprecated-declarati ons] ing>("name").ToLocalChecked(), Nan::New<String>(event->name).ToLocalChecked()); ^ In file included from /home/kevin/.cache/node-gyp/12.20.0/include/node/v8-intern al.h:14:0, from /home/kevin/.cache/node-gyp/12.20.0/include/node/v8.h:27, from /home/kevin/.cache/node-gyp/12.20.0/include/node/node.h:6 , from ../src/node_inotify.h:5, from ../src/bindings.h:4, from ../src/bindings.cc:2: /home/kevin/.cache/node-gyp/12.20.0/include/node/v8.h:3499:22: note: declared he re bool Set(Local<Value> key, Local<Value> value)); ^ /home/kevin/.cache/node-gyp/12.20.0/include/node/v8config.h:328:3: note: in defi nition of macro ‘V8_DEPRECATED’ declarator __attribute__((deprecated(message))) ^~~~~~~~~~ ../src/bindings.cc:275:66: warning: ‘v8::Local<v8::Value> v8::Object::Get(v8::Lo cal<v8::Value>)’ is deprecated: Use maybe version [-Wdeprecated-declarations] Local<Value> value = handle->Get(Nan::New<Integer>(event->wd)); ^ In file included from /home/kevin/.cache/node-gyp/12.20.0/include/node/v8-intern al.h:14:0, from /home/kevin/.cache/node-gyp/12.20.0/include/node/v8.h:27, from /home/kevin/.cache/node-gyp/12.20.0/include/node/node.h:6 , from ../src/node_inotify.h:5, from ../src/bindings.h:4, from ../src/bindings.cc:2: /home/kevin/.cache/node-gyp/12.20.0/include/node/v8.h:3553:51: note: declared he re V8_DEPRECATED("Use maybe version", Local<Value> Get(Local<Value> key)); ^ /home/kevin/.cache/node-gyp/12.20.0/include/node/v8config.h:328:3: note: in defi nition of macro ‘V8_DEPRECATED’ declarator __attribute__((deprecated(message))) ^~~~~~~~~~ ../src/bindings.cc:279:34: warning: ‘v8::Local<v8::Value> Nan::Callback::Call(v8 ::Local<v8::Object>, int, v8::Local<v8::Value>*) const’ is deprecated [-Wdepreca ted-declarations] callback.Call(handle, 1, argv); ^ In file included from ../src/node_inotify.h:14:0, from ../src/bindings.h:4, from ../src/bindings.cc:2: ../../nan/nan.h:1722:3: note: declared here Call(v8::Local<v8::Object> target ^~~~ ../src/bindings.cc:285:34: error: no matching function for call to ‘v8::Value::T oString()’ handle->Delete(wd->ToString()); ^ In file included from /home/kevin/.cache/node-gyp/12.20.0/include/node/node.h:67 :0, from ../src/node_inotify.h:5, from ../src/bindings.h:4, from ../src/bindings.cc:2: /home/kevin/.cache/node-gyp/12.20.0/include/node/v8.h:2668:44: note: candidate: v8::MaybeLocal<v8::String> v8::Value::ToString(v8::Local<v8::Context>) const V8_WARN_UNUSED_RESULT MaybeLocal<String> ToString( ^~~~~~~~ /home/kevin/.cache/node-gyp/12.20.0/include/node/v8.h:2668:44: note: candidate expects 1 argument, 0 provided In file included from /home/kevin/.cache/node-gyp/12.20.0/include/node/v8-intern al.h:14:0, from /home/kevin/.cache/node-gyp/12.20.0/include/node/v8.h:27, from /home/kevin/.cache/node-gyp/12.20.0/include/node/node.h:6 , from ../src/node_inotify.h:5, from ../src/bindings.h:4, from ../src/bindings.cc:2: /home/kevin/.cache/node-gyp/12.20.0/include/node/v8.h:2684:31: note: candidate: v8::Local<v8::String> v8::Value::ToString(v8::Isolate*) const Local<String> ToString(Isolate* isolate) const); ^ /home/kevin/.cache/node-gyp/12.20.0/include/node/v8config.h:328:3: note: in defi nition of macro ‘V8_DEPRECATED’ declarator __attribute__((deprecated(message))) ^~~~~~~~~~ /home/kevin/.cache/node-gyp/12.20.0/include/node/v8.h:2684:31: note: candidate expects 1 argument, 0 provided Local<String> ToString(Isolate* isolate) const); ^ /home/kevin/.cache/node-gyp/12.20.0/include/node/v8config.h:328:3: note: in defi nition of macro ‘V8_DEPRECATED’ declarator __attribute__((deprecated(message))) ^~~~~~~~~~ inotify.target.mk:112: recipe for target 'Release/obj.target/inotify/src/binding s.o' failed make: *** [Release/obj.target/inotify/src/bindings.o] Error 1 make: Leaving directory '/home/kevin/reactor/ext/MQTTController/node_modules/ino tify/build' kevin@NUC50:~/reactor/ext/MQTTController$
-
toggledbitswrote on Jan 7, 2022, 5:37 PM last edited by toggledbits Jan 7, 2022, 12:38 PM
Seems like something is broken or out of date in your nodejs installation. How did you install node? And what version is it (run
node -v
) -
Its a docker install so I thought that was part of the container .. on the host OS my version is v12.20.0 - should I update that ?
-
Yeah, that's going to be a problem. Version 16.13 is the current, I believe, and would be a good choice.
-
Thankyou - that's worked. I had assumed the appropriate version of node was part of the Docker container.
So pleased to have found this as I use HA, MQTT, Hubitat extensively plus OpenHAB and Homey to a lesser extent so glad you are intending to support those two eventually.
-
It is part of the container, but you are not running in the container. That is a possibility, though, and I tried it, it seems to work, so an alternative to installing (or upgrading) nodejs outside of the container seems to be:
docker exec -it reactor /bin/sh cd /var/reactor/ext/MQTTController ./install.sh exit
I'll add this to the installation docs for MQTTController.
-
xAPPOreplied to toggledbits on Jan 8, 2022, 2:36 AM last edited by xAPPO Jan 7, 2022, 9:37 PM
All working well. However in the topic structure for echoed devices (from Hubitat anyway) the <entity-id> is used. Is it possible to instead or even better as well as, include the entity-name ?
reactor/<mqtt-id>/<ctrl-id>/<entity-id>/state/<capability-name>
perhaps
reactor/<mqtt-id>/<ctrl-id>/<entity-name>/<entity-id>/state/<capability-name>
-
The entity name can be changed or duplicated and is not an appropriate unique identifier for a device.
-
Topic hierarchy segments don't have to be unique - in fact I would say most aren't. Keeping the <entity-id> then within the hierarchy would ensure the topic remains unique. Having no easily human identifiable topic is not helpful to other integrations.
-
@xappo OK. And what about receiving messages for inbound action requests? Same
entity-name/entity-id
construction? If you know the correct entity ID to form that message, what value is the name? If you don't know the ID and only use the name, how do you specify that, and what if the name isn't unique then? And what if the name and ID conflict, or an entity can be found for one but not the other (i.e. they don't match)? I'm not opposed to what you're proposing, but I want you to help me think through the consequences of it.@xappo said in MQTT interface... time for some testing. Where are my experts?:
Having no easily human identifiable topic is not helpful to other integrations.
I think that's a bit of a reach. The whole MQTT environment is so unstructured and freeform, with so many inconsistencies between players, that things like unique IDs (or MAC addresses or other cryptic and "hard to read" identifiers) are a regular occurrence, and anybody who uses MQTT a lot is used to it.
-
The incoming action request message to a topic must be complete with all segments as you can't wildcard a publish command. So the <entity-id> will always be unique and present there. You could should you wish subscribe to the topic from your code ignoring any <entity-name> segment with a + wildcard as you don't process it. So that should work fine.
Human readability.. I agree it's a bit of a reach but my whole system is MQTT based with over 10K topics and 1K+ devices - remembering what they all are and linking to or from those topics from other controllers requires some hints as to what those devices are. Later examination of logic requires understanding what devices are related. Having to refer back to Reactor config each time to identify a device isn't practical (or user friendly).
-
Good stuff. Let me see what I can cook up.
-
OK. Version 22008 of MQTTController is up on the downloads site (under extras).
New configuration key that you can put in the
echo
section: setentity_identifier
tocombined
and the telemetry topics will include the entity name; it adds another level to the topic as you suggested. This has no effect on received messages for entity actions; those still require the ID (but it's a secret/undocumented feature--you can give it the name instead of an ID and it will work if the name is unique), and the structure of the topic is the same (i.e. same number of levels, not changed). Online docs are updated as well.