Skip to content

Instantly share code, notes, and snippets.

@julian-klode
Last active December 30, 2025 12:09
Show Gist options
  • Select an option

  • Save julian-klode/01ba512b408ad89d3320f990d7e0b216 to your computer and use it in GitHub Desktop.

Select an option

Save julian-klode/01ba512b408ad89d3320f990d7e0b216 to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"id": "510fe7bd",
"metadata": {},
"outputs": [],
"source": [
"import pandas as pd"
]
},
{
"cell_type": "markdown",
"id": "0b0e70f6",
"metadata": {},
"source": [
"# Warmwasserregelung\n",
"Standardmäßig regelt die Anlage das Wasser in einer der Temperaturmodi:\n",
"- Eco+ 44-53°C\n",
"- Eco 51-58°C\n",
"- Komfort 51-60°C\n",
"\n",
"Die Anlage stand auf Eco+ und bereitete 3x am Tag Heißwasser auf. Das führte Teils zu Heißwasseraufbereitungen um 9 Uhr herum, wenn die Räume stark heizleistung benötigen und noch keine Sonne da ist.\n",
"\n",
"## Zielsetzung\n",
"Ziel ist es, möglichst um 13 Uhr bzw. einmal in der Nacht aufzubereiten, sodass entweder der Strompreis günstig oder Sonne da ist, und wir vor allen auch nicht irgendwann morgens Heizkraft verlieren. \n",
"\n",
"## Lösungsansatz\n",
"Dafür ändern wir die Programme\n",
"- Eco+ von 44-53°C auf 40°C-47°C (\"Notreserve\")\n",
"- Eco 51-58°C auf 44°C-53°C (\"Temperatur halten\")\n",
"- Komfort 51-60°C 47°C-54°C (\"Aufheizen\")\n",
"\n",
"Und kombinieren diese mit einem Zeitprogram:\n",
"\n",
"- Um 2 Uhr bereiten wir Warmwasser auf (hier sollte Börsenstrom günstig sein)\n",
"- Wir halten die frühere Eco+ Einstellung bis 10 Grad, falls jemand am morgen Duschen muss\n",
"- Zwischen 10 und 13 Uhr erlauben wir niedrigere Temperaturen um die Aufbereitung zu verschieben\n",
"- Um 13 Uhr starten wir eine Warmwasseraufbereitung (hier sollte viel Sonne da sein)\n",
"- Um 15 Uhr wechseln wir auf den Temperatur halten modus\n",
"- Um 21 Uhr wechseln wir auf Notfallreserve\n",
"\n",
"Dies sollte vergleichbaren Komfort bieten wie dauerhaft Eco+ vorher aber nur 2x den Aufbereitungsvorgang benötigen."
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "f34b8047",
"metadata": {},
"outputs": [],
"source": [
"programs = pd.DataFrame({\"Komfort\": {\"min\": 47, \"max\":54}, \"Eco\": {\"min\": 44, \"max\": 53}, \"Eco+\": {\"min\": 40, \"max\": 47}})\n",
"mode_changes = pd.Series({0: \"Eco+\", 2: \"Komfort\", 3: \"Eco\", 10: \"Eco+\", 13: \"Komfort\", 15: \"Eco\", 21: \"Eco+\"})"
]
},
{
"cell_type": "markdown",
"id": "59f83b34",
"metadata": {},
"source": [
"## Modellierung\n",
"Im folgenden betrachten wir die Begrenzungen über den Tagesverlauf und simulieren den Optimalfall mit 2x Aufheizen durch das \"Komfort Programm\" sowie einem Wärmeverlust - Zirkulationsbedingt von 1 K/h."
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "186cc124",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>mode</th>\n",
" <th>low</th>\n",
" <th>high</th>\n",
" <th>temperature</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>Eco+</td>\n",
" <td>40.0</td>\n",
" <td>47.0</td>\n",
" <td>43.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>Eco+</td>\n",
" <td>40.0</td>\n",
" <td>47.0</td>\n",
" <td>42.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>Komfort</td>\n",
" <td>47.0</td>\n",
" <td>54.0</td>\n",
" <td>54.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>Eco</td>\n",
" <td>44.0</td>\n",
" <td>53.0</td>\n",
" <td>53.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>Eco</td>\n",
" <td>44.0</td>\n",
" <td>53.0</td>\n",
" <td>52.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>Eco</td>\n",
" <td>44.0</td>\n",
" <td>53.0</td>\n",
" <td>51.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6</th>\n",
" <td>Eco</td>\n",
" <td>44.0</td>\n",
" <td>53.0</td>\n",
" <td>50.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>7</th>\n",
" <td>Eco</td>\n",
" <td>44.0</td>\n",
" <td>53.0</td>\n",
" <td>49.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>8</th>\n",
" <td>Eco</td>\n",
" <td>44.0</td>\n",
" <td>53.0</td>\n",
" <td>48.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>9</th>\n",
" <td>Eco</td>\n",
" <td>44.0</td>\n",
" <td>53.0</td>\n",
" <td>47.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>10</th>\n",
" <td>Eco+</td>\n",
" <td>40.0</td>\n",
" <td>47.0</td>\n",
" <td>46.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>11</th>\n",
" <td>Eco+</td>\n",
" <td>40.0</td>\n",
" <td>47.0</td>\n",
" <td>45.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>12</th>\n",
" <td>Eco+</td>\n",
" <td>40.0</td>\n",
" <td>47.0</td>\n",
" <td>44.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>13</th>\n",
" <td>Komfort</td>\n",
" <td>47.0</td>\n",
" <td>54.0</td>\n",
" <td>54.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>14</th>\n",
" <td>Komfort</td>\n",
" <td>47.0</td>\n",
" <td>54.0</td>\n",
" <td>53.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>15</th>\n",
" <td>Eco</td>\n",
" <td>44.0</td>\n",
" <td>53.0</td>\n",
" <td>52.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>16</th>\n",
" <td>Eco</td>\n",
" <td>44.0</td>\n",
" <td>53.0</td>\n",
" <td>51.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>17</th>\n",
" <td>Eco</td>\n",
" <td>44.0</td>\n",
" <td>53.0</td>\n",
" <td>50.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>18</th>\n",
" <td>Eco</td>\n",
" <td>44.0</td>\n",
" <td>53.0</td>\n",
" <td>49.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>19</th>\n",
" <td>Eco</td>\n",
" <td>44.0</td>\n",
" <td>53.0</td>\n",
" <td>48.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>20</th>\n",
" <td>Eco</td>\n",
" <td>44.0</td>\n",
" <td>53.0</td>\n",
" <td>47.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>21</th>\n",
" <td>Eco+</td>\n",
" <td>40.0</td>\n",
" <td>47.0</td>\n",
" <td>46.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>22</th>\n",
" <td>Eco+</td>\n",
" <td>40.0</td>\n",
" <td>47.0</td>\n",
" <td>45.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>23</th>\n",
" <td>Eco+</td>\n",
" <td>40.0</td>\n",
" <td>47.0</td>\n",
" <td>44.0</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" mode low high temperature\n",
"0 Eco+ 40.0 47.0 43.0\n",
"1 Eco+ 40.0 47.0 42.0\n",
"2 Komfort 47.0 54.0 54.0\n",
"3 Eco 44.0 53.0 53.0\n",
"4 Eco 44.0 53.0 52.0\n",
"5 Eco 44.0 53.0 51.0\n",
"6 Eco 44.0 53.0 50.0\n",
"7 Eco 44.0 53.0 49.0\n",
"8 Eco 44.0 53.0 48.0\n",
"9 Eco 44.0 53.0 47.0\n",
"10 Eco+ 40.0 47.0 46.0\n",
"11 Eco+ 40.0 47.0 45.0\n",
"12 Eco+ 40.0 47.0 44.0\n",
"13 Komfort 47.0 54.0 54.0\n",
"14 Komfort 47.0 54.0 53.0\n",
"15 Eco 44.0 53.0 52.0\n",
"16 Eco 44.0 53.0 51.0\n",
"17 Eco 44.0 53.0 50.0\n",
"18 Eco 44.0 53.0 49.0\n",
"19 Eco 44.0 53.0 48.0\n",
"20 Eco 44.0 53.0 47.0\n",
"21 Eco+ 40.0 47.0 46.0\n",
"22 Eco+ 40.0 47.0 45.0\n",
"23 Eco+ 40.0 47.0 44.0"
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAA9EAAAH5CAYAAACGUL0BAAAAQHRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjcrZGZzZzEsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvhF0PpwAAAAlwSFlzAAAPYQAAD2EBqD+naQAAOYdJREFUeJzt3X+c1XWBL/7Xh5lhZvg1Kio/EhBLQ/khqRvKNaE0ybxWa2uZXjO7D7ObkkgmkWXUkpRbLbltP3Qft/Bx7dJ3t821bW9qq2BluihRhqxRYVpKs5Y6IjDAzPn+4TrbBOJnZoBzZng+H4/zeJzz+XzO57wOHj/v85r355xTVCqVSgAAAICXNKjaAQAAAKC/UKIBAACgJCUaAAAASlKiAQAAoCQlGgAAAEpSogEAAKAkJRoAAABKqq92gD/V2dmZxx9/PMOHD09RFNWOAwAAwABXqVTy7LPPZuzYsRk0aPdzzTVXoh9//PGMGzeu2jEAAADYzzz22GM57LDDdrtNzZXo4cOHJ3k+/IgRI6qcBgAAgIGura0t48aN6+qju1NzJfqFU7hHjBihRAMAALDPlPlIsS8WAwAAgJKUaAAAAChJiQYAAICSau4z0QAAAH3R0dGR7du3VzsGNaahoSF1dXV93o8SDQAADAiVSiUbN27M008/Xe0o1KgDDjggo0ePLvUFYi9GiQYAAAaEFwr0oYcemiFDhvSpKDGwVCqVbN68Oa2trUmSMWPG9HpfSjQAANDvdXR0dBXokSNHVjsONai5uTlJ0tramkMPPbTXp3b7YjEAAKDfe+Ez0EOGDKlyEmrZC6+PvnxmXokGAAAGDKdwszt74vWhRAMAAEBJSjQAAACUpEQDAABU0ezZszNv3rxqx6AkJRoAAABKUqIBAACgJCUaAAAYkCqVSjZv27HPL5VKpdeZn3rqqbzzne/MgQcemCFDhuSMM87I+vXru57PIYcckm9+85td20+fPj2HHnpo1+0f/ehHaWhoyKZNm3r/D8du1fdk40WLFuXjH/94t2WjRo3Kxo0bd9r2kksuyQ033JC//uu/dn4/AACwz23Z3pFjrrltnz/uQ5+YkyGDe1S1urzrXe/K+vXrc+utt2bEiBFZsGBB3vjGN+ahhx5KQ0NDTjnllKxYsSJvfetb89RTT+Whhx7K0KFD89BDD+WYY47JihUrcvzxx2fYsGF7+Fnxgh7/l508eXK+973vdd2uq6vbaZtbbrkl9913X8aOHdu3dPR7lc7ObNn6h2rH2Elz00EpBjkRA6A/qcUxpbmuqfZ+k7ZhSFJrmYBSXijPP/zhDzNz5swkyc0335xx48bllltuyTnnnJPZs2fnhhtuSJLcfffdOfbYYzN+/PisWLGiq0TPnj27is9i4Otxia6vr8/o0aNfdP1vf/vbXHbZZbntttty5plnvuT+2tvb097e3nW7ra2tp5GoUZXOzrzzphOypthe7Sg7eVVlcJa9c5UiDdBP1OqY8qqtW7PsidbUVGUdd2Ly7u8q0pCkuaEuD31iTlUetzfWrVuX+vr6zJgxo2vZyJEj88pXvjLr1q1L8vw3eV9++eV58skns3LlysyePTvjx4/PypUr8573vCf33HOPM4H3sh43iPXr12fs2LGZOHFizj333PzqV7/qWtfZ2ZkLLrggH/zgBzN58uRS+1uyZElaWlq6LuPGjetpJGrUlq1/qLk3Oy/4cbGt5mYzAHhxtTqm/LipKVtqraw+dm+yfXO1U0BNKIoiQwbX7/NLb89QebHPUlcqla59TpkyJSNHjszKlSu7SvSsWbOycuXKrFq1Klu2bMnJJ5/c638zXlqPZqJnzJiRm266KUcddVR+97vfZfHixZk5c2bWrl2bkSNH5tOf/nTq6+vz/ve/v/Q+Fy5cmPnz53fdbmtrU6QHoCVH35C6hgOqHSMd25/OwnXvqXYMAPqgFsaUbZ1b85GfvTNJsvJNP0pjXVNV8yRJ3Y4tmXXrSdWOAfTBMccckx07duS+++7rOp3797//fX7+85/n6KOPTvL8HwZOOeWU/NM//VN+9rOf5TWveU2GDx+e7du358tf/nKOO+64DB8+vJpPY8DrUYk+44wzuq5PnTo1J510Ul7+8pdn2bJlmTVrVj7/+c9n9erVPfrLS2NjYxobG3sSg36oruGANDQeVO0YAAwAtTCmdHZs+a/r9c3prGuuYhpgoDjyyCPz5je/ORdffHG+8pWvZPjw4fnQhz6Ul73sZXnzm9/ctd3s2bNzxRVX5FWvelVGjBiRJDnllFNy8803d5ugZO/o0wdChw4dmqlTp2b9+vX5/ve/n9bW1owfPz719fWpr6/Pr3/963zgAx/I4YcfvofiAgAADFxf/epXc/zxx+e///f/npNOOimVSiX/8i//koaGhq5tXvva16ajo6PbF4jNmjUrHR0dmTVrVhVS7196973r/6m9vT3r1q3La17zmlxwwQU57bTTuq2fM2dOLrjgglx00UV9CgkAADBQrVixouv6gQcemJtuumm320+ZMmWnz0/PmzfPF4rtIz0q0VdeeWXOOuusjB8/Pq2trVm8eHHa2tpy4YUXZuTIkRk5cmS37RsaGjJ69Oi88pWv3KOhAQAAoBp6VKJ/85vf5B3veEeefPLJHHLIITnxxBNz7733ZsKECXsrHwAAANSMHpXo5cuX92jnjzzySI+2BwAAgFrWpy8WAwAAgP2JEg0AAAAlKdEAAABQkhINAAAAJSnRAAAAUJISDQAAUEWzZ8/OvHnzXnR9URS55ZZbSu9vxYoVKYoiTz/9dJ+zsbMe/cQVAAAA+9YTTzyRAw88sNox+E9KNAAAQA0bPXp0tSPwR5zODQAAUGWdnZ256qqrctBBB2X06NFZtGhR17o/PZ37nnvuyfTp09PU1JQTTjght9xyS4qiyJo1a7rt84EHHsgJJ5yQIUOGZObMmXn44Yf3zZMZ4JRoAABgYKpUkm3P7ftLpdLjqMuWLcvQoUNz33335brrrssnPvGJ3HHHHTtt9+yzz+ass87K1KlTs3r16vzlX/5lFixYsMt9Xn311fnsZz+b+++/P/X19Xn3u9/d41zszOncAADAwLR9c3Lt2H3/uB9+PBk8tEd3mTZtWj72sY8lSY488sh84QtfyL/+67/m9a9/fbftbr755hRFkRtvvDFNTU055phj8tvf/jYXX3zxTvv85Cc/mVmzZiVJPvShD+XMM8/M1q1b09TU1MsnRmImGgAAoOqmTZvW7faYMWPS2tq603YPP/xwpk2b1q0Iv/rVr37JfY4ZMyZJdrlPesZMNAAAMDA1DHl+Vrgaj9vTuzQ0dLtdFEU6Ozt32q5SqaQoip2WvdQ+X7jPrvZJzyjRAADAwFQUPT6tutZNmjQpN998c9rb29PY2Jgkuf/++6ucav/idG4AAIB+4rzzzktnZ2fe8573ZN26dbntttvymc98Jkl2mqFm71CiAQAA+okRI0bk29/+dtasWZPp06fn6quvzjXXXJMkvjBsH3E6NwAAQBWtWLFip2V//LvQf/qZ55kzZ+YnP/lJ1+2bb745DQ0NGT9+fJJk9uzZO91n+vTpL/rZaXpGiQYAAOhHbrrpphxxxBF52ctelp/85CdZsGBB3va2t6W5ubna0fYLSjQAAEA/snHjxlxzzTXZuHFjxowZk3POOSef/OQnqx1rv6FEAwAA9CNXXXVVrrrqqmrH2G8p0ey3tmz+Q7UjdNNc1+QbFWFfaRjy/M+ewB6wrXNrtSMkSQZ1bM3mokhzpZJi2+Zqx4F9b1t7UulMOjuev+wrxSBjyn5GiWa/Nfs7b612hG5etXVrlj3RGodg2AfGnZi8+7ve9LBHXLPmnGpH+C+Hj3t+PPnMK4wn7H+GjUv+22eTJ9uT+n34f0DD0OTgI40p+xE/ccV+pb7hgEzdUZt/O/pxU1O2OPjCvvHYvcl2M3X03uBBTZk4bHK1Y+yS8QT2se3PPT8Dzn6jNtsE7CXFoEG5aMa/ZMf2p6sdpcu2zq35yM/emSRZ+aYfpbHO7/vB3lK3Y0tm3XpStWMwABRFkbmTltbMqdzJ8+PJC7PixhP2R4MqHWnJlmwaPiHbGhv3+uMVlc4Mf+bf9/rjUHuUaPY7xaBBaWg8qNoxunR2bPmv6/XN6azz0wQA/UFRFGms0WO28YT9Uuf2pHPr86dVF3v/hFu/uLz/cjo3AAAAlKREAwAAQElKNAAAQBXNnj078+bNq3aMvW7RokWZPn16tWP0mRINAABAr23btm2fPl6lUsmOHTv26WP+MSUaAACgSt71rndl5cqV+fznP5+iKFIURR555JE89NBDeeMb35hhw4Zl1KhRueCCC/Lkk0923W/27NmZO3du5s2blwMPPDCjRo3KDTfckOeeey4XXXRRhg8fnpe//OX5f//v/3XdZ8WKFSmKIt/5zndy7LHHpqmpKTNmzMiDDz7YLdM999yTU045Jc3NzRk3blze//7357nnnutaf/jhh2fx4sV517velZaWllx88cVJkgULFuSoo47KkCFDcsQRR+SjH/1otm/fniT52te+lo9//OP5yU9+0vU8v/a1r+WRRx5JURRZs2ZN1/6ffvrpFEWRFStWdMt922235YQTTkhjY2O+//3vp1Kp5LrrrssRRxyR5ubmHHvssfmHf/iHPf2faCdKNAAAMCBVKpVs2bFlr102d7Q/f9m+JZu3b+66VCrlv7v785//fE466aRcfPHFeeKJJ/LEE0+koaEhs2bNyvTp03P//ffnu9/9bn73u9/lbW97W7f7Llu2LAcffHD+7d/+LXPnzs3/+l//K+ecc05mzpyZ1atXZ86cObnggguyefPmbvf74Ac/mM985jNZtWpVDj300LzpTW/qKrsPPvhg5syZk7PPPjs//elP841vfCM/+MEPctlll3Xbx1/91V9lypQpeeCBB/LRj340STJ8+PB87Wtfy0MPPZTPf/7zufHGG/PXf/3XSZK3v/3t+cAHPpDJkyd3Pc+3v/3tPfrvedVVV2XJkiVZt25dpk2blo985CP56le/mi996UtZu3ZtrrjiivyP//E/snLlyh7tt6f8xBUAADAgbe3YmtP+8b/t88e977z7MqRhSKltW1paMnjw4AwZMiSjR49OklxzzTU57rjjcu2113Zt97//9//OuHHj8vOf/zxHHXVUkuTYY4/NRz7ykSTJwoUL86lPfSoHH3xw18zwNddcky996Uv56U9/mhNPPLFrXx/72Mfy+te/PsnzRfywww7Lt771rbztbW/LX/3VX+W8887r+oz2kUcemeuvvz6zZs3Kl770pTQ1Pf8b9K973ety5ZVXdnsuL2RJnp+t/sAHPpBvfOMbueqqq9Lc3Jxhw4alvr6+63n21Cc+8Ymu3M8991w+97nP5c4778xJJ52UJDniiCPygx/8IF/5ylcya9asXj1GGUo0AABADXnggQdy1113ZdiwYTut++Uvf9lVoqdNm9a1vK6uLiNHjszUqVO7lo0aNSpJ0tra2m0fL5TOJDnooIPyyle+MuvWret67F/84he5+eabu7apVCrp7OzMhg0bcvTRRydJTjjhhJ2y/cM//EOWLl2aX/ziF9m0aVN27NiRESNG9Pj5v5g/fsyHHnooW7du7SrVL9i2bVte9apX7bHH3BUlGgAAGJCa6pryvbN/uHd2XunM8Gf+/fnrh05JBv3XJ2Wb65v7tOvOzs6cddZZ+fSnP73TujFjxnRdb2ho6LauKIpuy4qi6NrfS/njbS+55JK8//3v32mb8ePHd10fOnRot3X33ntvzj333Hz84x/PnDlz0tLSkuXLl+ezn/3sbh930H/+u/3xKfAvnFr+p/74MV94Tt/5znfyspe9rNt2jY2Nu33MvlKiAQCAAakoij4X2hdV6cyQuv8saw3NyaC6Xu9q8ODB6ejo6Lp93HHH5Zvf/GYOP/zw1Nfv+cp27733dhXip556Kj//+c8zadKkrsde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LVq0KEVRdLuMHj262rGgV+6+++6cddZZGTt2bIqiyC233NJtfaVSyaJFizJ27Ng0Nzdn9uzZWbt2bXXCQg+91Ov7Xe96107H8xNPPLE6YaEHlixZkj/7sz/L8OHDc+ihh+Ytb3lLHn744W7bOH5TbUp0L3zjG9/IvHnzcvXVV+fHP/5xXvOa1+SMM87Io48+Wu1o0GeTJ0/OE0880XV58MEHqx0JeuW5557Lsccemy984Qu7XH/dddflc5/7XL7whS9k1apVGT16dF7/+tfn2Wef3cdJoede6vWdJG94wxu6Hc//5V/+ZR8mhN5ZuXJlLr300tx777254447smPHjpx++ul57rnnurZx/Kba/E50L8yYMSPHHXdcvvSlL3UtO/roo/OWt7wlS5YsqWIy6JtFixbllltuyZo1a6odBfaooijyrW99K295y1uSPD+LMXbs2MybNy8LFixIkrS3t2fUqFH59Kc/nUsuuaSKaaFn/vT1nTw/E/3000/vNEMN/c1//Md/5NBDD83KlStzyimnOH5TE8xE99C2bdvywAMP5PTTT++2/PTTT88999xTpVSw56xfvz5jx47NxIkTc+655+ZXv/pVtSPBHrdhw4Zs3Lix27G8sbExs2bNcixnwFixYkUOPfTQHHXUUbn44ovT2tpa7UjQY88880yS5KCDDkri+E1tUKJ76Mknn0xHR0dGjRrVbfmoUaOycePGKqWCPWPGjBm56aabctttt+XGG2/Mxo0bM3PmzPz+97+vdjTYo144XjuWM1CdccYZufnmm3PnnXfms5/9bFatWpXXve51aW9vr3Y0KK1SqWT+/Pk5+eSTM2XKlCSO39SG+moH6K+Kouh2u1Kp7LQM+pszzjij6/rUqVNz0kkn5eUvf3mWLVuW+fPnVzEZ7B2O5QxUb3/727uuT5kyJSeccEImTJiQ73znOzn77LOrmAzKu+yyy/LTn/40P/jBD3Za5/hNNZmJ7qGDDz44dXV1O/2lq7W1dae/iEF/N3To0EydOjXr16+vdhTYo1741nnHcvYXY8aMyYQJExzP6Tfmzp2bW2+9NXfddVcOO+ywruWO39QCJbqHBg8enOOPPz533HFHt+V33HFHZs6cWaVUsHe0t7dn3bp1GTNmTLWjwB41ceLEjB49utuxfNu2bVm5cqVjOQPS73//+zz22GOO59S8SqWSyy67LP/4j/+YO++8MxMnTuy23vGbWuB07l6YP39+Lrjggpxwwgk56aSTcsMNN+TRRx/Ne9/73mpHgz658sorc9ZZZ2X8+PFpbW3N4sWL09bWlgsvvLDa0aDHNm3alF/84hddtzds2JA1a9bkoIMOyvjx4zNv3rxce+21OfLII3PkkUfm2muvzZAhQ3LeeedVMTWUs7vX90EHHZRFixblrW99a8aMGZNHHnkkH/7wh3PwwQfnz//8z6uYGl7apZdemq9//ev5p3/6pwwfPrxrxrmlpSXNzc0pisLxm+qr0Ct/+7d/W5kwYUJl8ODBleOOO66ycuXKakeCPnv7299eGTNmTKWhoaEyduzYytlnn11Zu3ZttWNBr9x1112VJDtdLrzwwkqlUql0dnZWPvaxj1VGjx5daWxsrJxyyimVBx98sLqhoaTdvb43b95cOf300yuHHHJIpaGhoTJ+/PjKhRdeWHn00UerHRte0q5e10kqX/3qV7u2cfym2vxONAAAAJTkM9EAAABQkhINAAAAJSnRAAAAUJISDQAAACUp0QAAAFCSEg0AAAAlKdEAAABQkhINAAAAJSnRAAAAUJISDQAAACUp0QAAAFDS/w9qcR+ovvCsOQAAAABJRU5ErkJggg==",
"text/plain": [
"<Figure size 1200x600 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"day = pd.DataFrame({\"mode\": mode_changes, \n",
" \"low\": mode_changes.map(programs.loc[\"min\"]), \n",
" \"high\": mode_changes.map(programs.loc[\"max\"])}).reindex(range(24)).ffill()\n",
"heat_points = mode_changes[mode_changes == \"Komfort\"].map(programs.loc[\"max\"])\n",
"simulated_day = day.copy()\n",
"\n",
"simulated_day[\"temperature\"] = heat_points\n",
"# Forward fill the heat points\n",
"simulated_day['temperature'] = simulated_day['temperature'].ffill() - simulated_day.groupby(simulated_day['temperature'].notna().cumsum()).cumcount()\n",
"if pd.isna(simulated_day.loc[0, \"temperature\"]): # Only if hour 0 wasn't an original heat point\n",
" simulated_day.loc[0, \"temperature\"] = simulated_day.loc[23, \"temperature\"] -1\n",
" simulated_day['temperature'] = simulated_day['temperature'].ffill() - simulated_day.groupby(simulated_day['temperature'].notna().cumsum()).cumcount()\n",
"ax = simulated_day.plot(drawstyle='steps-post', figsize=(12, 6))\n",
"ax.fill_between(simulated_day.index, simulated_day['low'], simulated_day['high'], alpha=0.3, step='post')\n",
"simulated_day"
]
},
{
"cell_type": "markdown",
"id": "7d7fa70d",
"metadata": {},
"source": [
"## Offene Fragestellungen\n",
"\n",
"* Die Zirkulationspumpe läuft 3x die Stunde, 24h am Tag. Es wäre sinnvoll, im Fenster zwischen ca. 1 Uhr und 6 Uhr die Pumpe abzuschalten um unnötige Energieverluste zu vermeiden. Laut Buderus müsste man hierfür den Betriebsmodus der Pumpe von \"Ein\" auf \"Auto\" ändern und dann könnte man einen Zeitplan konfigurieren. Leider erscheint die Option zur Einstellung des Zeitplans jedoch **nicht**im Menü.\n",
"\n",
"* Die Hysterese ist die meiste Zeit relativ breit, 44-53°C. Problematisch ist hier das obere Limit, führt es doch in suboptimalen Fällen dazu, dass wir bereits vor 13 Uhr den Speicher auf 53°C aufladen. Es besteht hier tendenziell weiterer Optimierungsbedarf, dies ist in der Praxis zu evaluieren. Es ist möglich, das Limit zu mindest auf 51°C zu reduzieren."
]
}
],
"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.13.9"
}
},
"nbformat": 4,
"nbformat_minor": 5
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment