Add RTV protocol support for 433.92 RTS frames. #77

Begin adding v2.0 for motor groups.
This commit is contained in:
Robert Strouse 2023-06-25 11:51:35 -07:00
parent e54621f171
commit b279efdb1f
5 changed files with 101 additions and 2 deletions

View file

@ -127,33 +127,43 @@ void somfy_frame_t::decodeFrame(byte* frame) {
if(this->cmd == somfy_commands::RTWProto) { if(this->cmd == somfy_commands::RTWProto) {
this->proto = radio_proto::RTW; this->proto = radio_proto::RTW;
switch(this->encKey) { switch(this->encKey) {
case 149:
case 133: case 133:
this->cmd = somfy_commands::My; this->cmd = somfy_commands::My;
break; break;
case 150:
case 134: case 134:
this->cmd = somfy_commands::Up; this->cmd = somfy_commands::Up;
break; break;
case 151:
case 135: case 135:
this->cmd = somfy_commands::MyUp; this->cmd = somfy_commands::MyUp;
break; break;
case 152:
case 136: case 136:
this->cmd = somfy_commands::Down; this->cmd = somfy_commands::Down;
break; break;
case 153:
case 137: case 137:
this->cmd = somfy_commands::MyDown; this->cmd = somfy_commands::MyDown;
break; break;
case 154:
case 138: case 138:
this->cmd = somfy_commands::UpDown; this->cmd = somfy_commands::UpDown;
break; break;
case 155:
case 139: case 139:
this->cmd = somfy_commands::MyUpDown; this->cmd = somfy_commands::MyUpDown;
break; break;
case 156:
case 140: case 140:
this->cmd = somfy_commands::Prog; this->cmd = somfy_commands::Prog;
break; break;
case 157:
case 141: case 141:
this->cmd = somfy_commands::SunFlag; this->cmd = somfy_commands::SunFlag;
break; break;
case 158:
case 142: case 142:
this->cmd = somfy_commands::Flag; this->cmd = somfy_commands::Flag;
break; break;
@ -302,6 +312,44 @@ void somfy_frame_t::encodeFrame(byte *frame) {
break; break;
} }
} }
else if(this->proto == radio_proto::RTV) {
frame[1] = 0xF0;
switch(this->cmd) {
case somfy_commands::My:
frame[0] = 149;
break;
case somfy_commands::Up:
frame[0] = 150;
break;
case somfy_commands::MyUp:
frame[0] = 151;
break;
case somfy_commands::Down:
frame[0] = 152;
break;
case somfy_commands::MyDown:
frame[0] = 153;
break;
case somfy_commands::UpDown:
frame[0] = 154;
break;
case somfy_commands::MyUpDown:
frame[0] = 155;
break;
case somfy_commands::Prog:
frame[0] = 156;
break;
case somfy_commands::SunFlag:
frame[0] = 157;
break;
case somfy_commands::Flag:
frame[0] = 158;
break;
default:
break;
}
}
else { else {
switch(this->cmd) { switch(this->cmd) {
case somfy_commands::StepUp: case somfy_commands::StepUp:
@ -1769,6 +1817,43 @@ bool SomfyShade::toJSON(JsonObject &obj) {
} }
return true; return true;
} }
bool SomfyGroup::fromJSON(JsonObject &obj) {
if(obj.containsKey("name")) strlcpy(this->name, obj["name"], sizeof(this->name));
if(obj.containsKey("remoteAddress")) this->setRemoteAddress(obj["remoteAddress"]);
if(obj.containsKey("bitLength")) this->bitLength = obj["bitLength"];
if(obj.containsKey("proto")) this->proto = static_cast<radio_proto>(obj["proto"].as<uint8_t>());
if(obj.containsKey("linkedShades")) {
uint8_t linkedShades[SOMFY_MAX_GROUPED_SHADES];
memset(linkedShades, 0x00, sizeof(linkedShades));
JsonArray arr = obj["linkedShades"];
uint8_t i = 0;
for(uint8_t shadeId : arr) {
linkedShades[i++] = shadeId;
}
}
return true;
}
bool SomfyGroup::toJSON(JsonObject &obj) {
obj["groupId"] = this->getGroupId();
obj["name"] = this->name;
obj["remoteAddress"] = this->m_remoteAddress;
obj["lastRollingCode"] = this->lastRollingCode;
obj["bitLength"] = this->bitLength;
obj["proto"] = static_cast<uint8_t>(this->proto);
SomfyRemote::toJSON(obj);
JsonArray arr = obj.createNestedArray("linkedShades");
for(uint8_t i = 0; i < SOMFY_MAX_GROUPED_SHADES; i++) {
uint8_t shadeId = this->linkedShades[i];
if(shadeId > 0 && shadeId < 255) {
SomfyShade *shade = somfy.getShadeById(shadeId);
if(shade) {
JsonObject lsd = arr.createNestedObject();
shade->toJSON(lsd);
}
}
}
return true;
}
bool SomfyRemote::toJSON(JsonObject &obj) { bool SomfyRemote::toJSON(JsonObject &obj) {
//obj["remotePrefId"] = this->getRemotePrefId(); //obj["remotePrefId"] = this->getRemotePrefId();
obj["remoteAddress"] = this->getRemoteAddress(); obj["remoteAddress"] = this->getRemoteAddress();

17
Somfy.h
View file

@ -2,7 +2,9 @@
#define SOMFY_H #define SOMFY_H
#define SOMFY_MAX_SHADES 32 #define SOMFY_MAX_SHADES 32
#define SOMFY_MAX_GROUPS 16
#define SOMFY_MAX_LINKED_REMOTES 7 #define SOMFY_MAX_LINKED_REMOTES 7
#define SOMFY_MAX_GROUPED_SHADES 32
#define SECS_TO_MILLIS(x) ((x) * 1000) #define SECS_TO_MILLIS(x) ((x) * 1000)
#define MINS_TO_MILLIS(x) SECS_TO_MILLIS((x) * 60) #define MINS_TO_MILLIS(x) SECS_TO_MILLIS((x) * 60)
@ -21,7 +23,8 @@ struct appver_t {
}; };
enum class radio_proto : byte { enum class radio_proto : byte {
RTS = 0x00, RTS = 0x00,
RTW = 0x01 RTW = 0x01,
RTV = 0x02
}; };
enum class somfy_commands : byte { enum class somfy_commands : byte {
Unknown0 = 0x0, Unknown0 = 0x0,
@ -260,7 +263,17 @@ class SomfyShade : public SomfyRemote {
void clear(); void clear();
int8_t transformPosition(float fpos); int8_t transformPosition(float fpos);
}; };
class SomfyGroup : public SomfyRemote {
protected:
uint8_t groupId = 255;
public:
char name[21] = "";
uint8_t linkedShades[SOMFY_MAX_GROUPED_SHADES];
void setGroupId(uint8_t id) { groupId = id; }
uint8_t getGroupId() { return groupId; }
bool fromJSON(JsonObject &obj);
bool toJSON(JsonObject &obj);
};
struct transceiver_config_t { struct transceiver_config_t {
bool printBuffer = false; bool printBuffer = false;
bool enabled = false; bool enabled = false;

Binary file not shown.

Binary file not shown.

View file

@ -221,6 +221,7 @@
<select id="selShadeProto" name="proto" style="width:100%;"> <select id="selShadeProto" name="proto" style="width:100%;">
<option value="0">RTS</option> <option value="0">RTS</option>
<option value="1">RTW</option> <option value="1">RTW</option>
<option value="2">RTV</option>
</select> </select>
<label for="selShadeBitLength">Protocol</label> <label for="selShadeBitLength">Protocol</label>
</div> </div>