Статья

DIY контроллер на DIN-рейку JetHome JetHub E1

Приветствую, друзья! Те, кто давно читает мои статьи, возможно вспомнит одну из первых, посвященную самодельным устройствам на базе ESP8266. В то время у меня был целый цикл статей, посвященный ES8266, но сейчас речь идет о той, где я рассказывал про самоделку для автоматизации своего Гаража

Устройство включало в себя: 

  1. Реле - 4шт. для управления светом, вытяжкой и сиреной;
  2. Дискретные входы, для подключения датчика движения и геркона на ворота;
  3. Датчик температуры/влажности DHT22;
  4. Датчик температуры для улицы DS18B20.

С тех пор прошло очень много времени, накопилось достаточно много опыта, но переделывать устройство не было необходимости - все работало так, как задумывалось на тот момент. Единственное, чего очень хотелось - чтобы устройство работало не по протоколу Wi-Fi, а хотя бы через Ethernet. Можно было бы просто заменить плату на ESP32 с возможностью подключения по Ethernet, но, как говорится, "Работает - не лезь!".

И вот тут я случайно наткнулся на DIY контроллер на DIN-рейку JetHome JetHub E1, который, якобы, должен был полностью заменить мою самоделку. Давайте разбираться, так ли это.

Обзор

Взяв в руки контроллер JetHome JetHub E1, первое впечатление было - "да это же JetHome JetHub D1", но присмотревшись ближе я понял, что это не так. Это совершенно другой контроллер - как по архитектуре, так и по функционалу. 

JetHome JetHub E1 - DIY контроллер на базе вышеупомянутой ESP32 с Ethernet интерфейсом на борту. Для расширения количества пинов ESP32 используется расширитель портов PCF8574. Итак, давайте разберемся что умеет JetHome JetHub E1 и для кого он подойдет, а главное, сможет ли он заменить мою самоделку.

Технический характеристики

На сайте производителя в наличии 3 ревизии контроллера. Давайте сравним их между собой.

Периферийная платаPD76-R5 (v1)PD76-R5-DC (v2)PD76-R5-AC (v2)
ЧипсетESP32ESP32ESP32
Тип корпусаНа DIN рейкуНа DIN рейкуНа DIN рейку
RAM520 KB520 KB520 KB
ФлешSPI NOR 4MBSPI NOR 4MBSPI NOR 4MB
Тип питанияDC 9v~56v (клеммы)/Passive PoEDC 9v~56v (клеммы)/Passive PoEAC 220v (клеммы)
NetworkEthernet 10/100, Wi-Fi 2.4GhzEthernet 10/100, Wi-Fi 2.4GhzEthernet 10/100, Wi-Fi 2.4Ghz
Реле 16A555
Вход "сухой контакт"666
1-Wire-11

Как видим, контроллеры очень похожи, потому что они все собраны на базе одно и того же контроллера ESP32. Отличаются только способом питания и наличием пина для подключения 1-Wire. 

Для своих целей я решил использовать версию PD76-R5-AC (v2), чтоб не использовать внешний адаптер питания. Давайте ближе с ней познакомимся. 

Фото контроллера

Как я уже сказал, JetHome JetHub E1 очень похож на JetHome JetHub D1(+). Все потому, что он выполнен в том же корпусе и в единой стилистике девайсов компании. 

  • Габаритные размеры корпуса: 130 x 76 x 57 мм.
  • Ширина корпуса 76мм, что составляет около 4,3 модулей DIN.

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

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

Прошивка

На странице заказа контроллера можно выбрать предустановку программного обеспечения ESPHome. Я выбрал без ПО, решил сам разобраться во всем. Контроллер приехал, подключаем его через консольный кабель к ПК, в ESPhome, компилируем прошивку, сохраняем .bin файл и заливаем его в контроллер любым привычным для нас способом.   

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

Мой конфиг ESPhome

В дефолтном конфиге отключены web-интерфейс контроллера и MQTT брокер. Для своих нужд я все же включу их, дальше поймете для чего я это сделал.

