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:
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ć.
Nie korzystam z tego ale duże brawa za dobry tutorial .
Musisz zmienić swoje udostępnione kody https://pastebin
na publiczne
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
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.