 # ioBroker.automatic-feeder
## automatic-feeder Adapter für ioBroker Dieser Adapter macht aus einem beliebigen, bereits vorhandenen ioBroker-Schalter (einer Steckdose, einem Relais, einem GPIO-Ausgang …) einen **zeitgesteuerten Futterautomaten**. Er schaltet den Ausgang zu den von dir festgelegten Zeiten für eine definierte Anzahl Sekunden ein und kann dabei Temperatur sowie den Tag-/Nacht-Wechsel berücksichtigen, damit nie zur falschen Zeit gefüttert wird. Dieses Dokument ist eine vollständige Anleitung. Wenn du den Adapter noch nie benutzt hast, lies es von oben nach unten – der **Schnellstart** bringt dich in wenigen Minuten zur ersten Fütterung, der Rest erklärt jede Einstellung im Detail. --- ## Inhaltsverzeichnis 1. [Was der Adapter macht](#1-was-der-adapter-macht) 2. [Voraussetzungen](#2-voraussetzungen) 3. [Installation](#3-installation) 4. [Schnellstart](#4-schnellstart--die-erste-fütterung) 5. [Die Einstellungsseite im Detail](#5-die-einstellungsseite-im-detail) 6. [Objekte / Datenpunkte](#6-objekte--datenpunkte) 7. [Beispiele / Rezepte](#7-beispiele--rezepte) 8. [Telegram-Benachrichtigungen](#8-telegram-benachrichtigungen) 9. [Fehlerbehebung & FAQ](#9-fehlerbehebung--faq) 10. [Logging & Fehlersuche](#10-logging--fehlersuche) --- ## 1. Was der Adapter macht Eine „Fütterung" ist im Kern ganz einfach: **Ausgang EIN → eine einstellbare Anzahl Sekunden warten → wieder AUS**. Bei einem umgebauten Futterautomaten läuft in dieser Zeit der Motor und gibt Futter aus. Der Adapter verwaltet **bis zu 5 Schalter**, jeder völlig unabhängig und mit einem eigenen Konfigurations-Tab, der nach dem Schalter benannt ist. Pro Schalter legst du fest: * **wann** gefüttert wird – entweder zu **festen Zeiten** (z. B. 08:00 und 18:00) oder im **Intervall** innerhalb eines Zeitfensters (z. B. alle 60 Minuten zwischen 08:00 und 18:00); * **wie lange** der Ausgang eingeschaltet bleibt (Fütterungsdauer in Sekunden); * **ob blockiert** wird, wenn Wasser- oder Lufttemperatur zu niedrig/hoch ist; * **ob nachts** nicht gefüttert wird (basierend auf dem echten Sonnenauf-/-untergang für deinen Standort); * **ob der Schaltvorgang überwacht** wird (Prüfung, ob wirklich ein- und ausgeschaltet wurde) und optional eine **Telegram**-Nachricht zum Ergebnis gesendet wird; * **ob während einer wiederkehrenden Wintersaison reduziert oder pausiert** wird – optional mit Telegram-Erinnerungen vor Beginn und Ende; * **ob Intervall und Portion automatisch an die Wasser-/Lufttemperatur angepasst** werden (**dynamisches Füttern**, Q10-Modell); * **ob blockiert** wird, wenn der gelöste **Sauerstoff** (O₂) zu niedrig ist. Du kannst eine Fütterung jederzeit **manuell** auslösen – direkt auf der Einstellungsseite (Button mit frei wählbarer Dauer) oder über einen Datenpunkt (z. B. ein Button in einer VIS-Ansicht). > Wichtig: Der Adapter legt den Schalter nicht selbst an. Er **steuert ein bereits vorhandenes > Objekt** in deinem ioBroker. Dieses Objekt wählst du in der Konfiguration aus. --- ## 2. Voraussetzungen | Du brauchst | Details | |-------------|---------| | **ioBroker** mit aktuellem **admin** (≥ 7) | Die Konfigurationsseite ist mit React umgesetzt. | | **Ein Schalter-Objekt** | Ein beschreibbarer ioBroker-Datenpunkt, der den Futterautomaten ein-/ausschaltet – z. B. eine Steckdose (`shelly.0.…`, `sonoff.0.…`, `zigbee.0.…`), ein Relais oder eine Skriptvariable. | | **Geokoordinaten** | Für die Berechnung von Sonnenauf-/-untergang. Entweder aus den ioBroker-Systemeinstellungen oder per Adresse/Karte. **Verpflichtend.** | | *(optional)* Temperatur-Objekte | Vorhandene Datenpunkte mit Luft- und/oder Wassertemperatur, für temperaturabhängiges Sperren oder dynamisches Füttern. **Pro Schalter** im Schalter-Tab zugewiesen. | | *(optional)* **Sauerstoff-Objekte (O₂)** | Vorhandene Datenpunkte mit dem gelösten Sauerstoff, um die Fütterung zu sperren, wenn er zu niedrig wird. **Pro Schalter** zugewiesen. | | *(optional)* Eine **Telegram**-Instanz | Der offizielle `telegram`-Adapter, eingerichtet und gestartet, falls du Push-Benachrichtigungen möchtest. | | Internetzugang auf dem ioBroker-Host | Nur für Adresssuche/Karte in der Konfiguration. Der normale Betrieb läuft offline. | --- ## 3. Installation 1. Im ioBroker-**admin** den Reiter **Adapter** öffnen. 2. In der Adapter-Liste **automatic-feeder** suchen und auf **Installieren** klicken. 3. Eine **Instanz** des Adapters anlegen. 4. Die Instanz-Einstellungen öffnen (Zahnrad-Symbol) – es sollte die Konfigurationsseite mit dem Tab **Grundeinstellungen** erscheinen. Bleibt sie leer, siehe [Fehlerbehebung](#9-fehlerbehebung--faq). --- ## 4. Schnellstart – die erste Fütterung Ziel: Ein Schalter soll – sofort, zum Test – 5 Sekunden lang füttern. 1. **Einstellungen öffnen** der automatic-feeder-Instanz. 2. Auf dem Tab **Grundeinstellungen**: * Unter **Standort** *Systemeinstellungen übernehmen* lassen, wenn dein ioBroker bereits Koordinaten hat. Andernfalls *Standort spezifisch festlegen* wählen, Adresse eingeben, **Suchen** klicken und den Marker auf der Karte bestätigen. * Nach unten zu **Schalter** scrollen und **Schalter hinzufügen** klicken. * Einen **Namen** vergeben (z. B. `Koi-Teich`). Dieser Name wird zum Titel eines eigenen Tabs. * Neben **Schalter-Objekt** das Listen-Symbol anklicken und den Datenpunkt wählen, der deinen Automaten schaltet (z. B. deine Steckdose). Der Schalter muss **aktiv** sein (Häkchen links). 3. **Speichern** (Diskette/Haken unten). Ein neuer Tab mit deinem Schalternamen erscheint. 4. Diesen **Schalter-Tab** öffnen. Ganz oben unter **Manuelle Fütterung** eine Dauer einstellen (z. B. `5` Sekunden) und **Jetzt füttern** klicken. Der Ausgang sollte 5 Sekunden ein- und dann wieder ausschalten. 5. Im selben Tab den echten Zeitplan unter **Fütterungsplan** einrichten (z. B. feste Zeiten 08:00 und 18:00) und die **Fütterungsdauer** unter **Fütterungsvorgang** setzen, dann **Speichern**. Fertig – ab jetzt füttert der Adapter automatisch. Alles Weitere erklärt die Optionen im Detail. --- ## 5. Die Einstellungsseite im Detail Die Konfiguration hat einen Tab **Grundeinstellungen** sowie **einen Tab pro Schalter** (wird automatisch angelegt, sobald ein Schalter einen Namen hat). Falls eine Seite nicht scrollt, das Fenster vergrößern oder die Scrollleiste rechts nutzen – alle Abschnitte sind erreichbar. ### 5.1 Tab „Grundeinstellungen" #### Standort (verpflichtend) Der Adapter benötigt deine geografische Position, um Sonnenauf- und -untergang zu berechnen (für die Nachtsperre). Zwei Möglichkeiten: * **Systemeinstellungen übernehmen** – nimmt Breiten-/Längengrad aus der ioBroker-Systemkonfiguration (empfohlen, wenn dort bereits gesetzt). Die aktuellen Werte werden angezeigt. * **Standort spezifisch festlegen** – Position selbst bestimmen: * Eine **Adresse** eingeben und **Suchen** drücken. Der Adapter löst sie auf (über OpenStreetMap / Nominatim) und setzt einen Marker. * Oder **auf die Karte klicken** / den **Marker ziehen**, um die genaue Stelle zu wählen. * Breiten-/Längengrad können auch direkt eingetragen werden; die Karte folgt. > Die Adresssuche läuft im Adapter-Backend, daher muss die **Instanz laufen**. Karte und Suche > benötigen Internetzugang. #### Sonnenfenster (keine Fütterung nachts) Legt das Zeitfenster fest, in dem gefüttert werden darf: * **Minuten nach Sonnenaufgang** – erst so viele Minuten *nach* Sonnenaufgang füttern. * **Minuten vor Sonnenuntergang** – so viele Minuten *vor* Sonnenuntergang aufhören. Beispiel: Bei Sonnenaufgang 06:30, Sonnenuntergang 21:00 und Offsets 30 / 30 ist Fütterung nur zwischen **07:00 und 20:30** erlaubt. Jeder Schalter kann dieses Fenster einzeln beachten oder ignorieren (siehe *Einschränkungen* im Schalter-Tab). Die berechneten Zeiten stehen außerdem in den Datenpunkten `sunrise` / `sunset` und werden jede Nacht automatisch neu berechnet. #### Schalter Die Liste der Futterautomaten (bis zu 5). Pro Eintrag: * **Aktiv** (Häkchen) – nur aktive Schalter werden geplant. * **Name** – freier Text; wird zum Tab-Titel des Schalters und zum Kanalnamen im Objektbaum. * **Schalter-Objekt** – der vorhandene ioBroker-Datenpunkt, der gesteuert wird. Über das Listen-Symbol auswählen, über das Kreuz leeren. Mit **Schalter hinzufügen** legst du einen weiteren an (max. 5), mit dem Papierkorb-Symbol entfernst du einen. Beim Entfernen werden auch dessen Datenpunkte gelöscht. ### 5.2 Schalter-Tabs Jeder konfigurierte Schalter erhält einen eigenen Tab mit seinem Namen. Er enthält folgende Abschnitte. #### Manuelle Fütterung * **Dauer der manuellen Fütterung (Sekunden)** – die vom Button verwendete Dauer. * **Jetzt füttern** – löst sofort eine Fütterung mit dieser Dauer aus. Praktisch zum Testen oder für eine Extraportion. (Ob Sperren ignoriert werden, hängt von *Manueller Auslöser ignoriert alle Sperren* unter *Einschränkungen* ab.) * Für den Button muss die Instanz laufen und die Konfiguration **gespeichert** sein. #### Fütterungsplan **Einen** Modus wählen: * **Feste Zeiten** – eine Liste von Uhrzeiten (`HH:mm`). Beliebig viele hinzufügen; der Automat läuft täglich zu jeder davon. Beispiel: `08:00` und `18:00`. * **Intervall innerhalb eines Zeitraums** – wiederholt innerhalb eines Fensters füttern: * **Beginn Zeitraum** / **Ende Zeitraum** – z. B. 08:00 bis 18:00. * **Intervall (Minuten)** – z. B. 60 → füttert täglich um 08:00, 09:00, … bis zum Fensterende. Die nächste geplante Zeit steht jederzeit im Datenpunkt `status.nextFeeding`. #### Fütterungsvorgang * **Fütterungsdauer (Sekunden)** – wie lange der Ausgang bei einer geplanten Fütterung EIN bleibt. * **Ein-Wert** / **Aus-Wert** – die Werte, die in das Schalter-Objekt geschrieben werden. Standard sind `true` und `false`, was zu den meisten Steckdosen/Relais passt. Erwartet dein Gerät Zahlen oder Text, hier z. B. `1` / `0` oder `ON` / `OFF` eintragen. #### Temperatur- & Sauerstoffquellen Jeder Schalter (Futterstation) hat **seine eigenen** Sensoren – verschiedene Teiche/Becken können unterschiedliche Objekte verwenden: * **Lufttemperatur** – Häkchen setzen und den Datenpunkt wählen, der die Lufttemperatur dieser Station enthält. * **Wassertemperatur** – Häkchen setzen und den Datenpunkt wählen, der die Wassertemperatur dieser Station enthält. * **Sauerstoff (O₂)** – Häkchen setzen und den Datenpunkt wählen, der den gelösten Sauerstoff enthält. Sinnvoll sind nur Zahl-Datenpunkte. Die aktuellen Werte werden in die Datenpunkte `status.airTemperature`, `status.waterTemperature` und `status.oxygen` dieses Schalters gespiegelt. Die Schwellen werden weiter unten eingestellt (*Temperatursperre*), und die Temperaturen steuern außerdem das *Dynamische Füttern*. #### Temperatursperre Wird nur für die oben aktivierten Temperaturquellen angezeigt (*Temperatur- & Sauerstoffquellen*). Pro Schalter: * **Nach Wassertemperatur sperren** – *Sperren wenn unter* und/oder *Sperren wenn über* (°C). * **Nach Lufttemperatur sperren** – dasselbe für die Luft. Liegt die aktuelle Temperatur außerhalb des erlaubten Bereichs, wird die Fütterung übersprungen und der Grund in `status.blockReason` geschrieben. (Ist ein Temperaturwert unbekannt, sperrt diese Quelle nicht.) #### Einschränkungen * **Nachts nicht füttern** – beachtet das Sonnenfenster (inkl. der Offsets). Ausschalten, wenn dieser Schalter rund um die Uhr füttern darf. * **Manueller Auslöser ignoriert alle Sperren** – wenn aktiv, füttern der Button und der Datenpunkt `feedNow` auch bei aktiver Temperatur-/Nachtsperre. #### Dynamisches Füttern Optional: passt **Intervall und Dauer der Fütterung an die Temperatur** an (Q10-Modell – der Stoffwechsel verdoppelt sich grob pro +10 °C). Benötigt eine aktive Temperaturquelle; feste Zeiten werden dann durch ein Intervall innerhalb des Fensters ersetzt. * **Aktivieren / Quelle** – einschalten und Wasser- oder Lufttemperatur wählen. * **Referenz / Q10** – Basis-Intervall und -Dauer gelten bei der Referenztemperatur (z. B. 20 °C); Q10 typischerweise 2–2,5. * **Intervall / Dauer (Basis, Min, Max)** – Grenzen für das berechnete Intervall (Minuten) und die Dauer (Sekunden). Das **Basis-Intervall und das Max-Intervall müssen größer als 0 sein**, sonst kann keine Fütterung geplant werden. * **Mittelungsfenster / Hysterese** – ein gleitender Mittelwert (z. B. 24 h) glättet Ausreißer; die Hysterese vermeidet Neuplanung bei winzigen Änderungen. Die aktuellen Werte stehen in `status.dynamicAvgTemperature`, `status.dynamicRate`, `status.dynamicIntervalMin` und `status.dynamicDurationSec`. Eine optionale **Sauerstoff-Quelle (O₂)** kann die Fütterung sperren, wenn der Sauerstoffgehalt unter einen Schwellwert fällt. Die Winterpause hat Vorrang vor dem dynamischen Füttern. > Ist das dynamische Füttern aktiviert, kann aber kein gültiges Intervall berechnet werden (Basis- oder Max-Intervall ist 0 oder ein ungültiges Zeitfenster), wird nichts geplant: `status.nextFeeding` bleibt leer und `status.blockReason` zeigt einen Hinweis. Setze ein Basis-Intervall und ein Max-Intervall größer als 0. #### Winterpause Pro Schalter lässt sich eine wiederkehrende **Winterpause** definieren (saisonal, als `MM-TT`-Daten, die sich jährlich wiederholen und über den Jahreswechsel reichen können). * **Winterpause aktivieren** – die Pause einschalten. * **Winterbeginn / Winterende** – Tag und Monat aus einem Kalender wählen (Anzeige als tt.mm), z. B. 01.11 bis 15.03. * **Modus** – während der Pause entweder **Fütterung aussetzen**, mit **eingeschränktem** eigenem Intervall füttern oder **einmal täglich** zu einer festen Zeit; es gilt eine eigene **Winter-Fütterdauer**. * **Erinnerungen (Telegram)** – in den Tagen vor Beginn und vor Ende wird täglich (letztmalig am Stichtag) zur eingestellten Uhrzeit eine Erinnerung gesendet. Benötigt eine Telegram-Instanz (siehe unten). Der aktuelle Zustand steht im Datenpunkt `status.winterActive`. Nach Ende der Pause läuft die Fütterung automatisch wieder an. #### Schaltüberwachung Nach dem Schalten kann der Adapter prüfen, ob der Schalter den Ein- und Aus-Zustand **tatsächlich** erreicht hat, und meldet je Fütterung eines von drei Ergebnissen: | Ergebnis | Bedeutung | Meldung | |----------|-----------|---------| | ✅ Erfolg | Schalter hat wie erwartet ein- und ausgeschaltet | „Fütterung für x s ausgelöst." | | ❌ Einschalten fehlgeschlagen | der Schalter hat den EIN-Zustand nie bestätigt | „Fütterung konnte nicht durchgeführt werden. Schalter prüfen!" | | ❌ Ausschalten fehlgeschlagen | er ging an, schaltete aber nicht wieder aus | „Störung: Futterautomat hat nicht abgeschaltet!" | > Die Meldung wird in der eingestellten ioBroker-Systemsprache gesendet (standardmäßig Englisch). * **Prüfen, ob der Schalter tatsächlich ein- und ausschaltet** – aktiviert die Überwachung. * **Überwachungs-Timeout (Sekunden)** – wie lange auf die Bestätigung gewartet wird. * **Überwachungs-Versuche** – wie viele zeitversetzte Nachprüfungen vor einer Störungsmeldung erfolgen (Standard 3). Jeder Versuch fragt zusätzlich den Ist-Wert aktiv ab, sodass verzögerte Rückmeldungen (z. B. Homematic-Funk) keine Fehlmeldung mehr auslösen. > **Wichtig:** Die Überwachung funktioniert nur, wenn der Schalter seinen **Ist-Zustand > zurückmeldet**, d. h. das Zielobjekt wird mit `ack=true` aktualisiert (typisch für > Steckdosen/Relais mit Statusrückmeldung). Ein einfacher Hilfs-Boolean, den niemand bestätigt, > würde immer eine Störung melden – dann die Überwachung für diesen Schalter ausschalten. Das Ergebnis steht außerdem in den Datenpunkten `status.lastResult` (Text) und `status.error` (boolean), sodass du darauf reagieren kannst (z. B. eine eigene Benachrichtigung auslösen). #### Telegram-Benachrichtigungen Sendet die Meldungen der Schaltüberwachung an Telegram – **pro Schalter** konfiguriert: * **Telegram-Instanz** – eine der installierten `telegram.*`-Instanzen wählen (oder *Keine*, um Telegram für diesen Schalter zu deaktivieren). Ist keine installiert, weist das Feld darauf hin. * **Telegram-Empfänger (optional)** – ein bestimmter Benutzer/Chat-Name, wie im telegram-Adapter konfiguriert; leer lassen, um an alle konfigurierten Empfänger zu senden. * **Checkboxen** – auswählen, welche Meldungen gesendet werden: erfolgreiche Fütterung, nicht durchführbar und/oder Störung der Abschaltung. Die **Winterpause-Erinnerungen** (falls aktiviert, siehe *Winterpause*) werden an dieselbe Telegram-Instanz gesendet, unabhängig von diesen Überwachungs-Checkboxen. Die vollständige Einrichtung steht unter [Telegram-Benachrichtigungen](#8-telegram-benachrichtigungen). --- ## 6. Objekte / Datenpunkte Der Adapter legt folgende Datenpunkte in seinem Namespace an (`automatic-feeder.