Documentation

Select flag to translate:

France Germany Japan Mexico Italy Spain United States of America

Getting Started

Before you can use this service with Alexa or Google Home you need to:


Account Linking

Node-RED Flow message output is the same irrespective of whether you interact with the service using Alexa or Google Home. The API was engineered this way in order to avoid the need to re-engineer Flows/ create separate flows for both Alexa and Google Home command processing.

Link your Amazon Account

Note that there are Alexa restrictions based on region/ locale, Amazon publish and update their region-specific restrictions here.

Link your Google Account

You currently have to request extension of the skill to your Google accounts.

Not all capabilities are supported by Google Home, the device creation wizard highlights which capabilities/ traits are supported. To remove the need to define Google or Alexa-specific devices the API itself will automatically only expose a devices' supported capabilities/ actions to Google Home. You can see a comparison between the two services here.


Example Flows and Node Outputs

Install Node-RED Nodes

Install the Node-RED Smart Home Nodes by either:

Basic Configuration

On creating your first flow you'll need to define a configuration for the bridge. If you are using the hosted bridge, you can leave the default values.

If you are hosting your own, then be sure to set the correct Web API and MQTT host names.

Concept Flow

Refer to this table for capabilities that support state

Start Simple

If you are only planning to use voice control you only need a default and a state node. This is a good starting point for any flow, you can then extend the flow to enable external state updates, or to perform other functions as outlined below.

You should only include a single default and state node per device.

Auto-Acknowledge

Essentially, to use this Node-RED <> Alexa bridge your flows will require:

Both the "alexa-smart-home-v3" and "alexa-smart-home-v3-state" nodes must be configured for the same bridge device that you have defined.

A concept flow is shown below:

Concept Flow Diagram

With Response Node

A concept flow is shown below, perform your logic to establish whether msg.acknowledge is set to true or false in the Command Function Node.

Note that if msg.acknowledge is not set to true Alexa will report that "the device is not responding" and the state update will be dropped (to ensure Alexa App shows state correctly).

Concept Flow Diagram w/ Response

Command Function Node output will need to match the node outputs listed below in order for response and state nodes to function correctly.

Default Node Outputs

Output varies based upon capability, as below, use these outputs to control your MQTT publishing, HTTP(S), Yamaha AVR nodes etc.

Note that Node output is the same for both Alexa and Google Home initiated commands.

It is highly likely you'll need to "massage" the output to fit your flow/ target endpoint.

BrightnessController

SetBrightness

msg : {
          topic: ""
          name: "Bedroom Light"
          _messageId: "9c289ee2-fd71-4222-ad55-8a894f70b319"
          _endpointId: "29"
          _confId: "bfd0fcf4.bc90e"
          command: "SetBrightness"
          extraInfo: object
          payload: 80
          acknowledge: true
          _msgid: "c484148c.0aa918"
      }
      

AdjustBrightness

msg : {
          topic: ""
          name: "Bedroom Light"
          _messageId: "8cbe1407-34f1-4eef-97c9-007b4b4edcfd"
          _endpointId: "29"
          _confId: "bfd0fcf4.bc90e"
          command: "AdjustBrightness"
          extraInfo: object
          payload: -25
          acknowledge: true
          _msgid: "87891d99.acdbb"
      }
      

ChannelController

ChangeChannel (Numerical)

msg : {
          topic: ""
          name: "Lounge TV"
          _messageId: "01843371-f3e1-429c-9a68-199b77ffe577"
          _endpointId: "11"
          _confId: "bfd0fcf4.bc90e"
          command: "ChangeChannel"
          extraInfo: object
          payload: "101"
          acknowledge: true
          _msgid: "bd3268f0.742d98"
      }
      

ChangeChannel (Name)

msg : {
          topic: ""
          name: "Lounge TV"
          _messageId: "c3f8fb2d-5882-491f-b0ce-7aa79eaad2fe"
          _endpointId: "11"
          _confId: "bfd0fcf4.bc90e"
          command: "ChangeChannel"
          extraInfo: object
          payload: "BBC 1"
          acknowledge: true
          _msgid: "db9cc171.e30de"
      }
      

ColorController

SetColor

