"""
Dies ist das Konfigurationsfile. Hier bitte nach eigenen Gegebenheiten eintragen. soc_helper
entdeckt Schreibzugriffe auf die Datei und liest sie neu ein. Bitte trotzdem die Ausgabe in
nohup.out oder auf der Konsole beachten, falls etwas Ungültiges abgespeichert wurde.
"""

"""
Spritmonitor-Konfiguration.
WICHTIG: Es muß eine gültige Umgebungsvariable SPRITMONITOR_BEARER_TOKEN geben. Diese kann
bei Spritmonitor.de auf der Passwort-Vergessen-Seite angefordert werden. Eine Umgebungs-
variable wird verwendet, damit nicht aus versehen der Zugang mit verschickt wird, wenn der
Code weitergegeben oder veröffentlicht wird. Sie wird vor Aufruf von soc_helper.py mittels
"export SPRITMONITOR_BEARER_TOKEN=<eigenerToken>" deklariert - idealerweise in der Datei
~/.profile schon bei der Anmeldung am System.
"""
USE_SPRITMONITOR = False               # Auf False setzen, falls Übertragung nicht erfolgen soll
SPRITMONITOR_VEHICLE_ID = '1370192'   # Bitte hier die eigene Fahrzeug-ID (In der App oder Webseite angezeigt) einfügen
SPRITMONITOR_FUELSORT = 24            # über die API sind die Nummern der Kraftstoffsorten abrufbar. Hier wichtig: 19 - Elektrizität, 24 - Ökostrom
SPRITMONITOR_FUELPRICE = 0.08         # Preis in €/kWh. Bei reinem PV-Laden die Einspeisevergütung plus evt. Umsatzsteuer auf Eigenverbrauch. 
# Folgende Attribute können der Betankung per default zugefügt werden (maximal je eines pro Zeile aussuchen):
# Reifen: summertires wintertires allyeartires
# Fahrweise: slow normal fast
# Mit Klima: ac
# Mit Anhänger: trailer
# Mit Standheizung: heating
SPRITMONITOR_ATTRIBUTES = 'summertires,slow'

"""
CAN. Siehe CAN-Datenbank VW: https://www.goingelectric.de/wiki/Liste-der-OBD2-Codes/
"""
# Die eigentliche Botschaft an den WiCAN im json-Format wird in soc_helper zusammengebaut. Beispiel für das eine Sendebotschaft (11-Bit-ID):
#     '{ "bus": "0", "type": "tx", "frame": [{ "id": 2021, "dlc": 8, "rtr": false, "extd": false, "data": [3, 34, 2, 140, 170, 170, 170, 170] }] }'
# Beispiel für das eine Sendebotschaft (29-Bit-ID):
#     '{ "bus": "0", "type": "tx", "frame": [{ "id": 2021, "dlc": 8, "rtr": false, "extd": true, "data": [3, 34, 2, 140, 170, 170, 170, 170] }] }'
# hier wird nur das Relevante angegeben: Die IDs der addressierten CAN-Teilnehmer (Sende-/EmpfangsID) und 8 Datenbytes in einer Liste, im Beispiel
#       SOC_REQUEST=[3, 34, 2, 140, 170, 170, 170, 170]  3 Kommando-Bytes, nämlich 34,2,140. Der Rest ist Füllung.
#	SOC_RECV_ID=2021	Dies ist die ID, auf die der Empfänger der Abfrage hört, nicht die ID des Absenders!
#	SOC_SENDER_ID=2029	Mit dieser ID kommt die Antwort aus dem Fahrzeug
# FIXME: Momentan wird automatisch genau dann eine 29-Bit-ID angenommen, wenn die ID >4095 ist, sonst eine 11-Bit-ID.
# Sobald ein Fahrzeug diese Annahme verletzt, muß der Code angepaßt werden.

# VW e-up
#SOC_REQUEST = [3, 34, 2, 140, 170, 170, 170, 170]
#SOC_RECV_ID = 2021     # 2021: Empfänger: Batterie-SG
#SOC_SENDER_ID = 2029   # 2029: Sender: Batterie-SG
#DST_REQUEST = [3, 34, 2, 189, 170, 170, 170, 170]	# e-up - Antwort ist 2 CAN-Frames lang!
#DST_RECV_ID = 2021     # 2021: Empfänger: Batterie-SG
#DST_SENDER_ID = 2029   # 2029: Sender: Batterie-SG

# Ora Funky Cat, Danke an Kitmgue
#SOC_REQUEST = [3, 34, 3, 8, 170, 170, 170, 170]
#SOC_RECV_ID = 1931
#SOC_SENDER_ID = 1995
#DST_REQUEST = [3, 34, 208, 4, 170, 170, 170, 170]
#DST_RECV_ID = 1931
#DST_SENDER_ID = 1995

#VW ID3 (laut id3esp32)
#SOC_REQUEST = [3, 34, 2, 140, 170, 170, 170, 170]
#SOC_RECV_ID = 0x17FC007B
#SOC_SENDER_ID = 0x17FE007B
#DST_REQUEST = [3, 34, 41, 90, 170, 170, 170, 170]
#DST_RECV_ID = 0x17FC0076
#DST_SENDER_ID = 0x17FE0076

#CUPRA Born
SOC_REQUEST = [3, 34, 2, 140, 170, 170, 170, 170]
SOC_RECV_ID = 0x17FC007B
SOC_SENDER_ID = 0x17FE007B
DST_REQUEST = [3, 34, 41, 90, 170, 170, 170, 170]
DST_RECV_ID = 0x17FC0076
DST_SENDER_ID = 0x17FE0076

