Edit: I may not have put this in the right section, sorry.
Join me on my anger fueled journey.
Context: I am new to the hobby, and purchased some used AP700 without realizing how old they were. No idea if this information will be useful, but I struggled to find any when I was researching. I was hoping to utilize the smart features included with it's built in wifi.
Problems I encountered.
- App is for the most part required to fully use the lights, Android app is no longer compatible with any modern device and can't be installed. Apple iOS app still does work, though very flakey.
- Fixtures don't seem to keep time well or ignore NTP. (Two lights would drift apart slowly turning on at slightly different times)
- Likely due to age, but one of two of the lights will turn off completely when set to moon mode.
Solutions I believe helped.
- iOS device is required to adopt lights to the "router", android may be possible, but didn't invest time in emulating an old enough android version.
- Static IP must be set, if changed from initial adoption, will likely require app reset, and readoption. Without a static IP, the light does not seem discoverable by the app anymore once it inventible changes.
- WiFi must be limited to 2.4Ghz only. (I setup a second SSID)
- lights benefit from being isolated/locked to a single AP, they do not seem to handle roaming or handoff well if they change APs.
So I got these stupid things on the network after about 2 days..., and they are controllable via the iOS app, but really for how much longer.
It's time to look under the hood and see how these things really work sense there's zero support anymore.
After an embarrassing amount of time, I have some information on how they operate and can be controlled by manually sending packets to it. (It has zero authentication)
This is also where I rant.
So yes, you can send packets of information just like the app, from any device. What makes it a pain in the butt, is there are 6 channel of information you need to feed it, and it's not RGB with Intensity. They expect a byte value the corresponds to power level on a selected "channel" of LEDs. I was unable to figure out on my own any kind of pattern to how it was formulating color with intensity. So it's time to crack open the app and see how it's working, and it's gross. There is a massive table of information that the app calls "calibration table" this gross array contains the formulas to produce the colors listed in the app (Deep Blue, Ocean Blue 3, etc) What this means, without this calibration data, it's not possible for me to guess the power output of each LED channel to reach a desired color or intensity. To be ***** they seemed to have obfuscated the latest versions of android apps calibration data, though luckily some of the first versions of the app are not obfuscated. The app also uses a intensity mapping presets, so adjusting the intensity manually is not linear, fun...
Technical Details
- Lights operate on port 8899
- They take 12 channels of information, 6 per light socket.
- No Authentication (Lights do expect checksum)
- Format: (start byte: 0xA9) + (length byte) + (body) + (checksum) + (stop byte: 0x5C)
I have been testing with simple Python script I can control from Home Assistant in my case.
Python Script attached.
(Must edit script with your lights IP address at the top)
Example Usage from within Home Assistant PyScript.
Turn on Light -
Turn Off Light -
Set Color -
List of Colors recognized
Join me on my anger fueled journey.
Context: I am new to the hobby, and purchased some used AP700 without realizing how old they were. No idea if this information will be useful, but I struggled to find any when I was researching. I was hoping to utilize the smart features included with it's built in wifi.
Problems I encountered.
- App is for the most part required to fully use the lights, Android app is no longer compatible with any modern device and can't be installed. Apple iOS app still does work, though very flakey.
- Fixtures don't seem to keep time well or ignore NTP. (Two lights would drift apart slowly turning on at slightly different times)
- Likely due to age, but one of two of the lights will turn off completely when set to moon mode.
Solutions I believe helped.
- iOS device is required to adopt lights to the "router", android may be possible, but didn't invest time in emulating an old enough android version.
- Static IP must be set, if changed from initial adoption, will likely require app reset, and readoption. Without a static IP, the light does not seem discoverable by the app anymore once it inventible changes.
- WiFi must be limited to 2.4Ghz only. (I setup a second SSID)
- lights benefit from being isolated/locked to a single AP, they do not seem to handle roaming or handoff well if they change APs.
So I got these stupid things on the network after about 2 days..., and they are controllable via the iOS app, but really for how much longer.
It's time to look under the hood and see how these things really work sense there's zero support anymore.
After an embarrassing amount of time, I have some information on how they operate and can be controlled by manually sending packets to it. (It has zero authentication)
This is also where I rant.
So yes, you can send packets of information just like the app, from any device. What makes it a pain in the butt, is there are 6 channel of information you need to feed it, and it's not RGB with Intensity. They expect a byte value the corresponds to power level on a selected "channel" of LEDs. I was unable to figure out on my own any kind of pattern to how it was formulating color with intensity. So it's time to crack open the app and see how it's working, and it's gross. There is a massive table of information that the app calls "calibration table" this gross array contains the formulas to produce the colors listed in the app (Deep Blue, Ocean Blue 3, etc) What this means, without this calibration data, it's not possible for me to guess the power output of each LED channel to reach a desired color or intensity. To be ***** they seemed to have obfuscated the latest versions of android apps calibration data, though luckily some of the first versions of the app are not obfuscated. The app also uses a intensity mapping presets, so adjusting the intensity manually is not linear, fun...
Technical Details
- Lights operate on port 8899
- They take 12 channels of information, 6 per light socket.
- No Authentication (Lights do expect checksum)
- Format: (start byte: 0xA9) + (length byte) + (body) + (checksum) + (stop byte: 0x5C)
I have been testing with simple Python script I can control from Home Assistant in my case.
CALIBRATION = [
[720,3028,720,4095,4095,0,670,3632,670,3913,3913,0],
[0,2318,0,2060,2060,0,0,2250,0,2000,2000,0],
[0,807,0,0,1421,0,0,800,0,0,1400,0],
[1100,2813,1100,4095,4095,0,1084,2746,1084,4034,4034,0],
[821,2144,821,1870,2082,0,847,2118,847,1857,2056,0],
[0,1255,731,794,786,0,0,1236,721,772,773,0],
[1660,1704,1660,4095,4095,0,1626,1743,1626,4095,4095,0],
[1071,1953,1164,1829,1878,0,1071,1953,1164,1829,1878,0],
[724,1212,724,759,805,0,0,1178,875,751,746,0],
[2223,1000,2223,3568,3508,0,2200,1635,2200,4095,2734,0],
[1405,1684,1405,1720,1684,0,1405,1684,1405,1720,1684,0],
[788,986,788,0,986,0,786,961,786,0,961,0],
[2684,703,2684,3486,2955,0,2695,985,2695,3181,2734,0],
[1676,1676,1676,1390,1502,0,1654,1698,1654,1401,1524,0],
[832,913,832,0,913,0,826,903,826,0,898,0],
[3161,770,3161,4054,1833,0,3333,1915,3333,2069,1967,0],
[1918,1429,1918,1259,1314,0,1922,1451,1922,1257,1323,0],
[885,857,885,0,857,0,884,852,884,0,842,0],
[4015,1125,4015,2236,1466,0,4095,1466,4095,1677,1466,0],
[2140,1240,2140,1080,1125,0,2144,1262,2144,1078,1134,0],
[916,800,916,0,789,0,938,798,938,0,777,0],
[3975,1129,3975,1200,1309,0,4095,1000,4095,1034,1599,0],
[2200,1025,2200,853,1013,0,2320,1080,2345,828,1030,0],
[972,911,972,0,0,0,974,909,974,0,0,0],
[3975,880,3975,1020,1160,0,4095,900,4095,1000,1100,0],
[2226,906,2226,779,881,0,2352,876,2352,787,850,0],
[992,836,992,0,0,0,1004,824,1004,0,0,0],
[0,0,0,0,0,0,0,0,0,0,0,1785],
[0,0,0,0,0,0,0,0,0,0,0,1298],
[0,0,0,0,0,0,0,0,0,0,0,743],
[0,860,0,880,860,0,0,850,0,950,850,0],
[0,750,0,750,750,0,0,739,0,739,739,0],
[0,0,0,0,754,0,0,0,0,0,700,0],
[0,0,0,0,0,0,0,0,0,0,0,4095],
[0,0,0,0,0,0,0,0,0,0,0,2169],
[0,0,0,0,0,0,0,0,0,0,0,1021],
[0,0,0,0,0,1520,0,0,0,0,0,3975],
[0,0,0,0,0,970,0,0,568,0,0,2196],
[0,0,0,0,0,726,0,0,0,0,0,1265],
[0,0,0,0,0,4095,0,0,0,0,0,2760],
[0,0,0,0,0,1797,0,0,0,0,0,1773],
[0,0,0,0,0,795,0,0,0,0,0,837],
[0,0,0,0,0,3200,0,0,0,0,0,0],
[0,0,0,0,0,1772,0,0,0,0,0,0],
[0,0,0,0,0,771,0,0,0,0,0,0],
[1960,0,1960,2560,0,4095,2100,0,2100,2800,0,0],
[1140,0,1010,2537,0,2594,1122,0,1122,1966,0,0],
[0,0,690,1339,0,1315,0,0,694,1442,0,0],
[1527,3817,1527,2005,3536,0,1476,3947,1476,2069,3654,858],
[1018,2655,1018,1367,2331,0,1018,2628,1018,1346,2315,0],
[0,924,0,1144,1261,0,0,873,0,1090,1202,987],
[700,1460,740,690,710,0,710,1490,750,705,740,4075],
[0,0,0,809,1110,0,0,0,0,894,1143,2315],
[0,0,0,0,803,0,0,0,0,0,783,1043],
]
INTENSITY_MAPPING_PERCENT = [0, 0, 1, 1, 2, 2, 2, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 7, 7, 7, 8, 8, 9, 9, 9, 10, 10, 11, 11, 11, 12, 12, 13, 13, 13, 14, 14, 15, 15, 15, 16, 16, 16, 17, 17, 18, 18, 18, 19, 19, 20, 20, 20, 21, 21, 22, 22, 22, 23, 23, 24, 24, 24, 25, 25, 25, 26, 26, 27, 27, 27, 28, 28, 29, 29, 29, 30, 30, 31, 31, 31, 32, 32, 33, 33, 33, 34, 34, 35, 35, 35, 36, 36, 36, 37, 37, 38, 38, 38, 39, 39, 40, 40, 40, 41, 41, 42, 42, 42, 43, 43, 44, 44, 44, 45, 45, 45, 46, 46, 47, 47, 47, 48, 48, 49, 49, 49, 50, 50, 51, 51, 51, 52, 52, 53, 53, 53, 54, 54, 55, 55, 55, 56, 56, 56, 57, 57, 58, 58, 58, 59, 59, 60, 60, 60, 61, 61, 62, 62, 62, 63, 63, 64, 64, 64, 65, 65, 65, 66, 66, 67, 67, 67, 68, 68, 69, 69, 69, 70, 70, 71, 71, 71, 72, 72, 73, 73, 73, 74, 74, 75, 75, 75, 76, 76, 76, 77, 77, 78, 78, 78, 79, 79, 80, 80, 80, 81, 81, 82, 82, 82, 83, 83, 84, 84, 84, 85, 85, 85, 86, 86, 87, 87, 87, 88, 88, 89, 89, 89, 90, 90, 91, 91, 91, 92, 92, 93, 93, 93, 94, 94, 95, 95, 95, 96, 96, 96, 97, 97, 98, 98, 98, 99, 99, 100, 100]
Python Script attached.
(Must edit script with your lights IP address at the top)
Example Usage from within Home Assistant PyScript.
Turn on Light -
service: pyscript.ap700_on
Turn Off Light -
service: pyscript.ap700_off
Set Color -
service: pyscript.ap700_set_color_name
data:
color_name: Ocean Blue 3
intensity: 60
List of Colors recognized
sky blue
ocean blue 7
ocean blue 6
ocean blue 5
ocean blue 4
ocean blue 3
ocean blue 2
ocean blue 1
deep ocean blue
indigo
purple
red
orange
yellow
green
blue
moon red
moon blue
Attachments
Last edited: