Обзор автоматической кормушки для животных Petoneer Nutri Smart Pet Feeder, а так же перепрошивка ESPHome и интеграция в Home Assistant.

Идея приобрести или сделать самому автоматический дозатор порций для питомцев у меня уже давно. Это и удобно для хозяев и необычно для гостей. В сети уже есть примеры самодельных «умных кормушек», например вот такой:

https://github.com/335iguy/diy-multisensor-cat-feeder

Так же у меня в закладках на GitHub есть еще парочка:

https://github.com/rubengargar/diy-cheap-cat-feeder
https://github.com/lance36/catFeeder

В плане стоимости и интересного времяпрепровождения, это, несомненно, самый лучший вариант. Особенно когда «оно» будет «живое» и будет кормить вашего кота. Как и в случае всего самодельного, интересен сам процесс)

У меня же стояла задача сделать так, чтобы все это красиво выглядело, включая спрятанную электронику с проводами. Я уже практически начал сборку своей кормушки, взяв идеи из приведенных выше ссылок, но обстоятельства поменялись. Ну а теперь я стал обладателем кормушки Nutri Smart Pet Feeder от Petoneer.


Ссылка на кормушку: https://aliexpress.ru/item/4000462651209.html


Упаковка, внешний вид и комплектация

Упаковка немного помялась, но все доехало в сохранности. На коробке уже расписаны характеристики кормушки и qr код приложения в AppStore и Google Play.

В комплектации кормушка, миска и блок питания на 5V 1A с micro usb кабелем длиной 120см

Корпус кормушки выполнен из матового пластика, отпечатки пальцев собирать не будет. Да и на ощупь пластик приятный. 

Размеры кормушки 230x246x352мм, вес 2кг.

С лицевой стороны расположены светодиоды индикации и две кнопки. Верхняя кнопка механическая, для открытия крышки. Нижняя кнопка запускает подачу порции.

Миска так же выполнена из пластика, что конечно же минус. Хотелось бы что-то более долговечное. Вставляется она довольно легко, нужно просто приподнять кормушку и вставить миску в паз.

С обратной стороны кормушки, помимо наклейки с названием, есть место для пауэрбанка. Спрятано оно за заглушкой.

Очень удобно. Питомец будет накормлен, даже если отключат электроэнергию.

Снизу расположен micro usb разъем для основного питания от сети, отверстия для динамика и зуммера. В нише можно спрятать излишек кабеля.

Внутри кормушки установлена емкость объемом 3,7 литра и датчики уровня корма. 

Датчик лазерный. Когда корм есть, луч прерывается. Если же корма нет — луч светит из одной точки и попадает в другую, датчик срабатывает.

Тот же принцип у второго датчика, расположенного под дозатором. Если луч прерывается во время выдачи порции, значит все хорошо. 

Первый запуск и основные функции

Теперь включим и попробуем все это в действии. Кормушку можно использовать и без приложения, но весь смысл в ней тогда теряется. Включаем в сеть и пробуем выдать порцию кнопкой на корпусе

При выдаче порции срабатывает звуковой сигнал. Мотор, крутящий лопасти, довольно тихий. Я всерьез был готов к более громкому звуку. Звуковой сигнал и то громче, чем мотор.

Теперь добавим кормушку в приложение. Так как у меня это первое устройство от Petoneer, то нужно зарегистрироваться. С этим никаких проблем не возникает.

Далее жмем +, выбираем Nutri и следуем инструкциям на экране

Называем устройство и можно управлять выдачей корма.

Приложение интуитивно понятное. Все хорошо переведено и ничего не лагает. Пользоваться приятно. Можно выдать корм кнопкой Покормить сейчас или же настроить расписания

Расписания настраиваются по времени и количеству порций. Максимальное количество — 12. Можно отметить нужные дни недели, но индивидуально дни настроить не получится. Например, в воскресенье сделать только 5 кормежек не выйдет. 

В настройках можно переименовать устройство, посмотреть версию прошивки, а так же включить или выключить кнопку кормления на кормушке и задать количество порций для нее.

Кошке сразу кормушка пришлась по душе. Читал, что некоторые животные поначалу побаиваются таких вот устройств. Моя же сразу полезла все разнюхивать. Особенно удивилась количеству корма в открытой кормушке)

И при нажатии кнопки Покормить сейчас тут же прибежала перекусить.

При успешной или неуспешной выдаче порции на телефон приходит уведомление. Так же приложение оповещает когда корм заканчивается или вообще закончился.

Теперь разберем кормушку и посмотрим что внутри. 

Разборка и перепрошивка ESPHome

Я начал разбирать кормушку с основной управляющей платы. Она находится прямо за кнопками и светодиодами индикации, с внутренней стороны. Откручиваем 5 винтов серой заглушки и вот она:

Откручиваем еще 4 винта, которые держат плату.

Сразу стало видно, что за wifi отвечает модуль TYWE3S на базе esp8266. Так же к плате подключен боковой сенсор уровня корма и его питание с противоположной стороны красно-черными проводами. Желтыми подключены провода, идущие на двигатель, еще один сенсор и питание в нижней части кормушки.

В процессе изучения платы я выяснил, что за логику отвечает MCU с маркировкой STM8S005K6T6C. Управление двигателем и индикация состояния — его работа. TYWE3S является лишь промежуточным звеном для контроля по wifi. 

Опытным путем я так же выяснил, что белый светодиод это gpio4 на модуле TYWE3S, отвечающий за индикацию соединения wifi, а на нажатие кнопки срабатывает gpio5

Разбираем дальше. В нижней части кормушки, под резиновыми противоскользящими подложками, находятся винты. Откручиваем их и разделяем верхнюю часть корпуса от нижней. 

Тут у нас находится плата питания и мотор, выдающий корм

Между лопастями находится еще один датчик. Скорее всего срабатывающий, если лопасти не были прокручены, то есть на застревание корма. 

В части корпуса, по которому высыпается корм, расположен датчик, который мониторит выдачу корма. Если в момент выдачи он срабатывает, то есть корм высыпается, значит все хорошо. Если же нет — будет ошибка выдачи корма.

Теперь о прошивке. Как я уже писал выше, за кнопку выдачи корма на модуле TYWE3S отвечает gpio5, за индикацию wifi отвечает gpio4. Я составил простой конфиг ESPHome и залил его, подпаявшись к нужным контактам esp8266

Конфиг для ESPHome следующий:

esphome:
  name: petoneer_nutri
  platform: ESP8266
  board: esp01_1m

wifi:
  ssid: "SSID"
  password: "password"

captive_portal:

logger:

api:
  password: "petoneer_nutri"

ota:
  password: "petoneer_nutri"

status_led:
  pin: 
    number: 4

switch:
  - platform: gpio
    pin: 
      number: 5
      inverted: true
    id: petoneer_nutri_feed_button

- platform: template name: "petoneer_nutri_feed" icon: "mdi:cat" turn_on_action: - switch.turn_on: petoneer_nutri_feed_button - delay: 150ms - switch.turn_off: petoneer_nutri_feed_button

Заливал прошивку через esptool командой:

python3 ./esptool.py --port /dev/ttyUSB0 --baud 115200 write_flash --flash_size 1MB --flash_mode dio 0x00000 petoneer_nutri.bin --erase-all

Указал настоящий размер в 1мб модуля TYWE3S, хотя esptool распознает 2мб. В процессе изучения платы у меня были из-за этого проблемы по восстановлению бэкапа родной прошивки.

С этим конфигом работает status_led, то есть индикация подключения wifi, и кнопка для выдачи корма. Пришлось прописать дополнительный template переключатель petoneer_nutri_feed, чтобы сымитировать кратковременное нажатие. 150 мс. вполне похоже на на физическое нажатие кнопки. У первого petoneer_nutri_feed_button я прописал только id без name , чтобы он не отображался в интерфейсе Home Assistant. 

На этом этапе мы можем управлять выдачей корма, но не знаем ничего о состоянии — выдан ли корм и есть ли он вообще. Можно было пойти путем мониторинга общения esp8266 и STM8S005K6T6C по UART, но я выбрал немного иной и более простой в реализации способ. Я подключил красный светодиод индикации к свободному gpio14 на esp8266. На фото ниже это синий провод.

binary_sensor:
  - platform: gpio
    pin: 
      number: 14
      inverted: true
    id: petoneer_nutri_feed_status

И начал имитировать возможные события, связанные с выдачей или отсутствием корма и отслеживать светодиод. Например, когда происходит выдача корма и емкость с ним полная, светодиод вообще не горит. Если корма меньше уровня, светодиод мигает с периодичностью около 1 секунды. Если же корм не проходит через нижний датчик во время выдачи, светодиод начнет мигать с периодичностью 2-3 секунды, точно не замерял. Или, если при мигании светодиода из-за низкого уровня корма, не сработал датчик в нижней части кормушки, светодиод загорится и будет светить.

Я создал текстовый датчик для того, чтобы ESPHome записывала все состояния в него.

text_sensor:
  - platform: template
    name: "petoneer_nutri_status"
    id: petoneer_nutri_status

