# Imports
import panel as pn
import plotly.graph_objects as go
# Initialization
pn.extension('plotly', design="bootstrap", sizing_mode="stretch_width")
# Variables
minimum_ventilatie = 20
maximum_ventilatie = 97
grens_start = -5
grens_stop = -15
waarde_factor_bandbreedte = 2
waarde_factor_minimale_ventilatie = 0.5
gewenste_stal_temp = pn.widgets.FloatSlider(label="Gewenste staltemperatuur (°C)", value=21.0, start=15.0, end=25.0, step=1.0)
offset_ventilatie = pn.widgets.FloatSlider(label="Offset ventilatie (°C)", value=1.0, start=-5.0, end=5.0, step=0.1)
offset_kachel = pn.widgets.FloatSlider(label="Offset kachel (°C)", value=1.0, start=-5.0, end=5.0, step=0.1)
p_band = pn.widgets.FloatSlider(label="Bandbreedte", value=6.0, start=3.0, end=20.0, step=1.0)
binnen_temp = pn.widgets.FloatSlider(label="Binnentemperatuur (°C)", value=27.0, start=15.0, end=30.0, step=1.0)
buiten_temp = pn.widgets.FloatSlider(label="Buitentemperatuur (°C)", value=-1.0, start=-10.0, end=40.0, step=1.0)
invloed_lage_buiten_temp_op_bandbreedte = pn.widgets.Select(label="Invloed lage buitentemperatuur op bandbreedte", options=["Ja", "Nee"])
invloed_lage_buiten_temp_op_minimum_ventilatie = pn.widgets.Select(label="Invloed lage buitentemperatuur op minimum ventilatie", options=["Ja", "Nee"])
@pn.depends(
gewenste_stal_temp,
offset_ventilatie,
offset_kachel,
p_band,
binnen_temp,
buiten_temp,
invloed_lage_buiten_temp_op_bandbreedte,
invloed_lage_buiten_temp_op_minimum_ventilatie,
)
def maak_dashboard(
gewenste_stal_temp,
offset_ventilatie,
offset_kachel,
p_band,
binnen_temp,
buiten_temp,
invloed_lage_buiten_temp_op_bandbreedte,
invloed_lage_buiten_temp_op_minimum_ventilatie,
):
# Buitencondities
if invloed_lage_buiten_temp_op_bandbreedte == "Ja":
factor_bandbreedte = waarde_factor_bandbreedte * p_band
else:
factor_bandbreedte = p_band
if invloed_lage_buiten_temp_op_minimum_ventilatie == "Ja":
factor_minimum_ventilatie = waarde_factor_minimale_ventilatie * minimum_ventilatie
else:
factor_minimum_ventilatie = minimum_ventilatie
# Temperatuur
begin_ventilatie = gewenste_stal_temp + offset_ventilatie
verwarmingstemperatuur = gewenste_stal_temp + offset_kachel
grens_start_temperatuur = gewenste_stal_temp + grens_start
grens_stop_temperatuur = gewenste_stal_temp + grens_stop
if buiten_temp >= grens_start_temperatuur:
actuele_bandbreedte = p_band
elif buiten_temp <= grens_stop_temperatuur:
actuele_bandbreedte = factor_bandbreedte
else:
actuele_bandbreedte = factor_bandbreedte + ((grens_stop_temperatuur - buiten_temp)/(grens_start_temperatuur-grens_stop_temperatuur))*(factor_bandbreedte - p_band)
# Ventilatie
if buiten_temp >= grens_start_temperatuur:
minimum_ventilatie_berekend = minimum_ventilatie
elif buiten_temp <= grens_stop_temperatuur:
minimum_ventilatie_berekend = factor_minimum_ventilatie
else:
minimum_ventilatie_berekend = minimum_ventilatie - ((grens_start_temperatuur-buiten_temp)/(grens_start_temperatuur-grens_stop_temperatuur))*(minimum_ventilatie-factor_minimum_ventilatie)
if binnen_temp <=begin_ventilatie:
actuele_ventilatie = minimum_ventilatie_berekend
elif binnen_temp >= (begin_ventilatie + actuele_bandbreedte):
actuele_ventilatie = maximum_ventilatie
else:
actuele_ventilatie = maximum_ventilatie - (begin_ventilatie + actuele_bandbreedte - binnen_temp)*((maximum_ventilatie-minimum_ventilatie_berekend)/actuele_bandbreedte)
# Create figure
x_values = [0, begin_ventilatie, begin_ventilatie + actuele_bandbreedte, 50]
y_values = [minimum_ventilatie_berekend, minimum_ventilatie_berekend, maximum_ventilatie, maximum_ventilatie]
x_values_verwarming = [verwarmingstemperatuur, verwarmingstemperatuur]
y_values_verwarming = [0,100]
x_values_streefwaarde_stal = [gewenste_stal_temp, gewenste_stal_temp]
y_values_streefwaarde_stal = [0,100]
x_values_actuele_ventilatie = [0, binnen_temp, binnen_temp]
y_values_actuele_ventilatie = [actuele_ventilatie, actuele_ventilatie, 0]
fig = go.Figure()
fig.add_trace(go.Scatter(
x=x_values,
y=y_values,
showlegend=False,
name='Bandbreedte',
mode="lines")
)
fig.add_trace(go.Scatter(
x=x_values_verwarming,
y=y_values_verwarming,
showlegend=True,
name='Verwarmingstemperatuur',
mode="lines",
line=dict(dash='dot'))
)
fig.add_trace(go.Scatter(
x=x_values_streefwaarde_stal,
y=y_values_streefwaarde_stal,
showlegend=True,
name='Gewenste staltemperatuur',
mode="lines",
line=dict(dash='dashdot'))
)
fig.add_trace(go.Scatter(
x=x_values_actuele_ventilatie,
y=y_values_actuele_ventilatie,
showlegend=True,
name='Actuele ventilatie',
mode="lines",
line=dict(dash='dash'))
)
fig.add_trace(go.Scatter(
x=[begin_ventilatie],
y=[minimum_ventilatie_berekend],
mode="markers",
marker=dict(size=8, color="orange"),
hovertext="Begin bandbreedte",
hoverinfo="text",
showlegend=False
))
fig.add_trace(go.Scatter(
x=[begin_ventilatie + actuele_bandbreedte],
y=[maximum_ventilatie],
mode="markers",
marker=dict(size=8, color="orange"),
hovertext="Einde bandbreedte",
hoverinfo="text",
showlegend=False
))
fig.update_layout(
xaxis=dict(range=[16, 36], title="Staltemperatuur(°C)", dtick=1),
yaxis=dict(range=[-5, 105], title="Ventilatie (%)", dtick=10),
legend=dict(orientation="h", yanchor="top", y=-0.15, xanchor="center", x=0.5)
)
fig.update_xaxes(
showgrid=True,
gridwidth=1,
griddash="dot"
)
fig.update_yaxes(
showgrid=True,
gridwidth=1,
griddash="dot"
)
#st.plotly_chart(fig, use_container_width=True)
pn.pane.Plotly(fig)
font_size_waardes = "18pt"
font_size_title = "12pt"
waardes = pn.GridBox(
pn.indicators.Number(
label="Begin ventilatie",
value=begin_ventilatie,
format="{value:.1f} °C",
font_size=font_size_waardes,
title_size=font_size_title
),
pn.indicators.Number(
label="Verwarmingstemperatuur",
value=verwarmingstemperatuur,
format="{value:.1f} °C",
font_size=font_size_waardes,
title_size=font_size_title
),
pn.indicators.Number(
label="Actuele bandbreedte",
value=actuele_bandbreedte,
format="{value:.1f} °C",
font_size=font_size_waardes,
title_size=font_size_title
),
pn.indicators.Number(
label="Minimum ventilatie",
value=minimum_ventilatie,
format="{value:.1f} %",
font_size=font_size_waardes,
title_size=font_size_title
),
pn.indicators.Number(
label="Maximum ventilatie",
value=maximum_ventilatie,
format="{value:.1f} %",
font_size=font_size_waardes,
title_size=font_size_title
),
pn.indicators.Number(
label="Minimum ventilatie berekend",
value=minimum_ventilatie_berekend,
format="{value:.1f} %",
font_size=font_size_waardes,
title_size=font_size_title
),
pn.indicators.Number(
label="Actuele ventilatie",
value=actuele_ventilatie,
format="{value:.0f} %",
font_size=font_size_waardes,
title_size=font_size_title
),
pn.indicators.Number(
label="Grens start temperatuur",
value=grens_start_temperatuur,
format="{value:.1f} °C",
font_size=font_size_waardes,
title_size=font_size_title
),
pn.indicators.Number(
label="Grens stop temperatuur",
value=grens_stop_temperatuur,
format="{value:.1f} °C",
font_size=font_size_waardes,
title_size=font_size_title
),
ncols=3,
sizing_mode="stretch_width",
styles={
"gap": "15px",
"padding": "10px"
}
)
return pn.Column(
pn.pane.Plotly(
fig,
sizing_mode="stretch_width",
height=600
),
waardes,
sizing_mode="stretch_width"
)
pn.template.MaterialTemplate(
#site="Panel",
title="Ventilatie regeling",
sidebar=[gewenste_stal_temp,
offset_ventilatie,
offset_kachel,
p_band,
binnen_temp,
buiten_temp,
invloed_lage_buiten_temp_op_bandbreedte,
invloed_lage_buiten_temp_op_minimum_ventilatie],
main=[maak_dashboard],
).servable()