diff --git a/assets/webconfig/js/content_leds.js b/assets/webconfig/js/content_leds.js
index b85ace9b..575c76e7 100644
--- a/assets/webconfig/js/content_leds.js
+++ b/assets/webconfig/js/content_leds.js
@@ -474,7 +474,7 @@ $(document).ready(function() {
devRPiPWM = ['ws281x'];
devRPiGPIO = ['piblaster'];
devNET = ['atmoorb', 'fadecandy', 'philipshue', 'tinkerforge', 'tpm2net', 'udpe131', 'udpartnet', 'udph801', 'udpraw'];
- devUSB = ['adalight', 'dmx', 'atmo', 'hyperionusbasp', 'lightpack', 'multilightpack', 'paintpack', 'rawhid', 'sedu', 'tpm2'];
+ devUSB = ['adalight', 'dmx', 'atmo', 'hyperionusbasp', 'lightpack', 'multilightpack', 'paintpack', 'rawhid', 'sedu', 'tpm2', 'karate'];
var optArr = [[]];
optArr[1]=[];
diff --git a/libsrc/leddevice/LedDeviceSchemas.qrc b/libsrc/leddevice/LedDeviceSchemas.qrc
index 896c4463..bd7afbae 100644
--- a/libsrc/leddevice/LedDeviceSchemas.qrc
+++ b/libsrc/leddevice/LedDeviceSchemas.qrc
@@ -30,5 +30,6 @@
schemas/schema-ws2801.json
schemas/schema-ws2812spi.json
schemas/schema-ws281x.json
+ schemas/schema-karate.json
diff --git a/libsrc/leddevice/dev_serial/LedDeviceKarate.cpp b/libsrc/leddevice/dev_serial/LedDeviceKarate.cpp
new file mode 100644
index 00000000..da5ec096
--- /dev/null
+++ b/libsrc/leddevice/dev_serial/LedDeviceKarate.cpp
@@ -0,0 +1,59 @@
+// hyperion local includes
+#include "LedDeviceKarate.h"
+
+LedDeviceKarate::LedDeviceKarate(const QJsonObject &deviceConfig)
+ : ProviderRs232()
+{
+ _deviceReady = init(deviceConfig);
+ connect(this,SIGNAL(receivedData(QByteArray)),this,SLOT(receivedData(QByteArray)));
+}
+
+LedDevice* LedDeviceKarate::construct(const QJsonObject &deviceConfig)
+{
+ return new LedDeviceKarate(deviceConfig);
+}
+
+bool LedDeviceKarate::init(const QJsonObject &deviceConfig)
+{
+ ProviderRs232::init(deviceConfig);
+
+ if (_ledCount != 16)
+ {
+ Error( _log, "%d channels configured. This should always be 16!", _ledCount);
+ return 0;
+ }
+
+ _ledBuffer.resize(4 + _ledCount * 3); // 4-byte header, 3 RGB values
+ _ledBuffer[0] = 0xAA; // Startbyte
+ _ledBuffer[1] = 0x12; // Send all Channels in Batch
+ _ledBuffer[2] = 0x00; // Checksum
+ _ledBuffer[3] = _ledCount * 3; // Number of Databytes send
+
+ Debug( _log, "Karatelight header for %d leds: 0x%02x 0x%02x 0x%02x 0x%02x", _ledCount,
+ _ledBuffer[0], _ledBuffer[1], _ledBuffer[2], _ledBuffer[3] );
+ return true;
+}
+
+int LedDeviceKarate::write(const std::vector &ledValues)
+{
+ for (signed iLed=0; iLed<_ledCount; iLed++)
+ {
+
+ const ColorRgb& rgb = ledValues[iLed];
+ _ledBuffer[iLed*3+4] = rgb.green;
+ _ledBuffer[iLed*3+5] = rgb.blue;
+ _ledBuffer[iLed*3+6] = rgb.red;
+ }
+
+ // Calc Checksum
+ _ledBuffer[2] = _ledBuffer[0] ^ _ledBuffer[1];
+ for (unsigned int i = 3; i < _ledBuffer.size(); i++)
+ _ledBuffer[2] ^= _ledBuffer[i];
+
+ return writeBytes(_ledBuffer.size(), _ledBuffer.data());
+}
+
+void LedDeviceKarate::receivedData(QByteArray data)
+{
+ Debug(_log, ">>received %d bytes data %s", data.size(),data.data());
+}
diff --git a/libsrc/leddevice/dev_serial/LedDeviceKarate.h b/libsrc/leddevice/dev_serial/LedDeviceKarate.h
new file mode 100644
index 00000000..7be619e3
--- /dev/null
+++ b/libsrc/leddevice/dev_serial/LedDeviceKarate.h
@@ -0,0 +1,36 @@
+#pragma once
+
+// hyperion incluse
+#include "ProviderRs232.h"
+
+///
+/// Implementation of the LedDevice interface for writing to serial device using tpm2 protocol.
+///
+class LedDeviceKarate : public ProviderRs232
+{
+ Q_OBJECT
+public:
+ ///
+ /// Constructs specific LedDevice
+ ///
+ /// @param deviceConfig json device config
+ ///
+ LedDeviceKarate(const QJsonObject &deviceConfig);
+
+ /// constructs leddevice
+ static LedDevice* construct(const QJsonObject &deviceConfig);
+
+ virtual bool init(const QJsonObject &deviceConfig);
+
+public slots:
+ void receivedData(QByteArray data);
+
+private:
+ ///
+ /// 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);
+};
diff --git a/libsrc/leddevice/schemas/schema-karate.json b/libsrc/leddevice/schemas/schema-karate.json
new file mode 100644
index 00000000..eff50244
--- /dev/null
+++ b/libsrc/leddevice/schemas/schema-karate.json
@@ -0,0 +1,36 @@
+{
+ "type":"object",
+ "required":true,
+ "properties":{
+ "output": {
+ "type": "string",
+ "title":"edt_dev_spec_outputPath_title",
+ "default":"/dev/ttyACM0",
+ "propertyOrder" : 1
+ },
+ "rate": {
+ "type": "integer",
+ "title":"edt_dev_spec_baudrate_title",
+ "default": 1000000,
+ "propertyOrder" : 2
+ },
+ "delayAfterConnect": {
+ "type": "integer",
+ "title":"edt_dev_spec_delayAfterConnect_title",
+ "default": 1500,
+ "append" : "ms",
+ "propertyOrder" : 3
+ },
+ "latchTime": {
+ "type": "integer",
+ "title":"edt_dev_spec_latchtime_title",
+ "default": 15,
+ "append" : "edt_append_ms",
+ "minimum": 1,
+ "maximum": 1000,
+ "access" : "expert",
+ "propertyOrder" : 4
+ }
+ },
+ "additionalProperties": true
+}