Compare commits
13 Commits
add_weathe
...
last_fill_
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d2db89ffc0 | ||
|
|
ac76654e2a | ||
| 2772baafbc | |||
|
|
3e0733bf3d | ||
|
|
d9fa0bf2f5 | ||
|
|
abff71ac06 | ||
|
|
5a4fdbbd00 | ||
|
|
96c67a6d00 | ||
|
|
3b8fb3dce4 | ||
| 0b4a886de6 | |||
| 4df30c3523 | |||
|
|
98983ea50d | ||
|
|
c947980844 |
3
.gitignore
vendored
3
.gitignore
vendored
@@ -58,3 +58,6 @@ docs/_build/
|
|||||||
|
|
||||||
# PyBuilder
|
# PyBuilder
|
||||||
target/
|
target/
|
||||||
|
|
||||||
|
# meteor
|
||||||
|
app.tar.gz
|
||||||
|
|||||||
@@ -14,9 +14,13 @@
|
|||||||
<div><strong>Ulazni ventil/pumpa:</strong> {{pretty_valve state.in_valve }}</div>
|
<div><strong>Ulazni ventil/pumpa:</strong> {{pretty_valve state.in_valve }}</div>
|
||||||
<div><strong>Zadnja komunikacija: {{ last_communication_time }}</strong>
|
<div><strong>Zadnja komunikacija: {{ last_communication_time }}</strong>
|
||||||
</div>
|
</div>
|
||||||
|
<div><strong>Zadnje zaljevanje: {{ last_out_valve_open }}</strong>
|
||||||
|
</div>
|
||||||
|
<div><strong>Zadnje punjenje: {{ last_in_valve_open }}</strong>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="row">
|
<div class="row hidden">
|
||||||
<div class="col-md-12 chart">
|
<div class="col-md-12 chart">
|
||||||
<h3>Temperatura:</h3>
|
<h3>Temperatura:</h3>
|
||||||
<div id="temperature_graph">
|
<div id="temperature_graph">
|
||||||
@@ -24,7 +28,7 @@
|
|||||||
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="row">
|
<div class="row hidden">
|
||||||
<div class="col-md-12 chart">
|
<div class="col-md-12 chart">
|
||||||
<h3>Vlažnost:</h3>
|
<h3>Vlažnost:</h3>
|
||||||
<div id="humidity_graph">
|
<div id="humidity_graph">
|
||||||
|
|||||||
@@ -7,6 +7,12 @@ Template.state_details.helpers({
|
|||||||
},
|
},
|
||||||
last_communication_time: function() {
|
last_communication_time: function() {
|
||||||
return moment(this.time).fromNow();
|
return moment(this.time).fromNow();
|
||||||
|
},
|
||||||
|
last_out_valve_open: function() {
|
||||||
|
return moment(this.significantEvents.lastOutValveOpen).fromNow();
|
||||||
|
},
|
||||||
|
last_in_valve_open: function() {
|
||||||
|
return moment(this.significantEvents.lastInValveOpen).fromNow();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -22,16 +28,13 @@ Template.state_details.rendered = function() {
|
|||||||
.range([0, $(self.timelineWrapper).width()])
|
.range([0, $(self.timelineWrapper).width()])
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
function sensor_data_collection() {
|
function sensor_data_collection() {
|
||||||
var controllerId = Session.get('controller_id');
|
var controllerId = Session.get('controller_id');
|
||||||
return SensorData.find({
|
return SensorData.find({
|
||||||
controllerId: controllerId
|
controllerId: controllerId
|
||||||
}, {
|
}, {
|
||||||
sort: {
|
sort: {
|
||||||
created_at: -1
|
created_at: 1
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -47,8 +50,8 @@ Template.state_details.rendered = function() {
|
|||||||
self.autorun(function() {
|
self.autorun(function() {
|
||||||
sensor_data_collection().observe({
|
sensor_data_collection().observe({
|
||||||
added: function(reading) {
|
added: function(reading) {
|
||||||
buildTemperatureGraph();
|
// buildTemperatureGraph();
|
||||||
buildHumidityGraph()
|
// buildHumidityGraph()
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
@@ -60,9 +63,13 @@ Template.state_details.rendered = function() {
|
|||||||
*/
|
*/
|
||||||
function buildTemperatureGraph() {
|
function buildTemperatureGraph() {
|
||||||
|
|
||||||
var sensorReadings = sensor_data_collection();
|
var unfilteredReadings = sensor_data_collection();
|
||||||
|
|
||||||
|
// we want to show only 11 points from all data
|
||||||
|
var breakingPoint = Math.floor(countValues(unfilteredReadings) / 10);
|
||||||
|
|
||||||
|
var sensorReadings = filterDataPoints(unfilteredReadings, breakingPoint);
|
||||||
|
|
||||||
console.log("Added: ", sensorReadings.count());
|
|
||||||
var times = sensorReadings.map(function(reading) {
|
var times = sensorReadings.map(function(reading) {
|
||||||
return moment(reading.created_at).format("HH:mm:ss");
|
return moment(reading.created_at).format("HH:mm:ss");
|
||||||
});
|
});
|
||||||
@@ -70,6 +77,8 @@ function buildTemperatureGraph() {
|
|||||||
return reading.temperatureValue;
|
return reading.temperatureValue;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
var breakingPoint = Math.floor(times.length / 11);
|
||||||
|
|
||||||
return new Chartist.Line('#temperature_graph', {
|
return new Chartist.Line('#temperature_graph', {
|
||||||
labels: times,
|
labels: times,
|
||||||
series: [values]
|
series: [values]
|
||||||
@@ -85,10 +94,13 @@ function buildTemperatureGraph() {
|
|||||||
* Function to draw the graph
|
* Function to draw the graph
|
||||||
*/
|
*/
|
||||||
function buildHumidityGraph() {
|
function buildHumidityGraph() {
|
||||||
|
var unfilteredReadings = sensor_data_collection();
|
||||||
|
// we want to show only 11 points from all data - filtering will add
|
||||||
|
// the last one so 10 + 1 = 11
|
||||||
|
var breakingPoint = Math.floor(countValues(unfilteredReadings) / 10);
|
||||||
|
|
||||||
var sensorReadings = sensor_data_collection();
|
var sensorReadings = filterDataPoints(unfilteredReadings, breakingPoint);
|
||||||
|
|
||||||
console.log("Added: ", sensorReadings.count());
|
|
||||||
var times = sensorReadings.map(function(reading) {
|
var times = sensorReadings.map(function(reading) {
|
||||||
return moment(reading.created_at).format("HH:mm:ss");
|
return moment(reading.created_at).format("HH:mm:ss");
|
||||||
});
|
});
|
||||||
@@ -96,6 +108,8 @@ function buildHumidityGraph() {
|
|||||||
return reading.humidityValue;
|
return reading.humidityValue;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
return new Chartist.Line('#humidity_graph', {
|
return new Chartist.Line('#humidity_graph', {
|
||||||
labels: times,
|
labels: times,
|
||||||
series: [values]
|
series: [values]
|
||||||
@@ -106,3 +120,40 @@ function buildHumidityGraph() {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function filterDataPoints(data, breakingPoint) {
|
||||||
|
|
||||||
|
if (breakingPoint === 0) {
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
var result = [];
|
||||||
|
var index = 0;
|
||||||
|
var lastUnpushedRow = null;
|
||||||
|
data.forEach(function(row) {
|
||||||
|
if (index % breakingPoint === 0) {
|
||||||
|
result.push(row);
|
||||||
|
lastUnpushedRow = null;
|
||||||
|
} else {
|
||||||
|
lastUnpushedRow = row;
|
||||||
|
}
|
||||||
|
index++;
|
||||||
|
});
|
||||||
|
|
||||||
|
// in order to always have the latest value
|
||||||
|
if(lastUnpushedRow) {
|
||||||
|
|
||||||
|
result.push(lastUnpushedRow);
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// dirty hack for the complicated way of getting
|
||||||
|
// acual number of values
|
||||||
|
function countValues(data) {
|
||||||
|
var count = 0;
|
||||||
|
data.forEach(function(row) {
|
||||||
|
count++;
|
||||||
|
});
|
||||||
|
return count;
|
||||||
|
};
|
||||||
|
|||||||
@@ -14,9 +14,8 @@ var options = {
|
|||||||
html += '<div>';
|
html += '<div>';
|
||||||
html += "<h2><i class='sw icon-" + forecast.code + "'></i>";
|
html += "<h2><i class='sw icon-" + forecast.code + "'></i>";
|
||||||
html += forecast.high + '°' + weather.units.temp + '</h2>';
|
html += forecast.high + '°' + weather.units.temp + '</h2>';
|
||||||
html += "<li class='currently'>" + daysInBosnian[forecast.day] + ': ' + forecast.text + '</li>';
|
html += "<li class='currently'> Najniža dnevna: "+ forecast.low + ' ° ' + weather.units.temp + "<br />" + daysInBosnian[forecast.day] + ': ' + forecast.text + '</li>';
|
||||||
html += "</div>";
|
html += "</div>";
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
$('#weather').html(html);
|
$('#weather').html(html);
|
||||||
|
|||||||
@@ -37,6 +37,7 @@ function reactToSensorData(nextSensorReading) {
|
|||||||
}, {
|
}, {
|
||||||
'$set': {
|
'$set': {
|
||||||
'state.in_valve': 'opening',
|
'state.in_valve': 'opening',
|
||||||
|
'significantEvents.lastInValveOpen': new Date(),
|
||||||
'time': new Date(),
|
'time': new Date(),
|
||||||
'set_by': 'server'
|
'set_by': 'server'
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -21,6 +21,15 @@ function setOutValveTo(controller_id, nextState) {
|
|||||||
'set_by': 'server'
|
'set_by': 'server'
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
if(nextState === "open") {
|
||||||
|
ControllerState.update(state._id, {
|
||||||
|
'$set': {
|
||||||
|
'significantEvents.lastOutValveOpen': new Date(),
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function openOutValve(controller_id) {
|
function openOutValve(controller_id) {
|
||||||
|
|||||||
@@ -4,29 +4,10 @@ if (Meteor.isServer) {
|
|||||||
SyncedCron.start();
|
SyncedCron.start();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// Global API configuration
|
// Global API configuration
|
||||||
var Api = new Restivus({
|
var Api = new Restivus({
|
||||||
useDefaultAuth: true,
|
useDefaultAuth: true,
|
||||||
prettyJson: true
|
prettyJson: true
|
||||||
});
|
});
|
||||||
|
|
||||||
// Api.addRoute('sensorData', {
|
|
||||||
// authRequired: false
|
|
||||||
// }, {
|
|
||||||
// post: function() {
|
|
||||||
// SensorData.insert({
|
|
||||||
// temperatureValue: parseFloat(this.bodyParams.temperatureValue),
|
|
||||||
// humidityValue: parseFloat(this.bodyParams.humidityValue),
|
|
||||||
// tankFull: this.bodyParams.tankFull,
|
|
||||||
// owner: this.bodyParams.owner,
|
|
||||||
// created_at: new Date()
|
|
||||||
// });
|
|
||||||
// return [];
|
|
||||||
// }
|
|
||||||
// });
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,7 +8,10 @@ import RPi.GPIO as GPIO
|
|||||||
# Try to read the state of GPIO_PIN_TANKFULL
|
# Try to read the state of GPIO_PIN_TANKFULL
|
||||||
GPIO.setmode(GPIO.BCM)
|
GPIO.setmode(GPIO.BCM)
|
||||||
GPIO.setup(config.GPIO_PIN_TANKFULL, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
|
GPIO.setup(config.GPIO_PIN_TANKFULL, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
|
||||||
tankFull = GPIO.input(config.GPIO_PIN_TANKFULL)
|
|
||||||
|
# tank sensor has inverse logic - 0 when it is full 1 when it is not
|
||||||
|
# so we are inverting its value here
|
||||||
|
tankFull = (GPIO.input(config.GPIO_PIN_TANKFULL) == GPIO.LOW)
|
||||||
GPIO.cleanup()
|
GPIO.cleanup()
|
||||||
print 'Bacva puna: {}'.format(tankFull)
|
print 'Bacva puna: {}'.format(tankFull)
|
||||||
|
|
||||||
@@ -29,7 +32,7 @@ humidity, temperature = Adafruit_DHT.read_retry(SENSOR_TYPE, config.GPIO_PIN_DHT
|
|||||||
# guarantee the timing of calls to read the sensor).
|
# guarantee the timing of calls to read the sensor).
|
||||||
# If this happens try again!
|
# If this happens try again!
|
||||||
if temperature is not None and humidity is not None:
|
if temperature is not None and humidity is not None:
|
||||||
response = requests.post(config.SENSORDATA_URL, json={"owner": owner, "temperatureValue": temperature, "humidityValue":humidity, "tankFull":tankFull,
|
response = requests.post(config.SENSORDATA_URL, json={"owner": owner, "temperatureValue": temperature, "humidityValue":humidity, "tankFull": "1" if tankFull else "0",
|
||||||
"controllerId": controller_id
|
"controllerId": controller_id
|
||||||
})
|
})
|
||||||
print 'Temp={0:0.1f}*C'.format(temperature)
|
print 'Temp={0:0.1f}*C'.format(temperature)
|
||||||
|
|||||||
136
misc/calculator.html
Normal file
136
misc/calculator.html
Normal file
@@ -0,0 +1,136 @@
|
|||||||
|
<html>
|
||||||
|
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
|
||||||
|
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-1q8mTJOASx8j1Au+a5WDVnPi2lkFfwwEAa8hDDdjZlpLegxhjVME1fgjWPGmkzs7" crossorigin="anonymous">
|
||||||
|
<script src="https://code.jquery.com/jquery-2.2.3.min.js"></script>
|
||||||
|
|
||||||
|
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js" integrity="sha384-0mSbJDEHialfmuBBQP6A4Qrprq5OVfW37PRR3j5ELqxss1yVqOtnepnHVP9aJ7xS" crossorigin="anonymous"></script>
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
<div class="jumbotron">
|
||||||
|
<div class="lead text-center">
|
||||||
|
<img src="./zoblak.png" width="30%" />
|
||||||
|
<br /> Zoblak Agrar Plus se isplati za <span id="vrijemeZaBreakEven" class="bg-success"></span> mjeseci. U periodu od <span id="brojSezona"></span> godine ostvaruje uštedu u novcu od <span id="iznosUstede" class="bg-success"></span> KM, te uštedu u vremenu od <span id="satiUProjekciji" class="bg-success"></span> sati za podešeni slučaj.
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="container-fluid">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-md-6">
|
||||||
|
<p>Na troškove goriva mjesečno trošite <span id="iznosGoriva"></span> KM. Na rad potreban za zalijevanje trošite mjesečno <span id="satiMjesecno"></span> sati što uz zadanu satnicu iznosi <span id="plata"></span> KM. Zajedno to je <span id="ukupnoTroskovaMjesecno"></span> KM troška na zalijevanje. </p>
|
||||||
|
|
||||||
|
<p>Okvirna cijena Zoblak Agrar Plus iznosi <span id="bazaCijeneZoblaka"></span> KM + sistem navodnjavanja</p>
|
||||||
|
|
||||||
|
<p class="bg-primary">NAPOMENA: finalna cijena može biti niža ili viša i poznata je nakon izrade projekta).</p>
|
||||||
|
</div>
|
||||||
|
<div class="col-md-6 col-sm-6">
|
||||||
|
<form method="post">
|
||||||
|
<div class="form-group ">
|
||||||
|
<label class="control-label " for="number">
|
||||||
|
Vaša udaljenost od polja u km
|
||||||
|
</label>
|
||||||
|
<input class="form-control ulazni-parametar" id="pudaljenost" type="number" min="1" max="200" step="0.1" value="5" />
|
||||||
|
</div>
|
||||||
|
<div class="form-group ">
|
||||||
|
<label class="control-label " for="number1">
|
||||||
|
Prosjecna potrošnja automobila na 100 km
|
||||||
|
</label>
|
||||||
|
<input class="form-control ulazni-parametar" id="ppotrosnja" type="number" min="2" max="15" value="7" step="0.1" />
|
||||||
|
</div>
|
||||||
|
<div class="form-group ">
|
||||||
|
<label class="control-label " for="select">
|
||||||
|
Koliko često treba zaljevati kulturu?
|
||||||
|
</label>
|
||||||
|
<select class="select form-control" id="pfrekvencija_zalijevanja">
|
||||||
|
<option value="1">
|
||||||
|
Svaki dan
|
||||||
|
</option>
|
||||||
|
<option value="2">
|
||||||
|
Jednom u dva dana
|
||||||
|
</option>
|
||||||
|
<option value="3">
|
||||||
|
Jednom u tri dana
|
||||||
|
</option>
|
||||||
|
<option value="4">
|
||||||
|
Jednom u četiri dana
|
||||||
|
</option>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
<div class="form-group ">
|
||||||
|
<label class="control-label " for="number2">
|
||||||
|
Koliko vremena traje put prema polju (u oba smijera) i jedan ciklus zalijevanja? U satima.
|
||||||
|
</label>
|
||||||
|
<input class="form-control ulazni-parametar" id="pvrijeme" type="number" min="2" max="10" value="1.5" step="0.5" />
|
||||||
|
</div>
|
||||||
|
<div class="form-group ">
|
||||||
|
<label class="control-label " for="number3">
|
||||||
|
Satnica osobe koja zalijeva u KM
|
||||||
|
</label>
|
||||||
|
<input class="form-control ulazni-parametar" id="psatnica" type="number" min="1" max="100" value="20" step="1" />
|
||||||
|
</div>
|
||||||
|
<div class="form-group ">
|
||||||
|
<label class="control-label " for="number3">
|
||||||
|
Trajanje sezone u mjesecima
|
||||||
|
</label>
|
||||||
|
<input class="form-control ulazni-parametar" id="psezona" type="number" min="1" max="12" value="4" step="1" />
|
||||||
|
</div>
|
||||||
|
<div class="form-group ">
|
||||||
|
<label class="control-label " for="number3">
|
||||||
|
Na koliko godina/sezona se kalkulacija vrši
|
||||||
|
</label>
|
||||||
|
<input class="form-control ulazni-parametar" id="pbroj_sezona" type="number" min="1" max="10" value="3" step="1" />
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<script type="text/javascript">
|
||||||
|
function iskalkulisi() {
|
||||||
|
var udaljenost = parseFloat($('#pudaljenost').val()) || 10;
|
||||||
|
var potrosnja = parseFloat($('#ppotrosnja').val()) || 7;
|
||||||
|
var frekvencija = parseInt($('#pfrekvencija_zalijevanja').val()) || 2;
|
||||||
|
var vrijeme = parseFloat($('#pvrijeme').val()) || 1.5;
|
||||||
|
var satnica = parseFloat($('#psatnica').val()) || 20;
|
||||||
|
var sezona = parseInt($('#psezona').val()) || 4;
|
||||||
|
var brojSezona = parseInt($('#pbroj_sezona').val()) || 3;
|
||||||
|
|
||||||
|
var bazaCijeneZoblaka = 1000;
|
||||||
|
var bazaCijeneVentila = 0;
|
||||||
|
var bazaCijeneGoriva = 1.70;
|
||||||
|
var godisnjeOdrzavanjeZoblaka = 200;
|
||||||
|
|
||||||
|
// rezultati
|
||||||
|
var zalijevanjaMjesecno = Math.ceil(30 / frekvencija);
|
||||||
|
var satiMjesecno = Math.ceil(vrijeme) * zalijevanjaMjesecno;
|
||||||
|
var plata = satiMjesecno * satnica;
|
||||||
|
var iznosGoriva = Math.ceil((potrosnja / 100) * bazaCijeneGoriva * (udaljenost * 2) * zalijevanjaMjesecno);
|
||||||
|
var ukupnoTroskovaMjesecno = iznosGoriva + plata;
|
||||||
|
var trosakZoblaka = bazaCijeneZoblaka + godisnjeOdrzavanjeZoblaka * (brojSezona - 1);
|
||||||
|
var satiUProjekciji = satiMjesecno * sezona * brojSezona;
|
||||||
|
var novcaUProjekciji = ukupnoTroskovaMjesecno * sezona * brojSezona;
|
||||||
|
var iznosUstede = novcaUProjekciji - trosakZoblaka
|
||||||
|
var vrijemeZaBreakEven = Math.ceil(bazaCijeneZoblaka / ukupnoTroskovaMjesecno);
|
||||||
|
|
||||||
|
$('#vrijemeZaBreakEven').html(vrijemeZaBreakEven);
|
||||||
|
$('#brojSezona').html(brojSezona);
|
||||||
|
$('#iznosUstede').html(iznosUstede);
|
||||||
|
$('#satiUProjekciji').html(satiUProjekciji);
|
||||||
|
$('#iznosGoriva').html(iznosGoriva);
|
||||||
|
$('#satiMjesecno').html(satiMjesecno);
|
||||||
|
$('#plata').html(plata);
|
||||||
|
$('#ukupnoTroskovaMjesecno').html(ukupnoTroskovaMjesecno);
|
||||||
|
$('#bazaCijeneZoblaka').html(bazaCijeneZoblaka);
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
$(document).ready(function() {
|
||||||
|
iskalkulisi();
|
||||||
|
$(".ulazni-parametar").keyup(iskalkulisi);
|
||||||
|
$(".ulazni-parametar").change(iskalkulisi);
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
|
||||||
|
</html>
|
||||||
@@ -1,132 +0,0 @@
|
|||||||
<html>
|
|
||||||
|
|
||||||
<head>
|
|
||||||
|
|
||||||
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-1q8mTJOASx8j1Au+a5WDVnPi2lkFfwwEAa8hDDdjZlpLegxhjVME1fgjWPGmkzs7" crossorigin="anonymous">
|
|
||||||
<script src="https://code.jquery.com/jquery-2.2.3.min.js"></script>
|
|
||||||
|
|
||||||
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js" integrity="sha384-0mSbJDEHialfmuBBQP6A4Qrprq5OVfW37PRR3j5ELqxss1yVqOtnepnHVP9aJ7xS" crossorigin="anonymous"></script>
|
|
||||||
</head>
|
|
||||||
|
|
||||||
<body>
|
|
||||||
<div class="jumbotron">
|
|
||||||
<img src="http://zoblak.com/wp-content/uploads/2016/02/zoblak-1.png" /> <br />
|
|
||||||
Zoblak Agrar Plus se isplati za 2 mjeseci. U periodu od 3 godine ostvaruje uštedu u novcu od 3000.00 KM, te uštedu u vremenu od 800 sati za ovaj konkretan slučaj.
|
|
||||||
</div>
|
|
||||||
<div class="container-fluid">
|
|
||||||
<div class="row">
|
|
||||||
<div class="col-md-6">
|
|
||||||
<p>Na troškove goriva mjesečno trošite 600 KM. Na rad potreban za zalijevanje trošite mjesečno 45 sati što uz zadanu satnicu iznosi 3000 KM. Zajedno to je 3600 KM troška na zalijevanje. </p>
|
|
||||||
|
|
||||||
<p>Okvirna cijena Zoblak Agrar Plus za navedeni broj ventila i pumpi iznosi 2500 KM</p>
|
|
||||||
|
|
||||||
<p class="bg-primary">NAPOMENA: finalna cijena može biti
|
|
||||||
niža ili viša i poznata je nakon izrade projekta).</p>
|
|
||||||
</div>
|
|
||||||
<div class="col-md-6 col-sm-6">
|
|
||||||
<form method="post">
|
|
||||||
<div class="form-group ">
|
|
||||||
<label class="control-label " for="number">
|
|
||||||
Vaša udaljenost od polja u km
|
|
||||||
</label>
|
|
||||||
<input class="form-control ulazni-parametar" id="udaljenost" type="number" min="1" max="200" step="0.1" value="5" />
|
|
||||||
</div>
|
|
||||||
<div class="form-group ">
|
|
||||||
<label class="control-label " for="number1">
|
|
||||||
Prosjecna potrošnja automobila na 100 km
|
|
||||||
</label>
|
|
||||||
<input class="form-control ulazni-parametar" id="potrosnja" type="number" min="2" max="5" value="7" step="0.1" />
|
|
||||||
</div>
|
|
||||||
<div class="form-group ">
|
|
||||||
<label class="control-label " for="select">
|
|
||||||
Koliko često treba zaljevati kulturu?
|
|
||||||
</label>
|
|
||||||
<select class="select form-control" id="frekvencija_zalijevanja">
|
|
||||||
<option value="1">
|
|
||||||
Svaki dan
|
|
||||||
</option>
|
|
||||||
<option value="2">
|
|
||||||
Jednom u dva dana
|
|
||||||
</option>
|
|
||||||
<option value="3">
|
|
||||||
Jednom u tri dana
|
|
||||||
</option>
|
|
||||||
<option value="4">
|
|
||||||
Jednom u četiri dana
|
|
||||||
</option>
|
|
||||||
</select>
|
|
||||||
</div>
|
|
||||||
<div class="form-group ">
|
|
||||||
<label class="control-label " for="number2">
|
|
||||||
Koliko vremena traje put prema polju (u oba smijera) i jedan ciklus zalijevanja? U satima.
|
|
||||||
</label>
|
|
||||||
<input class="form-control ulazni-parametar" id="vrijeme" type="number" min="2" max="10" value="1.5" step="0.5"/>
|
|
||||||
</div>
|
|
||||||
<div class="form-group ">
|
|
||||||
<label class="control-label " for="number3">
|
|
||||||
Satnica osobe koja zalijeva u KM
|
|
||||||
</label>
|
|
||||||
<input class="form-control ulazni-parametar" id="satnica" type="number" min="5" max="100" value="20" step="5" />
|
|
||||||
</div>
|
|
||||||
<div class="form-group ">
|
|
||||||
<label class="control-label " for="number3">
|
|
||||||
Trajanje sezone u mjesecima
|
|
||||||
</label>
|
|
||||||
<input class="form-control ulazni-parametar" id="sezona" type="number" min="1" max="12" value="4" step="1" />
|
|
||||||
</div>
|
|
||||||
<div class="form-group ">
|
|
||||||
<label class="control-label " for="number3">
|
|
||||||
Broj ventila i pumpi koje Zoblak kontroliše
|
|
||||||
</label>
|
|
||||||
<input class="form-control ulazni-parametar" id="broj_ventila" type="number" min="2" max="50" value="2" step="1"/>
|
|
||||||
</div>
|
|
||||||
<div class="form-group ">
|
|
||||||
<label class="control-label " for="number3">
|
|
||||||
Na koliko godina/sezona se projekcija vrši
|
|
||||||
</label>
|
|
||||||
<input class="form-control ulazni-parametar" id="broj_sezona" type="number" min="1" max="10" value="1" step="1"/>
|
|
||||||
</div>
|
|
||||||
</form>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<script type="text/javascript">
|
|
||||||
|
|
||||||
function iskalkulisi() {
|
|
||||||
// ulazi
|
|
||||||
var udaljenost = parseFloat($('#udaljenost').val());
|
|
||||||
var potrosnja = parseFloat($('#potrosnja').val());
|
|
||||||
var frekvencija = parseInt($'#frekvencija_zalijevanja').val());
|
|
||||||
var vrijeme = parseFloat($('#vrijeme').val());
|
|
||||||
var satnica = parseFloat($('#satnica').val());
|
|
||||||
var sezona = parseInt($'#sezona').val());
|
|
||||||
var ventili = parseInt($'#broj_ventila').val());
|
|
||||||
var brojSezona = parseInt($'#broj_sezona').val());
|
|
||||||
var bazaCijeneZoblaka = 1400;
|
|
||||||
var bazaCijeneVentila = 150;
|
|
||||||
var godisnjeOdrzavanjeZoblaka = 200;
|
|
||||||
|
|
||||||
// rezultati
|
|
||||||
var zalijevanjaMjesecno = Math.ceil(30 / frekvencija);
|
|
||||||
var satiMjesecno = Math.ceil(vrijeme) * zalijevanjaMjesecno;
|
|
||||||
var plata = satiMjesecno * satnica;
|
|
||||||
var iznosGoriva = Math.ceil((potrosnja / 100) * (udaljenost * 2) * zalijevanjaMjesecno);
|
|
||||||
var ukupnoTroskovaMjesecno = iznosGoriva + plata;
|
|
||||||
var trosakZoblaka = bazaCijeneZoblaka + ((ventili - 2) * bazaCijeneVentila);
|
|
||||||
var satiUProjekciji = satiMjesecno * sezona * brojSezona;
|
|
||||||
var novcaUProjekciji = ukupnoTroskovaMjesecno * sezona * brojSezona;
|
|
||||||
var iznosUstede =
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
};
|
|
||||||
$(document).ready(function(){
|
|
||||||
|
|
||||||
|
|
||||||
});
|
|
||||||
</script>
|
|
||||||
</body>
|
|
||||||
|
|
||||||
</html>
|
|
||||||
BIN
misc/zoblak.png
Normal file
BIN
misc/zoblak.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 16 KiB |
Reference in New Issue
Block a user