247 lines
5.9 KiB
TypeScript
247 lines
5.9 KiB
TypeScript
import http from './http'
|
|
|
|
export type HealthUser = {
|
|
id: number
|
|
phone: string
|
|
displayName: string
|
|
avatarUrl?: string
|
|
}
|
|
|
|
export type AuthOutput = {
|
|
accessToken: string
|
|
refreshToken: string
|
|
user: HealthUser
|
|
}
|
|
|
|
export type HealthProfile = {
|
|
birthday?: string
|
|
gender?: string
|
|
heightCm?: number
|
|
weightKg?: number
|
|
averageSleepHours?: number
|
|
dailyExerciseMinutes?: number
|
|
dietPreference?: string
|
|
healthGoal?: string
|
|
}
|
|
|
|
export type PlanItem = {
|
|
moduleCode: string
|
|
title: string
|
|
target: string
|
|
advice: string
|
|
}
|
|
|
|
export type HealthPlan = {
|
|
id: number
|
|
version: number
|
|
title: string
|
|
summary: string
|
|
createTime: string
|
|
items: PlanItem[]
|
|
}
|
|
|
|
export type PersonalizedSceneConfig = {
|
|
targetHumidity: number
|
|
dehumidifierMode: string
|
|
fanLevel: string
|
|
enableUv: boolean
|
|
lightBrightnessPercent: number
|
|
lightColorTemperatureKelvin: number
|
|
mattressTargetTemp: number
|
|
mattressLeftFirmness: number
|
|
mattressRightFirmness: number
|
|
mattressHeatingLevel: number
|
|
mattressMode: string
|
|
enableFragrance: boolean
|
|
fragranceLevel: number
|
|
enableSpeakerSleepMode: boolean
|
|
speakerAudioMode: string
|
|
speakerVolumePercent: number
|
|
}
|
|
|
|
export type HealthAssessmentAnswers = {
|
|
sleepDuration: string
|
|
fallingAsleepSpeed: string
|
|
temperaturePreference: string
|
|
nightAwakening: string
|
|
mattressPreference: string
|
|
exerciseFrequency: string
|
|
muscleFatigueArea: string
|
|
activeTimeOfDay: string
|
|
mealRegularity: string
|
|
flavorPreference: string
|
|
lateNightEating: string
|
|
dailyWaterIntake: string
|
|
}
|
|
|
|
export type SaveHealthAssessmentInput = {
|
|
basicInfo: HealthProfile
|
|
answers: HealthAssessmentAnswers
|
|
}
|
|
|
|
export type HealthAssessmentOutput = {
|
|
hasCompletedAssessment: boolean
|
|
basicInfo: HealthProfile
|
|
answers: HealthAssessmentAnswers
|
|
sceneConfig: PersonalizedSceneConfig
|
|
bmi?: number | null
|
|
bmiStatus: string
|
|
}
|
|
|
|
export type Dashboard = {
|
|
user: HealthUser
|
|
profile?: HealthProfile
|
|
selectedModules: string[]
|
|
currentPlan?: HealthPlan
|
|
hasCompletedAssessment: boolean
|
|
bmi?: number | null
|
|
bmiStatus?: string
|
|
sceneConfig?: PersonalizedSceneConfig
|
|
}
|
|
|
|
export type HealthDeviceCategory =
|
|
| 'EnvironmentControl'
|
|
| 'EnvironmentSensor'
|
|
| 'Sleep'
|
|
| 'BodyComposition'
|
|
| 'Fragrance'
|
|
| 'Lighting'
|
|
| 'Media'
|
|
| 'Other'
|
|
|
|
export type HomeAssistantEntity = {
|
|
entityId: string
|
|
domain: string
|
|
name: string
|
|
state: string
|
|
available: boolean
|
|
unit?: string
|
|
attributes?: Record<string, unknown>
|
|
}
|
|
|
|
export type HomeAssistantDiscoveredDevice = {
|
|
deviceId: string
|
|
name: string
|
|
manufacturer: string
|
|
model: string
|
|
areaName?: string
|
|
category: HealthDeviceCategory | string
|
|
online: boolean
|
|
primaryControlEntityId?: string | null
|
|
entities: HomeAssistantEntity[]
|
|
metrics?: Record<string, unknown>
|
|
}
|
|
|
|
export type HomeAssistantSummary = {
|
|
totalDevices: number
|
|
onlineDevices: number
|
|
offlineDevices: number
|
|
totalEntities: number
|
|
availableEntities: number
|
|
}
|
|
|
|
export type HomeAssistantSceneDevicesSummary = {
|
|
total: number
|
|
available: number
|
|
}
|
|
|
|
export type HomeAssistantEnvironmentData = {
|
|
temperature?: number | null
|
|
humidity?: number | null
|
|
pm25?: number | null
|
|
pm10?: number | null
|
|
co2?: number | null
|
|
hcho?: number | null
|
|
tvoc?: number | null
|
|
}
|
|
|
|
export type HomeAssistantScenePreset = {
|
|
deviceName: string
|
|
category: string
|
|
entityId: string
|
|
available: boolean
|
|
availabilityMessage: string
|
|
action: string
|
|
detail: string
|
|
parameters: Record<string, unknown>
|
|
}
|
|
|
|
export type HomeAssistantDeviceSwitchOutput = {
|
|
success: boolean
|
|
deviceId: string
|
|
entityId: string
|
|
state: string
|
|
message: string
|
|
}
|
|
|
|
export type HomeAssistantStatus = {
|
|
connected: boolean
|
|
message: string
|
|
checkedAt: string
|
|
summary: HomeAssistantSummary
|
|
devices: HomeAssistantDiscoveredDevice[]
|
|
sceneDevices: HomeAssistantSceneDevicesSummary
|
|
environment: HomeAssistantEnvironmentData
|
|
scenePresets?: HomeAssistantScenePreset[]
|
|
controlParameters?: Record<string, HomeAssistantParameterState>
|
|
}
|
|
|
|
export type HomeAssistantParameterState = {
|
|
entityId: string
|
|
state: string
|
|
available: boolean
|
|
attributes?: Record<string, unknown>
|
|
}
|
|
|
|
export type HomeAssistantSceneAction = {
|
|
name: string
|
|
entityId: string
|
|
status: string
|
|
message: string
|
|
}
|
|
|
|
export type HomeAssistantSceneResult = {
|
|
sceneCode: string
|
|
sceneName: string
|
|
success: boolean
|
|
status: string
|
|
message: string
|
|
executedAt: string
|
|
actions: HomeAssistantSceneAction[]
|
|
}
|
|
|
|
export type HomeAssistantSetParameterInput = {
|
|
deviceId: string
|
|
entityId?: string
|
|
parameterType: string
|
|
value: unknown
|
|
}
|
|
|
|
export type HomeAssistantSetParameterOutput = {
|
|
success: boolean
|
|
deviceId: string
|
|
parameterType: string
|
|
message: string
|
|
}
|
|
|
|
export const healthApi = {
|
|
register: (payload: { phone: string; password: string; displayName: string }) =>
|
|
http.post<never, AuthOutput>('/api/health/auth/register', payload),
|
|
login: (payload: { phone: string; password: string }) =>
|
|
http.post<never, AuthOutput>('/api/health/auth/login', payload),
|
|
dashboard: () => http.get<never, Dashboard>('/api/health/dashboard'),
|
|
getAssessment: () => http.get<never, HealthAssessmentOutput>('/api/health/assessment'),
|
|
saveAssessment: (payload: SaveHealthAssessmentInput) =>
|
|
http.post<never, HealthAssessmentOutput>('/api/health/assessment', payload),
|
|
homeAssistantStatus: () =>
|
|
http.get<never, HomeAssistantStatus>('/api/health/home-assistant/status'),
|
|
executeSleepScene: () =>
|
|
http.post<never, HomeAssistantSceneResult>('/api/health/home-assistant/scenes/sleep'),
|
|
executeAllOffScene: () =>
|
|
http.post<never, HomeAssistantSceneResult>('/api/health/home-assistant/scenes/all-off'),
|
|
switchDevice: (payload: { deviceId: string; turnOn: boolean; entityId?: string }) =>
|
|
http.post<never, HomeAssistantDeviceSwitchOutput>('/api/health/home-assistant/devices/switch', payload),
|
|
setParameter: (payload: HomeAssistantSetParameterInput) =>
|
|
http.post<never, HomeAssistantSetParameterOutput>('/api/health/home-assistant/devices/set-parameter', payload)
|
|
}
|