"""
#OPENWB-Konfiguration
"""
OPENWB_IP = '192.168.0.132' # hier die Adresse der OpenWB einstellen - Lokaler Name könnte auch funktionieren, nicht ausprobiert

# Die folgenden Topics hängen von der Konfiguration der OpenWB ab. Wichtig ist, die Zahlen (IDs) richtig zu setzen. Sie sind in
# Firmware 2.0 auf der Statusseite zu finden.

#Für OpenWB 2.x:
OPENWB_SETSOC_TOPIC = 'openWB/set/vehicle/1/soc_module/calculated_soc_state/manual_soc' # Topic zum Setzen des manuellen SOC.
OPENWB_GETSOC_TOPIC = 'openWB/vehicle/1/get/soc' # Topic, um den SOC-Wert der Wallbox auszulesen
OPENWB_CHARGECOUNTER_TOPIC = 'openWB/chargepoint/3/get/imported' # Topic, um den Ladezähler auszulesen. Insbesondere die Nummer ist anzupassen
OPENWB_GETPLUGSTATE_TOPIC = 'openWB/chargepoint/3/get/plug_state' # Topic, um den Steckerzustand auszulesen. Nummer anpassen!
OPENWB_FACTORCOUNTER = 1000 # Faktor, um von der Einheit des Zählers (in 2.0 sind es Wh) auf kWh umzurechnen

#Für OpenWB 1.9:
#OPENWB_SETSOC_TOPIC='openWB/set/lp/1/manualSoc' #das Topic, auf das der ermittelte SOC geschrieben werden soll.
#OPENWB_GETSOC_TOPIC='openWB/lp/1/%Soc' #Topic, um den SOC-Wert der Wallbox auszulesen
#OPENWB_CHARGECOUNTER_TOPIC='openWB/lp/1/kWhCounter' #Topic, um den Ladezähler auszulesen. Bei 1.9 in kWh, bei 2.0 in Wh!
#OPENWB_GETPLUGSTATE_TOPIC='openWB/lp/1/boolPlugStat' #Topic, um den Steckerzustand auszulesen.
#OPENWB_FACTORCOUNTER=1 #Faktor, um von der Einheit des Zählers (in 1.9 sind es kWh) auf kWh umzurechnen

"""
WiCAN
"""
WICAN_SER= '34b472f22a8d'   # Seriennummer des zu nutzenden WiCAN. Im Namen des Access-Points sichtbar

"""
Sonstiges
"""
# Zum Loglevel:
# CRITICAL - momentan nur Versionsausgabe bei Start
# ERROR - Fehler
# WARNING - nur Dinge, die auffällig sind und wichtiger
# INFO - Überblick, was gerade so passiert
# DEBUG - Zur Entwicklung.
LOGLEVEL = 'INFO'
# In das Chargelog werden die Daten der Ladevorgänge geschrieben: Start-SOC, Kilometerstand, Energiemenge, End-SOC laut Wallbox
CHARGELOG_PATH = '/home/pi/soc_helper/energydata.csv'

# Berechnungsfunktion des SOC aus der Antwort des Fahrzeugs.

# Die Antwortbytes des Fahrzeuges auf die SOC-Abfrage werden in einer Liste "bytes" mit n Elementen
# gesammelt. Das erste Element hat den Index 0 und beinhaltet die Sender-ID. Die Funktion rechnet aus
# den Bytes den SOC als Ganzzahl aus und gibt ihn zurück.
# Das Ergebnis muß für die OpenWB-SW 1.9 eine Ganzzahl sein, die Software 2.x kann Nachkommastellen.

def getSoc(bytes):
    #soc = round(bytes[4]/2.55)               # VW e-up. [2029, 98, 2, 140, aa, xx, xx, xx, xx]. SOC=aa/2.56
    #soc = round((bytes[4]*256+bytes[5])/10)  # Ora Funky Cat. [1995, 98, 3, 8, aa, bb, xx, xx]. SOC ist (aa*256+bb)/10
    #soc = round((bytes[4]/2.55)              # VW ID3. [0x17FE007B, 98, 2, 140, aa, xx, xx, xx]. SOC ist aa/2.56
    soc = round((bytes[4]/2.55)              # CUPRA Born [0x17FE007B, 98, 2, 140, aa, xx, xx, xx]. SOC ist aa/2.56
    return soc
    
# Funktionen für die Kilometerstand-Berechnung

# Die Antwortbytes des Fahrzeuges auf die km-Abfrage werden in einer Liste "bytes" mit n Elementen
# gesammelt. Das erste Element hat den Index 0 und beinhaltet die Sender-ID. Die Funktion rechnet
# aus den Bytes den Kilometerstand als Ganzzahl aus und gibt ihn zurück.

def getOdo(bytes):
    #odo=bytes[5]*65536+bytes[6]*256+bytes[7]    # VW e-up, Batterie-SG. [2029, 98, 2, 189, xx, bb, cc, dd, xx, xx, xx, xx, xx, xx]
    #odo = bytes[4]*65536+bytes[5]*256+bytes[6]  # Ora Funky Cat. [1995, 98, 208, 4, aa, bb, cc, xx]
    #odo = bytes[4]*65536+bytes[5]*256+bytes[6]  # VW ID3. [0x17FE0076, 98, 41, 90, aa, bb, cc, xx]
    odo = bytes[4]*65536+bytes[5]*256+bytes[6]  # CUPRA Born[0x17FE0076, 98, 41, 90, aa, bb, cc, xx]
    return odo
