UI and final stuff

This commit is contained in:
Gašper Dobrovoljc 2023-04-17 14:17:02 +02:00
parent 8e64445c25
commit fd7452fd3f
No known key found for this signature in database
GPG Key ID: 0E7E037018CFA5A5
2 changed files with 124 additions and 49 deletions

View File

@ -1,7 +1,7 @@
import { browser } from '$app/environment'; import { browser } from '$app/environment';
import { readable } from 'svelte/store'; import { readable } from 'svelte/store';
const url = 'http://192.168.116.72'; const url = 'http://192.168.116.48';
export type SensorData = { export type SensorData = {
temp: number; temp: number;
@ -10,6 +10,15 @@ export type SensorData = {
out2: boolean; out2: boolean;
}; };
export type Settings = {
refreshInterval: number;
sensorPin: number;
onTemp: number;
onHum: number;
tempOffset: number;
humOffset: number;
};
const defaultData: SensorData = { const defaultData: SensorData = {
temp: 0, temp: 0,
hum: 0, hum: 0,
@ -63,3 +72,33 @@ export async function setOnHum(hum: number) {
body: JSON.stringify({ onHum: hum }), body: JSON.stringify({ onHum: hum }),
}); });
} }
export async function setTempOffset(tempOffset: number) {
await fetch(`${url}/settings`, {
method: 'PATCH',
headers: {
'Content-Type': 'application/json',
Accept: 'application/json',
},
body: JSON.stringify({ tempOffset }),
});
}
export async function setHumOffset(humOffset: number) {
await fetch(`${url}/settings`, {
method: 'PATCH',
headers: {
'Content-Type': 'application/json',
Accept: 'application/json',
},
body: JSON.stringify({ humOffset }),
});
}
export async function getSettings(): Promise<Settings> {
const res = await fetch(`${url}/settings`, {
method: 'GET',
headers: { Accept: 'application/json' },
});
return await res.json();
}

View File

@ -1,56 +1,92 @@
<script lang="ts"> <script lang="ts">
import { sensor, setOnHum, setOnTemp, setOutput } from '../lib/sensor'; import { onMount } from 'svelte';
import {
getSettings,
sensor,
setHumOffset,
setOnHum,
setOnTemp,
setTempOffset,
} from '../lib/sensor';
let temp = 26; let temp = 26;
let hum = 50; let hum = 50;
let tempOffset = 0;
let humOffset = 0;
async function handleTempChange() { let loading = true;
await setOnTemp(temp);
}
async function handleHumChange() { onMount(() => {
await setOnHum(hum); getSettings().then((settings) => {
} temp = settings.onTemp;
hum = settings.onHum;
tempOffset = settings.tempOffset;
humOffset = settings.humOffset;
loading = false;
});
});
</script> </script>
<p>Temperature {$sensor.temp} °C</p> {#if loading}
<p>Humidity {$sensor.hum} %</p> <div class="w-screen h-screen flex items-center justify-center text-4xl">Loading</div>
{:else}
<div class="form-control w-full p-16"> <div class="flex items-center justify-center">
<label class="label cursor-pointer"> <div class="w-1/3 p-16 space-y-4">
<span class="label-text">Heater</span> <div class="flex gap-4">
<input <div class="rounded-box bg-base-200 w-1/2 text-center flex flex-col p-4">
type="checkbox" Heater
class="toggle" <span class="text-4xl">{$sensor.out1 ? 'ON' : 'OFF'}</span>
checked={$sensor.out1} </div>
on:change={(e) => setOutput(16, e.currentTarget.checked)} <div class="rounded-box bg-base-200 w-1/2 text-center flex flex-col p-4">
/> Dehumidifier
</label> <span class="text-4xl">{$sensor.out2 ? 'ON' : 'OFF'}</span>
<label class="label cursor-pointer"> </div>
<span class="label-text">Dehumidifier</span> </div>
<input <div class="rounded-box bg-base-200 p-8 text-center flex flex-col">
type="checkbox" <span class="text-2xl">Temperature</span>
class="toggle" <span class="text-5xl my-2">{$sensor.temp}°C</span>
checked={$sensor.out2} <span class="text-xl mb-2">Target: {temp}°C</span>
on:change={(e) => setOutput(17, e.currentTarget.checked)} <input
/> type="range"
</label> min="0"
<span>{temp}</span> max="100"
<input bind:value={temp}
type="range" class="range"
min="0" on:change={() => setOnTemp(temp)}
max="100" />
bind:value={temp} <span class="text-xl mb-2 mt-4">Hysteresis: {tempOffset}°C</span>
class="range" <input
on:change={handleTempChange} type="range"
/> min="-5"
<span>{hum}%</span> max="5"
<input bind:value={tempOffset}
type="range" class="range"
min="0" on:change={() => setTempOffset(tempOffset)}
max="100" />
bind:value={hum} </div>
class="range" <div class="rounded-box bg-base-200 p-8 text-center flex flex-col">
on:change={handleHumChange} <span class="text-2xl">Humidity</span>
/> <span class="text-5xl my-2">{$sensor.hum}%</span>
</div> <span class="text-xl mb-2">Target: {hum}%</span>
<input
type="range"
min="0"
max="100"
bind:value={hum}
class="range"
on:change={() => setOnHum(hum)}
/>
<span class="text-xl mb-2 mt-4">Hysteresis: {humOffset}%</span>
<input
type="range"
min="-5"
max="0"
bind:value={humOffset}
class="range"
on:change={() => setHumOffset(humOffset)}
/>
</div>
</div>
</div>
{/if}