yaml
Копировать
esphome: name: e1-pd76-r5-406aa8 # где "-406aa8" суфикс mac-адреса
platform: ESP32 board: nodemcu-32s #name_add_mac_suffix: true # This option adds MAC address to the end of the device name ## WARNING: Disable WiFi and captive_portal if Ethernet enabled #wifi: # ssid: "***" # password: "***" # # # Enable fallback hotspot (captive portal) in case wifi connection fails # ap: # ssid: "JetHub E1 Fallback Hotspot" # password: "***" # #captive_portal: # Enable Ethernet ethernet: type: LAN8720 mdc_pin: GPIO23 mdio_pin: GPIO18 clk_mode: GPIO17_OUT phy_addr: 1 # Enable logging logger: # Enable Home Assistant API api: # Enable OTA firmware update ota: # Веб сервер web_server: port: 80 #MQTT клиент mqtt: broker: 192.168.88.6 port: 1883 username: admin password: admin discovery: false # Enable I2C bus i2c: sda: 5 scl: 4 frequency: 400kHz scan: true id: i2c1 # Enable UART1 uart: - tx_pin: 33 rx_pin: 34 baud_rate: 115200 id: uart1 # Enable I2C GPIO expanders pcf8574: - id: cpu_gpio_exp address: 0x20 pcf8575: true - id: mb_gpio_exp address: 0x22 pcf8575: true # Enable digital outputs: LEDs and relays switch: - platform: gpio name: "LED Red" id: red_led pin: pcf8574: cpu_gpio_exp number: 0 mode: OUTPUT inverted: true - platform: gpio name: "LED Green" id: green_led pin: pcf8574: cpu_gpio_exp number: 1 mode: OUTPUT inverted: true - platform: gpio name: "Relay 1" id: relay_1 pin: pcf8574: mb_gpio_exp number: 8 mode: OUTPUT inverted: true - platform: gpio name: "Relay 2" id: relay_2 pin: pcf8574: mb_gpio_exp number: 9 mode: OUTPUT inverted: true - platform: gpio name: "Relay 3" id: relay_3 pin: pcf8574: mb_gpio_exp number: 10 mode: OUTPUT inverted: true - platform: gpio name: "Relay 4" id: relay_4 pin: pcf8574: mb_gpio_exp number: 11 mode: OUTPUT inverted: true - platform: gpio name: "Relay 5" id: relay_5 pin: pcf8574: mb_gpio_exp number: 12 mode: OUTPUT inverted: true #Кнопка перезапуска - platform: restart name: JetHub E1 Restart # Enable inputs: button and discrete inputs binary_sensor: - platform: gpio name: "FN button" pin: number: 0 inverted: true - platform: gpio name: "Input 1" pin: pcf8574: mb_gpio_exp number: 0 inverted: false - platform: gpio name: "Input 2" pin: pcf8574: mb_gpio_exp number: 1 inverted: false - platform: gpio name: "Input 3" pin: pcf8574: mb_gpio_exp number: 2 inverted: false - platform: gpio name: "Input 4" pin: pcf8574: mb_gpio_exp number: 3 inverted: false - platform: gpio name: "Input 5" pin: pcf8574: mb_gpio_exp number: 4 inverted: false - platform: gpio name: "Input 6" pin: pcf8574: mb_gpio_exp number: 5 inverted: false # Enable 1-Wire bus on external connector dallas: - pin: 16 ## Configure individual sensors sensor: - platform: dallas address: 0x0b3c01b556be2a28 name: "Temperature" #Время в онлайне - platform: uptime name: JetHub E1 Uptime #Версия прошивки text_sensor: - platform: version name: JetHub E1 FW version

После прошивки контроллер готов к использованию, и для пользователей Home Assistant на этом можно было бы все завершить. Через api ESPhome контроллер добавился в систему и добавил все необходимые сущности. 

Web-интерфейс ESPhome JetHub E1

Но мы же пойдем дальше и добавим контроллер JetHome JetHub E1 в Sprut.hub

JetHome Jetub E1 в Sprut.hub

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

json
Копировать
{
  "name": "JetHub E1",
  "manufacturer": "JetHome",
  "model": "e1-pd76-r5",
  "catalogId": 4181,
  "services": [
	{
	  "name": "Relay 1",
      "type": "Switch",
      "characteristics": [
        {
          "type": "On",
          "link": {
            "type": "String",
            "topicSearch": "(.*)/switch/relay_1/state",
            "topicGet": "(1)/switch/relay_1/state",
            "topicSet": "(1)/switch/relay_1/command",
            "map": {
              "false": "OFF",
              "true": "ON"
            }
          }
        }
      ]
    },  
	{
	  "name": "Relay 2",
      "type": "Switch",
      "characteristics": [
        {
          "type": "On",
          "link": {
            "type": "String",
            "topicGet": "(1)/switch/relay_2/state",
            "topicSet": "(1)/switch/relay_2/command",
            "map": {
              "false": "OFF",
              "true": "ON"
            }
          }
        }
      ]
    },
	{
	  "name": "Relay 3",
      "type": "Switch",
      "characteristics": [
        {
          "type": "On",
          "link": {
            "type": "String",
            "topicGet": "(1)/switch/relay_3/state",
            "topicSet": "(1)/switch/relay_3/command",
            "map": {
              "false": "OFF",
              "true": "ON"
            }
          }
        }
      ]
    },
	{
	  "name": "Relay 4",
      "type": "Switch",
      "characteristics": [
        {
          "type": "On",
          "link": {
            "type": "String",
            "topicGet": "(1)/switch/relay_4/state",
            "topicSet": "(1)/switch/relay_4/command",
            "map": {
              "false": "OFF",
              "true": "ON"
            }
          }
        }
      ]
    }, 
	{
	  "name": "Relay 5",
      "type": "Switch",
      "characteristics": [
        {
          "type": "On",
          "link": {
            "type": "String",
            "topicGet": "(1)/switch/relay_5/state",
            "topicSet": "(1)/switch/relay_5/command",
            "map": {
              "false": "OFF",
              "true": "ON"
            }
          }
        }
      ]
    }, 
	{
	  "name": "LED Red",
      "type": "Switch",
      "characteristics": [
        {
          "type": "On",
          "link": {
            "type": "String",
            "topicGet": "(1)/switch/led_red/state",
            "topicSet": "(1)/switch/led_red/command",
            "map": {
              "false": "OFF",
              "true": "ON"
            }
          }
        }
      ]
    },  	
	{
	  "name": "LED Green",
      "type": "Switch",
      "characteristics": [
        {
          "type": "On",
          "link": {
            "type": "String",
            "topicGet": "(1)/switch/led_green/state",
            "topicSet": "(1)/switch/led_green/command",
            "map": {
              "false": "OFF",
              "true": "ON"
            }
          }
        }
      ]
    },
    {
	  "name": "FN button",
	  "type": "ContactSensor",
	  "characteristics": [
	    {
		  "type": "ContactSensorState",
		  "link": {
		    "type": "String",
		    "topicGet": "(1)/binary_sensor/fn_button/state",
            "map": {
              "0": "OFF",
              "1": "ON"
            }
		  }
	    }
	  ]
    },
    {
	  "name": "Input 1",
	  "type": "ContactSensor",
	  "characteristics": [
	    {
		  "type": "ContactSensorState",
		  "link": {
		    "type": "String",
		    "topicGet": "(1)/binary_sensor/input_1/state",
            "map": {
              "0": "OFF",
              "1": "ON"
            }
		  }
	    }
	  ]
    },
    {
	  "name": "Input 2",
	  "type": "ContactSensor",
	  "characteristics": [
	    {
		  "type": "ContactSensorState",
		  "link": {
		    "type": "String",
		    "topicGet": "(1)/binary_sensor/input_2/state",
            "map": {
              "0": "OFF",
              "1": "ON"
            }
		  }
	    }
	  ]
    },
    {
	  "name": "Input 3",
	  "type": "ContactSensor",
	  "characteristics": [
	    {
		  "type": "ContactSensorState",
		  "link": {
		    "type": "String",
		    "topicGet": "(1)/binary_sensor/input_3/state",
            "map": {
              "0": "OFF",
              "1": "ON"
            }
		  }
	    }
	  ]
    },
    {
	  "name": "Input 4",
	  "type": "ContactSensor",
	  "characteristics": [
	    {
		  "type": "ContactSensorState",
		  "link": {
		    "type": "String",
		    "topicGet": "(1)/binary_sensor/input_4/state",
            "map": {
              "0": "OFF",
              "1": "ON"
            }
		  }
	    }
	  ]
    },
    {
	  "name": "Input 5",
	  "type": "ContactSensor",
	  "characteristics": [
	    {
		  "type": "ContactSensorState",
		  "link": {
		    "type": "String",
		    "topicGet": "(1)/binary_sensor/input_5/state",
            "map": {
              "0": "OFF",
              "1": "ON"
            }
		  }
	    }
	  ]
    },
    {
	  "name": "Input 6",
	  "type": "ContactSensor",
	  "characteristics": [
	    {
		  "type": "ContactSensorState",
		  "link": {
		    "type": "String",
		    "topicGet": "(1)/binary_sensor/input_6/state",
            "map": {
              "0": "OFF",
              "1": "ON"
            }
		  }
	    }
	  ]
    },
    {
      "type": "TemperatureSensor",
      "characteristics": [
        {
          "type": "CurrentTemperature",
          "link": {
            "type": "Float",
            "topicGet": "(1)/sensor/temperature/state"
          }
        }
      ]
    }
  ]
}

