 # ioBroker.automatic-feeder
## automatic-feeder-adapter voor ioBroker Deze adapter maakt van een willekeurige, reeds aanwezige ioBroker-schakelaar (een stopcontact, een relais, een GPIO-uitgang …) een **tijdgestuurde voederautomaat**. Hij schakelt de uitgang op de door jou ingestelde tijden in voor een vastgelegd aantal seconden en kan daarbij rekening houden met temperatuur en de dag-/nachtwisseling, zodat er nooit op het verkeerde moment wordt gevoerd. Dit document is een volledige handleiding. Als je de adapter nog nooit hebt gebruikt, lees het dan van boven naar beneden – de **snelstart** brengt je in enkele minuten tot de eerste voedering, de rest legt elke instelling in detail uit. --- ## Inhoudsopgave 1. [Wat de adapter doet](#1-wat-de-adapter-doet) 2. [Vereisten](#2-vereisten) 3. [Installatie](#3-installatie) 4. [Snelstart](#4-snelstart--de-eerste-voedering) 5. [De instellingenpagina in detail](#5-de-instellingenpagina-in-detail) 6. [Objecten / datapunten](#6-objecten--datapunten) 7. [Voorbeelden / recepten](#7-voorbeelden--recepten) 8. [Telegram-meldingen](#8-telegram-meldingen) 9. [Probleemoplossing & FAQ](#9-probleemoplossing--faq) 10. [Logging & foutopsporing](#10-logging--foutopsporing) --- ## 1. Wat de adapter doet Een „voedering" is in de kern heel eenvoudig: **uitgang AAN → een instelbaar aantal seconden wachten → weer UIT**. Bij een omgebouwde voederautomaat draait in die tijd de motor en geeft voer af. De adapter beheert **tot 5 schakelaars**, elk volledig onafhankelijk en met een eigen configuratie-tabblad dat naar de schakelaar is genoemd. Per schakelaar leg je vast: * **wanneer** er wordt gevoerd – ofwel op **vaste tijden** (bijv. 08:00 en 18:00) of in een **interval** binnen een tijdvenster (bijv. elke 60 minuten tussen 08:00 en 18:00); * **hoe lang** de uitgang ingeschakeld blijft (voederduur in seconden); * **of er wordt geblokkeerd** wanneer de water- of luchttemperatuur te laag/hoog is; * **of er 's nachts niet** wordt gevoerd (gebaseerd op de werkelijke zonsop-/-ondergang voor jouw locatie); * **of het schakelproces wordt bewaakt** (controle of er werkelijk is in- en uitgeschakeld) en optioneel een **Telegram**-bericht over het resultaat wordt verzonden; * **of het voeren wordt verminderd of gepauzeerd** tijdens een terugkerend **winter**seizoen – optioneel met Telegram-herinneringen voordat het begint en eindigt; * **of het interval en de portie automatisch aan de water-/luchttemperatuur worden aangepast** (**dynamisch voeren**, Q10-model); * **of het voeren wordt geblokkeerd** wanneer het opgeloste **zuurstof** (O₂) te laag is. Je kunt een voedering op elk moment **handmatig** activeren – rechtstreeks op de instellingenpagina (knop met vrij te kiezen duur) of via een datapunt (bijv. een knop in een VIS-weergave). > Belangrijk: De adapter legt de schakelaar niet zelf aan. Hij **stuurt een reeds aanwezig > object** in jouw ioBroker aan. Dit object kies je in de configuratie. --- ## 2. Vereisten | Je hebt nodig | Details | |-------------|---------| | **ioBroker** met actuele **admin** (≥ 7) | De configuratiepagina is met React gerealiseerd. | | **Een schakelaar-object** | Een beschrijfbaar ioBroker-datapunt dat de voederautomaat in-/uitschakelt – bijv. een stopcontact (`shelly.0.…`, `sonoff.0.…`, `zigbee.0.…`), een relais of een scriptvariabele. | | **Geocoördinaten** | Voor de berekening van zonsop-/-ondergang. Ofwel uit de ioBroker-systeeminstellingen of via adres/kaart. **Verplicht.** | | *(optioneel)* Temperatuur-objecten | Aanwezige datapunten met lucht- en/of watertemperatuur, voor temperatuurblokkering of dynamisch voeren. **Per schakelaar** toegewezen op het schakelaar-tabblad. | | *(optioneel)* **Zuurstof (O₂)**-objecten | Aanwezige datapunten met het opgeloste zuurstof, om het voeren te blokkeren wanneer dit te laag zakt. **Per schakelaar** toegewezen. | | *(optioneel)* Een **Telegram**-instantie | De officiële `telegram`-adapter, ingericht en gestart, als je push-meldingen wilt. | | Internettoegang op de ioBroker-host | Alleen voor adres zoeken/kaart in de configuratie. Het normale gebruik werkt offline. | --- ## 3. Installatie 1. In de ioBroker-**admin** het tabblad **Adapter** openen. 2. In de lijst met adapters **automatic-feeder** opzoeken en op **Installeren** klikken. 3. Een **instantie** van de adapter aanmaken. 4. De instantie-instellingen openen (tandwiel-symbool) – er zou de configuratiepagina met het tabblad **Basisinstellingen** moeten verschijnen. Blijft deze leeg, zie [Probleemoplossing](#9-probleemoplossing--faq). --- ## 4. Snelstart – de eerste voedering Doel: Een schakelaar moet – meteen, ter test – 5 seconden lang voeren. 1. **Instellingen openen** van de automatic-feeder-instantie. 2. Op het tabblad **Basisinstellingen**: * Onder **Locatie** *Systeeminstellingen overnemen* laten, als jouw ioBroker al coördinaten heeft. Anders *Locatie specifiek vastleggen* kiezen, adres invoeren, **Zoeken** klikken en de marker op de kaart bevestigen. * Naar beneden scrollen naar **Schakelaars** en **Schakelaar toevoegen** klikken. * Een **naam** toekennen (bijv. `Koi-vijver`). Deze naam wordt de titel van een eigen tabblad. * Naast **Schakelaar-object** het lijst-symbool aanklikken en het datapunt kiezen dat jouw automaat schakelt (bijv. jouw stopcontact). De schakelaar moet **actief** zijn (vinkje links). 3. **Opslaan** (diskette/vinkje onderaan). Een nieuw tabblad met jouw schakelaarnaam verschijnt. 4. Dit **schakelaar-tabblad** openen. Helemaal bovenaan onder **Handmatige voedering** een duur instellen (bijv. `5` seconden) en **Nu voeren** klikken. De uitgang zou 5 seconden moeten inschakelen en dan weer uitschakelen. 5. In hetzelfde tabblad het echte schema onder **Voederschema** inrichten (bijv. vaste tijden 08:00 en 18:00) en de **voederduur** onder **Voederproces** instellen, dan **Opslaan**. Klaar – vanaf nu voert de adapter automatisch. Al het overige legt de opties in detail uit. --- ## 5. De instellingenpagina in detail De configuratie heeft een tabblad **Basisinstellingen** evenals **een tabblad per schakelaar** (wordt automatisch aangemaakt zodra een schakelaar een naam heeft). Als een pagina niet scrolt, het venster vergroten of de scrollbalk rechts gebruiken – alle secties zijn bereikbaar. ### 5.1 Tabblad „Basisinstellingen" #### Locatie (verplicht) De adapter heeft jouw geografische positie nodig om zonsop- en -ondergang te berekenen (voor de nachtblokkering). Twee mogelijkheden: * **Systeeminstellingen overnemen** – neemt breedte-/lengtegraad uit de ioBroker-systeemconfiguratie (aanbevolen wanneer daar al ingesteld). De huidige waarden worden weergegeven. * **Locatie specifiek vastleggen** – positie zelf bepalen: * Een **adres** invoeren en **Zoeken** drukken. De adapter lost het op (via OpenStreetMap / Nominatim) en plaatst een marker. * Of **op de kaart klikken** / de **marker slepen** om de exacte plek te kiezen. * Breedte-/lengtegraad kunnen ook direct worden ingevoerd; de kaart volgt. > Het adres zoeken loopt in de adapter-backend, daarom moet de **instantie draaien**. Kaart en zoeken > hebben internettoegang nodig. #### Zonvenster (geen voedering 's nachts) Legt het tijdvenster vast waarin gevoerd mag worden: * **Minuten na zonsopgang** – pas zoveel minuten *na* zonsopgang voeren. * **Minuten voor zonsondergang** – zoveel minuten *voor* zonsondergang stoppen. Voorbeeld: Bij zonsopgang 06:30, zonsondergang 21:00 en offsets 30 / 30 is voedering alleen tussen **07:00 en 20:30** toegestaan. Elke schakelaar kan dit venster afzonderlijk in acht nemen of negeren (zie *Beperkingen* in het schakelaar-tabblad). De berekende tijden staan bovendien in de datapunten `sunrise` / `sunset` en worden elke nacht automatisch opnieuw berekend. #### Schakelaars De lijst met voederautomaten (tot 5). Per item: * **Actief** (vinkje) – alleen actieve schakelaars worden ingepland. * **Naam** – vrije tekst; wordt de tabblad-titel van de schakelaar en de kanaalnaam in de objectboom. * **Schakelaar-object** – het aanwezige ioBroker-datapunt dat wordt aangestuurd. Via het lijst-symbool selecteren, via het kruis leegmaken. Met **Schakelaar toevoegen** maak je er nog een aan (max. 5), met het prullenbak-symbool verwijder je er een. Bij het verwijderen worden ook diens datapunten gewist. ### 5.2 Schakelaar-tabbladen Elke geconfigureerde schakelaar krijgt een eigen tabblad met zijn naam. Het bevat de volgende secties. #### Handmatige voedering * **Duur van de handmatige voedering (seconden)** – de door de knop gebruikte duur. * **Nu voeren** – activeert meteen een voedering met deze duur. Handig om te testen of voor een extra portie. (Of blokkeringen worden genegeerd, hangt af van *Handmatige trigger negeert alle blokkeringen* onder *Beperkingen*.) * Voor de knop moet de instantie draaien en de configuratie **opgeslagen** zijn. #### Voederschema **Eén** modus kiezen: * **Vaste tijden** – een lijst met tijdstippen (`HH:mm`). Willekeurig veel toevoegen; de automaat loopt dagelijks op elk daarvan. Voorbeeld: `08:00` en `18:00`. * **Interval binnen een periode** – herhaald binnen een venster voeren: * **Begin periode** / **Einde periode** – bijv. 08:00 tot 18:00. * **Interval (minuten)** – bijv. 60 → voert dagelijks om 08:00, 09:00, … tot het einde van het venster. De volgende geplande tijd staat op elk moment in het datapunt `status.nextFeeding`. #### Voederproces * **Voederduur (seconden)** – hoe lang de uitgang bij een geplande voedering AAN blijft. * **Aan-waarde** / **Uit-waarde** – de waarden die naar het schakelaar-object worden geschreven. Standaard zijn `true` en `false`, wat bij de meeste stopcontacten/relais past. Verwacht jouw apparaat getallen of tekst, hier bijv. `1` / `0` of `ON` / `OFF` invoeren. #### Temperatuur- & zuurstofbronnen Elke schakelaar (voederstation) heeft **zijn eigen** sensoren – verschillende vijvers/bassins kunnen verschillende objecten gebruiken: * **Luchttemperatuur** – vinkje zetten en het datapunt kiezen dat de luchttemperatuur van dit station bevat. * **Watertemperatuur** – vinkje zetten en het datapunt kiezen dat de watertemperatuur van dit station bevat. * **Zuurstof (O₂)** – vinkje zetten en het datapunt kiezen dat het opgeloste zuurstof bevat. Alleen getal-datapunten zijn zinvol. De huidige waarden worden naar de datapunten `status.airTemperature`, `status.waterTemperature` en `status.oxygen` van deze schakelaar gespiegeld. De drempels worden hieronder ingesteld (*Temperatuurblokkering*), en de temperaturen sturen ook het *Dynamisch voeren* aan. #### Temperatuurblokkering Wordt alleen weergegeven voor de hierboven geactiveerde temperatuurbronnen (*Temperatuur- & zuurstofbronnen*). Per schakelaar: * **Blokkeren op watertemperatuur** – *Blokkeren wanneer onder* en/of *Blokkeren wanneer boven* (°C). * **Blokkeren op luchttemperatuur** – hetzelfde voor de lucht. Ligt de huidige temperatuur buiten het toegestane bereik, dan wordt de voedering overgeslagen en de reden in `status.blockReason` geschreven. (Is een temperatuurwaarde onbekend, dan blokkeert deze bron niet.) #### Beperkingen * **'s Nachts niet voeren** – houdt rekening met het zonvenster (incl. de offsets). Uitschakelen wanneer deze schakelaar rond de klok mag voeren. * **Handmatige trigger negeert alle blokkeringen** – wanneer actief, voeren de knop en het datapunt `feedNow` ook bij actieve temperatuur-/nachtblokkering. #### Dynamisch voeren Optioneel: past het **voederinterval en de duur aan de temperatuur** aan via het Q10-model (het metabolisme verdubbelt ongeveer per +10 °C). Vereist een actieve temperatuurbron; vaste tijden worden dan vervangen door een interval binnen het venster. * **Inschakelen / bron** – schakel in en kies water- of luchttemperatuur. * **Referentie / Q10** – het basisinterval en de duur gelden bij de referentietemperatuur (bijv. 20 °C); Q10 meestal 2–2,5. * **Interval / duur (basis, min, max)** – grenzen voor het berekende interval (minuten) en de duur (seconden). Het **basisinterval en het max-interval moeten groter dan 0 zijn**, anders kan er geen voedering worden gepland. * **Middelingsvenster / hysterese** – een voortschrijdend gemiddelde (bijv. 24 u) vlakt pieken af; hysterese voorkomt herplannen bij kleine wijzigingen. De huidige waarden staan in `status.dynamicAvgTemperature`, `status.dynamicRate`, `status.dynamicIntervalMin` en `status.dynamicDurationSec`. Een optionele **zuurstofbron (O₂)** kan het voeren blokkeren wanneer het opgeloste zuurstof onder een drempel zakt. De winterpauze heeft voorrang op dynamisch voeren. > Als dynamisch voeren is ingeschakeld maar er geen geldig interval kan worden berekend (basis- of max-interval is 0, of een ongeldig tijdvenster), wordt er niets ingepland: `status.nextFeeding` blijft leeg en `status.blockReason` toont een aanwijzing. Stel een basisinterval en een max-interval groter dan 0 in. #### Winterpauze Per schakelaar kun je een terugkerende **winterpauze** instellen (seizoensgebonden, als `MM-DD`-data die zich jaarlijks herhalen en over de jaarwisseling kunnen lopen). * **Winterpauze inschakelen** – de pauze inschakelen. * **Winterbegin / Wintereinde** – kies dag en maand uit een kalender (weergegeven als dd.mm), bijv. 01.11 tot 15.03. * **Modus** – tijdens de pauze **voeding onderbreken**, voeden met een **beperkt** eigen interval of **één keer per dag** op een vast tijdstip; er geldt een eigen **wintervoederduur**. * **Herinneringen (Telegram)** – in de dagen vóór het begin en vóór het einde wordt dagelijks (voor het laatst op de dag zelf) op het ingestelde uur een herinnering verzonden. Vereist een Telegram-instantie (zie hieronder). De huidige status staat in het datapunt `status.winterActive`. Na afloop van de pauze start de voeding automatisch weer. #### Schakelbewaking Na het schakelen kan de adapter controleren of de schakelaar de in- en uit-toestand **daadwerkelijk** heeft bereikt, en meldt per voedering een van drie resultaten: | Resultaat | Betekenis | Melding | |----------|-----------|---------| | ✅ Succes | Schakelaar heeft zoals verwacht in- en uitgeschakeld | „Voeding geactiveerd voor x s." | | ❌ Inschakelen mislukt | de schakelaar heeft de AAN-toestand nooit bevestigd | „Voeding kon niet worden uitgevoerd. Controleer de schakelaar!" | | ❌ Uitschakelen mislukt | hij ging aan, maar schakelde niet weer uit | „Storing: de voederautomaat is niet uitgeschakeld!" | > Het bericht wordt verzonden in de ingestelde ioBroker-systeemtaal (standaard Engels). * **Controleren of de schakelaar daadwerkelijk in- en uitschakelt** – activeert de bewaking. * **Bewakings-timeout (seconden)** – hoe lang op de bevestiging wordt gewacht. * **Verificatiepogingen** – hoeveel gespreide hercontroles worden uitgevoerd voordat een storing wordt gemeld (standaard 3). Elke poging leest ook de huidige toestand terug, zodat vertraagde terugmelding (bijv. Homematic-radio) geen valse storing meer veroorzaakt. > **Belangrijk:** De bewaking werkt alleen wanneer de schakelaar zijn **werkelijke toestand > terugmeldt**, d.w.z. het doelobject wordt met `ack=true` bijgewerkt (typisch voor > stopcontacten/relais met statusterugmelding). Een eenvoudige hulp-boolean die niemand bevestigt, > zou altijd een storing melden – schakel dan de bewaking voor deze schakelaar uit. Het resultaat staat bovendien in de datapunten `status.lastResult` (tekst) en `status.error` (boolean), zodat je erop kunt reageren (bijv. een eigen melding activeren). #### Telegram-meldingen Verzendt de meldingen van de schakelbewaking naar Telegram – **per schakelaar** geconfigureerd: * **Telegram-instantie** – een van de geïnstalleerde `telegram.*`-instanties kiezen (of *Geen*, om Telegram voor deze schakelaar uit te schakelen). Is er geen geïnstalleerd, dan wijst het veld erop. * **Telegram-ontvanger (optioneel)** – een bepaalde gebruikers-/chat-naam, zoals in de telegram-adapter geconfigureerd; leeg laten om naar alle geconfigureerde ontvangers te verzenden. * **Selectievakjes** – kiezen welke meldingen worden verzonden: succesvolle voedering, niet uitvoerbaar en/of storing van het uitschakelen. De **winterpauze-herinneringen** (indien ingeschakeld, zie *Winterpauze*) worden naar dezelfde Telegram-instantie verzonden, onafhankelijk van deze bewakings-selectievakjes. De volledige inrichting staat onder [Telegram-meldingen](#8-telegram-meldingen). --- ## 6. Objecten / datapunten De adapter legt de volgende datapunten in zijn namespace aan (`automatic-feeder.