Device API Documentation
Build your own applications for Blue Maestro environmental logging devices. Complete BLE protocol reference for iOS and Android development.
1. Overview
This documentation provides comprehensive technical details for developing applications that communicate with Blue Maestro environmental logging devices (versions 13, 23, 27, 41, 42, and 43).
1.1 Device Versions Summary
| Version | Sensors | Precision | Max Logs | Features |
|---|---|---|---|---|
13 | Temperature | 0.1C | 20,000 | Basic temperature logging |
23 | Temp, Humidity, Dew Point | 0.1 | 6,000 | Multi-sensor logging |
27 | Temp, Humidity, Pressure, Dew Point | 0.1 | 6,000 | Environmental monitoring |
41 | Temperature | 0.01C | 100,000 | High precision, extended features |
42 | Temp, Humidity, Dew Point | 0.01 | 50,000 | High precision, alerts |
43 | Temp, Humidity, Pressure, Dew Point | 0.01 | 25,000 | Full environmental suite |
1.2 Device Generations
Legacy Devices (v13, v23, v27)
- Settings stored locally on phone only
- Commands prefixed with
*(asterisk) - 0.1 precision (divide raw values by 10)
- No device-side calibration storage
Modern Devices (v41, v42, v43)
- Settings stored on device via BLE commands
- Direct commands (no asterisk prefix)
- 0.01 precision (divide raw values by 100)
- Device-side storage for calibration, alerts, and settings
- Enhanced flag byte in advertisement
1.3 Product Reference
Use the table below to identify which Blue Maestro products correspond to each device version:
2. Device Identification
2.1 Manufacturer Identification
Blue Maestro devices are identified by their manufacturer data header:
Byte 0: 0x33 (51 decimal)
Byte 1: 0x01 (1 decimal)2.2 Version Detection
The device version is located at byte offset +2 from the manufacturer data start:
Byte 2: Device Version (13, 23, 27, 41, 42, or 43)2.3 Platform-Specific Advertisement Position
| Platform | Advertisement Data Location |
|---|---|
| iOS | advertisement.manufacturerData - Start at position 0 |
| Android | rawManufacturerData - Search for 0xFF byte, start after it |
Find position where byte == 0xFF (255)
Start parsing at position + 13. Advertisement Packet Parsing
3.1 Version 13 (Temperature Logger)
Total Advertisement Size: ~14 bytes (plus manufacturer header)
| Offset | Field | Type | Scale | Description |
|---|---|---|---|---|
| 0-1 | Manufacturer ID | uint8[2] | - | 0x33, 0x01 |
| 2 | Version | uint8 | - | 13 |
| 3 | Battery | uint8 | 1% | Battery percentage |
| 4-5 | Interval | uint16 BE | 1s | Logging interval (seconds) |
| 6-7 | Log Count | uint16 BE | 1 | Number of stored logs |
| 8-9 | Temperature | int16 BE | /10 | Temperature in 0.1C |
const battery = data[pos + 3];
const interval = (data[pos + 4] << 8) | data[pos + 5];
const logCount = (data[pos + 6] << 8) | data[pos + 7];
const tempRaw = (data[pos + 8] << 8) | data[pos + 9];
const temperature = (tempRaw > 32767 ? tempRaw - 65536 : tempRaw) / 10;3.2 Version 23 (Temperature/Humidity Logger)
Total Advertisement Size: ~16 bytes (plus manufacturer header)
Same as v13 plus humidity at offset 10-11 (uint16 BE, divide by 10 for %RH)
function calculateDewpoint(tempC, humidityPct) {
const a = 17.27;
const b = 237.7;
const alpha = ((a * tempC) / (b + tempC)) + Math.log(humidityPct / 100);
return (b * alpha) / (a - alpha);
}3.3 Version 27 (Temperature/Humidity/Pressure Logger)
Total Advertisement Size: ~18 bytes (plus manufacturer header)
Same as v23 plus pressure at offset 12-13 (uint16 BE, value in hPa)
3.4 Version 41 (High-Precision Temperature Logger)
Total Advertisement Size: 19 bytes (plus manufacturer header)
| Offset | Field | Type | Scale | Description |
|---|---|---|---|---|
| 0-1 | Manufacturer ID | uint8[2] | - | 0x33, 0x01 |
| 2 | Version | uint8 | - | 41 |
| 3 | Battery | uint8 | 1% | Battery percentage |
| 4-7 | Interval | uint32 BE | /10 | Logging interval (deciseconds) |
| 8-11 | Log Count | uint32 BE | 1 | Number of stored logs |
| 12-15 | MAC Address | uint8[4] | - | MAC (reversed order) |
| 16 | Flags | uint8 | - | Device status flags |
| 17-18 | Temperature | int16 BE | /100 | Temperature in 0.01C |
Flags Byte (Offset 16) Bit Definitions
| Bit | Name | Description |
|---|---|---|
| 0 | Locked | Device is PIN-locked |
| 1 | CalibrationOn | Calibration is active |
| 2 | AlertsOn | Alerts are enabled |
| 3 | GreyScale | Device in standby/inactive |
| 4 | Button | Physical button enabled |
| 5 | LED | LED indicator enabled |
| 6 | AirplaneMode | Bluetooth broadcast off |
| 7 | DelayedStart | Delayed logging start configured |
3.5 Version 42 (High-Precision Temperature/Humidity Logger)
Total Advertisement Size: 21 bytes
Same as v41 plus humidity at offset 19-20 (int16 BE, divide by 100 for %RH)
3.6 Version 43 (High-Precision Full Environmental Logger)
Total Advertisement Size: 25 bytes
Same as v42 plus pressure at offset 21-24 (int32 BE, value in Pa)
4. BLE Communication Protocol
4.1 Service UUIDs
Service UUID: 6E400001-B5A3-F393-E0A9-E50E24DCCA9E
RX Characteristic: 6E400002-B5A3-F393-E0A9-E50E24DCCA9E (Write - App to Device)
TX Characteristic: 6E400003-B5A3-F393-E0A9-E50E24DCCA9E (Notify - Device to App)Service UUID: 6E400001-9489-44E4-9E39-60BA18464A30
Indicator: 6E400002-9489-44E4-9E39-60BA18464A30 (Notify)4.2 Connection Sequence
- Scan for devices with manufacturer data starting with
0x33 0x01 - Connect to device using BLE address
- Discover Services and characteristics
- Subscribe to TX characteristic for notifications
- Write commands to RX characteristic
- Receive responses via TX notifications
4.3 Command Transmission
Commands are transmitted as ASCII strings via the NUS RX characteristic.
Chunking Rules
- Maximum chunk size: 20 bytes
- Delay between chunks: 100ms
- Commands ≤20 bytes: Single write
- Commands >20 bytes: Split into 20-byte chunks
5. Device Commands
5.1 Command Format
Commands are sent over Bluetooth Nordic UART Service (NUS) after connecting to the device.
<command>~<value>- Commands are case-insensitive
- Use
~as delimiter between command and value - Some commands don't require a value
Response Format:
OKorOK: <message>- SuccessERRor custom error message - Failure- Device typically disconnects after sending response
5.2 Command Summary Table
| Command | Parameters | Requires Unlock | Description |
|---|---|---|---|
log | number/all | No | Download logs |
logall | none | No | Download all logs |
setlog | seconds | Yes | Set logging interval (1-86400s) |
pin | 4-digit | No | Set/clear device PIN lock |
airplane | none | Yes | Toggle airplane mode |
button | none | Yes | Toggle button enable/disable |
led | none | Yes | Toggle LED enable/disable |
info | none | No | Get device information |
rcal | none | No | Read calibration values |
wcal | version-specific | Yes | Write calibration offsets |
rstrng | none | No | Read user string |
wstrng | len~string | Yes | Write user string (max 500 chars) |
clr | none | Yes | Clear all logs |
dellogs | none | Yes | Delete logs |
reset | none | Yes | Factory reset device |
off | none | Yes | Power off device |
name | string | Yes | Set device name (max 20 chars) |
txpwr | dBm | Yes | Set TX power (4, 0, -4, -8) |
blink | seconds | No | Blink LED (1-30s) |
delay | seconds | Yes | Delayed logging start |
5.3 Legacy Command Reference (v13, v23, v27)
Legacy devices use asterisk (*) prefixed commands with values appended directly (no separator).
Legacy Command Summary
| Command | Format | Description |
|---|---|---|
*logall | *logall | Download all logs |
*logtemp | *logtemp<pos> | Download temperature log from position |
*loghumi | *loghumi<pos> | Download humidity log from position |
*logdewp | *logdewp<pos> | Download dewpoint log from position |
*logntemp | *logntemp<pos> | Download temp log (stay connected) |
*lognhumi | *lognhumi<pos> | Download humidity log (stay connected) |
*lint | *lint<seconds> | Set logging interval (2-86400s) |
*sint | *sint<seconds> | Set sensor/advertising interval |
*clr | *clr | Clear all stored logs |
*pwd | *pwd<4-digit> | Set or enter password |
*nam | *nam<name> | Set device name (max 8 chars) |
*txp | *txp<0-2> | TX power (0=+4dBm, 1=0dBm, 2=-4dBm) |
*led | *led | Toggle LED on/off |
*airon | *airon | Enable airplane mode |
*airoff | *airoff | Disable airplane mode |
*rboot | *rboot | Reboot device |
*dfu | *dfu | Enter DFU/bootloader mode |
*shp | *shp | Enter shipping/deep sleep |
*info | *info | Get device settings info |
*tell | *tell | Stream telemetric data |
*batt | *batt | Get battery level |
*bur | *bur | Enable burst/streaming mode |
*qq | Force disconnect | |
*unitsc | *unitsc | Set units to Celsius |
*unitsf | *unitsf | Set units to Fahrenheit |
*alrm1t | *alrm1t<op><val> | Set alarm 1 temperature threshold |
*alrm2t | *alrm2t<op><val> | Set alarm 2 temperature threshold |
*alrm1h | *alrm1h<op><val> | Set alarm 1 humidity threshold |
*alrm2h | *alrm2h<op><val> | Set alarm 2 humidity threshold |
*alrmi | *alrmi | Get alarm information |
*alrmclr | *alrmclr | Clear all alarms |
Legacy Command Examples
*logall // Download all logs (disconnects after)
*logtemp100 // Download temp logs from record 100
*loghumi0 // Download all humidity logs
*logntemp50 // Download temp logs, stay connected*lint60 // Log every 60 seconds
*lint3600 // Log every hour
*namMyDisc // Set device name to "MyDisc"
*txp0 // Set to +4 dBm (max range)
*pwd1234 // Set/enter password// Format: *alrm<1|2><t|h|d><operator><value>
// Operators: > (above), < (below), = (equals)
*alrm1t>25 // Alarm 1: temp above 25°C
*alrm2t<10 // Alarm 2: temp below 10°C
*alrm1h>80 // Alarm 1: humidity above 80%Legacy Data Format
Legacy devices store values with 0.1 precision (divide raw value by 10):
| Version | Sensors | Bytes/Record | Data Format |
|---|---|---|---|
| v13 | Temperature | 2 | int16_t temp |
| v23 | Temp + Humidity | 4 | int16_t temp, int16_t humidity |
| v27 | Temp + Hum + Dewpoint | 6 | int16_t temp, hum, dewpoint |
5.4 Detailed Command Reference (v41, v42, v43)
Airplane Mode
Toggles airplane mode on/off. Designed for battery conservation and RF-restricted environments.
airplane // No value needed
Response: OK: Airplane mode toggledRequirements: Device must be unlocked (no PIN set, or correct PIN previously entered)
Airplane Mode Behavior
When Enabling (OFF → ON):
- FLAG_AIRPLANE (bit 6) is set immediately
- Device continues advertising for 5 minutes (grace period)
- After 5 minutes, BLE advertising stops completely
- All existing connections are disconnected
- Setting persists across reboots
Recovery: Press device button → advertising enabled for 5 minutes → connect and send airplane command
PIN Security
pin~1234 // Set PIN to 1234 (locks device)
pin~5678 // If locked with 1234, this fails
pin~1234 // If already locked with 1234, unlocks and clears PIN
Response:
- OK: New PIN set and device locked
- OK: Device unlocked successfully and PIN cleared
- ERR: Incorrect PINLogging Interval
setlog~60 // Log every 60 seconds (1 minute)
setlog~3600 // Log every hour
Response: OK: Logging interval updated successfully
// Side effects: Resets log counters, clears buffer memoryCalibration
// Version 41 (temperature only)
wcal~-50 // Temp offset -0.50°C (-0.90°F)
// Version 42 (temperature + humidity)
wcal~-50,25 // Temp -0.50°C, Humidity +0.25%
// Version 43 (temperature + humidity + pressure)
wcal~-50,25,100 // Temp -0.50°C, Humidity +0.25%, Pressure +1.00 hPa
// Values multiplied by 100 (e.g., -50 = -0.50°C)
Response: OK: Calibrations updatedDownload Logs
// Modern devices (v41-43)
logall // Download all logs
log~100 // Download last 100 logs
// Legacy devices (v13-27)
*logall // Download all logs
// Response: Binary data stream, terminated with '..'
// Note: Only one download per connectionTX Power
txpwr~4 // +4 dBm (maximum range ~246ft / 75m)
txpwr~0 // 0 dBm
txpwr~-4 // -4 dBm
txpwr~-8 // -8 dBm (minimum power)
Response: OK: TX Power updated successfully5.3 Response Patterns
| Pattern | Meaning |
|---|---|
OK | Command succeeded |
updated | Calibration write succeeded |
User string updated | Notes write succeeded |
.. | End of log download |
~~ | Incomplete transmission (ignore) |
6. Data Download Protocol
6.1 Download Initiation
// Modern devices (v41, v42, v43)
command = "logall"; // Full download
command = "log~100"; // Last 100 logs
// Legacy devices (v13, v23, v27)
command = "*logall"; // Full download6.2 Byte-Level Data Formats
Version 41 Log Data (2 bytes per reading)
function parseV41Reading(data, offset) {
const temp = (data[offset + 1] << 8) | data[offset];
// Convert to signed int16
const temperature = temp > 32767 ? temp - 65536 : temp;
// temperature is in 0.01C (divide by 100 for display)
return { temperature };
}Version 42 Log Data (4 bytes per reading)
function parseV42Reading(data, offset) {
const temp = toInt16(data[offset], data[offset + 1]);
const hum = toInt16(data[offset + 2], data[offset + 3]);
const dew = calculateDewpoint(temp / 100, hum / 100) * 100;
return { temperature: temp, humidity: hum, dewpoint: Math.round(dew) };
}
function toInt16(low, high) {
let value = (high << 8) | low;
return value > 32767 ? value - 65536 : value;
}Version 43 Log Data (8 bytes per reading)
function parseV43Reading(data, offset) {
const temp = toInt16(data[offset], data[offset + 1]);
const hum = toInt16(data[offset + 2], data[offset + 3]);
const press = toInt32(data[offset + 4], data[offset + 5],
data[offset + 6], data[offset + 7]);
const dew = calculateDewpoint(temp / 100, hum / 100) * 100;
return {
temperature: temp,
humidity: hum,
pressure: press,
dewpoint: Math.round(dew)
};
}6.3 Timestamp Calculation
Logs do not contain timestamps. Calculate timestamps from device reference time:
function calculateTimestamps(readings, referenceUnix, intervalSeconds) {
return readings.map((reading, index) => ({
...reading,
unix: referenceUnix + (index * intervalSeconds * 1000)
}));
}7. Alert Service (v41, v42, v43)
The modern devices support BLE notifications for real-time sensor alerts.
7.1 Alert Service UUIDs
Service UUID: 6E400001-9489-44E4-9E39-60BA18464A30
Characteristic UUID: 6E400002-9489-44E4-9E39-60BA18464A307.2 Subscribing to Alerts
- Connect to the device
- Discover the Alert Service
- Write
0x0001to the CCCD (Client Characteristic Configuration Descriptor) - Receive ATT Write Response (success) confirming subscription
- Receive notifications every 60 seconds
Subscription Restrictions
Subscriptions are automatically rejected if:
- Device is in airplane mode (
FLAG_AIRPLANEset) - Device is locked (
FLAG_LOCKEDset)
7.3 Alert Data Format by Version
// Version 41: 6 bytes
typedef struct __packed {
int16_t temperature; // 2 bytes (temp × 100)
uint8_t mac_address[4]; // 4 bytes (last 4 of MAC)
} alert_data_v41_t;
// Version 42: 8 bytes
typedef struct __packed {
int16_t temperature; // 2 bytes
int16_t humidity; // 2 bytes
uint8_t mac_address[4]; // 4 bytes
} alert_data_v42_t;
// Version 43: 12 bytes
typedef struct __packed {
int16_t temperature; // 2 bytes
int16_t humidity; // 2 bytes
int32_t pressure; // 4 bytes
uint8_t mac_address[4]; // 4 bytes
} alert_data_v43_t;8. Data Models
8.1 Reading Interfaces
// Version 41 Reading
interface Device41Reading {
index: number; // Reading sequence number
unix: number; // Timestamp (milliseconds)
temperature: number; // Raw value (/100 for C)
}
// Version 42 Reading
interface Device42Reading {
index: number;
unix: number;
temperature: number; // Raw value (/100 for C)
humidity: number; // Raw value (/100 for %RH)
dewpoint: number; // Calculated (/100 for C)
}
// Version 43 Reading
interface Device43Reading {
index: number;
unix: number;
temperature: number; // Raw value (/100 for C)
humidity: number; // Raw value (/100 for %RH)
pressure: number; // Raw value (Pa)
dewpoint: number; // Calculated (/100 for C)
}8.2 Device Capabilities Matrix
| Property | v13 | v23 | v27 | v41 | v42 | v43 |
|---|---|---|---|---|---|---|
| Temperature | Y | Y | Y | Y | Y | Y |
| Humidity | - | Y | Y | - | Y | Y |
| Pressure | - | - | Y | - | - | Y |
| Dew Point | - | Y | Y | - | Y | Y |
| Device PIN | - | - | - | Y | Y | Y |
| Alerts | - | - | - | Y | Y | Y |
| LED Control | - | - | - | Y | Y | Y |
| BLE Calibration | - | - | - | Y | Y | Y |
9. Unit Conversions
9.1 Temperature
// Celsius to Fahrenheit
function celsiusToFahrenheit(celsius) {
return (celsius * 9/5) + 32;
}
// Fahrenheit to Celsius
function fahrenheitToCelsius(fahrenheit) {
return (fahrenheit - 32) * 5/9;
}9.2 Pressure
// Pascal to hPa (hectopascal/millibar)
function paToHpa(pa) {
return pa / 100;
}
// hPa to inHg (inches of mercury)
function hpaToInhg(hpa) {
return hpa * 0.02953;
}9.3 Dew Point Calculation
function calculateDewpoint(temperatureCelsius, humidityPercent) {
const a = 17.27;
const b = 237.7;
const alpha = ((a * temperatureCelsius) / (b + temperatureCelsius)) +
Math.log(humidityPercent / 100);
return (b * alpha) / (a - alpha);
}10. Developing Your Own App
This section provides guidance for developers building applications to communicate with Blue Maestro devices.
10.1 Basic Connection Flow
- Scan for BLE devices with manufacturer data starting with
0x33 0x01 - Connect to device with desired name/MAC
- Discover services (find Nordic UART Service)
- Subscribe to RX characteristic notifications
- Send commands via TX characteristic
- Receive responses via RX notifications
- Disconnect when done
10.2 Example Workflows
Workflow 1: Basic Info Retrieval
1. Connect to device
2. Subscribe to RX characteristic
3. Write "info" to TX characteristic
4. Read response from RX notification
5. Parse text response
6. DisconnectWorkflow 2: Download All Logs
1. Connect to device
2. Subscribe to RX characteristic
3. Write "log~all" to TX characteristic
4. Receive binary stream of sensor data
5. Parse based on device version (check advertisement data)
6. Convert: value / 100.0 for actual reading
7. Device disconnects when completeWorkflow 3: Configure Device
1. Connect to device
2. Check if locked (send "info", check response)
3. If locked, send "pin~<PIN>" to unlock
4. Send "setlog~300" (5 minute logging)
5. Send calibration command (version-specific)
6. Send "name~MyDevice"
7. Disconnect10.3 Sample Code
Python Example (using bleak library)
# Connect to device (using bleak library)
device = ble.connect("Device_MAC_ADDRESS")
service = device.get_service(NUS_SERVICE_UUID)
tx_char = service.get_characteristic(NUS_TX_UUID)
rx_char = service.get_characteristic(NUS_RX_UUID)
# Enable notifications
rx_char.enable_notifications(on_data_received)
# Send command
def send_command(command):
tx_char.write(command.encode())
# Receive response
def on_data_received(data):
print(f"Response: {data.decode()}")
# Example: Get device info
send_command("info")
time.sleep(1) # Wait for response
# Disconnect
device.disconnect()Binary Log Parsing (Python)
import struct
# Parse log data - VERSION SPECIFIC
def parse_logs_v41(data):
logs = []
for i in range(0, len(data), 2):
temp = struct.unpack('<h', data[i:i+2])[0]
temp_c = temp / 100.0
temp_f = temp_c * 9/5 + 32
logs.append({'temperature_c': temp_c, 'temperature_f': temp_f})
return logs
def parse_logs_v42(data):
logs = []
for i in range(0, len(data), 4):
temp, humi = struct.unpack('<hh', data[i:i+4])
logs.append({
'temperature_c': temp / 100.0,
'temperature_f': (temp / 100.0) * 9/5 + 32,
'humidity': humi / 100.0
})
return logs
def parse_logs_v43(data):
logs = []
for i in range(0, len(data), 8):
temp, humi, press = struct.unpack('<hhi', data[i:i+8])
logs.append({
'temperature_c': temp / 100.0,
'temperature_f': (temp / 100.0) * 9/5 + 32,
'humidity': humi / 100.0,
'pressure_hpa': press / 100.0,
'pressure_inhg': (press / 100.0) * 0.02953
})
return logsPlatform-Specific Libraries
| Platform | Recommended Library |
|---|---|
| iOS | CoreBluetooth framework |
| Android | Android BLE API (BluetoothGatt) |
| Python | bleak library |
| JavaScript/Web | Web Bluetooth API |
| React Native | react-native-ble-plx |
| Flutter | flutter_blue_plus |
Testing Tips
- Use nRF Connect mobile app to test commands manually
- Monitor responses to understand timing
- Always wait for response before sending next command
- Device auto-disconnects after most commands
- Test with device unlocked first (no PIN set)
- Check device version in advertisement data before parsing binary responses
11. Default Settings
11.1 Factory Default Values (v41, v42, v43)
| Setting | Default Value | Unit | Notes |
|---|---|---|---|
| Temperature Calibration | 0 | 1/100 °C | No offset |
| Humidity Calibration (v42/43) | 0 | 1/100 %RH | No offset |
| Pressure Calibration (v43) | 0 | 1/100 hPa | No offset |
| Logging Interval | 900 | seconds | 15 minutes |
| Advertising Update | 30 | seconds | |
| High Temp Threshold | 30 | °C (86°F) | |
| Low Temp Threshold | 10 | °C (50°F) | |
| High Humidity Threshold (v42/43) | 75 | %RH | |
| Low Humidity Threshold (v42/43) | 25 | %RH | |
| LED | On | Enabled | |
| Button | On | Enabled | |
| Airplane Mode | Off | Normal operation | |
| TX Power | +4 | dBm | Maximum range (~75m / 246ft) |
11.2 Firmware Information
| Property | Version 41 | Version 42 | Version 43 |
|---|---|---|---|
| Firmware Version | 2.0.1 | 2.0.1 | 2.0.1 |
| Platform | nRF Connect SDK / Zephyr RTOS | ||
| Storage | NVS (Non-Volatile Storage) | ||
| Sensor IC | STS4X | SHT4X | BME280 |
| Max Logs | 100,000 | 50,000 | 25,000 |
| Record Size | 2 bytes | 4 bytes | 8 bytes |
12. Appendices
12.1 Error Handling
| Error Condition | Recommended Action |
|---|---|
| Device locked | Prompt user to unlock device |
| Connection timeout | Retry connection (max 3 attempts) |
| Command timeout (45s) | Display timeout error, allow retry |
| Invalid data range | Discard reading, log error |
| Incomplete download | Re-request from last valid position |
12.2 Best Practices
- Scanning: Limit scan duration to 10-30 seconds
- Connection: Disconnect when not actively communicating
- Downloads: Use incremental downloads for large datasets
- Calibration: Store calibration locally for v13/v23/v27
- Timeouts: Allow 45 seconds for commands, 15 seconds for quick operations
- Chunking: Split commands >20 bytes with 100ms delays
12.3 Glossary
| Term | Definition |
|---|---|
BE | Big-Endian byte order |
LE | Little-Endian byte order |
NUS | Nordic UART Service |
RX | Receive (from device perspective - app writes here) |
TX | Transmit (from device perspective - app reads here) |
hPa | Hectopascal (pressure unit, same as mbar) |
%RH | Percent relative humidity |
Need Help?
For technical support or API questions, contact our development team.
Contact Support