diff --git a/src/lib/graphQueryGenerator.ts b/src/lib/server/graphQueryGenerator.ts similarity index 91% rename from src/lib/graphQueryGenerator.ts rename to src/lib/server/graphQueryGenerator.ts index f3cc22e..427d6d9 100644 --- a/src/lib/graphQueryGenerator.ts +++ b/src/lib/server/graphQueryGenerator.ts @@ -83,8 +83,8 @@ function buildQuery(field: String, from: Date, to: Date, interval: String) { { range: { '@timestamp': { - gte: toDateString, - lte: fromDateString, + gte: fromDateString, + lte: toDateString, format: 'strict_date_optional_time' } } @@ -138,7 +138,7 @@ function calculateInterval(from, to, interval, size) { if (interval !== 'auto') { return interval; } - const dateMathInterval = roundInterval((from - to) / size); + const dateMathInterval = roundInterval((to - from) / size); // const dateMathIntervalMs = toMS(dateMathInterval); // const minMs = toMS(min); // if (dateMathIntervalMs !== undefined && minMs !== undefined && dateMathIntervalMs < minMs) { @@ -148,6 +148,7 @@ function calculateInterval(from, to, interval, size) { } function parseTempResponse(data: IESTelemetry): IChartFrame[] { + console.log('got temp response:', data); return data?.aggregations?.data?.buckets.map((bucket) => { return { value: bucket?.maxValue?.value, @@ -161,12 +162,7 @@ function parseLatestResponse(data: IESTelemetry) { return data?.hits?.hits[0]?._source; } -export function fetchTemperature( - from: Date, - to: Date, - size: number = 50, - fetch: Function -): Promise { +export function fetchTemperature(from: Date, to: Date, size: number = 50): Promise { const fromMS = from.getTime(); const toMS = to.getTime(); const interval = calculateInterval(fromMS, toMS, 'auto', size); @@ -181,18 +177,14 @@ export function fetchTemperature( }, body: JSON.stringify(esSearchQuery) }; + console.log('temp options:', options); return fetch(TELEMETRY_ENDPOINT, options) .then((resp) => resp.json()) .then(parseTempResponse); } -export function fetchHumidity( - from: Date, - to: Date, - size: number = 50, - fetch: Function -): Promise { +export function fetchHumidity(from: Date, to: Date, size: number = 50): Promise { const fromMS = from.getTime(); const toMS = to.getTime(); const interval = calculateInterval(fromMS, toMS, 'auto', size); @@ -213,12 +205,7 @@ export function fetchHumidity( .then(parseTempResponse); } -export function fetchPressure( - from: Date, - to: Date, - size: number = 50, - fetch: Function -): Promise { +export function fetchPressure(from: Date, to: Date, size: number = 50): Promise { const fromMS = from.getTime(); const toMS = to.getTime(); const interval = calculateInterval(fromMS, toMS, 'auto', size); diff --git a/src/routes/+page.server.ts b/src/routes/+page.server.ts index f96bc99..6cb6adf 100644 --- a/src/routes/+page.server.ts +++ b/src/routes/+page.server.ts @@ -1,7 +1,5 @@ -import { getLatestInsideReadings, getLatestOutsideReadings } from '$lib/graphQueryGenerator'; import type { PageServerLoad } from './$types'; -let DEFAULT_MINUTES = 14400; const host = 'http://brewpi.schleppe:5000'; const sensorsUrl = `${host}/api/sensors`; const relaysUrl = `${host}/api/relays`; @@ -24,8 +22,6 @@ async function getRelays() { export const load: PageServerLoad = async () => { const [sensors, relays] = await Promise.all([getSensors(), getRelays()]); - console.log('got sensors and relays'); - console.log(sensors, relays); const inside = sensors.find((sensor) => sensor.location === 'inside'); const outside = sensors.find((sensor) => sensor.location === 'outside'); diff --git a/src/routes/api/graph/[unit]/+server.ts b/src/routes/api/graph/[unit]/+server.ts new file mode 100644 index 0000000..346142a --- /dev/null +++ b/src/routes/api/graph/[unit]/+server.ts @@ -0,0 +1,39 @@ +import { json, RequestEvent } from '@sveltejs/kit'; +import { + fetchTemperature, + fetchHumidity, + fetchPressure +} from '../../../../lib/server/graphQueryGenerator'; +import type { RequestHandler } from './$types'; + +const UNITS = ['temperature', 'humidity', 'pressure']; +const UNITS_STRING = UNITS.join(', '); + +export const POST = (async (event: RequestEvent) => { + const { request, params } = event; + + const { unit } = params; + if (!unit || UNITS.indexOf(unit) == -1) { + return json({ + success: false, + message: `Unit ${unit} not found. Choose from: ${UNITS_STRING}` + }); + } + + const bodyData = await request.json(); + let data; + let { from, to } = bodyData; + const { size } = bodyData; + from = new Date(from); + to = new Date(to); + + if (unit === 'temperature') { + data = await fetchTemperature(from, to, size); + } else if (unit === 'humidity') { + data = await fetchHumidity(from, to, size); + } else if (unit === 'pressure') { + data = await fetchPressure(from, to, size); + } + + return json({ success: true, data }); +}) satisfies RequestHandler; diff --git a/src/routes/graphs/+page.server.ts b/src/routes/graphs/+page.server.ts index 2a7815f..9856fed 100644 --- a/src/routes/graphs/+page.server.ts +++ b/src/routes/graphs/+page.server.ts @@ -1,13 +1,21 @@ -import { fetchTemperature, fetchHumidity, fetchPressure } from '$lib/graphQueryGenerator'; +import { + fetchTemperature, + fetchHumidity, + fetchPressure +} from '../../lib/server/graphQueryGenerator'; import type { PageServerLoad } from './$types'; -import type IChartFrame from '$lib/interfaces/IChartFrame'; +import type IChartFrame from '../../lib/interfaces/IChartFrame'; -let DEFAULT_MINUTES = 10080; +const DEFAULT_MINUTES = 10080; export const load: PageServerLoad = async ({ fetch }) => { - const temperatureData: IChartFrame[] = await getTemp(DEFAULT_MINUTES, fetch); - const humidityData: IChartFrame[] = await getHumidity(DEFAULT_MINUTES, fetch); - const pressureData: IChartFrame[] = await getPressure(DEFAULT_MINUTES, fetch); + const to = new Date(); + const from = new Date(to.getTime() - DEFAULT_MINUTES * 60 * 1000); + const size = 40; + + const temperatureData: IChartFrame[] = await fetchTemperature(from, to, size); + const humidityData: IChartFrame[] = await fetchHumidity(from, to, size); + const pressureData: IChartFrame[] = await fetchPressure(from, to, size); return { temperatureData, @@ -16,23 +24,3 @@ export const load: PageServerLoad = async ({ fetch }) => { DEFAULT_MINUTES }; }; - -function getSensor(func: Function, minutes: number, fetch: Function) { - const from: Date = new Date(); - const to = new Date(from.getTime() - minutes * 60 * 1000); - const size = 40; - - return func(from, to, size, fetch); -} - -function getTemp(minutes: number, fetch: Function): IChartFrame[] { - return getSensor(fetchTemperature, minutes, fetch); -} - -function getHumidity(minutes: number, fetch: Function): IChartFrame[] { - return getSensor(fetchHumidity, minutes, fetch); -} - -function getPressure(minutes: number, fetch: Function): IChartFrame[] { - return getSensor(fetchPressure, minutes, fetch); -} diff --git a/src/routes/graphs/+page.svelte b/src/routes/graphs/+page.svelte index 5433da1..6d1aaea 100644 --- a/src/routes/graphs/+page.svelte +++ b/src/routes/graphs/+page.svelte @@ -1,55 +1,48 @@ @@ -57,24 +50,27 @@
{#each buttonMinutes as button} - + {/each}
{#if temperatureData} -
- +
+
{/if} {#if humidityData} -
- +
+
{/if} {#if pressureData} -
- +
+
{/if}
@@ -89,17 +85,21 @@ width: 100%; @include mobile { - grid-template-columns: 1fr; + display: block; + > *:not(*:first-child) { + margin-top: 1rem; + } } - .graphWrapper { - max-width: 100vw; + .card { + padding: 1rem; } } .button-wrapper { display: flex; - width: min-content; + margin: 1rem 0; + overflow-y: scroll; } button {