Autor Thema: FHEM und Nissan Carwings-API (neues Modul 98_Carwings.pm) für z.B. Leaf  (Gelesen 618 mal)

Offline c2j2

  • New Member
  • *
  • Beiträge: 41
Noch erst mal für mich entwickelt, aber man weiß ja nie, wer das braucht.

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. Das Ergebnis dauert allerdings mindestens eine halbe Minute, eher länger. Das liegt allerdings an der verwendeten API und kann nicht weiter optimiert werden.

Möglich wäre auch Positions-Tracking u.a.m., aber ich mache da erst mehr, wenn jemand noch was braucht. Für mich reicht die SOC-Abfrage vorerst ;)

Zur Installation der verwendeten Module hat mir Puschel dankenswerterweise weitergeholfen:

ModulInstallation über...
Data::Dumpersudo apt-get install libdata-dumper-simple-perl
Crypt::Blowfishsudo apt-get install libcrypt-blowfish-perl
MIME::Base64sudo apt-get install libmime-base64-perl
JSONsudo apt-get install libjson-perl
Try::Tinysudo apt-get install libtry-tiny-perl
(Stand 18.11.2018)

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

dann fügt es später die Werte (SOC etc) als Readings des Objekts hinzu, wenn man sie über

set <name> query battery

abfragt-

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, über DOIFs:

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

und

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

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:
     2018-11-11 19:14:21   BatteryCapacity 240
     2018-11-15 21:24:35   BatteryDegradation 93
     2018-11-15 21:24:35   BatterySOC      38
     2018-11-15 16:18:14   ChargeMode      220V
     2018-11-11 19:00:33   ChargeStatus    CT
     2018-11-15 16:18:14   Charging        YES
     2018-11-15 21:24:35   CruisingRangeACOff 113
     2018-11-15 21:24:35   CruisingRangeACOn 107
     2018-11-15 16:17:14   PlugState       CONNECTED
     2018-11-11 20:57:00   car             Leaf1niss (SJNFAAZE1Unnnnnnn)
     2018-11-15 21:23:54   error
Attributes:
   group      e-Auto
   icon       car
   room       PV,debug
   sortby     9
   stateFormat {
sprintf("SOC = %3d%% (≈%dkm-%dkm) (%s)\n%s",
 ReadingsNum($name, "BatterySOC", -1),
 ReadingsNum($name, "CruisingRangeACOn", 0),
 ReadingsNum($name, "CruisingRangeACOff", 0),
 ReadingsTimestamp($name,"BatterySOC",0),
 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
« Letzte Änderung: Gestern um 22:31:04 von c2j2 »

Offline Groepi

  • New Member
  • *
  • Beiträge: 19
Hallo,

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

Danke im voraus

Gröpi

Offline Moeti

  • New Member
  • *
  • Beiträge: 28
Hallo Gröpi!
Klingt sehr interessant. Ich wäre interessiert!
lG
Michael
RaspberryPi 2 B, FHEM, CUL, HMLAN
HM-LC-SW2-FM, HM-LC-SW1-FM, HM-ES-PMSw1-Pl, HM-LC-SW4-BA-PCB, HM-SCI-3-FM, HM-SEC-KEY-S, HM-SEC-SCo, HM-Sen-DB-PCB, HM-WDS10-TH-O
WH1080 per pywws, RaspiCam, Kostal PIKO 5.5, homebridge
Hörmann Supramatic mit UAP1, HM-SCI-3-FM, HM-LC-SW4-BA-PCB
SmartPi, Automower

Offline Puschel74

  • Hero Member
  • *****
  • Beiträge: 9808
Hallo c2j2,

ich habe auch Interesse an deinem Modul.

Grüße
Zotac BI323 als Server mit DBLog
CUNO für FHT80B, 3 HM-Lan per vCCU, RasPi mit CUL433 für Somfy-Rollo (F2F), RasPi mit I2C(LM75) (F2F), RasPi für Panstamp+Vegetronix +SONOS(F2F)
Ich beantworte keine Supportanfragen per PM! Bitte im Forum suchen oder einen Beitrag erstellen.

Offline c2j2

  • New Member
  • *
  • Beiträge: 41
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

define <name> Carwings <user> <password> <region>

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

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

und

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

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

Viel Spaß!!!
« Letzte Änderung: 12 November 2018, 19:51:58 von c2j2 »

Offline c2j2

  • New Member
  • *
  • Beiträge: 41
Winzige Verbesserung im Modul im Anhang: ich habe den -BatterySOC-Wert nun immer auf Update, so dass man mit

ReadingsTimestamp($name,"BatterySOC",0)

erfährt, wann der Wert zuletzt erfolgreich gelesen wurde.
« Letzte Änderung: 12 November 2018, 19:52:08 von c2j2 »

Offline Groepi

  • New Member
  • *
  • Beiträge: 19
Hallo c2j2,

erstmal vielen Dank für das Modul.

Ich habe es per FTP auf den Pi geladen (/opt/fhem/FHEM) die Berechtigung auf 755 und den Besitzer auf FHEM:dialout gesetzt.

Leider bekomme ich wenn ich versuche zu definieren die Fehlermeldung: Cannot load module Carwings. Wahrscheinlich fehlt noch ne Kleinigkeit.

Gröpi

Offline c2j2

  • New Member
  • *
  • Beiträge: 41
Im LOG von FHEM müßte man es sehen.

Während der Entwicklung hatte ich ein paar Perl-Module installiert. Hmmm... wenn ich noch wüßte, welche (und welche noch benötigt werden).

Ich fürchte, Du mußt den Weg über das Log gehen. Ich weiß nicht, wie man sonst herausfinden kann, welche Module dafür benötigt werden.

Möglicherweise JSON?

https://schmidt-feldberg.de/fhem-server-hausautomation-auf-dem-raspberry-pi-teil-3-module-aktivieren-konfigurieren/
« Letzte Änderung: 11 November 2018, 22:24:17 von c2j2 »

Offline Groepi

  • New Member
  • *
  • Beiträge: 19
Zitat
reload: Error:Modul 98_Carwings deactivated:
 Can't locate Crypt/Blowfish.pm in @INC (you may need to install the Crypt::Blowfish module) (@INC contains: . /etc/perl /usr/local/lib/arm-linux-gnueabihf/perl/5.24.1 /usr/local/share/perl/5.24.1 /usr/lib/arm-linux-gnueabihf/perl5/5.24 /usr/share/perl5 /usr/lib/arm-linux-gnueabihf/perl/5.24 /usr/share/perl/5.24 /usr/local/lib/site_perl /usr/lib/arm-linux-gnueabihf/perl-base ./FHEM) at ./FHEM/98_Carwings.pm line 10.
BEGIN failed--compilation aborted at ./FHEM/98_Carwings.pm line 10.
Liegt wohl an Blowfish läßt sich aber auch nicht installieren.
Zitat
Command "python setup.py egg_info" failed with error code 1 in /tmp/pip-build-2Vvkgi/blowfish


Offline c2j2

  • New Member
  • *
  • Beiträge: 41
Ich glaube, das war über

sudo cpan
install Crypt::Blowfish

Offline Groepi

  • New Member
  • *
  • Beiträge: 19
Super die Installation hat geklappt.

Zitat
018.11.12 11:08:50 1: PERL WARNING: Use of uninitialized value in concatenation (.) or string at ./FHEM/98_Carwings.pm line 96.
2018.11.12 11:08:50 1: query  started
2018.11.12 11:08:50 1: PERL WARNING: Use of uninitialized value in concatenation (.) or string at ./FHEM/98_Carwings.pm line 97.
2018.11.12 11:08:51 1: +++JOB connect returned: {"status":200,"message":"success","baseprm":"xx_verschleiert_xx"}
2018.11.12 11:08:51 1: ** CONNECT
2018.11.12 11:09:01 1: +++JOB login returned: {"status":200,"sessionId":"xx_verschleiert_xx","VehicleInfoList":{"VehicleInfo":[{"nickname":"Leaf1mrti","telematicsEnabled":"true","vin":"xx_verschleiert_xx"}],"vehicleInfo":[{"nickname":"Leaf1mrti","telematicsEnabled":"true","vin":"xx_verschleiert_xx","custom_sessionid":"xx_verschleiert_xx"}]},"vehicle":{"profile":{"vin":"xx_verschleiert_xx","gdcUserId":"","gdcPassword":"","encAuthToken":"3xx_verschleiert_xx","dcmId":"xx_verschleiert_xx","nickname":"xx_verschleiert_xx","modelyear":"17"}},"EncAuthToken":"xx_verschleiert_xx","CustomerInfo":{"UserId":"xx_verschleiert_xx","Language":"de-DE","Timezone":"Europe\/Berlin","RegionCode":"NE","OwnerId":"xx_verschleiert_xx","EMailAddress":"xx_verschleiert_xx","Nickname":"xx_verschleiert_xx","Country":"DE","VehicleImage":"\/content\/language\/default\/images\/img\/ph_car.jpg","UserVehicleBoundDurationSec":"xx_verschleiert_xx","VehicleInfo":{"VIN":"xx_verschleiert_xx","DCMID":"xx_verschleiert_xx","SIMID":"xx_verschleiert_xx","NAVIID":"xx_verschleiert_xx","EncryptedNAVIID":"xx_verschleiert_xx","MSN":"xx_verschleiert_xx","LastVehicleLoginTime":"","UserVehicleBoundTime":"2018-02-10T07:15:02Z","LastDCMUseTime":"","NonaviFlg":"false","CarName":"LEAF","CarImage":"carimg6.png"}},"UserInfoRevisionNo":"1"}
2018.11.12 11:09:01 1: ** LOGIN
2018.11.12 11:09:01 1: Carwings_ExecuteNextJob
2018.11.12 11:09:01 1: ***** jobs $VAR1 = undef;

2018.11.12 11:09:01 1: PERL WARNING: Use of uninitialized value $jobs in numeric gt (>) at ./FHEM/98_Carwings.pm line 184.
2018.11.12 11:09:29 1: Hallöchen, $VAR1 = 'Leaf';
$VAR2 = 'Carwings';
$VAR3 = 'xx_verschleiert_xx';
$VAR4 = 'xx_verschleiert_xx';
$VAR5 = 'NE';

2018.11.12 11:09:35 1: query  started
2018.11.12 11:09:37 1: +++JOB connect returned: {"status":200,"message":"success","baseprm":"uyI5Dj9g8VCOFDnBRUbr3g"}
2018.11.12 11:09:37 1: ** CONNECT

Aber irgendwie gibts keinen Status zurück.

Offline c2j2

  • New Member
  • *
  • Beiträge: 41
muß ich heute abend anschauen...  :(

Danke (und entschuldige den Aufwand...)

Offline Groepi

  • New Member
  • *
  • Beiträge: 19
Nein, kein Thema. Ich danke Dir für das Modul!

Offline c2j2

  • New Member
  • *
  • Beiträge: 41
ah...

Du mußt angeben, was er abfragen soll. Im Moment zwar nur "battery", aber wer weiß...

Also "set Leaf query battery"

Besser?

Offline c2j2

  • New Member
  • *
  • Beiträge: 41
Noch 2 Tips:

a) neues Modul meckert den fehlenden "query"-Parameter an

b) Serviervorschlag für stateFormat in dem Device:
{
sprintf("SOC = %3d%% (≈%dkm)\n%s (%s)",
 ReadingsNum($name, "BatterySOC", -1),
 ReadingsNum($name, "BatterySOC", -1) * 36.5 / 15,
 length(ReadingsVal($name, "error", "")) > 0
  ? sprintf("[ERROR: %s]", ReadingsVal($name, "error", ""))
  : sprintf("[%s, %s]", ReadingsVal($name, "PlugState", ""), ReadingsVal($name, "ChargeMode", "")),
 ReadingsTimestamp($name,"BatterySOC",0)
 )
}
« Letzte Änderung: 12 November 2018, 19:52:20 von c2j2 »