diff --git a/app/models/device.server.ts b/app/models/device.server.ts index 3a232cf8..252e78c0 100644 --- a/app/models/device.server.ts +++ b/app/models/device.server.ts @@ -690,13 +690,28 @@ export async function createDevice(deviceData: any, userId: string) { // If model is specified but sensors are not, get sensors from model layout if (deviceData.model && !deviceData.sensors) { const modelSensors = getSensorsForModel(deviceData.model as any) - if (modelSensors) { + + if (!Array.isArray(modelSensors) && deviceData.model?.toLowerCase() !== 'custom') { + throw new Error(`Unknown model: ${deviceData.model}`) + } + + if ( + Array.isArray(deviceData.sensorTemplates) && + deviceData.sensorTemplates.length > 0 + ) { + sensorsToAdd = modelSensors.filter(sensor => + deviceData.sensorTemplates.includes( + sensor.sensorType.toLowerCase() + ) + ) + } else { sensorsToAdd = modelSensors } - } + } + if (deviceData.model?.toLowerCase() === 'custom' && deviceData.sensors) { - sensorsToAdd = deviceData.sensors + sensorsToAdd = deviceData.sensors ?? [] } // Create the device diff --git a/app/routes/device.new.tsx b/app/routes/device.new.tsx index 2f6f45b0..468cb00d 100644 --- a/app/routes/device.new.tsx +++ b/app/routes/device.new.tsx @@ -25,6 +25,8 @@ export async function action({ request }: ActionFunctionArgs) { const data = JSON.parse(rawData); + const selectedSensors = data["sensor-selection"].selectedSensors + const devicePayload = { name: data["general-info"].name, exposure: data["general-info"].exposure, @@ -32,24 +34,28 @@ export async function action({ request }: ActionFunctionArgs) { tags: data["general-info"].tags?.map((tag: { value: string }) => tag.value) || [], latitude: data.location.latitude, longitude: data.location.longitude, - // Only include model if NOT custom - ...(data["device-selection"].model !== 'custom' && { - model: data["device-selection"].model + + ...(data["device-selection"].model !== "custom" && { + model: data["device-selection"].model, + + sensorTemplates: selectedSensors.map( + (sensor: any) => sensor.sensorType.toLowerCase() + ), }), - // Only include sensors if custom - ...(data["device-selection"].model === 'custom' && { - sensors: data["sensor-selection"].selectedSensors.map( - (sensor: any) => ({ - title: sensor.title, - sensorType: sensor.sensorType, - unit: sensor.unit, - icon: sensor.icon, - }) - ) + + ...(data["device-selection"].model === "custom" && { + sensors: selectedSensors.map((sensor: any) => ({ + title: sensor.title, + sensorType: sensor.sensorType, + unit: sensor.unit, + icon: sensor.icon, + })), }), + mqttEnabled: data.advanced.mqttEnabled ?? false, ttnEnabled: data.advanced.ttnEnabled ?? false, - }; + } + // Call server function const newDevice = await createDevice(devicePayload, userId); diff --git a/app/utils/model-definitions.ts b/app/utils/model-definitions.ts index 77218258..d46e2510 100644 --- a/app/utils/model-definitions.ts +++ b/app/utils/model-definitions.ts @@ -1,30 +1,37 @@ import { sensorDefinitions } from './sensor-definitions' +const senseBoxHomeV2 = [ + sensorDefinitions.hdc1080_temperature, + sensorDefinitions.hdc1080_humidity, + sensorDefinitions.bmp280_pressure, + sensorDefinitions.tsl45315_lightintensity, + sensorDefinitions.veml6070_uvintensity, + sensorDefinitions.sds011_pm10, + sensorDefinitions.sds011_pm25, + sensorDefinitions.bme680_humidity, + sensorDefinitions.bme680_temperature, + sensorDefinitions.bme680_pressure, + sensorDefinitions.bme680_voc, + sensorDefinitions.smt50_soilmoisture, + sensorDefinitions.smt50_soiltemperature, + sensorDefinitions.soundlevelmeter, + sensorDefinitions.windspeed, + sensorDefinitions.scd30_co2, + sensorDefinitions.dps310_pressure, + sensorDefinitions.sps30_pm1, + sensorDefinitions.sps30_pm4, + sensorDefinitions.sps30_pm10, + sensorDefinitions.sps30_pm25, +] + // Models Definition export const modelDefinitions = { - senseBoxHomeV2: [ - sensorDefinitions.hdc1080_temperature, - sensorDefinitions.hdc1080_humidity, - sensorDefinitions.bmp280_pressure, - sensorDefinitions.tsl45315_lightintensity, - sensorDefinitions.veml6070_uvintensity, - sensorDefinitions.sds011_pm10, - sensorDefinitions.sds011_pm25, - sensorDefinitions.bme680_humidity, - sensorDefinitions.bme680_temperature, - sensorDefinitions.bme680_pressure, - sensorDefinitions.bme680_voc, - sensorDefinitions.smt50_soilmoisture, - sensorDefinitions.smt50_soiltemperature, - sensorDefinitions.soundlevelmeter, - sensorDefinitions.windspeed, - sensorDefinitions.scd30_co2, - sensorDefinitions.dps310_pressure, - sensorDefinitions.sps30_pm1, - sensorDefinitions.sps30_pm4, - sensorDefinitions.sps30_pm10, - sensorDefinitions.sps30_pm25, - ], + senseBoxHomeV2, + homeV2Lora: senseBoxHomeV2, + homeV2Ethernet: senseBoxHomeV2, + homeV2EthernetFeinstaub: senseBoxHomeV2, + homeV2Wifi: senseBoxHomeV2, + homeV2WifiFeinstaub: senseBoxHomeV2, 'senseBox:Edu': [ sensorDefinitions.hdc1080_temperature, sensorDefinitions.hdc1080_humidity,