msg : {
          topic: ""
          name: "Test Smartlight"
          _messageId: "245ae0ea-40cb-4a44-8618-fdea822de1bf"
          _endpointId: "99"
          _confId: "bfd0fcf4.bc90e"
          command: "SetColor"
          extraInfo: object
          payload: object
          acknowledge: true
          _msgid: "334fa7b2.f8d148"
          }
      

ColorTemperatureController

SetColorTemperature

Message msg.payload will vary based on requested color temperature:

msg : {
        topic: ""
        name: "Bedroom Light"
        _messageId: "d506edb8-29a4-4009-9882-b17fe18e982d"
        _endpointId: "99"
        _confId: "bfd0fcf4.bc90e"
        command: "SetColorTemperature"
        extraInfo: object
        payload: 2200
        acknowledge: true
        _msgid: "47f1c84f.65f138"
      }
      

InputController

SelectInput

msg : {
        topic: ""
        name: "Lounge TV"
        _messageId: "4e12b3dd-c5a0-457a-ad8b-db1799e10398"
        _endpointId: "11"
        _confId: "bfd0fcf4.bc90e"
        command: "SelectInput"
        extraInfo: object
        payload: "HDMI 2"
        acknowledge: true
        _msgid: "74f61e13.34871"
      }
      

LockController

Lock

msg : {
        topic: ""
        name: "Door Lock"
        _messageId: "5a15c0c4-1e05-4ca6-bf40-fca4393c2ec4"
        _endpointId: "128"
        _confId: "bfd0fcf4.bc90e"
        command: "Lock"
        extraInfo: object
        payload: "Lock"
        acknowledge: true
        _msgid: "7ce7f0e3.e96bd"
      }
      

PlaybackController

No msg.payload, command will change between Play, Pause, Stop, FastForward, Rewind, StartOver, Next, Previous.

Play

msg : {
          topic: ""
          name: "Lounge TV"
          _messageId: "f4379dcb-f431-4662-afdc-dc0452d313a0"
          _endpointId: "11"
          _confId: "bfd0fcf4.bc90e"
          command: "Play"
          extraInfo: object
          acknowledge: true
          _msgid: "fda4a47c.e79c08"
      }
      

PercentageController

SetPercentage

msg : {
          topic: ""
          name: "Test Fan"
          _messageId: "6851dbbf-e826-41f9-89ee-7cd4c9699a17"
          _endpointId: "104"
          _confId: "bfd0fcf4.bc90e"
          command: "SetPercentage"
          extraInfo: object
          payload: 25
          acknowledge: true
          _msgid: "a9433270.f9ea8"
      }
      

AdjustPercentage

Message msg.payload will contain +/- adjustment value. Example below is for a 25% increase.

msg : {
          topic: ""
          name: "Test Fan"
          _messageId: "ffa95808-dc09-4c50-a242-d166acb05d1b"
          _endpointId: "104"
          _confId: "bfd0fcf4.bc90e"
          command: "AdjustPercentage"
          extraInfo: object
          payload: 25
          acknowledge: true
          _msgid: "68eadf30.4f1a4"
      }
      

PowerController

TurnOn command

msg : {
          topic: ""
          name: "Study Light"
          _messageId: "0791c4b3-c874-4192-a5ac-4c4b643c36ab"
          _endpointId: "17"
          _confId: "bfd0fcf4.bc90e"
          command: "TurnOn"
          extraInfo: object
          payload: "ON"
          acknowledge: true
          _msgid: "c94c43fa.41d31"
      }
      

TurnOff Command

msg : {
          topic: ""
          name: "Study Light"
          _messageId: "912cc5c0-4014-4fbf-9178-22bff9f55ef2"
          _endpointId: "17"
          _confId: "bfd0fcf4.bc90e"
          command: "TurnOff"
          extraInfo: object
          payload: "OFF"
          acknowledge: true
          _msgid: "ca26cee2.12a86"
      }
      

SceneController

Activate

msg : {
          topic: ""
          name: "Movie Night"
          _messageId: "3b6f7aa1-38c3-45a4-a94d-96e488c6d5ad"
          _endpointId: "7"
          _confId: "bfd0fcf4.bc90e"
          command: "Activate"
          extraInfo: object
          empty
          acknowledge: true
          _msgid: "c3f50a98.9e0b08"
      }
      

Speaker

AdjustVolume

If no value specified message msg.payload will be +/- 10.

