This program implements the Ayla Networks LAN API to interact with HiSense WiFi Air Conditioner module, models AEH-W4B1 and AEH-W4E1, as well as Fujitsu FGLair.
As discussed here, the program doesn't seem to fit the AEH-W4A1 module, which relies on entirely different protocol (implemented by the apps Hi-Smart Life, AirConnect, Smart Cool, AC WIFI and טורנדו WiFi). Please let me know if you have a different experience, or tried it with other modules.
The module is installed in A/Cs and humidifiers that are either manufactured or only branded by many other companies. These include Beko, Westinghouse, Winia, Tornado, York and more.
This program is not affiliated with Ayla Networks, HiSense, Fujitsu, any of their subsidiaries, or any of their resellers.
-
Air Conditioner with HiSense AEH-W4B1 or AEH-W4E1 installed, or a Fujitsu FGLair.
-
Have Python 3.7 or above installed. If using Raspberry Pi, either upgrade to Raspbian Buster, or manually install it in Raspbian Stretch.
-
Configure the A/Cs with the dedicated app. Links to each app are available in the table below. Log into the app, associate each A/C and connect it to the network, as described in the app documentation.
-
Once everything has been configured, the A/Cs can be blocked from connecting to the internet, as it will no longer be needed. Set them static IP addresses in the router, and write them down.
- Note: To avoid the need for manual changes later, make sure the app is aware of the new IP addresses before disconnecting the A/Cs from the internet.
-
Find the code for your app, from the list below:
If using HomeAssistant, this is the preferred method.
- In the HomeAssistant UI, enter Supervisor → Add-on Store.
- Click ⋮ menu → Repositories.
- Add
https://github.com/deiger/AirCon
to the list. - Choose HiSense Air Conditioner and install it.
- Update the configuration as detailed within the add-on.
- Start the add-on. Do not forget to enable Start on boot and Watchdog.
Use this method if not using HomeAssistant, or if you prefer to set it up outside of HomeAssistant.
-
Download the
docker-compose.yaml
andoptions.json
. Update all the relevant fields inoptions.json
:- For every app (multiple apps are supported), set
username
andpassword
to your app login credentials, andcode
to the app code from the list above. These will be used to discover you A/Cs and get their LAN keys, if there are no config files in the config directory (/opt/hisense
). - Set
mqtt_host
to the MQTT broker server, uselocalhost
if running on the same host. Leave blank if not using MQTT. - Set
mqtt_user
andmqtt_pass
to the MQTT credentials. Leave null (or drop) if no authentication is used. - Set
port
to the port to be used by the web server. - Set
log_level
to your desired verbosity level.
- For every app (multiple apps are supported), set
-
Run:
docker-compose up -d
-
Check the logs and verify that everything is in shape:
journalctl CONTAINER_NAME=hisense_ac
-
Profit!
The A/Cs should now be auto-discovered by HomeAssistant or openHAB (using the HomeAssistant MQTT Components Binding). SmartThings requires manual setup, using the groovy file, see below.
Use this method if the docker setup above does not work for you.
-
Download and install aircon module:
python3.7 setup.py install
-
Run discovery command to fetch the LAN keys that will allow connecting to the A/C. Pass it your login credentials, as well as the code for your app from the list below:
For example:
python3.7 -m aircon discovery tornado-us foo@example.com my_pass
The CLI will generate a config file for each A/C, that needs to be passed to the A/C control server below. You can select the A/C that the config is generated for by setting the
--device
flag to the device name you configured in the app.
- Note: To update the server from head, run
git pull
on the repository and run setup. You may also need to re-run discovery.
- Test out that you can run the server, e.g.:
Parameters:
python3.7 -m aircon run --port 8888 --config config.json --mqtt_host localhost
--port
or-p
- Port for the web server.--config
- The config file with the credentials to connect to the A/C.--mqtt_host
- The MQTT broker hostname or IP address. Must be set to enable MQTT.--mqtt_port
- The MQTT broker port. Default is 1883.--mqtt_client_id
- The MQTT client ID. If not set, a random client ID will be generated.--mqtt_user
- <user:password> for the MQTT channel. If not set, no authentication is used.--mqtt_topic
- The MQTT root topic. Default is "hisense_ac". The server will listen on topics <{mqtt_topic}/{property_name}/command> and publish to <{mqtt_topic}/{property_name}/status>.--log_level
- The minimal log level to send to syslog. Default is WARNING.
- Access e.g. using curl:
curl -ik 'http://localhost:8888/hisense/status' curl -ik 'http://localhost:8888/hisense/command?property=t_power&value=ON'
In order to use with multiple Air Conditioners, simply add multiple --config params. MQTT topic will contain your topic defined by flag --mqtt_topic (hisense_ac by default) and device MAC address (for uniqueness).
Assuming your username is "pi"
- Create a dedicated directory for the script files, and move the files to it.
Pass the ownership to root. e.g.:
sudo mkdir /opt/hisense sudo mv config*.json /opt/hisense sudo chown pi:pi /opt/hisense/*
- Create a service configuration file (as root), e.g.
/lib/systemd/system/hisense.service
:[Unit] Description=Hisense A/C server After=network.target [Service] ExecStart=/usr/bin/python3.7 -m aircon run --port 8888 --config config.json --mqtt_host localhost WorkingDirectory=/opt/hisense StandardOutput=inherit StandardError=inherit Restart=always User=pi [Install] WantedBy=multi-user.target
- Link to it from
/etc/systemd/system/
:sudo ln -s /lib/systemd/system/hisense.service /etc/systemd/system/multi-user.target.wants/hisense.service
- Enable and start the new service:
sudo systemctl enable hisense.service sudo systemctl start hisense.service
- If you use MQTT for HomeAssistant or openHAB, the broker should now provide the updated status of the A/C, and accepts commands.
Listed here are the properties available through the API for standard A/Cs (FGLair and humidifers have different properties):
Property | Read Only | Values | Comment |
---|---|---|---|
f_electricity | x | Integer | |
f_e_arkgrille | x | 0, 1 | Alarm from cabinet grille protection |
f_e_incoiltemp | x | 0, 1 | Indoor coil temperature sensor in fault |
f_e_incom | x | 0, 1 | Indoor and outdoor communication in fault |
f_e_indisplay | x | 0, 1 | Communication faulty between indoor control panel and display panel |
f_e_ineeprom | x | 0, 1 | Error in EEPROM of indoor control panel |
f_e_inele | x | 0, 1 | Communication faulty between indoor control panel and indoor power panel |
f_e_infanmotor | x | 0, 1 | Indoor fan motor operation abnormal |
f_e_inhumidity | x | 0, 1 | Indoor humidity sensor in fault |
f_e_inkeys | x | 0, 1 | Communication faulty between indoor control panel and keyboard plate |
f_e_inlow | x | 0, 1 | |
f_e_intemp | x | 0, 1 | Indoor temperature sensor in fault |
f_e_invzero | x | 0, 1 | Fault found from indoor voltage crossing zero detection |
f_e_outcoiltemp | x | 0, 1 | The temperature sensor in outdoor coil faulty |
f_e_outeeprom | x | 0, 1 | Outdoor EEPROM error |
f_e_outgastemp | x | 0, 1 | Exhaust temperature sensor faulty |
f_e_outmachine2 | x | 0, 1 | |
f_e_outmachine | x | 0, 1 | |
f_e_outtemp | x | 0, 1 | Outdoor ambient temperature sensor faulty |
f_e_outtemplow | x | 0, 1 | |
f_e_push | x | 0, 1 | Communication faulty between WiFi control panel and indoor control panel |
f_filterclean | x | 0, 1 | Does the filter require cleaning |
f_humidity | x | Integer | Relative humidity percent |
f_power_display | x | 0, 1 | |
f_temp_in | x | Decimal | Environment temperature in Fahrenheit |
f_voltage | x | Integer | |
t_backlight | ON, OFF | Turn the display on/off | |
t_device_info | 0, 1 | ||
t_display_power | 0, 1 | ||
t_eco | OFF, ON | Economy mode | |
t_fan_leftright | OFF, ON | Horizontal air flow | |
t_fan_mute | OFF, ON | Quite mode | |
t_fan_power | OFF, ON | Vertical air flow | |
t_fan_speed | AUTO, LOWER, LOW, MEDIUM, HIGH, HIGHER | Fan Speed | |
t_ftkt_start | Integer | ||
t_power | OFF, ON | Power | |
t_run_mode | OFF, ON | Double frequency | |
t_setmulti_value | Integer | ||
t_sleep | STOP, ONE, TWO, THREE, FOUR | Sleep mode | |
t_temp | Integer | Temperature in Fahrenheit | |
t_temptype | CELSIUS, FAHRENHEIT | Displayed temperature unit | |
t_temp_eight | OFF, ON | Eight heat mode | |
t_temp_heatcold | OFF, ON | Fast cool heat | |
t_work_mode | FAN, HEAT, COOL, DRY, AUTO | Work mode |
You will need a groovy script to enable SmartThings integration with the Air Conditioner, through the control server above. It currently implements the main functionality (turn on/off, AC mode, fan speed, dimmer etc.).
The groovy file is available here, for download and installation through the Groovy IDE. As I'm continuously improving this script, it would be more efficient to use the IDE's github integration, in order to stay up-to-date.
HomeAsststant is now fully supported through MQTT Discovery. Properly configured devices are auto-configured and populated in the Lovelace dashboard.
Pull requests are always welcome.
Please use YAPF with the style config defined here to style your code. Single quotes are used throughout the code-base. Unfortunately YAPF still doesn't support mandating this (support exists in the fixers branch), so please be mindful.