FHEM > Sonstiges

FHEM und Carwings/ConnectEV/You+NISSAN-API (Modul 98_Carwings.pm)

(1/34) > >>

c2j2:
(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:

ModulInstallation über...Data::Dumpersudo apt-get install libdata-dumper-simple-perlCrypt::Blowfishsudo apt-get install libcrypt-blowfish-perlMIME::Base64sudo apt-get install libmime-base64-perlJSONsudo apt-get install libjson-perlTry::Tinysudo apt-get install libtry-tiny-perlDateTimesudo apt-get install libdatetime-perl
<hr>
Anlegen eines FHEM-Devices über:


--- Code: ---define <name> Carwings <user> <password> <region>

--- Ende Code ---

(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


--- Code: ---set <name> query battery

--- Ende Code ---

abfragt.

Übersicht der Abfragen:

KommandoAktionset <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:

NameBeschreibungloglevel
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:


--- Code: ---set <name> query battery_cached climate_cached battery

--- Ende Code ---


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:


--- Code: ---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", ""))
 )
}

--- Ende Code ---

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!!!!

Groepi:
Hallo,

also ich hätte schon Interesse an dem Modul. Kannst Du es veröffentlichen?

Danke im voraus

Gröpi

Moeti:
Hallo c2j2!
Klingt sehr interessant. Ich wäre interessiert!
lG
Michael

Puschel74:
Hallo c2j2,

ich habe auch Interesse an deinem Modul.

Grüße

c2j2:
OK, sorry... My fault. Private Message ist besser, ich komme nicht zum Vorbeischauen her. Und die Nachricht bei Antworten habe ich nicht bekommen als eMail, obwohl ich das angekreuzt habe. Grund unbekannt.

Ich habe das Modul jetzt noch so umgebaut, dass man nur


--- Code: ---define <name> Carwings <user> <password> <region>

--- Ende Code ---

(Passwort am Besten in Anführungszeichen).

machen muß, und es fügt die Werte (SOC etc) als Readings des Objekts hinzu - die Idee mit dem Dummy war überflüssig und "historisch" zu betrachten, da mein externer LeafSpy-Server einen Dummy benötigte.

Das Modul hängt an. Ich mache die Abfragehäufigkeit über den Zustand der Wallbox abhängig, alle 5 Minuten während des Ladens, sonst halbstündig:


--- Code: ---Internals:
   DEF        (["^go_eCharger:alw",0] == 0) (set myLeaf query battery)
   NAME       di_go_eCharger_ALW_OFF
   TYPE       DOIF
Attributes:
   cmdpause   1800
   do         always
   room       debug

--- Ende Code ---

und


--- Code: ---Internals:
   DEF        (["^go_eCharger:alw",0] != 0) (set myLeaf query battery)
   NAME       di_go_eCharger_ALW_ON
   TYPE       DOIF
Attributes:
   cmdpause   300
   do         always
   room       debug

--- Ende Code ---

Meine Definition für "myLeaf" sieht dann so aus:


--- Code: ---Internals:
   CFGFN
   DEF        xxx@yyyy.zz 'xxxxxxxxx' NE
   NAME       myLeaf
   RegionCode NE
   STATE      SOC = 40% [CONNECTED, NOT_CHARGING]
   TYPE       Carwings
   READINGS:
     2018-11-11 19:14:21   BatteryCapacity 240
     2018-11-11 19:55:38   BatteryDegradation 97
     2018-11-11 19:55:38   BatterySOC      40
     2018-11-11 19:56:40   ChargeMode      NOT_CHARGING
     2018-11-11 19:00:33   ChargeStatus    CT
     2018-11-11 20:27:40   Charging        NO
     2018-11-11 19:00:33   PlugState       CONNECTED
     2018-11-11 20:27:02   car             Leaf1niss (SJNFAAZE1Unnnnnnn)
     2018-11-11 20:27:02   error
Attributes:
   group      e-Auto
   icon       refresh
   room       PV,debug
   sortby     9
   stateFormat {
sprintf("SOC =%3d%% [%s, %s]%s",
ReadingsNum($name, "BatterySOC", -1),
ReadingsVal($name, "PlugState", ""),
ReadingsVal($name, "ChargeMode", ""),
"")
}

--- Ende Code ---

Viel Spaß!!!

Navigation

[0] Themen-Index

[#] Nächste Seite

Zur normalen Ansicht wechseln