npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

iobroker.automatic-pond-aeration

v0.1.19

Published

Controls and monitors a pond aeration system: switches valves at up to 8 aeration points by schedule, cyclic round-robin or groups, with a pump safety interlock, optional oxygen/temperature/pressure monitoring, astro times and geolocation.

Downloads

2,302

Readme

Logo

ioBroker.automatic-pond-aeration

NPM version Downloads Number of Installations Current version in stable repository

NPM

Tests: Test and Release



automatic-pond-aeration adapter for ioBroker

This adapter controls and monitors a pond aeration system. An air pump/compressor feeds air through valves (solenoids) to up to 8 aeration points in the pond. The adapter switches those valves by a time schedule, a cyclic round-robin, or a group program, and it protects the pump with a safety interlock: while the pump runs, at least one valve is always kept open – otherwise the emergency valve is opened and (if the pump is available as a data point) the pump is switched off.

Optionally it can monitor dissolved oxygen, air and water temperature and pressure, compute astronomical times from your geolocation, drive the hardware directly on an ESP32 (no additional ioBroker instance required), and pause selected aeration points during feeding when ioBroker.automatic-feeder is installed.

🛑 WARNING — DEVELOPMENT STATUS, ANIMAL WELFARE (please read). This adapter is still under active development and is NOT yet verified for unattended use. It controls a life-support system for living animals — a malfunction, misconfiguration or bug can stop the aeration and endanger the health and life of your fish and other pond life (oxygen depletion, no ice-free hole in winter, a dead-headed pump). Do not use it unchecked: before any unattended operation, observe it closely and verify every function on your own hardware over a meaningful period, and keep an independent, proven aeration/failsafe in place. Use at your own risk. (This notice remains until explicitly revoked.)

⚠️ Project status. Fully implemented and configurable from the admin: valve control (schedule, cyclic round-robin, groups), the dead-head safety interlock, monitoring (oxygen, air/water temperature, pressure with alarms), astronomical times & geolocation, the feeder coupling, the winter / ice-free mode, the oxygen closed loop, notifications via a messaging adapter, runtime statistics, a dry-run test mode, per-point override buttons, and the direct ESP32 hardware backend (talks to the reference firmware over HTTP — flash it in your browser from the firmware flash page). The default backend drives your valves and pump through existing ioBroker states, so any relay board works.

🇩🇪 Deutsche Anleitung: doc/de/README.md · other languages: see Documentation at the bottom.

📘 Complete step-by-step manual (PDF, for beginners — with wiring diagrams, FAQ & troubleshooting): English → docs/manual/pond-aeration-manual.en.pdf · Deutsch → docs/manual/pond-aeration-manual.de.pdf (source & build under docs/manual/).


Table of contents

  1. What the adapter does
  2. Safety concept
  3. Requirements
  4. Installation
  5. Configuration
  6. Objects / data points
  7. Roadmap

1. What the adapter does

A pond aeration distributes air from a single pump to several diffusers/air stones. Which points receive air is decided by solenoid valves. This adapter decides when each valve opens:

  • Schedule – open a point/group during configured weekday time windows.
  • Cyclic round-robin – rotate through the points, each open for a configurable dwell time.
  • Groups – control several points together; there can never be more groups than points.

The valves and the pump are driven either through existing ioBroker states (from any adapter that exposes the switches) or directly on a dedicated ESP32 controller running the reference firmware — no extra ioBroker instance needed. You choose this under Hardware backend (General tab); see Configuration → General.

2. Safety concept

An air compressor must never run against fully closed valves (dead-heading) – this causes overpressure and can damage the pump. Therefore:

  • While the pump runs, at least one valve is always kept open (configurable minimum).
  • If that cannot be guaranteed, the emergency valve is opened and, if the pump is controllable, the pump is switched off.
  • Valve switching uses make-before-break (the next valve opens before the previous one closes), so there is never a moment with all valves closed.

💡 Wiring recommendation: use a normally-open (NO) emergency valve so it opens on power loss (fail-safe). When the hardware runs on an ESP32, the same interlock also runs locally on the device, so a network or ioBroker outage cannot damage the pump.

3. Requirements

  • Node.js ≥ 22
  • js-controller ≥ 6.0.11, admin ≥ 7.6.20
  • One or more valves reachable as ioBroker states (e.g. a relay/smart-plug adapter).

4. Installation

Install the adapter from the ioBroker admin (or, during development, from the GitHub repository) and create an instance. Open the instance settings to configure it.

5. Configuration

The settings page is organised into tabs. You do not have to fill in everything — only the parts you use.

General

  • Master enable – the on/off switch for the whole adapter. When off, nothing is controlled.
  • Dry-run (log only, do not switch hardware) – the whole control engine runs and the data points update, but valve/pump commands are only written to the log ([DRY-RUN] would …) instead of the real states. Ideal for commissioning and testing a configuration before wiring it up.
  • Hardware backendExisting ioBroker states (default) drives your valves/pump through states of other adapters. ESP32 (direct) talks to the reference firmware on a Waveshare ESP32-S3-POE-ETH-8DI-8RO over HTTP. Flash the firmware in your browser from the firmware flash page (Chrome/Edge, no extra software), then set the host/IP and map the emergency-valve relay and pump relay (0–7); the aeration points use the relay channel set per point. The adapter pushes a safety config and a heartbeat so the firmware's on-device failsafe protects the pond even if ioBroker is down. The device is reached over its IP — via Ethernet/PoE (Power over Ethernet — data + power on one cable) or optional WiFi (enabled on the device's own Settings page; WiFi needs the device's external antenna — see the manual). With no LAN at the pond, the device can be set up entirely over WiFi via its built-in setup hotspot (pond-aeration-setup, captive portal — the phone's browser opens the config page automatically — at http://192.168.4.1/) — see the manual.
    • Autonomous schedule (run without ioBroker) (ESP32 only, optional) – when enabled, the adapter also pushes your time schedules to the device; if the connection drops, the ESP32 keeps running them on its own using its NTP clock (NTP = internet time sync; the dead-head safety interlock still applies). The cyclic sequence stays with the adapter.
    • Firmware compatibility – the adapter and the firmware are matched by a protocol version (the hard contract), not by exact release numbers. This adapter version speaks protocol 1 and recommends firmware v1.7.10 (minimum v1.0.0); the admin shows this and links to the releases. On connect, the device's version and a compatibility flag are published as info.deviceFirmware and info.firmwareCompatible, and any protocol mismatch is written to the log. See the compatibility table in the manual / firmware repo.
    • Licensing (only if your firmware ships the optional licensing overlay) – the device runs a tier: free (monitoring only), community (relay control) or pro (+ the autonomous standalone schedule); safety (failsafe, emergency valve, dead-head interlock, hand buttons) is always active regardless. A new device runs fully (pro) for a 30-day trial, then falls back to free until an activation key is entered on the device's /license page. The adapter shows the status under info.licenseTier / info.licenseTrialDaysLeft / info.deviceCode; if the device is not licensed for control, monitoring keeps working and control is skipped (see info.licenseControlBlocked). Public firmware without the overlay is unaffected. Re-flashing note: the activation key is stored on the ESP and is erased when you re-flash via the browser installer (a fresh trial starts). The device code is hardware-derived and never changes, so the same activation key can simply be re-entered — no new key needed. A firmware update via the device's Update page (one-click online update or file upload) keeps the activation and all settings; only the installer resets it.
    • Sensor mirroring – each poll the adapter also pushes your configured sensor data points (oxygen, water/air temperature, pressure) to the device, so they appear on the ESP's own web UI (tagged (ioBroker)) even for sensors that are only ioBroker states and not wired to the ESP. A physically wired ESP sensor keeps priority; pushed values drop out after a few minutes. Needs firmware ≥ 1.1.7.
  • Poll interval (s) – how often the backend status is polled (e.g. 30).

