Skip to content

Conversation

@cr0i
Copy link
Contributor

@cr0i cr0i commented Mar 19, 2025

Umsetzung der Speichersteuerung von SolarEdge.
Für die Umsetzung des Battery Index aus #2236 wurde hier bereits der Battery Index für die Unterstützung von 2 Batterien als feste Variable eingefügt.
Nach Umsetzung des PR#2236 muss diese nur entfernt werden, damit ist die Unterstützung hierfür bereits gewährleistet.

Noch offen:
Erst ab Firmware Version 4.20.36 werden TimeOfUse Profile unterstützt.
Die Firmware kann als String aus dem WR ausgelesen werden.
Beim Beenden des Remote Modus muss bei kleinerer Version auf Maximaler Eigenverbrauch (1), statt TimeOfUse(2) zurückgestellt werden.

Um fremde Steuerungen durch z.B. SolarEdge ONE nicht zu beeinflussen, erfolgt im Modus "Immer" gar keine Steuerung.
Sonst wird beim Reboot der openWB der Remote Modus beendet, falls er durch Abstürze oder fehlerhafte Steuerungen aktiv sein sollte.
Dies ist wichtig, da sonst keine Zwangsladung bei Unterschreitung des Mindest-SoC gegen Tiefentladung mehr läuft.

@cr0i cr0i marked this pull request as draft March 19, 2025 23:23
@cr0i
Copy link
Contributor Author

cr0i commented Mar 23, 2025

Ich habe jetzt den last_mode ausgebaut und durch Auslesen der Register ersetzt.
Den Sperrmodus, den ich ursprünglich genommen hatte, führte bei mehr PV-Überschuss als gerade zur Ladung nötig sind, zu nicht korrekter Ladung des Speichers, daher habe ich auch diesen nur noch über Setzen des DischargeLimit realisiert.
Ich schreibe das DischageLimit nur, wenn es um mehr als 10W vom aktuellen power_limit abweicht, das soll gegenseitige Beeinflussungen, wenn 2 Speicher vorhanden sind verhindern.
Nun habe ich leider festgestellt, dass wir noch einen Config-Wert (SoC-Reserve) benötigen, da wir diesen leider nicht zuverlässig auslesen können.
SolarEdge entlädt den Speicher immer nur bis zu einem bestimmten SoC, dieser ist aber leider je nach Batterietyp oder ggf. anderen Faktoren unterschiedlich.
Bei mir mit BYD Speicher sind es 10%, bei 2 LG Batterien wohl 5%.
Wenn dieser Wert unterschritten wird, erfolgt eine Zwangsladung des Speichers aus dem Netz. Dies funktioniert aber nicht, wenn wir gerade den RemoteMode aktiv haben und diese Funktion damit sperren.
Daher müssen wir bei Unterschreitung der SoC-Reserve die Steuerung beenden.
Ich habe die Variable soc_reserve erstmal fest mit 10 aufgenommen, da ich die Konfiguration inkl. UI vermutlich nicht hinbekomme.
Aktuell scheitere ich daran, dass ich bei älteren Firmware Versionen als 4.20.36 einen anderen Wert für den ControlMode beim zurückschalten aus dem RemoteMode benötige. Das Auslesen der Firmware bekomme ich aktuell nicht hin.
Die Register haben ein String(16) Format. Wenn ich das richtig sehe, müsste das dann auch in die common/modbus.py aufgenommen werden, da es das Format aktuell gar nicht gibt.
Vielleicht sollte man auch gleich String(32) mit aufnehmen, der kommt an anderen Stellen auch vor (Ich weiß aber nicht, ob den jemand braucht).

@LKuemmel oder @benderl :
Könnten wir für diese Steuerung einen eigenen Featurezweig bekommen?
Es gibt ja sehr viel verschiedene Konstellationen, mit 1 WR, kaskadierte WR, mit 1 oder 2 Speicher.
Damit wir damit gezielt Testen können, ohne dass alle SolarEdge Speicher auseinander fallen, wäre das bestimmt hilfreich. ;-)

@cr0i
Copy link
Contributor Author

cr0i commented Apr 18, 2025

