From 6e740d715f2a682bdccf4dd4d732edcd069f9199 Mon Sep 17 00:00:00 2001 From: MIchael Schlenstedt Date: Sun, 25 Oct 2020 10:50:38 +0100 Subject: [PATCH 1/6] Add MQTT Auth --- sc2mqtt.py | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/sc2mqtt.py b/sc2mqtt.py index ab6e0c9..a3d7609 100755 --- a/sc2mqtt.py +++ b/sc2mqtt.py @@ -68,6 +68,14 @@ async def main(): await ad.init() mqttc = mqtt.Client() mqttc.connect(cfo["broker"]) + if int(cfo["brokerauth"]) == 1: + mqttc.username_pw_set(username=cfo["brokeruser"],password=cfo["brokerpassword"]) + try: + mqttc.connect(cfo["broker"],port=int(cfo["brokerport"])) + except: + _LOGGER.critical("Connection to broker failed") + exit(1) + mqttc.loop_start() loop = asyncio.get_event_loop() @@ -98,7 +106,11 @@ async def configSample(): json.dump({ "user": "test@example.com", "password": "my_very_speciaL_passw0rd", - "broker": "mqtt.local" + "broker": "mqtt.local", + "brokerport": "1883", + "brokerauth": "1", + "brokeruser": "my_broker_usnerame", + "brokerpassword": "my_very_speciaL_bRoker_passw0rd" }, cfile) From 20e57b6d15797f60f78ad67e7e0b4a18a2242eae Mon Sep 17 00:00:00 2001 From: MIchael Schlenstedt Date: Sun, 25 Oct 2020 10:53:23 +0100 Subject: [PATCH 2/6] Send additional numeric-only states --- sc2mqtt.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/sc2mqtt.py b/sc2mqtt.py index a3d7609..cc8076c 100755 --- a/sc2mqtt.py +++ b/sc2mqtt.py @@ -384,7 +384,9 @@ async def updateValues(self, mqttc): state["value"] = self.statusValues[stateId]["calc"](state["value"]) _LOGGER.info("%s -> %s(%s)" %(self.statusValues[stateId]["statusName"], state["textId"], state["value"])) stopic = "skoda2mqtt/%s_%s/STATE"% (vin, self.statusValues[stateId]["statusName"]) + ntopic = "skoda2mqtt/%s_%s/STATENUM"% (vin, self.statusValues[stateId]["statusName"]) spayload = "%s(%s)" %(state["textId"], state["value"]) if state["textId"] != state["value"] else state["value"] + npayload = "%s" % state["value"] if stateId not in self.configured: self.configured.append(stateId) ctopic = "homeassistant/sensor/skoda2mqtt/%s_%s/config" % (vin, self.statusValues[stateId]["statusName"]) @@ -399,6 +401,7 @@ async def updateValues(self, mqttc): mqttc.publish(ctopic, json.dumps(cpayload)) mqttc.publish(stopic, spayload) + mqttc.publish(ntopic, npayload) publishdict[self.statusValues[stateId]["statusName"]] = {"value": state["value"], "textId": state["textId"]}; for sl in STATLIMITS: From 9e856f1f2ae7b54a9f5d0a804a6316b2ed91a972 Mon Sep 17 00:00:00 2001 From: MIchael Schlenstedt Date: Thu, 31 Dec 2020 10:44:32 +0100 Subject: [PATCH 3/6] Replace brokerauth option with more convenient way --- sc2mqtt.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/sc2mqtt.py b/sc2mqtt.py index cc8076c..18b19d5 100755 --- a/sc2mqtt.py +++ b/sc2mqtt.py @@ -68,8 +68,10 @@ async def main(): await ad.init() mqttc = mqtt.Client() mqttc.connect(cfo["broker"]) - if int(cfo["brokerauth"]) == 1: + if cfo["brokeruser"] and cfo["brokerpassword"]: mqttc.username_pw_set(username=cfo["brokeruser"],password=cfo["brokerpassword"]) + if not cfo["brokerport"]: + cfo["brokerport"] == 1883 try: mqttc.connect(cfo["broker"],port=int(cfo["brokerport"])) except: @@ -108,7 +110,6 @@ async def configSample(): "password": "my_very_speciaL_passw0rd", "broker": "mqtt.local", "brokerport": "1883", - "brokerauth": "1", "brokeruser": "my_broker_usnerame", "brokerpassword": "my_very_speciaL_bRoker_passw0rd" }, cfile) From eb2999b9b3282b7b5a4968e4e4842c7caa70c367 Mon Sep 17 00:00:00 2001 From: mschlenstedt Date: Thu, 31 Dec 2020 11:09:07 +0100 Subject: [PATCH 4/6] Correct check for keys in cfo --- sc2mqtt.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sc2mqtt.py b/sc2mqtt.py index 18b19d5..8948550 100755 --- a/sc2mqtt.py +++ b/sc2mqtt.py @@ -68,9 +68,9 @@ async def main(): await ad.init() mqttc = mqtt.Client() mqttc.connect(cfo["broker"]) - if cfo["brokeruser"] and cfo["brokerpassword"]: + if "brokeruser" in cfo and "brokerpassword" in cfo: mqttc.username_pw_set(username=cfo["brokeruser"],password=cfo["brokerpassword"]) - if not cfo["brokerport"]: + if "brokerport" not in cfo: cfo["brokerport"] == 1883 try: mqttc.connect(cfo["broker"],port=int(cfo["brokerport"])) From e294eddd83757e37e1a051f3f0c3b5d9894d4cc7 Mon Sep 17 00:00:00 2001 From: MIchael Schlenstedt Date: Thu, 31 Dec 2020 11:16:03 +0100 Subject: [PATCH 5/6] Restore to original --- sc2mqtt.py | 18 +----------------- 1 file changed, 1 insertion(+), 17 deletions(-) mode change 100755 => 100644 sc2mqtt.py diff --git a/sc2mqtt.py b/sc2mqtt.py old mode 100755 new mode 100644 index 18b19d5..ab6e0c9 --- a/sc2mqtt.py +++ b/sc2mqtt.py @@ -68,16 +68,6 @@ async def main(): await ad.init() mqttc = mqtt.Client() mqttc.connect(cfo["broker"]) - if cfo["brokeruser"] and cfo["brokerpassword"]: - mqttc.username_pw_set(username=cfo["brokeruser"],password=cfo["brokerpassword"]) - if not cfo["brokerport"]: - cfo["brokerport"] == 1883 - try: - mqttc.connect(cfo["broker"],port=int(cfo["brokerport"])) - except: - _LOGGER.critical("Connection to broker failed") - exit(1) - mqttc.loop_start() loop = asyncio.get_event_loop() @@ -108,10 +98,7 @@ async def configSample(): json.dump({ "user": "test@example.com", "password": "my_very_speciaL_passw0rd", - "broker": "mqtt.local", - "brokerport": "1883", - "brokeruser": "my_broker_usnerame", - "brokerpassword": "my_very_speciaL_bRoker_passw0rd" + "broker": "mqtt.local" }, cfile) @@ -385,9 +372,7 @@ async def updateValues(self, mqttc): state["value"] = self.statusValues[stateId]["calc"](state["value"]) _LOGGER.info("%s -> %s(%s)" %(self.statusValues[stateId]["statusName"], state["textId"], state["value"])) stopic = "skoda2mqtt/%s_%s/STATE"% (vin, self.statusValues[stateId]["statusName"]) - ntopic = "skoda2mqtt/%s_%s/STATENUM"% (vin, self.statusValues[stateId]["statusName"]) spayload = "%s(%s)" %(state["textId"], state["value"]) if state["textId"] != state["value"] else state["value"] - npayload = "%s" % state["value"] if stateId not in self.configured: self.configured.append(stateId) ctopic = "homeassistant/sensor/skoda2mqtt/%s_%s/config" % (vin, self.statusValues[stateId]["statusName"]) @@ -402,7 +387,6 @@ async def updateValues(self, mqttc): mqttc.publish(ctopic, json.dumps(cpayload)) mqttc.publish(stopic, spayload) - mqttc.publish(ntopic, npayload) publishdict[self.statusValues[stateId]["statusName"]] = {"value": state["value"], "textId": state["textId"]}; for sl in STATLIMITS: From d61b09e2ee37c1c25178dc627ebde23e76f8da38 Mon Sep 17 00:00:00 2001 From: MIchael Schlenstedt Date: Sat, 2 Jan 2021 09:08:57 +0100 Subject: [PATCH 6/6] Add logfile option; make configfile and loglevel adjustable --- sc2mqtt.py | 36 +++++++++++++++++++++++++++++++++--- 1 file changed, 33 insertions(+), 3 deletions(-) mode change 100644 => 100755 sc2mqtt.py diff --git a/sc2mqtt.py b/sc2mqtt.py old mode 100644 new mode 100755 index ab6e0c9..fe17696 --- a/sc2mqtt.py +++ b/sc2mqtt.py @@ -19,6 +19,8 @@ from colorlog import ColoredFormatter +import getopt +import sys def setup_logger(name): """Return a logger with a default ColoredFormatter.""" @@ -39,7 +41,21 @@ def setup_logger(name): handler = logging.StreamHandler() handler.setFormatter(formatter) logger.addHandler(handler) - logger.setLevel(logging.DEBUG) + + if loglevel: + logger.setLevel(getattr(logging, loglevel.upper(), None)) + else: + logger.setLevel(logging.DEBUG) + + if logfile: + fileformatter = ColoredFormatter( + "[%(levelname)-8s]-%(asctime)s %(message)s", + datefmt='%Y-%m-%d %H:%M:%S', + reset=False + ) + filehandler = logging.FileHandler(logfile) + filehandler.setFormatter(fileformatter) + logger.addHandler(filehandler) return logger @@ -52,12 +68,26 @@ def setup_logger(name): { "mask": r"STATE.*COVER", "check": "window_closed", "fail": 0 }, ] +# Defaults and Command line +logfile="" +configfile="config.json" +loglevel="DEBUG" +opts, args = getopt.getopt(sys.argv[1:], 'f:l:c:', ['logfile=', 'loglevel=', 'configfile=']) +for opt, arg in opts: + if opt in ('-f', '--logfile'): + logfile=arg + elif opt in ('-l', '--loglevel'): + loglevel=arg + elif opt in ('-c', '--configfile'): + configfile=arg + #logging.basicConfig(level=logging.INFO) _LOGGER = setup_logger("s2m") async def main(): + try: - with open("config.json", "r") as cfile: + with open(configfile, "r") as cfile: cfo = json.load(cfile) for el in ["user", "password", "broker"]: @@ -916,7 +946,7 @@ async def init(self): v = (await self.getVehicles())['userVehicles']['vehicle'] for car in self.vehicles: s = await self.getVehicleData(car) - t = await self.getVehicleRights(car) + # t = await self.getVehicleRights(car) hr = await self.getHomeRegion(car) rq = await self.getVehicleStatus(car)