Releases: ssbingo/ioBroker.automatic-feeder
Release list
Release v1.18.4
- Node.js 26 is now part of the CI test matrix ([22.x, 24.x, 26.x]) via the
template PR #32; this release exercises it. Minimum Node.js stays 22
(engines unchanged). - Updated the @iobroker/testing devDependency 5.2.2 -> 6.x (repository
checker suggestion S0064). Verified: 72 js tests, 58 package tests and the
integration test (adapter starts) pass with testing 6.2.1.
Test tooling / CI only; no functional/code changes. README changelog +
German PDF handbook to 1.18.4.
Co-Authored-By: Claude Opus 4.8 noreply@anthropic.com
Release v1.18.3
Repository-checker warning W0034: @iobroker/adapter-core was specified as
^3.4.1 while 3.4.3 is current. Bumped the runtime dependency to ^3.4.3
(lockfile updated). No functional/code changes.
Gates green: lint, tsc, 72 js tests, 57 package tests, integration (adapter
starts with adapter-core 3.4.3). README changelog + German PDF handbook to
1.18.3.
Co-Authored-By: Claude Opus 4.8 noreply@anthropic.com
Release v1.18.2
Merged Dependabot updates (#28/#29/#30) from GitHub:
- @iobroker/adapter-react-v5 8.3.2 -> 8.3.3
- @tsconfig/node22 22.0.5 -> 22.0.6
- dayjs 1.11.21 -> 1.11.23
MUI stays at 6 (adapter-react-v5 8.3.3 still peer-depends on @mui/material
^6.5.0 and imports Grid2). Rebuilt the admin UI (admin/build) against the
updated dependencies. No functional/code changes; gates green (lint, tsc,
build, 72 js, 57 package). README changelog + German PDF handbook to 1.18.2.
Co-Authored-By: Claude Opus 4.8 noreply@anthropic.com
Release v1.18.1
The pre-feeding announcement spoke a stale/old text via Sayit (e.g. a
previous test message) while Telegram was correct. Root cause: the adapter
triggered speech by writing the sayit tts.text (+ separate tts.volume with a
delay) states, which Sayit's queue could replay stale and which raced the
volume write.
- writeSayit() now uses Sayit's documented
saymessage command
(sendToAsync(instance, 'say', { text, volume })) — atomic, includes the
volume, no state-write race. Affects the announcement, notifications and
the Sayit test button (all go through writeSayit). - Removed the now-unused SAYIT_VOLUME_DELAY_MS + tts.* state writes.
- README changelog + German PDF handbook (cover) updated to 1.18.1.
Co-Authored-By: Claude Opus 4.8 noreply@anthropic.com
Release v1.18.0
Replaces the per-switch feed profiles (v1.17.0) with a central, user-
maintained feed list.
- New global native.feeds: {id, name, vendor, size, protein, fat, fibre,
ash, url}. New "Feed list" admin tab (FeedsTab.jsx) to maintain it; the
offer/purchase link is an optional, collapsible field. - Per switch: activeFeed is now a feed id (string, was a numeric profile
index). SwitchTab gets a "Currently loaded feed" dropdown reading the
central list; the feed-profiles editor is removed. Dispense rate stays
per switch (dispenseGramsPerSec, calibration helper unchanged). - main.js: feedList()/feedById()/activeFeedOf(); dispenseRateFor() now
returns the per-switch rate; recomputeFeedAmount writes the new
status.activeFeed* states; info.feeds mirrored as JSON in
createGlobalObjects; SWITCH_SETTINGS.activeFeed is a string (settings
state type migrated via extendObject); NUMERIC_BOUNDS.activeFeed removed. - One-time migrateFeedList(): merges existing feedProfiles into native.feeds
(dedup by name), backfills dispenseGramsPerSec from the active profile,
maps activeFeed index -> id, drops feedProfiles. Guard feedListMigrated. - New states: info.feeds and per switch status.activeFeedName / Vendor /
Size / Protein / Fat / Fibre / Ash / Url. Widget reads these later
(widget repo issue #33). Closes #25, #26. - Docs updated in all 11 languages + German PDF handbook; admin i18n +21/-3
keys x11. Gates green (lint, tsc, admin build, 72 js, 57 package,
integration incl. migration).
Co-Authored-By: Claude Opus 4.8 noreply@anthropic.com
Release v1.17.0
Instead of a single dispense rate, each switch can now define several named
feed profiles, each with its own calibrated rate (g/s). The active profile's
rate drives Phase B; the calibration helper fills the active profile. The
active feed is switchable from VIS via the writable settings.activeFeed state.
Backward compatible: with no profile the single dispenseGramsPerSec is used.
- main.js: feedProfiles/activeFeed config; feedProfilesOf/dispenseRateFor/
activeFeedName helpers; amountControlSeconds uses the active rate; new states
status.dispenseRate + status.activeFeedName; settings.activeFeed writable mirror - config/types/Settings: feedProfiles [] + activeFeed 0
- SwitchTab: feed-profiles editor (name + g/s + active radio + add/remove);
calibration now fills the active profile - i18n: +6 keys x 11 languages (242 each)
- docs: all 11 READMEs + German PDF handbook
Co-Authored-By: Claude Opus 4.8 noreply@anthropic.com
Release v1.16.0
Issue #23 — high-temperature throttling: the percentage table is no longer
monotonic. The top band now ends at 28 °C and two new editable bands throttle
the amount in the heat (1.5 % at 28-30 °C, 0.5 % above 30 °C), since the
temperature response peaks around 24-26 °C and falls off above it. Behaviour
up to 28 °C is unchanged; existing switches get the new bands via defaults.
Issue #24 — editable settings.* mirror: the feeding-amount config
(amountModelEnabled, fishCount*, feedPct*, amountControlEnabled,
dispenseGramsPerSec, feedDailyMaxGrams) is now mirrored as writable
switches..settings.* states so a VIS widget can edit them. Two new status
states expose the per-feeding portion: status.feedingsPerDayToday and
status.feedTargetPortionGrams (daily amount / feedings, after cap / water quality).
- lib/feeding-amount.js (+tests): feedPercentForTemp gains the 28-30 / >30 bands
- main.js: feedPct28/30 defaults + tiers; SWITCH_SETTINGS descriptors; NUMERIC_BOUNDS
- NULLABLE_SETTINGS; two new status DPs computed in recomputeFeedAmount
- config/types/Settings/SwitchTab: the two new percent inputs (23-28 relabel + 28-30 / >30)
- i18n: 'above 23 °C' -> 'above 30 °C' x 11 languages
- docs: all 11 READMEs + German PDF handbook
Co-Authored-By: Claude Opus 4.8 noreply@anthropic.com
Release v1.15.1
For a switch fed through the relay board the strict-AND off check could
report a false "did not switch off" fault (and Telegram/Sayit notification)
even though the target switched off correctly: the target (e.g. the Shelly)
was confirmed off, but the board's /api/status could not confirm its relay
off within the ~1.8 s retry window (a brief hiccup, or its countdown ending
a moment later).
The target object is now authoritative for the off check: the fault is
raised only when the target is genuinely still on. If the target is off but
the board relay is unconfirmed, the adapter logs a warning instead of a
fault; the safety back-stop (force board off) is unchanged.
- main.js: feed() off-verify no longer ANDs the board relay into the fault
Co-Authored-By: Claude Opus 4.8 noreply@anthropic.com
Release v1.15.0
New optional per-switch water-quality sources for ammonia (NH3/NH4) and
nitrite (NO2): "if these values rise, feed less" (from the feeder manual).
Each substance has two thresholds — a warn threshold that reduces the
daily amount (only in the feeding-amount control mode) and a max threshold
that blocks feeding entirely in every mode. The "when" and all other
blocks stay unchanged.
- main.js: ammonia/nitrite sources (sourceValue, setupSources, mirrors);
getBlockReason hard block above the max; waterQualityFactor() reduces the
amount in control mode; new isNum() helper; new states status.ammonia /
status.nitrite - lib/messages.js: blockAmmoniaHigh / blockNitriteHigh (11 languages)
- config/types/Settings: 11 new per-switch fields (sources, thresholds, reduce %)
- SwitchTab: new "Water quality (ammonia / nitrite)" section
- i18n: +11 keys x 11 languages (236 each)
- docs: documented in all 11 READMEs and the German PDF handbook
Co-Authored-By: Claude Opus 4.8 noreply@anthropic.com
Release v1.14.2
The configuration UI is now wrapped in the theme GenericApp has already
resolved from the admin (this.state.theme). Previously the tabs inherited
the outer theme from index.jsx, which is fixed at page-load time via
Utils.getThemeName() and is often still "light" on first render — so in
dark mode the tab labels appeared as dark text on a dark background until
a hover or a tab switch re-themed them. Now they are correct on first open
and when the theme is toggled.
- admin/src/app.jsx: wrap the UI in
Co-Authored-By: Claude Opus 4.8 noreply@anthropic.com