Ich lese nun den ControlMode vorher aus und schreibe ihn dann wieder zurück.
Für den Fall, dass dieser nicht bekannt ist, wird 1 (MaxEigenverbrauch) genutzt, so ist es mit jeder Firmware kompatibel.

Den Wert für battery_index übernehme ich mit 1, solange er noch nicht umgesetzt ist.
Es könnte also nun bereits übernommen werden, bevor die Änderungen dort fertig sind.
Dann müsste nur diese bat.py übernommen werden.

Den Wert für soc_reserve übernehme ich mit 10, solange er noch nicht umgesetzt ist.
Die Speichersteuerung wird so bei erreichen von 10% beendet, ist also erstmal mit allen Speichern kompatibel.
Wenn im Portal eine Backup-Reserve eingerichtet ist, wird diese übernommen.
Die soc_reserve muss noch in der Config des Speichers umgesetzt werden, das kann ich aber nicht, müsste also jemand anderes übernehmen. Das kann nun auch später erfolgen.
Als Standardwert sollte dann 0 übernommen werden, mein Textvorschlag für die SoC-Reserve:

SolarEdge entlädt die Speicher nur bis zu einem Mindest-SoC (Soc-Reserve).
Dieser kann je nach Speicher mal 10%, 5% oder 0% betragen. Da sie nicht automatisch ermittelt werden kann, muss sie hier konfiguriert werden.
Bei Systemen mit Backup-Modulen gibt es zusätzlich die Backup-Reserve, diese muss hier nicht eingetragen werden, da sie automatisch berücksichtigt wird.

@cr0i
Copy link
Contributor Author

cr0i commented Apr 18, 2025

Ich habe versucht die Änderungen im master einzupflegen und die Konflikte zu beheben.
Müsste so nach meiner Ansicht passen, die Konflikte verschwinden aber nicht.

@cr0i cr0i marked this pull request as ready for review April 18, 2025 16:52
@cr0i cr0i marked this pull request as draft April 22, 2025 23:56
@cr0i
Copy link
Contributor Author

cr0i commented Apr 22, 2025

Es gibt noch einen Sonderfall, der ggf. zu Problemen führen könnte:
https://forum.openwb.de/viewtopic.php?p=126852#p126852
Muss daher nochmal überarbeitet werden.

@cr0i
Copy link
Contributor Author

cr0i commented Apr 24, 2025

Es gibt noch einen Sonderfall, der ggf. zu Problemen führen könnte: https://forum.openwb.de/viewtopic.php?p=126852#p126852 Muss daher nochmal überarbeitet werden.

last_mode wieder eingebaut, Problem damit behoben.

@cr0i cr0i marked this pull request as ready for review April 24, 2025 18:48
@seaspotter
Copy link
Contributor

Du musst dein Branch auch hochziehen, weil zwischenzeitlich Commits gemacht wurden an gleicher Stelle, deshalb rennt dein PR auch in Konflikte. Damit musst du die bereits gemachten Änderungen aus #2317 nicht mehr mitziehen.

@cr0i
Copy link
Contributor Author

cr0i commented Apr 24, 2025

Du musst dein Branch auch hochziehen, weil zwischenzeitlich Commits gemacht wurden an gleicher Stelle, deshalb rennt dein PR auch in Konflikte. Damit musst du die bereits gemachten Änderungen aus #2317 nicht mehr mitziehen.

Kannst Du mir verraten, wie ich das machen kann ohne Probleme zu verursachen?
Das letzte mal, als ich sowas versucht hatte, hatte ich plötzlich 300 geänderte Files und der PR war unbrauchbar.
Hatte dann einen komplett neuen erstellt, da ich es auch nicht rückgängig machen konnte.
Ich nutze Github Desktop.

@seaspotter
Copy link
Contributor

Kannst Du mir verraten, wie ich das machen kann ohne Probleme zu verursachen? Das letzte mal, als ich sowas versucht hatte, hatte ich plötzlich 300 geänderte Files und der PR war unbrauchbar. Hatte dann einen komplett neuen erstellt, da ich es auch nicht rückgängig machen konnte. Ich nutze Github Desktop.

Such mal nach "Resolve Merge conflicts Github" da müsste es sicher ne Menge Anleitungen und Videos zu geben, ich nutze Visual Studio Code.

Copy link
Contributor

@LKuemmel LKuemmel left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Probier mal mit der Ergänzuung folgender Methoden in der common/modbus.py Strings zu lesen:

    def __read_string(self, func: Callable, address: int, length: int = 1, byteorder: Endian = Endian.Big,
                      wordorder: Endian = Endian.Big, **kwargs) -> str:
        response = self.__read_registers(func,
                                         address,
                                         [ModbusDataType.INT_16]*length,
                                         byteorder,
                                         wordorder,
                                         **kwargs)
        string = ""
        for word in response:
            string += struct.pack(">h", word).decode("utf-8")
        return string

    def read_input_string(self, address: int, length: int = 1, byteorder: Endian = Endian.Big,
                          wordorder: Endian = Endian.Big, **kwargs) -> str:
        return self.__read_string(self._delegate.read_input_registers,
                                  address,
                                  length,
                                  byteorder,
                                  wordorder,

                                  **kwargs)

    def read_holding_string(self, address: int, length: int = 1, byteorder: Endian = Endian.Big,
                            wordorder: Endian = Endian.Big, **kwargs) -> str:
        return self.__read_registers(self._delegate.read_holding_registers,
                                     address,
                                     length,
                                     byteorder,
                                     wordorder,
                                     **kwargs)

Für #2236 habe ich auch das Review gemacht. Wenn er rebased wurde, merge ich ihn und dann kannst Du auch einen Rebase machen und die Änderungen in Deinen PR holen.

def get_imported_exported(self, power: float) -> Tuple[float, float]:
return self.sim_counter.sim_count(power)
try:
PowerLimitMode = data.data.bat_all_data.data.config.power_limit_mode
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
PowerLimitMode = data.data.bat_all_data.data.config.power_limit_mode
power_limit_mode = data.data.bat_all_data.data.config.power_limit_mode

Bitte auf die Python naming convention achten. CamelCase zeigt einen Klassen-Namen an.

Comment on lines +227 to +246
def _encode_value(self, value: Union[int, float], data_type: ModbusDataType) -> list:
builder = pymodbus.payload.BinaryPayloadBuilder(
byteorder=pymodbus.constants.Endian.Big,
wordorder=pymodbus.constants.Endian.Little
)
encode_methods = {
ModbusDataType.UINT_32: builder.add_32bit_uint,
ModbusDataType.INT_32: builder.add_32bit_int,
ModbusDataType.UINT_16: builder.add_16bit_uint,
ModbusDataType.INT_16: builder.add_16bit_int,
ModbusDataType.FLOAT_32: builder.add_32bit_float,
}
if data_type in encode_methods:
if data_type == ModbusDataType.FLOAT_32:
encode_methods[data_type](float(value))
else:
encode_methods[data_type](int(value))
else:
raise ValueError(f"Unsupported data type: {data_type}")
return builder.to_registers()
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hast Du probiert, ob die Werte auch ohne vorheriges Encodieren geschrieben werden? Eigentlich macht pymodbus das.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hast Du probiert, ob die Werte auch ohne vorheriges Encodieren geschrieben werden? Eigentlich macht pymodbus das.

Ich habe das aus der SMA Speichersteuerung abgekupfert, ich brauche bei SolarEdge aber wordorder Endian.Little, das konnte ich nur an der Stelle einbauen.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ok, das stimmt. Kannst Du den Code bitte in die common/mdobus.py verschieben? Der ist ja nicht SolarEdge-spezifisch und kann auch von anderen Modulen genutzt werden.

Copy link
Contributor Author

@cr0i cr0i Jun 5, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ich habe ja die wordorder Little fest hinterlegt, die müsste man dann vermutlich besser per übergebenem Parameter einrichten oder nur für die Kombination eine eigene def (byteorder Big, wordorder Little) anlegen?
Das übersteigt meine Copy&Paste Fähigkeiten, ich könnte nochmal im Forum fragen, ob jemand helfen kann.

@cr0i
Copy link
Contributor Author

cr0i commented Jun 4, 2025

Hallo @LKuemmel ,

