Pioneer WYT mini split wifi integration

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

4 Likes

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.

6 Likes

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!

3 Likes

Yes can do, I just need to clean up the code I have and push to GitHub. Probably in a week or two.

4 Likes

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.

5 Likes

I thought that mi A/C would be using Midea protocol, but sadly it isn’t.
I’m excited about this integration! :smiley:
Thank you!

1 Like

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.

1 Like

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

2 Likes

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.

1 Like

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:
image
and

Trying to learn all of this myself and I just realized how recent this information is. Figured I’d throw in what I found in case someone can figure out how to integrate it in (if needed) faster than I can figure it out. I don’t understand the value mapping to tuya but poking around I have a few guesses for some of these values.

It seems to me that unk_134 is the start time/power on time for the device, in unix time (t part is, at least, unsure what “s” and “clr” are for)

I’m guessing Unk_120 is filter dirty status, but I suppose I’ll have to wait until the filter is dirty to confirm this. It did show filter dirty for me as soon as I setup the app but was unflagged by the time I got it added to HA.

There is an elapsed time that is always 1 - maybe Unk_129?

Some of the unmapped “0” values for mine are Error Code and PM2.5. Unsure how to test this/if it works.
Also have an air quality report in tuya, that shows “good”, don’t see mapped in HA, but possibly doesn’t work anyway.

Two battery values that I don’t see mapped in this, but show in tuya. values 225 for one and 250-15000 for the other. Useless since there is no battery, I’m assuming, maybe an internal voltage monitor, not sure who that would help.

Anyway, sorry if this information doesn’t contribute. Was trying to get this info incorporated into the yaml above but alot of this is over my head so far. Thanks for everyone’s help getting me this far.