Werbung: Dieser Beitrag entsteht in bezahlter Kooperation mit Aqara (@Aqara).
Am 6. und 7. Oktober 2026 laufen die Prime Big Deal Days, die meisten sagen einfach Prime Deal Days. Amazon senkt dann tausende Preise und viele davon sind gar keine Senkung, denn der Streichpreis daneben wird vor solchen Events gern angehoben. Dann sieht ein ganz normaler Preis plötzlich wie ein Schnäppchen aus.
Ich habe deshalb über 70 Smart-Home-Angebote gegen ihren Preisverlauf der letzten sechs Monate geprüft. Geblieben sind die, die wirklich günstig sind. Die meisten liegen auf oder unter ihrem bisherigen Tief, bei den anderen steht dabei, wann es sie schon günstiger gab. Elf davon stelle ich dir hier vor, alle geprüften Deals stehen in der Deal-Liste weiter unten, mit Filter nach Kategorie und Marke und sortierbar nach Ersparnis oder Preis. Am zweiten Tag kamen zehn neue Deals unter 260 € dazu, die stehen im Post zu Tag 2.
Danach geht es um Aqara: zwei Rabattcodes nur für diese zwei Tage, ein Gewinnspiel mit der Video-Türklingel G410 und eine komplette Anleitung, wie du den Futterautomaten Pet Feeder C1 ohne Hub und ohne Cloud in Home Assistant bringst, mit eigenem Dashboard.
So habe ich die Preise geprüft
Der Hinweis, dass ein Angebot nicht der absolute Tiefpreis ist, kommt bei solchen Listen immer wieder. Das kann auch hier zutreffen, die durchgestrichenen Preise bei Amazon sind ja immer nur die UVP. Deshalb habe ich recherchiert, wie gut die Angebote wirklich sind, und bei einigen tatsächlich neue Tiefstpreise gefunden.
- Verglichen wird mit dem niedrigsten Preis der letzten 180 Tage, den Streichpreis von Amazon lasse ich außen vor. Gemessen habe ich mit Keepa und gegengeprüft mit den Preisen vom Prime Day im Juni. Keepa erfasst Angebote nur für Prime-Mitglieder nicht und genau die waren im Juni oft günstiger.
- Ein Deal bekommt ein Badge nur, wenn beide Quellen passen. Wo ich den Juni-Preis nicht sicher belegen konnte, steht nur der Preis da, ohne Vergleich.
- „Neues Tief“ heißt: so günstig war das Gerät in diesem Zeitraum noch nie. „Tiefstpreis“ heißt: genauso günstig wie bisher am günstigsten.
- Liegt ein Preis darüber, steht der bisherige Bestpreis dabei. Dann entscheidest du selbst, ob dir das reicht.
- Alle Preise habe ich am 6. Oktober morgens erhoben und mittags noch einmal live geprüft. Prime-Angebote wechseln während des Events, schau vor dem Kauf also noch mal auf den Preis.
Die 11 Deals im Überblick
Ich habe nur elf Produkte in den Artikel genommen, sonst wird das Ganze unnötig lang. Alle weiteren Angebote findest du in der Deal-Liste am Ende der Seite, dort kannst du sie filtern und sortieren. Die Preise stammen vom 6. Oktober.
Aqara Alarmanlage Y100 Kit für 89,99 €
Das Kit besteht aus dem Kamera-Hub G3 und drei Sensoren für Bewegung, Tür und Vibration. Die Kamera ist gleichzeitig der Aqara-Hub, für alle, die noch keinen haben, ist das auf jeden Fall interessant. Bei mir steht eine Aqara-Kamera im Flur und läuft seit Jahren ohne Unterbrechung.
Preislich ist das der stärkste Deal des ganzen Events: 29 € unter dem Preis vom Prime Day im Juni, der mit 118,99 € bisher das Tief war. Wenn du in die Aqara-Welt einsteigen willst, ist das ein guter Startpunkt.
Aqara Video-Türklingel G410 für 99,99 €
Die Video-Türklingel hat einen eingebauten Matter-Hub und kostet jetzt so viel wie am Prime Day im Juni. Sie dient außerdem als Aqara-Zigbee-Hub und unterstützt HomeKit Secure Video. Die Aufnahmen kannst du in der Cloud speichern oder, was ich viel interessanter finde, auf einer SD-Karte direkt im Gerät, dann bleiben deine Daten lokal.
Die Klingel läuft im 2,4- und im 5-GHz-WLAN, mit Kabel oder mit Batterien, falls an der Stelle kein Stromkabel liegt. Genau diese Klingel verlose ich, wie du mitmachst, steht weiter unten.
X-Sense Rauch- und CO-Melder SC07-WX im 2er-Set für 58,42 €
Der Kombimelder für Rauch und Kohlenmonoxid steht gerade auf dem Tiefstpreis. Das sind 29,21 € pro Stück und 42 % unter der UVP von 99 €. Er funkt per WLAN direkt in die App, eine Basisstation brauchst du nicht.
Genau das ist für Home Assistant wichtig. Der lokale MQTT-Weg aus meinem Beitrag zu X-Sense Link+Pro läuft über die Basisstation SBS50 und mit der ist dieses Modell laut Hersteller nicht kompatibel. Für Home Assistant nimmst du die HACS-Integration von Jarnsen, die den SC07-WX kennt und über die X-Sense-Cloud läuft.
Smarte Rauchmelder sind leider immer relativ teuer und im besten Fall brauchst du sie nie. Wenn doch, bist du froh, dass du von unterwegs eine Benachrichtigung bekommst. Meinen Rabattcode für den X-Sense-Shop findest du in der Deal-Liste, er gilt noch bis zum 30. November 2026.
SONOFF Zigbee Dongle-E für 17,86 €
Der USB-Stick ist ein Zigbee-Coordinator für ZHA oder Zigbee2MQTT und aktuell 28 % günstiger. Du steckst ihn an, richtest ihn kurz ein und kannst danach alle Zigbee-Geräte einbinden, die bei dir herumliegen. Wenn du den Pet Feeder weiter unten nachbauen willst und noch kein Zigbee hast, ist das der günstigste Einstieg.
Shelly 1 Gen4 im 5er-Pack für 57,37 €
Das ist ein neues Tief, auch gegenüber dem Prime Day im Juni (63,54 €). Das macht 11,47 € pro Relais für hinter den Lichtschalter. Shelly-Geräte findet Home Assistant im eigenen Netz von selbst und steuert sie lokal.
FRITZ!Smart Thermo 302 für 44,99 €
Auch hier gibt es ein neues Tief, bisher lag er bei 47 €, die UVP beträgt 69 €. Das ist ein Heizkörperthermostat für die FRITZ!Box, in Home Assistant läuft er über die Integration FRITZ!SmartHome. Mit und ohne Home Assistant kannst du damit deine Wohnung schon vom Büro aus aufwärmen oder vor dem Urlaub alle Temperaturen runterdrehen.
Eve Thermo (5. Generation) für 62,26 €
Das Heizkörperthermostat spricht Matter über Thread. Üblich sind rund 77 €, ein einziges Mal gab es ihn für 57 €. Es hat oben eine kleine Digitalanzeige und zwei Tasten, du kannst die Temperatur also weiterhin direkt am Heizkörper einstellen. Zeitpläne gehen über die Eve-App, oder du bindest ihn in Home Assistant ein. Dafür brauchst du einen Thread-Border-Router im Haus.
Eve-Thermostate sind im Vergleich zu anderen Herstellern immer ein bisschen teurer, mit 22 % Rabatt ist der Preis aber tatsächlich in Ordnung.
meross Matter Steckdose für 42,49 €
Das ist eine smarte Matter-Steckdose mit Verbrauchsmessung, die direkt in Home Assistant läuft. Das Set mit vier Steckdosen kostet 42,49 €, das sind 15 % Rabatt. Es sind wirklich meine Lieblingssteckdosen, ich habe sie mittlerweile überall im Haus verbaut. Die Matter-Version lässt sich einfach einbinden und funktioniert bei mir wirklich gut, Verbindungsabbrüche hatte ich bisher keine. Wie ich sie einrichte, habe ich in meinem Beitrag zu den meross Steckdosen beschrieben.
Meinen Rabattcode für den meross-Shop zeigt die Deal-Liste gleich mit. Auf der Gutscheinseite findest du außerdem Codes für meross und Refoss, die auch außerhalb der Deal Days gelten.
Nuki Smart Lock Go für 109 €
Das ist das günstige Nuki zum Nachrüsten, wieder auf dem Preis vom Prime Day im Juni und damit auf dem Tief der letzten Monate. Das sind 27 % Rabatt auf die UVP. Du kannst deine Haustür von überall ver- und entriegeln, automatisch aufschließen lassen, wenn du nach Hause kommst, oder abschließen, sobald die Kaffeemaschine angeht. Wie das in Home Assistant läuft, steht in meinem Beitrag zum Nuki Smart Lock.
SwitchBot E-Ink Dashboard für 114,99 €
Das ist eine E-Ink-Wetterstation mit Außensensor für die Wand. Am Prime Day im Juni gab es sie schon für 109,99 €, ein Tief ist das also nicht. Gegenüber den sonst üblichen 150 € bleibt es ein guter Preis.
Bei mir steht die Wetterstation in der Küche. Du siehst auf einen Blick Temperatur, Luftfeuchtigkeit und Wetter der nächsten Tage, dazu Windgeschwindigkeit und Windrichtung, UV-Index, Niederschlag, Sichtweite und Luftdruck. Im Bundle sind ein kleiner SwitchBot-Hub und der Außensensor dabei, der Live-Daten von deinem Zuhause liefert statt nur von deinem Standort. Du bekommst die Wetterstation auch als 2-in-1-Combo oder nur in der Standardversion ohne Zubehör.
Roborock Qrevo S Pro Set für 399,99 €
Der Saug- und Wischroboter mit Station kostet so viel wie am Prime Day im Juni, das sind 33 % unter der UVP von 599 €. Er hat 18.500 Pascal Saugkraft und im Set liegen ein paar Staubsaugerbeutel dabei. Roborock hat eine eigene Integration in Home Assistant, du kannst ihn aber auch über die Roborock-App bedienen.
Gut finde ich die Mopreinigung mit 75 °C heißem Wasser. Bei älteren Modellen hat mich gestört, dass die Stationen irgendwann anfangen zu müffeln, weil die Wischrollen nicht perfekt gereinigt werden. Mit heißem Wasser sterben Bakterien eher ab.
Aqara zu den Prime Deal Days: zwei Codes und ein Gewinnspiel
Die Prime Big Deal Days laufen am 6. und 7. Oktober 2026. Für genau diese zwei Tage gibt es von Aqara zwei Codes, die du bei Amazon an der Kasse eingibst (Zahlungsschritt, Feld für Geschenkkarten und Aktionscodes):
| Produkt | Code | Rabatt | Gültig |
|---|---|---|---|
| Aqara Pet Feeder C1 | PETC1DEAL5 | 5 % | 6. und 7. Oktober 2026 |
| Aqara Temperatur- und Feuchtigkeitssensor, 3er-Set | THSENSOR5 | 5 % | 6. und 7. Oktober 2026 |
Alle weiteren Aqara-Angebote stehen im Aqara-Store bei Amazon.
Mal ehrlich zum Preis: Am 6. Oktober kostete der Pet Feeder C1 89,98 €, mit Code also rund 85,50 €. Im Mai und August lag er schon einmal bei 83,49 €. Das ist ein guter Preis, aber kein Rekord. Das Sensor-Set kostete 42,99 €, mit Code rund 40,80 €, das ist der niedrigste Preis der letzten sechs Monate.
Weitere Aqara-Angebote zum Event:
- Alarmanlage Y100 Kit für 89,99 €, 29 € unter dem Preis vom Prime Day im Juni
- Video-Türklingel G410 für 99,99 €, so günstig wie im Juni
- Kamera G5 Pro für 139,99 €
- Präsenzsensor FP400 für 66,99 €
- Präsenzsensor FP300 für 39,99 €
- Heizkörperthermostat W600 für 39,99 €
- Bewegungsmelder P1, 2 Stück für 29,99 €
- Lichtschalter H2 für 33,59 €
- Power Plug H2 für 26,59 €
Prime-Angebote wechseln während des Events, die Preise sind vom 6. Oktober.
Gewinnspiel: Aqara Video-Türklingel G410
Ich verlose eine Aqara Video-Türklingel G410. Abonniere den Kanal und schreib bis zum 20. Oktober 2026 in die Kommentare, wofür du die Türklingel brauchst. Wem dazu nichts einfällt, der erzählt mir einen richtig guten Witz. Wer beides schafft, hat die besten Karten.
Ich wähle den Gewinner aus und verkünde ihn kurz vor meinem Black-Friday-Beitrag. Ich benachrichtige dich unter deinem Kommentar, danach schickst du mir deine Adresse per E-Mail. Teilnahme ab 18 Jahren, Versand nur innerhalb Deutschlands. Das Gewinnspiel steht in keiner Verbindung zu der Plattform, auf der mein Kanal läuft, und wird von ihr weder gesponsert noch durchgeführt.
Fragen zu den Deals
Welche Geräte aus den Deals funktionieren mit Home Assistant?
Alle Geräte aus der Liste lassen sich in Home Assistant einbinden, bei manchen gibt es allerdings Besonderheiten. Shelly-Geräte findet Home Assistant im eigenen Netz von selbst. Das FRITZ!Smart Thermo 302 läuft über die Integration FRITZ!SmartHome und Roborock hat eine eigene Integration. Das Eve Thermo braucht einen Thread-Border-Router, die meross Matter Steckdose läuft per Matter direkt in Home Assistant. Der X-Sense SC07-WX funktioniert über die HACS-Integration von Jarnsen, die Aqara-Geräte kannst du per Zigbee2MQTT einbinden.
Laufen die Geräte lokal ohne Cloud?
Das hängt vom Gerät ab. Shelly steuerst du lokal, der Aqara Pet Feeder C1 läuft über Zigbee2MQTT nur in deinem eigenen Netz und funktioniert auch bei Internetausfall. Der X-Sense SC07-WX läuft in Home Assistant dagegen über die X-Sense-Cloud. Bei den übrigen Geräten habe ich das hier nicht geprüft.
Bis wann gelten die Angebote und Rabattcodes?
Die Prime Big Deal Days laufen am 6. und 7. Oktober 2026, genau so lange gelten auch die beiden Aqara-Codes. Der Code für X-Sense gilt noch bis zum 30. November 2026. Prime-Angebote wechseln während des Events, ich habe die Preise am 6. Oktober morgens erhoben und mittags noch einmal geprüft.
Sind die Angebote wirklich günstig?
Ich vergleiche jeden Deal mit dem niedrigsten Preis der letzten 180 Tage und gegen die Preise vom Prime Day im Juni. Ein Badge bekommt ein Deal nur, wenn beide Quellen passen. Liegt ein Preis über dem bisherigen Tief, steht der bisherige Bestpreis dabei.
Aqara Pet Feeder C1 in Home Assistant: ohne Hub, ohne Cloud, mit eigenem Dashboard
Auf der Amazon-Seite des Pet Feeder C1 steht in Großbuchstaben, dass er einen Aqara-Hub voraussetzt. Für die Aqara-App stimmt das auch. Für Home Assistant nicht. Der Napf ist ein ganz normales Zigbee-3.0-Gerät. Wenn du schon einen Zigbee-Coordinator im Haus hast, koppelst du ihn direkt an deine eigene Zigbee-Instanz. Kein Hub, keine App, kein Konto, keine Cloud, die dazwischen ausfallen kann.
Von der Größe her ist der Napf für kleine bis mittelgroße Hunde und für Katzen gedacht, bei größeren Hunden wird es schwierig. Du legst einen Fütterungsplan an und stellst die Portionsgröße über die Grammzahl ein. Falls mal der Strom ausfällt, kannst du auf der Unterseite Batterien als Notstromversorgung einsetzen.
Dieser Guide zeigt den zweiten Weg: Napf an Zigbee2MQTT, vier Mahlzeiten als Formular in Home Assistant, ein Knopf für ein Leckerli zwischendurch. Am Ende steht ein Dashboard, das jeder im Haushalt bedienen kann, auch ohne Home Assistant zu verstehen.
Die beiden Wege im Vergleich
| Über den Aqara-Hub | Über Zigbee2MQTT oder ZHA | |
|---|---|---|
| Zusätzliche Hardware | Aqara-Hub nötig | dein vorhandener Zigbee-Coordinator |
| Konto und App | Aqara-Konto und Aqara Home | nichts davon |
| Wo die Befehle langlaufen | über Aqara-Server | nur im eigenen Netz |
| Funktioniert bei Internetausfall | eingeschränkt | vollständig |
| Zeitplan | in der Aqara-App | im eigenen Dashboard, siehe unten |
| Einrichtung | geführt, sehr schnell | einmal koppeln, dann alles selbst gebaut |
Der Weg über den Hub ist nicht falsch. Wenn du ohnehin Aqara-Geräte in der Aqara-App betreibst, ist er der kürzere. Er kostet dich nur das Gerät zusätzlich. Der Napf gehorcht dann einem Server, der nicht bei dir steht. Ich gehe hier den anderen Weg.
Was du brauchst
- Home Assistant
- Ein laufendes Zigbee2MQTT mit MQTT-Broker und Zigbee-Coordinator. Die Einrichtung behandle ich hier nicht. Mit ZHA funktioniert der Napf ebenfalls, dann heißen die Entitäten nur anders und das Script am Ende sieht anders aus.
- Aqara Smart Pet Feeder C1. Modellnummer
ZNCWWSQ01LM, bei manchen Händlern alsPETC1-M01gelistet. - Aus HACS: Mushroom, Bubble Card, card-mod und Expander Card. Ohne die vier lädt das Dashboard unten nicht.
Schritt 1: Den Napf koppeln
- Im Zigbee2MQTT-Frontend oben rechts auf Kopplung erlauben klicken.
- Am Napf die Reset-Taste fünf Sekunden halten, bis die LED schnell blinkt.
- Warten. Der Napf piept, sobald er im Netz ist.
Stell den Napf zum Koppeln direkt neben den Coordinator. Ein halber Meter reicht, quer durchs Haus ist zu weit. Der C1 ist beim Beitritt empfindlich, danach ist er selbst ein Router und darf zurück an seinen Platz. Das allein erspart die halbe Fehlersuche unten.
Wenn er sich nicht koppeln lässt
Der C1 ist dafür berüchtigt. Die LED blinkt, alles sieht richtig aus, Zigbee2MQTT findet ihn trotzdem nicht. Der Grund ist meistens, dass er Reste seiner vorherigen Zigbee-Verbindung behält, obwohl er scheinbar im Pairing-Modus steht. Das trifft besonders Geräte, die schon einmal an einem anderen Coordinator hingen oder eine Neuinstallation hinter sich haben.
Arbeite die Stufen der Reihe nach ab, nicht durcheinander:
Stufe 1: Reihenfolge umdrehen. Die übliche Anleitung sagt erst Permit Join, dann Reset. Beim C1 ist es andersherum richtig. Erst resetten, warten, bis er zwei Pieptöne von sich gegeben hat. Erst danach in Zigbee2MQTT die Kopplung freigeben. Dieser Hinweis steht inzwischen sogar auf der offiziellen Geräteseite.
Stufe 2: Länger halten. Fünf Sekunden sind ein Richtwert, kein Gesetz. Halte die Taste weiter, auch über den ersten Piepton hinaus.
Stufe 3: Gezielt statt pauschal freigeben. Beim Knopf für die Kopplung gibt es einen kleinen Pfeil. Dort kannst du statt All ausdrücklich deinen Coordinator auswählen. Zigbee2MQTT empfiehlt das selbst für schwierige Aqara-Geräte.
Stufe 4: Der Power-Cycle-Reset. Das ist die Prozedur für den Fall, dass er die alte Verbindung einfach nicht loslässt. Sie sieht umständlich aus, sie ist es auch, sie funktioniert aber bei Geräten, die vorher monatelang nicht koppeln wollten:
- In Zigbee2MQTT die Kopplung noch nicht freigeben
- Den Napf am Netzteil betreiben, eingelegte Batterien herausnehmen
- Netzteil abziehen
- Die Reset-Taste im stromlosen Zustand etwa zehn Sekunden halten, dann loslassen
- Die Taste erneut drücken und gedrückt halten
- Mit gedrückter Taste das Netzteil wieder einstecken
- Die Taste während des gesamten Bootvorgangs weiter halten
- Warten, bis die LED blinkt und die Pieptöne kommen
- Jetzt erst in Zigbee2MQTT die Kopplung freigeben
- Taste loslassen und ihm eine Minute Zeit geben
Stufe 5: Ins Protokoll sehen, statt weiter zu resetten. Zigbee2MQTT, Protokoll öffnen und nach aqara.feeder.acn001 suchen. Das ist die Zigbee-Kennung des C1. Was du dort siehst, entscheidet, welches Problem du überhaupt hast:
| Im Protokoll steht | Was das heißt |
|---|---|
| gar nichts zum Feeder | Er funkt nicht bis zum Coordinator. Näher heran, Stufe 4 |
| ein Beitritt, danach ein abgebrochenes Interview | Er kommt an, der Coordinator fragt ihn nur nicht fertig aus. Taste antippen, damit er wach bleibt |
| ein Beitritt und ein sauberes Interview | Fertig, er ist drin |
Der Unterschied zwischen den ersten beiden Zeilen ist der Grund, warum sich Stufe 5 lohnt. Beide fühlen sich beim Danebenstehen gleich an, sie brauchen aber verschiedene Handgriffe.
Vergib gleich im Frontend den Namen, bei mir Pet Feeder. Aus dem Namen baut Zigbee2MQTT sowohl das MQTT-Topic als auch die Entity-IDs in Home Assistant. Später umbenennen heißt, jede Karte und jedes Script nachziehen.
Schritt 2: Was du danach hast
Vierzehn Entitäten, ohne dass du irgendetwas konfigurieren musst:
| Entität | Was sie tut |
|---|---|
select.pet_feeder_feed | Auf START gesetzt gibt der Napf sofort aus. Schreibend, kein Zustand |
select.pet_feeder_mode | schedule oder manual |
number.pet_feeder_serving_size | Portionen pro Ausgabe, 1 bis 10 |
number.pet_feeder_portion_weight | Gramm pro Portion, 1 bis 20 |
sensor.pet_feeder_schedule | Der Zeitplan, wie er im Napf steht |
sensor.pet_feeder_feeding_source | schedule, manual oder remote |
sensor.pet_feeder_feeding_size | Portionen der letzten Ausgabe |
sensor.pet_feeder_portions_per_day | Portionen heute |
sensor.pet_feeder_weight_per_day | Gramm heute |
binary_sensor.pet_feeder_error | Futter klemmt oder der Behälter ist leer |
switch.pet_feeder_child_lock | Sperrt die Taste am Gerät |
switch.pet_feeder_led_indicator | Schaltet die LED von 21 bis 9 Uhr ab |
sensor.pet_feeder_linkquality | Funkqualität |
update.pet_feeder | Firmware über Zigbee |
Zwei Dinge, die man leicht falsch versteht:
portion_weight ist keine Einstellung, sondern eine Angabe. Du sagst dem Napf damit, wie schwer eine Portion bei deinem Futter ist. Er wiegt nichts, er rechnet nur. Steht der Wert falsch, stimmt die Gramm-Anzeige nicht, die Ausgabe schon.
serving_size gilt nur für die Ausgabe von Hand. Die Portionen im Zeitplan stehen im Zeitplan selbst.
Schritt 3: Die Betriebsart
Der Napf hält den Zeitplan nur ein, wenn select.pet_feeder_mode auf schedule steht. Auf manual merkt er sich den Plan zwar, arbeitet ihn aber nicht ab. Das ist der häufigste Grund dafür, dass nachts nichts passiert, obwohl der Plan sichtbar im Gerät steht. Auf dem Dashboard unten sind beide Betriebsarten deshalb zwei große Kacheln und keine versteckte Auswahlliste.
Schritt 4: Die Helfer anlegen
Vier Mahlzeiten, pro Mahlzeit vier Helfer. Das ist das Formular, das der Nutzer bedient. Der Napf sieht davon nichts, bis du in Schritt 5 auf Speichern drückst.
Entweder über Einstellungen, Geräte und Dienste, Helfer anklicken oder das hier in die configuration.yaml legen. Nicht beides, sonst kollidieren die Entity-IDs.
1input_boolean:
2 napf_mahlzeit_1_aktiv:
3 name: Napf Mahlzeit 1 aktiv
4 icon: mdi:check-circle-outline
5 napf_mahlzeit_2_aktiv:
6 name: Napf Mahlzeit 2 aktiv
7 icon: mdi:check-circle-outline
8 napf_mahlzeit_3_aktiv:
9 name: Napf Mahlzeit 3 aktiv
10 icon: mdi:check-circle-outline
11 napf_mahlzeit_4_aktiv:
12 name: Napf Mahlzeit 4 aktiv
13 icon: mdi:check-circle-outline
14input_datetime:
15 napf_mahlzeit_1_zeit:
16 name: Napf Mahlzeit 1 Zeit
17 has_time: true
18 has_date: false
19 icon: mdi:clock-outline
20 napf_mahlzeit_2_zeit:
21 name: Napf Mahlzeit 2 Zeit
22 has_time: true
23 has_date: false
24 icon: mdi:clock-outline
25 napf_mahlzeit_3_zeit:
26 name: Napf Mahlzeit 3 Zeit
27 has_time: true
28 has_date: false
29 icon: mdi:clock-outline
30 napf_mahlzeit_4_zeit:
31 name: Napf Mahlzeit 4 Zeit
32 has_time: true
33 has_date: false
34 icon: mdi:clock-outline
35input_number:
36 napf_mahlzeit_1_portionen:
37 name: Napf Mahlzeit 1 Portionen
38 min: 1.0
39 max: 10.0
40 step: 1.0
41 mode: box
42 icon: mdi:numeric
43 napf_mahlzeit_2_portionen:
44 name: Napf Mahlzeit 2 Portionen
45 min: 1.0
46 max: 10.0
47 step: 1.0
48 mode: box
49 icon: mdi:numeric
50 napf_mahlzeit_3_portionen:
51 name: Napf Mahlzeit 3 Portionen
52 min: 1.0
53 max: 10.0
54 step: 1.0
55 mode: box
56 icon: mdi:numeric
57 napf_mahlzeit_4_portionen:
58 name: Napf Mahlzeit 4 Portionen
59 min: 1.0
60 max: 10.0
61 step: 1.0
62 mode: box
63 icon: mdi:numeric
64input_select:
65 napf_mahlzeit_1_tage:
66 name: Napf Mahlzeit 1 Tage
67 options:
68 - Täglich
69 - Mo bis Fr
70 - Sa und So
71 - Mo, Mi, Fr, So
72 - Di, Do, Sa
73 - Montag
74 - Dienstag
75 - Mittwoch
76 - Donnerstag
77 - Freitag
78 - Samstag
79 - Sonntag
80 icon: mdi:calendar-week
81 napf_mahlzeit_2_tage:
82 name: Napf Mahlzeit 2 Tage
83 options:
84 - Täglich
85 - Mo bis Fr
86 - Sa und So
87 - Mo, Mi, Fr, So
88 - Di, Do, Sa
89 - Montag
90 - Dienstag
91 - Mittwoch
92 - Donnerstag
93 - Freitag
94 - Samstag
95 - Sonntag
96 icon: mdi:calendar-week
97 napf_mahlzeit_3_tage:
98 name: Napf Mahlzeit 3 Tage
99 options:
100 - Täglich
101 - Mo bis Fr
102 - Sa und So
103 - Mo, Mi, Fr, So
104 - Di, Do, Sa
105 - Montag
106 - Dienstag
107 - Mittwoch
108 - Donnerstag
109 - Freitag
110 - Samstag
111 - Sonntag
112 icon: mdi:calendar-week
113 napf_mahlzeit_4_tage:
114 name: Napf Mahlzeit 4 Tage
115 options:
116 - Täglich
117 - Mo bis Fr
118 - Sa und So
119 - Mo, Mi, Fr, So
120 - Di, Do, Sa
121 - Montag
122 - Dienstag
123 - Mittwoch
124 - Donnerstag
125 - Freitag
126 - Samstag
127 - Sonntag
128 icon: mdi:calendar-weekDie Optionen der Auswahlliste sind bewusst deutsch. Die Übersetzung in das, was der Napf versteht, passiert gleich im Script.
Schritt 5: Das Script, das den Plan in den Napf schreibt
Zigbee2MQTT erwartet den Zeitplan als Liste von Objekten, alles in einem Rutsch. Du kannst keine einzelne Mahlzeit ändern, du schreibst immer den ganzen Plan. Genau das macht dieses Script: Es liest die vier Mahlzeiten aus den Helfern, wirft die inaktiven weg, sortiert den Rest nach Uhrzeit und schickt ihn per MQTT an das Gerät.
1pet_feeder_apply_schedule:
2 alias: 'Napf: Zeitplan zum Gerät schicken'
3 description: Baut den Zeitplan aus den vier Mahlzeit-Helfern und schreibt ihn über Zigbee2MQTT in den
4 Napf.
5 icon: mdi:content-save-cog
6 mode: single
7 sequence:
8 - variables:
9 plan: |-
10 {%- set map = {"Täglich":"everyday","Mo bis Fr":"workdays","Sa und So":"weekend","Mo, Mi, Fr, So":"mon-wed-fri-sun","Di, Do, Sa":"tue-thu-sat","Montag":"mon","Dienstag":"tue","Mittwoch":"wed","Donnerstag":"thu","Freitag":"fri","Samstag":"sat","Sonntag":"sun"} -%}
11 {%- set ns = namespace(items=[]) -%}
12 {%- for i in range(1, 5) -%}
13 {%- set t = states('input_datetime.napf_mahlzeit_' ~ i ~ '_zeit') -%}
14 {%- if is_state('input_boolean.napf_mahlzeit_' ~ i ~ '_aktiv', 'on') and ':' in t -%}
15 {%- set ns.items = ns.items + [{
16 'days': map.get(states('input_select.napf_mahlzeit_' ~ i ~ '_tage'), 'everyday'),
17 'hour': t.split(':')[0] | int,
18 'minute': t.split(':')[1] | int,
19 'size': states('input_number.napf_mahlzeit_' ~ i ~ '_portionen') | int(1)
20 }] -%}
21 {%- endif -%}
22 {%- endfor -%}
23 {{ ns.items | sort(attribute='minute') | sort(attribute='hour') | list }}
24 - action: mqtt.publish
25 data:
26 topic: zigbee2mqtt/Pet Feeder/set
27 payload: '{{ {''schedule'': plan} | to_json }}'Erlaubt sind für days nur diese Werte, deshalb die Übersetzungstabelle im Script: everyday, workdays, weekend, mon-wed-fri-sun, tue-thu-sat und die sieben einzelnen Wochentage mon bis sun.
Eine leere Liste löscht den Zeitplan im Napf. Wenn du alle vier Mahlzeiten deaktivierst und speicherst, ist der Plan weg. Das ist so gewollt, es soll dich nur nicht überraschen.
Schritt 6: Die Automation, die zurückliest
Ohne sie zeigt das Formular nur, was du zuletzt eingetippt hast, und nicht, was wirklich im Gerät steht. Diese Automation spiegelt den Zeitplan des Napfs zurück in die Helfer, bei jeder Änderung und nach jedem Neustart von Home Assistant.
1id: pet_feeder_schedule_readback
2alias: 'Napf: Zeitplan in die Helfer einlesen'
3description: Spiegelt den Zeitplan des Napfs in die vier Mahlzeit-Helfer, damit das Formular den echten
4 Stand zeigt.
5triggers:
6- trigger: state
7 entity_id: sensor.pet_feeder_schedule
8- trigger: homeassistant
9 event: start
10conditions:
11- condition: template
12 value_template: '{{ states(''sensor.pet_feeder_schedule'').startswith(''['') }}'
13actions:
14- variables:
15 plan: '{{ states(''sensor.pet_feeder_schedule'') | replace("''", ''"'') | from_json }}'
16 names:
17 everyday: Täglich
18 workdays: Mo bis Fr
19 weekend: Sa und So
20 mon-wed-fri-sun: Mo, Mi, Fr, So
21 tue-thu-sat: Di, Do, Sa
22 mon: Montag
23 tue: Dienstag
24 wed: Mittwoch
25 thu: Donnerstag
26 fri: Freitag
27 sat: Samstag
28 sun: Sonntag
29- repeat:
30 for_each:
31 - 1
32 - 2
33 - 3
34 - 4
35 sequence:
36 - if:
37 - condition: template
38 value_template: '{{ plan | count >= repeat.item }}'
39 then:
40 - action: input_boolean.turn_on
41 target:
42 entity_id: '{{ "input_boolean.napf_mahlzeit_" ~ repeat.item ~ "_aktiv" }}'
43 - action: input_datetime.set_datetime
44 target:
45 entity_id: '{{ "input_datetime.napf_mahlzeit_" ~ repeat.item ~ "_zeit" }}'
46 data:
47 time: '{{ "%02d:%02d:00" | format(plan[repeat.item - 1].hour, plan[repeat.item - 1].minute)
48 }}'
49 - action: input_number.set_value
50 target:
51 entity_id: '{{ "input_number.napf_mahlzeit_" ~ repeat.item ~ "_portionen" }}'
52 data:
53 value: '{{ plan[repeat.item - 1].size | int(1) }}'
54 - action: input_select.select_option
55 target:
56 entity_id: '{{ "input_select.napf_mahlzeit_" ~ repeat.item ~ "_tage" }}'
57 data:
58 option: '{{ names.get(plan[repeat.item - 1].days, "Täglich") }}'
59 else:
60 - action: input_boolean.turn_off
61 target:
62 entity_id: '{{ "input_boolean.napf_mahlzeit_" ~ repeat.item ~ "_aktiv" }}'
63mode: restartDer Sensor liefert den Plan als Python-Schreibweise mit einfachen Anführungszeichen, also [{'days': 'everyday', 'hour': 9, ...}]. Das ist kein gültiges JSON. Deshalb steht in jeder Auswertung replace("'", '"') | from_json davor. Wer das vergisst, bekommt einen Template-Fehler, der nach einem kaputten Sensor aussieht, aber keiner ist.
mode: restart ist hier richtig, weil beim Speichern mehrere Zustandswechsel kurz hintereinander kommen und nur der letzte zählt.
Schritt 7: Das Dashboard
Vier Abschnitte, von oben nach unten in der Reihenfolge, in der man sie braucht: erst füttern, dann planen, dann nachsehen, dann einstellen.
Angelegt wird die Ansicht über Dashboard bearbeiten, Ansicht hinzufügen, Abschnitte, danach oben rechts über die drei Punkte den Raw-Konfigurationseditor öffnen. Dort kommen die Blöcke hinein.
Der Kopf der Ansicht
1type: sections
2title: Pet Feeder
3path: petfeeder
4icon: mdi:paw
5max_columns: 2
6theme: Alles Automatisch
7header:
8 layout: start
9 badges_position: bottom
10badges: []
11sections:
12 - ...max_columns: 2 sorgt dafür, dass die Abschnitte am Rechner nebeneinander stehen und am Handy untereinander. Das Theme kannst du weglassen, dann erbt die Ansicht dein normales.
Abschnitt 1: Füttern
Der wichtigste Teil und der einzige, den Besuch je anfassen wird. Die große Kachel schickt START an select.pet_feeder_feed und gibt damit sofort aus, was unter ihr eingestellt ist. Ihre Unterzeile rechnet Portionen mal Gramm zusammen, damit vorher klar ist, wie viel gleich herausfällt.
Darüber liegt eine Störungskarte, die nur erscheint, wenn binary_sensor.pet_feeder_error anschlägt. Darunter die zweite bedingte Karte für den Fall, dass der Napf seine Betriebsart nach dem Koppeln noch nicht gemeldet hat. Beide sind im Normalbetrieb unsichtbar.
1- type: grid
2 cards:
3 - type: custom:bubble-card
4 card_type: separator
5 name: Füttern
6 icon: mdi:bowl-mix
7 styles: |2
8
9 .bubble-line {
10 background: linear-gradient(90deg, rgba(137,201,186,0.7), rgba(137,201,186,0)) !important;
11 height: 2px !important;
12 }
13 .bubble-name { color: var(--primary-text-color) !important; font-weight: 700 !important; letter-spacing: 0.02em !important; }
14 .bubble-icon { color: #89c9ba !important; }
15 card_mod:
16 style: |2
17
18 ha-card {
19 background: transparent !important;
20 border: none !important;
21 box-shadow: none !important;
22 margin-top: 8px !important;
23 padding-bottom: 4px !important;
24 }
25 grid_options:
26 columns: 12
27 rows: auto
28 - type: conditional
29 conditions:
30 - condition: state
31 entity: binary_sensor.pet_feeder_error
32 state: 'on'
33 card:
34 type: custom:mushroom-template-card
35 entity: binary_sensor.pet_feeder_error
36 primary: Störung am Napf
37 secondary: Futter klemmt oder der Behälter ist leer. Nachsehen, dann läuft der Zeitplan weiter.
38 icon: mdi:alert-circle
39 layout: horizontal
40 multiline_secondary: true
41 tap_action:
42 action: more-info
43 card_mod:
44 style: |2
45
46 ha-card {
47 background: rgba(240,102,91,0.12) !important;
48 border: 1px solid rgba(240,102,91,0.35) !important;
49 border-radius: 14px !important;
50 box-shadow: none !important;
51 --card-primary-font-weight: 700;
52 }
53 grid_options:
54 columns: 12
55 rows: auto
56 - type: custom:mushroom-template-card
57 entity: select.pet_feeder_feed
58 primary: Leckerli ausgeben
59 secondary: '{% set p = states(''number.pet_feeder_serving_size'') | int(1) %}{% set g = states(''number.pet_feeder_portion_weight'')
60 | int(0) %}{{ p }} Portion{{ ''en'' if p > 1 }} · {{ p * g }} g'
61 icon: mdi:bone
62 icon_color: '#f0665b'
63 layout: horizontal
64 tap_action:
65 action: perform-action
66 perform_action: select.select_option
67 target:
68 entity_id: select.pet_feeder_feed
69 data:
70 option: START
71 hold_action:
72 action: more-info
73 double_tap_action:
74 action: none
75 card_mod:
76 style: |2
77
78 ha-card {
79 background:
80 radial-gradient(120% 140% at 0% 0%, rgba(240,102,91,0.22), rgba(240,102,91,0) 60%),
81 radial-gradient(120% 140% at 100% 100%, rgba(137,201,186,0.18), rgba(137,201,186,0) 60%),
82 var(--ha-card-background, #fff) !important;
83 border: none !important;
84 border-radius: 22px !important;
85 box-shadow: 0 6px 18px rgba(240,102,91,0.16) !important;
86 padding: 20px 20px !important;
87 --icon-size: 56px;
88 --icon-symbol-size: 30px;
89 --card-primary-font-size: 1.3em;
90 --card-primary-font-weight: 700;
91 --card-secondary-font-size: 0.95em;
92 --card-secondary-color: var(--secondary-text-color);
93 }
94 ha-card:active { transform: scale(0.985); transition: transform 90ms ease; }
95 grid_options:
96 columns: 12
97 rows: auto
98 - type: tile
99 entity: number.pet_feeder_serving_size
100 name: Portionen pro Ausgabe
101 icon: mdi:numeric
102 hide_state: true
103 features_position: bottom
104 features:
105 - type: numeric-input
106 style: slider
107 card_mod:
108 style: |2
109
110 ha-card {
111 background: var(--ha-card-background, #fff) !important;
112 border-radius: 14px !important;
113 border: none !important;
114 box-shadow: 0 1px 4px rgba(0,0,0,0.06) !important;
115 --tile-color: rgb(240,102,91) !important;
116 }
117 grid_options:
118 columns: 12
119 rows: auto
120 - type: tile
121 entity: number.pet_feeder_portion_weight
122 name: Gramm pro Portion
123 icon: mdi:weight-gram
124 features_position: bottom
125 features:
126 - type: numeric-input
127 style: slider
128 card_mod:
129 style: |2
130
131 ha-card {
132 background: var(--ha-card-background, #fff) !important;
133 border-radius: 14px !important;
134 border: none !important;
135 box-shadow: 0 1px 4px rgba(0,0,0,0.06) !important;
136 --tile-color: rgb(137,201,186) !important;
137 }
138 grid_options:
139 columns: 12
140 rows: auto
141 - type: conditional
142 conditions:
143 - condition: state
144 entity: select.pet_feeder_mode
145 state:
146 - unknown
147 - unavailable
148 card:
149 type: custom:mushroom-template-card
150 entity: select.pet_feeder_mode
151 primary: Betriebsart noch offen
152 secondary: Der Napf hat sie noch nicht gemeldet. Einmal antippen, dann steht sie hier.
153 icon: mdi:help-circle-outline
154 icon_color: '#89c9ba'
155 layout: horizontal
156 multiline_secondary: true
157 tap_action:
158 action: none
159 card_mod:
160 style: |2
161
162 ha-card {
163 background: rgba(137,201,186,0.10) !important;
164 border: none !important;
165 border-radius: 14px !important;
166 box-shadow: none !important;
167 --card-primary-font-size: 0.98em;
168 --card-secondary-font-size: 0.86em;
169 --card-secondary-color: var(--secondary-text-color);
170 }
171 grid_options:
172 columns: 12
173 rows: auto
174 - type: custom:mushroom-template-card
175 entity: select.pet_feeder_mode
176 primary: Zeitplan
177 secondary: '{% if is_state(''select.pet_feeder_mode'', ''schedule'') %}aktiv{% else %}antippen{% endif
178 %}'
179 icon: mdi:calendar-clock
180 icon_color: '{% if is_state(''select.pet_feeder_mode'', ''schedule'') %}#f0665b{% else %}disabled{%
181 endif %}'
182 layout: vertical
183 tap_action:
184 action: perform-action
185 perform_action: select.select_option
186 target:
187 entity_id: select.pet_feeder_mode
188 data:
189 option: schedule
190 hold_action:
191 action: more-info
192 card_mod:
193 style: |2
194
195 ha-card {
196 background: {% if is_state('select.pet_feeder_mode', 'schedule') %}rgba(240,102,91,0.14){% else %}var(--ha-card-background, #fff){% endif %} !important;
197 border: 1px solid {% if is_state('select.pet_feeder_mode', 'schedule') %}rgba(240,102,91,0.45){% else %}rgba(0,0,0,0.05){% endif %} !important;
198 border-radius: 14px !important;
199 box-shadow: {% if is_state('select.pet_feeder_mode', 'schedule') %}none{% else %}0 1px 4px rgba(0,0,0,0.06){% endif %} !important;
200 --card-primary-font-size: 1em;
201 --card-primary-font-weight: {% if is_state('select.pet_feeder_mode', 'schedule') %}700{% else %}500{% endif %};
202 --card-secondary-font-size: 0.8em;
203 --card-secondary-color: var(--secondary-text-color);
204 }
205 ha-card:active { transform: scale(0.985); transition: transform 90ms ease; }
206 grid_options:
207 columns: 6
208 rows: auto
209 - type: custom:mushroom-template-card
210 entity: select.pet_feeder_mode
211 primary: Nur von Hand
212 secondary: '{% if is_state(''select.pet_feeder_mode'', ''manual'') %}aktiv{% else %}antippen{% endif
213 %}'
214 icon: mdi:hand-back-right
215 icon_color: '{% if is_state(''select.pet_feeder_mode'', ''manual'') %}#89c9ba{% else %}disabled{% endif
216 %}'
217 layout: vertical
218 tap_action:
219 action: perform-action
220 perform_action: select.select_option
221 target:
222 entity_id: select.pet_feeder_mode
223 data:
224 option: manual
225 hold_action:
226 action: more-info
227 card_mod:
228 style: |2
229
230 ha-card {
231 background: {% if is_state('select.pet_feeder_mode', 'manual') %}rgba(137,201,186,0.14){% else %}var(--ha-card-background, #fff){% endif %} !important;
232 border: 1px solid {% if is_state('select.pet_feeder_mode', 'manual') %}rgba(137,201,186,0.45){% else %}rgba(0,0,0,0.05){% endif %} !important;
233 border-radius: 14px !important;
234 box-shadow: {% if is_state('select.pet_feeder_mode', 'manual') %}none{% else %}0 1px 4px rgba(0,0,0,0.06){% endif %} !important;
235 --card-primary-font-size: 1em;
236 --card-primary-font-weight: {% if is_state('select.pet_feeder_mode', 'manual') %}700{% else %}500{% endif %};
237 --card-secondary-font-size: 0.8em;
238 --card-secondary-color: var(--secondary-text-color);
239 }
240 ha-card:active { transform: scale(0.985); transition: transform 90ms ease; }
241 grid_options:
242 columns: 6
243 rows: autoAbschnitt 2: Zeitplan
Oben eine Markdown-Karte, die den Plan liest, den der Napf wirklich hat. Sie gibt ihn in Sätzen aus statt in JSON. Darunter der Expander mit den vier Mahlzeiten, eingeklappt, damit die Ansicht nicht zur Bleiwüste wird.
Die Speicherkarte darunter ist der Kern der Bedienung: Sie baut aus den Helfern denselben Entwurf, den das Script bauen würde. Dann vergleicht sie ihn mit dem, was im Napf steht. Sind beide gleich, ist sie grau und sagt „Zeitplan ist gespeichert“. Unterscheiden sie sich, wird sie rot und fordert zum Antippen auf. So siehst du ungespeicherte Änderungen, ohne sie zu suchen.
1- type: grid
2 cards:
3 - type: custom:bubble-card
4 card_type: separator
5 name: Zeitplan
6 icon: mdi:calendar-clock
7 styles: |2
8
9 .bubble-line {
10 background: linear-gradient(90deg, rgba(137,201,186,0.7), rgba(137,201,186,0)) !important;
11 height: 2px !important;
12 }
13 .bubble-name { color: var(--primary-text-color) !important; font-weight: 700 !important; letter-spacing: 0.02em !important; }
14 .bubble-icon { color: #89c9ba !important; }
15 card_mod:
16 style: |2
17
18 ha-card {
19 background: transparent !important;
20 border: none !important;
21 box-shadow: none !important;
22 margin-top: 8px !important;
23 padding-bottom: 4px !important;
24 }
25 grid_options:
26 columns: 12
27 rows: auto
28 - type: markdown
29 content: |-
30 {% set map = {'everyday': 'täglich', 'workdays': 'Mo bis Fr', 'weekend': 'Sa und So', 'mon': 'montags', 'tue': 'dienstags', 'wed': 'mittwochs', 'thu': 'donnerstags', 'fri': 'freitags', 'sat': 'samstags', 'sun': 'sonntags'} %}{% set raw = states('sensor.pet_feeder_schedule') %}
31 {%- if raw.startswith('[') %}
32 {%- set plan = raw | replace("'", '"') | from_json %}
33 {%- set g = states('number.pet_feeder_portion_weight') | int(0) %}
34 {%- for s in plan | sort(attribute='hour') %}
35 <ha-icon icon="mdi:clock-outline"></ha-icon> **{{ '%02d'|format(s.hour) }}:{{ '%02d'|format(s.minute) }} Uhr** · {{ s.size }} Portion{{ 'en' if s.size | int > 1 }} ({{ s.size | int * g }} g) · {{ map.get(s.days, s.days) }}
36 {% endfor %}
37 ---
38 Zusammen **{{ plan | map(attribute='size') | map('int') | sum }} Portionen** am Tag, also {{ plan | map(attribute='size') | map('int') | sum * g }} g. Der Zähler unten zählt jede Ausgabe mit, auch die von Hand.
39 {%- else %}
40 Kein Zeitplan hinterlegt. Der Napf gibt nur aus, was du hier auslöst.
41 {%- endif %}
42 card_mod:
43 style: |2
44
45 ha-card {
46 background: var(--ha-card-background, #fff) !important;
47 border-radius: 14px !important;
48 border: none !important;
49 box-shadow: 0 1px 4px rgba(0,0,0,0.06) !important;
50 }
51 ha-card .card-content { padding: 16px 18px !important; }
52 ha-card ha-markdown hr { border: none; border-top: 1px solid rgba(137,201,186,0.35); margin: 10px 0; }
53 ha-card ha-markdown ha-icon { --mdc-icon-size: 18px; color: #89c9ba; vertical-align: -3px; margin-right: 4px; }
54 grid_options:
55 columns: 12
56 rows: auto
57 - type: custom:expander-card
58 title: Mahlzeiten bearbeiten
59 expanded: false
60 gap: 8px
61 padding: 0px
62 child-padding: 0px
63 button-background: transparent
64 cards:
65 - type: entities
66 title: Mahlzeit 1
67 entities:
68 - entity: input_boolean.napf_mahlzeit_1_aktiv
69 name: Aktiv
70 - entity: input_datetime.napf_mahlzeit_1_zeit
71 name: Uhrzeit
72 - entity: input_number.napf_mahlzeit_1_portionen
73 name: Portionen
74 - entity: input_select.napf_mahlzeit_1_tage
75 name: Tage
76 card_mod:
77 style: |2
78
79 ha-card {
80 background: var(--ha-card-background, #fff) !important;
81 border-radius: 14px !important;
82 border: none !important;
83 box-shadow: 0 1px 4px rgba(0,0,0,0.06) !important;
84 opacity: {% if is_state('input_boolean.napf_mahlzeit_1_aktiv', 'on') %}1{% else %}0.6{% endif %};
85 }
86 ha-card .card-header {
87 font-size: 0.95em !important;
88 font-weight: 700 !important;
89 padding-bottom: 4px !important;
90 color: {% if is_state('input_boolean.napf_mahlzeit_1_aktiv', 'on') %}#f0665b{% else %}var(--secondary-text-color){% endif %} !important;
91 }
92 grid_options:
93 columns: 12
94 rows: auto
95 - type: entities
96 title: Mahlzeit 2
97 entities:
98 - entity: input_boolean.napf_mahlzeit_2_aktiv
99 name: Aktiv
100 - entity: input_datetime.napf_mahlzeit_2_zeit
101 name: Uhrzeit
102 - entity: input_number.napf_mahlzeit_2_portionen
103 name: Portionen
104 - entity: input_select.napf_mahlzeit_2_tage
105 name: Tage
106 card_mod:
107 style: |2
108
109 ha-card {
110 background: var(--ha-card-background, #fff) !important;
111 border-radius: 14px !important;
112 border: none !important;
113 box-shadow: 0 1px 4px rgba(0,0,0,0.06) !important;
114 opacity: {% if is_state('input_boolean.napf_mahlzeit_2_aktiv', 'on') %}1{% else %}0.6{% endif %};
115 }
116 ha-card .card-header {
117 font-size: 0.95em !important;
118 font-weight: 700 !important;
119 padding-bottom: 4px !important;
120 color: {% if is_state('input_boolean.napf_mahlzeit_2_aktiv', 'on') %}#f0665b{% else %}var(--secondary-text-color){% endif %} !important;
121 }
122 grid_options:
123 columns: 12
124 rows: auto
125 - type: entities
126 title: Mahlzeit 3
127 entities:
128 - entity: input_boolean.napf_mahlzeit_3_aktiv
129 name: Aktiv
130 - entity: input_datetime.napf_mahlzeit_3_zeit
131 name: Uhrzeit
132 - entity: input_number.napf_mahlzeit_3_portionen
133 name: Portionen
134 - entity: input_select.napf_mahlzeit_3_tage
135 name: Tage
136 card_mod:
137 style: |2
138
139 ha-card {
140 background: var(--ha-card-background, #fff) !important;
141 border-radius: 14px !important;
142 border: none !important;
143 box-shadow: 0 1px 4px rgba(0,0,0,0.06) !important;
144 opacity: {% if is_state('input_boolean.napf_mahlzeit_3_aktiv', 'on') %}1{% else %}0.6{% endif %};
145 }
146 ha-card .card-header {
147 font-size: 0.95em !important;
148 font-weight: 700 !important;
149 padding-bottom: 4px !important;
150 color: {% if is_state('input_boolean.napf_mahlzeit_3_aktiv', 'on') %}#f0665b{% else %}var(--secondary-text-color){% endif %} !important;
151 }
152 grid_options:
153 columns: 12
154 rows: auto
155 - type: entities
156 title: Mahlzeit 4
157 entities:
158 - entity: input_boolean.napf_mahlzeit_4_aktiv
159 name: Aktiv
160 - entity: input_datetime.napf_mahlzeit_4_zeit
161 name: Uhrzeit
162 - entity: input_number.napf_mahlzeit_4_portionen
163 name: Portionen
164 - entity: input_select.napf_mahlzeit_4_tage
165 name: Tage
166 card_mod:
167 style: |2
168
169 ha-card {
170 background: var(--ha-card-background, #fff) !important;
171 border-radius: 14px !important;
172 border: none !important;
173 box-shadow: 0 1px 4px rgba(0,0,0,0.06) !important;
174 opacity: {% if is_state('input_boolean.napf_mahlzeit_4_aktiv', 'on') %}1{% else %}0.6{% endif %};
175 }
176 ha-card .card-header {
177 font-size: 0.95em !important;
178 font-weight: 700 !important;
179 padding-bottom: 4px !important;
180 color: {% if is_state('input_boolean.napf_mahlzeit_4_aktiv', 'on') %}#f0665b{% else %}var(--secondary-text-color){% endif %} !important;
181 }
182 grid_options:
183 columns: 12
184 rows: auto
185 card_mod:
186 style: |2
187
188 ha-card {
189 background: var(--ha-card-background, #fff) !important;
190 border-radius: 14px !important;
191 border: none !important;
192 box-shadow: 0 1px 4px rgba(0,0,0,0.06) !important;
193 }
194 ha-card .expander-header { font-weight: 700 !important; color: var(--primary-text-color) !important; }
195 grid_options:
196 columns: 12
197 rows: auto
198 - type: custom:mushroom-template-card
199 entity: script.pet_feeder_apply_schedule
200 primary: |-
201 {%- set map = {'Täglich': 'everyday', 'Mo bis Fr': 'workdays', 'Sa und So': 'weekend', 'Mo, Mi, Fr, So': 'mon-wed-fri-sun', 'Di, Do, Sa': 'tue-thu-sat', 'Montag': 'mon', 'Dienstag': 'tue', 'Mittwoch': 'wed', 'Donnerstag': 'thu', 'Freitag': 'fri', 'Samstag': 'sat', 'Sonntag': 'sun'} -%}
202 {%- set ns = namespace(items=[]) -%}
203 {%- for i in range(1, 5) -%}
204 {%- set t = states('input_datetime.napf_mahlzeit_' ~ i ~ '_zeit') -%}
205 {%- if is_state('input_boolean.napf_mahlzeit_' ~ i ~ '_aktiv', 'on') and ':' in t -%}
206 {%- set ns.items = ns.items + [{'days': map.get(states('input_select.napf_mahlzeit_' ~ i ~ '_tage'), 'everyday'), 'hour': t.split(':')[0] | int, 'minute': t.split(':')[1] | int, 'size': states('input_number.napf_mahlzeit_' ~ i ~ '_portionen') | int(1)}] -%}
207 {%- endif -%}
208 {%- endfor -%}
209 {%- set draft = ns.items | sort(attribute='minute') | sort(attribute='hour') | list -%}
210 {%- set raw = states('sensor.pet_feeder_schedule') -%}
211 {%- set live = raw | replace("'", '"') | from_json if raw.startswith('[') else [] -%}{% if draft == live %}Zeitplan ist gespeichert{% else %}Zeitplan speichern{% endif %}
212 secondary: |-
213 {%- set map = {'Täglich': 'everyday', 'Mo bis Fr': 'workdays', 'Sa und So': 'weekend', 'Mo, Mi, Fr, So': 'mon-wed-fri-sun', 'Di, Do, Sa': 'tue-thu-sat', 'Montag': 'mon', 'Dienstag': 'tue', 'Mittwoch': 'wed', 'Donnerstag': 'thu', 'Freitag': 'fri', 'Samstag': 'sat', 'Sonntag': 'sun'} -%}
214 {%- set ns = namespace(items=[]) -%}
215 {%- for i in range(1, 5) -%}
216 {%- set t = states('input_datetime.napf_mahlzeit_' ~ i ~ '_zeit') -%}
217 {%- if is_state('input_boolean.napf_mahlzeit_' ~ i ~ '_aktiv', 'on') and ':' in t -%}
218 {%- set ns.items = ns.items + [{'days': map.get(states('input_select.napf_mahlzeit_' ~ i ~ '_tage'), 'everyday'), 'hour': t.split(':')[0] | int, 'minute': t.split(':')[1] | int, 'size': states('input_number.napf_mahlzeit_' ~ i ~ '_portionen') | int(1)}] -%}
219 {%- endif -%}
220 {%- endfor -%}
221 {%- set draft = ns.items | sort(attribute='minute') | sort(attribute='hour') | list -%}
222 {%- set raw = states('sensor.pet_feeder_schedule') -%}
223 {%- set live = raw | replace("'", '"') | from_json if raw.startswith('[') else [] -%}{% if draft == live %}Napf und Formular sind gleich{% elif draft | count == 0 %}Keine Mahlzeit aktiv, das löscht den Zeitplan im Napf{% else %}{{ draft | count }} Mahlzeit{{ 'en' if draft | count > 1 }} · antippen und in den Napf schreiben{% endif %}
224 icon: |-
225 {%- set map = {'Täglich': 'everyday', 'Mo bis Fr': 'workdays', 'Sa und So': 'weekend', 'Mo, Mi, Fr, So': 'mon-wed-fri-sun', 'Di, Do, Sa': 'tue-thu-sat', 'Montag': 'mon', 'Dienstag': 'tue', 'Mittwoch': 'wed', 'Donnerstag': 'thu', 'Freitag': 'fri', 'Samstag': 'sat', 'Sonntag': 'sun'} -%}
226 {%- set ns = namespace(items=[]) -%}
227 {%- for i in range(1, 5) -%}
228 {%- set t = states('input_datetime.napf_mahlzeit_' ~ i ~ '_zeit') -%}
229 {%- if is_state('input_boolean.napf_mahlzeit_' ~ i ~ '_aktiv', 'on') and ':' in t -%}
230 {%- set ns.items = ns.items + [{'days': map.get(states('input_select.napf_mahlzeit_' ~ i ~ '_tage'), 'everyday'), 'hour': t.split(':')[0] | int, 'minute': t.split(':')[1] | int, 'size': states('input_number.napf_mahlzeit_' ~ i ~ '_portionen') | int(1)}] -%}
231 {%- endif -%}
232 {%- endfor -%}
233 {%- set draft = ns.items | sort(attribute='minute') | sort(attribute='hour') | list -%}
234 {%- set raw = states('sensor.pet_feeder_schedule') -%}
235 {%- set live = raw | replace("'", '"') | from_json if raw.startswith('[') else [] -%}{% if draft == live %}mdi:check-circle{% else %}mdi:content-save-cog{% endif %}
236 icon_color: |-
237 {%- set map = {'Täglich': 'everyday', 'Mo bis Fr': 'workdays', 'Sa und So': 'weekend', 'Mo, Mi, Fr, So': 'mon-wed-fri-sun', 'Di, Do, Sa': 'tue-thu-sat', 'Montag': 'mon', 'Dienstag': 'tue', 'Mittwoch': 'wed', 'Donnerstag': 'thu', 'Freitag': 'fri', 'Samstag': 'sat', 'Sonntag': 'sun'} -%}
238 {%- set ns = namespace(items=[]) -%}
239 {%- for i in range(1, 5) -%}
240 {%- set t = states('input_datetime.napf_mahlzeit_' ~ i ~ '_zeit') -%}
241 {%- if is_state('input_boolean.napf_mahlzeit_' ~ i ~ '_aktiv', 'on') and ':' in t -%}
242 {%- set ns.items = ns.items + [{'days': map.get(states('input_select.napf_mahlzeit_' ~ i ~ '_tage'), 'everyday'), 'hour': t.split(':')[0] | int, 'minute': t.split(':')[1] | int, 'size': states('input_number.napf_mahlzeit_' ~ i ~ '_portionen') | int(1)}] -%}
243 {%- endif -%}
244 {%- endfor -%}
245 {%- set draft = ns.items | sort(attribute='minute') | sort(attribute='hour') | list -%}
246 {%- set raw = states('sensor.pet_feeder_schedule') -%}
247 {%- set live = raw | replace("'", '"') | from_json if raw.startswith('[') else [] -%}{% if draft == live %}#89c9ba{% else %}#f0665b{% endif %}
248 layout: horizontal
249 multiline_secondary: true
250 tap_action:
251 action: perform-action
252 perform_action: script.turn_on
253 target:
254 entity_id: script.pet_feeder_apply_schedule
255 hold_action:
256 action: more-info
257 card_mod:
258 style: |
259 {%- set map = {'Täglich': 'everyday', 'Mo bis Fr': 'workdays', 'Sa und So': 'weekend', 'Mo, Mi, Fr, So': 'mon-wed-fri-sun', 'Di, Do, Sa': 'tue-thu-sat', 'Montag': 'mon', 'Dienstag': 'tue', 'Mittwoch': 'wed', 'Donnerstag': 'thu', 'Freitag': 'fri', 'Samstag': 'sat', 'Sonntag': 'sun'} -%}
260 {%- set ns = namespace(items=[]) -%}
261 {%- for i in range(1, 5) -%}
262 {%- set t = states('input_datetime.napf_mahlzeit_' ~ i ~ '_zeit') -%}
263 {%- if is_state('input_boolean.napf_mahlzeit_' ~ i ~ '_aktiv', 'on') and ':' in t -%}
264 {%- set ns.items = ns.items + [{'days': map.get(states('input_select.napf_mahlzeit_' ~ i ~ '_tage'), 'everyday'), 'hour': t.split(':')[0] | int, 'minute': t.split(':')[1] | int, 'size': states('input_number.napf_mahlzeit_' ~ i ~ '_portionen') | int(1)}] -%}
265 {%- endif -%}
266 {%- endfor -%}
267 {%- set draft = ns.items | sort(attribute='minute') | sort(attribute='hour') | list -%}
268 {%- set raw = states('sensor.pet_feeder_schedule') -%}
269 {%- set live = raw | replace("'", '"') | from_json if raw.startswith('[') else [] -%}
270 ha-card {
271 background: {% if draft == live %}var(--ha-card-background, #fff){% else %}rgba(240,102,91,0.12){% endif %} !important;
272 border: 1px solid {% if draft == live %}rgba(0,0,0,0.05){% else %}rgba(240,102,91,0.35){% endif %} !important;
273 border-radius: 14px !important;
274 box-shadow: {% if draft == live %}0 1px 4px rgba(0,0,0,0.06){% else %}none{% endif %} !important;
275 --card-primary-font-weight: 700;
276 --card-secondary-font-size: 0.86em;
277 --card-secondary-color: var(--secondary-text-color);
278 }
279 ha-card:active { transform: scale(0.985); transition: transform 90ms ease; }
280 grid_options:
281 columns: 12
282 rows: autoAbschnitt 3: Heute
Zwei Zahlen, eine Zeile Verlauf, ein Diagramm über sieben Tage. Die Zeile „Zuletzt über“ übersetzt feeding_source in Klartext, also remote zu „Home Assistant“, manual zu „Knopf am Napf“ und schedule zu „Zeitplan“. Damit siehst du sofort, ob das Tier sich selbst bedient hat.
1- type: grid
2 cards:
3 - type: custom:bubble-card
4 card_type: separator
5 name: Heute
6 icon: mdi:chart-donut
7 styles: |2
8
9 .bubble-line {
10 background: linear-gradient(90deg, rgba(137,201,186,0.7), rgba(137,201,186,0)) !important;
11 height: 2px !important;
12 }
13 .bubble-name { color: var(--primary-text-color) !important; font-weight: 700 !important; letter-spacing: 0.02em !important; }
14 .bubble-icon { color: #89c9ba !important; }
15 card_mod:
16 style: |2
17
18 ha-card {
19 background: transparent !important;
20 border: none !important;
21 box-shadow: none !important;
22 margin-top: 8px !important;
23 padding-bottom: 4px !important;
24 }
25 grid_options:
26 columns: 12
27 rows: auto
28 - type: custom:mushroom-template-card
29 entity: sensor.pet_feeder_portions_per_day
30 primary: '{{ states(''sensor.pet_feeder_portions_per_day'') | int(0) }}'
31 secondary: Portionen heute
32 icon: mdi:food-drumstick
33 icon_color: '#f0665b'
34 layout: vertical
35 tap_action:
36 action: more-info
37 card_mod:
38 style: |2
39
40 ha-card {
41 background: var(--ha-card-background, #fff) !important;
42 border-radius: 14px !important;
43 border: none !important;
44 box-shadow: 0 1px 4px rgba(0,0,0,0.06) !important;
45 --card-primary-font-size: 1.6em;
46 --card-primary-font-weight: 700;
47 --card-secondary-font-size: 0.85em;
48 --card-secondary-color: var(--secondary-text-color);
49 }
50 grid_options:
51 columns: 6
52 rows: auto
53 - type: custom:mushroom-template-card
54 entity: sensor.pet_feeder_weight_per_day
55 primary: '{{ states(''sensor.pet_feeder_weight_per_day'') | int(0) }} g'
56 secondary: Futter heute
57 icon: mdi:scale
58 icon_color: '#89c9ba'
59 layout: vertical
60 tap_action:
61 action: more-info
62 card_mod:
63 style: |2
64
65 ha-card {
66 background: var(--ha-card-background, #fff) !important;
67 border-radius: 14px !important;
68 border: none !important;
69 box-shadow: 0 1px 4px rgba(0,0,0,0.06) !important;
70 --card-primary-font-size: 1.6em;
71 --card-primary-font-weight: 700;
72 --card-secondary-font-size: 0.85em;
73 --card-secondary-color: var(--secondary-text-color);
74 }
75 grid_options:
76 columns: 6
77 rows: auto
78 - type: custom:mushroom-template-card
79 entity: sensor.pet_feeder_feeding_source
80 primary: '{% set src = states(''sensor.pet_feeder_feeding_source'') %}{% set map = {''remote'': ''Home
81 Assistant'', ''manual'': ''Knopf am Napf'', ''schedule'': ''Zeitplan''} %}Zuletzt über {{ map.get(src,
82 src) }}'
83 secondary: |-
84 {% set a = states.sensor.pet_feeder_portions_per_day.last_changed %}
85 {%- set b = states.sensor.pet_feeder_feeding_source.last_changed %}
86 {%- set t = [a, b] | max %}
87 {%- set d = (now() - t).total_seconds() | int %}
88 {%- set p = states('sensor.pet_feeder_feeding_size') | int(1) %}
89 {%- if d < 90 %}gerade eben
90 {%- elif d < 5400 %}vor {{ (d / 60) | round(0) | int }} Minuten
91 {%- elif d < 172800 %}vor {{ (d / 3600) | round(0) | int }} Stunden
92 {%- else %}vor {{ (d / 86400) | round(0) | int }} Tagen
93 {%- endif %} · {{ p }} Portion{{ 'en' if p > 1 }}
94 icon: mdi:history
95 icon_color: '#89c9ba'
96 layout: horizontal
97 tap_action:
98 action: more-info
99 card_mod:
100 style: |2
101
102 ha-card {
103 background: var(--ha-card-background, #fff) !important;
104 border-radius: 14px !important;
105 border: none !important;
106 box-shadow: 0 1px 4px rgba(0,0,0,0.06) !important;
107 --card-primary-font-weight: 600;
108 --card-secondary-color: var(--secondary-text-color);
109 }
110 grid_options:
111 columns: 12
112 rows: auto
113 - type: history-graph
114 title: Letzte sieben Tage
115 hours_to_show: 168
116 entities:
117 - entity: sensor.pet_feeder_weight_per_day
118 name: Futter pro Tag
119 - entity: sensor.pet_feeder_portions_per_day
120 name: Portionen
121 card_mod:
122 style: |2
123
124 ha-card {
125 background: var(--ha-card-background, #fff) !important;
126 border-radius: 14px !important;
127 border: none !important;
128 box-shadow: 0 1px 4px rgba(0,0,0,0.06) !important;
129 }
130 grid_options:
131 columns: 12
132 rows: autoAbschnitt 4: Napf
Alles, was man einmal einstellt und dann vergisst. Die Firmware-Karte gibt es doppelt, als bedingtes Paar: mit Update-Knopf, wenn eines ansteht, sonst nur als Anzeige.
1- type: grid
2 cards:
3 - type: custom:bubble-card
4 card_type: separator
5 name: Napf
6 icon: mdi:cog-outline
7 styles: |2
8
9 .bubble-line {
10 background: linear-gradient(90deg, rgba(137,201,186,0.7), rgba(137,201,186,0)) !important;
11 height: 2px !important;
12 }
13 .bubble-name { color: var(--primary-text-color) !important; font-weight: 700 !important; letter-spacing: 0.02em !important; }
14 .bubble-icon { color: #89c9ba !important; }
15 card_mod:
16 style: |2
17
18 ha-card {
19 background: transparent !important;
20 border: none !important;
21 box-shadow: none !important;
22 margin-top: 8px !important;
23 padding-bottom: 4px !important;
24 }
25 grid_options:
26 columns: 12
27 rows: auto
28 - type: custom:mushroom-template-card
29 entity: binary_sensor.pet_feeder_error
30 primary: '{% if is_state(''binary_sensor.pet_feeder_error'', ''on'') %}Störung{% else %}Alles in Ordnung{%
31 endif %}'
32 secondary: '{% if is_state(''binary_sensor.pet_feeder_error'', ''on'') %}Futter klemmt oder der Behälter
33 ist leer{% else %}Der Napf meldet keinen Fehler{% endif %}'
34 icon: '{% if is_state(''binary_sensor.pet_feeder_error'', ''on'') %}mdi:alert-circle{% else %}mdi:check-circle{%
35 endif %}'
36 icon_color: '{% if is_state(''binary_sensor.pet_feeder_error'', ''on'') %}#f0665b{% else %}#89c9ba{%
37 endif %}'
38 layout: horizontal
39 tap_action:
40 action: more-info
41 card_mod:
42 style: |2
43
44 ha-card {
45 background: var(--ha-card-background, #fff) !important;
46 border-radius: 14px !important;
47 border: none !important;
48 box-shadow: 0 1px 4px rgba(0,0,0,0.06) !important;
49 --card-primary-font-weight: 600;
50 --card-secondary-color: var(--secondary-text-color);
51 }
52 grid_options:
53 columns: 12
54 rows: auto
55 - type: tile
56 entity: switch.pet_feeder_child_lock
57 name: Kindersicherung
58 icon: mdi:lock
59 features_position: bottom
60 features:
61 - type: toggle
62 card_mod:
63 style: |2
64
65 ha-card {
66 background: var(--ha-card-background, #fff) !important;
67 border-radius: 14px !important;
68 border: none !important;
69 box-shadow: 0 1px 4px rgba(0,0,0,0.06) !important;
70 --tile-color: {% if is_state('switch.pet_feeder_child_lock', 'on') %}rgb(240,102,91){% else %}var(--state-inactive-color, #b9bfc9){% endif %} !important;
71 }
72 grid_options:
73 columns: 12
74 rows: auto
75 - type: tile
76 entity: switch.pet_feeder_led_indicator
77 name: LED-Nachtruhe 21 bis 9 Uhr
78 icon: mdi:weather-night
79 features_position: bottom
80 features:
81 - type: toggle
82 card_mod:
83 style: |2
84
85 ha-card {
86 background: var(--ha-card-background, #fff) !important;
87 border-radius: 14px !important;
88 border: none !important;
89 box-shadow: 0 1px 4px rgba(0,0,0,0.06) !important;
90 --tile-color: {% if is_state('switch.pet_feeder_led_indicator', 'on') %}rgb(137,201,186){% else %}var(--state-inactive-color, #b9bfc9){% endif %} !important;
91 }
92 grid_options:
93 columns: 12
94 rows: auto
95 - type: conditional
96 conditions:
97 - condition: state
98 entity: update.pet_feeder
99 state: 'on'
100 card:
101 type: tile
102 entity: update.pet_feeder
103 name: Firmware-Update
104 icon: mdi:chip
105 features_position: bottom
106 features:
107 - type: update-actions
108 backup: 'no'
109 card_mod:
110 style: |2
111
112 ha-card {
113 background: var(--ha-card-background, #fff) !important;
114 border-radius: 14px !important;
115 border: none !important;
116 box-shadow: 0 1px 4px rgba(0,0,0,0.06) !important;
117 --tile-color: rgb(240,102,91) !important;
118 }
119 grid_options:
120 columns: 12
121 rows: auto
122 - type: conditional
123 conditions:
124 - condition: state
125 entity: update.pet_feeder
126 state_not: 'on'
127 card:
128 type: tile
129 entity: update.pet_feeder
130 name: Firmware
131 icon: mdi:chip
132 card_mod:
133 style: |2
134
135 ha-card {
136 background: var(--ha-card-background, #fff) !important;
137 border-radius: 14px !important;
138 border: none !important;
139 box-shadow: 0 1px 4px rgba(0,0,0,0.06) !important;
140 --tile-color: rgb(137,201,186) !important;
141 }
142 grid_options:
143 columns: 12
144 rows: autoPraxistest: der Napf als Snackautomat
Bei mir läuft gerade weder ein Hund noch eine Katze herum, und auf dem Schreibtisch füttern wollte ich auch niemanden. Deshalb habe ich den Napf mit Snacks befüllt und als smarten Snackautomaten benutzt. Es passen zweieinhalb Beutel à 250 g hinein und danach noch mindestens die dreifache Menge. Der Deckel lässt sich arretieren, damit deine Tiere ihn nicht selbst öffnen. Die Schale ist aus Edelstahl, du kannst sie herausnehmen und in die Spülmaschine stellen.
Ein Druck auf die große Kachel gibt die Snacks aus. Mit zehn Portionen und 20 g pro Portion kam eine ganze Handvoll heraus, und das hörte erst nach einer Weile auf. Wie viel das tatsächlich ist, hängt stark vom Inhalt ab, solange er trocken ist, sollte aber alles funktionieren.
Tipps und Troubleshooting
Der Zeitplan wird nicht abgearbeitet. Betriebsart steht auf manual. Auf schedule stellen.
Die Gramm-Angaben stimmen nicht. portion_weight passt nicht zu deinem Futter. Zwanzig Portionen in eine Schüssel geben, wiegen, durch zwanzig teilen, Wert eintragen.
Template-Fehler beim Zeitplan. Der Sensor ist Python-Schreibweise, kein JSON. Immer replace("'", '"') | from_json.
Die Störungsmeldung bleibt stehen. Der Napf meldet den Fehler erst ab, wenn er wieder erfolgreich ausgegeben hat. Behälter prüfen, Futter lockern, eine Portion von Hand auslösen.
Der Napf fällt immer wieder aus dem Netz. Er ist netzbetrieben und damit selbst ein Router, steht aber oft in der Küche hinter Metall. sensor.pet_feeder_linkquality ansehen und im Zweifel eine Zigbee-Steckdose dazwischensetzen.
Kindersicherung nicht vergessen. Katzen lernen den Knopf am Gerät schneller, als einem lieb ist. switch.pet_feeder_child_lock einschalten, dann geht die Ausgabe nur noch über Home Assistant.
Die LED-Nachtruhe hat ein festes Fenster. 21 bis 9 Uhr, das ist in der Firmware verdrahtet und lässt sich nicht verschieben.
Was sich damit noch bauen lässt
- Eine Benachrichtigung aufs Handy, wenn bis 20 Uhr weniger als der Tagesbedarf ausgegeben wurde
- Eine Kamera, die beim Auslösen eine Aufnahme startet, damit man sieht, wer da frisst
- Ein Knopf an der Wand, der ein Leckerli ausgibt, ohne dass jemand das Handy sucht
Weiterführende Inhalte
- Prime Deal Days Tag 2: 10 Smart-Home-Deals unter 260 €: zehn neue Deals vom letzten Tag, von Kamera bis Soundbar
- Prime Day 2026: Die besten Smart-Home-Deals für Home Assistant: die Deals vom Juni, gegen die ich hier die Preise geprüft habe
- Aqara Power Plug H2 EU in Home Assistant einbinden: die Zwischenstecker aus der Deal-Liste im Detail
- Meross Steckdosen: Einrichtung und Home Assistant Integration: so bindest du die Matter-Steckdose ein
- X-Sense Link+Pro: Rauchmelder in Home Assistant: die Rauchmelder mit der HACS-Integration von Jarnsen
- Nuki Smart Lock in Home Assistant: Setup & Automationen: was du mit dem Nuki Go danach automatisieren kannst
Hast du schon einen Futterautomaten in Home Assistant eingebunden, und wofür würdest du die Türklingel brauchen? Schreib es mir gern in die Kommentare.
