msg : {
          topic: ""
          name: "Test Speaker"
          _messageId: "77c8161c-8935-446a-9087-2ee0b9b90cdc"
          _endpointId: "98"
          _confId: "bfd0fcf4.bc90e"
          command: "AdjustVolume"
          extraInfo: object
          payload: 10
          acknowledge: true
          _msgid: "9f95ad7e.c2574"
      }
      

SetVolume

msg : {
          topic: ""
          name: "Lounge TV"
          _messageId: "0bfd0aac-8dd1-4c8c-a341-9cfb14fa06d6"
          _endpointId: "11"
          _confId: "bfd0fcf4.bc90e"
          command: "SetVolume"
          extraInfo: object
          payload: 50
          acknowledge: true
          _msgid: "aa31e847.2da6e8"
      }
      

SetMute

Payload will change from "ON" for "mute" command, to "OFF" for "unmute" command.

msg : {
          topic: ""
          name: "Lounge TV"
          _messageId: "7fd278b4-1e9f-4195-9dc9-40e378a5f24b"
          _endpointId: "11"
          _confId: "bfd0fcf4.bc90e"
          command: "SetMute"
          extraInfo: object
          payload: "ON"
          acknowledge: true
          _msgid: "8fcd1348.907e1"
      }
      

StepSpeaker

AdjustVolume

Message msg.payload will be either 10 (volume up/ increase volume) or -10 (volume down/ decrease volume).

msg : {
          topic: ""
          name: "Study Speaker"
          _messageId: "14ece61e-d8e9-4de1-a927-76cea0795f12"
          _endpointId: "127"
          _confId: "bfd0fcf4.bc90e"
          command: "AdjustVolume"
          extraInfo: object
          payload: 10
          acknowledge: true
          _msgid: "95fa4219.7f2f"
      }
      

SetMute

Payload will change from "ON" for "mute" command, to "OFF" for "unmute" command.

msg : {
          topic: ""
          name: "Lounge TV"
          _messageId: "7fd278b4-1e9f-4195-9dc9-40e378a5f24b"
          _endpointId: "11"
          _confId: "bfd0fcf4.bc90e"
          command: "SetMute"
          extraInfo: object
          payload: "ON"
          acknowledge: true
          _msgid: "8fcd1348.907e1"
      }
      

ThermostatController

SetTargetTemperature

msg : {
          topic: ""
          name: "Thermostat"
          _messageId: "67ebfd1b-dd16-4681-afb3-e0d0f3152865"
          _endpointId: "91"
          _confId: "bfd0fcf4.bc90e"
          command: "SetTargetTemperature"
          extraInfo: object
          payload: 22
          temperatureScale: "CELSIUS"
          acknowledge: true
          _msgid: "b8afdc95.b06fe"
          }
      

AdjustTargetTemperature

Message msg.payload will be either 1 (increase) or -1 (decrease).

msg : {
          topic: ""
          name: "Thermostat"
          _messageId: "3b618e03-f112-4e54-a291-62953467a1f3"
          _endpointId: "91"
          _confId: "bfd0fcf4.bc90e"
          command: "AdjustTargetTemperature"
          extraInfo: object
          payload: 1
          temperatureScale: "CELSIUS"
          acknowledge: true
          _msgid: "26950952.9183b6"
      }
      

SetThermostatMode

Message msg.payload will be either ON, OFF, HEAT, COOL:

msg : {
          topic: ""
          name: "Thermostat"
          _messageId: "7f5b0559-f015-4e75-9443-3feac8fe6ac5"
          _endpointId: "91"
          _confId: "bfd0fcf4.bc90e"
          command: "SetThermostatMode"
          extraInfo: object
          payload: "OFF"
          acknowledge: true
          _msgid: "6a879991.5d6d38"
      }
      

State Reporting

If you are only using Alexa or Google Home to control your devices, i.e. there are no physical buttons/ interactions, then a simple flow taht includes a "default" and "state" node is sufficient.

If the device you are controlling has buttons/ a remote control or another interface to control it you will need to find out how to capture those state changes and feed them into the state node. Every automation / endpoint is different, but I have included some examples below.

Generally speaking, if you want to be able to view device state in the Alexa App, you should be using an "alexa-smart-home-v3" and an "alexa-smart-home-v3-state" node on every flow - most capabilities support state reporting.

