Last active
July 24, 2024 19:07
-
-
Save by-cx/04d24ef87b680404bd9ff9bdff15e7e1 to your computer and use it in GitHub Desktop.
Power pricing CZ OTE
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #!/usr/bin/env python3 | |
| import datetime | |
| from genericpath import isfile | |
| import json | |
| import os | |
| import requests | |
| import calendar | |
| from flask import Flask | |
| from flask import jsonify | |
| url_energy = "https://www.ote-cr.cz/cs/kratkodobe-trhy/elektrina/denni-trh/@@chart-data?report_date={}" | |
| url_currency = "https://data.kurzy.cz/json/meny/b[1].json" | |
| url_currency2 = "https://www.cnb.cz/cs/financni-trhy/devizovy-trh/kurzy-devizoveho-trhu/kurzy-devizoveho-trhu/denni_kurz.txt?date={day}.{month}.{year}" | |
| CACHE_PATH = "./cache.json" | |
| ENERGY_CACHE_PATH = "./cache-energy.json" | |
| NO_CACHE = False | |
| SELL_FEE = 0.45 | |
| BUY_FEE = 0.45 | |
| VAT=1.21 | |
| class PriceException(Exception): | |
| pass | |
| def get_distribution_price(): | |
| cez_57d_vt = 0.64862 | |
| cez_57d_nt = 0.43809 | |
| tax = 0.0283 | |
| services = 0.21282 | |
| ote = 0 # this is 4 crown per month | |
| oze = 0.495 | |
| additional = tax+services+ote+oze | |
| return { | |
| "high": cez_57d_vt+additional, | |
| "low": cez_57d_nt+additional, | |
| } | |
| def get_breaker_payment(): | |
| # https://www.tzb-info.cz/ceny-paliv-a-energii/14-ceny-elektriny#D57d | |
| cez_32a = 500 | |
| currentDate = datetime.date.today() | |
| daysInMonth = calendar.monthrange(currentDate.year, currentDate.month)[1] | |
| return cez_32a/daysInMonth/24 | |
| def get_current_energy_price(date_str, selected_hour): | |
| selected_hour = str(selected_hour) | |
| data = { | |
| "date": "", | |
| "hours": {}, | |
| } | |
| try: | |
| if os.path.isfile(ENERGY_CACHE_PATH) and not NO_CACHE: | |
| with open(ENERGY_CACHE_PATH, "r") as f: | |
| data = json.load(f) | |
| except json.decoder.JSONDecodeError: | |
| cache = {} | |
| if data["date"] == date_str: | |
| return data["hours"][selected_hour] | |
| r = requests.get(url_energy.format(date_str)) | |
| print(r.text) | |
| for hour in r.json()["data"]["dataLine"][1]["point"]: | |
| data["hours"][str(int(hour["x"])-1)] = hour["y"] | |
| data["date"] = date_str | |
| with open(ENERGY_CACHE_PATH, "w") as f: | |
| json.dump(data, f) | |
| return data["hours"][selected_hour] | |
| #def get_currency_ratio(currency): | |
| # r = requests.get(url_currency) | |
| # return r.json()["kurzy"][currency]["dev_stred"] | |
| def get_currency_ratio(currency): | |
| now = datetime.date.today() | |
| url = url_currency2.format(day=now.day,month=now.month,year=now.year) | |
| r = requests.get(url) | |
| for row in [x.split("|") for x in r.text.split("\n") if x and "|" in x]: | |
| if row[3] == "EUR": | |
| return float(row[4].replace(",", ".")) | |
| raise PriceException("EUR not found") | |
| def hour_result(): | |
| current_hour = datetime.datetime.now().hour | |
| today = datetime.date.today().strftime("%Y-%m-%d") | |
| cache = {} | |
| try: | |
| if os.path.isfile(CACHE_PATH) and not NO_CACHE: | |
| with open(CACHE_PATH, "r") as f: | |
| cache = json.load(f) | |
| except json.decoder.JSONDecodeError: | |
| cache = {} | |
| if cache.get("date") == today and cache.get("hour") == current_hour: | |
| cache["cached"] = True | |
| return cache | |
| energy_price = get_current_energy_price(today, current_hour) | |
| eur2czk = get_currency_ratio("EUR") | |
| breaker = get_breaker_payment() | |
| distribution = get_distribution_price() | |
| data = { | |
| "date": datetime.date.today().strftime("%Y-%m-%d"), | |
| "hour": datetime.datetime.now().hour, | |
| "breaker": "32A", | |
| "tariff": "57d", | |
| "price": { | |
| "distribution": distribution, | |
| "market": energy_price/1000*eur2czk, | |
| "market_vat": energy_price/1000*eur2czk*VAT, | |
| "marker_sell": energy_price/1000*eur2czk-SELL_FEE, # Typo | |
| "market_sell": energy_price/1000*eur2czk-SELL_FEE, | |
| "breaker": breaker, | |
| "breaker_vat": breaker*VAT, | |
| "sell_fee": SELL_FEE, | |
| "buy_fee": BUY_FEE, | |
| "total": { | |
| "high": energy_price/1000*eur2czk+breaker+distribution["high"]+BUY_FEE, | |
| "low": energy_price/1000*eur2czk+breaker+distribution["low"]+BUY_FEE, | |
| }, | |
| "total_no_breaker": { | |
| "high": energy_price/1000*eur2czk+distribution["high"]+BUY_FEE, | |
| "low": energy_price/1000*eur2czk+distribution["low"]+BUY_FEE, | |
| }, | |
| "total_vat": { | |
| "high": (energy_price/1000*eur2czk+breaker+distribution["high"]+BUY_FEE)*VAT, | |
| "low": (energy_price/1000*eur2czk+breaker+distribution["low"]+BUY_FEE)*VAT, | |
| }, | |
| "total_no_breaker_vat": { | |
| "high": (energy_price/1000*eur2czk+distribution["high"]+BUY_FEE)*VAT, | |
| "low": (energy_price/1000*eur2czk+distribution["low"]+BUY_FEE)*VAT, | |
| } | |
| }, | |
| "cached": False, | |
| } | |
| with open(CACHE_PATH, "w") as f: | |
| json.dump(data, f) | |
| return data | |
| app = Flask(__name__) | |
| @app.route("/") | |
| def result(): | |
| return jsonify(hour_result()) | |
| if __name__ == "__main__": | |
| app.run(debug=True) |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| flask | |
| requests |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment