diff --git a/code/devices/001_generic_custom.json b/code/devices/001_generic_custom.json
new file mode 100644
index 00000000..e18bbb70
--- /dev/null
+++ b/code/devices/001_generic_custom.json
@@ -0,0 +1,4 @@
+{
+ "board": 1,
+ "device": "GENERIC_CUSTOM"
+}
diff --git a/code/devices/002_nodemcu_lolin.json b/code/devices/002_nodemcu_lolin.json
new file mode 100644
index 00000000..89e17c4d
--- /dev/null
+++ b/code/devices/002_nodemcu_lolin.json
@@ -0,0 +1,11 @@
+{
+ "board": 2,
+ "btnGPIO0": 0,
+ "btnMode0": 2,
+ "btnRelay0": 0,
+ "device": "NODEMCU_LOLIN",
+ "ledGPIO0": 2,
+ "ledLogic0": 1,
+ "rlyGPIO0": 12,
+ "rlyType0": 0
+}
\ No newline at end of file
diff --git a/code/devices/003_wemos_d1_mini_relayshield.json b/code/devices/003_wemos_d1_mini_relayshield.json
new file mode 100644
index 00000000..5ebe247e
--- /dev/null
+++ b/code/devices/003_wemos_d1_mini_relayshield.json
@@ -0,0 +1,11 @@
+{
+ "board": 3,
+ "btnGPIO0": 0,
+ "btnMode0": 2,
+ "btnRelay0": 0,
+ "device": "WEMOS_D1_MINI_RELAYSHIELD",
+ "ledGPIO0": 2,
+ "ledLogic0": 1,
+ "rlyGPIO0": 5,
+ "rlyType0": 0
+}
\ No newline at end of file
diff --git a/code/devices/004_itead_sonoff_basic.json b/code/devices/004_itead_sonoff_basic.json
new file mode 100644
index 00000000..44281b5f
--- /dev/null
+++ b/code/devices/004_itead_sonoff_basic.json
@@ -0,0 +1,11 @@
+{
+ "board": 4,
+ "btnGPIO0": 0,
+ "btnMode0": 2,
+ "btnRelay0": 0,
+ "device": "ITEAD_SONOFF_BASIC",
+ "ledGPIO0": 13,
+ "ledLogic0": 1,
+ "rlyGPIO0": 12,
+ "rlyType0": 0
+}
\ No newline at end of file
diff --git a/code/devices/005_itead_sonoff_th.json b/code/devices/005_itead_sonoff_th.json
new file mode 100644
index 00000000..832e649e
--- /dev/null
+++ b/code/devices/005_itead_sonoff_th.json
@@ -0,0 +1,11 @@
+{
+ "board": 5,
+ "btnGPIO0": 0,
+ "btnMode0": 2,
+ "btnRelay0": 0,
+ "device": "ITEAD_SONOFF_TH",
+ "ledGPIO0": 13,
+ "ledLogic0": 1,
+ "rlyGPIO0": 12,
+ "rlyType0": 0
+}
diff --git a/code/devices/006_itead_sonoff_sv.json b/code/devices/006_itead_sonoff_sv.json
new file mode 100644
index 00000000..1407dcc2
--- /dev/null
+++ b/code/devices/006_itead_sonoff_sv.json
@@ -0,0 +1,11 @@
+{
+ "board": 6,
+ "btnGPIO0": 0,
+ "btnMode0": 2,
+ "btnRelay0": 0,
+ "device": "ITEAD_SONOFF_SV",
+ "ledGPIO0": 13,
+ "ledLogic0": 1,
+ "rlyGPIO0": 12,
+ "rlyType0": 0
+}
\ No newline at end of file
diff --git a/code/devices/007_itead_sonoff_touch.json b/code/devices/007_itead_sonoff_touch.json
new file mode 100644
index 00000000..8e586883
--- /dev/null
+++ b/code/devices/007_itead_sonoff_touch.json
@@ -0,0 +1,16 @@
+{
+ "board": 7,
+ "btnClick0": 0,
+ "btnDblClick0": 0,
+ "btnGPIO0": 0,
+ "btnLngClick0": 0,
+ "btnLngLngClick0": 5,
+ "btnMode0": 2,
+ "btnPress0": 1,
+ "btnRelay0": 0,
+ "device": "ITEAD_SONOFF_TOUCH",
+ "ledGPIO0": 13,
+ "ledLogic0": 1,
+ "rlyGPIO0": 12,
+ "rlyType0": 0
+}
\ No newline at end of file
diff --git a/code/devices/008_itead_sonoff_pow.json b/code/devices/008_itead_sonoff_pow.json
new file mode 100644
index 00000000..84ca6a60
--- /dev/null
+++ b/code/devices/008_itead_sonoff_pow.json
@@ -0,0 +1,15 @@
+{
+ "board": 8,
+ "btnGPIO0": 0,
+ "btnMode0": 2,
+ "btnRelay0": 0,
+ "device": "ITEAD_SONOFF_POW",
+ "hlwCF1GPIO": 13,
+ "hlwCFGPIO": 14,
+ "hlwEnabled": 1,
+ "hlwSELGPIO": 5,
+ "ledGPIO0": 15,
+ "ledLogic0": 0,
+ "rlyGPIO0": 12,
+ "rlyType0": 0
+}
\ No newline at end of file
diff --git a/code/devices/009_itead_sonoff_dual.json b/code/devices/009_itead_sonoff_dual.json
new file mode 100644
index 00000000..48312eb7
--- /dev/null
+++ b/code/devices/009_itead_sonoff_dual.json
@@ -0,0 +1,11 @@
+{
+ "board": 9,
+ "btnRelay2": 0,
+ "dbgBaudrate": 19230,
+ "dbgSerial": 0,
+ "device": "ITEAD_SONOFF_DUAL",
+ "ledGPIO0": 13,
+ "ledLogic0": 1,
+ "rlyCount": 2,
+ "rlyProvider": 1
+}
diff --git a/code/devices/010_itead_1ch_inching.json b/code/devices/010_itead_1ch_inching.json
new file mode 100644
index 00000000..bc161c81
--- /dev/null
+++ b/code/devices/010_itead_1ch_inching.json
@@ -0,0 +1,11 @@
+{
+ "board": 10,
+ "btnGPIO0": 0,
+ "btnMode0": 2,
+ "btnRelay0": 0,
+ "device": "ITEAD_1CH_INCHING",
+ "ledGPIO0": 13,
+ "ledLogic0": 1,
+ "rlyGPIO0": 12,
+ "rlyType0": 0
+}
\ No newline at end of file
diff --git a/code/devices/011_itead_sonoff_4ch.json b/code/devices/011_itead_sonoff_4ch.json
new file mode 100644
index 00000000..e8887581
--- /dev/null
+++ b/code/devices/011_itead_sonoff_4ch.json
@@ -0,0 +1,26 @@
+{
+ "board": 11,
+ "btnGPIO0": 0,
+ "btnGPIO1": 9,
+ "btnGPIO2": 10,
+ "btnGPIO3": 14,
+ "btnMode0": 2,
+ "btnMode1": 2,
+ "btnMode2": 2,
+ "btnMode3": 2,
+ "btnRelay0": 0,
+ "btnRelay1": 1,
+ "btnRelay2": 2,
+ "btnRelay3": 3,
+ "device": "ITEAD_SONOFF_4CH",
+ "ledGPIO0": 13,
+ "ledLogic0": 1,
+ "rlyGPIO0": 12,
+ "rlyGPIO1": 5,
+ "rlyGPIO2": 4,
+ "rlyGPIO3": 15,
+ "rlyType0": 0,
+ "rlyType1": 0,
+ "rlyType2": 0,
+ "rlyType3": 0
+}
\ No newline at end of file
diff --git a/code/devices/012_itead_slampher.json b/code/devices/012_itead_slampher.json
new file mode 100644
index 00000000..8b871b4a
--- /dev/null
+++ b/code/devices/012_itead_slampher.json
@@ -0,0 +1,11 @@
+{
+ "board": 12,
+ "btnGPIO0": 0,
+ "btnMode0": 2,
+ "btnRelay0": 0,
+ "device": "ITEAD_SLAMPHER",
+ "ledGPIO0": 13,
+ "ledLogic0": 1,
+ "rlyGPIO0": 12,
+ "rlyType0": 0
+}
\ No newline at end of file
diff --git a/code/devices/013_itead_s20.json b/code/devices/013_itead_s20.json
new file mode 100644
index 00000000..fc69e0d8
--- /dev/null
+++ b/code/devices/013_itead_s20.json
@@ -0,0 +1,11 @@
+{
+ "board": 13,
+ "btnGPIO0": 0,
+ "btnMode0": 2,
+ "btnRelay0": 0,
+ "device": "ITEAD_S20",
+ "ledGPIO0": 13,
+ "ledLogic0": 1,
+ "rlyGPIO0": 12,
+ "rlyType0": 0
+}
\ No newline at end of file
diff --git a/code/devices/014_electrodragon_wifi_iot.json b/code/devices/014_electrodragon_wifi_iot.json
new file mode 100644
index 00000000..4a619630
--- /dev/null
+++ b/code/devices/014_electrodragon_wifi_iot.json
@@ -0,0 +1,16 @@
+{
+ "board": 14,
+ "btnGPIO0": 0,
+ "btnGPIO1": 2,
+ "btnMode0": 2,
+ "btnMode1": 2,
+ "btnRelay0": 0,
+ "btnRelay1": 1,
+ "device": "ELECTRODRAGON_WIFI_IOT",
+ "ledGPIO0": 16,
+ "ledLogic0": 0,
+ "rlyGPIO0": 12,
+ "rlyGPIO1": 13,
+ "rlyType0": 0,
+ "rlyType1": 0
+}
\ No newline at end of file
diff --git a/code/devices/015_workchoice_ecoplug.json b/code/devices/015_workchoice_ecoplug.json
new file mode 100644
index 00000000..dbecc1a4
--- /dev/null
+++ b/code/devices/015_workchoice_ecoplug.json
@@ -0,0 +1,11 @@
+{
+ "board": 15,
+ "btnGPIO0": 13,
+ "btnMode0": 2,
+ "btnRelay0": 0,
+ "device": "WORKCHOICE_ECOPLUG",
+ "ledGPIO0": 2,
+ "ledLogic0": 0,
+ "rlyGPIO0": 15,
+ "rlyType0": 0
+}
\ No newline at end of file
diff --git a/code/devices/016_jangoe_wifi_relay_nc.json b/code/devices/016_jangoe_wifi_relay_nc.json
new file mode 100644
index 00000000..01dfb994
--- /dev/null
+++ b/code/devices/016_jangoe_wifi_relay_nc.json
@@ -0,0 +1,14 @@
+{
+ "board": 16,
+ "btnGPIO0": 12,
+ "btnGPIO1": 13,
+ "btnMode0": 2,
+ "btnMode1": 2,
+ "btnRelay0": 0,
+ "btnRelay1": 1,
+ "device": "JANGOE_WIFI_RELAY_NC",
+ "rlyGPIO0": 2,
+ "rlyGPIO1": 14,
+ "rlyType0": 1,
+ "rlyType1": 1
+}
\ No newline at end of file
diff --git a/code/devices/017_jangoe_wifi_relay_no.json b/code/devices/017_jangoe_wifi_relay_no.json
new file mode 100644
index 00000000..afbaeea0
--- /dev/null
+++ b/code/devices/017_jangoe_wifi_relay_no.json
@@ -0,0 +1,14 @@
+{
+ "board": 17,
+ "btnGPIO0": 12,
+ "btnGPIO1": 13,
+ "btnMode0": 2,
+ "btnMode1": 2,
+ "btnRelay0": 0,
+ "btnRelay1": 1,
+ "device": "JANGOE_WIFI_RELAY_NO",
+ "rlyGPIO0": 2,
+ "rlyGPIO1": 14,
+ "rlyType0": 0,
+ "rlyType1": 0
+}
\ No newline at end of file
diff --git a/code/devices/018_openenergymonitor_mqtt_relay.json b/code/devices/018_openenergymonitor_mqtt_relay.json
new file mode 100644
index 00000000..cdc64841
--- /dev/null
+++ b/code/devices/018_openenergymonitor_mqtt_relay.json
@@ -0,0 +1,11 @@
+{
+ "board": 18,
+ "btnGPIO0": 0,
+ "btnMode0": 2,
+ "btnRelay0": 0,
+ "device": "OPENENERGYMONITOR_MQTT_RELAY",
+ "ledGPIO0": 16,
+ "ledLogic0": 0,
+ "rlyGPIO0": 12,
+ "rlyType0": 0
+}
\ No newline at end of file
diff --git a/code/devices/019_jorgegarcia_wifi_relays.json b/code/devices/019_jorgegarcia_wifi_relays.json
new file mode 100644
index 00000000..69187c11
--- /dev/null
+++ b/code/devices/019_jorgegarcia_wifi_relays.json
@@ -0,0 +1,8 @@
+{
+ "board": 19,
+ "device": "JORGEGARCIA_WIFI_RELAYS",
+ "rlyGPIO0": 0,
+ "rlyGPIO1": 2,
+ "rlyType0": 1,
+ "rlyType1": 1
+}
\ No newline at end of file
diff --git a/code/devices/020_aithinker_ai_light.json b/code/devices/020_aithinker_ai_light.json
new file mode 100644
index 00000000..db7c93d5
--- /dev/null
+++ b/code/devices/020_aithinker_ai_light.json
@@ -0,0 +1,12 @@
+{
+ "board": 20,
+ "device": "AITHINKER_AI_LIGHT",
+ "litProvider": 1,
+ "myChips": 1,
+ "myDCKIGPIO": 15,
+ "myDIGPIO": 13,
+ "myMapping": "0123",
+ "myModel": 0,
+ "rlyCount": 1,
+ "rlyProvider": 2
+}
\ No newline at end of file
diff --git a/code/devices/021_magichome_led_controller.json b/code/devices/021_magichome_led_controller.json
new file mode 100644
index 00000000..9c36cc56
--- /dev/null
+++ b/code/devices/021_magichome_led_controller.json
@@ -0,0 +1,20 @@
+{
+ "board": 21,
+ "device": "MAGICHOME_LED_CONTROLLER",
+ "irEnabled": 1,
+ "irGPIO": 4,
+ "irSet": 1,
+ "ledGPIO0": 2,
+ "ledLogic0": 1,
+ "litChGPIO0": 14,
+ "litChGPIO1": 5,
+ "litChGPIO2": 12,
+ "litChGPIO3": 13,
+ "litChLogic0": 0,
+ "litChLogic1": 0,
+ "litChLogic2": 0,
+ "litChLogic3": 0,
+ "litProvider": 2,
+ "rlyCount": 1,
+ "rlyProvider": 2
+}
\ No newline at end of file
diff --git a/code/devices/022_itead_motor.json b/code/devices/022_itead_motor.json
new file mode 100644
index 00000000..a45539d0
--- /dev/null
+++ b/code/devices/022_itead_motor.json
@@ -0,0 +1,11 @@
+{
+ "board": 22,
+ "btnGPIO0": 0,
+ "btnMode0": 2,
+ "btnRelay0": 0,
+ "device": "ITEAD_MOTOR",
+ "ledGPIO0": 13,
+ "ledLogic0": 1,
+ "rlyGPIO0": 12,
+ "rlyType0": 0
+}
\ No newline at end of file
diff --git a/code/devices/023_tinkerman_espurna_h06.json b/code/devices/023_tinkerman_espurna_h06.json
new file mode 100644
index 00000000..61881e42
--- /dev/null
+++ b/code/devices/023_tinkerman_espurna_h06.json
@@ -0,0 +1,15 @@
+{
+ "board": 23,
+ "btnGPIO0": 4,
+ "btnMode0": 2,
+ "btnRelay0": 0,
+ "device": "TINKERMAN_ESPURNA_H06",
+ "hlwCF1GPIO": 13,
+ "hlwCFGPIO": 14,
+ "hlwEnabled": 1,
+ "hlwSELGPIO": 2,
+ "ledGPIO0": 5,
+ "ledLogic0": 1,
+ "rlyGPIO0": 12,
+ "rlyType0": 1
+}
\ No newline at end of file
diff --git a/code/devices/024_huacanxing_h801.json b/code/devices/024_huacanxing_h801.json
new file mode 100644
index 00000000..e45f04d5
--- /dev/null
+++ b/code/devices/024_huacanxing_h801.json
@@ -0,0 +1,21 @@
+{
+ "board": 24,
+ "dbgPort": 1,
+ "dbgRXEnabled": 1,
+ "device": "HUACANXING_H801",
+ "ledGPIO0": 5,
+ "ledLogic0": 1,
+ "litChGPIO0": 15,
+ "litChGPIO1": 13,
+ "litChGPIO2": 12,
+ "litChGPIO3": 14,
+ "litChGPIO4": 4,
+ "litChLogic0": 0,
+ "litChLogic1": 0,
+ "litChLogic2": 0,
+ "litChLogic3": 0,
+ "litChLogic4": 0,
+ "litProvider": 2,
+ "rlyCount": 1,
+ "rlyProvider": 2
+}
\ No newline at end of file
diff --git a/code/devices/025_itead_bnsz01.json b/code/devices/025_itead_bnsz01.json
new file mode 100644
index 00000000..a05ac41a
--- /dev/null
+++ b/code/devices/025_itead_bnsz01.json
@@ -0,0 +1,11 @@
+{
+ "board": 25,
+ "device": "ITEAD_BNSZ01",
+ "ledGPIO0": 13,
+ "ledLogic0": 1,
+ "litChGPIO0": 12,
+ "litChLogic0": 0,
+ "litProvider": 2,
+ "rlyCount": 1,
+ "rlyProvider": 2
+}
\ No newline at end of file
diff --git a/code/devices/026_itead_sonoff_rfbridge.json b/code/devices/026_itead_sonoff_rfbridge.json
new file mode 100644
index 00000000..4eac878b
--- /dev/null
+++ b/code/devices/026_itead_sonoff_rfbridge.json
@@ -0,0 +1,15 @@
+{
+ "board": 26,
+ "btnGPIO0": 0,
+ "btnMode0": 2,
+ "dbgBaudrate": 19200,
+ "dbgSerial": 0,
+ "device": "ITEAD_SONOFF_RFBRIDGE",
+ "ledGPIO0": 13,
+ "ledLogic0": 1,
+ "rfbDirect": 0,
+ "rfbRXGPIO": 4,
+ "rfbTXGPIO": 5,
+ "rlyCount": 8,
+ "rlyProvider": 3
+}
\ No newline at end of file
diff --git a/code/devices/027_itead_sonoff_4ch_pro.json b/code/devices/027_itead_sonoff_4ch_pro.json
new file mode 100644
index 00000000..ffa2bc97
--- /dev/null
+++ b/code/devices/027_itead_sonoff_4ch_pro.json
@@ -0,0 +1,37 @@
+{
+ "board": 27,
+ "btnClick0": 0,
+ "btnClick1": 0,
+ "btnClick2": 0,
+ "btnClick3": 0,
+ "btnDblClick0": 0,
+ "btnGPIO0": 0,
+ "btnGPIO1": 9,
+ "btnGPIO2": 10,
+ "btnGPIO3": 14,
+ "btnLngClick0": 0,
+ "btnLngLngClick0": 0,
+ "btnMode0": 2,
+ "btnMode1": 2,
+ "btnMode2": 2,
+ "btnMode3": 2,
+ "btnPress0": 1,
+ "btnPress1": 1,
+ "btnPress2": 1,
+ "btnPress3": 1,
+ "btnRelay0": 0,
+ "btnRelay1": 1,
+ "btnRelay2": 2,
+ "btnRelay3": 3,
+ "device": "ITEAD_SONOFF_4CH_PRO",
+ "ledGPIO0": 13,
+ "ledLogic0": 1,
+ "rlyGPIO0": 12,
+ "rlyGPIO1": 5,
+ "rlyGPIO2": 4,
+ "rlyGPIO3": 15,
+ "rlyType0": 0,
+ "rlyType1": 0,
+ "rlyType2": 0,
+ "rlyType3": 0
+}
\ No newline at end of file
diff --git a/code/devices/028_itead_sonoff_b1.json b/code/devices/028_itead_sonoff_b1.json
new file mode 100644
index 00000000..6d3c61fc
--- /dev/null
+++ b/code/devices/028_itead_sonoff_b1.json
@@ -0,0 +1,14 @@
+{
+ "board": 28,
+ "device": "ITEAD_SONOFF_B1",
+ "litChFactor4": 0.1,
+ "litChFactor5": 0.1,
+ "litProvider": 1,
+ "myChips": 2,
+ "myDCKIGPIO": 14,
+ "myDIGPIO": 12,
+ "myMapping": "43501",
+ "myModel": 1,
+ "rlyCount": 1,
+ "rlyProvider": 2
+}
\ No newline at end of file
diff --git a/code/devices/029_itead_sonoff_led.json b/code/devices/029_itead_sonoff_led.json
new file mode 100644
index 00000000..9d6d5392
--- /dev/null
+++ b/code/devices/029_itead_sonoff_led.json
@@ -0,0 +1,13 @@
+{
+ "board": 29,
+ "device": "ITEAD_SONOFF_LED",
+ "ledGPIO0": 13,
+ "ledLogic0": 1,
+ "litChGPIO0": 12,
+ "litChGPIO1": 14,
+ "litChLogic0": 0,
+ "litChLogic1": 0,
+ "litProvider": 2,
+ "rlyCount": 1,
+ "rlyProvider": 2
+}
\ No newline at end of file
diff --git a/code/devices/030_itead_sonoff_t1_1ch.json b/code/devices/030_itead_sonoff_t1_1ch.json
new file mode 100644
index 00000000..3fb50d41
--- /dev/null
+++ b/code/devices/030_itead_sonoff_t1_1ch.json
@@ -0,0 +1,16 @@
+{
+ "board": 30,
+ "btnClick0": 0,
+ "btnDblClick0": 0,
+ "btnGPIO0": 0,
+ "btnLngClick0": 0,
+ "btnLngLngClick0": 5,
+ "btnMode0": 2,
+ "btnPress0": 1,
+ "btnRelay0": 0,
+ "device": "ITEAD_SONOFF_T1_1CH",
+ "ledGPIO0": 13,
+ "ledLogic0": 1,
+ "rlyGPIO0": 12,
+ "rlyType0": 0
+}
\ No newline at end of file
diff --git a/code/devices/031_itead_sonoff_t1_2ch.json b/code/devices/031_itead_sonoff_t1_2ch.json
new file mode 100644
index 00000000..c7406774
--- /dev/null
+++ b/code/devices/031_itead_sonoff_t1_2ch.json
@@ -0,0 +1,26 @@
+{
+ "board": 31,
+ "btnClick0": 0,
+ "btnClick1": 0,
+ "btnDblClick0": 0,
+ "btnDblClick1": 0,
+ "btnGPIO0": 0,
+ "btnGPIO1": 9,
+ "btnLngClick0": 0,
+ "btnLngClick1": 0,
+ "btnLngLngClick0": 5,
+ "btnLngLngClick1": 5,
+ "btnMode0": 2,
+ "btnMode1": 2,
+ "btnPress0": 1,
+ "btnPress1": 1,
+ "btnRelay0": 0,
+ "btnRelay1": 1,
+ "device": "ITEAD_SONOFF_T1_2CH",
+ "ledGPIO0": 13,
+ "ledLogic0": 1,
+ "rlyGPIO0": 12,
+ "rlyGPIO1": 5,
+ "rlyType0": 0,
+ "rlyType1": 0
+}
\ No newline at end of file
diff --git a/code/devices/032_itead_sonoff_t1_3ch.json b/code/devices/032_itead_sonoff_t1_3ch.json
new file mode 100644
index 00000000..a684077f
--- /dev/null
+++ b/code/devices/032_itead_sonoff_t1_3ch.json
@@ -0,0 +1,36 @@
+{
+ "board": 32,
+ "btnClick0": 0,
+ "btnClick1": 0,
+ "btnClick2": 0,
+ "btnDblClick0": 0,
+ "btnDblClick1": 0,
+ "btnDblClick2": 0,
+ "btnGPIO0": 0,
+ "btnGPIO1": 9,
+ "btnGPIO2": 10,
+ "btnLngClick0": 0,
+ "btnLngClick1": 0,
+ "btnLngClick2": 0,
+ "btnLngLngClick0": 5,
+ "btnLngLngClick1": 5,
+ "btnLngLngClick2": 5,
+ "btnMode0": 2,
+ "btnMode1": 2,
+ "btnMode2": 2,
+ "btnPress0": 1,
+ "btnPress1": 1,
+ "btnPress2": 1,
+ "btnRelay0": 0,
+ "btnRelay1": 1,
+ "btnRelay2": 2,
+ "device": "ITEAD_SONOFF_T1_3CH",
+ "ledGPIO0": 13,
+ "ledLogic0": 1,
+ "rlyGPIO0": 12,
+ "rlyGPIO1": 5,
+ "rlyGPIO2": 4,
+ "rlyType0": 0,
+ "rlyType1": 0,
+ "rlyType2": 0
+}
\ No newline at end of file
diff --git a/code/devices/033_itead_sonoff_rf.json b/code/devices/033_itead_sonoff_rf.json
new file mode 100644
index 00000000..d7ce835f
--- /dev/null
+++ b/code/devices/033_itead_sonoff_rf.json
@@ -0,0 +1,11 @@
+{
+ "board": 33,
+ "btnGPIO0": 0,
+ "btnMode0": 2,
+ "btnRelay0": 0,
+ "device": "ITEAD_SONOFF_RF",
+ "ledGPIO0": 13,
+ "ledLogic0": 1,
+ "rlyGPIO0": 12,
+ "rlyType0": 0
+}
\ No newline at end of file
diff --git a/code/devices/034_wion_50055.json b/code/devices/034_wion_50055.json
new file mode 100644
index 00000000..64532572
--- /dev/null
+++ b/code/devices/034_wion_50055.json
@@ -0,0 +1,11 @@
+{
+ "board": 34,
+ "btnGPIO0": 13,
+ "btnMode0": 2,
+ "btnRelay0": 0,
+ "device": "WION_50055",
+ "ledGPIO0": 2,
+ "ledLogic0": 0,
+ "rlyGPIO0": 15,
+ "rlyType0": 0
+}
\ No newline at end of file
diff --git a/code/devices/035_exs_wifi_relay_v31.json b/code/devices/035_exs_wifi_relay_v31.json
new file mode 100644
index 00000000..17134280
--- /dev/null
+++ b/code/devices/035_exs_wifi_relay_v31.json
@@ -0,0 +1,10 @@
+{
+ "board": 35,
+ "btnGPIO0": 0,
+ "btnMode0": 2,
+ "btnRelay0": 0,
+ "device": "EXS_WIFI_RELAY_V31",
+ "rlyGPIO0": 13,
+ "rlyResetGPIO0": 12,
+ "rlyType0": 2
+}
\ No newline at end of file
diff --git a/code/devices/036_huacanxing_h802.json b/code/devices/036_huacanxing_h802.json
new file mode 100644
index 00000000..9599365f
--- /dev/null
+++ b/code/devices/036_huacanxing_h802.json
@@ -0,0 +1,17 @@
+{
+ "board": 36,
+ "dbgPort": 1,
+ "dbgRXEnabled": 1,
+ "device": "HUACANXING_H802",
+ "litChGPIO0": 12,
+ "litChGPIO1": 14,
+ "litChGPIO2": 13,
+ "litChGPIO3": 15,
+ "litChLogic0": 0,
+ "litChLogic1": 0,
+ "litChLogic2": 0,
+ "litChLogic3": 0,
+ "litProvider": 2,
+ "rlyCount": 1,
+ "rlyProvider": 2
+}
\ No newline at end of file
diff --git a/code/devices/037_generic_v9261f.json b/code/devices/037_generic_v9261f.json
new file mode 100644
index 00000000..02b58f31
--- /dev/null
+++ b/code/devices/037_generic_v9261f.json
@@ -0,0 +1,7 @@
+{
+ "board": 37,
+ "device": "GENERIC_V9261F",
+ "v92Enabled": 1,
+ "v92GPIO": 2,
+ "v92Logic": 1
+}
\ No newline at end of file
diff --git a/code/devices/038_generic_ech1560.json b/code/devices/038_generic_ech1560.json
new file mode 100644
index 00000000..a0b4fea1
--- /dev/null
+++ b/code/devices/038_generic_ech1560.json
@@ -0,0 +1,8 @@
+{
+ "board": 38,
+ "device": "GENERIC_ECH1560",
+ "echCLKGPIO": 4,
+ "echEnabled": 1,
+ "echLogic": 1,
+ "echMISOGPIO": 5
+}
\ No newline at end of file
diff --git a/code/devices/039_tinkerman_espurna_h08.json b/code/devices/039_tinkerman_espurna_h08.json
new file mode 100644
index 00000000..ea02c654
--- /dev/null
+++ b/code/devices/039_tinkerman_espurna_h08.json
@@ -0,0 +1,15 @@
+{
+ "board": 39,
+ "btnGPIO0": 4,
+ "btnMode0": 2,
+ "btnRelay0": 0,
+ "device": "TINKERMAN_ESPURNA_H08",
+ "hlwCF1GPIO": 13,
+ "hlwCFGPIO": 14,
+ "hlwEnabled": 1,
+ "hlwSELGPIO": 5,
+ "ledGPIO0": 2,
+ "ledLogic0": 0,
+ "rlyGPIO0": 12,
+ "rlyType0": 0
+}
\ No newline at end of file
diff --git a/code/devices/040_mancavemade_esplive.json b/code/devices/040_mancavemade_esplive.json
new file mode 100644
index 00000000..1e7198ba
--- /dev/null
+++ b/code/devices/040_mancavemade_esplive.json
@@ -0,0 +1,16 @@
+{
+ "board": 40,
+ "btnGPIO0": 4,
+ "btnGPIO1": 5,
+ "btnMode0": 2,
+ "btnMode1": 2,
+ "btnRelay0": 0,
+ "btnRelay1": 1,
+ "device": "MANCAVEMADE_ESPLIVE",
+ "dsEnabled": 1,
+ "dsGPIO0": 2,
+ "rlyGPIO0": 12,
+ "rlyGPIO1": 13,
+ "rlyType0": 0,
+ "rlyType1": 0
+}
\ No newline at end of file
diff --git a/code/devices/041_intermittech_quinled.json b/code/devices/041_intermittech_quinled.json
new file mode 100644
index 00000000..b8a22743
--- /dev/null
+++ b/code/devices/041_intermittech_quinled.json
@@ -0,0 +1,13 @@
+{
+ "board": 41,
+ "device": "INTERMITTECH_QUINLED",
+ "ledGPIO0": 5,
+ "ledLogic0": 1,
+ "litChGPIO0": 0,
+ "litChGPIO1": 2,
+ "litChLogic0": 0,
+ "litChLogic1": 0,
+ "litProvider": 2,
+ "rlyCount": 1,
+ "rlyProvider": 2
+}
\ No newline at end of file
diff --git a/code/devices/042_magichome_led_controller_20.json b/code/devices/042_magichome_led_controller_20.json
new file mode 100644
index 00000000..2aaa14cc
--- /dev/null
+++ b/code/devices/042_magichome_led_controller_20.json
@@ -0,0 +1,20 @@
+{
+ "board": 42,
+ "device": "MAGICHOME_LED_CONTROLLER_20",
+ "irEnabled": 1,
+ "irGPIO": 4,
+ "irSet": 1,
+ "ledGPIO0": 2,
+ "ledLogic0": 1,
+ "litChGPIO0": 5,
+ "litChGPIO1": 12,
+ "litChGPIO2": 13,
+ "litChGPIO3": 15,
+ "litChLogic0": 0,
+ "litChLogic1": 0,
+ "litChLogic2": 0,
+ "litChLogic3": 0,
+ "litProvider": 2,
+ "rlyCount": 1,
+ "rlyProvider": 2
+}
\ No newline at end of file
diff --git a/code/devices/043_arilux_al_lc06.json b/code/devices/043_arilux_al_lc06.json
new file mode 100644
index 00000000..09cdad95
--- /dev/null
+++ b/code/devices/043_arilux_al_lc06.json
@@ -0,0 +1,17 @@
+{
+ "board": 43,
+ "device": "ARILUX_AL_LC06",
+ "litChGPIO0": 14,
+ "litChGPIO1": 12,
+ "litChGPIO2": 13,
+ "litChGPIO3": 15,
+ "litChGPIO4": 5,
+ "litChLogic0": 0,
+ "litChLogic1": 0,
+ "litChLogic2": 0,
+ "litChLogic3": 0,
+ "litChLogic4": 0,
+ "litProvider": 2,
+ "rlyCount": 1,
+ "rlyProvider": 2
+}
\ No newline at end of file
diff --git a/code/devices/044_xenon_sm_pw702u.json b/code/devices/044_xenon_sm_pw702u.json
new file mode 100644
index 00000000..2f5fb4f3
--- /dev/null
+++ b/code/devices/044_xenon_sm_pw702u.json
@@ -0,0 +1,11 @@
+{
+ "board": 44,
+ "btnGPIO0": 13,
+ "btnMode0": 2,
+ "btnRelay0": 0,
+ "device": "XENON_SM_PW702U",
+ "ledGPIO0": 4,
+ "ledLogic0": 1,
+ "rlyGPIO0": 12,
+ "rlyType0": 0
+}
\ No newline at end of file
diff --git a/code/devices/045_authometion_lyt8266.json b/code/devices/045_authometion_lyt8266.json
new file mode 100644
index 00000000..44f07658
--- /dev/null
+++ b/code/devices/045_authometion_lyt8266.json
@@ -0,0 +1,17 @@
+{
+ "board": 45,
+ "device": "AUTHOMETION_LYT8266",
+ "litChGPIO0": 13,
+ "litChGPIO1": 12,
+ "litChGPIO2": 14,
+ "litChGPIO3": 2,
+ "litChLogic0": 0,
+ "litChLogic1": 0,
+ "litChLogic2": 0,
+ "litChLogic3": 0,
+ "litEnableGPIO": 15,
+ "litEnableLogic": 0,
+ "litProvider": 2,
+ "rlyCount": 1,
+ "rlyProvider": 2
+}
\ No newline at end of file
diff --git a/code/devices/046_arilux_e27.json b/code/devices/046_arilux_e27.json
new file mode 100644
index 00000000..158a0910
--- /dev/null
+++ b/code/devices/046_arilux_e27.json
@@ -0,0 +1,12 @@
+{
+ "board": 46,
+ "device": "ARILUX_E27",
+ "litProvider": 1,
+ "myChips": 1,
+ "myDCKIGPIO": 15,
+ "myDIGPIO": 13,
+ "myMapping": "0123",
+ "myModel": 0,
+ "rlyCount": 1,
+ "rlyProvider": 2
+}
\ No newline at end of file
diff --git a/code/devices/047_yjzk_switch_2ch.json b/code/devices/047_yjzk_switch_2ch.json
new file mode 100644
index 00000000..1765fbca
--- /dev/null
+++ b/code/devices/047_yjzk_switch_2ch.json
@@ -0,0 +1,16 @@
+{
+ "board": 47,
+ "btnGPIO0": 0,
+ "btnGPIO1": 9,
+ "btnMode0": 2,
+ "btnMode1": 2,
+ "btnRelay0": 0,
+ "btnRelay1": 1,
+ "device": "YJZK_SWITCH_2CH",
+ "ledGPIO0": 13,
+ "ledLogic0": 0,
+ "rlyGPIO0": 12,
+ "rlyGPIO1": 5,
+ "rlyType0": 0,
+ "rlyType1": 0
+}
\ No newline at end of file
diff --git a/code/devices/048_itead_sonoff_dual_r2.json b/code/devices/048_itead_sonoff_dual_r2.json
new file mode 100644
index 00000000..5724ab77
--- /dev/null
+++ b/code/devices/048_itead_sonoff_dual_r2.json
@@ -0,0 +1,19 @@
+{
+ "board": 48,
+ "btnGPIO0": 0,
+ "btnGPIO1": 9,
+ "btnGPIO2": 10,
+ "btnMode0": 2,
+ "btnMode1": 2,
+ "btnMode2": 2,
+ "btnRelay0": 0,
+ "btnRelay1": 1,
+ "btnRelay2": 0,
+ "device": "ITEAD_SONOFF_DUAL_R2",
+ "ledGPIO0": 13,
+ "ledLogic0": 1,
+ "rlyGPIO0": 12,
+ "rlyGPIO1": 5,
+ "rlyType0": 0,
+ "rlyType1": 0
+}
\ No newline at end of file
diff --git a/code/devices/049_generic_8ch.json b/code/devices/049_generic_8ch.json
new file mode 100644
index 00000000..ae08a6a0
--- /dev/null
+++ b/code/devices/049_generic_8ch.json
@@ -0,0 +1,20 @@
+{
+ "board": 49,
+ "device": "GENERIC_8CH",
+ "rlyGPIO0": 0,
+ "rlyGPIO1": 2,
+ "rlyGPIO2": 4,
+ "rlyGPIO3": 5,
+ "rlyGPIO4": 12,
+ "rlyGPIO5": 13,
+ "rlyGPIO6": 14,
+ "rlyGPIO7": 15,
+ "rlyType0": 0,
+ "rlyType1": 0,
+ "rlyType2": 0,
+ "rlyType3": 0,
+ "rlyType4": 0,
+ "rlyType5": 0,
+ "rlyType6": 0,
+ "rlyType7": 0
+}
\ No newline at end of file
diff --git a/code/devices/050_arilux_al_lc01.json b/code/devices/050_arilux_al_lc01.json
new file mode 100644
index 00000000..c550afab
--- /dev/null
+++ b/code/devices/050_arilux_al_lc01.json
@@ -0,0 +1,13 @@
+{
+ "board": 50,
+ "device": "ARILUX_AL_LC01",
+ "litChGPIO0": 5,
+ "litChGPIO1": 12,
+ "litChGPIO2": 13,
+ "litChLogic0": 0,
+ "litChLogic1": 0,
+ "litChLogic2": 0,
+ "litProvider": 2,
+ "rlyCount": 1,
+ "rlyProvider": 2
+}
\ No newline at end of file
diff --git a/code/devices/051_arilux_al_lc11.json b/code/devices/051_arilux_al_lc11.json
new file mode 100644
index 00000000..fa21361f
--- /dev/null
+++ b/code/devices/051_arilux_al_lc11.json
@@ -0,0 +1,17 @@
+{
+ "board": 51,
+ "device": "ARILUX_AL_LC11",
+ "litChGPIO0": 5,
+ "litChGPIO1": 4,
+ "litChGPIO2": 14,
+ "litChGPIO3": 13,
+ "litChGPIO4": 12,
+ "litChLogic0": 0,
+ "litChLogic1": 0,
+ "litChLogic2": 0,
+ "litChLogic3": 0,
+ "litChLogic4": 0,
+ "litProvider": 2,
+ "rlyCount": 1,
+ "rlyProvider": 2
+}
\ No newline at end of file
diff --git a/code/devices/052_arilux_al_lc02.json b/code/devices/052_arilux_al_lc02.json
new file mode 100644
index 00000000..ea47c31c
--- /dev/null
+++ b/code/devices/052_arilux_al_lc02.json
@@ -0,0 +1,15 @@
+{
+ "board": 52,
+ "device": "ARILUX_AL_LC02",
+ "litChGPIO0": 12,
+ "litChGPIO1": 5,
+ "litChGPIO2": 13,
+ "litChGPIO3": 15,
+ "litChLogic0": 0,
+ "litChLogic1": 0,
+ "litChLogic2": 0,
+ "litChLogic3": 0,
+ "litProvider": 2,
+ "rlyCount": 1,
+ "rlyProvider": 2
+}
\ No newline at end of file
diff --git a/code/devices/053_kmc_70011.json b/code/devices/053_kmc_70011.json
new file mode 100644
index 00000000..f74aa5bf
--- /dev/null
+++ b/code/devices/053_kmc_70011.json
@@ -0,0 +1,16 @@
+{
+ "board": 53,
+ "btnGPIO0": 0,
+ "btnMode0": 2,
+ "btnRelay0": 0,
+ "device": "KMC_70011",
+ "hlwCF1GPIO": 5,
+ "hlwCFGPIO": 4,
+ "hlwEnabled": 1,
+ "hlwSELGPIO": 12,
+ "hlwVolResUp": 2000000,
+ "ledGPIO0": 13,
+ "ledLogic0": 0,
+ "rlyGPIO0": 14,
+ "rlyType0": 0
+}
\ No newline at end of file
diff --git a/code/devices/054_gizwits_witty_cloud.json b/code/devices/054_gizwits_witty_cloud.json
new file mode 100644
index 00000000..9dfe1bba
--- /dev/null
+++ b/code/devices/054_gizwits_witty_cloud.json
@@ -0,0 +1,23 @@
+{
+ "anaEnabled": 1,
+ "board": 54,
+ "btnClick0": 0,
+ "btnDblClick0": 0,
+ "btnGPIO0": 4,
+ "btnLngClick0": 0,
+ "btnLngLngClick0": 5,
+ "btnMode0": 2,
+ "btnPress0": 1,
+ "device": "GIZWITS_WITTY_CLOUD",
+ "ledGPIO0": 2,
+ "ledLogic0": 1,
+ "litChGPIO0": 15,
+ "litChGPIO1": 12,
+ "litChGPIO2": 13,
+ "litChLogic0": 0,
+ "litChLogic1": 0,
+ "litChLogic2": 0,
+ "litProvider": 2,
+ "rlyCount": 1,
+ "rlyProvider": 2
+}
\ No newline at end of file
diff --git a/code/devices/055_euromate_wifi_stecker_schuko.json b/code/devices/055_euromate_wifi_stecker_schuko.json
new file mode 100644
index 00000000..6f95272d
--- /dev/null
+++ b/code/devices/055_euromate_wifi_stecker_schuko.json
@@ -0,0 +1,13 @@
+{
+ "board": 55,
+ "btnGPIO0": 14,
+ "btnMode0": 6,
+ "btnRelay0": 0,
+ "device": "EUROMATE_WIFI_STECKER_SCHUKO",
+ "ledGPIO0": 4,
+ "ledGPIO1": 12,
+ "ledLogic0": 0,
+ "ledLogic1": 0,
+ "rlyGPIO0": 5,
+ "rlyType0": 0
+}
\ No newline at end of file
diff --git a/code/devices/056_tonbux_powerstrip02.json b/code/devices/056_tonbux_powerstrip02.json
new file mode 100644
index 00000000..3654c92d
--- /dev/null
+++ b/code/devices/056_tonbux_powerstrip02.json
@@ -0,0 +1,21 @@
+{
+ "board": 56,
+ "btnGPIO0": 5,
+ "btnMode0": 2,
+ "btnRelay0": 1,
+ "device": "TONBUX_POWERSTRIP02",
+ "ledGPIO0": 0,
+ "ledGPIO1": 3,
+ "ledLogic0": 1,
+ "ledLogic1": 1,
+ "rlyGPIO0": 4,
+ "rlyGPIO1": 13,
+ "rlyGPIO2": 12,
+ "rlyGPIO3": 14,
+ "rlyGPIO4": 16,
+ "rlyType0": 1,
+ "rlyType1": 1,
+ "rlyType2": 1,
+ "rlyType3": 1,
+ "rlyType4": 0
+}
\ No newline at end of file
diff --git a/code/devices/057_lingan_swa1.json b/code/devices/057_lingan_swa1.json
new file mode 100644
index 00000000..9f46b586
--- /dev/null
+++ b/code/devices/057_lingan_swa1.json
@@ -0,0 +1,11 @@
+{
+ "board": 57,
+ "btnGPIO0": 13,
+ "btnMode0": 6,
+ "btnRelay0": 0,
+ "device": "LINGAN_SWA1",
+ "ledGPIO0": 4,
+ "ledLogic0": 1,
+ "rlyGPIO0": 5,
+ "rlyType0": 0
+}
\ No newline at end of file
diff --git a/code/devices/058_heygo_hy02.json b/code/devices/058_heygo_hy02.json
new file mode 100644
index 00000000..9bafea66
--- /dev/null
+++ b/code/devices/058_heygo_hy02.json
@@ -0,0 +1,11 @@
+{
+ "board": 58,
+ "btnGPIO0": 13,
+ "btnMode0": 2,
+ "btnRelay0": 0,
+ "device": "HEYGO_HY02",
+ "ledGPIO0": 4,
+ "ledLogic0": 0,
+ "rlyGPIO0": 12,
+ "rlyType0": 0
+}
\ No newline at end of file
diff --git a/code/devices/059_maxcio_wus002s.json b/code/devices/059_maxcio_wus002s.json
new file mode 100644
index 00000000..db4ddaea
--- /dev/null
+++ b/code/devices/059_maxcio_wus002s.json
@@ -0,0 +1,17 @@
+{
+ "board": 59,
+ "btnGPIO0": 2,
+ "btnMode0": 2,
+ "btnRelay0": 0,
+ "device": "MAXCIO_WUS002S",
+ "hlwCF1GPIO": 5,
+ "hlwCFGPIO": 4,
+ "hlwCurRes": 0.002,
+ "hlwEnabled": 1,
+ "hlwSELGPIO": 12,
+ "hlwVolResUp": 2000000,
+ "ledGPIO0": 3,
+ "ledLogic0": 0,
+ "rlyGPIO0": 13,
+ "rlyType0": 0
+}
\ No newline at end of file
diff --git a/code/devices/060_yidian_xsssa05.json b/code/devices/060_yidian_xsssa05.json
new file mode 100644
index 00000000..6b2dc240
--- /dev/null
+++ b/code/devices/060_yidian_xsssa05.json
@@ -0,0 +1,18 @@
+{
+ "board": 60,
+ "btnGPIO0": 13,
+ "btnMode0": 2,
+ "btnRelay0": 0,
+ "device": "YIDIAN_XSSSA05",
+ "hlwCF1GPIO": 14,
+ "hlwCFGPIO": 5,
+ "hlwEnabled": 1,
+ "hlwSELGPIO": 3,
+ "hlwVolResUp": 2400000,
+ "ledGPIO0": 4,
+ "ledGPIO2": 2,
+ "ledLogic0": 0,
+ "ledLogic2": 0,
+ "rlyGPIO0": 12,
+ "rlyType0": 0
+}
\ No newline at end of file
diff --git a/code/devices/061_tonbux_xsssa06.json b/code/devices/061_tonbux_xsssa06.json
new file mode 100644
index 00000000..261bcf3a
--- /dev/null
+++ b/code/devices/061_tonbux_xsssa06.json
@@ -0,0 +1,11 @@
+{
+ "board": 61,
+ "btnGPIO0": 13,
+ "btnMode0": 2,
+ "btnRelay0": 0,
+ "device": "TONBUX_XSSSA06",
+ "ledGPIO0": 2,
+ "ledLogic0": 0,
+ "rlyGPIO0": 15,
+ "rlyType0": 0
+}
\ No newline at end of file
diff --git a/code/devices/062_green_esp8266relay.json b/code/devices/062_green_esp8266relay.json
new file mode 100644
index 00000000..fbc4c46e
--- /dev/null
+++ b/code/devices/062_green_esp8266relay.json
@@ -0,0 +1,11 @@
+{
+ "board": 62,
+ "btnGPIO0": 5,
+ "btnMode0": 2,
+ "btnRelay0": 0,
+ "device": "GREEN_ESP8266RELAY",
+ "ledGPIO0": 2,
+ "ledLogic0": 1,
+ "rlyGPIO0": 4,
+ "rlyType0": 0
+}
\ No newline at end of file
diff --git a/code/devices/063_ike_espike.json b/code/devices/063_ike_espike.json
new file mode 100644
index 00000000..40991ba5
--- /dev/null
+++ b/code/devices/063_ike_espike.json
@@ -0,0 +1,24 @@
+{
+ "board": 63,
+ "btnDblClick0": 0,
+ "btnGPIO0": 13,
+ "btnGPIO1": 12,
+ "btnGPIO2": 14,
+ "btnLngClick0": 0,
+ "btnLngLngClick0": 0,
+ "btnMode0": 2,
+ "btnMode1": 2,
+ "btnMode2": 2,
+ "btnRelay0": 0,
+ "btnRelay1": 1,
+ "btnRelay2": 2,
+ "device": "IKE_ESPIKE",
+ "ledGPIO0": 2,
+ "ledLogic0": 1,
+ "rlyGPIO0": 4,
+ "rlyGPIO1": 5,
+ "rlyGPIO2": 16,
+ "rlyType0": 0,
+ "rlyType1": 0,
+ "rlyType2": 0
+}
\ No newline at end of file
diff --git a/code/devices/064_arniex_swifitch.json b/code/devices/064_arniex_swifitch.json
new file mode 100644
index 00000000..4955a1bf
--- /dev/null
+++ b/code/devices/064_arniex_swifitch.json
@@ -0,0 +1,16 @@
+{
+ "board": 64,
+ "btnClick0": 1,
+ "btnDblClick0": 0,
+ "btnGPIO0": 4,
+ "btnLngClick0": 0,
+ "btnLngLngClick0": 0,
+ "btnMode0": 6,
+ "btnPress0": 0,
+ "btnRelay0": 1,
+ "device": "ARNIEX_SWIFITCH",
+ "ledGPIO0": 12,
+ "ledLogic0": 1,
+ "rlyGPIO0": 5,
+ "rlyType0": 1
+}
\ No newline at end of file
diff --git a/code/devices/065_generic_esp01s_relay_v40.json b/code/devices/065_generic_esp01s_relay_v40.json
new file mode 100644
index 00000000..c7ad40b4
--- /dev/null
+++ b/code/devices/065_generic_esp01s_relay_v40.json
@@ -0,0 +1,8 @@
+{
+ "board": 65,
+ "device": "GENERIC_ESP01S_RELAY_V40",
+ "ledGPIO0": 2,
+ "ledLogic0": 0,
+ "rlyGPIO0": 0,
+ "rlyType0": 0
+}
\ No newline at end of file
diff --git a/code/devices/066_generic_esp01s_rgbled_v10.json b/code/devices/066_generic_esp01s_rgbled_v10.json
new file mode 100644
index 00000000..107a4ea0
--- /dev/null
+++ b/code/devices/066_generic_esp01s_rgbled_v10.json
@@ -0,0 +1,6 @@
+{
+ "board": 66,
+ "device": "GENERIC_ESP01S_RGBLED_V10",
+ "ledGPIO0": 2,
+ "ledLogic0": 0
+}
\ No newline at end of file
diff --git a/code/devices/067_heltec_touchrelay.json b/code/devices/067_heltec_touchrelay.json
new file mode 100644
index 00000000..bd1c5bc5
--- /dev/null
+++ b/code/devices/067_heltec_touchrelay.json
@@ -0,0 +1,9 @@
+{
+ "board": 67,
+ "btnGPIO0": 14,
+ "btnMode0": 2,
+ "btnRelay0": 1,
+ "device": "HELTEC_TOUCHRELAY",
+ "rlyGPIO0": 12,
+ "rlyType0": 0
+}
\ No newline at end of file
diff --git a/code/devices/068_generic_esp01s_dht11_v10.json b/code/devices/068_generic_esp01s_dht11_v10.json
new file mode 100644
index 00000000..ef9f0e2d
--- /dev/null
+++ b/code/devices/068_generic_esp01s_dht11_v10.json
@@ -0,0 +1,7 @@
+{
+ "board": 68,
+ "device": "GENERIC_ESP01S_DHT11_V10",
+ "dhtEnabled": 1,
+ "dhtGPIO0": 2,
+ "dhtType0": 11
+}
\ No newline at end of file
diff --git a/code/devices/069_generic_esp01s_ds18b20_v10.json b/code/devices/069_generic_esp01s_ds18b20_v10.json
new file mode 100644
index 00000000..a604f059
--- /dev/null
+++ b/code/devices/069_generic_esp01s_ds18b20_v10.json
@@ -0,0 +1,6 @@
+{
+ "board": 69,
+ "device": "GENERIC_ESP01S_DS18B20_V10",
+ "dsEnabled": 1,
+ "dsGPIO0": 2
+}
\ No newline at end of file
diff --git a/code/devices/070_zhilde_eu44_w.json b/code/devices/070_zhilde_eu44_w.json
new file mode 100644
index 00000000..61fa8c7f
--- /dev/null
+++ b/code/devices/070_zhilde_eu44_w.json
@@ -0,0 +1,20 @@
+{
+ "board": 70,
+ "btnGPIO0": 3,
+ "btnMode0": 2,
+ "btnRelay0": 0,
+ "dbgSerial": 0,
+ "device": "ZHILDE_EU44_W",
+ "ledGPIO0": 1,
+ "ledLogic0": 1,
+ "rlyGPIO0": 5,
+ "rlyGPIO1": 4,
+ "rlyGPIO2": 12,
+ "rlyGPIO3": 13,
+ "rlyGPIO4": 14,
+ "rlyType0": 0,
+ "rlyType1": 0,
+ "rlyType2": 0,
+ "rlyType3": 0,
+ "rlyType4": 0
+}
\ No newline at end of file
diff --git a/code/devices/071_itead_sonoff_pow_r2.json b/code/devices/071_itead_sonoff_pow_r2.json
new file mode 100644
index 00000000..3f378634
--- /dev/null
+++ b/code/devices/071_itead_sonoff_pow_r2.json
@@ -0,0 +1,14 @@
+{
+ "board": 71,
+ "btnGPIO0": 0,
+ "btnMode0": 2,
+ "btnRelay0": 0,
+ "cseEnabled": 1,
+ "cseGPIO": 1,
+ "dbgSerial": 0,
+ "device": "ITEAD_SONOFF_POW_R2",
+ "ledGPIO0": 13,
+ "ledLogic0": 1,
+ "rlyGPIO0": 12,
+ "rlyType0": 0
+}
\ No newline at end of file
diff --git a/code/devices/072_luani_hvio.json b/code/devices/072_luani_hvio.json
new file mode 100644
index 00000000..f04c9e98
--- /dev/null
+++ b/code/devices/072_luani_hvio.json
@@ -0,0 +1,17 @@
+{
+ "board": 72,
+ "btnDblClick0": 0,
+ "btnGPIO0": 12,
+ "btnGPIO1": 13,
+ "btnMode0": 2,
+ "btnMode1": 2,
+ "btnRelay0": 0,
+ "btnRelay1": 1,
+ "device": "LUANI_HVIO",
+ "ledGPIO0": 15,
+ "ledLogic0": 0,
+ "rlyGPIO0": 4,
+ "rlyGPIO1": 5,
+ "rlyType0": 0,
+ "rlyType1": 0
+}
\ No newline at end of file
diff --git a/code/devices/073_allnet_4duino_iot_wlan_relais.json b/code/devices/073_allnet_4duino_iot_wlan_relais.json
new file mode 100644
index 00000000..9582eaff
--- /dev/null
+++ b/code/devices/073_allnet_4duino_iot_wlan_relais.json
@@ -0,0 +1,9 @@
+{
+ "board": 73,
+ "device": "ALLNET_4DUINO_IOT_WLAN_RELAIS",
+ "ledGPIO0": 0,
+ "ledLogic0": 1,
+ "rlyGPIO0": 14,
+ "rlyResetGPIO0": 12,
+ "rlyType0": 2
+}
\ No newline at end of file
diff --git a/code/devices/074_tonbux_mosquito_killer.json b/code/devices/074_tonbux_mosquito_killer.json
new file mode 100644
index 00000000..30900ab5
--- /dev/null
+++ b/code/devices/074_tonbux_mosquito_killer.json
@@ -0,0 +1,19 @@
+{
+ "board": 74,
+ "btnGPIO0": 2,
+ "btnMode0": 2,
+ "btnRelay0": 0,
+ "device": "TONBUX_MOSQUITO_KILLER",
+ "ledGPIO0": 15,
+ "ledGPIO1": 14,
+ "ledGPIO2": 12,
+ "ledGPIO3": 16,
+ "ledLogic0": 1,
+ "ledLogic1": 1,
+ "ledLogic2": 0,
+ "ledLogic3": 0,
+ "ledMode1": 8,
+ "ledRelay1": 0,
+ "rlyGPIO0": 5,
+ "rlyType0": 0
+}
\ No newline at end of file
diff --git a/code/devices/075_neo_coolcam_nas_wr01w.json b/code/devices/075_neo_coolcam_nas_wr01w.json
new file mode 100644
index 00000000..aec1fc7a
--- /dev/null
+++ b/code/devices/075_neo_coolcam_nas_wr01w.json
@@ -0,0 +1,11 @@
+{
+ "board": 75,
+ "btnGPIO0": 13,
+ "btnMode0": 2,
+ "btnRelay0": 0,
+ "device": "NEO_COOLCAM_NAS_WR01W",
+ "ledGPIO0": 4,
+ "ledLogic0": 1,
+ "rlyGPIO0": 12,
+ "rlyType0": 0
+}
\ No newline at end of file
diff --git a/code/devices/076_pilotak_esp_din_v1.json b/code/devices/076_pilotak_esp_din_v1.json
new file mode 100644
index 00000000..4a1b3ac7
--- /dev/null
+++ b/code/devices/076_pilotak_esp_din_v1.json
@@ -0,0 +1,23 @@
+{
+ "board": 76,
+ "btnGPIO0": 0,
+ "btnMode0": 2,
+ "btnRelay0": 0,
+ "device": "PILOTAK_ESP_DIN_V1",
+ "digEnabled": 1,
+ "digGPIO0": 16,
+ "digMode0": 0,
+ "dsEnabled": 1,
+ "dsGPIO0": 2,
+ "i2cEnable": 1,
+ "i2cSCLGPIO": 13,
+ "i2cSDAGPIO": 12,
+ "ledGPIO0": 15,
+ "ledLogic0": 0,
+ "rfEnabled": 1,
+ "rfGPIO": 14,
+ "rlyGPIO0": 4,
+ "rlyGPIO1": 5,
+ "rlyType0": 0,
+ "rlyType1": 0
+}
\ No newline at end of file
diff --git a/code/devices/077_estink_wifi_power_strip.json b/code/devices/077_estink_wifi_power_strip.json
new file mode 100644
index 00000000..88851337
--- /dev/null
+++ b/code/devices/077_estink_wifi_power_strip.json
@@ -0,0 +1,31 @@
+{
+ "board": 77,
+ "btnGPIO0": 16,
+ "btnMode0": 2,
+ "btnRelay0": 3,
+ "dbgSerial": 0,
+ "device": "ESTINK_WIFI_POWER_STRIP",
+ "ledGPIO0": 0,
+ "ledGPIO1": 12,
+ "ledGPIO2": 3,
+ "ledGPIO3": 5,
+ "ledLogic0": 1,
+ "ledLogic1": 1,
+ "ledLogic2": 1,
+ "ledLogic3": 1,
+ "ledMode0": 4,
+ "ledMode1": 2,
+ "ledMode2": 2,
+ "ledMode3": 2,
+ "ledRelay1": 1,
+ "ledRelay2": 2,
+ "ledRelay3": 3,
+ "rlyGPIO0": 14,
+ "rlyGPIO1": 13,
+ "rlyGPIO2": 4,
+ "rlyGPIO3": 15,
+ "rlyType0": 0,
+ "rlyType1": 0,
+ "rlyType2": 0,
+ "rlyType3": 0
+}
\ No newline at end of file
diff --git a/code/devices/078_bh_onofre.json b/code/devices/078_bh_onofre.json
new file mode 100644
index 00000000..5600b67f
--- /dev/null
+++ b/code/devices/078_bh_onofre.json
@@ -0,0 +1,14 @@
+{
+ "board": 78,
+ "btnGPIO0": 12,
+ "btnGPIO1": 13,
+ "btnMode0": 6,
+ "btnMode1": 6,
+ "btnRelay0": 0,
+ "btnRelay1": 1,
+ "device": "BH_ONOFRE",
+ "rlyGPIO0": 4,
+ "rlyGPIO1": 5,
+ "rlyType0": 0,
+ "rlyType1": 0
+}
\ No newline at end of file
diff --git a/code/devices/079_blitzwolf_bwshp2.json b/code/devices/079_blitzwolf_bwshp2.json
new file mode 100644
index 00000000..75d02de3
--- /dev/null
+++ b/code/devices/079_blitzwolf_bwshp2.json
@@ -0,0 +1,23 @@
+{
+ "board": 79,
+ "btnGPIO0": 13,
+ "btnMode0": 2,
+ "btnRelay0": 0,
+ "curRatio": 25740,
+ "device": "BLITZWOLF_BWSHP2",
+ "hlwCF1GPIO": 14,
+ "hlwCFGPIO": 5,
+ "hlwCurLevel": 0,
+ "hlwInt": 2,
+ "hlwSELGPIO": 12,
+ "ledGPIO0": 2,
+ "ledGPIO1": 0,
+ "ledLogic0": 1,
+ "ledLogic1": 1,
+ "ledMode1": 4,
+ "ledRelay1": 0,
+ "pwrRatio": 3414290,
+ "rlyGPIO0": 15,
+ "rlyType0": 0,
+ "volRatio": 313400
+}
\ No newline at end of file
diff --git a/code/devices/080_tinkerman_espurna_switch.json b/code/devices/080_tinkerman_espurna_switch.json
new file mode 100644
index 00000000..736a204f
--- /dev/null
+++ b/code/devices/080_tinkerman_espurna_switch.json
@@ -0,0 +1,16 @@
+{
+ "board": 80,
+ "btnClick0": 0,
+ "btnDblClick0": 0,
+ "btnGPIO0": 4,
+ "btnLngClick0": 0,
+ "btnLngLngClick0": 0,
+ "btnMode0": 0,
+ "btnPress0": 1,
+ "btnRelay0": 0,
+ "device": "TINKERMAN_ESPURNA_SWITCH",
+ "ledGPIO0": 2,
+ "ledLogic0": 0,
+ "rlyGPIO0": 12,
+ "rlyType0": 0
+}
\ No newline at end of file
diff --git a/code/devices/081_itead_sonoff_s31.json b/code/devices/081_itead_sonoff_s31.json
new file mode 100644
index 00000000..786af1a9
--- /dev/null
+++ b/code/devices/081_itead_sonoff_s31.json
@@ -0,0 +1,14 @@
+{
+ "board": 81,
+ "btnGPIO0": 0,
+ "btnMode0": 2,
+ "btnRelay0": 0,
+ "cseEnabled": 1,
+ "cseGPIO": 1,
+ "dbgSerial": 0,
+ "device": "ITEAD_SONOFF_S31",
+ "ledGPIO0": 13,
+ "ledLogic0": 1,
+ "rlyGPIO0": 12,
+ "rlyType0": 0
+}
\ No newline at end of file
diff --git a/code/devices/082_stm_relay.json b/code/devices/082_stm_relay.json
new file mode 100644
index 00000000..cb80ef3a
--- /dev/null
+++ b/code/devices/082_stm_relay.json
@@ -0,0 +1,7 @@
+{
+ "board": 82,
+ "dbgSerial": 0,
+ "device": "STM_RELAY",
+ "rlyCount": 2,
+ "rlyProvider": 4
+}
\ No newline at end of file
diff --git a/code/devices/083_vanzavanzu_smart_wifi_plug_mini.json b/code/devices/083_vanzavanzu_smart_wifi_plug_mini.json
new file mode 100644
index 00000000..e5edf291
--- /dev/null
+++ b/code/devices/083_vanzavanzu_smart_wifi_plug_mini.json
@@ -0,0 +1,23 @@
+{
+ "board": 83,
+ "btnGPIO0": 13,
+ "btnMode0": 2,
+ "btnRelay0": 0,
+ "curRatio": 25740,
+ "device": "VANZAVANZU_SMART_WIFI_PLUG_MINI",
+ "hlwCF1GPIO": 14,
+ "hlwCFGPIO": 5,
+ "hlwCurLevel": 0,
+ "hlwInt": 2,
+ "hlwSELGPIO": 3,
+ "ledGPIO0": 2,
+ "ledGPIO1": 0,
+ "ledLogic0": 1,
+ "ledLogic1": 1,
+ "ledMode1": 4,
+ "ledRelay1": 0,
+ "pwrRatio": 3414290,
+ "rlyGPIO0": 15,
+ "rlyType0": 0,
+ "volRatio": 313400
+}
\ No newline at end of file
diff --git a/code/devices/084_generic_geiger_counter.json b/code/devices/084_generic_geiger_counter.json
new file mode 100644
index 00000000..3312a0f2
--- /dev/null
+++ b/code/devices/084_generic_geiger_counter.json
@@ -0,0 +1,5 @@
+{
+ "board": 84,
+ "device": "GENERIC_GEIGER_COUNTER",
+ "geiEnabled": 1
+}
\ No newline at end of file
diff --git a/code/devices/085_tinkerman_rfm69gw.json b/code/devices/085_tinkerman_rfm69gw.json
new file mode 100644
index 00000000..63d7240f
--- /dev/null
+++ b/code/devices/085_tinkerman_rfm69gw.json
@@ -0,0 +1,10 @@
+{
+ "board": 85,
+ "btnGPIO0": 0,
+ "device": "TINKERMAN_RFM69GW",
+ "rfm69CSGPIO": 15,
+ "rfm69Enabled": 1,
+ "rfm69HW": 0,
+ "rfm69IRQGPIO": 5,
+ "rfm69ResetGPIO": 7
+}
\ No newline at end of file
diff --git a/code/espurna/config/devices/001_generic_custom.json.h b/code/espurna/config/devices/001_generic_custom.json.h
new file mode 100644
index 00000000..8db83e63
--- /dev/null
+++ b/code/espurna/config/devices/001_generic_custom.json.h
@@ -0,0 +1,5 @@
+#define device_config_len 37
+const uint8_t device_config[] PROGMEM = {
+0x7b,0x22,0x62,0x6f,0x61,0x72,0x64,0x22,0x3a,0x31,0x2c,0x22,0x64,0x65,0x76,0x69,0x63,0x65,0x22,0x3a,
+0x22,0x47,0x45,0x4e,0x45,0x52,0x49,0x43,0x5f,0x43,0x55,0x53,0x54,0x4f,0x4d,0x22,0x7d
+};
\ No newline at end of file
diff --git a/code/espurna/config/devices/002_nodemcu_lolin.json.h b/code/espurna/config/devices/002_nodemcu_lolin.json.h
new file mode 100644
index 00000000..06ea8dde
--- /dev/null
+++ b/code/espurna/config/devices/002_nodemcu_lolin.json.h
@@ -0,0 +1,10 @@
+#define device_config_len 130
+const uint8_t device_config[] PROGMEM = {
+0x7b,0x22,0x62,0x6f,0x61,0x72,0x64,0x22,0x3a,0x32,0x2c,0x22,0x62,0x74,0x6e,0x47,0x50,0x49,0x4f,0x30,
+0x22,0x3a,0x30,0x2c,0x22,0x62,0x74,0x6e,0x4d,0x6f,0x64,0x65,0x30,0x22,0x3a,0x32,0x2c,0x22,0x62,0x74,
+0x6e,0x52,0x65,0x6c,0x61,0x79,0x30,0x22,0x3a,0x30,0x2c,0x22,0x64,0x65,0x76,0x69,0x63,0x65,0x22,0x3a,
+0x22,0x4e,0x4f,0x44,0x45,0x4d,0x43,0x55,0x5f,0x4c,0x4f,0x4c,0x49,0x4e,0x22,0x2c,0x22,0x6c,0x65,0x64,
+0x47,0x50,0x49,0x4f,0x30,0x22,0x3a,0x32,0x2c,0x22,0x6c,0x65,0x64,0x4c,0x6f,0x67,0x69,0x63,0x30,0x22,
+0x3a,0x31,0x2c,0x22,0x72,0x6c,0x79,0x47,0x50,0x49,0x4f,0x30,0x22,0x3a,0x31,0x32,0x2c,0x22,0x72,0x6c,
+0x79,0x54,0x79,0x70,0x65,0x30,0x22,0x3a,0x30,0x7d
+};
\ No newline at end of file
diff --git a/code/espurna/config/devices/003_wemos_d1_mini_relayshield.json.h b/code/espurna/config/devices/003_wemos_d1_mini_relayshield.json.h
new file mode 100644
index 00000000..f2b4f93c
--- /dev/null
+++ b/code/espurna/config/devices/003_wemos_d1_mini_relayshield.json.h
@@ -0,0 +1,11 @@
+#define device_config_len 141
+const uint8_t device_config[] PROGMEM = {
+0x7b,0x22,0x62,0x6f,0x61,0x72,0x64,0x22,0x3a,0x33,0x2c,0x22,0x62,0x74,0x6e,0x47,0x50,0x49,0x4f,0x30,
+0x22,0x3a,0x30,0x2c,0x22,0x62,0x74,0x6e,0x4d,0x6f,0x64,0x65,0x30,0x22,0x3a,0x32,0x2c,0x22,0x62,0x74,
+0x6e,0x52,0x65,0x6c,0x61,0x79,0x30,0x22,0x3a,0x30,0x2c,0x22,0x64,0x65,0x76,0x69,0x63,0x65,0x22,0x3a,
+0x22,0x57,0x45,0x4d,0x4f,0x53,0x5f,0x44,0x31,0x5f,0x4d,0x49,0x4e,0x49,0x5f,0x52,0x45,0x4c,0x41,0x59,
+0x53,0x48,0x49,0x45,0x4c,0x44,0x22,0x2c,0x22,0x6c,0x65,0x64,0x47,0x50,0x49,0x4f,0x30,0x22,0x3a,0x32,
+0x2c,0x22,0x6c,0x65,0x64,0x4c,0x6f,0x67,0x69,0x63,0x30,0x22,0x3a,0x31,0x2c,0x22,0x72,0x6c,0x79,0x47,
+0x50,0x49,0x4f,0x30,0x22,0x3a,0x35,0x2c,0x22,0x72,0x6c,0x79,0x54,0x79,0x70,0x65,0x30,0x22,0x3a,0x30,
+0x7d
+};
\ No newline at end of file
diff --git a/code/espurna/config/devices/004_itead_sonoff_basic.json.h b/code/espurna/config/devices/004_itead_sonoff_basic.json.h
new file mode 100644
index 00000000..3ba39906
--- /dev/null
+++ b/code/espurna/config/devices/004_itead_sonoff_basic.json.h
@@ -0,0 +1,10 @@
+#define device_config_len 136
+const uint8_t device_config[] PROGMEM = {
+0x7b,0x22,0x62,0x6f,0x61,0x72,0x64,0x22,0x3a,0x34,0x2c,0x22,0x62,0x74,0x6e,0x47,0x50,0x49,0x4f,0x30,
+0x22,0x3a,0x30,0x2c,0x22,0x62,0x74,0x6e,0x4d,0x6f,0x64,0x65,0x30,0x22,0x3a,0x32,0x2c,0x22,0x62,0x74,
+0x6e,0x52,0x65,0x6c,0x61,0x79,0x30,0x22,0x3a,0x30,0x2c,0x22,0x64,0x65,0x76,0x69,0x63,0x65,0x22,0x3a,
+0x22,0x49,0x54,0x45,0x41,0x44,0x5f,0x53,0x4f,0x4e,0x4f,0x46,0x46,0x5f,0x42,0x41,0x53,0x49,0x43,0x22,
+0x2c,0x22,0x6c,0x65,0x64,0x47,0x50,0x49,0x4f,0x30,0x22,0x3a,0x31,0x33,0x2c,0x22,0x6c,0x65,0x64,0x4c,
+0x6f,0x67,0x69,0x63,0x30,0x22,0x3a,0x31,0x2c,0x22,0x72,0x6c,0x79,0x47,0x50,0x49,0x4f,0x30,0x22,0x3a,
+0x31,0x32,0x2c,0x22,0x72,0x6c,0x79,0x54,0x79,0x70,0x65,0x30,0x22,0x3a,0x30,0x7d
+};
\ No newline at end of file
diff --git a/code/espurna/config/devices/005_itead_sonoff_th.json.h b/code/espurna/config/devices/005_itead_sonoff_th.json.h
new file mode 100644
index 00000000..0aedf881
--- /dev/null
+++ b/code/espurna/config/devices/005_itead_sonoff_th.json.h
@@ -0,0 +1,10 @@
+#define device_config_len 133
+const uint8_t device_config[] PROGMEM = {
+0x7b,0x22,0x62,0x6f,0x61,0x72,0x64,0x22,0x3a,0x35,0x2c,0x22,0x62,0x74,0x6e,0x47,0x50,0x49,0x4f,0x30,
+0x22,0x3a,0x30,0x2c,0x22,0x62,0x74,0x6e,0x4d,0x6f,0x64,0x65,0x30,0x22,0x3a,0x32,0x2c,0x22,0x62,0x74,
+0x6e,0x52,0x65,0x6c,0x61,0x79,0x30,0x22,0x3a,0x30,0x2c,0x22,0x64,0x65,0x76,0x69,0x63,0x65,0x22,0x3a,
+0x22,0x49,0x54,0x45,0x41,0x44,0x5f,0x53,0x4f,0x4e,0x4f,0x46,0x46,0x5f,0x54,0x48,0x22,0x2c,0x22,0x6c,
+0x65,0x64,0x47,0x50,0x49,0x4f,0x30,0x22,0x3a,0x31,0x33,0x2c,0x22,0x6c,0x65,0x64,0x4c,0x6f,0x67,0x69,
+0x63,0x30,0x22,0x3a,0x31,0x2c,0x22,0x72,0x6c,0x79,0x47,0x50,0x49,0x4f,0x30,0x22,0x3a,0x31,0x32,0x2c,
+0x22,0x72,0x6c,0x79,0x54,0x79,0x70,0x65,0x30,0x22,0x3a,0x30,0x7d
+};
\ No newline at end of file
diff --git a/code/espurna/config/devices/006_itead_sonoff_sv.json.h b/code/espurna/config/devices/006_itead_sonoff_sv.json.h
new file mode 100644
index 00000000..058feaac
--- /dev/null
+++ b/code/espurna/config/devices/006_itead_sonoff_sv.json.h
@@ -0,0 +1,10 @@
+#define device_config_len 133
+const uint8_t device_config[] PROGMEM = {
+0x7b,0x22,0x62,0x6f,0x61,0x72,0x64,0x22,0x3a,0x36,0x2c,0x22,0x62,0x74,0x6e,0x47,0x50,0x49,0x4f,0x30,
+0x22,0x3a,0x30,0x2c,0x22,0x62,0x74,0x6e,0x4d,0x6f,0x64,0x65,0x30,0x22,0x3a,0x32,0x2c,0x22,0x62,0x74,
+0x6e,0x52,0x65,0x6c,0x61,0x79,0x30,0x22,0x3a,0x30,0x2c,0x22,0x64,0x65,0x76,0x69,0x63,0x65,0x22,0x3a,
+0x22,0x49,0x54,0x45,0x41,0x44,0x5f,0x53,0x4f,0x4e,0x4f,0x46,0x46,0x5f,0x53,0x56,0x22,0x2c,0x22,0x6c,
+0x65,0x64,0x47,0x50,0x49,0x4f,0x30,0x22,0x3a,0x31,0x33,0x2c,0x22,0x6c,0x65,0x64,0x4c,0x6f,0x67,0x69,
+0x63,0x30,0x22,0x3a,0x31,0x2c,0x22,0x72,0x6c,0x79,0x47,0x50,0x49,0x4f,0x30,0x22,0x3a,0x31,0x32,0x2c,
+0x22,0x72,0x6c,0x79,0x54,0x79,0x70,0x65,0x30,0x22,0x3a,0x30,0x7d
+};
\ No newline at end of file
diff --git a/code/espurna/config/devices/007_itead_sonoff_touch.json.h b/code/espurna/config/devices/007_itead_sonoff_touch.json.h
new file mode 100644
index 00000000..0a7e896c
--- /dev/null
+++ b/code/espurna/config/devices/007_itead_sonoff_touch.json.h
@@ -0,0 +1,14 @@
+#define device_config_len 218
+const uint8_t device_config[] PROGMEM = {
+0x7b,0x22,0x62,0x6f,0x61,0x72,0x64,0x22,0x3a,0x37,0x2c,0x22,0x62,0x74,0x6e,0x43,0x6c,0x69,0x63,0x6b,
+0x30,0x22,0x3a,0x30,0x2c,0x22,0x62,0x74,0x6e,0x44,0x62,0x6c,0x43,0x6c,0x69,0x63,0x6b,0x30,0x22,0x3a,
+0x30,0x2c,0x22,0x62,0x74,0x6e,0x47,0x50,0x49,0x4f,0x30,0x22,0x3a,0x30,0x2c,0x22,0x62,0x74,0x6e,0x4c,
+0x6e,0x67,0x43,0x6c,0x69,0x63,0x6b,0x30,0x22,0x3a,0x30,0x2c,0x22,0x62,0x74,0x6e,0x4c,0x6e,0x67,0x4c,
+0x6e,0x67,0x43,0x6c,0x69,0x63,0x6b,0x30,0x22,0x3a,0x35,0x2c,0x22,0x62,0x74,0x6e,0x4d,0x6f,0x64,0x65,
+0x30,0x22,0x3a,0x32,0x2c,0x22,0x62,0x74,0x6e,0x50,0x72,0x65,0x73,0x73,0x30,0x22,0x3a,0x31,0x2c,0x22,
+0x62,0x74,0x6e,0x52,0x65,0x6c,0x61,0x79,0x30,0x22,0x3a,0x30,0x2c,0x22,0x64,0x65,0x76,0x69,0x63,0x65,
+0x22,0x3a,0x22,0x49,0x54,0x45,0x41,0x44,0x5f,0x53,0x4f,0x4e,0x4f,0x46,0x46,0x5f,0x54,0x4f,0x55,0x43,
+0x48,0x22,0x2c,0x22,0x6c,0x65,0x64,0x47,0x50,0x49,0x4f,0x30,0x22,0x3a,0x31,0x33,0x2c,0x22,0x6c,0x65,
+0x64,0x4c,0x6f,0x67,0x69,0x63,0x30,0x22,0x3a,0x31,0x2c,0x22,0x72,0x6c,0x79,0x47,0x50,0x49,0x4f,0x30,
+0x22,0x3a,0x31,0x32,0x2c,0x22,0x72,0x6c,0x79,0x54,0x79,0x70,0x65,0x30,0x22,0x3a,0x30,0x7d
+};
\ No newline at end of file
diff --git a/code/espurna/config/devices/008_itead_sonoff_pow.json.h b/code/espurna/config/devices/008_itead_sonoff_pow.json.h
new file mode 100644
index 00000000..935a3688
--- /dev/null
+++ b/code/espurna/config/devices/008_itead_sonoff_pow.json.h
@@ -0,0 +1,13 @@
+#define device_config_len 195
+const uint8_t device_config[] PROGMEM = {
+0x7b,0x22,0x62,0x6f,0x61,0x72,0x64,0x22,0x3a,0x38,0x2c,0x22,0x62,0x74,0x6e,0x47,0x50,0x49,0x4f,0x30,
+0x22,0x3a,0x30,0x2c,0x22,0x62,0x74,0x6e,0x4d,0x6f,0x64,0x65,0x30,0x22,0x3a,0x32,0x2c,0x22,0x62,0x74,
+0x6e,0x52,0x65,0x6c,0x61,0x79,0x30,0x22,0x3a,0x30,0x2c,0x22,0x64,0x65,0x76,0x69,0x63,0x65,0x22,0x3a,
+0x22,0x49,0x54,0x45,0x41,0x44,0x5f,0x53,0x4f,0x4e,0x4f,0x46,0x46,0x5f,0x50,0x4f,0x57,0x22,0x2c,0x22,
+0x68,0x6c,0x77,0x43,0x46,0x31,0x47,0x50,0x49,0x4f,0x22,0x3a,0x31,0x33,0x2c,0x22,0x68,0x6c,0x77,0x43,
+0x46,0x47,0x50,0x49,0x4f,0x22,0x3a,0x31,0x34,0x2c,0x22,0x68,0x6c,0x77,0x45,0x6e,0x61,0x62,0x6c,0x65,
+0x64,0x22,0x3a,0x31,0x2c,0x22,0x68,0x6c,0x77,0x53,0x45,0x4c,0x47,0x50,0x49,0x4f,0x22,0x3a,0x35,0x2c,
+0x22,0x6c,0x65,0x64,0x47,0x50,0x49,0x4f,0x30,0x22,0x3a,0x31,0x35,0x2c,0x22,0x6c,0x65,0x64,0x4c,0x6f,
+0x67,0x69,0x63,0x30,0x22,0x3a,0x30,0x2c,0x22,0x72,0x6c,0x79,0x47,0x50,0x49,0x4f,0x30,0x22,0x3a,0x31,
+0x32,0x2c,0x22,0x72,0x6c,0x79,0x54,0x79,0x70,0x65,0x30,0x22,0x3a,0x30,0x7d
+};
\ No newline at end of file
diff --git a/code/espurna/config/devices/009_itead_sonoff_dual.json.h b/code/espurna/config/devices/009_itead_sonoff_dual.json.h
new file mode 100644
index 00000000..e46661b6
--- /dev/null
+++ b/code/espurna/config/devices/009_itead_sonoff_dual.json.h
@@ -0,0 +1,11 @@
+#define device_config_len 145
+const uint8_t device_config[] PROGMEM = {
+0x7b,0x22,0x62,0x6f,0x61,0x72,0x64,0x22,0x3a,0x39,0x2c,0x22,0x62,0x74,0x6e,0x52,0x65,0x6c,0x61,0x79,
+0x32,0x22,0x3a,0x30,0x2c,0x22,0x64,0x62,0x67,0x42,0x61,0x75,0x64,0x72,0x61,0x74,0x65,0x22,0x3a,0x31,
+0x39,0x32,0x33,0x30,0x2c,0x22,0x64,0x62,0x67,0x53,0x65,0x72,0x69,0x61,0x6c,0x22,0x3a,0x30,0x2c,0x22,
+0x64,0x65,0x76,0x69,0x63,0x65,0x22,0x3a,0x22,0x49,0x54,0x45,0x41,0x44,0x5f,0x53,0x4f,0x4e,0x4f,0x46,
+0x46,0x5f,0x44,0x55,0x41,0x4c,0x22,0x2c,0x22,0x6c,0x65,0x64,0x47,0x50,0x49,0x4f,0x30,0x22,0x3a,0x31,
+0x33,0x2c,0x22,0x6c,0x65,0x64,0x4c,0x6f,0x67,0x69,0x63,0x30,0x22,0x3a,0x31,0x2c,0x22,0x72,0x6c,0x79,
+0x43,0x6f,0x75,0x6e,0x74,0x22,0x3a,0x32,0x2c,0x22,0x72,0x6c,0x79,0x50,0x72,0x6f,0x76,0x69,0x64,0x65,
+0x72,0x22,0x3a,0x31,0x7d
+};
\ No newline at end of file
diff --git a/code/espurna/config/devices/010_itead_1ch_inching.json.h b/code/espurna/config/devices/010_itead_1ch_inching.json.h
new file mode 100644
index 00000000..be33855e
--- /dev/null
+++ b/code/espurna/config/devices/010_itead_1ch_inching.json.h
@@ -0,0 +1,10 @@
+#define device_config_len 136
+const uint8_t device_config[] PROGMEM = {
+0x7b,0x22,0x62,0x6f,0x61,0x72,0x64,0x22,0x3a,0x31,0x30,0x2c,0x22,0x62,0x74,0x6e,0x47,0x50,0x49,0x4f,
+0x30,0x22,0x3a,0x30,0x2c,0x22,0x62,0x74,0x6e,0x4d,0x6f,0x64,0x65,0x30,0x22,0x3a,0x32,0x2c,0x22,0x62,
+0x74,0x6e,0x52,0x65,0x6c,0x61,0x79,0x30,0x22,0x3a,0x30,0x2c,0x22,0x64,0x65,0x76,0x69,0x63,0x65,0x22,
+0x3a,0x22,0x49,0x54,0x45,0x41,0x44,0x5f,0x31,0x43,0x48,0x5f,0x49,0x4e,0x43,0x48,0x49,0x4e,0x47,0x22,
+0x2c,0x22,0x6c,0x65,0x64,0x47,0x50,0x49,0x4f,0x30,0x22,0x3a,0x31,0x33,0x2c,0x22,0x6c,0x65,0x64,0x4c,
+0x6f,0x67,0x69,0x63,0x30,0x22,0x3a,0x31,0x2c,0x22,0x72,0x6c,0x79,0x47,0x50,0x49,0x4f,0x30,0x22,0x3a,
+0x31,0x32,0x2c,0x22,0x72,0x6c,0x79,0x54,0x79,0x70,0x65,0x30,0x22,0x3a,0x30,0x7d
+};
\ No newline at end of file
diff --git a/code/espurna/config/devices/011_itead_sonoff_4ch.json.h b/code/espurna/config/devices/011_itead_sonoff_4ch.json.h
new file mode 100644
index 00000000..cc952667
--- /dev/null
+++ b/code/espurna/config/devices/011_itead_sonoff_4ch.json.h
@@ -0,0 +1,20 @@
+#define device_config_len 336
+const uint8_t device_config[] PROGMEM = {
+0x7b,0x22,0x62,0x6f,0x61,0x72,0x64,0x22,0x3a,0x31,0x31,0x2c,0x22,0x62,0x74,0x6e,0x47,0x50,0x49,0x4f,
+0x30,0x22,0x3a,0x30,0x2c,0x22,0x62,0x74,0x6e,0x47,0x50,0x49,0x4f,0x31,0x22,0x3a,0x39,0x2c,0x22,0x62,
+0x74,0x6e,0x47,0x50,0x49,0x4f,0x32,0x22,0x3a,0x31,0x30,0x2c,0x22,0x62,0x74,0x6e,0x47,0x50,0x49,0x4f,
+0x33,0x22,0x3a,0x31,0x34,0x2c,0x22,0x62,0x74,0x6e,0x4d,0x6f,0x64,0x65,0x30,0x22,0x3a,0x32,0x2c,0x22,
+0x62,0x74,0x6e,0x4d,0x6f,0x64,0x65,0x31,0x22,0x3a,0x32,0x2c,0x22,0x62,0x74,0x6e,0x4d,0x6f,0x64,0x65,
+0x32,0x22,0x3a,0x32,0x2c,0x22,0x62,0x74,0x6e,0x4d,0x6f,0x64,0x65,0x33,0x22,0x3a,0x32,0x2c,0x22,0x62,
+0x74,0x6e,0x52,0x65,0x6c,0x61,0x79,0x30,0x22,0x3a,0x30,0x2c,0x22,0x62,0x74,0x6e,0x52,0x65,0x6c,0x61,
+0x79,0x31,0x22,0x3a,0x31,0x2c,0x22,0x62,0x74,0x6e,0x52,0x65,0x6c,0x61,0x79,0x32,0x22,0x3a,0x32,0x2c,
+0x22,0x62,0x74,0x6e,0x52,0x65,0x6c,0x61,0x79,0x33,0x22,0x3a,0x33,0x2c,0x22,0x64,0x65,0x76,0x69,0x63,
+0x65,0x22,0x3a,0x22,0x49,0x54,0x45,0x41,0x44,0x5f,0x53,0x4f,0x4e,0x4f,0x46,0x46,0x5f,0x34,0x43,0x48,
+0x22,0x2c,0x22,0x6c,0x65,0x64,0x47,0x50,0x49,0x4f,0x30,0x22,0x3a,0x31,0x33,0x2c,0x22,0x6c,0x65,0x64,
+0x4c,0x6f,0x67,0x69,0x63,0x30,0x22,0x3a,0x31,0x2c,0x22,0x72,0x6c,0x79,0x47,0x50,0x49,0x4f,0x30,0x22,
+0x3a,0x31,0x32,0x2c,0x22,0x72,0x6c,0x79,0x47,0x50,0x49,0x4f,0x31,0x22,0x3a,0x35,0x2c,0x22,0x72,0x6c,
+0x79,0x47,0x50,0x49,0x4f,0x32,0x22,0x3a,0x34,0x2c,0x22,0x72,0x6c,0x79,0x47,0x50,0x49,0x4f,0x33,0x22,
+0x3a,0x31,0x35,0x2c,0x22,0x72,0x6c,0x79,0x54,0x79,0x70,0x65,0x30,0x22,0x3a,0x30,0x2c,0x22,0x72,0x6c,
+0x79,0x54,0x79,0x70,0x65,0x31,0x22,0x3a,0x30,0x2c,0x22,0x72,0x6c,0x79,0x54,0x79,0x70,0x65,0x32,0x22,
+0x3a,0x30,0x2c,0x22,0x72,0x6c,0x79,0x54,0x79,0x70,0x65,0x33,0x22,0x3a,0x30,0x7d
+};
\ No newline at end of file
diff --git a/code/espurna/config/devices/012_itead_slampher.json.h b/code/espurna/config/devices/012_itead_slampher.json.h
new file mode 100644
index 00000000..6ab744f3
--- /dev/null
+++ b/code/espurna/config/devices/012_itead_slampher.json.h
@@ -0,0 +1,10 @@
+#define device_config_len 133
+const uint8_t device_config[] PROGMEM = {
+0x7b,0x22,0x62,0x6f,0x61,0x72,0x64,0x22,0x3a,0x31,0x32,0x2c,0x22,0x62,0x74,0x6e,0x47,0x50,0x49,0x4f,
+0x30,0x22,0x3a,0x30,0x2c,0x22,0x62,0x74,0x6e,0x4d,0x6f,0x64,0x65,0x30,0x22,0x3a,0x32,0x2c,0x22,0x62,
+0x74,0x6e,0x52,0x65,0x6c,0x61,0x79,0x30,0x22,0x3a,0x30,0x2c,0x22,0x64,0x65,0x76,0x69,0x63,0x65,0x22,
+0x3a,0x22,0x49,0x54,0x45,0x41,0x44,0x5f,0x53,0x4c,0x41,0x4d,0x50,0x48,0x45,0x52,0x22,0x2c,0x22,0x6c,
+0x65,0x64,0x47,0x50,0x49,0x4f,0x30,0x22,0x3a,0x31,0x33,0x2c,0x22,0x6c,0x65,0x64,0x4c,0x6f,0x67,0x69,
+0x63,0x30,0x22,0x3a,0x31,0x2c,0x22,0x72,0x6c,0x79,0x47,0x50,0x49,0x4f,0x30,0x22,0x3a,0x31,0x32,0x2c,
+0x22,0x72,0x6c,0x79,0x54,0x79,0x70,0x65,0x30,0x22,0x3a,0x30,0x7d
+};
\ No newline at end of file
diff --git a/code/espurna/config/devices/013_itead_s20.json.h b/code/espurna/config/devices/013_itead_s20.json.h
new file mode 100644
index 00000000..69c43642
--- /dev/null
+++ b/code/espurna/config/devices/013_itead_s20.json.h
@@ -0,0 +1,10 @@
+#define device_config_len 128
+const uint8_t device_config[] PROGMEM = {
+0x7b,0x22,0x62,0x6f,0x61,0x72,0x64,0x22,0x3a,0x31,0x33,0x2c,0x22,0x62,0x74,0x6e,0x47,0x50,0x49,0x4f,
+0x30,0x22,0x3a,0x30,0x2c,0x22,0x62,0x74,0x6e,0x4d,0x6f,0x64,0x65,0x30,0x22,0x3a,0x32,0x2c,0x22,0x62,
+0x74,0x6e,0x52,0x65,0x6c,0x61,0x79,0x30,0x22,0x3a,0x30,0x2c,0x22,0x64,0x65,0x76,0x69,0x63,0x65,0x22,
+0x3a,0x22,0x49,0x54,0x45,0x41,0x44,0x5f,0x53,0x32,0x30,0x22,0x2c,0x22,0x6c,0x65,0x64,0x47,0x50,0x49,
+0x4f,0x30,0x22,0x3a,0x31,0x33,0x2c,0x22,0x6c,0x65,0x64,0x4c,0x6f,0x67,0x69,0x63,0x30,0x22,0x3a,0x31,
+0x2c,0x22,0x72,0x6c,0x79,0x47,0x50,0x49,0x4f,0x30,0x22,0x3a,0x31,0x32,0x2c,0x22,0x72,0x6c,0x79,0x54,
+0x79,0x70,0x65,0x30,0x22,0x3a,0x30,0x7d
+};
\ No newline at end of file
diff --git a/code/espurna/config/devices/014_electrodragon_wifi_iot.json.h b/code/espurna/config/devices/014_electrodragon_wifi_iot.json.h
new file mode 100644
index 00000000..6b06c44e
--- /dev/null
+++ b/code/espurna/config/devices/014_electrodragon_wifi_iot.json.h
@@ -0,0 +1,14 @@
+#define device_config_len 208
+const uint8_t device_config[] PROGMEM = {
+0x7b,0x22,0x62,0x6f,0x61,0x72,0x64,0x22,0x3a,0x31,0x34,0x2c,0x22,0x62,0x74,0x6e,0x47,0x50,0x49,0x4f,
+0x30,0x22,0x3a,0x30,0x2c,0x22,0x62,0x74,0x6e,0x47,0x50,0x49,0x4f,0x31,0x22,0x3a,0x32,0x2c,0x22,0x62,
+0x74,0x6e,0x4d,0x6f,0x64,0x65,0x30,0x22,0x3a,0x32,0x2c,0x22,0x62,0x74,0x6e,0x4d,0x6f,0x64,0x65,0x31,
+0x22,0x3a,0x32,0x2c,0x22,0x62,0x74,0x6e,0x52,0x65,0x6c,0x61,0x79,0x30,0x22,0x3a,0x30,0x2c,0x22,0x62,
+0x74,0x6e,0x52,0x65,0x6c,0x61,0x79,0x31,0x22,0x3a,0x31,0x2c,0x22,0x64,0x65,0x76,0x69,0x63,0x65,0x22,
+0x3a,0x22,0x45,0x4c,0x45,0x43,0x54,0x52,0x4f,0x44,0x52,0x41,0x47,0x4f,0x4e,0x5f,0x57,0x49,0x46,0x49,
+0x5f,0x49,0x4f,0x54,0x22,0x2c,0x22,0x6c,0x65,0x64,0x47,0x50,0x49,0x4f,0x30,0x22,0x3a,0x31,0x36,0x2c,
+0x22,0x6c,0x65,0x64,0x4c,0x6f,0x67,0x69,0x63,0x30,0x22,0x3a,0x30,0x2c,0x22,0x72,0x6c,0x79,0x47,0x50,
+0x49,0x4f,0x30,0x22,0x3a,0x31,0x32,0x2c,0x22,0x72,0x6c,0x79,0x47,0x50,0x49,0x4f,0x31,0x22,0x3a,0x31,
+0x33,0x2c,0x22,0x72,0x6c,0x79,0x54,0x79,0x70,0x65,0x30,0x22,0x3a,0x30,0x2c,0x22,0x72,0x6c,0x79,0x54,
+0x79,0x70,0x65,0x31,0x22,0x3a,0x30,0x7d
+};
\ No newline at end of file
diff --git a/code/espurna/config/devices/015_workchoice_ecoplug.json.h b/code/espurna/config/devices/015_workchoice_ecoplug.json.h
new file mode 100644
index 00000000..aacabb80
--- /dev/null
+++ b/code/espurna/config/devices/015_workchoice_ecoplug.json.h
@@ -0,0 +1,10 @@
+#define device_config_len 137
+const uint8_t device_config[] PROGMEM = {
+0x7b,0x22,0x62,0x6f,0x61,0x72,0x64,0x22,0x3a,0x31,0x35,0x2c,0x22,0x62,0x74,0x6e,0x47,0x50,0x49,0x4f,
+0x30,0x22,0x3a,0x31,0x33,0x2c,0x22,0x62,0x74,0x6e,0x4d,0x6f,0x64,0x65,0x30,0x22,0x3a,0x32,0x2c,0x22,
+0x62,0x74,0x6e,0x52,0x65,0x6c,0x61,0x79,0x30,0x22,0x3a,0x30,0x2c,0x22,0x64,0x65,0x76,0x69,0x63,0x65,
+0x22,0x3a,0x22,0x57,0x4f,0x52,0x4b,0x43,0x48,0x4f,0x49,0x43,0x45,0x5f,0x45,0x43,0x4f,0x50,0x4c,0x55,
+0x47,0x22,0x2c,0x22,0x6c,0x65,0x64,0x47,0x50,0x49,0x4f,0x30,0x22,0x3a,0x32,0x2c,0x22,0x6c,0x65,0x64,
+0x4c,0x6f,0x67,0x69,0x63,0x30,0x22,0x3a,0x30,0x2c,0x22,0x72,0x6c,0x79,0x47,0x50,0x49,0x4f,0x30,0x22,
+0x3a,0x31,0x35,0x2c,0x22,0x72,0x6c,0x79,0x54,0x79,0x70,0x65,0x30,0x22,0x3a,0x30,0x7d
+};
\ No newline at end of file
diff --git a/code/espurna/config/devices/016_jangoe_wifi_relay_nc.json.h b/code/espurna/config/devices/016_jangoe_wifi_relay_nc.json.h
new file mode 100644
index 00000000..8892729d
--- /dev/null
+++ b/code/espurna/config/devices/016_jangoe_wifi_relay_nc.json.h
@@ -0,0 +1,12 @@
+#define device_config_len 179
+const uint8_t device_config[] PROGMEM = {
+0x7b,0x22,0x62,0x6f,0x61,0x72,0x64,0x22,0x3a,0x31,0x36,0x2c,0x22,0x62,0x74,0x6e,0x47,0x50,0x49,0x4f,
+0x30,0x22,0x3a,0x31,0x32,0x2c,0x22,0x62,0x74,0x6e,0x47,0x50,0x49,0x4f,0x31,0x22,0x3a,0x31,0x33,0x2c,
+0x22,0x62,0x74,0x6e,0x4d,0x6f,0x64,0x65,0x30,0x22,0x3a,0x32,0x2c,0x22,0x62,0x74,0x6e,0x4d,0x6f,0x64,
+0x65,0x31,0x22,0x3a,0x32,0x2c,0x22,0x62,0x74,0x6e,0x52,0x65,0x6c,0x61,0x79,0x30,0x22,0x3a,0x30,0x2c,
+0x22,0x62,0x74,0x6e,0x52,0x65,0x6c,0x61,0x79,0x31,0x22,0x3a,0x31,0x2c,0x22,0x64,0x65,0x76,0x69,0x63,
+0x65,0x22,0x3a,0x22,0x4a,0x41,0x4e,0x47,0x4f,0x45,0x5f,0x57,0x49,0x46,0x49,0x5f,0x52,0x45,0x4c,0x41,
+0x59,0x5f,0x4e,0x43,0x22,0x2c,0x22,0x72,0x6c,0x79,0x47,0x50,0x49,0x4f,0x30,0x22,0x3a,0x32,0x2c,0x22,
+0x72,0x6c,0x79,0x47,0x50,0x49,0x4f,0x31,0x22,0x3a,0x31,0x34,0x2c,0x22,0x72,0x6c,0x79,0x54,0x79,0x70,
+0x65,0x30,0x22,0x3a,0x31,0x2c,0x22,0x72,0x6c,0x79,0x54,0x79,0x70,0x65,0x31,0x22,0x3a,0x31,0x7d
+};
\ No newline at end of file
diff --git a/code/espurna/config/devices/017_jangoe_wifi_relay_no.json.h b/code/espurna/config/devices/017_jangoe_wifi_relay_no.json.h
new file mode 100644
index 00000000..951ff292
--- /dev/null
+++ b/code/espurna/config/devices/017_jangoe_wifi_relay_no.json.h
@@ -0,0 +1,12 @@
+#define device_config_len 179
+const uint8_t device_config[] PROGMEM = {
+0x7b,0x22,0x62,0x6f,0x61,0x72,0x64,0x22,0x3a,0x31,0x37,0x2c,0x22,0x62,0x74,0x6e,0x47,0x50,0x49,0x4f,
+0x30,0x22,0x3a,0x31,0x32,0x2c,0x22,0x62,0x74,0x6e,0x47,0x50,0x49,0x4f,0x31,0x22,0x3a,0x31,0x33,0x2c,
+0x22,0x62,0x74,0x6e,0x4d,0x6f,0x64,0x65,0x30,0x22,0x3a,0x32,0x2c,0x22,0x62,0x74,0x6e,0x4d,0x6f,0x64,
+0x65,0x31,0x22,0x3a,0x32,0x2c,0x22,0x62,0x74,0x6e,0x52,0x65,0x6c,0x61,0x79,0x30,0x22,0x3a,0x30,0x2c,
+0x22,0x62,0x74,0x6e,0x52,0x65,0x6c,0x61,0x79,0x31,0x22,0x3a,0x31,0x2c,0x22,0x64,0x65,0x76,0x69,0x63,
+0x65,0x22,0x3a,0x22,0x4a,0x41,0x4e,0x47,0x4f,0x45,0x5f,0x57,0x49,0x46,0x49,0x5f,0x52,0x45,0x4c,0x41,
+0x59,0x5f,0x4e,0x4f,0x22,0x2c,0x22,0x72,0x6c,0x79,0x47,0x50,0x49,0x4f,0x30,0x22,0x3a,0x32,0x2c,0x22,
+0x72,0x6c,0x79,0x47,0x50,0x49,0x4f,0x31,0x22,0x3a,0x31,0x34,0x2c,0x22,0x72,0x6c,0x79,0x54,0x79,0x70,
+0x65,0x30,0x22,0x3a,0x30,0x2c,0x22,0x72,0x6c,0x79,0x54,0x79,0x70,0x65,0x31,0x22,0x3a,0x30,0x7d
+};
\ No newline at end of file
diff --git a/code/espurna/config/devices/018_openenergymonitor_mqtt_relay.json.h b/code/espurna/config/devices/018_openenergymonitor_mqtt_relay.json.h
new file mode 100644
index 00000000..8894e712
--- /dev/null
+++ b/code/espurna/config/devices/018_openenergymonitor_mqtt_relay.json.h
@@ -0,0 +1,11 @@
+#define device_config_len 147
+const uint8_t device_config[] PROGMEM = {
+0x7b,0x22,0x62,0x6f,0x61,0x72,0x64,0x22,0x3a,0x31,0x38,0x2c,0x22,0x62,0x74,0x6e,0x47,0x50,0x49,0x4f,
+0x30,0x22,0x3a,0x30,0x2c,0x22,0x62,0x74,0x6e,0x4d,0x6f,0x64,0x65,0x30,0x22,0x3a,0x32,0x2c,0x22,0x62,
+0x74,0x6e,0x52,0x65,0x6c,0x61,0x79,0x30,0x22,0x3a,0x30,0x2c,0x22,0x64,0x65,0x76,0x69,0x63,0x65,0x22,
+0x3a,0x22,0x4f,0x50,0x45,0x4e,0x45,0x4e,0x45,0x52,0x47,0x59,0x4d,0x4f,0x4e,0x49,0x54,0x4f,0x52,0x5f,
+0x4d,0x51,0x54,0x54,0x5f,0x52,0x45,0x4c,0x41,0x59,0x22,0x2c,0x22,0x6c,0x65,0x64,0x47,0x50,0x49,0x4f,
+0x30,0x22,0x3a,0x31,0x36,0x2c,0x22,0x6c,0x65,0x64,0x4c,0x6f,0x67,0x69,0x63,0x30,0x22,0x3a,0x30,0x2c,
+0x22,0x72,0x6c,0x79,0x47,0x50,0x49,0x4f,0x30,0x22,0x3a,0x31,0x32,0x2c,0x22,0x72,0x6c,0x79,0x54,0x79,
+0x70,0x65,0x30,0x22,0x3a,0x30,0x7d
+};
\ No newline at end of file
diff --git a/code/espurna/config/devices/019_jorgegarcia_wifi_relays.json.h b/code/espurna/config/devices/019_jorgegarcia_wifi_relays.json.h
new file mode 100644
index 00000000..72a05c29
--- /dev/null
+++ b/code/espurna/config/devices/019_jorgegarcia_wifi_relays.json.h
@@ -0,0 +1,8 @@
+#define device_config_len 99
+const uint8_t device_config[] PROGMEM = {
+0x7b,0x22,0x62,0x6f,0x61,0x72,0x64,0x22,0x3a,0x31,0x39,0x2c,0x22,0x64,0x65,0x76,0x69,0x63,0x65,0x22,
+0x3a,0x22,0x4a,0x4f,0x52,0x47,0x45,0x47,0x41,0x52,0x43,0x49,0x41,0x5f,0x57,0x49,0x46,0x49,0x5f,0x52,
+0x45,0x4c,0x41,0x59,0x53,0x22,0x2c,0x22,0x72,0x6c,0x79,0x47,0x50,0x49,0x4f,0x30,0x22,0x3a,0x30,0x2c,
+0x22,0x72,0x6c,0x79,0x47,0x50,0x49,0x4f,0x31,0x22,0x3a,0x32,0x2c,0x22,0x72,0x6c,0x79,0x54,0x79,0x70,
+0x65,0x30,0x22,0x3a,0x31,0x2c,0x22,0x72,0x6c,0x79,0x54,0x79,0x70,0x65,0x31,0x22,0x3a,0x31,0x7d
+};
\ No newline at end of file
diff --git a/code/espurna/config/devices/020_aithinker_ai_light.json.h b/code/espurna/config/devices/020_aithinker_ai_light.json.h
new file mode 100644
index 00000000..f9be8b78
--- /dev/null
+++ b/code/espurna/config/devices/020_aithinker_ai_light.json.h
@@ -0,0 +1,11 @@
+#define device_config_len 160
+const uint8_t device_config[] PROGMEM = {
+0x7b,0x22,0x62,0x6f,0x61,0x72,0x64,0x22,0x3a,0x32,0x30,0x2c,0x22,0x64,0x65,0x76,0x69,0x63,0x65,0x22,
+0x3a,0x22,0x41,0x49,0x54,0x48,0x49,0x4e,0x4b,0x45,0x52,0x5f,0x41,0x49,0x5f,0x4c,0x49,0x47,0x48,0x54,
+0x22,0x2c,0x22,0x6c,0x69,0x74,0x50,0x72,0x6f,0x76,0x69,0x64,0x65,0x72,0x22,0x3a,0x31,0x2c,0x22,0x6d,
+0x79,0x43,0x68,0x69,0x70,0x73,0x22,0x3a,0x31,0x2c,0x22,0x6d,0x79,0x44,0x43,0x4b,0x49,0x47,0x50,0x49,
+0x4f,0x22,0x3a,0x31,0x35,0x2c,0x22,0x6d,0x79,0x44,0x49,0x47,0x50,0x49,0x4f,0x22,0x3a,0x31,0x33,0x2c,
+0x22,0x6d,0x79,0x4d,0x61,0x70,0x70,0x69,0x6e,0x67,0x22,0x3a,0x22,0x30,0x31,0x32,0x33,0x22,0x2c,0x22,
+0x6d,0x79,0x4d,0x6f,0x64,0x65,0x6c,0x22,0x3a,0x30,0x2c,0x22,0x72,0x6c,0x79,0x43,0x6f,0x75,0x6e,0x74,
+0x22,0x3a,0x31,0x2c,0x22,0x72,0x6c,0x79,0x50,0x72,0x6f,0x76,0x69,0x64,0x65,0x72,0x22,0x3a,0x32,0x7d
+};
\ No newline at end of file
diff --git a/code/espurna/config/devices/021_magichome_led_controller.json.h b/code/espurna/config/devices/021_magichome_led_controller.json.h
new file mode 100644
index 00000000..3b601baa
--- /dev/null
+++ b/code/espurna/config/devices/021_magichome_led_controller.json.h
@@ -0,0 +1,18 @@
+#define device_config_len 282
+const uint8_t device_config[] PROGMEM = {
+0x7b,0x22,0x62,0x6f,0x61,0x72,0x64,0x22,0x3a,0x32,0x31,0x2c,0x22,0x64,0x65,0x76,0x69,0x63,0x65,0x22,
+0x3a,0x22,0x4d,0x41,0x47,0x49,0x43,0x48,0x4f,0x4d,0x45,0x5f,0x4c,0x45,0x44,0x5f,0x43,0x4f,0x4e,0x54,
+0x52,0x4f,0x4c,0x4c,0x45,0x52,0x22,0x2c,0x22,0x69,0x72,0x45,0x6e,0x61,0x62,0x6c,0x65,0x64,0x22,0x3a,
+0x31,0x2c,0x22,0x69,0x72,0x47,0x50,0x49,0x4f,0x22,0x3a,0x34,0x2c,0x22,0x69,0x72,0x53,0x65,0x74,0x22,
+0x3a,0x31,0x2c,0x22,0x6c,0x65,0x64,0x47,0x50,0x49,0x4f,0x30,0x22,0x3a,0x32,0x2c,0x22,0x6c,0x65,0x64,
+0x4c,0x6f,0x67,0x69,0x63,0x30,0x22,0x3a,0x31,0x2c,0x22,0x6c,0x69,0x74,0x43,0x68,0x47,0x50,0x49,0x4f,
+0x30,0x22,0x3a,0x31,0x34,0x2c,0x22,0x6c,0x69,0x74,0x43,0x68,0x47,0x50,0x49,0x4f,0x31,0x22,0x3a,0x35,
+0x2c,0x22,0x6c,0x69,0x74,0x43,0x68,0x47,0x50,0x49,0x4f,0x32,0x22,0x3a,0x31,0x32,0x2c,0x22,0x6c,0x69,
+0x74,0x43,0x68,0x47,0x50,0x49,0x4f,0x33,0x22,0x3a,0x31,0x33,0x2c,0x22,0x6c,0x69,0x74,0x43,0x68,0x4c,
+0x6f,0x67,0x69,0x63,0x30,0x22,0x3a,0x30,0x2c,0x22,0x6c,0x69,0x74,0x43,0x68,0x4c,0x6f,0x67,0x69,0x63,
+0x31,0x22,0x3a,0x30,0x2c,0x22,0x6c,0x69,0x74,0x43,0x68,0x4c,0x6f,0x67,0x69,0x63,0x32,0x22,0x3a,0x30,
+0x2c,0x22,0x6c,0x69,0x74,0x43,0x68,0x4c,0x6f,0x67,0x69,0x63,0x33,0x22,0x3a,0x30,0x2c,0x22,0x6c,0x69,
+0x74,0x50,0x72,0x6f,0x76,0x69,0x64,0x65,0x72,0x22,0x3a,0x32,0x2c,0x22,0x72,0x6c,0x79,0x43,0x6f,0x75,
+0x6e,0x74,0x22,0x3a,0x31,0x2c,0x22,0x72,0x6c,0x79,0x50,0x72,0x6f,0x76,0x69,0x64,0x65,0x72,0x22,0x3a,
+0x32,0x7d
+};
\ No newline at end of file
diff --git a/code/espurna/config/devices/022_itead_motor.json.h b/code/espurna/config/devices/022_itead_motor.json.h
new file mode 100644
index 00000000..ea8461c2
--- /dev/null
+++ b/code/espurna/config/devices/022_itead_motor.json.h
@@ -0,0 +1,10 @@
+#define device_config_len 130
+const uint8_t device_config[] PROGMEM = {
+0x7b,0x22,0x62,0x6f,0x61,0x72,0x64,0x22,0x3a,0x32,0x32,0x2c,0x22,0x62,0x74,0x6e,0x47,0x50,0x49,0x4f,
+0x30,0x22,0x3a,0x30,0x2c,0x22,0x62,0x74,0x6e,0x4d,0x6f,0x64,0x65,0x30,0x22,0x3a,0x32,0x2c,0x22,0x62,
+0x74,0x6e,0x52,0x65,0x6c,0x61,0x79,0x30,0x22,0x3a,0x30,0x2c,0x22,0x64,0x65,0x76,0x69,0x63,0x65,0x22,
+0x3a,0x22,0x49,0x54,0x45,0x41,0x44,0x5f,0x4d,0x4f,0x54,0x4f,0x52,0x22,0x2c,0x22,0x6c,0x65,0x64,0x47,
+0x50,0x49,0x4f,0x30,0x22,0x3a,0x31,0x33,0x2c,0x22,0x6c,0x65,0x64,0x4c,0x6f,0x67,0x69,0x63,0x30,0x22,
+0x3a,0x31,0x2c,0x22,0x72,0x6c,0x79,0x47,0x50,0x49,0x4f,0x30,0x22,0x3a,0x31,0x32,0x2c,0x22,0x72,0x6c,
+0x79,0x54,0x79,0x70,0x65,0x30,0x22,0x3a,0x30,0x7d
+};
\ No newline at end of file
diff --git a/code/espurna/config/devices/023_tinkerman_espurna_h06.json.h b/code/espurna/config/devices/023_tinkerman_espurna_h06.json.h
new file mode 100644
index 00000000..153e2914
--- /dev/null
+++ b/code/espurna/config/devices/023_tinkerman_espurna_h06.json.h
@@ -0,0 +1,13 @@
+#define device_config_len 200
+const uint8_t device_config[] PROGMEM = {
+0x7b,0x22,0x62,0x6f,0x61,0x72,0x64,0x22,0x3a,0x32,0x33,0x2c,0x22,0x62,0x74,0x6e,0x47,0x50,0x49,0x4f,
+0x30,0x22,0x3a,0x34,0x2c,0x22,0x62,0x74,0x6e,0x4d,0x6f,0x64,0x65,0x30,0x22,0x3a,0x32,0x2c,0x22,0x62,
+0x74,0x6e,0x52,0x65,0x6c,0x61,0x79,0x30,0x22,0x3a,0x30,0x2c,0x22,0x64,0x65,0x76,0x69,0x63,0x65,0x22,
+0x3a,0x22,0x54,0x49,0x4e,0x4b,0x45,0x52,0x4d,0x41,0x4e,0x5f,0x45,0x53,0x50,0x55,0x52,0x4e,0x41,0x5f,
+0x48,0x30,0x36,0x22,0x2c,0x22,0x68,0x6c,0x77,0x43,0x46,0x31,0x47,0x50,0x49,0x4f,0x22,0x3a,0x31,0x33,
+0x2c,0x22,0x68,0x6c,0x77,0x43,0x46,0x47,0x50,0x49,0x4f,0x22,0x3a,0x31,0x34,0x2c,0x22,0x68,0x6c,0x77,
+0x45,0x6e,0x61,0x62,0x6c,0x65,0x64,0x22,0x3a,0x31,0x2c,0x22,0x68,0x6c,0x77,0x53,0x45,0x4c,0x47,0x50,
+0x49,0x4f,0x22,0x3a,0x32,0x2c,0x22,0x6c,0x65,0x64,0x47,0x50,0x49,0x4f,0x30,0x22,0x3a,0x35,0x2c,0x22,
+0x6c,0x65,0x64,0x4c,0x6f,0x67,0x69,0x63,0x30,0x22,0x3a,0x31,0x2c,0x22,0x72,0x6c,0x79,0x47,0x50,0x49,
+0x4f,0x30,0x22,0x3a,0x31,0x32,0x2c,0x22,0x72,0x6c,0x79,0x54,0x79,0x70,0x65,0x30,0x22,0x3a,0x31,0x7d
+};
\ No newline at end of file
diff --git a/code/espurna/config/devices/024_huacanxing_h801.json.h b/code/espurna/config/devices/024_huacanxing_h801.json.h
new file mode 100644
index 00000000..2eb3f513
--- /dev/null
+++ b/code/espurna/config/devices/024_huacanxing_h801.json.h
@@ -0,0 +1,18 @@
+#define device_config_len 299
+const uint8_t device_config[] PROGMEM = {
+0x7b,0x22,0x62,0x6f,0x61,0x72,0x64,0x22,0x3a,0x32,0x34,0x2c,0x22,0x64,0x62,0x67,0x50,0x6f,0x72,0x74,
+0x22,0x3a,0x31,0x2c,0x22,0x64,0x62,0x67,0x52,0x58,0x45,0x6e,0x61,0x62,0x6c,0x65,0x64,0x22,0x3a,0x31,
+0x2c,0x22,0x64,0x65,0x76,0x69,0x63,0x65,0x22,0x3a,0x22,0x48,0x55,0x41,0x43,0x41,0x4e,0x58,0x49,0x4e,
+0x47,0x5f,0x48,0x38,0x30,0x31,0x22,0x2c,0x22,0x6c,0x65,0x64,0x47,0x50,0x49,0x4f,0x30,0x22,0x3a,0x35,
+0x2c,0x22,0x6c,0x65,0x64,0x4c,0x6f,0x67,0x69,0x63,0x30,0x22,0x3a,0x31,0x2c,0x22,0x6c,0x69,0x74,0x43,
+0x68,0x47,0x50,0x49,0x4f,0x30,0x22,0x3a,0x31,0x35,0x2c,0x22,0x6c,0x69,0x74,0x43,0x68,0x47,0x50,0x49,
+0x4f,0x31,0x22,0x3a,0x31,0x33,0x2c,0x22,0x6c,0x69,0x74,0x43,0x68,0x47,0x50,0x49,0x4f,0x32,0x22,0x3a,
+0x31,0x32,0x2c,0x22,0x6c,0x69,0x74,0x43,0x68,0x47,0x50,0x49,0x4f,0x33,0x22,0x3a,0x31,0x34,0x2c,0x22,
+0x6c,0x69,0x74,0x43,0x68,0x47,0x50,0x49,0x4f,0x34,0x22,0x3a,0x34,0x2c,0x22,0x6c,0x69,0x74,0x43,0x68,
+0x4c,0x6f,0x67,0x69,0x63,0x30,0x22,0x3a,0x30,0x2c,0x22,0x6c,0x69,0x74,0x43,0x68,0x4c,0x6f,0x67,0x69,
+0x63,0x31,0x22,0x3a,0x30,0x2c,0x22,0x6c,0x69,0x74,0x43,0x68,0x4c,0x6f,0x67,0x69,0x63,0x32,0x22,0x3a,
+0x30,0x2c,0x22,0x6c,0x69,0x74,0x43,0x68,0x4c,0x6f,0x67,0x69,0x63,0x33,0x22,0x3a,0x30,0x2c,0x22,0x6c,
+0x69,0x74,0x43,0x68,0x4c,0x6f,0x67,0x69,0x63,0x34,0x22,0x3a,0x30,0x2c,0x22,0x6c,0x69,0x74,0x50,0x72,
+0x6f,0x76,0x69,0x64,0x65,0x72,0x22,0x3a,0x32,0x2c,0x22,0x72,0x6c,0x79,0x43,0x6f,0x75,0x6e,0x74,0x22,
+0x3a,0x31,0x2c,0x22,0x72,0x6c,0x79,0x50,0x72,0x6f,0x76,0x69,0x64,0x65,0x72,0x22,0x3a,0x32,0x7d
+};
\ No newline at end of file
diff --git a/code/espurna/config/devices/025_itead_bnsz01.json.h b/code/espurna/config/devices/025_itead_bnsz01.json.h
new file mode 100644
index 00000000..a492960d
--- /dev/null
+++ b/code/espurna/config/devices/025_itead_bnsz01.json.h
@@ -0,0 +1,11 @@
+#define device_config_len 141
+const uint8_t device_config[] PROGMEM = {
+0x7b,0x22,0x62,0x6f,0x61,0x72,0x64,0x22,0x3a,0x32,0x35,0x2c,0x22,0x64,0x65,0x76,0x69,0x63,0x65,0x22,
+0x3a,0x22,0x49,0x54,0x45,0x41,0x44,0x5f,0x42,0x4e,0x53,0x5a,0x30,0x31,0x22,0x2c,0x22,0x6c,0x65,0x64,
+0x47,0x50,0x49,0x4f,0x30,0x22,0x3a,0x31,0x33,0x2c,0x22,0x6c,0x65,0x64,0x4c,0x6f,0x67,0x69,0x63,0x30,
+0x22,0x3a,0x31,0x2c,0x22,0x6c,0x69,0x74,0x43,0x68,0x47,0x50,0x49,0x4f,0x30,0x22,0x3a,0x31,0x32,0x2c,
+0x22,0x6c,0x69,0x74,0x43,0x68,0x4c,0x6f,0x67,0x69,0x63,0x30,0x22,0x3a,0x30,0x2c,0x22,0x6c,0x69,0x74,
+0x50,0x72,0x6f,0x76,0x69,0x64,0x65,0x72,0x22,0x3a,0x32,0x2c,0x22,0x72,0x6c,0x79,0x43,0x6f,0x75,0x6e,
+0x74,0x22,0x3a,0x31,0x2c,0x22,0x72,0x6c,0x79,0x50,0x72,0x6f,0x76,0x69,0x64,0x65,0x72,0x22,0x3a,0x32,
+0x7d
+};
\ No newline at end of file
diff --git a/code/espurna/config/devices/026_itead_sonoff_rfbridge.json.h b/code/espurna/config/devices/026_itead_sonoff_rfbridge.json.h
new file mode 100644
index 00000000..88314950
--- /dev/null
+++ b/code/espurna/config/devices/026_itead_sonoff_rfbridge.json.h
@@ -0,0 +1,14 @@
+#define device_config_len 204
+const uint8_t device_config[] PROGMEM = {
+0x7b,0x22,0x62,0x6f,0x61,0x72,0x64,0x22,0x3a,0x32,0x36,0x2c,0x22,0x62,0x74,0x6e,0x47,0x50,0x49,0x4f,
+0x30,0x22,0x3a,0x30,0x2c,0x22,0x62,0x74,0x6e,0x4d,0x6f,0x64,0x65,0x30,0x22,0x3a,0x32,0x2c,0x22,0x64,
+0x62,0x67,0x42,0x61,0x75,0x64,0x72,0x61,0x74,0x65,0x22,0x3a,0x31,0x39,0x32,0x30,0x30,0x2c,0x22,0x64,
+0x62,0x67,0x53,0x65,0x72,0x69,0x61,0x6c,0x22,0x3a,0x30,0x2c,0x22,0x64,0x65,0x76,0x69,0x63,0x65,0x22,
+0x3a,0x22,0x49,0x54,0x45,0x41,0x44,0x5f,0x53,0x4f,0x4e,0x4f,0x46,0x46,0x5f,0x52,0x46,0x42,0x52,0x49,
+0x44,0x47,0x45,0x22,0x2c,0x22,0x6c,0x65,0x64,0x47,0x50,0x49,0x4f,0x30,0x22,0x3a,0x31,0x33,0x2c,0x22,
+0x6c,0x65,0x64,0x4c,0x6f,0x67,0x69,0x63,0x30,0x22,0x3a,0x31,0x2c,0x22,0x72,0x66,0x62,0x44,0x69,0x72,
+0x65,0x63,0x74,0x22,0x3a,0x30,0x2c,0x22,0x72,0x66,0x62,0x52,0x58,0x47,0x50,0x49,0x4f,0x22,0x3a,0x34,
+0x2c,0x22,0x72,0x66,0x62,0x54,0x58,0x47,0x50,0x49,0x4f,0x22,0x3a,0x35,0x2c,0x22,0x72,0x6c,0x79,0x43,
+0x6f,0x75,0x6e,0x74,0x22,0x3a,0x38,0x2c,0x22,0x72,0x6c,0x79,0x50,0x72,0x6f,0x76,0x69,0x64,0x65,0x72,
+0x22,0x3a,0x33,0x7d
+};
\ No newline at end of file
diff --git a/code/espurna/config/devices/027_itead_sonoff_4ch_pro.json.h b/code/espurna/config/devices/027_itead_sonoff_4ch_pro.json.h
new file mode 100644
index 00000000..c0a5a58b
--- /dev/null
+++ b/code/espurna/config/devices/027_itead_sonoff_4ch_pro.json.h
@@ -0,0 +1,29 @@
+#define device_config_len 506
+const uint8_t device_config[] PROGMEM = {
+0x7b,0x22,0x62,0x6f,0x61,0x72,0x64,0x22,0x3a,0x32,0x37,0x2c,0x22,0x62,0x74,0x6e,0x43,0x6c,0x69,0x63,
+0x6b,0x30,0x22,0x3a,0x30,0x2c,0x22,0x62,0x74,0x6e,0x43,0x6c,0x69,0x63,0x6b,0x31,0x22,0x3a,0x30,0x2c,
+0x22,0x62,0x74,0x6e,0x43,0x6c,0x69,0x63,0x6b,0x32,0x22,0x3a,0x30,0x2c,0x22,0x62,0x74,0x6e,0x43,0x6c,
+0x69,0x63,0x6b,0x33,0x22,0x3a,0x30,0x2c,0x22,0x62,0x74,0x6e,0x44,0x62,0x6c,0x43,0x6c,0x69,0x63,0x6b,
+0x30,0x22,0x3a,0x30,0x2c,0x22,0x62,0x74,0x6e,0x47,0x50,0x49,0x4f,0x30,0x22,0x3a,0x30,0x2c,0x22,0x62,
+0x74,0x6e,0x47,0x50,0x49,0x4f,0x31,0x22,0x3a,0x39,0x2c,0x22,0x62,0x74,0x6e,0x47,0x50,0x49,0x4f,0x32,
+0x22,0x3a,0x31,0x30,0x2c,0x22,0x62,0x74,0x6e,0x47,0x50,0x49,0x4f,0x33,0x22,0x3a,0x31,0x34,0x2c,0x22,
+0x62,0x74,0x6e,0x4c,0x6e,0x67,0x43,0x6c,0x69,0x63,0x6b,0x30,0x22,0x3a,0x30,0x2c,0x22,0x62,0x74,0x6e,
+0x4c,0x6e,0x67,0x4c,0x6e,0x67,0x43,0x6c,0x69,0x63,0x6b,0x30,0x22,0x3a,0x30,0x2c,0x22,0x62,0x74,0x6e,
+0x4d,0x6f,0x64,0x65,0x30,0x22,0x3a,0x32,0x2c,0x22,0x62,0x74,0x6e,0x4d,0x6f,0x64,0x65,0x31,0x22,0x3a,
+0x32,0x2c,0x22,0x62,0x74,0x6e,0x4d,0x6f,0x64,0x65,0x32,0x22,0x3a,0x32,0x2c,0x22,0x62,0x74,0x6e,0x4d,
+0x6f,0x64,0x65,0x33,0x22,0x3a,0x32,0x2c,0x22,0x62,0x74,0x6e,0x50,0x72,0x65,0x73,0x73,0x30,0x22,0x3a,
+0x31,0x2c,0x22,0x62,0x74,0x6e,0x50,0x72,0x65,0x73,0x73,0x31,0x22,0x3a,0x31,0x2c,0x22,0x62,0x74,0x6e,
+0x50,0x72,0x65,0x73,0x73,0x32,0x22,0x3a,0x31,0x2c,0x22,0x62,0x74,0x6e,0x50,0x72,0x65,0x73,0x73,0x33,
+0x22,0x3a,0x31,0x2c,0x22,0x62,0x74,0x6e,0x52,0x65,0x6c,0x61,0x79,0x30,0x22,0x3a,0x30,0x2c,0x22,0x62,
+0x74,0x6e,0x52,0x65,0x6c,0x61,0x79,0x31,0x22,0x3a,0x31,0x2c,0x22,0x62,0x74,0x6e,0x52,0x65,0x6c,0x61,
+0x79,0x32,0x22,0x3a,0x32,0x2c,0x22,0x62,0x74,0x6e,0x52,0x65,0x6c,0x61,0x79,0x33,0x22,0x3a,0x33,0x2c,
+0x22,0x64,0x65,0x76,0x69,0x63,0x65,0x22,0x3a,0x22,0x49,0x54,0x45,0x41,0x44,0x5f,0x53,0x4f,0x4e,0x4f,
+0x46,0x46,0x5f,0x34,0x43,0x48,0x5f,0x50,0x52,0x4f,0x22,0x2c,0x22,0x6c,0x65,0x64,0x47,0x50,0x49,0x4f,
+0x30,0x22,0x3a,0x31,0x33,0x2c,0x22,0x6c,0x65,0x64,0x4c,0x6f,0x67,0x69,0x63,0x30,0x22,0x3a,0x31,0x2c,
+0x22,0x72,0x6c,0x79,0x47,0x50,0x49,0x4f,0x30,0x22,0x3a,0x31,0x32,0x2c,0x22,0x72,0x6c,0x79,0x47,0x50,
+0x49,0x4f,0x31,0x22,0x3a,0x35,0x2c,0x22,0x72,0x6c,0x79,0x47,0x50,0x49,0x4f,0x32,0x22,0x3a,0x34,0x2c,
+0x22,0x72,0x6c,0x79,0x47,0x50,0x49,0x4f,0x33,0x22,0x3a,0x31,0x35,0x2c,0x22,0x72,0x6c,0x79,0x54,0x79,
+0x70,0x65,0x30,0x22,0x3a,0x30,0x2c,0x22,0x72,0x6c,0x79,0x54,0x79,0x70,0x65,0x31,0x22,0x3a,0x30,0x2c,
+0x22,0x72,0x6c,0x79,0x54,0x79,0x70,0x65,0x32,0x22,0x3a,0x30,0x2c,0x22,0x72,0x6c,0x79,0x54,0x79,0x70,
+0x65,0x33,0x22,0x3a,0x30,0x7d
+};
\ No newline at end of file
diff --git a/code/espurna/config/devices/028_itead_sonoff_b1.json.h b/code/espurna/config/devices/028_itead_sonoff_b1.json.h
new file mode 100644
index 00000000..14132dec
--- /dev/null
+++ b/code/espurna/config/devices/028_itead_sonoff_b1.json.h
@@ -0,0 +1,13 @@
+#define device_config_len 196
+const uint8_t device_config[] PROGMEM = {
+0x7b,0x22,0x62,0x6f,0x61,0x72,0x64,0x22,0x3a,0x32,0x38,0x2c,0x22,0x64,0x65,0x76,0x69,0x63,0x65,0x22,
+0x3a,0x22,0x49,0x54,0x45,0x41,0x44,0x5f,0x53,0x4f,0x4e,0x4f,0x46,0x46,0x5f,0x42,0x31,0x22,0x2c,0x22,
+0x6c,0x69,0x74,0x43,0x68,0x46,0x61,0x63,0x74,0x6f,0x72,0x34,0x22,0x3a,0x30,0x2e,0x31,0x2c,0x22,0x6c,
+0x69,0x74,0x43,0x68,0x46,0x61,0x63,0x74,0x6f,0x72,0x35,0x22,0x3a,0x30,0x2e,0x31,0x2c,0x22,0x6c,0x69,
+0x74,0x50,0x72,0x6f,0x76,0x69,0x64,0x65,0x72,0x22,0x3a,0x31,0x2c,0x22,0x6d,0x79,0x43,0x68,0x69,0x70,
+0x73,0x22,0x3a,0x32,0x2c,0x22,0x6d,0x79,0x44,0x43,0x4b,0x49,0x47,0x50,0x49,0x4f,0x22,0x3a,0x31,0x34,
+0x2c,0x22,0x6d,0x79,0x44,0x49,0x47,0x50,0x49,0x4f,0x22,0x3a,0x31,0x32,0x2c,0x22,0x6d,0x79,0x4d,0x61,
+0x70,0x70,0x69,0x6e,0x67,0x22,0x3a,0x22,0x34,0x33,0x35,0x30,0x31,0x22,0x2c,0x22,0x6d,0x79,0x4d,0x6f,
+0x64,0x65,0x6c,0x22,0x3a,0x31,0x2c,0x22,0x72,0x6c,0x79,0x43,0x6f,0x75,0x6e,0x74,0x22,0x3a,0x31,0x2c,
+0x22,0x72,0x6c,0x79,0x50,0x72,0x6f,0x76,0x69,0x64,0x65,0x72,0x22,0x3a,0x32,0x7d
+};
\ No newline at end of file
diff --git a/code/espurna/config/devices/029_itead_sonoff_led.json.h b/code/espurna/config/devices/029_itead_sonoff_led.json.h
new file mode 100644
index 00000000..191bb212
--- /dev/null
+++ b/code/espurna/config/devices/029_itead_sonoff_led.json.h
@@ -0,0 +1,12 @@
+#define device_config_len 177
+const uint8_t device_config[] PROGMEM = {
+0x7b,0x22,0x62,0x6f,0x61,0x72,0x64,0x22,0x3a,0x32,0x39,0x2c,0x22,0x64,0x65,0x76,0x69,0x63,0x65,0x22,
+0x3a,0x22,0x49,0x54,0x45,0x41,0x44,0x5f,0x53,0x4f,0x4e,0x4f,0x46,0x46,0x5f,0x4c,0x45,0x44,0x22,0x2c,
+0x22,0x6c,0x65,0x64,0x47,0x50,0x49,0x4f,0x30,0x22,0x3a,0x31,0x33,0x2c,0x22,0x6c,0x65,0x64,0x4c,0x6f,
+0x67,0x69,0x63,0x30,0x22,0x3a,0x31,0x2c,0x22,0x6c,0x69,0x74,0x43,0x68,0x47,0x50,0x49,0x4f,0x30,0x22,
+0x3a,0x31,0x32,0x2c,0x22,0x6c,0x69,0x74,0x43,0x68,0x47,0x50,0x49,0x4f,0x31,0x22,0x3a,0x31,0x34,0x2c,
+0x22,0x6c,0x69,0x74,0x43,0x68,0x4c,0x6f,0x67,0x69,0x63,0x30,0x22,0x3a,0x30,0x2c,0x22,0x6c,0x69,0x74,
+0x43,0x68,0x4c,0x6f,0x67,0x69,0x63,0x31,0x22,0x3a,0x30,0x2c,0x22,0x6c,0x69,0x74,0x50,0x72,0x6f,0x76,
+0x69,0x64,0x65,0x72,0x22,0x3a,0x32,0x2c,0x22,0x72,0x6c,0x79,0x43,0x6f,0x75,0x6e,0x74,0x22,0x3a,0x31,
+0x2c,0x22,0x72,0x6c,0x79,0x50,0x72,0x6f,0x76,0x69,0x64,0x65,0x72,0x22,0x3a,0x32,0x7d
+};
\ No newline at end of file
diff --git a/code/espurna/config/devices/030_itead_sonoff_t1_1ch.json.h b/code/espurna/config/devices/030_itead_sonoff_t1_1ch.json.h
new file mode 100644
index 00000000..e2b8acd9
--- /dev/null
+++ b/code/espurna/config/devices/030_itead_sonoff_t1_1ch.json.h
@@ -0,0 +1,14 @@
+#define device_config_len 220
+const uint8_t device_config[] PROGMEM = {
+0x7b,0x22,0x62,0x6f,0x61,0x72,0x64,0x22,0x3a,0x33,0x30,0x2c,0x22,0x62,0x74,0x6e,0x43,0x6c,0x69,0x63,
+0x6b,0x30,0x22,0x3a,0x30,0x2c,0x22,0x62,0x74,0x6e,0x44,0x62,0x6c,0x43,0x6c,0x69,0x63,0x6b,0x30,0x22,
+0x3a,0x30,0x2c,0x22,0x62,0x74,0x6e,0x47,0x50,0x49,0x4f,0x30,0x22,0x3a,0x30,0x2c,0x22,0x62,0x74,0x6e,
+0x4c,0x6e,0x67,0x43,0x6c,0x69,0x63,0x6b,0x30,0x22,0x3a,0x30,0x2c,0x22,0x62,0x74,0x6e,0x4c,0x6e,0x67,
+0x4c,0x6e,0x67,0x43,0x6c,0x69,0x63,0x6b,0x30,0x22,0x3a,0x35,0x2c,0x22,0x62,0x74,0x6e,0x4d,0x6f,0x64,
+0x65,0x30,0x22,0x3a,0x32,0x2c,0x22,0x62,0x74,0x6e,0x50,0x72,0x65,0x73,0x73,0x30,0x22,0x3a,0x31,0x2c,
+0x22,0x62,0x74,0x6e,0x52,0x65,0x6c,0x61,0x79,0x30,0x22,0x3a,0x30,0x2c,0x22,0x64,0x65,0x76,0x69,0x63,
+0x65,0x22,0x3a,0x22,0x49,0x54,0x45,0x41,0x44,0x5f,0x53,0x4f,0x4e,0x4f,0x46,0x46,0x5f,0x54,0x31,0x5f,
+0x31,0x43,0x48,0x22,0x2c,0x22,0x6c,0x65,0x64,0x47,0x50,0x49,0x4f,0x30,0x22,0x3a,0x31,0x33,0x2c,0x22,
+0x6c,0x65,0x64,0x4c,0x6f,0x67,0x69,0x63,0x30,0x22,0x3a,0x31,0x2c,0x22,0x72,0x6c,0x79,0x47,0x50,0x49,
+0x4f,0x30,0x22,0x3a,0x31,0x32,0x2c,0x22,0x72,0x6c,0x79,0x54,0x79,0x70,0x65,0x30,0x22,0x3a,0x30,0x7d
+};
\ No newline at end of file
diff --git a/code/espurna/config/devices/031_itead_sonoff_t1_2ch.json.h b/code/espurna/config/devices/031_itead_sonoff_t1_2ch.json.h
new file mode 100644
index 00000000..4d48ad52
--- /dev/null
+++ b/code/espurna/config/devices/031_itead_sonoff_t1_2ch.json.h
@@ -0,0 +1,22 @@
+#define device_config_len 368
+const uint8_t device_config[] PROGMEM = {
+0x7b,0x22,0x62,0x6f,0x61,0x72,0x64,0x22,0x3a,0x33,0x31,0x2c,0x22,0x62,0x74,0x6e,0x43,0x6c,0x69,0x63,
+0x6b,0x30,0x22,0x3a,0x30,0x2c,0x22,0x62,0x74,0x6e,0x43,0x6c,0x69,0x63,0x6b,0x31,0x22,0x3a,0x30,0x2c,
+0x22,0x62,0x74,0x6e,0x44,0x62,0x6c,0x43,0x6c,0x69,0x63,0x6b,0x30,0x22,0x3a,0x30,0x2c,0x22,0x62,0x74,
+0x6e,0x44,0x62,0x6c,0x43,0x6c,0x69,0x63,0x6b,0x31,0x22,0x3a,0x30,0x2c,0x22,0x62,0x74,0x6e,0x47,0x50,
+0x49,0x4f,0x30,0x22,0x3a,0x30,0x2c,0x22,0x62,0x74,0x6e,0x47,0x50,0x49,0x4f,0x31,0x22,0x3a,0x39,0x2c,
+0x22,0x62,0x74,0x6e,0x4c,0x6e,0x67,0x43,0x6c,0x69,0x63,0x6b,0x30,0x22,0x3a,0x30,0x2c,0x22,0x62,0x74,
+0x6e,0x4c,0x6e,0x67,0x43,0x6c,0x69,0x63,0x6b,0x31,0x22,0x3a,0x30,0x2c,0x22,0x62,0x74,0x6e,0x4c,0x6e,
+0x67,0x4c,0x6e,0x67,0x43,0x6c,0x69,0x63,0x6b,0x30,0x22,0x3a,0x35,0x2c,0x22,0x62,0x74,0x6e,0x4c,0x6e,
+0x67,0x4c,0x6e,0x67,0x43,0x6c,0x69,0x63,0x6b,0x31,0x22,0x3a,0x35,0x2c,0x22,0x62,0x74,0x6e,0x4d,0x6f,
+0x64,0x65,0x30,0x22,0x3a,0x32,0x2c,0x22,0x62,0x74,0x6e,0x4d,0x6f,0x64,0x65,0x31,0x22,0x3a,0x32,0x2c,
+0x22,0x62,0x74,0x6e,0x50,0x72,0x65,0x73,0x73,0x30,0x22,0x3a,0x31,0x2c,0x22,0x62,0x74,0x6e,0x50,0x72,
+0x65,0x73,0x73,0x31,0x22,0x3a,0x31,0x2c,0x22,0x62,0x74,0x6e,0x52,0x65,0x6c,0x61,0x79,0x30,0x22,0x3a,
+0x30,0x2c,0x22,0x62,0x74,0x6e,0x52,0x65,0x6c,0x61,0x79,0x31,0x22,0x3a,0x31,0x2c,0x22,0x64,0x65,0x76,
+0x69,0x63,0x65,0x22,0x3a,0x22,0x49,0x54,0x45,0x41,0x44,0x5f,0x53,0x4f,0x4e,0x4f,0x46,0x46,0x5f,0x54,
+0x31,0x5f,0x32,0x43,0x48,0x22,0x2c,0x22,0x6c,0x65,0x64,0x47,0x50,0x49,0x4f,0x30,0x22,0x3a,0x31,0x33,
+0x2c,0x22,0x6c,0x65,0x64,0x4c,0x6f,0x67,0x69,0x63,0x30,0x22,0x3a,0x31,0x2c,0x22,0x72,0x6c,0x79,0x47,
+0x50,0x49,0x4f,0x30,0x22,0x3a,0x31,0x32,0x2c,0x22,0x72,0x6c,0x79,0x47,0x50,0x49,0x4f,0x31,0x22,0x3a,
+0x35,0x2c,0x22,0x72,0x6c,0x79,0x54,0x79,0x70,0x65,0x30,0x22,0x3a,0x30,0x2c,0x22,0x72,0x6c,0x79,0x54,
+0x79,0x70,0x65,0x31,0x22,0x3a,0x30,0x7d
+};
\ No newline at end of file
diff --git a/code/espurna/config/devices/032_itead_sonoff_t1_3ch.json.h b/code/espurna/config/devices/032_itead_sonoff_t1_3ch.json.h
new file mode 100644
index 00000000..094cbb64
--- /dev/null
+++ b/code/espurna/config/devices/032_itead_sonoff_t1_3ch.json.h
@@ -0,0 +1,29 @@
+#define device_config_len 517
+const uint8_t device_config[] PROGMEM = {
+0x7b,0x22,0x62,0x6f,0x61,0x72,0x64,0x22,0x3a,0x33,0x32,0x2c,0x22,0x62,0x74,0x6e,0x43,0x6c,0x69,0x63,
+0x6b,0x30,0x22,0x3a,0x30,0x2c,0x22,0x62,0x74,0x6e,0x43,0x6c,0x69,0x63,0x6b,0x31,0x22,0x3a,0x30,0x2c,
+0x22,0x62,0x74,0x6e,0x43,0x6c,0x69,0x63,0x6b,0x32,0x22,0x3a,0x30,0x2c,0x22,0x62,0x74,0x6e,0x44,0x62,
+0x6c,0x43,0x6c,0x69,0x63,0x6b,0x30,0x22,0x3a,0x30,0x2c,0x22,0x62,0x74,0x6e,0x44,0x62,0x6c,0x43,0x6c,
+0x69,0x63,0x6b,0x31,0x22,0x3a,0x30,0x2c,0x22,0x62,0x74,0x6e,0x44,0x62,0x6c,0x43,0x6c,0x69,0x63,0x6b,
+0x32,0x22,0x3a,0x30,0x2c,0x22,0x62,0x74,0x6e,0x47,0x50,0x49,0x4f,0x30,0x22,0x3a,0x30,0x2c,0x22,0x62,
+0x74,0x6e,0x47,0x50,0x49,0x4f,0x31,0x22,0x3a,0x39,0x2c,0x22,0x62,0x74,0x6e,0x47,0x50,0x49,0x4f,0x32,
+0x22,0x3a,0x31,0x30,0x2c,0x22,0x62,0x74,0x6e,0x4c,0x6e,0x67,0x43,0x6c,0x69,0x63,0x6b,0x30,0x22,0x3a,
+0x30,0x2c,0x22,0x62,0x74,0x6e,0x4c,0x6e,0x67,0x43,0x6c,0x69,0x63,0x6b,0x31,0x22,0x3a,0x30,0x2c,0x22,
+0x62,0x74,0x6e,0x4c,0x6e,0x67,0x43,0x6c,0x69,0x63,0x6b,0x32,0x22,0x3a,0x30,0x2c,0x22,0x62,0x74,0x6e,
+0x4c,0x6e,0x67,0x4c,0x6e,0x67,0x43,0x6c,0x69,0x63,0x6b,0x30,0x22,0x3a,0x35,0x2c,0x22,0x62,0x74,0x6e,
+0x4c,0x6e,0x67,0x4c,0x6e,0x67,0x43,0x6c,0x69,0x63,0x6b,0x31,0x22,0x3a,0x35,0x2c,0x22,0x62,0x74,0x6e,
+0x4c,0x6e,0x67,0x4c,0x6e,0x67,0x43,0x6c,0x69,0x63,0x6b,0x32,0x22,0x3a,0x35,0x2c,0x22,0x62,0x74,0x6e,
+0x4d,0x6f,0x64,0x65,0x30,0x22,0x3a,0x32,0x2c,0x22,0x62,0x74,0x6e,0x4d,0x6f,0x64,0x65,0x31,0x22,0x3a,
+0x32,0x2c,0x22,0x62,0x74,0x6e,0x4d,0x6f,0x64,0x65,0x32,0x22,0x3a,0x32,0x2c,0x22,0x62,0x74,0x6e,0x50,
+0x72,0x65,0x73,0x73,0x30,0x22,0x3a,0x31,0x2c,0x22,0x62,0x74,0x6e,0x50,0x72,0x65,0x73,0x73,0x31,0x22,
+0x3a,0x31,0x2c,0x22,0x62,0x74,0x6e,0x50,0x72,0x65,0x73,0x73,0x32,0x22,0x3a,0x31,0x2c,0x22,0x62,0x74,
+0x6e,0x52,0x65,0x6c,0x61,0x79,0x30,0x22,0x3a,0x30,0x2c,0x22,0x62,0x74,0x6e,0x52,0x65,0x6c,0x61,0x79,
+0x31,0x22,0x3a,0x31,0x2c,0x22,0x62,0x74,0x6e,0x52,0x65,0x6c,0x61,0x79,0x32,0x22,0x3a,0x32,0x2c,0x22,
+0x64,0x65,0x76,0x69,0x63,0x65,0x22,0x3a,0x22,0x49,0x54,0x45,0x41,0x44,0x5f,0x53,0x4f,0x4e,0x4f,0x46,
+0x46,0x5f,0x54,0x31,0x5f,0x33,0x43,0x48,0x22,0x2c,0x22,0x6c,0x65,0x64,0x47,0x50,0x49,0x4f,0x30,0x22,
+0x3a,0x31,0x33,0x2c,0x22,0x6c,0x65,0x64,0x4c,0x6f,0x67,0x69,0x63,0x30,0x22,0x3a,0x31,0x2c,0x22,0x72,
+0x6c,0x79,0x47,0x50,0x49,0x4f,0x30,0x22,0x3a,0x31,0x32,0x2c,0x22,0x72,0x6c,0x79,0x47,0x50,0x49,0x4f,
+0x31,0x22,0x3a,0x35,0x2c,0x22,0x72,0x6c,0x79,0x47,0x50,0x49,0x4f,0x32,0x22,0x3a,0x34,0x2c,0x22,0x72,
+0x6c,0x79,0x54,0x79,0x70,0x65,0x30,0x22,0x3a,0x30,0x2c,0x22,0x72,0x6c,0x79,0x54,0x79,0x70,0x65,0x31,
+0x22,0x3a,0x30,0x2c,0x22,0x72,0x6c,0x79,0x54,0x79,0x70,0x65,0x32,0x22,0x3a,0x30,0x7d
+};
\ No newline at end of file
diff --git a/code/espurna/config/devices/033_itead_sonoff_rf.json.h b/code/espurna/config/devices/033_itead_sonoff_rf.json.h
new file mode 100644
index 00000000..c24ba110
--- /dev/null
+++ b/code/espurna/config/devices/033_itead_sonoff_rf.json.h
@@ -0,0 +1,10 @@
+#define device_config_len 134
+const uint8_t device_config[] PROGMEM = {
+0x7b,0x22,0x62,0x6f,0x61,0x72,0x64,0x22,0x3a,0x33,0x33,0x2c,0x22,0x62,0x74,0x6e,0x47,0x50,0x49,0x4f,
+0x30,0x22,0x3a,0x30,0x2c,0x22,0x62,0x74,0x6e,0x4d,0x6f,0x64,0x65,0x30,0x22,0x3a,0x32,0x2c,0x22,0x62,
+0x74,0x6e,0x52,0x65,0x6c,0x61,0x79,0x30,0x22,0x3a,0x30,0x2c,0x22,0x64,0x65,0x76,0x69,0x63,0x65,0x22,
+0x3a,0x22,0x49,0x54,0x45,0x41,0x44,0x5f,0x53,0x4f,0x4e,0x4f,0x46,0x46,0x5f,0x52,0x46,0x22,0x2c,0x22,
+0x6c,0x65,0x64,0x47,0x50,0x49,0x4f,0x30,0x22,0x3a,0x31,0x33,0x2c,0x22,0x6c,0x65,0x64,0x4c,0x6f,0x67,
+0x69,0x63,0x30,0x22,0x3a,0x31,0x2c,0x22,0x72,0x6c,0x79,0x47,0x50,0x49,0x4f,0x30,0x22,0x3a,0x31,0x32,
+0x2c,0x22,0x72,0x6c,0x79,0x54,0x79,0x70,0x65,0x30,0x22,0x3a,0x30,0x7d
+};
\ No newline at end of file
diff --git a/code/espurna/config/devices/034_wion_50055.json.h b/code/espurna/config/devices/034_wion_50055.json.h
new file mode 100644
index 00000000..e3f036c1
--- /dev/null
+++ b/code/espurna/config/devices/034_wion_50055.json.h
@@ -0,0 +1,10 @@
+#define device_config_len 129
+const uint8_t device_config[] PROGMEM = {
+0x7b,0x22,0x62,0x6f,0x61,0x72,0x64,0x22,0x3a,0x33,0x34,0x2c,0x22,0x62,0x74,0x6e,0x47,0x50,0x49,0x4f,
+0x30,0x22,0x3a,0x31,0x33,0x2c,0x22,0x62,0x74,0x6e,0x4d,0x6f,0x64,0x65,0x30,0x22,0x3a,0x32,0x2c,0x22,
+0x62,0x74,0x6e,0x52,0x65,0x6c,0x61,0x79,0x30,0x22,0x3a,0x30,0x2c,0x22,0x64,0x65,0x76,0x69,0x63,0x65,
+0x22,0x3a,0x22,0x57,0x49,0x4f,0x4e,0x5f,0x35,0x30,0x30,0x35,0x35,0x22,0x2c,0x22,0x6c,0x65,0x64,0x47,
+0x50,0x49,0x4f,0x30,0x22,0x3a,0x32,0x2c,0x22,0x6c,0x65,0x64,0x4c,0x6f,0x67,0x69,0x63,0x30,0x22,0x3a,
+0x30,0x2c,0x22,0x72,0x6c,0x79,0x47,0x50,0x49,0x4f,0x30,0x22,0x3a,0x31,0x35,0x2c,0x22,0x72,0x6c,0x79,
+0x54,0x79,0x70,0x65,0x30,0x22,0x3a,0x30,0x7d
+};
\ No newline at end of file
diff --git a/code/espurna/config/devices/035_exs_wifi_relay_v31.json.h b/code/espurna/config/devices/035_exs_wifi_relay_v31.json.h
new file mode 100644
index 00000000..13bee583
--- /dev/null
+++ b/code/espurna/config/devices/035_exs_wifi_relay_v31.json.h
@@ -0,0 +1,10 @@
+#define device_config_len 128
+const uint8_t device_config[] PROGMEM = {
+0x7b,0x22,0x62,0x6f,0x61,0x72,0x64,0x22,0x3a,0x33,0x35,0x2c,0x22,0x62,0x74,0x6e,0x47,0x50,0x49,0x4f,
+0x30,0x22,0x3a,0x30,0x2c,0x22,0x62,0x74,0x6e,0x4d,0x6f,0x64,0x65,0x30,0x22,0x3a,0x32,0x2c,0x22,0x62,
+0x74,0x6e,0x52,0x65,0x6c,0x61,0x79,0x30,0x22,0x3a,0x30,0x2c,0x22,0x64,0x65,0x76,0x69,0x63,0x65,0x22,
+0x3a,0x22,0x45,0x58,0x53,0x5f,0x57,0x49,0x46,0x49,0x5f,0x52,0x45,0x4c,0x41,0x59,0x5f,0x56,0x33,0x31,
+0x22,0x2c,0x22,0x72,0x6c,0x79,0x47,0x50,0x49,0x4f,0x30,0x22,0x3a,0x31,0x33,0x2c,0x22,0x72,0x6c,0x79,
+0x52,0x65,0x73,0x65,0x74,0x47,0x50,0x49,0x4f,0x30,0x22,0x3a,0x31,0x32,0x2c,0x22,0x72,0x6c,0x79,0x54,
+0x79,0x70,0x65,0x30,0x22,0x3a,0x32,0x7d
+};
\ No newline at end of file
diff --git a/code/espurna/config/devices/036_huacanxing_h802.json.h b/code/espurna/config/devices/036_huacanxing_h802.json.h
new file mode 100644
index 00000000..872fe646
--- /dev/null
+++ b/code/espurna/config/devices/036_huacanxing_h802.json.h
@@ -0,0 +1,16 @@
+#define device_config_len 241
+const uint8_t device_config[] PROGMEM = {
+0x7b,0x22,0x62,0x6f,0x61,0x72,0x64,0x22,0x3a,0x33,0x36,0x2c,0x22,0x64,0x62,0x67,0x50,0x6f,0x72,0x74,
+0x22,0x3a,0x31,0x2c,0x22,0x64,0x62,0x67,0x52,0x58,0x45,0x6e,0x61,0x62,0x6c,0x65,0x64,0x22,0x3a,0x31,
+0x2c,0x22,0x64,0x65,0x76,0x69,0x63,0x65,0x22,0x3a,0x22,0x48,0x55,0x41,0x43,0x41,0x4e,0x58,0x49,0x4e,
+0x47,0x5f,0x48,0x38,0x30,0x32,0x22,0x2c,0x22,0x6c,0x69,0x74,0x43,0x68,0x47,0x50,0x49,0x4f,0x30,0x22,
+0x3a,0x31,0x32,0x2c,0x22,0x6c,0x69,0x74,0x43,0x68,0x47,0x50,0x49,0x4f,0x31,0x22,0x3a,0x31,0x34,0x2c,
+0x22,0x6c,0x69,0x74,0x43,0x68,0x47,0x50,0x49,0x4f,0x32,0x22,0x3a,0x31,0x33,0x2c,0x22,0x6c,0x69,0x74,
+0x43,0x68,0x47,0x50,0x49,0x4f,0x33,0x22,0x3a,0x31,0x35,0x2c,0x22,0x6c,0x69,0x74,0x43,0x68,0x4c,0x6f,
+0x67,0x69,0x63,0x30,0x22,0x3a,0x30,0x2c,0x22,0x6c,0x69,0x74,0x43,0x68,0x4c,0x6f,0x67,0x69,0x63,0x31,
+0x22,0x3a,0x30,0x2c,0x22,0x6c,0x69,0x74,0x43,0x68,0x4c,0x6f,0x67,0x69,0x63,0x32,0x22,0x3a,0x30,0x2c,
+0x22,0x6c,0x69,0x74,0x43,0x68,0x4c,0x6f,0x67,0x69,0x63,0x33,0x22,0x3a,0x30,0x2c,0x22,0x6c,0x69,0x74,
+0x50,0x72,0x6f,0x76,0x69,0x64,0x65,0x72,0x22,0x3a,0x32,0x2c,0x22,0x72,0x6c,0x79,0x43,0x6f,0x75,0x6e,
+0x74,0x22,0x3a,0x31,0x2c,0x22,0x72,0x6c,0x79,0x50,0x72,0x6f,0x76,0x69,0x64,0x65,0x72,0x22,0x3a,0x32,
+0x7d
+};
\ No newline at end of file
diff --git a/code/espurna/config/devices/037_generic_v9261f.json.h b/code/espurna/config/devices/037_generic_v9261f.json.h
new file mode 100644
index 00000000..5ddd0b88
--- /dev/null
+++ b/code/espurna/config/devices/037_generic_v9261f.json.h
@@ -0,0 +1,7 @@
+#define device_config_len 78
+const uint8_t device_config[] PROGMEM = {
+0x7b,0x22,0x62,0x6f,0x61,0x72,0x64,0x22,0x3a,0x33,0x37,0x2c,0x22,0x64,0x65,0x76,0x69,0x63,0x65,0x22,
+0x3a,0x22,0x47,0x45,0x4e,0x45,0x52,0x49,0x43,0x5f,0x56,0x39,0x32,0x36,0x31,0x46,0x22,0x2c,0x22,0x76,
+0x39,0x32,0x45,0x6e,0x61,0x62,0x6c,0x65,0x64,0x22,0x3a,0x31,0x2c,0x22,0x76,0x39,0x32,0x47,0x50,0x49,
+0x4f,0x22,0x3a,0x32,0x2c,0x22,0x76,0x39,0x32,0x4c,0x6f,0x67,0x69,0x63,0x22,0x3a,0x31,0x7d
+};
\ No newline at end of file
diff --git a/code/espurna/config/devices/038_generic_ech1560.json.h b/code/espurna/config/devices/038_generic_ech1560.json.h
new file mode 100644
index 00000000..3d939e8c
--- /dev/null
+++ b/code/espurna/config/devices/038_generic_ech1560.json.h
@@ -0,0 +1,8 @@
+#define device_config_len 98
+const uint8_t device_config[] PROGMEM = {
+0x7b,0x22,0x62,0x6f,0x61,0x72,0x64,0x22,0x3a,0x33,0x38,0x2c,0x22,0x64,0x65,0x76,0x69,0x63,0x65,0x22,
+0x3a,0x22,0x47,0x45,0x4e,0x45,0x52,0x49,0x43,0x5f,0x45,0x43,0x48,0x31,0x35,0x36,0x30,0x22,0x2c,0x22,
+0x65,0x63,0x68,0x43,0x4c,0x4b,0x47,0x50,0x49,0x4f,0x22,0x3a,0x34,0x2c,0x22,0x65,0x63,0x68,0x45,0x6e,
+0x61,0x62,0x6c,0x65,0x64,0x22,0x3a,0x31,0x2c,0x22,0x65,0x63,0x68,0x4c,0x6f,0x67,0x69,0x63,0x22,0x3a,
+0x31,0x2c,0x22,0x65,0x63,0x68,0x4d,0x49,0x53,0x4f,0x47,0x50,0x49,0x4f,0x22,0x3a,0x35,0x7d
+};
\ No newline at end of file
diff --git a/code/espurna/config/devices/039_tinkerman_espurna_h08.json.h b/code/espurna/config/devices/039_tinkerman_espurna_h08.json.h
new file mode 100644
index 00000000..0fa1f928
--- /dev/null
+++ b/code/espurna/config/devices/039_tinkerman_espurna_h08.json.h
@@ -0,0 +1,13 @@
+#define device_config_len 200
+const uint8_t device_config[] PROGMEM = {
+0x7b,0x22,0x62,0x6f,0x61,0x72,0x64,0x22,0x3a,0x33,0x39,0x2c,0x22,0x62,0x74,0x6e,0x47,0x50,0x49,0x4f,
+0x30,0x22,0x3a,0x34,0x2c,0x22,0x62,0x74,0x6e,0x4d,0x6f,0x64,0x65,0x30,0x22,0x3a,0x32,0x2c,0x22,0x62,
+0x74,0x6e,0x52,0x65,0x6c,0x61,0x79,0x30,0x22,0x3a,0x30,0x2c,0x22,0x64,0x65,0x76,0x69,0x63,0x65,0x22,
+0x3a,0x22,0x54,0x49,0x4e,0x4b,0x45,0x52,0x4d,0x41,0x4e,0x5f,0x45,0x53,0x50,0x55,0x52,0x4e,0x41,0x5f,
+0x48,0x30,0x38,0x22,0x2c,0x22,0x68,0x6c,0x77,0x43,0x46,0x31,0x47,0x50,0x49,0x4f,0x22,0x3a,0x31,0x33,
+0x2c,0x22,0x68,0x6c,0x77,0x43,0x46,0x47,0x50,0x49,0x4f,0x22,0x3a,0x31,0x34,0x2c,0x22,0x68,0x6c,0x77,
+0x45,0x6e,0x61,0x62,0x6c,0x65,0x64,0x22,0x3a,0x31,0x2c,0x22,0x68,0x6c,0x77,0x53,0x45,0x4c,0x47,0x50,
+0x49,0x4f,0x22,0x3a,0x35,0x2c,0x22,0x6c,0x65,0x64,0x47,0x50,0x49,0x4f,0x30,0x22,0x3a,0x32,0x2c,0x22,
+0x6c,0x65,0x64,0x4c,0x6f,0x67,0x69,0x63,0x30,0x22,0x3a,0x30,0x2c,0x22,0x72,0x6c,0x79,0x47,0x50,0x49,
+0x4f,0x30,0x22,0x3a,0x31,0x32,0x2c,0x22,0x72,0x6c,0x79,0x54,0x79,0x70,0x65,0x30,0x22,0x3a,0x30,0x7d
+};
\ No newline at end of file
diff --git a/code/espurna/config/devices/040_mancavemade_esplive.json.h b/code/espurna/config/devices/040_mancavemade_esplive.json.h
new file mode 100644
index 00000000..073b1900
--- /dev/null
+++ b/code/espurna/config/devices/040_mancavemade_esplive.json.h
@@ -0,0 +1,14 @@
+#define device_config_len 203
+const uint8_t device_config[] PROGMEM = {
+0x7b,0x22,0x62,0x6f,0x61,0x72,0x64,0x22,0x3a,0x34,0x30,0x2c,0x22,0x62,0x74,0x6e,0x47,0x50,0x49,0x4f,
+0x30,0x22,0x3a,0x34,0x2c,0x22,0x62,0x74,0x6e,0x47,0x50,0x49,0x4f,0x31,0x22,0x3a,0x35,0x2c,0x22,0x62,
+0x74,0x6e,0x4d,0x6f,0x64,0x65,0x30,0x22,0x3a,0x32,0x2c,0x22,0x62,0x74,0x6e,0x4d,0x6f,0x64,0x65,0x31,
+0x22,0x3a,0x32,0x2c,0x22,0x62,0x74,0x6e,0x52,0x65,0x6c,0x61,0x79,0x30,0x22,0x3a,0x30,0x2c,0x22,0x62,
+0x74,0x6e,0x52,0x65,0x6c,0x61,0x79,0x31,0x22,0x3a,0x31,0x2c,0x22,0x64,0x65,0x76,0x69,0x63,0x65,0x22,
+0x3a,0x22,0x4d,0x41,0x4e,0x43,0x41,0x56,0x45,0x4d,0x41,0x44,0x45,0x5f,0x45,0x53,0x50,0x4c,0x49,0x56,
+0x45,0x22,0x2c,0x22,0x64,0x73,0x45,0x6e,0x61,0x62,0x6c,0x65,0x64,0x22,0x3a,0x31,0x2c,0x22,0x64,0x73,
+0x47,0x50,0x49,0x4f,0x30,0x22,0x3a,0x32,0x2c,0x22,0x72,0x6c,0x79,0x47,0x50,0x49,0x4f,0x30,0x22,0x3a,
+0x31,0x32,0x2c,0x22,0x72,0x6c,0x79,0x47,0x50,0x49,0x4f,0x31,0x22,0x3a,0x31,0x33,0x2c,0x22,0x72,0x6c,
+0x79,0x54,0x79,0x70,0x65,0x30,0x22,0x3a,0x30,0x2c,0x22,0x72,0x6c,0x79,0x54,0x79,0x70,0x65,0x31,0x22,
+0x3a,0x30,0x7d
+};
\ No newline at end of file
diff --git a/code/espurna/config/devices/041_intermittech_quinled.json.h b/code/espurna/config/devices/041_intermittech_quinled.json.h
new file mode 100644
index 00000000..d1cb4113
--- /dev/null
+++ b/code/espurna/config/devices/041_intermittech_quinled.json.h
@@ -0,0 +1,12 @@
+#define device_config_len 178
+const uint8_t device_config[] PROGMEM = {
+0x7b,0x22,0x62,0x6f,0x61,0x72,0x64,0x22,0x3a,0x34,0x31,0x2c,0x22,0x64,0x65,0x76,0x69,0x63,0x65,0x22,
+0x3a,0x22,0x49,0x4e,0x54,0x45,0x52,0x4d,0x49,0x54,0x54,0x45,0x43,0x48,0x5f,0x51,0x55,0x49,0x4e,0x4c,
+0x45,0x44,0x22,0x2c,0x22,0x6c,0x65,0x64,0x47,0x50,0x49,0x4f,0x30,0x22,0x3a,0x35,0x2c,0x22,0x6c,0x65,
+0x64,0x4c,0x6f,0x67,0x69,0x63,0x30,0x22,0x3a,0x31,0x2c,0x22,0x6c,0x69,0x74,0x43,0x68,0x47,0x50,0x49,
+0x4f,0x30,0x22,0x3a,0x30,0x2c,0x22,0x6c,0x69,0x74,0x43,0x68,0x47,0x50,0x49,0x4f,0x31,0x22,0x3a,0x32,
+0x2c,0x22,0x6c,0x69,0x74,0x43,0x68,0x4c,0x6f,0x67,0x69,0x63,0x30,0x22,0x3a,0x30,0x2c,0x22,0x6c,0x69,
+0x74,0x43,0x68,0x4c,0x6f,0x67,0x69,0x63,0x31,0x22,0x3a,0x30,0x2c,0x22,0x6c,0x69,0x74,0x50,0x72,0x6f,
+0x76,0x69,0x64,0x65,0x72,0x22,0x3a,0x32,0x2c,0x22,0x72,0x6c,0x79,0x43,0x6f,0x75,0x6e,0x74,0x22,0x3a,
+0x31,0x2c,0x22,0x72,0x6c,0x79,0x50,0x72,0x6f,0x76,0x69,0x64,0x65,0x72,0x22,0x3a,0x32,0x7d
+};
\ No newline at end of file
diff --git a/code/espurna/config/devices/042_magichome_led_controller_20.json.h b/code/espurna/config/devices/042_magichome_led_controller_20.json.h
new file mode 100644
index 00000000..224f3013
--- /dev/null
+++ b/code/espurna/config/devices/042_magichome_led_controller_20.json.h
@@ -0,0 +1,18 @@
+#define device_config_len 285
+const uint8_t device_config[] PROGMEM = {
+0x7b,0x22,0x62,0x6f,0x61,0x72,0x64,0x22,0x3a,0x34,0x32,0x2c,0x22,0x64,0x65,0x76,0x69,0x63,0x65,0x22,
+0x3a,0x22,0x4d,0x41,0x47,0x49,0x43,0x48,0x4f,0x4d,0x45,0x5f,0x4c,0x45,0x44,0x5f,0x43,0x4f,0x4e,0x54,
+0x52,0x4f,0x4c,0x4c,0x45,0x52,0x5f,0x32,0x30,0x22,0x2c,0x22,0x69,0x72,0x45,0x6e,0x61,0x62,0x6c,0x65,
+0x64,0x22,0x3a,0x31,0x2c,0x22,0x69,0x72,0x47,0x50,0x49,0x4f,0x22,0x3a,0x34,0x2c,0x22,0x69,0x72,0x53,
+0x65,0x74,0x22,0x3a,0x31,0x2c,0x22,0x6c,0x65,0x64,0x47,0x50,0x49,0x4f,0x30,0x22,0x3a,0x32,0x2c,0x22,
+0x6c,0x65,0x64,0x4c,0x6f,0x67,0x69,0x63,0x30,0x22,0x3a,0x31,0x2c,0x22,0x6c,0x69,0x74,0x43,0x68,0x47,
+0x50,0x49,0x4f,0x30,0x22,0x3a,0x35,0x2c,0x22,0x6c,0x69,0x74,0x43,0x68,0x47,0x50,0x49,0x4f,0x31,0x22,
+0x3a,0x31,0x32,0x2c,0x22,0x6c,0x69,0x74,0x43,0x68,0x47,0x50,0x49,0x4f,0x32,0x22,0x3a,0x31,0x33,0x2c,
+0x22,0x6c,0x69,0x74,0x43,0x68,0x47,0x50,0x49,0x4f,0x33,0x22,0x3a,0x31,0x35,0x2c,0x22,0x6c,0x69,0x74,
+0x43,0x68,0x4c,0x6f,0x67,0x69,0x63,0x30,0x22,0x3a,0x30,0x2c,0x22,0x6c,0x69,0x74,0x43,0x68,0x4c,0x6f,
+0x67,0x69,0x63,0x31,0x22,0x3a,0x30,0x2c,0x22,0x6c,0x69,0x74,0x43,0x68,0x4c,0x6f,0x67,0x69,0x63,0x32,
+0x22,0x3a,0x30,0x2c,0x22,0x6c,0x69,0x74,0x43,0x68,0x4c,0x6f,0x67,0x69,0x63,0x33,0x22,0x3a,0x30,0x2c,
+0x22,0x6c,0x69,0x74,0x50,0x72,0x6f,0x76,0x69,0x64,0x65,0x72,0x22,0x3a,0x32,0x2c,0x22,0x72,0x6c,0x79,
+0x43,0x6f,0x75,0x6e,0x74,0x22,0x3a,0x31,0x2c,0x22,0x72,0x6c,0x79,0x50,0x72,0x6f,0x76,0x69,0x64,0x65,
+0x72,0x22,0x3a,0x32,0x7d
+};
\ No newline at end of file
diff --git a/code/espurna/config/devices/043_arilux_al_lc06.json.h b/code/espurna/config/devices/043_arilux_al_lc06.json.h
new file mode 100644
index 00000000..5045d538
--- /dev/null
+++ b/code/espurna/config/devices/043_arilux_al_lc06.json.h
@@ -0,0 +1,16 @@
+#define device_config_len 242
+const uint8_t device_config[] PROGMEM = {
+0x7b,0x22,0x62,0x6f,0x61,0x72,0x64,0x22,0x3a,0x34,0x33,0x2c,0x22,0x64,0x65,0x76,0x69,0x63,0x65,0x22,
+0x3a,0x22,0x41,0x52,0x49,0x4c,0x55,0x58,0x5f,0x41,0x4c,0x5f,0x4c,0x43,0x30,0x36,0x22,0x2c,0x22,0x6c,
+0x69,0x74,0x43,0x68,0x47,0x50,0x49,0x4f,0x30,0x22,0x3a,0x31,0x34,0x2c,0x22,0x6c,0x69,0x74,0x43,0x68,
+0x47,0x50,0x49,0x4f,0x31,0x22,0x3a,0x31,0x32,0x2c,0x22,0x6c,0x69,0x74,0x43,0x68,0x47,0x50,0x49,0x4f,
+0x32,0x22,0x3a,0x31,0x33,0x2c,0x22,0x6c,0x69,0x74,0x43,0x68,0x47,0x50,0x49,0x4f,0x33,0x22,0x3a,0x31,
+0x35,0x2c,0x22,0x6c,0x69,0x74,0x43,0x68,0x47,0x50,0x49,0x4f,0x34,0x22,0x3a,0x35,0x2c,0x22,0x6c,0x69,
+0x74,0x43,0x68,0x4c,0x6f,0x67,0x69,0x63,0x30,0x22,0x3a,0x30,0x2c,0x22,0x6c,0x69,0x74,0x43,0x68,0x4c,
+0x6f,0x67,0x69,0x63,0x31,0x22,0x3a,0x30,0x2c,0x22,0x6c,0x69,0x74,0x43,0x68,0x4c,0x6f,0x67,0x69,0x63,
+0x32,0x22,0x3a,0x30,0x2c,0x22,0x6c,0x69,0x74,0x43,0x68,0x4c,0x6f,0x67,0x69,0x63,0x33,0x22,0x3a,0x30,
+0x2c,0x22,0x6c,0x69,0x74,0x43,0x68,0x4c,0x6f,0x67,0x69,0x63,0x34,0x22,0x3a,0x30,0x2c,0x22,0x6c,0x69,
+0x74,0x50,0x72,0x6f,0x76,0x69,0x64,0x65,0x72,0x22,0x3a,0x32,0x2c,0x22,0x72,0x6c,0x79,0x43,0x6f,0x75,
+0x6e,0x74,0x22,0x3a,0x31,0x2c,0x22,0x72,0x6c,0x79,0x50,0x72,0x6f,0x76,0x69,0x64,0x65,0x72,0x22,0x3a,
+0x32,0x7d
+};
\ No newline at end of file
diff --git a/code/espurna/config/devices/044_xenon_sm_pw702u.json.h b/code/espurna/config/devices/044_xenon_sm_pw702u.json.h
new file mode 100644
index 00000000..5078a48c
--- /dev/null
+++ b/code/espurna/config/devices/044_xenon_sm_pw702u.json.h
@@ -0,0 +1,10 @@
+#define device_config_len 134
+const uint8_t device_config[] PROGMEM = {
+0x7b,0x22,0x62,0x6f,0x61,0x72,0x64,0x22,0x3a,0x34,0x34,0x2c,0x22,0x62,0x74,0x6e,0x47,0x50,0x49,0x4f,
+0x30,0x22,0x3a,0x31,0x33,0x2c,0x22,0x62,0x74,0x6e,0x4d,0x6f,0x64,0x65,0x30,0x22,0x3a,0x32,0x2c,0x22,
+0x62,0x74,0x6e,0x52,0x65,0x6c,0x61,0x79,0x30,0x22,0x3a,0x30,0x2c,0x22,0x64,0x65,0x76,0x69,0x63,0x65,
+0x22,0x3a,0x22,0x58,0x45,0x4e,0x4f,0x4e,0x5f,0x53,0x4d,0x5f,0x50,0x57,0x37,0x30,0x32,0x55,0x22,0x2c,
+0x22,0x6c,0x65,0x64,0x47,0x50,0x49,0x4f,0x30,0x22,0x3a,0x34,0x2c,0x22,0x6c,0x65,0x64,0x4c,0x6f,0x67,
+0x69,0x63,0x30,0x22,0x3a,0x31,0x2c,0x22,0x72,0x6c,0x79,0x47,0x50,0x49,0x4f,0x30,0x22,0x3a,0x31,0x32,
+0x2c,0x22,0x72,0x6c,0x79,0x54,0x79,0x70,0x65,0x30,0x22,0x3a,0x30,0x7d
+};
\ No newline at end of file
diff --git a/code/espurna/config/devices/045_authometion_lyt8266.json.h b/code/espurna/config/devices/045_authometion_lyt8266.json.h
new file mode 100644
index 00000000..c054f426
--- /dev/null
+++ b/code/espurna/config/devices/045_authometion_lyt8266.json.h
@@ -0,0 +1,16 @@
+#define device_config_len 253
+const uint8_t device_config[] PROGMEM = {
+0x7b,0x22,0x62,0x6f,0x61,0x72,0x64,0x22,0x3a,0x34,0x35,0x2c,0x22,0x64,0x65,0x76,0x69,0x63,0x65,0x22,
+0x3a,0x22,0x41,0x55,0x54,0x48,0x4f,0x4d,0x45,0x54,0x49,0x4f,0x4e,0x5f,0x4c,0x59,0x54,0x38,0x32,0x36,
+0x36,0x22,0x2c,0x22,0x6c,0x69,0x74,0x43,0x68,0x47,0x50,0x49,0x4f,0x30,0x22,0x3a,0x31,0x33,0x2c,0x22,
+0x6c,0x69,0x74,0x43,0x68,0x47,0x50,0x49,0x4f,0x31,0x22,0x3a,0x31,0x32,0x2c,0x22,0x6c,0x69,0x74,0x43,
+0x68,0x47,0x50,0x49,0x4f,0x32,0x22,0x3a,0x31,0x34,0x2c,0x22,0x6c,0x69,0x74,0x43,0x68,0x47,0x50,0x49,
+0x4f,0x33,0x22,0x3a,0x32,0x2c,0x22,0x6c,0x69,0x74,0x43,0x68,0x4c,0x6f,0x67,0x69,0x63,0x30,0x22,0x3a,
+0x30,0x2c,0x22,0x6c,0x69,0x74,0x43,0x68,0x4c,0x6f,0x67,0x69,0x63,0x31,0x22,0x3a,0x30,0x2c,0x22,0x6c,
+0x69,0x74,0x43,0x68,0x4c,0x6f,0x67,0x69,0x63,0x32,0x22,0x3a,0x30,0x2c,0x22,0x6c,0x69,0x74,0x43,0x68,
+0x4c,0x6f,0x67,0x69,0x63,0x33,0x22,0x3a,0x30,0x2c,0x22,0x6c,0x69,0x74,0x45,0x6e,0x61,0x62,0x6c,0x65,
+0x47,0x50,0x49,0x4f,0x22,0x3a,0x31,0x35,0x2c,0x22,0x6c,0x69,0x74,0x45,0x6e,0x61,0x62,0x6c,0x65,0x4c,
+0x6f,0x67,0x69,0x63,0x22,0x3a,0x30,0x2c,0x22,0x6c,0x69,0x74,0x50,0x72,0x6f,0x76,0x69,0x64,0x65,0x72,
+0x22,0x3a,0x32,0x2c,0x22,0x72,0x6c,0x79,0x43,0x6f,0x75,0x6e,0x74,0x22,0x3a,0x31,0x2c,0x22,0x72,0x6c,
+0x79,0x50,0x72,0x6f,0x76,0x69,0x64,0x65,0x72,0x22,0x3a,0x32,0x7d
+};
\ No newline at end of file
diff --git a/code/espurna/config/devices/046_arilux_e27.json.h b/code/espurna/config/devices/046_arilux_e27.json.h
new file mode 100644
index 00000000..e86458f2
--- /dev/null
+++ b/code/espurna/config/devices/046_arilux_e27.json.h
@@ -0,0 +1,11 @@
+#define device_config_len 152
+const uint8_t device_config[] PROGMEM = {
+0x7b,0x22,0x62,0x6f,0x61,0x72,0x64,0x22,0x3a,0x34,0x36,0x2c,0x22,0x64,0x65,0x76,0x69,0x63,0x65,0x22,
+0x3a,0x22,0x41,0x52,0x49,0x4c,0x55,0x58,0x5f,0x45,0x32,0x37,0x22,0x2c,0x22,0x6c,0x69,0x74,0x50,0x72,
+0x6f,0x76,0x69,0x64,0x65,0x72,0x22,0x3a,0x31,0x2c,0x22,0x6d,0x79,0x43,0x68,0x69,0x70,0x73,0x22,0x3a,
+0x31,0x2c,0x22,0x6d,0x79,0x44,0x43,0x4b,0x49,0x47,0x50,0x49,0x4f,0x22,0x3a,0x31,0x35,0x2c,0x22,0x6d,
+0x79,0x44,0x49,0x47,0x50,0x49,0x4f,0x22,0x3a,0x31,0x33,0x2c,0x22,0x6d,0x79,0x4d,0x61,0x70,0x70,0x69,
+0x6e,0x67,0x22,0x3a,0x22,0x30,0x31,0x32,0x33,0x22,0x2c,0x22,0x6d,0x79,0x4d,0x6f,0x64,0x65,0x6c,0x22,
+0x3a,0x30,0x2c,0x22,0x72,0x6c,0x79,0x43,0x6f,0x75,0x6e,0x74,0x22,0x3a,0x31,0x2c,0x22,0x72,0x6c,0x79,
+0x50,0x72,0x6f,0x76,0x69,0x64,0x65,0x72,0x22,0x3a,0x32,0x7d
+};
\ No newline at end of file
diff --git a/code/espurna/config/devices/047_yjzk_switch_2ch.json.h b/code/espurna/config/devices/047_yjzk_switch_2ch.json.h
new file mode 100644
index 00000000..59168eb0
--- /dev/null
+++ b/code/espurna/config/devices/047_yjzk_switch_2ch.json.h
@@ -0,0 +1,13 @@
+#define device_config_len 200
+const uint8_t device_config[] PROGMEM = {
+0x7b,0x22,0x62,0x6f,0x61,0x72,0x64,0x22,0x3a,0x34,0x37,0x2c,0x22,0x62,0x74,0x6e,0x47,0x50,0x49,0x4f,
+0x30,0x22,0x3a,0x30,0x2c,0x22,0x62,0x74,0x6e,0x47,0x50,0x49,0x4f,0x31,0x22,0x3a,0x39,0x2c,0x22,0x62,
+0x74,0x6e,0x4d,0x6f,0x64,0x65,0x30,0x22,0x3a,0x32,0x2c,0x22,0x62,0x74,0x6e,0x4d,0x6f,0x64,0x65,0x31,
+0x22,0x3a,0x32,0x2c,0x22,0x62,0x74,0x6e,0x52,0x65,0x6c,0x61,0x79,0x30,0x22,0x3a,0x30,0x2c,0x22,0x62,
+0x74,0x6e,0x52,0x65,0x6c,0x61,0x79,0x31,0x22,0x3a,0x31,0x2c,0x22,0x64,0x65,0x76,0x69,0x63,0x65,0x22,
+0x3a,0x22,0x59,0x4a,0x5a,0x4b,0x5f,0x53,0x57,0x49,0x54,0x43,0x48,0x5f,0x32,0x43,0x48,0x22,0x2c,0x22,
+0x6c,0x65,0x64,0x47,0x50,0x49,0x4f,0x30,0x22,0x3a,0x31,0x33,0x2c,0x22,0x6c,0x65,0x64,0x4c,0x6f,0x67,
+0x69,0x63,0x30,0x22,0x3a,0x30,0x2c,0x22,0x72,0x6c,0x79,0x47,0x50,0x49,0x4f,0x30,0x22,0x3a,0x31,0x32,
+0x2c,0x22,0x72,0x6c,0x79,0x47,0x50,0x49,0x4f,0x31,0x22,0x3a,0x35,0x2c,0x22,0x72,0x6c,0x79,0x54,0x79,
+0x70,0x65,0x30,0x22,0x3a,0x30,0x2c,0x22,0x72,0x6c,0x79,0x54,0x79,0x70,0x65,0x31,0x22,0x3a,0x30,0x7d
+};
\ No newline at end of file
diff --git a/code/espurna/config/devices/048_itead_sonoff_dual_r2.json.h b/code/espurna/config/devices/048_itead_sonoff_dual_r2.json.h
new file mode 100644
index 00000000..7f84aef1
--- /dev/null
+++ b/code/espurna/config/devices/048_itead_sonoff_dual_r2.json.h
@@ -0,0 +1,16 @@
+#define device_config_len 246
+const uint8_t device_config[] PROGMEM = {
+0x7b,0x22,0x62,0x6f,0x61,0x72,0x64,0x22,0x3a,0x34,0x38,0x2c,0x22,0x62,0x74,0x6e,0x47,0x50,0x49,0x4f,
+0x30,0x22,0x3a,0x30,0x2c,0x22,0x62,0x74,0x6e,0x47,0x50,0x49,0x4f,0x31,0x22,0x3a,0x39,0x2c,0x22,0x62,
+0x74,0x6e,0x47,0x50,0x49,0x4f,0x32,0x22,0x3a,0x31,0x30,0x2c,0x22,0x62,0x74,0x6e,0x4d,0x6f,0x64,0x65,
+0x30,0x22,0x3a,0x32,0x2c,0x22,0x62,0x74,0x6e,0x4d,0x6f,0x64,0x65,0x31,0x22,0x3a,0x32,0x2c,0x22,0x62,
+0x74,0x6e,0x4d,0x6f,0x64,0x65,0x32,0x22,0x3a,0x32,0x2c,0x22,0x62,0x74,0x6e,0x52,0x65,0x6c,0x61,0x79,
+0x30,0x22,0x3a,0x30,0x2c,0x22,0x62,0x74,0x6e,0x52,0x65,0x6c,0x61,0x79,0x31,0x22,0x3a,0x31,0x2c,0x22,
+0x62,0x74,0x6e,0x52,0x65,0x6c,0x61,0x79,0x32,0x22,0x3a,0x30,0x2c,0x22,0x64,0x65,0x76,0x69,0x63,0x65,
+0x22,0x3a,0x22,0x49,0x54,0x45,0x41,0x44,0x5f,0x53,0x4f,0x4e,0x4f,0x46,0x46,0x5f,0x44,0x55,0x41,0x4c,
+0x5f,0x52,0x32,0x22,0x2c,0x22,0x6c,0x65,0x64,0x47,0x50,0x49,0x4f,0x30,0x22,0x3a,0x31,0x33,0x2c,0x22,
+0x6c,0x65,0x64,0x4c,0x6f,0x67,0x69,0x63,0x30,0x22,0x3a,0x31,0x2c,0x22,0x72,0x6c,0x79,0x47,0x50,0x49,
+0x4f,0x30,0x22,0x3a,0x31,0x32,0x2c,0x22,0x72,0x6c,0x79,0x47,0x50,0x49,0x4f,0x31,0x22,0x3a,0x35,0x2c,
+0x22,0x72,0x6c,0x79,0x54,0x79,0x70,0x65,0x30,0x22,0x3a,0x30,0x2c,0x22,0x72,0x6c,0x79,0x54,0x79,0x70,
+0x65,0x31,0x22,0x3a,0x30,0x7d
+};
\ No newline at end of file
diff --git a/code/espurna/config/devices/049_generic_8ch.json.h b/code/espurna/config/devices/049_generic_8ch.json.h
new file mode 100644
index 00000000..d5bb1e72
--- /dev/null
+++ b/code/espurna/config/devices/049_generic_8ch.json.h
@@ -0,0 +1,16 @@
+#define device_config_len 247
+const uint8_t device_config[] PROGMEM = {
+0x7b,0x22,0x62,0x6f,0x61,0x72,0x64,0x22,0x3a,0x34,0x39,0x2c,0x22,0x64,0x65,0x76,0x69,0x63,0x65,0x22,
+0x3a,0x22,0x47,0x45,0x4e,0x45,0x52,0x49,0x43,0x5f,0x38,0x43,0x48,0x22,0x2c,0x22,0x72,0x6c,0x79,0x47,
+0x50,0x49,0x4f,0x30,0x22,0x3a,0x30,0x2c,0x22,0x72,0x6c,0x79,0x47,0x50,0x49,0x4f,0x31,0x22,0x3a,0x32,
+0x2c,0x22,0x72,0x6c,0x79,0x47,0x50,0x49,0x4f,0x32,0x22,0x3a,0x34,0x2c,0x22,0x72,0x6c,0x79,0x47,0x50,
+0x49,0x4f,0x33,0x22,0x3a,0x35,0x2c,0x22,0x72,0x6c,0x79,0x47,0x50,0x49,0x4f,0x34,0x22,0x3a,0x31,0x32,
+0x2c,0x22,0x72,0x6c,0x79,0x47,0x50,0x49,0x4f,0x35,0x22,0x3a,0x31,0x33,0x2c,0x22,0x72,0x6c,0x79,0x47,
+0x50,0x49,0x4f,0x36,0x22,0x3a,0x31,0x34,0x2c,0x22,0x72,0x6c,0x79,0x47,0x50,0x49,0x4f,0x37,0x22,0x3a,
+0x31,0x35,0x2c,0x22,0x72,0x6c,0x79,0x54,0x79,0x70,0x65,0x30,0x22,0x3a,0x30,0x2c,0x22,0x72,0x6c,0x79,
+0x54,0x79,0x70,0x65,0x31,0x22,0x3a,0x30,0x2c,0x22,0x72,0x6c,0x79,0x54,0x79,0x70,0x65,0x32,0x22,0x3a,
+0x30,0x2c,0x22,0x72,0x6c,0x79,0x54,0x79,0x70,0x65,0x33,0x22,0x3a,0x30,0x2c,0x22,0x72,0x6c,0x79,0x54,
+0x79,0x70,0x65,0x34,0x22,0x3a,0x30,0x2c,0x22,0x72,0x6c,0x79,0x54,0x79,0x70,0x65,0x35,0x22,0x3a,0x30,
+0x2c,0x22,0x72,0x6c,0x79,0x54,0x79,0x70,0x65,0x36,0x22,0x3a,0x30,0x2c,0x22,0x72,0x6c,0x79,0x54,0x79,
+0x70,0x65,0x37,0x22,0x3a,0x30,0x7d
+};
\ No newline at end of file
diff --git a/code/espurna/config/devices/050_arilux_al_lc01.json.h b/code/espurna/config/devices/050_arilux_al_lc01.json.h
new file mode 100644
index 00000000..893f3b1e
--- /dev/null
+++ b/code/espurna/config/devices/050_arilux_al_lc01.json.h
@@ -0,0 +1,12 @@
+#define device_config_len 178
+const uint8_t device_config[] PROGMEM = {
+0x7b,0x22,0x62,0x6f,0x61,0x72,0x64,0x22,0x3a,0x35,0x30,0x2c,0x22,0x64,0x65,0x76,0x69,0x63,0x65,0x22,
+0x3a,0x22,0x41,0x52,0x49,0x4c,0x55,0x58,0x5f,0x41,0x4c,0x5f,0x4c,0x43,0x30,0x31,0x22,0x2c,0x22,0x6c,
+0x69,0x74,0x43,0x68,0x47,0x50,0x49,0x4f,0x30,0x22,0x3a,0x35,0x2c,0x22,0x6c,0x69,0x74,0x43,0x68,0x47,
+0x50,0x49,0x4f,0x31,0x22,0x3a,0x31,0x32,0x2c,0x22,0x6c,0x69,0x74,0x43,0x68,0x47,0x50,0x49,0x4f,0x32,
+0x22,0x3a,0x31,0x33,0x2c,0x22,0x6c,0x69,0x74,0x43,0x68,0x4c,0x6f,0x67,0x69,0x63,0x30,0x22,0x3a,0x30,
+0x2c,0x22,0x6c,0x69,0x74,0x43,0x68,0x4c,0x6f,0x67,0x69,0x63,0x31,0x22,0x3a,0x30,0x2c,0x22,0x6c,0x69,
+0x74,0x43,0x68,0x4c,0x6f,0x67,0x69,0x63,0x32,0x22,0x3a,0x30,0x2c,0x22,0x6c,0x69,0x74,0x50,0x72,0x6f,
+0x76,0x69,0x64,0x65,0x72,0x22,0x3a,0x32,0x2c,0x22,0x72,0x6c,0x79,0x43,0x6f,0x75,0x6e,0x74,0x22,0x3a,
+0x31,0x2c,0x22,0x72,0x6c,0x79,0x50,0x72,0x6f,0x76,0x69,0x64,0x65,0x72,0x22,0x3a,0x32,0x7d
+};
\ No newline at end of file
diff --git a/code/espurna/config/devices/051_arilux_al_lc11.json.h b/code/espurna/config/devices/051_arilux_al_lc11.json.h
new file mode 100644
index 00000000..ef4a95a0
--- /dev/null
+++ b/code/espurna/config/devices/051_arilux_al_lc11.json.h
@@ -0,0 +1,16 @@
+#define device_config_len 241
+const uint8_t device_config[] PROGMEM = {
+0x7b,0x22,0x62,0x6f,0x61,0x72,0x64,0x22,0x3a,0x35,0x31,0x2c,0x22,0x64,0x65,0x76,0x69,0x63,0x65,0x22,
+0x3a,0x22,0x41,0x52,0x49,0x4c,0x55,0x58,0x5f,0x41,0x4c,0x5f,0x4c,0x43,0x31,0x31,0x22,0x2c,0x22,0x6c,
+0x69,0x74,0x43,0x68,0x47,0x50,0x49,0x4f,0x30,0x22,0x3a,0x35,0x2c,0x22,0x6c,0x69,0x74,0x43,0x68,0x47,
+0x50,0x49,0x4f,0x31,0x22,0x3a,0x34,0x2c,0x22,0x6c,0x69,0x74,0x43,0x68,0x47,0x50,0x49,0x4f,0x32,0x22,
+0x3a,0x31,0x34,0x2c,0x22,0x6c,0x69,0x74,0x43,0x68,0x47,0x50,0x49,0x4f,0x33,0x22,0x3a,0x31,0x33,0x2c,
+0x22,0x6c,0x69,0x74,0x43,0x68,0x47,0x50,0x49,0x4f,0x34,0x22,0x3a,0x31,0x32,0x2c,0x22,0x6c,0x69,0x74,
+0x43,0x68,0x4c,0x6f,0x67,0x69,0x63,0x30,0x22,0x3a,0x30,0x2c,0x22,0x6c,0x69,0x74,0x43,0x68,0x4c,0x6f,
+0x67,0x69,0x63,0x31,0x22,0x3a,0x30,0x2c,0x22,0x6c,0x69,0x74,0x43,0x68,0x4c,0x6f,0x67,0x69,0x63,0x32,
+0x22,0x3a,0x30,0x2c,0x22,0x6c,0x69,0x74,0x43,0x68,0x4c,0x6f,0x67,0x69,0x63,0x33,0x22,0x3a,0x30,0x2c,
+0x22,0x6c,0x69,0x74,0x43,0x68,0x4c,0x6f,0x67,0x69,0x63,0x34,0x22,0x3a,0x30,0x2c,0x22,0x6c,0x69,0x74,
+0x50,0x72,0x6f,0x76,0x69,0x64,0x65,0x72,0x22,0x3a,0x32,0x2c,0x22,0x72,0x6c,0x79,0x43,0x6f,0x75,0x6e,
+0x74,0x22,0x3a,0x31,0x2c,0x22,0x72,0x6c,0x79,0x50,0x72,0x6f,0x76,0x69,0x64,0x65,0x72,0x22,0x3a,0x32,
+0x7d
+};
\ No newline at end of file
diff --git a/code/espurna/config/devices/052_arilux_al_lc02.json.h b/code/espurna/config/devices/052_arilux_al_lc02.json.h
new file mode 100644
index 00000000..00c87dc4
--- /dev/null
+++ b/code/espurna/config/devices/052_arilux_al_lc02.json.h
@@ -0,0 +1,14 @@
+#define device_config_len 210
+const uint8_t device_config[] PROGMEM = {
+0x7b,0x22,0x62,0x6f,0x61,0x72,0x64,0x22,0x3a,0x35,0x32,0x2c,0x22,0x64,0x65,0x76,0x69,0x63,0x65,0x22,
+0x3a,0x22,0x41,0x52,0x49,0x4c,0x55,0x58,0x5f,0x41,0x4c,0x5f,0x4c,0x43,0x30,0x32,0x22,0x2c,0x22,0x6c,
+0x69,0x74,0x43,0x68,0x47,0x50,0x49,0x4f,0x30,0x22,0x3a,0x31,0x32,0x2c,0x22,0x6c,0x69,0x74,0x43,0x68,
+0x47,0x50,0x49,0x4f,0x31,0x22,0x3a,0x35,0x2c,0x22,0x6c,0x69,0x74,0x43,0x68,0x47,0x50,0x49,0x4f,0x32,
+0x22,0x3a,0x31,0x33,0x2c,0x22,0x6c,0x69,0x74,0x43,0x68,0x47,0x50,0x49,0x4f,0x33,0x22,0x3a,0x31,0x35,
+0x2c,0x22,0x6c,0x69,0x74,0x43,0x68,0x4c,0x6f,0x67,0x69,0x63,0x30,0x22,0x3a,0x30,0x2c,0x22,0x6c,0x69,
+0x74,0x43,0x68,0x4c,0x6f,0x67,0x69,0x63,0x31,0x22,0x3a,0x30,0x2c,0x22,0x6c,0x69,0x74,0x43,0x68,0x4c,
+0x6f,0x67,0x69,0x63,0x32,0x22,0x3a,0x30,0x2c,0x22,0x6c,0x69,0x74,0x43,0x68,0x4c,0x6f,0x67,0x69,0x63,
+0x33,0x22,0x3a,0x30,0x2c,0x22,0x6c,0x69,0x74,0x50,0x72,0x6f,0x76,0x69,0x64,0x65,0x72,0x22,0x3a,0x32,
+0x2c,0x22,0x72,0x6c,0x79,0x43,0x6f,0x75,0x6e,0x74,0x22,0x3a,0x31,0x2c,0x22,0x72,0x6c,0x79,0x50,0x72,
+0x6f,0x76,0x69,0x64,0x65,0x72,0x22,0x3a,0x32,0x7d
+};
\ No newline at end of file
diff --git a/code/espurna/config/devices/053_kmc_70011.json.h b/code/espurna/config/devices/053_kmc_70011.json.h
new file mode 100644
index 00000000..887e0ed3
--- /dev/null
+++ b/code/espurna/config/devices/053_kmc_70011.json.h
@@ -0,0 +1,14 @@
+#define device_config_len 210
+const uint8_t device_config[] PROGMEM = {
+0x7b,0x22,0x62,0x6f,0x61,0x72,0x64,0x22,0x3a,0x35,0x33,0x2c,0x22,0x62,0x74,0x6e,0x47,0x50,0x49,0x4f,
+0x30,0x22,0x3a,0x30,0x2c,0x22,0x62,0x74,0x6e,0x4d,0x6f,0x64,0x65,0x30,0x22,0x3a,0x32,0x2c,0x22,0x62,
+0x74,0x6e,0x52,0x65,0x6c,0x61,0x79,0x30,0x22,0x3a,0x30,0x2c,0x22,0x64,0x65,0x76,0x69,0x63,0x65,0x22,
+0x3a,0x22,0x4b,0x4d,0x43,0x5f,0x37,0x30,0x30,0x31,0x31,0x22,0x2c,0x22,0x68,0x6c,0x77,0x43,0x46,0x31,
+0x47,0x50,0x49,0x4f,0x22,0x3a,0x35,0x2c,0x22,0x68,0x6c,0x77,0x43,0x46,0x47,0x50,0x49,0x4f,0x22,0x3a,
+0x34,0x2c,0x22,0x68,0x6c,0x77,0x45,0x6e,0x61,0x62,0x6c,0x65,0x64,0x22,0x3a,0x31,0x2c,0x22,0x68,0x6c,
+0x77,0x53,0x45,0x4c,0x47,0x50,0x49,0x4f,0x22,0x3a,0x31,0x32,0x2c,0x22,0x68,0x6c,0x77,0x56,0x6f,0x6c,
+0x52,0x65,0x73,0x55,0x70,0x22,0x3a,0x32,0x30,0x30,0x30,0x30,0x30,0x30,0x2c,0x22,0x6c,0x65,0x64,0x47,
+0x50,0x49,0x4f,0x30,0x22,0x3a,0x31,0x33,0x2c,0x22,0x6c,0x65,0x64,0x4c,0x6f,0x67,0x69,0x63,0x30,0x22,
+0x3a,0x30,0x2c,0x22,0x72,0x6c,0x79,0x47,0x50,0x49,0x4f,0x30,0x22,0x3a,0x31,0x34,0x2c,0x22,0x72,0x6c,
+0x79,0x54,0x79,0x70,0x65,0x30,0x22,0x3a,0x30,0x7d
+};
\ No newline at end of file
diff --git a/code/espurna/config/devices/054_gizwits_witty_cloud.json.h b/code/espurna/config/devices/054_gizwits_witty_cloud.json.h
new file mode 100644
index 00000000..ae2cf54f
--- /dev/null
+++ b/code/espurna/config/devices/054_gizwits_witty_cloud.json.h
@@ -0,0 +1,20 @@
+#define device_config_len 334
+const uint8_t device_config[] PROGMEM = {
+0x7b,0x22,0x61,0x6e,0x61,0x45,0x6e,0x61,0x62,0x6c,0x65,0x64,0x22,0x3a,0x31,0x2c,0x22,0x62,0x6f,0x61,
+0x72,0x64,0x22,0x3a,0x35,0x34,0x2c,0x22,0x62,0x74,0x6e,0x43,0x6c,0x69,0x63,0x6b,0x30,0x22,0x3a,0x30,
+0x2c,0x22,0x62,0x74,0x6e,0x44,0x62,0x6c,0x43,0x6c,0x69,0x63,0x6b,0x30,0x22,0x3a,0x30,0x2c,0x22,0x62,
+0x74,0x6e,0x47,0x50,0x49,0x4f,0x30,0x22,0x3a,0x34,0x2c,0x22,0x62,0x74,0x6e,0x4c,0x6e,0x67,0x43,0x6c,
+0x69,0x63,0x6b,0x30,0x22,0x3a,0x30,0x2c,0x22,0x62,0x74,0x6e,0x4c,0x6e,0x67,0x4c,0x6e,0x67,0x43,0x6c,
+0x69,0x63,0x6b,0x30,0x22,0x3a,0x35,0x2c,0x22,0x62,0x74,0x6e,0x4d,0x6f,0x64,0x65,0x30,0x22,0x3a,0x32,
+0x2c,0x22,0x62,0x74,0x6e,0x50,0x72,0x65,0x73,0x73,0x30,0x22,0x3a,0x31,0x2c,0x22,0x64,0x65,0x76,0x69,
+0x63,0x65,0x22,0x3a,0x22,0x47,0x49,0x5a,0x57,0x49,0x54,0x53,0x5f,0x57,0x49,0x54,0x54,0x59,0x5f,0x43,
+0x4c,0x4f,0x55,0x44,0x22,0x2c,0x22,0x6c,0x65,0x64,0x47,0x50,0x49,0x4f,0x30,0x22,0x3a,0x32,0x2c,0x22,
+0x6c,0x65,0x64,0x4c,0x6f,0x67,0x69,0x63,0x30,0x22,0x3a,0x31,0x2c,0x22,0x6c,0x69,0x74,0x43,0x68,0x47,
+0x50,0x49,0x4f,0x30,0x22,0x3a,0x31,0x35,0x2c,0x22,0x6c,0x69,0x74,0x43,0x68,0x47,0x50,0x49,0x4f,0x31,
+0x22,0x3a,0x31,0x32,0x2c,0x22,0x6c,0x69,0x74,0x43,0x68,0x47,0x50,0x49,0x4f,0x32,0x22,0x3a,0x31,0x33,
+0x2c,0x22,0x6c,0x69,0x74,0x43,0x68,0x4c,0x6f,0x67,0x69,0x63,0x30,0x22,0x3a,0x30,0x2c,0x22,0x6c,0x69,
+0x74,0x43,0x68,0x4c,0x6f,0x67,0x69,0x63,0x31,0x22,0x3a,0x30,0x2c,0x22,0x6c,0x69,0x74,0x43,0x68,0x4c,
+0x6f,0x67,0x69,0x63,0x32,0x22,0x3a,0x30,0x2c,0x22,0x6c,0x69,0x74,0x50,0x72,0x6f,0x76,0x69,0x64,0x65,
+0x72,0x22,0x3a,0x32,0x2c,0x22,0x72,0x6c,0x79,0x43,0x6f,0x75,0x6e,0x74,0x22,0x3a,0x31,0x2c,0x22,0x72,
+0x6c,0x79,0x50,0x72,0x6f,0x76,0x69,0x64,0x65,0x72,0x22,0x3a,0x32,0x7d
+};
\ No newline at end of file
diff --git a/code/espurna/config/devices/055_euromate_wifi_stecker_schuko.json.h b/code/espurna/config/devices/055_euromate_wifi_stecker_schuko.json.h
new file mode 100644
index 00000000..2c976965
--- /dev/null
+++ b/code/espurna/config/devices/055_euromate_wifi_stecker_schuko.json.h
@@ -0,0 +1,12 @@
+#define device_config_len 174
+const uint8_t device_config[] PROGMEM = {
+0x7b,0x22,0x62,0x6f,0x61,0x72,0x64,0x22,0x3a,0x35,0x35,0x2c,0x22,0x62,0x74,0x6e,0x47,0x50,0x49,0x4f,
+0x30,0x22,0x3a,0x31,0x34,0x2c,0x22,0x62,0x74,0x6e,0x4d,0x6f,0x64,0x65,0x30,0x22,0x3a,0x36,0x2c,0x22,
+0x62,0x74,0x6e,0x52,0x65,0x6c,0x61,0x79,0x30,0x22,0x3a,0x30,0x2c,0x22,0x64,0x65,0x76,0x69,0x63,0x65,
+0x22,0x3a,0x22,0x45,0x55,0x52,0x4f,0x4d,0x41,0x54,0x45,0x5f,0x57,0x49,0x46,0x49,0x5f,0x53,0x54,0x45,
+0x43,0x4b,0x45,0x52,0x5f,0x53,0x43,0x48,0x55,0x4b,0x4f,0x22,0x2c,0x22,0x6c,0x65,0x64,0x47,0x50,0x49,
+0x4f,0x30,0x22,0x3a,0x34,0x2c,0x22,0x6c,0x65,0x64,0x47,0x50,0x49,0x4f,0x31,0x22,0x3a,0x31,0x32,0x2c,
+0x22,0x6c,0x65,0x64,0x4c,0x6f,0x67,0x69,0x63,0x30,0x22,0x3a,0x30,0x2c,0x22,0x6c,0x65,0x64,0x4c,0x6f,
+0x67,0x69,0x63,0x31,0x22,0x3a,0x30,0x2c,0x22,0x72,0x6c,0x79,0x47,0x50,0x49,0x4f,0x30,0x22,0x3a,0x35,
+0x2c,0x22,0x72,0x6c,0x79,0x54,0x79,0x70,0x65,0x30,0x22,0x3a,0x30,0x7d
+};
\ No newline at end of file
diff --git a/code/espurna/config/devices/056_tonbux_powerstrip02.json.h b/code/espurna/config/devices/056_tonbux_powerstrip02.json.h
new file mode 100644
index 00000000..0283e1fb
--- /dev/null
+++ b/code/espurna/config/devices/056_tonbux_powerstrip02.json.h
@@ -0,0 +1,17 @@
+#define device_config_len 271
+const uint8_t device_config[] PROGMEM = {
+0x7b,0x22,0x62,0x6f,0x61,0x72,0x64,0x22,0x3a,0x35,0x36,0x2c,0x22,0x62,0x74,0x6e,0x47,0x50,0x49,0x4f,
+0x30,0x22,0x3a,0x35,0x2c,0x22,0x62,0x74,0x6e,0x4d,0x6f,0x64,0x65,0x30,0x22,0x3a,0x32,0x2c,0x22,0x62,
+0x74,0x6e,0x52,0x65,0x6c,0x61,0x79,0x30,0x22,0x3a,0x31,0x2c,0x22,0x64,0x65,0x76,0x69,0x63,0x65,0x22,
+0x3a,0x22,0x54,0x4f,0x4e,0x42,0x55,0x58,0x5f,0x50,0x4f,0x57,0x45,0x52,0x53,0x54,0x52,0x49,0x50,0x30,
+0x32,0x22,0x2c,0x22,0x6c,0x65,0x64,0x47,0x50,0x49,0x4f,0x30,0x22,0x3a,0x30,0x2c,0x22,0x6c,0x65,0x64,
+0x47,0x50,0x49,0x4f,0x31,0x22,0x3a,0x33,0x2c,0x22,0x6c,0x65,0x64,0x4c,0x6f,0x67,0x69,0x63,0x30,0x22,
+0x3a,0x31,0x2c,0x22,0x6c,0x65,0x64,0x4c,0x6f,0x67,0x69,0x63,0x31,0x22,0x3a,0x31,0x2c,0x22,0x72,0x6c,
+0x79,0x47,0x50,0x49,0x4f,0x30,0x22,0x3a,0x34,0x2c,0x22,0x72,0x6c,0x79,0x47,0x50,0x49,0x4f,0x31,0x22,
+0x3a,0x31,0x33,0x2c,0x22,0x72,0x6c,0x79,0x47,0x50,0x49,0x4f,0x32,0x22,0x3a,0x31,0x32,0x2c,0x22,0x72,
+0x6c,0x79,0x47,0x50,0x49,0x4f,0x33,0x22,0x3a,0x31,0x34,0x2c,0x22,0x72,0x6c,0x79,0x47,0x50,0x49,0x4f,
+0x34,0x22,0x3a,0x31,0x36,0x2c,0x22,0x72,0x6c,0x79,0x54,0x79,0x70,0x65,0x30,0x22,0x3a,0x31,0x2c,0x22,
+0x72,0x6c,0x79,0x54,0x79,0x70,0x65,0x31,0x22,0x3a,0x31,0x2c,0x22,0x72,0x6c,0x79,0x54,0x79,0x70,0x65,
+0x32,0x22,0x3a,0x31,0x2c,0x22,0x72,0x6c,0x79,0x54,0x79,0x70,0x65,0x33,0x22,0x3a,0x31,0x2c,0x22,0x72,
+0x6c,0x79,0x54,0x79,0x70,0x65,0x34,0x22,0x3a,0x30,0x7d
+};
\ No newline at end of file
diff --git a/code/espurna/config/devices/057_lingan_swa1.json.h b/code/espurna/config/devices/057_lingan_swa1.json.h
new file mode 100644
index 00000000..dfb17bab
--- /dev/null
+++ b/code/espurna/config/devices/057_lingan_swa1.json.h
@@ -0,0 +1,10 @@
+#define device_config_len 129
+const uint8_t device_config[] PROGMEM = {
+0x7b,0x22,0x62,0x6f,0x61,0x72,0x64,0x22,0x3a,0x35,0x37,0x2c,0x22,0x62,0x74,0x6e,0x47,0x50,0x49,0x4f,
+0x30,0x22,0x3a,0x31,0x33,0x2c,0x22,0x62,0x74,0x6e,0x4d,0x6f,0x64,0x65,0x30,0x22,0x3a,0x36,0x2c,0x22,
+0x62,0x74,0x6e,0x52,0x65,0x6c,0x61,0x79,0x30,0x22,0x3a,0x30,0x2c,0x22,0x64,0x65,0x76,0x69,0x63,0x65,
+0x22,0x3a,0x22,0x4c,0x49,0x4e,0x47,0x41,0x4e,0x5f,0x53,0x57,0x41,0x31,0x22,0x2c,0x22,0x6c,0x65,0x64,
+0x47,0x50,0x49,0x4f,0x30,0x22,0x3a,0x34,0x2c,0x22,0x6c,0x65,0x64,0x4c,0x6f,0x67,0x69,0x63,0x30,0x22,
+0x3a,0x31,0x2c,0x22,0x72,0x6c,0x79,0x47,0x50,0x49,0x4f,0x30,0x22,0x3a,0x35,0x2c,0x22,0x72,0x6c,0x79,
+0x54,0x79,0x70,0x65,0x30,0x22,0x3a,0x30,0x7d
+};
\ No newline at end of file
diff --git a/code/espurna/config/devices/058_heygo_hy02.json.h b/code/espurna/config/devices/058_heygo_hy02.json.h
new file mode 100644
index 00000000..45882e44
--- /dev/null
+++ b/code/espurna/config/devices/058_heygo_hy02.json.h
@@ -0,0 +1,10 @@
+#define device_config_len 129
+const uint8_t device_config[] PROGMEM = {
+0x7b,0x22,0x62,0x6f,0x61,0x72,0x64,0x22,0x3a,0x35,0x38,0x2c,0x22,0x62,0x74,0x6e,0x47,0x50,0x49,0x4f,
+0x30,0x22,0x3a,0x31,0x33,0x2c,0x22,0x62,0x74,0x6e,0x4d,0x6f,0x64,0x65,0x30,0x22,0x3a,0x32,0x2c,0x22,
+0x62,0x74,0x6e,0x52,0x65,0x6c,0x61,0x79,0x30,0x22,0x3a,0x30,0x2c,0x22,0x64,0x65,0x76,0x69,0x63,0x65,
+0x22,0x3a,0x22,0x48,0x45,0x59,0x47,0x4f,0x5f,0x48,0x59,0x30,0x32,0x22,0x2c,0x22,0x6c,0x65,0x64,0x47,
+0x50,0x49,0x4f,0x30,0x22,0x3a,0x34,0x2c,0x22,0x6c,0x65,0x64,0x4c,0x6f,0x67,0x69,0x63,0x30,0x22,0x3a,
+0x30,0x2c,0x22,0x72,0x6c,0x79,0x47,0x50,0x49,0x4f,0x30,0x22,0x3a,0x31,0x32,0x2c,0x22,0x72,0x6c,0x79,
+0x54,0x79,0x70,0x65,0x30,0x22,0x3a,0x30,0x7d
+};
\ No newline at end of file
diff --git a/code/espurna/config/devices/059_maxcio_wus002s.json.h b/code/espurna/config/devices/059_maxcio_wus002s.json.h
new file mode 100644
index 00000000..433eed50
--- /dev/null
+++ b/code/espurna/config/devices/059_maxcio_wus002s.json.h
@@ -0,0 +1,15 @@
+#define device_config_len 232
+const uint8_t device_config[] PROGMEM = {
+0x7b,0x22,0x62,0x6f,0x61,0x72,0x64,0x22,0x3a,0x35,0x39,0x2c,0x22,0x62,0x74,0x6e,0x47,0x50,0x49,0x4f,
+0x30,0x22,0x3a,0x32,0x2c,0x22,0x62,0x74,0x6e,0x4d,0x6f,0x64,0x65,0x30,0x22,0x3a,0x32,0x2c,0x22,0x62,
+0x74,0x6e,0x52,0x65,0x6c,0x61,0x79,0x30,0x22,0x3a,0x30,0x2c,0x22,0x64,0x65,0x76,0x69,0x63,0x65,0x22,
+0x3a,0x22,0x4d,0x41,0x58,0x43,0x49,0x4f,0x5f,0x57,0x55,0x53,0x30,0x30,0x32,0x53,0x22,0x2c,0x22,0x68,
+0x6c,0x77,0x43,0x46,0x31,0x47,0x50,0x49,0x4f,0x22,0x3a,0x35,0x2c,0x22,0x68,0x6c,0x77,0x43,0x46,0x47,
+0x50,0x49,0x4f,0x22,0x3a,0x34,0x2c,0x22,0x68,0x6c,0x77,0x43,0x75,0x72,0x52,0x65,0x73,0x22,0x3a,0x30,
+0x2e,0x30,0x30,0x32,0x2c,0x22,0x68,0x6c,0x77,0x45,0x6e,0x61,0x62,0x6c,0x65,0x64,0x22,0x3a,0x31,0x2c,
+0x22,0x68,0x6c,0x77,0x53,0x45,0x4c,0x47,0x50,0x49,0x4f,0x22,0x3a,0x31,0x32,0x2c,0x22,0x68,0x6c,0x77,
+0x56,0x6f,0x6c,0x52,0x65,0x73,0x55,0x70,0x22,0x3a,0x32,0x30,0x30,0x30,0x30,0x30,0x30,0x2c,0x22,0x6c,
+0x65,0x64,0x47,0x50,0x49,0x4f,0x30,0x22,0x3a,0x33,0x2c,0x22,0x6c,0x65,0x64,0x4c,0x6f,0x67,0x69,0x63,
+0x30,0x22,0x3a,0x30,0x2c,0x22,0x72,0x6c,0x79,0x47,0x50,0x49,0x4f,0x30,0x22,0x3a,0x31,0x33,0x2c,0x22,
+0x72,0x6c,0x79,0x54,0x79,0x70,0x65,0x30,0x22,0x3a,0x30,0x7d
+};
\ No newline at end of file
diff --git a/code/espurna/config/devices/060_yidian_xsssa05.json.h b/code/espurna/config/devices/060_yidian_xsssa05.json.h
new file mode 100644
index 00000000..3a90200c
--- /dev/null
+++ b/code/espurna/config/devices/060_yidian_xsssa05.json.h
@@ -0,0 +1,16 @@
+#define device_config_len 242
+const uint8_t device_config[] PROGMEM = {
+0x7b,0x22,0x62,0x6f,0x61,0x72,0x64,0x22,0x3a,0x36,0x30,0x2c,0x22,0x62,0x74,0x6e,0x47,0x50,0x49,0x4f,
+0x30,0x22,0x3a,0x31,0x33,0x2c,0x22,0x62,0x74,0x6e,0x4d,0x6f,0x64,0x65,0x30,0x22,0x3a,0x32,0x2c,0x22,
+0x62,0x74,0x6e,0x52,0x65,0x6c,0x61,0x79,0x30,0x22,0x3a,0x30,0x2c,0x22,0x64,0x65,0x76,0x69,0x63,0x65,
+0x22,0x3a,0x22,0x59,0x49,0x44,0x49,0x41,0x4e,0x5f,0x58,0x53,0x53,0x53,0x41,0x30,0x35,0x22,0x2c,0x22,
+0x68,0x6c,0x77,0x43,0x46,0x31,0x47,0x50,0x49,0x4f,0x22,0x3a,0x31,0x34,0x2c,0x22,0x68,0x6c,0x77,0x43,
+0x46,0x47,0x50,0x49,0x4f,0x22,0x3a,0x35,0x2c,0x22,0x68,0x6c,0x77,0x45,0x6e,0x61,0x62,0x6c,0x65,0x64,
+0x22,0x3a,0x31,0x2c,0x22,0x68,0x6c,0x77,0x53,0x45,0x4c,0x47,0x50,0x49,0x4f,0x22,0x3a,0x33,0x2c,0x22,
+0x68,0x6c,0x77,0x56,0x6f,0x6c,0x52,0x65,0x73,0x55,0x70,0x22,0x3a,0x32,0x34,0x30,0x30,0x30,0x30,0x30,
+0x2c,0x22,0x6c,0x65,0x64,0x47,0x50,0x49,0x4f,0x30,0x22,0x3a,0x34,0x2c,0x22,0x6c,0x65,0x64,0x47,0x50,
+0x49,0x4f,0x32,0x22,0x3a,0x32,0x2c,0x22,0x6c,0x65,0x64,0x4c,0x6f,0x67,0x69,0x63,0x30,0x22,0x3a,0x30,
+0x2c,0x22,0x6c,0x65,0x64,0x4c,0x6f,0x67,0x69,0x63,0x32,0x22,0x3a,0x30,0x2c,0x22,0x72,0x6c,0x79,0x47,
+0x50,0x49,0x4f,0x30,0x22,0x3a,0x31,0x32,0x2c,0x22,0x72,0x6c,0x79,0x54,0x79,0x70,0x65,0x30,0x22,0x3a,
+0x30,0x7d
+};
\ No newline at end of file
diff --git a/code/espurna/config/devices/061_tonbux_xsssa06.json.h b/code/espurna/config/devices/061_tonbux_xsssa06.json.h
new file mode 100644
index 00000000..80b4fa37
--- /dev/null
+++ b/code/espurna/config/devices/061_tonbux_xsssa06.json.h
@@ -0,0 +1,10 @@
+#define device_config_len 133
+const uint8_t device_config[] PROGMEM = {
+0x7b,0x22,0x62,0x6f,0x61,0x72,0x64,0x22,0x3a,0x36,0x31,0x2c,0x22,0x62,0x74,0x6e,0x47,0x50,0x49,0x4f,
+0x30,0x22,0x3a,0x31,0x33,0x2c,0x22,0x62,0x74,0x6e,0x4d,0x6f,0x64,0x65,0x30,0x22,0x3a,0x32,0x2c,0x22,
+0x62,0x74,0x6e,0x52,0x65,0x6c,0x61,0x79,0x30,0x22,0x3a,0x30,0x2c,0x22,0x64,0x65,0x76,0x69,0x63,0x65,
+0x22,0x3a,0x22,0x54,0x4f,0x4e,0x42,0x55,0x58,0x5f,0x58,0x53,0x53,0x53,0x41,0x30,0x36,0x22,0x2c,0x22,
+0x6c,0x65,0x64,0x47,0x50,0x49,0x4f,0x30,0x22,0x3a,0x32,0x2c,0x22,0x6c,0x65,0x64,0x4c,0x6f,0x67,0x69,
+0x63,0x30,0x22,0x3a,0x30,0x2c,0x22,0x72,0x6c,0x79,0x47,0x50,0x49,0x4f,0x30,0x22,0x3a,0x31,0x35,0x2c,
+0x22,0x72,0x6c,0x79,0x54,0x79,0x70,0x65,0x30,0x22,0x3a,0x30,0x7d
+};
\ No newline at end of file
diff --git a/code/espurna/config/devices/062_green_esp8266relay.json.h b/code/espurna/config/devices/062_green_esp8266relay.json.h
new file mode 100644
index 00000000..76759d3a
--- /dev/null
+++ b/code/espurna/config/devices/062_green_esp8266relay.json.h
@@ -0,0 +1,10 @@
+#define device_config_len 135
+const uint8_t device_config[] PROGMEM = {
+0x7b,0x22,0x62,0x6f,0x61,0x72,0x64,0x22,0x3a,0x36,0x32,0x2c,0x22,0x62,0x74,0x6e,0x47,0x50,0x49,0x4f,
+0x30,0x22,0x3a,0x35,0x2c,0x22,0x62,0x74,0x6e,0x4d,0x6f,0x64,0x65,0x30,0x22,0x3a,0x32,0x2c,0x22,0x62,
+0x74,0x6e,0x52,0x65,0x6c,0x61,0x79,0x30,0x22,0x3a,0x30,0x2c,0x22,0x64,0x65,0x76,0x69,0x63,0x65,0x22,
+0x3a,0x22,0x47,0x52,0x45,0x45,0x4e,0x5f,0x45,0x53,0x50,0x38,0x32,0x36,0x36,0x52,0x45,0x4c,0x41,0x59,
+0x22,0x2c,0x22,0x6c,0x65,0x64,0x47,0x50,0x49,0x4f,0x30,0x22,0x3a,0x32,0x2c,0x22,0x6c,0x65,0x64,0x4c,
+0x6f,0x67,0x69,0x63,0x30,0x22,0x3a,0x31,0x2c,0x22,0x72,0x6c,0x79,0x47,0x50,0x49,0x4f,0x30,0x22,0x3a,
+0x34,0x2c,0x22,0x72,0x6c,0x79,0x54,0x79,0x70,0x65,0x30,0x22,0x3a,0x30,0x7d
+};
\ No newline at end of file
diff --git a/code/espurna/config/devices/063_ike_espike.json.h b/code/espurna/config/devices/063_ike_espike.json.h
new file mode 100644
index 00000000..6a6f897c
--- /dev/null
+++ b/code/espurna/config/devices/063_ike_espike.json.h
@@ -0,0 +1,19 @@
+#define device_config_len 317
+const uint8_t device_config[] PROGMEM = {
+0x7b,0x22,0x62,0x6f,0x61,0x72,0x64,0x22,0x3a,0x36,0x33,0x2c,0x22,0x62,0x74,0x6e,0x44,0x62,0x6c,0x43,
+0x6c,0x69,0x63,0x6b,0x30,0x22,0x3a,0x30,0x2c,0x22,0x62,0x74,0x6e,0x47,0x50,0x49,0x4f,0x30,0x22,0x3a,
+0x31,0x33,0x2c,0x22,0x62,0x74,0x6e,0x47,0x50,0x49,0x4f,0x31,0x22,0x3a,0x31,0x32,0x2c,0x22,0x62,0x74,
+0x6e,0x47,0x50,0x49,0x4f,0x32,0x22,0x3a,0x31,0x34,0x2c,0x22,0x62,0x74,0x6e,0x4c,0x6e,0x67,0x43,0x6c,
+0x69,0x63,0x6b,0x30,0x22,0x3a,0x30,0x2c,0x22,0x62,0x74,0x6e,0x4c,0x6e,0x67,0x4c,0x6e,0x67,0x43,0x6c,
+0x69,0x63,0x6b,0x30,0x22,0x3a,0x30,0x2c,0x22,0x62,0x74,0x6e,0x4d,0x6f,0x64,0x65,0x30,0x22,0x3a,0x32,
+0x2c,0x22,0x62,0x74,0x6e,0x4d,0x6f,0x64,0x65,0x31,0x22,0x3a,0x32,0x2c,0x22,0x62,0x74,0x6e,0x4d,0x6f,
+0x64,0x65,0x32,0x22,0x3a,0x32,0x2c,0x22,0x62,0x74,0x6e,0x52,0x65,0x6c,0x61,0x79,0x30,0x22,0x3a,0x30,
+0x2c,0x22,0x62,0x74,0x6e,0x52,0x65,0x6c,0x61,0x79,0x31,0x22,0x3a,0x31,0x2c,0x22,0x62,0x74,0x6e,0x52,
+0x65,0x6c,0x61,0x79,0x32,0x22,0x3a,0x32,0x2c,0x22,0x64,0x65,0x76,0x69,0x63,0x65,0x22,0x3a,0x22,0x49,
+0x4b,0x45,0x5f,0x45,0x53,0x50,0x49,0x4b,0x45,0x22,0x2c,0x22,0x6c,0x65,0x64,0x47,0x50,0x49,0x4f,0x30,
+0x22,0x3a,0x32,0x2c,0x22,0x6c,0x65,0x64,0x4c,0x6f,0x67,0x69,0x63,0x30,0x22,0x3a,0x31,0x2c,0x22,0x72,
+0x6c,0x79,0x47,0x50,0x49,0x4f,0x30,0x22,0x3a,0x34,0x2c,0x22,0x72,0x6c,0x79,0x47,0x50,0x49,0x4f,0x31,
+0x22,0x3a,0x35,0x2c,0x22,0x72,0x6c,0x79,0x47,0x50,0x49,0x4f,0x32,0x22,0x3a,0x31,0x36,0x2c,0x22,0x72,
+0x6c,0x79,0x54,0x79,0x70,0x65,0x30,0x22,0x3a,0x30,0x2c,0x22,0x72,0x6c,0x79,0x54,0x79,0x70,0x65,0x31,
+0x22,0x3a,0x30,0x2c,0x22,0x72,0x6c,0x79,0x54,0x79,0x70,0x65,0x32,0x22,0x3a,0x30,0x7d
+};
\ No newline at end of file
diff --git a/code/espurna/config/devices/064_arniex_swifitch.json.h b/code/espurna/config/devices/064_arniex_swifitch.json.h
new file mode 100644
index 00000000..1af3159e
--- /dev/null
+++ b/code/espurna/config/devices/064_arniex_swifitch.json.h
@@ -0,0 +1,14 @@
+#define device_config_len 215
+const uint8_t device_config[] PROGMEM = {
+0x7b,0x22,0x62,0x6f,0x61,0x72,0x64,0x22,0x3a,0x36,0x34,0x2c,0x22,0x62,0x74,0x6e,0x43,0x6c,0x69,0x63,
+0x6b,0x30,0x22,0x3a,0x31,0x2c,0x22,0x62,0x74,0x6e,0x44,0x62,0x6c,0x43,0x6c,0x69,0x63,0x6b,0x30,0x22,
+0x3a,0x30,0x2c,0x22,0x62,0x74,0x6e,0x47,0x50,0x49,0x4f,0x30,0x22,0x3a,0x34,0x2c,0x22,0x62,0x74,0x6e,
+0x4c,0x6e,0x67,0x43,0x6c,0x69,0x63,0x6b,0x30,0x22,0x3a,0x30,0x2c,0x22,0x62,0x74,0x6e,0x4c,0x6e,0x67,
+0x4c,0x6e,0x67,0x43,0x6c,0x69,0x63,0x6b,0x30,0x22,0x3a,0x30,0x2c,0x22,0x62,0x74,0x6e,0x4d,0x6f,0x64,
+0x65,0x30,0x22,0x3a,0x36,0x2c,0x22,0x62,0x74,0x6e,0x50,0x72,0x65,0x73,0x73,0x30,0x22,0x3a,0x30,0x2c,
+0x22,0x62,0x74,0x6e,0x52,0x65,0x6c,0x61,0x79,0x30,0x22,0x3a,0x31,0x2c,0x22,0x64,0x65,0x76,0x69,0x63,
+0x65,0x22,0x3a,0x22,0x41,0x52,0x4e,0x49,0x45,0x58,0x5f,0x53,0x57,0x49,0x46,0x49,0x54,0x43,0x48,0x22,
+0x2c,0x22,0x6c,0x65,0x64,0x47,0x50,0x49,0x4f,0x30,0x22,0x3a,0x31,0x32,0x2c,0x22,0x6c,0x65,0x64,0x4c,
+0x6f,0x67,0x69,0x63,0x30,0x22,0x3a,0x31,0x2c,0x22,0x72,0x6c,0x79,0x47,0x50,0x49,0x4f,0x30,0x22,0x3a,
+0x35,0x2c,0x22,0x72,0x6c,0x79,0x54,0x79,0x70,0x65,0x30,0x22,0x3a,0x31,0x7d
+};
\ No newline at end of file
diff --git a/code/espurna/config/devices/065_generic_esp01s_relay_v40.json.h b/code/espurna/config/devices/065_generic_esp01s_relay_v40.json.h
new file mode 100644
index 00000000..8c7e16ce
--- /dev/null
+++ b/code/espurna/config/devices/065_generic_esp01s_relay_v40.json.h
@@ -0,0 +1,9 @@
+#define device_config_len 101
+const uint8_t device_config[] PROGMEM = {
+0x7b,0x22,0x62,0x6f,0x61,0x72,0x64,0x22,0x3a,0x36,0x35,0x2c,0x22,0x64,0x65,0x76,0x69,0x63,0x65,0x22,
+0x3a,0x22,0x47,0x45,0x4e,0x45,0x52,0x49,0x43,0x5f,0x45,0x53,0x50,0x30,0x31,0x53,0x5f,0x52,0x45,0x4c,
+0x41,0x59,0x5f,0x56,0x34,0x30,0x22,0x2c,0x22,0x6c,0x65,0x64,0x47,0x50,0x49,0x4f,0x30,0x22,0x3a,0x32,
+0x2c,0x22,0x6c,0x65,0x64,0x4c,0x6f,0x67,0x69,0x63,0x30,0x22,0x3a,0x30,0x2c,0x22,0x72,0x6c,0x79,0x47,
+0x50,0x49,0x4f,0x30,0x22,0x3a,0x30,0x2c,0x22,0x72,0x6c,0x79,0x54,0x79,0x70,0x65,0x30,0x22,0x3a,0x30,
+0x7d
+};
\ No newline at end of file
diff --git a/code/espurna/config/devices/066_generic_esp01s_rgbled_v10.json.h b/code/espurna/config/devices/066_generic_esp01s_rgbled_v10.json.h
new file mode 100644
index 00000000..8d0aa8eb
--- /dev/null
+++ b/code/espurna/config/devices/066_generic_esp01s_rgbled_v10.json.h
@@ -0,0 +1,7 @@
+#define device_config_len 76
+const uint8_t device_config[] PROGMEM = {
+0x7b,0x22,0x62,0x6f,0x61,0x72,0x64,0x22,0x3a,0x36,0x36,0x2c,0x22,0x64,0x65,0x76,0x69,0x63,0x65,0x22,
+0x3a,0x22,0x47,0x45,0x4e,0x45,0x52,0x49,0x43,0x5f,0x45,0x53,0x50,0x30,0x31,0x53,0x5f,0x52,0x47,0x42,
+0x4c,0x45,0x44,0x5f,0x56,0x31,0x30,0x22,0x2c,0x22,0x6c,0x65,0x64,0x47,0x50,0x49,0x4f,0x30,0x22,0x3a,
+0x32,0x2c,0x22,0x6c,0x65,0x64,0x4c,0x6f,0x67,0x69,0x63,0x30,0x22,0x3a,0x30,0x7d
+};
\ No newline at end of file
diff --git a/code/espurna/config/devices/067_heltec_touchrelay.json.h b/code/espurna/config/devices/067_heltec_touchrelay.json.h
new file mode 100644
index 00000000..d2bc1e5a
--- /dev/null
+++ b/code/espurna/config/devices/067_heltec_touchrelay.json.h
@@ -0,0 +1,9 @@
+#define device_config_len 109
+const uint8_t device_config[] PROGMEM = {
+0x7b,0x22,0x62,0x6f,0x61,0x72,0x64,0x22,0x3a,0x36,0x37,0x2c,0x22,0x62,0x74,0x6e,0x47,0x50,0x49,0x4f,
+0x30,0x22,0x3a,0x31,0x34,0x2c,0x22,0x62,0x74,0x6e,0x4d,0x6f,0x64,0x65,0x30,0x22,0x3a,0x32,0x2c,0x22,
+0x62,0x74,0x6e,0x52,0x65,0x6c,0x61,0x79,0x30,0x22,0x3a,0x31,0x2c,0x22,0x64,0x65,0x76,0x69,0x63,0x65,
+0x22,0x3a,0x22,0x48,0x45,0x4c,0x54,0x45,0x43,0x5f,0x54,0x4f,0x55,0x43,0x48,0x52,0x45,0x4c,0x41,0x59,
+0x22,0x2c,0x22,0x72,0x6c,0x79,0x47,0x50,0x49,0x4f,0x30,0x22,0x3a,0x31,0x32,0x2c,0x22,0x72,0x6c,0x79,
+0x54,0x79,0x70,0x65,0x30,0x22,0x3a,0x30,0x7d
+};
\ No newline at end of file
diff --git a/code/espurna/config/devices/068_generic_esp01s_dht11_v10.json.h b/code/espurna/config/devices/068_generic_esp01s_dht11_v10.json.h
new file mode 100644
index 00000000..f5279eb9
--- /dev/null
+++ b/code/espurna/config/devices/068_generic_esp01s_dht11_v10.json.h
@@ -0,0 +1,8 @@
+#define device_config_len 90
+const uint8_t device_config[] PROGMEM = {
+0x7b,0x22,0x62,0x6f,0x61,0x72,0x64,0x22,0x3a,0x36,0x38,0x2c,0x22,0x64,0x65,0x76,0x69,0x63,0x65,0x22,
+0x3a,0x22,0x47,0x45,0x4e,0x45,0x52,0x49,0x43,0x5f,0x45,0x53,0x50,0x30,0x31,0x53,0x5f,0x44,0x48,0x54,
+0x31,0x31,0x5f,0x56,0x31,0x30,0x22,0x2c,0x22,0x64,0x68,0x74,0x45,0x6e,0x61,0x62,0x6c,0x65,0x64,0x22,
+0x3a,0x31,0x2c,0x22,0x64,0x68,0x74,0x47,0x50,0x49,0x4f,0x30,0x22,0x3a,0x32,0x2c,0x22,0x64,0x68,0x74,
+0x54,0x79,0x70,0x65,0x30,0x22,0x3a,0x31,0x31,0x7d
+};
\ No newline at end of file
diff --git a/code/espurna/config/devices/069_generic_esp01s_ds18b20_v10.json.h b/code/espurna/config/devices/069_generic_esp01s_ds18b20_v10.json.h
new file mode 100644
index 00000000..cd14244a
--- /dev/null
+++ b/code/espurna/config/devices/069_generic_esp01s_ds18b20_v10.json.h
@@ -0,0 +1,7 @@
+#define device_config_len 76
+const uint8_t device_config[] PROGMEM = {
+0x7b,0x22,0x62,0x6f,0x61,0x72,0x64,0x22,0x3a,0x36,0x39,0x2c,0x22,0x64,0x65,0x76,0x69,0x63,0x65,0x22,
+0x3a,0x22,0x47,0x45,0x4e,0x45,0x52,0x49,0x43,0x5f,0x45,0x53,0x50,0x30,0x31,0x53,0x5f,0x44,0x53,0x31,
+0x38,0x42,0x32,0x30,0x5f,0x56,0x31,0x30,0x22,0x2c,0x22,0x64,0x73,0x45,0x6e,0x61,0x62,0x6c,0x65,0x64,
+0x22,0x3a,0x31,0x2c,0x22,0x64,0x73,0x47,0x50,0x49,0x4f,0x30,0x22,0x3a,0x32,0x7d
+};
\ No newline at end of file
diff --git a/code/espurna/config/devices/070_zhilde_eu44_w.json.h b/code/espurna/config/devices/070_zhilde_eu44_w.json.h
new file mode 100644
index 00000000..61d1281a
--- /dev/null
+++ b/code/espurna/config/devices/070_zhilde_eu44_w.json.h
@@ -0,0 +1,16 @@
+#define device_config_len 251
+const uint8_t device_config[] PROGMEM = {
+0x7b,0x22,0x62,0x6f,0x61,0x72,0x64,0x22,0x3a,0x37,0x30,0x2c,0x22,0x62,0x74,0x6e,0x47,0x50,0x49,0x4f,
+0x30,0x22,0x3a,0x33,0x2c,0x22,0x62,0x74,0x6e,0x4d,0x6f,0x64,0x65,0x30,0x22,0x3a,0x32,0x2c,0x22,0x62,
+0x74,0x6e,0x52,0x65,0x6c,0x61,0x79,0x30,0x22,0x3a,0x30,0x2c,0x22,0x64,0x62,0x67,0x53,0x65,0x72,0x69,
+0x61,0x6c,0x22,0x3a,0x30,0x2c,0x22,0x64,0x65,0x76,0x69,0x63,0x65,0x22,0x3a,0x22,0x5a,0x48,0x49,0x4c,
+0x44,0x45,0x5f,0x45,0x55,0x34,0x34,0x5f,0x57,0x22,0x2c,0x22,0x6c,0x65,0x64,0x47,0x50,0x49,0x4f,0x30,
+0x22,0x3a,0x31,0x2c,0x22,0x6c,0x65,0x64,0x4c,0x6f,0x67,0x69,0x63,0x30,0x22,0x3a,0x31,0x2c,0x22,0x72,
+0x6c,0x79,0x47,0x50,0x49,0x4f,0x30,0x22,0x3a,0x35,0x2c,0x22,0x72,0x6c,0x79,0x47,0x50,0x49,0x4f,0x31,
+0x22,0x3a,0x34,0x2c,0x22,0x72,0x6c,0x79,0x47,0x50,0x49,0x4f,0x32,0x22,0x3a,0x31,0x32,0x2c,0x22,0x72,
+0x6c,0x79,0x47,0x50,0x49,0x4f,0x33,0x22,0x3a,0x31,0x33,0x2c,0x22,0x72,0x6c,0x79,0x47,0x50,0x49,0x4f,
+0x34,0x22,0x3a,0x31,0x34,0x2c,0x22,0x72,0x6c,0x79,0x54,0x79,0x70,0x65,0x30,0x22,0x3a,0x30,0x2c,0x22,
+0x72,0x6c,0x79,0x54,0x79,0x70,0x65,0x31,0x22,0x3a,0x30,0x2c,0x22,0x72,0x6c,0x79,0x54,0x79,0x70,0x65,
+0x32,0x22,0x3a,0x30,0x2c,0x22,0x72,0x6c,0x79,0x54,0x79,0x70,0x65,0x33,0x22,0x3a,0x30,0x2c,0x22,0x72,
+0x6c,0x79,0x54,0x79,0x70,0x65,0x34,0x22,0x3a,0x30,0x7d
+};
\ No newline at end of file
diff --git a/code/espurna/config/devices/071_itead_sonoff_pow_r2.json.h b/code/espurna/config/devices/071_itead_sonoff_pow_r2.json.h
new file mode 100644
index 00000000..5c8073b1
--- /dev/null
+++ b/code/espurna/config/devices/071_itead_sonoff_pow_r2.json.h
@@ -0,0 +1,12 @@
+#define device_config_len 179
+const uint8_t device_config[] PROGMEM = {
+0x7b,0x22,0x62,0x6f,0x61,0x72,0x64,0x22,0x3a,0x37,0x31,0x2c,0x22,0x62,0x74,0x6e,0x47,0x50,0x49,0x4f,
+0x30,0x22,0x3a,0x30,0x2c,0x22,0x62,0x74,0x6e,0x4d,0x6f,0x64,0x65,0x30,0x22,0x3a,0x32,0x2c,0x22,0x62,
+0x74,0x6e,0x52,0x65,0x6c,0x61,0x79,0x30,0x22,0x3a,0x30,0x2c,0x22,0x63,0x73,0x65,0x45,0x6e,0x61,0x62,
+0x6c,0x65,0x64,0x22,0x3a,0x31,0x2c,0x22,0x63,0x73,0x65,0x47,0x50,0x49,0x4f,0x22,0x3a,0x31,0x2c,0x22,
+0x64,0x62,0x67,0x53,0x65,0x72,0x69,0x61,0x6c,0x22,0x3a,0x30,0x2c,0x22,0x64,0x65,0x76,0x69,0x63,0x65,
+0x22,0x3a,0x22,0x49,0x54,0x45,0x41,0x44,0x5f,0x53,0x4f,0x4e,0x4f,0x46,0x46,0x5f,0x50,0x4f,0x57,0x5f,
+0x52,0x32,0x22,0x2c,0x22,0x6c,0x65,0x64,0x47,0x50,0x49,0x4f,0x30,0x22,0x3a,0x31,0x33,0x2c,0x22,0x6c,
+0x65,0x64,0x4c,0x6f,0x67,0x69,0x63,0x30,0x22,0x3a,0x31,0x2c,0x22,0x72,0x6c,0x79,0x47,0x50,0x49,0x4f,
+0x30,0x22,0x3a,0x31,0x32,0x2c,0x22,0x72,0x6c,0x79,0x54,0x79,0x70,0x65,0x30,0x22,0x3a,0x30,0x7d
+};
\ No newline at end of file
diff --git a/code/espurna/config/devices/072_luani_hvio.json.h b/code/espurna/config/devices/072_luani_hvio.json.h
new file mode 100644
index 00000000..b5a62c1e
--- /dev/null
+++ b/code/espurna/config/devices/072_luani_hvio.json.h
@@ -0,0 +1,14 @@
+#define device_config_len 213
+const uint8_t device_config[] PROGMEM = {
+0x7b,0x22,0x62,0x6f,0x61,0x72,0x64,0x22,0x3a,0x37,0x32,0x2c,0x22,0x62,0x74,0x6e,0x44,0x62,0x6c,0x43,
+0x6c,0x69,0x63,0x6b,0x30,0x22,0x3a,0x30,0x2c,0x22,0x62,0x74,0x6e,0x47,0x50,0x49,0x4f,0x30,0x22,0x3a,
+0x31,0x32,0x2c,0x22,0x62,0x74,0x6e,0x47,0x50,0x49,0x4f,0x31,0x22,0x3a,0x31,0x33,0x2c,0x22,0x62,0x74,
+0x6e,0x4d,0x6f,0x64,0x65,0x30,0x22,0x3a,0x32,0x2c,0x22,0x62,0x74,0x6e,0x4d,0x6f,0x64,0x65,0x31,0x22,
+0x3a,0x32,0x2c,0x22,0x62,0x74,0x6e,0x52,0x65,0x6c,0x61,0x79,0x30,0x22,0x3a,0x30,0x2c,0x22,0x62,0x74,
+0x6e,0x52,0x65,0x6c,0x61,0x79,0x31,0x22,0x3a,0x31,0x2c,0x22,0x64,0x65,0x76,0x69,0x63,0x65,0x22,0x3a,
+0x22,0x4c,0x55,0x41,0x4e,0x49,0x5f,0x48,0x56,0x49,0x4f,0x22,0x2c,0x22,0x6c,0x65,0x64,0x47,0x50,0x49,
+0x4f,0x30,0x22,0x3a,0x31,0x35,0x2c,0x22,0x6c,0x65,0x64,0x4c,0x6f,0x67,0x69,0x63,0x30,0x22,0x3a,0x30,
+0x2c,0x22,0x72,0x6c,0x79,0x47,0x50,0x49,0x4f,0x30,0x22,0x3a,0x34,0x2c,0x22,0x72,0x6c,0x79,0x47,0x50,
+0x49,0x4f,0x31,0x22,0x3a,0x35,0x2c,0x22,0x72,0x6c,0x79,0x54,0x79,0x70,0x65,0x30,0x22,0x3a,0x30,0x2c,
+0x22,0x72,0x6c,0x79,0x54,0x79,0x70,0x65,0x31,0x22,0x3a,0x30,0x7d
+};
\ No newline at end of file
diff --git a/code/espurna/config/devices/073_allnet_4duino_iot_wlan_relais.json.h b/code/espurna/config/devices/073_allnet_4duino_iot_wlan_relais.json.h
new file mode 100644
index 00000000..0632c899
--- /dev/null
+++ b/code/espurna/config/devices/073_allnet_4duino_iot_wlan_relais.json.h
@@ -0,0 +1,10 @@
+#define device_config_len 126
+const uint8_t device_config[] PROGMEM = {
+0x7b,0x22,0x62,0x6f,0x61,0x72,0x64,0x22,0x3a,0x37,0x33,0x2c,0x22,0x64,0x65,0x76,0x69,0x63,0x65,0x22,
+0x3a,0x22,0x41,0x4c,0x4c,0x4e,0x45,0x54,0x5f,0x34,0x44,0x55,0x49,0x4e,0x4f,0x5f,0x49,0x4f,0x54,0x5f,
+0x57,0x4c,0x41,0x4e,0x5f,0x52,0x45,0x4c,0x41,0x49,0x53,0x22,0x2c,0x22,0x6c,0x65,0x64,0x47,0x50,0x49,
+0x4f,0x30,0x22,0x3a,0x30,0x2c,0x22,0x6c,0x65,0x64,0x4c,0x6f,0x67,0x69,0x63,0x30,0x22,0x3a,0x31,0x2c,
+0x22,0x72,0x6c,0x79,0x47,0x50,0x49,0x4f,0x30,0x22,0x3a,0x31,0x34,0x2c,0x22,0x72,0x6c,0x79,0x52,0x65,
+0x73,0x65,0x74,0x47,0x50,0x49,0x4f,0x30,0x22,0x3a,0x31,0x32,0x2c,0x22,0x72,0x6c,0x79,0x54,0x79,0x70,
+0x65,0x30,0x22,0x3a,0x32,0x7d
+};
\ No newline at end of file
diff --git a/code/espurna/config/devices/074_tonbux_mosquito_killer.json.h b/code/espurna/config/devices/074_tonbux_mosquito_killer.json.h
new file mode 100644
index 00000000..4ca5ef1c
--- /dev/null
+++ b/code/espurna/config/devices/074_tonbux_mosquito_killer.json.h
@@ -0,0 +1,16 @@
+#define device_config_len 251
+const uint8_t device_config[] PROGMEM = {
+0x7b,0x22,0x62,0x6f,0x61,0x72,0x64,0x22,0x3a,0x37,0x34,0x2c,0x22,0x62,0x74,0x6e,0x47,0x50,0x49,0x4f,
+0x30,0x22,0x3a,0x32,0x2c,0x22,0x62,0x74,0x6e,0x4d,0x6f,0x64,0x65,0x30,0x22,0x3a,0x32,0x2c,0x22,0x62,
+0x74,0x6e,0x52,0x65,0x6c,0x61,0x79,0x30,0x22,0x3a,0x30,0x2c,0x22,0x64,0x65,0x76,0x69,0x63,0x65,0x22,
+0x3a,0x22,0x54,0x4f,0x4e,0x42,0x55,0x58,0x5f,0x4d,0x4f,0x53,0x51,0x55,0x49,0x54,0x4f,0x5f,0x4b,0x49,
+0x4c,0x4c,0x45,0x52,0x22,0x2c,0x22,0x6c,0x65,0x64,0x47,0x50,0x49,0x4f,0x30,0x22,0x3a,0x31,0x35,0x2c,
+0x22,0x6c,0x65,0x64,0x47,0x50,0x49,0x4f,0x31,0x22,0x3a,0x31,0x34,0x2c,0x22,0x6c,0x65,0x64,0x47,0x50,
+0x49,0x4f,0x32,0x22,0x3a,0x31,0x32,0x2c,0x22,0x6c,0x65,0x64,0x47,0x50,0x49,0x4f,0x33,0x22,0x3a,0x31,
+0x36,0x2c,0x22,0x6c,0x65,0x64,0x4c,0x6f,0x67,0x69,0x63,0x30,0x22,0x3a,0x31,0x2c,0x22,0x6c,0x65,0x64,
+0x4c,0x6f,0x67,0x69,0x63,0x31,0x22,0x3a,0x31,0x2c,0x22,0x6c,0x65,0x64,0x4c,0x6f,0x67,0x69,0x63,0x32,
+0x22,0x3a,0x30,0x2c,0x22,0x6c,0x65,0x64,0x4c,0x6f,0x67,0x69,0x63,0x33,0x22,0x3a,0x30,0x2c,0x22,0x6c,
+0x65,0x64,0x4d,0x6f,0x64,0x65,0x31,0x22,0x3a,0x38,0x2c,0x22,0x6c,0x65,0x64,0x52,0x65,0x6c,0x61,0x79,
+0x31,0x22,0x3a,0x30,0x2c,0x22,0x72,0x6c,0x79,0x47,0x50,0x49,0x4f,0x30,0x22,0x3a,0x35,0x2c,0x22,0x72,
+0x6c,0x79,0x54,0x79,0x70,0x65,0x30,0x22,0x3a,0x30,0x7d
+};
\ No newline at end of file
diff --git a/code/espurna/config/devices/075_neo_coolcam_nas_wr01w.json.h b/code/espurna/config/devices/075_neo_coolcam_nas_wr01w.json.h
new file mode 100644
index 00000000..58abad51
--- /dev/null
+++ b/code/espurna/config/devices/075_neo_coolcam_nas_wr01w.json.h
@@ -0,0 +1,10 @@
+#define device_config_len 140
+const uint8_t device_config[] PROGMEM = {
+0x7b,0x22,0x62,0x6f,0x61,0x72,0x64,0x22,0x3a,0x37,0x35,0x2c,0x22,0x62,0x74,0x6e,0x47,0x50,0x49,0x4f,
+0x30,0x22,0x3a,0x31,0x33,0x2c,0x22,0x62,0x74,0x6e,0x4d,0x6f,0x64,0x65,0x30,0x22,0x3a,0x32,0x2c,0x22,
+0x62,0x74,0x6e,0x52,0x65,0x6c,0x61,0x79,0x30,0x22,0x3a,0x30,0x2c,0x22,0x64,0x65,0x76,0x69,0x63,0x65,
+0x22,0x3a,0x22,0x4e,0x45,0x4f,0x5f,0x43,0x4f,0x4f,0x4c,0x43,0x41,0x4d,0x5f,0x4e,0x41,0x53,0x5f,0x57,
+0x52,0x30,0x31,0x57,0x22,0x2c,0x22,0x6c,0x65,0x64,0x47,0x50,0x49,0x4f,0x30,0x22,0x3a,0x34,0x2c,0x22,
+0x6c,0x65,0x64,0x4c,0x6f,0x67,0x69,0x63,0x30,0x22,0x3a,0x31,0x2c,0x22,0x72,0x6c,0x79,0x47,0x50,0x49,
+0x4f,0x30,0x22,0x3a,0x31,0x32,0x2c,0x22,0x72,0x6c,0x79,0x54,0x79,0x70,0x65,0x30,0x22,0x3a,0x30,0x7d
+};
\ No newline at end of file
diff --git a/code/espurna/config/devices/076_pilotak_esp_din_v1.json.h b/code/espurna/config/devices/076_pilotak_esp_din_v1.json.h
new file mode 100644
index 00000000..1b29619d
--- /dev/null
+++ b/code/espurna/config/devices/076_pilotak_esp_din_v1.json.h
@@ -0,0 +1,19 @@
+#define device_config_len 302
+const uint8_t device_config[] PROGMEM = {
+0x7b,0x22,0x62,0x6f,0x61,0x72,0x64,0x22,0x3a,0x37,0x36,0x2c,0x22,0x62,0x74,0x6e,0x47,0x50,0x49,0x4f,
+0x30,0x22,0x3a,0x30,0x2c,0x22,0x62,0x74,0x6e,0x4d,0x6f,0x64,0x65,0x30,0x22,0x3a,0x32,0x2c,0x22,0x62,
+0x74,0x6e,0x52,0x65,0x6c,0x61,0x79,0x30,0x22,0x3a,0x30,0x2c,0x22,0x64,0x65,0x76,0x69,0x63,0x65,0x22,
+0x3a,0x22,0x50,0x49,0x4c,0x4f,0x54,0x41,0x4b,0x5f,0x45,0x53,0x50,0x5f,0x44,0x49,0x4e,0x5f,0x56,0x31,
+0x22,0x2c,0x22,0x64,0x69,0x67,0x45,0x6e,0x61,0x62,0x6c,0x65,0x64,0x22,0x3a,0x31,0x2c,0x22,0x64,0x69,
+0x67,0x47,0x50,0x49,0x4f,0x30,0x22,0x3a,0x31,0x36,0x2c,0x22,0x64,0x69,0x67,0x4d,0x6f,0x64,0x65,0x30,
+0x22,0x3a,0x30,0x2c,0x22,0x64,0x73,0x45,0x6e,0x61,0x62,0x6c,0x65,0x64,0x22,0x3a,0x31,0x2c,0x22,0x64,
+0x73,0x47,0x50,0x49,0x4f,0x30,0x22,0x3a,0x32,0x2c,0x22,0x69,0x32,0x63,0x45,0x6e,0x61,0x62,0x6c,0x65,
+0x22,0x3a,0x31,0x2c,0x22,0x69,0x32,0x63,0x53,0x43,0x4c,0x47,0x50,0x49,0x4f,0x22,0x3a,0x31,0x33,0x2c,
+0x22,0x69,0x32,0x63,0x53,0x44,0x41,0x47,0x50,0x49,0x4f,0x22,0x3a,0x31,0x32,0x2c,0x22,0x6c,0x65,0x64,
+0x47,0x50,0x49,0x4f,0x30,0x22,0x3a,0x31,0x35,0x2c,0x22,0x6c,0x65,0x64,0x4c,0x6f,0x67,0x69,0x63,0x30,
+0x22,0x3a,0x30,0x2c,0x22,0x72,0x66,0x45,0x6e,0x61,0x62,0x6c,0x65,0x64,0x22,0x3a,0x31,0x2c,0x22,0x72,
+0x66,0x47,0x50,0x49,0x4f,0x22,0x3a,0x31,0x34,0x2c,0x22,0x72,0x6c,0x79,0x47,0x50,0x49,0x4f,0x30,0x22,
+0x3a,0x34,0x2c,0x22,0x72,0x6c,0x79,0x47,0x50,0x49,0x4f,0x31,0x22,0x3a,0x35,0x2c,0x22,0x72,0x6c,0x79,
+0x54,0x79,0x70,0x65,0x30,0x22,0x3a,0x30,0x2c,0x22,0x72,0x6c,0x79,0x54,0x79,0x70,0x65,0x31,0x22,0x3a,
+0x30,0x7d
+};
\ No newline at end of file
diff --git a/code/espurna/config/devices/077_estink_wifi_power_strip.json.h b/code/espurna/config/devices/077_estink_wifi_power_strip.json.h
new file mode 100644
index 00000000..28d9de1a
--- /dev/null
+++ b/code/espurna/config/devices/077_estink_wifi_power_strip.json.h
@@ -0,0 +1,24 @@
+#define device_config_len 412
+const uint8_t device_config[] PROGMEM = {
+0x7b,0x22,0x62,0x6f,0x61,0x72,0x64,0x22,0x3a,0x37,0x37,0x2c,0x22,0x62,0x74,0x6e,0x47,0x50,0x49,0x4f,
+0x30,0x22,0x3a,0x31,0x36,0x2c,0x22,0x62,0x74,0x6e,0x4d,0x6f,0x64,0x65,0x30,0x22,0x3a,0x32,0x2c,0x22,
+0x62,0x74,0x6e,0x52,0x65,0x6c,0x61,0x79,0x30,0x22,0x3a,0x33,0x2c,0x22,0x64,0x62,0x67,0x53,0x65,0x72,
+0x69,0x61,0x6c,0x22,0x3a,0x30,0x2c,0x22,0x64,0x65,0x76,0x69,0x63,0x65,0x22,0x3a,0x22,0x45,0x53,0x54,
+0x49,0x4e,0x4b,0x5f,0x57,0x49,0x46,0x49,0x5f,0x50,0x4f,0x57,0x45,0x52,0x5f,0x53,0x54,0x52,0x49,0x50,
+0x22,0x2c,0x22,0x6c,0x65,0x64,0x47,0x50,0x49,0x4f,0x30,0x22,0x3a,0x30,0x2c,0x22,0x6c,0x65,0x64,0x47,
+0x50,0x49,0x4f,0x31,0x22,0x3a,0x31,0x32,0x2c,0x22,0x6c,0x65,0x64,0x47,0x50,0x49,0x4f,0x32,0x22,0x3a,
+0x33,0x2c,0x22,0x6c,0x65,0x64,0x47,0x50,0x49,0x4f,0x33,0x22,0x3a,0x35,0x2c,0x22,0x6c,0x65,0x64,0x4c,
+0x6f,0x67,0x69,0x63,0x30,0x22,0x3a,0x31,0x2c,0x22,0x6c,0x65,0x64,0x4c,0x6f,0x67,0x69,0x63,0x31,0x22,
+0x3a,0x31,0x2c,0x22,0x6c,0x65,0x64,0x4c,0x6f,0x67,0x69,0x63,0x32,0x22,0x3a,0x31,0x2c,0x22,0x6c,0x65,
+0x64,0x4c,0x6f,0x67,0x69,0x63,0x33,0x22,0x3a,0x31,0x2c,0x22,0x6c,0x65,0x64,0x4d,0x6f,0x64,0x65,0x30,
+0x22,0x3a,0x34,0x2c,0x22,0x6c,0x65,0x64,0x4d,0x6f,0x64,0x65,0x31,0x22,0x3a,0x32,0x2c,0x22,0x6c,0x65,
+0x64,0x4d,0x6f,0x64,0x65,0x32,0x22,0x3a,0x32,0x2c,0x22,0x6c,0x65,0x64,0x4d,0x6f,0x64,0x65,0x33,0x22,
+0x3a,0x32,0x2c,0x22,0x6c,0x65,0x64,0x52,0x65,0x6c,0x61,0x79,0x31,0x22,0x3a,0x31,0x2c,0x22,0x6c,0x65,
+0x64,0x52,0x65,0x6c,0x61,0x79,0x32,0x22,0x3a,0x32,0x2c,0x22,0x6c,0x65,0x64,0x52,0x65,0x6c,0x61,0x79,
+0x33,0x22,0x3a,0x33,0x2c,0x22,0x72,0x6c,0x79,0x47,0x50,0x49,0x4f,0x30,0x22,0x3a,0x31,0x34,0x2c,0x22,
+0x72,0x6c,0x79,0x47,0x50,0x49,0x4f,0x31,0x22,0x3a,0x31,0x33,0x2c,0x22,0x72,0x6c,0x79,0x47,0x50,0x49,
+0x4f,0x32,0x22,0x3a,0x34,0x2c,0x22,0x72,0x6c,0x79,0x47,0x50,0x49,0x4f,0x33,0x22,0x3a,0x31,0x35,0x2c,
+0x22,0x72,0x6c,0x79,0x54,0x79,0x70,0x65,0x30,0x22,0x3a,0x30,0x2c,0x22,0x72,0x6c,0x79,0x54,0x79,0x70,
+0x65,0x31,0x22,0x3a,0x30,0x2c,0x22,0x72,0x6c,0x79,0x54,0x79,0x70,0x65,0x32,0x22,0x3a,0x30,0x2c,0x22,
+0x72,0x6c,0x79,0x54,0x79,0x70,0x65,0x33,0x22,0x3a,0x30,0x7d
+};
\ No newline at end of file
diff --git a/code/espurna/config/devices/078_bh_onofre.json.h b/code/espurna/config/devices/078_bh_onofre.json.h
new file mode 100644
index 00000000..2d713fef
--- /dev/null
+++ b/code/espurna/config/devices/078_bh_onofre.json.h
@@ -0,0 +1,12 @@
+#define device_config_len 167
+const uint8_t device_config[] PROGMEM = {
+0x7b,0x22,0x62,0x6f,0x61,0x72,0x64,0x22,0x3a,0x37,0x38,0x2c,0x22,0x62,0x74,0x6e,0x47,0x50,0x49,0x4f,
+0x30,0x22,0x3a,0x31,0x32,0x2c,0x22,0x62,0x74,0x6e,0x47,0x50,0x49,0x4f,0x31,0x22,0x3a,0x31,0x33,0x2c,
+0x22,0x62,0x74,0x6e,0x4d,0x6f,0x64,0x65,0x30,0x22,0x3a,0x36,0x2c,0x22,0x62,0x74,0x6e,0x4d,0x6f,0x64,
+0x65,0x31,0x22,0x3a,0x36,0x2c,0x22,0x62,0x74,0x6e,0x52,0x65,0x6c,0x61,0x79,0x30,0x22,0x3a,0x30,0x2c,
+0x22,0x62,0x74,0x6e,0x52,0x65,0x6c,0x61,0x79,0x31,0x22,0x3a,0x31,0x2c,0x22,0x64,0x65,0x76,0x69,0x63,
+0x65,0x22,0x3a,0x22,0x42,0x48,0x5f,0x4f,0x4e,0x4f,0x46,0x52,0x45,0x22,0x2c,0x22,0x72,0x6c,0x79,0x47,
+0x50,0x49,0x4f,0x30,0x22,0x3a,0x34,0x2c,0x22,0x72,0x6c,0x79,0x47,0x50,0x49,0x4f,0x31,0x22,0x3a,0x35,
+0x2c,0x22,0x72,0x6c,0x79,0x54,0x79,0x70,0x65,0x30,0x22,0x3a,0x30,0x2c,0x22,0x72,0x6c,0x79,0x54,0x79,
+0x70,0x65,0x31,0x22,0x3a,0x30,0x7d
+};
\ No newline at end of file
diff --git a/code/espurna/config/devices/079_blitzwolf_bwshp2.json.h b/code/espurna/config/devices/079_blitzwolf_bwshp2.json.h
new file mode 100644
index 00000000..f8892c31
--- /dev/null
+++ b/code/espurna/config/devices/079_blitzwolf_bwshp2.json.h
@@ -0,0 +1,19 @@
+#define device_config_len 316
+const uint8_t device_config[] PROGMEM = {
+0x7b,0x22,0x62,0x6f,0x61,0x72,0x64,0x22,0x3a,0x37,0x39,0x2c,0x22,0x62,0x74,0x6e,0x47,0x50,0x49,0x4f,
+0x30,0x22,0x3a,0x31,0x33,0x2c,0x22,0x62,0x74,0x6e,0x4d,0x6f,0x64,0x65,0x30,0x22,0x3a,0x32,0x2c,0x22,
+0x62,0x74,0x6e,0x52,0x65,0x6c,0x61,0x79,0x30,0x22,0x3a,0x30,0x2c,0x22,0x63,0x75,0x72,0x52,0x61,0x74,
+0x69,0x6f,0x22,0x3a,0x32,0x35,0x37,0x34,0x30,0x2c,0x22,0x64,0x65,0x76,0x69,0x63,0x65,0x22,0x3a,0x22,
+0x42,0x4c,0x49,0x54,0x5a,0x57,0x4f,0x4c,0x46,0x5f,0x42,0x57,0x53,0x48,0x50,0x32,0x22,0x2c,0x22,0x68,
+0x6c,0x77,0x43,0x46,0x31,0x47,0x50,0x49,0x4f,0x22,0x3a,0x31,0x34,0x2c,0x22,0x68,0x6c,0x77,0x43,0x46,
+0x47,0x50,0x49,0x4f,0x22,0x3a,0x35,0x2c,0x22,0x68,0x6c,0x77,0x43,0x75,0x72,0x4c,0x65,0x76,0x65,0x6c,
+0x22,0x3a,0x30,0x2c,0x22,0x68,0x6c,0x77,0x49,0x6e,0x74,0x22,0x3a,0x32,0x2c,0x22,0x68,0x6c,0x77,0x53,
+0x45,0x4c,0x47,0x50,0x49,0x4f,0x22,0x3a,0x31,0x32,0x2c,0x22,0x6c,0x65,0x64,0x47,0x50,0x49,0x4f,0x30,
+0x22,0x3a,0x32,0x2c,0x22,0x6c,0x65,0x64,0x47,0x50,0x49,0x4f,0x31,0x22,0x3a,0x30,0x2c,0x22,0x6c,0x65,
+0x64,0x4c,0x6f,0x67,0x69,0x63,0x30,0x22,0x3a,0x31,0x2c,0x22,0x6c,0x65,0x64,0x4c,0x6f,0x67,0x69,0x63,
+0x31,0x22,0x3a,0x31,0x2c,0x22,0x6c,0x65,0x64,0x4d,0x6f,0x64,0x65,0x31,0x22,0x3a,0x34,0x2c,0x22,0x6c,
+0x65,0x64,0x52,0x65,0x6c,0x61,0x79,0x31,0x22,0x3a,0x30,0x2c,0x22,0x70,0x77,0x72,0x52,0x61,0x74,0x69,
+0x6f,0x22,0x3a,0x33,0x34,0x31,0x34,0x32,0x39,0x30,0x2c,0x22,0x72,0x6c,0x79,0x47,0x50,0x49,0x4f,0x30,
+0x22,0x3a,0x31,0x35,0x2c,0x22,0x72,0x6c,0x79,0x54,0x79,0x70,0x65,0x30,0x22,0x3a,0x30,0x2c,0x22,0x76,
+0x6f,0x6c,0x52,0x61,0x74,0x69,0x6f,0x22,0x3a,0x33,0x31,0x33,0x34,0x30,0x30,0x7d
+};
\ No newline at end of file
diff --git a/code/espurna/config/devices/080_tinkerman_espurna_switch.json.h b/code/espurna/config/devices/080_tinkerman_espurna_switch.json.h
new file mode 100644
index 00000000..468720b5
--- /dev/null
+++ b/code/espurna/config/devices/080_tinkerman_espurna_switch.json.h
@@ -0,0 +1,15 @@
+#define device_config_len 224
+const uint8_t device_config[] PROGMEM = {
+0x7b,0x22,0x62,0x6f,0x61,0x72,0x64,0x22,0x3a,0x38,0x30,0x2c,0x22,0x62,0x74,0x6e,0x43,0x6c,0x69,0x63,
+0x6b,0x30,0x22,0x3a,0x30,0x2c,0x22,0x62,0x74,0x6e,0x44,0x62,0x6c,0x43,0x6c,0x69,0x63,0x6b,0x30,0x22,
+0x3a,0x30,0x2c,0x22,0x62,0x74,0x6e,0x47,0x50,0x49,0x4f,0x30,0x22,0x3a,0x34,0x2c,0x22,0x62,0x74,0x6e,
+0x4c,0x6e,0x67,0x43,0x6c,0x69,0x63,0x6b,0x30,0x22,0x3a,0x30,0x2c,0x22,0x62,0x74,0x6e,0x4c,0x6e,0x67,
+0x4c,0x6e,0x67,0x43,0x6c,0x69,0x63,0x6b,0x30,0x22,0x3a,0x30,0x2c,0x22,0x62,0x74,0x6e,0x4d,0x6f,0x64,
+0x65,0x30,0x22,0x3a,0x30,0x2c,0x22,0x62,0x74,0x6e,0x50,0x72,0x65,0x73,0x73,0x30,0x22,0x3a,0x31,0x2c,
+0x22,0x62,0x74,0x6e,0x52,0x65,0x6c,0x61,0x79,0x30,0x22,0x3a,0x30,0x2c,0x22,0x64,0x65,0x76,0x69,0x63,
+0x65,0x22,0x3a,0x22,0x54,0x49,0x4e,0x4b,0x45,0x52,0x4d,0x41,0x4e,0x5f,0x45,0x53,0x50,0x55,0x52,0x4e,
+0x41,0x5f,0x53,0x57,0x49,0x54,0x43,0x48,0x22,0x2c,0x22,0x6c,0x65,0x64,0x47,0x50,0x49,0x4f,0x30,0x22,
+0x3a,0x32,0x2c,0x22,0x6c,0x65,0x64,0x4c,0x6f,0x67,0x69,0x63,0x30,0x22,0x3a,0x30,0x2c,0x22,0x72,0x6c,
+0x79,0x47,0x50,0x49,0x4f,0x30,0x22,0x3a,0x31,0x32,0x2c,0x22,0x72,0x6c,0x79,0x54,0x79,0x70,0x65,0x30,
+0x22,0x3a,0x30,0x7d
+};
\ No newline at end of file
diff --git a/code/espurna/config/devices/081_itead_sonoff_s31.json.h b/code/espurna/config/devices/081_itead_sonoff_s31.json.h
new file mode 100644
index 00000000..b93d0bfb
--- /dev/null
+++ b/code/espurna/config/devices/081_itead_sonoff_s31.json.h
@@ -0,0 +1,12 @@
+#define device_config_len 176
+const uint8_t device_config[] PROGMEM = {
+0x7b,0x22,0x62,0x6f,0x61,0x72,0x64,0x22,0x3a,0x38,0x31,0x2c,0x22,0x62,0x74,0x6e,0x47,0x50,0x49,0x4f,
+0x30,0x22,0x3a,0x30,0x2c,0x22,0x62,0x74,0x6e,0x4d,0x6f,0x64,0x65,0x30,0x22,0x3a,0x32,0x2c,0x22,0x62,
+0x74,0x6e,0x52,0x65,0x6c,0x61,0x79,0x30,0x22,0x3a,0x30,0x2c,0x22,0x63,0x73,0x65,0x45,0x6e,0x61,0x62,
+0x6c,0x65,0x64,0x22,0x3a,0x31,0x2c,0x22,0x63,0x73,0x65,0x47,0x50,0x49,0x4f,0x22,0x3a,0x31,0x2c,0x22,
+0x64,0x62,0x67,0x53,0x65,0x72,0x69,0x61,0x6c,0x22,0x3a,0x30,0x2c,0x22,0x64,0x65,0x76,0x69,0x63,0x65,
+0x22,0x3a,0x22,0x49,0x54,0x45,0x41,0x44,0x5f,0x53,0x4f,0x4e,0x4f,0x46,0x46,0x5f,0x53,0x33,0x31,0x22,
+0x2c,0x22,0x6c,0x65,0x64,0x47,0x50,0x49,0x4f,0x30,0x22,0x3a,0x31,0x33,0x2c,0x22,0x6c,0x65,0x64,0x4c,
+0x6f,0x67,0x69,0x63,0x30,0x22,0x3a,0x31,0x2c,0x22,0x72,0x6c,0x79,0x47,0x50,0x49,0x4f,0x30,0x22,0x3a,
+0x31,0x32,0x2c,0x22,0x72,0x6c,0x79,0x54,0x79,0x70,0x65,0x30,0x22,0x3a,0x30,0x7d
+};
\ No newline at end of file
diff --git a/code/espurna/config/devices/082_stm_relay.json.h b/code/espurna/config/devices/082_stm_relay.json.h
new file mode 100644
index 00000000..652f78e4
--- /dev/null
+++ b/code/espurna/config/devices/082_stm_relay.json.h
@@ -0,0 +1,7 @@
+#define device_config_len 76
+const uint8_t device_config[] PROGMEM = {
+0x7b,0x22,0x62,0x6f,0x61,0x72,0x64,0x22,0x3a,0x38,0x32,0x2c,0x22,0x64,0x62,0x67,0x53,0x65,0x72,0x69,
+0x61,0x6c,0x22,0x3a,0x30,0x2c,0x22,0x64,0x65,0x76,0x69,0x63,0x65,0x22,0x3a,0x22,0x53,0x54,0x4d,0x5f,
+0x52,0x45,0x4c,0x41,0x59,0x22,0x2c,0x22,0x72,0x6c,0x79,0x43,0x6f,0x75,0x6e,0x74,0x22,0x3a,0x32,0x2c,
+0x22,0x72,0x6c,0x79,0x50,0x72,0x6f,0x76,0x69,0x64,0x65,0x72,0x22,0x3a,0x34,0x7d
+};
\ No newline at end of file
diff --git a/code/espurna/config/devices/083_vanzavanzu_smart_wifi_plug_mini.json.h b/code/espurna/config/devices/083_vanzavanzu_smart_wifi_plug_mini.json.h
new file mode 100644
index 00000000..6515cd19
--- /dev/null
+++ b/code/espurna/config/devices/083_vanzavanzu_smart_wifi_plug_mini.json.h
@@ -0,0 +1,20 @@
+#define device_config_len 330
+const uint8_t device_config[] PROGMEM = {
+0x7b,0x22,0x62,0x6f,0x61,0x72,0x64,0x22,0x3a,0x38,0x33,0x2c,0x22,0x62,0x74,0x6e,0x47,0x50,0x49,0x4f,
+0x30,0x22,0x3a,0x31,0x33,0x2c,0x22,0x62,0x74,0x6e,0x4d,0x6f,0x64,0x65,0x30,0x22,0x3a,0x32,0x2c,0x22,
+0x62,0x74,0x6e,0x52,0x65,0x6c,0x61,0x79,0x30,0x22,0x3a,0x30,0x2c,0x22,0x63,0x75,0x72,0x52,0x61,0x74,
+0x69,0x6f,0x22,0x3a,0x32,0x35,0x37,0x34,0x30,0x2c,0x22,0x64,0x65,0x76,0x69,0x63,0x65,0x22,0x3a,0x22,
+0x56,0x41,0x4e,0x5a,0x41,0x56,0x41,0x4e,0x5a,0x55,0x5f,0x53,0x4d,0x41,0x52,0x54,0x5f,0x57,0x49,0x46,
+0x49,0x5f,0x50,0x4c,0x55,0x47,0x5f,0x4d,0x49,0x4e,0x49,0x22,0x2c,0x22,0x68,0x6c,0x77,0x43,0x46,0x31,
+0x47,0x50,0x49,0x4f,0x22,0x3a,0x31,0x34,0x2c,0x22,0x68,0x6c,0x77,0x43,0x46,0x47,0x50,0x49,0x4f,0x22,
+0x3a,0x35,0x2c,0x22,0x68,0x6c,0x77,0x43,0x75,0x72,0x4c,0x65,0x76,0x65,0x6c,0x22,0x3a,0x30,0x2c,0x22,
+0x68,0x6c,0x77,0x49,0x6e,0x74,0x22,0x3a,0x32,0x2c,0x22,0x68,0x6c,0x77,0x53,0x45,0x4c,0x47,0x50,0x49,
+0x4f,0x22,0x3a,0x33,0x2c,0x22,0x6c,0x65,0x64,0x47,0x50,0x49,0x4f,0x30,0x22,0x3a,0x32,0x2c,0x22,0x6c,
+0x65,0x64,0x47,0x50,0x49,0x4f,0x31,0x22,0x3a,0x30,0x2c,0x22,0x6c,0x65,0x64,0x4c,0x6f,0x67,0x69,0x63,
+0x30,0x22,0x3a,0x31,0x2c,0x22,0x6c,0x65,0x64,0x4c,0x6f,0x67,0x69,0x63,0x31,0x22,0x3a,0x31,0x2c,0x22,
+0x6c,0x65,0x64,0x4d,0x6f,0x64,0x65,0x31,0x22,0x3a,0x34,0x2c,0x22,0x6c,0x65,0x64,0x52,0x65,0x6c,0x61,
+0x79,0x31,0x22,0x3a,0x30,0x2c,0x22,0x70,0x77,0x72,0x52,0x61,0x74,0x69,0x6f,0x22,0x3a,0x33,0x34,0x31,
+0x34,0x32,0x39,0x30,0x2c,0x22,0x72,0x6c,0x79,0x47,0x50,0x49,0x4f,0x30,0x22,0x3a,0x31,0x35,0x2c,0x22,
+0x72,0x6c,0x79,0x54,0x79,0x70,0x65,0x30,0x22,0x3a,0x30,0x2c,0x22,0x76,0x6f,0x6c,0x52,0x61,0x74,0x69,
+0x6f,0x22,0x3a,0x33,0x31,0x33,0x34,0x30,0x30,0x7d
+};
\ No newline at end of file
diff --git a/code/espurna/config/devices/084_generic_geiger_counter.json.h b/code/espurna/config/devices/084_generic_geiger_counter.json.h
new file mode 100644
index 00000000..76dfdc47
--- /dev/null
+++ b/code/espurna/config/devices/084_generic_geiger_counter.json.h
@@ -0,0 +1,7 @@
+#define device_config_len 61
+const uint8_t device_config[] PROGMEM = {
+0x7b,0x22,0x62,0x6f,0x61,0x72,0x64,0x22,0x3a,0x38,0x34,0x2c,0x22,0x64,0x65,0x76,0x69,0x63,0x65,0x22,
+0x3a,0x22,0x47,0x45,0x4e,0x45,0x52,0x49,0x43,0x5f,0x47,0x45,0x49,0x47,0x45,0x52,0x5f,0x43,0x4f,0x55,
+0x4e,0x54,0x45,0x52,0x22,0x2c,0x22,0x67,0x65,0x69,0x45,0x6e,0x61,0x62,0x6c,0x65,0x64,0x22,0x3a,0x31,
+0x7d
+};
\ No newline at end of file
diff --git a/code/espurna/config/devices/085_tinkerman_rfm69gw.json.h b/code/espurna/config/devices/085_tinkerman_rfm69gw.json.h
new file mode 100644
index 00000000..7e4eb069
--- /dev/null
+++ b/code/espurna/config/devices/085_tinkerman_rfm69gw.json.h
@@ -0,0 +1,10 @@
+#define device_config_len 136
+const uint8_t device_config[] PROGMEM = {
+0x7b,0x22,0x62,0x6f,0x61,0x72,0x64,0x22,0x3a,0x38,0x35,0x2c,0x22,0x62,0x74,0x6e,0x47,0x50,0x49,0x4f,
+0x30,0x22,0x3a,0x30,0x2c,0x22,0x64,0x65,0x76,0x69,0x63,0x65,0x22,0x3a,0x22,0x54,0x49,0x4e,0x4b,0x45,
+0x52,0x4d,0x41,0x4e,0x5f,0x52,0x46,0x4d,0x36,0x39,0x47,0x57,0x22,0x2c,0x22,0x72,0x66,0x6d,0x36,0x39,
+0x43,0x53,0x47,0x50,0x49,0x4f,0x22,0x3a,0x31,0x35,0x2c,0x22,0x72,0x66,0x6d,0x36,0x39,0x45,0x6e,0x61,
+0x62,0x6c,0x65,0x64,0x22,0x3a,0x31,0x2c,0x22,0x72,0x66,0x6d,0x36,0x39,0x48,0x57,0x22,0x3a,0x30,0x2c,
+0x22,0x72,0x66,0x6d,0x36,0x39,0x49,0x52,0x51,0x47,0x50,0x49,0x4f,0x22,0x3a,0x35,0x2c,0x22,0x72,0x66,
+0x6d,0x36,0x39,0x52,0x65,0x73,0x65,0x74,0x47,0x50,0x49,0x4f,0x22,0x3a,0x37,0x7d
+};
\ No newline at end of file
diff --git a/code/gulpfile.js b/code/gulpfile.js
index d9edbdbd..8a393563 100644
--- a/code/gulpfile.js
+++ b/code/gulpfile.js
@@ -26,75 +26,76 @@ along with this program. If not, see .
// Dependencies
// -----------------------------------------------------------------------------
-const fs = require('fs');
const gulp = require('gulp');
+const runSequence = require('run-sequence');
+const through = require('through2')
+
const htmlmin = require('gulp-htmlmin');
const uglify = require('gulp-uglify');
-const gzip = require('gulp-gzip');
const inline = require('gulp-inline');
const inlineImages = require('gulp-css-base64');
const favicon = require('gulp-base64-favicon');
+const crass = require('gulp-crass');
+
const htmllint = require('gulp-htmllint');
const csslint = require('gulp-csslint');
-const crass = require('gulp-crass');
+const jsonlint = require("gulp-jsonlint");
+
+const concat = require('gulp-concat');
+const gap = require('gulp-append-prepend');
+const rename = require('gulp-rename');
const replace = require('gulp-replace');
const remover = require('gulp-remove-code');
-const map = require('map-stream');
-const rename = require('gulp-rename');
-const runSequence = require('run-sequence');
+const gzip = require('gulp-gzip');
// -----------------------------------------------------------------------------
// Configuration
// -----------------------------------------------------------------------------
+const htmlFolder = 'html/';
+const configFolder = 'espurna/config/';
const dataFolder = 'espurna/data/';
const staticFolder = 'espurna/static/';
+const devicesFolder = 'devices/';
// -----------------------------------------------------------------------------
// Methods
// -----------------------------------------------------------------------------
-var buildHeaderFile = function() {
+var toHeader = function(name, debug) {
String.prototype.replaceAll = function(search, replacement) {
var target = this;
return target.split(search).join(replacement);
};
- return map(function(file, cb) {
+ return through.obj(function (source, encoding, callback) {
- var parts = file.path.split("/");
+ var parts = source.path.split("/");
var filename = parts[parts.length - 1];
- var destination = staticFolder + filename + ".h";
- var safename = "webui_image";
-
- var wstream = fs.createWriteStream(destination);
- wstream.on('error', function (err) {
- console.error(err);
- });
-
- var data = fs.readFileSync(file.path);
-
- wstream.write('#define ' + safename + '_len ' + data.length + '\n');
- wstream.write('const uint8_t ' + safename + '[] PROGMEM = {');
-
- for (var i=0; i 0) output += ',';
+ if (0 === (i % 20)) output += '\n';
+ output += '0x' + ('00' + source.contents[i].toString(16)).slice(-2);
}
+ output += '\n};';
- wstream.write('\n};');
- wstream.end();
+ // clone the contents
+ var destination = source.clone();
+ destination.path = source.path + ".h";
+ destination.contents = Buffer.from(output);
- var fstat = fs.statSync(file.path);
- console.log("Created '" + filename + "' size: " + fstat.size + " bytes");
+ if (debug) {
+ console.info("Image '" + filename + "' \tsize: " + source.contents.length + " bytes");
+ }
- cb(0, destination);
+ callback(null, destination);
});
@@ -128,7 +129,7 @@ var buildWebUI = function(module) {
modules[module] = true;
}
- return gulp.src('html/*.html').
+ return gulp.src(htmlFolder + '*.html').
pipe(htmllint({
'failOnError': true,
'rules': {
@@ -138,7 +139,7 @@ var buildWebUI = function(module) {
}, htmllintReporter)).
pipe(favicon()).
pipe(inline({
- base: 'html/',
+ base: htmlFolder,
js: [],
css: [crass, inlineImages],
disabledTypes: ['svg', 'img']
@@ -153,7 +154,9 @@ var buildWebUI = function(module) {
pipe(replace('pure-', 'p-')).
pipe(gzip()).
pipe(rename("index." + module + ".html.gz")).
- pipe(gulp.dest(dataFolder));
+ pipe(gulp.dest(dataFolder)).
+ pipe(toHeader("webui_image", true)).
+ pipe(gulp.dest(staticFolder));
};
@@ -161,55 +164,80 @@ var buildWebUI = function(module) {
// Tasks
// -----------------------------------------------------------------------------
-gulp.task('build_certs', function() {
+gulp.task('merge_devices', function() {
+ gulp.src(devicesFolder + '*.json').
+ pipe(concat('devices.js', { newLine: ',' })).
+ pipe(gap.prependText('{ "devices": [')).
+ pipe(gap.appendText(']}')).
+ pipe(replace(' ', '')).
+ pipe(replace('\n', '')).
+ pipe(replace('[', '[\n')).
+ pipe(replace('}', '}\n')).
+ pipe(replace('}\n,', '},\n')).
+ pipe(jsonlint()).
+ pipe(jsonlint.reporter(function (file) {
+ console.error('File ' + file.path + ' is not valid JSON.');
+ })).
+ pipe(gulp.dest(htmlFolder));
+});
+
+gulp.task('devices', function() {
+ gulp.src(devicesFolder + '*.json').
+ pipe(replace(' ', '')).
+ pipe(replace('\n', '')).
+ pipe(jsonlint()).
+ pipe(jsonlint.reporter(function (file) {
+ console.error('File ' + file.path + ' is not valid JSON.');
+ })).
+ pipe(toHeader("device_config", false)).
+ pipe(gulp.dest(configFolder + "devices/"));
+});
+
+gulp.task('certs', function() {
gulp.src(dataFolder + 'server.*').
- pipe(buildHeaderFile());
+ pipe(toHeader(debug=false)).
+ pipe(gulp.dest(staticFolder));
});
gulp.task('csslint', function() {
- gulp.src('html/*.css').
+ gulp.src(htmlFolder + '*.css').
pipe(csslint({ids: false})).
pipe(csslint.formatter());
});
-gulp.task('build_webui_small', function() {
+gulp.task('webui_small', function() {
return buildWebUI("small");
})
-gulp.task('build_webui_sensor', function() {
+gulp.task('webui_sensor', function() {
return buildWebUI("sensor");
})
-gulp.task('build_webui_light', function() {
+gulp.task('webui_light', function() {
return buildWebUI("light");
})
-gulp.task('build_webui_rfbridge', function() {
+gulp.task('webui_rfbridge', function() {
return buildWebUI("rfbridge");
})
-gulp.task('build_webui_rfm69', function() {
+gulp.task('webui_rfm69', function() {
return buildWebUI("rfm69");
})
-gulp.task('build_webui_all', function() {
+gulp.task('webui_all', function() {
return buildWebUI("all");
})
-gulp.task('buildfs_inline', function(cb) {
+gulp.task('webui', ['devices'], function(cb) {
runSequence([
- 'build_webui_small',
- 'build_webui_sensor',
- 'build_webui_light',
- 'build_webui_rfbridge',
- 'build_webui_rfm69',
- 'build_webui_all'
+ 'webui_small',
+ 'webui_sensor',
+ 'webui_light',
+ 'webui_rfbridge',
+ 'webui_rfm69',
+ 'webui_all'
], cb);
});
-gulp.task('buildfs_embeded', ['buildfs_inline'], function() {
- gulp.src(dataFolder + 'index.*').
- pipe(buildHeaderFile());
-});
-
-gulp.task('default', ['buildfs_embeded']);
+gulp.task('default', ['webui']);
diff --git a/code/html/devices.js b/code/html/devices.js
new file mode 100644
index 00000000..ae42afb2
--- /dev/null
+++ b/code/html/devices.js
@@ -0,0 +1,87 @@
+{"devices":[
+{"board":1,"device":"GENERIC_CUSTOM"},
+{"board":2,"btnGPIO0":0,"btnMode0":2,"btnRelay0":0,"device":"NODEMCU_LOLIN","ledGPIO0":2,"ledLogic0":1,"rlyGPIO0":12,"rlyType0":0},
+{"board":3,"btnGPIO0":0,"btnMode0":2,"btnRelay0":0,"device":"WEMOS_D1_MINI_RELAYSHIELD","ledGPIO0":2,"ledLogic0":1,"rlyGPIO0":5,"rlyType0":0},
+{"board":4,"btnGPIO0":0,"btnMode0":2,"btnRelay0":0,"device":"ITEAD_SONOFF_BASIC","ledGPIO0":13,"ledLogic0":1,"rlyGPIO0":12,"rlyType0":0},
+{"board":5,"btnGPIO0":0,"btnMode0":2,"btnRelay0":0,"device":"ITEAD_SONOFF_TH","ledGPIO0":13,"ledLogic0":1,"rlyGPIO0":12,"rlyType0":0},
+{"board":6,"btnGPIO0":0,"btnMode0":2,"btnRelay0":0,"device":"ITEAD_SONOFF_SV","ledGPIO0":13,"ledLogic0":1,"rlyGPIO0":12,"rlyType0":0},
+{"board":7,"btnClick0":0,"btnDblClick0":0,"btnGPIO0":0,"btnLngClick0":0,"btnLngLngClick0":5,"btnMode0":2,"btnPress0":1,"btnRelay0":0,"device":"ITEAD_SONOFF_TOUCH","ledGPIO0":13,"ledLogic0":1,"rlyGPIO0":12,"rlyType0":0},
+{"board":8,"btnGPIO0":0,"btnMode0":2,"btnRelay0":0,"device":"ITEAD_SONOFF_POW","hlwCF1GPIO":13,"hlwCFGPIO":14,"hlwEnabled":1,"hlwSELGPIO":5,"ledGPIO0":15,"ledLogic0":0,"rlyGPIO0":12,"rlyType0":0},
+{"board":9,"btnRelay2":0,"dbgBaudrate":19230,"dbgSerial":0,"device":"ITEAD_SONOFF_DUAL","ledGPIO0":13,"ledLogic0":1,"rlyCount":2,"rlyProvider":1},
+{"board":10,"btnGPIO0":0,"btnMode0":2,"btnRelay0":0,"device":"ITEAD_1CH_INCHING","ledGPIO0":13,"ledLogic0":1,"rlyGPIO0":12,"rlyType0":0},
+{"board":11,"btnGPIO0":0,"btnGPIO1":9,"btnGPIO2":10,"btnGPIO3":14,"btnMode0":2,"btnMode1":2,"btnMode2":2,"btnMode3":2,"btnRelay0":0,"btnRelay1":1,"btnRelay2":2,"btnRelay3":3,"device":"ITEAD_SONOFF_4CH","ledGPIO0":13,"ledLogic0":1,"rlyGPIO0":12,"rlyGPIO1":5,"rlyGPIO2":4,"rlyGPIO3":15,"rlyType0":0,"rlyType1":0,"rlyType2":0,"rlyType3":0},
+{"board":12,"btnGPIO0":0,"btnMode0":2,"btnRelay0":0,"device":"ITEAD_SLAMPHER","ledGPIO0":13,"ledLogic0":1,"rlyGPIO0":12,"rlyType0":0},
+{"board":13,"btnGPIO0":0,"btnMode0":2,"btnRelay0":0,"device":"ITEAD_S20","ledGPIO0":13,"ledLogic0":1,"rlyGPIO0":12,"rlyType0":0},
+{"board":14,"btnGPIO0":0,"btnGPIO1":2,"btnMode0":2,"btnMode1":2,"btnRelay0":0,"btnRelay1":1,"device":"ELECTRODRAGON_WIFI_IOT","ledGPIO0":16,"ledLogic0":0,"rlyGPIO0":12,"rlyGPIO1":13,"rlyType0":0,"rlyType1":0},
+{"board":15,"btnGPIO0":13,"btnMode0":2,"btnRelay0":0,"device":"WORKCHOICE_ECOPLUG","ledGPIO0":2,"ledLogic0":0,"rlyGPIO0":15,"rlyType0":0},
+{"board":16,"btnGPIO0":12,"btnGPIO1":13,"btnMode0":2,"btnMode1":2,"btnRelay0":0,"btnRelay1":1,"device":"JANGOE_WIFI_RELAY_NC","rlyGPIO0":2,"rlyGPIO1":14,"rlyType0":1,"rlyType1":1},
+{"board":17,"btnGPIO0":12,"btnGPIO1":13,"btnMode0":2,"btnMode1":2,"btnRelay0":0,"btnRelay1":1,"device":"JANGOE_WIFI_RELAY_NO","rlyGPIO0":2,"rlyGPIO1":14,"rlyType0":0,"rlyType1":0},
+{"board":18,"btnGPIO0":0,"btnMode0":2,"btnRelay0":0,"device":"OPENENERGYMONITOR_MQTT_RELAY","ledGPIO0":16,"ledLogic0":0,"rlyGPIO0":12,"rlyType0":0},
+{"board":19,"device":"JORGEGARCIA_WIFI_RELAYS","rlyGPIO0":0,"rlyGPIO1":2,"rlyType0":1,"rlyType1":1},
+{"board":20,"device":"AITHINKER_AI_LIGHT","litProvider":1,"myChips":1,"myDCKIGPIO":15,"myDIGPIO":13,"myMapping":"0123","myModel":0,"rlyCount":1,"rlyProvider":2},
+{"board":21,"device":"MAGICHOME_LED_CONTROLLER","irEnabled":1,"irGPIO":4,"irSet":1,"ledGPIO0":2,"ledLogic0":1,"litChGPIO0":14,"litChGPIO1":5,"litChGPIO2":12,"litChGPIO3":13,"litChLogic0":0,"litChLogic1":0,"litChLogic2":0,"litChLogic3":0,"litProvider":2,"rlyCount":1,"rlyProvider":2},
+{"board":22,"btnGPIO0":0,"btnMode0":2,"btnRelay0":0,"device":"ITEAD_MOTOR","ledGPIO0":13,"ledLogic0":1,"rlyGPIO0":12,"rlyType0":0},
+{"board":23,"btnGPIO0":4,"btnMode0":2,"btnRelay0":0,"device":"TINKERMAN_ESPURNA_H06","hlwCF1GPIO":13,"hlwCFGPIO":14,"hlwEnabled":1,"hlwSELGPIO":2,"ledGPIO0":5,"ledLogic0":1,"rlyGPIO0":12,"rlyType0":1},
+{"board":24,"dbgPort":1,"dbgRXEnabled":1,"device":"HUACANXING_H801","ledGPIO0":5,"ledLogic0":1,"litChGPIO0":15,"litChGPIO1":13,"litChGPIO2":12,"litChGPIO3":14,"litChGPIO4":4,"litChLogic0":0,"litChLogic1":0,"litChLogic2":0,"litChLogic3":0,"litChLogic4":0,"litProvider":2,"rlyCount":1,"rlyProvider":2},
+{"board":25,"device":"ITEAD_BNSZ01","ledGPIO0":13,"ledLogic0":1,"litChGPIO0":12,"litChLogic0":0,"litProvider":2,"rlyCount":1,"rlyProvider":2},
+{"board":26,"btnGPIO0":0,"btnMode0":2,"dbgBaudrate":19200,"dbgSerial":0,"device":"ITEAD_SONOFF_RFBRIDGE","ledGPIO0":13,"ledLogic0":1,"rfbDirect":0,"rfbRXGPIO":4,"rfbTXGPIO":5,"rlyCount":8,"rlyProvider":3},
+{"board":27,"btnClick0":0,"btnClick1":0,"btnClick2":0,"btnClick3":0,"btnDblClick0":0,"btnGPIO0":0,"btnGPIO1":9,"btnGPIO2":10,"btnGPIO3":14,"btnLngClick0":0,"btnLngLngClick0":0,"btnMode0":2,"btnMode1":2,"btnMode2":2,"btnMode3":2,"btnPress0":1,"btnPress1":1,"btnPress2":1,"btnPress3":1,"btnRelay0":0,"btnRelay1":1,"btnRelay2":2,"btnRelay3":3,"device":"ITEAD_SONOFF_4CH_PRO","ledGPIO0":13,"ledLogic0":1,"rlyGPIO0":12,"rlyGPIO1":5,"rlyGPIO2":4,"rlyGPIO3":15,"rlyType0":0,"rlyType1":0,"rlyType2":0,"rlyType3":0},
+{"board":28,"device":"ITEAD_SONOFF_B1","litChFactor4":0.1,"litChFactor5":0.1,"litProvider":1,"myChips":2,"myDCKIGPIO":14,"myDIGPIO":12,"myMapping":"43501","myModel":1,"rlyCount":1,"rlyProvider":2},
+{"board":29,"device":"ITEAD_SONOFF_LED","ledGPIO0":13,"ledLogic0":1,"litChGPIO0":12,"litChGPIO1":14,"litChLogic0":0,"litChLogic1":0,"litProvider":2,"rlyCount":1,"rlyProvider":2},
+{"board":30,"btnClick0":0,"btnDblClick0":0,"btnGPIO0":0,"btnLngClick0":0,"btnLngLngClick0":5,"btnMode0":2,"btnPress0":1,"btnRelay0":0,"device":"ITEAD_SONOFF_T1_1CH","ledGPIO0":13,"ledLogic0":1,"rlyGPIO0":12,"rlyType0":0},
+{"board":31,"btnClick0":0,"btnClick1":0,"btnDblClick0":0,"btnDblClick1":0,"btnGPIO0":0,"btnGPIO1":9,"btnLngClick0":0,"btnLngClick1":0,"btnLngLngClick0":5,"btnLngLngClick1":5,"btnMode0":2,"btnMode1":2,"btnPress0":1,"btnPress1":1,"btnRelay0":0,"btnRelay1":1,"device":"ITEAD_SONOFF_T1_2CH","ledGPIO0":13,"ledLogic0":1,"rlyGPIO0":12,"rlyGPIO1":5,"rlyType0":0,"rlyType1":0},
+{"board":32,"btnClick0":0,"btnClick1":0,"btnClick2":0,"btnDblClick0":0,"btnDblClick1":0,"btnDblClick2":0,"btnGPIO0":0,"btnGPIO1":9,"btnGPIO2":10,"btnLngClick0":0,"btnLngClick1":0,"btnLngClick2":0,"btnLngLngClick0":5,"btnLngLngClick1":5,"btnLngLngClick2":5,"btnMode0":2,"btnMode1":2,"btnMode2":2,"btnPress0":1,"btnPress1":1,"btnPress2":1,"btnRelay0":0,"btnRelay1":1,"btnRelay2":2,"device":"ITEAD_SONOFF_T1_3CH","ledGPIO0":13,"ledLogic0":1,"rlyGPIO0":12,"rlyGPIO1":5,"rlyGPIO2":4,"rlyType0":0,"rlyType1":0,"rlyType2":0},
+{"board":33,"btnGPIO0":0,"btnMode0":2,"btnRelay0":0,"device":"ITEAD_SONOFF_RF","ledGPIO0":13,"ledLogic0":1,"rlyGPIO0":12,"rlyType0":0},
+{"board":34,"btnGPIO0":13,"btnMode0":2,"btnRelay0":0,"device":"WION_50055","ledGPIO0":2,"ledLogic0":0,"rlyGPIO0":15,"rlyType0":0},
+{"board":35,"btnGPIO0":0,"btnMode0":2,"btnRelay0":0,"device":"EXS_WIFI_RELAY_V31","rlyGPIO0":13,"rlyResetGPIO0":12,"rlyType0":2},
+{"board":36,"dbgPort":1,"dbgRXEnabled":1,"device":"HUACANXING_H802","litChGPIO0":12,"litChGPIO1":14,"litChGPIO2":13,"litChGPIO3":15,"litChLogic0":0,"litChLogic1":0,"litChLogic2":0,"litChLogic3":0,"litProvider":2,"rlyCount":1,"rlyProvider":2},
+{"board":37,"device":"GENERIC_V9261F","v92Enabled":1,"v92GPIO":2,"v92Logic":1},
+{"board":38,"device":"GENERIC_ECH1560","echCLKGPIO":4,"echEnabled":1,"echLogic":1,"echMISOGPIO":5},
+{"board":39,"btnGPIO0":4,"btnMode0":2,"btnRelay0":0,"device":"TINKERMAN_ESPURNA_H08","hlwCF1GPIO":13,"hlwCFGPIO":14,"hlwEnabled":1,"hlwSELGPIO":5,"ledGPIO0":2,"ledLogic0":0,"rlyGPIO0":12,"rlyType0":0},
+{"board":40,"btnGPIO0":4,"btnGPIO1":5,"btnMode0":2,"btnMode1":2,"btnRelay0":0,"btnRelay1":1,"device":"MANCAVEMADE_ESPLIVE","dsEnabled":1,"dsGPIO0":2,"rlyGPIO0":12,"rlyGPIO1":13,"rlyType0":0,"rlyType1":0},
+{"board":41,"device":"INTERMITTECH_QUINLED","ledGPIO0":5,"ledLogic0":1,"litChGPIO0":0,"litChGPIO1":2,"litChLogic0":0,"litChLogic1":0,"litProvider":2,"rlyCount":1,"rlyProvider":2},
+{"board":42,"device":"MAGICHOME_LED_CONTROLLER_20","irEnabled":1,"irGPIO":4,"irSet":1,"ledGPIO0":2,"ledLogic0":1,"litChGPIO0":5,"litChGPIO1":12,"litChGPIO2":13,"litChGPIO3":15,"litChLogic0":0,"litChLogic1":0,"litChLogic2":0,"litChLogic3":0,"litProvider":2,"rlyCount":1,"rlyProvider":2},
+{"board":43,"device":"ARILUX_AL_LC06","litChGPIO0":14,"litChGPIO1":12,"litChGPIO2":13,"litChGPIO3":15,"litChGPIO4":5,"litChLogic0":0,"litChLogic1":0,"litChLogic2":0,"litChLogic3":0,"litChLogic4":0,"litProvider":2,"rlyCount":1,"rlyProvider":2},
+{"board":44,"btnGPIO0":13,"btnMode0":2,"btnRelay0":0,"device":"XENON_SM_PW702U","ledGPIO0":4,"ledLogic0":1,"rlyGPIO0":12,"rlyType0":0},
+{"board":45,"device":"AUTHOMETION_LYT8266","litChGPIO0":13,"litChGPIO1":12,"litChGPIO2":14,"litChGPIO3":2,"litChLogic0":0,"litChLogic1":0,"litChLogic2":0,"litChLogic3":0,"litEnableGPIO":15,"litEnableLogic":0,"litProvider":2,"rlyCount":1,"rlyProvider":2},
+{"board":46,"device":"ARILUX_E27","litProvider":1,"myChips":1,"myDCKIGPIO":15,"myDIGPIO":13,"myMapping":"0123","myModel":0,"rlyCount":1,"rlyProvider":2},
+{"board":47,"btnGPIO0":0,"btnGPIO1":9,"btnMode0":2,"btnMode1":2,"btnRelay0":0,"btnRelay1":1,"device":"YJZK_SWITCH_2CH","ledGPIO0":13,"ledLogic0":0,"rlyGPIO0":12,"rlyGPIO1":5,"rlyType0":0,"rlyType1":0},
+{"board":48,"btnGPIO0":0,"btnGPIO1":9,"btnGPIO2":10,"btnMode0":2,"btnMode1":2,"btnMode2":2,"btnRelay0":0,"btnRelay1":1,"btnRelay2":0,"device":"ITEAD_SONOFF_DUAL_R2","ledGPIO0":13,"ledLogic0":1,"rlyGPIO0":12,"rlyGPIO1":5,"rlyType0":0,"rlyType1":0},
+{"board":49,"device":"GENERIC_8CH","rlyGPIO0":0,"rlyGPIO1":2,"rlyGPIO2":4,"rlyGPIO3":5,"rlyGPIO4":12,"rlyGPIO5":13,"rlyGPIO6":14,"rlyGPIO7":15,"rlyType0":0,"rlyType1":0,"rlyType2":0,"rlyType3":0,"rlyType4":0,"rlyType5":0,"rlyType6":0,"rlyType7":0},
+{"board":50,"device":"ARILUX_AL_LC01","litChGPIO0":5,"litChGPIO1":12,"litChGPIO2":13,"litChLogic0":0,"litChLogic1":0,"litChLogic2":0,"litProvider":2,"rlyCount":1,"rlyProvider":2},
+{"board":51,"device":"ARILUX_AL_LC11","litChGPIO0":5,"litChGPIO1":4,"litChGPIO2":14,"litChGPIO3":13,"litChGPIO4":12,"litChLogic0":0,"litChLogic1":0,"litChLogic2":0,"litChLogic3":0,"litChLogic4":0,"litProvider":2,"rlyCount":1,"rlyProvider":2},
+{"board":52,"device":"ARILUX_AL_LC02","litChGPIO0":12,"litChGPIO1":5,"litChGPIO2":13,"litChGPIO3":15,"litChLogic0":0,"litChLogic1":0,"litChLogic2":0,"litChLogic3":0,"litProvider":2,"rlyCount":1,"rlyProvider":2},
+{"board":53,"btnGPIO0":0,"btnMode0":2,"btnRelay0":0,"device":"KMC_70011","hlwCF1GPIO":5,"hlwCFGPIO":4,"hlwEnabled":1,"hlwSELGPIO":12,"hlwVolResUp":2000000,"ledGPIO0":13,"ledLogic0":0,"rlyGPIO0":14,"rlyType0":0},
+{"anaEnabled":1,"board":54,"btnClick0":0,"btnDblClick0":0,"btnGPIO0":4,"btnLngClick0":0,"btnLngLngClick0":5,"btnMode0":2,"btnPress0":1,"device":"GIZWITS_WITTY_CLOUD","ledGPIO0":2,"ledLogic0":1,"litChGPIO0":15,"litChGPIO1":12,"litChGPIO2":13,"litChLogic0":0,"litChLogic1":0,"litChLogic2":0,"litProvider":2,"rlyCount":1,"rlyProvider":2},
+{"board":55,"btnGPIO0":14,"btnMode0":6,"btnRelay0":0,"device":"EUROMATE_WIFI_STECKER_SCHUKO","ledGPIO0":4,"ledGPIO1":12,"ledLogic0":0,"ledLogic1":0,"rlyGPIO0":5,"rlyType0":0},
+{"board":56,"btnGPIO0":5,"btnMode0":2,"btnRelay0":1,"device":"TONBUX_POWERSTRIP02","ledGPIO0":0,"ledGPIO1":3,"ledLogic0":1,"ledLogic1":1,"rlyGPIO0":4,"rlyGPIO1":13,"rlyGPIO2":12,"rlyGPIO3":14,"rlyGPIO4":16,"rlyType0":1,"rlyType1":1,"rlyType2":1,"rlyType3":1,"rlyType4":0},
+{"board":57,"btnGPIO0":13,"btnMode0":6,"btnRelay0":0,"device":"LINGAN_SWA1","ledGPIO0":4,"ledLogic0":1,"rlyGPIO0":5,"rlyType0":0},
+{"board":58,"btnGPIO0":13,"btnMode0":2,"btnRelay0":0,"device":"HEYGO_HY02","ledGPIO0":4,"ledLogic0":0,"rlyGPIO0":12,"rlyType0":0},
+{"board":59,"btnGPIO0":2,"btnMode0":2,"btnRelay0":0,"device":"MAXCIO_WUS002S","hlwCF1GPIO":5,"hlwCFGPIO":4,"hlwCurRes":0.002,"hlwEnabled":1,"hlwSELGPIO":12,"hlwVolResUp":2000000,"ledGPIO0":3,"ledLogic0":0,"rlyGPIO0":13,"rlyType0":0},
+{"board":60,"btnGPIO0":13,"btnMode0":2,"btnRelay0":0,"device":"YIDIAN_XSSSA05","hlwCF1GPIO":14,"hlwCFGPIO":5,"hlwEnabled":1,"hlwSELGPIO":3,"hlwVolResUp":2400000,"ledGPIO0":4,"ledGPIO2":2,"ledLogic0":0,"ledLogic2":0,"rlyGPIO0":12,"rlyType0":0},
+{"board":61,"btnGPIO0":13,"btnMode0":2,"btnRelay0":0,"device":"TONBUX_XSSSA06","ledGPIO0":2,"ledLogic0":0,"rlyGPIO0":15,"rlyType0":0},
+{"board":62,"btnGPIO0":5,"btnMode0":2,"btnRelay0":0,"device":"GREEN_ESP8266RELAY","ledGPIO0":2,"ledLogic0":1,"rlyGPIO0":4,"rlyType0":0},
+{"board":63,"btnDblClick0":0,"btnGPIO0":13,"btnGPIO1":12,"btnGPIO2":14,"btnLngClick0":0,"btnLngLngClick0":0,"btnMode0":2,"btnMode1":2,"btnMode2":2,"btnRelay0":0,"btnRelay1":1,"btnRelay2":2,"device":"IKE_ESPIKE","ledGPIO0":2,"ledLogic0":1,"rlyGPIO0":4,"rlyGPIO1":5,"rlyGPIO2":16,"rlyType0":0,"rlyType1":0,"rlyType2":0},
+{"board":64,"btnClick0":1,"btnDblClick0":0,"btnGPIO0":4,"btnLngClick0":0,"btnLngLngClick0":0,"btnMode0":6,"btnPress0":0,"btnRelay0":1,"device":"ARNIEX_SWIFITCH","ledGPIO0":12,"ledLogic0":1,"rlyGPIO0":5,"rlyType0":1},
+{"board":65,"device":"GENERIC_ESP01S_RELAY_V40","ledGPIO0":2,"ledLogic0":0,"rlyGPIO0":0,"rlyType0":0},
+{"board":66,"device":"GENERIC_ESP01S_RGBLED_V10","ledGPIO0":2,"ledLogic0":0},
+{"board":67,"btnGPIO0":14,"btnMode0":2,"btnRelay0":1,"device":"HELTEC_TOUCHRELAY","rlyGPIO0":12,"rlyType0":0},
+{"board":68,"device":"GENERIC_ESP01S_DHT11_V10","dhtEnabled":1,"dhtGPIO0":2,"dhtType0":11},
+{"board":69,"device":"GENERIC_ESP01S_DS18B20_V10","dsEnabled":1,"dsGPIO0":2},
+{"board":70,"btnGPIO0":3,"btnMode0":2,"btnRelay0":0,"dbgSerial":0,"device":"ZHILDE_EU44_W","ledGPIO0":1,"ledLogic0":1,"rlyGPIO0":5,"rlyGPIO1":4,"rlyGPIO2":12,"rlyGPIO3":13,"rlyGPIO4":14,"rlyType0":0,"rlyType1":0,"rlyType2":0,"rlyType3":0,"rlyType4":0},
+{"board":71,"btnGPIO0":0,"btnMode0":2,"btnRelay0":0,"cseEnabled":1,"cseGPIO":1,"dbgSerial":0,"device":"ITEAD_SONOFF_POW_R2","ledGPIO0":13,"ledLogic0":1,"rlyGPIO0":12,"rlyType0":0},
+{"board":72,"btnDblClick0":0,"btnGPIO0":12,"btnGPIO1":13,"btnMode0":2,"btnMode1":2,"btnRelay0":0,"btnRelay1":1,"device":"LUANI_HVIO","ledGPIO0":15,"ledLogic0":0,"rlyGPIO0":4,"rlyGPIO1":5,"rlyType0":0,"rlyType1":0},
+{"board":73,"device":"ALLNET_4DUINO_IOT_WLAN_RELAIS","ledGPIO0":0,"ledLogic0":1,"rlyGPIO0":14,"rlyResetGPIO0":12,"rlyType0":2},
+{"board":74,"btnGPIO0":2,"btnMode0":2,"btnRelay0":0,"device":"TONBUX_MOSQUITO_KILLER","ledGPIO0":15,"ledGPIO1":14,"ledGPIO2":12,"ledGPIO3":16,"ledLogic0":1,"ledLogic1":1,"ledLogic2":0,"ledLogic3":0,"ledMode1":8,"ledRelay1":0,"rlyGPIO0":5,"rlyType0":0},
+{"board":75,"btnGPIO0":13,"btnMode0":2,"btnRelay0":0,"device":"NEO_COOLCAM_NAS_WR01W","ledGPIO0":4,"ledLogic0":1,"rlyGPIO0":12,"rlyType0":0},
+{"board":76,"btnGPIO0":0,"btnMode0":2,"btnRelay0":0,"device":"PILOTAK_ESP_DIN_V1","digEnabled":1,"digGPIO0":16,"digMode0":0,"dsEnabled":1,"dsGPIO0":2,"i2cEnable":1,"i2cSCLGPIO":13,"i2cSDAGPIO":12,"ledGPIO0":15,"ledLogic0":0,"rfEnabled":1,"rfGPIO":14,"rlyGPIO0":4,"rlyGPIO1":5,"rlyType0":0,"rlyType1":0},
+{"board":77,"btnGPIO0":16,"btnMode0":2,"btnRelay0":3,"dbgSerial":0,"device":"ESTINK_WIFI_POWER_STRIP","ledGPIO0":0,"ledGPIO1":12,"ledGPIO2":3,"ledGPIO3":5,"ledLogic0":1,"ledLogic1":1,"ledLogic2":1,"ledLogic3":1,"ledMode0":4,"ledMode1":2,"ledMode2":2,"ledMode3":2,"ledRelay1":1,"ledRelay2":2,"ledRelay3":3,"rlyGPIO0":14,"rlyGPIO1":13,"rlyGPIO2":4,"rlyGPIO3":15,"rlyType0":0,"rlyType1":0,"rlyType2":0,"rlyType3":0},
+{"board":78,"btnGPIO0":12,"btnGPIO1":13,"btnMode0":6,"btnMode1":6,"btnRelay0":0,"btnRelay1":1,"device":"BH_ONOFRE","rlyGPIO0":4,"rlyGPIO1":5,"rlyType0":0,"rlyType1":0},
+{"board":79,"btnGPIO0":13,"btnMode0":2,"btnRelay0":0,"curRatio":25740,"device":"BLITZWOLF_BWSHP2","hlwCF1GPIO":14,"hlwCFGPIO":5,"hlwCurLevel":0,"hlwInt":2,"hlwSELGPIO":12,"ledGPIO0":2,"ledGPIO1":0,"ledLogic0":1,"ledLogic1":1,"ledMode1":4,"ledRelay1":0,"pwrRatio":3414290,"rlyGPIO0":15,"rlyType0":0,"volRatio":313400},
+{"board":80,"btnClick0":0,"btnDblClick0":0,"btnGPIO0":4,"btnLngClick0":0,"btnLngLngClick0":0,"btnMode0":0,"btnPress0":1,"btnRelay0":0,"device":"TINKERMAN_ESPURNA_SWITCH","ledGPIO0":2,"ledLogic0":0,"rlyGPIO0":12,"rlyType0":0},
+{"board":81,"btnGPIO0":0,"btnMode0":2,"btnRelay0":0,"cseEnabled":1,"cseGPIO":1,"dbgSerial":0,"device":"ITEAD_SONOFF_S31","ledGPIO0":13,"ledLogic0":1,"rlyGPIO0":12,"rlyType0":0},
+{"board":82,"dbgSerial":0,"device":"STM_RELAY","rlyCount":2,"rlyProvider":4},
+{"board":83,"btnGPIO0":13,"btnMode0":2,"btnRelay0":0,"curRatio":25740,"device":"VANZAVANZU_SMART_WIFI_PLUG_MINI","hlwCF1GPIO":14,"hlwCFGPIO":5,"hlwCurLevel":0,"hlwInt":2,"hlwSELGPIO":3,"ledGPIO0":2,"ledGPIO1":0,"ledLogic0":1,"ledLogic1":1,"ledMode1":4,"ledRelay1":0,"pwrRatio":3414290,"rlyGPIO0":15,"rlyType0":0,"volRatio":313400},
+{"board":84,"device":"GENERIC_GEIGER_COUNTER","geiEnabled":1},
+{"board":85,"btnGPIO0":0,"device":"TINKERMAN_RFM69GW","rfm69CSGPIO":15,"rfm69Enabled":1,"rfm69HW":0,"rfm69IRQGPIO":5,"rfm69ResetGPIO":7}
+]}
diff --git a/code/package-lock.json b/code/package-lock.json
index a10bfa0b..bd655aa2 100644
--- a/code/package-lock.json
+++ b/code/package-lock.json
@@ -166,7 +166,8 @@
"dev": true
},
"asap": {
- "version": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz",
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz",
"integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=",
"dev": true
},
@@ -367,7 +368,8 @@
}
},
"bulk-require": {
- "version": "https://registry.npmjs.org/bulk-require/-/bulk-require-1.0.1.tgz",
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/bulk-require/-/bulk-require-1.0.1.tgz",
"integrity": "sha1-yz0DnmmBOaRE/FdLJh1rOyz0TIk=",
"dev": true,
"requires": {
@@ -596,7 +598,8 @@
"dev": true
},
"clone-buffer": {
- "version": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz",
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz",
"integrity": "sha1-4+JbIHrE5wGvch4staFnksrD3Fg=",
"dev": true
},
@@ -606,19 +609,45 @@
"dev": true
},
"cloneable-readable": {
- "version": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.0.0.tgz",
- "integrity": "sha1-pikNQT8hemEjL5XkWP84QYz7ARc=",
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.1.2.tgz",
+ "integrity": "sha512-Bq6+4t+lbM8vhTs/Bef5c5AdEMtapp/iFb6+s4/Hh9MVTt8OLKH7ZOOZSCT+Ys7hsHvqv0GuMPJ1lnQJVHvxpg==",
"dev": true,
"requires": {
"inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
- "process-nextick-args": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz",
- "through2": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz"
+ "process-nextick-args": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz",
+ "readable-stream": "2.3.6"
},
"dependencies": {
- "process-nextick-args": {
- "version": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz",
- "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=",
+ "isarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+ "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
"dev": true
+ },
+ "readable-stream": {
+ "version": "2.3.6",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
+ "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
+ "dev": true,
+ "requires": {
+ "core-util-is": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
+ "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
+ "isarray": "1.0.0",
+ "process-nextick-args": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz",
+ "safe-buffer": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz",
+ "string_decoder": "1.1.1",
+ "util-deprecate": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz"
+ }
+ },
+ "string_decoder": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+ "dev": true,
+ "requires": {
+ "safe-buffer": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz"
+ }
}
}
},
@@ -699,6 +728,23 @@
"integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
"dev": true
},
+ "concat-with-sourcemaps": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/concat-with-sourcemaps/-/concat-with-sourcemaps-1.1.0.tgz",
+ "integrity": "sha512-4gEjHJFT9e+2W/77h/DS5SGUgwDaOwprX8L/gl5+3ixnzkVJJsZWDSelmN3Oilw3LNDZjZV0yqH1hLG3k6nghg==",
+ "dev": true,
+ "requires": {
+ "source-map": "0.6.1"
+ },
+ "dependencies": {
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true
+ }
+ }
+ },
"constant-case": {
"version": "https://registry.npmjs.org/constant-case/-/constant-case-2.0.0.tgz",
"integrity": "sha1-QXV2TTidP6nI7NKRhu1gBSQ7akY=",
@@ -776,16 +822,18 @@
"dev": true
},
"csslint": {
- "version": "https://registry.npmjs.org/csslint/-/csslint-1.0.5.tgz",
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/csslint/-/csslint-1.0.5.tgz",
"integrity": "sha1-Gcw+2jIhYP0/cjKvHLKjYOiYouk=",
"dev": true,
"requires": {
- "clone": "https://registry.npmjs.org/clone/-/clone-2.1.1.tgz",
- "parserlib": "https://registry.npmjs.org/parserlib/-/parserlib-1.1.1.tgz"
+ "clone": "2.1.1",
+ "parserlib": "1.1.1"
},
"dependencies": {
"clone": {
- "version": "https://registry.npmjs.org/clone/-/clone-2.1.1.tgz",
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.1.tgz",
"integrity": "sha1-0hfR6WERjjrJpLi7oyhVU79kfNs=",
"dev": true
}
@@ -1618,11 +1666,67 @@
"vinyl-fs": "0.3.14"
}
},
+ "gulp-append-prepend": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/gulp-append-prepend/-/gulp-append-prepend-1.0.4.tgz",
+ "integrity": "sha512-I7gnMh+YJkXllUdy5+NIzuy9c2lQEHuJwbhVCmLInt5bLADwaUXckgMWanvuZubAeEmsn7B16sDzyb6bbo7dqw==",
+ "dev": true,
+ "requires": {
+ "gulp-util": "https://registry.npmjs.org/gulp-util/-/gulp-util-3.0.8.tgz",
+ "read-file": "0.2.0",
+ "through2": "2.0.3"
+ }
+ },
"gulp-base64-favicon": {
"version": "https://registry.npmjs.org/gulp-base64-favicon/-/gulp-base64-favicon-1.0.2.tgz",
"integrity": "sha1-Bz9GpO4p35HpXXon9w7I45gsah0=",
"dev": true
},
+ "gulp-concat": {
+ "version": "2.6.1",
+ "resolved": "https://registry.npmjs.org/gulp-concat/-/gulp-concat-2.6.1.tgz",
+ "integrity": "sha1-Yz0WyV2IUEYorQJmVmPO5aR5M1M=",
+ "dev": true,
+ "requires": {
+ "concat-with-sourcemaps": "1.1.0",
+ "through2": "2.0.3",
+ "vinyl": "2.2.0"
+ },
+ "dependencies": {
+ "clone": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.1.tgz",
+ "integrity": "sha1-0hfR6WERjjrJpLi7oyhVU79kfNs=",
+ "dev": true
+ },
+ "clone-stats": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz",
+ "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=",
+ "dev": true
+ },
+ "replace-ext": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz",
+ "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=",
+ "dev": true
+ },
+ "vinyl": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.0.tgz",
+ "integrity": "sha512-MBH+yP0kC/GQ5GwBqrTPTzEfiiLjta7hTtvQtbxBgTeSXsmKQRQecjibMbxIXzVT3Y9KJK+drOz1/k+vsu8Nkg==",
+ "dev": true,
+ "requires": {
+ "clone": "2.1.1",
+ "clone-buffer": "1.0.0",
+ "clone-stats": "1.0.0",
+ "cloneable-readable": "1.1.2",
+ "remove-trailing-separator": "1.1.0",
+ "replace-ext": "1.0.0"
+ }
+ }
+ }
+ },
"gulp-crass": {
"version": "0.2.2",
"resolved": "https://registry.npmjs.org/gulp-crass/-/gulp-crass-0.2.2.tgz",
@@ -1632,7 +1736,7 @@
"crass": "0.12.3",
"csswring": "6.0.3",
"gulp-util": "https://registry.npmjs.org/gulp-util/-/gulp-util-3.0.8.tgz",
- "through2": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz"
+ "through2": "2.0.3"
}
},
"gulp-css-base64": {
@@ -1646,34 +1750,38 @@
"gulp-util": "https://registry.npmjs.org/gulp-util/-/gulp-util-3.0.8.tgz",
"mime": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
"request": "https://registry.npmjs.org/request/-/request-2.83.0.tgz",
- "through2": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz"
+ "through2": "2.0.3"
}
},
"gulp-csslint": {
- "version": "https://registry.npmjs.org/gulp-csslint/-/gulp-csslint-1.0.1.tgz",
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/gulp-csslint/-/gulp-csslint-1.0.1.tgz",
"integrity": "sha512-Rec56+RpCGg7feK3d/S45oqgxyLV3end0ed+UjWFv6YziQae2Bp4DNSDobwEvJdfCAsOhOSExEEB+jcfMx430w==",
"dev": true,
"requires": {
- "csslint": "https://registry.npmjs.org/csslint/-/csslint-1.0.5.tgz",
+ "csslint": "1.0.5",
"fancy-log": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.2.tgz",
- "plugin-error": "https://registry.npmjs.org/plugin-error/-/plugin-error-1.0.1.tgz",
- "rcloader": "https://registry.npmjs.org/rcloader/-/rcloader-0.2.2.tgz",
- "through2": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz",
- "vinyl": "https://registry.npmjs.org/vinyl/-/vinyl-2.1.0.tgz"
+ "plugin-error": "1.0.1",
+ "rcloader": "0.2.2",
+ "through2": "2.0.3",
+ "vinyl": "2.1.0"
},
"dependencies": {
"clone": {
- "version": "https://registry.npmjs.org/clone/-/clone-2.1.1.tgz",
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.1.tgz",
"integrity": "sha1-0hfR6WERjjrJpLi7oyhVU79kfNs=",
"dev": true
},
"clone-stats": {
- "version": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz",
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz",
"integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=",
"dev": true
},
"plugin-error": {
- "version": "https://registry.npmjs.org/plugin-error/-/plugin-error-1.0.1.tgz",
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-1.0.1.tgz",
"integrity": "sha512-L1zP0dk7vGweZME2i+EeakvUNqSrdiI3F91TwEoYiGrAfUXmVv6fJIq4g82PAXxNsWOp0J7ZqQy/3Szz0ajTxA==",
"dev": true,
"requires": {
@@ -1684,21 +1792,23 @@
}
},
"replace-ext": {
- "version": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz",
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz",
"integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=",
"dev": true
},
"vinyl": {
- "version": "https://registry.npmjs.org/vinyl/-/vinyl-2.1.0.tgz",
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.1.0.tgz",
"integrity": "sha1-Ah+cLPlR1rk5lDyJ617lrdT9kkw=",
"dev": true,
"requires": {
- "clone": "https://registry.npmjs.org/clone/-/clone-2.1.1.tgz",
- "clone-buffer": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz",
- "clone-stats": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz",
- "cloneable-readable": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.0.0.tgz",
- "remove-trailing-separator": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz",
- "replace-ext": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz"
+ "clone": "2.1.1",
+ "clone-buffer": "1.0.0",
+ "clone-stats": "1.0.0",
+ "cloneable-readable": "1.1.2",
+ "remove-trailing-separator": "1.1.0",
+ "replace-ext": "1.0.0"
}
}
}
@@ -1713,7 +1823,7 @@
"fancy-log": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.2.tgz",
"plugin-error": "https://registry.npmjs.org/plugin-error/-/plugin-error-1.0.1.tgz",
"stream-to-array": "https://registry.npmjs.org/stream-to-array/-/stream-to-array-2.3.0.tgz",
- "through2": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz"
+ "through2": "2.0.3"
},
"dependencies": {
"plugin-error": {
@@ -1736,8 +1846,8 @@
"dev": true,
"requires": {
"gulp-util": "https://registry.npmjs.org/gulp-util/-/gulp-util-3.0.8.tgz",
- "htmllint": "https://registry.npmjs.org/htmllint/-/htmllint-0.7.2.tgz",
- "through2": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz"
+ "htmllint": "0.7.2",
+ "through2": "2.0.3"
}
},
"gulp-htmlmin": {
@@ -1790,7 +1900,79 @@
"cheerio": "https://registry.npmjs.org/cheerio/-/cheerio-0.22.0.tgz",
"event-stream": "https://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz",
"gulp-util": "https://registry.npmjs.org/gulp-util/-/gulp-util-3.0.8.tgz",
- "through2": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz"
+ "through2": "2.0.3"
+ }
+ },
+ "gulp-jsonlint": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/gulp-jsonlint/-/gulp-jsonlint-1.2.1.tgz",
+ "integrity": "sha512-0o5Fhc+cIrclgAW2SrlI/UmvFOIeiHffLCZeK83f0+GNATk34AQKMQ9J8eDb3Pe/cff3NXvsB1/4YUBc87aEFA==",
+ "dev": true,
+ "requires": {
+ "ansi-colors": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz",
+ "fancy-log": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.2.tgz",
+ "jsonlint": "1.6.2",
+ "map-stream": "0.1.0",
+ "plugin-error": "0.1.2",
+ "through2": "2.0.3"
+ },
+ "dependencies": {
+ "arr-diff": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-1.1.0.tgz",
+ "integrity": "sha1-aHwydYFjWI/vfeezb6vklesaOZo=",
+ "dev": true,
+ "requires": {
+ "arr-flatten": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz",
+ "array-slice": "0.2.3"
+ }
+ },
+ "arr-union": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-2.1.0.tgz",
+ "integrity": "sha1-IPnqtexw9cfSFbEHexw5Fh0pLH0=",
+ "dev": true
+ },
+ "array-slice": {
+ "version": "0.2.3",
+ "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-0.2.3.tgz",
+ "integrity": "sha1-3Tz7gO15c6dRF82sabC5nshhhvU=",
+ "dev": true
+ },
+ "extend-shallow": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-1.1.4.tgz",
+ "integrity": "sha1-Gda/lN/AnXa6cR85uHLSH/TdkHE=",
+ "dev": true,
+ "requires": {
+ "kind-of": "1.1.0"
+ }
+ },
+ "kind-of": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-1.1.0.tgz",
+ "integrity": "sha1-FAo9LUGjbS78+pN3tiwk+ElaXEQ=",
+ "dev": true
+ },
+ "map-stream": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.1.0.tgz",
+ "integrity": "sha1-5WqpTEyAVaFkBKBnS3jyFffI4ZQ=",
+ "dev": true
+ },
+ "plugin-error": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-0.1.2.tgz",
+ "integrity": "sha1-O5uzM1zPAPQl4HQ34ZJ2ln2kes4=",
+ "dev": true,
+ "requires": {
+ "ansi-cyan": "0.1.1",
+ "ansi-red": "0.1.1",
+ "arr-diff": "1.1.0",
+ "arr-union": "2.1.0",
+ "extend-shallow": "1.1.4"
+ }
+ }
}
},
"gulp-remove-code": {
@@ -1803,7 +1985,7 @@
"escape-string-regexp": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
"object.entries": "1.0.4",
"plugin-error": "1.0.1",
- "through2": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz"
+ "through2": "2.0.3"
},
"dependencies": {
"bufferstreams": {
@@ -1905,7 +2087,7 @@
"fancy-log": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.2.tgz",
"gulp-util": "https://registry.npmjs.org/gulp-util/-/gulp-util-3.0.8.tgz",
"isobject": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
- "through2": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz",
+ "through2": "2.0.3",
"uglify-js": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.6.4.tgz",
"uglify-save-license": "https://registry.npmjs.org/uglify-save-license/-/uglify-save-license-0.4.1.tgz",
"vinyl-sourcemaps-apply": "https://registry.npmjs.org/vinyl-sourcemaps-apply/-/vinyl-sourcemaps-apply-0.2.1.tgz"
@@ -1947,7 +2129,7 @@
"multipipe": "https://registry.npmjs.org/multipipe/-/multipipe-0.1.2.tgz",
"object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz",
"replace-ext": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz",
- "through2": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz",
+ "through2": "2.0.3",
"vinyl": "https://registry.npmjs.org/vinyl/-/vinyl-0.5.3.tgz"
},
"dependencies": {
@@ -1997,6 +2179,12 @@
"ansi-regex": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz"
}
},
+ "has-color": {
+ "version": "0.1.7",
+ "resolved": "https://registry.npmjs.org/has-color/-/has-color-0.1.7.tgz",
+ "integrity": "sha1-ZxRKUmDDT8PMpnfQQdr1L+e3iy8=",
+ "dev": true
+ },
"has-flag": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
@@ -2126,19 +2314,21 @@
}
},
"htmllint": {
- "version": "https://registry.npmjs.org/htmllint/-/htmllint-0.7.2.tgz",
+ "version": "0.7.2",
+ "resolved": "https://registry.npmjs.org/htmllint/-/htmllint-0.7.2.tgz",
"integrity": "sha1-AuR0FvotvrMLXiw+1mfopUB6jzQ=",
"dev": true,
"requires": {
- "bulk-require": "https://registry.npmjs.org/bulk-require/-/bulk-require-1.0.1.tgz",
+ "bulk-require": "1.0.1",
"htmlparser2": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.9.2.tgz",
- "lodash": "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz",
- "promise": "https://registry.npmjs.org/promise/-/promise-8.0.1.tgz"
+ "lodash": "4.17.10",
+ "promise": "8.0.1"
},
"dependencies": {
"lodash": {
- "version": "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz",
- "integrity": "sha1-maktZcAnLevoyWtgV7yPv6O+1RE=",
+ "version": "4.17.10",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz",
+ "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==",
"dev": true
}
}
@@ -2493,6 +2683,16 @@
"integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=",
"dev": true
},
+ "jsonlint": {
+ "version": "1.6.2",
+ "resolved": "https://registry.npmjs.org/jsonlint/-/jsonlint-1.6.2.tgz",
+ "integrity": "sha1-VzcEUIX1XrRVxosf9OvAG9UOiDA=",
+ "dev": true,
+ "requires": {
+ "JSV": "4.0.2",
+ "nomnom": "1.8.1"
+ }
+ },
"jsprim": {
"version": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz",
"integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=",
@@ -2504,6 +2704,12 @@
"verror": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz"
}
},
+ "JSV": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/JSV/-/JSV-4.0.2.tgz",
+ "integrity": "sha1-0Hf2glVx+CEy+d/67Vh7QCn+/1c=",
+ "dev": true
+ },
"kind-of": {
"version": "6.0.2",
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
@@ -2587,7 +2793,8 @@
"dev": true
},
"lodash.assign": {
- "version": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz",
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz",
"integrity": "sha1-DZnzzNem0mHRm9rrkkUAXShYCOc=",
"dev": true
},
@@ -2602,7 +2809,8 @@
"dev": true
},
"lodash.clonedeep": {
- "version": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz",
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz",
"integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=",
"dev": true
},
@@ -2645,7 +2853,8 @@
"dev": true
},
"lodash.isobject": {
- "version": "https://registry.npmjs.org/lodash.isobject/-/lodash.isobject-3.0.2.tgz",
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/lodash.isobject/-/lodash.isobject-3.0.2.tgz",
"integrity": "sha1-PI+41bW/S/kK4G4U8qUwpO2TXh0=",
"dev": true
},
@@ -2769,12 +2978,6 @@
"integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=",
"dev": true
},
- "map-stream": {
- "version": "0.0.7",
- "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.0.7.tgz",
- "integrity": "sha1-ih8HiW2CsQkmvTdEokIACfiJdKg=",
- "dev": true
- },
"map-visit": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz",
@@ -2930,6 +3133,41 @@
"lower-case": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz"
}
},
+ "nomnom": {
+ "version": "1.8.1",
+ "resolved": "https://registry.npmjs.org/nomnom/-/nomnom-1.8.1.tgz",
+ "integrity": "sha1-IVH3Ikcrp55Qp2/BJbuMjy5Nwqc=",
+ "dev": true,
+ "requires": {
+ "chalk": "0.4.0",
+ "underscore": "1.6.0"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.0.0.tgz",
+ "integrity": "sha1-yxAt8cVvUSPquLZ817mAJ6AnkXg=",
+ "dev": true
+ },
+ "chalk": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-0.4.0.tgz",
+ "integrity": "sha1-UZmj3c0MHv4jvAjBsCewYXbgxk8=",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "1.0.0",
+ "has-color": "0.1.7",
+ "strip-ansi": "0.1.1"
+ }
+ },
+ "strip-ansi": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.1.1.tgz",
+ "integrity": "sha1-OeipjQRNFQZgq+SmgIrPcLt7yZE=",
+ "dev": true
+ }
+ }
+ },
"nth-check": {
"version": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.1.tgz",
"integrity": "sha1-mSms32KPwsQQmN6rgqxYDPFJquQ=",
@@ -3137,7 +3375,8 @@
"dev": true
},
"parserlib": {
- "version": "https://registry.npmjs.org/parserlib/-/parserlib-1.1.1.tgz",
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/parserlib/-/parserlib-1.1.1.tgz",
"integrity": "sha1-pkz6ckBiQ0/fw1HJpOwtkrlMBvQ=",
"dev": true
},
@@ -3304,11 +3543,12 @@
"dev": true
},
"promise": {
- "version": "https://registry.npmjs.org/promise/-/promise-8.0.1.tgz",
+ "version": "8.0.1",
+ "resolved": "https://registry.npmjs.org/promise/-/promise-8.0.1.tgz",
"integrity": "sha1-5F1osAoXZHttpxG/he1u1HII9FA=",
"dev": true,
"requires": {
- "asap": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz"
+ "asap": "2.0.6"
}
},
"punycode": {
@@ -3328,24 +3568,32 @@
"dev": true
},
"rcfinder": {
- "version": "https://registry.npmjs.org/rcfinder/-/rcfinder-0.1.9.tgz",
+ "version": "0.1.9",
+ "resolved": "https://registry.npmjs.org/rcfinder/-/rcfinder-0.1.9.tgz",
"integrity": "sha1-8+gPOH3fmugK4wpBADKWQuroERU=",
"dev": true,
"requires": {
- "lodash.clonedeep": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz"
+ "lodash.clonedeep": "4.5.0"
}
},
"rcloader": {
- "version": "https://registry.npmjs.org/rcloader/-/rcloader-0.2.2.tgz",
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/rcloader/-/rcloader-0.2.2.tgz",
"integrity": "sha1-WNIpi0YtC5v9ITPSoex0+9cFxxc=",
"dev": true,
"requires": {
- "lodash.assign": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz",
- "lodash.isobject": "https://registry.npmjs.org/lodash.isobject/-/lodash.isobject-3.0.2.tgz",
+ "lodash.assign": "4.2.0",
+ "lodash.isobject": "3.0.2",
"lodash.merge": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.1.tgz",
- "rcfinder": "https://registry.npmjs.org/rcfinder/-/rcfinder-0.1.9.tgz"
+ "rcfinder": "0.1.9"
}
},
+ "read-file": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/read-file/-/read-file-0.2.0.tgz",
+ "integrity": "sha1-cMa6+IQux9FUD5gf0Oau1Mgb1UU=",
+ "dev": true
+ },
"readable-stream": {
"version": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz",
"integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=",
@@ -3382,7 +3630,8 @@
"dev": true
},
"remove-trailing-separator": {
- "version": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz",
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz",
"integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=",
"dev": true
},
@@ -4059,36 +4308,40 @@
"dev": true
},
"through2": {
- "version": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz",
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz",
"integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=",
"dev": true,
"requires": {
- "readable-stream": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.4.tgz",
+ "readable-stream": "2.3.6",
"xtend": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz"
},
"dependencies": {
"isarray": {
- "version": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
"integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
"dev": true
},
"readable-stream": {
- "version": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.4.tgz",
- "integrity": "sha1-yUbD9H+n2Oq8C2FQ9KEvaaRXQHE=",
+ "version": "2.3.6",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
+ "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
"dev": true,
"requires": {
"core-util-is": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
"inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
- "isarray": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+ "isarray": "1.0.0",
"process-nextick-args": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz",
"safe-buffer": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz",
- "string_decoder": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz",
+ "string_decoder": "1.1.1",
"util-deprecate": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz"
}
},
"string_decoder": {
- "version": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz",
- "integrity": "sha1-D8Z9fBQYJd6UKC3VNr7GubzoYKs=",
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
"dev": true,
"requires": {
"safe-buffer": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz"
@@ -4228,6 +4481,12 @@
"integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=",
"dev": true
},
+ "underscore": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.6.0.tgz",
+ "integrity": "sha1-izixDKze9jM3uLJOT/htRa6lKag=",
+ "dev": true
+ },
"union-value": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz",
diff --git a/code/package.json b/code/package.json
index ceacb5ed..a5b24443 100644
--- a/code/package.json
+++ b/code/package.json
@@ -8,7 +8,9 @@
"devDependencies": {
"del": "^2.2.1",
"gulp": "^3.9.1",
+ "gulp-append-prepend": "^1.0.4",
"gulp-base64-favicon": "^1.0.2",
+ "gulp-concat": "^2.6.1",
"gulp-crass": "^0.2.2",
"gulp-css-base64": "^1.3.4",
"gulp-csslint": "^1.0.0",
@@ -16,11 +18,12 @@
"gulp-htmllint": "0.0.14",
"gulp-htmlmin": "^2.0.0",
"gulp-inline": "^0.1.1",
+ "gulp-jsonlint": "^1.2.1",
"gulp-remove-code": "^3.0.2",
"gulp-rename": "^1.3.0",
"gulp-replace": "^1.0.0",
"gulp-uglify": "^1.5.3",
- "map-stream": "0.0.7",
- "run-sequence": "^2.2.1"
+ "run-sequence": "^2.2.1",
+ "through2": "^2.0.3"
}
}