Ladezustand des Nissan Leaf nutzbar machen: Unterschied zwischen den Versionen
C2j2 (Diskussion | Beiträge) (Daten der "LeafSpy"-App in FHEM nutzbar zu machen, um die Nissan Leaf-Informationen in FHEM nutzen zu können) |
C2j2 (Diskussion | Beiträge) |
||
Zeile 28: | Zeile 28: | ||
* in FHEM die <code>WEBapi</code> einrichten ([[CsrfToken-HowTo]]) für den problemlosen internen Zugriff | * in FHEM die <code>WEBapi</code> einrichten ([[CsrfToken-HowTo]]) für den problemlosen internen Zugriff | ||
* | * Testen mit "http://raspberrypi:5000/app?SOC=80", dann müßte im FHEM das korrespondierende Dummy "Leaf_Battery_SOC" auf 80 gesetzt werden. | ||
* wenn alles klappt, diesen Flask-Server bei jedem boot des ''Raspiberry Pi'' starten lassen. | |||
* von außen testen über "https://meine-IP/leaf?SOC=80" - natürlich sind der Name und der Redirect entsprechend anzupassen, gegebenenfalls über Port-Angabe. Da kocht jeder sein eigenes Süppchen... | * von außen testen über "https://meine-IP/leaf?SOC=80" - natürlich sind der Name und der Redirect entsprechend anzupassen, gegebenenfalls über Port-Angabe. Da kocht jeder sein eigenes Süppchen... |
Version vom 24. September 2018, 17:02 Uhr
Leaf Spy ist eine App für das Elektroauto Nissan Leaf, die interne Daten aus dem Leaf per Bluetooth ODB II-Adapter auslesen und darstellen kann wie Akkuzustand, Ladezustand, ... Innenraumtemperatur und so weiter:
Leaf_Spy_Pro Wiki und Dokumentation der App
Leaf Spy kann diese Daten glücklicherweise an einen Server per REST-API (HTTP-Request mit den Werten als Parameter) übergeben.
Um nun beispielsweise des SOC ("State of Charge")-Wert des Fahrakkus nutzen zu können, um die Ladung der Akkuschonung wegen nur bis 80% SOC durchzuführen, würde man die Daten gern in der Automationssoftware für das Laden haben. Bei mir ist das - oh Wunder - FHEM.
Also braucht man einen kleinen Server, der die HTTP-Daten vom Leaf Spy empfängt und an FHEM weiterreicht, um dort Dummy-Variablen zur Weiterverarbeitung zu setzen.
Was liegt näher, als diesen Server auf dem Raspberry Pi einzurichten, auf dem auch FHEM läuft? Der langweilt sich doch eh zu Tode. Ich habe dazu "Flask" als Mini-Server genommen. Also:
Voraussetzungen:
- eine konstante IP oder per DynDNS ansprechbare Adresse haben, über die der Raspi von außen ansprechbar ist (hat man vermutlich ohnehin, wenn man FHEM von außen erreichen möchte). Hier bei mir ist das noch etwas komplexer, über ein QNAP-NAS mit Apache und einem redirect, so dass "https://meinname.myqnapcloud.com/leaf" intern ungeleitet wird auf "http://raspberrypi:5000/app" und somit auf mein Proxy-Skript. Die Einrichtung, auf diese Weise SSL-Zugriff auf FHEM zu haben und nun auch auf das Skript, kostete viele Stunden, macht im Nachhinein aber reich und schön. ;)
- LeafSpy installiert und funktionsfähig
Dann die Arbeit
- "Flask" installieren (bitte im Netz schauen, welches - hängt von der auf dem Raspi installierten Python-Version ab, gegebenenfalls muß man eine virtuelle Umgebung "venv" einrichten - findet man aber alles irgendwie: Stichwörter sind also "Flask" und "venv"). Das ist der Hauptschritt.
- ein kleines Python-Skript als "Proxy" einrichten (siehe unten), bei mir in "/home/pi/leaf-fhem-bridge/"
- und die paar Dummy-Variablen in FHEM einrichten (
LEAF_Battery_...
und so, siehe Skript)
- in FHEM die
WEBapi
einrichten (CsrfToken-HowTo) für den problemlosen internen Zugriff
- Testen mit "http://raspberrypi:5000/app?SOC=80", dann müßte im FHEM das korrespondierende Dummy "Leaf_Battery_SOC" auf 80 gesetzt werden.
- wenn alles klappt, diesen Flask-Server bei jedem boot des Raspiberry Pi starten lassen.
- von außen testen über "https://meine-IP/leaf?SOC=80" - natürlich sind der Name und der Redirect entsprechend anzupassen, gegebenenfalls über Port-Angabe. Da kocht jeder sein eigenes Süppchen...
Bei mir ist das alles derzeit noch "Trockenübung", da mein Auto noch nicht hier in der Garage steht. Ich hoffe dass das return ""
in Ordnung ist, mangels Auto kann ich das noch nicht testen. Ich werde das notfalls hier korrigieren.
Das Skript, das über "phython <skriptname>.py" gestartet wird:
import urllib
import urllib2
from flask import Flask
from flask import request
app = Flask(__name__)
def post_fhem(key, value):
url = "http://127.0.0.1:8088/fhem?cmd=set%20" + key + "%20" + value + "&XHR=1"
req = urllib2.Request(url)
response = urllib2.urlopen(req)
page = response.read()
return page
@app.route('/app', methods = ['GET', 'POST'])
def api_echo():
if 'SOC' in request.args:
post_fhem('Leaf_Battery_SOC', request.args['SOC'])
if 'Ahr' in request.args:
post_fhem('Leaf_Battery_Capacity', request.args['Ahr'])
if 'BatTemp' in request.args:
post_fhem('Leaf_Battery_Temp', request.args['BatTemp'])
if 'Gids' in request.args:
post_fhem('Leaf_Battery_Gids', request.args['Gids'])
if 'Amb' in request.args:
post_fhem('Leaf_Ambient_Temp', request.args['Amb'])
if 'DevBat' in request.args:
post_fhem('Leaf_Device_SOC', request.args['DevBat'])
return ""
if __name__ == '__main__':
app.run(debug=True, host='0.0.0.0', port=5000)