Setup Starlink MQTT

Using the MQTT tool from the link below, I can publish status information from my Starlink receiver and listen to it in Mosquitto broker (see image).

Need help with next steps to make this information available in Home Assistant. I see there are several MQTT integrations. I’ve been looking at the docs to set one up but this is new to me, I’m new to HA and this is my first exposure to MQTT.

StarlinkMQTT

I see now, I need to add each topic to the config individually,

Update:

Below are the topics I found broadcast by the starlink-grpc-tools MQTT script, where ut00000000-00000000-00000000 is the unique Device ID of the Starlink dish. I have not tested them all.

To get the dish info I’ve added dish_grpc_mqtt.py status --hostname 192.168.xxx.xxx --port 1883 -t 10 to task scheduler on a Windows machine, it seems to be working.

sensor:
  # dish_grpc_mqtt.py status
  - platform: mqtt
    name: starlink_hardware_version
    state_topic: starlink/dish_status/ut00000000-00000000-00000000/hardware_version
  - platform: mqtt
    name: starlink_software_version
    state_topic: starlink/dish_status/ut00000000-00000000-00000000/software_version
  - platform: mqtt
    name: starlink_state
    state_topic: starlink/dish_status/ut00000000-00000000-00000000/state
  - platform: mqtt
    name: starlink_uptime
    state_topic: starlink/dish_status/ut00000000-00000000-00000000/uptime
  - platform: mqtt
    name: starlink_snr
    state_topic: starlink/dish_status/ut00000000-00000000-00000000/snr
  - platform: mqtt
    name: starlink_seconds_to_first_nonempty_slot
    state_topic: starlink/dish_status/ut00000000-00000000-00000000/seconds_to_first_nonempty_slot
  - platform: mqtt
    name: starlink_pop_ping_drop_rate
    state_topic: starlink/dish_status/ut00000000-00000000-00000000/pop_ping_drop_rate
  - platform: mqtt
    name: starlink_downlink_throughput_bps
    state_topic: starlink/dish_status/ut00000000-00000000-00000000/downlink_throughput_bps
  - platform: mqtt
    name: starlink_uplink_throughput_bps
    state_topic: starlink/dish_status/ut00000000-00000000-00000000/uplink_throughput_bps
  - platform: mqtt
    name: starlink_pop_ping_latency_ms
    state_topic: starlink/dish_status/ut00000000-00000000-00000000/pop_ping_latency_ms
  - platform: mqtt
    name: starlink_alerts
    state_topic: starlink/dish_status/ut00000000-00000000-00000000/alerts
  - platform: mqtt
    name: starlink_fraction_obstructed
    state_topic: starlink/dish_status/ut00000000-00000000-00000000/fraction_obstructed
  - platform: mqtt
    name: starlink_currently_obstructed
    state_topic: starlink/dish_status/ut00000000-00000000-00000000/currently_obstructed
  - platform: mqtt
    name: starlink_seconds_obstructed
    state_topic: starlink/dish_status/ut00000000-00000000-00000000/seconds_obstructed
  - platform: mqtt
    name: starlink_obstruction_duration
    state_topic: starlink/dish_status/ut00000000-00000000-00000000/obstruction_duration
  - platform: mqtt
    name: starlink_obstruction_interval
    state_topic: starlink/dish_status/ut00000000-00000000-00000000/obstruction_interval
  - platform: mqtt
    name: starlink_direction_azimuth
    state_topic: starlink/dish_status/ut00000000-00000000-00000000/direction_azimuth
  - platform: mqtt
    name: starlink_direction_elevation
    state_topic: starlink/dish_status/ut00000000-00000000-00000000/direction_elevation

  # dish_grpc_mqtt.py obstruction_detail
  - platform: mqtt
    name: starlink_wedges_fraction_obstructed
    state_topic: starlink/dish_status/ut00000000-00000000-00000000/wedges_fraction_obstructed
  - platform: mqtt
    name: starlink_raw_wedges_fraction_obstructed
    state_topic: starlink/dish_status/ut00000000-00000000-00000000/raw_wedges_fraction_obstructed
  - platform: mqtt
    name: starlink_valid_s
    state_topic: starlink/dish_status/ut00000000-00000000-00000000/valid_s

  # dish_grpc_mqtt.py alert_detail
  - platform: mqtt
    name: starlink_alert_motors_stuck
    state_topic: starlink/dish_status/ut00000000-00000000-00000000/alert_motors_stuck
  - platform: mqtt
    name: starlink_alert_thermal_throttle
    state_topic: starlink/dish_status/ut00000000-00000000-00000000/alert_thermal_throttle
  - platform: mqtt
    name: starlink_alert_thermal_shutdown
    state_topic: starlink/dish_status/ut00000000-00000000-00000000/alert_thermal_shutdown
  - platform: mqtt
    name: starlink_alert_mast_not_near_vertical
    state_topic: starlink/dish_status/ut00000000-00000000-00000000/alert_mast_not_near_vertical
  - platform: mqtt
    name: starlink_alert_unexpected_location
    state_topic: starlink/dish_status/ut00000000-00000000-00000000/alert_unexpected_location
  - platform: mqtt
    name: starlink_alert_slow_ethernet_speeds
    state_topic: starlink/dish_status/ut00000000-00000000-00000000/alert_slow_ethernet_speeds
  - platform: mqtt
    name: starlink_alert_roaming
    state_topic: starlink/dish_status/ut00000000-00000000-00000000/alert_roaming

  # dish_grpc_mqtt.py ping_drop ping_run_length ping_latency ping_loaded_latency
  - platform: mqtt
    name: starlink_samples
    state_topic: starlink/dish_ping_stats/ut00000000-00000000-00000000/samples
  - platform: mqtt
    name: starlink_end_counter
    state_topic: starlink/dish_ping_stats/ut00000000-00000000-00000000/end_counter
  - platform: mqtt
    name: starlink_total_ping_drop
    state_topic: starlink/dish_ping_stats/ut00000000-00000000-00000000/total_ping_drop
  - platform: mqtt
    name: starlink_count_full_ping_drop
    state_topic: starlink/dish_ping_stats/ut00000000-00000000-00000000/count_full_ping_drop
  - platform: mqtt
    name: starlink_count_obstructed
    state_topic: starlink/dish_ping_stats/ut00000000-00000000-00000000/count_obstructed
  - platform: mqtt
    name: starlink_total_obstructed_ping_drop
    state_topic: starlink/dish_ping_stats/ut00000000-00000000-00000000/total_obstructed_ping_drop
  - platform: mqtt
    name: starlink_count_full_obstructed_ping_drop
    state_topic: starlink/dish_ping_stats/ut00000000-00000000-00000000/count_full_obstructed_ping_drop
  - platform: mqtt
    name: starlink_count_unscheduled
    state_topic: starlink/dish_ping_stats/ut00000000-00000000-00000000/count_unscheduled
  - platform: mqtt
    name: starlink_total_unscheduled_ping_drop
    state_topic: starlink/dish_ping_stats/ut00000000-00000000-00000000/total_unscheduled_ping_drop
  - platform: mqtt
    name: starlink_count_full_unscheduled_ping_drop
    state_topic: starlink/dish_ping_stats/ut00000000-00000000-00000000/count_full_unscheduled_ping_drop
  - platform: mqtt
    name: starlink_init_run_fragment
    state_topic: starlink/dish_ping_stats/ut00000000-00000000-00000000/init_run_fragment
  - platform: mqtt
    name: starlink_final_run_fragment
    state_topic: starlink/dish_ping_stats/ut00000000-00000000-00000000/final_run_fragment
  - platform: mqtt
    name: starlink_run_seconds
    state_topic: starlink/dish_ping_stats/ut00000000-00000000-00000000/run_seconds
  - platform: mqtt
    name: starlink_run_minutes
    state_topic: starlink/dish_ping_stats/ut00000000-00000000-00000000/run_minutes
  - platform: mqtt
    name: starlink_mean_all_ping_latency
    state_topic: starlink/dish_ping_stats/ut00000000-00000000-00000000/mean_all_ping_latency
  - platform: mqtt
    name: starlink_deciles_all_ping_latency
    state_topic: starlink/dish_ping_stats/ut00000000-00000000-00000000/deciles_all_ping_latency
  - platform: mqtt
    name: starlink_mean_full_ping_latency
    state_topic: starlink/dish_ping_stats/ut00000000-00000000-00000000/mean_full_ping_latency
  - platform: mqtt
    name: starlink_deciles_full_ping_latency
    state_topic: starlink/dish_ping_stats/ut00000000-00000000-00000000/deciles_full_ping_latency
  - platform: mqtt
    name: starlink_stdev_full_ping_latency
    state_topic: starlink/dish_ping_stats/ut00000000-00000000-00000000/stdev_full_ping_latency
  - platform: mqtt
    name: starlink_load_bucket_samples
    state_topic: starlink/dish_ping_stats/ut00000000-00000000-00000000/load_bucket_samples
  - platform: mqtt
    name: starlink_load_bucket_min_latency
    state_topic: starlink/dish_ping_stats/ut00000000-00000000-00000000/load_bucket_min_latency
  - platform: mqtt
    name: starlink_load_bucket_median_latency
    state_topic: starlink/dish_ping_stats/ut00000000-00000000-00000000/load_bucket_median_latency
  - platform: mqtt
    name: starlink_load_bucket_max_latency
    state_topic: starlink/dish_ping_stats/ut00000000-00000000-00000000/load_bucket_max_latency

  # dish_grpc_mqtt.py usage
  - platform: mqtt
    name: starlink_download_usage
    state_topic: starlink/dish_usage/ut00000000-00000000-00000000/download_usage
  - platform: mqtt
    name: starlink_upload_usage
    state_topic: starlink/dish_usage/ut00000000-00000000-00000000/upload_usage

Pretty cool stuff. Would be good if there was a starlink integration with discovery but I guess I wouldn’t be learning as much if there were.

I am actually working on building auto-discovery via MQTT for this via Node-Red executing GRPCurl and creating the discovery topics and mqtt updates on intervals. I will post the guide im putting together here as soon as I am done. Or check https://wirelesslywired.com and i should have it up in the next week or two.

This is quick and dirty, if youre unfamiliar with anything I write here, I will be creating a blog post explaining how to install this, but if you want to test or deploy this you will need a few things:
The end result is an auto discovered entity in home assistant that looks like this:

  • A box behind your dishy with Node-Red natively installed (not in docker)
  • On that box have grpcurl installed and executable through node-red’s exec node.
  • have connectivity to the same MQTT broker that your home assistant has.
  • Next youll want to import this flow and change the MQTT broker config to yours:
[{"id":"a5086ebfe7251d3b","type":"exec","z":"5ba4ef406096e71c","command":"grpcurl -plaintext  -d {\\\"getStatus\\\":{}} 192.168.100.1:9200 SpaceX.API.Device.Device/Handle","addpay":"","append":"","useSpawn":"false","timer":"","winHide":false,"oldrc":false,"name":"GRPCURL to SPACE","x":140,"y":280,"wires":[["6387d614b9b6d17c"],[],[]]},{"id":"4b78b8eaa95957d2","type":"inject","z":"5ba4ef406096e71c","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"10","crontab":"","once":true,"onceDelay":"5","topic":"","payload":"","payloadType":"date","x":150,"y":220,"wires":[["a5086ebfe7251d3b"]]},{"id":"6387d614b9b6d17c","type":"json","z":"5ba4ef406096e71c","name":"convert to JSON","property":"payload","action":"","pretty":false,"x":370,"y":280,"wires":[["766a86bc0f8e3fc1"]]},{"id":"766a86bc0f8e3fc1","type":"function","z":"5ba4ef406096e71c","name":"Create Device Array","func":"  msg.device = {};\n  msg.device.identifiers = msg.payload.dishGetStatus.deviceInfo.id;\n  msg.device.name = \"Dishy\" ;\n  msg.device.model = msg.payload.dishGetStatus.deviceInfo.hardwareVersion ;\n  msg.device.sw_version = msg.payload.dishGetStatus.deviceInfo.softwareVersion ;\n//  device.configuration_url = msg.payload[i].url ;\n  msg.device.manufacturer = \"SpaceX\" ;\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":380,"y":320,"wires":[["7729b8890686da31"]]},{"id":"7729b8890686da31","type":"change","z":"5ba4ef406096e71c","name":"Move the Payload","rules":[{"t":"move","p":"payload","pt":"msg","to":"oldpayload","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":370,"y":360,"wires":[["a331c133ba78d14e","02e1038ec2974622","dfb6b5bdd80cf9d8","2036dcf7f86aac51","d8b042b126c11acf","377d73ebd663a747","a4077ff3979daccc"]]},{"id":"a331c133ba78d14e","type":"change","z":"5ba4ef406096e71c","name":"Uptime Discovery","rules":[{"t":"set","p":"payload","pt":"msg","to":"{\t   \"name\": msg.device.name & \" Uptime\" ,\t   \"unique_id\" : msg.device.name & \"-\" & \"uptime\",\t   \"device_class\": \"duration\",\t   \"unit_of_measurement\": \"s\",\t   \"value_template\": \"{{value_json.uptimeS}}\",\t   \"device\": msg.device ,\t   \"icon\": \"mdi:timeline-clock\",\t   \"state_topic\": \"dishy/uptime\"\t}","tot":"jsonata"},{"t":"set","p":"topic","pt":"msg","to":"homeassistant/sensor/dishy/uptime/config","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":630,"y":340,"wires":[["2dc525b7323a066a","b8829e1eb4eabe44"]]},{"id":"02e1038ec2974622","type":"change","z":"5ba4ef406096e71c","name":"Downlink Throughput Discovery","rules":[{"t":"set","p":"payload","pt":"msg","to":"{\t   \"name\": msg.device.name & \" Download\" ,\t   \"unique_id\" : msg.device.name & \"-downlinkmbps\",\t   \"unit_of_measurement\": \"Mbps\",\t   \"value_template\": \"{{value_json.downlinkThroughputmbps}}\",\t   \"device\": msg.device ,\t   \"icon\": \"mdi:chart-line\" ,\t   \"state_topic\": \"dishy/downlinkmbps\"\t}","tot":"jsonata"},{"t":"set","p":"topic","pt":"msg","to":"homeassistant/sensor/dishy/downlinkmbps/config","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":670,"y":280,"wires":[["61f9aae5da21fe13","b8829e1eb4eabe44"]]},{"id":"dfb6b5bdd80cf9d8","type":"change","z":"5ba4ef406096e71c","name":"Downlink Throughput Discovery","rules":[{"t":"set","p":"payload","pt":"msg","to":"{\t   \"name\": msg.device.name & \" Upload\" ,\t   \"unique_id\" : msg.device.name & \"-uplinkmbps\",\t   \"unit_of_measurement\": \"Mbps\",\t   \"value_template\": \"{{value_json.uplinkThroughputmbps}}\",\t   \"device\": msg.device ,\t   \"icon\": \"mdi:chart-line\" ,\t   \"state_topic\": \"dishy/uplinkmbps\"\t}","tot":"jsonata"},{"t":"set","p":"topic","pt":"msg","to":"homeassistant/sensor/dishy/uplinkmbps/config","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":670,"y":200,"wires":[["547bbfd4414fc594","b8829e1eb4eabe44"]]},{"id":"2036dcf7f86aac51","type":"change","z":"5ba4ef406096e71c","name":"Latency Discovery","rules":[{"t":"set","p":"payload","pt":"msg","to":"{\t   \"name\": msg.device.name & \" Latency to POP\" ,\t   \"unique_id\" : msg.device.name & \"-\" & \"latency\",\t   \"unit_of_measurement\": \"ms\",\t   \"value_template\": \"{{value_json.popPingLatencyMs}}\",\t   \"device\": msg.device ,\t   \"icon\": \"mdi:graphql\",\t   \"state_topic\": \"dishy/latency\"\t}","tot":"jsonata"},{"t":"set","p":"topic","pt":"msg","to":"homeassistant/sensor/dishy/latency/config","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":630,"y":400,"wires":[["e71cef43fcf8860c","b8829e1eb4eabe44"]]},{"id":"d8b042b126c11acf","type":"change","z":"5ba4ef406096e71c","name":"Obstruction Time Discovery","rules":[{"t":"set","p":"payload","pt":"msg","to":"{\t   \"name\": msg.device.name & \" Avg Obstruction Time\" ,\t   \"unique_id\" : msg.device.name & \"-\" & \"avgobstruction\",\t   \"device_class\": \"duration\",\t   \"unit_of_measurement\": \"s\",\t   \"value_template\": \"{{value_json.avgProlongedObstructionDurationS}}\",\t   \"device\": msg.device ,\t   \"icon\": \"mdi:timeline-clock\",\t   \"state_topic\": \"dishy/avgobstructiontime\"\t}","tot":"jsonata"},{"t":"set","p":"topic","pt":"msg","to":"homeassistant/sensor/dishy/avgobstime/config","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":660,"y":460,"wires":[["8c763c35c86c31ac","b8829e1eb4eabe44"]]},{"id":"377d73ebd663a747","type":"change","z":"5ba4ef406096e71c","name":"Obstruction Interval Discovery","rules":[{"t":"set","p":"payload","pt":"msg","to":"{\t   \"name\": msg.device.name & \" Avg Obstruction Interval\" ,\t   \"unique_id\" : msg.device.name & \"-\" & \"avgobstructioninterval\",\t   \"device_class\": \"duration\",\t   \"unit_of_measurement\": \"s\",\t   \"value_template\": \"{{value_json.avgProlongedObstructionIntervalS}}\",\t   \"device\": msg.device ,\t   \"icon\": \"mdi:timeline-clock\",\t   \"state_topic\": \"dishy/avgobstructioninterval\"\t}","tot":"jsonata"},{"t":"set","p":"topic","pt":"msg","to":"homeassistant/sensor/dishy/avgobsinterval/config","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":690,"y":520,"wires":[["0e1a718bd4bab144","b8829e1eb4eabe44"]]},{"id":"a4077ff3979daccc","type":"change","z":"5ba4ef406096e71c","name":"Satellites Discovery","rules":[{"t":"set","p":"payload","pt":"msg","to":"{\t   \"name\": msg.device.name & \" Sats\" ,\t   \"unique_id\" : msg.device.name & \"-\" & \"sats\",\t   \"unit_of_measurement\": \"Satellites\",\t   \"value_template\": \"{{value_json.gpsSats}}\",\t   \"device\": msg.device ,\t   \"icon\": \"mdi:satellite-variant\",\t   \"state_topic\": \"dishy/sats\"\t}","tot":"jsonata"},{"t":"set","p":"topic","pt":"msg","to":"homeassistant/sensor/dishy/sats/config","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":650,"y":580,"wires":[["700ba7c55877f60b","b8829e1eb4eabe44"]]},{"id":"2dc525b7323a066a","type":"change","z":"5ba4ef406096e71c","name":"Uptime State","rules":[{"t":"move","p":"payload","pt":"msg","to":"discovery_payload","tot":"msg"},{"t":"set","p":"payload","pt":"msg","to":"oldpayload.dishGetStatus.deviceState","tot":"msg","dc":true},{"t":"set","p":"topic","pt":"msg","to":"dishy/uptime","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":910,"y":340,"wires":[["c211d3b312a7b774"]]},{"id":"b8829e1eb4eabe44","type":"mqtt out","z":"5ba4ef406096e71c","name":"Discovery Configuration","topic":"","qos":"","retain":"true","respTopic":"","contentType":"","userProps":"","correl":"","expiry":"","broker":"e2017447d7647e70","x":1530,"y":300,"wires":[]},{"id":"61f9aae5da21fe13","type":"change","z":"5ba4ef406096e71c","name":"Downlink Mbps State","rules":[{"t":"move","p":"payload","pt":"msg","to":"discovery_payload","tot":"msg"},{"t":"set","p":"payload","pt":"msg","to":"oldpayload.dishGetStatus.downlinkThroughputBps","tot":"msg","dc":true},{"t":"set","p":"topic","pt":"msg","to":"dishy/downlinkmbps","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":940,"y":280,"wires":[["68b745915d488b48"]]},{"id":"547bbfd4414fc594","type":"change","z":"5ba4ef406096e71c","name":"Uplink Mbps State","rules":[{"t":"move","p":"payload","pt":"msg","to":"discovery_payload","tot":"msg"},{"t":"set","p":"payload","pt":"msg","to":"oldpayload.dishGetStatus.uplinkThroughputBps","tot":"msg","dc":true},{"t":"set","p":"topic","pt":"msg","to":"dishy/uplinkmbps","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":930,"y":200,"wires":[["2ea85b8117c89502"]]},{"id":"e71cef43fcf8860c","type":"change","z":"5ba4ef406096e71c","name":"Latency State","rules":[{"t":"move","p":"payload","pt":"msg","to":"discovery_payload","tot":"msg"},{"t":"set","p":"payload.popPingLatencyMs","pt":"msg","to":"oldpayload.dishGetStatus.popPingLatencyMs","tot":"msg","dc":true},{"t":"set","p":"topic","pt":"msg","to":"dishy/latency","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":940,"y":400,"wires":[["d8fe2ba431bdb511"]]},{"id":"8c763c35c86c31ac","type":"change","z":"5ba4ef406096e71c","name":"Obstruction Time State","rules":[{"t":"move","p":"payload","pt":"msg","to":"discovery_payload","tot":"msg"},{"t":"set","p":"payload.avgProlongedObstructionDurationS","pt":"msg","to":"oldpayload.dishGetStatus.obstructionStats.avgProlongedObstructionDurationS","tot":"msg","dc":true},{"t":"set","p":"topic","pt":"msg","to":"dishy/avgobstructiontime","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":950,"y":460,"wires":[["fe4ed274ad3c7189"]]},{"id":"0e1a718bd4bab144","type":"change","z":"5ba4ef406096e71c","name":"Obstruction Time State","rules":[{"t":"move","p":"payload","pt":"msg","to":"discovery_payload","tot":"msg"},{"t":"set","p":"payload.avgProlongedObstructionIntervalS","pt":"msg","to":"oldpayload.dishGetStatus.obstructionStats.avgProlongedObstructionIntervalS","tot":"msg","dc":true},{"t":"set","p":"topic","pt":"msg","to":"dishy/avgobstructioninterval","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":970,"y":520,"wires":[["7f9c7d6a95897d6e"]]},{"id":"700ba7c55877f60b","type":"change","z":"5ba4ef406096e71c","name":"Satellites State","rules":[{"t":"move","p":"payload","pt":"msg","to":"discovery_payload","tot":"msg"},{"t":"set","p":"payload.gpsSats","pt":"msg","to":"oldpayload.dishGetStatus.gpsStats.gpsSats","tot":"msg","dc":true},{"t":"set","p":"topic","pt":"msg","to":"dishy/sats","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":880,"y":580,"wires":[["c211d3b312a7b774","4e3d8b28bb7e3b62"]]},{"id":"c211d3b312a7b774","type":"mqtt out","z":"5ba4ef406096e71c","name":"Data Topics","topic":"","qos":"","retain":"false","respTopic":"","contentType":"","userProps":"","correl":"","expiry":"","broker":"e2017447d7647e70","x":1510,"y":400,"wires":[]},{"id":"68b745915d488b48","type":"function","z":"5ba4ef406096e71c","name":"Bits to Mbits","func":"msg.payloadbps = msg.payload\ndelete msg.payload\nmsg.payload = {};\nmsg.payload.downlinkmbps = msg.payloadbps / 1000000\nmsg.payload.downlinkThroughputmbps = parseFloat(msg.payload.downlinkmbps.toFixed(2));\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":1150,"y":280,"wires":[["c211d3b312a7b774","943185c20352c9f9"]]},{"id":"2ea85b8117c89502","type":"function","z":"5ba4ef406096e71c","name":"Bits to Mbits","func":"msg.payloadbps = msg.payload\ndelete msg.payload\nmsg.payload = {};\nmsg.payload.uplinkmbps = msg.payloadbps / 1000000\nmsg.payload.uplinkThroughputmbps = parseFloat(msg.payload.uplinkmbps.toFixed(2));\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":1150,"y":200,"wires":[["943185c20352c9f9","c211d3b312a7b774"]]},{"id":"d8fe2ba431bdb511","type":"function","z":"5ba4ef406096e71c","name":"Latency Normalizer","func":"msg.payload.popPingLatencyMs = parseFloat(msg.payload.popPingLatencyMs.toFixed(2));\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":1170,"y":400,"wires":[["c211d3b312a7b774"]]},{"id":"fe4ed274ad3c7189","type":"function","z":"5ba4ef406096e71c","name":"Latency Normalizer","func":"msg.payload.avgProlongedObstructionDurationS = parseFloat(msg.payload.avgProlongedObstructionDurationS.toFixed(2));\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":1190,"y":460,"wires":[["c211d3b312a7b774"]]},{"id":"7f9c7d6a95897d6e","type":"function","z":"5ba4ef406096e71c","name":"Latency Normalizer","func":"msg.payload.avgProlongedObstructionIntervalS = parseFloat(msg.payload.avgProlongedObstructionIntervalS.toFixed(2));\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":1190,"y":520,"wires":[["c211d3b312a7b774"]]},{"id":"4e3d8b28bb7e3b62","type":"debug","z":"5ba4ef406096e71c","name":"","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":1470,"y":480,"wires":[]},{"id":"943185c20352c9f9","type":"debug","z":"5ba4ef406096e71c","name":"","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":1470,"y":120,"wires":[]},{"id":"e2017447d7647e70","type":"mqtt-broker","name":"HomeAssistant","broker":"10.10.1.2","port":"1883","clientid":"","autoConnect":true,"usetls":false,"protocolVersion":"5","keepalive":"60","cleansession":true,"birthTopic":"","birthQos":"0","birthPayload":"","birthMsg":{},"closeTopic":"","closeQos":"0","closePayload":"","closeMsg":{},"willTopic":"","willQos":"0","willPayload":"","willMsg":{},"sessionExpiry":""}]

The flow looks like this:

Just getting this error. What can be wrong here ?image

Do you have GRPCurl installed on the box and node-red running directly on the system? @andriuskr