AC Infinity Bluetooth 69 PRO controllers SUCCESSFUL

been working on this for awhile still have yet to find all the monitoring values but heres how to control the variable fan and on/off

(find the mac id of device and replace the YOURMACADDRESS with it) then add this with mac address to config.yaml

shell_command:
aci_on: gatttool -b YOURMACADDRESS --char-write-req -a 0x0030 -n a500000800536f0e000310010212010aff01209a
aci_off: gatttool -b YOURMACADDRESS --char-write-req -a 0x0030 -n a5000008009c47ad000310010111010aff0100a8
aci_off0: gatttool -b YOURMACADDRESS --char-write-req -a 0x0030 -n a50000080104762d0003100101110100ff01c769
aci_off1: gatttool -b YOURMACADDRESS --char-write-req -a 0x0030 -n a5000008010fc7460003100101110101ff01f059
aci_off2: gatttool -b YOURMACADDRESS --char-write-req -a 0x0030 -n a5000008017c89b20003100101110102ff01a909
aci_off3: gatttool -b YOURMACADDRESS --char-write-req -a 0x0030 -n a50000080190b5100003100101110103ff019e39
aci_off4: gatttool -b YOURMACADDRESS --char-write-req -a 0x0030 -n a500000801a4c3c70003100101110104ff011ba9
aci_off5: gatttool -b YOURMACADDRESS --char-write-req -a 0x0030 -n a500000801b7e1950003100101110105ff012c99
aci_off6: gatttool -b YOURMACADDRESS --char-write-req -a 0x0030 -n a500000801ca4eaf0003100101110106ff0175c9
aci_off7: gatttool -b YOURMACADDRESS -–char-write-req -a 0x0030 -n a500000801dd2c790003100101110107ff0142f9
aci_off8: gatttool -b YOURMACADDRESS --char-write-req -a 0x0030 -n a500000801fa78fc0003100101110108ff016ec8
aci_off9: gatttool -b YOURMACADDRESS --char-write-req -a 0x0030 -n a5000008020db2570003100101110109ff0159f8
aci_off10: gatttool -b YOURMACADDRESS --char-write-req -a 0x0030 -n a500000800536f0e000310010111010aff01209a
aci_on0: gatttool -b YOURMACADDRESS --char-write-req -a 0x0030 -n a50000080104762d0003100102120100ff01c769
aci_on1: gatttool -b YOURMACADDRESS --char-write-req -a 0x0030 -n a5000008010fc7460003100102120101ff01f059
aci_on2: gatttool -b YOURMACADDRESS --char-write-req -a 0x0030 -n a5000008017c89b20003100102120102ff01a909
aci_on3: gatttool -b YOURMACADDRESS --char-write-req -a 0x0030 -n a50000080190b5100003100102120103ff019e39
aci_on4: gatttool -b YOURMACADDRESS --char-write-req -a 0x0030 -n a500000801a4c3c70003100102120104ff011ba9
aci_on5: gatttool -b YOURMACADDRESS --char-write-req -a 0x0030 -n a500000801b7e1950003100102120105ff012c99
aci_on6: gatttool -b YOURMACADDRESS --char-write-req -a 0x0030 -n a500000801ca4eaf0003100102120106ff0175c9
aci_on7: gatttool -b YOURMACADDRESS -–char-write-req -a 0x0030 -n a500000801dd2c790003100102120107ff0142f9
aci_on8: gatttool -b YOURMACADDRESS --char-write-req -a 0x0030 -n a500000801fa78fc0003100102120108ff016ec8
aci_on9: gatttool -b YOURMACADDRESS --char-write-req -a 0x0030 -n a5000008020db2570003100102120109ff0159f8
aci_on10: gatttool -b YOURMACADDRESS --char-write-req -a 0x0030 -n a500000800536f0e000310010212010aff01209a

3 Likes

I stumbled onto your work because I would like very simple control of my Infinity Controller 67 from my home automation system. I’m not an HA user, I mainly use Smartthings, Sharptools and other IOT connected devices. Any thoughts on how I could use your commands in my environment? BTW, as others have stated, Infinity should just provide some sort of API or even IFTTT for this).

they wont ive been in contact with their help department and a programmer they both say they dont want it to be done and want only their own proprietary software to be able to run their systems

i explained to them what we were doing here and how its home automation that were not trying to steal their work we are trying to make it work with ours and it would actually be better if they made their own home assistant integration so people could use it the way they want to.

basically told to go sit in the corner and deal with it even after explaining that it will only hurt them by nt being on the side of change…still dont care , its mor about profit and money for them then it is to be for the customer experience which i personally find sad…

so to your question

write a shell script and run it on your platform? i dont know what smart things is but im assuming another form of home assistant. so test your boundaries and see where you could fit something such as this

your really looking to use some script to bluetoothctl into the ACINFINITY ble protocols … not too hard right : )

seriously tho… were here if you need us

2 Likes

AC infinty 67 requires you to send a notification to one uuid , then a bit of code to a 2nd uuid for it to run properly…

would you be upset if i told you the 69 pro (99$ one…) works easier but not saying you cant do it

Thanks for the help. I don’t have much bluetooth experience, but I’d really like to control my controller 67 through my home automation, specifically the fan speed control. I’m using a PI device (linux) and have been able to connect to the controller using bluetoothctl, but I’m not sure what values I need to send via gatt. I’m also not opposed to getting the Controller 69, but they are sold out right now. I’ve included what I see so far. Any insight on how I need to attack this would be appreciated.

[ACI-UniversalController]# info DA:6E:91:88:26:2C 
Device DA:6E:91:88:26:2C (random)
        Name: ACI-UniversalController
        Alias: ACI-UniversalController
        Paired: no
        Trusted: yes
        Blocked: no
        Connected: yes
        LegacyPairing: no
        UUID: Generic Access Profile    (00001800-0000-1000-8000-00805f9b34fb)
        UUID: Generic Attribute Profile (00001801-0000-1000-8000-00805f9b34fb)
        UUID: Device Information        (0000180a-0000-1000-8000-00805f9b34fb)
        UUID: Nordic Semiconductor ASA  (0000fe59-0000-1000-8000-00805f9b34fb)
        UUID: Vendor specific           (70d51000-2c7f-4e75-ae8a-d758951ce4e0)
        ManufacturerData Key: 0x0902
        ManufacturerData Value:
  da 6e 91 88 26 2c 4e 37 4c 4e 48 00 01 08 09 13  .n..&,N7LNH.....
  0c 44 04 00 00 00 00 00 00 00 00                 .D.........

(from gatt)
# list-attributes
Primary Service
        /org/bluez/hci0/dev_DA_6E_91_88_26_2C/service000a
        00001801-0000-1000-8000-00805f9b34fb
        Generic Attribute Profile
Characteristic
        /org/bluez/hci0/dev_DA_6E_91_88_26_2C/service000a/char000b
        00002a05-0000-1000-8000-00805f9b34fb
        Service Changed
Descriptor
        /org/bluez/hci0/dev_DA_6E_91_88_26_2C/service000a/char000b/desc000d
        00002902-0000-1000-8000-00805f9b34fb
        Client Characteristic Configuration
Primary Service
        /org/bluez/hci0/dev_DA_6E_91_88_26_2C/service000e
        0000180a-0000-1000-8000-00805f9b34fb
        Device Information
Characteristic
        /org/bluez/hci0/dev_DA_6E_91_88_26_2C/service000e/char000f
        00002a29-0000-1000-8000-00805f9b34fb
        Manufacturer Name String
Characteristic
        /org/bluez/hci0/dev_DA_6E_91_88_26_2C/service000e/char0011
        00002a24-0000-1000-8000-00805f9b34fb
        Model Number String
Characteristic
        /org/bluez/hci0/dev_DA_6E_91_88_26_2C/service000e/char0013
        00002a27-0000-1000-8000-00805f9b34fb
        Hardware Revision String
Characteristic
        /org/bluez/hci0/dev_DA_6E_91_88_26_2C/service000e/char0015
        00002a26-0000-1000-8000-00805f9b34fb
        Firmware Revision String
Characteristic
        /org/bluez/hci0/dev_DA_6E_91_88_26_2C/service000e/char0017
        00002a28-0000-1000-8000-00805f9b34fb
        Software Revision String
