{"ok":true,"data":{"version":"1.0","ingestTokenHeader":"X-IoT-Token","defaultTokenHint":"farm-iot-demo (set IOT_INGEST_TOKEN)","metrics":[{"metric":"air_temp","name":"空气温度","unit":"℃","aliases":["空气温度","气温","温度","Temp"],"warnLow":-5,"warnHigh":42,"criticalHigh":48},{"metric":"air_humidity","name":"空气湿度","unit":"%RH","aliases":["空气湿度","湿度","相对湿度","Humidity"],"warnLow":20,"warnHigh":95},{"metric":"soil_temp","name":"土壤温度","unit":"℃","aliases":["土壤温度","土温","Soil Temperature","ST"],"warnLow":0,"warnHigh":40},{"metric":"soil_moisture","name":"土壤湿度","unit":"%","aliases":["土壤湿度","土壤墒情","土湿","Moisture","SMO"],"warnLow":25,"warnHigh":90,"criticalLow":15},{"metric":"soil_ec","name":"土壤电导率","unit":"uS/cm","aliases":["EC","电导率","土壤EC","Soil EC","SEC"],"warnHigh":3000},{"metric":"soil_salinity","name":"土壤盐分","unit":"mg/L","aliases":["土壤盐分","盐分","Soil Salinity","SS"],"warnHigh":5000},{"metric":"soil_n","name":"土壤氮含量","unit":"mg/kg","aliases":["土壤氮","氮含量","Soil N","SN"]},{"metric":"soil_p","name":"土壤磷含量","unit":"mg/kg","aliases":["土壤磷","磷含量","Soil P","SP"]},{"metric":"soil_k","name":"土壤钾含量","unit":"mg/kg","aliases":["土壤钾","钾含量","Soil K","SK"]},{"metric":"soil_ph","name":"土壤pH值","unit":"","aliases":["pH","酸碱度","土壤pH","Soil pH","SPH"],"warnLow":5,"warnHigh":8.5},{"metric":"signal_4g","name":"4G信号强度","unit":"","aliases":["4G","信号强度","CSQ"]},{"metric":"battery_voltage","name":"电池电压","unit":"V","aliases":["电池","电压","BV"],"warnLow":3.3},{"metric":"battery_charge","name":"电池电量","unit":"%","aliases":["电量","SOC","batteryCharge"],"warnLow":20},{"metric":"battery_current","name":"电池电流","unit":"A","aliases":["电池电流","batteryCurrent"]},{"metric":"battery_temp","name":"电池温度","unit":"℃","aliases":["电池温度","batteryTemperature"]},{"metric":"pv_voltage","name":"光伏电压","unit":"V","aliases":["光伏电压","太阳能电压","pvVoltage"]},{"metric":"pv_current","name":"光伏电流","unit":"A","aliases":["光伏电流","pvCurrent"]},{"metric":"pv_power","name":"光伏功率","unit":"W","aliases":["光伏功率","太阳能功率","pvPower"]},{"metric":"load_voltage","name":"负载电压","unit":"V","aliases":["负载电压","loadVoltage"]},{"metric":"load_current","name":"负载电流","unit":"A","aliases":["负载电流","loadCurrent"]},{"metric":"load_power","name":"负载功率","unit":"W","aliases":["负载功率","loadPower"]},{"metric":"env_temp","name":"环境温度","unit":"℃","aliases":["环境温度","environmentTemperature"]},{"metric":"lamp_on_off","name":"灯开关","unit":"","aliases":["灯开关","lampOnOff"]},{"metric":"lamp_bright","name":"亮度","unit":"%","aliases":["亮度","调光","lampBright","brightness"]},{"metric":"lamp_power","name":"灯功率","unit":"W","aliases":["灯功率","lampPower"]},{"metric":"light","name":"光照强度","unit":"lux","aliases":["光照","照度","Lux"],"warnLow":50},{"metric":"pest_count","name":"虫害诱捕数","unit":"只","aliases":["虫害","诱捕","虫情","pest"],"warnHigh":20,"criticalHigh":50},{"metric":"pesticide_residue","name":"农药残留","unit":"mg/kg","aliases":["农药","残留","农残"],"warnHigh":0.05,"criticalHigh":0.1},{"metric":"co2","name":"二氧化碳","unit":"ppm","aliases":["CO2","二氧化碳"],"warnHigh":1500},{"metric":"rainfall","name":"降雨量","unit":"mm","aliases":["降雨","雨量"]},{"metric":"wind_speed","name":"风速","unit":"m/s","aliases":["风速"]}],"samples":{"temperatureHumidity":{"protocol":"QG-GB-COLLECTOR/1.0","deviceId":"dev_th_a12","plotCode":"A-12","timestamp":"2026-09-11T05:04:18.577Z","metrics":[{"metric":"air_temp","value":26.5,"unit":"�C","quality":0},{"metric":"air_humidity","value":68,"unit":"%RH","quality":0}]},"pestTrap":{"protocol":"QG-GB-COLLECTOR/1.0","deviceId":"dev_pest_a12","plotCode":"A-12","metrics":[{"metric":"pest_count","value":4,"unit":"?","quality":0}]},"pesticide":{"protocol":"QG-GB-COLLECTOR/1.0","deviceId":"dev_pestcide_a12","plotCode":"A-12","metrics":[{"metric":"pesticide_residue","value":0.02,"unit":"mg/kg","quality":0}]},"flat":{"deviceId":"dev_th_a12","air_temp":27.1,"air_humidity":71,"soil_moisture":55}},"modbusMaps":{"th_soil":[{"metric":"air_temp","address":0,"type":"int16","scale":0.1,"unit":"�C","desc":"???? �0.1"},{"metric":"air_humidity","address":1,"type":"int16","scale":0.1,"unit":"%RH","desc":"???? �0.1"},{"metric":"soil_temp","address":2,"type":"int16","scale":0.1,"unit":"�C","desc":"???? �0.1"},{"metric":"soil_moisture","address":3,"type":"uint16","scale":0.1,"unit":"%","desc":"????? �0.1"},{"metric":"soil_ec","address":4,"type":"uint16","scale":1,"unit":"?S/cm","desc":"?????"},{"metric":"soil_ph","address":5,"type":"uint16","scale":0.01,"unit":"","desc":"?? pH �0.01"}],"pest":[{"metric":"pest_count","address":0,"type":"uint16","scale":1,"unit":"?","desc":"??????"}],"pesticide":[{"metric":"pesticide_residue","address":0,"type":"uint16","scale":0.001,"unit":"mg/kg","desc":"???? �0.001"}]},"endpoints":{"ingest":"POST /api/iot/ingest","ingestBatch":"POST /api/iot/ingest/batch","modbusWebhook":"POST /api/iot/webhooks/modbus","mqttWebhook":"POST /api/iot/webhooks/mqtt","devices":"GET|POST /api/iot/devices","probe":"POST /api/iot/devices/:id/probe","readings":"GET /api/iot/readings","cameras":"GET /api/iot/cameras","snapshot":"GET /api/iot/cameras/:id/snapshot","preview":"GET /api/iot/cameras/:id/preview（含 playUrl/hlsUrl 供浏览器；rtspUrl 可选）","ptz":"POST /api/iot/cameras/:id/ptz","alerts":"GET /api/iot/alerts","deleteAlert":"DELETE /api/iot/alerts/:id（仅超级管理员）","deleteAlertsBatch":"DELETE /api/iot/alerts（body: { ids: [] }，仅超级管理员）","mordeniotStatus":"GET /api/iot/mordeniot/status","mordeniotDevices":"GET /api/iot/mordeniot/devices","mordeniotSoil":"GET /api/iot/mordeniot/soil/:id","mordeniotCurve":"GET /api/iot/mordeniot/curve?id=&passageId=","mordeniotSync":"POST /api/iot/mordeniot/sync","mordeniotThresholds":"GET|PUT /api/iot/mordeniot/thresholds","mordeniotToken":"PUT /api/iot/mordeniot/token（粘贴 JWT，运行时生效）","mordeniotTokenFetch":"POST /api/iot/mordeniot/token/fetch（用 .env 账号密码自动登录取 JWT）","mordeniotCaptcha":"GET /api/iot/mordeniot/captcha（摩登图形验证码）","solarStatus":"GET /api/iot/solar/status","solarDevices":"GET /api/iot/solar/devices","solarRealtime":"GET /api/iot/solar/device/:id","solarChart":"GET /api/iot/solar/chart?id=","solarSync":"POST /api/iot/solar/sync","solarEnv":"GET /api/iot/solar/env/:plotId（地块绑定后的太阳能快照）","solarControl":"POST /api/iot/solar/control","solarDim":"POST /api/iot/solar/dim","solarSyncStatus":"POST /api/iot/solar/sync-status"},"mordeniot":{"platform":"https://iot.mordeniot.com","apiBase":"https://iot.josiot.com (MORDENIOT_BASE_URL)","skipVideo":true,"metrics":["土壤温度/湿度/电导率/盐分/氮磷钾/pH","4G信号","电池电压","采集时间/间隔","在线状态"]},"solarLighting":{"platform":"智慧照明平台 · 太阳能 API V1.0.5","apiBase":"SOLAR_BASE_URL / LIGHTING_BASE_URL（开通授权后填写）","skipCameraImages":true,"auth":"POST /api/auth/getToken · sign=sha256(appId&appKey&appSecret&timestamp)","metrics":["电池电压/电量/电流/温度","光伏电压/电流/功率","负载电压/电流/功率","环境温度","信号","灯开关/亮度/功率","更新时间/最后上报/在线/累计运行"],"control":["开关 control","调光 controlBrightness","同步状态 syncStatus"]},"browserLive":{"player":"admin-iot：hls.js；会员：camera-live.js","ys7":"preview 拉萤石 HLS；YS7_TRANSCODE_ENABLED=1 时 ffmpeg 转 H.264；会员 GET /api/garden/live?plotId=","hikvision":"preview 按设备 RTSP 启 garden-live（ffmpeg）；可编辑 config.rtspUrl / channel / stream"},"hikvision":{"rtsp":"rtsp://user:pass@ip:554/Streaming/Channels/{channel*100+stream}","snapshot":"GET /ISAPI/Streaming/channels/{id}/picture?snapShotImageType=JPEG","ptz":"PUT /ISAPI/PTZCtrl/channels/{ch}/continuous"}}}