diff --git a/CHANGELOG b/CHANGELOG
index 85fbb859..1dce997b 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,6 +1,77 @@
Changelog
=========
+0.2.4 (2017-03-20)
+------------------
+
+- Add new client tool (#42) [Teemu R]
+
+ * Add new client tool
+
+ After installing the package pyhs100 command-line tool can be used
+ to control the plug.
+
+ See --help for its usage, most of the features for plugs are implemented,
+ some of the shared functionality works for bulbs too.
+
+ * Add discover command
+
+ * Delete old examples, the cli works as an example well enough
+
+- Ignore OSError on socket.shutdown() [Teemu Rytilahti]
+
+ This fixes #22 and obsoletes PR #23.
+- Set color temp to 0 when trying to change color (#36) [pete1450]
+
+ * set color temp to 0 when trying to change color
+
+ * changed tabs to spaces
+
+- Add changelog & add .gitchangelog.rc (#28) [Teemu R]
+
+ This commits adds .gitchangelog.rc for changelog generation.
+ To generate, simply run gitchangelog.
+
+- Discover: Catch socket.timeout and debug log it (#34) [Teemu R]
+
+ Fixes #33
+
+- Add flake8 to tox, disable qa on pyHS100/__init__.py, fix py27
+ compatibility (#31) [Teemu R]
+
+- Add support for TP-Link smartbulbs (#30) [Matthew Garrett]
+
+ * Add support for new-style protocol
+
+ Newer devices (including my LB130) seem to include the request length in
+ the previously empty message header, and ignore requests that lack it. They
+ also don't send an empty packet as the final part of a response, which can
+ lead to hangs. Add support for this, with luck not breaking existing devices
+ in the process.
+
+ * Fix tests
+
+ We now include the request length in the encrypted packet header, so strip
+ the header rather than assuming that it's just zeroes.
+
+ * Create a SmartDevice parent class
+
+ Add a generic SmartDevice class that SmartPlug can inherit from, in
+ preparation for adding support for other device types.
+
+ * Add support for TP-Link smartbulbs
+
+ These bulbs use the same protocol as the smart plugs, but have additional
+ commands for controlling bulb-specific features. In addition, the bulbs
+ have their emeter under a different target and return responses that
+ include the energy unit in the key names.
+
+ * Add tests for bulbs
+
+ Not entirely comprehensive, but has pretty much the same level of testing
+ as plugs
+
+
0.2.3 (2017-01-11)
------------------
diff --git a/HOWTO_RELEASE b/HOWTO_RELEASE
new file mode 100644
index 00000000..6174eb52
--- /dev/null
+++ b/HOWTO_RELEASE
@@ -0,0 +1,22 @@
+# Preparing the changelog
+
+Looks like gitchangelog is not as nice as thought before,
+however, you can generate the changelog by doing this:
+
+$ gitchangelog 0.x.y..HEAD
+
+and manually placing the output to CHANGELOG and fixing
+the newlines between commit messages, and cleaning up the
+unnecessary entries, and finally commiting the file.
+
+After that prepare a pull request containing the changed,
+release-related files (CHANGELOG, setup.py, README, ..).
+
+# After release merge is done
+
+$ git tag -a v0.x.y -m "0.x.y"
+$ git push --tags
+
+# Pushing to pypi
+
+$ python setup.py sdist bdist_wheel upload
diff --git a/README.md b/README.md
index c0e1c9a4..b72a4dd9 100644
--- a/README.md
+++ b/README.md
@@ -1,12 +1,47 @@
# pyHS100
-Python Library to control TPLink Switch (HS100 / HS110)
+
+Python Library to control TPLink smart plugs (HS100, HS105, HS110, HS200) and TPLink smart bulbs (LB1xx).
# Usage
-For all available API functions run ```help(SmartPlug)```
+The package is shipped with a console tool named pyhs100, please refer to ```pyhs100 --help``` for detailed usage.
+Note: The tool does not currently support bulb-specific commands, please feel free to prepare a pull request!
+
+## Discovering devices
+
+```
+$ pyhs100 discover
+
+Discovering devices for 5 seconds
+Found device: {'ip': '192.168.250.186',
+ 'port': 9999,
+ 'sys_info': {'emeter': {'get_realtime': {'current': 0.013309,
+
+```
+
+## Querying the state
+```
+$ pyhs100 --ip 192.168.250.186
+
+== My Smart Plug - HS110(EU) ==
+Device state: OFF
+LED state: False
+Time: 1970-01-01 01:52:35
+On since: 2017-03-19 17:09:16.408657
+Hardware: 1.0
+Software: 1.0.8 Build 151101 Rel.24452
+MAC (rssi): 50:C7:BF:XX:XX:XX (-61)
+Location: {'longitude': XXXX, 'latitude': XXXX}
+== Emeter ==
+Current state: {'power': 0, 'total': 0.001, 'current': 0.013552, 'voltage': 223.394238}
+```
+
+# Library usage
+
+For all available API functions run ```help(SmartPlug)``` or ```help(SmartBulb)```.
```python
-from pyHS100 import SmartPlug
+from pyHS100 import SmartPlug, SmartBulb
from pprint import pformat as pf
plug = SmartPlug("192.168.250.186")
@@ -53,15 +88,3 @@ plug.led = False # turn off led
print("New LED state: %s" % plug.led)
```
-
-# Example
-There is also a simple tool for testing connectivity in examples, to use:
-```python
-python -m examples.cli
-```
-
-# Discovering devices
-```python
-python3 -m examples.discover
-```
-
diff --git a/setup.py b/setup.py
index ff863148..eae50f26 100644
--- a/setup.py
+++ b/setup.py
@@ -1,7 +1,7 @@
from setuptools import setup
setup(name='pyHS100',
- version='0.2.3',
+ version='0.2.4',
description='Interface for TPLink HS100 Smart Plugs.',
url='https://github.com/GadgetReactor/pyHS100',
author='Sean Seah (GadgetReactor)',