Characteristic
        /org/bluez/hci0/dev_DA_6E_91_88_26_2C/service000e/char0019
        00002a23-0000-1000-8000-00805f9b34fb
        System ID
Primary Service
        /org/bluez/hci0/dev_DA_6E_91_88_26_2C/service001b
        70d51000-2c7f-4e75-ae8a-d758951ce4e0
        Vendor specific
Characteristic
        /org/bluez/hci0/dev_DA_6E_91_88_26_2C/service001b/char001c
        70d51001-2c7f-4e75-ae8a-d758951ce4e0
        Vendor specific
Characteristic
        /org/bluez/hci0/dev_DA_6E_91_88_26_2C/service001b/char001e
        70d51002-2c7f-4e75-ae8a-d758951ce4e0
        Vendor specific
Descriptor
        /org/bluez/hci0/dev_DA_6E_91_88_26_2C/service001b/char001e/desc0020
        00002902-0000-1000-8000-00805f9b34fb
        Client Characteristic Configuration
Primary Service
        /org/bluez/hci0/dev_DA_6E_91_88_26_2C/service0021
        0000fe59-0000-1000-8000-00805f9b34fb
        Nordic Semiconductor ASA
Characteristic
        /org/bluez/hci0/dev_DA_6E_91_88_26_2C/service0021/char0022
        8ec90003-f315-4f60-9fb8-838830daea50
        Vendor specific
Descriptor
        /org/bluez/hci0/dev_DA_6E_91_88_26_2C/service0021/char0022/desc0024
        00002902-0000-1000-8000-00805f9b34fb
        Client Characteristic Configuration

Your in the right spot your just not reading the packets your seeing the communication console for it to carry messages

I’m sure you can run scripts from the program you use…

Your gonna need to write a small shell script

Tell it to connect using Bluetooth to and to send command to turn on/ off and at what level

#!/usr/bin/expect -f

set prompt "#"
set address DA:6E:91:88:26:2C 
spawn bluetoothctl
expect -re $prompt
sleep 1
send "connect $address\r"
expect "Connection successful"
sleep 2
send "list-attributes\r"
sleep 2
send "menu gatt\r"
sleep 2
send "select-attribute /org/bluez/hci0/dev_F0_74_59_49_C0_45/service001b/char001e\r"
sleep 2
send "notify on\r"
sleep 2
send "select-attribute /org/bluez/hci0/dev_F0_74_59_49_C0_45/service001b/char001c\r"
sleep 2
send "write \"0xa5 0x00 0x00 0x06 0x00 0x67 0x02 0xd8 0x00 0x03 0x10 0x01 0x02 0x12 0x01 0x08 0x2b 0x3b\"\r" 
send "quit\r"
expect eof

this code requires you to have epect → apk add expect / apt-get install expect or whichever your linux terminal allows

then youll need to give permissions to the file you create with chmod 0777 filename.sh

then youll make file executable with chmod +x filename.sh

After you get that let me know I’ll run through the system and grab remaining codes to adjust pwm and off for you

Looks like things are working. I did swap the gatt and list-attributes commands because I believe that’s the correct order? Here’s what I get:

pi@raspberrypi:~ $ expect infinity.sh
spawn bluetoothctl
Agent registered
[ACI-UniversalController]# connect DA:6E:91:88:26:2C
Attempting to connect to DA:6E:91:88:26:2C
Connection successful
[ACI-UniversalController]# menu gatt
Menu gatt:
Available commands:

list-attributes [dev] List attributes
select-attribute <attribute/UUID> Select attribute
attribute-info [attribute/UUID] Select attribute
read [offset] Read attribute value
write <data=xx xx …> [offset] Write attribute value
acquire-write Acquire Write file descriptor
release-write Release Write file descriptor
acquire-notify Acquire Notify file descriptor
release-notify Release Notify file descriptor
notify <on/off> Notify attribute value
register-application [UUID …] Register profile to connect
unregister-application Unregister profile
register-service Register application service.
unregister-service <UUID/object> Unregister application service
register-includes Register as Included service in.
unregister-includes Unregister Included service.
register-characteristic <Flags=read,write,notify…> Register application characteristic
unregister-characteristic <UUID/object> Unregister application characteristic
register-descriptor <Flags=read,write…> Register application descriptor
unregister-descriptor <UUID/object> Unregister application descriptor
back Return to main menu
version Display version
quit Quit program
exit Quit program
help Display help about this program
export Print evironment variables
[ACI-UniversalController]# list-attributes
Primary Service
/org/bluez/hci0/dev_DA_6E_91_88_26_2C/service0021
0000fe59-0000-1000-8000-00805f9b34fb
Nordic Semiconductor ASA
Characteristic
/org/bluez/hci0/dev_DA_6E_91_88_26_2C/service0021/char0022
8ec90003-f315-4f60-9fb8-838830daea50
Vendor specific
Descriptor
/org/bluez/hci0/dev_DA_6E_91_88_26_2C/service0021/char0022/desc0024
00002902-0000-1000-8000-00805f9b34fb
Client Characteristic Configuration
Primary Service
/org/bluez/hci0/dev_DA_6E_91_88_26_2C/service001b
70d51000-2c7f-4e75-ae8a-d758951ce4e0
Vendor specific
Characteristic
/org/bluez/hci0/dev_DA_6E_91_88_26_2C/service001b/char001e
70d51002-2c7f-4e75-ae8a-d758951ce4e0
Vendor specific
Descriptor
/org/bluez/hci0/dev_DA_6E_91_88_26_2C/service001b/char001e/desc0020
00002902-0000-1000-8000-00805f9b34fb
Client Characteristic Configuration
Characteristic
/org/bluez/hci0/dev_DA_6E_91_88_26_2C/service001b/char001c
70d51001-2c7f-4e75-ae8a-d758951ce4e0
Vendor specific
Primary Service
/org/bluez/hci0/dev_DA_6E_91_88_26_2C/service000e
0000180a-0000-1000-8000-00805f9b34fb
Device Information
Characteristic
/org/bluez/hci0/dev_DA_6E_91_88_26_2C/service000e/char0019
00002a23-0000-1000-8000-00805f9b34fb
System ID
Characteristic
/org/bluez/hci0/dev_DA_6E_91_88_26_2C/service000e/char0017
00002a28-0000-1000-8000-00805f9b34fb
Software Revision String
Characteristic
/org/bluez/hci0/dev_DA_6E_91_88_26_2C/service000e/char0015
00002a26-0000-1000-8000-00805f9b34fb
Firmware Revision String
Characteristic
/org/bluez/hci0/dev_DA_6E_91_88_26_2C/service000e/char0013
00002a27-0000-1000-8000-00805f9b34fb
Hardware Revision String
Characteristic
/org/bluez/hci0/dev_DA_6E_91_88_26_2C/service000e/char0011
00002a24-0000-1000-8000-00805f9b34fb
Model Number String
Characteristic
/org/bluez/hci0/dev_DA_6E_91_88_26_2C/service000e/char000f
00002a29-0000-1000-8000-00805f9b34fb
Manufacturer Name String
Primary Service
/org/bluez/hci0/dev_DA_6E_91_88_26_2C/service000a
00001801-0000-1000-8000-00805f9b34fb
Generic Attribute Profile
Characteristic
/org/bluez/hci0/dev_DA_6E_91_88_26_2C/service000a/char000b
00002a05-0000-1000-8000-00805f9b34fb
Service Changed
Descriptor
/org/bluez/hci0/dev_DA_6E_91_88_26_2C/service000a/char000b/desc000d
00002902-0000-1000-8000-00805f9b34fb
Client Characteristic Configuration
har001eiversalController]# select-attribute /org/bluez/hci0/dev_DA_6E_91_88_26_2C/service001b/ch
[ACI-UniversalController:/service001b/char001e]# notify on
[CHG] Attribute /org/bluez/hci0/dev_DA_6E_91_88_26_2C/service001b/char001e Notifying: yes
Notify started
88_26_2C/service001b/char001cvice001b/char001e]# select-attribute /org/bluez/hci0/dev_DA_6E_91_8
0x00 0x03 0x10 0x01 0x02 0x12 0x01 0x08 0x2b 0x3b"ite "0xa5 0x00 0x00 0x06 0x00 0x67 0x02 0xd8
Attempting to write /org/bluez/hci0/dev_DA_6E_91_88_26_2C/service001b/char001c
[ACI-UniversalController:/service001b/char001c]# quit
pi@raspberrypi:~ $

Sorry the list attributes isn’t necessary, you can remove that part

Does the fan turn on when executing the code?

It was already on at speed 4, but went to speed 8 after running the script. I hadn’t noticed because the fan is in another room. Very cool! Looking through some of your earlier posts is the “8” in the command (send “write “0xa5 0x00 0x00 0x06 0x00 0x67 0x02 0xd8 0x00 0x03 0x10 0x01 0x02 0x12 0x01 0x08 0x2b 0x3b”\r”) setting the speed?

that is correct
a = 10

also the portion before that 0x02 0x12 , change to 0x01 0x11 to turn off

Awesome, I think I can fumble around now and poke at it. Thanks again for your time. And, Infinity if you are listening just make this easier!

1 Like

i cracked the advertised packet data yesterday!

#!/usr/bin/expect -f

set prompt "#"
set address 34:85:18:6a:52:52
spawn bluetoothctl
expect -re $prompt
send "connect $address\r"
expect "Connection successful"
send "menu gatt\r"
send "select-attribute /org/bluez/hci0/dev_34_85_18_6A_52_52/service002e/char0032\r"
send "notify on\r" 
sleep 1
send "exit\r"
send "exit\r"
send "quit\r"
expect eof

/config/./FILENAME.sh | grep 1e | awk ‘NR==1 { print"0x" $15 $16 }’ | xargs printf “%d\n” - vpd

/config/./FILENAME.sh | grep 1e | awk ‘NR==1 { print"0x" $13 $14 }’ | xargs printf “%d\n” - humidity

/config/./FILENAME.sh | grep 1e | awk ‘NR==1 { print"0x" $11 $12 }’ | xargs printf “%d\n” - Temperature in C

/config/./FILENAME.sh | grep 1e | awk 'NR==1 { print "0x" $11 $12 }' | xargs printf "%d\n" | xargs -n 1 bash -c echo $(($1 * 9/5 + 3200 ))' args | xargs -n 1 bash -c echo $(($1 /100 ))' args” - Temperature in Fahrenheit

1 Like

Nice work. I’d like to get this working as well, but I don’t have the same attribute you used (…service002e/char0032). I tried all of the attributes from my list (see my previous post), but nothing worked. I have the bluetooth controller, are you using the wifi controller? Any ideas on how to investigate?

check this thread for the 67

or heres the code for the 67, it doesnt give vpd but ou can calculate for that with temp and humidity

#!/usr/bin/expect -f

set prompt "#"
set address DA:6E:91:88:26:2C 
spawn bluetoothctl
expect -re $prompt
send "connect $address\r"
expect "Connection successful"
send "list-attributes\r"
send "menu gatt\r"
send "select-attribute /org/bluez/hci0/dev_DA_6E_91_88_26_2C/service001b/char001e\r"
send "notify on\r"
send "select-attribute /org/bluez/hci0/dev_DA_6E_91_88_26_2C/service001b/char001c\r"
send "write \"0xa5 0x00 0x00 0x03 0x03 0x49 0x79 0xd7 0x00 0x01 0x02 0x03 0x20 0x78 0xe9\"\r" 
send "select-attribute /org/bluez/hci0/dev_DA_6E_91_88_26_2C/service001b/char001e\r"
send "read\r"
sleep 2
send "quit\r"
expect eof

Temp in C

/config/./FILENAME.sh | grep a5 | awk 'NR==2 { print "0x" $16 $17 }' | xargs printf "%d\n"

this will show temp in F from terminal

/config/./FILENAME.sh | grep a5 | awk 'NR==2 { print "0x" $16 $17 }' | xargs printf "%d\n" |xargs -n 1 bash -c 'echo $(($1 * 9/5 + 3200 ))' args | xargs -n 1 bash -c 'echo $(($1 /100))' args

Humidity

