Skip to content

Instantly share code, notes, and snippets.

@smirnowegor
Last active December 12, 2025 04:37
Show Gist options
  • Select an option

  • Save smirnowegor/3c07f8b74fe4fd7b76629aaced790484 to your computer and use it in GitHub Desktop.

Select an option

Save smirnowegor/3c07f8b74fe4fd7b76629aaced790484 to your computer and use it in GitHub Desktop.
Neptun for Esphome for Home Assistant ( Modbus RTU)
esphome:
name: main-controller
friendly_name: Main controller
esp32:
board: esp32dev
framework:
type: arduino
# Enable logging
logger:
level: DEBUG
# Enable Home Assistant API
api:
encryption:
key: "1J746fTvtBqR2NDS5ARLa8wPfrLH7I5PWThuzNUыыыmQ1M="
ota:
- platform: esphome
password: "PASS"
# wifi:
# Если Wi-Fi не используется, закомментируйте ssid и password
# ssid: !secret wifi_ssid
# password: !secret wifi_password
# Enable fallback hotspot (captive portal) in case wifi connection fails
# ap:
# ssid: "Main-Controller Fallback Hotspot"
# password: "PASS"
ethernet:
type: LAN8720
mdc_pin: GPIO23
mdio_pin: GPIO18
clk:
pin: GPIO17
mode: CLK_OUT # или CLK_EXT_IN — зависит от твоей схемы
phy_addr: 0
manual_ip:
static_ip: 192.168.1.199
gateway: 192.168.1.1
subnet: 255.255.255.0
# ВЫШЕ ваша конфигурация esp платы, ниже можно копировать и вставлять к себе. Внимание! Используется стандартный адрес Neptun который 240б если другой то нужно поменять.
captive_portal:
uart:
id: uart_modbus
tx_pin: GPIO33
rx_pin: GPIO32
baud_rate: 9600
data_bits: 8
stop_bits: 1
parity: NONE
modbus:
id: modbus_neptun
uart_id: uart_modbus
modbus_controller:
- id: neptun_device
# Адрес модуля по умолчанию 240 (0xF0) согласно регистру 0005
address: 240
modbus_id: modbus_neptun
setup_priority: -10
update_interval: 15s # Опрос раз в 15 секунд для теста
switch:
# РАБОЧИЙ ВАРИАНТ Управление кранами Группы 1 (Бит 8 регистра 0)
- platform: modbus_controller
modbus_controller_id: neptun_device
name: "Neptun Valve Group 1"
id: valve_group_1
address: 0 # Адрес регистра 0000
register_type: holding
bitmask: 0x100 # Маска для 8-го бита (0x100)
icon: "mdi:pipe-valve"
# Управление кранами Группы 2 Группа 2 не подключена (Бит 9 регистра 0)
- platform: modbus_controller
modbus_controller_id: neptun_device
name: "Neptun Valve Group 2"
id: valve_group_2
address: 0 # Адрес регистра 0000
register_type: holding
bitmask: 0x200 # Маска для 9-го бита (0x200)
icon: "mdi:pipe-valve"
# --- СИСТЕМНЫЕ НАСТРОЙКИ (Регистр 0) ---
# Включение группирования (Регистр 0, бит 10 / А)
# 0 - одна группа (все краны работают синхронно)
# 1 - две группы (краны управляются раздельно)
- platform: modbus_controller
modbus_controller_id: neptun_device
name: "Neptun Two Groups Mode"
address: 0
register_type: holding
bitmask: 0x400 # Бит 10 (шестнадцатеричное A)
entity_category: config
icon: "mdi:checkbox-multiple-marked"
# Закрывание кранов при потере беспроводного датчика (Регистр 0, бит 11 / B)
# 0 - выключено, 1 - включено
- platform: modbus_controller
modbus_controller_id: neptun_device
name: "Neptun Close on Sensor Lost"
address: 0
register_type: holding
bitmask: 0x800 # Бит 11 (шестнадцатеричное B)
entity_category: config
icon: "mdi:shield-alert"
# Режим "Мойка пола" (Регистр 0, бит 0)
# При включении игнорирует протечки в течение 45 минут (обычно)
- platform: modbus_controller
modbus_controller_id: neptun_device
name: "Neptun Floor Cleaning Mode"
address: 0
register_type: holding
bitmask: 0x01
icon: "mdi:cleaning-services"
# Блокировка клавиатуры (Регистр 0, бит 12)
- platform: modbus_controller
modbus_controller_id: neptun_device
name: "Neptun Keypad Lock"
address: 0
register_type: holding
bitmask: 0x1000 # 12-й бит (2^12 = 4096 = 0x1000)
icon: "mdi:lock"
binary_sensor:
# --- ГРУППА 1 ---
# Тревога протечки по Группе 1 (Регистр 0, бит 1)
- platform: modbus_controller
modbus_controller_id: neptun_device
name: "Neptun Alarm Group 1"
id: neptun_alarm_g1
register_type: holding
address: 0
bitmask: 0x02 # Бит 1
device_class: moisture
# Статус кранов Группы 1 (Регистр 0, бит 8: 0-закрыто, 1-открыто)
- platform: modbus_controller
modbus_controller_id: neptun_device
name: "Neptun Valve Status Group 1"
id: neptun_valve_status_g1
register_type: holding
address: 0
bitmask: 0x100 # Бит 8
device_class: opening
# --- ГРУППА 2 ---
# Тревога протечки по Группе 2 (Регистр 0, бит 2)
- platform: modbus_controller
modbus_controller_id: neptun_device
name: "Neptun Alarm Group 2"
id: neptun_alarm_g2
register_type: holding
address: 0
bitmask: 0x04 # Бит 2
device_class: moisture
# Статус кранов Группы 2 (Регистр 0, бит 9)
- platform: modbus_controller
modbus_controller_id: neptun_device
name: "Neptun Valve Status Group 2"
id: neptun_valve_status_g2
register_type: holding
address: 0
bitmask: 0x200 # Бит 9
device_class: opening
# --- ОБЩИЕ СИСТЕМНЫЕ СТАТУСЫ ---
# Флаг потери беспроводных датчиков (Регистр 0, бит 4)
- platform: modbus_controller
modbus_controller_id: neptun_device
name: "Neptun Wireless Sensor Lost"
register_type: holding
address: 0
bitmask: 0x10
device_class: problem
# Флаг разряда батарей в беспроводных датчиках (Регистр 0, бит 3)
- platform: modbus_controller
modbus_controller_id: neptun_device
name: "Neptun Wireless Low Battery"
register_type: holding
address: 0
bitmask: 0x08
device_class: battery
# --- ПРОВОДНЫЕ ЛИНИИ (ДЕТАЛИЗАЦИЯ) ---
# Статусы конкретных проводных линий (Регистр 3)
- platform: modbus_controller
modbus_controller_id: neptun_device
name: "Neptun Wired Line 1 Alarm"
register_type: holding
address: 3
bitmask: 0x02 # Бит 1 (В документации бит 1 это линия 2? Проверьте на практике, обычно 0=Линия1)
# Согласно : Бит 1 - Вторая линия, Бит 2 - Третья.
# Если следовать PDF буквально:
# Бит 0 - ? (в PDF не описан явно, но логично предположить Линию 1, либо Линия 1 это Бит 1)
# Примечание: В PDF для регистра 0001 биты 0-1 это Линия 2. Это странно.
# Рекомендую проверить биты: 0x01, 0x02, 0x04, 0x08.
device_class: moisture
# --- Беспроводные датчики (наличие тревоги) ---
- platform: modbus_controller
modbus_controller_id: neptun_device
name: "Neptun: WS1 - Alarm"
register_type: holding
address: 57 # рег.0057
bitmask: 0x0001 # бит0 = наличие тревоги
device_class: moisture
icon: "mdi:water-alert"
- platform: modbus_controller
modbus_controller_id: neptun_device
name: "Neptun: WS2 - Alarm"
register_type: holding
address: 58 # рег.0058
bitmask: 0x0001
device_class: moisture
icon: "mdi:water-alert"
- platform: modbus_controller
modbus_controller_id: neptun_device
name: "Neptun: WS3 - Alarm"
register_type: holding
address: 59 # рег.0059
bitmask: 0x0001
device_class: moisture
icon: "mdi:water-alert"
sensor:
# --- СИСТЕМНАЯ ИНФОРМАЦИЯ ---
# Текущий Modbus адрес устройства (Регистр 5, старший байт)
- platform: modbus_controller
modbus_controller_id: neptun_device
name: "Neptun Modbus Address"
address: 5
register_type: holding
value_type: U_WORD
accuracy_decimals: 0
entity_category: diagnostic
filters:
# Сначала превращаем x в int, потом сдвигаем
- lambda: return ((int)x >> 8);
# Скорость порта (Регистр 5, младший байт)
- platform: modbus_controller
modbus_controller_id: neptun_device
name: "Neptun Baud Rate Index"
id: neptun_baud_index
address: 5
register_type: holding
value_type: U_WORD
accuracy_decimals: 0
entity_category: diagnostic
filters:
# Сначала превращаем x в int, потом применяем маску
- lambda: return ((int)x & 0xFF);
- platform: modbus_controller
modbus_controller_id: neptun_device
name: "Neptun: Wireless sensors count"
register_type: holding
address: 6
value_type: U_WORD
unit_of_measurement: "шт"
accuracy_decimals: 0
icon: "mdi:chip"
- platform: modbus_controller
modbus_controller_id: neptun_device
name: "Neptun Wireless 1 Status Raw"
id: neptun_ws1_raw
address: 57
register_type: holding
value_type: U_WORD
unit_of_measurement: ""
accuracy_decimals: 0
- platform: modbus_controller
modbus_controller_id: neptun_device
name: "Neptun Wireless 2 Status Raw"
id: neptun_ws2_raw
address: 58
register_type: holding
value_type: U_WORD
unit_of_measurement: ""
accuracy_decimals: 0
- platform: modbus_controller
modbus_controller_id: neptun_device
name: "Neptun Wireless 3 Status Raw"
id: neptun_ws3_raw
address: 59
register_type: holding
value_type: U_WORD
unit_of_measurement: ""
accuracy_decimals: 0
- platform: template
name: "Neptun Wireless 1 Battery Percent"
id: neptun_ws1_batt
unit_of_measurement: "%"
accuracy_decimals: 0
lambda: |-
uint16_t v = (uint16_t)id(neptun_ws1_raw).state;
return (float)((v >> 8) & 0xFF);
- platform: template
name: "Neptun Wireless 1 Signal Level"
id: neptun_ws1_signal_level
accuracy_decimals: 0
lambda: |-
uint16_t v = (uint16_t)id(neptun_ws1_raw).state;
return (float)((v >> 3) & 0x07);
- platform: template
name: "Neptun Wireless 2 Battery Percent"
id: neptun_ws2_batt
unit_of_measurement: "%"
accuracy_decimals: 0
lambda: |-
uint16_t v = (uint16_t)id(neptun_ws2_raw).state;
return (float)((v >> 8) & 0xFF);
- platform: template
name: "Neptun Wireless 2 Signal Level"
id: neptun_ws2_signal_level
accuracy_decimals: 0
lambda: |-
uint16_t v = (uint16_t)id(neptun_ws2_raw).state;
return (float)((v >> 3) & 0x07);
- platform: template
name: "Neptun Wireless 3 Battery Percent"
id: neptun_ws3_batt
unit_of_measurement: "%"
accuracy_decimals: 0
lambda: |-
uint16_t v = (uint16_t)id(neptun_ws3_raw).state;
return (float)((v >> 8) & 0xFF);
- platform: template
name: "Neptun Wireless 3 Signal Level"
id: neptun_ws3_signal_level
accuracy_decimals: 0
lambda: |-
uint16_t v = (uint16_t)id(neptun_ws3_raw).state;
return (float)((v >> 3) & 0x07);
text_sensor:
# Текстовое представление скорости порта (без изменений, но для контекста)
- platform: template
name: "Neptun Baud Rate"
entity_category: diagnostic
icon: "mdi:speedometer"
lambda: |-
// Здесь тоже важно убедиться, что мы берем целое число
int idx = (int)id(neptun_baud_index).state;
switch(idx) {
case 0: return {"1200"};
case 1: return {"2400"};
case 2: return {"4800"};
case 3: return {"9600"};
case 4: return {"19200"};
case 5: return {"38400"};
case 6: return {"57600"};
case 7: return {"115200"};
case 8: return {"230400"};
case 9: return {"460800"};
case 10: return {"921600"};
default: return {"Unknown"};
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment