| Developer: | Berkinet's Plugins |
| Category: | Miscellaneous |
| Github: | Github Repo |
| License: | MIT License |
| Assistance: | Get help! |
| Plugin ID: | com.berkinet.indigoplugin.ruuvi |
| Latest release: | v2026.1.1 released on Sept. 27, 2026 |
| Release downloaded: | 20 times |
| Requires: | Indigo v2025.2.0 or higher |
| (Check the Releases tab below for older releases that may have different requirements) | |
| Download latest release |
Receive decoded Ruuvi Gateway HTTP pushes through Indigo's existing web server. Each RuuviTag becomes one native Indigo temperature sensor with numeric states for its other measurements. No MQTT dependency, Gateway polling, additional server, action groups, or variables.
Version 2026.1.1. Verified with authenticated live pushes, stale/recovery transitions, and plugin restart persistence. Keep MQTT Shims in service during your own side-by-side observation; see the verification record.
Requires Indigo 2025.2 / API 3.8 / Python 3.13. Developed against a real Gateway running v1.16.3, radio firmware v2.0.0, and decoded RAWv2 (data format 5) pushes. Other Ruuvi data formats are ignored.
gw_mac; this can
differ from its Wi-Fi MAC.The stable plugin ID is com.berkinet.indigoplugin.ruuvi.
In Custom Server settings, enable HTTP(S) and use:
http://INDIGO_LAN_ADDRESS:8176/message/com.berkinet.indigoplugin.ruuvi/receive/
Use your actual Indigo web-server port and scheme. Select Send only decoded
data, a 30-second sending interval, Use authentication, and Bearer
authentication. Enter an Indigo API key or configured local secret without
the word Bearer. Never include the key in a shared screenshot or repository.
The local HTTP connection is unencrypted; use an already-configured HTTPS
endpoint when transport encryption is required.
Use Check, then finish the wizard. The check can send an empty tag batch; normal batches arrive after setup finishes. Indigo must reject unauthenticated requests. Do not disable web-server authentication.
Keep MQTT enabled during side-by-side verification. The Gateway may briefly pause forwarding while its wizard is open and resumes when the wizard finishes. This plugin never changes Gateway or Tag firmware.
| State | Meaning / units |
|---|---|
sensorValue, temperature |
Temperature, °C; sensorValue is Indigo's native sensor value |
humidity |
Relative humidity, % |
pressure |
hPa (converted from the Gateway's Pa) |
voltage |
Battery voltage, V; not a battery percentage |
accelX, accelY, accelZ |
Acceleration, g |
movementCounter |
RAWv2 movement counter |
txPower, rssi |
dBm |
measurementSequenceNumber |
Measurement sequence, 0–65534 |
stale, status |
Freshness and visible health |
lastHeard |
Indigo receipt of every valid tag report, including duplicates |
gatewayReportedAt |
Gateway batch-report timestamp |
sensorReceivedAt |
Gateway's last radio reception timestamp for this tag |
lastMeasurementAt |
Indigo acceptance time of the last new measurement |
duplicateCount, outOfOrderCount |
Duplicate measurements and discarded older reports |
timeQuality |
sensorTimestamp, gatewayRelative, reportReceipt, or clockUncertain |
lastReportKind |
measurement, duplicate, or outOfOrder |
missingReadings |
Fields unavailable in the last accepted measurement |
Each measurement and RSSI also has an Available Boolean, for example
humidityAvailable. Missing, null, non-finite, and unavailable values retain
the last valid number with availability false; they never become false zeroes.
Missing temperature puts the native sensor into an error state. Consumers must
check availability and stale before using retained values. tracking is
plugin bookkeeping stored on the device for restart persistence.
An unchanged valid sequence and unchanged measurements count as a duplicate. Reception metadata still updates. A newer reception with unchanged measurements keeps a sensor online; repeating an old cached reception does not. A decreased sequence is accepted with current reception timing, supporting rollover and Tag restarts. Changed values with a reused sequence are accepted. An unavailable sequence disables deduplication for that report.
Freshness is checked locally every five seconds, with no network polling. Default stale threshold: five minutes. A fresh reception clears stale status even if measurements did not change. Deduplication survives plugin restarts.
Older reception timestamps cannot replace newer readings. Timestamp-less
reports use report-receipt freshness (timeQuality=reportReceipt); this cannot
distinguish cached reports from new receptions. A future-skewed Gateway clock
uses relative report/reception age, but repeating a timestamp does not refresh
freshness. Past-skewed clocks and delayed old reports are handled conservatively
as stale because they cannot be distinguished. Correcting a future-skewed clock
to current time is supported. Keep Gateway NTP enabled.
measurements, duplicates, outOfOrder, and
ignored counts. Empty batches do not touch sensor freshness.failed (reports that could
not be applied) and configurationErrors (invalid devices or extra MAC copies).
Request-wide failures return an error without counts.The full envelope is validated before devices are created. At most 256 tags are accepted. Unknown formats count as ignored. Payloads and credentials are not logged.
Keep existing MQTT Shims devices and names until verification is complete. Replacement devices have different Indigo IDs; consumers must be repointed explicitly. See migration, design, and official references.
Run tests with Python 3.13:
python3.13 -m unittest discover -s tests -v
Repository conventions match berkinet/phidgets22-indigo: main branch, MIT
license, year.major.minor versions, annotated tags matching PluginVersion
without a v prefix, and GitHub releases. Distribution uses Code → Download
ZIP, not custom ZIP assets. Private captures and inventories stay in ignored
local/; public fixtures are anonymized.
| Released on: | Sept. 27, 2026 |
| Requires: | Indigo v2025.2.0+ |
| Downloaded: | 20 times |
| Download this release | |
Fix batch processing so one device failure or invalid/duplicate MAC does not prevent healthy sensors from updating. Incomplete batches still return HTTP 500, and ambiguous identities remain blocked without creating extra devices.
Add actionable diagnostics with device IDs while withholding private addresses and arbitrary bridge exception text. Remove the redundant request JSON decode while preserving empty-batch Gateway restrictions.
Validation: 43 Python 3.13 tests pass; plugin plist, XML, syntax, and whitespace checks pass. Installed and verified in Indigo 2025.2.0 with new live Gateway pushes to both existing sensors, preserved identities and names, old/empty/malformed callback checks, and HTTP 401 for unauthenticated requests. Fault injection used the test bridge; existing MQTT and consumers were unchanged.
Install using Code → Download ZIP; the plugin bundle is at the repository root. See docs/verification.md for the verification scope.
Requires Indigo 2025.2 / API 3.8 / Python 3.13. Developed against a real Gateway running v1.16.3, radio firmware v2.0.0, and decoded RAWv2 (data format 5) pushes. Other Ruuvi data formats are ignored.
| Released on: | Sept. 26, 2026 |
| Requires: | Indigo v2025.2.0+ |
| Downloaded: | 17 times |
| Download this release | |
Receive decoded RAWv2 Ruuvi Gateway HTTP pushes through Indigo's existing web server, with one native sensor per MAC. No MQTT dependency, extra server, polling, action groups, or variables.
Initial Gateway delivery was intermittent; a user-performed power restart restored 30-second HTTP delivery. Existing MQTT Shims remains active for continued side-by-side observation. Consumer migration is separate.
Install via the repository's Code → Download ZIP, unzip, and open Ruuvi Gateway.indigoPlugin. Requires Indigo 2025.2. No custom ZIP assets are attached.