api/
ved/
admin/
modules/
gyar/
admin/
cron/
api/gyar/station/log.php1 lines
<?php
# log.php
# API endpoint
# Fil för en väderstation att ladda upp data på servern.
require_once "gyar/auth/authorization.php";
$functionPOST = function () {
$stationId = acceptAuthorizationLevels(AuthLevel::STATION);
require "gyar/modules/database.php";
$stationData = $db->query("SELECT currentStationPointId FROM weatherStation WHERE stationId=:stationId", ["stationId" => $stationId]);
if (!$stationData["currentStationPointId"])
throw new APIError(403, "Station has not been assigned a point.");
if (!isset($_POST["weatherData"]) && !isset($_POST["stationData"]))
throw new APIParameterError(400, ["weatherData", "stationData"], "Missing logging data.");
if (isset($_POST["timestamp"]) && !is_int($_POST["timestamp"]))
throw new APIParameterError(400, "timestamp");
$db->pdo->beginTransaction();
try {
if (isset($_POST["timestamp"]))
$db->query("INSERT INTO stationPointTimeData(stationPointInstanceId, timestamp) VALUES (:pointId, FROM_UNIXTIME(:timestamp))", ["pointId" => $stationData["currentStationPointId"], "timestamp" => $_POST["timestamp"]]);
else
$db->query("INSERT INTO stationPointTimeData(stationPointInstanceId, timestamp) VALUES (:pointId, CURRENT_TIMESTAMP())", ["pointId" => $stationData["currentStationPointId"]]);
$stationPointDataId = $db->getLastId();
if (isset($_POST["weatherData"])) {
$weatherData = $_POST["weatherData"];
if (sizeof($weatherData) != 6 || !isset($weatherData["temperature"]) || !isset($weatherData["humidity"]) || !isset($weatherData["airPressure"]) || !isset($weatherData["downfall"]) || !isset($weatherData["windSpeed"]) || !isset($weatherData["windDirection"]))
throw new APIParameterError(400, "weatherData");
$params = $weatherData;
$params["stationPointDataId"] = $stationPointDataId;
$db->query("INSERT INTO weatherData(stationPointDataId, temperature, humidity, airPressure, downfall, windSpeed, windDirection) VALUES (:stationPointDataId, :temperature, :humidity, :airPressure, :downfall, :windSpeed, :windDirection)", $params);
}
if (isset($_POST["stationData"])) {
$stationData = $_POST["stationData"];
if (sizeof($stationData) != 5 || !isset($stationData["batteryVoltage"]) || !isset($stationData["solarPanelVoltage"]) || !isset($stationData["internalTemperature"]) || !isset($stationData["efficiencyModeActive"]) || !isset($stationData["chargeCutoffActive"]))
throw new APIParameterError(400, "stationData");
$params = [
"stationPointDataId" => $stationPointDataId,
"batteryVoltage" => $stationData["batteryVoltage"],
"solarPanelVoltage" => $stationData["solarPanelVoltage"],
"lifetimeFlags" => $stationData["efficiencyModeActive"] | $stationData["chargeCutoffActive"] << 1,
];
$db->query("INSERT INTO stationData(stationPointDataId, batteryVoltage, solarPanelVoltage, lifetimeFlags) VALUES (:stationPointDataId, :batteryVoltage, :solarPanelVoltage, :lifetimeFlags)", $params);
}
if (!isset($_POST["timestamp"])) {
$settings = $db->query("SELECT ss.uploadInterval FROM weatherStation ws JOIN stationSettings ss ON ws.stationSettingsId = ss.stationSettingsId WHERE ws.stationId=:stationId", ["stationId" => $stationId]);
$db->query("UPDATE weatherStation ws SET nextExpectedUpload=ADDDATE(CURRENT_TIMESTAMP(), INTERVAL :uploadInterval SECOND) WHERE ws.stationId=:stationId", ["stationId" => $stationId, "uploadInterval" => $settings["uploadInterval"]]);
}
} catch (Exception $ex) {
# Om någonting misslyckas backas allting tillbaka..
$db->pdo->rollBack();
throw $ex;
}
$db->pdo->commit();
http_response_code(201);
return $stationPointDataId;
};
$api = new APIEndpoint();
$httpPOST = new APIMethod("POST", $functionPOST);
//$httpPOST->setAuthorization($auth);
//$httpPOST->setRequiredBodyParameters(array("temperature"));
$api->addMethod($httpPOST);
return $api;
?>