Skip to content

Commit

Permalink
Merge pull request #7 from CropWatchDevelopment/develop
Browse files Browse the repository at this point in the history
fix history of temp sensors
  • Loading branch information
CropWatchDevelopment authored Apr 11, 2024
2 parents d03eaa0 + 4fdd7ff commit 91350f2
Show file tree
Hide file tree
Showing 2 changed files with 91 additions and 52 deletions.
57 changes: 57 additions & 0 deletions src/routes/api/cw-air-thvd-data/+server.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
import type { Session, SupabaseClient } from '@supabase/supabase-js';
import { json, redirect, type RequestEvent } from '@sveltejs/kit'
import moment from 'moment';

export async function GET({ response, url, locals: { supabase, getSession } }: { response: any, locals: { supabase: SupabaseClient, getSession: () => Promise<Session | null> } }) {
const session = await getSession();
if (!session) throw redirect(304, '/auth/login');
const user_id = session?.user.id;

let dev_eui = url.searchParams.get('dev_eui');
let from = url.searchParams.get('from');
let to = url.searchParams.get('to');

const sensors = await getAllSensorsForUser(supabase, user_id, dev_eui);
if(sensors.dev_eui == dev_eui) {

const csvData = await getDataForSensor(supabase, 'cw_air_thvd', dev_eui, from, to);
if (csvData) {
const csvResponse = new Response(csvData, {
headers: {
'Content-Type': 'text/csv',
},
});
return csvResponse;
}

}

return false;
}

async function getAllSensorsForUser(supabase: SupabaseClient, user_id: string, dev_eui: string) {
const { data, error } = await supabase.from('cw_device_owners').select('*, cw_devices(*)').eq('user_id', user_id).eq('dev_eui', dev_eui).maybeSingle();
if (!data) {
console.log(error);
return [];
} else {
return data;
}
}

async function getDataForSensor(supabase: SupabaseClient, data_table: string, dev_eui: string, from: Date, to: Date) {
const { data, error } = await supabase
.from(data_table)
.select('*')
.eq('dev_eui', dev_eui)
.order('created_at', { ascending: false })
.gte('created_at', moment(from).utc().toDate().toISOString())
.lt('created_at', moment(to).utc().toDate().toISOString())
.csv();
if (!data) {
console.log(error);
return [];
} else {
return data;
}
}
Original file line number Diff line number Diff line change
@@ -1,70 +1,52 @@
<script lang="ts">
import { page } from '$app/stores';
import { sensorDataState } from '$lib/stores/CW-SS-TMEPNPK';
import { mdiCalendarRange, mdiDotsVertical, mdiDownload, mdiHistory } from '@mdi/js';
import { scaleOrdinal, scaleTime } from 'd3-scale';
import { AreaStack, Axis, Chart, Svg } from 'layerchart';
import moment from 'moment';
import {
Avatar,
Button,
Card,
DateRangeField,
Header,
Icon,
ListItem,
Menu,
MenuItem,
PeriodType,
formatDate,
keys
Toggle
} from 'svelte-ux';
import { flatten } from 'svelte-ux/utils/array';
import type { DateRange } from 'svelte-ux/utils/dateRange';
export let sensor;
const stackData = stack().keys(keys)(sensor.sensor.data);
let selectedDateRange: DateRange = {
from: new Date(),
to: new Date(),
from: moment().startOf('day').toDate(),
to: moment().endOf('day').toDate(),
periodType: PeriodType.Day
};
// $: data = $sensorDataState;
console.log(sensor.sensor.data);
$: data = $sensorDataState;
const download = async () => {
try {
const response = await fetch(`/api/cw-air-thvd-data?dev_eui=${$page.params.sensor_eui}&from=${selectedDateRange.from}&to=${selectedDateRange.to}`);
const blob = await response.blob();
const url = URL.createObjectURL(blob);
const link = document.createElement('a');
link.href = url;
link.download = 'data.csv';
link.click();
URL.revokeObjectURL(url);
} catch (error) {
console.error('Error downloading file:', error);
}
};
</script>

<div class="m-4">
<h2>History list</h2>

<ol class="mt-2">
<DateRangeField bind:value={selectedDateRange} stepper icon={mdiCalendarRange} />

<div class="h-[300px] p-4 border rounded">
<Chart
data={stackData}
flatData={flatten(stackData)}
x={(d) => d.data.date}
xScale={scaleTime()}
y={[0, 1]}
yNice
r="key"
rScale={scaleOrdinal()}
rDomain={keys}
rRange={['hsl(var(--color-danger))', 'hsl(var(--color-success))', 'hsl(var(--color-info))']}
padding={{ left: 16, bottom: 24 }}
>
<Svg>
<Axis placement="left" grid rule />
<Axis
placement="bottom"
format={(d) => formatDate(d, PeriodType.Day, { variant: 'short' })}
rule
/>
<AreaStack line={{ 'stroke-width': 2 }} />
</Svg>
</Chart>
</div>
<div class="grid grid-cols-2 gap-4">
<DateRangeField bind:value={selectedDateRange} icon={mdiCalendarRange} />
<Button variant="outline" icon={mdiDownload} on:click={() => download()}>Download</Button>
</div>

<ol class="">
{#each sensor.sensor.data as dat}
<li>
{dat.created_at}
{dat.temperature}
{dat.humidity} - {dat.co2_level}
</li>
{/each}
</ol>
</ol>
</div>

0 comments on commit 91350f2

Please sign in to comment.