{
  "version": "0.3",
  "meta": {
    "senml_registry": "https://www.iana.org/assignments/senml/senml.xhtml",
    "senml_rfc": "RFC 8428 (+ RFC 8798 secondary units)",
    "ucum": "https://ucum.org/",
    "qudt": "https://qudt.org/vocab/quantitykind/",
    "ha_device_class": "https://www.home-assistant.io/integrations/sensor/#device-class"
  },
  "meta_keys": [
    "id",
    "name",
    "mac",
    "type",
    "model",
    "model_id",
    "brand",
    "device",
    "manufacturerdata",
    "servicedata",
    "servicedatauuid",
    "cidc",
    "acts",
    "track_id",
    "aeskey",
    "mfid",
    "major",
    "minor",
    "uuid",
    "txpower",
    "cdepth",
    "track",
    "prmac",
    "batt_case",
    "batt_l",
    "batt_r",
    "charging_case",
    "charging_l",
    "charging_r"
  ],
  "forward_unknown": true,
  "measurands": [
    {
      "measurement": "temperature",
      "unit": "Cel",
      "kind": "continuous",
      "ha_device_class": "temperature",
      "qudt": "Temperature",
      "ucum": "Cel",
      "theengs_keys": [
        "tempc"
      ],
      "aliases": [
        {
          "key": "tempf",
          "transform": "f_to_c"
        }
      ],
      "notes": "\u00b0C canonical on the wire; display localizes to \u00b0F. tempc2..tempc6 (multi-probe) forward raw in v1.",
      "source": "sensor",
      "harvest": true
    },
    {
      "measurement": "humidity",
      "unit": "%RH",
      "kind": "continuous",
      "ha_device_class": "humidity",
      "qudt": "RelativeHumidity",
      "ucum": "%",
      "theengs_keys": [
        "hum"
      ],
      "source": "sensor",
      "harvest": true,
      "aliases": [],
      "notes": ""
    },
    {
      "measurement": "soil_moisture",
      "unit": "%",
      "kind": "continuous",
      "ha_device_class": "moisture",
      "qudt": "",
      "ucum": "%",
      "theengs_keys": [
        "moi"
      ],
      "notes": "Volumetric or relative depending on probe (e.g. Xiaomi flower-care).",
      "source": "sensor",
      "harvest": true,
      "aliases": []
    },
    {
      "measurement": "soil_conductivity",
      "unit": "uS/cm",
      "kind": "continuous",
      "ha_device_class": "",
      "qudt": "",
      "ucum": "uS/cm",
      "theengs_keys": [
        "fer"
      ],
      "notes": "Electrical conductivity / 'fertility' (Xiaomi flower-care fer key). Proxy for nutrient load.",
      "source": "sensor",
      "harvest": true,
      "aliases": []
    },
    {
      "measurement": "illuminance",
      "unit": "lx",
      "kind": "continuous",
      "ha_device_class": "illuminance",
      "qudt": "Illuminance",
      "ucum": "lx",
      "theengs_keys": [
        "lux"
      ],
      "source": "sensor",
      "harvest": true,
      "aliases": [],
      "notes": ""
    },
    {
      "measurement": "pressure",
      "unit": "hPa",
      "kind": "continuous",
      "ha_device_class": "atmospheric_pressure",
      "qudt": "Pressure",
      "ucum": "hPa",
      "theengs_keys": [
        "pres"
      ],
      "notes": "hPa (SenML secondary unit; = 100 Pa). Grower/weather convention.",
      "source": "sensor",
      "harvest": true,
      "aliases": []
    },
    {
      "measurement": "co2",
      "unit": "ppm",
      "kind": "continuous",
      "ha_device_class": "carbon_dioxide",
      "qudt": "",
      "ucum": "[ppm]",
      "theengs_keys": [
        "co2"
      ],
      "source": "sensor",
      "harvest": true,
      "aliases": [],
      "notes": ""
    },
    {
      "measurement": "pm25",
      "unit": "ug/m3",
      "kind": "continuous",
      "ha_device_class": "pm25",
      "qudt": "",
      "ucum": "ug/m3",
      "theengs_keys": [
        "pm25"
      ],
      "source": "sensor",
      "harvest": true,
      "aliases": [],
      "notes": ""
    },
    {
      "measurement": "pm10",
      "unit": "ug/m3",
      "kind": "continuous",
      "ha_device_class": "pm10",
      "qudt": "",
      "ucum": "ug/m3",
      "theengs_keys": [
        "pm10"
      ],
      "source": "sensor",
      "harvest": true,
      "aliases": [],
      "notes": ""
    },
    {
      "measurement": "pm1",
      "unit": "ug/m3",
      "kind": "continuous",
      "ha_device_class": "pm1",
      "qudt": "",
      "ucum": "ug/m3",
      "theengs_keys": [
        "pm1"
      ],
      "source": "sensor",
      "harvest": true,
      "aliases": [],
      "notes": ""
    },
    {
      "measurement": "tvoc",
      "unit": "ppb",
      "kind": "continuous",
      "ha_device_class": "volatile_organic_compounds_parts",
      "qudt": "",
      "ucum": "[ppb]",
      "theengs_keys": [
        "tvoc"
      ],
      "notes": "Total volatile organic compounds.",
      "source": "sensor",
      "harvest": true,
      "aliases": []
    },
    {
      "measurement": "formaldehyde",
      "unit": "mg/m3",
      "kind": "continuous",
      "ha_device_class": "",
      "qudt": "",
      "ucum": "mg/m3",
      "theengs_keys": [
        "hcho"
      ],
      "aliases": [
        {
          "key": "formaldehyde"
        }
      ],
      "notes": "HCHO. No standard HA device_class; carried as a plain measurement.",
      "source": "sensor",
      "harvest": true
    },
    {
      "measurement": "battery",
      "unit": "%",
      "kind": "gauge",
      "ha_device_class": "battery",
      "qudt": "",
      "ucum": "%",
      "theengs_keys": [
        "batt"
      ],
      "notes": "Charge remaining. Also carried as source.battery_pct for the HA discovery/availability path.",
      "source": "sensor",
      "harvest": true,
      "aliases": []
    },
    {
      "measurement": "voltage",
      "unit": "V",
      "kind": "gauge",
      "ha_device_class": "voltage",
      "qudt": "Voltage",
      "ucum": "V",
      "theengs_keys": [
        "volt"
      ],
      "source": "sensor",
      "harvest": true,
      "aliases": [],
      "notes": ""
    },
    {
      "measurement": "current",
      "unit": "A",
      "kind": "gauge",
      "ha_device_class": "current",
      "qudt": "ElectricCurrent",
      "ucum": "A",
      "theengs_keys": [
        "cur"
      ],
      "aliases": [
        {
          "key": "current"
        }
      ],
      "source": "sensor",
      "harvest": true,
      "notes": ""
    },
    {
      "measurement": "power",
      "unit": "W",
      "kind": "gauge",
      "ha_device_class": "power",
      "qudt": "Power",
      "ucum": "W",
      "theengs_keys": [
        "pow"
      ],
      "aliases": [
        {
          "key": "power"
        }
      ],
      "source": "sensor",
      "harvest": true,
      "notes": ""
    },
    {
      "measurement": "weight",
      "unit": "kg",
      "kind": "gauge",
      "ha_device_class": "weight",
      "qudt": "Mass",
      "ucum": "kg",
      "theengs_keys": [
        "weight"
      ],
      "source": "sensor",
      "harvest": true,
      "aliases": [],
      "notes": ""
    },
    {
      "measurement": "level",
      "unit": "%",
      "kind": "gauge",
      "ha_device_class": "",
      "qudt": "",
      "ucum": "%",
      "theengs_keys": [
        "level"
      ],
      "notes": "Tank / container fill level.",
      "source": "sensor",
      "harvest": true,
      "aliases": []
    },
    {
      "measurement": "rssi",
      "unit": "dBm",
      "kind": "gauge",
      "ha_device_class": "signal_strength",
      "qudt": "",
      "ucum": "",
      "theengs_keys": [],
      "harvest": false,
      "notes": "Link quality. Rides as source.rssi metadata on every reading, not as its own harvested message.",
      "source": "sensor",
      "aliases": []
    },
    {
      "measurement": "steps",
      "unit": "/",
      "kind": "cumulative",
      "ha_device_class": "",
      "qudt": "",
      "ucum": "{steps}",
      "theengs_keys": [
        "steps"
      ],
      "notes": "SenML '/' = a bare count/ratio. Delta-per-window is an endpoint concern.",
      "source": "sensor",
      "harvest": true,
      "aliases": []
    },
    {
      "measurement": "energy",
      "unit": "Wh",
      "kind": "cumulative",
      "ha_device_class": "energy",
      "qudt": "Energy",
      "ucum": "W.h",
      "theengs_keys": [
        "nrj"
      ],
      "aliases": [
        {
          "key": "energy"
        }
      ],
      "source": "sensor",
      "harvest": true,
      "notes": ""
    },
    {
      "measurement": "contact",
      "unit": "",
      "kind": "state",
      "ha_device_class": "opening",
      "qudt": "",
      "ucum": "",
      "theengs_keys": [
        "open"
      ],
      "aliases": [
        {
          "key": "contact"
        }
      ],
      "notes": "1 = open, 0 = closed. Door/window/lid.",
      "source": "sensor",
      "harvest": true
    },
    {
      "measurement": "motion",
      "unit": "",
      "kind": "state",
      "ha_device_class": "motion",
      "qudt": "",
      "ucum": "",
      "theengs_keys": [
        "motion"
      ],
      "aliases": [
        {
          "key": "pir"
        }
      ],
      "notes": "1 = motion detected.",
      "source": "sensor",
      "harvest": true
    },
    {
      "measurement": "presence",
      "unit": "",
      "kind": "state",
      "ha_device_class": "occupancy",
      "qudt": "",
      "ucum": "",
      "theengs_keys": [
        "presence"
      ],
      "notes": "1 = present/occupied. Synthesized by a listener for a recognized device that broadcasts only identity (a beacon/tracker in range).",
      "source": "sensor",
      "harvest": true,
      "aliases": []
    },
    {
      "measurement": "lock",
      "unit": "",
      "kind": "state",
      "ha_device_class": "lock",
      "qudt": "",
      "ucum": "",
      "theengs_keys": [
        "unlocked"
      ],
      "notes": "Smart-lock state (e.g. Yale/August). 1 = unlocked, 0 = locked (Theengs 'unlocked' key; HA lock device_class convention: on = unlocked).",
      "source": "sensor",
      "harvest": true,
      "aliases": []
    },
    {
      "measurement": "button",
      "unit": "",
      "kind": "event",
      "ha_device_class": "",
      "qudt": "",
      "ucum": "",
      "theengs_keys": [
        "button"
      ],
      "aliases": [
        {
          "key": "btn"
        }
      ],
      "notes": "Button interaction; summed per window.",
      "source": "sensor",
      "harvest": true
    },
    {
      "measurement": "dewpoint",
      "unit": "Cel",
      "kind": "continuous",
      "source": "derived",
      "harvest": false,
      "ha_device_class": "temperature",
      "qudt": "DewPointTemperature",
      "ucum": "Cel",
      "theengs_keys": [],
      "notes": "Endpoint derives from temperature + humidity when a device didn't send it.",
      "aliases": []
    },
    {
      "measurement": "vpd",
      "unit": "kPa",
      "kind": "continuous",
      "source": "derived",
      "harvest": false,
      "ha_device_class": "",
      "qudt": "",
      "ucum": "kPa",
      "theengs_keys": [],
      "notes": "Vapour Pressure Deficit \u2014 the headliner. AIR vpd from a BLE listener (no leaf temp). Endpoint-derived from temperature + humidity.",
      "aliases": []
    }
  ]
}
