A web-based admin UI for a local InfluxDB v2 instance. Built for editing smarthome
telemetry (e.g. from ioBroker) without fighting the influx CLI: browse buckets,
filter datapoints by measurement/tag, inspect and edit values, fix timestamps,
delete ranges, and export/import data as ODS spreadsheets (for editing in
LibreOffice Calc with correct types, no CSV locale/decimal-separator guessing).
Runs as a small FastAPI backend + a static HTML/JS frontend (Tabulator.js), meant for LAN-only deployment on something like a Raspberry Pi — no login, no internet exposure.
This project was developed against an ioBroker InfluxDB-history setup specifically
(e.g. its ack/from/q tag conventions show up in a couple of default-value
choices) — it should work against any InfluxDB v2 instance, but has not yet been
tested outside that one environment.
ioBroker's InfluxDB adapter can store metadata in two different ways, depending on the "store metadata (ack, from, q) as tags" setting in its Expert config:
- Tag-based (setting enabled):
ack,from,qare InfluxDB tags,valueis the field. - Field-based (setting disabled):
ack,from,q, andvalueare all InfluxDB fields, no tags.
Both variants are fully supported when INFLUXWEB_MODE=iobroker is set in .env
(pre-configured in .env.example). influxWeb auto-detects the storage variant per measurement, groups field-based
data into one row per logical point, and handles Add point, Edit, Delete, Retime, and
ODS Export/Import correctly for both variants. The "Group fields by point" toggle is
hidden in iobroker mode (grouping is always on).
Set INFLUXWEB_MODE=default in .env to disable ioBroker-specific behaviour. In
that mode, all operations work for tag-based data. Field-based data can be browsed,
queried, exported, edited, retimed, and deleted correctly — but "Add point" will not
create a complete ioBroker point and should be avoided.
- Bucket selection
- Measurement/tag schema browsing and selection, file-explorer-style (click, Ctrl+click, Shift+click), with a clear/reset action and a text filter
- Time range selection
- Querying and listing datapoints, with adjustable page size and multi-row selection (same click/Ctrl/Shift model as the schema tree); capped at 200,000 points per query to keep memory use bounded regardless of how broad a selection is — narrow the measurement/tag/time filter if a result comes back marked as truncated
- A Statistical View toggle: instead of one row per point, one summary row per measurement+field (count, and for numeric fields min/max/mean/standard deviation) over the currently loaded query result
- A "Group fields by point" toggle: pivots the Data View from one row per
field to one row per logical reading (fields as columns) - mainly useful
for ioBroker buckets using field-based storage, where each point otherwise
shows as several separate rows. Off by default, remembered across visits.
Hidden when
INFLUXWEB_MODE=iobrokeris active (grouping is always on there) - Export to ODS (whole query result, or just the selected rows), with proper cell types (numbers, booleans, dates) and an instructions block describing the round-trip contract for a later import
- Import from ODS: re-upload a previously exported (and possibly hand-edited) file. A dry-run preview shows what would be written, which bucket(s) the file targets, and any rows that will be skipped (with a reason) before you confirm. Edited rows overwrite the matching point; new rows create one; deleted rows are left untouched in InfluxDB (import only writes, never deletes)
- Export Raw / Import Raw: a deliberately bare-bones pair for CLI/scripting
interop, using InfluxDB's own annotated CSV format (
influx query/influx write --format csv). Export Raw dumps the entire active bucket for the current time range in one query, no measurement/tag filtering. Import Raw writes a single-schema CSV file straight into the active bucket with no preview - it stops at the first row it can't parse or write, rather than trying to validate the whole file upfront - Delete points - either exactly the selected rows, or (with nothing selected) every row currently loaded in the table - with a preview and explicit confirmation before anything is deleted
- Edit a value inline (double-click a cell in the Value column) with a
confirm-before-save step, or add a brand-new point via a separate modal —
both share the same write path (overwrite by measurement+tags+timestamp,
last-write-wins, same as InfluxDB itself). In
INFLUXWEB_MODE=iobroker, the metadata fieldsack,from, andqare also editable inline: for field-based storage they behave like any other field edit; for tag-based storage the confirm step writes a new point with the changed tag and deletes the old one.quses a dropdown of the known ioBroker quality-flag values (0 Good, 1 General error, 2 No connection, 16 Substitute, 32 Device error, 64 Device-specific error, 128 Not connected) - Retime points: shift the timestamp of selected (or all loaded) points by a calendar-aware offset, or normalize them to the start of the minute/hour/day/week/month/year (local time, DST-aware) — both via the "Retime in range" button with the usual preview/confirm step. A single point's timestamp can also be edited in place (double-click a cell in the Time column)
Column headers use Tabulator's standard click behavior, not anything custom to influxWeb:
- Click a header to sort by that column alone.
- Shift+click another header to add it as a further sort level. The most-recently Shift-clicked column becomes the new primary sort key, and any columns sorted before it become tiebreakers underneath it.
This takes a moment to get used to, but covers the common case of wanting to read one measurement's values in chronological order without any extra UI:
- Click Time to sort by it.
- Shift+click Measurement. Measurement becomes the primary sort, with Time still applied underneath as the tiebreaker - so within each measurement, rows come out time-ordered.
Installs influxWeb as a systemd service on a Raspberry Pi (or any Linux host with
systemd), running under its own dedicated system user, into /opt/influxweb.
curl -sLf https://raw.githubusercontent.com/MyHomeMyData/influxWeb/main/deploy/install.sh | sudo bash -This clones the repo into /opt/influxweb, creates the dedicated influxweb
system user, sets up the virtual environment, installs the systemd unit, and
installs the influxweb-upgrade/influxweb-uninstall commands (see
Upgrading and Uninstalling) — it does not start
the service yet, since InfluxDB access still needs to be configured. After it
finishes:
- Fill in InfluxDB access:
The
sudo -u influxweb nano /opt/influxweb/.env # fill in INFLUX_URL / INFLUX_TOKEN / INFLUX_ORG.env.examplepre-setsINFLUXWEB_MODE=iobroker. Set it todefaultto disable ioBroker-specific behaviour (see above for details). - Start the service:
sudo systemctl enable --now influxweb - Open
http://<pi-host>:8085/from another machine on your LAN.
Equivalent step-by-step version of the above, if you'd rather not pipe a script
into sudo bash, or want to adjust something along the way.
- Clone the repository:
sudo git clone https://github.com/MyHomeMyData/influxWeb.git /opt/influxweb
- Create a dedicated system user (matches
User=/Group=indeploy/influxweb.service) and hand it ownership of the install.--home-dirpoints it at/opt/influxwebitself, since that's the only directory it owns - without it, tools likepipfall back to a non-existent default home and disable their cache with a permissions warning:sudo useradd --system --no-create-home --home-dir /opt/influxweb --shell /usr/sbin/nologin influxweb sudo chown -R influxweb:influxweb /opt/influxweb
- Create the virtual environment and install dependencies:
sudo -u influxweb python3 -m venv /opt/influxweb/.venv sudo -u influxweb /opt/influxweb/.venv/bin/pip install -r /opt/influxweb/requirements.txt
- Configure InfluxDB access:
sudo -u influxweb cp /opt/influxweb/.env.example /opt/influxweb/.env sudo -u influxweb nano /opt/influxweb/.env # fill in INFLUX_URL / INFLUX_TOKEN / INFLUX_ORG.envis gitignored — never commit it. - Install and start the systemd service:
sudo cp /opt/influxweb/deploy/influxweb.service /etc/systemd/system/ sudo systemctl daemon-reload sudo systemctl enable --now influxweb - Open
http://<pi-host>:8085/from another machine on your LAN.
influxWeb binds 0.0.0.0 by default — keep it reachable only from your LAN (no
router port-forward); there is no authentication built in.
sudo influxweb-upgradeInstalled automatically by Quick install above — pulls the latest code, updates dependencies, and restarts the service. If you used the manual installation instead, do the same steps by hand:
cd /opt/influxweb
sudo -u influxweb git pull
sudo -u influxweb .venv/bin/pip install -r requirements.txt
sudo systemctl restart influxwebCheck the Changelog below for anything version-specific to be aware of before upgrading. The current running version is shown in the page header.
sudo influxweb-uninstallInstalled automatically by Quick install above. After a confirmation prompt,
stops and removes the service, /opt/influxweb (including .env), the
influxweb system user, and the influxweb-upgrade/influxweb-uninstall
commands themselves. If you used the manual installation, you're on your own
for cleanup — stop/disable the service, then remove the systemd unit,
/opt/influxweb, and the system user.
For trying out influxWeb without installing it as a service:
python3 -m venv .venv
.venv/bin/pip install -r requirements.txt
cp .env.example .env # then fill in INFLUX_URL / INFLUX_TOKEN / INFLUX_ORG
.venv/bin/uvicorn app.main:app --reload --host 0.0.0.0 --port 8085Open http://localhost:8085/ (or http://<host>:8085/ from another machine on the LAN -
uvicorn only listens on 127.0.0.1 unless --host 0.0.0.0 is passed explicitly).
(MyHomeMyData) In INFLUXWEB_MODE=iobroker, the metadata fields ack, from, and
q are now editable inline in the data table:
- Field-based storage:
ack/from/qappear as editable field columns (instead of read-only synthetic tag columns);quses a dropdown of the eight known ioBroker quality-flag values; unknown values appear as an extra option - Tag-based storage: double-clicking
ack,from, orqopens a confirm dialog that writes a new point with the changed tag and deletes the old one (same write-before-delete pattern as Retime)
Also fixed: q was displayed as a decimal (0.0) in field-based mode — now shown
as an integer (0).
(MyHomeMyData) Added INFLUXWEB_MODE=iobroker for transparent, full-featured
support of ioBroker's InfluxDB adapter — covering both its tag-based and field-based
storage variants simultaneously, auto-detected per measurement at query time.
In iobroker mode, field-based data is grouped into one row per logical point on the backend (measurement + timestamp → one display row with ack/from/q shown as synthetic tag columns). All operations work correctly for both storage variants:
- Add point: dedicated form with ack/from/q fields; writes four single-field calls that InfluxDB merges into one complete point
- Inline edit: writes to the correct tagless series (not a new tagged one)
- Delete / Retime: use empty tags for field-based points, correctly identifying the series by measurement and timestamp alone
- ODS Export: one row per point; ack/from/q stored in
extra.*columns (e.g.extra.ack,extra.ack_type) alongside the main value — round-trip safe - ODS Import: detects
extra.*columns and writes each as a separate field to the same series+timestamp; InfluxDB merges them into one complete point. Also fixed LibreOffice re-saving boolean cells as numeric (1/0) breaking import
The "Group fields by point" toggle is hidden in iobroker mode (grouping is always active). In default mode, all existing behavior is unchanged.
Also fixed in this release: number-input stepper buttons (▲▼) in the inline cell editor triggered the confirm modal immediately on click instead of waiting for Enter or blur.
(MyHomeMyData) Fixed several point-count inconsistencies introduced by 0.2.0's "Group fields by point" toggle: the toolbar buttons, Retime/Delete dialogs, and the points-loaded status line could show the raw per-field row count instead of the logical point count, and toggling grouping didn't refresh the status line (in one case leaving "Querying..." stuck after a query that legitimately returned zero points). Also fixed Delete sending one redundant delete call per field of a point instead of one per point.
(MyHomeMyData) Added a warning in the Retime confirmation dialog when a hand-edited timestamp introduces sub-millisecond precision that wasn't there before, since this is usually an accidental stray edit of the trailing digits rather than intentional (found by Marc Berg while testing 0.2.0).
(Marc-Berg) Added a "Group fields by point" Data View toggle, pivoting one row per field into one row per logical reading - mainly useful for ioBroker buckets using field-based storage.
(MyHomeMyData) Fixed an unfiltered selection querying the entire bucket, and incorrect row order for ioBroker's field-based storage mode. Documented current support boundaries between ioBroker's tag-based and field-based storage modes.
(MyHomeMyData) Initial beta release.
MIT, see LICENSE.