Aeration points

The heart of the configuration. Add up to 8 points; each one is one valve. Per point:

  • Name – e.g. Pier, Deep zone. With the ESP32 backend this name is also shown on the device's own web UI (on the relay channel of the point) — a licensed feature (from tier community). Ch 7 = Notventil (emergency valve) and Ch 8 = Pumpe (pump) are fixed labels. See Names on the ESP32 web UI.
  • Enabled – include this point in the control.
  • BackendioBroker (a foreign state) or ESP32 (a relay channel on the device). The ESP32 option only appears when the Hardware backend (General tab) is ESP32 (direct).
  • Valve state / channel – for the ioBroker backend, pick the switch state that opens the valve (via the object browser). For the ESP32 backend, choose the relay channel from a drop-down: the channels driving the pump and the emergency valve are shown as reserved and channels already taken by another point as in use, so you can only pick a free one. When no channel is left, add further points as ioBroker states via the Backend column.
  • Override button (optional) – a physical push-button per point (e.g. an ESP32 digital input, or any boolean state). It works as a toggle: one press forces the point on with priority over the automatic control (schedule/sequence/winter/oxygen) and even over a feeder pause — only the master switch or a safety trip overrides it. Press again to release. (More button modes are planned; the field is prepared for them.) A button is only available for an aeration valve — a point that sits on the ESP32 pump or emergency-valve relay channel cannot have one (the option is greyed out). With the ESP32 backend, a button pressed at the device is reflected back into ioBroker (aeration.point.<n>.buttonOn) and gets the same priority.
  • Button name (ESP32 backend, optional) – a friendly name for this point's override button, shown on the device web UI (see below). Empty → the button shows the point name.

Names on the ESP32 web UI

