HiveControl accepts sensor data over a small HTTP API, the same one the open-source HiveDevice software uses. Any scale, sensor board or gateway that can make an HTTPS POST can send hive readings, weather and air quality to a HiveControl account with it.
- Base URL:
https://hivecontrol.org(https://www.hivecontrol.orgis served too). Use HTTPS: plain HTTP requests are answered with a301redirect. - Method: every endpoint is
POST. - Auth: a device token from the HiveControl web app (see Authentication).
| Endpoint | Purpose |
|---|---|
/api/v1/hive/check |
Look up a hive by name and get its numeric hive id |
/api/v1/hive/new |
Create a hive |
/api/v1/hive/data |
Send one reading (hive sensors, optional weather and air) |
/api/v1/hive/data/sync |
Send a batch of readings (history backfill) |
/api/v1/wx/data |
Send a weather observation not tied to a hive |
/api/v1/hive/log |
Send a device log line |
/api/v1/hive/config/version |
Get the hive's device-configuration version |
/api/v1/hive/config |
Download the hive's device configuration |
/api/v1/hive/config/update |
Upload device configuration |
/api/v1/hive/equipment |
Upload the hive's equipment (boxes and their weights) once |
Quick start
Create a device token first: sign in at hivecontrol.org, open Settings → Device API
tokens, and choose Create token. Copy it; it is shown only once. Below it is
YOUR_DEVICE_TOKEN.
1. Look up the hive by name.
curl -s -X POST https://hivecontrol.org/api/v1/hive/check \
-F "api_token=YOUR_DEVICE_TOKEN" \
-F "hivename=Back Yard 1"
{"error":"UPDATE_HIVEID","value":"100001"}: the hive exists. Save100001as the hive id and skip to step 3.{"error":"NOT_REGISTERED"}: no hive has that name yet. Create it (step 2).
2. Create the hive, then repeat step 1 to get its id.
curl -s -X POST https://hivecontrol.org/api/v1/hive/new \
-F "api_token=YOUR_DEVICE_TOKEN" \
-F "name=Back Yard 1" \
-F "hc_version=1.0" \
-F "timezone=America/New_York" \
-F "power=solar" \
-F "internet=wifi" \
-F "status=active" \
-F "computer=esp32" \
-F "start_date=2026-10-28"
Reply: {"result":"SUCCESS"}. This reply has no id; call hive/check again.
3. Send a reading. Form fields and JSON both work; this one is JSON.
curl -s -X POST https://hivecontrol.org/api/v1/hive/data \
-H "Authorization: Bearer YOUR_DEVICE_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"hive_id": 100001,
"hivename": "Back Yard 1",
"hive_observation_time_local": "2026-10-28T12:00:00Z",
"hive_temp_f": 93.4,
"hive_humidity": 55.2,
"hive_weight_lbs": 112.75,
"hive_battery_voltage": 3.92
}'
Reply: {"success":"1"}.
4. Send a batch of past readings.
curl -s -w "HTTP %{http_code}\n" -X POST https://hivecontrol.org/api/v1/hive/data/sync \
-H "Authorization: Bearer YOUR_DEVICE_TOKEN" \
-H "Content-Type: application/json" \
--data-binary '[
{"hive_id": 100001, "hive_name": "Back Yard 1", "hive_observation_time_local": "2026-10-28T10:00:00Z", "hive_temp_f": 91.8, "hive_weight_lbs": 112.1},
{"hive_id": 100001, "hive_name": "Back Yard 1", "hive_observation_time_local": "2026-10-28T10:15:00Z", "hive_temp_f": 92.0, "hive_weight_lbs": 112.2}
]'
Reply: an empty body with HTTP 200 when every record was accepted.
5. Send weather from your own station.
curl -s -X POST https://hivecontrol.org/api/v1/wx/data \
-H "Authorization: Bearer YOUR_DEVICE_TOKEN" \
-F "wx_station_id=B4:E6:2D:07:87:49" \
-F "wx_observation_time_rfc822=2026-10-28T12:00:00Z" \
-F "wx_temp_f=52.3" \
-F "wx_relative_humidity=71" \
-F "wx_pressure_mb=1016.2"
Reply: {"success":"1"}.
Authentication
Every request needs a device token. Users create tokens in the web app under Settings → Device API tokens (the add-hive wizard can also create one). A token:
- is 60 letters and digits;
- is shown once, when it's created, and can be revoked at any time from the same page;
- does not expire;
- belongs to the account, not to one hive: it can send data for any hive in the account.
An account can hold up to 50 tokens. Use one per device so a lost device can be revoked alone.
Send the token in one of these places (checked in this order):
| Where | Example |
|---|---|
Field api_token in the body (form or JSON object) |
-F "api_token=YOUR_DEVICE_TOKEN" |
Query string api_token |
.../hive/check?api_token=YOUR_DEVICE_TOKEN |
Authorization header |
Authorization: Bearer YOUR_DEVICE_TOKEN |
Prefer the header or a body field: URLs, query strings included, can end up in proxy and server logs.
A missing, wrong or revoked token, or a token of a disabled account, gets
401 {"error":"Unauthenticated."} from every endpoint.
Request format
Requests may be sent as:
Content-Type |
Used by | Notes |
|---|---|---|
multipart/form-data |
all endpoints except sync | What HiveDevice sends (curl -F) |
application/x-www-form-urlencoded |
all endpoints except sync | curl -d "a=1&b=2" |
application/json, body is an object |
all endpoints except sync | Numbers, strings, true/false and null all work |
application/json, body is an array |
hive/data/sync only |
The token goes in the header or query string |
With form and JSON-object requests, a field missing from the body is also looked up in the query string.
Values. Leading and trailing spaces and double quotes are trimmed from every value. An
empty value, or the text null in any letter case, means "not sent". Numbers are plain
decimals (93.4, -2, 1e3). Field names are case-sensitive, except configuration and
equipment keys (noted where they apply). Fields the API doesn't know are ignored.
Size. Request bodies are limited to 1 MiB (1,048,576 bytes); a 500-record sync batch is about 350 KB.
Times
Timestamps are accepted in these forms:
| Form | Example | Meaning |
|---|---|---|
RFC 3339 with Z or an offset |
2026-10-28T12:00:00Z, 2026-10-28T08:00:00-04:00 |
That exact instant |
YYYY-MM-DD HH:MM:SS |
2026-10-28 08:00:00 |
Wall-clock time (see below) |
YYYY-MM-DD HH:MM |
2026-10-28 08:00 |
Wall-clock time |
YYYY-MM-DDTHH:MM:SS |
2026-10-28T08:00:00 |
Wall-clock time |
YYYY-MM-DD |
2026-10-28 |
Midnight, wall-clock time |
A date starting 0000-00-00 counts as missing. Other formats, including RFC 822 dates, are
not accepted.
Wall-clock times are read in the hive's time zone: the zone given at registration or by a
later configuration update, or the hive's location zone if the hive has none, or UTC if
neither is a valid IANA zone name. Fields whose name ends in _utc are read as UTC. A time
that occurs twice when daylight saving time ends is taken as the first occurrence.
Allowed range. A reading's time must be after 1 January 2010 and no more than 24 hours
ahead of the server's clock, or the reading is rejected (INVALID_DATA; in a sync, the record
is skipped). Weather and air times must be after 1 January 2010 and no more than 1 hour ahead,
or those values are dropped and the hive values kept.
Recommendation: send RFC 3339 with Z or an offset. It's unambiguous and doesn't depend
on any time-zone setting.
Units
There are no unit fields. Every field has a fixed unit, given in its name and in the tables
below: temperatures in °F (some fields have a _c alternative in °C), weight in pounds,
wind in mph, pressure in millibars (or inches of mercury in wx_pressure_in), rain in
inches. There is no kilogram weight field: convert before sending (1 kg = 2.20462 lb).
Hive names and hive ids
A device identifies its hive by name (hivename) and a numeric hive id (hive_id)
that HiveControl assigns. Every endpoint except hive/new and hive/log checks the pair:
- If
hive_idis a hive in the token's account and that hive's name matcheshivename: the request goes ahead. - Otherwise, if a hive in the account has the name
hivename: the API answers with that hive's id (UPDATE_HIVEID) and stores nothing. Save the id and resend. - Otherwise:
NOT_REGISTERED. Create the hive withhive/new.
Name matching ignores letter case and leading/trailing spaces: "back yard 1 " matches
Back Yard 1. Everything else (inner spaces, punctuation) must match exactly. Only hives
in the token's own account are ever matched.
What this means for a device:
- A new name is
NOT_REGISTEREDuntil you callhive/new. - A name that matches an existing hive, including a hive the user created in the web
app, is found by
hive/check, which returns its id. Don't callhive/newfor it: that returnsDUPLICATE. The add-hive wizard tells the user to give the device the hive's name exactly, for this reason. - If the user renames the hive in HiveControl, the device's old name no longer matches
and the API answers
NOT_REGISTERED. Update the device's name; don't register a new hive. - If several hives in one account share a name, the one with the lowest hive id is used.
Weight: net of equipment
Send hive_weight_lbs as the net weight: what the scale reads minus the weight of the
hive's equipment (bottom board, boxes, covers, feeder, and anything else on the scale, such
as the electronics or a brick). That leaves bees, brood, comb and honey. This is what
HiveDevice sends, and HiveControl shows and alerts on the value as sent.
HiveControl does not subtract anything from the uploaded weight. If your scale has no equipment settings, either subtract your own tare before sending, or use the hive's equipment from HiveControl:
- Once the user has saved the hive's equipment in the web app,
hive/configreturns its box counts (NUM_HIVE_*) and the weight of each kind of part (HIVE_*_WEIGHT, lbs). The tare is the sum of each count times the matching weight (NUM_HIVE_FEEDER×HIVE_FEEDER_WEIGHT, and so on), plusHIVE_TOP_WEIGHT,HIVE_COMPUTER_WEIGHTandHIVE_MISC_WEIGHT. Until then the weight keys arenull. - When the user changes the equipment, the hive's config version goes up, so poll it and reload the tare when it changes.
If you send gross weight instead, the charts still work but show the equipment as part of the hive.
Plausibility: a weight of exactly 0, below −10 lbs or above 500 lbs is treated as a sensor
fault and dropped from the reading (see Validation). Small negative values are
kept: they're expected calibration drift.
Validation
Each numeric field has an upper limit. A value that is not a number or is over the
limit rejects the whole reading (INVALID_DATA, nothing stored). There are no lower
limits unless stated.
Some hive values are dropped instead: the rest of the reading is stored and the reply is
still a success. Old devices send 0 when a sensor is missing, and a disconnected load cell
reads a fixed, impossible weight.
| Field | Rejects the reading | Dropped (rest stored) |
|---|---|---|
hive_temp_f |
> 200 | < −60 |
hive_humidity |
> 101 | ≤ 0 |
hive_weight_lbs |
> 1000 | exactly 0, < −10, or > 500 |
Weather and air values with a time more than 1 hour in the future (server clock) are dropped; the hive values of the same reading are still stored.
Duplicates
Sending a reading again is safe. HiveControl keeps one reading per hive per timestamp, one weather observation per station per minute, and one air reading per location per timestamp. The first one stored wins; later duplicates are ignored, and the reply is still a success.
Responses and errors
Most outcomes, including errors, are answered with HTTP 200 and a short JSON body. Always check the body, not just the status. Bodies are compact JSON with no spaces, as shown.
These can come from any endpoint:
| Status | Body | Meaning |
|---|---|---|
| 401 | {"error":"Unauthenticated."} |
Token missing, wrong or revoked |
| 400 | {"error":"INVALID_DATA"} |
Body couldn't be parsed, or is over 1 MiB |
| 429 | {"error":"rate limit exceeded"} |
Too many requests (see Rate limit) |
| 500 | {"error":"SERVER_ERROR"} |
Server problem; retry later |
| 405 | (plain text) | Not a POST (reported only when the token is valid) |
The hive identity replies (from every endpoint that takes hive_id and hivename):
| Body | Meaning | What to do |
|---|---|---|
{"error":"NOT_REGISTERED"} |
No hive in the account has that name | hive/new, then hive/check |
{"action":"UPDATE_HIVEID,100001"} |
The name belongs to hive 100001, not to the id you sent |
Save the new id and resend |
hive/check reports a stale id in its own format: {"error":"UPDATE_HIVEID","value":"100001"}.
Rate limit
Requests to all device endpoints together are limited per client IP address: a burst of
up to 60 requests, refilled at 1 request per second. Over the limit, requests get 429.
Devices behind one public IP (one home network, for example) share the budget. For history,
use hive/data/sync with up to a few hundred readings per request
rather than many hive/data calls, and pause about a second between batches.
Endpoints
POST /api/v1/hive/check
Looks up a hive by name and reports its id. Call it on first start, after the user changes
the device's hive name, and when another endpoint answers NOT_REGISTERED. If a hive with
this name was created in the web app, this is the call that connects the device to it.
| Field | Type | Required | Notes |
|---|---|---|---|
hivename |
string, ≤ 100 bytes | yes | |
hiveid |
integer | no | The id the device has stored, if any. Note the spelling: hiveid, not hive_id |
| Status | Body | Meaning |
|---|---|---|
| 200 | {"error":"REG_VALID"} |
hiveid and hivename match the same hive. (Despite the key, a success.) |
| 200 | {"error":"UPDATE_HIVEID","value":"100001"} |
A hive has this name; its id is value. Returned when hiveid is missing or different |
| 200 | {"error":"NOT_REGISTERED"} |
No hive with this name |
| 422 | {"error":"INVALID_DATA"} |
hivename missing or longer than 100 bytes |
POST /api/v1/hive/new
Creates a hive in the account. Call it only after hive/check answered NOT_REGISTERED.
The hive is added to the user's first apiary; if the user has none, a location named "Home"
and an apiary named "Home Apiary" are created. The reply does not include the new hive's id:
call hive/check next to get it.
All fields are required, non-empty, and at most 255 bytes.
| Field | Type | Notes |
|---|---|---|
name |
string | The hive's name. Must not match another hive in the account (case and outer spaces ignored) |
hc_version |
number | Your firmware version as a number, e.g. 1.0 or 2.46. Text such as v2 or 1.2.3 is rejected |
timezone |
string | IANA zone name, e.g. America/New_York. Used to read the hive's wall-clock times; an unknown name means UTC |
power |
string | Free text, e.g. solar, AC |
internet |
string | Free text, e.g. wifi, cellular |
status |
string | Free text, kept in the device configuration. The hive itself is always created active |
computer |
string | Free text: your hardware, e.g. esp32, pi4 |
start_date |
timestamp | Any form from Times |
| Status | Body | Meaning |
|---|---|---|
| 200 | {"result":"SUCCESS"} |
Created |
| 200 | {"result":"DUPLICATE"} |
The account already has a hive with this name. Use hive/check to get its id |
| 200 | {"result":"INVALID_DATA"} |
A field is missing, too long, or not in the right format |
POST /api/v1/hive/data
Stores one reading: hive sensors, plus optional weather and air quality from the same moment. Call it each time the device takes a reading.
Fields: the identity fields, the reading fields, and optionally
the weather and air fields. Only hive_id, hivename and
hive_observation_time_local are required; send whichever sensor values you have.
| Status | Body | Meaning |
|---|---|---|
| 200 | {"success":"1"} |
Stored (possibly with some values dropped, see Validation) |
| 200 | {"error":"INVALID_DATA"} |
Identity fields missing or malformed, the time can't be read, or a value is not a number or over its limit. Nothing stored |
| 200 | {"error":"NOT_REGISTERED"} / {"action":"UPDATE_HIVEID,<id>"} |
See identity replies |
POST /api/v1/hive/data/sync
Stores many readings in one request: for uploading history, or catching up after the device
was offline. Send Content-Type: application/json with a JSON array of records, oldest
first. Put the token in the Authorization header or the api_token query parameter (there
is no body field for it).
Each record is an object with the same fields as hive/data, except
that the hive name may be sent as hive_name (preferred) or hivename. Records may be
for different hives in the account. Send at most 1,000 records per request (and within
the 1 MiB body limit); HiveDevice sends 500 at a time. A few syncs are processed at once;
others wait their turn.
Records are processed in order:
- a record that fails validation, or has no hive name, is skipped and counted;
- a record whose
hive_id/name pair doesn't match stops the batch: records before it are stored, it and everything after it are not, and the reply is the identity error. Fix the id and resend from the start: readings already stored are ignored as duplicates.
| Status | Body | Meaning |
|---|---|---|
| 200 | (empty) | Every record stored |
| 200 | {"error":"INVALID_DATA","rejected":"3"} |
All others stored; 3 records were skipped |
| 200 | {"error":"NOT_REGISTERED"} |
A record's hive name isn't in the account. Earlier records stored |
| 200 | {"action":"UPDATE_HIVEID,<id>"} |
A record's name belongs to hive <id>. Earlier records stored |
| 400 | {"error":"INVALID_DATA"} |
The body isn't a JSON array of objects, has more than 1,000 records, or Content-Type isn't application/json |
POST /api/v1/wx/data
Stores a weather observation that isn't attached to a hive reading: for a stand-alone weather
station. (To send weather with a hive reading, add the weather fields to
hive/data instead.)
| Field | Type | Required | Notes |
|---|---|---|---|
wx_station_id |
string | yes | See Weather stations |
wx_observation_time_rfc822 |
timestamp | yes | Any form from Times. Wall-clock times are read in the time zone of the user's first location (UTC if none) |
| weather fields | at least one |
| Status | Body | Meaning |
|---|---|---|
| 200 | {"success":"1"} |
Stored |
| 200 | {"error":"INVALID_DATA"} |
Station id or time missing, the time can't be read or is more than 1 hour in the future, no weather value was sent, or a value is not a number or over its limit |
POST /api/v1/hive/log
Stores one line of the device's log. The user sees recent lines in the web app (they're kept for 30 days), and the add-hive wizard takes the first one as a sign the device has connected. Only the id is checked, not the name.
| Field | Type | Required | Notes |
|---|---|---|---|
hive_id |
integer | yes | |
program |
string | yes | What wrote the line, e.g. CURRCONDITIONS |
type |
string | yes | Severity, e.g. INFO, ERROR |
message |
string | yes | Cut to 2,000 bytes |
| Status | Body | Meaning |
|---|---|---|
| 200 | {"success":"1"} |
Stored |
| 200 | {"error":"unknown"} |
No hive with this id in the account |
| 200 | {"error":"INVALID_DATA"} |
A field is missing, or hive_id isn't an integer |
POST /api/v1/hive/config/version
Returns the version number of the hive's device configuration. The number goes up when the
user changes settings or equipment in the web app. Poll it and download hive/config when it's higher than the version you
have.
Fields: the identity fields.
| Status | Body | Meaning |
|---|---|---|
| 200 | {"version":"23"} |
The version, as a string |
| 200 | {"error":"INVALID_DATA"} |
Identity fields missing or malformed |
| 200 | identity replies | See Responses and errors |
POST /api/v1/hive/config
Returns the hive's device configuration: the HiveDevice settings the user can edit in the web app (sensors, calibration, weather source, equipment counts and weights, and so on). A third-party device can ignore the settings it has no use for; the equipment keys are useful for weight.
Fields: the identity fields.
Reply 200: one JSON object. Every configuration key is present, as a
string or null when unset, plus:
| Key | Type | Notes |
|---|---|---|
id |
integer | The hive id |
name |
string | The hive's name |
version |
integer | The configuration version |
timezone |
string | The hive's time zone |
user_id |
integer or null |
|
created_at, updated_at |
string | YYYY-MM-DD HH:MM:SS, UTC |
hiveid, yard_id, hiveapi, api_status, ipaddress, deleted_at |
null |
Always null; kept for old devices |
{"id":100001,"name":"Back Yard 1","version":23,"timezone":"America/New_York",
"NUM_HIVE_BODY_DEEP_FOUNDATION":"2","HIVE_BODY_DEEP_FOUNDATION_WEIGHT":"10.5",
"gdd_base_temp":"50","enable_lux":null, "...": "..."}
Errors: {"error":"INVALID_DATA"} (identity fields missing or malformed) and the identity
replies, all with status 200.
The configuration includes third-party weather API keys the user entered for the device
(key_*, hive_air_api). Treat the reply as a secret.
POST /api/v1/hive/config/update
Uploads configuration values the device changed locally. Only the keys you send change.
| Field | Type | Required | Notes |
|---|---|---|---|
| identity fields | yes | ||
version |
integer | yes | Becomes the hive's configuration version |
| any configuration key | string | no | Key names in any letter case |
How values are applied:
- An empty value or
nullclears that key. Keys you don't send are left alone. - Unknown keys, and values over 1,000 bytes, are ignored.
timezonemust be a valid IANA zone name, or it's ignored. It also becomes the hive's time zone for reading wall-clock times.- Once the user manages the hive's equipment in the web app, uploaded box counts and part
weights (
NUM_HIVE_*,HIVE_*_WEIGHT) are ignored: the web app's values win. - If the user set the hive up in the web app before the device connected, the device's first
upload doesn't overwrite the settings made there. The version is then set above the one
you sent, so your next
config/versioncheck tells you to download the merged configuration.
| Status | Body | Meaning |
|---|---|---|
| 200 | {"success":"1"} |
Saved |
| 422 | {"error":"INVALID_DATA"} |
version missing or not an integer, or identity fields missing or malformed |
| 200 | identity replies | See Responses and errors |
POST /api/v1/hive/equipment
Uploads what the hive is built from, so HiveControl can manage it. Accepted once per
hive: when the hive has no equipment saved yet. After that, equipment is edited in the web
app and read back from hive/config. Field names may be in any
letter case; values over 255 bytes are ignored.
| Field | Type | Notes |
|---|---|---|
| identity fields | Required | |
HIVE_STACK_ORDER |
string | Part types, bottom first, comma-separated: solid_bottom, screened_bottom, deep, medium, shallow, feeder, inner_cover, migratory_cover, tele_cover. Unknown names are skipped; at most 30 parts |
NUM_HIVE_* |
integer | Box counts, e.g. NUM_HIVE_BODY_DEEP_FOUNDATION=2 (full list under Configuration keys). Used to build the stack when HIVE_STACK_ORDER is absent |
HIVE_*_WEIGHT |
number, lbs | Empty weight of one part of each kind, e.g. HIVE_BODY_DEEP_FOUNDATION_WEIGHT=10.5. 0 means not set; over 200 rejects the upload |
HIVE_TOP_WEIGHT, HIVE_COMPUTER_WEIGHT, HIVE_MISC_WEIGHT |
number, lbs | Other weight on the scale. 0–500 lbs |
SENSOR_TEMP_POSITION |
integer | 0-based stack position of the part the temperature sensor sits on top of (not the top part) |
SENSOR_TEMP_LABEL |
string | Cut to 50 characters. Default "Hive temp" |
FRAME_FEEDER_POSITION |
integer | 0-based stack position of the box (deep, medium, shallow) holding a frame feeder; -1 for none |
FRAME_FEEDER_LABEL |
string | Default "Frame feeder" |
FEEDER_HAS_SYRUP |
1 or 0 |
Whether the top feeder has syrup |
The stack must have at least one part (from HIVE_STACK_ORDER or the counts). When the
upload is stored, the configuration version goes up if the hive's counts or weights changed.
| Status | Body | Meaning |
|---|---|---|
| 200 | {"result":"SUCCESS"} |
Stored |
| 200 | {"result":"EXISTS"} |
The hive already has equipment in HiveControl; nothing changed |
| 200 | {"result":"INVALID_DATA"} |
No stack, or a part weight over 200 lbs |
| 200 | {"error":"INVALID_DATA"} and identity replies |
Identity fields missing or wrong |
Field reference
Identity
Sent with hive/data, hive/data/sync records, and all hive/config* and hive/equipment
requests.
| Field | Type | Required | Notes |
|---|---|---|---|
hive_id |
integer | yes | The id from hive/check. Must be a whole number (a JSON number or a numeric string) |
hivename |
string, ≤ 255 bytes | yes | In sync records, hive_name is also accepted |
Reading fields
| Field | Type / unit | Limit | Notes |
|---|---|---|---|
hive_observation_time_local |
timestamp | required | When the reading was taken. Wall-clock time in the hive's time zone, or RFC 3339 |
hive_observation_time_utc |
timestamp | optional | Same moment in UTC. When present and readable, it's used instead of the local time |
hive_temp_f |
number, °F | ≤ 200 | Hive temperature. Below −60 is dropped |
hive_temp_c |
number, °C | ≤ 200 | Used only when hive_temp_f is absent (but checked against its limit even then); converted to °F, then dropped if outside −60…200 °F |
hive_humidity |
number, % RH | ≤ 101 | 0 or below is dropped |
hive_weight_lbs |
number, lbs | ≤ 1000 | Net weight (see Weight). 0, below −10 or above 500 is dropped |
hive_battery_voltage |
number, volts | ≤ 50000 | |
hive_flight_in |
integer, bees | ≤ 1,000,000 | Bee counter: bees in |
hive_flight_out |
integer, bees | ≤ 1,000,000 | Bee counter: bees out |
Bee counts must be whole numbers (120 or 120.0).
Weather fields
Optional, with hive/data and sync records; at least one is required with wx/data. A
weather observation is stored only if at least one of the measured values below is sent.
| Field | Type / unit | Limit | Notes |
|---|---|---|---|
wx_station_id |
string | Which station measured it; see Weather stations | |
wx_observation_time_rfc822 |
timestamp | When it was measured. With hive/data, read in the hive's time zone; defaults to the reading's time. Rounded down to the minute |
|
wx_temp_f |
number, °F | ≤ 200 | Air temperature |
wx_temp_c |
number, °C | ≤ 200 | Used only when wx_temp_f is absent |
wx_relative_humidity |
number, % | ≤ 255 | |
wx_wind_mph |
number, mph | ≤ 500 | |
wx_wind_gust_mph |
number, mph | ≤ 500 | wx_wind_gust_mpg (HiveDevice's spelling) is also accepted |
wx_wind_degrees |
number, degrees | ≤ 360 | Wind direction |
wx_pressure_mb |
number, millibars (hPa) | ≤ 10000 | |
wx_pressure_in |
number, inches of mercury | ≤ 10000 | Used only when wx_pressure_mb is absent; converted to millibars |
wx_dewpoint_f |
number, °F | ≤ 255 | |
wx_dewpoint_c |
number, °C | ≤ 255 | Used only when wx_dewpoint_f is absent |
wx_precip_1hr_in |
number, inches | ≤ 255 | Rain in the last hour |
wx_solar_radiation |
number, W/m² | ≤ 50000 |
Air fields
Optional, with hive/data and sync records. Air readings belong to the hive's location:
all hives at one location share them.
| Field | Type / unit | Limit | Notes |
|---|---|---|---|
air_date |
timestamp | When it was measured, in the hive's time zone. Defaults to the reading's time | |
air_pm1 |
number, µg/m³ | ≤ 200000 | |
air_pm2_5 |
number, µg/m³ | ≤ 200000 | |
air_pm10 |
number, µg/m³ | ≤ 200000 | |
air_pm2_5_aqi |
integer, AQI | ≤ 200000 | air_aqi is also accepted |
air_temp |
number, °F | ≤ 200 | |
air_humidity |
number, % | ≤ 101 |
HiveDevice also sends these, which are accepted and ignored: record_id, wx_wind_dir,
wx_precip_1hr_metric, wx_precip_today_in, wx_precip_today_metric, air_pm10_aqi,
air_pm1_raw, air_pm2_5_raw, air_pm10_raw, air_pressure, air_source.
Weather stations
Weather is stored per station, chosen by wx_station_id. IDs of public weather networks
are shared by every HiveControl user; anything else is private to your account.
wx_station_id |
Example | Treated as | Shared? |
|---|---|---|---|
ST- and digits |
ST-00003478 |
WeatherFlow Tempest station | Yes |
| 4 or more letters, then digits | KCTFAIRF23 |
Weather Underground personal station | Yes |
| Exactly 4 letters | KTTN |
Airport (ICAO) station | Yes |
LOCALSENSOR |
Your local sensor | No | |
| A MAC address | B4:E6:2D:07:87:49 |
Your local station | No |
Other short text (letters, digits, spaces, . , ' ( ) -; up to 64 characters) |
Back porch |
Your station with that name | No |
Empty, 0, null, or anything else |
"Unknown local weather" | No |
Shared station IDs are upper-cased; private text IDs match without regard to case.
If you built the weather sensor, send its MAC address or a name, not a public station ID. Readings for a public station ID are shared with everyone who uses that station, and only the first observation for each minute is kept.
Configuration keys
Returned by hive/config and accepted by hive/config/update (any letter case). Most are
HiveDevice settings.
hc_version timezone power internet status computer start_date run homedir public_html_dir
check_for_upgrades bee_race bee_source hive_type hive_status queen_start queen_color
enable_hive_temp_chk temptype hive_temp_gpio hive_temp_measure hivedevice hive_temp_slope
hive_temp_intercept hive_humidity_slope hive_humidity_intercept enable_hive_weight_chk
scaletype hive_weight_gpio hive_weight_slope hive_weight_intercept enable_lux lux_source
hive_lux_gpio hive_lux_slope hive_lux_intercept enable_hive_camera enable_beecounter
cameratype cameramode countertype gdd_base_temp gdd_start_date latitude longitude
local_wx_type local_wx_url weather_detail weather_level wx_humidity_intercept
wx_humidity_slope wx_temp_gpio wx_temp_intercept wx_temp_slope wx_temper_device wx_station
wx_temp_type enable_hive_air_chk hive_air_type hive_air_id hive_air_api weather_fallback
weather_fallback_2 wx_max_stale_minutes key_openweathermap key_weatherapi key_visualcrossing
key_pirateweather key_tomorrow key_ambee key_airnow enable_airnow airnow_distance
Equipment: box counts and the weight (lbs) of one part of each kind.
| Count | Weight |
|---|---|
NUM_HIVE_BASE_SOLID_BOTTOM_BOARD |
HIVE_BASE_SOLID_BOTTOM_BOARD_WEIGHT |
NUM_HIVE_BASE_SCREENED_BOTTOM_BOARD |
HIVE_BASE_SCREENED_BOTTOM_BOARD_WEIGHT |
NUM_HIVE_BODY_DEEP_FOUNDATION |
HIVE_BODY_DEEP_FOUNDATION_WEIGHT |
NUM_HIVE_BODY_DEEP_FOUNDATION_LESS |
HIVE_BODY_DEEP_FOUNDATION_LESS_WEIGHT |
NUM_HIVE_BODY_MEDIUM_FOUNDATION |
HIVE_BODY_MEDIUM_FOUNDATION_WEIGHT |
NUM_HIVE_BODY_MEDIUM_FOUNDATION_LESS |
HIVE_BODY_MEDIUM_FOUNDATION_LESS_WEIGHT |
NUM_HIVE_BODY_SHAL_FOUNDATION |
HIVE_BODY_SHAL_FOUNDATION_WEIGHT |
NUM_HIVE_BODY_SHAL_FOUNDATION_LESS |
HIVE_BODY_SHAL_FOUNDATION_LESS_WEIGHT |
NUM_HIVE_FEEDER |
HIVE_FEEDER_WEIGHT |
NUM_HIVE_TOP_INNER_COVER |
HIVE_TOP_INNER_COVER_WEIGHT |
NUM_HIVE_TOP_TELE_COVER |
HIVE_TOP_TELE_COVER_WEIGHT |
NUM_HIVE_TOP_MIGRATORY_COVER |
HIVE_TOP_MIGRATORY_COVER_WEIGHT |
HIVE_TOP_WEIGHT, HIVE_COMPUTER_WEIGHT, HIVE_MISC_WEIGHT (count 1) |
Once the web app manages the hive's equipment, the _LESS (foundationless) counts are 0
and those boxes are counted with their size.