Seville-MQTT
A sketch for the NodeMCU/ESP8266 which allows controlling a Seville Classics UltraSlimline 40-inch Tower Fan via MQTT.
Prerequisites
- NodeMCU or ESP8266.
- An IR emitter LED.
- NodeMCU needs to be configured in the Arduino IDE. Detailed instructions are available here.
Setup
- Connect an IR LED to a pin on NodeMCU. The default configuration uses GPIO pin 14 (D5 on NodeMCU) because it is conveniently located right next to a ground.
- Copy
config.h.example
toconfig.h
. - Change
config.h
to match your settings. - Ensure all required libraries are loaded in the Arduino IDE:
- Load the sketch.
- When the sketch starts up it will set the fan to eco speed and turn it off to ensure that the fan is in a clean state.
Notes
- The red LED flashes everytime a message is sent via MQTT.
- The red LED will stay solid if the board is disconnected from wifi.
- The blue LED will blink anytime IR data is emitted.
- ArduinoOTA is enabled allowing you to upload new versions without needing to plug into a computer. See the docs for more information.
Topics
Name | Default State Topic | Default Command Topic | Defined as | Accepts | Description |
---|---|---|---|---|---|
Alive | esp8266/ac/status |
N/A | ALIVE_TOPIC |
N/A | Contains the current status of the board. alive if it's online, otherwise dead . |
Power | esp8266/ac/on/state |
esp8266/ac/on/set |
ON_STATE_TOPIC , ON_SET_TOPIC |
Boolean | Turns the fan on/off |
Oscillate | esp8266/ac/oscillate/state |
esp8266/ac/oscillate/set |
OSCILLATE_STATE_TOPIC , OSCILLATE_SET_TOPIC |
Boolean | Turns oscillation on/off |
Speed | esp8266/ac/speed/state |
esp8266/ac/speed/set |
SPEED_STATE_TOPIC , SPEED_SET_TOPIC |
eco , low , medium , high |
Sets the fan speed |
Timer | esp8266/ac/timer/state |
esp8266/ac/timer/set |
TIMER_STATE_TOPIC , TIMER_SET_TOPIC |
00:30 to 07:30 (hh:mm) |
Sets the timer |
Wind Mode | esp8266/ac/wind/state |
esp8266/ac/wind/set |
WIND_STATE_TOPIC , WIND_SET_TOPIC |
normal , sleeping , natural |
Sets the "wind mode" |
Home Assistant Example Configuration
mqtt:
host: 192.168.1.2
username: username
password: password
discovery: true
fan:
- platform: mqtt
name: "Seville Fan"
availability_topic: "esp8266/fan/status"
command_topic: "esp8266/fan/on/set"
json_attributes_topic: "esp8266/fan/attributes"
oscillation_command_topic: "esp8266/fan/oscillate/set"
oscillation_state_topic: "esp8266/fan/oscillate/state"
speeds:
- 'off'
- eco
- low
- medium
- high
speed_command_topic: "esp8266/fan/speed/set"
speed_state_topic: "esp8266/fan/speed/state"
state_topic: "esp8266/fan/on/state"
input_select:
seville_fan_timer:
name: "Seville Fan - Timer"
icon: mdi:timer
initial: '0:00'
options:
- '0:00'
- '0:30'
- '1:00'
- '1:30'
- '2:00'
- '2:30'
- '3:00'
- '3:30'
- '4:00'
- '4:30'
- '5:00'
- '5:30'
- '6:00'
- '6:30'
- '7:00'
- '7:30'
seville_fan_wind:
name: "Seville Fan - Wind Mode"
icon: mdi:weather-windy
initial: 'Normal'
options:
- 'Normal'
- 'Sleeping'
- 'Natural'
automation:
- alias: Set Fan Wind Mode
hide_entity: True
trigger:
platform: state
entity_id: input_select.seville_fan_wind
action:
- service: mqtt.publish
data_template:
topic: "esp8266/fan/wind/set"
payload_template: '{{ states.input_select.seville_fan_wind.state }}'
- alias: Set Fan Timer
hide_entity: True
trigger:
platform: state
entity_id: input_select.seville_fan_timer
action:
- service: mqtt.publish
data_template:
topic: "esp8266/fan/timer/set"
payload_template: '{{ states.input_select.seville_fan_timer.state }}'
Debugging
Serial outputs at 115200 baud. You can view the output in the Arduino IDE Serial Monitor.
Acknowledgements
- This sketch is based on work from @zeroflow's ESPAircon.
- Initial confirmation that the IR codes I was seeing were correct came from @scruss's IRTowerFanExample.
- I got some great ideas from @balloob's sketch he made to control his AC unit.
Contributing
Fork, modify, pull request.
LICENSE
MIT
Protocol notes
The IRemoteESP8266 library thinks that the Seville remote is sending NEC codes but whenever I attempted to send NEC codes back they wouldn't work.
The only way I could get this working was to send "raw" IR codes. Quite annoying, since the sketch gets quite a bit bigger with the raw data.
The below notes are from when I was initially documenting the NEC code structure.
@scruss's IRTowerFanExample has already defined most of these codes, but his work was dated so I need to reconfirm.
You can view a full list of his codes (more complete then what I have below) here.
1st digit - Prefix bit (1)
2nd digit - Power Off/On (0/1)
3rd digit - Always 2?
4th digit - Timer in 0.5 hour increments from 0.5 to 7.5 (1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F)
5th digit - Always 3?
6th digit - Oscillate Off/On (0/1)
7th digit - Always 4?
8th digit - Speed (Eco: 3, Low: 0, Medium: 1, High: 2)
Wind is supposedly sending the same speed command twice.
10203043 - Off, eco, no wind, no timer, no oscillate
11203043 - On, eco, no wind, no timer, no oscillate
11203040 - On, low, no wind, no timer, no oscillate
11203041 - On, med, no wind, no timer, no oscillate
11203042 - On, hih, no wind, no timer, no oscillate
11203143 - On, eco, no wind, no timer, oscillate
11203140 - On, low, no wind, no timer, oscillate
11203141 - On, med, no wind, no timer, oscillate
11203142 - On, hih, no wind, no timer, oscillate
11213043 - On, eco, no wind, 0.5 timer, no oscillate
11223043 - On, eco, no wind, 1.0 timer, no oscillate
11233043 - On, eco, no wind, 1.5 timer, no oscillate
11243043 - On, eco, no wind, 2.0 timer, no oscillate
11253043 - On, eco, no wind, 2.5 timer, no oscillate
11263043 - On, eco, no wind, 3.0 timer, no oscillate
11273043 - On, eco, no wind, 3.5 timer, no oscillate
11283043 - On, eco, no wind, 4.0 timer, no oscillate
11293043 - On, eco, no wind, 4.5 timer, no oscillate
112A3043 - On, eco, no wind, 5.0 timer, no oscillate
112B3043 - On, eco, no wind, 5.5 timer, no oscillate
112C3043 - On, eco, no wind, 6.0 timer, no oscillate
112D3043 - On, eco, no wind, 6.5 timer, no oscillate
112E3043 - On, eco, no wind, 7.0 timer, no oscillate
112F3043 - On, eco, no wind, 7.5 timer, no oscillate