From cdc966cccdd29ef63f935eb5af69853025ea7985 Mon Sep 17 00:00:00 2001 From: Juan Carlos Heredia Date: Tue, 13 Jun 2023 16:31:36 +0200 Subject: [PATCH 01/17] Improve calculate acurrate power on AC charging --- teslamate_mqtt2abrp.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/teslamate_mqtt2abrp.py b/teslamate_mqtt2abrp.py index e84914a..a69b632 100644 --- a/teslamate_mqtt2abrp.py +++ b/teslamate_mqtt2abrp.py @@ -216,7 +216,7 @@ def on_message(client, userdata, message): #print("Unneeded topic:", message.topic, payload) # Calculate acurrate power on AC charging - if data["power"] != 0.0 and data["is_charging"] == True and "voltage" in data and "current" in data: + if data["is_dcfc"]==False: data["power"] = float(data["current"] * data["voltage"] * charger_phases) / 1000.0 * -1 return From 1398040bcd35bc51a433e05fb40397f8e8d3fd69 Mon Sep 17 00:00:00 2001 From: Juan Carlos Heredia Date: Wed, 19 Jul 2023 09:03:50 +0200 Subject: [PATCH 02/17] fix wrong power on Sleep or Parked --- teslamate_mqtt2abrp.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/teslamate_mqtt2abrp.py b/teslamate_mqtt2abrp.py index a69b632..4810c0e 100644 --- a/teslamate_mqtt2abrp.py +++ b/teslamate_mqtt2abrp.py @@ -308,6 +308,8 @@ def updateABRP(): msg = str_now + ": Car is " + state msgDetails = "Data object sent:" if(state == "parked" or state == "online" or state == "suspended" or state=="asleep" or state=="offline"): #if parked, update every 30 cylces/seconds + if data["power"] != 0: #Sometimes after charging it keeps the last Power and not refresh any more until new drive or charge. + data["power"] = 0 if "kwh_charged" in data: del data["kwh_charged"] if(i%30==0 or i>30): From 37e17b2a1ed2e6e56ee93b69ad488fdaa268fb96 Mon Sep 17 00:00:00 2001 From: Juan Carlos Heredia Date: Thu, 12 Oct 2023 02:40:07 +0200 Subject: [PATCH 03/17] fix tlm json to send --- teslamate_mqtt2abrp.py | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/teslamate_mqtt2abrp.py b/teslamate_mqtt2abrp.py index cb1e63e..ec219a3 100644 --- a/teslamate_mqtt2abrp.py +++ b/teslamate_mqtt2abrp.py @@ -28,6 +28,7 @@ import os import paho.mqtt.client as mqtt import requests +import json from time import sleep from docopt import docopt @@ -278,9 +279,17 @@ def updateABRP(): global data global APIKEY global USERTOKEN + + # Convert the dictionary to a JSON string + json_data = json.dumps(data) + + # Now, json_string contains the JSON representation of the 'data' dictionary + msgDetails = "Data object sent:" + print(msgDetails, json_data) + try: headers = {"Authorization": "APIKEY "+APIKEY} - body = {"tlm": data} + body = {"tlm": json_data} response = requests.post("https://api.iternio.com/1/tlm/send?token="+USERTOKEN, headers=headers, json=body) resp = response.json() if resp["status"] != "ok": @@ -301,10 +310,8 @@ def updateABRP(): current_datetime = datetime.datetime.now(datetime.UTC) current_timetuple = current_datetime.timetuple() data["utc"] = calendar.timegm(current_timetuple) #utc timestamp must be in every message - str_now = current_datetime.strftime("%Y-%m-%d %H:%M:%S") msg = str_now + ": Car is " + state - msgDetails = "Data object sent:" if(state == "parked" or state == "online" or state == "suspended" or state=="asleep" or state=="offline"): #if parked, update every 30 cylces/seconds if data["power"] != 0: #Sometimes after charging it keeps the last Power and not refresh any more until new drive or charge. data["power"] = 0 @@ -312,17 +319,14 @@ def updateABRP(): del data["kwh_charged"] if(i%30==0 or i>30): print(msg + ", updating every 30s.") - print(msgDetails, data) updateABRP() i = 0 elif state == "charging": #if charging, update every 6 cycles/seconds if i%6==0: print(msg +", updating every 6s.") - print(msgDetails, data) updateABRP() elif state == "driving": #if driving, update every cycle/second print(msg + ", updating every second.") - print(msgDetails, data) updateABRP() else: print(msg + " (unknown state), not sending any update to ABRP.") From 30e62c91037e275a06ba02c71692fc0836c63447 Mon Sep 17 00:00:00 2001 From: Juan Carlos Heredia Date: Thu, 12 Oct 2023 02:48:57 +0200 Subject: [PATCH 04/17] Fix power --- teslamate_mqtt2abrp.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/teslamate_mqtt2abrp.py b/teslamate_mqtt2abrp.py index ec219a3..59c13f7 100644 --- a/teslamate_mqtt2abrp.py +++ b/teslamate_mqtt2abrp.py @@ -280,7 +280,7 @@ def updateABRP(): global APIKEY global USERTOKEN - # Convert the dictionary to a JSON string + # Convert the dictionary to a correct formatted JSON string json_data = json.dumps(data) # Now, json_string contains the JSON representation of the 'data' dictionary @@ -313,8 +313,8 @@ def updateABRP(): str_now = current_datetime.strftime("%Y-%m-%d %H:%M:%S") msg = str_now + ": Car is " + state if(state == "parked" or state == "online" or state == "suspended" or state=="asleep" or state=="offline"): #if parked, update every 30 cylces/seconds - if data["power"] != 0: #Sometimes after charging it keeps the last Power and not refresh any more until new drive or charge. - data["power"] = 0 + #if data["power"] != 0: #Sometimes after charging it keeps the last Power and not refresh any more until new drive or charge. + # data["power"] = 0 if "kwh_charged" in data: del data["kwh_charged"] if(i%30==0 or i>30): From a16c3e4648742e3a83e2b4ab39ec25b849278e7c Mon Sep 17 00:00:00 2001 From: Juan Carlos Heredia Date: Thu, 12 Oct 2023 02:53:29 +0200 Subject: [PATCH 05/17] Fix Power on AC charging --- teslamate_mqtt2abrp.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/teslamate_mqtt2abrp.py b/teslamate_mqtt2abrp.py index 59c13f7..df69306 100644 --- a/teslamate_mqtt2abrp.py +++ b/teslamate_mqtt2abrp.py @@ -216,7 +216,7 @@ def on_message(client, userdata, message): #print("Unneeded topic:", message.topic, payload) # Calculate acurrate power on AC charging - if data["is_dcfc"]==False: + if data["is_charging"]==True and data["is_dcfc"]==False: data["power"] = float(data["current"] * data["voltage"] * charger_phases) / 1000.0 * -1 return From 2b893410a5fd221bbcb5fa2ad79094be4ba80f0a Mon Sep 17 00:00:00 2001 From: Juan Carlos Heredia Date: Thu, 12 Oct 2023 03:05:01 +0200 Subject: [PATCH 06/17] Test data --- teslamate_mqtt2abrp.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/teslamate_mqtt2abrp.py b/teslamate_mqtt2abrp.py index df69306..bd920a7 100644 --- a/teslamate_mqtt2abrp.py +++ b/teslamate_mqtt2abrp.py @@ -289,7 +289,7 @@ def updateABRP(): try: headers = {"Authorization": "APIKEY "+APIKEY} - body = {"tlm": json_data} + body = {"tlm": data} response = requests.post("https://api.iternio.com/1/tlm/send?token="+USERTOKEN, headers=headers, json=body) resp = response.json() if resp["status"] != "ok": From a27b8b28ffcd8b79878f4e8adaf696f58baafdec Mon Sep 17 00:00:00 2001 From: Juan Carlos Heredia Date: Thu, 12 Oct 2023 03:11:21 +0200 Subject: [PATCH 07/17] Catch JSONDecodeError --- teslamate_mqtt2abrp.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/teslamate_mqtt2abrp.py b/teslamate_mqtt2abrp.py index bd920a7..da8f289 100644 --- a/teslamate_mqtt2abrp.py +++ b/teslamate_mqtt2abrp.py @@ -289,11 +289,13 @@ def updateABRP(): try: headers = {"Authorization": "APIKEY "+APIKEY} - body = {"tlm": data} + body = {"tlm": json_data} response = requests.post("https://api.iternio.com/1/tlm/send?token="+USERTOKEN, headers=headers, json=body) resp = response.json() if resp["status"] != "ok": print("Response from ABRP:", response.text) + except json.JSONDecodeError as e: + print("JSON decode error:", e) except Exception as ex: print("Unexpected exception while calling ABRP API:", sys.exc_info()[0]) print(ex) From 6671bb2ad083f2f25edad28f91b6ef8be4810b96 Mon Sep 17 00:00:00 2001 From: Juan Carlos Heredia Date: Thu, 12 Oct 2023 03:15:39 +0200 Subject: [PATCH 08/17] Print response.text --- teslamate_mqtt2abrp.py | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/teslamate_mqtt2abrp.py b/teslamate_mqtt2abrp.py index da8f289..f31ebd9 100644 --- a/teslamate_mqtt2abrp.py +++ b/teslamate_mqtt2abrp.py @@ -284,18 +284,16 @@ def updateABRP(): json_data = json.dumps(data) # Now, json_string contains the JSON representation of the 'data' dictionary - msgDetails = "Data object sent:" + msgDetails = "Data object to send:" print(msgDetails, json_data) try: headers = {"Authorization": "APIKEY "+APIKEY} body = {"tlm": json_data} response = requests.post("https://api.iternio.com/1/tlm/send?token="+USERTOKEN, headers=headers, json=body) - resp = response.json() - if resp["status"] != "ok": - print("Response from ABRP:", response.text) - except json.JSONDecodeError as e: - print("JSON decode error:", e) + #resp = response.json() + #if resp["status"] != "ok": + print("Response from ABRP:", response.text) except Exception as ex: print("Unexpected exception while calling ABRP API:", sys.exc_info()[0]) print(ex) From 7f6b3642e214ffe4989ff42b7bf1cdece7886aaa Mon Sep 17 00:00:00 2001 From: Juan Carlos Heredia Date: Thu, 12 Oct 2023 03:21:29 +0200 Subject: [PATCH 09/17] Use of json.dumps --- teslamate_mqtt2abrp.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/teslamate_mqtt2abrp.py b/teslamate_mqtt2abrp.py index f31ebd9..39fc93f 100644 --- a/teslamate_mqtt2abrp.py +++ b/teslamate_mqtt2abrp.py @@ -290,7 +290,7 @@ def updateABRP(): try: headers = {"Authorization": "APIKEY "+APIKEY} body = {"tlm": json_data} - response = requests.post("https://api.iternio.com/1/tlm/send?token="+USERTOKEN, headers=headers, json=body) + response = requests.post("https://api.iternio.com/1/tlm/send?token="+USERTOKEN, headers=headers, json=json.dumps(body)) #resp = response.json() #if resp["status"] != "ok": print("Response from ABRP:", response.text) From e177b1aefe5adf5b193ffa037578ab7de4847696 Mon Sep 17 00:00:00 2001 From: Juan Carlos Heredia Date: Thu, 12 Oct 2023 03:53:54 +0200 Subject: [PATCH 10/17] fix json object format --- teslamate_mqtt2abrp.py | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/teslamate_mqtt2abrp.py b/teslamate_mqtt2abrp.py index 39fc93f..701453c 100644 --- a/teslamate_mqtt2abrp.py +++ b/teslamate_mqtt2abrp.py @@ -280,20 +280,16 @@ def updateABRP(): global APIKEY global USERTOKEN - # Convert the dictionary to a correct formatted JSON string - json_data = json.dumps(data) - - # Now, json_string contains the JSON representation of the 'data' dictionary msgDetails = "Data object to send:" - print(msgDetails, json_data) + print(msgDetails, data) try: headers = {"Authorization": "APIKEY "+APIKEY} - body = {"tlm": json_data} - response = requests.post("https://api.iternio.com/1/tlm/send?token="+USERTOKEN, headers=headers, json=json.dumps(body)) - #resp = response.json() - #if resp["status"] != "ok": - print("Response from ABRP:", response.text) + body = {"tlm": data} + response = requests.post("https://api.iternio.com/1/tlm/send?token="+USERTOKEN, headers=headers, json=body) + resp = response.json() + if resp["status"] != "ok": + print("Response from ABRP:", response.text) except Exception as ex: print("Unexpected exception while calling ABRP API:", sys.exc_info()[0]) print(ex) From e598151858c9c573655a62c42e65a37397a38ff2 Mon Sep 17 00:00:00 2001 From: Juan Carlos Heredia Date: Thu, 12 Oct 2023 03:59:42 +0200 Subject: [PATCH 11/17] Update response message --- teslamate_mqtt2abrp.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/teslamate_mqtt2abrp.py b/teslamate_mqtt2abrp.py index 701453c..9703d69 100644 --- a/teslamate_mqtt2abrp.py +++ b/teslamate_mqtt2abrp.py @@ -290,6 +290,8 @@ def updateABRP(): resp = response.json() if resp["status"] != "ok": print("Response from ABRP:", response.text) + else: + print("Response from ABRP:", resp["status"]) except Exception as ex: print("Unexpected exception while calling ABRP API:", sys.exc_info()[0]) print(ex) From cbfa03619fdb105486b6b13bf6dca8268ea58885 Mon Sep 17 00:00:00 2001 From: Juan Carlos Heredia Date: Sun, 15 Oct 2023 16:20:41 +0200 Subject: [PATCH 12/17] abs for power when charing --- teslamate_mqtt2abrp.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/teslamate_mqtt2abrp.py b/teslamate_mqtt2abrp.py index 9703d69..28b761e 100644 --- a/teslamate_mqtt2abrp.py +++ b/teslamate_mqtt2abrp.py @@ -217,7 +217,7 @@ def on_message(client, userdata, message): # Calculate acurrate power on AC charging if data["is_charging"]==True and data["is_dcfc"]==False: - data["power"] = float(data["current"] * data["voltage"] * charger_phases) / 1000.0 * -1 + data["power"] = abs(float(data["current"] * data["voltage"] * charger_phases) / 1000.0) return From d7d931d4700d8ff1a0484b682b6ebf5c6b4dc7b8 Mon Sep 17 00:00:00 2001 From: Juan Carlos Heredia Date: Sun, 15 Oct 2023 16:23:51 +0200 Subject: [PATCH 13/17] To Debug --- teslamate_mqtt2abrp.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/teslamate_mqtt2abrp.py b/teslamate_mqtt2abrp.py index 28b761e..51f539c 100644 --- a/teslamate_mqtt2abrp.py +++ b/teslamate_mqtt2abrp.py @@ -214,7 +214,9 @@ def on_message(client, userdata, message): else: pass #print("Unneeded topic:", message.topic, payload) - + + print("to Debug: ", data) + # Calculate acurrate power on AC charging if data["is_charging"]==True and data["is_dcfc"]==False: data["power"] = abs(float(data["current"] * data["voltage"] * charger_phases) / 1000.0) From aa4b5fb8c2cc3cec3bb34571eaf71588075ab8c0 Mon Sep 17 00:00:00 2001 From: Juan Carlos Heredia Date: Sun, 15 Oct 2023 16:38:17 +0200 Subject: [PATCH 14/17] Remove ABS and -1 --- teslamate_mqtt2abrp.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/teslamate_mqtt2abrp.py b/teslamate_mqtt2abrp.py index 51f539c..c0429c1 100644 --- a/teslamate_mqtt2abrp.py +++ b/teslamate_mqtt2abrp.py @@ -214,12 +214,10 @@ def on_message(client, userdata, message): else: pass #print("Unneeded topic:", message.topic, payload) - - print("to Debug: ", data) - + # Calculate acurrate power on AC charging if data["is_charging"]==True and data["is_dcfc"]==False: - data["power"] = abs(float(data["current"] * data["voltage"] * charger_phases) / 1000.0) + data["power"] = float(data["current"] * data["voltage"] * charger_phases) / 1000.0 return From 532559447438022e32625650fe9a57539700e800 Mon Sep 17 00:00:00 2001 From: Juan Carlos Heredia Date: Sun, 15 Oct 2023 16:48:27 +0200 Subject: [PATCH 15/17] Calculate acurrate power on AC charging --- teslamate_mqtt2abrp.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/teslamate_mqtt2abrp.py b/teslamate_mqtt2abrp.py index c0429c1..bf210ec 100644 --- a/teslamate_mqtt2abrp.py +++ b/teslamate_mqtt2abrp.py @@ -216,8 +216,8 @@ def on_message(client, userdata, message): #print("Unneeded topic:", message.topic, payload) # Calculate acurrate power on AC charging - if data["is_charging"]==True and data["is_dcfc"]==False: - data["power"] = float(data["current"] * data["voltage"] * charger_phases) / 1000.0 + if data["is_charging"]==True and data["is_dcfc"]==False and "voltage" in data and "current" in data: + data["power"] = float(data["current"] * data["voltage"] * charger_phases) / 1000.0 * -1 return From f7efa32a863d850cb20073b98cd53b871bf34224 Mon Sep 17 00:00:00 2001 From: Juan Carlos Heredia Date: Sun, 15 Oct 2023 17:14:57 +0200 Subject: [PATCH 16/17] Control Power after suspended --- teslamate_mqtt2abrp.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/teslamate_mqtt2abrp.py b/teslamate_mqtt2abrp.py index bf210ec..595ee8d 100644 --- a/teslamate_mqtt2abrp.py +++ b/teslamate_mqtt2abrp.py @@ -311,8 +311,8 @@ def updateABRP(): str_now = current_datetime.strftime("%Y-%m-%d %H:%M:%S") msg = str_now + ": Car is " + state if(state == "parked" or state == "online" or state == "suspended" or state=="asleep" or state=="offline"): #if parked, update every 30 cylces/seconds - #if data["power"] != 0: #Sometimes after charging it keeps the last Power and not refresh any more until new drive or charge. - # data["power"] = 0 + if data["power"] != 0: #Sometimes after charging it keeps the last Power and not refresh any more until new drive or charge. + data["power"] = 0.0 if "kwh_charged" in data: del data["kwh_charged"] if(i%30==0 or i>30): From fbdb9393a1c069d8fb83d970b0e46c566d12a997 Mon Sep 17 00:00:00 2001 From: Julien <6372605+fetzu@users.noreply.github.com> Date: Fri, 20 Oct 2023 20:10:51 +0200 Subject: [PATCH 17/17] fix: minor corrections to PR #39 ~ Changes in logging/print of API request success/error ~ Fixes in formatting --- teslamate_mqtt2abrp.py | 56 ++++++++++++++++++++---------------------- 1 file changed, 26 insertions(+), 30 deletions(-) diff --git a/teslamate_mqtt2abrp.py b/teslamate_mqtt2abrp.py index 595ee8d..da44e08 100644 --- a/teslamate_mqtt2abrp.py +++ b/teslamate_mqtt2abrp.py @@ -28,7 +28,6 @@ import os import paho.mqtt.client as mqtt import requests -import json from time import sleep from docopt import docopt @@ -149,13 +148,13 @@ def on_message(client, userdata, message): data["speed"] = int(payload) elif topic_postfix == "power": data["power"] = float(payload) - if(data["is_charging"]==True and int(payload)<-11): - data["is_dcfc"]=True + if(data["is_charging"] == True and int(payload)<-11): + data["is_dcfc"] = True elif topic_postfix == "charger_power": if(payload!='' and int(payload)!=0): - data["is_charging"]=True + data["is_charging"] = True if int(payload)>11: - data["is_dcfc"]=True + data["is_dcfc"] = True elif topic_postfix == "heading": data["heading"] = int(payload) elif topic_postfix == "outside_temp": @@ -180,27 +179,27 @@ def on_message(client, userdata, message): del data["voltage"] elif topic_postfix == "shift_state": if payload == "P": - data["is_parked"]=True + data["is_parked"] = True elif(payload == "D" or payload == "R"): - data["is_parked"]=False + data["is_parked"] = False elif topic_postfix == "state": state = payload - if payload=="driving": - data["is_parked"]=False - data["is_charging"]=False - data["is_dcfc"]=False - elif payload=="charging": - data["is_parked"]=True - data["is_charging"]=True - data["is_dcfc"]=False - elif payload=="supercharging": - data["is_parked"]=True - data["is_charging"]=True - data["is_dcfc"]=True - elif(payload=="online" or payload=="suspended" or payload=="asleep"): - data["is_parked"]=True - data["is_charging"]=False - data["is_dcfc"]=False + if payload == "driving": + data["is_parked"] = False + data["is_charging"] = False + data["is_dcfc"] = False + elif payload == "charging": + data["is_parked"] = True + data["is_charging"] = True + data["is_dcfc"] = False + elif payload == "supercharging": + data["is_parked"] = True + data["is_charging"] = True + data["is_dcfc"] = True + elif(payload == "online" or payload == "suspended" or payload == "asleep"): + data["is_parked"] = True + data["is_charging"] = False + data["is_dcfc"] = False elif topic_postfix == "usable_battery_level": #State of Charge of the vehicle (what's displayed on the dashboard of the vehicle is preferred) data["soc"] = int(payload) elif topic_postfix == "charge_energy_added": @@ -216,7 +215,7 @@ def on_message(client, userdata, message): #print("Unneeded topic:", message.topic, payload) # Calculate acurrate power on AC charging - if data["is_charging"]==True and data["is_dcfc"]==False and "voltage" in data and "current" in data: + if data["is_charging"] == True and data["is_dcfc"] == False and "voltage" in data and "current" in data: data["power"] = float(data["current"] * data["voltage"] * charger_phases) / 1000.0 * -1 return @@ -280,18 +279,15 @@ def updateABRP(): global APIKEY global USERTOKEN - msgDetails = "Data object to send:" - print(msgDetails, data) - try: headers = {"Authorization": "APIKEY "+APIKEY} body = {"tlm": data} response = requests.post("https://api.iternio.com/1/tlm/send?token="+USERTOKEN, headers=headers, json=body) resp = response.json() if resp["status"] != "ok": - print("Response from ABRP:", response.text) + print("Error, response from the ABRP API:", response.text) else: - print("Response from ABRP:", resp["status"]) + print("Data object successfully sent:", data) except Exception as ex: print("Unexpected exception while calling ABRP API:", sys.exc_info()[0]) print(ex) @@ -311,7 +307,7 @@ def updateABRP(): str_now = current_datetime.strftime("%Y-%m-%d %H:%M:%S") msg = str_now + ": Car is " + state if(state == "parked" or state == "online" or state == "suspended" or state=="asleep" or state=="offline"): #if parked, update every 30 cylces/seconds - if data["power"] != 0: #Sometimes after charging it keeps the last Power and not refresh any more until new drive or charge. + if data["power"] != 0: #sometimes after charging the last power value is kept and not refreshed until the next drive or charge session. data["power"] = 0.0 if "kwh_charged" in data: del data["kwh_charged"]