UPC Polska sterowanie z poziomu HA

o super, że jest szansa - jesteś w stanie wsdzić całość a i pewnie instrukcje dla idioty krok po kroku dać? Tak pytam bo czuje, że będzie ciężko.

Na pierwszy rzut wrzucam kod ESPHome dla jednego z nadajników IR których używam (prosty układzik z esp01+tranzystorek+LEDy IR). Format danych jaki wysyłam do tych nadajników będzie później w NR przedstawiony.

substitutions:
  devicename: dp-urc
  upper_devicename: "DP - Universal remote control"
  upper_devicename_nospace: "DP-Universal-Remote-Control"

esphome:
  name: ${devicename}
  platform: ESP8266
  board: esp01_1m


logger:
#  level: NONE
#  level: ERROR
#  level: WARN
#  level: INFO
  level: DEBUG
#  level: VERBOSE
#  level: VERY_VERBOSE


api:
  reboot_timeout: 360s
  services:
    - service: kod_nec
      variables:
        adres_przycisku: string
        kod_przycisku: string
        powtorzenia: int
        opoznienie_powtorzenia: string
      then:
        - remote_transmitter.transmit_nec:
            transmitter_id: universal_remote_control
            address: !lambda 'return strtoul(adres_przycisku.c_str(), nullptr, 16);'
            command: !lambda 'return strtoul(kod_przycisku.c_str(), nullptr, 16);'
            repeat:
              times: !lambda 'return powtorzenia;'
              wait_time: !lambda 'return strtoul(opoznienie_powtorzenia.c_str(), nullptr, 16);'
    - service: kod_samsung_32bity
      variables:
        adres_przycisku: string #dummy - zeby wszystkie services mialy takie same parametry
        kod_przycisku: string
        powtorzenia: int
        opoznienie_powtorzenia: string
      then:
        - remote_transmitter.transmit_samsung:
            transmitter_id: universal_remote_control
            data: !lambda 'return strtoul(kod_przycisku.c_str(), nullptr, 16);'
            nbits: 32
            repeat:
              times: !lambda 'return powtorzenia;'
              wait_time: !lambda 'return strtoul(opoznienie_powtorzenia.c_str(), nullptr, 16);'
    - service: kod_raw_38khz
      variables:
        adres_przycisku: string #dummy - zeby wszystkie services mialy takie same parametry
        kod_przycisku: int[]
        powtorzenia: int
        opoznienie_powtorzenia: string
      then:
        - remote_transmitter.transmit_raw:
            transmitter_id: universal_remote_control
            carrier_frequency: 38kHz
            code: !lambda 'return kod_przycisku;'
            repeat:
              times: !lambda 'return powtorzenia;'
              wait_time: !lambda 'return strtoul(opoznienie_powtorzenia.c_str(), nullptr, 16);'
    - service: kod_lg_32bity
      variables:
        adres_przycisku: string #dummy - zeby wszystkie services mialy takie same parametry
        kod_przycisku: string
        powtorzenia: int
        opoznienie_powtorzenia: string
      then:
        - remote_transmitter.transmit_lg:
            transmitter_id: universal_remote_control
            data: !lambda 'return strtoul(kod_przycisku.c_str(), nullptr, 16);'
            nbits: 32
            repeat:
              times: !lambda 'return powtorzenia;'
              wait_time: !lambda 'return strtoul(opoznienie_powtorzenia.c_str(), nullptr, 16);'


ota:
  password: !secret ota_password


wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password
  reboot_timeout: 5min
  use_address: 192.168.1.99
  fast_connect: on

  manual_ip:
    static_ip: 192.168.1.99
    gateway: 192.168.1.1
    subnet: 255.255.255.0
    dns1: 192.168.1.1


### PRG


binary_sensor:
  - platform: status
    name: ${upper_devicename}
    id: sensor_status


text_sensor:
  - platform: template
    name: "${upper_devicename} - Uptime"
    id: uptime_human
    icon: mdi:clock-outline
  - platform: template
    name: "${upper_devicename} - Siła sygnału WiFi"
    id: wifi_percentage
    icon: mdi:wifi


time:
  - platform: sntp
    id: sensor_time
    timezone: "Europe/Warsaw"
    servers: [ 0.pl.pool.ntp.org, 1.pl.pool.ntp.org ]


sensor:
  - platform: uptime
    id: uptime_sensor
    update_interval: 5s
    internal: true
    on_raw_value:
      then:
        - text_sensor.template.publish:
            id: uptime_human
            state: !lambda |-
              int seconds = round(id(uptime_sensor).raw_state);
              int days = seconds / (24 * 3600);
              seconds = seconds % (24 * 3600);
              int hours = seconds / 3600;
              seconds = seconds % 3600;
              int minutes = seconds /  60;
              seconds = seconds % 60;
              return (
                (days ? String(days) + "d " : "") +
                (hours ? String(hours) + "h " : "") +
                (minutes ? String(minutes) + "m " : "") +
                (String(seconds) + "s")
              ).c_str();
  - platform: wifi_signal
    id: wifi_sensor
    update_interval: 5s
    internal: true
    on_raw_value:
      then:
        - text_sensor.template.publish:
            id: wifi_percentage
            state: !lambda |-
              int moc = round(id(wifi_sensor).raw_state);
              moc = 2 * (moc + 100);
              if (moc > 100) { moc = 100; };
              return ((moc ? String(moc) + "%" : "")).c_str();


remote_transmitter:
  id: universal_remote_control
  pin: GPIO3
  carrier_duty_percent: 50%


switch:
  - platform: restart
    name: "${upper_devicename} - Restart"
    id: switch_restart

Edit:

I poniżej flow do którego wrzuciłem całość obsługi IR której używam.
Na początku macie kilka injectów które pozwalają włączyć/wyłączyć dekoder, oraz wyslać kody przycisków 1 i 2, a także 2 injecty zmieniające program (na podstawie nazwy programu).

Na dzień dobry musicie włączyć sobie zapis contextu na dysk (w zasadzie jest to zalecane, żeby pomiędzy restartami zapamiętać który kod z pary ma być wysłany następny).
U mnie w settings.js to wygląda tak:

  contextStorage: {
    default: "RAM",
    RAM: { module: 'memory' },
    HDD: { module: 'localfilesystem' }
  },

później w kodzie macie np tak:

var wersja_kodu_do_wyslania = context.get(msg.payload.pomieszczenie_long + ".dekoder_upc.wersja_kodu_do_wyslania", 'HDD') || 'A';

co odczytuje z contextu na dysku wartość A lub B do zmiennej - jeśli jeszcze nie była tam zapisana to domyślnie przypisuje jej wartość A.

co w NR wygląda mniej więcej tak:
image

kod do importu w NR:
https://pastebin.com/q4jCw4xP

EDIT: mała uwaga - listy kanałów (czyli funkcji która tłumaczy nazwę kanału na jego numer w zależności od posiadanego dekodera) nie aktualizowałem dłuższy czas - ale większość powinna działać.

1 polubienie

Nie korzystam z tego ale duże brawa za dobry tutorial .
Musisz zmienić swoje udostępnione kody https://pastebin na publiczne
Screenshot - 20.05.2023 , 02_45_19
Masz ustawione Private

Heh… przeoczyłem to… sorki… już powinno być dostępne.

A czy jak mam Broadlink RM4 jako nadajnik to jest szansa żeby śmigało czy nie bardzo?

Na 95% powiem, że po zmianie kodów, urządzenia nadawczego oraz formatu danych do niego wysyłanych to tak.
Miałem nawet kiedyś RM4 i RM3 mini, ale poszły na sprzedaż. Było to dość dawno także nie pamiętam jak wyglądała tam sytuacja z nadawaniem.

EDIT:

Sorki za opóźnienie - cóż, przy dwójce małych dzieci w domu czasu coraz mniej na rzeczy DIY.
Ale zacznijmy może od początku…

Na pewno każdemu kto zdecyduje się korzystać z mojego rozwiązania będzie potrzebny czytnik kodów IR… więc zaczynamy od tego.

Co nam będzie potrzebne…

  • esp01/esp01s
  • przetwornica “mini-360” (rozmiar tego to ~12x18mm - wystarczy wpisać w googlach “step down mini 360” a na pewno znajdziecie)
  • moduł z wyprowadzeniami i portem usb (google → “usb pcb board”)
  • odbiornik podczerwieni na 38kHz (ja korzystam z czegoś nazwanego VS1838B)
  • jakaś obudowa, żeby to schować (Fusion)

Na esp01 wrzucamy program ESPHome: https://pastebin.com/4VYTWz6i - najpierw oczywiście dostosowujemy konfiguracje sieci itp pod siebie.

Teraz trochę zabawy:

  • Płytkę z wyprowadzeniami portu USB podłączamy na IN+/IN- przetwornicy mini 360.
  • Przed podłączeniem reszty ustawiamy na wyjściu przetwornicy 3.3V
  • Do OUT- przetwornicy podłączamy: GND esp01 oraz GND odbiornika IR
  • Do OUT+ przetwornicy podłączamy: VCC oraz Ch_EN esp01 oraz VCC odbiornika IR
  • Wyjście odbiornika IR podłączamy pod GPIO2 esp01




Moja obudowa jest bardzo ciasna i trzeba składać i lutować część rzeczy w obudowie - ale działa :wink:

Po złożeniu wszystkiego wchodzimy w przeglądarce na adres odbiornika i w logach odczytujemy kody, które zostały zdekodowane. Wszystkie moje kody, które zamieściłem/zamieszczę w tym temacie zostały odczytane za pomocą tego czytnika (oprócz kilku uniwersalnych znalezionych na necie, ale to inna bajka).

NADAJNIKI:

Co potrzebujemy:

  • esp01/esp01s
  • przetwornica “mini-360” (jak wyżej)
  • 2szt. jakichś n-mosfetów logic level (ja użyłem 21N05L - także możecie szukać czegoś o podobnej specyfikacji - ważne żeby były logic level)
  • 2szt. rezystorów 1kOhm
  • 2szt. rezystorów 10kOhm
  • 2szt. rezystorów 22Ohm
  • 10szt. LEDów IR 940nm (ja użyłem TSAL6400)
  • zasilanie 12V
  • jakaś obudowa (Fusion)

Na esp01 wrzucamy program ESPHome: https://pastebin.com/kNt8DAms po dopasowaniu opcji sieci itp.

I zaczynamy zabawę:

  • zasilanie +12V/GND podłączamy na wejście mini-360 i ustawiamy 3.3V na wyjściu
  • zasilanie +12V podłączamy na końcach obu szeregów LEDów
  • zasilanie 3.3V z przetwornicy podłączamy pod VCC oraz Ch_EN esp01, oraz GND pod GND
  • GND wpinamy w oba tranzystory (source)
  • GND przez 10kOhm wpinamy w oba tranzystory (gate)
  • sygnał z GPIO3 esp01 wpinamy przez 1kOhm w oba tranzystory (gate)
  • wyjście z tranzystorów wpinamy przez 22Ohm w początki obu szeregów LEDów (drain)




Po złożeniu wrzucamy kod do NR. Korygujemy nazwy usług na te które nadaliśmy w konfiguracji powyżej i używamy. Poniżej mój pełny kod do obsługi “uniwersalnego pilota”.
IR - obsluga
Test flow dla IR
Inne testy

Pierwsze to flow do obsługi nadajników, a test flow to flow uruchamiający całość - pokazuje jaki format danych itp przyjmuje flow do obsługi. Inne testy to mój flow testowy, który też się może Wam przydać. Jest na nim pokazana obsługa 3 nadajników.

Miłej zabawy.

2 polubienia