Python/MQTT/thingsboard basic gpio panel multiple devices.py

import paho.mqtt.client as mqtt
import json

import threading

MQTT_BROKER         = "thingsboard.sysats.tech"
NODE_1_TOKEN        = "rg6k7jyrX31SB36fgH9i"
NODE_2_TOKEN        = "fvKy9HtlofCPIE32VNKm"

node_1_info = {
    "name": 1,
    "gpio_status": {
        1: 0 # We assume that all GPIOs are LOW
    }
}

node_2_info = {
    "name": 2,
    "gpio_status": {
        1: 0 # We assume that all GPIOs are LOW
    }
}

node_1 = mqtt.Client("NODE 1 MQTT ID")
node_2 = mqtt.Client("NODE 2 MQTT ID")

def on_connect(client, userdata, flags, rc):
    if rc==0:
        print("connected OK") #print out when connect sucessfully
    else:
        print("bad connection")  
    
    #Must put those 2 functions inside on_connect() callback function
    client.subscribe("v1/devices/me/rpc/request/+")
    client.publish("v1/devices/me/attributes", get_gpio_status(userdata['gpio_status']))

# The callback for when a PUBLISH message is received from the server.
def on_message(client, userdata, msg):
    print("Node " + str(userdata['name']) + "; Received message: " + str(msg.topic)+ " " +str(msg.payload.decode()))

    data = json.loads(msg.payload)

    set_gpio_status(userdata['gpio_status'], data['params']['pin'], data['params']['enabled'])
    client.publish(msg.topic.replace('request', 'response'), get_gpio_status(userdata['gpio_status']))
    client.publish("v1/devices/me/attributes", get_gpio_status(userdata['gpio_status']))

def set_gpio_status(node_gpio_state, pin, status):
    node_gpio_state[pin] = status

def get_gpio_status(node_gpio_state):
    return json.dumps(node_gpio_state)

def node_initialize(node, token, node_info):
    node.username_pw_set(token)
    node.on_connect = on_connect
    node.on_message = on_message
    node.user_data_set(node_info)
    node.connect(MQTT_BROKER, 1883)
    node.loop_forever()

node_thread_1 = threading.Thread(target=node_initialize, args = (node_1, NODE_1_TOKEN, node_1_info))
node_thread_2 = threading.Thread(target=node_initialize, args = (node_2, NODE_2_TOKEN, node_2_info))

node_thread_1.start()
node_thread_2.start()

node_thread_1.join()
node_thread_2.join()