For some commands (increment/ decrement %, temperature, volume), irrespective of your requirement to use the Alexa App you will also require an "alexa-smart-home-v3-state" node.

Expected State Payload

State payload format is very specific - as a minimum you must include msg.acknowledge set to true and a state element update that is relevant for the device. For example, a device that has a PowerController capability can have it's state set if the following is passed to the "alexa-smart-home-v3-state" node:

msg : {
        "acknowledge":true,
        "payload" : {
           "state" : {
               "power": "ON"
           }
        }
    }
    

Remember, if you disable the Auto Acknowledge option on the Default node you must set msg.acknowledge to true later in the flow, otherwise any command and state update will be dropped.

Message msg.state.playback can be one of: "Play", "Pause", "Stop", "FastForward", "Rewind", "StartOver", "Next", "Previous"

Where "||" is listed this implies "OR" - do not include this in your state responses, they will be dropped.

Finally, ensure you use the correct object type in your state updates. For example, where a numerical range or 'number' is specified below ensure you do not supply a string!

msg {
          acknowledge: true,
          payload {
              state { 
                  "brightness": 0-100,
                  "colorbrightness": 0-1,
                  "colorHue": 0-360,
                  "colorSaturation": 0-1,
                  "colorTemperature": 0-10000,
                  "contact": "DETECTED" || "NOT_DETECTED"
                  "input": string,
                  "lock": "LOCKED" || "UNLOCKED",
                  "motion": "DETECTED" || "NOT_DETECTED"
                  "percentage": number,
                  "percentageDelta": number,
                  "playback": "Play",
                  "power": "ON" || "OFF",
                  "temperature": number,
                  "thermostatMode": "HEAT" || "COOL",
                  "thermostatSetPoint" : number,
                  "targetSetpointDelta": number,
                  "volume": number,
                  "volumeDelta": number
              }
          }
      }
      

Capabilities that Support State

Capability Alexa App Google Home
BrightnessController YES YES
ChannelController NO N/A
ColorController YES YES*
ColorTemperatureController YES YES*
ContactSensor YES N/A
InputController NO N/A
LockController YES N/A
MotionSensor YES N/A
PercentageController YES N/A
PlaybackController NO N/A
PowerController YES YES
SceneController NO NO
Speaker YES N/A
StepSpeaker NO N/A
TemperatureSensor YES N/A
ThermostatController YES YES

* Google Home support for these states is platform specific (namely, and ironically, iOS support these states).

See here for more information on generating state data.

Example Flows

Have some more you'd like to include? Share the screenshots/ example function code and I'll add them to the Wiki! Better still, contribute to the Wiki yourself!

Motion Sensor

Use to send out-of-band state updates to Alexa/ Google Home. You can then use motion sensors as triggers in routines created via the Alexa / Google Home App.

Motion Sensor flow example

"MQTT > NodeRed Smart Home Control" function code below:

// Motion State
            if (msg.payload == "ON") {
                return { "payload" : { "state" : { "motion" : "DETECTED" } }, "acknowledge" : true };     
            }
            else if (msg.payload == "OFF") {
                return { "payload" : { "state" : { "motion" : "NOT_DETECTED" } }, "acknowledge" : true };     
            }
    

PowerController and BrightnessController

Use to control Smart Switches, Plugs, Bulbs and other devices that need to be turned on and off. You need to include this capability on Smart Bulbs, AVRs etc. The example below controls a Tasmota flashed smart light switch that supports PowerController and BrightnessController functionality.

PowerController flow example

"Handle Power and Brightness Commands" function code below:

if (msg.command == "TurnOn" || msg.command == "TurnOff") {
          msg.topic = "cmnd/sonoff-ydm-2/POWER"
          return msg;
      }
      else if (msg.command == "SetBrightness") {
          msg.topic = "cmnd/sonoff-ydm-2/Dimmer"
          return msg;
      }
      else if (msg.command == "AdjustBrightness") {
          if (msg.payload > 0) {
              msg.topic = "cmnd/sonoff-ydm-2/Dimmer"
              msg.payload = "+"
              return msg;
          }
          else if (msg.payload < 0) {
              msg.topic = "cmnd/sonoff-ydm-2/Dimmer"
              msg.payload = "-"
              return msg;
          }
      }
      

"MQTT > Alexa Home State" function code below. This function builds the message format expected by the state Node based on the MQTT subscription output.