mir ist bei einem Austausch mit openwb noch ein neuer Weg eingefallen, die soc_reserve dynamisch zu ermitteln.
Daher gibt es nun 3 Ansätze:

  1. soc_reserve als Config Option in die Bat aufnehmen, als Standardwert wird 10 übergeben, dieser muss vom Anwender entsprechend angepasst werden. Dafür kann ich dann auch gerne einen Wiki-Eintrag schreiben.
  2. Wenn wir Infos sammeln, welche Speicher es alles gibt und deren soc_reserve fest hinterlegen, dann müssten wir den Hersteller-String des Speichers auslesen und dann den Wert hinterlegen. Die Idee habe ich eigentlich verworfen, da zu viel Pflegeaufwand im Modul.
  3. Wenn ich die soc_reserve initial mit 10 definiere, und dann bei jedem auslesen des SoC den niedrigsten Wert in einer Variable (z.B. min_soc) speichere, dann haben wir nach einem Entladezyklus die soc_reserve dynamisch ermittelt. Ich würde den Wert extra nicht in den MQTT-Broker schreiben. Falls SolarEdge mal eine Änderung einbaut und den Wert ändert (ist in der Vergangenheit schonmal passiert), dann hätten wir wenigstens nach jedem Neustart wieder den korrekten Wert. Die Lösung gefällt mir eigentlich am Besten, müsste das aber erst noch bauen. Voraussetzung hierfür ist, dass "def initialize" nur einmalig nach einem Neustart ausgeführt wird. (Sollte aber m.E. so sein?)

Welche der Lösungen soll ich umsetzen?

VG
Christoph

@LKuemmel
Copy link
Contributor

LKuemmel commented Jun 5, 2025

Option 2 halte ich auch für zu aufwendig.
Bei Option 3 sehe ich zwei Nachteile: - Wenn der Speicher mal den Reserve-SoC überschreitet, hat man dann einen zu niedrigen Wert als Reserve.

  • Es müsste zumindest auf <= geprüft werden, sodass der aktuelle SoC auch der niedrigste bekannte SoC sein kann. Viele Anwender machen erstmal einen Reboot, wenn etwas nicht wie erwartet funktioniert und wenn dann nach jedem Reboot der Speicher erstmal komplett entladen werden muss, damit die Speichersteuerung funktioniert, ist das eine unschöne Abhängigkeit.

@cr0i
Copy link
Contributor Author

cr0i commented Jun 5, 2025

Option 2 halte ich auch für zu aufwendig. Bei Option 3 sehe ich zwei Nachteile: - Wenn der Speicher mal den Reserve-SoC überschreitet, hat man dann einen zu niedrigen Wert als Reserve.

  • Es müsste zumindest auf <= geprüft werden, sodass der aktuelle SoC auch der niedrigste bekannte SoC sein kann. Viele Anwender machen erstmal einen Reboot, wenn etwas nicht wie erwartet funktioniert und wenn dann nach jedem Reboot der Speicher erstmal komplett entladen werden muss, damit die Speichersteuerung funktioniert, ist das eine unschöne Abhängigkeit.

Die Speichersteuerung darf bei SoC = Reserve noch nicht beendet werden, da sonst bei 2 Speichern die Steuerung immer an- und ausgeschaltet wird, habe es nochmal korrigiert und den Grund kommentiert.

Ich habe es mal eingebaut, wie ich mir das denke:
Ich brauche 2 Variablen, da der aktuelle SoC 1-2 % unter dem Reserve-SoC Wert liegen kann (bei -2% erfolgt die Zwangsladung aus dem Netz).
Ich habe sie self.min_soc und soc_reserve genannt. (Hast Du für min_soc eine bessere Idee oder kann das so bleiben?)
Bei Auslesen des SoC vom Speicher wird immer der niedrigste Wert (soc, self.min_soc) in self.min_soc gespeichert.
Bei der Speichersteuerung nutze ich den höheren Wert aus self.min_soc+2 oder der Backup-Reserve(Falls konfiguriert) als Reserve-SoC.

self.min_soc habe ich aktuell Initial nur zum Test auf 100 bzw. 35 festgelegt, später soll es auf 8 definiert werden.
Das führt dazu, dass die Speichersteuerung nach einem Neustart auf jeden Fall funktioniert, wenn der SoC über 10% liegt.
Unter 10% wird die Speichersteuerung beendet.
Sollte es sich um einen Speicher handeln, der bis 5% oder 0% entladen werden kann, dann führt dies dazu, dass er wegen der beendeten Speichersteuerung bis zu seiner Grenze entladen wird.

