diff --git a/api/json.php b/api/json.php
new file mode 100644
index 0000000..d736282
--- /dev/null
+++ b/api/json.php
@@ -0,0 +1,173 @@
+
+ * @license GPLV3 gpl.com
+ * @link itsblue.de
+ */
+
+require_once './config.php';
+
+
+
+header('Content-Type: application/json');
+header('Access-Control-Allow-Origin: *');
+
+$con = mysqli_connect($config['dbhost'], $config['dbuser'], $config['dbpassword'], $config['dbname']);
+if (!$con) {
+ echo "
Fatal internal Error! :-/
";
+ echo "Error connecting to database: " . mysqli_connect_error();
+ http_response_code(500);
+ exit();
+}
+
+if (isset($_GET['locId'])) {
+ // get data of given location
+ $locId = $con->real_escape_string($_GET['locId']);
+ $range['from'] = $con->real_escape_string($_GET['range']['from']);
+ $range['to'] = $con->real_escape_string($_GET['range']['to']);
+ $maxVals = $con->real_escape_string($_GET['maxVals']);
+
+ $sql = "SELECT * FROM `locations`
+ WHERE`id`=$locId";
+ $result = $con->query($sql);
+
+ // only one row will be returned
+ $data = $result->fetch_assoc();
+
+ if (!isset($range['from']) || $range['from'] === "") {
+ $range['from'] = time() - 24 * 60 * 60;
+ }
+
+ if (!isset($range['to']) || $range['to'] === "") {
+ $range['to'] = time();
+ }
+
+ // get all measvalues of given location
+ $sql = "SELECT M.measvalue,M.sensorid,M.timestamp FROM measvalues M
+ JOIN sensors S ON M.sensorid = S.id
+ JOIN locations L ON S.locationid=L.id
+ WHERE L.id=$locId AND M.timestamp > " . $range['from'] . " AND M.timestamp < " . $range['to'] . "
+ ORDER BY timestamp ASC";
+
+ $result = $con->query($sql);
+
+ while ($row = $result->fetch_assoc()) {
+ $measvalues[] = $row;
+ }
+
+ // get all sensors of given location
+ $sql = "SELECT * FROM `sensors`
+ WHERE `locationid` = $locId";
+
+ $result = $con->query($sql);
+
+ //loop through the returned data
+ while ($row = $result->fetch_assoc()) {
+ unset($row['locationid']); // remove locId as it is redundant
+ $sensors[] = $row;
+ }
+
+ // get all value types
+ $sql = "SELECT * FROM `valuetypes`";
+
+ $result = $con->query($sql);
+
+ //loop through the returned data
+ while ($row = $result->fetch_assoc()) {
+ foreach ($sensors as $sensor) {
+ if ($sensor['valuetypeid'] == $row['id']) {
+ $valuetypes[] = $row;
+ break;
+ }
+ }
+ }
+
+ if (isset($maxVals) && $maxVals > 0 && count($measvalues) > $maxVals) {
+ // build the new measvalues array with respect to maxVals for each sensor
+
+ $finalMeasvals = array();
+
+ foreach ($sensors as $sensor) {
+
+
+ $rawMeasvalsOfThisSensor = array();
+ $finalMeasvalsOfThisSensor = array();
+
+ foreach ($measvalues as $measvalue) {
+ if ($measvalue["sensorid"] === $sensor["id"]) {
+ array_push($rawMeasvalsOfThisSensor, $measvalue);
+ }
+ }
+
+ $countOfValuesForAvarage = intval(round(count($rawMeasvalsOfThisSensor) / $maxVals, 0));
+
+ $takenValuesForNextSum = 0;
+ $tmpMeasvalueSum = 0;
+ $tmpTimestampSum = 0;
+
+ for ($i = 0; $i < count($rawMeasvalsOfThisSensor); $i++) {
+ $measvalue = $rawMeasvalsOfThisSensor[$i];
+ if ($measvalue["sensorid"] === $sensor["id"]) {
+ $tmpMeasvalueSum += $measvalue["measvalue"];
+ $tmpTimestampSum += $measvalue["timestamp"];
+ $takenValuesForNextSum += 1;
+ }
+ if ($takenValuesForNextSum === $countOfValuesForAvarage || $i === count($rawMeasvalsOfThisSensor) - 1) {
+ array_push($finalMeasvalsOfThisSensor, array("measvalue" => $tmpMeasvalueSum / $takenValuesForNextSum, "timestamp" => $tmpTimestampSum / $takenValuesForNextSum, "sensorid" => $sensor["id"]));
+
+ $takenValuesForNextSum = 0;
+ $tmpMeasvalueSum = 0;
+ $tmpTimestampSum = 0;
+ }
+ }
+
+
+ //print_r($finalMeasvalsOfThisSensor);
+
+ $finalMeasvals = array_merge($finalMeasvals, $finalMeasvalsOfThisSensor);
+ }
+
+ $measvalues = $finalMeasvals;
+ }
+
+ // find actual range
+ $min;
+ $max;
+ foreach ($measvalues as $value) {
+ if ($value['timestamp'] < $min || !isset($min)) {
+ $min = $value['timestamp'];
+ } else if ($value['timestamp'] > $max || !isset($max)) {
+ $max = $value['timestamp'];
+ }
+ }
+
+ // add sensors and value types to data object
+ $data['measvalues'] = $measvalues;
+ $data['sensors'] = $sensors;
+ $data['valuetypes'] = $valuetypes;
+ $data['range'] = array('from' => $min, 'to' => $max);
+} else {
+ // get all locations
+ $sql = "SELECT * FROM `locations`";
+ $result = $con->query($sql);
+
+ //loop through the returned data
+ while ($row = $result->fetch_assoc()) {
+ $data[] = $row;
+ }
+}
+
+http_response_code(200);
+
+echo json_encode($data);