mirror of
				https://github.com/esphome/esphome.git
				synced 2025-10-31 15:12:06 +00:00 
			
		
		
		
	Adding ignore bits to narrow compare of received codes (#650)
* Adding bitmask to narrow compare of received codes Updated test to add mask configuration * Lint * Handle bitmask as ignore characters per review comment * Fixed test to cover ignore bits * Lint * Eliminate separate set_mask method per review comment
This commit is contained in:
		| @@ -446,6 +446,22 @@ def validate_rc_switch_code(value): | ||||
|     return value | ||||
|  | ||||
|  | ||||
| def validate_rc_switch_raw_code(value): | ||||
|     if not isinstance(value, (str, text_type)): | ||||
|         raise cv.Invalid("All RCSwitch raw codes must be in quotes ('')") | ||||
|     for c in value: | ||||
|         if c not in ('0', '1', 'x'): | ||||
|             raise cv.Invalid( | ||||
|                 "Invalid RCSwitch raw code character '{}'.Only '0', '1' and 'x' are allowed" | ||||
|                 .format(c)) | ||||
|     if len(value) > 32: | ||||
|         raise cv.Invalid("Maximum length for RCSwitch raw codes is 32, code '{}' has length {}" | ||||
|                          "".format(value, len(value))) | ||||
|     if not value: | ||||
|         raise cv.Invalid("RCSwitch raw code must not be empty") | ||||
|     return value | ||||
|  | ||||
|  | ||||
| def build_rc_switch_protocol(config): | ||||
|     if isinstance(config, int): | ||||
|         return rc_switch_protocols[config] | ||||
| @@ -457,7 +473,7 @@ def build_rc_switch_protocol(config): | ||||
|  | ||||
|  | ||||
| RC_SWITCH_RAW_SCHEMA = cv.Schema({ | ||||
|     cv.Required(CONF_CODE): validate_rc_switch_code, | ||||
|     cv.Required(CONF_CODE): validate_rc_switch_raw_code, | ||||
|     cv.Optional(CONF_PROTOCOL, default=1): RC_SWITCH_PROTOCOL_SCHEMA, | ||||
| }) | ||||
| RC_SWITCH_TYPE_A_SCHEMA = cv.Schema({ | ||||
|   | ||||
| @@ -216,13 +216,22 @@ uint32_t decode_binary_string(const std::string &data) { | ||||
|   return ret; | ||||
| } | ||||
|  | ||||
| uint32_t decode_binary_string_mask(const std::string &data) { | ||||
|   uint32_t ret = 0; | ||||
|   for (char c : data) { | ||||
|     ret <<= 1UL; | ||||
|     ret |= (c != 'x'); | ||||
|   } | ||||
|   return ret; | ||||
| } | ||||
|  | ||||
| bool RCSwitchRawReceiver::matches(RemoteReceiveData src) { | ||||
|   uint32_t decoded_code; | ||||
|   uint8_t decoded_nbits; | ||||
|   if (!this->protocol_.decode(src, &decoded_code, &decoded_nbits)) | ||||
|     return false; | ||||
|  | ||||
|   return decoded_nbits == this->nbits_ && decoded_code == this->code_; | ||||
|   return decoded_nbits == this->nbits_ && (decoded_code & this->mask_) == (this->code_ & this->mask_); | ||||
| } | ||||
| bool RCSwitchDumper::dump(RemoteReceiveData src) { | ||||
|   for (uint8_t i = 1; i <= 7; i++) { | ||||
|   | ||||
| @@ -55,6 +55,8 @@ extern RCSwitchBase rc_switch_protocols[8]; | ||||
|  | ||||
| uint32_t decode_binary_string(const std::string &data); | ||||
|  | ||||
| uint32_t decode_binary_string_mask(const std::string &data); | ||||
|  | ||||
| template<typename... Ts> class RCSwitchRawAction : public RemoteTransmitterActionBase<Ts...> { | ||||
|  public: | ||||
|   TEMPLATABLE_VALUE(RCSwitchBase, protocol); | ||||
| @@ -167,6 +169,7 @@ class RCSwitchRawReceiver : public RemoteReceiverBinarySensorBase { | ||||
|   void set_code(uint32_t code) { this->code_ = code; } | ||||
|   void set_code(const std::string &code) { | ||||
|     this->code_ = decode_binary_string(code); | ||||
|     this->mask_ = decode_binary_string_mask(code); | ||||
|     this->nbits_ = code.size(); | ||||
|   } | ||||
|   void set_nbits(uint8_t nbits) { this->nbits_ = nbits; } | ||||
| @@ -192,6 +195,7 @@ class RCSwitchRawReceiver : public RemoteReceiverBinarySensorBase { | ||||
|  | ||||
|   RCSwitchBase protocol_; | ||||
|   uint32_t code_; | ||||
|   uint32_t mask_{0xFFFFFFFF}; | ||||
|   uint8_t nbits_; | ||||
| }; | ||||
|  | ||||
|   | ||||
| @@ -1018,7 +1018,7 @@ switch: | ||||
|     name: RC Switch Raw | ||||
|     turn_on_action: | ||||
|       remote_transmitter.transmit_rc_switch_raw: | ||||
|         code: '001010011001111101011011' | ||||
|         code: '00101001100111110101xxxx' | ||||
|         protocol: 1 | ||||
|   - platform: template | ||||
|     name: RC Switch Type A | ||||
|   | ||||
		Reference in New Issue
	
	Block a user