Spaces:
Sleeping
Sleeping
<html> | |
<head> | |
<link | |
rel="stylesheet" | |
href="https://use.fontawesome.com/releases/v5.12.1/css/all.css" | |
crossorigin="anonymous" | |
/> | |
<link rel="stylesheet" href="https://www.w3schools.com/w3css/4/w3.css" /> | |
<script src="https://cdn.jsdelivr.net/npm/chart.js"></script> | |
<meta charset="UTF-8" /> | |
<title>Fertilizer-Calculator</title> | |
<style> | |
* { | |
box-sizing: border-box; | |
margin: 0; | |
padding: 0; | |
font-family: Arial, sans-serif; | |
} | |
body { | |
background-color: #f4f4f4; | |
} | |
.convertSpalte { | |
display: inline-block; | |
margin: 1%; | |
width: fit; | |
background-color: white; | |
border-radius: 10px; | |
box-shadow: 0px 0px 10px rgba(0, 0, 0, 0.1); | |
padding: 20px; | |
box-sizing: border-box; | |
} | |
.spalte { | |
display: inline-block; | |
margin: 1%; | |
width: 30%; | |
background-color: white; | |
border-radius: 10px; | |
box-shadow: 0px 0px 10px rgba(0, 0, 0, 0.1); | |
padding: 20px; | |
box-sizing: border-box; | |
} | |
.sendButton { | |
background-color: #4caf50; | |
font-size: 15px; | |
margin-bottom: 20px; | |
font-weight: bold; | |
color: white; | |
padding: 10px; | |
margin-top: 20px; | |
margin-right: auto; | |
margin-left: auto; | |
border-radius: 10px; | |
border: none; | |
display: flex; | |
} | |
.addButton { | |
background-color: #d8d6d6; | |
font-size: 12px; | |
margin-bottom: 20px; | |
padding: 10px; | |
margin-right: auto; | |
margin-left: auto; | |
border-radius: 10px; | |
border: none; | |
display: flex; | |
} | |
.center { | |
margin: auto; | |
width: 40%; | |
padding: 20px; | |
background-color: white; | |
border-radius: 10px; | |
box-shadow: 0px 0px 10px rgba(0, 0, 0, 0.1); | |
} | |
.center label { | |
display: block; | |
margin-bottom: 10px; | |
font-size: 18px; | |
font-weight: bold; | |
} | |
.center input[type="number"], | |
.center select { | |
width: 100%; | |
padding: 10; | |
border-radius: 5px; | |
border: none; | |
background-color: #f4f4f4; | |
margin-bottom: 20px; | |
font-size: 16px; | |
} | |
.center select { | |
appearance: none; | |
-webkit-appearance: none; | |
background: url("https://cdn4.iconfinder.com/data/icons/ionicons/512/icon-ios7-arrow-down-512.png") | |
no-repeat; | |
background-position: 95% center; | |
background-size: 18px; | |
cursor: pointer; | |
} | |
.center select:focus { | |
outline: none; | |
} | |
.center input[type="submit"] { | |
background-color: #4caf50; | |
color: white; | |
font-size: 16px; | |
padding: 10px 20px; | |
border: none; | |
border-radius: 5px; | |
cursor: pointer; | |
margin-top: 20px; | |
} | |
.center input[type="submit"]:hover { | |
background-color: #3e8e41; | |
} | |
label { | |
display: block; | |
margin-bottom: 10px; | |
font-size: 16px; | |
font-weight: bold; | |
} | |
input[type="number"] { | |
width: 100%; | |
padding: 10px; | |
border-radius: 5px; | |
border: none; | |
background-color: #f4f4f4; | |
margin-bottom: 20px; | |
font-size: 16px; | |
} | |
input[type="number"]:focus { | |
outline: none; | |
} | |
input[type="number"]::-webkit-inner-spin-button, | |
input[type="number"]::-webkit-outer-spin-button { | |
-webkit-appearance: none; | |
margin: 0; | |
} | |
.headline { | |
font-size: 24px; | |
margin-bottom: 20px; | |
text-align: center; | |
font-weight: bold; | |
color: #4caf50; | |
} | |
.fertilizerDropdowns { | |
margin-bottom: 20px; | |
} | |
.dropdownGrid { | |
display: grid; | |
grid-template-columns: 1fr; | |
} | |
.details { | |
font-size: 24px; | |
margin: 20px; | |
padding: 20px; | |
background-color: #3e8e41; | |
color: white; | |
} | |
.text { | |
margin-left: 50px; | |
} | |
</style> | |
</head> | |
<body onload="getFertilizer()"> | |
<details> | |
<summary class="details">Dünger-Berechnung</summary> | |
<div class="text"> | |
<p> | |
Dieser Dünger- und Verbrauchsrechner soll jedem Aquarianer eine | |
einfache Möglichkeit bieten den Tagesverbrauch seines Aquariums zu | |
berechnen und darauf basierend eine Empfehlung für die tägliche | |
Zugabemenge zu bekommen. <br /><br /> | |
Diese Schritte sind für die Berechnung notwendig: | |
<br /> | |
</p> | |
<ul> | |
<li> | |
Bringe deine Nährstoffe (NO3, PO4, K, Fe) auf einen optimalen | |
Bereich (siehe z.B. JBL) | |
</li> | |
<li> | |
Gebe entsprechend der Herstellerangabe des Düngers die Menge für 7 | |
Tage hinzu! | |
</li> | |
<li> | |
Messe die Konzentration der Nährstoffe eine kurze Zeit nach der | |
Zugabe und notiere dir diese Werte! | |
</li> | |
<li> | |
Messe erneut nach 7 Tagen die Konzentration der Nährstoffe und | |
notiere dir ebenfalls diese Werte! | |
</li> | |
<li> | |
Gebe die Messwerte in den Feldern ein und erhalte den Tagesverbrauch | |
deiner Pflanzen im Aquarium! | |
</li> | |
<li> | |
Hinweis: Solltest du einen Wasserwert nicht gemessen haben, dann | |
trage dafür 0 in dem entsprechenden Feld ein. | |
</li> | |
</ul> | |
</div> | |
<div class="spalte"> | |
<p class="headline">1. Messung</p> | |
<label for="nitrateIs1">Nitrat</label> | |
<input | |
type="number" | |
step="0.1" | |
id="nitrateIs1" | |
placeholder="Wert in mg/L" | |
/><br /> | |
<label for="phosphateIs1">Phosphat</label> | |
<input | |
type="number" | |
step="0.1" | |
id="phosphateIs1" | |
placeholder="Wert in mg/L" | |
/><br /> | |
<label for="potassiumIs1">Kalium</label> | |
<input | |
type="number" | |
step="0.1" | |
id="potassiumIs1" | |
placeholder="Wert in mg/L" | |
/><br /> | |
<label for="ironIs1">Eisen</label> | |
<input | |
type="number" | |
step="0.1" | |
id="ironIs1" | |
placeholder="Wert in mg/L" | |
/> | |
</div> | |
<div class="spalte"> | |
<p class="headline">2. Messung</p> | |
<label for="nitrateIs2">Nitrat</label> | |
<input | |
type="number" | |
step="0.1" | |
id="nitrateIs2" | |
placeholder="Wert in mg/L" | |
/><br /> | |
<label for="phosphateIs2">Phosphat</label> | |
<input | |
type="number" | |
step="0.1" | |
id="phosphateIs2" | |
placeholder="Wert in mg/L" | |
/><br /> | |
<label for="potassiumIs2">Kalium</label> | |
<input | |
type="number" | |
step="0.1" | |
id="potassiumIs2" | |
placeholder="Wert in mg/L" | |
/><br /> | |
<label for="ironIs2">Eisen</label> | |
<input | |
type="number" | |
step="0.1" | |
id="ironIs2" | |
placeholder="Wert in mg/L" | |
/> | |
</div> | |
<div class="spalte"> | |
<label for="liter">Liter des Aquariums (netto):</label> | |
<input type="number" id="liter" placeholder="Wert in Liter" /> | |
<div id="dropdowns"> | |
<label for="fertilizer1">Dünger:</label> | |
<div class="dropdownGrid" id="dropdown-container"> | |
<select class="fertilizerDropdowns" id="fertilizer1"></select> | |
</div> | |
<button type="button" class="addButton" onclick="addDropdown()"> | |
Dünger hinzufügen | |
</button> | |
<button | |
type="button" | |
class="sendButton" | |
id="sendCalculationRequest" | |
onclick="sendCalculationRequest()" | |
> | |
Berechnen | |
</button> | |
</div> | |
</div> | |
<div id="chartDiv" style="display: none"> | |
<canvas id="dunger-chart"></canvas> | |
</div> | |
<div id="errorDiv" style="display: none"></div> | |
</details> | |
<details> | |
<summary class="details">Dünger-Konverter</summary> | |
<div class="text"> | |
<p> | |
Dieser Dünger-Konverter soll jedem Aquarianer eine einfache | |
Möglichkeit bieten die Nährstoffzugabe für die Größe seines eigenen | |
Aquariums umzurechnen. <br /><br /> | |
Diese Schritte sind für die Berechnung notwendig: | |
<br /> | |
</p> | |
<ul> | |
<li> | |
Trage die Netto-Liter des Aquarium und die entsprechenden Dünger | |
ein. | |
</li> | |
<li> | |
Du erhälst das Ergebnis der Nährstoffe (in mg/l) für 1ml Dünger in | |
der Liter-Menge des Aquariums. | |
</li> | |
</ul> | |
</div> | |
<div class="convertSpalte"> | |
<label for="liter">Liter des Aquariums (netto):</label> | |
<input type="number" id="literConvert" placeholder="Wert in Liter" /> | |
<div id="dropdownsConvert"> | |
<label for="fertilizerConvert1">Dünger:</label> | |
<div class="dropdownGrid" id="convert-dropdown-container"> | |
<select | |
class="fertilizerDropdowns" | |
id="fertilizerConvert1" | |
></select> | |
</div> | |
<button | |
type="button" | |
class="addButton" | |
onclick="addConvertDropdown()" | |
> | |
Dünger hinzufügen | |
</button> | |
</div> | |
<button | |
type="button" | |
class="sendButton" | |
id="sendCalculationRequest" | |
onclick="sendConvertRequest()" | |
> | |
Berechnen | |
</button> | |
</div> | |
<div class="convertSpalte"> | |
<table class="w3-card"> | |
<thead> | |
<tr> | |
<th>Name</th> | |
<th>Nitrat (mg/l)</th> | |
<th>Phosphat (mg/l)</th> | |
<th>Kalium (mg/l)</th> | |
<th>Eisen (mg/l)</th> | |
<th>Magnesium (mg/l)</th> | |
<th>Menge in ml</th> | |
</tr> | |
</thead> | |
<tbody id="data-output"> | |
<!-- Placeholder --> | |
</tbody> | |
</table> | |
</div> | |
</details> | |
<details> | |
<summary class="details">Verbrauchsrechner</summary> | |
<div class="text"> | |
<p> | |
Dieser Verbrauchsrechner soll jedem Aquarianer eine einfache | |
Möglichkeit bieten den Verbrauch der Nährstoffe im Aquarium zu berechnen. <br /><br /> | |
Diese Schritte sind für die Berechnung notwendig: | |
<br /> | |
</p> | |
<ul> | |
<li> | |
Bringe deine Nährstoffe (NO3, PO4, K, Fe) auf einen optimalen | |
Bereich (siehe z.B. JBL) | |
</li> | |
<li> | |
Gebe entsprechend der Herstellerangabe des Düngers die Menge für den Zeitraum (z.B. 3 Tage) | |
Tage hinzu! | |
</li> | |
<li> | |
Messe die Konzentration der Nährstoffe eine kurze Zeit nach der | |
Zugabe und notiere dir diese Werte! | |
</li> | |
<li> | |
Messe erneut nach deiner gewählten Zeit (z.B. 3 Tage) die Konzentration der Nährstoffe und | |
notiere dir ebenfalls diese Werte! | |
</li> | |
<li> | |
Gebe die Messwerte in den Feldern ein und erhalte den Tagesverbrauch | |
deiner Pflanzen im Aquarium! | |
</li> | |
<li> | |
Hinweis: Solltest du einen Wasserwert nicht gemessen haben, dann | |
trage dafür 0 in dem entsprechenden Feld ein. | |
</li> | |
</ul> | |
</div> | |
<div class="spalte" id="consumption1"> | |
<p class="headline">1. Messung</p> | |
<label for="nitrateIs1">Nitrat</label> | |
<input | |
type="number" | |
step="0.1" | |
id="nitrateIs1Consumption" | |
placeholder="Wert in mg/L" | |
/><br /> | |
<label for="phosphateIs1">Phosphat</label> | |
<input | |
type="number" | |
step="0.1" | |
id="phosphateIs1Consumption" | |
placeholder="Wert in mg/L" | |
/><br /> | |
<label for="potassiumIs1">Kalium</label> | |
<input | |
type="number" | |
step="0.1" | |
id="potassiumIs1Consumption" | |
placeholder="Wert in mg/L" | |
/><br /> | |
<label for="ironIs1">Eisen</label> | |
<input | |
type="number" | |
step="0.1" | |
id="ironIs1Consumption" | |
placeholder="Wert in mg/L" | |
/> | |
</div> | |
<div class="spalte"> | |
<p class="headline">2. Messung</p> | |
<label for="nitrateIs2">Nitrat</label> | |
<input | |
type="number" | |
step="0.1" | |
id="nitrateIs2Consumption" | |
name="nitrateIs2" | |
placeholder="Wert in mg/L" | |
/><br /> | |
<label for="phosphateIs2">Phosphat</label> | |
<input | |
type="number" | |
step="0.1" | |
id="phosphateIs2Consumption" | |
placeholder="Wert in mg/L" | |
/><br /> | |
<label for="potassiumIs2">Kalium</label> | |
<input | |
type="number" | |
step="0.1" | |
id="potassiumIs2Consumption" | |
placeholder="Wert in mg/L" | |
/><br /> | |
<label for="ironIs2">Eisen</label> | |
<input | |
type="number" | |
step="0.1" | |
id="ironIs2Consumption" | |
placeholder="Wert in mg/L" | |
/> | |
</div> | |
<div class="spalte"> | |
<label for="liter">Wie viele Tage lagen zwischen den zwei Messungen?</label> | |
<input type="number" id="days" placeholder="7" /> | |
<button | |
type="button" | |
class="sendButton" | |
id="sendConsumptionRequest" | |
onclick="sendConsumptionRequest()" | |
> | |
Berechnen | |
</button> | |
</div> | |
<div id="chartDivConsumption" style="display: none"> | |
<canvas id="consumption-chart"></canvas> | |
</div> | |
<div id="errorDiv" style="display: none"></div> | |
</details> | |
<script> | |
function sendConsumptionRequest() { | |
fetch( | |
"https://q6h486sln5.execute-api.eu-west-2.amazonaws.com/v2/consumption", | |
{ | |
method: "POST", | |
body: JSON.stringify({ | |
nitrateIs1: | |
parseFloat(document.getElementById("nitrateIs1Consumption").value) || 0, | |
phosphateIs1: | |
parseFloat(document.getElementById("phosphateIs1Consumption").value) || 0, | |
potassiumIs1: | |
parseFloat(document.getElementById("potassiumIs1Consumption").value) || 0, | |
ironIs1: | |
parseFloat(document.getElementById("ironIs1Consumption").value) || 0, | |
nitrateIs2: | |
parseFloat(document.getElementById("nitrateIs2Consumption").value) || 0, | |
phosphateIs2: | |
parseFloat(document.getElementById("phosphateIs2Consumption").value) || 0, | |
potassiumIs2: | |
parseFloat(document.getElementById("potassiumIs2Consumption").value) || 0, | |
ironIs2: | |
parseFloat(document.getElementById("ironIs2Consumption").value) || 0, | |
days: document.getElementById("days").value || 7, | |
}), | |
headers: { | |
"Content-type": "application/json; charset=UTF-8", | |
}, | |
} | |
) | |
.then((response) => { | |
return response.json(); | |
}) | |
.then((data) => { | |
createConsumptionChart(data); | |
}); | |
} | |
function sendConvertRequest() { | |
var fertilizerInUse = []; | |
var dropdownDiv = document.getElementById("convert-dropdown-container"); | |
var dropdowns = dropdownDiv.querySelectorAll("select"); | |
dropdowns.forEach((dropdown) => { | |
fertilizerInUse.push(parseInt(dropdown.value)); | |
}); | |
fetch( | |
"https://q6h486sln5.execute-api.eu-west-2.amazonaws.com/v2/convert", | |
{ | |
method: "POST", | |
body: JSON.stringify({ | |
liter: | |
parseFloat(document.getElementById("literConvert").value) || 0, | |
fertilizerInUse: fertilizerInUse, | |
}), | |
headers: { | |
"Content-type": "application/json; charset=UTF-8", | |
}, | |
} | |
) | |
.then((response) => { | |
return response.json(); | |
}) | |
.then((data) => { | |
createTable(data); | |
}); | |
} | |
function createTable(data) { | |
var placeholder = document.querySelector("#data-output"); | |
var out = ""; | |
for (let fertilizer of data) { | |
out += ` | |
<tr> | |
<td>${fertilizer.name}</td> | |
<td>${fertilizer.nitrate}</td> | |
<td>${fertilizer.phosphate}</td> | |
<td>${fertilizer.potassium}</td> | |
<td>${fertilizer.iron}</td> | |
<td>${fertilizer.magnesium}</td> | |
<td>${fertilizer.dosage}</td> | |
</tr> | |
`; | |
} | |
placeholder.innerHTML = out; | |
} | |
function sendCalculationRequest() { | |
var fertilizerInUse = []; | |
var dropdownDiv = document.getElementById("dropdown-container"); | |
var dropdowns = dropdownDiv.querySelectorAll("select"); | |
dropdowns.forEach((dropdown) => { | |
fertilizerInUse.push(parseInt(dropdown.value)); | |
}); | |
fetch( | |
"https://q6h486sln5.execute-api.eu-west-2.amazonaws.com/v2/calculation", | |
{ | |
method: "POST", | |
body: JSON.stringify({ | |
liter: parseFloat(document.getElementById("liter").value) || 0, | |
nitrateIs1: | |
parseFloat(document.getElementById("nitrateIs1").value) || 0, | |
phosphateIs1: | |
parseFloat(document.getElementById("phosphateIs1").value) || 0, | |
potassiumIs1: | |
parseFloat(document.getElementById("potassiumIs1").value) || 0, | |
ironIs1: | |
parseFloat(document.getElementById("ironIs1").value) || 0, | |
nitrateIs2: | |
parseFloat(document.getElementById("nitrateIs2").value) || 0, | |
phosphateIs2: | |
parseFloat(document.getElementById("phosphateIs2").value) || 0, | |
potassiumIs2: | |
parseFloat(document.getElementById("potassiumIs2").value) || 0, | |
ironIs2: | |
parseFloat(document.getElementById("ironIs2").value) || 0, | |
fertilizerInUse: fertilizerInUse, | |
}), | |
headers: { | |
"Content-type": "application/json; charset=UTF-8", | |
}, | |
} | |
) | |
.then((response) => { | |
return response.json(); | |
}) | |
.then((data) => { | |
createChart(data); | |
}); | |
} | |
function addDropdown() { | |
var dropdownContainer = document.getElementById("dropdown-container"); | |
if (dropdownContainer.children.length < 4) { | |
var newDropdown = document.createElement("select"); | |
newDropdown.name = | |
"fertilizer" + (dropdownContainer.children.length + 1); | |
newDropdown.id = | |
"fertilizer" + (dropdownContainer.children.length + 1); | |
var options = document.getElementById("fertilizer1").innerHTML; | |
newDropdown.innerHTML = options; | |
newDropdown.classList.add("fertilizerDropdowns"); | |
dropdownContainer.appendChild(newDropdown); | |
} | |
} | |
function addConvertDropdown() { | |
var dropdownContainer = document.getElementById( | |
"convert-dropdown-container" | |
); | |
if (dropdownContainer.children.length < 4) { | |
var newDropdown = document.createElement("select"); | |
newDropdown.name = | |
"fertilizerConvert" + (dropdownContainer.children.length + 1); | |
newDropdown.id = | |
"fertilizerConvert" + (dropdownContainer.children.length + 1); | |
var options = document.getElementById("fertilizerConvert1").innerHTML; | |
newDropdown.innerHTML = options; | |
newDropdown.classList.add("fertilizerDropdowns"); | |
dropdownContainer.appendChild(newDropdown); | |
} | |
} | |
function getFertilizer() { | |
fetch( | |
"https://q6h486sln5.execute-api.eu-west-2.amazonaws.com/v2/getAllFertilizer" | |
) | |
.then((response) => { | |
return response.json(); | |
}) | |
.then((data) => { | |
data.forEach((eintrag) => { | |
const option = document.createElement("option"); | |
option.value = eintrag.id; | |
option.textContent = eintrag.name; | |
fertilizer1.appendChild(option); | |
}); | |
data.forEach((eintrag) => { | |
const option = document.createElement("option"); | |
option.value = eintrag.id; | |
option.textContent = eintrag.name; | |
fertilizerConvert1.appendChild(option); | |
}); | |
}); | |
} | |
function createConsumptionChart(data) { | |
if (document.getElementById("consumption-chart")) { | |
document.getElementById("consumption-chart").destroy; | |
} | |
const response = data; | |
if (!("Error" in data)) { | |
document.getElementById("chartDivConsumption").style.display = "block"; | |
var translate = { | |
"Nitrat": data.nitrate, | |
"Phosphat": data.phosphate, | |
"Kalium": data.potassium, | |
"Eisen": data.iron | |
} | |
const ctx = document.getElementById("consumption-chart").getContext("2d"); | |
const chart = new Chart(ctx, { | |
type: "bar", | |
data: { | |
labels: Object.keys(translate), | |
datasets: [ | |
{ | |
label: "mg/l", | |
data: Object.values(translate), | |
backgroundColor: [ | |
"rgba(255, 99, 132, 0.2)", | |
"rgba(54, 162, 235, 0.2)", | |
"rgba(255, 206, 86, 0.2)", | |
], | |
borderColor: [ | |
"rgba(255, 99, 132, 1)", | |
"rgba(54, 162, 235, 1)", | |
"rgba(255, 206, 86, 1)", | |
], | |
borderWidth: 1, | |
}, | |
], | |
}, | |
options: { | |
scales: { | |
yAxes: [ | |
{ | |
ticks: { | |
beginAtZero: true, | |
}, | |
}, | |
], | |
}, | |
}, | |
}); | |
} | |
} | |
function createChart(data) { | |
if (document.getElementById("dunger-chart")) { | |
document.getElementById("dunger-chart").destroy; | |
} | |
const response = data; | |
if (!("Error" in data)) { | |
document.getElementById("chartDiv").style.display = "block"; | |
const ctx = document.getElementById("dunger-chart").getContext("2d"); | |
const chart = new Chart(ctx, { | |
type: "bar", | |
data: { | |
labels: Object.keys(response), | |
datasets: [ | |
{ | |
label: "Menge in ml", | |
data: Object.values(response), | |
backgroundColor: [ | |
"rgba(255, 99, 132, 0.2)", | |
"rgba(54, 162, 235, 0.2)", | |
"rgba(255, 206, 86, 0.2)", | |
], | |
borderColor: [ | |
"rgba(255, 99, 132, 1)", | |
"rgba(54, 162, 235, 1)", | |
"rgba(255, 206, 86, 1)", | |
], | |
borderWidth: 1, | |
}, | |
], | |
}, | |
options: { | |
scales: { | |
yAxes: [ | |
{ | |
ticks: { | |
beginAtZero: true, | |
}, | |
}, | |
], | |
}, | |
}, | |
}); | |
} else { | |
if (data.Error === 0) { | |
document.getElementById("errorDiv").style.display = "block"; | |
var errDiv = document.getElementById("errorDiv"); | |
var content = document.createTextNode(""); | |
errDiv.innerHTML = | |
"<p class='text'>Es konnte keine Kombination errechnet werden! Versuch doch einfach eine andere Dünger-Kombination.</p>"; | |
} else { | |
document.getElementById("errorDiv").style.display = "block"; | |
var errDiv = document.getElementById("errorDiv"); | |
errDiv.innerHTML = | |
"<p class='text'>Es ist ein Fehler aufgetreten!</p>"; | |
} | |
} | |
} | |
</script> | |
</body> | |
</html> |