var tokens = msg.topic.split("/");
      var device = tokens[1];
      var element = tokens[2]
      var state = msg.payload;
      
      // MQTT POWER State
      if (element == 'POWER') {
          return { "payload" : { "state" : { "power" : state } }, "acknowledge" : true };
      }
      
      // MQTT Brightness State
      if (element == "RESULT") {
          var payloadJSON = JSON.parse(state);
          if (payloadJSON.hasOwnProperty('Dimmer')) {
              return { "payload" : { "state" : { "power" : payloadJSON.POWER, "brightness" : payloadJSON.Dimmer } }, "acknowledge" : true }; 
          }
          else {
              return { "payload" : { "state" : { "power" : payloadJSON.POWER } }, "acknowledge" : true };    
          }
      }
      

PercentageController

For AdjustPercentage commands to function you must include a State node on any device with a PercentageController capability. Whilst PercentageController state is not shown in the Alexa App, the state data is used to calculate the actual value following an AdjustPercentage command (which will return with minus 25 or plus 25, nothe the actual percentage of the device).

Example Outputs

AdjustPercentage

msg : {
          topic: ""
          name: "Test Fan"
          _messageId: "80708daa-a56e-4ed9-8394-7d725d2796c7"
          _endpointId: "104"
          _confId: "bfd0fcf4.bc90e"
          command: "AdjustPercentage"
          extraInfo: object
          empty
          payload: -25
          acknowledge: true
          _msgid: "34bf582c.901a68"
      }
      

SetPercentage

msg : {
        topic: ""
        name: "Test Fan"
        _messageId: "ef87c33a-209b-487e-b883-ff18204936aa"
        _endpointId: "104"
        _confId: "bfd0fcf4.bc90e"
        command: "SetPercentage"
        extraInfo: object
        payload: 25
        acknowledge: true
        _msgid: "e88837e.c1733c8"
    }
    

PlaybackController

This flow shows a simple Playback Controller example for a Kodi RPC endpoint (used as a Plex client). Note that you must install the json-cec plugin on your KODI client for this flow to work.

There is no state supported by the PlaybackController capability.

PowerController flow example

Example flow:

[{"id":"519d45a2.45356c","type":"http request","z":"affa0b92.8813b8","name":"Bedroom Kodi Power On","method":"GET","ret":"txt","url":"http://:8080/jsonrpc?request={\"jsonrpc\":\"2.0\",\"method\":\"Addons.ExecuteAddon\",\"params\":{\"addonid\":\"script.json-cec\",\"params\":{\"command\":\"activate\"}},\"id\":1}","tls":"","x":750,"y":660,"wires":[[]]},{"id":"f2ec1012.29ae2","type":"http request","z":"affa0b92.8813b8","name":"Bedroom Kodi Power Off","method":"GET","ret":"txt","url":"http://:8080/jsonrpc?request={\"jsonrpc\":\"2.0\",\"method\":\"Addons.ExecuteAddon\",\"params\":{\"addonid\":\"script.json-cec\",\"params\":{\"command\":\"standby\"}},\"id\":1}","tls":"","x":1130,"y":700,"wires":[[]]},{"id":"f99e0eb9.00291","type":"http request","z":"affa0b92.8813b8","name":"Bedroom Kodi Stop","method":"GET","ret":"txt","url":"http://:8080/jsonrpc?request={\"jsonrpc\":\"2.0\",\"method\":\"Player.Stop\",\"params\":{\"playerid\":1},\"id\":1}","tls":"","x":730,"y":700,"wires":[["eb1ffd69.c955b"]]},{"id":"eb1ffd69.c955b","type":"delay","z":"affa0b92.8813b8","name":"","pauseType":"delay","timeout":"5","timeoutUnits":"seconds","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"x":940,"y":700,"wires":[["f2ec1012.29ae2"]]},{"id":"7379f6e7.023b28","type":"comment","z":"affa0b92.8813b8","name":"Uses HDMI CEC to Turn on TV","info":"","x":770,"y":620,"wires":[]},{"id":"a917b54d.a91138","type":"switch","z":"affa0b92.8813b8","name":"switch msg.command","property":"command","propertyType":"msg","rules":[{"t":"eq","v":"TurnOn","vt":"str"},{"t":"eq","v":"TurnOff","vt":"str"},{"t":"eq","v":"Pause","vt":"str"},{"t":"eq","v":"Play","vt":"str"},{"t":"eq","v":"Stop","vt":"str"}],"checkall":"true","repair":false,"outputs":5,"x":360,"y":720,"wires":[["519d45a2.45356c"],["f99e0eb9.00291"],["393cc3e.680103c"],["393cc3e.680103c"],["42be5f30.30ed5"]]},{"id":"133b1547.a2447b","type":"alexa-smart-home-v3","z":"affa0b92.8813b8","conf":"bfd0fcf4.bc90e","device":"10","acknowledge":true,"name":"Bedroom TV","topic":"","x":150,"y":720,"wires":[["a917b54d.a91138"]]},{"id":"393cc3e.680103c","type":"http request","z":"affa0b92.8813b8","name":"Bedroom Kodi PlayPause","method":"GET","ret":"txt","url":"http://:8080/jsonrpc?request={\"jsonrpc\":\"2.0\",\"method\":\"Player.PlayPause\",\"params\":{\"playerid\":1},\"id\":1}","tls":"","x":750,"y":740,"wires":[[]]},{"id":"42be5f30.30ed5","type":"http request","z":"affa0b92.8813b8","name":"Bedroom Kodi Stop","method":"GET","ret":"txt","url":"http://:8080/jsonrpc?request={\"jsonrpc\":\"2.0\",\"method\":\"Player.Stop\",\"params\":{\"playerid\":1},\"id\":1}","tls":"","x":730,"y":780,"wires":[[]]}]
    

InputController

This flow shows a simple Input Controller example for a Yamaha MusicCast AV Receiver (using Yamaha AVR Nodes as endpoint). Note that you must install/ use the Yamaha AVR Node-RED nodes.

There is no state supported by the InputController capability.

PowerController flow example

Example flow:

[{"id":"b2e5a71f.ce6948","type":"alexa-smart-home-v3","z":"affa0b92.8813b8","conf":"bfd0fcf4.bc90e","device":"8","acknowledge":true,"name":"AV Receiver","topic":"","x":130,"y":100,"wires":[["b1cb891c.e1d0a8"]]},{"id":"78b9e3f4.f9401c","type":"AVR-Yamaha-put","z":"affa0b92.8813b8","device":"d15a41e7.73539","name":"Set AVR to Input Payload","topic":"Main_Zone.Input.Input_Sel","payload":"","x":670,"y":100,"wires":[[]]},{"id":"b1cb891c.e1d0a8","type":"change","z":"affa0b92.8813b8","name":"Remove spaces from payload","rules":[{"t":"change","p":"payload","pt":"msg","from":" ","fromt":"str","to":"","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":390,"y":100,"wires":[["78b9e3f4.f9401c"]]},{"id":"d15a41e7.73539","type":"avr-yamaha","z":"","name":"Lounge AV Receiver","address":"0.0.0.0","port":"","debug":false}]
    

Response Nodes

By default nodes will automatically acknowledge any request via the Skill API. This means that irrespective of whether the flow generates the desired outcome Alexa will respond as if it has.

You can change this by disabling the "Auto Acknowledge" option and using a Alexa Smart Home v3 Response Node:

Auto Acknowledge

You must inject msg.acknowledge with either a boolean true or false value into the flow prior to the response and state nodes receive the message. Without this element any state update will be discarded and Alexa will report that the device is not responding.

Troubleshooting

When a flow/ state update isn't working you have a few things you can check.

Debug Console

Start with the built-in debug console, available in the Node-RED web-interface. The skill will send message to your individiual console if you send an incorrect state update/ an update that is in the wrong format. You will also be warned if your usage is being throttled.

MQTT Subscription

No errors in the Node-RED debug console? You can use mosquitto_sub to check your account-specific MQTT messages using the commands below - this will enable you to confirm your Node-RED instance is communicating with the skill itself.

mosquitto_sub -h mq-red.cb-net.co.uk -t '#' -v -u <bridge_username> -P '<bridge password>' --capath /etc/ssl/certs --id test-<bridge_username> -p 8883
        

Node-RED Console

A final, and more "involved" approach, is to look at the Node-RED console logs. The skill related Nodes/ contrib output significant information to the console log. Include any output here, and from the commands/ views above if you end up raising an issue on GuitHub.