Zum Inhalt springen
Alles Automatisch

Angebote

Prime Deal Days 2026: Smart-Home-Deals für Home Assistant

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):

ProduktCodeRabattGültig
Aqara Pet Feeder C1PETC1DEAL55 %6. und 7. Oktober 2026
Aqara Temperatur- und Feuchtigkeitssensor, 3er-SetTHSENSOR55 %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:

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 HardwareAqara-Hub nötigdein vorhandener Zigbee-Coordinator
Konto und AppAqara-Konto und Aqara Homenichts davon
Wo die Befehle langlaufenüber Aqara-Servernur im eigenen Netz
Funktioniert bei Internetausfalleingeschränktvollständig
Zeitplanin der Aqara-Appim eigenen Dashboard, siehe unten
Einrichtunggeführt, sehr schnelleinmal 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 als PETC1-M01 gelistet.
  • Aus HACS: Mushroom, Bubble Card, card-mod und Expander Card. Ohne die vier lädt das Dashboard unten nicht.

Schritt 1: Den Napf koppeln

  1. Im Zigbee2MQTT-Frontend oben rechts auf Kopplung erlauben klicken.
  2. Am Napf die Reset-Taste fünf Sekunden halten, bis die LED schnell blinkt.
  3. 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:

  1. In Zigbee2MQTT die Kopplung noch nicht freigeben
  2. Den Napf am Netzteil betreiben, eingelegte Batterien herausnehmen
  3. Netzteil abziehen
  4. Die Reset-Taste im stromlosen Zustand etwa zehn Sekunden halten, dann loslassen
  5. Die Taste erneut drücken und gedrückt halten
  6. Mit gedrückter Taste das Netzteil wieder einstecken
  7. Die Taste während des gesamten Bootvorgangs weiter halten
  8. Warten, bis die LED blinkt und die Pieptöne kommen
  9. Jetzt erst in Zigbee2MQTT die Kopplung freigeben
  10. 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 stehtWas das heißt
gar nichts zum FeederEr funkt nicht bis zum Coordinator. Näher heran, Stufe 4
ein Beitritt, danach ein abgebrochenes InterviewEr kommt an, der Coordinator fragt ihn nur nicht fertig aus. Taste antippen, damit er wach bleibt
ein Beitritt und ein sauberes InterviewFertig, 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ätWas sie tut
select.pet_feeder_feedAuf START gesetzt gibt der Napf sofort aus. Schreibend, kein Zustand
select.pet_feeder_modeschedule oder manual
number.pet_feeder_serving_sizePortionen pro Ausgabe, 1 bis 10
number.pet_feeder_portion_weightGramm pro Portion, 1 bis 20
sensor.pet_feeder_scheduleDer Zeitplan, wie er im Napf steht
sensor.pet_feeder_feeding_sourceschedule, manual oder remote
sensor.pet_feeder_feeding_sizePortionen der letzten Ausgabe
sensor.pet_feeder_portions_per_dayPortionen heute
sensor.pet_feeder_weight_per_dayGramm heute
binary_sensor.pet_feeder_errorFutter klemmt oder der Behälter ist leer
switch.pet_feeder_child_lockSperrt die Taste am Gerät
switch.pet_feeder_led_indicatorSchaltet die LED von 21 bis 9 Uhr ab
sensor.pet_feeder_linkqualityFunkqualität
update.pet_feederFirmware ü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.

yaml
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-week

Die 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.

yaml
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.

yaml
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: restart

Der 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
yaml
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.

yaml
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: auto
Abschnitt 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.

yaml
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: auto
Abschnitt 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.

yaml
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: auto
Abschnitt 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.

yaml
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: auto

Praxistest: 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

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.

Die Smart-Home-Deals aus dem Video

13 Angebote, die ich im Video zeige.

  • Aqara Pet Feeder C1
    HaustiereAqara

    Aqara Pet Feeder C1

    Futterautomat mit Zigbee, im Video per Zigbee2MQTT in Home Assistant eingebunden.

    89,98 €Gab es schon für 83,49 €
    Zum Deal
  • Aqara Temperatur- und Feuchtigkeitssensor, 3er-Set
    Neues Tief
    SensorenAqara

    Aqara Temperatur- und Feuchtigkeitssensor, 3er-Set

    Drei Zigbee-Sensoren für Temperatur und Luftfeuchte. Schon ohne Code unter dem bisherigen Tief, mit Code rund 3 € darunter.

    42,99 €1,01 € unter dem bisherigen Tief von 44 €
    Zum Deal
  • Aqara Alarmanlage Y100 Kit
    Neues Tief
    SicherheitAqara

    Aqara Alarmanlage Y100 Kit

    Kamera-Hub G3 plus drei Sensoren für Bewegung, Tür und Vibration. Der stärkste Deal des Events, 29 € unter dem Preis vom Prime Day im Juni.

    89,99 €29,00 € unter dem bisherigen Tief von 118,99 €
    Zum Deal
  • Aqara Video-Türklingel G410
    Tiefstpreis
    KamerasAqara

    Aqara Video-Türklingel G410

    Video-Türklingel mit eingebautem Matter-Hub, so günstig wie am Prime Day im Juni. Dieselbe Klingel verlose ich im Video.

    99,99 €Auf dem Tiefstpreis der letzten Monate
    Zum Deal
  • X-Sense Rauch- und CO-Melder
    Tiefstpreis
    SicherheitX-Sense

    X-Sense Rauch- und CO-Melder

    WLAN-Kombimelder für Rauch und Kohlenmonoxid, ohne Basisstation. In Home Assistant über die HACS-Integration von Jarnsen.

    58,42 €Auf dem Tiefstpreis der letzten Monate
    Zum Deal

    12 % mit meinem Codeim X-Sense-Shop, bis 30.11.2026

  • SONOFF Zigbee Dongle-E
    Zigbee & ThreadSONOFF

    SONOFF Zigbee Dongle-E

    Günstiger USB-Stick als Zigbee-Coordinator für ZHA oder Zigbee2MQTT.

    17,86 €
    Zum Deal
  • Shelly 1 Gen4, 5er-Pack
    Neues Tief
    AktorenShelly

    Shelly 1 Gen4, 5er-Pack

    Fünf Relais für hinter den Schalter, 11,47 € pro Stück. Shelly läuft lokal in Home Assistant.

    57,37 €6,17 € unter dem bisherigen Tief von 63,54 €
    Zum Deal
  • FRITZ!Smart Thermo 302
    Neues Tief
    ThermostateAVM

    FRITZ!Smart Thermo 302

    Heizkörperthermostat für die FRITZ!Box, in Home Assistant über die Integration FRITZ!SmartHome.

    44,99 €2,01 € unter dem bisherigen Tief von 47 €
    Zum Deal
  • Eve Thermo (5. Generation)
    ThermostateEve

    Eve Thermo (5. Generation)

    Matter-Thermostat über Thread, rund 16 € unter seinem üblichen Preis. Ein einziges Mal gab es ihn noch günstiger.

    59,14 €Gab es schon für 57 €
    Zum Deal
  • meross Matter Steckdose
    Steckdosenmeross

    meross Matter Steckdose

    Smarte Steckdose mit Matter und Verbrauchsmessung.

    42,49 €
    Zum Deal

    10 % mit meinem Codeim Meross-Shop

  • Nuki Smart Lock Go
    Tiefstpreis
    Smart LocksNuki

    Nuki Smart Lock Go

    Das günstige Nuki zum Nachrüsten, wieder auf dem Preis vom Prime Day im Juni.

    109 €Auf dem Tiefstpreis der letzten Monate
    Zum Deal
  • SwitchBot E-Ink Dashboard
    DisplaysSwitchBot

    SwitchBot E-Ink Dashboard

    E-Ink-Wetterstation mit Außensensor für die Wand.

    114,99 €Gab es schon für 109,99 €
    Zum Deal
  • Roborock Qrevo S Pro Set
    Tiefstpreis
    SaugroboterRoborock

    Roborock Qrevo S Pro Set

    Saug- und Wischroboter mit Station, so günstig wie am Prime Day im Juni. Roborock hat eine eigene Home-Assistant-Integration.

    399,99 €Auf dem Tiefstpreis der letzten Monate
    Zum Deal

Alle geprüften Smart-Home-Deals

Durchsuchen, nach Kategorie oder Marke filtern und nach Preis oder Ersparnis sortieren.