Nach ein Neustart geht es also einmalig max. um 4% bzw. 9% ungewollte Entladung, bis der Wert einmal gelernt wurde.
Dafür haben wir dann aber eine Automatik, die keiner konfigurieren muss...
Bei Speichern mit 0% wird die Speichersteuerung bereits bei 1% beendet, das ist aber (s.o.) wegen dem Verhalten mit 2 Speichern nicht zu ändern.

Passt das so oder sollen wir die Config Option nehmen?

@LKuemmel LKuemmel marked this pull request as ready for review June 11, 2025 08:48
@LKuemmel
Copy link
Contributor

Das kann so rein. Wenn die automatische Erkennung sich nicht als praktikabel erweist, kann ja immer noch die Konfig-Option eingebaut werden.

@LKuemmel LKuemmel merged commit abd0a29 into openWB:master Jul 9, 2025
1 check passed
@cr0i cr0i deleted the solaredge-speichersteuerung-mit-battery_index branch July 9, 2025 18:21
LKuemmel pushed a commit that referenced this pull request Jul 18, 2025
* Update bat.py

* Update bat.py

* Update bat.py

* Update bat.py

* Update bat.py

* Update bat.py

* Update bat.py

* Update bat.py

* Update bat.py

* Update bat.py

* Update bat.py

* Update bat.py

* Update bat.py

* Update bat.py

* Update bat.py

* Update bat.py

* Update bat.py

* Update bat.py

* Update bat.py

* Update bat.py

* Update bat.py

* Update bat.py

* Update bat.py

* Update bat.py

* Update bat.py

* Update bat.py

* Update bat.py

* Update bat.py

* Update bat.py

* Update bat.py

* Update bat.py

* Update bat.py

* Update bat.py

* Update bat.py

* Update power_limit sign
@cr0i
Copy link
Contributor Author

cr0i commented Jul 20, 2025

Hallo @LKuemmel ,

nach den Hinweisen von seaspotter ist die Übergabe der konstanten Entladeleistung an den Speicher zwingend nötig.

Ich habe die Steuerung durch den Modus "Maximaler Eigenverbrauch" bei der SolarEdge Speichersteuerung über die "Maximale Entladeleistung" genutzt.
Hierdurch wird eine evtl. ungewollte Einspeisung aus dem Speicher, falls mal falsche Werte übergeben oder andere Probleme auftreten verhindert, daher habe ich mich für diese Umsetzung entschieden.
Hierbei wird aber die Entladung nicht erzwungen, wenn der Wechselrichter "anderer Meinung ist", es also zu einer Einspeisung führen würde.

Bitte gib mir Bescheid, wenn dies nochmal geändert werden soll.

VG
Christoph

@LKuemmel
Copy link
Contributor

Hallo @cr0i,
solange der Speicher sich entlädt, wenn Netzbezug entstehen würde und bei aktiver Speichersteuerung nicht mehr entlädt, als die openWB vorgibt, passt Deine Implementierung.

LKuemmel added a commit that referenced this pull request Aug 14, 2025
* bidi draft

* typos

* fixes

* fixes

* fixes

* flake8

* pytest

* fix pytest

* rename

* rename pro mode

* fixes

* workaround max current

* fix zero point control mode

* max_discharge_power

* calc max discharge power

* Exception

