diff --git a/libsrc/leddevice/CMakeLists.txt b/libsrc/leddevice/CMakeLists.txt
index 4ff82221..a0b1c329 100755
--- a/libsrc/leddevice/CMakeLists.txt
+++ b/libsrc/leddevice/CMakeLists.txt
@@ -35,6 +35,7 @@ SET(Leddevice_HEADERS
${CURRENT_SOURCE_DIR}/LedDeviceSedu.h
${CURRENT_SOURCE_DIR}/LedDeviceFile.h
${CURRENT_SOURCE_DIR}/LedDeviceUdpRaw.h
+ ${CURRENT_SOURCE_DIR}/LedDeviceUdpH801.h
${CURRENT_SOURCE_DIR}/LedDeviceUdpE131.h
${CURRENT_SOURCE_DIR}/ProviderUdp.h
${CURRENT_SOURCE_DIR}/LedDeviceHyperionUsbasp.h
@@ -62,6 +63,7 @@ SET(Leddevice_SOURCES
${CURRENT_SOURCE_DIR}/LedDeviceFile.cpp
${CURRENT_SOURCE_DIR}/LedDeviceFadeCandy.cpp
${CURRENT_SOURCE_DIR}/LedDeviceUdpRaw.cpp
+ ${CURRENT_SOURCE_DIR}/LedDeviceUdpH801.cpp
${CURRENT_SOURCE_DIR}/LedDeviceUdpE131.cpp
${CURRENT_SOURCE_DIR}/ProviderUdp.cpp
${CURRENT_SOURCE_DIR}/LedDeviceHyperionUsbasp.cpp
diff --git a/libsrc/leddevice/LedDeviceFactory.cpp b/libsrc/leddevice/LedDeviceFactory.cpp
index 5a6984e6..586c8b81 100755
--- a/libsrc/leddevice/LedDeviceFactory.cpp
+++ b/libsrc/leddevice/LedDeviceFactory.cpp
@@ -46,6 +46,7 @@
#include "LedDeviceAtmo.h"
#include "LedDeviceAdalightApa102.h"
#include "LedDeviceAtmoOrb.h"
+#include "LedDeviceUdpH801.h"
#ifdef ENABLE_WS2812BPWM
#include "LedDeviceWS2812b.h"
@@ -101,7 +102,8 @@ LedDevice * LedDeviceFactory::construct(const Json::Value & deviceConfig)
#endif
LedDevice::addToDeviceMap("philipshue", LedDevicePhilipsHue::construct);
LedDevice::addToDeviceMap("atmoorb", LedDeviceAtmoOrb::construct);
-
+ LedDevice::addToDeviceMap("h801", LedDeviceUdpH801::construct);
+
// direct usb
LedDevice::addToDeviceMap("hyperion-usbasp", LedDeviceHyperionUsbasp::construct);
LedDevice::addToDeviceMap("rawhid", LedDeviceRawHID::construct);
diff --git a/libsrc/leddevice/LedDeviceSchemas.qrc b/libsrc/leddevice/LedDeviceSchemas.qrc
index e35a8789..ce04eb2d 100644
--- a/libsrc/leddevice/LedDeviceSchemas.qrc
+++ b/libsrc/leddevice/LedDeviceSchemas.qrc
@@ -27,5 +27,6 @@
schemas/schema-ws2801.json
schemas/schema-ws2812spi.json
schemas/schema-ws281x.json
+ schemas/schema-h801.json
diff --git a/libsrc/leddevice/LedDeviceUdpH801.cpp b/libsrc/leddevice/LedDeviceUdpH801.cpp
new file mode 100644
index 00000000..b6c9c2b1
--- /dev/null
+++ b/libsrc/leddevice/LedDeviceUdpH801.cpp
@@ -0,0 +1,67 @@
+// STL includes
+#include
+#include
+#include
+
+#include
+
+// hyperion local includes
+#include "LedDeviceUdpH801.h"
+
+LedDeviceUdpH801::LedDeviceUdpH801(const Json::Value &deviceConfig) : ProviderUdp(deviceConfig)
+{
+ setConfig(deviceConfig);
+}
+
+bool LedDeviceUdpH801::setConfig(const Json::Value &deviceConfig)
+{
+ /* The H801 port is fixed */
+ _port = 30977;
+ /* 10ms seems to be a safe default for the wait time */
+ _LatchTime_ns = deviceConfig.get("latchtime", 10000000).asInt();
+
+ _ids.clear();
+ for (Json::Value::ArrayIndex i = 0; i < deviceConfig["lightIds"].size(); i++) {
+ QString id(deviceConfig["lightIds"][i].asCString());
+ _ids.push_back(id.toInt(nullptr, 16));
+ }
+
+ _message = QByteArray(_prefix_size + _colors + _id_size * _ids.size() + _suffix_size, 0x00);
+ _message[0] = 0xFB;
+ _message[1] = 0xEB;
+
+ for(int i=0; i<_ids.length(); i++){
+ _message[_prefix_size + _colors + i * _id_size + 0] = (_ids[i] >> 0x00) & 0xFF;
+ _message[_prefix_size + _colors + i * _id_size + 1] = (_ids[i] >> 0x08) & 0xFF;
+ _message[_prefix_size + _colors + i * _id_size + 2] = (_ids[i] >> 0x10) & 0xFF;
+ }
+
+ Debug( _log, "H801 using %s:%d", _address.toString().toStdString().c_str() , _port );
+
+ return true;
+}
+
+LedDevice* LedDeviceUdpH801::construct(const Json::Value &deviceConfig)
+{
+ return new LedDeviceUdpH801(deviceConfig);
+}
+
+int LedDeviceUdpH801::write(const std::vector &ledValues)
+{
+ ColorRgb color = ledValues[0];
+ _message[_prefix_size + 0] = color.red;
+ _message[_prefix_size + 1] = color.green;
+ _message[_prefix_size + 2] = color.blue;
+
+ writeBytes(_message.size(), reinterpret_cast(_message.data()));
+}
+
+int LedDeviceUdpH801::switchOff()
+{
+ return write(std::vector(_ledCount, ColorRgb{0,0,0}));
+}
+
+LedDeviceUdpH801::~LedDeviceUdpH801()
+{
+ ProviderUdp::~ProviderUdp();
+}
diff --git a/libsrc/leddevice/LedDeviceUdpH801.h b/libsrc/leddevice/LedDeviceUdpH801.h
new file mode 100644
index 00000000..56ec8fc4
--- /dev/null
+++ b/libsrc/leddevice/LedDeviceUdpH801.h
@@ -0,0 +1,59 @@
+#pragma once
+
+#include
+#include
+#include
+
+// STL includes
+#include
+
+// hyperion includes
+#include "ProviderUdp.h"
+
+///
+/// Implementation of the LedDevice interface for sending led colors via udp.
+///
+class LedDeviceUdpH801 : public ProviderUdp
+{
+protected:
+ QList _ids;
+ QByteArray _message;
+ const int _prefix_size = 2;
+ const int _colors = 5;
+ const int _id_size = 3;
+ const int _suffix_size = 1;
+
+public:
+ ///
+ /// Constructs specific LedDevice
+ ///
+ /// @param deviceConfig json device config
+ ///
+ LedDeviceUdpH801(const Json::Value &deviceConfig);
+
+ ///
+ /// Destructor of the LedDevice; closes the output device if it is open
+ ///
+ virtual ~LedDeviceUdpH801();
+
+ ///
+ /// Sets configuration
+ ///
+ /// @param deviceConfig the json device config
+ /// @return true if success
+ bool setConfig(const Json::Value &deviceConfig);
+
+ /// constructs leddevice
+ static LedDevice* construct(const Json::Value &deviceConfig);
+
+ ///
+ /// Writes the led color values to the led-device
+ ///
+ /// @param ledValues The color-value per led
+ /// @return Zero on succes else negative
+ ///
+ virtual int write(const std::vector &ledValues);
+
+ /// Switch the leds off
+ virtual int switchOff();
+};
diff --git a/libsrc/leddevice/schemas/schema-h801.json b/libsrc/leddevice/schemas/schema-h801.json
new file mode 100644
index 00000000..95c574ee
--- /dev/null
+++ b/libsrc/leddevice/schemas/schema-h801.json
@@ -0,0 +1,27 @@
+{
+ "type":"object",
+ "required":true,
+ "properties":{
+ "host" : {
+ "type": "string",
+ "title":"Target IP",
+ "default": "255.255.255.255",
+ "propertyOrder" : 1
+ },
+ "port" : {
+ "type": "integer",
+ "title":"Port",
+ "default": 30977,
+ "propertyOrder" : 2
+ },
+ "lightIds": {
+ "type": "array",
+ "title":"Light ids",
+ "items" : {
+ "type" : "string"
+ },
+ "propertyOrder" : 3
+ }
+ },
+ "additionalProperties": true
+}