(Stand 26.02.2019)
Das Modul kann man benutzen, um die Ladung zu steuern ("bis 80% laden, um den Akku zu schonen"): man kann periodisch abfragen (siehe weiter unten), wie der Ladezustand des Autos ist, die Klimaanlage eingestellt ist, oder diese ein- oder ausschalten, oder den Ladevorgang starten.
Das Ergebnis der Akkuabfrage dauert allerdings mindestens eine halbe Minute, eher länger (bis zu 3 Minuten). Das liegt allerdings an der verwendeten API und kann nicht weiter optimiert werden.
Wichtig: bitte bei Problemen eine Direktnachricht oder Mail schicken! Ich bekomme nicht immer mit, wenn hier jemand was schreibt.
Zur Installation der verwendeten Module hat mir Puschel dankenswerterweise weitergeholfen:
Modul | Installation über... |
Data::Dumper | sudo apt-get install libdata-dumper-simple-perl |
Crypt::Blowfish | sudo apt-get install libcrypt-blowfish-perl |
MIME::Base64 | sudo apt-get install libmime-base64-perl |
JSON | sudo apt-get install libjson-perl |
Try::Tiny | sudo apt-get install libtry-tiny-perl |
DateTime | sudo apt-get install libdatetime-perl |
<hr>
Anlegen eines FHEM-Devices über:
define <name> Carwings <user> <password> <region>
(Das Passwort am Besten in Anführungszeichen, oft sind Sonderzeichen drin - hoffe ich für euch!).
dann fügt es später die Werte (SOC etc) als Readings des Objekts hinzu, wenn man sie über
set <name> query battery
abfragt.
Übersicht der Abfragen:
Kommando | Aktion |
set <name> query battery
| siehe oben, Abfrage des (Batterie-)Ladezustands, Kabel-Verbindung des Autos, ...
|
set <name> query battery_cached
| Abfrage des letzten bekannten (Batterie-)Ladezustands, Kabel-Verbindung des Autos, ... (letzte Meldung an den Nissan-Server). Die Werte werden in den Readings mit "_CachedRecord_Battery_"-Präfix gespeichert.
|
set <name> query start_charge
| Startet Ladevorgang, wenn das Auto verbunden ist
|
set <name> charging on
| äquivalent zu "query start_charge"
|
set <name> query climate_cached
| Abfrage des letzten bekannten Zustands der Klimaanlage (letzte Meldung an den Nissan-Server). Die Werte werden in den Readings mit "_CachedRecord_Climate_"-Präfix gespeichert.
|
set <name> query climate_on
| schaltet die Klimaanlage an. Der resultierende Zustand wird - bei Erfolg - in "ClimateControlState" geschrieben.
|
set <name> AC on
| schaltet die Klimaanlage an (kann man sich besser merken als "query climate_on")
|
set <name> query climate_off
| schaltet die Klimaanlage aus. Der resultierende Zustand wird - bei Erfolg - in "ClimateControlState" geschrieben.
|
set <name> AC off
| schaltet die Klimaanlage aus (kann man sich besser merken als "query climate_off")
|
set <name> query climate_schedule
| fragt geplanten Klimaanlagen-Einsatz ab und schreibt den in "_CachedRecord_ClimateScheduledTime"
|
set <name> query cabintemp
| fragt Wagen-Innentemperatur ab und schreibt den in "CabinTemp"
|
set <name> query cabintemp_cached
| fragt Wagen-Innentemperatur ab (letzte Meldung an den Nissan-Server) und schreibt den in "_CachedRecord_CabinTemp"
|
Attribute:
Name | Beschreibung |
loglevel
| Log Level für das Log file, default 3
|
usable_battery_capacity
| benutzbare Batteriekapazität (Default 36.5) - wird zur Berechnung der Ladezeit benutzt. Ist aber eh inexakt, da der SOC-Wert nicht genau die Ladezeit bestimmt wegen der Reserven an den Extremwerten.
|
Die "query"-Abfragen können auch kombiniert werden, beispielsweise:
set <name> query battery_cached climate_cached battery
Das Modul hängt an.
Die Abfrage kann man dann periodisch einrichten, möglichst nicht häufiger als alle 15 Minuten (da bei den nicht-Cache-Werten eine Abfrage an das Auto stattfindet, nicht dass Nissan da irgendwann mal meckert). Idealerweise vom Zustand des Ladens abhängig: wenn man den Wert dafür braucht, sonst seltener (stündlich reicht). Bei mir ist die normale "battery"-Abfrage stündlich, und wenn ich lade, viertelstündlich. Bei maximal 4.6 kW ist das etwa 1 kW Schrittweite.
Die "_cached"-Werte braucht man eigentlich nicht abfragen, da sie automatisch abgefragt werden, wenn die direkte Abfrage fehlschlägt, um die Werte auf diese Weise zu bekommen.
Meine Definition für "myLeaf" sieht dann so aus:
Internals:
CFGFN
DEF xxx@yyyy.zz 'xxxxxxxxx' NE
NAME myLeaf
RegionCode NE
STATE SOC = 40% [CONNECTED, NOT_CHARGING]
TYPE Carwings
READINGS:
READINGS:
2018-12-28 18:40:25 APIResponse OK battery_cached 2
2018-12-28 18:40:25 BatteryDataSource _CachedRecord_
2018-12-28 18:40:25 BatteryQuality 100
2018-12-28 18:40:25 BatterySOC 69
2018-12-28 18:40:25 BatteryTime 2018-12-28T18:38:00
2018-12-28 16:36:17 CabinTemp 14.5
2018-12-28 16:36:17 CabinTempDataSource _CachedRecord_
2018-12-28 16:36:17 CabinTempTime 2018-12-28T16:33:00
2018-12-28 18:40:25 ChargeMode NOT_CHARGING
2018-12-26 23:40:29 ClimateControlOperationResult SUCCESS
2018-12-26 23:40:29 ClimateControlStatus OFF
2018-12-28 18:40:25 CruisingRangeACOff 187
2018-12-28 18:40:25 CruisingRangeACOn 167
2018-12-28 18:40:25 LoadTimeRemaining_11kW_100Perc 3.5
2018-12-28 18:40:25 LoadTimeRemaining_11kW_80Perc 1.2
2018-12-28 18:40:25 LoadTimeRemaining_11kW_ToFull 9.0
2018-12-28 18:40:25 LoadTimeRemaining_22kW_100Perc 2.0
2018-12-28 18:40:25 LoadTimeRemaining_22kW_80Perc 0.7
2018-12-28 18:40:25 LoadTimeRemaining_22kW_ToFull 4.5
2018-12-28 18:40:25 PlugState CONNECTED
2018-12-28 17:11:38 _CachedRecord_BatteryQuality 100
2018-12-28 18:40:25 _CachedRecord_BatteryRemainingkWh 27
2018-12-28 18:40:25 _CachedRecord_BatteryResult SUCCESS
2018-12-28 18:40:25 _CachedRecord_BatterySOC 69
2018-12-28 18:40:25 _CachedRecord_BatteryTime 2018-12-28T18:38:00
2018-12-28 16:36:17 _CachedRecord_CabinTemp 14.5
2018-12-28 16:36:17 _CachedRecord_CabinTempTime 2018-12-28T16:33:00
2018-12-28 13:37:42 _CachedRecord_ChargeMode NOT_CHARGING
2018-12-27 19:49:32 _CachedRecord_ClimateChangeOperation STOP
2018-12-27 19:49:32 _CachedRecord_ClimateChangeTime 2018/12/26 22:40
2018-12-27 19:49:32 _CachedRecord_ClimateIncTemp 15
2018-12-27 19:49:32 _CachedRecord_ClimateResult SUCCESS
2018-12-26 23:34:00 _CachedRecord_ClimateScheduledTime
2018-12-27 19:49:32 _CachedRecord_ClimateTemp 22
2018-12-27 19:49:32 _CachedRecord_ClimateTime 2018-12-26T23:40:00
2018-12-28 18:36:03 _CachedRecord_CruisingRangeACOff 187
2018-12-28 18:36:03 _CachedRecord_CruisingRangeACOn 167
2018-12-28 18:33:51 _CachedRecord_LoadTimeRemaining_11kW_100Perc 3.5
2018-12-28 18:33:51 _CachedRecord_LoadTimeRemaining_11kW_80Perc 1.2
2018-12-28 18:33:51 _CachedRecord_LoadTimeRemaining_11kW_ToFull 9.0
2018-12-28 18:33:51 _CachedRecord_LoadTimeRemaining_22kW_100Perc 2.0
2018-12-28 18:33:51 _CachedRecord_LoadTimeRemaining_22kW_80Perc 0.7
2018-12-28 12:37:43 _CachedRecord_LoadTimeRemaining_22kW_ToFull 4.5
2018-12-28 18:36:03 _CachedRecord_PlugState CONNECTED
2018-12-27 19:41:42 car Leaf1niss
2018-12-28 18:40:25 error Attributes:
group e-Auto
icon car
room PV,debug
sortby 9
stateFormat stateFormat {
sprintf("SOC = <b>%3d%%</b> (≈%dkm-%dkm) (%s%s)<br>%s",
ReadingsNum($name, "BatterySOC", -1),
ReadingsNum($name, "CruisingRangeACOn", 0),
ReadingsNum($name, "CruisingRangeACOff", 0),
ReadingsVal($name, "BatteryTime", 0),
((ReadingsVal($name, "BatteryDataSource", "") eq '_CachedRecord_') ? ', cached' : ''),
length(ReadingsVal($name, "error", "")) > 0
? sprintf("[ERROR %s (%s)]", ReadingsVal($name, "error", ""), ReadingsTimestamp($name,"error",0))
: sprintf("[%s, %s]", ReadingsVal($name, "PlugState", ""), ReadingsVal($name, "ChargeMode", ""))
)
}
Updates:
2018-11-15- startet immer nur eine query
- bessere Fehlerverarbeitung
- geschätzte Entfernung wird auch als Reading mit/ohne Klimaanlageneinsatz gesetzt
2018-12-10- verbessertes timing
- bessere Fehlerverarbeitung (kann man im LOG sehen) für Plot
2018-12-17- neues Attribut "loglevel", Default 3
2018-12-18- neue queries 'battery_cached', climate_cached', 'climate_on', 'climate_off', 'climate_schedule'
- neue Kommandos 'AC on', 'AC off'
2018-12-20- 'Hash'-Fehler bei leerem Climate-Cache-Record gefixt
2018-12-21- neue API URL eingebaut - FHEM muß neu gestartet werden, damit das übernommen wird
2018-12-22- APIResponse log entries sind jetzt task-spezifisch
- LoadTimeRemainingXxxx (berechnete) Readings für 80% und 100% Ladung
- Datumswerte alle normiert in Perl-ISO-Zeitformat
- "query all", um alles auf ein Mal abzufragen
- neue queries 'cabintemp_cached', 'cabintemp' für die Auto-Innentemperatur
- API URL wird nun immer neu gesetzt, kein FHEM-Neustart mehr nötig
2018-12-23- Einheiten an Readings hinzugefügt (mit Leerzeichen davor, damit man keine Perl-Warnung bekommt)
- BatterySOC reading time war Lokalzeit, alle anderen waren UTC (Nissan! sigh) - korrigiert
- _CachedRecord_BatteryPlugState umbenannt in _CachedRecord_PlugState (Konsistenz zu "PlugState")
- _CachedRecord_BatteryChargeMode umbenannt in _CachedRecord_ChargeMode (Konsistenz zu "ChargeMode")
- Job-Liste ist nun ein Array, das auch neue Jobs aufnehmen kann statt sich zu beschweren, dass noch ein Job aktiv sei - man kann also mehrere "set ... query" hintereinander aufrufen
- Ein Datenfehler in einer Query beendet nicht mehr den Ablauf, sondern startet die nächste Query
2018-12-27- Einheiten an Readings wieder weg - danke Herjemine
- LoadTimeRemaining... readings haben jetzt auch die "_ToFull"-Angaben des Autos (von der 'battery_cache'-Query, die 'battery'-Query liefert zumindest bei mir nichts)
2018-12-28- 'cached'-Werte werden automatisch nach einer fehlgeschlagenen Abfrage gemacht, um dennoch an die Werte ranzukommen
- Die Akku-Referenz-'Quality' ist nun fix auf 12 (ZE0) bzw. 240 (ZE1) - danke Herjemine. Damit sollten keine SOC-Wert über 100% möglich sein
- Region-Code Nordamerika hat eine eigene URL (falls jemand in den USA registriert ist...)
- Die aktuellen Batterie- und Innentemperatur-Abfragewerte liegen nun in _CurrentRecord_Xxxxx Readings
- Batterie- und Innentemperatur werden automatisch von den Neueren der aktuellen (_CurrentRecord_)- und Cached (_CachedRecord_)-Werte genommen, 'BatterySOC' etc sind also immer der beste Werte
2018-12-29- verbesserte Batterie- und Cabintemp-Abfragen durch paralleles Abfragen der zwischengespeicherten Werte, die früher als die aktuellen Werte verfügbar sein könnten (böser, böser Nissan-Server! mein Glück, dass das funktioniert....).
- Problem mit leerem Array von climate_cached Datensätzen behoben (falls nicht vorhanden)
- Problem mit der automatischen Auswahl der Datenquelle mit neu definiertem device und ohne aktuelle Werte (keine _CurrentRecord_-Readings) vom Server behoben, was zu einem SOC-Wert von 0 führte.
- ptimierter und reduzierter Copy&Paste-Code
- Standortkoordinaten auf 5 Dezimalstellen (ca. 1m Auflösung) reduziert
2018-12-30- 'all' führte alle Kommandos aus, also auch Klimaanlage ein- und wieder ausschalten, und die bei den 'battery'- und 'cabintemp'-Queries - überflüssigen - 'battery_cached'- und 'cabintemp_cached'- Queries.
- die Änderungs-Liste von gestern eingedeutscht. Es fällt mir nicht auf, wenn ich bei Englisch bleibe, denn alle PERL-Docs sind auf Englisch
2019-01-12- 'start_charge' um den Ladevorgang zu starten
- Abfrage der Monatsstatistiken möglich: 'stat_monthly:<yyyymm>', also z.B. 'query stat_monthly:201812 stat_monthly:201901' für diese beiden Monate. Schreibt das Resultat (jeweils km, kWh, kWh_Motor, kW_100km) für den entsprechenden Monat als Reading 'Stat_<yyyymm>_<typ>'. Hier sind aber - warum auch immer - zumindest bei mir nicht alle Fahrten drin, daher schreibe ich das oben auch nicht in die Tabelle!
2019-01-15- 'query location' dokumentiert
- 'charging on' als Alias für 'query start_charge'
2019-01-18- 'query stat_monthly:now' speichert nun die 4 Stat-readings ohne Datum, so dass man beispielsweise diese in ein Jahres-Logfile schreiben kann ("define xxx FileLog ./log/myLeaf_Stat-%Y.log myLeaf:Stat_kW_100.*"), um das als Jahres-Plot auszugeben
- 'Battery' und 'Climate' readings lösen jetzt nur eine Änderung aus, wenn sich der Wert ändert to update only if changed, so that they can be used for notifications of state changes
2019-01-26- neue URL eingebaut (Nissan ändert die alle paar Monate)
2019-07-28- neue URL eingebaut (Nissan ändert die alle paar Monate)
2019-08-19- "location" API ausgebaut, gibt es nicht mehr von Nissan
2020-07-27- neue URL eingebaut (Nissan ändert die alle paar Monate)
PS: Dank an Puschel74 und Herjemine mit Fehlerkorrekturen und Hinweisen!!!!