(ESP32 backend, licensed feature — available from tier community.) Give your channels and buttons friendly names that appear on the device's own web pages instead of Ch 1…8 / DI 1…8:

  • The adapter pushes each aeration point's Name to its relay channel (Ch 1–6) and each point's optional Button name to the matching digital input (DI 1–8).
  • Ch 7 = Notventil (emergency valve) and Ch 8 = Pumpe (pump) are fixed and cannot be renamed.
  • Standalone (no adapter): the same names can be edited on the device under Settings → Namen (Kanäle & Taster) and are stored on the ESP (NVS — the device's non-volatile settings memory); when the adapter is connected it overwrites them with the names configured here.
  • On free (unlicensed) firmware the names are ignored and the pages show the default Ch/DI labels.

Groups

Group points to switch them together (e.g. one button opens several diffusers). Give the group a name and tick its member points. There can never be more groups than points.

Control

  • Cyclic round-robin – rotate through the points, each open for the dwell time (seconds).
    • Sequence (points and groups) – optionally define an ordered cycle of steps, where each step targets a single point or a whole group and may carry its own dwell time. This lets you run e.g. group 1 → group 3 → point 1 → … and freely mix points and groups. Reorder the steps with the up/down arrows. Leave the sequence empty to fall back to the plain round-robin over all points.
  • Schedules – open selected points/groups during a weekday time window. Pick From/To from a clock picker (hour/minute, 24 h; overnight windows like 22:0006:00 are supported). An active schedule has priority over the round-robin / sequence.
  • Winter / ice-free mode – during the configured season (Start/End chosen from a calendar — only day and month count, recurring every year, e.g. 1 Nov – 15 Mar, wrapping across the new year) the selected points are forced on to keep an ice-free hole open. Optionally tick Only when it is cold (frost protection) and set an air temperature threshold so the pond is only aerated while it is actually freezing (this needs air-temperature monitoring). Leave Points kept open empty to aerate the whole pond. Winter mode runs in the auto operating mode and, like every program, still yields to the safety interlock and a feeder pause.

Sensors

Optional monitoring. For each sensor tick Enabled and pick the source state:

  • Dissolved oxygen – with a low threshold (raises sensors.oxygenAlarm), a target and a hysteresis; the oxygen saturation % is computed from the water temperature.
    • Oxygen closed loop – when enabled, the adapter forces aeration on while the oxygen is below the low threshold and keeps it on until it recovers to the target (or low + hysteresis when no target is set). Leave Boosted points empty to boost the whole pond. Like winter mode, the loop runs in the auto mode and yields to safety and feeder pauses.
  • Air / water temperature.
  • Pressure – with min/max (out of range raises sensors.pressureAlarm).

Location

Needed for the astronomical times (sunrise/sunset/night).

  • Location sourceioBroker system location (uses your system coordinates) or Custom location. For a custom location, type an address and press Search (geocoded via OpenStreetMap/Nominatim on demand) or click/drag the marker on the map.

Feeder

Pause selected points while ioBroker.automatic-feeder is feeding, so the food is not blown around.

  • Pick the feeder instance (auto-discovered) and tick the feeder switches to watch.
  • Duration modeMeasure watches the switch (pause = feeding + offset, without knowing the feeding duration in advance); Pulse uses a fixed feeding duration.
  • Offset (s) – extra pause after feeding ends. It should be at least the average time the animals need to eat (example: 15 s feeding + 60 s offset ⇒ 75 s of paused aeration).
  • Affected points – which points pause during feeding.

Safety

Every field on this tab carries an in-admin explanation of what it does and its effect — read them, because this is the tab where a wrong value matters most.

  • Min. open valves while pump runs – the dead-head protection (default 1).
  • Watchdog interval (s) and make-before-break overlap (s).
  • Pump – whether it is controllable, the pump signal, and anti short-cycle min on/off times. When controllable, the adapter drives the pump to follow the aeration demand — it runs while at least the minimum valves are open and switches off when the pond is idle or on a dead-head trip (honouring the min on/off times); when not controllable the pump is only observed and the emergency valve alone protects it. With the ESP32 backend the pump signal is the ESP32 relay channel — the very same one set under General → Hardware backend, shown here so the two tabs can never disagree; with the ioBroker backend it is an ioBroker state.
  • Emergency valve – its signal, whether it is normally open (fail-safe), the valve type (solenoid or motorized ball valve) and, for a motor valve, its travel time. With the ESP32 backend the signal is likewise the ESP32 emergency-valve relay channel (same as General).

Notifications

Enable notifications and pick a messaging instance (any adapter of type messaging, e.g. Telegram or Pushover), then tick which events should send a message:

  • Safety interlock – when the dead-head interlock trips or clears;
  • Oxygen alarm – when dissolved oxygen drops too low or recovers;
  • Pressure alarm – when the pressure leaves or re-enters its range.

A short, localized text is sent on each edge (raise and clear). With no event ticked, nothing is sent.

Feeding does not spam the interlock notification. When the feeder pauses the aeration points, all valves close and the emergency valve opens – this is normal, so the interlock notification is suppressed for the duration of the feeding pause. A real problem still reaches you: if the pump actually dead-heads against closed valves the pressure alarm fires on its own. If you do want to be alerted for the interlock during feeding, enable “Also notify the interlock during feeding” (the notifyInterlockDuringFeeding option, shown under the interlock event).

6. Objects / data points

The adapter creates its data points from your configuration. Placeholders: <n> = aeration point index (0–7), <g> = group index. Objects marked (w) are writable commands; all others are read-only status values updated by the adapter.

General

| Object | Type | Role | Description | |--------|------|------|-------------| | info.connection | boolean | indicator.connected | Adapter running / configuration valid | | info.backend | string | text | Active hardware backend (iobroker or esp32) | | info.activeMode | string | text | Current operating mode | | info.dryRun | boolean | indicator | Dry-run active (no hardware is switched) |

ESP32 backend (info) (only with the ESP32 hardware backend)

| Object | Type | Role | Description | |--------|------|------|-------------| | info.deviceFirmware | string | text | Firmware version reported by the ESP32 | | info.firmwareCompatible | boolean | indicator | Firmware protocol is compatible with this adapter | | info.licenseTier | string | text | Active licence tier: free (monitoring), community (relay control) or pro (+ standalone schedule); empty if the firmware is ungated | | info.licenseTrialDaysLeft | number | value | Licence trial days remaining (0 = no trial running) | | info.deviceCode | string | text | Device code — give this when unlocking to receive an activation key | | info.licenseControlBlocked | boolean | indicator | The device rejected a control command (not licensed for control) |

Control (writable commands)

| Object | Type | Role | Description | |--------|------|------|-------------| | control.enabled | boolean (w) | switch.enable | Master enable | | control.mode | string (w) | text | Operating mode: auto, manual or off | | control.allOff | boolean (w) | button | Close all valves | | control.point.<n>.open | boolean (w) | switch | Manually open the valve of point <n> | | control.group.<g>.active | boolean (w) | switch | Manually activate group <g> |

Aeration points (one channel per configured point, named after the point)

| Object | Type | Role | Description | |--------|------|------|-------------| | aeration.point.<n>.valveState | boolean | indicator | Valve is open | | aeration.point.<n>.active | boolean | indicator | Point is currently aerating | | aeration.point.<n>.buttonOn | boolean | indicator | Manual override button active (only with a button configured) | | aeration.point.<n>.runtimeTodaySec | number | value | Runtime today (seconds) | | aeration.point.<n>.runtimeTotalH | number | value | Total runtime (hours, for maintenance) | | aeration.point.<n>.lastChange | number | value.time | Timestamp of the last valve change | | aeration.point.<n>.error | string | text | Last error for this point |

Groups

| Object | Type | Role | Description | |--------|------|------|-------------| | groups.<g>.members | string | json | Member point indices | | groups.<g>.active | boolean | indicator | Group is currently active |

Safety

| Object | Type | Role | Description | |--------|------|------|-------------| | safety.interlockActive | boolean | indicator.alarm | Safety interlock currently active | | safety.emergencyValve | boolean | indicator | Emergency valve is open | | safety.pumpRunning | boolean | indicator | Pump is running | | safety.openValveCount | number | value | Number of open valves | | safety.lastTripReason | string | text | Reason of the last interlock trip |

Sensors (only created when the corresponding monitoring is enabled)

| Object | Type | Role | Description | |--------|------|------|-------------| | sensors.oxygen | number | value | Dissolved oxygen (mg/l) | | sensors.oxygenSaturation | number | value | Oxygen saturation (%) | | sensors.oxygenAlarm | boolean | indicator.alarm | Oxygen below the low threshold | | sensors.oxygenBoostActive | boolean | indicator | Oxygen closed loop is forcing aeration on (only with the loop enabled) | | sensors.airTemperature | number | value.temperature | Air temperature (°C) | | sensors.waterTemperature | number | value.temperature | Water temperature (°C) | | sensors.pressure | number | value.pressure | System pressure (bar) | | sensors.pressureAlarm | boolean | indicator.alarm | Pressure out of range |

Astronomy & location

| Object | Type | Role | Description | |--------|------|------|-------------| | astro.sunrise / astro.sunset / astro.solarNoon | string | text | Sun times for the location | | astro.isNight | boolean | indicator | It is currently night | | location.latitude / location.longitude | number | value.gps.* | Resolved coordinates | | location.resolvedAddress | string | text | Resolved address |

Feeder coupling (only created when the feeder coupling is enabled)

| Object | Type | Role | Description | |--------|------|------|-------------| | feeder.pauseActive | boolean | indicator | Aeration paused for feeding | | feeder.pauseUntil | number | value.time | Pause active until | | feeder.lastFeedStart | number | value.time | Last feeding start |

Winter / ice-free mode (only created when winter mode is enabled)

| Object | Type | Role | Description | |--------|------|------|-------------| | winter.active | boolean | indicator | Winter mode is currently forcing aeration on | | winter.frostActive | boolean | indicator | Frost protection is engaged (cold enough) |

Statistics (per-point runtimes are listed above under Aeration points)

| Object | Type | Role | Description | |--------|------|------|-------------| | statistics.compressorRuntimeTodayH | number | value | Compressor runtime today (hours) | | statistics.switchCyclesToday | number | value | Valve switch cycles today |

When a point, group or sensor is removed from the configuration, its objects are cleaned up automatically.

7. Roadmap

Done: configuration UI, valve control (schedule/round-robin/groups), the dead-head safety interlock, monitoring, astro & geolocation, the feeder coupling, the winter / ice-free mode, the oxygen closed loop, notifications, runtime statistics, the dry-run test mode and the direct ESP32 hardware backend with its reference firmware (flash it in your browser from the firmware flash page). Still to come:

  • a follow-up vis-2 widget adapter for operation and monitoring.

See PROJECT_PLAN.md for the complete, milestone-based plan.

Changelog

0.1.19 (2026-07-15)

  • (ssbingo) Build/CI: the release workflow now uses the shared ioBroker/testing-action-deploy@v1 (it installs npm@11 and publishes via OIDC trusted publishing), replacing the hand-rolled deploy steps that existed only to work around npm 12's broken provenance. Clears repo-checker warning W3017. No functional or user-facing change

0.1.18 (2026-07-11)

  • (ssbingo) Repo hygiene. Removed two stale, unused admin i18n keys (days left, trial) from all 10 non-English translations, and added the manual's build-tooling directory to the dependabot config (clears repo-checker warnings W5605 / W8905). No functional or user-facing change

0.1.17 (2026-07-11)

  • (ssbingo) Documentation readability polish. Follow-up to the 0.1.16 cross-check: the on-device web-UI page list and the licensing tiers in the PDF manual are now bulleted lists instead of dense paragraphs; the acronyms PoE / NTP / NVS and captive portal are explained on first use in the README; a duplicated per-point runtime row was removed from the README's Statistics table; and an EN↔DE data-point table row order was aligned. EN/DE PDF manual rebuilt. No functional change

0.1.16 (2026-07-11)

  • (ssbingo) Documentation cross-check & refresh across the whole project. A full audit of every document — the adapter README, the beginner PDF manual (EN/DE), all 10 translated docs, and (in the firmware / licence-tool / flash-page repos) the firmware README, PROTOCOL, INSTALL guides, the licence tool and the browser flash page — corrected stale facts and filled gaps. Highlights on the adapter side: the recommended firmware is now stated as v1.7.10 everywhere (README body, manual EN/DE and all 10 translated docs previously said v1.1.0 / v1.6.0); the Notifications section now documents the feeding behaviour — the emergency valve opening during a feeding pause is not notified, plus the new “Also notify the interlock during feeding” (notifyInterlockDuringFeeding) opt-in; the device timezone dropdown is documented in the manual; the outdated “firmware still being completed” note was removed; and the setup-hotspot captive-portal address (http://192.168.4.1/) and the 30-day trial are spelled out. EN/DE PDF manual rebuilt. No functional change to the adapter

0.1.15 (2026-07-11)

  • (ssbingo) New option “Also notify the interlock during feeding” (Notifications tab, default off). Since 0.1.14 the emergency valve opening while the feeder pauses the aeration points is treated as normal and not notified; enable this switch if you do want to be alerted for that interlock trip during feeding as well. The pressure-sensor alarm keeps its own notification either way. New config notifyInterlockDuringFeeding; admin string localized in 11 languages

0.1.14 (2026-07-11)

  • (ssbingo) No more alarm messages for the emergency valve opening during feeding. When the feeder pauses the aeration points (all valves closed for feeding), the dead-head interlock opening the emergency valve is normal and expected — it no longer sends a notification. A genuine problem still reaches you: the pressure-sensor alarm keeps its own notification, so if the pump actually dead-heads against closed valves you are warned. An interlock trip that persists after feeding ends is still escalated as usual, and the "interlock cleared" message is only sent for trips that were actually announced

0.1.13 (2026-07-10)

  • (ssbingo) Fix: the ESP32 device no longer flaps into failsafe every ~15 s. The adapter used to send the on-device safety heartbeat only together with the status poll (every pollIntervalSec, default 30 s), while the firmware trips its failsafe after 15 s without a heartbeat — so at any normal poll interval the device dropped into failsafe (emergency valve open, pump off) roughly every 15 s and recovered on the next poll. The heartbeat now runs on its own fast 5 s timer, independent of the status poll, and the failsafe timeout is a fixed 15 s (three heartbeats). pollIntervalSec now only controls how often the full status is refreshed and no longer affects failsafe stability
  • (ssbingo) Recommend firmware v1.7.10 — the one-click online update now works. The real cause was an HTTP route collision in the firmware (the file-upload route silently shadowed the online-update route and just rebooted the device); firmware 1.7.9 fixes it. Firmware 1.7.x also adds a timezone dropdown in the device settings (pick e.g. Europe/Berlin instead of a POSIX string). Recommended-firmware note lib/firmware-compat.js 1.7.1 → 1.7.10

0.1.12 (2026-07-10)

  • (ssbingo) Setup hotspot for WiFi-only installs + online-update fix — recommend firmware v1.7.1. The reference firmware 1.7.1 adds a setup hotspot (Option A): with no LAN at the pond, if neither Ethernet nor WiFi comes up shortly after boot the device opens its own WiFi pond-aeration-setup with a captive portal, so it can be configured entirely from a phone (http://192.168.4.1/); the hotspot closes itself once the device is online (needs the external antenna, and can be opened/closed or disabled on the Settings page). It also fixes the one-click online update: the download now runs in a dedicated large-stack task (the old path overflowed the loop-task stack and silently rebooted mid-download) and leaves a crash-surviving breadcrumb so any failure is visible after the reboot. Every log line now carries a date + time, and the mandatory-antenna note is more prominent. Recommended-firmware note (lib/firmware-compat.js 1.6.0 → 1.7.1), README, all 10 translated docs and the EN/DE PDF manual updated with the setup hotspot. No change to the control engine
  • (ssbingo) A hidden pro-dev tier unlocks the on-device diagnostic log window for support/debugging (issued by the maintainer's own licence tool; not publicly documented). Existing community/pro devices can be upgraded to it and downgraded back by entering a code on the device's Licence page

0.1.11 (2026-07-10)

  • (ssbingo) Optional WiFi for the ESP32 device and recommend firmware v1.6.0. The reference firmware 1.6.0 can now join a WiFi network in addition to Ethernet — enable/disable and configure it (SSID + password) on the device's Settings page, applied live; it needs the device's external antenna (shipped with the reference device). It also adds an on-device diagnostic log with a level filter and a full OTA-update trace (for pinpointing update problems). The adapter now treats any non-free licence tier as licensed for control (covers higher tiers automatically). Recommended-firmware note (lib/firmware-compat.js 1.4.0 → 1.6.0), README, all 10 translated docs and the EN/DE PDF manual updated with WiFi and the mandatory-antenna note. No change to the control engine

0.1.10 (2026-07-10)

  • (ssbingo) Recommend firmware v1.4.0 and document its new on-device Log / Debug page (/log). The reference firmware 1.4.0 adds a live diagnostic log — boot, Ethernet, licence, operating mode and the full OTA online-update trace with the exact failure reason — the place to analyse an update or connection problem over the network. The recommended-firmware note (lib/firmware-compat.js 1.2.2 → 1.4.0) was updated across the README, all 10 translated docs and the EN/DE PDF manual (now listing seven device pages). No functional change to the adapter

Older changelogs can be found there

Documentation

License

MIT License

Copyright (c) 2026 ssbingo [email protected]

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.