178 Commits

Author SHA1 Message Date
GrKoR
efa0991dd0 fix: automations play() method fixed 2025-11-27 17:57:13 -08:00
GrKoR
2e0c421c9f fix: removed module dependency" 2025-11-26 23:28:20 -08:00
GrKoR
53414d8ab4 fix: python code generator fix for custom presets & custom fan modes 2025-11-26 21:14:46 -08:00
GrKoR
5a165d3a3d upd: version++ 2025-11-26 18:58:36 -08:00
GK
02887baa04 Merge pull request #187 from nonitex/master
Preserve swing mode and vertical vane position when toggling the othe…
2025-11-26 18:53:38 -08:00
GrKoR
5f9d2c0c0f fix: esphome 2025.11.0 breacing changes 2025-11-26 17:38:20 -08:00
nonitex
7a4bacfb9a Preserve swing mode and vertical vane position when toggling the other axis
Added helper functions to normalize louver states for consistent swing detection across different AUX models. Updated swing mode logic to utilize these helpers for improved clarity and functionality.
2025-10-20 03:52:29 +02:00
GrKoR
c959d7be7e new AC tested: Elgin HWFI30B2IA / HWFE30B2NA 2025-08-04 18:51:33 -07:00
GrKoR
60d6f56fcf upd: version++, CLIMATE_SCHEMA warning fixed 2025-06-30 22:54:30 -07:00
GK
a8eba8882e fix (#152): WARNING Using climate.CLIMATE_SCHEMA is deprecated (PR #174) 2025-06-30 22:51:44 -07:00
GrKoR
96455e5882 fix (#152): WARNING Using climate.CLIMATE_SCHEMA is deprecated 2025-06-30 22:47:39 -07:00
GrKoR
89db23434b fix: exclude local tests from repo 2025-06-30 22:36:59 -07:00
GK
945d2603f1 Merge pull request #173 from GrKoR/esp-idf-support
Esp idf support
2025-06-30 22:05:56 -07:00
GrKoR
6291828cec Merge branch 'master' into esp-idf-support 2025-06-30 22:05:18 -07:00
GrKoR
8dc9f0f478 New ACs tested: Elgin HIFI09C2WA / HIFE09C2CA and Elgin HJFI12C2WB 2025-06-30 20:45:29 -07:00
GK
03e0ee0d9a Merge pull request #172 from GrKoR/GrKoR/issue145
a list of new tested ACs
2025-06-30 19:56:54 -07:00
GrKoR
848fd8f6c1 New AC tested: VORTEX VAI-A 1219F JMRV 2025-06-30 19:55:04 -07:00
GrKoR
e77d49c52a New AC tested: SEVRA SEV-09JO 2025-06-30 19:49:39 -07:00
GrKoR
42fd8d5ba1 New AC tested: Centek CT-65J24 2025-06-30 19:36:39 -07:00
GrKoR
00aa426bfc New AC tested: Centek CT-65FDC07 2025-06-30 19:32:38 -07:00
GrKoR
029d92be96 New AC tested: IGC Freddo S DC Inverter RAS-V12NQR / RAC-V12NQR 2025-06-30 19:29:39 -07:00
GrKoR
d1e64af8a4 New AC tested: Fujico ACF-I07AHRDN1 2025-06-30 19:26:57 -07:00
GrKoR
d238c8b661 New AC tested: AUX ALLD-H18/4R1C / AL-H18/4R1C(U) 2025-06-30 19:24:00 -07:00
GrKoR
140447ceab New AC tested: Royal Clima Renaissance RC-RNC28HN 2025-06-30 19:17:15 -07:00
GrKoR
6920102969 New AC tested: Royal Clima CO-D 24HNI/CO-E 24HNI 2025-06-30 19:13:05 -07:00
GrKoR
f20f89cb93 New AC tested: Scarlett Comfort RRI-09-MPI 2025-06-30 19:06:53 -07:00
GrKoR
6a98c47ada New AC tested: Ballu Orbis BPAC-08 OR/N6 2025-06-30 18:54:19 -07:00
GrKoR
b5e88f7abc New AC tested: Ballu BSW/in-18HN1 / BSW/out-18HN1 2025-06-30 18:49:57 -07:00
GrKoR
a166d18ede New AC tested: Electrolux EACS/I-09HIX-BLACK/N8 2025-06-30 18:43:52 -07:00
GK
7de56fb656 Merge pull request #171 from GrKoR/GrKoR/issue145
New AC: Electrolux EACS/I-07HSK/N3_24Y SKANDI DC INVERTER
2025-06-30 18:34:14 -07:00
GrKoR
cf5c88662d New AC: Electrolux EACS/I-07HSK/N3_24Y SKANDI DC INVERTER
Fixes #145
2025-06-30 18:29:18 -07:00
GrKoR
a7d2a73802 upd: platform keyword was removed according to the esphome ver. 2025.2.0 + minor fixes 2025-02-20 22:20:45 -08:00
GrKoR
078a6b20cf new AC: Ishimatsu: AVK-07I 2025-02-20 21:35:21 -08:00
GrKoR
69eebdb8c8 new AC: AUX ASW-12A3INV/SS 2025-02-20 21:33:03 -08:00
GrKoR
fe00198764 new AC: AUX AUX-09CAA/I / ASW-H09A4/CAR3DI-C3 2025-02-20 21:30:08 -08:00
GrKoR
da5fcd5848 new AC: AUX ALMD-H24/4DR2A / AL-H24/4DR2A(U) 2025-02-20 21:26:42 -08:00
GrKoR
9d4930d290 new AC: AUX ASW-H18E3A4 2025-02-20 21:19:07 -08:00
GrKoR
26ae9c248c new AC: Costway FP10524US-22WH & FP10318US-22WH 2025-02-20 21:13:00 -08:00
GrKoR
e67898997d new AC: Baymak Elegant Plus 9 2025-02-20 21:04:03 -08:00
GrKoR
e158586268 new AC: Ande AND-AMWM-H12(JA) / AND-AM2-H18/4DR3 2025-02-20 20:58:32 -08:00
GrKoR
2d446f88e4 new AC: Arielli ASW-H09B4/FGR3DI-EU 2025-02-20 20:52:12 -08:00
GrKoR
5591b91f7b new AC: AUX AUX-12F3H 2025-02-20 20:48:27 -08:00
GrKoR
551c476549 new AC: Elgin HJFI12C2WB 2025-02-20 20:40:46 -08:00
GrKoR
bdbd1478b7 version++ 2024-10-26 23:25:36 +03:00
GrKoR
9c2daf0615 fix: esp8266 compatibility 2024-10-26 23:25:08 +03:00
GrKoR
3ca873450d fix: String class was changed to std::string as part of esp-idf support 2024-10-26 20:46:01 +03:00
GK
5e1b78df9f Merge pull request #131 from itay-sho/feature/support-esp-idf
feat: support esp-idf
2024-10-26 21:22:06 +04:00
GK
7a252e5955 new AC tested: AUX ASW-H09B7A4 2024-10-26 21:16:30 +04:00
GK
79f23c341d fix: Tornado AC typo 2024-10-26 21:14:25 +04:00
GK
360d274088 Merge pull request #132 from itay-sho/chore/add-tested-acs-to-the-list
docs: adding Tornado ISKA 12 WIFI to the list
2024-10-26 21:12:34 +04:00
Itay Shoshani
973f961e5f docs: adding Tornado ISKA 12 WIFI to the list
adding AUX ASW-H09B7A4 as well, since the tornado is just a sticker to the "real" model.
2024-10-26 17:25:29 +03:00
Itay Shoshani
cf990eb467 fix: using correct int types to reduce compilation warnings / errors
required due to the fact that esp32-c6 compiler raises errors due to that
2024-10-26 09:47:32 +03:00
Itay Shoshani
1c6575a264 feat: support esp-idf 2024-10-26 09:46:26 +03:00
GrKoR
7f68f3fdac new AC tested: Centek CT-65A09 2024-08-03 20:40:44 +03:00
GrKoR
e7bca33f35 new AC tested: Centek CT-65V12 2024-08-03 20:38:27 +03:00
GrKoR
f859e656a4 upd: OTA in examples and tests was changed to match the ESPHome 2024.6.0 2024-07-20 23:01:50 +03:00
GrKoR
5b229da380 new AC tested: AUX ASW-H18A4/QH-R1DI / AS-H18A4/QH-R1DI 2024-07-17 19:32:53 +03:00
GrKoR
656344dda6 new AC tested: ANDE AND-12/FA+ 2024-07-14 17:14:08 +03:00
GrKoR
b10a2f5dab new AC tested: Rinnai RINV25RC 2024-07-13 19:52:31 +03:00
GrKoR
b80f4972f0 new AC tested: AUX AUX-07JO/I / AUX-M3-21LCLH multisplit and AUX-12JO/I / AUX-M3-21LCLHmultisplit 2024-07-13 19:47:57 +03:00
GrKoR
2a38208628 new AC tested: AUX ASW-H12A4/JD-R2DI 2024-07-13 19:33:36 +03:00
GrKoR
07a98e5789 ref: list of tested ACs was reordered 2024-07-13 19:32:47 +03:00
GrKoR
fe323a6f65 new AC tested: AUX AMWM-H07/4R2(J) multisplit and AMWM-H12/4R2(J) multisplit 2024-07-13 18:45:25 +03:00
GrKoR
584ef0d57a new AC tested: AUX ASW-H07A4/JD-R1 2024-07-12 12:54:24 +03:00
GrKoR
d15272f437 new AC tested: Centek CT-65U18 2024-07-02 17:07:37 +03:00
GrKoR
23584bf53a new AC tested: Osaka STVP-12HH3 2024-07-01 10:26:33 +03:00
GrKoR
1b3bcdfa0f new AC tested: RVX RS-12ALS 2024-06-30 12:42:55 +03:00
GrKoR
558922047e delete from AC tested: Energolux SAS12CH1-AI and SAS12Z3-AI 2024-06-30 12:28:59 +03:00
GrKoR
9f362f475b new AC tested: Vertex Falcon-18A 2024-06-30 12:21:53 +03:00
GrKoR
dad7025632 new AC tested: AUX ASW-H12C5C4/JER3DI-B8-2 2024-06-20 01:13:45 +03:00
GrKoR
16824c10cc new AC tested: Baymak Elegant Plus 12 2024-06-20 01:09:04 +03:00
GrKoR
f31cfb3c16 new AC tested: IKON ASW-H12C5C4/HCR3DI-B8 2024-06-20 01:01:08 +03:00
GrKoR
35d0364655 new AC tested: AUX HA-18000BTU 2024-06-20 00:53:44 +03:00
GrKoR
25ab6feb4f new AC tested: Energolux SAS09Z4-AI and SAS18Z4-AI 2024-06-20 00:48:18 +03:00
GrKoR
3f1b31bb52 new AC tested: Centek CT-65X12 2024-06-06 12:53:52 +03:00
GrKoR
06388ebb2c new AC tested: Centek CT-65RDC07, CT-65RDC09, CT-65RDC12, CT-65SDC07, CT-65SDC09, CT-65SDC18 2024-05-24 15:31:23 +03:00
GrKoR
1f11db4ae0 new AC tested: Centek CT-65K07 2024-05-18 20:31:43 +03:00
GrKoR
87f686564e ref: show firmware version at compile time 2024-05-08 02:19:51 +03:00
GrKoR
37c261700b upd: added uptime sensor 2024-05-08 02:09:37 +03:00
GrKoR
789053e4be ref: AP SSID name changed 2024-05-08 02:07:15 +03:00
GrKoR
f8d3714871 new AC tested: Centek CT-65EDC07 2024-05-07 18:45:05 +03:00
GrKoR
e5704ba869 new AC tested: Centek CT-65J09 2024-04-25 18:39:15 +03:00
GrKoR
e3e60e4f4f new AC tested: AUX AMWM-H12/4R3 multisplit 2024-04-21 22:46:53 +03:00
GrKoR
e98c67e75e new AC tested: IGC RAS-V09N2X 2024-04-21 22:29:16 +03:00
GrKoR
3f1e928a09 new AC tested: Centek CT-65FDC09 2024-04-21 21:34:47 +03:00
GrKoR
507fc06813 new AC tested: Mirage EWC121E - CWC121E 2024-04-21 21:23:37 +03:00
GrKoR
a48ec376b1 new AC tested: Royal Clima RC-VNR29HN 2024-04-21 19:26:05 +03:00
GrKoR
c2dfbefbcf new AC tested: Centek CT-65J12 2024-04-21 16:15:00 +03:00
GrKoR
f324cd1a0e upd: hardware description - USB pinout for newer ACs changed 2024-04-21 16:06:01 +03:00
GrKoR
4bd5c4509d new AC: Subtropic SUB-09HN1 tested 2024-04-08 12:15:48 +03:00
GrKoR
8228ee0777 docs: how to use specific version of the component 2024-04-04 17:24:38 +03:00
GrKoR
453f697c48 Doc - Info on 5V pin (RUS) 2024-04-04 17:22:27 +03:00
Najdanovic Ivan
82a17f0247 Descrption for the 5V PIN 2024-04-04 17:22:04 +03:00
Najdanovic Ivan
d14ed9650d new AC tested: Tesla TA35FFML-12410M 2024-04-04 17:21:18 +03:00
GrKoR
e7377604ba new AC tested: AUX ASM-H24LD 2024-04-04 17:20:30 +03:00
GrKoR
2f0f514ea6 new AC tested: AUX ASM-H12LL 2024-04-04 17:19:58 +03:00
GrKoR
394e64e1f8 new AC tested: Ishimatsu AVK-09I 2024-04-04 17:19:32 +03:00
GrKoR
fcbc853835 new AC tested: AUX AWM-09G1V4-X 2024-04-04 17:18:59 +03:00
GrKoR
c8d661377f new AC tested: AUX ASW-H12C5C4/JOR3DI-B8 2024-04-04 17:18:00 +03:00
GrKoR
9c6faeecb8 new AC tested: AUX ASW-H12A4/HA-R2DI 2024-04-04 17:16:10 +03:00
GrKoR
8afa70a999 new: advanced example have slider for power limitation function. 2024-04-04 17:15:38 +03:00
GrKoR
ca9a76124c new AC tested: Ballu BSUI-18HN8 2024-04-04 17:14:46 +03:00
GrKoR
dacd435177 doc update: new USB-connector pinout and voltage 2024-04-04 17:13:54 +03:00
GrKoR
bf8ab77c02 new AC tested: Xigma XG-SJ56RHA-IDU 2024-04-04 17:12:55 +03:00
GrKoR
61cad07acc fix: version++ 2023-11-09 23:14:13 +03:00
GK
3110c482c9 Merge pull request #88 from GrKoR/brokly's_power
fix: inverter power limitation by Brokly
2023-11-10 00:12:07 +04:00
GrKoR
53a886f818 ref: minor fixes of Brokly's changes 2023-11-09 23:07:54 +03:00
GrKoR
2d4162323a Brokly's changes for power limitation 2023-11-01 18:04:16 +03:00
GK
74d555b5e1 Merge pull request #87 from GrKoR/dev
fix: inverter power limitation off
2023-10-30 02:06:42 +04:00
GrKoR
7df8ab3cc2 fix: version++ 2023-10-30 01:05:30 +03:00
GrKoR
90d9a5cfa7 fix: inverter power limitation off 2023-10-28 22:42:04 +03:00
GrKoR
864ad07699 new AC tested: Ballu BSW-09HN1, Ballu BSW-12HN1 2023-10-17 01:18:16 +03:00
GrKoR
e595a4acf9 new AC tested: Roda RS-AL24F 2023-10-15 22:44:04 +03:00
GrKoR
3db80a19b7 fix: version++ 2023-10-12 21:34:11 +03:00
GK
b7a794e52b Merge pull request #84 from GrKoR:dev
new: Fahrenheit support for temperatures
2023-10-12 22:27:30 +04:00
GrKoR
ba9f41d3be fix: better handle fractional setpoints by KazWolfe 2023-10-12 21:17:02 +03:00
GrKoR
93a034f2be Merge remote-tracking branch 'refs/remotes/origin/dev' into dev 2023-10-12 18:10:19 +03:00
GrKoR
151e5af043 new: Fahrenheit support 2023-10-12 18:03:32 +03:00
GrKoR
f143240089 ref: made the code a bit prettier 2023-10-12 18:03:32 +03:00
GrKoR
dfc299b321 new AC tested: AUX ASW-H12U3/JIR1DI-US 2023-10-12 18:01:06 +03:00
GrKoR
8acae30989 new: Fahrenheit support 2023-10-12 17:44:07 +03:00
GrKoR
58f09bd280 ref: made the code a bit prettier 2023-10-12 17:11:24 +03:00
GK
70d127a302 Merge pull request #83 from KazWolfe/patch-1
fix: Better handle fractional setpoints
2023-10-12 17:23:07 +04:00
GrKoR
7765e080d2 fix: variable name misprint 2023-10-11 23:39:00 +03:00
GK
33f6dd6ef0 new AC tested: Argo (models: Greenstyle 9000 / 12000 / 18000) 2023-10-09 23:58:27 +04:00
KazWolfe
1fa581be3d fix: Better handle fractional setpoints 2023-10-07 18:37:34 -07:00
GK
5fab934d8c Merge pull request #82 from ilkarataev/patch-1 2023-09-22 18:05:20 +04:00
Ilia Karataev
92b9908bf3 Update AC_TESTED.md
Add tested conditioner
2023-09-22 16:59:35 +04:00
GK
be67e1e4ce new model tested: TOYOTOMI SONZAI THN/THG-A35SZ 2023-09-13 18:47:10 +04:00
GrKoR
c10d314581 new model tested: VOX IJO09-SC4D 2023-09-13 00:15:40 +03:00
GrKoR
fa05c40677 upd: version++ 2023-07-07 16:36:53 +03:00
GrKoR
92b3930413 upd: readme for optimistic mode (RU) 2023-07-07 16:35:33 +03:00
GK
6bfb9489bd Merge pull request #77 from bogdal/optimistic-mode
Make optimistic mode configurable
2023-07-07 17:22:21 +04:00
Adam Bogdał
c868e5b49b Make optimistic mode configurable 2023-07-03 21:46:47 +02:00
GrKoR
cdd97b8da3 new model tested: VOX IVA5-12JR1 2023-06-10 19:36:19 +04:00
GK
9c7be5ffc0 Merge pull request #75 from gleba/master
new AC: CENTEK CT-65V24 + fix of example
2023-06-03 17:36:48 +04:00
Gleb Y Panteleev
20f3061d12 new AC tested: CENTEK CT-65V24 2023-06-03 06:44:23 +03:00
Gleb Y Panteleev
945cc96ea2 fix: The name of sensor was changed in v.0.2.9
from 'invertor_power' to 'inverter_power'. Update your config please.
2023-06-02 23:18:02 +03:00
GrKoR
fcd5a97210 new AC tested: Бирюса B-07DPR/B-07DPQ 2023-06-01 21:58:08 +04:00
GrKoR
8b17ca7052 docs upd: how to request a feature 2023-05-22 15:29:53 +04:00
GK
935e97e795 Merge pull request #73 from glebsterx:master
mistypings in documentation + new doc (how to request a feature)
2023-05-22 15:01:44 +04:00
GrKoR
a0b8dcdce1 new model tested: Energolux SAS07L2-A 2023-05-22 14:47:31 +04:00
GrKoR
affb3bde06 new model tested: Energolux SAS09B3-A 2023-05-22 14:17:38 +04:00
GK
b6d09a132e fix: incorrect space in config (en) 2023-05-22 13:31:49 +04:00
GK
579b6aaf87 fix: incorrect space in config 2023-05-22 13:30:41 +04:00
GK
7013acef59 new AC tested: Centek CT-65F12 2023-05-22 13:26:02 +04:00
Gleb
f6f7887fe7 Update README-EN.md 2023-05-22 12:07:14 +03:00
Gleb
0b774546e8 Update README.md 2023-05-22 12:06:06 +03:00
Gleb
1031f6a885 Create HOW_TO_FEATURE_REQUEST-EN.md 2023-05-22 11:48:07 +03:00
Gleb
abf9c15c39 Merge branch 'GrKoR:master' into master 2023-05-22 11:40:20 +03:00
Gleb
31af2c546c Create HOW_TO_FEATURE_REQUEST.md 2023-05-22 11:39:20 +03:00
Gleb
db23c365db Update README-EN.md 2023-05-22 10:08:08 +03:00
Gleb
eb202e2f49 Update HARDWARE.md 2023-05-22 10:00:58 +03:00
GrKoR
abb9188642 new model tested: Centek CT-65U13 2023-05-22 01:14:14 +04:00
Gleb
276d8ef7a7 Update HARDWARE-EN.md 2023-05-21 00:16:43 +03:00
Gleb
78ec13f9f9 Update HARDWARE.md 2023-05-21 00:16:33 +03:00
Gleb
1c04078b57 Update HARDWARE.md 2023-05-21 00:13:18 +03:00
Gleb
d776dcf4fe Update HARDWARE-EN.md 2023-05-21 00:04:12 +03:00
Gleb
22e64b647c Update README-EN.md 2023-05-20 23:56:00 +03:00
Gleb
c6a800cdcd Update README.md 2023-05-20 23:12:10 +03:00
GrKoR
ba2a19e564 fix: yet another typing error 2023-05-20 23:32:27 +04:00
GrKoR
135d6b55a8 fix: typing error 2023-05-20 23:13:23 +04:00
GrKoR
a465dbc89a new model tested: iClima ICI-09A/IUI-09A 2023-05-20 23:05:14 +04:00
GrKoR
efe7c1a93a new AC: IGC RAS-07AX/RAC-07AX 2023-05-14 18:22:23 +04:00
GrKoR
13bb0baa69 Added link for AUX Aegean Sea ( 爱琴海 ) connection 2023-03-31 16:46:21 +04:00
GrKoR
62e83cb41b Chinese AUX family Aegean Sea(爱琴海) was tested 2023-03-31 16:35:54 +04:00
GK
e9cad615fb new AC: AUX ASW-HxxB4/JD-R1DI (ASW-H12B4/JD-R2DI) 2023-03-19 22:25:59 +04:00
GrKoR
4274a11ed5 USB connection was described 2023-03-11 17:29:15 +04:00
GK
a8b6f7c9e0 USB connection described 2023-03-11 16:51:50 +04:00
GK
766a4bd693 USB pinout image 2023-03-11 16:45:44 +04:00
GK
8d782b1070 Delete USB pinout.png 2023-03-11 16:45:00 +04:00
GK
7640cca9f2 USB pinout image 2023-03-11 16:42:35 +04:00
GrKoR
cc4a48f964 new models + minor fix 2023-02-22 20:56:05 +04:00
GK
18ca3cf72a v.0.2.10 - fractional part of target temperature fixed
fixed: target temperature frac part;
fixed: power limit when off
2023-02-04 02:56:57 +04:00
GrKoR
ad810b1a83 fix: bug with int part of target temperature 2023-02-04 02:29:47 +04:00
GrKoR
11a3440a56 test configs was changed according to v.0.2.9 syntax 2023-02-03 17:52:25 +04:00
GrKoR
6d4a4268e6 fixed: target temperature frac part; power limit when off 2023-02-03 17:45:12 +04:00
GrKoR
5bad8732e2 fw version updated 2023-02-03 14:55:50 +04:00
23 changed files with 4050 additions and 4152 deletions

2
.gitignore vendored
View File

@@ -12,6 +12,6 @@
**/livingroom_ac/ **/livingroom_ac/
**/kitchen_ac/ **/kitchen_ac/
/examples/*/*.h /examples/*/*.h
**/tests/test_*
**/__pycache__ **/__pycache__
**/private/ **/private/
**/tests

View File

@@ -2,15 +2,15 @@
For communication about this project [please join this telegram chat](https://t.me/aux_ac). For communication about this project [please join this telegram chat](https://t.me/aux_ac).
For issues or feature requests, please go to [the issue section](https://github.com/GrKoR/esphome_aux_ac_component/issues). It will be perfect if you attach log to your issue. Log you can collect with [this python script](https://github.com/GrKoR/ac_python_logger). It helps you to save all data frames from the UART bus to a csv-file. This log combined with the detailed situation description will significantly speed up bug correction. For issues or feature requests, please go to [the issue section](https://github.com/GrKoR/esphome_aux_ac_component/issues). It will be perfect if you attach log to your issue. Log you can collect with [this python script](https://github.com/GrKoR/ac_python_logger). It helps you to save all data frames from the UART bus to a csv-file. This log combined with the detailed situation description will significantly speed up bug correction.
There is also a [detailed instruction describing how to properly request a feature](docs/HOW_TO_FEATURE_REQUEST-EN.md).
## DISCLAIMER ## ## DISCLAIMER ##
1. All data of this project (software, firmware, schemes, 3d-models etc.) are provided **'AS IS'**. Everything you do with your devices, you are doing at your own risk. If you don't strongly understand what you are doing, just buy wifi-module from your air conditioner manufacturer. 1. All data of this project (software, firmware, schemes, 3d-models etc.) are provided **'AS IS'**. Everything you do with your devices, you are doing at your own risk. If you don't strongly understand what you are doing, just buy Wi-Fi module from your air conditioner manufacturer.
2. I am not a programmer. So source code is certainly not optimal and badly decorated (but there are a lot of comments in it; sorry, a significant part of it is in Russian). Also, code may be written unsafe. I tried to test all parts of the code, but I'm sure I missed a lot of things. So treat it with suspicion, expect a trick from it, and if you discover something wrong write an issue here. 2. I am not a programmer. So source code is certainly not optimal and badly decorated (but there are a lot of comments in it; sorry, a significant part of it is in Russian). Also, code may be written unsafe. I tried to test all parts of the code, but I'm sure I missed a lot of things. So treat it with suspicion, expect a trick from it, and if you discover something wrong write an issue here.
3. Russian and English readme files are substantially identical in meaning. But in case of differences, the [Russian](https://github.com/GrKoR/esphome_aux_ac_component#readme) version is more significant. 3. Russian and English readme files are substantially identical in meaning. But in case of differences, the [Russian](https://github.com/GrKoR/esphome_aux_ac_component#readme) version is more significant.
## Short description ## ## Short description ##
This custom component allows you to control your air conditioner through wifi if it is made in the AUX factory.<br /> This custom component allows you to control your air conditioner through Wi-Fi if it is made in the AUX factory.<br />
Component tested with ESPHome 1.18.0 and Rovex ALS1 air conditioner. It looks like many other air conditioners can be controlled by `aux_ac`, but this possibility isn't tested. See list of tested ACs below for more details. Component tested with ESPHome 1.18.0 and Rovex ALS1 air conditioner. It looks like many other air conditioners can be controlled by `aux_ac`, but this possibility isn't tested. See list of tested ACs below for more details.
@@ -21,32 +21,22 @@ There is the following list of AUX-based air conditioner on the internet: AUX, A
### List of compatible ACs (tested) ### ### List of compatible ACs (tested) ###
[The list of tested ACs](docs/AC_TESTED.md) is placed in a separate file and includes tested by the author or by users ACs. This list is permanently updated, mainly based on feedback from users in [Telegram chat](https://t.me/aux_ac).<br /> [The list of tested ACs](docs/AC_TESTED.md) is placed in a separate file and includes tested by the author or by users ACs. This list is permanently updated, mainly based on feedback from users in [Telegram chat](https://t.me/aux_ac).<br />
If your AC is not in the list
If your AC is listed above you should take a closer look at aux_ac.
If the User Manual of your HVAC describes connection to wifi with mobile app ACFreedom it seems you may go deeper with aux_ac. But try all soft and hardware for your own risk. You must clearly understand what you are doing.
If you are unsure it is better to wait while other users will test your model of AC (but it may never). Or please go to telegram-chat with your questions. Maybe you will get help there.
If you have tested your air conditioner and aux_ac works with it please let me know about it. I'll add this info to the list of tested ACs above. The best way to report about your test results is write a message in the telegram or in the issue section.
How to use it
For correct component operation you need hardware and firmware. The hardware description is located in separate file.
Firmware: Integration aux_ac to your configuration
You need ESPHome v.1.18.0 or above. External_components have appeared in this version. But it is better to use ESPHome v.1.20.4 or above cause there was alot of external_components errors corrected before this version.
### If your AC is not in the list ### ### If your AC is not in the list ###
If your AC is listed above, you should take a closer look at `aux_ac`.<br /> 1. If your AC is listed above, you should take a closer look at `aux_ac`.<br />
If the User Manual of your HVAC describes connection to wifi with mobile app ACFreedom it seems you may go deeper with `aux_ac`. But try all soft and hardware for your own risk. You must clearly understand what you are doing.<br /> 2. If something about AUX is written on the nameplate of the air conditioner in the manufacturer line.<br />
If you are unsure, it is better to wait while other users will test your model of AC (but it may never). Or please [go to telegram-chat](https://t.me/aux_ac) with your questions. Maybe you will get help there. 3. If the User Manual of your HVAC describes connection to Wi-Fi with mobile app ACFreedom it seems you may go deeper with `aux_ac`. But try all soft and hardware for your own risk. You must clearly understand what you are doing.<br />
4. If the manufacturer of your AC offers a CTTM-40X24-WIFI-AKS Wi-Fi module (left) or the one in the photo on the right for control. Moreover, the right module can be either with a USB connector or with a 5-pin connector.<br />
If you have tested your air conditioner and `aux_ac` works with it, please let me know about it. I'll add this info to the list of tested ACs above. <img src="https://user-images.githubusercontent.com/57137862/172053621-60fe39d8-066e-44fa-91c5-725fa1f5c3bc.png" height="300"> <img src="https://user-images.githubusercontent.com/57137862/172053744-8ce4a13d-28cb-4688-a998-11ca3a7129df.png" height="300">
The best way to report about your test results is writing a message in the [telegram](https://t.me/aux_ac) or [in the issue section](https://github.com/GrKoR/esphome_aux_ac_component/issues).
If you are unsure, it is better to wait while other users will test your model of AC (maybe never). Or please [go to telegram-chat](https://t.me/aux_ac) with your questions. Maybe you will get help there.<br />
If you have tested your air conditioner and `aux_ac` works with it, please let me know about it. I'll add this info to the list of tested ACs above.<br />
The best way to report about your test results is writing a message in the [telegram](https://t.me/aux_ac) or [in the issue section](https://github.com/GrKoR/esphome_aux_ac_component/issues).<br />
## How to use it ## ## How to use it ##
For correct component operation, you need hardware and firmware. The hardware description is located [in a separate file](docs/HARDWARE-EN.md). For correct component operation, you need hardware and firmware. The hardware description is located [in a separate file](docs/HARDWARE-EN.md).
### Firmware: Integration aux_ac to your configuration ### ### Firmware: Integration aux_ac to your configuration ###
You need [ESPHome](https://esphome.io) v.1.18.0 or above. `External_components` have appeared in this version. But it is better to use ESPHome v.1.20.4 or above, cause there were a lot of `external_components` errors corrected before this version. You need [ESPHome](https://esphome.io) v.2025.2.0 or above. You can try esphome before 2025.2.0 but I can't guarantee error-free compilation of the examples.
## Installing ## ## Installing ##
1. Declare external component. Read [the manual](https://esphome.io/components/external_components.html?highlight=external) for details. 1. Declare external component. Read [the manual](https://esphome.io/components/external_components.html?highlight=external) for details.
@@ -56,6 +46,14 @@ external_components:
type: git type: git
url: https://github.com/GrKoR/esphome_aux_ac_component url: https://github.com/GrKoR/esphome_aux_ac_component
``` ```
In case you need a specific version of the component, you can use the component declaration from the example below. The example uses version 0.2.14 of the component. You can find a list of available versions [on the GitHub tags page](https://github.com/GrKoR/esphome_aux_ac_component/tags).
```yaml
external_components:
- source:
type: git
url: https://github.com/GrKoR/esphome_aux_ac_component
ref: v.0.2.14
```
2. Configure UART to communicate with air conditioner: 2. Configure UART to communicate with air conditioner:
```yaml ```yaml
uart: uart:
@@ -99,7 +97,8 @@ climate:
period: 7s period: 7s
show_action: true show_action: true
display_inverted: false display_inverted: false
timeout: 150 timeout: 150
optimistic: true
indoor_temperature: indoor_temperature:
name: AC Indoor Temperature name: AC Indoor Temperature
id: ac_indoor_temp id: ac_indoor_temp
@@ -110,11 +109,11 @@ climate:
id: ac_outdoor_temp id: ac_outdoor_temp
internal: false internal: false
outbound_temperature: outbound_temperature:
name: AC Colant Outbound Temperature name: AC Coolant Outbound Temperature
id: ac_outbound_temp id: ac_outbound_temp
internal: false internal: false
inbound_temperature: inbound_temperature:
name: AC Colant Inbound Temperature name: AC Coolant Inbound Temperature
id: ac_inbound_temp id: ac_inbound_temp
internal: false internal: false
compressor_temperature: compressor_temperature:
@@ -184,7 +183,7 @@ climate:
- **period** (*Optional*, [time](https://esphome.io/guides/configuration-types.html#config-time), default ``7s``): Period between status requests to the AC. `Aux_ac` will receive the new air conditioner status only after a regular request, even if you change the settings of AC using IR-remote. - **period** (*Optional*, [time](https://esphome.io/guides/configuration-types.html#config-time), default ``7s``): Period between status requests to the AC. `Aux_ac` will receive the new air conditioner status only after a regular request, even if you change the settings of AC using IR-remote.
- **show_action** (*Optional*, boolean, default ``true``): Whether to show current action of the device (experimental). For example, in the HEAT-COOL mode, AC hardware may be in one of the following actions: - **show_action** (*Optional*, boolean, default ``true``): Whether to show current action of the device (experimental). For example, in the HEAT_COOL mode, AC hardware may be in one of the following actions:
- HEATING: AC is heating the air in the room; - HEATING: AC is heating the air in the room;
- IDLE: AC is working in the FAN mode, cause the target temperature is reached; - IDLE: AC is working in the FAN mode, cause the target temperature is reached;
- COOLING: AC is cooling the air. - COOLING: AC is cooling the air.
@@ -197,6 +196,8 @@ climate:
The only situation when you can play with timeout is heavily loaded ESP. When you are using your ESP for many hard tasks, it is possible that `aux_ac` does not have enough time to receive AC responses. In this case, you can slightly raise the timeout value. But the best solution would be to remove some of the tasks from the ESP. The only situation when you can play with timeout is heavily loaded ESP. When you are using your ESP for many hard tasks, it is possible that `aux_ac` does not have enough time to receive AC responses. In this case, you can slightly raise the timeout value. But the best solution would be to remove some of the tasks from the ESP.
The timeout is limited to a range from `150` to `600` milliseconds. Other values are possible only with source code modification. But I don't recommend that. The timeout is limited to a range from `150` to `600` milliseconds. Other values are possible only with source code modification. But I don't recommend that.
- **optimistic** (*Optional*, boolean, default ``true``): Whether entity states should be updated immediately after receiving a command from Home Assistant/ESPHome.
- **indoor_temperature** (*Optional*): Parameters of the room air temperature sensor. - **indoor_temperature** (*Optional*): Parameters of the room air temperature sensor.
- **name** (**Required**, string): The name for the temperature sensor. - **name** (**Required**, string): The name for the temperature sensor.
- **id** (*Optional*, [ID](https://esphome.io/guides/configuration-types.html#config-id)): Set the ID of this sensor for use in lambdas. - **id** (*Optional*, [ID](https://esphome.io/guides/configuration-types.html#config-id)): Set the ID of this sensor for use in lambdas.
@@ -226,7 +227,7 @@ climate:
- **inverter_power_limit_state** (*Optional*): Configuration of the power limit state sensor. It displays the state of the power limitation function for the inverter HVAC (is it ON or OFF). All settings are the same as for the **display_state** (see description above). - **inverter_power_limit_state** (*Optional*): Configuration of the power limit state sensor. It displays the state of the power limitation function for the inverter HVAC (is it ON or OFF). All settings are the same as for the **display_state** (see description above).
- **inverter_power_limit_value** (*Optional*): Configuration of the power limit value sensor. All settings are the same as for the **indoor_temperature** (see description above). - **inverter_power_limit_value** (*Optional*): Configuration of the power limit value sensor. All settings are the same as for the **indoor_temperature** (see description above).
It reports the current value of the power limitation function for the inverter HVAC. This sensor represents the value only after the HVAC confirms the power limitation. The value is always in the range from 30 to 100%. This is the hardware limitation. It reports the current value of the power limitation function for the inverter HVAC. This sensor represents the value only after the HVAC confirms the power limitation. The value is always in the range from 30% to 100%. This is the hardware limitation.
- **preset_reporter** (*Optional*): Parameters of text sensor with current preset. All settings are the same as for the **display_state** (see description above). - **preset_reporter** (*Optional*): Parameters of text sensor with current preset. All settings are the same as for the **display_state** (see description above).
ESPHome Climate devices are not reporting their active presets (from **supported_presets** and **custom_presets** lists) to MQTT. This behavior has been noticed at least in version 1.20.0. In case you are using MQTT and want to receive information about active preset, you should declare this sensor in your yaml. ESPHome Climate devices are not reporting their active presets (from **supported_presets** and **custom_presets** lists) to MQTT. This behavior has been noticed at least in version 1.20.0. In case you are using MQTT and want to receive information about active preset, you should declare this sensor in your yaml.
@@ -390,16 +391,16 @@ on_...:
## Simple example ## ## Simple example ##
The source code of this example is located in the [aux_ac_simple.yaml](https://github.com/GrKoR/esphome_aux_ac_component/blob/master/examples/simple/aux_ac_simple.yaml) file. The source code of this example is located in the [aux_ac_simple.yaml](https://github.com/GrKoR/esphome_aux_ac_component/blob/master/examples/simple/aux_ac_simple.yaml) file.
All settings in it is trivial. Just copy the file to your local folder, specify your wifi settings and compile YAML with ESPHome. All settings in it is trivial. Just copy the file to your local folder, specify your Wi-Fi settings and compile YAML with ESPHome.
## Advanced example ## ## Advanced example ##
All sources are located [in advanced example folder](https://github.com/GrKoR/esphome_aux_ac_component/tree/master/examples/advanced). All sources are located [in advanced example folder](https://github.com/GrKoR/esphome_aux_ac_component/tree/master/examples/advanced).
This time we'll configure two relative identical air conditioners with `aux_ac` custom component.<br /> This time we'll configure two relative identical air conditioners with `aux_ac` custom component.<br />
Let's imagine we have ACs in a kitchen and in a living room. All ACs are the same brand and can be controlled by `aux_ac`.<br /> Let's imagine we have ACs in a kitchen and in a living room. Air conditioners can be of the same brand or different brands - the main thing is that they are compatible with `aux_ac` and can be controlled using `aux_ac`.<br />
Because we are lazy, we'll define all common configuration parts for two air conditioners in one `ac_common.yaml` file.<br /> Because we are lazy, we'll define all common configuration parts for two air conditioners in one `ac_common.yaml` file.<br />
All specific parts of configuration are located in the `ac_kitchen.yaml` and `ac_livingroom.yaml`. Here we set `devicename` and `upper_devicename` for correct sensors and component naming. And here we specify the correct IP-address of the device from `secrets.yaml`.<br /> All specific parts of configuration are located in the `ac_kitchen.yaml` and `ac_livingroom.yaml`. Here we set `devicename` and `upper_devicename` for correct sensors and component naming. And here we specify the correct IP address of the device from `secrets.yaml`.<br />
**Don't forget** to specify `wifi_ip_kitchen`, `wifi_ota_ip_kitchen`, `wifi_ip_livingroom` and `wifi_ota_ip_livingroom` in the `secrets.yaml` along with the other sensitive information, such as passwords, tokens etc. **Don't forget** to specify `wifi_ip_kitchen`, `wifi_ota_ip_kitchen`, `wifi_ip_livingroom` and `wifi_ota_ip_livingroom` in the `secrets.yaml` along with the other sensitive information, such as passwords, tokens etc.
If you try to compile `ac_common.yaml` it will raise errors. You need to compile `ac_kitchen.yaml` or `ac_livingroom.yaml` instead. If you try to compile `ac_common.yaml` it will raise errors. You need to compile `ac_kitchen.yaml` or `ac_livingroom.yaml` instead.

View File

@@ -1,17 +1,18 @@
# Кастомный компонент для ESPHome для управления кондиционером по wifi <!--[![GitHub release](https://img.shields.io/github/v/release/GrKoR/esphome_aux_ac_component)](https://github.com/GrKoR/esphome_aux_ac_component/releases/) [![Телеграм](https://img.shields.io/badge/Telegram-2CA5E0?style=flat&logo=telegram&logoColor=white)](https://t.me/aux_ac) --> # Кастомный компонент для ESPHome для управления кондиционером по Wi-Fi <!--[![GitHub release](https://img.shields.io/github/v/release/GrKoR/esphome_aux_ac_component)](https://github.com/GrKoR/esphome_aux_ac_component/releases/) [![Телеграм](https://img.shields.io/badge/Telegram-2CA5E0?style=flat&logo=telegram&logoColor=white)](https://t.me/aux_ac) -->
English readme [is here](README-EN.md#esphome-aux-air-conditioner-custom-component-aux_ac). English readme [is here](README-EN.md#esphome-aux-air-conditioner-custom-component-aux_ac).
Управляет кондиционерами на базе AUX по wifi.<br /> Управляет кондиционерами на базе AUX по Wi-Fi.<br />
По тексту ниже для компонента используется сокращение `aux_ac`. По тексту ниже для компонента используется сокращение `aux_ac`.
Обсудить проект можно [в чате Телеграм](https://t.me/aux_ac).<br /> Обсудить проект можно [в чате Телеграм](https://t.me/aux_ac).<br />
Отзывы о багах и ошибках, а так же запросы на дополнительный функционал оставляйте [в соответствующем разделе](https://github.com/GrKoR/esphome_aux_ac_component/issues). Отзывы о багах и ошибках, а так же запросы на дополнительный функционал оставляйте [в соответствующем разделе](https://github.com/GrKoR/esphome_aux_ac_component/issues).
Будет просто отлично, если к своему сообщению вы добавите лог и подробное описание. Для сбора логов есть [специальный скрипт на Python](https://github.com/GrKoR/ac_python_logger). С его помощью вы сможете сохранить в csv-файл все пакеты, которыми обменивается wifi-модуль и сплит-система. Если такой лог дополнить описанием, в какое время и что именно вы пытались включить, то это сильно ускорит исправление багов. Будет просто отлично, если к своему сообщению вы добавите лог и подробное описание. Для сбора логов есть [специальный скрипт на Python](https://github.com/GrKoR/ac_python_logger). С его помощью вы сможете сохранить в csv-файл все пакеты, которыми обменивается Wi-Fi модуль и сплит-система. Если такой лог дополнить описанием, в какое время и что именно вы пытались включить, то это сильно ускорит исправление багов.
Также есть [подробная инструкция, описывающая как правильно запросить фичу](docs/HOW_TO_FEATURE_REQUEST.md).
## ДИСКЛЭЙМЕР (ОТМАЗКИ) ## ## ДИСКЛЭЙМЕР (ОТМАЗКИ) ##
1. Все материалы этого проекта (программы, прошивки, схемы, 3D модели и т.п.) предоставляются "КАК ЕСТЬ". Всё, что вы делаете с вашим оборудованием, вы делаете на свой страх и риск. Автор не несет ответственности за результат и ничего не гарантирует. Если вы с абсолютной четкостью не понимаете, что именно вы делаете и для чего, лучше просто купите wifi-модуль у производителя вашего кондиционера. 1. Все материалы этого проекта (программы, прошивки, схемы, 3D модели и т.п.) предоставляются "КАК ЕСТЬ". Всё, что вы делаете с вашим оборудованием, вы делаете на свой страх и риск. Автор не несет ответственности за результат и ничего не гарантирует. Если вы с абсолютной четкостью не понимаете, что именно вы делаете и для чего, лучше просто купите Wi-Fi модуль у производителя вашего кондиционера.
2. Я ~~не настоящий сварщик~~ не программер. Поэтому код наверняка не оптимален и плохо оформлен (зато комментариев по коду я разместил от души), местами может быть написан небезопасно. И хоть я и старался протестировать всё, но уверен, что какие-то моменты упустил. Так что отнеситесь к коду с подозрением, ожидайте от него подвоха и если что-то увидели - [пишите в багрепорт](https://github.com/GrKoR/esphome_aux_ac_component/issues). 2. Я ~~не настоящий сварщик~~ не программер. Поэтому код наверняка не оптимален и плохо оформлен (зато комментариев по коду я разместил от души), местами может быть написан небезопасно. И хоть я и старался протестировать всё, но уверен, что какие-то моменты упустил. Так что отнеситесь к коду с подозрением, ожидайте от него подвоха и если что-то увидели - [пишите в багрепорт](https://github.com/GrKoR/esphome_aux_ac_component/issues).
@@ -24,11 +25,11 @@ AUX - это один из нескольких OEM-производителей
[Список протестированных кондиционеров](docs/AC_TESTED.md) размещен в отдельном файле и включает те модели, на которых `aux_ac` был запущен автором компонента или пользователями. Этот список постоянно пополняется, преимущественно по обратной связи от пользователей [в чате Телеграм](https://t.me/aux_ac).<br /> [Список протестированных кондиционеров](docs/AC_TESTED.md) размещен в отдельном файле и включает те модели, на которых `aux_ac` был запущен автором компонента или пользователями. Этот список постоянно пополняется, преимущественно по обратной связи от пользователей [в чате Телеграм](https://t.me/aux_ac).<br />
### Если кондиционер в списке отсутствует ### ### Если кондиционер в списке отсутствует ###
Если ваш кондиционер отсутствует в списке протестированных, то это еще не значит, что его не получится подключить к wifi. Вот основные "звоночки", которые могут говорить о высоких шансах на успех: Если ваш кондиционер отсутствует в списке протестированных, то это еще не значит, что его не получится подключить к Wi-Fi. Вот основные "звоночки", которые могут говорить о высоких шансах на успех:
1. Если производитель вашего кондиционера есть в списке протестированных выше, но модели нет. 1. Если производитель вашего кондиционера есть в списке протестированных выше, но модели нет.
2. Если на шильдике кондиционера в строке производитель написано что-то про AUX или Аукс. 2. Если на шильдике кондиционера в строке производитель написано что-то про AUX или Аукс.
3. Если в инструкции пользователя вашего кондиционера что-то написано про возможность управления по wifi с помощью мобильного приложения ACFreedom. 3. Если в инструкции пользователя вашего кондиционера что-то написано про возможность управления по Wi-Fi с помощью мобильного приложения ACFreedom.
4. Если производитель вашего кондиционера предлагает для управления wifi-модуль CTTM-40X24-WIFI-AKS (слева) или такой, как на фото справа. Причем правый модуль может быть как с USB-разъемом, так и с 5-контактным разъемом. 4. Если производитель вашего кондиционера предлагает для управления Wi-Fi модуль CTTM-40X24-WIFI-AKS (слева) или такой, как на фото справа. Причем правый модуль может быть как с USB-разъемом, так и с 5-контактным разъемом.
<img src="https://user-images.githubusercontent.com/57137862/172053621-60fe39d8-066e-44fa-91c5-725fa1f5c3bc.png" height="300"> <img src="https://user-images.githubusercontent.com/57137862/172053744-8ce4a13d-28cb-4688-a998-11ca3a7129df.png" height="300"> <img src="https://user-images.githubusercontent.com/57137862/172053621-60fe39d8-066e-44fa-91c5-725fa1f5c3bc.png" height="300"> <img src="https://user-images.githubusercontent.com/57137862/172053744-8ce4a13d-28cb-4688-a998-11ca3a7129df.png" height="300">
@@ -42,7 +43,7 @@ AUX - это один из нескольких OEM-производителей
Для работы с кондиционером понадобится "железо" и прошивка. Описание электроники вынесено [в отдельный файл](docs/HARDWARE.md). Для работы с кондиционером понадобится "железо" и прошивка. Описание электроники вынесено [в отдельный файл](docs/HARDWARE.md).
### Прошивка: интеграция aux_ac в вашу конфигурацию ESPHome ### ### Прошивка: интеграция aux_ac в вашу конфигурацию ESPHome ###
Для использования требуется [ESPHome](https://esphome.io) версией не ниже 1.18.0. Именно в этой версии появились `external_components`. Но лучше использовать версию 1.20.4 или старше, так как до этой версии массированно исправлялись ошибки в механизме подключения внешних компонентов.<br /> Для использования требуется [ESPHome](https://esphome.io) версией не ниже 2025.2.0. Работа с более ранними версиями возможна, но не гарантируется.<br />
## Установка ## ## Установка ##
1. Подключите компонент. 1. Подключите компонент.
@@ -53,6 +54,14 @@ external_components:
type: git type: git
url: https://github.com/GrKoR/esphome_aux_ac_component url: https://github.com/GrKoR/esphome_aux_ac_component
``` ```
Если требуется прошить определенную версию компонента, используйте синтаксис из примера ниже. Здесь прошивается версия 0.2.14. Список версий смотрите [в тегах на гитхаб](https://github.com/GrKoR/esphome_aux_ac_component/tags).
```yaml
external_components:
- source:
type: git
url: https://github.com/GrKoR/esphome_aux_ac_component
ref: v.0.2.14
```
2. Настройте UART для коммуникации с вашим кондиционером: 2. Настройте UART для коммуникации с вашим кондиционером:
```yaml ```yaml
uart: uart:
@@ -97,7 +106,7 @@ climate:
period: 7s period: 7s
show_action: true show_action: true
display_inverted: false display_inverted: false
timeout: 150 timeout: 150
indoor_temperature: indoor_temperature:
name: AC Indoor Temperature name: AC Indoor Temperature
id: ac_indoor_temp id: ac_indoor_temp
@@ -108,11 +117,11 @@ climate:
id: ac_outdoor_temp id: ac_outdoor_temp
internal: false internal: false
outbound_temperature: outbound_temperature:
name: AC Colant Outbound Temperature name: AC Coolant Outbound Temperature
id: ac_outbound_temp id: ac_outbound_temp
internal: false internal: false
inbound_temperature: inbound_temperature:
name: AC Colant Inbound Temperature name: AC Coolant Inbound Temperature
id: ac_inbound_temp id: ac_inbound_temp
internal: false internal: false
compressor_temperature: compressor_temperature:
@@ -180,9 +189,9 @@ climate:
- **uart_id** (*Опциональный*, [ID](https://esphome.io/guides/configuration-types.html#config-id)): Укажите ID [шины UART](https://esphome.io/components/uart.html), к которой подключен кондиционер. Если сконфигурирована одна шина, то компонент подключит её автоматически. Если шин несколько, то лучше указать вручную. - **uart_id** (*Опциональный*, [ID](https://esphome.io/guides/configuration-types.html#config-id)): Укажите ID [шины UART](https://esphome.io/components/uart.html), к которой подключен кондиционер. Если сконфигурирована одна шина, то компонент подключит её автоматически. Если шин несколько, то лучше указать вручную.
- **period** (*Опциональный*, [время](https://esphome.io/guides/configuration-types.html#config-time), по умолчанию ``7s``): Период между запросами статуса кондиционера. `Aux_ac` получает новое состояние кондиционера только после регулярного запроса, потому что сам кондиционер об изменении параметров своеё работы не уведомляет. Поэтому нужно запрашивать его, вдруг пользователь установил иной режим работы с помощью ИК-пульта. - **period** (*Опциональный*, [время](https://esphome.io/guides/configuration-types.html#config-time), по умолчанию ``7s``): Период между запросами статуса кондиционера. `Aux_ac` получает новое состояние кондиционера только после регулярного запроса, потому что сам кондиционер об изменении параметров своей работы не уведомляет. Поэтому нужно запрашивать его, вдруг пользователь установил иной режим работы с помощью ИК-пульта.
- **show_action** (*Опциональный*, логическое, по умолчанию ``true``): Показывать ли текущую задачу кондиционера (экспериментальная функция). Например, в режиме HEAT-COOL кондиционер может выполнять одну из следующих задач: - **show_action** (*Опциональный*, логическое, по умолчанию ``true``): Показывать ли текущую задачу кондиционера (экспериментальная функция). Например, в режиме HEAT_COOL кондиционер может выполнять одну из следующих задач:
- НАГРЕВ: нагревает воздух в комнате; - НАГРЕВ: нагревает воздух в комнате;
- ПРОСТОЙ: кондиционер работает в режиме вентилятора для перемешивания воздуха в комнате, поскольку целевая температура уже достигнута; - ПРОСТОЙ: кондиционер работает в режиме вентилятора для перемешивания воздуха в комнате, поскольку целевая температура уже достигнута;
- ОХЛАЖДЕНИЕ: кондиционер охлаждает воздух в комнате. - ОХЛАЖДЕНИЕ: кондиционер охлаждает воздух в комнате.
@@ -195,6 +204,10 @@ climate:
Единственная ситуация, когда вам может пригодиться этот параметр, - это сильно загруженная ESP. Если по какой-то неподдающейся логике причине вы кроме `aux_ac` нагрузили свою ESP кучей дополнительных ресурсоемких задач, то у компонента может просто не хватать времени для оперативного приёма ответов от кондиционера. В этом в логе будут сообщения о том, что последовательность команд была прервана по таймауту. Чтобы это исправить, лучше, конечно, немного разгрузить ESP. Если это вам не подходит, тогда можно увеличить таймаут. Единственная ситуация, когда вам может пригодиться этот параметр, - это сильно загруженная ESP. Если по какой-то неподдающейся логике причине вы кроме `aux_ac` нагрузили свою ESP кучей дополнительных ресурсоемких задач, то у компонента может просто не хватать времени для оперативного приёма ответов от кондиционера. В этом в логе будут сообщения о том, что последовательность команд была прервана по таймауту. Чтобы это исправить, лучше, конечно, немного разгрузить ESP. Если это вам не подходит, тогда можно увеличить таймаут.
Значение таймаута в прошивке ограничено диапазоном от `150` до `600` миллисекунд. Устанавливать значения выше можно только отредактировав исходные коды компонента. Но сильно задирать таймаут не стоит. Кондиционер периодически рассылает пакеты без запроса со стороны `aux_ac` и это приводит к сбою в отправке команды. Значение таймаута в прошивке ограничено диапазоном от `150` до `600` миллисекунд. Устанавливать значения выше можно только отредактировав исходные коды компонента. Но сильно задирать таймаут не стоит. Кондиционер периодически рассылает пакеты без запроса со стороны `aux_ac` и это приводит к сбою в отправке команды.
- **optimistic** (*Опциональный*, логическое, по умолчанию ``true``) В «оптимистичном» режиме компонент не ждёт от кондиционера изменения параметров работы, а сразу после отправки команды в кондиционер сообщает в Home Assistant о новом состоянии. Если кондиционер команду не принял, то спустя несколько секунд eps получит текущее состояние всех систем и отправит в умный дом реальное состояние кондиционера. В итоге, если подавать в кондиционер неподдерживаемые команды, они будут записываться в историю Home Assistant и спустя время сбрасываться сбрасываться.
В «пессимистичном» режиме esp отправляет команду в кондиционер, но об изменении состояний не сообщает до тех пор, пока не получит информацию о фактическом режиме работы кондиционера.
В большинстве случаев разница между этими режимами будет практически незаметна.
- **indoor_temperature** (*Опциональный*): Параметры создаваемого датчика температуры воздуха, если такой датчик нужен - **indoor_temperature** (*Опциональный*): Параметры создаваемого датчика температуры воздуха, если такой датчик нужен
- **name** (**Обязательный**, строка): Имя датчика температуры. - **name** (**Обязательный**, строка): Имя датчика температуры.
- **id** (*Опциональный*, [ID](https://esphome.io/guides/configuration-types.html#config-id)): Можно указать свой ID для датчика для использования в лямбдах. - **id** (*Опциональный*, [ID](https://esphome.io/guides/configuration-types.html#config-id)): Можно указать свой ID для датчика для использования в лямбдах.
@@ -202,7 +215,7 @@ climate:
- Все остальные параметры [сенсора](https://esphome.io/components/sensor/index.html#base-sensor-configuration) ESPHome. - Все остальные параметры [сенсора](https://esphome.io/components/sensor/index.html#base-sensor-configuration) ESPHome.
- **outdoor_temperature** (*Опциональный*): Параметры создаваемого датчика уличной температуры воздуха, если такой датчик нужен. Параметры аналогичны датчику внутренней температуры **indoor_temperature** (см. выше). - **outdoor_temperature** (*Опциональный*): Параметры создаваемого датчика уличной температуры воздуха, если такой датчик нужен. Параметры аналогичны датчику внутренней температуры **indoor_temperature** (см. выше).
> **ВНИМАНИЕ!** Когда кондиционер выключен, температура наружного воздуха обновляется редко (раз в 6-7 часов). Это не баг компонента, а особенность работы железа кондиционера. Единственный способ получать изменения чаще - создать шаблонный сенсор, температуру которого изменять в ручную. Когда кондиционер работает, значение такого сенсора можно копировать из **outdoor_temperature**. Когда кондиционер выключен, значение температуры пересчитывать по динамике сенсора **outbound_temperature** (он изменяется часто и при выключенном кондее показывает значения близкие к температуре воздуха). Заморочки с пересчетом нужны потому, что показания сенсоров не идентичны и на графике значений шаблонного сенсора могут быть ступеньки при переходе с **outdoor_temperature** на **outbound_temperature** и обратно. > **ВНИМАНИЕ!** Когда кондиционер выключен, температура наружного воздуха обновляется редко (раз в 6-7 часов). Это не баг компонента, а особенность работы железа кондиционера. Единственный способ получать изменения чаще - создать шаблонный сенсор, температуру которого изменять вручную. Когда кондиционер работает, значение такого сенсора можно копировать из **outdoor_temperature**. Когда кондиционер выключен, значение температуры пересчитывать по динамике сенсора **outbound_temperature** (он изменяется часто и при выключенном кондее показывает значения близкие к температуре воздуха). Заморочки с пересчетом нужны потому, что показания сенсоров не идентичны и на графике значений шаблонного сенсора могут быть ступеньки при переходе с **outdoor_temperature** на **outbound_temperature** и обратно.
- **inbound_temperature** (*Опциональный*): Параметры создаваемого датчика температуры на подаче теплоносителя, если такой датчик нужен. Параметры аналогичны датчику внутренней температуры **indoor_temperature** (см. выше). - **inbound_temperature** (*Опциональный*): Параметры создаваемого датчика температуры на подаче теплоносителя, если такой датчик нужен. Параметры аналогичны датчику внутренней температуры **indoor_temperature** (см. выше).
@@ -230,7 +243,7 @@ climate:
- **preset_reporter** (*Опциональный*): Параметры создаваемого текстового датчика текущего активного пресета. Параметры аналогичны датчику дисплея **display_state**. - **preset_reporter** (*Опциональный*): Параметры создаваемого текстового датчика текущего активного пресета. Параметры аналогичны датчику дисплея **display_state**.
Климатические устройства ESPHome не отправляют по MQTT активный пресет (см. **supported_presets** и **custom_presets**), в котором работает устройство. Если вы используете MQTT и хотите получать информацию о пресетах, то пропишите этот датчик в конфигурации. Климатические устройства ESPHome не отправляют по MQTT активный пресет (см. **supported_presets** и **custom_presets**), в котором работает устройство. Если вы используете MQTT и хотите получать информацию о пресетах, то пропишите этот датчик в конфигурации.
- **vlouver_state** (*Опциональный*): Параметры создаваемого сенсора состояния вертикальных жалюзи. Параметры аналогичны датчику дисплея **display_state**. Состояние желюзи кодируется целочисленными значениями (подробнее смотри [aux_ac.vlouver_set action](#aux_ac_._vlouver_set) ниже). - **vlouver_state** (*Опциональный*): Параметры создаваемого сенсора состояния вертикальных жалюзи. Параметры аналогичны датчику дисплея **display_state**. Состояние жалюзи кодируется целочисленными значениями (подробнее смотри [aux_ac.vlouver_set action](#aux_ac_._vlouver_set) ниже).
- **supported_modes** (*Опциональный*, список): Список поддерживаемых режимов работы. Возможные значения: ``HEAT_COOL``, ``COOL``, ``HEAT``, ``DRY``, ``FAN_ONLY``. Обратите внимание: некоторые производители кондиционеров указывают на пульте режим AUTO, хотя по факту этот режим не работает по расписанию и только лишь поддерживает целевую температуру. Такой режим в ESPHome называется HEAT_COOL. По умолчанию список содержит только значение ``FAN_ONLY``. - **supported_modes** (*Опциональный*, список): Список поддерживаемых режимов работы. Возможные значения: ``HEAT_COOL``, ``COOL``, ``HEAT``, ``DRY``, ``FAN_ONLY``. Обратите внимание: некоторые производители кондиционеров указывают на пульте режим AUTO, хотя по факту этот режим не работает по расписанию и только лишь поддерживает целевую температуру. Такой режим в ESPHome называется HEAT_COOL. По умолчанию список содержит только значение ``FAN_ONLY``.
@@ -390,7 +403,7 @@ on_...:
Исходный код простейшего примера можно найти в файле [aux_ac_simple.yaml](https://github.com/GrKoR/esphome_aux_ac_component/blob/master/examples/simple/aux_ac_simple.yaml). Исходный код простейшего примера можно найти в файле [aux_ac_simple.yaml](https://github.com/GrKoR/esphome_aux_ac_component/blob/master/examples/simple/aux_ac_simple.yaml).
Все настройки в нем тривиальны и подробно описаны [в официальной документации на ESPHome](https://esphome.io/index.html) и дополнены в разделе о настройке компонента выше.<br /> Все настройки в нем тривиальны и подробно описаны [в официальной документации на ESPHome](https://esphome.io/index.html) и дополнены в разделе о настройке компонента выше.<br />
Просто скопируйте yaml-файл примера в локальную папку у себя на компьютере, пропишите настройки вашей сети WiFi и откомпилируйте YAML с использованием ESPHome. Просто скопируйте yaml-файл примера в локальную папку у себя на компьютере, пропишите настройки вашей сети Wi-Fi и откомпилируйте YAML с использованием ESPHome.
## Продвинутый пример ## ## Продвинутый пример ##

View File

@@ -4,183 +4,238 @@
#include "esphome/core/automation.h" #include "esphome/core/automation.h"
#include "esphome/core/component.h" #include "esphome/core/component.h"
namespace esphome { namespace esphome
namespace aux_ac { {
namespace aux_ac
{
// **************************************** DISPLAY ACTIONS **************************************** // **************************************** DISPLAY ACTIONS ****************************************
template <typename... Ts> template <typename... Ts>
class AirConDisplayOffAction : public Action<Ts...> { class AirConDisplayOffAction : public Action<Ts...>
public: {
explicit AirConDisplayOffAction(AirCon *ac) : ac_(ac) {} public:
explicit AirConDisplayOffAction(AirCon *ac) : ac_(ac) {}
void play(Ts... x) override { this->ac_->displayOffSequence(); } void play(const Ts &...x) override
{
this->ac_->displayOffSequence();
}
protected: protected:
AirCon *ac_; AirCon *ac_;
}; };
template <typename... Ts> template <typename... Ts>
class AirConDisplayOnAction : public Action<Ts...> { class AirConDisplayOnAction : public Action<Ts...>
public: {
explicit AirConDisplayOnAction(AirCon *ac) : ac_(ac) {} public:
explicit AirConDisplayOnAction(AirCon *ac) : ac_(ac) {}
void play(Ts... x) override { this->ac_->displayOnSequence(); } void play(const Ts &...x) override
{
this->ac_->displayOnSequence();
}
protected: protected:
AirCon *ac_; AirCon *ac_;
}; };
// **************************************** VERTICAL LOUVER ACTIONS **************************************** // **************************************** VERTICAL LOUVER ACTIONS ****************************************
template <typename... Ts> template <typename... Ts>
class AirConVLouverSwingAction : public Action<Ts...> { class AirConVLouverSwingAction : public Action<Ts...>
public: {
explicit AirConVLouverSwingAction(AirCon *ac) : ac_(ac) {} public:
explicit AirConVLouverSwingAction(AirCon *ac) : ac_(ac) {}
void play(Ts... x) override { this->ac_->setVLouverSwingSequence(); } void play(const Ts &...x) override
{
this->ac_->setVLouverSwingSequence();
}
protected: protected:
AirCon *ac_; AirCon *ac_;
}; };
template <typename... Ts> template <typename... Ts>
class AirConVLouverStopAction : public Action<Ts...> { class AirConVLouverStopAction : public Action<Ts...>
public: {
explicit AirConVLouverStopAction(AirCon *ac) : ac_(ac) {} public:
explicit AirConVLouverStopAction(AirCon *ac) : ac_(ac) {}
void play(Ts... x) override { this->ac_->setVLouverStopSequence(); } void play(const Ts &...x) override
{
this->ac_->setVLouverStopSequence();
}
protected: protected:
AirCon *ac_; AirCon *ac_;
}; };
template <typename... Ts> template <typename... Ts>
class AirConVLouverTopAction : public Action<Ts...> { class AirConVLouverTopAction : public Action<Ts...>
public: {
explicit AirConVLouverTopAction(AirCon *ac) : ac_(ac) {} public:
explicit AirConVLouverTopAction(AirCon *ac) : ac_(ac) {}
void play(Ts... x) override { this->ac_->setVLouverTopSequence(); } void play(const Ts &...x) override
{
this->ac_->setVLouverTopSequence();
}
protected: protected:
AirCon *ac_; AirCon *ac_;
}; };
template <typename... Ts> template <typename... Ts>
class AirConVLouverMiddleAboveAction : public Action<Ts...> { class AirConVLouverMiddleAboveAction : public Action<Ts...>
public: {
explicit AirConVLouverMiddleAboveAction(AirCon *ac) : ac_(ac) {} public:
explicit AirConVLouverMiddleAboveAction(AirCon *ac) : ac_(ac) {}
void play(Ts... x) override { this->ac_->setVLouverMiddleAboveSequence(); } void play(const Ts &...x) override
{
this->ac_->setVLouverMiddleAboveSequence();
}
protected: protected:
AirCon *ac_; AirCon *ac_;
}; };
template <typename... Ts> template <typename... Ts>
class AirConVLouverMiddleAction : public Action<Ts...> { class AirConVLouverMiddleAction : public Action<Ts...>
public: {
explicit AirConVLouverMiddleAction(AirCon *ac) : ac_(ac) {} public:
explicit AirConVLouverMiddleAction(AirCon *ac) : ac_(ac) {}
void play(Ts... x) override { this->ac_->setVLouverMiddleSequence(); } void play(const Ts &...x) override
{
this->ac_->setVLouverMiddleSequence();
}
protected: protected:
AirCon *ac_; AirCon *ac_;
}; };
template <typename... Ts> template <typename... Ts>
class AirConVLouverMiddleBelowAction : public Action<Ts...> { class AirConVLouverMiddleBelowAction : public Action<Ts...>
public: {
explicit AirConVLouverMiddleBelowAction(AirCon *ac) : ac_(ac) {} public:
explicit AirConVLouverMiddleBelowAction(AirCon *ac) : ac_(ac) {}
void play(Ts... x) override { this->ac_->setVLouverMiddleBelowSequence(); } void play(const Ts &...x) override
{
this->ac_->setVLouverMiddleBelowSequence();
}
protected: protected:
AirCon *ac_; AirCon *ac_;
}; };
template <typename... Ts> template <typename... Ts>
class AirConVLouverBottomAction : public Action<Ts...> { class AirConVLouverBottomAction : public Action<Ts...>
public: {
explicit AirConVLouverBottomAction(AirCon *ac) : ac_(ac) {} public:
explicit AirConVLouverBottomAction(AirCon *ac) : ac_(ac) {}
void play(Ts... x) override { this->ac_->setVLouverBottomSequence(); } void play(const Ts &...x) override
{
this->ac_->setVLouverBottomSequence();
}
protected: protected:
AirCon *ac_; AirCon *ac_;
}; };
template <typename... Ts> template <typename... Ts>
class AirConVLouverSetAction : public Action<Ts...> { class AirConVLouverSetAction : public Action<Ts...>
public: {
AirConVLouverSetAction(AirCon *ac) : ac_(ac) {} public:
TEMPLATABLE_VALUE(uint8_t, value); TEMPLATABLE_VALUE(uint8_t, value);
void play(Ts... x) { AirConVLouverSetAction(AirCon *ac) : ac_(ac) {};
vlpos_ = this->value_.value(x...);
this->ac_->setVLouverFrontendSequence((ac_vlouver_frontend)vlpos_);
}
protected: void play(const Ts &...x) override
AirCon *ac_; {
uint8_t vlpos_; vlpos_ = this->value_.value(x...);
}; this->ac_->setVLouverFrontendSequence((ac_vlouver_frontend)vlpos_);
};
// **************************************** SEND TEST PACKET ACTION **************************************** protected:
template <typename... Ts> AirCon *ac_;
class AirConSendTestPacketAction : public Action<Ts...> { uint8_t vlpos_;
public: };
explicit AirConSendTestPacketAction(AirCon *ac) : ac_(ac) {}
void set_data_template(std::function<std::vector<uint8_t>(Ts...)> func) {
this->data_func_ = func;
this->static_ = false;
}
void set_data_static(const std::vector<uint8_t> &data) {
this->data_static_ = data;
this->static_ = true;
}
void play(Ts... x) override { // **************************************** SEND TEST PACKET ACTION ****************************************
if (this->static_) { template <typename... Ts>
this->ac_->sendTestPacket(this->data_static_); class AirConSendTestPacketAction : public Action<Ts...>
} else { {
auto val = this->data_func_(x...); public:
this->ac_->sendTestPacket(val); explicit AirConSendTestPacketAction(AirCon *ac) : ac_(ac) {}
} void set_data_template(std::function<std::vector<uint8_t>(Ts...)> func)
} {
this->data_func_ = func;
this->static_ = false;
}
void set_data_static(const std::vector<uint8_t> &data)
{
this->data_static_ = data;
this->static_ = true;
}
protected: void play(const Ts &...x) override
AirCon *ac_; {
bool static_{false}; if (this->static_)
std::function<std::vector<uint8_t>(Ts...)> data_func_{}; {
std::vector<uint8_t> data_static_{}; this->ac_->sendTestPacket(this->data_static_);
}; }
else
{
auto val = this->data_func_(x...);
this->ac_->sendTestPacket(val);
}
}
// **************************************** POWER LIMITATION ACTIONS **************************************** protected:
template <typename... Ts> AirCon *ac_;
class AirConPowerLimitationOffAction : public Action<Ts...> { bool static_{false};
public: std::function<std::vector<uint8_t>(Ts...)> data_func_{};
explicit AirConPowerLimitationOffAction(AirCon *ac) : ac_(ac) {} std::vector<uint8_t> data_static_{};
};
void play(Ts... x) override { this->ac_->powerLimitationOffSequence(); } // **************************************** POWER LIMITATION ACTIONS ****************************************
template <typename... Ts>
class AirConPowerLimitationOffAction : public Action<Ts...>
{
public:
explicit AirConPowerLimitationOffAction(AirCon *ac) : ac_(ac) {}
protected: void play(const Ts &...x) override
AirCon *ac_; {
}; this->ac_->powerLimitationOffSequence();
}
template <typename... Ts> protected:
class AirConPowerLimitationOnAction : public Action<Ts...> { AirCon *ac_;
public: };
AirConPowerLimitationOnAction(AirCon *ac) : ac_(ac) {}
TEMPLATABLE_VALUE(uint8_t, value);
void play(Ts... x) { template <typename... Ts>
this->pwr_lim_ = this->value_.value(x...); class AirConPowerLimitationOnAction : public Action<Ts...>
this->ac_->powerLimitationOnSequence(this->pwr_lim_); {
} public:
TEMPLATABLE_VALUE(uint8_t, value);
protected: AirConPowerLimitationOnAction(AirCon *ac) : ac_(ac) {};
AirCon *ac_;
uint8_t pwr_lim_;
};
} // namespace aux_ac void play(const Ts &...x) override
} // namespace esphome {
this->pwr_lim_ = this->value_.value(x...);
this->ac_->powerLimitationOnSequence(this->pwr_lim_);
}
protected:
AirCon *ac_;
uint8_t pwr_lim_;
};
} // namespace aux_ac
} // namespace esphome

File diff suppressed because it is too large Load Diff

View File

@@ -1,4 +1,5 @@
import logging import logging
from esphome.core import CORE, Define
import esphome.config_validation as cv import esphome.config_validation as cv
import esphome.codegen as cg import esphome.codegen as cg
from esphome.components import climate, uart, sensor, binary_sensor, text_sensor from esphome.components import climate, uart, sensor, binary_sensor, text_sensor
@@ -10,6 +11,7 @@ from esphome.const import (
CONF_DATA, CONF_DATA,
CONF_ID, CONF_ID,
CONF_INTERNAL, CONF_INTERNAL,
CONF_OPTIMISTIC,
CONF_PERIOD, CONF_PERIOD,
CONF_POSITION, CONF_POSITION,
CONF_SUPPORTED_MODES, CONF_SUPPORTED_MODES,
@@ -24,6 +26,7 @@ from esphome.const import (
DEVICE_CLASS_TEMPERATURE, DEVICE_CLASS_TEMPERATURE,
DEVICE_CLASS_POWER_FACTOR, DEVICE_CLASS_POWER_FACTOR,
STATE_CLASS_MEASUREMENT, STATE_CLASS_MEASUREMENT,
__version__
) )
from esphome.components.climate import ( from esphome.components.climate import (
ClimateMode, ClimateMode,
@@ -31,6 +34,12 @@ from esphome.components.climate import (
ClimateSwingMode, ClimateSwingMode,
) )
AUX_AC_FIRMWARE_VERSION = '0.3.1'
AC_PACKET_TIMEOUT_MIN = 150
AC_PACKET_TIMEOUT_MAX = 600
AC_POWER_LIMIT_MIN = 30
AC_POWER_LIMIT_MAX = 100
_LOGGER = logging.getLogger(__name__) _LOGGER = logging.getLogger(__name__)
CODEOWNERS = ["@GrKoR"] CODEOWNERS = ["@GrKoR"]
@@ -119,8 +128,12 @@ AirConPowerLimitationOnAction = aux_ac_ns.class_(
) )
AC_PACKET_TIMEOUT_MIN = 150 def use_new_api():
AC_PACKET_TIMEOUT_MAX = 600 esphome_current_version = tuple(map(int, __version__.split('.')))
esphome_bc_version = tuple(map(int, "2025.11.0".split('.')))
return esphome_current_version >= esphome_bc_version
def validate_packet_timeout(value): def validate_packet_timeout(value):
minV = AC_PACKET_TIMEOUT_MIN minV = AC_PACKET_TIMEOUT_MIN
maxV = AC_PACKET_TIMEOUT_MAX maxV = AC_PACKET_TIMEOUT_MAX
@@ -129,8 +142,6 @@ def validate_packet_timeout(value):
raise cv.Invalid(f"Timeout should be in range: {minV}..{maxV}.") raise cv.Invalid(f"Timeout should be in range: {minV}..{maxV}.")
AC_POWER_LIMIT_MIN = 30
AC_POWER_LIMIT_MAX = 100
def validate_power_limit_range(value): def validate_power_limit_range(value):
minV = AC_POWER_LIMIT_MIN minV = AC_POWER_LIMIT_MIN
maxV = AC_POWER_LIMIT_MAX maxV = AC_POWER_LIMIT_MAX
@@ -181,19 +192,19 @@ def validate_raw_data(value):
def output_info(config): def output_info(config):
"""_LOGGER.info(config.items())""" _LOGGER.info("AUX_AC firmware version: %s", AUX_AC_FIRMWARE_VERSION)
return config return config
CONFIG_SCHEMA = cv.All( CONFIG_SCHEMA = cv.All(
climate.CLIMATE_SCHEMA.extend( climate.climate_schema(climate.Climate).extend(
{ {
cv.GenerateID(): cv.declare_id(AirCon), cv.GenerateID(): cv.declare_id(AirCon),
cv.Optional(CONF_PERIOD, default="7s"): cv.time_period, cv.Optional(CONF_PERIOD, default="7s"): cv.time_period,
cv.Optional(CONF_SHOW_ACTION, default="true"): cv.boolean, cv.Optional(CONF_SHOW_ACTION, default="true"): cv.boolean,
cv.Optional(CONF_DISPLAY_INVERTED, default="false"): cv.boolean, cv.Optional(CONF_DISPLAY_INVERTED, default="false"): cv.boolean,
cv.Optional(CONF_TIMEOUT, default=AC_PACKET_TIMEOUT_MIN): validate_packet_timeout, cv.Optional(CONF_TIMEOUT, default=AC_PACKET_TIMEOUT_MIN): validate_packet_timeout,
cv.Optional(CONF_OPTIMISTIC, default="true"): cv.boolean,
cv.Optional(CONF_INVERTER_POWER_DEPRICATED): cv.invalid( cv.Optional(CONF_INVERTER_POWER_DEPRICATED): cv.invalid(
"The name of sensor was changed in v.0.2.9 from 'invertor_power' to 'inverter_power'. Update your config please." "The name of sensor was changed in v.0.2.9 from 'invertor_power' to 'inverter_power'. Update your config please."
), ),
@@ -329,6 +340,21 @@ CONFIG_SCHEMA = cv.All(
async def to_code(config): async def to_code(config):
CORE.add_define(
Define("AUX_AC_FIRMWARE_VERSION", '"'+AUX_AC_FIRMWARE_VERSION+'"')
)
CORE.add_define(
Define("AUX_AC_PACKET_TIMEOUT_MIN", AC_PACKET_TIMEOUT_MIN)
)
CORE.add_define(
Define("AUX_AC_PACKET_TIMEOUT_MAX", AC_PACKET_TIMEOUT_MAX)
)
CORE.add_define(
Define("AUX_AC_MIN_INVERTER_POWER_LIMIT", AC_POWER_LIMIT_MIN)
)
CORE.add_define(
Define("AUX_AC_MAX_INVERTER_POWER_LIMIT", AC_POWER_LIMIT_MAX)
)
var = cg.new_Pvariable(config[CONF_ID]) var = cg.new_Pvariable(config[CONF_ID])
await cg.register_component(var, config) await cg.register_component(var, config)
await climate.register_climate(var, config) await climate.register_climate(var, config)
@@ -400,17 +426,27 @@ async def to_code(config):
cg.add(var.set_show_action(config[CONF_SHOW_ACTION])) cg.add(var.set_show_action(config[CONF_SHOW_ACTION]))
cg.add(var.set_display_inverted(config[CONF_DISPLAY_INVERTED])) cg.add(var.set_display_inverted(config[CONF_DISPLAY_INVERTED]))
cg.add(var.set_packet_timeout(config[CONF_TIMEOUT])) cg.add(var.set_packet_timeout(config[CONF_TIMEOUT]))
cg.add(var.set_optimistic(config[CONF_OPTIMISTIC]))
if CONF_SUPPORTED_MODES in config: if CONF_SUPPORTED_MODES in config:
cg.add(var.set_supported_modes(config[CONF_SUPPORTED_MODES])) cg.add(var.set_supported_modes(config[CONF_SUPPORTED_MODES]))
if CONF_SUPPORTED_SWING_MODES in config: if CONF_SUPPORTED_SWING_MODES in config:
cg.add(var.set_supported_swing_modes(config[CONF_SUPPORTED_SWING_MODES])) cg.add(var.set_supported_swing_modes(config[CONF_SUPPORTED_SWING_MODES]))
if CONF_SUPPORTED_PRESETS in config: if CONF_SUPPORTED_PRESETS in config:
cg.add(var.set_supported_presets(config[CONF_SUPPORTED_PRESETS])) cg.add(var.set_supported_presets(config[CONF_SUPPORTED_PRESETS]))
if CONF_CUSTOM_PRESETS in config: if use_new_api():
cg.add(var.set_custom_presets(config[CONF_CUSTOM_PRESETS])) if CONF_CUSTOM_PRESETS in config:
if CONF_CUSTOM_FAN_MODES in config: presets = config[CONF_CUSTOM_PRESETS]
cg.add(var.set_custom_fan_modes(config[CONF_CUSTOM_FAN_MODES])) c_str_presets = [cg.RawExpression(f"aux_ac::Constants::{p}.c_str()") for p in presets]
cg.add(var.set_custom_presets(c_str_presets))
if CONF_CUSTOM_FAN_MODES in config:
fan_modes = config[CONF_CUSTOM_FAN_MODES]
c_str_fan_modes = [cg.RawExpression(f"aux_ac::Constants::{p}.c_str()") for p in fan_modes]
cg.add(var.set_custom_fan_modes(c_str_fan_modes))
else:
if CONF_CUSTOM_PRESETS in config:
cg.add(var.set_custom_presets(config[CONF_CUSTOM_PRESETS]))
if CONF_CUSTOM_FAN_MODES in config:
cg.add(var.set_custom_fan_modes(config[CONF_CUSTOM_FAN_MODES]))
DISPLAY_ACTION_SCHEMA = maybe_simple_id( DISPLAY_ACTION_SCHEMA = maybe_simple_id(
@@ -419,6 +455,7 @@ DISPLAY_ACTION_SCHEMA = maybe_simple_id(
} }
) )
@automation.register_action( @automation.register_action(
"aux_ac.display_off", AirConDisplayOffAction, DISPLAY_ACTION_SCHEMA "aux_ac.display_off", AirConDisplayOffAction, DISPLAY_ACTION_SCHEMA
) )
@@ -426,6 +463,7 @@ async def display_off_to_code(config, action_id, template_arg, args):
paren = await cg.get_variable(config[CONF_ID]) paren = await cg.get_variable(config[CONF_ID])
return cg.new_Pvariable(action_id, template_arg, paren) return cg.new_Pvariable(action_id, template_arg, paren)
@automation.register_action( @automation.register_action(
"aux_ac.display_on", AirConDisplayOnAction, DISPLAY_ACTION_SCHEMA "aux_ac.display_on", AirConDisplayOnAction, DISPLAY_ACTION_SCHEMA
) )
@@ -434,13 +472,13 @@ async def display_on_to_code(config, action_id, template_arg, args):
return cg.new_Pvariable(action_id, template_arg, paren) return cg.new_Pvariable(action_id, template_arg, paren)
VLOUVER_ACTION_SCHEMA = maybe_simple_id( VLOUVER_ACTION_SCHEMA = maybe_simple_id(
{ {
cv.Required(CONF_ID): cv.use_id(AirCon), cv.Required(CONF_ID): cv.use_id(AirCon),
} }
) )
@automation.register_action( @automation.register_action(
"aux_ac.vlouver_stop", AirConVLouverStopAction, VLOUVER_ACTION_SCHEMA "aux_ac.vlouver_stop", AirConVLouverStopAction, VLOUVER_ACTION_SCHEMA
) )
@@ -448,6 +486,7 @@ async def vlouver_stop_to_code(config, action_id, template_arg, args):
paren = await cg.get_variable(config[CONF_ID]) paren = await cg.get_variable(config[CONF_ID])
return cg.new_Pvariable(action_id, template_arg, paren) return cg.new_Pvariable(action_id, template_arg, paren)
@automation.register_action( @automation.register_action(
"aux_ac.vlouver_swing", AirConVLouverSwingAction, VLOUVER_ACTION_SCHEMA "aux_ac.vlouver_swing", AirConVLouverSwingAction, VLOUVER_ACTION_SCHEMA
) )
@@ -455,6 +494,7 @@ async def vlouver_swing_to_code(config, action_id, template_arg, args):
paren = await cg.get_variable(config[CONF_ID]) paren = await cg.get_variable(config[CONF_ID])
return cg.new_Pvariable(action_id, template_arg, paren) return cg.new_Pvariable(action_id, template_arg, paren)
@automation.register_action( @automation.register_action(
"aux_ac.vlouver_top", AirConVLouverTopAction, VLOUVER_ACTION_SCHEMA "aux_ac.vlouver_top", AirConVLouverTopAction, VLOUVER_ACTION_SCHEMA
) )
@@ -462,6 +502,7 @@ async def vlouver_top_to_code(config, action_id, template_arg, args):
paren = await cg.get_variable(config[CONF_ID]) paren = await cg.get_variable(config[CONF_ID])
return cg.new_Pvariable(action_id, template_arg, paren) return cg.new_Pvariable(action_id, template_arg, paren)
@automation.register_action( @automation.register_action(
"aux_ac.vlouver_middle_above", AirConVLouverMiddleAboveAction, VLOUVER_ACTION_SCHEMA "aux_ac.vlouver_middle_above", AirConVLouverMiddleAboveAction, VLOUVER_ACTION_SCHEMA
) )
@@ -469,6 +510,7 @@ async def vlouver_middle_above_to_code(config, action_id, template_arg, args):
paren = await cg.get_variable(config[CONF_ID]) paren = await cg.get_variable(config[CONF_ID])
return cg.new_Pvariable(action_id, template_arg, paren) return cg.new_Pvariable(action_id, template_arg, paren)
@automation.register_action( @automation.register_action(
"aux_ac.vlouver_middle", AirConVLouverMiddleAction, VLOUVER_ACTION_SCHEMA "aux_ac.vlouver_middle", AirConVLouverMiddleAction, VLOUVER_ACTION_SCHEMA
) )
@@ -476,6 +518,7 @@ async def vlouver_middle_to_code(config, action_id, template_arg, args):
paren = await cg.get_variable(config[CONF_ID]) paren = await cg.get_variable(config[CONF_ID])
return cg.new_Pvariable(action_id, template_arg, paren) return cg.new_Pvariable(action_id, template_arg, paren)
@automation.register_action( @automation.register_action(
"aux_ac.vlouver_middle_below", AirConVLouverMiddleBelowAction, VLOUVER_ACTION_SCHEMA "aux_ac.vlouver_middle_below", AirConVLouverMiddleBelowAction, VLOUVER_ACTION_SCHEMA
) )
@@ -483,6 +526,7 @@ async def vlouver_middle_below_to_code(config, action_id, template_arg, args):
paren = await cg.get_variable(config[CONF_ID]) paren = await cg.get_variable(config[CONF_ID])
return cg.new_Pvariable(action_id, template_arg, paren) return cg.new_Pvariable(action_id, template_arg, paren)
@automation.register_action( @automation.register_action(
"aux_ac.vlouver_bottom", AirConVLouverBottomAction, VLOUVER_ACTION_SCHEMA "aux_ac.vlouver_bottom", AirConVLouverBottomAction, VLOUVER_ACTION_SCHEMA
) )
@@ -491,7 +535,6 @@ async def vlouver_bottom_to_code(config, action_id, template_arg, args):
return cg.new_Pvariable(action_id, template_arg, paren) return cg.new_Pvariable(action_id, template_arg, paren)
VLOUVER_SET_ACTION_SCHEMA = cv.Schema( VLOUVER_SET_ACTION_SCHEMA = cv.Schema(
{ {
cv.Required(CONF_ID): cv.use_id(AirCon), cv.Required(CONF_ID): cv.use_id(AirCon),
@@ -499,6 +542,7 @@ VLOUVER_SET_ACTION_SCHEMA = cv.Schema(
} }
) )
@automation.register_action( @automation.register_action(
"aux_ac.vlouver_set", AirConVLouverSetAction, VLOUVER_SET_ACTION_SCHEMA "aux_ac.vlouver_set", AirConVLouverSetAction, VLOUVER_SET_ACTION_SCHEMA
) )
@@ -510,13 +554,13 @@ async def vlouver_set_to_code(config, action_id, template_arg, args):
return var return var
POWER_LIMITATION_OFF_ACTION_SCHEMA = maybe_simple_id( POWER_LIMITATION_OFF_ACTION_SCHEMA = maybe_simple_id(
{ {
cv.Required(CONF_ID): cv.use_id(AirCon), cv.Required(CONF_ID): cv.use_id(AirCon),
} }
) )
@automation.register_action( @automation.register_action(
"aux_ac.power_limit_off", AirConPowerLimitationOffAction, POWER_LIMITATION_OFF_ACTION_SCHEMA "aux_ac.power_limit_off", AirConPowerLimitationOffAction, POWER_LIMITATION_OFF_ACTION_SCHEMA
) )
@@ -525,7 +569,6 @@ async def power_limit_off_to_code(config, action_id, template_arg, args):
return cg.new_Pvariable(action_id, template_arg, paren) return cg.new_Pvariable(action_id, template_arg, paren)
POWER_LIMITATION_ON_ACTION_SCHEMA = cv.Schema( POWER_LIMITATION_ON_ACTION_SCHEMA = cv.Schema(
{ {
cv.Required(CONF_ID): cv.use_id(AirCon), cv.Required(CONF_ID): cv.use_id(AirCon),
@@ -533,6 +576,7 @@ POWER_LIMITATION_ON_ACTION_SCHEMA = cv.Schema(
} }
) )
@automation.register_action( @automation.register_action(
"aux_ac.power_limit_on", AirConPowerLimitationOnAction, POWER_LIMITATION_ON_ACTION_SCHEMA "aux_ac.power_limit_on", AirConPowerLimitationOnAction, POWER_LIMITATION_ON_ACTION_SCHEMA
) )
@@ -544,7 +588,6 @@ async def power_limit_on_to_code(config, action_id, template_arg, args):
return var return var
# ********************************************************************************************************* # *********************************************************************************************************
# ВАЖНО! Только для инженеров! # ВАЖНО! Только для инженеров!
# Вызывайте метод aux_ac.send_packet только если понимаете, что делаете! Он не проверяет данные, а передаёт # Вызывайте метод aux_ac.send_packet только если понимаете, что делаете! Он не проверяет данные, а передаёт

View File

@@ -2,24 +2,47 @@
`Aux_ac` has been tested and works successfully with the air conditioners from the list below.<br/> `Aux_ac` has been tested and works successfully with the air conditioners from the list below.<br/>
Кондиционеры из списка ниже протестированы и точно совместимы с `aux_ac`. Кондиционеры из списка ниже протестированы и точно совместимы с `aux_ac`.
+ AUX (models: ASW-H09A4/LK-700R1, ASW-H09B4/LK-700R1, ASW-H09A4/LK-700R1DI, AMWM-xxx multisplit, AL-H48/5DR2(U)/ALMD-H48/5DR2, ASW-H07A4/FP-R1DI, ASW-H09A4/FP-R1DI, ASW-H07A4/DE-R1DI, KFR-26GW/BpHRB+3) + ANDE (models: AND-12/FA+, AND-AMWM-H12(JA) / AND-AM2-H18/4DR3)
+ Ballu (models: BSUI-12HN8, BLC_CF/in-60HN1) + Argo (models: Greenstyle 9000, Greenstyle 12000, Greenstyle 18000)
+ Centek (models: CT-65Q09, CT-65Q12, CT-65Z10, CT-65Z18, CT-65A12) + Arielli (models: ASW-H09B4/FGR3DI-EU)
+ AUX (models: ALLD-H18/4R1C / AL-H18/4R1C(U), ALMD-H48/5DR2 / AL-H48/5DR2(U), ALMD-H24/4DR2A / AL-H24/4DR2A(U), AMWM-H07/4R1 multisplit, AMWM-H07/4R2(J) multisplit, AMWM-H12/4R2(J) multisplit, AMWM-H12/4R3 multisplit, ASM-H12LL, ASM-H24LD, ASW-12A3INV/SS, ASW-H07A4/DE-R1DI, ASW-H07A4/FP-R1DI, ASW-H07A4/JD-R1, ASW-H09A4/FP-R1DI, ASW-H09A4/LK-700R1, ASW-H09A4/LK-700R1DI, ASW-H09B4/LK-700R1, ASW-H09B7A4, ASW-H12A4/FAR1, ASW-H12A4/HA-R2DI, ASW-H12A4/JD-R2DI, ASW-H12B4/JD-R2DI, ASW-H12C5C4/JER3DI-B8-2, ASW-H12C5C4/JOR3DI-B8, ASW-H12U3/JIR1DI-US, ASW-H18A4/QH-R1DI / AS-H18A4/QH-R1DI, ASW-H18E3A4, AUX-07JO/I / AUX-M3-21LCLH multisplit, AUX-09CAA/I / ASW-H09A4/CAR3DI-C3, AUX-12JO/I / AUX-M3-21LCLH multisplit, AUX-12F3H, AUX-18QC/I / AUX-18QC/O, AWM-09G1V4-X, HA-18000BTU, KFR-26GW/BpHRB+3, KFR-26GW/BpQYA2+2R3, KFR-26GW/BpQYD2+2R3, KFR-26GW/BpR3QYA1+1, KFR-26GW/BpR3QYD1+1, KFR-26GW/BpR3QYQ1+1, KFR-26GW/BpR3QYQ2+2, KFR-35GW/BpQYA1+1R3, KFR-35GW/BpQYA2+2R3, KFR-35GW/BpQYD1+1R3, KFR-35GW/BpQYD2+2R3, KFR-35GW/BpR3QYQ1+1, KFR-35GW/BpR3QYQ2+2 (see [issue #71](https://github.com/GrKoR/esphome_aux_ac_component/issues/71) for detais of `Aegean Sea`[爱琴海] AUX family AC connection)
+ Ballu (models: BLC_CF/in-60HN1 / BLC_O/out-60HN1, Orbis BPAC-08 OR/N6, BSUI/in-09HN8 / BSUI/out-09HN8, BSUI/in-12HN8 / BSUI/out-12HN8, BSUI/in-18HN8 / BSUI/out-18HN8, BSW/in-09HN1 / BSW/out-09HN1, BSW/in-12HN1 / BSW/out-12HN1, BSW/in-18HN1 / BSW/out-18HN1)
+ Baymak (models: Elegant Plus 9, Elegant Plus 12)
+ Centek (models: CT-65A09, CT-65A12, CT-65EDC07, CT-65F09, CT-65F12, CT-65FDC07, CT-65FDC09, CT-65J09, CT-65J12, CT-65J24, CT-65K07, CT-65Q09, CT-65Q12, CT-65RDC07, CT-65RDC09, CT-65RDC12, CT-65SDC07, CT-65SDC09, CT-65SDC18, CT-65U13, CT-65U18, CT-65V12, CT-65V24, CT-65X12, CT-65Z10, CT-65Z18)
+ Costway (models: FP10318US-22WH, FP10524US-22WH)
+ Dimstal (model: SMND-QC-12-J-Smart ECO) + Dimstal (model: SMND-QC-12-J-Smart ECO)
+ Elgin (models: HWFI09B2IA/ HWFE09B2NA) + Electrolux (models: EACS/I-07HSK/N3, EACS/I-09HIX-BLACK/N8)
+ Energolux (models: SAS07L4-A, SAS07M2-AI, SAS09Z4-AI, SASxxBN1-AI) + Elgin (models: HIFI09C2WA / HIFE09C2CA, HJFI12C2WB, HWFI09B2IA / HWFE09B2NA, HWFI30B2IA / HWFE30B2NA)
+ Energolux (models: SAS07L2-A, SAS07L4-A, SAS07M2-AI, SAS09B3-A, SAS09L4-A, SAS09Z4-AI, SAS12BN1-AI, SAS09Z4-AI, SAS18Z4-AI)
+ Fujico (models: ACF-I07AHRDN1)
+ Hyundai (models: H-AR16-07H, H-AR21-07H, H-AR21-09H) + Hyundai (models: H-AR16-07H, H-AR21-07H, H-AR21-09H)
+ iClima (models: ICI-09A/IUI-09A)
+ Idea (models: ISR-12HR-SA7-DN1 ION) + Idea (models: ISR-12HR-SA7-DN1 ION)
+ IGC (models: RAK-07NH multysplit) + IGC (models: RAK-07NH multysplit, RAS-07AX/RAC-07AX, RAS-V09N2X/RAC-V09N2X, RAS-V12NQR/RAC-V12NQR)
+ IKON (models: ASW-H12C5C4/HCR3DI-B8)
+ Ishimatsu (models: AVK-07I, AVK-09I)
+ Loriot (models: LAC-09AS) + Loriot (models: LAC-09AS)
+ Mirage (models: EWC121E - CWC121E)
+ Osaka (models: STVP-12HH3)
+ RCool (models: GRA12B0-KSZKLM641) + RCool (models: GRA12B0-KSZKLM641)
+ Roda (models: RS-AL09F) + Rinnai (models: RINV25RC)
+ Roda (models: RS-AL09F, RS-AL24F)
+ Rovex (models: RS-07ALS1, RS-09ALS1, RS-12ALS1) + Rovex (models: RS-07ALS1, RS-09ALS1, RS-12ALS1)
+ Royal Clima (models: CO-D 18HNI/CO-E 18HNI, RCI-SA30HN) + Royal Clima (models: CO-D 18HNI/CO-E 18HNI, CO-D 24HNI/CO-E 24HNI, RC-VNR29HN, RC-RNC28HN, RCI-SA30HN)
+ RVX (models: RS-12ALS)
+ Samurai (models: SMA-07HRN1 ION, SMA-09HRN1 ION) + Samurai (models: SMA-07HRN1 ION, SMA-09HRN1 ION)
+ Subtropic (models: SUB-07HN1, SUB-12HN1) + Scarlett (models: RRI-09-MPI)
+ SEVRA (models: SEV-09JO)
+ Subtropic (models: SUB/in-07HN1 / SUB/out-07HN1, SUB/in-09HN1 / SUB/out-09HN1, SUB/in-12HN1 / SUB/out-12HN1)
+ Tesla (models: TA35FFML-12410M)
+ Tornado (models: ISKA-INV-12 X WIFI EU)
+ TOYOTOMI (models: SONZAI THN/THG-A35SZ)
+ Vertex (models: Falcon-18A)
+ VORTEX (models: VAI-A 1219F JMRV)
+ VOX (models: IJO09-SC4D, IVA5-12JR1)
+ Xigma (models: XG-SJ56RHA-IDU)
+ Zephir (models: ZEL 12000BTU) + Zephir (models: ZEL 12000BTU)
+ Бирюса (models: B-09FIR/B-09FIQ) + Бирюса (models: B-07DPR/B-07DPQ, B-09FIR/B-09FIQ)
## Tested and INCOMPATIBLE air conditioners ## ## Tested and INCOMPATIBLE air conditioners ##
ACs from the list below are **INCOMPATIBLE** with `aux_ac`.<br/> ACs from the list below are **INCOMPATIBLE** with `aux_ac`.<br/>

View File

@@ -8,15 +8,42 @@ I leave GPIO0 in air cause I don't see any reason to solder additional component
ESP-12E before DC-DC and air conditioner connected: ESP-12E before DC-DC and air conditioner connected:
![esp-12e minimal photo](https://github.com/GrKoR/esphome_aux_ac_component/blob/master/images/esp-12e.jpg?raw=true) ![esp-12e minimal photo](https://github.com/GrKoR/esphome_aux_ac_component/blob/master/images/esp-12e.jpg?raw=true)
Air conditioner internal block has a 5-wire connection to the wifi-module. Connector is [JST SM](https://www.jst-mfg.com/product/pdf/eng/eSM.pdf). Air conditioner internal block has a 5-wire or a 4-wire (pseudo-USB) connection to the wifi-module. There are another types of connection too. For example AUX Aegean Sea ( 爱琴海 ), check [issue #71](https://github.com/GrKoR/esphome_aux_ac_component/issues/71) for details.
## Wires ## ## 5-wire connection
1. Yellow: +14V DC. Measured +14.70V max and +13.70V min. Service manual declares up to +16V. It use [JST SM](https://www.jst-mfg.com/product/pdf/eng/eSM.pdf) connector for 5-wire connection.
### Pinout ###
1. Yellow: +12V..+14V DC. Measured +14.70V max and +13.70V min. Service manual declares up to +16V.
2. Black: ground. 2. Black: ground.
3. White: +5V DC (max: +5.63V; min: +4.43V) I have no idea what this is for. It goes directly to the air conditioner microcontroller through resistor 1kOhm and it does not affect the operation of the module. 3. White: +5V DC (max: +5.63V; min: +4.43V) Enable signal for the 3V3 buck regulator on the OEM module. It goes directly to the air conditioner microcontroller through resistor 1kOhm. It's non used with the EPS module.
4. Blue: TX of air conditioner. High is +5V. 4. Blue: TX of air conditioner. High is +5V.
5. Red: RX of air conditioner. High is +5V. 5. Red: RX of air conditioner. High is +5V.
You should feed your ESP **from +12V..+14V line only**! It is prohibited to use +5V line for this purpose.
+5V line is digital signal line and directly goes to conditioner's controller. It can't provide enough power. In worst scenario you probably can burn down your air conditioner controller.
## 4-wire connection (pseudo-USB)
For 4-wire connection it is used USB-like connector. It is only physical USB but its pinout is UART with +12V..+14V power line.
**ATTENTION!** It is incompatible with normal USB devices! Ordinary USB device like USB flash drive will be damaged if it will be plugged in air conditioner USB connector.
**ATTENTION #2!** Manufacturer was changed power circuit and connector pinout in 2022-2023: power rail has +8.5V DC and TX/RX pins are swapped.
### Pinout ###
<img src="https://github.com/GrKoR/esphome_aux_ac_component/blob/master/images/USB-pinout.png?raw=true" width="400">
1. +12V..+14V DC before 2022-2023, possible +8.5V DC after 2022-2023. Service manual declares up to +16V.
2. RX of the air conditioner for models manufactured before about Jul.2022, TX of the air conditioner for later modifications. High level is +5V.
3. TX of the air conditioner for models manufactured before about Jul.2022, RX of the air conditioner for later modifications. High level is +5V.
4. GND - ground.
Big thanks to [@diabl0](https://github.com/diabl0) for this pinout in [issue #70](https://github.com/GrKoR/esphome_aux_ac_component/issues/70).
If you are not sure, on which USB-pins do you have RX and TX lines, than don't afraid to connect it randomly. Neither air conditioner nor ESP will be damaged in this situation, just `aux_ac` can't receive data from the air conditioner. Swap TX and RX and your device will probably work.
## Power supply
For power supply it is possible to use any kind of suitable modules. I use this: For power supply it is possible to use any kind of suitable modules. I use this:
![power module](https://github.com/GrKoR/esphome_aux_ac_component/blob/master/images/DD4012SA.jpg?raw=true). ![power module](https://github.com/GrKoR/esphome_aux_ac_component/blob/master/images/DD4012SA.jpg?raw=true).
@@ -26,7 +53,7 @@ Yellow wire is connected to the Vin pin of the power module.
Blue wire is connected to the RXD pin of esp-12e. Blue wire is connected to the RXD pin of esp-12e.
Red wire is connected to the TXD pin of esp-12e. Red wire is connected to the TXD pin of esp-12e.
**ATTENTION!** In case you are using board like NodeMCU instead of clean esp8266/esp32 module, you shouldn't connect RX & TX wires of air conditioneer to TX & RX pins of board. Use any other digital pins for UART connection. It doesn't matter if your board will use hardware or software UART. All UART types are working well. **ATTENTION!** In case you are using board like NodeMCU instead of clean esp8266/esp32 module, you shouldn't connect RX & TX wires of air conditioner to TX & RX pins of board! *(TXD1/RXD1, TXD2/RXD2 are also most likely not suitable.)* Use any other digital pins for UART connection. It doesn't matter if your board will use hardware or software UART. All UART types are working well.
The usage of alternate pins for NodeMCU-like boards is necessary cause RX & TX lines of this boards are often have additional components like resistors or USB-TTL converters connected. This components are violate esp-to-ac UART connection. The usage of alternate pins for NodeMCU-like boards is necessary cause RX & TX lines of this boards are often have additional components like resistors or USB-TTL converters connected. This components are violate esp-to-ac UART connection.
Here is it: Here is it:
@@ -35,7 +62,7 @@ Here is it:
All connections in custom 3d-printed case looks like this: All connections in custom 3d-printed case looks like this:
![module assembled](https://github.com/GrKoR/esphome_aux_ac_component/blob/master/images/assembled.JPG?raw=true) ![module assembled](https://github.com/GrKoR/esphome_aux_ac_component/blob/master/images/assembled.JPG?raw=true)
Cause I haven't JST SM connector I made own: Since I didn't have JST SM connectors, I made my own:
![JST SM connector replica](https://github.com/GrKoR/esphome_aux_ac_component/blob/master/images/connector.JPG?raw=true). ![JST SM connector replica](https://github.com/GrKoR/esphome_aux_ac_component/blob/master/images/connector.JPG?raw=true).
It is made of standard 2.54mm pins and 3D-printed case. It is made of standard 2.54mm pins and 3D-printed case.

View File

@@ -1,23 +1,49 @@
## Электроника, необходимая для управления кондиционером по wifi ## ## Электроника, необходимая для управления кондиционером по wifi ##
Я тестировал проект на esp8266 (esp-12e). Минимальная обвязка традиционная и выглядит так: Я тестировал проект на esp8266 (esp-12e). Минимальная обвязка традиционна и выглядит так:
![scheme](https://github.com/GrKoR/esphome_aux_ac_component/blob/master/images/scheme.png?raw=true) ![scheme](https://github.com/GrKoR/esphome_aux_ac_component/blob/master/images/scheme.png?raw=true)
Для прошивки esp8266 в первый раз нужно в дополнение к обвязке, показанной на схеме выше, притянуть к Земле пин IO0 (GPIO0). После этого ESPHome может быть загружена в esp8266 по UART0. Если при этом вы указали OTA в конфигурации ESPHome, то в дальнейшем пин IO0 можно подтянуть к питанию или оставить висеть в воздухе. Он никак не будет влиять на загрузку новых прошивок, потому что все апдейты можно будет делать "по воздуху" (то есть по wifi). Я никуда IO0 не подтягивал и ничего к нему не паял, потому что не вижу смысла это делать ради одного раза. Первую прошивку делал в самодельном переходнике на макетке. Для прошивки esp8266 в первый раз нужно, в дополнение к обвязке, показанной на схеме выше, притянуть к земле пин IO0 (GPIO0). После этого ESPHome может быть загружена в esp8266 по UART0. Если при этом вы указали OTA в конфигурации ESPHome, то в дальнейшем пин IO0 можно подтянуть к питанию или оставить висеть в воздухе. Он никак не будет влиять на загрузку новых прошивок, потому что все апдейты можно будет делать "по воздуху" (то есть по Wi-Fi). Я никуда IO0 не подтягивал и ничего к нему не паял, потому что не вижу смысла это делать ради одного раза. Первую прошивку делал в самодельном переходнике на макетке.
Плата esp-12e перед подключением кондиционера и модуля питания: Плата esp-12e перед подключением кондиционера и модуля питания:
![esp-12e minimal photo](https://github.com/GrKoR/esphome_aux_ac_component/blob/master/images/esp-12e.jpg?raw=true) ![esp-12e minimal photo](https://github.com/GrKoR/esphome_aux_ac_component/blob/master/images/esp-12e.jpg?raw=true)
Внутренний блок сплит-системы имеет 5-проводное подключение к модулю wifi. Коннектор [JST SM](https://www.jst-mfg.com/product/pdf/eng/eSM.pdf). Внутренний блок сплит-системы может иметь 5-проводное или 4-проводное подключение (псевдо-USB) к модулю Wi-Fi. Встречаются и другие виды подключения. Например, AUX Aegean Sea ( 爱琴海 ), за подробностями подключения сюда: [issue #71](https://github.com/GrKoR/esphome_aux_ac_component/issues/71).
## Перечень проводников ## ## 5-проводное подключение
1. Желтый: +14В постоянного тока. Осциллограф показал от +13.70В до +14.70В. В сервисном мануале встречалось, что питание возможно до +16В. Для 5-проводного подключения используется коннектор [JST SM](https://www.jst-mfg.com/product/pdf/eng/eSM.pdf).
### Распиновка ###
1. Желтый: +12В..+14В постоянного тока. Осциллограф показал от +13.70В до +14.70В. В сервисном мануале встречалось, что питание возможно до +16В.
2. Черный: земля. 2. Черный: земля.
3. Белый: +5В постоянного тока (измерено от +4.43В до +5.63В). Для чего нужна эта линия - не понятно. У меня нет версий. Эксперименты с родным wifi-модулем сплит-системы показали, что эта линия в работе wifi не участвует. Линия идет напрямую на ножку контроллера в сплите через резистор 1 кОм. 3. Белый: +5В постоянного тока (измерено от +4.43В до +5.63В). По информации от пользователей, это сигнальная линия, включающая по DC-DC конвертор на wifi-модуле по команде с кондиционера. Линия идет напрямую на ножку контроллера в сплите через резистор 1 кОм. Эксперименты с родным Wi-Fi модулем сплит-системы показали, что эта линия в работе Wi-Fi не участвует и имеет всегда высокий уровень. В работе компонента и самодельного wifi-модуля эта линия не используется.
4. Синий: TX кондиционера. Высокий уровень +5В. 4. Синий: TX кондиционера. Высокий уровень +5В.
5. Red: RX кондиционера. Высокий уровень +5В. 5. Red: RX кондиционера. Высокий уровень +5В.
Питание ESP подключать **ТОЛЬКО** к линии +12В..+14В! Имеющийся в 5-проводном подключении контакт с +5В для питания ESP использоваться не должен. Он является сигнальным, подключен через резистор непосредственно на ногу контроллера на материнской плате кондиционера и способен выдавать лишь мизерный ток. При неудачном стечении обстоятельств, повесив питание ESP на эту линию, можно сжечь мозги кондиционеру.
## 4-проводное подключение (псевдо-USB)
Для 4-проводного подключения используется USB-коннектор. От настоящего USB здесь только коннектор. По пинам в этом разъеме UART и +12В..+14В питание.
**ВНИМАНИЕ!** С устройствами c настоящим USB этот интерфейс не совместим! Если вставить в разъём обычную USB-флешку или другое устройство, скорее всего оно просто сгорит.
**ВНИМАНИЕ №2!** В 2022-2023 производитель поменял распиновку и схему питания. Теперь кондиционеры на USB-коннектор выдают +8.5В. А пины RX и TX поменялись местами.
### Распиновка ###
<img src="https://github.com/GrKoR/esphome_aux_ac_component/blob/master/images/USB-pinout.png?raw=true" width="400">
1. +12В..+14В постоянного тока для кондиционеров до 2023 года, возможно +8.5В для кондиционеров 2022-2023 годов и моложе. В сервисном мануале на кондиционеры до 2022 года встречалось, что питание возможно до +16В.
2. RX кондиционера для моделей, произведенных примерно до 07.2022, TX кондиционера для более поздних модификаций. Высокий уровень +5В.
3. TX кондиционера для моделей, произведенных примерно до 07.2022, RX кондиционера для более поздних модификаций. Высокий уровень +5В.
4. земля.
Большое спасибо [@diabl0](https://github.com/diabl0) за эту распиновку ([issue #70](https://github.com/GrKoR/esphome_aux_ac_component/issues/70)).
Если вы не знаете, на каких именно пинах USB-разъема в вашем случае расположены TX и RX, то не бойтесь подключить наугад. Ни кондиционер, ни ESP не пострадают, если вы перепутаете линии TX и RX. Просто компонент не увидит кондиционер, о чем будут сообщения в логе. В таком случае просто попробуйте поменять TX и RX местами.
## Питание
Для питания ESP8266 можно использовать любой подходящий DC-DC преобразователь. Я использовал такой: Для питания ESP8266 можно использовать любой подходящий DC-DC преобразователь. Я использовал такой:
![power module](https://github.com/GrKoR/esphome_aux_ac_component/blob/master/images/DD4012SA.jpg?raw=true). ![power module](https://github.com/GrKoR/esphome_aux_ac_component/blob/master/images/DD4012SA.jpg?raw=true | width=200).
## Подключение ## ## Подключение ##
Черный провод (земля) подключается к земле DC-DC преобразователя и к пину GND модуля ESP8266. Черный провод (земля) подключается к земле DC-DC преобразователя и к пину GND модуля ESP8266.
@@ -25,7 +51,7 @@
Синий провод подключается к пину RXD модуля esp-12e. Синий провод подключается к пину RXD модуля esp-12e.
Красный провод подключается к пину TXD модуля esp-12e. Красный провод подключается к пину TXD модуля esp-12e.
**ВНИМАНИЕ!** Если вы используете не голый модуль esp32/esp8266, а плату типа NodeMCU, то не подключайте провода TX и RX кондиционера к пинам TX и RX платы! Используйте любые другие свободные пины для UART. При этом для ESP8266 UART будет программный, но это не страшно. Ресурсов ESP8266 хватит для работы. **ВНИМАНИЕ!** Если вы используете не голый модуль esp32/esp8266, а плату типа NodeMCU, то не подключайте провода TX и RX кондиционера к пинам TX и RX платы! *(TXD1/RXD1, TXD2/RXD2 также скорее всего не подойдут.)* Используйте любые другие свободные пины для UART. При этом для ESP8266 UART будет программный, но это не страшно. Ресурсов ESP8266 хватит для работы.
Использовать альтернативные пины для плат типа NodeMCU необходимо потому, что часто на линиях RX и TX этих плат установлены резисторы, а также на этих пинах висит USB-TTL конвертер (если он есть на плате). Эти компоненты мешают ESP наладить соединение с кондиционером. Использовать альтернативные пины для плат типа NodeMCU необходимо потому, что часто на линиях RX и TX этих плат установлены резисторы, а также на этих пинах висит USB-TTL конвертер (если он есть на плате). Эти компоненты мешают ESP наладить соединение с кондиционером.

View File

@@ -0,0 +1,18 @@
# How to request a feature for a component #
With any functions, the alignment is such that they simply cannot be written down by name.
We need a log from someone who has air conditioner with such functions. If you are such a person, then you can help yourself and the community.
To capture the log you need to do the following steps:
1. Run a specially written [tool](https://github.com/GrKoR/ac_python_logger) to collect logs.
2. Turn on the AC.
3. Wait 10+ seconds. (During this time, the ESP will receive all packets from AC).
4. Turn on the desired function using AC's IR remote.
5. Wait 10+ seconds ones more. While you are waiting, you can write down what you have done.
6. Turn off the desired function.
7. Wait 10+ seconds again and write down what you've done.
8. Repeat steps 4..7 for all other functions you interested in.
9. Stop the log recording with a script.
10. Send collected log and your notes (explanations to the log) to [issues](https://github.com/GrKoR/esphome_aux_ac_component/issues) or to [telegram chat](https://t.me/aux_ac).
Instead of a Python script from the step #1, you can simply save the logs from the esphome web-interface with copy-paste or from the command line, but there is a lot of extra stuff there. And it's easy to miss something. But in principle, it is also quite a working option.

View File

@@ -0,0 +1,17 @@
# Как запросить расширение функционала компонента #
С любыми новыми функциями кондиционера ситуация такая, что просто по названию из инструкции или с пульта их не сделать. Нужен лог от владельца кондиционера, у кого такие функции есть. Если вы такой владелей, то можете помочь себе и сообществу.
Последовательность действий такая:
1. Запускате специально написанную [тулзу](https://github.com/GrKoR/ac_python_logger) для сбора логов.
2. Включете кондиционер.
3. Ждёте 10+ секунд, чтобы все возможные типы пакетов прошли по UART на ESP.
4. Включаете нужную функцию с помощью ИК-пульта.
5. Опять ждёте 10+ секунд. Во время ожидания можно записать в отдельный текстовый файл или на бумажку, что именно сделано.
6. Выключаете нужную функцию.
7. Опять ждёте 10+ секунд, не забывая записывать комментарии по сделанному.
8. Повторяете шаги 4..7 для всех других функций, которые хочется иметь в компоненте `aux_ac`.
9. Останавливаете запись лога.
10. Отправляете собранный лог и свои заметки (пояснения к логу) в [issues](https://github.com/GrKoR/esphome_aux_ac_component/issues) или в [телеграм](https://t.me/aux_ac).
Вместо использования Python-скрипта можно логи из веб-интерфейса esphome сохранять копипастом или из командной строки. Но там много лишнего шлётся и легко что-то пропустить. Но в принципе это тоже вполне рабочий вариант.

View File

@@ -7,7 +7,8 @@ external_components:
esphome: esphome:
name: $devicename name: $devicename
platform: ESP8266
esp8266:
board: esp12e board: esp12e
wifi: wifi:
@@ -36,7 +37,8 @@ api:
password: !secret api_pass password: !secret api_pass
ota: ota:
password: !secret ota_pass - platform: esphome
password: !secret ota_pass
web_server: web_server:
port: 80 port: 80
@@ -65,6 +67,7 @@ climate:
period: 7s period: 7s
show_action: true show_action: true
display_inverted: true display_inverted: true
optimistic: true
indoor_temperature: indoor_temperature:
name: ${upper_devicename} Indoor Temperature name: ${upper_devicename} Indoor Temperature
id: ${devicename}_indoor_temp id: ${devicename}_indoor_temp
@@ -78,11 +81,11 @@ climate:
id: ${devicename}_outdoor_temp id: ${devicename}_outdoor_temp
internal: false internal: false
outbound_temperature: outbound_temperature:
name: ${upper_devicename} Colant Outbound Temperature name: ${upper_devicename} Coolant Outbound Temperature
id: ${devicename}_outbound_temp id: ${devicename}_outbound_temp
internal: false internal: false
inbound_temperature: inbound_temperature:
name: ${upper_devicename} Colant Inbound Temperature name: ${upper_devicename} Coolant Inbound Temperature
id: ${devicename}_inbound_temp id: ${devicename}_inbound_temp
internal: false internal: false
compressor_temperature: compressor_temperature:
@@ -93,9 +96,9 @@ climate:
name: ${upper_devicename} Defrost State name: ${upper_devicename} Defrost State
id: ${devicename}_defrost_state id: ${devicename}_defrost_state
internal: false internal: false
invertor_power: inverter_power:
name: ${upper_devicename} Invertor Power name: ${upper_devicename} Invertor Power
id: ${devicename}_invertor_power id: ${devicename}_inverter_power
internal: false internal: false
preset_reporter: preset_reporter:
name: ${upper_devicename} Preset Reporter name: ${upper_devicename} Preset Reporter
@@ -138,6 +141,8 @@ sensor:
unit_of_measurement: "dBa" unit_of_measurement: "dBa"
accuracy_decimals: 0 accuracy_decimals: 0
- platform: uptime
name: ${upper_devicename} Uptime Sensor
switch: switch:
- platform: template - platform: template
@@ -214,3 +219,15 @@ number:
- aux_ac.vlouver_set: - aux_ac.vlouver_set:
id: aux_id id: aux_id
position: !lambda "return x;" position: !lambda "return x;"
- platform: template
name: ${upper_devicename} Power Limit
id: ${devicename}_power_limit
icon: "mdi:battery-unknown"
mode: "slider"
min_value: 30
max_value: 100
step: 1
set_action:
then:
- lambda: !lambda "id(aux_id).powerLimitationOnSequence( x );"

View File

@@ -5,7 +5,8 @@ external_components:
esphome: esphome:
name: aux_air_conditioner name: aux_air_conditioner
platform: ESP8266
esp8266:
board: esp12e board: esp12e
# don't forget to set your's wifi settings! # don't forget to set your's wifi settings!
@@ -30,6 +31,7 @@ logger:
api: api:
ota: ota:
- platform: esphome
# UART0 configuration for AUX air conditioner communication # UART0 configuration for AUX air conditioner communication
uart: uart:

BIN
images/USB-pinout.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 86 KiB

10
tests/.gitignore vendored
View File

@@ -1,10 +0,0 @@
# Gitignore settings for ESPHome
# This is an example and may include too much for your use-case.
# You can modify this file to suit your needs.
/.esphome/
**/.pioenvs/
**/.piolibdeps/
**/lib/
**/src/
**/platformio.ini
/secrets.yaml

View File

@@ -1,191 +0,0 @@
import time
import aioesphomeapi
import asyncio
import re
import sys
import argparse
from aioesphomeapi.api_pb2 import (LOG_LEVEL_NONE,
LOG_LEVEL_ERROR,
LOG_LEVEL_WARN,
LOG_LEVEL_INFO,
LOG_LEVEL_DEBUG,
LOG_LEVEL_VERBOSE,
LOG_LEVEL_VERY_VERBOSE)
def createParser ():
parser = argparse.ArgumentParser(
description='''This script is used for collecting logs from ac_aux ESPHome component.
For more info, see https://github.com/GrKoR/ac_python_logger''',
add_help = False)
parent_group = parser.add_argument_group (title='Params')
parent_group.add_argument ('--help', '-h', action='help', help='show this help message and exit')
parent_group.add_argument ('-i', '--ip', nargs=1, required=True, help='IP address of the esphome device')
parent_group.add_argument ('-p', '--pwd', nargs=1, required=True, help='native API password for the esphome device')
return parser
async def main():
"""Connect to an ESPHome device and wait for state changes."""
api = aioesphomeapi.APIClient(namespace.ip[0], 6053, namespace.pwd[0])
try:
await api.connect(login=True)
except aioesphomeapi.InvalidAuthAPIError as e:
return print(e)
print(api.api_version)
async def display_off():
await api.execute_service(
service,
data={
# 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
"data_buf": [0xBB, 0x00, 0x06, 0x80, 0x01, 0x00, 0x0F, 0x00, 0x01, 0x01, 0x97, 0xE0, 0x00, 0x20, 0x00, 0xC0, 0x00, 0x00, 0x20, 0x00, 0x10, 0x00, 0x00],
}
)
async def display_on():
await api.execute_service(
service,
data={
# 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
"data_buf": [0xBB, 0x00, 0x06, 0x80, 0x01, 0x00, 0x0F, 0x00, 0x01, 0x01, 0x97, 0xE0, 0x00, 0x20, 0x00, 0xC0, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00],
}
)
async def ac_enable():
await api.execute_service(
service,
data={
# 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
"data_buf": [0xBB, 0x00, 0x06, 0x80, 0x00, 0x00, 0x0F, 0x00, 0x01, 0x00, 0x87, 0xE0, 0x2F, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00],
}
)
async def ac_disable():
await api.execute_service(
service,
data={
# 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
"data_buf": [0xBB, 0x00, 0x06, 0x80, 0x00, 0x00, 0x0F, 0x00, 0x01, 0x00, 0x87, 0xE0, 0x2F, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00],
}
)
async def ac_get11_01():
await api.execute_service(
service,
data={
# 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
"data_buf": [0xBB, 0x00, 0x06, 0x80, 0x00, 0x00, 0x02, 0x00, 0x11, 0x01],
}
)
async def ac_get11_00():
await api.execute_service(
service,
data={
# 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
"data_buf": [0xBB, 0x00, 0x06, 0x80, 0x00, 0x00, 0x02, 0x00, 0x11, 0x00],
}
)
async def ac_set_vlouver(lvr):
await api.execute_service(
service,
data={
# 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
"data_buf": [0xBB, 0x00, 0x06, 0x80, 0x00, 0x00, 0x0F, 0x00, 0x01, 0x01, lvr, 0xE0, 0x00, 0x20, 0x00, 0xC0, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00],
}
)
async def ac_set_hlouver(lvr):
await api.execute_service(
service,
data={
# 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
"data_buf": [0xBB, 0x00, 0x06, 0x80, 0x00, 0x00, 0x0F, 0x00, 0x01, 0x01, 0x97, lvr, 0x00, 0x20, 0x00, 0xC0, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00],
}
)
# key надо искать в выводе list_entities_services
service = aioesphomeapi.UserService(
name="send_data",
key=311254518,
args=[
aioesphomeapi.UserServiceArg(name="data_buf", type=aioesphomeapi.UserServiceArgType.INT_ARRAY),
],
)
time.sleep(7)
await ac_get11_00()
time.sleep(7)
await ac_get11_01()
#await ac_set_vlouver( 0b10010000 ) # swing on
#await ac_set_vlouver( 0b10010111 ) # swing off
#await ac_set_vlouver( 0b10010001 ) # 1
#await ac_set_vlouver( 0b10010010 ) # 2
#await ac_set_vlouver( 0b10010011 ) # 3
#await ac_set_vlouver( 0b10010100 ) # 4
#await ac_set_vlouver( 0b10010101 ) # 5
#await ac_set_vlouver( 0b10010110 ) # не работает, сбрасывает на swing on
#time.sleep(5)
#await ac_set_hlouver( 0b00000000 ) # swing on
#await ac_set_hlouver( 0b11100000 ) # swing off
#await ac_set_hlouver( 0b00100000 ) # не работает, сбрасывает в swing off
#await ac_set_hlouver( 0b01000000 ) # не работает, сбрасывает в swing off
#await ac_set_hlouver( 0b01100000 ) # не работает, сбрасывает в swing off
#await ac_set_hlouver( 0b10000000 ) # не работает, сбрасывает в swing off
#await ac_set_hlouver( 0b10100000 ) # не работает, сбрасывает в swing off
#await ac_set_hlouver( 0b11000000 ) # не работает, сбрасывает в swing off
#time.sleep(5)
async def test_byte(bt):
await api.execute_service(
service,
data={
#display on
# 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
#"data_buf": [0xBB, 0x00, 0x06, 0x80, 0x00, 0x00, 0x0F, 0x00, 0x01, 0x01, 0x97, 0xE0, 0x00, 0x20, 0x00, 0xC0, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00],
#display off
# 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
"data_buf": [0xBB, 0x00, 0x06, 0x80, 0x00, 0x00, 0x0F, 0x00, 0x01, 0x01, 0x97, 0xE0, 0x00, 0x20, 0x00, 0xC0, 0x00, 0x00, 0x20, 0x00, 0x10, 0x00, 0x00],
# swing on
# 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
#"data_buf": [0xBB, 0x00, 0x06, 0x80, 0x00, 0x00, 0x0F, 0x00, 0x01, 0x01, 0x90, 0xE0, 0x00, 0x20, 0x00, 0xC0, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00],
# swing off
# 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
#"data_buf": [0xBB, 0x00, 0x06, 0x80, 0x00, 0x00, 0x0F, 0x00, 0x01, 0x01, 0x97, 0xE0, 0x00, 0x20, 0x00, 0xC0, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00],
}
)
'''
не проходит команда, если байт 1 или 7 не 0x00
не проходит команда, если байт 3 не 0x80
проходит и не меняется, если меняю байт 4 или 5
'''
#await test_byte(0b10000110)
#await test_byte(0b01000110)
#await test_byte(0b00100110)
#await test_byte(0b00010110)
time.sleep(2)
parser = createParser()
namespace = parser.parse_args()
print("IP: ", namespace.ip[0])
loop = asyncio.get_event_loop()
try:
#asyncio.ensure_future(main())
#loop.run_forever()
loop.run_until_complete(main())
except aioesphomeapi.InvalidAuthAPIError as e:
print(e)
except KeyboardInterrupt:
pass
finally:
loop.close()
pass

View File

@@ -1,121 +0,0 @@
external_components:
- source: github://GrKoR/esphome_aux_ac_component@dev
components: [ aux_ac ]
refresh: 0s
substitutions:
devicename: test_aux_ac_ext_esp32
upper_devicename: Test AUX
esphome:
name: $devicename
platform: ESP32
board: nodemcu-32s
wifi:
ssid: !secret wifi_ssid
password: !secret wifi_pass
manual_ip:
static_ip: 192.168.0.151 # Для примера
gateway: !secret wifi_gateway
subnet: !secret wifi_subnet
dns1: 8.8.8.8
dns2: 1.1.1.1
reboot_timeout: 0s
ap:
ssid: Test AUX Fallback Hotspot
password: !secret wifi_ap_pass
logger:
level: DEBUG
baud_rate: 0
api:
password: !secret api_pass
reboot_timeout: 0s
ota:
password: !secret ota_pass
uart:
id: ac_uart_bus
#tx_pin: GPIO1
#rx_pin: GPIO3
tx_pin: TX
rx_pin: RX
baud_rate: 4800
data_bits: 8
parity: EVEN
stop_bits: 1
sensor:
- platform: uptime
name: Uptime Sensor
climate:
- platform: aux_ac
name: $upper_devicename
id: aux_id
uart_id: ac_uart_bus
period: 7s
show_action: true
display_inverted: true
indoor_temperature:
name: $upper_devicename Indoor Temperature
id: ${devicename}_indoor_temp
internal: false
display_state:
name: $upper_devicename Display State
id: ${devicename}_display_state
internal: false
outdoor_temperature:
name: $upper_devicename Outdoor Temperature
id: ${devicename}_outdoor_temp
internal: false
outbound_temperature:
name: $upper_devicename Colant Outbound Temperature
id: ${devicename}_outbound_temp
internal: false
inbound_temperature:
name: $upper_devicename Colant Inbound Temperature
id: ${devicename}_inbound_temp
internal: false
compressor_temperature:
name: $upper_devicename Compressor Temperature
id: ${devicename}_strange_temp
internal: false
defrost_state:
name: $upper_devicename Defrost State
id: ${devicename}_defrost_state
internal: false
invertor_power:
name: $upper_devicename Invertor Power
id: ${devicename}_invertor_power
internal: false
preset_reporter:
name: $upper_devicename Preset Reporter
id: ${devicename}_preset_reporter
internal: false
visual:
min_temperature: 16
max_temperature: 32
temperature_step: 0.5
supported_modes:
- HEAT_COOL
- COOL
- HEAT
- DRY
- FAN_ONLY
custom_fan_modes:
- MUTE
- TURBO
supported_presets:
- SLEEP
custom_presets:
- CLEAN
- HEALTH
- ANTIFUNGUS
supported_swing_modes:
- VERTICAL
- HORIZONTAL
- BOTH

View File

@@ -1,155 +0,0 @@
external_components:
- source: github://GrKoR/esphome_aux_ac_component@dev
components: [ aux_ac ]
refresh: 0s
substitutions:
devicename: test_aux_ac_ext_engeneer
upper_devicename: Test AUX
esphome:
name: $devicename
platform: ESP8266
board: esp12e
wifi:
ssid: !secret wifi_ssid
password: !secret wifi_pass
manual_ip:
static_ip: !secret wifi_ip
gateway: !secret wifi_gateway
subnet: !secret wifi_subnet
dns1: 8.8.8.8
dns2: 1.1.1.1
reboot_timeout: 0s
ap:
ssid: Test AUX Fallback Hotspot
password: !secret wifi_ap_pass
logger:
level: DEBUG
baud_rate: 0
api:
password: !secret api_pass
reboot_timeout: 0s
services:
# этот сервис можно вызвать из Home Assistant или Python. Он отправляет полученные байты в кондиционер
- service: send_data
variables:
data_buf: int[]
then:
# ВАЖНО! Только для инженеров!
# Вызывайте метод aux_ac.send_packet только если понимаете, что делаете! Он не проверяет данные, а передаёт
# кондиционеру всё как есть. Какой эффект получится от передачи кондиционеру рандомных байт, никто не знает.
# Вы действуете на свой страх и риск.
- aux_ac.send_packet:
id: aux_id
data: !lambda |-
std::vector<uint8_t> data{};
for (int n : data_buf) {
data.push_back( (uint8_t) n );
}
return data;
ota:
password: !secret ota_pass
web_server:
port: 80
uart:
id: ac_uart_bus
tx_pin: GPIO1
rx_pin: GPIO3
baud_rate: 4800
data_bits: 8
parity: EVEN
stop_bits: 1
sensor:
- platform: uptime
name: Uptime Sensor
climate:
- platform: aux_ac
name: $upper_devicename
id: aux_id
uart_id: ac_uart_bus
period: 7s
show_action: true
display_inverted: true
indoor_temperature:
name: $upper_devicename Indoor Temperature
id: ${devicename}_indoor_temp
internal: false
display_state:
name: $upper_devicename Display State
id: ${devicename}_display_state
internal: false
outdoor_temperature:
name: $upper_devicename Outdoor Temperature
id: ${devicename}_outdoor_temp
internal: false
outbound_temperature:
name: $upper_devicename Colant Outbound Temperature
id: ${devicename}_outbound_temp
internal: false
inbound_temperature:
name: $upper_devicename Colant Inbound Temperature
id: ${devicename}_inbound_temp
internal: false
compressor_temperature:
name: $upper_devicename Compressor Temperature
id: ${devicename}_strange_temp
internal: false
defrost_state:
name: $upper_devicename Defrost State
id: ${devicename}_defrost_state
internal: false
invertor_power:
name: $upper_devicename Invertor Power
id: ${devicename}_invertor_power
internal: false
preset_reporter:
name: $upper_devicename Preset Reporter
id: ${devicename}_preset_reporter
internal: false
visual:
min_temperature: 16
max_temperature: 32
temperature_step: 0.5
supported_modes:
- HEAT_COOL
- COOL
- HEAT
- DRY
- FAN_ONLY
custom_fan_modes:
- MUTE
- TURBO
supported_presets:
- SLEEP
custom_presets:
- CLEAN
- HEALTH
- ANTIFUNGUS
supported_swing_modes:
- VERTICAL
- HORIZONTAL
- BOTH
switch:
- platform: template
name: AC Display
lambda: |-
if (id(${devicename}_display_state).state) {
return true;
} else {
return false;
}
turn_on_action:
- aux_ac.display_on: aux_id
turn_off_action:
- aux_ac.display_off: aux_id

View File

@@ -1,162 +0,0 @@
external_components:
- source: github://GrKoR/esphome_aux_ac_component@dev
components: [ aux_ac ]
refresh: 0s
substitutions:
devicename: test_ext_power_limitations
upper_devicename: Test AUX
esphome:
name: $devicename
platform: ESP8266
board: esp12e
wifi:
ssid: !secret wifi_ssid
password: !secret wifi_pass
manual_ip:
static_ip: !secret wifi_ip
gateway: !secret wifi_gateway
subnet: !secret wifi_subnet
dns1: 8.8.8.8
dns2: 1.1.1.1
reboot_timeout: 0s
ap:
ssid: Test AUX Fallback Hotspot
password: !secret wifi_ap_pass
logger:
level: DEBUG
baud_rate: 0
api:
password: !secret api_pass
reboot_timeout: 0s
ota:
password: !secret ota_pass
web_server:
port: 80
uart:
id: ac_uart_bus
tx_pin: GPIO1
rx_pin: GPIO3
baud_rate: 4800
data_bits: 8
parity: EVEN
stop_bits: 1
sensor:
- platform: uptime
name: Uptime Sensor
climate:
- platform: aux_ac
name: $upper_devicename
id: aux_id
uart_id: ac_uart_bus
period: 7s
show_action: true
display_inverted: true
timeout: 150
indoor_temperature:
name: $upper_devicename Indoor Temperature
id: ${devicename}_indoor_temp
internal: false
display_state:
name: $upper_devicename Display State
id: ${devicename}_display_state
internal: false
outdoor_temperature:
name: $upper_devicename Outdoor Temperature
id: ${devicename}_outdoor_temp
internal: false
outbound_temperature:
name: $upper_devicename Colant Outbound Temperature
id: ${devicename}_outbound_temp
internal: false
inbound_temperature:
name: $upper_devicename Colant Inbound Temperature
id: ${devicename}_inbound_temp
internal: false
compressor_temperature:
name: $upper_devicename Compressor Temperature
id: ${devicename}_strange_temp
internal: false
defrost_state:
name: $upper_devicename Defrost State
id: ${devicename}_defrost_state
internal: false
inverter_power:
name: $upper_devicename Inverter Power
id: ${devicename}_invertor_power
internal: false
preset_reporter:
name: $upper_devicename Preset Reporter
id: ${devicename}_preset_reporter
internal: false
inverter_power_limit_value:
name: $upper_devicename Inverter Power Limit Value
id: ${devicename}_inverter_power_limit_value
internal: false
inverter_power_limit_state:
name: $upper_devicename Inverter Power Limit State
id: ${devicename}_inverter_power_limit_state
internal: false
visual:
min_temperature: 16
max_temperature: 32
temperature_step: 0.5
supported_modes:
- HEAT_COOL
- COOL
- HEAT
- DRY
- FAN_ONLY
custom_fan_modes:
- MUTE
- TURBO
supported_presets:
- SLEEP
custom_presets:
- CLEAN
- HEALTH
- ANTIFUNGUS
supported_swing_modes:
- VERTICAL
- HORIZONTAL
- BOTH
button:
- platform: template
name: ${upper_devicename} IPower Limit Off
icon: "mdi:power-plug-off-outline"
on_press:
- aux_ac.power_limit_off: aux_id
- platform: template
name: ${upper_devicename} IPower Limit On Half
icon: "mdi:fraction-one-half"
on_press:
- aux_ac.power_limit_on:
id: aux_id
limit: 50
number:
- platform: template
name: ${upper_devicename} IPower Limit Value
id: ${devicename}_ipower_limit_value
icon: "mdi:battery-unknown"
mode: "slider"
min_value: 30
max_value: 100
step: 1
set_action:
then:
- lambda: !lambda |-
id(aux_id).powerLimitationOnSequence( x );

View File

@@ -1,125 +0,0 @@
external_components:
- source:
type: local
path: ..\components
substitutions:
devicename: test_local_airflow_dir
upper_devicename: Test AUX
esphome:
name: $devicename
platform: ESP8266
board: esp12e
wifi:
ssid: !secret wifi_ssid
password: !secret wifi_pass
manual_ip:
static_ip: !secret wifi_ip
gateway: !secret wifi_gateway
subnet: !secret wifi_subnet
dns1: 8.8.8.8
dns2: 1.1.1.1
reboot_timeout: 0s
ap:
ssid: $upper_devicename Fallback Hotspot
password: !secret wifi_ap_pass
logger:
level: DEBUG
baud_rate: 0
api:
password: !secret api_pass
reboot_timeout: 0s
ota:
password: !secret ota_pass
web_server:
port: 80
uart:
id: ac_uart_bus
tx_pin: GPIO1
rx_pin: GPIO3
baud_rate: 4800
data_bits: 8
parity: EVEN
stop_bits: 1
sensor:
- platform: uptime
name: Uptime Sensor
climate:
- platform: aux_ac
name: $upper_devicename
id: aux_id
uart_id: ac_uart_bus
period: 7s
show_action: true
display_inverted: true
button:
- platform: template
name: ${upper_devicename} VLouver Stop
icon: "mdi:circle-small"
on_press:
- aux_ac.vlouver_stop: aux_id
- platform: template
name: ${upper_devicename} VLouver Swing
icon: "mdi:pan-vertical"
on_press:
- aux_ac.vlouver_swing: aux_id
- platform: template
name: ${upper_devicename} VLouver Top
icon: "mdi:pan-up"
on_press:
- aux_ac.vlouver_top: aux_id
- platform: template
name: ${upper_devicename} VLouver Middle Above
icon: "mdi:pan-top-left"
on_press:
- aux_ac.vlouver_middle_above: aux_id
- platform: template
name: ${upper_devicename} VLouver Middle
icon: "mdi:pan-left"
on_press:
- aux_ac.vlouver_middle: aux_id
- platform: template
name: ${upper_devicename} VLouver Middle Below
icon: "mdi:pan-bottom-left"
on_press:
- aux_ac.vlouver_middle_below: aux_id
- platform: template
name: ${upper_devicename} VLouver Bottom
icon: "mdi:pan-down"
on_press:
- aux_ac.vlouver_bottom: aux_id
number:
- platform: template
name: ${upper_devicename} Vertical Louver
id: ${devicename}_vlouver
icon: "mdi:circle-small"
mode: "slider"
min_value: 0
max_value: 6
step: 1
set_action:
then:
- lambda: !lambda |-
if (x == 6) x = 7; // делаем так, чтобы выключение отрабатывать корректно
id(aux_id).setVLouverSequence( static_cast<esphome::aux_ac::ac_louver_V>(x) );

View File

@@ -1,162 +0,0 @@
external_components:
- source:
type: local
path: ../components
substitutions:
devicename: test_local_power_limitations
upper_devicename: Test AUX
esphome:
name: $devicename
platform: ESP8266
board: esp12e
wifi:
ssid: !secret wifi_ssid
password: !secret wifi_pass
manual_ip:
static_ip: !secret wifi_ip
gateway: !secret wifi_gateway
subnet: !secret wifi_subnet
dns1: 8.8.8.8
dns2: 1.1.1.1
reboot_timeout: 0s
ap:
ssid: Test AUX Fallback Hotspot
password: !secret wifi_ap_pass
logger:
level: DEBUG
baud_rate: 0
api:
password: !secret api_pass
reboot_timeout: 0s
ota:
password: !secret ota_pass
web_server:
port: 80
uart:
id: ac_uart_bus
tx_pin: GPIO1
rx_pin: GPIO3
baud_rate: 4800
data_bits: 8
parity: EVEN
stop_bits: 1
sensor:
- platform: uptime
name: Uptime Sensor
climate:
- platform: aux_ac
name: $upper_devicename
id: aux_id
uart_id: ac_uart_bus
period: 7s
show_action: true
display_inverted: true
timeout: 150
indoor_temperature:
name: $upper_devicename Indoor Temperature
id: ${devicename}_indoor_temp
internal: false
display_state:
name: $upper_devicename Display State
id: ${devicename}_display_state
internal: false
outdoor_temperature:
name: $upper_devicename Outdoor Temperature
id: ${devicename}_outdoor_temp
internal: false
outbound_temperature:
name: $upper_devicename Colant Outbound Temperature
id: ${devicename}_outbound_temp
internal: false
inbound_temperature:
name: $upper_devicename Colant Inbound Temperature
id: ${devicename}_inbound_temp
internal: false
compressor_temperature:
name: $upper_devicename Compressor Temperature
id: ${devicename}_strange_temp
internal: false
defrost_state:
name: $upper_devicename Defrost State
id: ${devicename}_defrost_state
internal: false
inverter_power:
name: $upper_devicename Inverter Power
id: ${devicename}_invertor_power
internal: false
preset_reporter:
name: $upper_devicename Preset Reporter
id: ${devicename}_preset_reporter
internal: false
inverter_power_limit_value:
name: $upper_devicename Inverter Power Limit Value
id: ${devicename}_inverter_power_limit_value
internal: false
inverter_power_limit_state:
name: $upper_devicename Inverter Power Limit State
id: ${devicename}_inverter_power_limit_state
internal: false
visual:
min_temperature: 16
max_temperature: 32
temperature_step: 0.5
supported_modes:
- HEAT_COOL
- COOL
- HEAT
- DRY
- FAN_ONLY
custom_fan_modes:
- MUTE
- TURBO
supported_presets:
- SLEEP
custom_presets:
- CLEAN
- HEALTH
- ANTIFUNGUS
supported_swing_modes:
- VERTICAL
- HORIZONTAL
- BOTH
button:
- platform: template
name: ${upper_devicename} IPower Limit Off
icon: "mdi:power-plug-off-outline"
on_press:
- aux_ac.power_limit_off: aux_id
- platform: template
name: ${upper_devicename} IPower Limit On Half
icon: "mdi:fraction-one-half"
on_press:
- aux_ac.power_limit_on:
id: aux_id
limit: 50
number:
- platform: template
name: ${upper_devicename} IPower Limit Value
id: ${devicename}_ipower_limit_value
icon: "mdi:battery-unknown"
mode: "slider"
min_value: 30
max_value: 100
step: 1
set_action:
then:
- lambda: !lambda |-
id(aux_id).powerLimitationOnSequence( x );

View File

@@ -1,122 +0,0 @@
external_components:
- source:
type: local
path: ..\components
substitutions:
devicename: test_local_airflow_dir
upper_devicename: Test AUX
esphome:
name: $devicename
platform: ESP8266
board: esp12e
wifi:
ssid: !secret wifi_ssid
password: !secret wifi_pass
manual_ip:
static_ip: !secret wifi_ip
gateway: !secret wifi_gateway
subnet: !secret wifi_subnet
dns1: 8.8.8.8
dns2: 1.1.1.1
reboot_timeout: 0s
ap:
ssid: Test AUX Fallback Hotspot
password: !secret wifi_ap_pass
logger:
level: DEBUG
baud_rate: 0
api:
password: !secret api_pass
reboot_timeout: 0s
ota:
password: !secret ota_pass
web_server:
port: 80
uart:
id: ac_uart_bus
tx_pin: GPIO1
rx_pin: GPIO3
baud_rate: 4800
data_bits: 8
parity: EVEN
stop_bits: 1
sensor:
- platform: uptime
name: Uptime Sensor
climate:
- platform: aux_ac
name: $upper_devicename
id: aux_id
uart_id: ac_uart_bus
period: 7s
show_action: true
display_inverted: true
indoor_temperature:
name: $upper_devicename Indoor Temperature
id: ${devicename}_indoor_temp
internal: false
display_state:
name: $upper_devicename Display State
id: ${devicename}_display_state
internal: false
outdoor_temperature:
name: $upper_devicename Outdoor Temperature
id: ${devicename}_outdoor_temp
internal: false
outbound_temperature:
name: $upper_devicename Colant Outbound Temperature
id: ${devicename}_outbound_temp
internal: false
inbound_temperature:
name: $upper_devicename Colant Inbound Temperature
id: ${devicename}_inbound_temp
internal: false
compressor_temperature:
name: $upper_devicename Compressor Temperature
id: ${devicename}_strange_temp
internal: false
defrost_state:
name: $upper_devicename Defrost State
id: ${devicename}_defrost_state
internal: false
invertor_power:
name: $upper_devicename Invertor Power
id: ${devicename}_invertor_power
internal: false
preset_reporter:
name: $upper_devicename Preset Reporter
id: ${devicename}_preset_reporter
internal: false
visual:
min_temperature: 16
max_temperature: 32
temperature_step: 0.5
supported_modes:
- HEAT_COOL
- COOL
- HEAT
- DRY
- FAN_ONLY
custom_fan_modes:
- MUTE
- TURBO
supported_presets:
- SLEEP
custom_presets:
- CLEAN
- HEALTH
- ANTIFUNGUS
supported_swing_modes:
- VERTICAL
- HORIZONTAL
- BOTH

View File

@@ -1,48 +0,0 @@
external_components:
- source:
type: local
path: ..\components
#- source: github://GrKoR/esphome_aux_ac_component@dev
#components: [ aux_ac ]
#refresh: 0s
substitutions:
devicename: test_local_minimal
upper_devicename: Test AUX
esphome:
name: $devicename
platform: ESP8266
board: esp12e
wifi:
ssid: !secret wifi_ssid
password: !secret wifi_pass
reboot_timeout: 0s
ap:
ssid: Test AUX Fallback Hotspot
password: !secret wifi_ap_pass
logger:
level: DEBUG
baud_rate: 0
api:
password: !secret api_pass
reboot_timeout: 0s
ota:
password: !secret ota_pass
uart:
id: ac_uart_bus
tx_pin: GPIO1
rx_pin: GPIO3
baud_rate: 4800
data_bits: 8
parity: EVEN
stop_bits: 1
climate:
- platform: aux_ac
name: $upper_devicename