-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathconfig.py
More file actions
171 lines (136 loc) · 8.26 KB
/
Copy pathconfig.py
File metadata and controls
171 lines (136 loc) · 8.26 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
"""
Centrale configuratie voor E_manager.
Alle paden en instelbare waardes staan hier bij elkaar, zodat een nieuwe
gebruiker dit bestand kan aanpassen zonder in de scriptlogica te duiken.
Secrets (API-tokens) horen hier NIET in, die horen in .env
(zie .env.example) en worden via os.getenv() ingeladen.
"""
import os
from pathlib import Path
from dotenv import load_dotenv
# --- Basisdirectory --------------------------------------------------------
# Alle overige paden zijn hiervan afgeleid. Dit is de enige regel die je
# hoeft aan te passen als je het project ergens anders installeert.
BASE_DIR = Path(__file__).resolve().parent
# .env wordt hier één keer centraal geladen (bij de eerste import van config),
# zodat andere modules niet zelf load_dotenv() hoeven aan te roepen.
load_dotenv(BASE_DIR / ".env")
# --- Secrets (uit .env, zie .env.example) -------------------------------
# None als de key ontbreekt - scripts die dit gebruiken moeten dat zelf
# controleren (zie Enever_tarieven.py voor een voorbeeld).
ENEVER_TOKEN = os.getenv("Enever_token")
WEERLIVE_TOKEN = os.getenv("Weerlive_token")
# --- Bestandslocaties ---------------------------------------------------
SHARE_DIR = BASE_DIR / "share"
LOG_DIR = BASE_DIR / "logs"
READER_DATA_JSON = SHARE_DIR / "reader_data.json"
SETPOINTS_JSON = SHARE_DIR / "setpoints.json"
# Legacy pad - nog gebruikt als DEFAULT_PATH in shared_store.py voor
# eventuele losse scripts die niet expliciet een path meegeven.
SHARED_DATA_JSON = SHARE_DIR / "shared_data.json"
TARIEVEN_JSON = SHARE_DIR / "tarieven.json"
ENERGY_JSON = SHARE_DIR / "energy.json"
ENERGY_DB = BASE_DIR / "E_manager.db"
SYSTEM_LOG = LOG_DIR / "system.log"
PV_MANAGER_CSV = LOG_DIR / "PVmanager.csv"
LP_MANAGER_CSV = LOG_DIR / "LPmanager.csv"
WP_MANAGER_CSV = LOG_DIR / "WPmanager.csv"
# --- Logging ------------------------------------------------------------
LOG_MAX_SIZE = 1_000_000 # 1 MB, per logbestand
# Log-niveau per service. Onbekende namen vallen terug op WARNING
# (zie logger_setup.get_logger).
LOG_LEVELS = {
"E_manager": "WARNING",
"p1_reader": "WARNING",
"tarieven": "INFO",
"FlaskApp": "WARNING",
"LP_reader": "WARNING",
"WP_reader": "WARNING",
"PV_reader": "WARNING",
}
# --- Energieprijzen -----------------------------------------------------
INKOOPOPSLAG = 0.015 # opslag op kale prijs bij levering (EUR/kWh)
ENERGIEBELASTING_FACTOR = 1.21 # (1 + BTW), toegepast op verbruik
VASTE_LEVERINGSKOSTEN = 0.09 # vaste leveringskosten per kWh
VERKOOPOPSLAG = 0.015 # opslag bij teruglevering (EUR/kWh)
# --- Scheduler voor prijsdata (cron-tijden) -----------------------------
SCHEDULER_HOURDATA_MINUTE = "00" # elk uur op de :00
SCHEDULER_PRICEDATA_HOUR = "16" # dagprijzen ophalen (Enever) om 16:10
SCHEDULER_PRICEDATA_MINUTE = "10"
SCHEDULER_PRICES_HOUR = "00" # prijzen verwerken (energietarieven) om 00:10
SCHEDULER_PRICES_MINUTE = "10"
# --- Intervallen (seconden), achtergrond-loops --------------------------
TARIEVEN_RELOAD_INTERVAL = 300 # herladen tarieven.json
MANAGER_INTERVAL = 180 # PV/WP/LP-manager-loops
HOURDATA_SNAPSHOT_DELAY = 60 # wachttijd voor store_hourly_snapshot na hourData
MAIN_LOOP_INTERVAL = 10 # hoofdthread keep-alive
WATCHDOG_INTERVAL = 1 # systemd watchdog-notify
# --- Warmtepomp-instellingen --------------------------------------------
MIN_HEAT = 18 # minimale stooktemperatuur winter (°C)
SET_DAY = 20 # dag-setpoint winter (°C)
SET_NIGHT = 19 # nacht-setpoint winter (°C)
MAX_COOL = 25 # maximale koeltemperatuur zomer (°C)
MIN_COOL = 18 # minimale koeltemperatuur zomer (°C)
WP_MAX_SETPOINT = 23 # bovengrens WP-setpoint (°C) - PAS AAN naar jouw waarde
WP_SUMMER_OUTSIDE_THRESHOLD = 23 # buitentemp (°C) waaronder in de zomertak nog gekoeld mag worden tot WP_SUMMER_RELAXED_MAX
WP_SUMMER_RELAXED_MAX = 24 # ruimere MAX (°C) bij buitentemp < WP_SUMMER_OUTSIDE_THRESHOLD
# --- WPmanager (warmtepomp) ---------------------------------------------
WP_FC_FACTOR = 0.5 # weegfactor voor de prijs-forecast (fc) bij het bepalen van NORM (wintertak)
WP_LEVERING_HIGH = 3.3 # kW export vanaf waar setpoint het hardst wordt bijgestuurd
WP_LEVERING_MID = 1.1 # kW export voor gematigde bijsturing
WP_LEVERING_LOW = 0.5 # kW export onder welke setpoint terug richting normaal gaat
WP_ADJUST_HIGH = 1.0 # aanpassingsstap (°C) bij export >= WP_LEVERING_HIGH
WP_ADJUST_MID = 0.5 # aanpassingsstap (°C) bij export >= WP_LEVERING_MID
WP_ADJUST_LOW = 0.5 # aanpassingsstap (°C) bij export < WP_LEVERING_LOW (richting NORM)
WP_CAPACITY_KW = 3.3 # vermogen warmtepomp, gebruikt in graaddagen-berekening
# Factoren nog om verwacht kWh verbruik van WP voor de volgende dag te berekenen.
# COP-schattingsformule coëfficiënten (afgeleid van fabrikant-specificaties,# pas aan naar jouw eigen warmtepomp)
COP_A = 0.058
COP_B = 0.58
COP_C = 340
# --- Weer-API -----------------------------------------------------------
WEER_LOCATIE = "Rotterdam" # Weerlive API-key: verplaatst naar .env (zie .env.example), niet hardcoded.
# Graaddagen (15°C - gem. T)-> gasverbruik-equivalent omrekeningsfactoren
DEGREE_DAY_GAS_FACTOR = 1.3 # Nm3 gas per graaddag (aanpassen voor eigen situatie)
DEGREE_DAY_YEAR_FACTOR = 31.65 # calorische waarde van gas (kj/Nm3)
DEGREE_DAY_DIVISOR = 3.6 # kJ -> kWh
# --- PVmanager (Fronius PV-omvormer) ------------------------------------
PV_EXPORT_THRESHOLD = 1.5 # levering (kW) boven welke de limiet wordt afgebouwd
PV_LIMIT_MIN = 10 # ondergrens vermogenslimiet (%) - LET OP, als PV_LIMIT_MIN = 0 dan kan de omvormer uitvallen en moet je resetten!!!
PV_LIMIT_MAX = 100 # bovengrens vermogenslimiet (%) - pas aan als PV-management moet werken
PV_DECREASE_FACTOR = 10 # afbouwsnelheid limiet t.o.v. overschrijding export-drempel
PV_DECREASE_BASE = 5 # basisafbouw zodra export > PV_EXPORT_THRESHOLD
PV_INCREASE_STEP = 20 # herstelstap limiet zodra levering <= 0
# --- LPmanager (laadpaal) --------------------------------------------------
MAX_AMP = 16 # max. laadstroom laadpaal (A)
LP_MIN_AMP = 6 # ondergrens laadpaal-amperage (A) - PAS AAN naar jouw waarde
MAX_LP_RANK_THRESHOLD = 3 # top-N goedkoopste uren van de dag waarbij max_lp (max. laden) wordt geactiveerd
LP_START_AMP = 6 # opstart-/hervat-amperage na pauze of stilstand
LP_ADJUST_STEP = 1 # amp-stap bij dynamische bijsturing (omhoog/omlaag)
LP_HIGH_AMP_THRESHOLD = 25 # amps boven welke geforceerd wordt gestopt
LP_LOW_AMP_THRESHOLD = 19 # amps onder welke, bij laadpower 0, wordt herstart
LP_LEVERING_HIGH = 1.5 # kW export voor amp-verhoging
LP_LEVERING_LOW = 0.5 # kW export-ondergrens voor amp-verlaging
# --- p1_reader (slimme meter) ------------------------------------------------
# Pas dit pad aan naar jouw eigen P1-kabel (check met: ls /dev/serial/by-id/)
P1_SERIAL_PORT = "/dev/serial/by-id/usb-FTDI_P1_Converter_Cable_A6Y0LEPV-if00-port0"
P1_BAUDRATE = 115200
P1_SERIAL_TIMEOUT = 20 # seconden, leesfout als er zo lang niets binnenkomt
P1_EXPECTED_FIELDS = 35 # aantal OBIS-velden in een compleet telegram (DSMR-versie-afhankelijk)
LOADBALANCE_CSV = LOG_DIR / "LoadBalance.csv"
P1_POLL_INTERVAL = 60 # seconden tussen verwerkingen in energy_manager
P1_WATCHDOG_INTERVAL = 10 # seconden tussen systemd watchdog-notify
P1_RETRY_DELAY = 1 # seconden wachten na een leesfout/onvolledig telegram
# Hoe lang zonder een compleet, succesvol telegram voordat de watchdog
# stopt met 'ik leef' melden aan systemd (zie p1_reader.py's watchdog_task).
# Zet dit ruim boven je meter's normale telegram-interval (meestal 1-10s)
# om vals alarm te voorkomen, maar laag genoeg om een echte hang op tijd
# te detecteren. Vereist WatchdogSec= in de systemd-unit om ook echt een
# herstart te veroorzaken.
P1_STALE_THRESHOLD = 120
# Hoe oud de 'timestamp' van p1_reader (in reader_data.json) maximaal mag
# zijn voordat PVmanager/WPmanager/LPmanager de levering-afhankelijke
# sturing overslaan voor die cyclus (i.p.v. te sturen op verouderde data).
# p1_reader.py schrijft doorgaans elke P1_POLL_INTERVAL (60s) - ruim boven
# die waarde houden om vals alarm bij normale jitter te voorkomen.
READER_DATA_STALE_THRESHOLD = 180