Skip to content

Commit

Permalink
Merge branch 'master' into soc_request_interval
Browse files Browse the repository at this point in the history
  • Loading branch information
benderl authored Dec 11, 2023
2 parents 2f25906 + 821d162 commit 58328ba
Show file tree
Hide file tree
Showing 208 changed files with 3,539 additions and 2,121 deletions.
7 changes: 7 additions & 0 deletions .htaccess
Original file line number Diff line number Diff line change
@@ -1,3 +1,10 @@
<IfModule mod_headers.c>
Header set Cache-Control "no-cache, no-store, must-revalidate"
Header set Pragma "no-cache"
Header set Expires 0
</IfModule>

RedirectMatch 404 \.conf$
RedirectMatch 404 \.ini$
RedirectMatch 404 \.py$
ErrorDocument 404 /openWB/web/error.html
14 changes: 8 additions & 6 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,23 +18,25 @@ Keine Gewährleistung für die Software - use at your own RISK!

## Wofür?

Steuerung einer EVSE DIN oder anderer Ladepunkte für sofortiges laden, Überwachung der Ladung, PV Überschussladung und Lastmanagement mehrerer WB.
Steuerung einer EVSE DIN oder anderer Ladepunkte für sofortiges laden, Überwachung der Ladung, PV Überschussladung und Lastmanagement mehrerer Wallboxen.

Unterstützt wird jedes EV das den AC Ladestandard unterstützt.
Unterstützt wird jedes Fahrzeug, das den AC Ladestandard unterstützt.

## Bezug

openWB gibt es unter <https://openwb.de/shop/>.

## Installation

Bei fertigen openWB bereits vorinstalliert.
Bei fertig erworbenen openWB ist die Software bereits vorinstalliert.

Software:

- Installiertes Raspberry Pi OS auf einem Raspberry Pi 3b+ oder besser.
- Raspberry Pi OS Lite installieren. Aktuell werden in der Version 1.99 nur Bullseye (bevorzugt) und Buster unterstützt.
<http://downloads.raspberrypi.org/raspios_lite_armhf/images/>
- Installiertes Raspberry Pi OS auf einem Raspberry Pi 3b oder besser.
- Raspberry Pi OS Lite installieren. Aktuell wird in der Version 2.1 nur **Debian 11 "Bullseye"** (derzeit "oldstable") unterstützt.
<https://downloads.raspberrypi.org/raspios_oldstable_lite_armhf/>
- alternativ kann auch ein x86_64 System (Hardware oder als VM) mit installiertem **Debian 11 "Bullseye"** als Basis verwendet werden.
- Eine Installation unter **Debian 12 "Bookworm"** wird noch nicht unterstützt!

In der Shell folgendes eingeben:

Expand Down
5 changes: 3 additions & 2 deletions docs/Ladepunkte.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ Die Einstellungen für Ladepunkte unterteilen sich in die spezifischen Einstellu

Beim Hinzufügen eines Ladepunkts muss zunächst dessen Typ ausgewählt werden. Danach wird Ladepunkt-spezifisches, wie z.B. die Anzahl angeschlossener Phasen oder eine verbaute Phasenumschaltung, konfiguriert.

In dem Ladepunkt-Profil sind die Einstellungen zum automatischen Sperren (Autolock) und für RFID von Ladepunkten enthalten. Ein Ladepunkt-Profil kann vom Benutzer mehreren Ladepunkte zugewiesen werden, sodass die Einstellungen für jeden Ladepunkte einzeln oder für eine Gruppe zugewiesen werden können.
In dem Ladepunkt-Profil sind die Einstellungen zum automatischen Sperren (Autolock) und für die Freigabe von Ladepunkten durch ID-Tags enthalten. Ein Ladepunkt-Profil kann vom Benutzer mehreren Ladepunkte zugewiesen werden, sodass die Einstellungen für jeden Ladepunkte einzeln oder für eine Gruppe zugewiesen werden können.

Das Vorhalten eines RFID-Tags (verbauter RFID-Leser erforderlich) oder die Pin-Eingabe (Display erforderlich, Eingabefeld muss im Steuerungsmodus 'secondary' aktiviert werden) werden gleich verarbeitet.
Das Erfassen eines RFID-Tags (verbauter RFID-Leser erforderlich) oder die Pin-Eingabe (Display erforderlich, Eingabefeld muss im Steuerungsmodus 'secondary' aktiviert werden) sowie die automatische
Fahrzeugerkennung der openWB Pro (muss in den Einstellungen aktiviert werden) werden gleich verarbeitet.
6 changes: 3 additions & 3 deletions docs/Ladung nur nach Freischaltung.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,6 @@ Hierzu ist folgendes zu konfigurieren:

Wenn die Freischaltung mittels PIN, RFID oder MAC-Adresse erfolgen soll:

- Einstellungen -> Optionale Hardware: **RFID aktivieren** + Speichern
- unter Konfiguration -> Fahrzeuge -> gewünschtes Fahrzeug -> Zugeordnete Tags: dem jeweiligen Fahrzeug **den Tag (PIN/RFID-Tag/MAC-Adresse) zuweisen** + Speichern
- unter Konfiguration -> Ladepunkte -> Ladepunkt-Profile -> im gewünschten Ladepunkt-Profil: **Freischaltung mit RFID aktivieren und die gültigen Tags eintragen** + Speichern
- Einstellungen -> Optionale Hardware: **Identifikation aktivieren** + Speichern
- unter Konfiguration -> Fahrzeuge -> gewünschtes Fahrzeug -> Zugeordnete ID-Tags: dem jeweiligen Fahrzeug **den ID-Tag (PIN/RFID-Tag/MAC-Adresse) zuweisen** + Speichern
- unter Konfiguration -> Ladepunkte -> Ladepunkt-Profile -> im gewünschten Ladepunkt-Profil: **Freigabe durch ID-Tags aktivieren und die gültigen ID-Tags zuordnen** + Speichern
2 changes: 1 addition & 1 deletion docs/_Sidebar.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
* [Fahrzeuge](https://github.com/openWB/core/wiki/Fahrzeuge)
* [Lastmanagement und kaskadierte Zähler](https://github.com/openWB/core/wiki/Lastmanagement-und-kaskadierte-Zähler)
* Szenarien
* [RFID/Ladung nur nach Freischaltung](https://github.com/openWB/core/wiki/Ladung-nur-nach-Freischaltung)
* [ID-Tag/Ladung nur nach Freischaltung](https://github.com/openWB/core/wiki/Ladung-nur-nach-Freischaltung)
* [Hybrid-System aus Wechselrichter und Speicher](https://github.com/openWB/core/wiki/Hybrid-System-aus-Wechselrichter-und-Speicher)
* Mitarbeit am Projekt
* [Wiki-Eintrag erstellen](https://github.com/openWB/core/wiki/Wiki-Eintrag_erstellen)
Expand Down
7 changes: 3 additions & 4 deletions openwb-install.sh
Original file line number Diff line number Diff line change
Expand Up @@ -116,19 +116,18 @@ echo "installing python requirements..."
sudo -u "$OPENWB_USER" pip install -r "${OPENWBBASEDIR}/requirements.txt"

echo "installing openwb2 system service..."
cp "${OPENWBBASEDIR}/data/config/openwb2.service" /etc/systemd/system/openwb2.service
ln -s "${OPENWBBASEDIR}/data/config/openwb2.service" /etc/systemd/system/openwb2.service
systemctl daemon-reload
systemctl enable openwb2
systemctl start openwb2

echo "installing openwb2 remote support service..."
cp "${OPENWBBASEDIR}/data/config/openwbRemoteSupport.service" /etc/systemd/system/openwbRemoteSupport.service
systemctl daemon-reload
systemctl enable openwbRemoteSupport
systemctl start openwbRemoteSupport

echo "installation finished, now running atreboot.sh..."
"${OPENWBBASEDIR}/runs/atreboot.sh"
echo "installation finished, now starting openwb2.service..."
systemctl start openwb2

echo "all done"
echo "if you want to use this installation for development, add a password for user 'openwb'"
32 changes: 16 additions & 16 deletions packages/control/algorithm/integration_test/pv_charging_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -113,7 +113,7 @@ def assert_counter_set(params: ParamsExpectedCounterSet):
def test_start_pv_delay(all_cp_pv_charging_3p, all_cp_not_charging, monkeypatch):
# alle 3 im PV-laden, keine Ladung -> bei zweien die Verz starten, für den 3 reichts nicht
# setup
data.data.counter_data["counter0"].data.set.raw_power_left = 31200
data.data.counter_data["counter0"].data.set.raw_power_left = 31775
data.data.counter_data["counter0"].data.set.raw_currents_left = [32, 30, 31]
data.data.counter_data["counter6"].data.set.raw_currents_left = [16, 12, 14]
data.data.counter_data["counter0"].data.set.reserved_surplus = 0
Expand All @@ -132,8 +132,8 @@ def test_start_pv_delay(all_cp_pv_charging_3p, all_cp_not_charging, monkeypatch)
"cp4"].data.control_parameter.timestamp_switch_on_off == "05/16/2022, 08:40:52"
assert data.data.cp_data[
"cp5"].data.control_parameter.timestamp_switch_on_off is None
assert data.data.counter_data["counter0"].data.set.raw_power_left == 31200
assert data.data.counter_data["counter0"].data.set.surplus_power_left == 9315
assert data.data.counter_data["counter0"].data.set.raw_power_left == 31775
assert data.data.counter_data["counter0"].data.set.surplus_power_left == 9200
assert data.data.counter_data["counter0"].data.set.reserved_surplus == 9000


Expand Down Expand Up @@ -172,7 +172,7 @@ def test_pv_delay_expired(all_cp_pv_charging_3p, all_cp_not_charging, monkeypatc
assert data.data.cp_data[
"cp5"].data.control_parameter.timestamp_switch_on_off is None
assert data.data.counter_data["counter0"].data.set.raw_power_left == 24300
assert data.data.counter_data["counter0"].data.set.surplus_power_left == 2415
assert data.data.counter_data["counter0"].data.set.surplus_power_left == 1725
assert data.data.counter_data["counter0"].data.set.reserved_surplus == 0


Expand All @@ -186,31 +186,31 @@ def test_pv_delay_expired(all_cp_pv_charging_3p, all_cp_not_charging, monkeypatc
expected_current_cp4=8,
expected_current_cp5=8,
expected_raw_power_left=34820,
expected_surplus_power_left=6035.0,
expected_surplus_power_left=7125.0,
expected_reserved_surplus=0,
expected_released_surplus=0),
ParamsSurplus(name="reduce current",
power=-1090,
raw_power_left=38560,
raw_power_left=39650,
raw_currents_left_counter0=[40]*3,
raw_currents_left_counter6=[16]*3,
expected_current_cp3=10.722222222222221,
expected_current_cp4=6.722222222222222,
expected_current_cp5=6.722222222222223,
expected_raw_power_left=23380,
expected_surplus_power_left=-2.2737367544323206e-13,
expected_current_cp3=11.77536231884058,
expected_current_cp4=7.77536231884058,
expected_current_cp5=7.775362318840579,
expected_raw_power_left=24470,
expected_surplus_power_left=2.2737367544323206e-13,
expected_reserved_surplus=0,
expected_released_surplus=0),
ParamsSurplus(name="switch off delay for two of three charging",
power=8200,
raw_power_left=28900,
raw_power_left=20815,
raw_currents_left_counter0=[40]*3,
raw_currents_left_counter6=[16]*3,
expected_current_cp3=10,
expected_current_cp4=6,
expected_current_cp5=6,
expected_raw_power_left=13720,
expected_surplus_power_left=0,
expected_raw_power_left=5635,
expected_surplus_power_left=-24450.0,
expected_reserved_surplus=0,
expected_released_surplus=11040),
]
Expand Down Expand Up @@ -246,7 +246,7 @@ def test_surplus(params: ParamsSurplus, all_cp_pv_charging_3p, all_cp_charging_3
expected_current_cp4=6,
expected_current_cp5=6,
expected_raw_power_left=17400,
expected_surplus_power_left=0,
expected_surplus_power_left=-5175,
expected_reserved_surplus=0,
expected_released_surplus=0),
ParamsPhaseSwitch(name="phase switch 1p->3p",
Expand All @@ -260,7 +260,7 @@ def test_surplus(params: ParamsSurplus, all_cp_pv_charging_3p, all_cp_charging_3
expected_current_cp4=6,
expected_current_cp5=6,
expected_raw_power_left=37520.0,
expected_surplus_power_left=10575.0,
expected_surplus_power_left=13575.0,
expected_reserved_surplus=460,
expected_released_surplus=0)
]
Expand Down
9 changes: 6 additions & 3 deletions packages/control/bat_all.py
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,7 @@ def get_factory() -> Get:
@dataclass
class Set:
charging_power_left: float = 0
regulate_up: bool = False
switch_on_soc_reached: bool = False
switch_on_soc_state = SwitchOnBatState = SwitchOnBatState.SWITCH_ON_SOC_NOT_REACHED

Expand Down Expand Up @@ -180,6 +181,7 @@ def setup_bat(self):
self.data.get.power = 0
Pub().pub("openWB/set/bat/set/charging_power_left", self.data.set.charging_power_left)
Pub().pub("openWB/set/bat/set/switch_on_soc_reached", self.data.set.switch_on_soc_reached)
Pub().pub("openWB/set/bat/set/regulate_up", self.data.set.regulate_up)
except Exception:
log.exception("Fehler im Bat-Modul")

Expand All @@ -189,6 +191,7 @@ def _get_charging_power_left(self):
try:
config = data.data.general_data.data.chargemode_config.pv_charging
self.data.set.charging_power_left = self.data.get.power
self.data.set.regulate_up = False
if config.bat_prio:
# Speicher-Vorrang
# Wenn der Speicher Vorrang hat, darf die erlaubte Entlade-Leistung zum Laden der EV genutzt werden,
Expand All @@ -204,10 +207,10 @@ def _get_charging_power_left(self):
config.rundown_power)
log.debug(f"Erlaubte Entlade-Leistung nutzen {self.data.set.charging_power_left}W")
else:
self.data.set.charging_power_left = min(0, self.data.get.power)
# Wenn der Speicher entladen wird, darf diese Leistung nicht zum Laden der Fahrzeuge genutzt werden.
# 50 W Überschuss übrig lassen, die sich der Speicher dann nehmen kann. Wenn der Speicher
# schneller regelt als die LP, würde sonst der Speicher reduziert werden.
self.data.set.charging_power_left = min(0, self.data.get.power) - 50
# Wenn der Speicher schneller regelt als die LP, würde sonst der Speicher reduziert werden.
self.data.set.regulate_up = True
else:
# Fahrzeug-Vorrang
log.debug(f'Verbleibende Speicher-Leistung: {self.data.set.charging_power_left}W')
Expand Down
16 changes: 9 additions & 7 deletions packages/control/bat_all_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -119,22 +119,23 @@ class Params:
power: float
soc: float
expected_charging_power_left: float
expected_regulate_up: bool


cases = [
Params("lädt, EV-Vorrang ohne Ladeleistungsreserve", PvCharging(bat_prio=False, charging_power_reserve=0), 500,
100, 500),
100, 500, False),
Params("lädt, EV-Vorrang mit Ladeleistungsreserve, Speicher voll",
PvCharging(bat_prio=False, charging_power_reserve=200), 500,
100, 500),
100, 500, False),
Params("lädt, EV-Vorrang mit Ladeleistungsreserve", PvCharging(bat_prio=False, charging_power_reserve=200), 500,
99, 300),
Params("lädt, Speicher-Vorrang mit erlaubter Entladeleistung", PvCharging(bat_prio=True), 500, 51, 500),
99, 300, False),
Params("lädt, Speicher-Vorrang mit erlaubter Entladeleistung", PvCharging(bat_prio=True), 500, 51, 500, False),
Params("lädt, Speicher-Vorrang ohne erlaubte Entladeleistung, Minimal-SoC unterschritten",
PvCharging(bat_prio=True), 500, 50, -50),
PvCharging(bat_prio=True), 500, 50, 0, True),
Params("entlädt mit mehr als Entladeleistung, Speicher-Vorrang mit erlaubter Entladeleistung",
PvCharging(bat_prio=True), -2500, 51, -1500),
Params("entlädt, Speicher-Vorrang mit erlaubter Entladeleistung", PvCharging(bat_prio=True), -600, 51, 500),
PvCharging(bat_prio=True), -2500, 51, -1500, False),
Params("entlädt, Speicher-Vorrang mit erlaubter Entladeleistung", PvCharging(bat_prio=True), -600, 51, 500, False),
]


