From a7575b2c3a6852614a64f045a31bd21af2b4a82f Mon Sep 17 00:00:00 2001 From: Leon Kiefer Date: Sun, 13 Dec 2020 19:46:10 +0100 Subject: [PATCH] added ZactuatorSomfy (#816) * added ZactuatorSomfy * added Somfy RTS docs --- docs/setitup/actuators.md | 6 +++ docs/setitup/rf.md | 1 + docs/use/actuators.md | 39 +++++++++++++++++++ main/User_config.h | 1 + main/ZactuatorSomfy.ino | 80 +++++++++++++++++++++++++++++++++++++++ main/config_Somfy.h | 45 ++++++++++++++++++++++ main/main.ino | 12 +++++- platformio.ini | 47 +++++++++++++++++++++++ 8 files changed, 230 insertions(+), 1 deletion(-) create mode 100644 main/ZactuatorSomfy.ino create mode 100644 main/config_Somfy.h diff --git a/docs/setitup/actuators.md b/docs/setitup/actuators.md index 3a84dcb..f4e47fb 100644 --- a/docs/setitup/actuators.md +++ b/docs/setitup/actuators.md @@ -15,3 +15,9 @@ Vcc pin of the board and the Module to a 5V supply source Ground pins of the board and the Module to the ground of the supply source. + +## Somfy RTS +For this actuator a 433.42 MHz RF transmitter is required. +The standard 433.92 MHz transmitter don't work. +The CC1101 Transceiver supports both 433.42 MHz and 433.92 MHz and can be used with the Somfy RTS actor. +The wiring of the hardware is described in the [RF gateway](rf). diff --git a/docs/setitup/rf.md b/docs/setitup/rf.md index 0bd02e1..fc108ec 100644 --- a/docs/setitup/rf.md +++ b/docs/setitup/rf.md @@ -27,6 +27,7 @@ Connect the Emitter and Receiver to a 5V (**3.3V** for CC1101) supply source, an |ESP8266|D2/**D3**/D1/D8|**RX**/D2|D5|**3V3**|D7|D6|D8|GND |ESP32|**27**/26|12|D18|**3V3**|D23|D19|D5|GND +To use the CC1101 module, `ZradioCC1101` must be uncomment in the `User_config.h` or added to the `build_flags`. More information about the [CC1101 wiring](https://github.com/LSatan/SmartRC-CC1101-Driver-Lib#wiring). diff --git a/docs/use/actuators.md b/docs/use/actuators.md index f6de48c..74a24a6 100644 --- a/docs/use/actuators.md +++ b/docs/use/actuators.md @@ -74,3 +74,42 @@ After this calibration, if you set the `r` channel to 0.0, it will be remapped t Also, the gamma curve for this channel will be set to 2.5. This means that input values are raised to the power 2.5 internally. This can be used to improve the linearity of inputs. + +## Somfy RTS +This actuator allows to control Somfy RTS devices. + +### Setup +Before the module can be used, virtual Somfy RTS remotes must be created. +This is done in `config_Somfy.h`. + +`SOMFY_REMOTE_NUM` must be set to the number of virtual Somfy RTS remotes you want to have. +Then create for each of the virtual Somfy RTS remotes a unique 3-byte code and add them to `somfyRemotes`. +After a remote is setup, the order and codes should not be changed, else the setup process for all remotes have to be repeated. +Adding new codes at the end of the list is no problem. +Example of three virtual Somfy RTS remote codes: +```C +const uint32_t somfyRemotes[SOMFY_REMOTE_NUM] = {0x5184c8, 0xba24d0, 0xb77753}; +``` + +Next the virtual Somfy RTS remotes must be paired with the Somfy RTS devices you want to control. +The next section describes how the PROG command/button of the virtual remote can be used. +Use the manual of the device you want to control for instructions on how to pair the virtual remote with the device. + +### Commands +Commands must be send to the `commands/MQTTtoSomfy` subtopic. +Only json messages are supported. +The json message must contain two properties: +* remote: the index of the remote which is used to send the command (index start at zero) +* command: the command which should be send with the remote as string, see [table of command names](https://github.com/Legion2/Somfy_Remote_Lib#available-commands). + +::: tip NOTE +The middle button on physical Somfy RTS Remote controls is called "My". +::: + +Send PROG command with remote 0: + +`mosquitto_pub -t home/OpenMQTTGateway_Somfy/commands/MQTTtoSomfy -m '{"remote":0,"command":"Prog"}'` + +Send Up command with remote 1: + +`mosquitto_pub -t home/OpenMQTTGateway_Somfy/commands/MQTTtoSomfy -m '{"remote":1,"command":"Up"}'` diff --git a/main/User_config.h b/main/User_config.h index b4176f7..849a95e 100755 --- a/main/User_config.h +++ b/main/User_config.h @@ -233,6 +233,7 @@ uint8_t wifiProtocol = 0; // default mode, automatic selection //#define ZboardM5STACK "ZboardM5STACK" //#define ZradioCC1101 "CC1101" //ESP8266, ESP32 //#define ZactuatorPWM "PWM" //ESP8266, ESP32 +//#define ZactuatorSomfy "Somfy" //ESP8266, Arduino, ESP32 //#define ZgatewayRS232 "RS232" //ESP8266, Arduino, ESP32 /*-------------DEFINE YOUR MQTT ADVANCED PARAMETERS BELOW----------------*/ diff --git a/main/ZactuatorSomfy.ino b/main/ZactuatorSomfy.ino new file mode 100644 index 0000000..275373e --- /dev/null +++ b/main/ZactuatorSomfy.ino @@ -0,0 +1,80 @@ +/* + OpenMQTTGateway - ESP8266 or Arduino program for home automation + Act as a wifi or ethernet gateway between your 433mhz/infrared IR signal and a MQTT broker + Send and receiving command by MQTT + + This actor enables to: + - receive MQTT data from a topic and send Somfy RTS remote control signals corresponding to the received MQTT data + + Copyright (C) 2020 Leon Kiefer + + This file is part of OpenMQTTGateway. + + OpenMQTTGateway is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + OpenMQTTGateway is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ +#include "User_config.h" + +#ifdef ZactuatorSomfy + +# include +# include +# include + +# ifdef ZradioCC1101 +# include +# endif + +void setupSomfy() { +# ifdef ZradioCC1101 //using with CC1101 + ELECHOUSE_cc1101.Init(); +# endif + pinMode(RF_EMITTER_GPIO, OUTPUT); + digitalWrite(RF_EMITTER_GPIO, LOW); + +# if defined(ESP32) + if (!EEPROM.begin(max(4, SOMFY_REMOTE_NUM * 2))) { + Log.error(F("failed to initialise EEPROM" CR)); + } +# elif defined(ESP8266) + EEPROM.begin(max(4, SOMFY_REMOTE_NUM * 2)); +# endif + + Log.trace(F("ZactuatorSomfy setup done " CR)); +} + +# ifdef jsonReceiving +void MQTTtoSomfy(char* topicOri, JsonObject& jsonData) { + if (cmpToMainTopic(topicOri, subjectMQTTtoSomfy)) { +# ifdef ZradioCC1101 + ELECHOUSE_cc1101.SetTx(CC1101_FREQUENCY_SOMFY); +# endif + Log.trace(F("MQTTtoSomfy json data analysis" CR)); + + const int remoteIndex = jsonData["remote"]; + if (remoteIndex >= SOMFY_REMOTE_NUM) { + Log.warning(F("ZactuatorSomfy remote does not exist" CR)); + return; + } + const String commandData = jsonData["command"]; + const Command command = getSomfyCommand(commandData); + + EEPROMRollingCodeStorage rollingCodeStorage(EEPROM_ADDRESS_START + remoteIndex * 2); + SomfyRemote somfyRemote(RF_EMITTER_GPIO, somfyRemotes[remoteIndex], &rollingCodeStorage); + somfyRemote.sendCommand(command); +# ifdef ZradioCC1101 + ELECHOUSE_cc1101.SetRx(CC1101_FREQUENCY); // set Receive on +# endif + } +} +# endif + +#endif diff --git a/main/config_Somfy.h b/main/config_Somfy.h new file mode 100644 index 0000000..32207b6 --- /dev/null +++ b/main/config_Somfy.h @@ -0,0 +1,45 @@ +/* + OpenMQTTGateway - ESP8266 or Arduino program for home automation + Act as a wifi or ethernet gateway between your 433mhz/infrared IR signal and a MQTT broker + Send and receiving command by MQTT + + This actor enables to: + - receive MQTT data from a topic and send Somfy RTS remote control signals corresponding to the received MQTT data + + Copyright (C) 2020 Leon Kiefer + + This file is part of OpenMQTTGateway. + + OpenMQTTGateway is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + OpenMQTTGateway is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ +#ifndef config_Somfy_h +#define config_Somfy_h + +#include +#include + +extern void setupSomfy(); +extern void MQTTtoSomfy(char* topicOri, JsonObject& RFdata); +/*----------------------------USER PARAMETERS-----------------------------*/ +#define EEPROM_ADDRESS_START 0 +#define SOMFY_REMOTE_NUM 1 + +// Do not change the order of the remotes, because based on the index the rolling codes are stored +const uint32_t somfyRemotes[SOMFY_REMOTE_NUM] = {0x5184c8}; + +/*-------------DEFINE YOUR MQTT PARAMETERS BELOW----------------*/ +#define subjectMQTTtoSomfy "/commands/MQTTtoSomfy" + +/*-------------------INTERNAL DEFINITIONS----------------------*/ +#define CC1101_FREQUENCY_SOMFY 433.42 + +#endif diff --git a/main/main.ino b/main/main.ino index 2facf83..bc63603 100644 --- a/main/main.ino +++ b/main/main.ino @@ -57,7 +57,7 @@ StaticJsonBuffer modulesBuffer; JsonArray& modules = modulesBuffer.createArray(); // Modules config inclusion -#if defined(ZgatewayRF) || defined(ZgatewayRF2) || defined(ZgatewayPilight) +#if defined(ZgatewayRF) || defined(ZgatewayRF2) || defined(ZgatewayPilight) || defined(ZactuatorSomfy) # include "config_RF.h" #endif #ifdef ZgatewayWeatherStation @@ -132,6 +132,9 @@ JsonArray& modules = modulesBuffer.createArray(); #ifdef ZactuatorPWM # include "config_PWM.h" #endif +#ifdef ZactuatorSomfy +# include "config_Somfy.h" +#endif #if defined(ZboardM5STICKC) || defined(ZboardM5STICKCP) || defined(ZboardM5STACK) # include "config_M5.h" #endif @@ -690,6 +693,10 @@ void setup() { setupPWM(); modules.add(ZactuatorPWM); #endif +#ifdef ZactuatorSomfy + setupSomfy(); + modules.add(ZactuatorSomfy); +#endif #ifdef ZsensorDS1820 setupZsensorDS1820(); modules.add(ZsensorDS1820); @@ -1520,6 +1527,9 @@ void receivingMQTT(char* topicOri, char* datacallback) { # ifdef ZactuatorONOFF // outside the jsonpublishing macro due to the fact that we need to use simplepublishing with HA discovery MQTTtoONOFF(topicOri, jsondata); # endif +# ifdef ZactuatorSomfy + MQTTtoSomfy(topicOri, jsondata); +# endif # ifdef ZgatewayRS232 MQTTtoRS232(topicOri, jsondata); # endif diff --git a/platformio.ini b/platformio.ini index 5dc4327..819437a 100644 --- a/platformio.ini +++ b/platformio.ini @@ -35,6 +35,8 @@ extra_configs = ;default_envs = esp32dev-rf ;default_envs = esp32dev-pilight ;default_envs = esp32dev-pilight-cc1101 +;default_envs = esp32dev-somfy-cc1101 +;default_envs = esp32dev-pilight-somfy-cc1101 ;default_envs = esp32dev-weatherstation ;default_envs = esp32dev-ir ;default_envs = esp32dev-ble @@ -49,6 +51,7 @@ extra_configs = ;default_envs = ttgo-lora32-v1 ;default_envs = nodemcuv2-rf ;default_envs = nodemcuv2-rf-cc1101 +;default_envs = nodemcuv2-somfy-cc1101 ;default_envs = rf-wifi-gateway ;default_envs = nodemcuv2-rf2 ;default_envs = nodemcuv2-rf2-cc1101 @@ -109,6 +112,7 @@ m5stickcp = https://github.com/m5stack/M5StickC-Plus.git m5stack = M5Stack@0.3.0 smartrc-cc1101-driver-lib = SmartRC-CC1101-Driver-Lib@2.3.5 stl = https://github.com/mike-matera/ArduinoSTL.git#7411816 +somfy_remote=Somfy_Remote_Lib@0.2.0 [env] framework = arduino @@ -262,6 +266,34 @@ build_flags = '-DZradioCC1101="CC1101"' '-DGateway_Name="OpenMQTTGateway_ESP32_Pilight-CC1101"' +[env:esp32dev-somfy-cc1101] +platform = ${com.esp32_platform} +board = esp32dev +lib_deps = + ${com-esp.lib_deps} + ${libraries.somfy_remote} + ${libraries.smartrc-cc1101-driver-lib} +build_flags = + ${com-esp.build_flags} + '-DZactuatorSomfy="Somfy"' + '-DZradioCC1101="CC1101"' + '-DGateway_Name="OpenMQTTGateway_ESP32_Somfy-CC1101"' + +[env:esp32dev-pilight-somfy-cc1101] +platform = ${com.esp32_platform} +board = esp32dev +lib_deps = + ${com-esp.lib_deps} + ${libraries.esppilight} + ${libraries.somfy_remote} + ${libraries.smartrc-cc1101-driver-lib} +build_flags = + ${com-esp.build_flags} + '-DZgatewayPilight="Pilight"' + '-DZactuatorSomfy="Somfy"' + '-DZradioCC1101="CC1101"' + '-DGateway_Name="OpenMQTTGateway_ESP32_Pilight-Somfy-CC1101"' + [env:esp32dev-weatherstation] platform = ${com.esp32_platform} board = esp32dev @@ -612,6 +644,21 @@ build_flags = '-DGateway_Name="OpenMQTTGateway_ESP8266_RF-CC1101"' board_build.flash_mode = dout +[env:nodemcuv2-somfy-cc1101] +platform = ${com.esp8266_platform} +board = nodemcuv2 +lib_deps = + ${com-esp.lib_deps} + ${libraries.somfy_remote} + ${libraries.smartrc-cc1101-driver-lib} + ${libraries.esp8266_mdns} +build_flags = + ${com-esp.build_flags} + '-DZactuatorSomfy="Somfy"' + '-DZradioCC1101="CC1101"' + '-DGateway_Name="OpenMQTTGateway_ESP8266_Somfy-CC1101"' +board_build.flash_mode = dout + [env:manual-wifi-test] platform = ${com.esp8266_platform} board = nodemcuv2