Pioneer WYT mini split wifi integration

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.

Can you share more details on what you did? I have two of these - I took one all the way apart to get the controller installed after not being able to figure out how to do it without taking the entire thing apart. the second controller has been sitting in front of the second unit mocking me because I’d already installed it and haven’t wanted to tear it down while it’s on the wall… would LOVE to not have to do that.

Can you still drop a .yaml in the devices folder? I’ve tried but can’t seem to get Local Tuya to recognise a device when adding my WYT’s as a new device.

config\custom_components\tuya_local\devices

I’ve noticed that my tuya local directory is named tuyalocal & not tuya_local, maybe something to do with it.

Thanks!

1 Like

Hey all. I am new here.
I found this place because I am currently reverse engineering the serial protocol of the Pioneer WYT mini-split. My unit uses the TCWBRCU1 dongle and can be controlled with the Tuya Smart app.
I do not have Home Assistant so I am only working on the raw serial commands.

I see that some others here have been working on this but I haven’t seen any of their progress.

I wonder if I am just doing work that someone else has already finished…?
Can anyone bring me up to date?

Update: I have this completely working. As I said before, I don’t actually use Home Assistant, so it’s up to someone else to make an integration.

There’s still portions of the message I don’t understand. At some point soon I’ll try to write up what I know about this, but for now, here’s a message generator and message parser in Python that appear to work:

3 Likes

Good work, I’m about to purchase and install a WYT unit so I may be able to help bridge the gap between creating/testing an integration.

Can you please confirm if there are any issues or inconstancies with your library currently. I saw some notes about not understanding successful command response and some uncertainty about delay tining

For example do any commands seem to have no effect or require multiple issues to trigger? Is there any delay currently?

Also can you please specify which functions are confirmed working? It looked to me like your library indicated that there was swing control, temperature, current mode, etc. But how does the protocol report changes made from the remote? Does one have to poll the mini split itself? Or does any command received by the IR remote report over UART?

Thanks again, library looks good.

Now that the Tuya local add-on can no longer be configured by the .yaml file, what is the best way to configure a Pioneer WYT in Tuya local?

+1 I am also wondering this.

1 Like

@DallasJW and @wkelley70 just spent some time trying to figure this out. I went down the wrong albeit educational path because I started with the localtuya integration. You actually want the tuya-local integration to get backcountrymountains’s config working: GitHub - make-all/tuya-local: Local support for Tuya devices in Home Assistant

2 Likes

That was it; thanks! Its working now! Confusing; i never would have noticed the difference between tuya-local and local-tuya.

My Tuya cloud subscription expired and I would get an error when trying to poll the device values that it had expired. Hit the button and filled out the form to request an extension and it worked (no email received, but I had permission again).

To continue, I’ve also been working for quite a while on reverse engineering the serial protocol between the WYT dongle and the Pioneer unit. Just stumbled on this thread, which motivated me to clean up my notes a bit and put them somewhere. See GitHub - squidpickles/tuya-serial: Reverse engineering notes on serial protocol between Tuya WiFi dongle and Pioneer WYT mini-split for yet another take on the protocol.

Guess it’s time to come back to this and get it going

1 Like

I’d love if we could have proper local control that doesn’t rely on Tuya.