mirror of
https://github.com/GrKoR/esphome_aux_ac_component.git
synced 2025-12-06 11:36:55 +03:00
Compare commits
178 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
efa0991dd0 | ||
|
|
2e0c421c9f | ||
|
|
53414d8ab4 | ||
|
|
5a165d3a3d | ||
|
|
02887baa04 | ||
|
|
5f9d2c0c0f | ||
|
|
7a4bacfb9a | ||
|
|
c959d7be7e | ||
|
|
60d6f56fcf | ||
|
|
a8eba8882e | ||
|
|
96455e5882 | ||
|
|
89db23434b | ||
|
|
945d2603f1 | ||
|
|
6291828cec | ||
|
|
8dc9f0f478 | ||
|
|
03e0ee0d9a | ||
|
|
848fd8f6c1 | ||
|
|
e77d49c52a | ||
|
|
42fd8d5ba1 | ||
|
|
00aa426bfc | ||
|
|
029d92be96 | ||
|
|
d1e64af8a4 | ||
|
|
d238c8b661 | ||
|
|
140447ceab | ||
|
|
6920102969 | ||
|
|
f20f89cb93 | ||
|
|
6a98c47ada | ||
|
|
b5e88f7abc | ||
|
|
a166d18ede | ||
|
|
7de56fb656 | ||
|
|
cf5c88662d | ||
|
|
a7d2a73802 | ||
|
|
078a6b20cf | ||
|
|
69eebdb8c8 | ||
|
|
fe00198764 | ||
|
|
da5fcd5848 | ||
|
|
9d4930d290 | ||
|
|
26ae9c248c | ||
|
|
e67898997d | ||
|
|
e158586268 | ||
|
|
2d446f88e4 | ||
|
|
5591b91f7b | ||
|
|
551c476549 | ||
|
|
bdbd1478b7 | ||
|
|
9c2daf0615 | ||
|
|
3ca873450d | ||
|
|
5e1b78df9f | ||
|
|
7a252e5955 | ||
|
|
79f23c341d | ||
|
|
360d274088 | ||
|
|
973f961e5f | ||
|
|
cf990eb467 | ||
|
|
1c6575a264 | ||
|
|
7f68f3fdac | ||
|
|
e7bca33f35 | ||
|
|
f859e656a4 | ||
|
|
5b229da380 | ||
|
|
656344dda6 | ||
|
|
b10a2f5dab | ||
|
|
b80f4972f0 | ||
|
|
2a38208628 | ||
|
|
07a98e5789 | ||
|
|
fe323a6f65 | ||
|
|
584ef0d57a | ||
|
|
d15272f437 | ||
|
|
23584bf53a | ||
|
|
1b3bcdfa0f | ||
|
|
558922047e | ||
|
|
9f362f475b | ||
|
|
dad7025632 | ||
|
|
16824c10cc | ||
|
|
f31cfb3c16 | ||
|
|
35d0364655 | ||
|
|
25ab6feb4f | ||
|
|
3f1b31bb52 | ||
|
|
06388ebb2c | ||
|
|
1f11db4ae0 | ||
|
|
87f686564e | ||
|
|
37c261700b | ||
|
|
789053e4be | ||
|
|
f8d3714871 | ||
|
|
e5704ba869 | ||
|
|
e3e60e4f4f | ||
|
|
e98c67e75e | ||
|
|
3f1e928a09 | ||
|
|
507fc06813 | ||
|
|
a48ec376b1 | ||
|
|
c2dfbefbcf | ||
|
|
f324cd1a0e | ||
|
|
4bd5c4509d | ||
|
|
8228ee0777 | ||
|
|
453f697c48 | ||
|
|
82a17f0247 | ||
|
|
d14ed9650d | ||
|
|
e7377604ba | ||
|
|
2f0f514ea6 | ||
|
|
394e64e1f8 | ||
|
|
fcbc853835 | ||
|
|
c8d661377f | ||
|
|
9c6faeecb8 | ||
|
|
8afa70a999 | ||
|
|
ca9a76124c | ||
|
|
dacd435177 | ||
|
|
bf8ab77c02 | ||
|
|
61cad07acc | ||
|
|
3110c482c9 | ||
|
|
53a886f818 | ||
|
|
2d4162323a | ||
|
|
74d555b5e1 | ||
|
|
7df8ab3cc2 | ||
|
|
90d9a5cfa7 | ||
|
|
864ad07699 | ||
|
|
e595a4acf9 | ||
|
|
3db80a19b7 | ||
|
|
b7a794e52b | ||
|
|
ba9f41d3be | ||
|
|
93a034f2be | ||
|
|
151e5af043 | ||
|
|
f143240089 | ||
|
|
dfc299b321 | ||
|
|
8acae30989 | ||
|
|
58f09bd280 | ||
|
|
70d127a302 | ||
|
|
7765e080d2 | ||
|
|
33f6dd6ef0 | ||
|
|
1fa581be3d | ||
|
|
5fab934d8c | ||
|
|
92b9908bf3 | ||
|
|
be67e1e4ce | ||
|
|
c10d314581 | ||
|
|
fa05c40677 | ||
|
|
92b3930413 | ||
|
|
6bfb9489bd | ||
|
|
c868e5b49b | ||
|
|
cdd97b8da3 | ||
|
|
9c7be5ffc0 | ||
|
|
20f3061d12 | ||
|
|
945cc96ea2 | ||
|
|
fcd5a97210 | ||
|
|
8b17ca7052 | ||
|
|
935e97e795 | ||
|
|
a0b8dcdce1 | ||
|
|
affb3bde06 | ||
|
|
b6d09a132e | ||
|
|
579b6aaf87 | ||
|
|
7013acef59 | ||
|
|
f6f7887fe7 | ||
|
|
0b774546e8 | ||
|
|
1031f6a885 | ||
|
|
abf9c15c39 | ||
|
|
31af2c546c | ||
|
|
db23c365db | ||
|
|
eb202e2f49 | ||
|
|
abb9188642 | ||
|
|
276d8ef7a7 | ||
|
|
78ec13f9f9 | ||
|
|
1c04078b57 | ||
|
|
d776dcf4fe | ||
|
|
22e64b647c | ||
|
|
c6a800cdcd | ||
|
|
ba2a19e564 | ||
|
|
135d6b55a8 | ||
|
|
a465dbc89a | ||
|
|
efe7c1a93a | ||
|
|
13bb0baa69 | ||
|
|
62e83cb41b | ||
|
|
e9cad615fb | ||
|
|
4274a11ed5 | ||
|
|
a8b6f7c9e0 | ||
|
|
766a4bd693 | ||
|
|
8d782b1070 | ||
|
|
7640cca9f2 | ||
|
|
cc4a48f964 | ||
|
|
18ca3cf72a | ||
|
|
ad810b1a83 | ||
|
|
11a3440a56 | ||
|
|
6d4a4268e6 | ||
|
|
5bad8732e2 |
4
.gitignore
vendored
4
.gitignore
vendored
@@ -12,6 +12,6 @@
|
||||
**/livingroom_ac/
|
||||
**/kitchen_ac/
|
||||
/examples/*/*.h
|
||||
**/tests/test_*
|
||||
**/__pycache__
|
||||
**/private/
|
||||
**/private/
|
||||
**/tests
|
||||
61
README-EN.md
61
README-EN.md
@@ -2,15 +2,15 @@
|
||||
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.
|
||||
|
||||
There is also a [detailed instruction describing how to properly request a feature](docs/HOW_TO_FEATURE_REQUEST-EN.md).
|
||||
|
||||
## 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.
|
||||
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 ##
|
||||
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.
|
||||
|
||||
|
||||
@@ -21,32 +21,22 @@ There is the following list of AUX-based air conditioner on the internet: AUX, A
|
||||
### 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 />
|
||||
|
||||
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 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 />
|
||||
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.
|
||||
|
||||
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 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).
|
||||
1. If your AC is listed above, you should take a closer look at `aux_ac`.<br />
|
||||
2. If something about AUX is written on the nameplate of the air conditioner in the manufacturer line.<br />
|
||||
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 />
|
||||
<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">
|
||||
|
||||
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 ##
|
||||
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 ###
|
||||
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 ##
|
||||
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
|
||||
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:
|
||||
```yaml
|
||||
uart:
|
||||
@@ -99,7 +97,8 @@ climate:
|
||||
period: 7s
|
||||
show_action: true
|
||||
display_inverted: false
|
||||
timeout: 150
|
||||
timeout: 150
|
||||
optimistic: true
|
||||
indoor_temperature:
|
||||
name: AC Indoor Temperature
|
||||
id: ac_indoor_temp
|
||||
@@ -110,11 +109,11 @@ climate:
|
||||
id: ac_outdoor_temp
|
||||
internal: false
|
||||
outbound_temperature:
|
||||
name: AC Colant Outbound Temperature
|
||||
name: AC Coolant Outbound Temperature
|
||||
id: ac_outbound_temp
|
||||
internal: false
|
||||
inbound_temperature:
|
||||
name: AC Colant Inbound Temperature
|
||||
name: AC Coolant Inbound Temperature
|
||||
id: ac_inbound_temp
|
||||
internal: false
|
||||
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.
|
||||
|
||||
- **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;
|
||||
- IDLE: AC is working in the FAN mode, cause the target temperature is reached;
|
||||
- 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 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.
|
||||
- **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.
|
||||
@@ -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_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).
|
||||
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 ##
|
||||
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 ##
|
||||
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 />
|
||||
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 />
|
||||
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.
|
||||
|
||||
If you try to compile `ac_common.yaml` it will raise errors. You need to compile `ac_kitchen.yaml` or `ac_livingroom.yaml` instead.
|
||||
|
||||
45
README.md
45
README.md
@@ -1,17 +1,18 @@
|
||||
# Кастомный компонент для ESPHome для управления кондиционером по wifi <!--[](https://github.com/GrKoR/esphome_aux_ac_component/releases/) [](https://t.me/aux_ac) -->
|
||||
# Кастомный компонент для ESPHome для управления кондиционером по Wi-Fi <!--[](https://github.com/GrKoR/esphome_aux_ac_component/releases/) [](https://t.me/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`.
|
||||
|
||||
Обсудить проект можно [в чате Телеграм](https://t.me/aux_ac).<br />
|
||||
Отзывы о багах и ошибках, а так же запросы на дополнительный функционал оставляйте [в соответствующем разделе](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).
|
||||
|
||||
|
||||
@@ -24,11 +25,11 @@ AUX - это один из нескольких OEM-производителей
|
||||
[Список протестированных кондиционеров](docs/AC_TESTED.md) размещен в отдельном файле и включает те модели, на которых `aux_ac` был запущен автором компонента или пользователями. Этот список постоянно пополняется, преимущественно по обратной связи от пользователей [в чате Телеграм](https://t.me/aux_ac).<br />
|
||||
|
||||
### Если кондиционер в списке отсутствует ###
|
||||
Если ваш кондиционер отсутствует в списке протестированных, то это еще не значит, что его не получится подключить к wifi. Вот основные "звоночки", которые могут говорить о высоких шансах на успех:
|
||||
Если ваш кондиционер отсутствует в списке протестированных, то это еще не значит, что его не получится подключить к Wi-Fi. Вот основные "звоночки", которые могут говорить о высоких шансах на успех:
|
||||
1. Если производитель вашего кондиционера есть в списке протестированных выше, но модели нет.
|
||||
2. Если на шильдике кондиционера в строке производитель написано что-то про AUX или Аукс.
|
||||
3. Если в инструкции пользователя вашего кондиционера что-то написано про возможность управления по wifi с помощью мобильного приложения ACFreedom.
|
||||
4. Если производитель вашего кондиционера предлагает для управления wifi-модуль CTTM-40X24-WIFI-AKS (слева) или такой, как на фото справа. Причем правый модуль может быть как с USB-разъемом, так и с 5-контактным разъемом.
|
||||
3. Если в инструкции пользователя вашего кондиционера что-то написано про возможность управления по Wi-Fi с помощью мобильного приложения ACFreedom.
|
||||
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">
|
||||
|
||||
|
||||
@@ -42,7 +43,7 @@ AUX - это один из нескольких OEM-производителей
|
||||
Для работы с кондиционером понадобится "железо" и прошивка. Описание электроники вынесено [в отдельный файл](docs/HARDWARE.md).
|
||||
|
||||
### Прошивка: интеграция 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. Подключите компонент.
|
||||
@@ -53,6 +54,14 @@ external_components:
|
||||
type: git
|
||||
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 для коммуникации с вашим кондиционером:
|
||||
```yaml
|
||||
uart:
|
||||
@@ -97,7 +106,7 @@ climate:
|
||||
period: 7s
|
||||
show_action: true
|
||||
display_inverted: false
|
||||
timeout: 150
|
||||
timeout: 150
|
||||
indoor_temperature:
|
||||
name: AC Indoor Temperature
|
||||
id: ac_indoor_temp
|
||||
@@ -108,11 +117,11 @@ climate:
|
||||
id: ac_outdoor_temp
|
||||
internal: false
|
||||
outbound_temperature:
|
||||
name: AC Colant Outbound Temperature
|
||||
name: AC Coolant Outbound Temperature
|
||||
id: ac_outbound_temp
|
||||
internal: false
|
||||
inbound_temperature:
|
||||
name: AC Colant Inbound Temperature
|
||||
name: AC Coolant Inbound Temperature
|
||||
id: ac_inbound_temp
|
||||
internal: false
|
||||
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), к которой подключен кондиционер. Если сконфигурирована одна шина, то компонент подключит её автоматически. Если шин несколько, то лучше указать вручную.
|
||||
|
||||
- **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. Если это вам не подходит, тогда можно увеличить таймаут.
|
||||
Значение таймаута в прошивке ограничено диапазоном от `150` до `600` миллисекунд. Устанавливать значения выше можно только отредактировав исходные коды компонента. Но сильно задирать таймаут не стоит. Кондиционер периодически рассылает пакеты без запроса со стороны `aux_ac` и это приводит к сбою в отправке команды.
|
||||
|
||||
- **optimistic** (*Опциональный*, логическое, по умолчанию ``true``) В «оптимистичном» режиме компонент не ждёт от кондиционера изменения параметров работы, а сразу после отправки команды в кондиционер сообщает в Home Assistant о новом состоянии. Если кондиционер команду не принял, то спустя несколько секунд eps получит текущее состояние всех систем и отправит в умный дом реальное состояние кондиционера. В итоге, если подавать в кондиционер неподдерживаемые команды, они будут записываться в историю Home Assistant и спустя время сбрасываться сбрасываться.
|
||||
В «пессимистичном» режиме esp отправляет команду в кондиционер, но об изменении состояний не сообщает до тех пор, пока не получит информацию о фактическом режиме работы кондиционера.
|
||||
В большинстве случаев разница между этими режимами будет практически незаметна.
|
||||
|
||||
- **indoor_temperature** (*Опциональный*): Параметры создаваемого датчика температуры воздуха, если такой датчик нужен
|
||||
- **name** (**Обязательный**, строка): Имя датчика температуры.
|
||||
- **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.
|
||||
|
||||
- **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** (см. выше).
|
||||
|
||||
@@ -230,7 +243,7 @@ climate:
|
||||
- **preset_reporter** (*Опциональный*): Параметры создаваемого текстового датчика текущего активного пресета. Параметры аналогичны датчику дисплея **display_state**.
|
||||
Климатические устройства 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``.
|
||||
|
||||
@@ -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).
|
||||
|
||||
Все настройки в нем тривиальны и подробно описаны [в официальной документации на ESPHome](https://esphome.io/index.html) и дополнены в разделе о настройке компонента выше.<br />
|
||||
Просто скопируйте yaml-файл примера в локальную папку у себя на компьютере, пропишите настройки вашей сети WiFi и откомпилируйте YAML с использованием ESPHome.
|
||||
Просто скопируйте yaml-файл примера в локальную папку у себя на компьютере, пропишите настройки вашей сети Wi-Fi и откомпилируйте YAML с использованием ESPHome.
|
||||
|
||||
|
||||
## Продвинутый пример ##
|
||||
|
||||
@@ -4,183 +4,238 @@
|
||||
#include "esphome/core/automation.h"
|
||||
#include "esphome/core/component.h"
|
||||
|
||||
namespace esphome {
|
||||
namespace aux_ac {
|
||||
namespace esphome
|
||||
{
|
||||
namespace aux_ac
|
||||
{
|
||||
|
||||
// **************************************** DISPLAY ACTIONS ****************************************
|
||||
template <typename... Ts>
|
||||
class AirConDisplayOffAction : public Action<Ts...> {
|
||||
public:
|
||||
explicit AirConDisplayOffAction(AirCon *ac) : ac_(ac) {}
|
||||
// **************************************** DISPLAY ACTIONS ****************************************
|
||||
template <typename... Ts>
|
||||
class AirConDisplayOffAction : public Action<Ts...>
|
||||
{
|
||||
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:
|
||||
AirCon *ac_;
|
||||
};
|
||||
protected:
|
||||
AirCon *ac_;
|
||||
};
|
||||
|
||||
template <typename... Ts>
|
||||
class AirConDisplayOnAction : public Action<Ts...> {
|
||||
public:
|
||||
explicit AirConDisplayOnAction(AirCon *ac) : ac_(ac) {}
|
||||
template <typename... Ts>
|
||||
class AirConDisplayOnAction : public Action<Ts...>
|
||||
{
|
||||
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:
|
||||
AirCon *ac_;
|
||||
};
|
||||
protected:
|
||||
AirCon *ac_;
|
||||
};
|
||||
|
||||
// **************************************** VERTICAL LOUVER ACTIONS ****************************************
|
||||
template <typename... Ts>
|
||||
class AirConVLouverSwingAction : public Action<Ts...> {
|
||||
public:
|
||||
explicit AirConVLouverSwingAction(AirCon *ac) : ac_(ac) {}
|
||||
// **************************************** VERTICAL LOUVER ACTIONS ****************************************
|
||||
template <typename... Ts>
|
||||
class AirConVLouverSwingAction : public Action<Ts...>
|
||||
{
|
||||
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:
|
||||
AirCon *ac_;
|
||||
};
|
||||
protected:
|
||||
AirCon *ac_;
|
||||
};
|
||||
|
||||
template <typename... Ts>
|
||||
class AirConVLouverStopAction : public Action<Ts...> {
|
||||
public:
|
||||
explicit AirConVLouverStopAction(AirCon *ac) : ac_(ac) {}
|
||||
template <typename... Ts>
|
||||
class AirConVLouverStopAction : public Action<Ts...>
|
||||
{
|
||||
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:
|
||||
AirCon *ac_;
|
||||
};
|
||||
protected:
|
||||
AirCon *ac_;
|
||||
};
|
||||
|
||||
template <typename... Ts>
|
||||
class AirConVLouverTopAction : public Action<Ts...> {
|
||||
public:
|
||||
explicit AirConVLouverTopAction(AirCon *ac) : ac_(ac) {}
|
||||
template <typename... Ts>
|
||||
class AirConVLouverTopAction : public Action<Ts...>
|
||||
{
|
||||
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:
|
||||
AirCon *ac_;
|
||||
};
|
||||
protected:
|
||||
AirCon *ac_;
|
||||
};
|
||||
|
||||
template <typename... Ts>
|
||||
class AirConVLouverMiddleAboveAction : public Action<Ts...> {
|
||||
public:
|
||||
explicit AirConVLouverMiddleAboveAction(AirCon *ac) : ac_(ac) {}
|
||||
template <typename... Ts>
|
||||
class AirConVLouverMiddleAboveAction : public Action<Ts...>
|
||||
{
|
||||
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:
|
||||
AirCon *ac_;
|
||||
};
|
||||
protected:
|
||||
AirCon *ac_;
|
||||
};
|
||||
|
||||
template <typename... Ts>
|
||||
class AirConVLouverMiddleAction : public Action<Ts...> {
|
||||
public:
|
||||
explicit AirConVLouverMiddleAction(AirCon *ac) : ac_(ac) {}
|
||||
template <typename... Ts>
|
||||
class AirConVLouverMiddleAction : public Action<Ts...>
|
||||
{
|
||||
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:
|
||||
AirCon *ac_;
|
||||
};
|
||||
protected:
|
||||
AirCon *ac_;
|
||||
};
|
||||
|
||||
template <typename... Ts>
|
||||
class AirConVLouverMiddleBelowAction : public Action<Ts...> {
|
||||
public:
|
||||
explicit AirConVLouverMiddleBelowAction(AirCon *ac) : ac_(ac) {}
|
||||
template <typename... Ts>
|
||||
class AirConVLouverMiddleBelowAction : public Action<Ts...>
|
||||
{
|
||||
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:
|
||||
AirCon *ac_;
|
||||
};
|
||||
protected:
|
||||
AirCon *ac_;
|
||||
};
|
||||
|
||||
template <typename... Ts>
|
||||
class AirConVLouverBottomAction : public Action<Ts...> {
|
||||
public:
|
||||
explicit AirConVLouverBottomAction(AirCon *ac) : ac_(ac) {}
|
||||
template <typename... Ts>
|
||||
class AirConVLouverBottomAction : public Action<Ts...>
|
||||
{
|
||||
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:
|
||||
AirCon *ac_;
|
||||
};
|
||||
protected:
|
||||
AirCon *ac_;
|
||||
};
|
||||
|
||||
template <typename... Ts>
|
||||
class AirConVLouverSetAction : public Action<Ts...> {
|
||||
public:
|
||||
AirConVLouverSetAction(AirCon *ac) : ac_(ac) {}
|
||||
TEMPLATABLE_VALUE(uint8_t, value);
|
||||
template <typename... Ts>
|
||||
class AirConVLouverSetAction : public Action<Ts...>
|
||||
{
|
||||
public:
|
||||
TEMPLATABLE_VALUE(uint8_t, value);
|
||||
|
||||
void play(Ts... x) {
|
||||
vlpos_ = this->value_.value(x...);
|
||||
this->ac_->setVLouverFrontendSequence((ac_vlouver_frontend)vlpos_);
|
||||
}
|
||||
AirConVLouverSetAction(AirCon *ac) : ac_(ac) {};
|
||||
|
||||
protected:
|
||||
AirCon *ac_;
|
||||
uint8_t vlpos_;
|
||||
};
|
||||
void play(const Ts &...x) override
|
||||
{
|
||||
vlpos_ = this->value_.value(x...);
|
||||
this->ac_->setVLouverFrontendSequence((ac_vlouver_frontend)vlpos_);
|
||||
};
|
||||
|
||||
// **************************************** SEND TEST PACKET ACTION ****************************************
|
||||
template <typename... Ts>
|
||||
class AirConSendTestPacketAction : public Action<Ts...> {
|
||||
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;
|
||||
}
|
||||
protected:
|
||||
AirCon *ac_;
|
||||
uint8_t vlpos_;
|
||||
};
|
||||
|
||||
void play(Ts... x) override {
|
||||
if (this->static_) {
|
||||
this->ac_->sendTestPacket(this->data_static_);
|
||||
} else {
|
||||
auto val = this->data_func_(x...);
|
||||
this->ac_->sendTestPacket(val);
|
||||
}
|
||||
}
|
||||
// **************************************** SEND TEST PACKET ACTION ****************************************
|
||||
template <typename... Ts>
|
||||
class AirConSendTestPacketAction : public Action<Ts...>
|
||||
{
|
||||
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;
|
||||
}
|
||||
|
||||
protected:
|
||||
AirCon *ac_;
|
||||
bool static_{false};
|
||||
std::function<std::vector<uint8_t>(Ts...)> data_func_{};
|
||||
std::vector<uint8_t> data_static_{};
|
||||
};
|
||||
void play(const Ts &...x) override
|
||||
{
|
||||
if (this->static_)
|
||||
{
|
||||
this->ac_->sendTestPacket(this->data_static_);
|
||||
}
|
||||
else
|
||||
{
|
||||
auto val = this->data_func_(x...);
|
||||
this->ac_->sendTestPacket(val);
|
||||
}
|
||||
}
|
||||
|
||||
// **************************************** POWER LIMITATION ACTIONS ****************************************
|
||||
template <typename... Ts>
|
||||
class AirConPowerLimitationOffAction : public Action<Ts...> {
|
||||
public:
|
||||
explicit AirConPowerLimitationOffAction(AirCon *ac) : ac_(ac) {}
|
||||
protected:
|
||||
AirCon *ac_;
|
||||
bool static_{false};
|
||||
std::function<std::vector<uint8_t>(Ts...)> data_func_{};
|
||||
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:
|
||||
AirCon *ac_;
|
||||
};
|
||||
void play(const Ts &...x) override
|
||||
{
|
||||
this->ac_->powerLimitationOffSequence();
|
||||
}
|
||||
|
||||
template <typename... Ts>
|
||||
class AirConPowerLimitationOnAction : public Action<Ts...> {
|
||||
public:
|
||||
AirConPowerLimitationOnAction(AirCon *ac) : ac_(ac) {}
|
||||
TEMPLATABLE_VALUE(uint8_t, value);
|
||||
protected:
|
||||
AirCon *ac_;
|
||||
};
|
||||
|
||||
void play(Ts... x) {
|
||||
this->pwr_lim_ = this->value_.value(x...);
|
||||
this->ac_->powerLimitationOnSequence(this->pwr_lim_);
|
||||
}
|
||||
template <typename... Ts>
|
||||
class AirConPowerLimitationOnAction : public Action<Ts...>
|
||||
{
|
||||
public:
|
||||
TEMPLATABLE_VALUE(uint8_t, value);
|
||||
|
||||
protected:
|
||||
AirCon *ac_;
|
||||
uint8_t pwr_lim_;
|
||||
};
|
||||
AirConPowerLimitationOnAction(AirCon *ac) : ac_(ac) {};
|
||||
|
||||
} // namespace aux_ac
|
||||
} // namespace esphome
|
||||
void play(const Ts &...x) override
|
||||
{
|
||||
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
@@ -1,4 +1,5 @@
|
||||
import logging
|
||||
from esphome.core import CORE, Define
|
||||
import esphome.config_validation as cv
|
||||
import esphome.codegen as cg
|
||||
from esphome.components import climate, uart, sensor, binary_sensor, text_sensor
|
||||
@@ -10,6 +11,7 @@ from esphome.const import (
|
||||
CONF_DATA,
|
||||
CONF_ID,
|
||||
CONF_INTERNAL,
|
||||
CONF_OPTIMISTIC,
|
||||
CONF_PERIOD,
|
||||
CONF_POSITION,
|
||||
CONF_SUPPORTED_MODES,
|
||||
@@ -24,6 +26,7 @@ from esphome.const import (
|
||||
DEVICE_CLASS_TEMPERATURE,
|
||||
DEVICE_CLASS_POWER_FACTOR,
|
||||
STATE_CLASS_MEASUREMENT,
|
||||
__version__
|
||||
)
|
||||
from esphome.components.climate import (
|
||||
ClimateMode,
|
||||
@@ -31,6 +34,12 @@ from esphome.components.climate import (
|
||||
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__)
|
||||
|
||||
CODEOWNERS = ["@GrKoR"]
|
||||
@@ -119,8 +128,12 @@ AirConPowerLimitationOnAction = aux_ac_ns.class_(
|
||||
)
|
||||
|
||||
|
||||
AC_PACKET_TIMEOUT_MIN = 150
|
||||
AC_PACKET_TIMEOUT_MAX = 600
|
||||
def use_new_api():
|
||||
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):
|
||||
minV = AC_PACKET_TIMEOUT_MIN
|
||||
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}.")
|
||||
|
||||
|
||||
AC_POWER_LIMIT_MIN = 30
|
||||
AC_POWER_LIMIT_MAX = 100
|
||||
def validate_power_limit_range(value):
|
||||
minV = AC_POWER_LIMIT_MIN
|
||||
maxV = AC_POWER_LIMIT_MAX
|
||||
@@ -181,19 +192,19 @@ def validate_raw_data(value):
|
||||
|
||||
|
||||
def output_info(config):
|
||||
"""_LOGGER.info(config.items())"""
|
||||
_LOGGER.info("AUX_AC firmware version: %s", AUX_AC_FIRMWARE_VERSION)
|
||||
return config
|
||||
|
||||
|
||||
CONFIG_SCHEMA = cv.All(
|
||||
climate.CLIMATE_SCHEMA.extend(
|
||||
climate.climate_schema(climate.Climate).extend(
|
||||
{
|
||||
cv.GenerateID(): cv.declare_id(AirCon),
|
||||
cv.Optional(CONF_PERIOD, default="7s"): cv.time_period,
|
||||
cv.Optional(CONF_SHOW_ACTION, default="true"): 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_OPTIMISTIC, default="true"): cv.boolean,
|
||||
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."
|
||||
),
|
||||
@@ -329,6 +340,21 @@ CONFIG_SCHEMA = cv.All(
|
||||
|
||||
|
||||
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])
|
||||
await cg.register_component(var, config)
|
||||
await climate.register_climate(var, config)
|
||||
@@ -385,7 +411,7 @@ async def to_code(config):
|
||||
conf = config[CONF_PRESET_REPORTER]
|
||||
sens = await text_sensor.new_text_sensor(conf)
|
||||
cg.add(var.set_preset_reporter_sensor(sens))
|
||||
|
||||
|
||||
if CONF_INVERTER_POWER_LIMIT_VALUE in config:
|
||||
conf = config[CONF_INVERTER_POWER_LIMIT_VALUE]
|
||||
sens = await sensor.new_sensor(conf)
|
||||
@@ -400,17 +426,27 @@ async def to_code(config):
|
||||
cg.add(var.set_show_action(config[CONF_SHOW_ACTION]))
|
||||
cg.add(var.set_display_inverted(config[CONF_DISPLAY_INVERTED]))
|
||||
cg.add(var.set_packet_timeout(config[CONF_TIMEOUT]))
|
||||
cg.add(var.set_optimistic(config[CONF_OPTIMISTIC]))
|
||||
if CONF_SUPPORTED_MODES in config:
|
||||
cg.add(var.set_supported_modes(config[CONF_SUPPORTED_MODES]))
|
||||
if CONF_SUPPORTED_SWING_MODES in config:
|
||||
cg.add(var.set_supported_swing_modes(config[CONF_SUPPORTED_SWING_MODES]))
|
||||
if CONF_SUPPORTED_PRESETS in config:
|
||||
cg.add(var.set_supported_presets(config[CONF_SUPPORTED_PRESETS]))
|
||||
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]))
|
||||
|
||||
if use_new_api():
|
||||
if CONF_CUSTOM_PRESETS in config:
|
||||
presets = config[CONF_CUSTOM_PRESETS]
|
||||
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(
|
||||
@@ -419,6 +455,7 @@ DISPLAY_ACTION_SCHEMA = maybe_simple_id(
|
||||
}
|
||||
)
|
||||
|
||||
|
||||
@automation.register_action(
|
||||
"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])
|
||||
return cg.new_Pvariable(action_id, template_arg, paren)
|
||||
|
||||
|
||||
@automation.register_action(
|
||||
"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)
|
||||
|
||||
|
||||
|
||||
VLOUVER_ACTION_SCHEMA = maybe_simple_id(
|
||||
{
|
||||
cv.Required(CONF_ID): cv.use_id(AirCon),
|
||||
}
|
||||
)
|
||||
|
||||
|
||||
@automation.register_action(
|
||||
"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])
|
||||
return cg.new_Pvariable(action_id, template_arg, paren)
|
||||
|
||||
|
||||
@automation.register_action(
|
||||
"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])
|
||||
return cg.new_Pvariable(action_id, template_arg, paren)
|
||||
|
||||
|
||||
@automation.register_action(
|
||||
"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])
|
||||
return cg.new_Pvariable(action_id, template_arg, paren)
|
||||
|
||||
|
||||
@automation.register_action(
|
||||
"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])
|
||||
return cg.new_Pvariable(action_id, template_arg, paren)
|
||||
|
||||
|
||||
@automation.register_action(
|
||||
"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])
|
||||
return cg.new_Pvariable(action_id, template_arg, paren)
|
||||
|
||||
|
||||
@automation.register_action(
|
||||
"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])
|
||||
return cg.new_Pvariable(action_id, template_arg, paren)
|
||||
|
||||
|
||||
@automation.register_action(
|
||||
"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)
|
||||
|
||||
|
||||
|
||||
VLOUVER_SET_ACTION_SCHEMA = cv.Schema(
|
||||
{
|
||||
cv.Required(CONF_ID): cv.use_id(AirCon),
|
||||
@@ -499,6 +542,7 @@ VLOUVER_SET_ACTION_SCHEMA = cv.Schema(
|
||||
}
|
||||
)
|
||||
|
||||
|
||||
@automation.register_action(
|
||||
"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
|
||||
|
||||
|
||||
|
||||
POWER_LIMITATION_OFF_ACTION_SCHEMA = maybe_simple_id(
|
||||
{
|
||||
cv.Required(CONF_ID): cv.use_id(AirCon),
|
||||
}
|
||||
)
|
||||
|
||||
|
||||
@automation.register_action(
|
||||
"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)
|
||||
|
||||
|
||||
|
||||
POWER_LIMITATION_ON_ACTION_SCHEMA = cv.Schema(
|
||||
{
|
||||
cv.Required(CONF_ID): cv.use_id(AirCon),
|
||||
@@ -533,6 +576,7 @@ POWER_LIMITATION_ON_ACTION_SCHEMA = cv.Schema(
|
||||
}
|
||||
)
|
||||
|
||||
|
||||
@automation.register_action(
|
||||
"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
|
||||
|
||||
|
||||
|
||||
# *********************************************************************************************************
|
||||
# ВАЖНО! Только для инженеров!
|
||||
# Вызывайте метод aux_ac.send_packet только если понимаете, что делаете! Он не проверяет данные, а передаёт
|
||||
|
||||
@@ -2,24 +2,47 @@
|
||||
`Aux_ac` has been tested and works successfully with the air conditioners from the list below.<br/>
|
||||
Кондиционеры из списка ниже протестированы и точно совместимы с `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)
|
||||
+ Ballu (models: BSUI-12HN8, BLC_CF/in-60HN1)
|
||||
+ Centek (models: CT-65Q09, CT-65Q12, CT-65Z10, CT-65Z18, CT-65A12)
|
||||
+ ANDE (models: AND-12/FA+, AND-AMWM-H12(JA) / AND-AM2-H18/4DR3)
|
||||
+ Argo (models: Greenstyle 9000, Greenstyle 12000, Greenstyle 18000)
|
||||
+ 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)
|
||||
+ Elgin (models: HWFI09B2IA/ HWFE09B2NA)
|
||||
+ Energolux (models: SAS07L4-A, SAS07M2-AI, SAS09Z4-AI, SASxxBN1-AI)
|
||||
+ Electrolux (models: EACS/I-07HSK/N3, EACS/I-09HIX-BLACK/N8)
|
||||
+ 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)
|
||||
+ iClima (models: ICI-09A/IUI-09A)
|
||||
+ 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)
|
||||
+ Mirage (models: EWC121E - CWC121E)
|
||||
+ Osaka (models: STVP-12HH3)
|
||||
+ 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)
|
||||
+ 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)
|
||||
+ 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)
|
||||
+ Бирюса (models: B-09FIR/B-09FIQ)
|
||||
+ Бирюса (models: B-07DPR/B-07DPQ, B-09FIR/B-09FIQ)
|
||||
|
||||
## Tested and INCOMPATIBLE air conditioners ##
|
||||
ACs from the list below are **INCOMPATIBLE** with `aux_ac`.<br/>
|
||||
|
||||
@@ -8,17 +8,44 @@ 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:
|
||||

|
||||
|
||||
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).
|
||||
|
||||
## Wires ##
|
||||
1. Yellow: +14V DC. Measured +14.70V max and +13.70V min. Service manual declares up to +16V.
|
||||
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.
|
||||
|
||||
## 5-wire connection
|
||||
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.
|
||||
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.
|
||||
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:
|
||||
.
|
||||
.
|
||||
|
||||
## Connections ##
|
||||
Black wire of AC's connector goes to the middle pin of the power module and to the GND pin of esp-12e.
|
||||
@@ -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.
|
||||
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.
|
||||
|
||||
Here is it:
|
||||
@@ -35,7 +62,7 @@ Here is it:
|
||||
All connections in custom 3d-printed case looks like this:
|
||||

|
||||
|
||||
Cause I haven't JST SM connector I made own:
|
||||
Since I didn't have JST SM connectors, I made my own:
|
||||
.
|
||||
|
||||
It is made of standard 2.54mm pins and 3D-printed case.
|
||||
@@ -44,4 +71,4 @@ All models for 3D-printing are available too: [STL-files for connector](https://
|
||||
## The result ##
|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
@@ -1,23 +1,49 @@
|
||||
## Электроника, необходимая для управления кондиционером по wifi ##
|
||||
Я тестировал проект на esp8266 (esp-12e). Минимальная обвязка традиционная и выглядит так:
|
||||
Я тестировал проект на esp8266 (esp-12e). Минимальная обвязка традиционна и выглядит так:
|
||||

|
||||
|
||||
Для прошивки 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 перед подключением кондиционера и модуля питания:
|
||||

|
||||
|
||||
Внутренний блок сплит-системы имеет 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-проводное подключение
|
||||
Для 5-проводного подключения используется коннектор [JST SM](https://www.jst-mfg.com/product/pdf/eng/eSM.pdf).
|
||||
|
||||
## Перечень проводников ##
|
||||
1. Желтый: +14В постоянного тока. Осциллограф показал от +13.70В до +14.70В. В сервисном мануале встречалось, что питание возможно до +16В.
|
||||
### Распиновка ###
|
||||
1. Желтый: +12В..+14В постоянного тока. Осциллограф показал от +13.70В до +14.70В. В сервисном мануале встречалось, что питание возможно до +16В.
|
||||
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В.
|
||||
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 преобразователь. Я использовал такой:
|
||||
.
|
||||
.
|
||||
|
||||
## Подключение ##
|
||||
Черный провод (земля) подключается к земле DC-DC преобразователя и к пину GND модуля ESP8266.
|
||||
@@ -25,7 +51,7 @@
|
||||
Синий провод подключается к пину RXD модуля 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 наладить соединение с кондиционером.
|
||||
|
||||
|
||||
|
||||
18
docs/HOW_TO_FEATURE_REQUEST-EN.md
Normal file
18
docs/HOW_TO_FEATURE_REQUEST-EN.md
Normal 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.
|
||||
17
docs/HOW_TO_FEATURE_REQUEST.md
Normal file
17
docs/HOW_TO_FEATURE_REQUEST.md
Normal 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 сохранять копипастом или из командной строки. Но там много лишнего шлётся и легко что-то пропустить. Но в принципе это тоже вполне рабочий вариант.
|
||||
@@ -7,7 +7,8 @@ external_components:
|
||||
|
||||
esphome:
|
||||
name: $devicename
|
||||
platform: ESP8266
|
||||
|
||||
esp8266:
|
||||
board: esp12e
|
||||
|
||||
wifi:
|
||||
@@ -36,7 +37,8 @@ api:
|
||||
password: !secret api_pass
|
||||
|
||||
ota:
|
||||
password: !secret ota_pass
|
||||
- platform: esphome
|
||||
password: !secret ota_pass
|
||||
|
||||
web_server:
|
||||
port: 80
|
||||
@@ -65,6 +67,7 @@ climate:
|
||||
period: 7s
|
||||
show_action: true
|
||||
display_inverted: true
|
||||
optimistic: true
|
||||
indoor_temperature:
|
||||
name: ${upper_devicename} Indoor Temperature
|
||||
id: ${devicename}_indoor_temp
|
||||
@@ -78,11 +81,11 @@ climate:
|
||||
id: ${devicename}_outdoor_temp
|
||||
internal: false
|
||||
outbound_temperature:
|
||||
name: ${upper_devicename} Colant Outbound Temperature
|
||||
name: ${upper_devicename} Coolant Outbound Temperature
|
||||
id: ${devicename}_outbound_temp
|
||||
internal: false
|
||||
inbound_temperature:
|
||||
name: ${upper_devicename} Colant Inbound Temperature
|
||||
name: ${upper_devicename} Coolant Inbound Temperature
|
||||
id: ${devicename}_inbound_temp
|
||||
internal: false
|
||||
compressor_temperature:
|
||||
@@ -93,9 +96,9 @@ climate:
|
||||
name: ${upper_devicename} Defrost State
|
||||
id: ${devicename}_defrost_state
|
||||
internal: false
|
||||
invertor_power:
|
||||
inverter_power:
|
||||
name: ${upper_devicename} Invertor Power
|
||||
id: ${devicename}_invertor_power
|
||||
id: ${devicename}_inverter_power
|
||||
internal: false
|
||||
preset_reporter:
|
||||
name: ${upper_devicename} Preset Reporter
|
||||
@@ -138,6 +141,8 @@ sensor:
|
||||
unit_of_measurement: "dBa"
|
||||
accuracy_decimals: 0
|
||||
|
||||
- platform: uptime
|
||||
name: ${upper_devicename} Uptime Sensor
|
||||
|
||||
switch:
|
||||
- platform: template
|
||||
@@ -213,4 +218,16 @@ number:
|
||||
then:
|
||||
- aux_ac.vlouver_set:
|
||||
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 );"
|
||||
|
||||
@@ -5,7 +5,8 @@ external_components:
|
||||
|
||||
esphome:
|
||||
name: aux_air_conditioner
|
||||
platform: ESP8266
|
||||
|
||||
esp8266:
|
||||
board: esp12e
|
||||
|
||||
# don't forget to set your's wifi settings!
|
||||
@@ -30,6 +31,7 @@ logger:
|
||||
api:
|
||||
|
||||
ota:
|
||||
- platform: esphome
|
||||
|
||||
# UART0 configuration for AUX air conditioner communication
|
||||
uart:
|
||||
|
||||
BIN
images/USB-pinout.png
Normal file
BIN
images/USB-pinout.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 86 KiB |
10
tests/.gitignore
vendored
10
tests/.gitignore
vendored
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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 );
|
||||
|
||||
@@ -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) );
|
||||
@@ -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 );
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
Reference in New Issue
Block a user