Skip to content

Latest commit

 

History

History
486 lines (420 loc) · 19.5 KB

README.md

File metadata and controls

486 lines (420 loc) · 19.5 KB

Конфиг файл для Home Assistant для Neptun Smart системы защиты от протечек

  • работает по Modbus TCP c WiFi, Ethernet или Tuya модулями.
  • изменяем host в modbus на IP адресс своего Нептуна.
  • добавлено 5 беспроводных датчиков, если нужно больше или меньше изменяем по примеру.
  • заблокировал своему Neptun Smart полностью доступ в интернет на роутере. нет теперь никакого смысла в этом.
  • сделано на основе Карта памяти регистров модуля управления Neptun Smart для протокола MODBUS-RTU
  • также основано на конфигах(config-wb-neptun.json) для WirenBoard от Ермухамедов Максим (MaxE). Статья на sprut.ai

image image

modbus:
  - name: neptun_smart
    type: tcp
    host: 192.168.1.198
    port: 503
    delay: 3
    timeout: 3

    sensors:
      - name: "Neptun Alarm and Mode Raw"
        address: 0
        slave: 240
        input_type: holding
        data_type: uint16
        scan_interval: 10
      - name: "Leak Sensor Raw"
        address: 3
        slave: 240
        input_type: holding
        data_type: uint16
        scan_interval: 10
      - name: "Number of Connected Wireless Sensors"
        address: 6
        slave: 240
        input_type: holding
        data_type: uint16
        unit_of_measurement: "шт."
        unique_id: "number_of_connected_wireless_sensors"
        scan_interval: 30
      - name: "Wireless Sensor 1 Raw"
        address: 57
        slave: 240
        input_type: holding
        data_type: uint16
        scan_interval: 10

      - name: "Wireless Sensor 2 Raw"
        address: 58
        slave: 240
        input_type: holding
        data_type: uint16
        scan_interval: 10

      - name: "Wireless Sensor 3 Raw"
        address: 59
        slave: 240
        input_type: holding
        data_type: uint16
        scan_interval: 10

      - name: "Wireless Sensor 4 Raw"
        address: 60
        slave: 240
        input_type: holding
        data_type: uint16
        scan_interval: 10

      - name: "Wireless Sensor 5 Raw"
        address: 61
        slave: 240
        input_type: holding
        data_type: uint16
        scan_interval: 10



# Template sensor для двоичного представления значения
template:
  sensor:
    - name: "Neptun Alarm and Mode Binary"
      state: "{{ '{:016b}'.format(states('sensor.neptun_alarm_and_mode_raw') | int) }}"  # Двоичное представление 16 бит

### Wireless sensors ####
    - name: "Battery Level Sensor 1"
      unit_of_measurement: "%"
      state: "{{ ((states('sensor.wireless_sensor_1_raw') | int) // (2 ** 8)) % 256 }}"  # Извлечение битов 8–15
      icon: mdi:battery

    - name: "Sensor Signal Level 1"
      unit_of_measurement: "%"
      state: "{{ (((states('sensor.wireless_sensor_1_raw') | int) // (2 ** 3)) % 8) * 25 }}"  # Извлечение битов 3–5 и умножение на 25 для масштабирования
      icon: mdi:signal

    - name: "Battery Level Sensor 2"
      unit_of_measurement: "%"
      state: "{{ ((states('sensor.wireless_sensor_2_raw') | int) // (2 ** 8)) % 256 }}"
      icon: mdi:battery

    - name: "Sensor Signal Level 2"
      unit_of_measurement: "%"
      state: "{{ (((states('sensor.wireless_sensor_2_raw') | int) // (2 ** 3)) % 8) * 25 }}"
      icon: mdi:signal

    # Новые сенсоры для Sensor 3
    - name: "Battery Level Sensor 3"
      unit_of_measurement: "%"
      state: "{{ ((states('sensor.wireless_sensor_3_raw') | int) // (2 ** 8)) % 256 }}"
      icon: mdi:battery

    - name: "Sensor Signal Level 3"
      unit_of_measurement: "%"
      state: "{{ (((states('sensor.wireless_sensor_3_raw') | int) // (2 ** 3)) % 8) * 25 }}"
      icon: mdi:signal

    # Новые сенсоры для Sensor 4
    - name: "Battery Level Sensor 4"
      unit_of_measurement: "%"
      state: "{{ ((states('sensor.wireless_sensor_4_raw') | int) // (2 ** 8)) % 256 }}"
      icon: mdi:battery

    - name: "Sensor Signal Level 4"
      unit_of_measurement: "%"
      state: "{{ (((states('sensor.wireless_sensor_4_raw') | int) // (2 ** 3)) % 8) * 25 }}"
      icon: mdi:signal

    # Новые сенсоры для Sensor 5
    - name: "Battery Level Sensor 5"
      unit_of_measurement: "%"
      state: "{{ ((states('sensor.wireless_sensor_5_raw') | int) // (2 ** 8)) % 256 }}"
      icon: mdi:battery

    - name: "Sensor Signal Level 5"
      unit_of_measurement: "%"
      state: "{{ (((states('sensor.wireless_sensor_5_raw') | int) // (2 ** 3)) % 8) * 25 }}"
      icon: mdi:signal
### END Wireless sensors ####


# Template binary sensors для отдельных битов
  binary_sensor:
    - name: "Floor Washing Mode"
      state: "{{ states('sensor.neptun_alarm_and_mode_binary')[15] == '1' }}"  # 0-й бит

    - name: "Alarm zona 1"
      state: "{{ states('sensor.neptun_alarm_and_mode_binary')[14] == '1' }}"  # 1-й бит

    - name: "Alarm zona 2"
      state: "{{ states('sensor.neptun_alarm_and_mode_binary')[13] == '1' }}"  # 2-й бит

    - name: "LeakSensor 1"
      state: "{{ states('sensor.leak_sensor_raw') | int | bitwise_and(1) > 0 }}"  # 0-й бит регистра 3

    - name: "Zona 1"
      state: "{{ states('sensor.neptun_alarm_and_mode_binary')[7] == '1' }}"  # 8-й бит

    - name: "Zona 2"
      state: "{{ states('sensor.neptun_alarm_and_mode_binary')[6] == '1' }}"  # 9-й бит

    - name: "Keypad Locks"
      state: "{{ states('sensor.neptun_alarm_and_mode_binary')[3] == '1' }}"  # 12-й бит

### Wireless sensors ####
    - name: "Presence of Alarm Sensor 1"
      state: "{{ (states('sensor.wireless_sensor_1_raw') | int) % 2 == 1 }}"  # Проверка 0-го бита
      icon: mdi:alarm
      
    - name: "Availability of Category Sensor 1"
      state: "{{ ((states('sensor.wireless_sensor_1_raw') | int) // (2 ** 1)) % 2 == 1 }}"
      icon: mdi:check-circle

    - name: "Sensor Loss Sensor 1"
      state: "{{ ((states('sensor.wireless_sensor_1_raw') | int) // (2 ** 2)) % 2 == 1 }}"
      icon: mdi:alert-circle

    - name: "Presence of Alarm Sensor 2"
      state: "{{ (states('sensor.wireless_sensor_2_raw') | int) % 2 == 1 }}"
      icon: mdi:alarm

    - name: "Availability of Category Sensor 2"
      state: "{{ ((states('sensor.wireless_sensor_2_raw') | int) // (2 ** 1)) % 2 == 1 }}"
      icon: mdi:check-circle

    - name: "Sensor Loss Sensor 2"
      state: "{{ ((states('sensor.wireless_sensor_2_raw') | int) // (2 ** 2)) % 2 == 1 }}"
      icon: mdi:alert-circle

    - name: "Presence of Alarm Sensor 3"
      state: "{{ (states('sensor.wireless_sensor_3_raw') | int) % 2 == 1 }}"
      icon: mdi:alarm

    - name: "Availability of Category Sensor 3"
      state: "{{ ((states('sensor.wireless_sensor_3_raw') | int) // (2 ** 1)) % 2 == 1 }}"
      icon: mdi:check-circle

    - name: "Sensor Loss Sensor 3"
      state: "{{ ((states('sensor.wireless_sensor_3_raw') | int) // (2 ** 2)) % 2 == 1 }}"
      icon: mdi:alert-circle

    - name: "Presence of Alarm Sensor 4"
      state: "{{ (states('sensor.wireless_sensor_4_raw') | int) % 2 == 1 }}"
      icon: mdi:alarm

    - name: "Availability of Category Sensor 4"
      state: "{{ ((states('sensor.wireless_sensor_4_raw') | int) // (2 ** 1)) % 2 == 1 }}"
      icon: mdi:check-circle

    - name: "Sensor Loss Sensor 4"
      state: "{{ ((states('sensor.wireless_sensor_4_raw') | int) // (2 ** 2)) % 2 == 1 }}"
      icon: mdi:alert-circle

    - name: "Presence of Alarm Sensor 5"
      state: "{{ (states('sensor.wireless_sensor_5_raw') | int) % 2 == 1 }}"
      icon: mdi:alarm

    - name: "Availability of Category Sensor 5"
      state: "{{ ((states('sensor.wireless_sensor_5_raw') | int) // (2 ** 1)) % 2 == 1 }}"
      icon: mdi:check-circle

    - name: "Sensor Loss Sensor 5"
      state: "{{ ((states('sensor.wireless_sensor_5_raw') | int) // (2 ** 2)) % 2 == 1 }}"
      icon: mdi:alert-circle

### END Wireless sensors ####


# Template binary_sensor для Dual Zone Mode
binary_sensor:
  - platform: template
    sensors:
      dual_zone_mode:
        friendly_name: "Dual Zone Mode"
        value_template: "{{ states('sensor.neptun_alarm_and_mode_raw') | int | bitwise_and(1024) > 0 }}"  # 10-й бит
      battery_drain_wireless_sensors:
        friendly_name: "Battery Drain in Wireless Sensors"
        unique_id: "battery_drain_wireless_sensors"
        value_template: "{{ states('sensor.neptun_alarm_and_mode_raw') | int | bitwise_and(8) > 0 }}"  # Проверка 3-го бита
        icon_template: >
          {% if states('sensor.neptun_alarm_and_mode_raw') | int | bitwise_and(8) > 0 %}
            mdi:battery-alert
          {% else %}
            mdi:battery
          {% endif %}

      lost_connection_wireless_sensors:
        friendly_name: "Lost Connection with Wireless Sensors"
        unique_id: "lost_connection_wireless_sensors"
        value_template: "{{ states('sensor.neptun_alarm_and_mode_raw') | int | bitwise_and(16) > 0 }}"  # Проверка 4-го бита
        icon_template: >
          {% if states('sensor.neptun_alarm_and_mode_raw') | int | bitwise_and(16) > 0 %}
            mdi:signal-off
          {% else %}
            mdi:signal
          {% endif %}




# Template switches для управления Zona 1, Zona 2, и Zona 1 + Zona 2 с доступностью для Zona 2
switch:
  - platform: template
    switches:
      zona_1_switch:
        friendly_name: "Zona 1 Switch"
        unique_id: "zona_1_switch"
        value_template: "{{ states('sensor.neptun_alarm_and_mode_raw') | int | bitwise_and(256) > 0 }}"
        icon_template: >
          {% if states('sensor.neptun_alarm_and_mode_raw') | int | bitwise_and(256) > 0 %}
            mdi:water-pump
          {% else %}
            mdi:water-pump-off
          {% endif %}
        turn_on:
          service: modbus.write_register
          data_template:
            hub: neptun_smart
            unit: 240
            address: 0
            value: >
              {% if is_state('binary_sensor.dual_zone_mode', 'off') %}
                {{ (states('sensor.neptun_alarm_and_mode_raw') | int) | bitwise_or(768) }}
              {% else %}
                {{ (states('sensor.neptun_alarm_and_mode_raw') | int) | bitwise_or(256) }}
              {% endif %}
        turn_off:
          service: modbus.write_register
          data_template:
            hub: neptun_smart
            unit: 240
            address: 0
            value: >
              {% if is_state('binary_sensor.dual_zone_mode', 'off') %}
                {{ (states('sensor.neptun_alarm_and_mode_raw') | int) - ((states('sensor.neptun_alarm_and_mode_raw') | int) | bitwise_and(768)) }}
              {% else %}
                {{ (states('sensor.neptun_alarm_and_mode_raw') | int) - ((states('sensor.neptun_alarm_and_mode_raw') | int) | bitwise_and(256)) }}
              {% endif %}


      zona_2_switch:
        friendly_name: "Zona 2 Switch"
        unique_id: "zona_2_switch"
        availability_template: "{{ is_state('binary_sensor.dual_zone_mode', 'on') }}"  # Доступен только если Dual Zone Mode включён
        value_template: "{{ states('sensor.neptun_alarm_and_mode_raw') | int | bitwise_and(512) > 0 }}"
        icon_template: >
          {% if states('sensor.neptun_alarm_and_mode_raw') | int | bitwise_and(256) > 0 %}
            mdi:water-pump
          {% else %}
            mdi:water-pump-off
          {% endif %}
        turn_on:
          service: modbus.write_register
          data:
            hub: neptun_smart
            unit: 240
            address: 0
            value: "{{ (states('sensor.neptun_alarm_and_mode_raw') | int) | bitwise_or(512) }}"
        turn_off:
          service: modbus.write_register
          data:
            hub: neptun_smart
            unit: 240
            address: 0
            value: "{{ (states('sensor.neptun_alarm_and_mode_raw') | int) - ((states('sensor.neptun_alarm_and_mode_raw') | int) | bitwise_and(512)) }}"

      zona_1_2_switch:
        friendly_name: "Zona 1 + Zona 2 Switch"
        value_template: "{{ (states('sensor.neptun_alarm_and_mode_raw') | int | bitwise_and(256)) > 0 and (states('sensor.neptun_alarm_and_mode_raw') | int | bitwise_and(512)) > 0 }}"
        turn_on:
          service: modbus.write_register
          data:
            hub: neptun_smart
            unit: 240
            address: 0
            value: "{{ (states('sensor.neptun_alarm_and_mode_raw') | int) | bitwise_or(768) }}"  # Устанавливаем 256 и 512 одновременно
        turn_off:
          service: modbus.write_register
          data:
            hub: neptun_smart
            unit: 240
            address: 0
            value: "{{ (states('sensor.neptun_alarm_and_mode_raw') | int) - ((states('sensor.neptun_alarm_and_mode_raw') | int) | bitwise_and(768)) }}"  # Обнуляем 256 и 512

      dual_zone_mode_switch:
        friendly_name: "Dual Zone Mode Switch"
        unique_id: "dual_zone_mode_switch"
        value_template: "{{ states('sensor.neptun_alarm_and_mode_raw') | int | bitwise_and(1024) > 0 }}"  # Проверка 10-го бита
        icon_template: >
          {% if states('sensor.neptun_alarm_and_mode_raw') | int | bitwise_and(1024) > 0 %}
            mdi:tally-mark-2
          {% else %}
            mdi:tally-mark-1
          {% endif %}
        turn_on:
          service: modbus.write_register
          data:
            hub: neptun_smart
            unit: 240
            address: 0
            value: "{{ (states('sensor.neptun_alarm_and_mode_raw') | int) | bitwise_or(1024) }}"  # Устанавливаем 10-й бит
        turn_off:
          service: modbus.write_register
          data:
            hub: neptun_smart
            unit: 240
            address: 0
            value: "{{ (states('sensor.neptun_alarm_and_mode_raw') | int) - ((states('sensor.neptun_alarm_and_mode_raw') | int) | bitwise_and(1024)) }}"  # Обнуляем 10-й бит

      floor_washing_mode_switch:
        friendly_name: "Floor Washing Mode Switch"
        unique_id: "floor_washing_mode_switch"
        value_template: "{{ states('sensor.neptun_alarm_and_mode_raw') | int | bitwise_and(1) > 0 }}"  # Проверка 0-го бита
        icon_template: >
          {% if states('sensor.neptun_alarm_and_mode_raw') | int | bitwise_and(1) > 0 %}
            mdi:shower
          {% else %}
            mdi:shower-head
          {% endif %}
        turn_on:
          service: modbus.write_register
          data:
            hub: neptun_smart
            unit: 240
            address: 0
            value: "{{ (states('sensor.neptun_alarm_and_mode_raw') | int) | bitwise_or(1) }}"  # Устанавливаем 0-й бит
        turn_off:
          service: modbus.write_register
          data:
            hub: neptun_smart
            unit: 240
            address: 0
            value: "{{ (states('sensor.neptun_alarm_and_mode_raw') | int) - ((states('sensor.neptun_alarm_and_mode_raw') | int) | bitwise_and(1)) }}"  # Обнуляем 0-й бит

      keypad_locks_switch:
        friendly_name: "Keypad Locks Switch"
        unique_id: "keypad_locks_switch"
        value_template: "{{ states('sensor.neptun_alarm_and_mode_raw') | int | bitwise_and(4096) > 0 }}"  # Проверка 12-го бита
        icon_template: >
          {% if states('sensor.neptun_alarm_and_mode_raw') | int | bitwise_and(4096) > 0 %}
            mdi:keyboard-off
          {% else %}
            mdi:keyboard
          {% endif %}
        turn_on:
          service: modbus.write_register
          data:
            hub: neptun_smart
            unit: 240
            address: 0
            value: "{{ (states('sensor.neptun_alarm_and_mode_raw') | int) | bitwise_or(4096) }}"  # Устанавливаем 12-й бит
        turn_off:
          service: modbus.write_register
          data:
            hub: neptun_smart
            unit: 240
            address: 0
            value: "{{ (states('sensor.neptun_alarm_and_mode_raw') | int) - ((states('sensor.neptun_alarm_and_mode_raw') | int) | bitwise_and(4096)) }}"  # Обнуляем 12-й бит

      closing_taps_on_sensor_lost:
        friendly_name: "Closing Taps on Sensor Lost"
        unique_id: "closing_taps_on_sensor_lost_switch"
        value_template: "{{ states('sensor.neptun_alarm_and_mode_raw') | int | bitwise_and(2048) > 0 }}"  # Проверка 11-го бита
        icon_template: >
          {% if states('sensor.neptun_alarm_and_mode_raw') | int | bitwise_and(2048) > 0 %}
            mdi:water-off
          {% else %}
            mdi:water
          {% endif %}
        turn_on:
          service: modbus.write_register
          data:
            hub: neptun_smart
            unit: 240
            address: 0
            value: "{{ (states('sensor.neptun_alarm_and_mode_raw') | int) | bitwise_or(2048) }}"  # Устанавливаем 11-й бит
        turn_off:
          service: modbus.write_register
          data:
            hub: neptun_smart
            unit: 240
            address: 0
            value: "{{ (states('sensor.neptun_alarm_and_mode_raw') | int) - ((states('sensor.neptun_alarm_and_mode_raw') | int) | bitwise_and(2048)) }}"  # Обнуляем 11-й бит

      procedure_for_connecting_wireless_devices:
        friendly_name: "Procedure for Connecting Wireless Devices"
        unique_id: "procedure_for_connecting_wireless_devices_switch"
        value_template: "{{ states('sensor.neptun_alarm_and_mode_raw') | int | bitwise_and(128) > 0 }}"  # Проверка 7-го бита
        icon_template: >
          {% if states('sensor.neptun_alarm_and_mode_raw') | int | bitwise_and(128) > 0 %}
            mdi:wifi
          {% else %}
            mdi:wifi-off
          {% endif %}
        turn_on:
          service: modbus.write_register
          data:
            hub: neptun_smart
            unit: 240
            address: 0
            value: "{{ (states('sensor.neptun_alarm_and_mode_raw') | int) | bitwise_or(128) }}"  # Устанавливаем 7-й бит
        turn_off:
          service: modbus.write_register
          data:
            hub: neptun_smart
            unit: 240
            address: 0
            value: "{{ (states('sensor.neptun_alarm_and_mode_raw') | int) - ((states('sensor.neptun_alarm_and_mode_raw') | int) | bitwise_and(128)) }}"  # Обнуляем 7-й бит


В основном конфиге только 1 проводная линия. Если нужно добавить дополнительные проводные линии, берем отсюда и вставляем там где LeakSensor 1:

    - name: "LeakSensor 1"
      state: "{{ states('sensor.leak_sensor_raw') | int | bitwise_and(1) > 0 }}"  # Бит 0 регистра 3

    - name: "LeakSensor 2"
      state: "{{ states('sensor.leak_sensor_raw') | int | bitwise_and(2) > 0 }}"  # Бит 1 регистра 3

    - name: "LeakSensor 3"
      state: "{{ states('sensor.leak_sensor_raw') | int | bitwise_and(4) > 0 }}"  # Бит 2 регистра 3

    - name: "LeakSensor 4"
      state: "{{ states('sensor.leak_sensor_raw') | int | bitwise_and(8) > 0 }}"  # Бит 3 регистра 3