{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Hoe te gebruiken\n",
    "1. Download de *kwartierwaarden* van de Fluvius portal\n",
    "    * https://mijn.fluvius.be/verbruik/\n",
    "    * Klik op '*Toon verbruik*' van de betreffende elektriciteitsmeter\n",
    "    * Klik op '*Rapport download*' en selecter '*Kwartierwaarden*' met de gewenste tijdspanne **(selecteer een tijdspanne van 1 jaar !)**\n",
    "    * Sla de waardes op in dezelfde folder als dit script met de naam '*kwartiertotalen.csv*'\n",
    "2. Vul de waardes in de secties '**Tarieven**' en '**Batterij-parameters**' in en run de hele notebook\n",
    "3. De resultaten en grafiek zijn op het einde van deze notebook te vinden\n",
    "    "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "from IPython.display import display, HTML\n",
    "display(HTML(\"<style>.container { width:100% !important; }</style>\"))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Inlezen data digitale meter (kartiertotalen.csv)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "\n",
    "df = pd.read_csv('kwartiertotalen.csv', delimiter=';')\n",
    "df = df[df.Validatiestatus != 'Geen verbruik']\n",
    "df[\"Volume\"] = df.Volume.str.replace(\",\", \".\")\n",
    "df[\"Volume\"] = pd.to_numeric(df[\"Volume\"])\n",
    "afname_mask = df.Register.str.contains(\"Afname\")\n",
    "df.loc[afname_mask, 'Volume'] *= -1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Doe berekening over het hele jaar 2021\n",
    "filtered_df = df[df[\"Van Datum\"].str.contains(\"2021\")]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Tarieven"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "afnameprijs = round((29.36 + 2.22 + 0.33 + 6.66 + 1 + 1.4416 + 0.2042)/100, 6)\n",
    "injectieprijs = round(21.02/100, 6)\n",
    "\n",
    "print(f\"Afname  : {afnameprijs} EUR/KWh\")\n",
    "print(f\"Injectie: {injectieprijs} EUR/KWh\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Batterij-parameters"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "investering = 8000\n",
    "DoD = 1 #1=100%\n",
    "batterij_capaciteit_kwh = 15"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Code"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "class DagTotaal:\n",
    "    def __init__(self, datum):\n",
    "        self.datum = datum\n",
    "        self.injectie_zonder_batterij = 0\n",
    "        self.afname_zonder_batterij = 0\n",
    "        self.injectie_met_batterij = 0\n",
    "        self.afname_met_batterij = 0\n",
    "        \n",
    "    def __repr__(self):\n",
    "        return f\"{self.datum} ; inj zonder: {self.injectie_zonder_batterij:6.3f}; afn zonder: {self.afname_zonder_batterij:6.3f}; inj met: {self.injectie_met_batterij:6.3f}; afn met: {self.afname_met_batterij:6.3f}\";\n",
    "        "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "class Batterij:\n",
    "    def __init__(self, max_capaciteit_kwh, dod):\n",
    "        self.max_capaciteit_kwh = max_capaciteit_kwh\n",
    "        self.max_capiciteit_dod_kwh = round(max_capaciteit_kwh * dod)\n",
    "        self.capaciteit = 0\n",
    "        \n",
    "        self.dagtotalen = []\n",
    "        self.huidige_dag = \"\"\n",
    "        \n",
    "    def parse(self, df):\n",
    "        for index, row in df.iterrows():\n",
    "            if self.huidige_dag != row[\"Van Datum\"]:\n",
    "                self.huidige_dag = row[\"Van Datum\"]\n",
    "                self.dagtotalen.append(DagTotaal(self.huidige_dag))\n",
    "            \n",
    "            kwh = row[\"Volume\"]\n",
    "            injectie_zonder_batterij = 0\n",
    "            afname_zonder_batterij = 0\n",
    "            injectie_met_batterij = 0\n",
    "            afname_met_batterij = 0\n",
    "            \n",
    "            if kwh > 0:\n",
    "                injectie_zonder_batterij = kwh\n",
    "                max_opladen = self.max_capaciteit_kwh - self.capaciteit\n",
    "                self.capaciteit += min(max_opladen, injectie_zonder_batterij)\n",
    "                if injectie_zonder_batterij > max_opladen:\n",
    "                    injectie_met_batterij = injectie_zonder_batterij - max_opladen\n",
    "            elif kwh < 0:\n",
    "                afname_zonder_batterij = kwh\n",
    "                afname_met_batterij = min(self.capaciteit - abs(kwh), 0)\n",
    "                self.capaciteit = max(0, self.capaciteit - abs(kwh))\n",
    "                \n",
    "            self.dagtotalen[-1].injectie_zonder_batterij += injectie_zonder_batterij\n",
    "            self.dagtotalen[-1].injectie_met_batterij += injectie_met_batterij\n",
    "            self.dagtotalen[-1].afname_zonder_batterij += afname_zonder_batterij\n",
    "            self.dagtotalen[-1].afname_met_batterij += afname_met_batterij              "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "bat_kwh = Batterij(batterij_capaciteit_kwh, DoD)\n",
    "bat_kwh.parse(filtered_df)\n",
    "\n",
    "result_df = pd.DataFrame([t.__dict__ for t in bat_kwh.dagtotalen ])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "delta_afname = abs(result_df[\"afname_zonder_batterij\"].sum()) - abs(result_df[\"afname_met_batterij\"].sum())\n",
    "delta_teruglevering = abs(result_df[\"injectie_zonder_batterij\"].sum()) - abs(result_df[\"injectie_met_batterij\"].sum())\n",
    "delta_euro = delta_afname * afnameprijs - delta_teruglevering * injectieprijs\n",
    "\n",
    "print(f\"Delta afname        = {delta_afname:+.0f} kWh\")\n",
    "print(f\"Delta teruglevering = {delta_teruglevering:+.0f} kWh\")\n",
    "print(f\"Prijsverschil       = {delta_euro:.2f} euro\")\n",
    "print(f\"TVT: {investering/delta_euro:.2f} jaren\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "scrolled": true
   },
   "outputs": [],
   "source": [
    "%matplotlib inline\n",
    "import matplotlib.pyplot as plt\n",
    "plt.rcParams[\"figure.figsize\"] = (20,8)\n",
    "result_df.plot(x=\"datum\", y=[\"afname_zonder_batterij\", \"afname_met_batterij\"], title=f\"{bat_kwh.max_capaciteit_kwh} kWh\")\n",
    "plt.show()"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.10.5"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