* fix extend meter check (#2518)

* fix phases scheduled charging combined with time charging (#2521)

* add path (#2520)

* create empty thread errors log (#2524)

* loose limits for hardware check (#2525)

* loose limits for hardware check

* fix

* fixes

* set zeor point to evu counter

* fix

* fix max bidi current

* flake8

* Only display time charging plans if time charging is activated (#2523)

* Build Web Theme: Koala

* use queue and listener for logging (#2528)

* use queue and listener for logging

* flake8

* log top (#2529)

* fix merge update_config

* disable screen timeout (#2535)

* SolarEdge Speichersteuerung mit Battery Index (#2269)

* Update bat.py

* Update bat.py

* Update bat.py

* Update bat.py

* Update bat.py

* Update bat.py

* Update bat.py

* Update bat.py

* Update bat.py

* Update bat.py

* Update bat.py

* Update bat.py

* Update bat.py

* Update bat.py

* Update bat.py

* Update bat.py

* Update bat.py

* Update bat.py

* Update bat.py

* Update bat.py

* Update bat.py

* Update bat.py

* Update bat.py

* Update bat.py

* Update bat.py

* Update bat.py

* Update bat.py

* Update bat.py

* Update bat.py

* Update bat.py

* Update bat.py

* Update bat.py

* Update bat.py

* Update bat.py

* Update power_limit sign

* fix SDM120 (#2536)

* throttled state (#2541)

* Fix SoC slider displayed for standard fahrzeug (#2540)

* Build Web Theme: Koala

* GoodWe second battery; fix no attribute error (#2539)

* add second battery and update config

* fix no attribute error

* fix register adresses

* GoodWe second battery - fix index detection (#2546)

* add second battery and update config

* fix no attribute error

* fix register adresses

* detect battery index

* Wiki SolarEdge Speichersteuerung (#2537)

* Wiki SolarEdge Speichersteuerung

* Change Default SoC-Reserve

* Change Default min_soc (#2543)

* Fix - New Vehicle soc slider visible when SoC module present (Vehicle Cards) (#2542)

* Build Web Theme: Koala

* remove unused assignment of response headers (#2544)

* Update requirements.txt - rise version of pycarwings3 to 0.7.14 (#2545)

* Create __init__.py

* Add files via upload

* Add files via upload

includes newest Base URL to Nissan API: https://gdcportalgw.its-mo.com/api_v230317_NE/gdc/

* Add files via upload

copied 1:1 from OpenWB V1.9

* Add files via upload

included module "fetch-soc" is derived from former soc.py in OpenWB V1.9

* Update soc.py

* Update soc.py

* Update soc.py

* Update soc.py

* Update responses.py

* Update packages/modules/vehicles/leaf/soc.py

Co-authored-by: LKuemmel <76958050+LKuemmel@users.noreply.github.com>

* Update soc.py

Ich habe Anzahl der Wartezyklen noch von 3 auf 9 erhöht, also insgesamt 3 Minuten Wartezeit. Bis dahin müsste der Nissan Server den Leaf in jedem Fall erreicht haben. Falls nicht, kehrt requestSoc() nach drei Minuten ohne Update des SoC auf dem Server zurück und das anschließende readSoc holt sich dann halt nur den alten SoC vom Server. In der Zeit haben die Funktionen von pycarwings2 und responses auch genug Zeit für Einträge ins Logging für eine evtl. notwendige Fehleranalyse.

* Update __init__.py

empty line at end of file removed accoring to warning from test run on Jul 15.

* Update __init__.py

* Update __init__.py

* Update __init__.py

empty line removed at end of file

* Update pycarwings2.py

At import instruction wildcard * replaced by the names of the classes to be imported

* Update pycarwings2.py

trailing spaces removed

* Update __init__.py

Empty line at end of file removed

* Update soc.py

missing whitespace after "," added

* Update __init__.py

* Delete packages/modules/vehicles/leaf/__init__.py

still a LF inside, that I can't delete. So I will replace  __init__.py by a really empty file to get flake 8 quiet

* Add files via upload

* Update requirements.txt

pycarwings2 added to load this library (for the SOC module of Nissan Leaf) during start

* Update packages/modules/vehicles/leaf/soc.py

Co-authored-by: LKuemmel <76958050+LKuemmel@users.noreply.github.com>

* Delete packages/modules/vehicles/leaf/pycarwings2.py

File deleted at this position as requested

* Delete packages/modules/vehicles/leaf/responses.py

File deleted at this position as requested

* Delete packages/modules/vehicles/leaf/soc.py

soc.py using pycarwings2 removed

* Add files via upload

api.py using pycarwings3 uploaded.
api_wo_CarState.py using pycarwings3 uploaded.
test_fetch_soc.py using fetch_soc within api_wo_CarState uploaded.
test_fetch_soc.py is able to run standalone, i.e. without OpenWB overhead. 
It prints the whole logging of interaction with the Nissan server on console and finishes with the SoC of the Nissan Leaf.
Enter your user ID and password before running.
This package is using https://github.com/ev-freaks/pycarwings3 from @remuslazar

* Add files via upload

* Add files via upload

* Add files via upload

* Add files via upload

replace requirements.txt with a version that includes pycarwings3.

* Update api.py

Definition/Import für Klasse CarState ergänzt.

* Update api.py

Name of parameter "vnum" within fetch_soc() changed to "charge_point".

* Update api.py

chargepoint

* Update config.py

variable "region" added.
variable "name" changed to "Nissan Leaf/NV200 -05.2019 (experimental)".

* Update soc.py

variable "region" added
parameter "calc_while_charging" added and preset to False

* Update api.py

variable "region" added

* Update config.py

Variable "region" added in line 5.

* Update api.py

* Update api.py

Parameter range added

* Update api.py

Import-Pfad zur config.py korrigiert

* Update api.py

fetching time stamp added

* Update soc.py

"charge_point" renamed to "vehicle" (missunderstanding)

* Update api.py

"chargepoint" renamed to "vehicle"
"LP" renamed to "vehicle"

* Delete packages/modules/vehicles/leaf/api_wo_CarState.py

needed for test purpose only

* Delete packages/modules/vehicles/leaf/test_fetch_soc.py

needed for test purpose only

* Update soc.py

trailing whitespaces removed

* Update api.py

according to flake8:
trailing whitespace removed.
import of LeafSoc und LeafConfiguration removed (not used).
comment shortened.
blank line added

* Update api.py

whitespaces removed

* Update soc.py

calc_while_charging removed

* Update soc.py

variable "vehicle" renamed to "charge_point"

* Update soc.py

trailing whitespaces removed

* Mock pycarwings3 for pytest

* Update requirements.txt - rise version of pycarwings3 to 0.7.14

The vehicle module for fetching the SoC of NISSAN Leaf is using the library pycarwings3.
NISSAN has changed the URL of its API as well as the method of encryption from Blowfish to AES.
Details see remuslazar/homeassistant-carwings#100
New API is at URL https://gdcportalgw.its-mo.com/api_v250205_NE/gdc/

Many thanks to @remuslazar and @zwartevogel who already updated pycarwings3 to version 0.7.14, 
see ev-freaks/pycarwings3#14 
and remuslazar/homeassistant-carwings#101
With this PR the changed pycarwings3 library will be introduced into openWB2 V2.1.8 Alpha.1 &.2 by rising the version No of pycarwings3 from 0.7.13 to 0.7.14 in requirements.txt.

---------

Co-authored-by: LKuemmel <76958050+LKuemmel@users.noreply.github.com>

* fix manual soc: manual_soc=0% (#2548)

* fix manual soc: manual_soc=0%

* flake8

* get counter state (#2549)

* Widen the main layout area and display 3 cards on screen > 1400px (#2547)

* pytest

* Build Web Theme: Koala

* Revert "Widen the main layout area and display 3 cards on screen > 1400px (#2…" (#2550)

This reverts commit 2819727.

* Build Web Theme: Koala

* fix power limit init (#2555)

* new SoC module Cupra (#2553)

* add cupra connect soc

* add docu

* fix manual soc (#2560)

* reset fault state at init for tariffs, backup clouds and vehicles (#2562)

* fix template id must be int not str (#2566)

* fix template id must be int not str

* flake8

* adjust factors of phase values (#2564)

* fix Meter_Power Nonetype (#2563)

* evu kit: clean up code (#2559)

* evu kit: clean up code

* flake8

* component-wise error handling (#2557)

* info-box for new features (#2515)

* info-box for new features

* flake8

* fix component-wise error handling (#2568)

* fix merge

* add max dis/charge power

* test charge_template

* integration test bidi charging

* draft

* bidi in scheduled charging

* fixes

* fixes

* fix test

* unused code

---------

Co-authored-by: ndrsnhs <156670705+ndrsnhs@users.noreply.github.com>
Co-authored-by: BrettS <168732306+Brett-S-OWB@users.noreply.github.com>
Co-authored-by: LKuemmel <LKuemmel@users.noreply.github.com>
Co-authored-by: cr0i <christoph@rischke.net>
Co-authored-by: vuffiraa72 <u.mersewsky+github@gmail.com>
Co-authored-by: mekrapp <158028484+mekrapp@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants