A few weeks ago, we purchased a tp-link LB130 smart bulb to use with the Home Assistant software we had been trying on the Raspberry Pi. The support for the bulb in the Home Assistant software was limited and so Andrew started to decode the data using Wireshark between the bulb and the Android and IOS apps to try to find the commands sent to and from the Wi-Fi bulb so he would write his own Python class to control the bulb on our home network.

Below is a list of all the commands which Andrew found on the bulb to control the settings and also a python class to control the bulb. The software for this project can be found on my GitHub repository.

TP-Link A19-LB130 Wifi Bulb Python Library

The tplight.py python library contains a class LB130 and methods for controlling the TP-Link A19-LB130 Wifi bulb.

A demo file demo.py is included which shows how to use the class.

Create an instance of the LB130 class with the IP address for the bulb

light = LB130("10.0.0.130")

Methods

status()

Get the connection status from the bulb. Returns a JSON formatted string with all of the available parameters.

light_details()

Get the light details from the bulb including min and max voltage, wattage and colour rendering index. Returns a JSON formatted string with all of the available parameters.

on()

Set the bulbs state to on.

off()

Set the bulbs state to off.

reboot()

Reboot the bulb.

alias(name)

Get or set the alias name for the bulb.

time(date)

Get or set the date and time on the bulb. Takes and returns a date as a datetime object.

timezone(timezone)

Get or set the timezone for the bulb. Value between 0 and 109. See timezones.md or the list below for a list of available timezones.

transition_period(period)

Get or set the transition period for any changes made to the bulbs colour or brightness. Value in milliseconds between 0 and 10000.

hue(hue)

Get or set the bulbs hue. Value between 0 and 360.

saturation(saturation)

Get or set the colour saturation for the bulb. Value between 0 and 100.

brightness(brightness)

Get or set the brightness. Value between 0 and 100.

temperature(temperature)

Get or set the colour temperature. Value between 0 and 7000.

TP-Link A19-LB130 Wifi Bulb Command Protocol

Commands are sent to the light bulb IP address, Port 9999 using a JSON formatted string. The string is encrypted by XORing each byte with the previous plain text byte.

tplight.py contains the encryption and decrytion routines.

smartlife.iot.common.system

reboot

reboot the device

Command:

{"smartlife.iot.common.system":{"reboot":{"delay":1}}}

Returns:

{"smartlife.iot.common.system":{"reboot":{"err_code":0}}}

set_dev_alias

Set the name or alias for the device

Command:

{"smartlife.iot.common.system":{"set_dev_alias":{"alias":"Kitchen Light"}}}

Returns:

{"smartlife.iot.common.system":{"set_dev_alias":{"err_code":0}}}

system

get_info

Gets the system information for the light bulb.

Command:

{"system":{"get_sysinfo":""}}

Returns:

{"system":{"get_sysinfo":{"sw_ver":"1.5.5 Build 170623 Rel.090105","hw_ver":"1.0","model":"LB130(EU)","description":"Smart Wi-Fi LED Bulb with Color Changing","alias":"Aaaa","mic_type":"IOT.SMARTBULB","dev_state":"normal","mic_mac":"50C7BF5E9C8F","deviceId":"80123265DD825560B3CAA1C3B1B12956187286B1","oemId":"D5C424D3C480911C980ECDD56C27988F","hwId":"111E35908497A05512E259BB76801E10","is_factory":false,"disco_ver":"1.0","ctrl_protocols":{"name":"Linkie","version":"1.0"},"light_state":{"on_off":1,"mode":"normal","hue":30,"saturation":100,"color_temp":0,"brightness":7},"is_dimmable":1,"is_color":1,"is_variable_color_temp":1,"preferred_state":[{"index":0,"hue":0,"saturation":0,"color_temp":2700,"brightness":50},{"index":1,"hue":0,"saturation":75,"color_temp":0,"brightness":100},{"index":2,"hue":120,"saturation":75,"color_temp":0,"brightness":100},{"index":3,"hue":240,"saturation":75,"color_temp":0,"brightness":100}],"rssi":-57,"active_mode":"none","heapsize":316848,"err_code":0}}}

smartlife.iot.common.schedule

The scheduler allows you to set events which will run at a scheduled date and time.

get_rules

Get a list of the rules present on the device

Command:

{"smartlife.iot.common.schedule":{"get_rules":""}}

Returns:

{"smartlife.iot.common.schedule":{"get_rules":{"rule_list":[{"id":"CF652E0D1D57B0BC12D978822F4456CA","name":"name","enable":1,"wday":[1,0,1,0,1,0,0],"stime_opt":0,"smin":780,"sact":2,"s_light":{"on_off":1,"mode":"customize_preset","hue":129,"saturation":21,"color_temp":0,"brightness":17},"etime_opt":-1,"emin":0,"eact":-1,"repeat":1}],"enable":1,"err_code":0}}}

add_rule

Add a new rule to the scheduler.

Command:

{"smartlife.iot.common.schedule":{"add_rule":{"name":"name","repeat":1,"wday":[1,0,1,0,1,0,0],"stime_opt":0,"eact":-1,"smin":780,"s_light":{"saturation":21,"hue":129,"brightness":17,"color_temp":0,"mode":"customize_preset","on_off":1},"enable":1,"day":24,"year":2017,"month":8,"sact":2,"emin":-1,"etime_opt":-1},"set_overall_enable":{"enable":1}}}

Returns:

{"smartlife.iot.common.schedule":{"add_rule":{"id":"CF652E0D1D57B0BC12D978822F4456CA","err_code":0},"set_overall_enable":{"err_code":0}}}

delete_rule

Delete a rule from the scheduler

Command:

{"smartlife.iot.common.schedule":{"delete_rule":{"id":"CF652E0D1D57B0BC12D978822F4456CA"}}}

Returns

{"smartlife.iot.common.schedule":{"delete_rule":{"err_code":0}}}

get_next_action

smartlife.iot.common.timesetting

get_time

Gets the date and time from the device

Command:

{"smartlife.iot.common.timesetting":{"get_time":{}}}

Returns:

{"smartlife.iot.common.timesetting":{"get_time":{"year":2017,"month":8,"mday":24,"hour":20,"min":10,"sec":19,"err_code":0}}}

set_time

Sets the date and time for the device

Command:

{"smartlife.iot.common.timesetting":{"set_time":{"year":2017,"month":8,"mday":24,"hour":20,"min":10,"sec":19}}}

Returns:

{"smartlife.iot.common.timesetting":{"set_time":{"err_code":0}}}

get_timezone

Gets the timezone code for the device

Command:

{"smartlife.iot.common.timesetting":{"get_timezone":{}}}

Returns:

{"smartlife.iot.common.timesetting":{"get_timezone":{"index":39,"err_code":0}}}

set_timezone

Set the timezone code for the device

Command:

{"smartlife.iot.common.timesetting":{"set_timezone":{"index":39,"hour":18,"year":2017,"min":26,"month":8,"sec":42,"mday":25}}}

Returns:

{"smartlife.iot.common.timesetting":{"set_timezone":{"err_code":0}}}

smartlife.iot.common.emeter

get_daystat

Get the daily power usage in wh for the specified month

Command:

{"smartlife.iot.common.emeter":{"get_daystat":{"year":2017,"month":8}}}

Returns:

{"smartlife.iot.common.emeter":{"get_daystat":{"day_list":[{"year":2017,"month":8,"day":2,"energy_wh":0},{"year":2017,"month":8,"day":3,"energy_wh":0},{"year":2017,"month":8,"day":9,"energy_wh":2},{"year":2017,"month":8,"day":12,"energy_wh":3},{"year":2017,"month":8,"day":14,"energy_wh":0},{"year":2017,"month":8,"day":15,"energy_wh":3},{"year":2017,"month":8,"day":16,"energy_wh":3},{"year":2017,"month":8,"day":17,"energy_wh":4},{"year":2017,"month":8,"day":23,"energy_wh":0},{"year":2017,"month":8,"day":24,"energy_wh":14},{"year":2017,"month":8,"day":25,"energy_wh":0},{"year":2017,"month":8,"day":26,"energy_wh":0}],"err_code":0}}}

smartlife.iot.smartbulb.lightingservice

get_light_state

Get the status and values for the hue, saturation, brightness and colour temperature

Command:

{"smartlife.iot.smartbulb.lightingservice":{"get_light_state":""}}

Returns:

{"smartlife.iot.smartbulb.lightingservice":{"get_light_state":{"on_off":1,"mode":"normal","hue":30,"saturation":100,"color_temp":0,"brightness":7,"err_code":0}}}

transition_light_state

Set the status and values for the hue, saturation, brightness and colour temperature. The transition period for changing to the new state can be defined using the transition_period variable.

Command:

{"smartlife.iot.smartbulb.lightingservice":{"transition_light_state":{"ignore_default":1,"transition_period":150,"mode":"normal","hue":120,"on_off":1,"saturation":65,"color_temp":0,"brightness":10}}}

Returns:

{"smartlife.iot.smartbulb.lightingservice":{"transition_light_state":{"on_off":1,"mode":"normal","hue":120,"saturation":65,"color_temp":0,"brightness":10,"err_code":0}}}

get_light_details

Get the system details for the device such as min and max voltages, lamp beam angle and maximum lumens.

Command:

{"smartlife.iot.smartbulb.lightingservice":{"get_light_details":""}}

Returns:

{"smartlife.iot.smartbulb.lightingservice":{"get_light_details":{"lamp_beam_angle":150,"min_voltage":110,"max_voltage":120,"wattage":10,"incandescent_equivalent":60,"max_lumens":800,"color_rendering_index":80,"err_code":0}}}

get_default_behavior

Get the default behavior for the device when it powers on.

Command:

{"smartlife.iot.smartbulb.lightingservice":{"get_default_behavior":""}}

Returns:

{"smartlife.iot.smartbulb.lightingservice":{"get_default_behavior":{"soft_on":{"mode":"last_status"},"hard_on":{"mode":"last_status"},"err_code":0}}}

Wifi Setup

get_scaninfo

Scan for nearby Access Points

Command:

{"netif":{"get_scaninfo":{"refresh":1}}}

set_stainfo

Connect to an access point with a specified SSID, password and key type.

Command:

{"netif":{"set_stainfo":{"ssid":"WiFi","password":"123","key_type":3}}}

Time Zone Settings

The TP-Link LB130 uses a code between 1 and 103 for setting the timezone of the device. The codes below can be used with the set_timezone command on the protocols page.

0 : UTC-12:00 - International Date Line West

: UTC-12:00 - International Date Line West 1 : UTC-11:00 - Coordinated Universal Time

: UTC-11:00 - Coordinated Universal Time 2 : UTC-10:00 - Hawaii

: UTC-10:00 - Hawaii 3 : UTC-09:00 - Alaska

: UTC-09:00 - Alaska 4 : UTC-08:00 - Baji California

: UTC-08:00 - Baji California 5 : UTC-08:00 - Pacific Standard Time

: UTC-08:00 - Pacific Standard Time 6 : UTC-08:00 - Pacific Daylight Time

: UTC-08:00 - Pacific Daylight Time 7 : UTC-07:00 - Arizona

: UTC-07:00 - Arizona 8 : UTC-07:00 - Chihuahua, La Paz, Mazatlan

: UTC-07:00 - Chihuahua, La Paz, Mazatlan 9 : UTC-07:00 - Mountain Standard Time

: UTC-07:00 - Mountain Standard Time 10 : UTC-07:00 - Mountain Daylight Time

: UTC-07:00 - Mountain Daylight Time 11 : UTC-06:00 - Central America

: UTC-06:00 - Central America 12 : UTC-06:00 - Central Standard Time

: UTC-06:00 - Central Standard Time 13 : UTC-06:00 - Central Daylight Time

: UTC-06:00 - Central Daylight Time 14 : UTC-06:00 - Guadalajara, Mexico City

: UTC-06:00 - Guadalajara, Mexico City 15 : UTC-06:00 - Saskatchewan

: UTC-06:00 - Saskatchewan 16 : UTC-05:00 - Bogota, Lima, Quito

: UTC-05:00 - Bogota, Lima, Quito 17 : UTC-05:00 - Eastern Standard Time

: UTC-05:00 - Eastern Standard Time 18 : UTC-05:00 - Eastern Daylight Time

: UTC-05:00 - Eastern Daylight Time 19 : UTC-05:00 - Indiana (East)

: UTC-05:00 - Indiana (East) 20 : UTC-04:30 - Caracas

: UTC-04:30 - Caracas 21 : UTC-04:00 - Asunicion

: UTC-04:00 - Asunicion 22 : UTC-04:00 - Atlantic Standard Time

: UTC-04:00 - Atlantic Standard Time 23 : UTC-04:00 - Atlantic Daylight Time

: UTC-04:00 - Atlantic Daylight Time 24 : UTC-04:00 - Cuiaba

: UTC-04:00 - Cuiaba 25 : UTC-04:00 - Georgetown

: UTC-04:00 - Georgetown 26 : UTC-04:00 - Santiago

: UTC-04:00 - Santiago 27 : UTC-03:30 - Newfoundland

: UTC-03:30 - Newfoundland 28 : UTC-03:00 - Brasilia

: UTC-03:00 - Brasilia 29 : UTC-03:00 - Buenos Aires

: UTC-03:00 - Buenos Aires 30 : UTC-03:00 - Cayenne, Fortaleza

: UTC-03:00 - Cayenne, Fortaleza 31 : UTC-03:00 - Greenland

: UTC-03:00 - Greenland 32 : UTC-03:00 - Montevideo

: UTC-03:00 - Montevideo 33 : UTC-03:00 - Salvador

: UTC-03:00 - Salvador 34 : UTC-02:00 - Coordindated Universal Time

: UTC-02:00 - Coordindated Universal Time 35 : UTC-01:00 - Azores

: UTC-01:00 - Azores 36 : UTC-01:00 - Cabo Verde Is.

: UTC-01:00 - Cabo Verde Is. 37 : UTC - Casablanca

: UTC - Casablanca 38 : UTC - Coordindated Universal Time

: UTC - Coordindated Universal Time 39 : UTC - Dublin, Edinburgh, Lisbon, London

: UTC - Dublin, Edinburgh, Lisbon, London 40 : UTC - Monrovia, Reykjavik

: UTC - Monrovia, Reykjavik 41 : UTC+01:00 - Amsterdam, Berlin, Bern

: UTC+01:00 - Amsterdam, Berlin, Bern 42 : UTC+01:00 - Belgrade, Bratislava

: UTC+01:00 - Belgrade, Bratislava 43 : UTC+01:00 - Brussels, Copenhagen

: UTC+01:00 - Brussels, Copenhagen 44 : UTC+01:00 - Sarajevo, Skopje, Warsaw

: UTC+01:00 - Sarajevo, Skopje, Warsaw 45 : UTC+01:00 - West Central Africa

: UTC+01:00 - West Central Africa 46 : UTC+01:00 - Windkoek

: UTC+01:00 - Windkoek 47 : UTC+02:00 - Amman

: UTC+02:00 - Amman 48 : UTC+02:00 - Athens, Bucharest

: UTC+02:00 - Athens, Bucharest 49 : UTC+02:00 - Beirut

: UTC+02:00 - Beirut 50 : UTC+02:00 - Cairo

: UTC+02:00 - Cairo 51 : UTC+02:00 - Damascus

: UTC+02:00 - Damascus 52 : UTC+02:00 - E. Europe

: UTC+02:00 - E. Europe 53 : UTC+02:00 - Harare, Pretoria

: UTC+02:00 - Harare, Pretoria 54 : UTC+02:00 - Helsinki, Kyiv, Riga, Sofia

: UTC+02:00 - Helsinki, Kyiv, Riga, Sofia 55 : UTC+02:00 - Istanbul

: UTC+02:00 - Istanbul 56 : UTC+02:00 - Jerusalem

: UTC+02:00 - Jerusalem 57 : UTC+02:00 - Kalinigrad (RTZ 1)

: UTC+02:00 - Kalinigrad (RTZ 1) 58 : UTC+02:00 - Tripoli

: UTC+02:00 - Tripoli 59 : UTC+02:00 - Baghdad

: UTC+02:00 - Baghdad 60 : UTC+03:00 - Kuwait, Riyadh

: UTC+03:00 - Kuwait, Riyadh 61 : UTC+03:00 - Minsk

: UTC+03:00 - Minsk 62 : UTC+03:00 - Moscow, St. Petersburg

: UTC+03:00 - Moscow, St. Petersburg 63 : UTC+03:00 - Nairobi

: UTC+03:00 - Nairobi 64 : UTC+03:30 - Tehran

: UTC+03:30 - Tehran 65 : UTC+04:00 - Abu Dhabi, Muscat

: UTC+04:00 - Abu Dhabi, Muscat 66 : UTC+04:00 - Baku

: UTC+04:00 - Baku 67 : UTC+04:00 - Izhevsk, Samara (RTZ 3)

: UTC+04:00 - Izhevsk, Samara (RTZ 3) 68 : UTC+04:00 - Port Louis

: UTC+04:00 - Port Louis 69 : UTC+04:00 - Tbilisi

