Skip to content

Commit aaa3002

Browse files
authored
Rabot (#3058)
* draft * fix * fix * typo * fix * fixes * unit * fix unit
1 parent 0dd93f5 commit aaa3002

4 files changed

Lines changed: 17 additions & 90 deletions

File tree

packages/control/optional.py

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -154,11 +154,10 @@ def remove(price_data: Dict) -> Dict:
154154

155155
try:
156156
if self.data.electricity_pricing.configured:
157-
if len(self.data.electricity_pricing.get.prices) == 0:
158-
return
159-
ep = self.data.electricity_pricing
160-
ep.get.prices = remove(ep.get.prices)
161-
Pub().pub("openWB/set/optional/ep/get/prices", ep.get.prices)
157+
if len(self.data.electricity_pricing.get.prices) >= 0:
158+
ep = self.data.electricity_pricing
159+
ep.get.prices = remove(ep.get.prices)
160+
Pub().pub("openWB/set/optional/ep/get/prices", ep.get.prices)
162161
if self._flexible_tariff_module:
163162
ep.flexible_tariff.get.prices = remove(ep.flexible_tariff.get.prices)
164163
Pub().pub("openWB/set/optional/ep/flexible_tariff/get/prices", ep.flexible_tariff.get.prices)

packages/modules/electricity_pricing/flexible_tariffs/rabot/config.py

Lines changed: 4 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,12 @@
11
from typing import Optional
22

33

4-
class RabotToken():
5-
def __init__(self,
6-
access_token: Optional[str] = None,
7-
expires_in: Optional[str] = None,
8-
created_at: Optional[str] = None) -> None:
9-
self.access_token = access_token # don't show in UI
10-
self.expires_in = expires_in # don't show in UI
11-
self.created_at = created_at # don't show in UI
12-
13-
144
class RabotTariffConfiguration:
155
def __init__(self,
16-
client_id: Optional[str] = None,
17-
client_secret: Optional[str] = None,
18-
token: RabotToken = None):
19-
self.client_id = client_id
20-
self.client_secret = client_secret
21-
self.token = token or RabotToken()
6+
customer_number: Optional[str] = None,
7+
contract_number: Optional[str] = None):
8+
self.customer_number = customer_number
9+
self.contract_number = contract_number
2210

2311

2412
class RabotTariff:

packages/modules/electricity_pricing/flexible_tariffs/rabot/tariff.py

Lines changed: 8 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -2,90 +2,30 @@
22
import datetime
33
import logging
44
from typing import Dict
5-
from requests.exceptions import HTTPError
65

7-
from helpermodules.utils.error_handling import ImportErrorContext
8-
with ImportErrorContext():
9-
import pytz
10-
11-
from dataclass_utils import asdict
12-
from helpermodules import timecheck
13-
from helpermodules.pub import Pub
146
from modules.common import req
157
from modules.common.abstract_device import DeviceDescriptor
168
from modules.common.component_state import TariffState
17-
from modules.electricity_pricing.flexible_tariffs.rabot.config import RabotTariff, RabotToken
9+
from modules.electricity_pricing.flexible_tariffs.rabot.config import RabotTariff
1810

1911
log = logging.getLogger(__name__)
2012

2113

22-
def validate_token(config: RabotTariff) -> None:
23-
if config.configuration.token.expires_in:
24-
expiration = config.configuration.token.created_at + config.configuration.token.expires_in
25-
log.debug("No need to authenticate. Valid token already present.")
26-
if timecheck.create_timestamp() > expiration:
27-
log.debug("Access token expired. Refreshing token.")
28-
_refresh_token(config)
29-
else:
30-
_refresh_token(config)
31-
32-
33-
def _refresh_token(config: RabotTariff):
34-
data = {
35-
'client_id': {config.configuration.client_id},
36-
'client_secret': {config.configuration.client_secret},
37-
'grant_type': 'client_credentials',
38-
'scope': 'openid offline_access api:hems',
39-
}
40-
response = req.get_http_session().post(
41-
'https://auth.rabot-charge.de/connect/token?client_id=&client_secret=&username=&password=&scope=*&'
42-
+ 'grant_type=client_credentials', data=data).json()
43-
config.configuration.token = RabotToken(access_token=response["access_token"],
44-
expires_in=response["expires_in"],
45-
created_at=timecheck.create_timestamp())
46-
Pub().pub("openWB/set/optional/ep/flexible_tariff/provider", asdict(config))
47-
48-
4914
def fetch(config: RabotTariff) -> None:
50-
def get_raw_prices():
51-
return req.get_http_session().get(
52-
"https://api.rabot-charge.de/hems/v1/day-ahead-prices/limited",
53-
headers={"Content-Type": "application/json",
54-
"Authorization": f'Bearer {config.configuration.token.access_token}'},
55-
params={"from": start_date, "tz": timezone}
56-
).json()["records"]
57-
58-
validate_token(config)
59-
# ToDo: get rid of hard coded timezone!
60-
# start_date von voller Stunde sonst liefert die API die nächste Stunde
61-
start_date = datetime.datetime.fromtimestamp(
62-
timecheck.create_unix_timestamp_current_full_hour()).astimezone(
63-
pytz.timezone("Europe/Berlin")).isoformat(sep="T", timespec="seconds")
64-
if datetime.datetime.today().astimezone(pytz.timezone("Europe/Berlin")).dst().total_seconds()/3600:
65-
# Sommerzeit
66-
timezone = "UTC+2:00"
67-
else:
68-
timezone = "UTC+1:00"
69-
try:
70-
raw_prices = get_raw_prices()
71-
except HTTPError as error:
72-
if error.response.status_code == 401:
73-
_refresh_token(config)
74-
raw_prices = get_raw_prices()
75-
else:
76-
raise error
15+
raw_prices = req.get_http_session().get(
16+
f"https://rabot.openwb.de/rabot-proxy.php/customers/{config.configuration.customer_number}"
17+
f"/contracts/{config.configuration.contract_number}/metrics",
18+
timeout=15
19+
).json()["data"]["records"]
7720
prices: Dict[int, float] = {}
7821
for data in raw_prices:
79-
formatted_price = data["priceInCentPerKwh"]/100000 # Cent/kWh -> €/Wh
80-
timestamp = datetime.datetime.fromisoformat(data["timestamp"]).astimezone(
81-
pytz.timezone("Europe/Berlin")).timestamp()
22+
formatted_price = data["value"] / 100000 # ct/kWh -> €/Wh
23+
timestamp = datetime.datetime.strptime(data["moment"], "%Y-%m-%d %H:%M").timestamp()
8224
prices.update({str(int(timestamp)): formatted_price})
8325
return prices
8426

8527

8628
def create_electricity_tariff(config: RabotTariff):
87-
validate_token(config)
88-
8929
def updater():
9030
return TariffState(prices=fetch(config))
9131
return updater

packages/modules/loadvars.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -155,7 +155,7 @@ def append_thread_set_values(module_name: str) -> None:
155155
joined_thread_handler(threads_set_values, None)
156156
wait_for_module_update_completed(self.event_module_update_completed,
157157
"openWB/set/optional/ep/module_update_completed")
158-
data.data.copy_module_data()
158+
data.data.copy_data()
159159
self.price_value_store.update()
160160
except Exception as e:
161161
log.exception("Fehler im Optional-Modul: %s", e)

0 commit comments

Comments
 (0)