Home assistant / esphome (делимся примерами и наработками в данной области).

Тема в разделе "Глядите, что я сделал", создана пользователем Securbond, 6 ноя 2020.

  1. Sanchorezh

    Sanchorezh Нуб

    Прошивал камеру ESP32-CAM, работает. Не забывали нулевой садить на землю перед прошивкой?
     
  2. vovatvset

    vovatvset Нуб

    Знающие, подскажите в чем проблема, у меня добавляются не все объекты (сенсоры, выключатели) от устройств ESP8266, ESP32 в HA, В логе от ESP они есть, а в Home Assistant появляется половина из них. Удаление из интеграций и новое добавление проблему не решает. Даже например от AHT10 влажность приходит а температура - нет. В чем может быть проблема?
     
  3. mikl

    mikl Нуб

    Здравствуйте. Я недавно начал изучать ESPHOME. Написал часть кода, который считает количество движений(binary_sensor), который после 2-х срабатываний датчика движения, включает реле и через 5сек выключает и обнуляет счетчик. Что нужно дописать чтобы если после первого срабатывания датчика движения прошло 10сек,а второго движения не было зафиксировано за это время, он обнулял счетчик?

    globals:
    - id: motion_val
    type: int
    initial_value: '0'

    binary_sensor:
    - platform: gpio
    pin:
    number: GPIO2
    mode: INPUT_PULLUP
    inverted: False
    name: "PIR Sensor"
    device_class: motion
    id: pir
    on_press:
    then:
    - if:
    condition:
    lambda: |-
    id(motion_val) +=1;

    return id(motion_val) > 2;
    then:
    - switch.turn_on: relay_1
    - lambda: |-
    id(motion_val) = 0;


    - platform: template
    name: "111"
    lambda: 'return id(pir).state;'
    filters:
    - delayed_off: 5s
    on_release:
    then:
    - switch.turn_off: relay_1

    switch:
    - platform: gpio
    pin: GPIO0
    name: "Relay_1"
    id: relay_1
     
  4. mikhail09p

    mikhail09p Гик

    Здравствуйте.
    Приобщился к обществу любителей Home Asistant...
    Учусь понемногу, подскажите одну вещь: как реализовать сравнение. Нужно, чтобы выход relay принимал 1, когда volt_on_charg больше voltage. И 0 , когда меньше.
    Как это пишется? Вставляю lambda: |- в разные места программы, везде ошибка...
    Код привожу ниже.

    Код (C++):
    esphome:
      name: energymonitor1
    #  плата ESP8266-NODEMCU2
    #  Датчик струму і напруги INA226, температура і вологість АНТ10
    #  дисплей 16x2, кнопка на D7, вихід на реле D6

    esp8266:
      board: nodemcuv2
     
    wifi:
    # Логин и пароль к сети WIFI
      ssid: "Mixa3"
      password: "********"

      # Enable fallback hotspot (captive portal) in case wifi connection fails
      ap:
        ssid: "ESP 3"
        password: "12345678"

    captive_portal:

    # Enable logging
    logger:

    # Enable Home Assistant API
    api:
      password: ""

    ota:
      password: ""

    web_server:
      port: 80

    # GPIO Binary Sensor
    # Активация внутреннего подтягивания вывода и обозначение кнопки
    binary_sensor:
      - platform: gpio
        pin:
          number: D7
          mode: INPUT_PULLUP
          inverted: True
        name: "Кнопка"
        on_press:
        - switch.toggle: mybutton

    switch:
    #
      - platform: template
        name: "Реле"
        optimistic: true
        id: mybutton
        turn_on_action:
        - switch.turn_on: relay
        - light.turn_on: led
        turn_off_action:
        - switch.turn_off: relay
        - light.turn_off: led
    # Назначение выхода на реле
      - platform: gpio
        id: relay
        pin: D6
    # ---------------------------------------->
    # Monochromatic Light
    # Плавное зажигание светодиода
    output:
      - platform: esp8266_pwm
        id: basic_green_led
        pin:
          number: D8
          inverted: True

    light:
      - platform: monochromatic
        name: "Світлодіод"
        output: basic_green_led
        id: led
    # ----------------------------------------<
    # Example configuration entry
    number:
      - platform: template
        name: "Template number"
        id: volt_on_charg
        optimistic: true
        min_value: 10
        max_value: 30
        step: 0.1
       
    display:
      - platform: lcd_gpio
        dimensions: 16x2
        data_pins:
          - D0
          - D1
          - D2
          - D3
        enable_pin: D4
        rs_pin: D5
        lambda: |-
          it.printf("%s", id(relay).state ? "Charger" : "       ");
          it.printf(0, 1, "U=%.1fV I=%.2fA", id(voltage).state, id(current).state);
          it.strftime(11, 0,"%H:%M", id(my_time).now());
    # ----------------------------------------<    
    sensor:
      - platform: ina226
        address: 0x40
        shunt_resistance: 0.1 ohm
        current:
          name: "INA226 Current"
          id: current
        power:
          name: "INA226 Power"
        bus_voltage:
          name: "INA226 Bus Voltage"
          id: voltage
        shunt_voltage:
          name: "INA226 Shunt Voltage"
        max_current: 13A
        update_interval: 1s
       
      - platform: aht10
        temperature:
          name: "Temperature"
          disabled_by_default: false
          force_update: false
          unit_of_measurement: °C
          accuracy_decimals: 1
          device_class: temperature
          state_class: measurement
        humidity:
          name: "Humidity"
          disabled_by_default: false
          force_update: false
          unit_of_measurement: '%'
          accuracy_decimals: 1
          device_class: humidity
          state_class: measurement
        update_interval: 30s
        address: 0x38
       
    i2c:
      sda: GPIO3
      scl: GPIO1
      scan: true
     
    time:
    - platform: homeassistant
      id: my_time
     
     
  5. papant

    papant Нуб

    Добрый день!
    Подсткажите плиз по интеграции пылесоса Roborock S50 с прошивкой Valetudo в НА.
    В конфиг написал:
    - url: /local/custom_lovelace/valetudo-map-card.js
    type: module
    в лоулейсе так:
    - type: custom:valetudo-map-card
    vacuum_entity: vacuum.valetudo_timosha
    title: Timosha Vacuum Map Card
    preset_name: Live map
    entity: camera.valetudo_timosha_map_data
    map_scale: 1
    min_height: 0
    На выходе получаю вот так:
    изображение_2022-08-15_071614697.png
    Объект MAP в системе присутствует
    camera.valetudo_timosha_map_data
    Перечитал уже гору форумов, у всех все работает, один я рукожопый (
     
  6. Slacky

    Slacky Гик

    Добрый день.

    А вот подскажите. Установил HA на Debian 11. По иструкции linux core. И не работает restart из web-интерфейса. При нажатии на эту кнопку просто останавливает HA, но не запускает.

    При этом systemctl restart home-assistant@homeassistant прекрасно работает.

    Никакие конфиги не правил, система чистая.

    Куда смотреть?
     
  7. Un_ka

    Un_ka Гуру

    В логи. Какая версия python и HA?
     
  8. Slacky

    Slacky Гик

    А уже не актуально. Снес. Поставил вариант с supervisor. Те еще пляски с бубном (в основном с сетью и ее безопасностью). Пока ее тестирую.
     
  9. Slacky

    Slacky Гик

    А вот еще вопрос. Перерыл инет, но ответа пока не нашел.

    Есть некий счетчик. При срабатывании (не важно чего), он увеличивается, допустим, на единицу.

    Как сделать автоматизацию по увеличению счетчика?
     
  10. ИгорьК

    ИгорьК Гуру

    Получение погоды от Open Weather, вывод на брокер и в Home Assistant .

    1. Сначала Node Red. Он есть в НА в дополнениях, в магазине, HACS или отдельностоящий у тех кто подольше.

    Изображение:
    upload_2025-1-30_12-29-4.png
    Устройство:
    Код (Bash):
    [
        {
            "id": "9ee30296d86cea01",
            "type": "http request",
            "z": "01532b6fef1e6210",
            "name": "Текущая Погода",
            "method": "GET",
            "ret": "txt",
            "paytoqs": "ignore",
            "url": "http://api.open-meteo.com/v1/forecast?latitude=55.7522&longitude=37.6156&current=temperature_2m,relative_humidity_2m,is_day,rain,weather_code,wind_speed_10m&timezone=auto&forecast_days=1",
            "tls": "",
            "persist": false,
            "proxy": "",
            "insecureHTTPParser": false,
            "authType": "",
            "senderr": false,
            "headers": [],
            "x": 390,
            "y": 280,
            "wires": [
                [
                    "085e13a085ac2be6"
                ]
            ]
        },
        {
            "id": "4dac0f77da90b92c",
            "type": "inject",
            "z": "01532b6fef1e6210",
            "name": "",
            "props": [
                {
                    "p": "payload"
                },
                {
                    "p": "topic",
                    "vt": "str"
                }
            ],
            "repeat": "900",
            "crontab": "",
            "once": false,
            "onceDelay": 0.1,
            "topic": "",
            "payload": "",
            "payloadType": "date",
            "x": 170,
            "y": 280,
            "wires": [
                [
                    "9ee30296d86cea01",
                    "d9ce8d4a6aa44c1f"
                ]
            ]
        },
        {
            "id": "420469432a5556db",
            "type": "mqtt out",
            "z": "01532b6fef1e6210",
            "name": "",
            "topic": "mosweather/now",
            "qos": "",
            "retain": "",
            "respTopic": "",
            "contentType": "",
            "userProps": "",
            "correl": "",
            "expiry": "",
            "broker": "842c076a4df99a05",
            "x": 1070,
            "y": 280,
            "wires": []
        },
        {
            "id": "085e13a085ac2be6",
            "type": "json",
            "z": "01532b6fef1e6210",
            "name": "",
            "property": "payload",
            "action": "obj",
            "pretty": false,
            "x": 570,
            "y": 280,
            "wires": [
                [
                    "1255dcaacde0f6b9"
                ]
            ]
        },
        {
            "id": "1255dcaacde0f6b9",
            "type": "function",
            "z": "01532b6fef1e6210",
            "name": "Текущее преобразование",
            "func": "let nmsg = {};\nnmsg.payload = {}\n\nglobal.set(\"tempnow\", msg.payload.current.temperature_2m);\n\nnmsg.payload.tempnow = msg.payload.current.temperature_2m;\nnmsg.payload.offset = msg.payload.utc_offset_seconds;\nnmsg.payload.is_day = msg.payload.current.is_day;\nnmsg.payload.humidity = msg.payload.current.relative_humidity_2m;\nnmsg.payload.rain = msg.payload.current.rain;\nnmsg.payload.windspeed = msg.payload.current.wind_speed_10m;\n\nreturn nmsg;",
            "outputs": 1,
            "timeout": 0,
            "noerr": 0,
            "initialize": "",
            "finalize": "",
            "libs": [],
            "x": 780,
            "y": 280,
            "wires": [
                [
                    "420469432a5556db"
                ]
            ]
        },
        {
            "id": "7ee29c138b6434be",
            "type": "http request",
            "z": "01532b6fef1e6210",
            "name": "Прогноз Погоды",
            "method": "GET",
            "ret": "txt",
            "paytoqs": "ignore",
            "url": "http://api.open-meteo.com/v1/forecast?latitude=55.7522&longitude=37.6156&hourly=temperature_2m,weather_code&timezone=Europe%2FMoscow&temporal_resolution=hourly_6&forecast_days=1&forecast_hours=24",
            "tls": "",
            "persist": false,
            "proxy": "",
            "insecureHTTPParser": false,
            "authType": "",
            "senderr": false,
            "headers": [],
            "x": 390,
            "y": 360,
            "wires": [
                [
                    "eb46a2a2aa1c9e0f"
                ]
            ]
        },
        {
            "id": "eb46a2a2aa1c9e0f",
            "type": "json",
            "z": "01532b6fef1e6210",
            "name": "",
            "property": "payload",
            "action": "obj",
            "pretty": false,
            "x": 570,
            "y": 360,
            "wires": [
                [
                    "a259b93fa286042f",
                    "aafa55221a787af9"
                ]
            ]
        },
        {
            "id": "a259b93fa286042f",
            "type": "function",
            "z": "01532b6fef1e6210",
            "name": "Текущее преобразование",
            "func": "let nmsg = {};\nnmsg.payload = {}\nnmsg.payload.offset = msg.payload.utc_offset_seconds;\n\nlet tenpnow = global.get(\"tempnow\");\n\nlet numbers = msg.payload.hourly.temperature_2m;\nlet minimum = Math.min(...numbers);\n\nlet fcnumbers = msg.payload.hourly.weather_code;\nlet fcmax = Math.max(...fcnumbers);\n\nnmsg.payload.tempnow = tenpnow; \nnmsg.payload.tempFC = minimum;\nnmsg.payload.weatherFC = fcmax;\n\nreturn nmsg;",
            "outputs": 1,
            "timeout": 0,
            "noerr": 0,
            "initialize": "",
            "finalize": "",
            "libs": [],
            "x": 780,
            "y": 360,
            "wires": [
                [
                    "ad1347aee01b4bab",
                    "dbe0b7631872b7d1"
                ]
            ]
        },
        {
            "id": "d9ce8d4a6aa44c1f",
            "type": "delay",
            "z": "01532b6fef1e6210",
            "name": "",
            "pauseType": "delay",
            "timeout": "3",
            "timeoutUnits": "seconds",
            "rate": "1",
            "nbRateUnits": "1",
            "rateUnits": "second",
            "randomFirst": "1",
            "randomLast": "5",
            "randomUnits": "seconds",
            "drop": false,
            "allowrate": false,
            "outputs": 1,
            "x": 170,
            "y": 360,
            "wires": [
                [
                    "7ee29c138b6434be"
                ]
            ]
        },
        {
            "id": "aafa55221a787af9",
            "type": "function",
            "z": "01532b6fef1e6210",
            "name": "Погода",
            "func": "let nmsg = {};\nnmsg.payload = {}\n\nlet tenpnow = global.get(\"tempnow\");\nnmsg.payload.tempnow = tenpnow; \n\nlet numbers = msg.payload.hourly.temperature_2m;\nlet minimum = Math.min(...numbers);\n\nnmsg.payload.tempFC = minimum;\n\nlet fcnumbers = msg.payload.hourly.weather_code;\nlet fcmax = Math.max(...fcnumbers);\n\nnmsg.payload.weatherFC = fcmax;\nlet nfcmax = Number(fcmax);\n\nlet codew = {}\n    codew[0] = \"Ясно\"\n    codew[1] = \"Ясно\"\n    codew[2] = \"Облачно\"\n    codew[3] = \"Хмуро\"\n    codew[45] = \"Туман\"\n    codew[48] = \"Мрак\"\n    codew[51] = \"Легкая Морось\"\n    codew[53] = \"Морось\"\n    codew[55] = \"Моросящий Дождик\"\n    codew[56] = \"Дряпня\"\n    codew[57] = \"Дряпня\"\n    codew[61] = \"Легкий Дождь\"\n    codew[63] = \"Дождь\"\n    codew[65] = \"Дождяра\"\n    codew[66] = \"Дряпня\"\n    codew[67] = \"Полная дряпня\"\n    codew[71] = \"Снежок\"\n    codew[73] = \"Снег\"\n    codew[75] = \"Метель\"\n    codew[77] = \"Буран\"\n    codew[80] = \"Отдельные Ливни\"\n    codew[81] = \"Ливень\"\n    codew[82] = \"Льет Как Из Ведра\"\n    codew[85] = \"Снежный Ливень\"\n    codew[86] = \"Пипец Какой-то - Снег с Дождем\"\n    codew[95] = \"Гроза\"\n    codew[96] = \"Гроза с Градом\"\n    codew[99] = \"Гроза с Градом\"\nnmsg.payload.weatherFCtxt = codew[nfcmax];\n\nreturn nmsg;",
            "outputs": 1,
            "timeout": 0,
            "noerr": 0,
            "initialize": "",
            "finalize": "",
            "libs": [],
            "x": 680,
            "y": 440,
            "wires": [
                [
                    "e57ace6b287857d3"
                ]
            ]
        },
        {
            "id": "ad1347aee01b4bab",
            "type": "mqtt out",
            "z": "01532b6fef1e6210",
            "name": "",
            "topic": "mosweather/fc",
            "qos": "",
            "retain": "",
            "respTopic": "",
            "contentType": "",
            "userProps": "",
            "correl": "",
            "expiry": "",
            "broker": "842c076a4df99a05",
            "x": 1080,
            "y": 360,
            "wires": []
        },
        {
            "id": "3a12200365d6f8ad",
            "type": "mqtt out",
            "z": "01532b6fef1e6210",
            "name": "",
            "topic": "mosweather/fctxt",
            "qos": "",
            "retain": "",
            "respTopic": "",
            "contentType": "",
            "userProps": "",
            "correl": "",
            "expiry": "",
            "broker": "842c076a4df99a05",
            "x": 1070,
            "y": 440,
            "wires": []
        },
        {
            "id": "e57ace6b287857d3",
            "type": "delay",
            "z": "01532b6fef1e6210",
            "name": "",
            "pauseType": "delay",
            "timeout": "3",
            "timeoutUnits": "seconds",
            "rate": "1",
            "nbRateUnits": "1",
            "rateUnits": "second",
            "randomFirst": "1",
            "randomLast": "5",
            "randomUnits": "seconds",
            "drop": false,
            "allowrate": false,
            "outputs": 1,
            "x": 870,
            "y": 440,
            "wires": [
                [
                    "3a12200365d6f8ad"
                ]
            ]
        },
        {
            "id": "842c076a4df99a05",
            "type": "mqtt-broker",
            "name": "",
            "broker": "192.168.27.31",
            "port": "1883",
            "clientid": "",
            "autoConnect": true,
            "usetls": false,
            "protocolVersion": "4",
            "keepalive": "60",
            "cleansession": true,
            "autoUnsubscribe": true,
            "birthTopic": "",
            "birthQos": "0",
            "birthRetain": "false",
            "birthPayload": "",
            "birthMsg": {},
            "closeTopic": "",
            "closeQos": "0",
            "closeRetain": "false",
            "closePayload": "",
            "closeMsg": {},
            "willTopic": "",
            "willQos": "0",
            "willRetain": "false",
            "willPayload": "",
            "willMsg": {},
            "userProps": "",
            "sessionExpiry": ""
        }
    ]
     
  11. ИгорьК

    ИгорьК Гуру

    2. НА забирает:
    Код (Bash):
    mqtt:
      sensor:
        - name: "В Москве Сейчас"
          device_class: temperature
          unique_id: temperature_at_moscow_from_ow
          state_topic: "mosweather/fctxt"
          value_template: "{{ value_json.tempnow }}"
          unit_of_measurement: '℃'

        - name: "В Москве Ветер"
          device_class: wind_speed
          unique_id: wspeed_at_moscow_from_ow
          state_topic: "mosweather/now"
          value_template: "{{ value_json.windspeed }}"
          unit_of_measurement: 'm/c'

        - name: "В Москве Дождь"
          # device_class: speed
          unique_id: rain_at_moscow_from_ow
          state_topic: "mosweather/now"
          value_template: "{{ value_json.rain }}"
          # unit_of_measurement: 'm/c'

        - name: "В Москве Влажность"
          device_class: humidity
          unique_id: humi_at_moscow_from_ow
          state_topic: "mosweather/now"
          value_template: "{{ value_json.humidity }}"
          unit_of_measurement: '%'

        - name: "В Москве Ожидается"
          device_class: temperature
          unique_id: temperature_at_moscow_from_owfc
          state_topic: "mosweather/fctxt"
          value_template: "{{ value_json.tempFC }}"
          unit_of_measurement: '℃'

        - name: "В Москве Будет"
          # device_class: text
          unique_id: weth_at_moscow_from_owfc_txt
          state_topic: "mosweather/fctxt"
          value_template: "{{ value_json.weatherFCtxt }}"
          # unit_of_measurement: '℃'
     

    3. Результат:

    upload_2025-1-30_12-36-15.png
     
  12. Alexey-kipia

    Alexey-kipia Нерд

    Всем привет!
    Нужна помощь. Сам не могу сообразить мало опыта.
    В общем идея такая. Нужен счётчик проходящих объектов через оптический барьер. Например: есть зона, на входе стоит барьер и работает как энкодер. Объект прошел, посчитался, прибавилась 1 и включилась реле. Таких объектов может пройти несколько и все нужно посчитать. Но эти объекты будут и выходить из зоны, и при выходе последнего нужно выключить реле.
    Rotary Encoder Sensor применил, он считает как надо, но как обработать эти цифры не могу понять.
     
  13. ИгорьК

    ИгорьК Гуру

    Разве ж можно здесь одним счетчиком обойтись? 3 человека вошло, потом они вышли - счетчик выдал цифру "6". Как ее интерпретировать? Здесь надо два счетчика и анализировать последовательность их работы. Сможете установить два, да так, чтобы они безошибочно определяли направление входа/выхода? Если нет - то и думать дальше не надо.

    Сейчас есть датчики определения присутствия очень крутые и очень дорогие. У меня такого нет, но по слухам работают исправно. Возможно здесь искать решение. Если о людях речь...
     
    parovoZZ нравится это.
  14. parovoZZ

    parovoZZ Гуру

    можно. Объект вошел - прибавляем, объект вышел - вычитаем.
    но с простыми фотодетекторами вероятность ошибки очень велика. Поэтому нужна синхронная детекция, самих детекторов должно быть не два, а три, четыре.... Дальше весьма не тривиальная логика обработки всяких разных ситуаций - вошёл, но только наполовину, объекты входят-выходят с перекрышем и прочее.
     
    ИгорьК нравится это.
  15. ИгорьК

    ИгорьК Гуру

    Это выход. Дорогой. (Оно сильно нужно?) Пусть сами кнопки жмут :)
     
  16. parovoZZ

    parovoZZ Гуру

    это обычный радиоволновик. При этом он ничего не предлагает по поводу обнаружения движения за...стеной. Отечественная зебра и дороже и грубее и не на батарейках, но у неё хоты бы есть зоны по дальности.
     
  17. Alexey-kipia

    Alexey-kipia Нерд

    Сам барьер другая тема. Как мне из Rotary Encoder Sensor передать данные? В какую платформу? В итоге через output: при "0" выключить реле, при 0< включить. Может через light:?
    Как if или case организоаать? Не могу понять, как формировать логику.
     
  18. parovoZZ

    parovoZZ Гуру

    Значение счетчика пишешь непосредственно в бит регистра, который управляет выходной ножкой контроллера. На сях значение 0 - это false, любое другое значение - true. Никакой другой логики здесь не требуется.
     
  19. OLEGPOL

    OLEGPOL Нуб

    Привет всем.
    Имеется модуль ESP8266, с прошивкой ESPHome. Рабочий код прошивки принимает код от удалённого радиотермометра в формате BIN и DEC. Код формата DEC выводится на WEB панель homeassistant. Мне необхоим пересчет кода DEC чтоб была читаема температура . Формула пересчета (код - 300000-500) \ 10. Ребят поскажите как внести либо поправить код. Я знаю что нужно вносить изменения в разел <remote_receiver> и далее в функцию <Lambda> , но как это сделать я не понимаю.

    Код (C++):
    esphome:
      name: esphome-web-58e44f
      friendly_name: ESPHome Web 58e44f
      min_version: 2025.11.0
      name_add_mac_suffix: false

    esp8266:
      board: nodemcuv2
      restore_from_flash: True
     
    preferences:
      flash_write_interval: 300s

    # Enable logging
    logger:

    # Enable Home Assistant API
    api:

    # Allow Over-The-Air updates
    ota:
    - platform: esphome

    wifi:
      ssid: !secret wifi_ssid
      password: !secret wifi_password

    captive_portal:

    one_wire:
      - platform: gpio
        pin: GPIO2

    sensor:
      - platform: dallas_temp
        name: "Температура дома"
        update_interval: 10s
        address: 0x5d181e3e31672128
       #- platform: dallas_temp
       # name: "Temperature #2"
       # address: 0xDD0000031EFB0428
       
      - platform: adc
        pin: GPIO17
        name: "Напряжение питания"
        update_interval: 2s
        unit_of_measurement: "V"
        accuracy_decimals: 2
        filters:
        - multiply: 3.27
       
    switch:
      - platform: gpio
        name: "Relay 1"
        pin: GPIO12
        id: 'living1'
        restore_mode: RESTORE_DEFAULT_OFF

      - platform: gpio
        name: "Relay 2"
        pin: GPIO14
        id: 'living2'
        restore_mode: RESTORE_DEFAULT_OFF
       
    remote_receiver:
    - pin:
        number: D3
        mode: INPUT_PULLUP
        inverted: True
      dump: rc_switch
      tolerance: 60%
      filter: 4us
      idle: 4ms
      buffer_size: 2kb
      on_rc_switch:
        #- logger.log:
            #format: "on_rc_switch: %i %llu"
            #args: [x.protocol, x.code]
          then:
          - lambda: |-
              char str[20];
              sprintf(str, "%llu", x.code);
              id(rf_code).publish_state(str);
          #- lambda: |-
             # ESP_LOGI("rc_switch", "Received: %ld, Protocol: %d, Bits: %d", x.code, x.protocol, x.bits);
             #// Здесь можно конвертировать, например, x.code
             
    text_sensor:
      - platform: template
        name: "Температура улица"
        id: rf_code
        icon: "mdi:thermometer"
             
    binary_sensor:
      - platform: template
        name: "Test Door"
        device_class: door
        id: testdoor

      - platform: remote_receiver
        name: "Test Door Open"
        internal: true
        on_press:
          then:
            - binary_sensor.template.publish:
                id: testdoor
                state: ON
            - switch.toggle: living1    # реле <Relay 1> вкл/выкл одной кнопкой
            #- switch.turn_on: living1  # реле <Relay 1> вкл разными кнопками
        rc_switch_raw:
          code: '100001111001000000110001'
          protocol: 6
        filters:
          - delayed_off: 100ms
       
      - platform: remote_receiver
        name: "Test Door Close"
        internal: true
        on_press:
          then:
            - binary_sensor.template.publish:
                id: testdoor
                state: OFF
            - switch.toggle: living2     # реле <Relay 2> вкл/выкл одной кнопкой
            #- switch.turn_off: living2  # реле <Relay 2> выкл разными кнопками
        rc_switch_raw:
          code: '100001111001000000110010'
          protocol: 6
        filters:
          - delayed_off: 100ms
         
         

         

     
       
       
         
           








               
       








     
     
  20. OLEGPOL

    OLEGPOL Нуб

    Привет всем, сам решил вопрос, может кому нибудь пригодится.
    Код (C++):
    esphome:
    name: esphome-web-58e44f
    friendly_name: ESPHome Web 58e44f
    min_version: 2025.11.0
    name_add_mac_suffix: false

    esp8266:
    board: nodemcuv2
    restore_from_flash: True

    preferences:
    flash_write_interval: 300s

    # Enable logging
    logger:

    # Если раскомм то WEB Home Assistant API, если закомментирован то собственный WEB ESPHome
    api:
    reboot_timeout: 0s

    ota:
    - platform: esphome

    wifi:
    ssid: !secret wifi_ssid
    password: !secret wifi_password
    manual_ip:
    static_ip: 192.168.0.23
    gateway: 192.168.0.1
    subnet: 255.255.255.0
    dns1: 8.8.8.8
    dns2: 8.8.4.4
    #min_auth_mode: WPA2
    #reboot_timeout: 720h
    # Этот триггер срабатывает при установлении или разрыве соединения Wi-Fi.
    #on_connect:
    #- switch.turn_on: switch1
    #on_disconnect:
    #- switch.turn_off: switch1

    i2c:
    sda: GPIO12
    scl: GPIO14
    scan: false
    #frequency: 100kHz

    web_server:
    port: 80

    captive_portal:

    font:
    - file: "gfonts://Silkscreen"
    id: small
    size: 10
    - file: "gfonts://Roboto"
    id: large
    size: 24
    - file: "gfonts://Silkscreen"
    id: medium
    size: 15

    display:
    - platform: ssd1306_i2c
    model: "SSD1306 128x64"
    ##reset_pin: D0
    address: 0x3C
    lambda: |-
    it.printf(0, 0, id(small), TextAlign::TOP_LEFT, "Time and");
    it.printf(0, 12, id(small), TextAlign::TOP_LEFT, "Temperature");

    it.strftime(0, 60, id(large), TextAlign::BASELINE_LEFT, "%H:%M", id(my_time).now());

    if (id(temp_23).has_state()) {
    it.printf(127, 23, id(medium), TextAlign::TOP_RIGHT , "%.1f°C", id(temp_23).state);
    }
    if (id(temperature).has_state()) {
    it.printf(127, 60, id(medium), TextAlign::BASELINE_RIGHT , "%.1f°C", id(temperature).state);
    }

    one_wire:
    - platform: gpio
    pin: GPIO2

    remote_receiver:
    - pin:
    number: D2
    inverted: True
    mode:
    input: true
    pullup: true
    dump: rc_switch
    tolerance: 60%
    filter: 200us
    idle: 4ms
    id: rf_code2
    buffer_size: 1kb
    on_rc_switch:
    - lambda: |-
    char str[20];
    sprintf(str, "%lld", x.code);
    id(rf_code).publish_state(str);

    sensor:
    - platform: dallas_temp
    name: "Температура дома"
    update_interval: 10s
    address: 0x5d181e3e31672128
    id: temperature
    #- platform: dallas_temp
    # name: "Temperature #2"
    # address: 0xDD0000031EFB0428

    - platform: adc
    pin: GPIO17
    name: "Напряжение ESP8266"
    id: raw_adc
    update_interval: 60s
    unit_of_measurement: "V"
    accuracy_decimals: 2
    filters:
    - multiply: 3.27

    - platform: template
    name: "Температура улица"
    icon: "mdi:thermometer"
    update_interval: 2s
    id: temp_23
    accuracy_decimals: 1
    unit_of_measurement: "°C"
    lambda: |-
    float val = atof(id(rf_code).state.c_str());
    if (val>300000 && val<301000) {
    return val / 10.0 - 30050.0;
    } else {
    return {};
    }

    - platform: template
    name: "Напряж ATmega8"
    icon: "mdi:sine-wave"
    update_interval: 10s
    id: temp_22
    accuracy_decimals: 1
    unit_of_measurement: "V"
    lambda: |-
    float val = atof(id(rf_code).state.c_str());
    if (val>306000 && val<306600) {
    return val / 100.0 - 3060.0;
    } else {
    return {};
    }

    - platform: wifi_signal
    name: "Wi-Fi Signal Sensor"
    update_interval: 60s
    internal: false # Делает сенсор видимым в Home Assistant
    id: wi_fi

    - platform: uptime
    name: Uptime Raw
    type: seconds
    id: uptime_raw
    internal: false
    update_interval: 60s

    time:
    - platform: sntp
    id: my_time
    timezone: "Asia/Novosibirsk"
    # (Опционально) Серверы временипо умолчанию - pool.ntp.org
    servers:
    - 0.pool.ntp.org
    - 1.pool.ntp.org

    text_sensor:
    - platform: template
    name: "Коды протокола RCSwitch"
    id: rf_code
    icon: "mdi:thermometer"

    - platform: template
    name: "Интернет время"
    icon: "mdi:clock-time-five"
    lambda: |-
    char str[20];
    time_t currTime = id(my_time).now().timestamp;
    strftime(str, sizeof(str), "%d-%m-%Y %H:%M", localtime(&currTime));
    return { str };
    update_interval: 30s

    - platform: template
    name: "Время работы ESP8266"
    lambda: |-
    uint32_t dur = id(uptime_raw).state;
    int dys = 0;
    int hrs = 0;
    int mnts = 0;
    if (dur > 86399) {
    dys = trunc(dur / 86400);
    dur = dur - (dys * 86400);
    }
    if (dur > 3599) {
    hrs = trunc(dur / 3600);
    dur = dur - (hrs * 3600);
    }
    if (dur > 59) {
    mnts = trunc(dur / 60);
    dur = dur - (mnts * 60);
    }
    char buffer[17];
    sprintf(buffer, "%03ud %02uh %02um %02us", dys, hrs, mnts, dur);
    return {buffer};
    icon: "mdi:clock-time-five"
    update_interval: 60s

    switch:
    - platform: gpio
    name: "Relay1"
    pin: GPIO13
    id: living1
    restore_mode: RESTORE_DEFAULT_OFF

    - platform: gpio
    name: "Relay2"
    pin: GPIO15
    id: living2
    restore_mode: RESTORE_DEFAULT_OFF

    binary_sensor:
    - platform: template
    name: "Test Door"
    device_class: door
    id: testdoor

    - platform: remote_receiver
    name: "Test Door Open"
    internal: true
    on_press:
    then:
    - binary_sensor.template.publish:
    id: testdoor
    state: ON
    - switch.turn_on: living1 # реле <Relay 1> вкл разными кнопками
    rc_switch_raw:
    code: '100001111001000000110010'
    protocol: 6
    filters:
    - delayed_off: 100ms

    - platform: remote_receiver
    name: "Test Door Close"
    internal: true
    on_press:
    then:
    - binary_sensor.template.publish:
    id: testdoor
    state: OFF
    - switch.turn_off: living1 # реле <Relay 2> выкл разными кнопками
    rc_switch_raw:
    code: '100001111001000000110001'
    protocol: 6
    filters:
    - delayed_off: 100ms

    http_request:
    timeout: 15s
    verify_ssl: false
    useragent: esphome/device
    id: http_request_id
    interval:
    - interval: 5min
    then:
    http_request.post:
    url: http://narodmon.ru/post
    json: |-
    JsonObject device = root.createNestedArray("devices").createNestedObject();
    device["mac"] = "XX:XX:XX:XX:XX:XX";
    device["name"] = "Meteo";
    device["owner"] = "email@example.pw";
    device["lat"] = 54.3442;
    device["lon"] = 84.1633;
    JsonArray sensors = device.createNestedArray("sensors");
    JsonObject temp = sensors.createNestedObject();
    temp["id"] = "ds18b20";
    temp["value"] = id(temperature).state;
    temp["unit"] = "°C";
    temp["name"] = "Температура дома";
    JsonObject temp23 = sensors.createNestedObject();
    temp23["id"] = "Dallas";
    temp23["value"] = id(temp_23).state;
    temp23["unit"] = "°C";
    temp23["name"] = "Температура улица";
    JsonObject uptime = sensors.createNestedObject();
    uptime["id"] = "Uptime";
    uptime["value"] = id(uptime_raw).state;
    uptime["unit"] = "seс";
    uptime["name"] = "Время работы ESP8266";
    JsonObject door = sensors.createNestedObject();
    door["id"] = "Door";
    door["value"] = id(testdoor).state;
    door["unit"] = "откр/закр";
    door["name"] = "Ворота";
    JsonObject relay1 = sensors.createNestedObject();
    relay1["id"] = "Relay1";
    relay1["value"] = id(living1).state;
    relay1["unit"] = "on/off";
    relay1["name"] = "Реле1";
    JsonObject relay2 = sensors.createNestedObject();
    relay2["id"] = "Relay2";
    relay2["value"] = id(living2).state;
    relay2["unit"] = "on/off";
    relay2["name"] = "Реле2";
     
    Последнее редактирование: 11 мар 2026