32 Deals

  • Aqara Pet Feeder C1
    HaustiereAqara

    Aqara Pet Feeder C1

    Futterautomat mit Zigbee, im Video per Zigbee2MQTT in Home Assistant eingebunden.

    Im Video
    89,98 €Gab es schon für 83,49 €
  • Aqara Temperatur- und Feuchtigkeitssensor, 3er-Set
    SensorenAqara

    Aqara Temperatur- und Feuchtigkeitssensor, 3er-Set

    Drei Zigbee-Sensoren für Temperatur und Luftfeuchte. Schon ohne Code unter dem bisherigen Tief, mit Code rund 3 € darunter.

    Im Video
    42,99 €1,01 € unter dem bisherigen Tief von 44 €
    Neues Tief
  • Aqara Alarmanlage Y100 Kit
    SicherheitAqara

    Aqara Alarmanlage Y100 Kit

    Kamera-Hub G3 plus drei Sensoren für Bewegung, Tür und Vibration. Der stärkste Deal des Events, 29 € unter dem Preis vom Prime Day im Juni.

    Im Video
    89,99 €29,00 € unter dem bisherigen Tief von 118,99 €
    Neues Tief
  • Aqara Video-Türklingel G410
    KamerasAqara

    Aqara Video-Türklingel G410

    Video-Türklingel mit eingebautem Matter-Hub, so günstig wie am Prime Day im Juni. Dieselbe Klingel verlose ich im Video.

    Im Video
    99,99 €Auf dem Tiefstpreis der letzten Monate
    Tiefstpreis
  • X-Sense Rauch- und CO-Melder
    SicherheitX-Sense

    X-Sense Rauch- und CO-Melder

    WLAN-Kombimelder für Rauch und Kohlenmonoxid, ohne Basisstation. In Home Assistant über die HACS-Integration von Jarnsen.

    Im Video
    58,42 €Auf dem Tiefstpreis der letzten Monate
    Tiefstpreis

    12 % mit meinem Codeim X-Sense-Shop, bis 30.11.2026

  • SONOFF Zigbee Dongle-E
    Zigbee & ThreadSONOFF

    SONOFF Zigbee Dongle-E

    Günstiger USB-Stick als Zigbee-Coordinator für ZHA oder Zigbee2MQTT.

    Im Video
    17,86 €
  • Shelly 1 Gen4, 5er-Pack
    AktorenShelly

    Shelly 1 Gen4, 5er-Pack

    Fünf Relais für hinter den Schalter, 11,47 € pro Stück. Shelly läuft lokal in Home Assistant.

    Im Video
    57,37 €6,17 € unter dem bisherigen Tief von 63,54 €
    Neues Tief
  • FRITZ!Smart Thermo 302
    ThermostateAVM

    FRITZ!Smart Thermo 302

    Heizkörperthermostat für die FRITZ!Box, in Home Assistant über die Integration FRITZ!SmartHome.

    Im Video
    44,99 €2,01 € unter dem bisherigen Tief von 47 €
    Neues Tief
  • Eve Thermo (5. Generation)
    ThermostateEve

    Eve Thermo (5. Generation)

    Matter-Thermostat über Thread, rund 16 € unter seinem üblichen Preis. Ein einziges Mal gab es ihn noch günstiger.

    Im Video
    59,14 €Gab es schon für 57 €
  • meross Matter Steckdose
    Steckdosenmeross

    meross Matter Steckdose

    Smarte Steckdose mit Matter und Verbrauchsmessung.

    Im Video
    42,49 €

    10 % mit meinem Codeim Meross-Shop

  • Nuki Smart Lock Go
    Smart LocksNuki

    Nuki Smart Lock Go

    Das günstige Nuki zum Nachrüsten, wieder auf dem Preis vom Prime Day im Juni.

    Im Video
    109 €Auf dem Tiefstpreis der letzten Monate
    Tiefstpreis
  • SwitchBot E-Ink Dashboard
    DisplaysSwitchBot

    SwitchBot E-Ink Dashboard

    E-Ink-Wetterstation mit Außensensor für die Wand.

    Im Video
    114,99 €Gab es schon für 109,99 €
  • Roborock Qrevo S Pro Set
    SaugroboterRoborock

    Roborock Qrevo S Pro Set

    Saug- und Wischroboter mit Station, so günstig wie am Prime Day im Juni. Roborock hat eine eigene Home-Assistant-Integration.

    Im Video
    399,99 €Auf dem Tiefstpreis der letzten Monate
    Tiefstpreis
  • Aqara Kamera G5 Pro
    KamerasAqara

    Aqara Kamera G5 Pro

    Außenkamera mit 4 MP und Farb-Nachtsicht.

    139,99 €
  • Aqara Präsenzsensor FP400
    SensorenAqara

    Aqara Präsenzsensor FP400

    Präsenzsensor mit mehreren Zonen, über Thread oder Zigbee.

    66,99 €
  • Aqara Präsenzsensor FP300
    SensorenAqara

    Aqara Präsenzsensor FP300

    Präsenzsensor über Thread oder Zigbee, so günstig wie am Prime Day im Juni.

    39,99 €Auf dem Tiefstpreis der letzten Monate
    Tiefstpreis
  • Aqara Heizkörperthermostat W600
    ThermostateAqara

    Aqara Heizkörperthermostat W600

    Heizkörperthermostat mit Matter, über Thread oder Zigbee.

    39,99 €
  • Aqara Bewegungsmelder P1, 2er-Pack
    SensorenAqara

    Aqara Bewegungsmelder P1, 2er-Pack

    Zwei Zigbee-Bewegungsmelder mit Lichtsensor.

    29,99 €
  • Aqara Lichtschalter H2
    AktorenAqara

    Aqara Lichtschalter H2

    Smarter Lichtschalter, so günstig wie am Prime Day im Juni.

    33,59 €Auf dem Tiefstpreis der letzten Monate
    Tiefstpreis
  • Aqara Power Plug H2
    SteckdosenAqara

    Aqara Power Plug H2

    Zwischenstecker mit Matter, über Thread oder Zigbee.

    26,59 €
  • SONOFF Zigbee Dongle Plus
    Zigbee & ThreadSONOFF

    SONOFF Zigbee Dongle Plus

    USB-Stick als Zigbee-Coordinator, neues Tief.

    19,49 €0,81 € unter dem bisherigen Tief von 20,30 €
    Neues Tief
  • SONOFF Dongle Max (PoE)
    Zigbee & ThreadSONOFF

    SONOFF Dongle Max (PoE)

    Coordinator mit LAN und PoE, für den Platz mitten im Haus statt am Server.

    32,13 €
  • SONOFF ZBMINIR2
    AktorenSONOFF

    SONOFF ZBMINIR2

    Kleines Zigbee-Relais für hinter den Schalter.

    8,15 €
  • SONOFF MINI-ZB1GSP
    AktorenSONOFF

    SONOFF MINI-ZB1GSP

    Zigbee-Relais mit Verbrauchsmessung.

    16,07 €
  • Shelly 3EM-63W Gen3
    EnergieShelly

    Shelly 3EM-63W Gen3

    Dreiphasiger Energiemesser für den Verteiler.

    56,99 €
  • FRITZ!Smart Control 350
    SensorenAVM

    FRITZ!Smart Control 350

    Tür- und Fensterkontakt für die FRITZ!Box.

    27,49 €
  • SwitchBot Lock Ultra mit Keypad Touch
    Smart LocksSwitchBot

    SwitchBot Lock Ultra mit Keypad Touch

    Smart Lock mit Fingerabdruck-Keypad, neues Tief.

    165,99 €4,00 € unter dem bisherigen Tief von 169,99 €
    Neues Tief
  • SwitchBot Meter Pro CO2
    SensorenSwitchBot

    SwitchBot Meter Pro CO2

    CO2-Messgerät mit Display, gerade auf seinem bisherigen Tief.

    47,99 €Auf dem Tiefstpreis der letzten Monate
    Tiefstpreis
  • Eve Energy
    SteckdosenEve

    Eve Energy

    Matter-Zwischenstecker mit Verbrauchsmessung, neues Tief.

    28,72 €1,27 € unter dem bisherigen Tief von 29,99 €
    Neues Tief
  • Eve Door & Window
    SensorenEve

    Eve Door & Window

    Tür- und Fensterkontakt mit Matter. Im Juni gab es ihn etwas günstiger.

    31,58 €Gab es schon für 30,39 €
  • Dreame X50 Ultra Complete
    SaugroboterDreame

    Dreame X50 Ultra Complete

    Saug- und Wischroboter der Oberklasse, neues Tief.

    685,09 €12,91 € unter dem bisherigen Tief von 698 €
    Neues Tief

* Affiliate-Links. Kaufst du darüber etwas, unterstützt du den Kanal. Der Preis bleibt für dich gleich. Preise können sich jederzeit ändern.

Weitere Deal-Videos

Diskussion im Forum

Hast du Fragen oder Ideen zu diesem Thema?

Diskutiere im Forum

Video teilen

Community

Unterstütze den Kanal

Hat dir der Beitrag geholfen? Es gibt zwei Wege, etwas zurückzugeben.