diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index f09ebb0d0ee556a20782f939f8842589180063ba..8c0d36baf3605502a32dcc9f2735ee1513b0bc95 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -6,6 +6,7 @@ test:
 docs:
     image: tk0miya/sphinx-html
     script:
+        - python3 setup.py install --user
         - sphinx-build -b html -d _build/doctrees . _build/html
         - eval $(ssh-agent)
         - echo "$SSHKEY" | ssh-add -
diff --git a/ebpfcat/devices.py b/ebpfcat/devices.py
index 529676b7364618151d11d10e070b51413af90d3c..724004e95dce634ea7f23ad6a438744354165f98 100644
--- a/ebpfcat/devices.py
+++ b/ebpfcat/devices.py
@@ -1,7 +1,20 @@
+"""\
+A collection of devices
+=======================
+
+This modules contains a collection of devices which may be helpful
+in many projects.
+"""
 from .ebpfcat import Device, FastSyncGroup, TerminalVar, DeviceVar
 
 
 class AnalogInput(Device):
+    """Generic analog input device
+
+    This device can be linked to an analog input of a terminal.
+    It will read from there and return the result in its
+    parameter `value`.
+    """
     value = DeviceVar()
     data = TerminalVar()
 
@@ -16,6 +29,11 @@ class AnalogInput(Device):
 
 
 class AnalogOutput(Device):
+    """Generic analog output device
+
+    This device can be linked to an analog output of a terminal.
+    It will write the `value` to that terminal.
+    """
     value = DeviceVar()
     data = TerminalVar()
 
diff --git a/ebpfcat/ethercat.rst b/ebpfcat/ethercat.rst
index c6c78bd110732768d718c3233cff68ce3d3d33fd..1b041195facf3386d7142b58343f1ad24244515f 100644
--- a/ebpfcat/ethercat.rst
+++ b/ebpfcat/ethercat.rst
@@ -92,3 +92,10 @@ The communication with the terminals can happen in three different ways:
 - fast: the data is sent, received and processed using XDP in the Linux
   Kernel. Only very limited operations can be done, but the loop cycle
   frequency exceeds 10 kHz.
+
+
+.. automodule:: ebpfcat.devices
+   :members:
+
+.. automodule:: ebpfcat.ethercat
+   :members: