Hi @bseishen, just checking if you might have made any progress. Thanks
Have been checking in on this thread for about 3 months hoping for an update. I specifically bought Pioneer because I saw it was compatible with local HA control. I got everything hooked up and was really disappointed to find that the Diamante units are not Midea compatible.
I’m also looking for a way to hook this up to Home Assistant…I tried the way above before realizing mine is a newer model and it doesn’t work…model WYT012GLFI22RL, with the integrated wifi module.
Hopefully someone is making some progress here. I’m not familiar at all with how to do this, but would be willing to help in whatever way I can.
WYT model here too. Hoping to find a local integration!
Actually working on reversing this now. I won’t make a home assistant plugin but I can share the serial protocol if someone else wants to once I figure it out.
I pulled the firmware and have wired up to sniff the serial line as well.
The module is a tuya smart tywe1s, which is one of their esp8266s. Another option would be to integrate after obtaining the local device API key from tuya.
The messages at 9600 baud all start with “BB”, so I don’t think it’s exactly the Midea protocol, but seems similar: midea-uart/src at main · reneklootwijk/midea-uart · GitHub
Got this working to where I can send messages to set mode (heat/cool/dehumidify/fan/auto), temperature, etc. This appears mostly functional
It’s actually 9600 baud but 8e1.
There are still 4 hello/status type messages sent. I don’t understand them or the response to them.
I’ll share at some point if anyone wants to make a home assistant adaptation.
Yes, please share!! I’ll help polish the code and contribute
I’m currently working on an ESP32 replacement for my WTY Pioneer Aircon! See
My heartbeat message is 0xBB, 0x00, 0x01, 0x04, 0x02, 0x01, 0x00, 0xBD
at 9600 baud, even parity. This returns some sort of status message. Any help with the FW dump, how you did the limited control you have, etc would be A++
I also have a list of all of the DSPs I can share!
Yes can do, I just need to clean up the code I have and push to GitHub. Probably in a week or two.
Here’s what I found so far, with help from the GPTs
Example TX frame, 9600 baud, even parity:
F9 00 01 03 1D 00 00 44 01 5A 00 06 80 00 00 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80 BC
Byte 1 (F9): This byte seems to signal the start of a message or potentially indicate the type of message or command.
Bytes 2-3 (00 01): These two bytes could be a static header or potentially a command or a device ID.
Byte 4 (03): This byte could be a command or a specific setting.
Byte 5 (1D): This byte could also be part of the command or specific setting.
Bytes 6-7 (00 00): These two bytes appear to be reserved or unused.
Bytes 8-9: Operation mode:
01 58: Heat
00 55: Dry
07 55: Fan
08 55: Auto
03 18: Cool
Bytes 10-11: Temperature setting (in Fahrenheit) which seems to be valid for all modes:
57: 73°F
56: 74°F
55: 75°F
54: 76°F
00: When the operation mode is not Heat?
Byte 12: Fan speed setting:
07: Turbo
06: High
03: Medium-High
04: Medium
02: Medium-Low
00: Low
06: Auto
02: Mute (or possibly a repeated Medium-Low speed and the mute setting is missing from the data)
Bytes 13-14: These bytes change when the operation mode changes but the exact mapping is unclear.
Byte 15: GEN mode setting:
00: OFF
02: 30%
03: 50%
01: 80%
Bytes 16-36: These bytes seem to be a data payload related to the command or setting, possibly containing status information, sensor readings, or other data.
Byte 37 (BC): This is the checksum byte. It’s calculated as the XOR of all the previous bytes in the message (excluding the checksum byte itself).
Checksum Calculation Method:
The checksum is calculated by taking the XOR (exclusive OR) of all bytes in the message, excluding the checksum byte. The result is then placed in the checksum byte. This method provides a simple and effective way of checking if the message has been received correctly.
I thought that mi A/C would be using Midea protocol, but sadly it isn’t.
I’m excited about this integration!
Thank you!
I have a WYT and the wifi module and it is a Tuya device. I’m using the “tuya-local” integration with the “starlight heatpump” device config to control it and it works pretty well. The integration can’t do all of the things, but it can do a great many. It can control all modes of the device (heat, cool, etc) as well as the fan and direction of the fan guides. It can also control the beep and display light settings.
It should work completely locally and might be a bit easier to use compared to decoding the serial communications.
Great find! So did you have to pair the device with the Tuya app first and if so how’d you go about that?
I did have to pair the device with the “Tuya Smart” app; it wasn’t complicated but I don’t remember the process. I think the steps needed to get a “device id” and “local key” that are required to add the device to the tuya-local integration are more involved but the instructions provided by the integration are good.
Ok, I’ll give it a go when I get home. When you say you used the starlight heatpump device config. Is this set in the Tuya Smart app or in the Home Assistant Integration?
Tuya Local will query the device and come up with some possible device configs to use. Select “starlight heatpump” in the dropdown (instead of daizuki in the pic).
It will make a device with the following entities:
It works pretty well.
Remember to force close/kill the “Tuya Smart” app on your phone before using Tuya Local or iot.tuya.com. The device doesn’t like multiple connections and will sometimes throw weird errors if more that on service is trying to talk to it, which the app will do in the background if it isn’t force closed. I only used the “Tuya Smart” app to connect it to the Tuya ecosystem and never use the app.
Worked like a charm! Here’s what I had to do to get the device on the tuya app.
-
Hold the reset button on the wifi module until display reads AP (mine said CF the first time so you may have to reset more than once)
-
Go into the Tuya app and select Add Device > Large Home Appliances > Air Conditioner (Wi-Fi)
-
Enter the Wi-Fi SSID and pwd that you want your mini-split to connect to > Click Next
-
You will be prompted to connect your phone to the SmartLife_XXX wifi created by your mini-split
-
A 2 min timer will start and it will try to connect, power on the device (via infrared remote) and the setup should complete.
I followed this video to figure out the device_id and local_key.
** Note I would recommend making an IP reservation for your mini-split as well
That’s awesome to see there’s a solution! Before I go out and buy it, I’d like to confirm that this is the same module we’re talking about:
(free shipping in the US through Home Depot for that same $35 price, by the way)
Yep, that’s it.
I did this same thing for integrating my mini splits, but both of them seem to report the target temperature anywhere from 158 to 161 at all times. not to mention that the temperature steps are not in whole numbers.
So there are at least two versions of the Pioneer AC/Heat pump: the WYT series and the WYS series. The WYS uses a USB dongle instead of the device that plugs into the mainboard on the WYT.
I recommend double checking which Pioneer AC/Heat pump you have.
Also, for the WYT mainboard connection, I was able to remove the screwed on cover over the power connection and mainboard, and slightly slide out the board to connect the device. There is a video on the internet where somebody totally disassembled the thing to connect the device, which is not necessary at all.
Also, also, the two devices configs that I have found to work with the Pioneer AC/Heat pump are daizuki_heatpump
and starlight_heatpump
. I personally found the starlight_heatpump
to work better as far as temperature control and display, but it’s worth testing them both.
I made my own config based on those two, which includes some other sensors that don’t work (they might work on the WYS model):
name: Pioneer WYT Mini Split AC/Heat Pump
primary_entity:
entity: climate
translation_key: aircon_extra
dps:
- id: 1
name: hvac_mode
type: boolean
mapping:
- dps_val: false
value: "off"
icon: "mdi:hvac-off"
- dps_val: true
constraint: mode
conditions:
- dps_val: auto
icon: "mdi:hvac"
value: heat_cool
- dps_val: cold
icon: "mdi:snowflake"
value: cool
- dps_val: hot
icon: "mdi:fire"
value: heat
- dps_val: wind
icon: "mdi:fan"
value: fan_only
- dps_val: wet
icon: "mdi:water"
value: dry
- id: 2
type: integer
name: temperature
range:
min: 610
max: 880
mapping:
- scale: 10
step: 10
unit: F
- id: 3
name: current_temperature
type: integer
mapping:
- dps_val: 15
value: 59
- dps_val: 16
value: 61
- dps_val: 17
value: 63
- dps_val: 18
value: 64
- dps_val: 19
value: 66
- dps_val: 20
value: 68
- dps_val: 21
value: 70
- dps_val: 22
value: 72
- dps_val: 23
value: 73
- dps_val: 24
value: 75
- dps_val: 25
value: 77
- dps_val: 26
value: 79
- dps_val: 27
value: 81
- dps_val: 28
value: 82
- dps_val: 29
value: 84
- dps_val: 30
value: 86
- dps_val: 31
value: 88
- dps_val: 32
value: 90
unit: F
- id: 4
name: mode
type: string
hidden: true
- id: 5
name: fan_mode
type: string
mapping:
- dps_val: auto
value: auto
- dps_val: mute
value: quiet
- dps_val: low
value: low
- dps_val: mid_low
value: medlow
- dps_val: mid
value: medium
- dps_val: mid_high
value: medhigh
- dps_val: high
value: high
- dps_val: strong
value: strong
- id: 20
name: unknown_20
type: integer
- id: 105
name: sleep_mode
type: string
- id: 110
name: unknown_110
type: integer
- id: 113
name: swing_mode
type: string
mapping:
- dps_val: "0"
constraint: horizontal_swing
conditions:
- dps_val: "0"
value: "off"
- dps_val: "1"
value: horizontal
- value: horizontal
- dps_val: "1"
constraint: horizontal_swing
conditions:
- dps_val: "0"
value: vertical
- dps_val: "1"
value: both
- value: both
- dps_val: "2"
constraint: horizontal_swing
conditions:
- dps_val: "0"
value: vertical
- value: both
- dps_val: "3"
constraint: horizontal_swing
conditions:
- dps_val: "0"
value: vertical
- value: both
- id: 114
name: horizontal_swing
type: string
hidden: true
- id: 116
name: unknown_116
type: integer
optional: true
- id: 119
name: electricity_management
type: string
- id: 120
name: unknown_120
type: string
- id: 123
name: flags
type: string
- id: 126
name: vertical_flow_position
type: string
- id: 127
name: horizontal_flow_position
type: string
- id: 128
name: unknown_128
type: string
- id: 129
name: unknown_129
type: string
- id: 130
name: maybe_eco_temp
type: integer
- id: 131
name: unknown_131
type: boolean
- id: 132
name: unknown_132
type: boolean
- id: 133
name: unknown_133
type: string
- id: 134
name: unknown_134
type: json
secondary_entities:
- entity: sensor
name: Current humidity
category: diagnostic
class: humidity
dps:
- id: 18
name: sensor
type: integer
unit: "%"
class: measurement
- entity: select
name: Vertical swing
category: config
icon: "mdi:arrow-up-down-bold"
dps:
- id: 113
type: string
name: option
mapping:
- dps_val: "0"
value: "Off"
- dps_val: "1"
value: Full
- dps_val: "2"
value: Upper
- dps_val: "3"
value: Lower
- entity: select
name: Vertical position
category: config
icon: "mdi:unfold-more-horizontal"
dps:
- id: 126
type: string
name: option
mapping:
- dps_val: "0"
value: Unknown
- dps_val: "1"
value: Top
- dps_val: "2"
value: Slightly Up
- dps_val: "3"
value: Middle
- dps_val: "4"
value: Slightly Down
- dps_val: "5"
value: Bottom
- entity: select
name: Horizontal swing
category: config
icon: "mdi:arrow-left-right-bold"
dps:
- id: 114
type: string
name: option
mapping:
- dps_val: "0"
value: "Off"
- dps_val: "1"
value: Full
- dps_val: "2"
value: Left
- dps_val: "3"
value: Center
- dps_val: "4"
value: Right
- entity: select
name: Horizontal position
category: config
icon: "mdi:unfold-more-vertical"
dps:
- id: 127
type: string
name: option
mapping:
- dps_val: "0"
value: Unknown
- dps_val: "1"
value: Leftmost
- dps_val: "2"
value: Slight Left
- dps_val: "3"
value: Center
- dps_val: "4"
value: Slight Right
- dps_val: "5"
value: Rightmost
- entity: select
name: Sleep mode
category: config
icon: "mdi:weather-night"
dps:
- id: 105
type: string
name: option
mapping:
- dps_val: "off"
value: "Off"
- dps_val: "normal"
value: Standard
- dps_val: "old"
value: "Elderly"
- dps_val: "child"
value: "Child"
- entity: sensor
class: power
category: diagnostic
name: Power
dps:
- id: 116
optional: true
type: integer
name: sensor
unit: "W"
class: measurement
mapping:
- scale: 30
- entity: sensor
class: power
category: diagnostic
name: unk_119
dps:
- id: 119
optional: true
type: integer
name: sensor
unit: "W"
class: measurement
- entity: sensor
category: diagnostic
name: unk_120
dps:
- id: 120
optional: true
type: string
name: sensor
- entity: sensor
category: diagnostic
name: unk_128
dps:
- id: 128
optional: true
type: string
name: sensor
- entity: sensor
category: diagnostic
name: unk_129
dps:
- id: 129
optional: true
type: string
name: sensor
- entity: sensor
category: diagnostic
name: unk_130
dps:
- id: 130
optional: true
type: integer
name: sensor
- entity: sensor
category: diagnostic
name: unk_131
dps:
- id: 131
optional: true
type: boolean
name: sensor
- entity: sensor
category: diagnostic
name: unk_132
dps:
- id: 132
optional: true
type: boolean
name: sensor
- entity: sensor
category: diagnostic
name: unk_133
dps:
- id: 133
optional: true
type: string
name: sensor
- entity: sensor
category: diagnostic
name: unk_134
dps:
- id: 134
optional: true
type: string
name: sensor
- entity: switch
name: Display
category: config
icon: "mdi:lightbulb-on-outline"
dps:
- id: 123
type: hex
name: switch
mapping:
- scale: 1
mask: "0008"
- entity: switch
name: Buzzer
category: config
icon: "mdi:access-point"
dps:
- id: 123
type: hex
name: switch
mapping:
- scale: 1
mask: "0010"
- entity: switch
name: Soft wind
category: config
icon: "mdi:weather-windy"
dps:
- id: 123
type: hex
name: switch
mapping:
- scale: 1
mask: "8000"
- entity: switch
name: Anti-mildew
category: config
icon: "mdi:water-off-outline"
dps:
- id: 123
type: hex
name: switch
mapping:
- scale: 1
mask: "0100"
- entity: switch
name: Health
category: config
icon: "mdi:heart-outline"
dps:
- id: 123
type: hex
name: switch
mapping:
- scale: 1
mask: "0020"
- entity: switch
name: Anti-freeze
category: config
icon: "mdi:radiator"
dps:
- id: 123
type: hex
name: switch
mapping:
- scale: 1
mask: "1000"
- entity: switch
name: Eco mode
category: config
icon: "mdi:leaf"
dps:
- id: 123
type: hex
name: switch
mapping:
- scale: 1
mask: "0001"
You can save this as pioneer_mini_split.yaml
in config\custom_components\tuya_local\devices
and restart HA. Then you can delete and re-add the device in in the tuya_local
integration and it should come up as an option in the Choose the type of device
menu.
The device looks like this:
And the lovelace thermostat card looks like:
and