В итоге, статус низкого уровня корма и ошибку в выдаче я повесил на on_click binary_sensor с разной периодичностью задержки. Так было проще всего. А вот с остальными статусами пришлось искать другие пути. Я создал скрипт, назвал его detection,  и задал в нем состояния при отключенном светодиоде и при работающем светодиоде. Задал период срабатывания для обоих состояний 5 сек. 

script:
  - id: detection
    then:
    - if:
        condition:
          for:
            time: 5s
            condition:
              binary_sensor.is_off: petoneer_nutri_feed_status
        then:
            - logger.log: "Статус OK"
            - text_sensor.template.publish:
                id: petoneer_nutri_status
                state: "OK"
    - if:
        condition:
          for:
            time: 5s
            condition:
              binary_sensor.is_on: petoneer_nutri_feed_status
        then:
            - logger.log: "Корм закончился, ошибка"
            - text_sensor.template.publish:
                id: petoneer_nutri_status
                state: "Корм закончился, ошибка"

Если светодиод выключен 5 сек, статус текстового датчика становится OK. Если горит 5 сек, соответственно корма нет. Я не помню что именно произошло во время отслеживания светодиода, но я так же указал для статуса об отсутствии корма еще и ошибку

Дальше я повесил выполнение этого скрипта на interval для выполнения с заданной периодичностью.

interval:
  - interval: 5s
    then:
      - script.execute: detection

Но из-за этого лог ESPHome был переполнен, и я прописал выполнение скрипта при любом изменении binary_sensor красного светодиода.

binary_sensor:
#------------------
    on_state:
      then:
        - delay: 5s
        - script.execute: detection  

И при загрузке прошивки, чтобы знать статус только что запущенного устройства.

esphome:
#------------------
  on_boot:
    priority: -10
    then:
      - script.execute: detection 

Чтобы при выдаче корма (нажатии switch.petoneer_nutri_feed_button) статус успешного или неуспешного кормления показывал верное состояние, повесил на него при on_turn_on еще один кусок автоматизации:

    on_turn_on:
      then:
      - delay: 5s
      - if:
          condition:
            for:
              time: 5s
              condition:
                binary_sensor.is_off: petoneer_nutri_feed_status
          then:
              - logger.log: "Успешное кормление"
              - text_sensor.template.publish:
                  id: petoneer_nutri_status
                  state: "Успешное кормление"

      - delay: 10s
      - if:
          condition:
              - text_sensor.state:
                  id: petoneer_nutri_status
                  state: "Низкий уровень корма"
          then:
            - logger.log: "Успешное кормление при низком уровне корма"
            - text_sensor.template.publish:
                id: petoneer_nutri_status
                state: "Успешное кормление"

Хотел сделать так, чтобы при ручном нажатии кнопки выдачи корма успешный статус так же обновлялся. Сделал еще один binary_sensor на тот же пин, что и switch — gpio5, и повесить такую же автоматизацию на него, только при on_release, так как выдача происходит в момент отпускания кнопки. Статус отрабатывался, но теперь только при ручном нажатии кнопки. Switch перестал работать из Home Assistant. Удалил этот binary_sensor из кода.

Дальше я решил настроить управление зуммером. Он срабатывал каждый раз при выдаче корма, а так как у меня дома маленький ребенок, то это не очень полезная опция. Конечно же хорошо, что каждая кормежка сопровождается звуковой индикацией, но будет полезным настроить ручное управление. И возможность создания автоматизаций в Home Assistant, например выключать звук вечером. Для этого я задействовал еще один свободный пин на TYWE3S — gpio16. И вот такой релейный модуль, который у меня лежал без дела:

Он идеально подошел по размеру в одно из многочисленных свободных мест в этой части кормушки. В разрыв реле я пустил плюсовой контакт зуммера. Для этого выпаял его, отогнул плюсовую ногу в бок и припаял к нему провод. И припаял на место только оставшуюся, а выход с реле припаял в первоначальный контакт.

Землю для релейного модуля взял с платы питания, а 3.3в и провод на gpio16 потянул к TYWE3S. 

Все это без проблем закрывается заглушкой. Места более чем предостаточно.

Итоговый конфиг для ESPHome выглядит следующим образом:

esphome:
  name: petoneer_nutri
  platform: ESP8266
  board: esp01_1m
  on_boot:
    priority: -10
    then:
      - script.execute: detection 

wifi:
  networks:
  -  ssid: "ssid"
     password: "password"

captive_portal:

logger:

api:
  password: "petoneer_nutri"

ota:
  password: "petoneer_nutri"

status_led:
  pin: 
    number: 4

# Пин выдачи корма
switch:
  - platform: gpio
    pin: 
      number: 5
      inverted: true
    id: petoneer_nutri_feed_button
