@@ -113,9 +69,7 @@
mph
|
- {{
- weatherAggregates!.windSpeed.average.toFixed(2)
- }}
+ {{ weatherAggregates!.windSpeed.average.toFixed(2) }}
mph
|
diff --git a/WebDisplay/src/main.ts b/WebDisplay/src/main.ts
index e8a8093..c57220d 100644
--- a/WebDisplay/src/main.ts
+++ b/WebDisplay/src/main.ts
@@ -5,10 +5,13 @@ import App from './App.vue';
import { createApp } from 'vue';
import { createPinia } from 'pinia';
+import VueApexCharts from 'vue3-apexcharts';
+
const pinia = createPinia();
const app = createApp(App);
registerPlugins(app);
+app.use(VueApexCharts);
app.use(pinia);
app.mount('#app');
diff --git a/WebDisplay/src/models/environment.ts/latestReadings.ts b/WebDisplay/src/models/environment.ts/latestReadings.ts
new file mode 100644
index 0000000..728000f
--- /dev/null
+++ b/WebDisplay/src/models/environment.ts/latestReadings.ts
@@ -0,0 +1,13 @@
+export interface LatestReadings {
+ time: string
+ name: string
+ model: string
+ airQualityIndex: number
+ colorTemperature: number
+ gasResistance: number
+ humidity: number
+ luminance: number
+ pressure: number
+ temperature: number
+ }
+
\ No newline at end of file
diff --git a/WebDisplay/src/models/environment.ts/readingsGrouped.ts b/WebDisplay/src/models/environment.ts/readingsGrouped.ts
new file mode 100644
index 0000000..d831cb0
--- /dev/null
+++ b/WebDisplay/src/models/environment.ts/readingsGrouped.ts
@@ -0,0 +1,11 @@
+export interface ReadingsGrouped {
+ bucket: string;
+ name: string;
+ averageTemperature: number;
+ averagePressure: number;
+ averageHumidity: number;
+ averageLuminance: number;
+ averageGasResistance: number;
+ averageColorTemperature: number;
+ averageAirQualityIndex: number;
+}
diff --git a/WebDisplay/src/models/power/power-history-grouped.ts b/WebDisplay/src/models/power/power-history-grouped.ts
new file mode 100644
index 0000000..aa1f35b
--- /dev/null
+++ b/WebDisplay/src/models/power/power-history-grouped.ts
@@ -0,0 +1,5 @@
+export default interface PowerHistoryGrouped {
+ bucket: string;
+ averageGeneration: number;
+ averageConsumption: number;
+}
diff --git a/WebDisplay/src/models/weather/weather-aggregates.ts b/WebDisplay/src/models/weather/weather-aggregates.ts
index 6135d83..f69b86c 100644
--- a/WebDisplay/src/models/weather/weather-aggregates.ts
+++ b/WebDisplay/src/models/weather/weather-aggregates.ts
@@ -1,4 +1,4 @@
-export interface WeatherAggregates {
+export default interface WeatherAggregates {
humidity: WeatherAggregate;
temperature: WeatherAggregate;
pressure: WeatherAggregate;
diff --git a/WebDisplay/src/models/weather/weather-history-grouped.ts b/WebDisplay/src/models/weather/weather-history-grouped.ts
new file mode 100644
index 0000000..96ffd02
--- /dev/null
+++ b/WebDisplay/src/models/weather/weather-history-grouped.ts
@@ -0,0 +1,8 @@
+export default interface WeatherHistoryGrouped {
+ bucket: string;
+ averageTemperature: number;
+ averagePressure: number;
+ averageLightLevel: number;
+ averageHumidity: number;
+ rainTotal: number;
+}
diff --git a/WebDisplay/src/models/weather/weather-value-grouped.ts b/WebDisplay/src/models/weather/weather-value-grouped.ts
index ca781d3..5445a28 100644
--- a/WebDisplay/src/models/weather/weather-value-grouped.ts
+++ b/WebDisplay/src/models/weather/weather-value-grouped.ts
@@ -1,4 +1,4 @@
-export default class WeatherValueGrouped {
- bucket: string | undefined;
- averageValue: number | undefined;
+export default interface WeatherValueGrouped {
+ bucket: string;
+ averageValue: number;
}
diff --git a/WebDisplay/src/models/weather/weather-value-type.ts b/WebDisplay/src/models/weather/weather-value-type.ts
index ade5f80..4216f0d 100644
--- a/WebDisplay/src/models/weather/weather-value-type.ts
+++ b/WebDisplay/src/models/weather/weather-value-type.ts
@@ -2,7 +2,8 @@ export enum WeatherValueType {
Humidity = 'Humidity',
HumidityTemperature = 'HumidityTemperature',
PressureTemperature = 'PressureTemperature',
- Pressure = 'Pressure'
+ Pressure = 'Pressure',
+ Light = 'LightLevel'
}
export default WeatherValueType;
diff --git a/WebDisplay/src/models/weather/wind-history-grouped.ts b/WebDisplay/src/models/weather/wind-history-grouped.ts
new file mode 100644
index 0000000..87ffbc4
--- /dev/null
+++ b/WebDisplay/src/models/weather/wind-history-grouped.ts
@@ -0,0 +1,7 @@
+export default interface WindHistoryGrouped {
+ bucket: string;
+ minimumSpeed: number;
+ averageSpeed: number;
+ maximumSpeed: number;
+ averageDirection: number;
+}
diff --git a/WebDisplay/src/pages/index.vue b/WebDisplay/src/pages/index.vue
index 33561b4..8c8aaf7 100644
--- a/WebDisplay/src/pages/index.vue
+++ b/WebDisplay/src/pages/index.vue
@@ -23,6 +23,12 @@
+
+
+
+
+
+
diff --git a/WebDisplay/src/pages/indoor.vue b/WebDisplay/src/pages/indoor.vue
new file mode 100644
index 0000000..5c9c163
--- /dev/null
+++ b/WebDisplay/src/pages/indoor.vue
@@ -0,0 +1,99 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/WebDisplay/src/pages/inside.vue b/WebDisplay/src/pages/inside.vue
deleted file mode 100644
index c731142..0000000
--- a/WebDisplay/src/pages/inside.vue
+++ /dev/null
@@ -1,11 +0,0 @@
-
-
-
- Inside
-
-
-
-
-
diff --git a/WebDisplay/src/pages/outdoor.vue b/WebDisplay/src/pages/outdoor.vue
new file mode 100644
index 0000000..dfbcaa2
--- /dev/null
+++ b/WebDisplay/src/pages/outdoor.vue
@@ -0,0 +1,160 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/WebDisplay/src/pages/outside.vue b/WebDisplay/src/pages/outside.vue
deleted file mode 100644
index 72467af..0000000
--- a/WebDisplay/src/pages/outside.vue
+++ /dev/null
@@ -1,11 +0,0 @@
-
-
-
- Outside
-
-
-
-
-
diff --git a/WebDisplay/src/pages/power.vue b/WebDisplay/src/pages/power.vue
new file mode 100644
index 0000000..7323aa4
--- /dev/null
+++ b/WebDisplay/src/pages/power.vue
@@ -0,0 +1,93 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/WebDisplay/src/pressureConverter.ts b/WebDisplay/src/pressureConverter.ts
new file mode 100644
index 0000000..1605bc4
--- /dev/null
+++ b/WebDisplay/src/pressureConverter.ts
@@ -0,0 +1,7 @@
+export function ConvertMillibarToInchesOfMercury(value: number): number {
+ return value / 33.864;
+}
+
+export function ConvertPascalToInchesOfMercury(value: number): number {
+ return value / 33.864 / 100.0;
+}
diff --git a/WebDisplay/src/stores/indoorStore.ts b/WebDisplay/src/stores/indoorStore.ts
new file mode 100644
index 0000000..bb351cc
--- /dev/null
+++ b/WebDisplay/src/stores/indoorStore.ts
@@ -0,0 +1,62 @@
+import { defineStore } from 'pinia';
+import axios from 'axios';
+import Environment from '@/environment';
+import { HubConnection, HubConnectionBuilder } from '@microsoft/signalr';
+import { LatestReadings } from '@/models/environment.ts/latestReadings';
+import { ReadingsGrouped } from '@/models/environment.ts/readingsGrouped';
+
+export function createIndoorStore(name: string) {
+ return defineStore(`indoor-${name}`, {
+ state: () => {
+ return {
+ current: null as LatestReadings | null,
+ _connection: null as HubConnection | null
+ };
+ },
+ actions: {
+ async start() {
+ if (this._connection) {
+ return;
+ }
+
+ this._connection = new HubConnectionBuilder()
+ .withUrl(Environment.getUrlPrefix() + '/api/hub/environment', {
+ withCredentials: false
+ })
+ .build();
+
+ await this._connection.start();
+
+ this._connection.on('Latest', (message: string) => {
+ const latestReadings = JSON.parse(message) as LatestReadings;
+
+ if (latestReadings.name === name) {
+ this.$patch({ current: latestReadings });
+ }
+ });
+
+ this._connection.send('RequestLatest');
+ },
+ async stop() {
+ if (!this._connection) {
+ return;
+ }
+
+ await this._connection.stop();
+
+ this._connection = null;
+ },
+ async getReadingValueHistoryGrouped(start: Date, end: Date, bucketMinutes: number): Promise {
+ const startString = start.toISOString();
+ const endString = end.toISOString();
+
+ const response = await axios.get(
+ Environment.getUrlPrefix() +
+ `/api/environment/readings/history-grouped?start=${startString}&end=${endString}&bucketMinutes=${bucketMinutes}`
+ );
+
+ return response.data;
+ }
+ }
+ })();
+}
diff --git a/WebDisplay/src/stores/powerStore.ts b/WebDisplay/src/stores/powerStore.ts
index 885e844..8e48029 100644
--- a/WebDisplay/src/stores/powerStore.ts
+++ b/WebDisplay/src/stores/powerStore.ts
@@ -1,7 +1,9 @@
import { defineStore } from 'pinia';
import { HubConnection, HubConnectionBuilder } from '@microsoft/signalr';
+import axios from 'axios';
import Environment from '@/environment';
import PowerStatus from '@/models/power/power-status';
+import PowerHistoryGrouped from '@/models/power/power-history-grouped';
export const usePowerStore = defineStore('power', {
state: () => {
@@ -36,6 +38,16 @@ export const usePowerStore = defineStore('power', {
await this._connection.stop();
this._connection = null;
+ },
+ async getReadingHistoryGrouped(start: Date, end: Date, bucketMinutes: number): Promise {
+ const startString = start.toISOString();
+ const endString = end.toISOString();
+
+ const response = await axios.get(
+ Environment.getUrlPrefix() + `/api/power/status/history-grouped?start=${startString}&end=${endString}&bucketMinutes=${bucketMinutes}`
+ );
+
+ return response.data;
}
}
});
diff --git a/WebDisplay/src/stores/weatherStore.ts b/WebDisplay/src/stores/weatherStore.ts
index 589ed10..30b2cda 100644
--- a/WebDisplay/src/stores/weatherStore.ts
+++ b/WebDisplay/src/stores/weatherStore.ts
@@ -6,7 +6,9 @@ import WeatherUpdate from '@/models/weather/weather-update';
import WeatherRecent from '@/models/weather/weather-recent';
import WeatherValueType from '@/models/weather/weather-value-type';
import WeatherValueGrouped from '@/models/weather/weather-value-grouped';
-import { WeatherAggregates } from '@/models/weather/weather-aggregates';
+import WeatherHistoryGrouped from '@/models/weather/weather-history-grouped';
+import WindHistoryGrouped from '@/models/weather/wind-history-grouped';
+import WeatherAggregates from '@/models/weather/weather-aggregates';
export const useWeatherStore = defineStore('weather', {
state: () => {
@@ -43,18 +45,11 @@ export const useWeatherStore = defineStore('weather', {
this._connection = null;
},
async getLatest(): Promise {
- const response = await axios.get(
- Environment.getUrlPrefix() + `/api/weather/readings/recent`
- );
+ const response = await axios.get(Environment.getUrlPrefix() + `/api/weather/readings/recent`);
return response.data;
},
- async getReadingValueHistoryGrouped(
- valueType: WeatherValueType,
- start: Date,
- end: Date,
- bucketMinutes: number
- ): Promise {
+ async getReadingValueHistoryGrouped(valueType: WeatherValueType, start: Date, end: Date, bucketMinutes: number): Promise {
const startString = start.toISOString();
const endString = end.toISOString();
@@ -65,16 +60,32 @@ export const useWeatherStore = defineStore('weather', {
return response.data;
},
- async getReadingAggregate(
- start: Date,
- end: Date
- ): Promise {
+ async getReadingAggregate(start: Date, end: Date): Promise {
const startString = start.toISOString();
const endString = end.toISOString();
const response = await axios.get(
- Environment.getUrlPrefix() +
- `/api/weather/readings/aggregate?start=${startString}&end=${endString}`
+ Environment.getUrlPrefix() + `/api/weather/readings/aggregate?start=${startString}&end=${endString}`
+ );
+
+ return response.data;
+ },
+ async getReadingHistoryGrouped(start: Date, end: Date, bucketMinutes: number): Promise {
+ const startString = start.toISOString();
+ const endString = end.toISOString();
+
+ const response = await axios.get(
+ Environment.getUrlPrefix() + `/api/weather/readings/history-grouped?start=${startString}&end=${endString}&bucketMinutes=${bucketMinutes}`
+ );
+
+ return response.data;
+ },
+ async getWindHistoryGrouped(start: Date, end: Date, bucketMinutes: number): Promise {
+ const startString = start.toISOString();
+ const endString = end.toISOString();
+
+ const response = await axios.get(
+ Environment.getUrlPrefix() + `/api/weather/readings/wind-history-grouped?start=${startString}&end=${endString}&bucketMinutes=${bucketMinutes}`
);
return response.data;
diff --git a/WebDisplay/src/temperatureConverter.ts b/WebDisplay/src/temperatureConverter.ts
new file mode 100644
index 0000000..23419d9
--- /dev/null
+++ b/WebDisplay/src/temperatureConverter.ts
@@ -0,0 +1,3 @@
+export function ConvertCToF(value: number): number {
+ return (value * 9.0) / 5.0 + 32.0;
+}
diff --git a/WebDisplay/typed-router.d.ts b/WebDisplay/typed-router.d.ts
index 2463b8d..57aac90 100644
--- a/WebDisplay/typed-router.d.ts
+++ b/WebDisplay/typed-router.d.ts
@@ -40,8 +40,9 @@ import type {
declare module 'vue-router/auto/routes' {
export interface RouteNamedMap {
'/': RouteRecordInfo<'/', '/', Record, Record>,
- '/inside': RouteRecordInfo<'/inside', '/inside', Record, Record>,
- '/outside': RouteRecordInfo<'/outside', '/outside', Record, Record>,
+ '/indoor': RouteRecordInfo<'/indoor', '/indoor', Record, Record>,
+ '/outdoor': RouteRecordInfo<'/outdoor', '/outdoor', Record, Record>,
+ '/power': RouteRecordInfo<'/power', '/power', Record, Record>,
}
}
diff --git a/WebDisplay/vite.config.mts b/WebDisplay/vite.config.mts
index 8ab5750..43e6cec 100644
--- a/WebDisplay/vite.config.mts
+++ b/WebDisplay/vite.config.mts
@@ -43,6 +43,6 @@ export default defineConfig({
extensions: ['.js', '.json', '.jsx', '.mjs', '.ts', '.tsx', '.vue'],
},
server: {
- port: 3000,
+ port: 4200,
},
});
|