Как видим, контроллер с его полным функкционалом доступен в Sprut.hub

Альтернативное ПО (ESP_Easy и Tasmota)

Я решил пойти дальше, и захотел протестировать работоспособность ESP_Easy и Tasmota. Проблемы, с которыми столкнулся:

  • Как ESP_Easy, так и Tasmota из коробки не имеют в своем наборе поддерживаемой платы расширения портов PCF8574. 
  • Что касается интерфейса Ethernet, то он без каких-либо проблем работает в обеих вышеупомянутых системах. 

Для тех, кто сможет помочь скомпилировать прошивку ESP_Easy или Tasmota, добавив в нее поддержку PCF8574 (16-портовый расширитель), просьба написать либо в комментарии, либо в личку (TG: @red_ik), буду очень благодарен. 

Пины для подключени

Давайте еще раз детальнее рассмотрим, какими пинами оснащен контроллер. 

Верхняя часть

Сверху расположились 5 реле до 16А каждое.

  •  1 имеет состояние как НО, НЗ (перекидное).
  • 2-4 только НО.

Нижняя часть

  • Питание, в моем случае переменный ток 100 - 240В.;
  • Шина 1-Wire;
  • 6 дискретных входов;
  • Ethernet порт.

1-Wire

Контроллер имеет пины для подключения по шине 1-Wire, поэтому нет необходимости что-то изобретать. На примере датчика температуры DS18B20 я продемонстрирую, как это выглядит. В прошивке выше я уже указал подключение датчика, единственное отличие будет в его адресе, который вы должны указать свой. 

Также не могу не обратить внимание, что на одну шину можно подключить несколько датчиков DS18B20.

Отвечаю на вопросы

Для кого подойдет контроллер JetHome JetHub E1?

- Если вам необходим Wi-Fi или Ethernet контроллер на DIN-рейку, совместимый с любой платформой, которая поддерживает MQTT (например: Home Assistant, Sprut.hub, node-RED, HomeBridge ...), с возможностью коммутации до 5 реле, и до 6 дискретных выходов. Это то, что вам нужно. Бонусом получите несколько плюшек в виде интерфейса 1-Wire для подключения датчиков температуры DS18b20, 2х-цветный светодиод можно использовать для индикации событий и дополнительный дискретный вход в виде кнопки на передней панели FN. А также на выбор возможность питания контроллера как от постоянного напряжения 9-56В., так и от сети 220В. переменного тока. 

Получилось ли у меня заменить мою самоделку из далекого 2018 года на JetHome JetHub E1?

- Отвечаю: более чем. Еще осталось незадействованное 1 реле и 4 дискретных входа. Кстати дискретные входы можно использовать как датчики состояния закрытия ригилей замков, повесив на них герконы или концевики.

Чего не хватает? Недостатки контроллера

- К недостаткам контроллера можно отнести только 1. В контроллере очень не хватает пинов для подключения внешней переферии, например i2c, или обычного датчика температуры/влажности DHT11/22... Но в оправдание производителя я отвечу на этот вопрос. Причиной, по которой производитель не вывел пины - нехватка пинов ESP32. Поэтому это как бы и не совсем недостаток, а скорее техническая невозможность.

Для кого еще подойдет контроллер?

- Для любителей программировать самостоятельно на Arduino IDE. Мы имеет полноценное DIY устройство, а как это будет работать - зависит только от ваших фантазий. Можно использовать как автономную железку для автоматизации вытяжки или освещения, без наличия интернета. 

0

Вернуться назад
Вернуться назад