@@ -1,5 +1,4 @@
|
||||
import { createTRPCRouter } from '~/server/api/trpc';
|
||||
|
||||
import { appRouter } from './routers/app';
|
||||
import { boardRouter } from './routers/board';
|
||||
import { calendarRouter } from './routers/calendar';
|
||||
@@ -16,6 +15,7 @@ import { notebookRouter } from './routers/notebook';
|
||||
import { overseerrRouter } from './routers/overseerr';
|
||||
import { passwordRouter } from './routers/password';
|
||||
import { rssRouter } from './routers/rss';
|
||||
import { smartHomeEntityStateRouter } from './routers/smart-home/entity-state';
|
||||
import { timezoneRouter } from './routers/timezone';
|
||||
import { usenetRouter } from './routers/usenet/router';
|
||||
import { userRouter } from './routers/user';
|
||||
@@ -47,6 +47,7 @@ export const rootRouter = createTRPCRouter({
|
||||
boards: boardRouter,
|
||||
password: passwordRouter,
|
||||
notebook: notebookRouter,
|
||||
smartHomeEntityState: smartHomeEntityStateRouter
|
||||
});
|
||||
|
||||
// export type definition of API
|
||||
|
||||
53
src/server/api/routers/smart-home/entity-state.ts
Normal file
53
src/server/api/routers/smart-home/entity-state.ts
Normal file
@@ -0,0 +1,53 @@
|
||||
import { TRPCError } from '@trpc/server';
|
||||
|
||||
import { ZodError, z } from 'zod';
|
||||
|
||||
|
||||
import { createTRPCRouter, protectedProcedure } from '../../trpc';
|
||||
|
||||
import { findAppProperty } from '~/tools/client/app-properties';
|
||||
import { getConfig } from '~/tools/config/getConfig';
|
||||
import { HomeAssistantSingleton } from '~/tools/singleton/HomeAssistantSingleton';
|
||||
|
||||
export const smartHomeEntityStateRouter = createTRPCRouter({
|
||||
retrieveStatus: protectedProcedure
|
||||
.input(
|
||||
z.object({
|
||||
configName: z.string(),
|
||||
entityId: z.string().regex(/^[A-Za-z0-9-_\.]+$/)
|
||||
})
|
||||
)
|
||||
.query(async ({ input }) => {
|
||||
const config = getConfig(input.configName);
|
||||
|
||||
const instances = config.apps.filter((app) => app.integration?.type == 'homeAssistant');
|
||||
|
||||
for (var instance of instances) {
|
||||
const url = new URL(instance.url);
|
||||
const client = HomeAssistantSingleton.getOrSet(url, findAppProperty(instance, 'apiKey'));
|
||||
const state = await client.getEntityState(input.entityId);
|
||||
|
||||
if (!state.success) {
|
||||
if (!(state.error instanceof ZodError)) {
|
||||
continue;
|
||||
}
|
||||
// Consola.error('Unable to handle entity state: ', state.error);
|
||||
throw new TRPCError({
|
||||
code: 'NOT_IMPLEMENTED',
|
||||
message: `Unable to handle Home Assistant entity state. This may be due to malformed response or unknown entity type. Check log for details`
|
||||
});
|
||||
}
|
||||
|
||||
if(!state.data) {
|
||||
throw new TRPCError({
|
||||
code: 'INTERNAL_SERVER_ERROR',
|
||||
message: `Home Assistant: Unable to connect to app '${instance.id}'. Check logs for details`
|
||||
});
|
||||
}
|
||||
|
||||
return state.data;
|
||||
}
|
||||
|
||||
return null;
|
||||
}),
|
||||
});
|
||||
Reference in New Issue
Block a user