: UTC+04:00 - Tbilisi 70 : UTC+04:00 - Yerevan

: UTC+04:00 - Yerevan 71 : UTC+04:30 - Kabal

: UTC+04:30 - Kabal 72 : UTC+05:00 - Ashgabat, Tashkent

: UTC+05:00 - Ashgabat, Tashkent 73 : UTC+05:00 - Ekaterinburg (RTZ 4)

: UTC+05:00 - Ekaterinburg (RTZ 4) 74 : UTC+05:00 - Islamabad, Karachi

: UTC+05:00 - Islamabad, Karachi 75 : UTC+05:30 - Chennai, Kolkata, Mumbai

: UTC+05:30 - Chennai, Kolkata, Mumbai 76 : UTC+05:30 - Sri Jayawardenepura

: UTC+05:30 - Sri Jayawardenepura 77 : UTC+05:45 - Kathmandu

: UTC+05:45 - Kathmandu 78 : UTC+06:00 - Astana

: UTC+06:00 - Astana 79 : UTC+06:00 - Dhaka

: UTC+06:00 - Dhaka 80 : UTC+06:00 - Novosibirsk (RTZ 5)

: UTC+06:00 - Novosibirsk (RTZ 5) 81 : UTC+06:30 - Yangon (Rangoon)

: UTC+06:30 - Yangon (Rangoon) 82 : UTC+07:00 - Bankok, Hanoi, Jakarta

: UTC+07:00 - Bankok, Hanoi, Jakarta 83 : UTC+07:00 - Kransnoyarsk (RTZ 6)

: UTC+07:00 - Kransnoyarsk (RTZ 6) 84 : UTC+08:00 - Beijing, Chongqing, Hong Kong

: UTC+08:00 - Beijing, Chongqing, Hong Kong 85 : UTC+08:00 - Irkutsk (RTZ 7)

: UTC+08:00 - Irkutsk (RTZ 7) 86 : UTC+08:00 - Kuala Lumpur, Singapore

: UTC+08:00 - Kuala Lumpur, Singapore 87 : UTC+08:00 - Perth

: UTC+08:00 - Perth 88 : UTC+08:00 - Taipei

: UTC+08:00 - Taipei 89 : UTC+08:00 - Ulaanbaatar

: UTC+08:00 - Ulaanbaatar 90 : UTC+09:00 - Osaka, Sapporo, Tokyo

: UTC+09:00 - Osaka, Sapporo, Tokyo 91 : UTC+09:00 - Seoul

: UTC+09:00 - Seoul 92 : UTC+09:00 - Yakutsk (RTZ 8)

: UTC+09:00 - Yakutsk (RTZ 8) 93 : UTC+09:30 - Adelaide

: UTC+09:30 - Adelaide 94 : UTC+09:30 - Darwin

: UTC+09:30 - Darwin 95 : UTC+10:00 - Brisbane

: UTC+10:00 - Brisbane 96 : UTC+10:00 - Canberra, Melbourne, Sydney

: UTC+10:00 - Canberra, Melbourne, Sydney 97 : UTC+10:00 - Guam, Port Moresby

: UTC+10:00 - Guam, Port Moresby 98 : UTC+10:00 - Hobart

: UTC+10:00 - Hobart 99 : UTC+10:00 - Magadan

: UTC+10:00 - Magadan 100 : UTC+10:00 - Vladivostok, Magadan (RTZ 9)

: UTC+10:00 - Vladivostok, Magadan (RTZ 9) 101 : UTC+11:00 - Chokurdakh (RTZ 10)

: UTC+11:00 - Chokurdakh (RTZ 10) 102 : UTC+11:00 - Solomon Is., New Caledonia

: UTC+11:00 - Solomon Is., New Caledonia 103 : UTC+12:00 - Anadyr, Petropavlovsk

: UTC+12:00 - Anadyr, Petropavlovsk 104 : UTC+12:00 - Auckland, Wellington

: UTC+12:00 - Auckland, Wellington 105 : UTC+12:00 - Corrdinated Universal Time

: UTC+12:00 - Corrdinated Universal Time 106 : UTC+12:00 - Fiji

: UTC+12:00 - Fiji 107 : UTC+13:00 - Nuku’alofa

: UTC+13:00 - Nuku’alofa 108 : UTC+13:00 - Samoa

: UTC+13:00 - Samoa 109: UTC+14:00 - Kiritimati Island

The software for this project can be found on my GitHub repository.

Permalink