From 4cb8cd31b3612e81a4dd2fbf93959933ff94c336 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Johannes=20H=C3=B6rmann?= Date: Fri, 29 Nov 2019 21:03:13 +0100 Subject: [PATCH] Add support for BW-SHP5 (#2029) --- README.md | 16 +++++----- code/espurna/config/arduino.h | 1 + code/espurna/config/hardware.h | 42 +++++++++++++++++++++++++++ code/platformio.ini | 10 +++++++ images/devices/blitzwolf-bw-shp5.jpg | Bin 0 -> 25295 bytes 5 files changed, 61 insertions(+), 8 deletions(-) create mode 100644 images/devices/blitzwolf-bw-shp5.jpg diff --git a/README.md b/README.md index 71f2ac5e..d71a96e9 100644 --- a/README.md +++ b/README.md @@ -248,14 +248,14 @@ Here is the list of supported hardware. For more information please refer to the |||| |---|---|---| -|![BlitzWolf BW-SHP6](images/devices/blitzwolf-bw-shp6.jpg)|![BlitzWolf BW-SHP2](images/devices/blitzwolf-bw-shp2.jpg)|![Power meters based on V9261F](images/devices/generic-v9261f.jpg)| -|**Blitzwolf BW-SHP6**|**Blitzwolf BW-SHP2
(also by Coosa, Gosund, HomeCube, Teckin)**|**Power meters based on V9261F**| -|![Itead Sonoff POW](images/devices/itead-sonoff-pow.jpg)|![Itead Sonoff POW](images/devices/itead-sonoff-pow-r2.jpg)|![Itead Sonoff S31](images/devices/itead-sonoff-s31.jpg)| -|**Itead Sonoff POW**|**Itead Sonoff POW R2**|**Itead Sonoff S31**| -|![Smartlife Mini Smart Socket](images/devices/smartlife-mini-smart-socket.jpg)|![Teckin SP20](images/devices/teckin-sp20.jpg)|![Digoo NX SP202](images/devices/digoo-nx-sp202.jpg)| -|**Smartlife (NETVIP) Mini Smart Socket**|**Teckin SP20**|**Digoo NX SP202**| -|![Vanzavanzu Smart WiFi Plug Mini](images/devices/vanzavanzu-smart-wifi-plug-mini.jpg)||| -|**Vanzavanzu Smart WiFi Plug Mini**||| +|![BlitzWolf BW-SHP6](images/devices/blitzwolf-bw-shp6.jpg)|![BlitzWolf BW-SHP2](images/devices/blitzwolf-bw-shp2.jpg)|![BlitzWolf BW-SHP5](images/devices/blitzwolf-bw-shp5.jpg)| +|**Blitzwolf BW-SHP6**|**Blitzwolf BW-SHP2
(also by Coosa, Gosund, HomeCube, Teckin)**|**Blitzwolf BW-SHP5**| +|![Power meters based on V9261F](images/devices/generic-v9261f.jpg)|![Itead Sonoff POW](images/devices/itead-sonoff-pow.jpg)|![Itead Sonoff POW](images/devices/itead-sonoff-pow-r2.jpg)| +|**Power meters based on V9261F**|**Itead Sonoff POW**|**Itead Sonoff POW R2**| +|![Itead Sonoff S31](images/devices/itead-sonoff-s31.jpg)|![Smartlife Mini Smart Socket](images/devices/smartlife-mini-smart-socket.jpg)|![Teckin SP20](images/devices/teckin-sp20.jpg)| +|**Itead Sonoff S31**|**Smartlife (NETVIP) Mini Smart Socket**|**Teckin SP20**| +|![Digoo NX SP202](images/devices/digoo-nx-sp202.jpg)|![Vanzavanzu Smart WiFi Plug Mini](images/devices/vanzavanzu-smart-wifi-plug-mini.jpg)|| +|**Digoo NX SP202**|**Vanzavanzu Smart WiFi Plug Mini**|| ### Embedded switches diff --git a/code/espurna/config/arduino.h b/code/espurna/config/arduino.h index 176945bb..ee77a638 100644 --- a/code/espurna/config/arduino.h +++ b/code/espurna/config/arduino.h @@ -25,6 +25,7 @@ //#define BH_ONOFRE //#define BLITZWOLF_BWSHPX //#define BLITZWOLF_BWSHPX_V23 +//#define BLITZWOLF_BWSHP5 //#define DIGOO_NX_SP202 //#define ELECTRODRAGON_WIFI_IOT //#define ESPURNA_BASE diff --git a/code/espurna/config/hardware.h b/code/espurna/config/hardware.h index 32276875..8fe84327 100644 --- a/code/espurna/config/hardware.h +++ b/code/espurna/config/hardware.h @@ -2959,6 +2959,48 @@ // BUTTON1 and LED1 are using Serial pins #define DEBUG_SERIAL_SUPPORT 0 +// ----------------------------------------------------------------------------- +// Similar to both devices above but also with switchable USB ports +// and other sensor (CSE7766). +// the pin layout is different to the above two versions +// BlitzWolf SHP5 +// ----------------------------------------------------------------------------- +#elif defined(BLITZWOLF_BWSHP5) + + // Info + #define MANUFACTURER "BLITZWOLF" + #define DEVICE "BWSHP5" + + // Buttons + #define BUTTON1_PIN 16 + #define BUTTON1_MODE BUTTON_PUSHBUTTON | BUTTON_DEFAULT_HIGH + #define BUTTON1_RELAY 1 + + // Relays + // Power plug + #define RELAY1_PIN 14 + #define RELAY1_TYPE RELAY_TYPE_NORMAL + // USB + #define RELAY2_PIN 5 + #define RELAY2_TYPE RELAY_TYPE_NORMAL + + // LEDs + #define LED1_PIN 2 + #define LED1_PIN_INVERSE 1 + #define LED2_PIN 0 + #define LED2_PIN_INVERSE 1 + #define LED2_MODE LED_MODE_FINDME + #define LED2_RELAY 1 + + // Disable UART noise + #define DEBUG_SERIAL_SUPPORT 0 + + // CSE7766 + #ifndef CSE7766_SUPPORT + #define CSE7766_SUPPORT 1 + #endif + #define CSE7766_PIN 1 + // ----------------------------------------------------------------------------- // Teckin SP21 // ----------------------------------------------------------------------------- diff --git a/code/platformio.ini b/code/platformio.ini index 33e48b2b..9e5fbdc9 100644 --- a/code/platformio.ini +++ b/code/platformio.ini @@ -1363,6 +1363,16 @@ build_flags = ${common.build_flags_1m0m} -DBLITZWOLF_BWSHPX_V23 upload_port = ${common.ota_upload_port} upload_flags = ${common.ota_upload_flags} +[env:blitzwolf-bwshp5] +board = ${common.board_1m} +build_flags = ${common.build_flags_1m0m} -DBLITZWOLF_BWSHP5 + +[env:blitzwolf-bwshp5-ota] +board = ${common.board_1m} +build_flags = ${common.build_flags_1m0m} -DBLITZWOLF_BWSHP5 +upload_port = ${common.ota_upload_port} +upload_flags = ${common.ota_upload_flags} + [env:teckin-sp21] board = ${common.board_1m} build_flags = ${common.build_flags_1m0m} -DTECKIN_SP21 diff --git a/images/devices/blitzwolf-bw-shp5.jpg b/images/devices/blitzwolf-bw-shp5.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f298f1c92918b2d0d97078f6b18e42e93b9563b5 GIT binary patch literal 25295 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 literal 0 HcmV?d00001