Toshiba home AC control

Hello everyone, i also got a ras-b13n4kvrg-e installed today, unfortunately my dad bought the wrong model so now i’m stuck with this smartish yet stilish AC.
Anyway i’ve got the app up and running on a rooted phone if it can be of any help (especially to @h4de5).
I also setup the google home link, but it’s very embarassing, it exposes only the on/off status to google home :face_with_raised_eyebrow:
I even tried @h4de5’s example.py and it works flawlessly.

All this to say that I, my AC and my phone are at your disposal!

What kind of wifi-module is in the A/C?
if it is a OSK-102 or OSK-103 probably the ESPhome solution would work for you, as i noticed two other Toshibe A/C’s are confirmed working allready😉

It does require some diy work, but it is not difficult, and would cost around €7.50

Unfortunately my model has integrated wifi module and no port USB at all and also no reachable serial without voiding the warranty, so the cloud-interfacing option is the only way in my case.

Unfortunately I’m in the same boat with my Toshiba Haori, which also has the integrated wifi module :expressionless:

1 Like

I’ve opened the AC and the module is a WRE-T00BJ10, it has no USB at all but a 6pin connector with just 4 wires connected to it. Any guesses?

Hard to guess…
might be +5v / tx / tx / gnd but could be anything….

a small update here:

I added some more example code. it is possible to update the scheduler now.

Beware: the example code will reset the program for the current day, activate all ACs for 5 minutes and turn them off again afterwards.

the updated program is also shown within the app, but, at least mine, is not turned on automatically yet.

Hello Everyone,

My first time on this forum.

I have set up a Toshiba AC system with this wifi controlled system you are talking about, in our offices.

However i have trouble connecting the module to our wifi network, as we have a firewall that prevents all “foreign” connections. My IT department is asking me what web port have they got to open to make it work?

I’ve been frantically searching online and haven’t found any hope… until i came across this forum.

Anyone coud help me on that one?

Thanks a lot.

hello and welcome.
the wifi adapter is making an connection to the outside: 51.144.118.31 to port 8883 and uses a tls encrypted amqp protocol.
your app is also connecting to that server, so normally no direct connection is necessary. unless maybe during pairing. if the company wifi is too restrictive i would take a second mobile phone open an wifi hotspot with the same credentials and do the initial pairing there.

good luck.

hello
the code should be used in home assistant or separately?
how does it work?

@h4de5 I have digged a bit into AMQP connection. I’ve managed to capture some decrypted communication in wireshark (with mitmproxy) but it stops working when establishing AMQP communication. It seems like we have multiple levels of encapsulation. Firts TLS connection is established with toshibasmaciothubprod.azure-devices.net, then websocket is created:

