Ladezustand des Nissan Leaf nutzbar machen: Unterschied zwischen den Versionen

Aus FHEMWiki
Zur Navigation springen Zur Suche springen
Keine Bearbeitungszusammenfassung
K (Bild prominenter eingebaut)
Zeile 19: Zeile 19:
Das Ganze sieht dann so aus:
Das Ganze sieht dann so aus:


[[Datei:Ladesteuerung an der PV-Anlage.png|mini|Ladesteuerung an der PV-Anlage]]
[[Datei:Ladesteuerung an der PV-Anlage.png|noframe|Ladesteuerung an der PV-Anlage]]
 


wobei hier die Abschaltlogik noch nicht implementiert ist für dieses Bild, aber man sieht, wie die Lade-Leistung mit der Photovoltaikleistung geregelt wird.
wobei hier die Abschaltlogik noch nicht implementiert ist für dieses Bild, aber man sieht, wie die Lade-Leistung mit der Photovoltaikleistung geregelt wird.

Version vom 25. September 2018, 21:50 Uhr

Idee: Ladezustand des Leaf in FHEM nutzbar zu machen

Hier wird beschrieben, wie man auf den Ladezustand des Antriebsakkus eines Elektroautos, hier Nissan Leaf in FHEM zugreifen kann. Dadurch kann man - beispielsweise über eine mehr oder weniger intelligente Perl-Routine - den Ladevorgang abbrechen, wenn das Auto den entsprechenden Maximal-SOC erreicht hat. Somit wird das Auto beispielsweise bis maximal 80% geladen, um den Aku nicht durch Volladung stärker als nötig zu belasten:

 my $leafBatSOC = ReadingsNum("Leaf", "BatterySOC", 0);
 my $leafBatSOCMax = ReadingsNum("MaxSOC", "state", 100);
 
 if ($leafBatSOC < $leafBatSOCMax)
  {
  // charge
  }
 else
  {
  // do not charge
  }

Das Ganze sieht dann so aus:

Ladesteuerung an der PV-Anlage


wobei hier die Abschaltlogik noch nicht implementiert ist für dieses Bild, aber man sieht, wie die Lade-Leistung mit der Photovoltaikleistung geregelt wird.

Es gibt zwei Möglichkeiten, an die internen Werte heranzukommen:

  1. über die App Leaf Spy
  2. über eine Web-URL (CARWINGS-API)


Alternative Leaf Spy

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 FHEM für das Laden haben.

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. Eine Möglichkeit dazu ist "Flask", der die REST-URL im Handumdrehen auseinandernimmt.

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).
  • LeafSpy installiert und funktionsfähig

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), kann man z.B. in "/home/pi/leaf-fhem-bridge/" unterbringen
  • und eine Dummy-Variable "Leaf" FHEM einrichten mit diversen Readings ("BatterySOC" etc), die durch das Python-Script gesetzt werden. Siehe auch unten.
  • in FHEM die WEBapi einrichten (CsrfToken-HowTo) für den problemlosen internen Zugriff
  • wenn alles klappt, diesen Flask-Server bei jedem Boot des Raspiberry Pi starten lassen (Google...)
  • 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.

Alternative CARWINGS API

Diese API ist die "offizielle" Methode, an die Daten heranzukommen - und man kann damit beispielsweise auch die Klimaanlage steuern. Also geeignet für ehrgeizigere Projekte.

Nachteil ist für mich, dass man diese API anscheinend nicht so häufig aufrufen darf oder kann, maximal etwa alle 20 Minuten, eine Abfrage aktiviert das GSM-Modul des Leaf und wartet die Antwort ab. Das reicht allerdings gut für die Ladung zuhause. Um das auszunutzen man einen kleinen Web-Client laufen lassen, der die API benutzt und die Werte ebenso an unseren "Leaf"-Dummy übergibt. Hat jemand Lust? ;)

Anhänge

Das Server-Skript für Leaf Spy

Das Skript, das (auf dem Raspberry Pi mit dem Aufruf "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):
	# Annahme: läuft auf dem gleichen RASPI wie FHEM
	# Annahme: WEBapi benutzt Port 8088
	url = "http://127.0.0.1:8088/fhem?cmd=setreading%20Leaf%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('BatterySOC', request.args['SOC'])
    if 'Ahr' in request.args:
        post_fhem('BatteryCapacity', request.args['Ahr'])
    if 'BatTemp' in request.args:
        post_fhem('BatteryTemp', request.args['BatTemp'])
    if 'Gids' in request.args:
        post_fhem('BatteryGids', request.args['Gids'])
    if 'Amb' in request.args:
        post_fhem('AmbientTemp', request.args['Amb'])
    if 'DevBat' in request.args:
        post_fhem('SmartphoneSOC', request.args['DevBat'])
    return ""

if __name__ == '__main__':
    app.run(debug=True, host='0.0.0.0', port=5000)

und der "Leaf"-Dummy

Internals: 
  CFGFN 
  NAME       Leaf 
  NR         3481 
  STATE      SOC=79% Gids=88, Temp=50°C 
  TYPE       dummy 
Attributes: 
  readingList BatterySOC,BatteryGids,BatteryTemp,BatteryCapacity,AmbientTemp,SmartphoneSOC 
  room       Auto 
  stateFormat { sprintf("SOC=%d%% Gids=%d, Temp=%d°C", ReadingsNum("Leaf", "BatterySOC", 0), ReadingsNum("Leaf", "BatteryGids", 0), ReadingsNum("Leaf", "AmbientTemp", 0)); }