💣 Removes mqtt support
This commit is contained in:
@@ -1,9 +0,0 @@
|
||||
<script lang="ts">
|
||||
import MQTT from './MQTT.svelte';
|
||||
import MqttConfig from './MQTTConfig.svelte';
|
||||
</script>
|
||||
|
||||
<div class="mx-0 my-1 flex flex-col space-y-4 sm:mx-8 sm:my-8">
|
||||
<MQTT />
|
||||
<MqttConfig />
|
||||
</div>
|
||||
@@ -1,7 +0,0 @@
|
||||
import type { PageLoad } from './$types';
|
||||
|
||||
export const load = (async () => {
|
||||
return {
|
||||
title: "MQTT"
|
||||
};
|
||||
}) satisfies PageLoad;
|
||||
@@ -1,267 +0,0 @@
|
||||
<script lang="ts">
|
||||
import { onMount, onDestroy } from 'svelte';
|
||||
import { slide } from 'svelte/transition';
|
||||
import { cubicOut } from 'svelte/easing';
|
||||
import InputPassword from '$lib/components/InputPassword.svelte';
|
||||
import SettingsCard from '$lib/components/SettingsCard.svelte';
|
||||
import { user } from '$lib/stores/user';
|
||||
import { page } from '$app/stores';
|
||||
import { notifications } from '$lib/components/toasts/notifications';
|
||||
import Spinner from '$lib/components/Spinner.svelte';
|
||||
import Collapsible from '$lib/components/Collapsible.svelte';
|
||||
import MQTT from '~icons/tabler/topology-star-3';
|
||||
import Client from '~icons/tabler/robot';
|
||||
import type { MQTTSettings, MQTTStatus } from '$lib/models';
|
||||
import { api } from '$lib/api';
|
||||
|
||||
let mqttSettings: MQTTSettings;
|
||||
let mqttStatus: MQTTStatus;
|
||||
|
||||
let formField: any;
|
||||
|
||||
async function getMQTTStatus() {
|
||||
const result = await api.get<MQTTStatus>('/api/mqttStatus');
|
||||
if (result.isErr()){
|
||||
console.error('Error:', result.inner);
|
||||
return
|
||||
}
|
||||
mqttStatus = result.inner
|
||||
return mqttStatus;
|
||||
}
|
||||
|
||||
async function getMQTTSettings() {
|
||||
const result = await api.get<MQTTSettings>('/api/mqttSettings');
|
||||
if (result.isErr()){
|
||||
console.error('Error:', result.inner);
|
||||
return
|
||||
}
|
||||
mqttSettings = result.inner
|
||||
return mqttSettings;
|
||||
}
|
||||
|
||||
const interval = setInterval(async () => {
|
||||
getMQTTStatus();
|
||||
}, 5000);
|
||||
|
||||
onDestroy(() => clearInterval(interval));
|
||||
|
||||
onMount(() => {
|
||||
if (!$page.data.features.security || $user.admin) {
|
||||
getMQTTSettings();
|
||||
}
|
||||
});
|
||||
|
||||
let formErrors = {
|
||||
host: false,
|
||||
port: false,
|
||||
keep_alive: false,
|
||||
topic_length: false
|
||||
};
|
||||
|
||||
async function postMQTTSettings(data: MQTTSettings) {
|
||||
const result = await api.post<MQTTSettings>('/api/mqttSettings', data);
|
||||
if (result.isErr()){
|
||||
console.error('Error:', result.inner);
|
||||
notifications.error('User not authorized.', 3000);
|
||||
return
|
||||
}
|
||||
notifications.success('MQTT settings updated.', 3000);
|
||||
mqttSettings = result.inner
|
||||
return mqttSettings;
|
||||
}
|
||||
|
||||
function handleSubmitMQTT() {
|
||||
let valid = true;
|
||||
|
||||
// Validate Server URI
|
||||
const regexExpURL =
|
||||
/(([-a-zA-Z0-9@:%_\+.~#?&//=]{2,256}\.[a-z]{2,4})|(\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b))(\/[-a-zA-Z0-9@:%_\+.~#?&//=]*)?/i;
|
||||
|
||||
if (!regexExpURL.test(mqttSettings.uri)) {
|
||||
valid = false;
|
||||
formErrors.host = true;
|
||||
} else {
|
||||
formErrors.host = false;
|
||||
}
|
||||
|
||||
// Validate if port is a number and within the right range
|
||||
let keepalive = Number(mqttSettings.keep_alive);
|
||||
if (1 <= keepalive && keepalive <= 600) {
|
||||
formErrors.keep_alive = false;
|
||||
} else {
|
||||
formErrors.keep_alive = true;
|
||||
valid = false;
|
||||
}
|
||||
|
||||
// Submit JSON to REST API
|
||||
if (valid) {
|
||||
postMQTTSettings(mqttSettings);
|
||||
//alert('Form Valid');
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<SettingsCard collapsible={false}>
|
||||
<MQTT slot="icon" class="lex-shrink-0 mr-2 h-6 w-6 self-end" />
|
||||
<span slot="title">MQTT</span>
|
||||
<div class="w-full overflow-x-auto">
|
||||
{#await getMQTTStatus()}
|
||||
<Spinner />
|
||||
{:then nothing}
|
||||
<div
|
||||
class="flex w-full flex-col space-y-1"
|
||||
transition:slide|local={{ duration: 300, easing: cubicOut }}
|
||||
>
|
||||
<div class="rounded-box bg-base-100 flex items-center space-x-3 px-4 py-2">
|
||||
<div
|
||||
class="mask mask-hexagon h-auto w-10 {mqttStatus.connected === true
|
||||
? 'bg-success'
|
||||
: 'bg-error'}"
|
||||
>
|
||||
<MQTT
|
||||
class="h-auto w-full scale-75 {mqttStatus.connected === true
|
||||
? 'text-success-content'
|
||||
: 'text-error-content'}"
|
||||
/>
|
||||
</div>
|
||||
<div>
|
||||
<div class="font-bold">Status</div>
|
||||
<div class="text-sm opacity-75">
|
||||
{#if mqttStatus.connected}
|
||||
Connected
|
||||
{:else if !mqttStatus.enabled}
|
||||
MQTT Disabled
|
||||
{:else}
|
||||
{mqttStatus.last_error}
|
||||
{/if}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="rounded-box bg-base-100 flex items-center space-x-3 px-4 py-2">
|
||||
<div class="mask mask-hexagon bg-primary h-auto w-10">
|
||||
<Client class="text-primary-content h-auto w-full scale-75" />
|
||||
</div>
|
||||
<div>
|
||||
<div class="font-bold">Client ID</div>
|
||||
<div class="text-sm opacity-75">
|
||||
{mqttStatus.client_id}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{/await}
|
||||
</div>
|
||||
|
||||
{#if !$page.data.features.security || $user.admin}
|
||||
<Collapsible open={false} class="shadow-lg" on:closed={getMQTTSettings}>
|
||||
<span slot="title">Change MQTT Settings</span>
|
||||
|
||||
<form on:submit|preventDefault={handleSubmitMQTT} novalidate bind:this={formField}>
|
||||
<div class="grid w-full grid-cols-1 content-center gap-x-4 px-4 sm:grid-cols-2">
|
||||
<!-- Enable -->
|
||||
<label class="label inline-flex cursor-pointer content-end justify-start gap-4">
|
||||
<input
|
||||
type="checkbox"
|
||||
bind:checked={mqttSettings.enabled}
|
||||
class="checkbox checkbox-primary"
|
||||
/>
|
||||
<span>Enable MQTT</span>
|
||||
</label>
|
||||
<div class="hidden sm:block" />
|
||||
<!-- URI -->
|
||||
<div class="sm:col-span-2">
|
||||
<label class="label" for="host">
|
||||
<span class="label-text text-md">URI</span>
|
||||
</label>
|
||||
<input
|
||||
type="text"
|
||||
class="input input-bordered invalid:border-error w-full invalid:border-2 {formErrors.host
|
||||
? 'border-error border-2'
|
||||
: ''}"
|
||||
bind:value={mqttSettings.uri}
|
||||
id="host"
|
||||
min="3"
|
||||
max="64"
|
||||
required
|
||||
/>
|
||||
<label class="label" for="host">
|
||||
<span class="label-text-alt text-error {formErrors.host ? '' : 'hidden'}"
|
||||
>Must be a valid URI</span
|
||||
>
|
||||
</label>
|
||||
</div>
|
||||
<!-- Username -->
|
||||
<div>
|
||||
<label class="label" for="user">
|
||||
<span class="label-text text-md">Username</span>
|
||||
</label>
|
||||
<input
|
||||
type="text"
|
||||
class="input input-bordered w-full"
|
||||
bind:value={mqttSettings.username}
|
||||
id="user"
|
||||
/>
|
||||
</div>
|
||||
<!-- Password -->
|
||||
<div>
|
||||
<label class="label" for="pwd">
|
||||
<span class="label-text text-md">Password</span>
|
||||
</label>
|
||||
<InputPassword bind:value={mqttSettings.password} id="pwd" />
|
||||
</div>
|
||||
<!-- Client ID -->
|
||||
<div>
|
||||
<label class="label" for="clientid">
|
||||
<span class="label-text text-md">Client ID</span>
|
||||
</label>
|
||||
<input
|
||||
type="text"
|
||||
class="input input-bordered w-full"
|
||||
bind:value={mqttSettings.client_id}
|
||||
id="clientid"
|
||||
/>
|
||||
</div>
|
||||
<!-- Keep Alive -->
|
||||
<div>
|
||||
<label class="label" for="keepalive">
|
||||
<span class="label-text text-md">Keep Alive</span>
|
||||
</label>
|
||||
<label for="keepalive" class="input-group">
|
||||
<input
|
||||
type="number"
|
||||
min="1"
|
||||
max="600"
|
||||
class="input input-bordered invalid:border-error w-full invalid:border-2 {formErrors.keep_alive
|
||||
? 'border-error border-2'
|
||||
: ''}"
|
||||
bind:value={mqttSettings.keep_alive}
|
||||
id="keepalive"
|
||||
required
|
||||
/>
|
||||
<span>Seconds</span>
|
||||
</label>
|
||||
<label for="keepalive" class="label"
|
||||
><span class="label-text-alt text-error {formErrors.keep_alive ? '' : 'hidden'}"
|
||||
>Must be between 1 and 600 seconds</span
|
||||
></label
|
||||
>
|
||||
</div>
|
||||
<!-- Clean Session -->
|
||||
<label class="label inline-flex cursor-pointer content-end justify-start gap-4">
|
||||
<input
|
||||
type="checkbox"
|
||||
bind:checked={mqttSettings.clean_session}
|
||||
class="checkbox checkbox-primary"
|
||||
/>
|
||||
<span class="">Clean Session?</span>
|
||||
</label>
|
||||
</div>
|
||||
<div class="divider mb-2 mt-0" />
|
||||
<div class="mx-4 flex flex-wrap justify-end gap-2">
|
||||
<button class="btn btn-primary" type="submit">Apply Settings</button>
|
||||
</div>
|
||||
</form>
|
||||
</Collapsible>
|
||||
{/if}
|
||||
</SettingsCard>
|
||||
@@ -1,168 +0,0 @@
|
||||
<script lang="ts">
|
||||
import { slide } from 'svelte/transition';
|
||||
import { cubicOut } from 'svelte/easing';
|
||||
import SettingsCard from '$lib/components/SettingsCard.svelte';
|
||||
import { notifications } from '$lib/components/toasts/notifications';
|
||||
import Spinner from '$lib/components/Spinner.svelte';
|
||||
import MQTT from '~icons/tabler/topology-star-3';
|
||||
import Info from '~icons/tabler/info-circle';
|
||||
import type { BrokerSettings } from '$lib/types/models';
|
||||
import { api } from '$lib/api';
|
||||
|
||||
let brokerSettings: BrokerSettings;
|
||||
|
||||
let formField: any;
|
||||
|
||||
async function getBrokerSettings() {
|
||||
const result = await api.get<BrokerSettings>('/api/brokerSettings');
|
||||
if (result.isErr()){
|
||||
console.error('Error:', result.inner);
|
||||
return
|
||||
}
|
||||
brokerSettings = result.inner
|
||||
}
|
||||
|
||||
let formErrors = {
|
||||
uid: false,
|
||||
path: false,
|
||||
name: false
|
||||
};
|
||||
|
||||
async function postBrokerSettings() {
|
||||
const result = await api.post<BrokerSettings>('/api/brokerSettings', brokerSettings);
|
||||
if (result.isErr()){
|
||||
console.error('Error:', result.inner);
|
||||
notifications.error('User not authorized.', 3000);
|
||||
return
|
||||
}
|
||||
notifications.success('Broker settings updated.', 3000);
|
||||
brokerSettings = result.inner
|
||||
}
|
||||
|
||||
function handleSubmitBroker() {
|
||||
let valid = true;
|
||||
|
||||
// Validate unique ID
|
||||
if (brokerSettings.unique_id.length < 3 || brokerSettings.unique_id.length > 32) {
|
||||
valid = false;
|
||||
formErrors.uid = true;
|
||||
} else {
|
||||
formErrors.uid = false;
|
||||
}
|
||||
|
||||
// Validate name
|
||||
if (brokerSettings.name.length < 3 || brokerSettings.name.length > 32) {
|
||||
valid = false;
|
||||
formErrors.name = true;
|
||||
} else {
|
||||
formErrors.name = false;
|
||||
}
|
||||
// Validate MQTT Path
|
||||
if (brokerSettings.mqtt_path.length > 64) {
|
||||
valid = false;
|
||||
formErrors.path = true;
|
||||
} else {
|
||||
formErrors.path = false;
|
||||
}
|
||||
|
||||
// Submit JSON to REST API
|
||||
if (valid) {
|
||||
postBrokerSettings();
|
||||
//alert('Form Valid');
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<SettingsCard collapsible={true} open={false}>
|
||||
<MQTT slot="icon" class="lex-shrink-0 mr-2 h-6 w-6 self-end" />
|
||||
<span slot="title">MQTT Broker Settings</span>
|
||||
<div class="w-full overflow-x-auto">
|
||||
{#await getBrokerSettings()}
|
||||
<Spinner />
|
||||
{:then nothing}
|
||||
<form
|
||||
on:submit|preventDefault={handleSubmitBroker}
|
||||
novalidate
|
||||
bind:this={formField}
|
||||
transition:slide|local={{ duration: 300, easing: cubicOut }}
|
||||
>
|
||||
<div class="alert alert-info my-2 shadow-lg">
|
||||
<Info class="h-6 w-6 flex-shrink-0 stroke-current" />
|
||||
<span
|
||||
>The LED is controllable via MQTT with the demo project designed to work with Home
|
||||
Assistant's auto discovery feature.</span
|
||||
>
|
||||
</div>
|
||||
<div class="grid w-full grid-cols-1 content-center gap-x-4 px-4">
|
||||
<div>
|
||||
<label class="label" for="uid">
|
||||
<span class="label-text text-md">Unique ID</span>
|
||||
</label>
|
||||
<input
|
||||
type="text"
|
||||
class="input input-bordered invalid:border-error w-full invalid:border-2 {formErrors.uid
|
||||
? 'border-error border-2'
|
||||
: ''}"
|
||||
bind:value={brokerSettings.unique_id}
|
||||
id="uid"
|
||||
min="3"
|
||||
max="32"
|
||||
required
|
||||
/>
|
||||
<label class="label" for="uid">
|
||||
<span class="label-text-alt text-error {formErrors.uid ? '' : 'hidden'}"
|
||||
>Unique ID must be between 3 and 32 characters long</span
|
||||
>
|
||||
</label>
|
||||
</div>
|
||||
<div>
|
||||
<label class="label" for="name">
|
||||
<span class="label-text text-md">Name</span>
|
||||
</label>
|
||||
<input
|
||||
type="text"
|
||||
class="input input-bordered invalid:border-error w-full invalid:border-2 {formErrors.name
|
||||
? 'border-error border-2'
|
||||
: ''}"
|
||||
bind:value={brokerSettings.name}
|
||||
id="name"
|
||||
min="3"
|
||||
max="32"
|
||||
required
|
||||
/>
|
||||
<label class="label" for="name">
|
||||
<span class="label-text-alt text-error {formErrors.name ? '' : 'hidden'}"
|
||||
>Name must be between 3 and 32 characters long</span
|
||||
>
|
||||
</label>
|
||||
</div>
|
||||
<div>
|
||||
<label class="label" for="path">
|
||||
<span class="label-text text-md">MQTT Path</span>
|
||||
</label>
|
||||
<input
|
||||
type="text"
|
||||
class="input input-bordered invalid:border-error w-full invalid:border-2 {formErrors.path
|
||||
? 'border-error border-2'
|
||||
: ''}"
|
||||
bind:value={brokerSettings.mqtt_path}
|
||||
id="path"
|
||||
min="0"
|
||||
max="64"
|
||||
required
|
||||
/>
|
||||
<label class="label" for="path">
|
||||
<span class="label-text-alt text-error {formErrors.path ? '' : 'hidden'}"
|
||||
>MQTT path is limited to 64 characters</span
|
||||
>
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
<div class="divider mb-2 mt-0" />
|
||||
<div class="mx-4 flex flex-wrap justify-end gap-2">
|
||||
<button class="btn btn-primary" type="submit">Apply Settings</button>
|
||||
</div>
|
||||
</form>
|
||||
{/await}
|
||||
</div>
|
||||
</SettingsCard>
|
||||
@@ -18,7 +18,6 @@
|
||||
import Avatar from '~icons/mdi/user-circle';
|
||||
import Logout from '~icons/mdi/logout';
|
||||
import Copyright from '~icons/mdi/copyright';
|
||||
import MQTT from '~icons/tabler/topology-star-3';
|
||||
import NTP from '~icons/mdi/clock-check';
|
||||
import Metrics from '~icons/mdi/report-bar';
|
||||
import { page } from '$app/stores';
|
||||
@@ -85,13 +84,6 @@
|
||||
icon: Remote,
|
||||
feature: $page.data.features.mqtt || $page.data.features.ntp,
|
||||
submenu: [
|
||||
{
|
||||
title: 'MQTT',
|
||||
icon: MQTT,
|
||||
href: '/connections/mqtt',
|
||||
feature: $page.data.features.mqtt,
|
||||
|
||||
},
|
||||
{
|
||||
title: 'NTP',
|
||||
icon: NTP,
|
||||
|
||||
Reference in New Issue
Block a user