From 19eedb4335a4e11281d27159c29516fcb43b3c2e Mon Sep 17 00:00:00 2001
From: Ellis Percival <flyte@failcode.co.uk>
Date: Tue, 30 Jan 2018 17:03:40 +0000
Subject: [PATCH] Use hash of topic_prefix as client ID. #24

---
 config.schema.yml      |  4 ++++
 pi_mqtt_gpio/server.py | 12 +++++++++++-
 2 files changed, 15 insertions(+), 1 deletion(-)

diff --git a/config.schema.yml b/config.schema.yml
index 4dca87c..970e884 100644
--- a/config.schema.yml
+++ b/config.schema.yml
@@ -21,6 +21,10 @@ mqtt:
       type: string
       required: no
       default: ""
+    client_id:
+      type: string
+      required: no
+      default: ""
     topic_prefix:
       type: string
       required: no
diff --git a/pi_mqtt_gpio/server.py b/pi_mqtt_gpio/server.py
index aacd322..59d5b86 100644
--- a/pi_mqtt_gpio/server.py
+++ b/pi_mqtt_gpio/server.py
@@ -5,6 +5,7 @@ import sys
 import socket
 from time import sleep, time
 from importlib import import_module
+from hashlib import sha1
 
 import paho.mqtt.client as mqtt
 import cerberus
@@ -254,7 +255,16 @@ def init_mqtt(config, digital_outputs):
     protocol = mqtt.MQTTv311
     if config["protocol"] == "3.1":
         protocol = mqtt.MQTTv31
-    client = mqtt.Client(protocol=protocol)
+
+    # https://stackoverflow.com/questions/45774538/what-is-the-maximum-length-of-client-id-in-mqtt
+    # TLDR: Soft limit of 23, but we needn't truncate it on our end.
+    client_id = config['client_id']
+    if not client_id:
+        client_id = "pi-mqtt-gpio-%s" % sha1(
+            topic_prefix.encode('utf8')).hexdigest()
+
+    client = mqtt.Client(
+        client_id=client_id, clean_session=False, protocol=protocol)
 
     if config["user"] and config["password"]:
         client.username_pw_set(config["user"], config["password"])
-- 
GitLab