Expand All @@ -156,3 +157,4 @@ def test_get_charging_power_left(params: Params, caplog, data_fixture, monkeypat

# evaluation
assert b_all.data.set.charging_power_left == params.expected_charging_power_left
assert b_all.data.set.regulate_up == params.expected_regulate_up
4 changes: 2 additions & 2 deletions packages/control/chargelog.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
from helpermodules import timecheck

# alte Daten: Startzeitpunkt der Ladung, Endzeitpunkt, Geladene Reichweite, Energie, Leistung, Ladedauer, LP-Nummer,
# Lademodus, RFID-Tag
# Lademodus, ID-Tag
# json-Objekt: {"chargepoint": {"id": 1, "name": "Hof", "rfid": 1234},
# "vehicle": { "id": 1, "name":"Model 3", "chargemode": "pv_charging", "prio": True },
# "time": { "begin":"27.05.2021 07:43", "end": "27.05.2021 07:50", "time_charged": "1:34",
Expand Down Expand Up @@ -200,7 +200,7 @@ def get_log_data(request: Dict):
entry["vehicle"]["rfid"] not in request["filter"]["vehicle"]["rfid"]
):
log.debug(
"Verwerfe Eintrag wegen RFID Tag: %s != %s" %
"Verwerfe Eintrag wegen ID Tag: %s != %s" %
(str(entry["vehicle"]["rfid"]), str(request["filter"]["vehicle"]["rfid"]))
)
continue
Expand Down
Loading

0 comments on commit 58328ba

Please sign in to comment.