/config/./FILENAME.sh | grep '20 01\| a5' | awk 'NR==1 {print "0x" $18};NR==2 {print $3}' | awk 'NR%2{printf "%s",$0;next;}1' | xargs printf "%d\n"

call these proof of concept strings…

That works for me, thanks. You may have already figured this out, but the reported speed appears to be in the 5th data pair of the second line. I set the speed to 0, 1 ,2 and this was the data.

a5 10 00 11 03 49 50 8e 00 01 02 05 02 08 a2 0c …IP…
b0 03 05 00 00 00 00 00 20 01 00 ed bb

a5 10 00 11 03 49 50 8e 00 01 02 05 02 08 a3 0c …IP…
b2 03 05 00 01 00 00 00 20 01 00 b0 0a

a5 10 00 11 03 49 50 8e 00 01 02 05 02 08 a6 0c …IP…
b4 03 05 00 02 00 00 00 20 01 00 d9 b2

Now I just need to extract it with one of your fancy command line proof of concepts.

1 Like

yea im working with it in python

edit ->stoned…i did not see it had sped registered. that may be nice for when its called to support set speed

import asyncio
from bleak import *
from bleak import BleakClient
from crccheck.crc import Crc16CcittFalse

address = "34:85:18:6a:52:52"

async def main(address):
    async with BleakClient(address) as client:

        aciuni = bytes.fromhex("a5000008013bb191")
        header = bytes.fromhex("00031001")
        power = bytes.fromhex("0111")
        direction = bytes.fromhex("01")
        velocity = bytes.fromhex("04") 
        params = bytes.fromhex("ff01")
        
        crcinst = Crc16CcittFalse()
        crcinst.process(header)
        crcinst.process(power)
        crcinst.process(direction)
        crcinst.process(velocity)
        crcinst.process(params)
        model_number = await client.write_gatt_char("70d51001-2c7f-4e75-ae8a-d758951ce4e0",aciuni + header + power + direction +  velocity + params + crcinst.finalbytes())

asyncio.run(main(address))

get advertised data

import sys
import time
import platform
import asyncio
import logging
from bleak import BleakClient

logger = logging.getLogger(__name__)

ADDRESS = (
    "34:85:18:6a:52:52"
    if platform.system() != "4GRDH"
    else "70d51002-2c7f-4e75-ae8a-d758951ce4e0"
)

CHARACTERISTIC_UUID = "70d51002-2c7f-4e75-ae8a-d758951ce4e0"


async def run_ble_client(address: str, char_uuid: str, queue: asyncio.Queue):
    async def callback_handler(sender, data):
        await queue.put((time.time(), data))
        item = await client.read_gatt_char(char_uuid)
        print("Read:", item)

    async with BleakClient(address) as client:
        logger.info(f"Connected: {client.is_connected}")
        await client.start_notify(char_uuid, callback_handler)
        await asyncio.sleep(.5)
        await client.stop_notify(char_uuid)
        await queue.put((time.time(), None))

async def run_queue_consumer(queue: asyncio.Queue):
    while True:
        epoch, data = await queue.get()
        if data is None:
            logger.info(
                "Got message from client about disconnection. Exiting consumer loop..."
            )
            break
        else:
            logger.info(f"Received callback data via async queue at {epoch}: {data}")

async def main(address: str, char_uuid: str):
    queue = asyncio.Queue()
    client_task = run_ble_client(address, char_uuid, queue)
    consumer_task = run_queue_consumer(queue)
    await asyncio.gather(client_task, consumer_task)
    logger.info("Main method done.")

if __name__ == "__main__":
    logging.basicConfig(level=logging.INFO)
    asyncio.run(
        main(
            sys.argv[1] if len(sys.argv) > 1 else ADDRESS,
            sys.argv[2] if len(sys.argv) > 2 else CHARACTERISTIC_UUID,
        )
    )

Sorry for such a simple question but the 69 pro controller is supporting both Bluetooth and wireless. Is the MAC address for the 802.11 wireless or the BT? If BT, how do you obtain it ?

hi, you can find out googling the command:
gatttool - tool for Bluetooth Low Energy device

1 Like

Thank you very much. Do you install it on the Home Assistant OS?