Hypertext Transfer Protocol
    GET /$iothub/websocket HTTP/1.1\r\n
    Host: toshibasmaciothubprod.azure-devices.net:443\r\n
    Connection: Upgrade\r\n
    Upgrade: websocket\r\n
    Sec-WebSocket-Version: 13\r\n
    Sec-WebSocket-Key: ######
    Sec-WebSocket-Protocol: AMQPWSB10\r\n
    \r\n
    [Full request URI: https://toshibasmaciothubprod.azure-devices.net:443/$iothub/websocket]
    [HTTP request 1/1]
    [Response in frame: 1822]

Server accepts websocket communication:

Hypertext Transfer Protocol
    HTTP/1.1 101 Switching Protocols\r\n
    Upgrade: websocket\r\n
    Server: Microsoft-HTTPAPI/2.0\r\n
    Sec-WebSocket-Protocol: AMQPWSB10\r\n
    Connection: Upgrade\r\n
    Sec-WebSocket-Accept: ######
    Date: Fri, 20 Aug 2021 12:16:45 GMT\r\n
    \r\n
    [HTTP response 1/1]
    [Time since request: 0.033266349 seconds]
    [Request in frame: 1821]
    [Request URI: https://toshibasmaciothubprod.azure-devices.net:443/$iothub/websocket]

This should create websocket with protocol AMQPWSB10 which is AMQP version 1.0. Unfortunately at this stage my connection is breaking - mitmproxy has some problem handling this further.

As this is MS Azure AMQP API this may help: GitHub - Azure/azure-uamqp-python: AMQP 1.0 client library for Python, but I haven’t tried it yet.

@h4de5 I have mannaged to connect to AMQP and I’m receiving state change notifications for my AC.

I’ve done this with azure-iot-device python package and following code: Toshiba Home AC AMQP connection · GitHub. You have to fill your device id and shared key.

When I change something on my AC it generates output similar to this:

Method handler
smmobile
1
{'sourceId': '######', 'messageId': '######', 'targetId': ['######'], 'cmd': 'CMD_FCU_FROM_AC', 'payload': {'data': '30ffffffffffffffffffffffffffffffffffff'}, 'timeStamp': '21:44:55.5649670'}

Now I need to add encoder/decoder for state of AC and try to control it from python.

Can we use your script to generate device id and shared key or this is something we can only read from android property store?

nice.
unfortunatelly I did not find another way to get those ids.

@Didier3L the script needs to run stand alone at the moment, even it was planed to be integrated into HA. but for the whole “idea” to use the scheduler to send updates to the AC: this did not turn out to be working. so think I’ll retire that again.

but I will definitelly have a look into the AMQP setup asap.

I just tried it too - and I do get updates from the API - can you prepare a script which will send something to the API server?

example data:

turn off:
{‘sourceId’: ‘xxxx’, ‘messageId’: ‘0000000090’, ‘targetId’: [‘yyyyyy’], ‘cmd’: ‘CMD_FCU_TO_AC’, ‘payload’: {‘data’: ‘31ffffffffffffffffffffffffffffffffffff’}, ‘timeStamp’: ‘0061217209’}

turn on and change fanspeed to low:
{‘sourceId’: ‘xxxx’, ‘messageId’: ‘0000000090’, ‘targetId’: [‘yyyyyy’], ‘cmd’: ‘CMD_FCU_TO_AC’, ‘payload’: {‘data’: ‘30ffff20ffffffffffffffffffffffffffffff’}, ‘timeStamp’: ‘0061217209’}

timeStamp: current timestamp converted to hex + two leading zeros

payload:

example fan speed settings (and for a little more see const.py in github code)

quiet = 0x1F,
low = 0x20,
lowPlus = 33,
medium = 34,
mediumPlus = 35,
high = 36

here you can see what those positions actually means - while ff always declare not to change any settings for this function:

# see: SmartAC.Services.MQTTServices.MqttSendCmdJson

_operationStatus = "ff";
_mode = "ff";
_temp = "ff";
_fanSpeed = "ff";
_airSwing = "ff";
_powerSelection = "ff";
_meritFeature = "ff";
_pure = "ff";
_indoorTemp = "ff";
_outdoorTemp = "ff";
_errorCode = "ff";
_timerType = "ff";
_relativeHours = "ff";
_relativeMins = "ff";
_selfCleaning = "ff";
_ledStatus = "ff";
_schedulerStatus = "ff";
_utcHours = "ff";
_utcMins = "ff";

return _operationStatus + _mode + _temp + _fanSpeed + _airSwing + _powerSelection + _meritFeature + _pure + _indoorTemp + _outdoorTemp + _errorCode + _timerType + _relativeHours + _relativeMins + _selfCleaning + _ledStatus + _schedulerStatus + _utcHours + _utcMins;

@h4de5 I have made some progress - I can turn on/off my AC from python. Rest of the commands just needs further parsing and creating some API for them. I have created library here: GitHub - KaSroka/Toshiba-AC-control: Python controller for Toshiba AC please check its README for further info.

What’s missing:

  • Load current state from HTTP API (as discovered by @h4de5) as AMQP only notifies about changes - we need to know initial state after connection. Loading current state on init, also reloading from HTTP periodically as well (just in case).
  • Parse all the fields from fcu reports (currently only some information is parsed)
  • Extract SHARED_ACCESS_KEY, DEVICE_ID and AC_ID from HTTP API (@h4de5 in decompiled SmartAC.Services.ACServices.ACDeviceServices there is a method called GetACDeviceProvisioned which returns RegisterMobileDeviceRespObj that should contain shared access key - can you please check if this works? It requests /api/AC/GetRegisteredACByUniqueId with HTTP GET and ACUniqueId set to device ID) Done, now APP login info is only required.

EDIT: Latest version uses APP login info to fetch all required data, initial AC state and required tokens are fetched using HTTP API and further state updates are handled by AMQP.

Heartbeat notification also provides some nice data.

2 Likes

just want to confirm: its working!

how do we progress from here? do you want to create an home-assistant integration from it? or would you provide your code as pypi package?

It will be nice to get some help. I’ve never created home-assistant integration. Also, library also needs some polishing - it’s missing a lot of error handling and python is not my primary language. Any help is appreciated.

Also I’ve updated the lib - sample has now some GUI in tkinter (I’ve tested in on linux only)

I never created a python package myself, but I think you are on a good track.

I know some basic home-assistant stuff, due to an integration I did for another system. usually we split up the API part (any code that actually communicates with the devices or hubs) and the HA stuff (everything else, that helps home-assistant create and use new entites).
the existing toshiba repository includes most of the boilerplate code for a new integration already. I’ll have a look and add a simple climate entity to it in the next days.

I think the best would be to release this on pypi and create separate repo for HA integration. This way we can separate lib from integration - I think that HA requires this.

exactly.
I updated the toshiba integration. it uses your github repo directly (so for testing we do not need a pypi package - but we should have one later)

if you add it as custom component, it should show up in the integration list:

image

if you enter the correct user + password it should create one climate entity for each device you have connected:

image

currently its possible to turn the device on and off, change modes, target temperature and fan speed.

image

it misses the current temperature as well as settings for the power level.
also there seem to be an issue on my side with the updates back to HA - so any changes made to the device will not show up in HA.

1 Like