# При срабатывании ждем 5 сек, и если в течение 5 секунд gpio14 в выкл. состоянии, то ставим статус "Успешное кормление"
    on_turn_on:
      then:
      - delay: 5s
      - if:
          condition:
            for:
              time: 5s
              condition:
                binary_sensor.is_off: petoneer_nutri_feed_status
          then:
              - logger.log: "Успешное кормление"
              - text_sensor.template.publish:
                  id: petoneer_nutri_status
                  state: "Успешное кормление"
# Ждем 10 сек, и если статус "Низкий уровень корма" обновляем статус на "Успешное кормление"
      - delay: 10s
      - if:
          condition:
              - text_sensor.state:
                  id: petoneer_nutri_status
                  state: "Низкий уровень корма"
          then:
            - logger.log: "Успешное кормление при низком уровне корма"
            - text_sensor.template.publish:
                id: petoneer_nutri_status
                state: "Успешное кормление"

# UI кнопка выдачи корма, включает пин gpio5 на 150мс и затем выключает
  - platform: template
    name: "petoneer_nutri_feed"
    icon: "mdi:cat"
    turn_on_action:
    - switch.turn_on: petoneer_nutri_feed_button
    - delay: 150ms
    - switch.turn_off: petoneer_nutri_feed_button

# Реле зуммера
  - platform: gpio
    pin: 
      number: 16
      inverted: true
    id: petoneer_nutri_buzzer
    name: petoneer_nutri_buzzer
    icon: "mdi:volume-high"

binary_sensor:
# Отслеживание светодиода индикации для статуса
  - platform: gpio
    pin: 
      number: 14
      inverted: true
    id: petoneer_nutri_feed_status
# При срабатывании в диапазоне 990-1100мс статус "Низкий уровень корма"
    on_click:
    - min_length: 990ms
      max_length: 1100ms
      then:
        - if:
            condition:
              not:
                 - text_sensor.state:
                     id: petoneer_nutri_status
                     state: "Низкий уровень корма"
  
            then:
              - logger.log: "Низкий уровень корма"
              - text_sensor.template.publish:
                  id: petoneer_nutri_status
                  state: "Низкий уровень корма"
# При срабатывании в диапазоне 1400-3100мс статус "Ошибка выдачи корма"
    - min_length: 1400ms
      max_length: 3100ms
      then:
        - logger.log: "Ошибка выдачи корма"
        - text_sensor.template.publish:
            id: petoneer_nutri_status
            state: "Ошибка выдачи корма"
# Выполнение скрипта detection для отслеживания статуса
    on_state:
      then:
        - delay: 5s
        - script.execute: detection    

# Текстовый датчик статуса для UI HA
text_sensor:
  - platform: template
    name: "petoneer_nutri_status"
    icon: "mdi:information-outline"
    id: petoneer_nutri_status

# Скрипт отслеживания статуса на основании gpio14
script:
  - id: detection
    then:
    - if:
        condition:
          for:
            time: 5s
            condition:
              binary_sensor.is_off: petoneer_nutri_feed_status
        then:
            - logger.log: "Статус OK"
            - text_sensor.template.publish:
                id: petoneer_nutri_status
                state: "OK"
    - if:
        condition:
          for:
            time: 5s
            condition:
              binary_sensor.is_on: petoneer_nutri_feed_status
        then:
            - logger.log: "Корм закончился, ошибка"
            - text_sensor.template.publish:
                id: petoneer_nutri_status
                state: "Корм закончился, ошибка"

Уверен, что можно сделать автоматизации в конфиге более элегантно, буду рад услышать советы на этот счет.

Пример управления кормушкой из интерфейса Home Assistant:

Средствами автоматизаций Home Assistant можно настроить выдачу корма по расписанию и отправку только нужных уведомлений.

Заключение

Кормушка очень интересная, как в плане функционала из коробки с родным облачным приложением, так и в плане доработки. Места очень много, встроить можно любые датчики. Двигатель работает тихо, пластик приятный на ощупь, да и выглядит кормушка отлично. Место для пауэрбанка тоже большой плюс. Уникальная работа светодиода индикации позволила отслеживать его для интеграции с альтернативной прошивкой для локального управления. И самое главное — животные довольны, и выпрашивать еду будут уже у вот этого белого контейнера 🙂

5 2 votes
Article Rating

Подписаться
Уведомление о
guest

Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.

2 Комментарий
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
alexintras
alexintras
22 дней назад

На мой взгляд, все «автокормилки» достаточно сомнительная штука. К ней в комплекте тогда нужна бы ещё «автоубиралка» лотка…
Хотя может оно и лучше что пусть всё загадит, но хоть голодным не будет! ))
Но нет никакого сомнения, что Ваш скилл в ESPHome и «потрошении» разных девайсов на предмет их совершенствования выше всяких похвал!