mirror of
https://github.com/arendst/Tasmota.git
synced 2025-07-26 20:26:32 +00:00
Add command `SetOption152 0/1
`
Add command ``SetOption152 0/1`` to select two (default) or one pin bistable relay control (#18386)
This commit is contained in:
parent
2684141722
commit
6f6c43a724
@ -6,6 +6,7 @@ All notable changes to this project will be documented in this file.
|
|||||||
## [12.5.0.1]
|
## [12.5.0.1]
|
||||||
### Added
|
### Added
|
||||||
- Matter sensors Humidity, Pressure, Illuminance; optimize memory (#18441)
|
- Matter sensors Humidity, Pressure, Illuminance; optimize memory (#18441)
|
||||||
|
- Command ``SetOption152 0/1`` to select two (default) or one pin bistable relay control (#18386)
|
||||||
|
|
||||||
### Breaking Changed
|
### Breaking Changed
|
||||||
|
|
||||||
|
@ -112,6 +112,7 @@ The latter links can be used for OTA upgrades too like ``OtaUrl https://ota.tasm
|
|||||||
|
|
||||||
## Changelog v12.5.0.1
|
## Changelog v12.5.0.1
|
||||||
### Added
|
### Added
|
||||||
|
- Command ``SetOption152 0/1`` to select two (default) or one pin bistable relay control [#18386](https://github.com/arendst/Tasmota/issues/18386)
|
||||||
- Matter sensors Humidity, Pressure, Illuminance [#18441](https://github.com/arendst/Tasmota/issues/18441)
|
- Matter sensors Humidity, Pressure, Illuminance [#18441](https://github.com/arendst/Tasmota/issues/18441)
|
||||||
|
|
||||||
### Breaking Changed
|
### Breaking Changed
|
||||||
|
@ -185,7 +185,7 @@ typedef union { // Restricted by MISRA-C Rule 18.4 bu
|
|||||||
uint32_t dns_ipv6_priority : 1; // bit 3 (v12.2.0.6) - SetOption149 - (Wifi) prefer IPv6 DNS resolution to IPv4 address when available. Requires `#define USE_IPV6`
|
uint32_t dns_ipv6_priority : 1; // bit 3 (v12.2.0.6) - SetOption149 - (Wifi) prefer IPv6 DNS resolution to IPv4 address when available. Requires `#define USE_IPV6`
|
||||||
uint32_t no_voltage_common : 1; // bit 4 (v12.3.1.5) - SetOption150 - (Energy) Force no voltage/frequency common
|
uint32_t no_voltage_common : 1; // bit 4 (v12.3.1.5) - SetOption150 - (Energy) Force no voltage/frequency common
|
||||||
uint32_t matter_enabled : 1; // bit 5 (v12.3.1.5) - SetOption151 - (Matter) Enable Matter protocol over Wifi
|
uint32_t matter_enabled : 1; // bit 5 (v12.3.1.5) - SetOption151 - (Matter) Enable Matter protocol over Wifi
|
||||||
uint32_t spare06 : 1; // bit 6
|
uint32_t bistable_single_pin : 1; // bit 6 (v12.5.0.1) - SetOption152 - (Power) Switch between two (0) or one (1) pin bistable relay control
|
||||||
uint32_t spare07 : 1; // bit 7
|
uint32_t spare07 : 1; // bit 7
|
||||||
uint32_t spare08 : 1; // bit 8
|
uint32_t spare08 : 1; // bit 8
|
||||||
uint32_t spare09 : 1; // bit 9
|
uint32_t spare09 : 1; // bit 9
|
||||||
|
@ -254,6 +254,7 @@ struct TasmotaGlobal_t {
|
|||||||
void *log_buffer_mutex; // Control access to log buffer
|
void *log_buffer_mutex; // Control access to log buffer
|
||||||
|
|
||||||
power_t power; // Current copy of Settings->power
|
power_t power; // Current copy of Settings->power
|
||||||
|
power_t power_bistable; // Current state of single pin bistable power
|
||||||
power_t rel_inverted; // Relay inverted flag (1 = (0 = On, 1 = Off))
|
power_t rel_inverted; // Relay inverted flag (1 = (0 = On, 1 = Off))
|
||||||
power_t rel_bistable; // Relay bistable bitmap
|
power_t rel_bistable; // Relay bistable bitmap
|
||||||
power_t last_power; // Last power set state
|
power_t last_power; // Last power set state
|
||||||
@ -430,6 +431,7 @@ void setup(void) {
|
|||||||
TasmotaGlobal.global_state.data = 0xF; // Init global state (wifi_down, mqtt_down) to solve possible network issues
|
TasmotaGlobal.global_state.data = 0xF; // Init global state (wifi_down, mqtt_down) to solve possible network issues
|
||||||
TasmotaGlobal.enable_logging = 1;
|
TasmotaGlobal.enable_logging = 1;
|
||||||
TasmotaGlobal.seriallog_level = LOG_LEVEL_INFO; // Allow specific serial messages until config loaded
|
TasmotaGlobal.seriallog_level = LOG_LEVEL_INFO; // Allow specific serial messages until config loaded
|
||||||
|
TasmotaGlobal.power_bistable = 0x80000000;
|
||||||
|
|
||||||
RtcRebootLoad();
|
RtcRebootLoad();
|
||||||
if (!RtcRebootValid()) {
|
if (!RtcRebootValid()) {
|
||||||
|
@ -1472,6 +1472,7 @@ void CmndSetoptionBase(bool indexed) {
|
|||||||
bitWrite(Settings->flag6.data, pindex, XdrvMailbox.payload);
|
bitWrite(Settings->flag6.data, pindex, XdrvMailbox.payload);
|
||||||
switch (pindex) {
|
switch (pindex) {
|
||||||
case 5: // SetOption151 - Matter enabled
|
case 5: // SetOption151 - Matter enabled
|
||||||
|
case 6: // SetOption152 - (Power) Use single pin bistable
|
||||||
TasmotaGlobal.restart_flag = 2;
|
TasmotaGlobal.restart_flag = 2;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -309,6 +309,7 @@ void SetDevicePower(power_t rpower, uint32_t source) {
|
|||||||
else {
|
else {
|
||||||
uint32_t port = 0;
|
uint32_t port = 0;
|
||||||
uint32_t port_next;
|
uint32_t port_next;
|
||||||
|
power_t bistable = 0;
|
||||||
|
|
||||||
ZeroCrossMomentStart();
|
ZeroCrossMomentStart();
|
||||||
|
|
||||||
@ -316,12 +317,25 @@ void SetDevicePower(power_t rpower, uint32_t source) {
|
|||||||
power_t state = rpower &1;
|
power_t state = rpower &1;
|
||||||
|
|
||||||
port_next = 1; // Select next relay
|
port_next = 1; // Select next relay
|
||||||
|
bool update = true;
|
||||||
if (bitRead(TasmotaGlobal.rel_bistable, port)) {
|
if (bitRead(TasmotaGlobal.rel_bistable, port)) {
|
||||||
|
if (Settings->flag6.bistable_single_pin) { // SetOption152 - (Power) Use single pin bistable
|
||||||
|
if (0x80000000 == TasmotaGlobal.power_bistable) {
|
||||||
|
TasmotaGlobal.power_bistable = TasmotaGlobal.power; // Init last known state
|
||||||
|
}
|
||||||
|
update = (bitRead(TasmotaGlobal.power_bistable, port) != state);
|
||||||
|
if (update) {
|
||||||
|
bitWrite(TasmotaGlobal.power_bistable, port, state);
|
||||||
|
bitSet(bistable, port);
|
||||||
|
}
|
||||||
|
|
||||||
|
} else {
|
||||||
if (!state) { port_next = 2; } // Skip highest relay
|
if (!state) { port_next = 2; } // Skip highest relay
|
||||||
port += state; // Relay<lowest> = Off, Relay<highest> = On
|
port += state; // Relay<lowest> = Off, Relay<highest> = On
|
||||||
|
}
|
||||||
state = 1; // Set pulse
|
state = 1; // Set pulse
|
||||||
}
|
}
|
||||||
if (i < MAX_RELAYS) {
|
if (update && (i < MAX_RELAYS)) {
|
||||||
DigitalWrite(GPIO_REL1, port, bitRead(TasmotaGlobal.rel_inverted, port) ? !state : state);
|
DigitalWrite(GPIO_REL1, port, bitRead(TasmotaGlobal.rel_inverted, port) ? !state : state);
|
||||||
}
|
}
|
||||||
port += port_next; // Select next relay
|
port += port_next; // Select next relay
|
||||||
@ -335,6 +349,11 @@ void SetDevicePower(power_t rpower, uint32_t source) {
|
|||||||
delay(Settings->param[P_BISTABLE_PULSE]); // SetOption45 - Keep energized for about 5 x operation time
|
delay(Settings->param[P_BISTABLE_PULSE]); // SetOption45 - Keep energized for about 5 x operation time
|
||||||
for (uint32_t i = 0; i < port; i++) { // Reset up to detected amount of ports
|
for (uint32_t i = 0; i < port; i++) { // Reset up to detected amount of ports
|
||||||
if (bitRead(TasmotaGlobal.rel_bistable, i)) {
|
if (bitRead(TasmotaGlobal.rel_bistable, i)) {
|
||||||
|
if (Settings->flag6.bistable_single_pin) { // SetOption152 - (Power) Use single pin bistable
|
||||||
|
if (!bitRead(bistable, i)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
DigitalWrite(GPIO_REL1, i, bitRead(TasmotaGlobal.rel_inverted, i) ? 1 : 0);
|
DigitalWrite(GPIO_REL1, i, bitRead(TasmotaGlobal.rel_inverted, i) ? 1 : 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -2218,8 +2237,12 @@ void GpioInit(void)
|
|||||||
if (i &1) { TasmotaGlobal.devices_present--; }
|
if (i &1) { TasmotaGlobal.devices_present--; }
|
||||||
}
|
}
|
||||||
#endif // ESP8266
|
#endif // ESP8266
|
||||||
|
if (!Settings->flag6.bistable_single_pin) { // SetOption152 - (Power) Use single pin bistable
|
||||||
if (bitRead(TasmotaGlobal.rel_bistable, i)) {
|
if (bitRead(TasmotaGlobal.rel_bistable, i)) {
|
||||||
if (bi_device &1) { TasmotaGlobal.devices_present--; }
|
if (bi_device &1) {
|
||||||
|
TasmotaGlobal.devices_present--;
|
||||||
|
}
|
||||||
|
}
|
||||||
bi_device++;
|
bi_device++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -207,7 +207,8 @@ a_setoption = [[
|
|||||||
"(Wifi) prefer IPv6 DNS resolution to IPv4 address when available. Requires `#define USE_IPV6`",
|
"(Wifi) prefer IPv6 DNS resolution to IPv4 address when available. Requires `#define USE_IPV6`",
|
||||||
"(Energy) Force no voltage/frequency common",
|
"(Energy) Force no voltage/frequency common",
|
||||||
"(Matter) Enable Matter protocol over Wifi",
|
"(Matter) Enable Matter protocol over Wifi",
|
||||||
"","",
|
"(Power) Switch between two (0) or one (1) pin bistable relay control",
|
||||||
|
"",
|
||||||
"","","","",
|
"","","","",
|
||||||
"","","","",
|
"","","","",
|
||||||
"","","","",
|
"","","","",
|
||||||
@ -324,7 +325,7 @@ else:
|
|||||||
obj = json.load(fp)
|
obj = json.load(fp)
|
||||||
|
|
||||||
def StartDecode():
|
def StartDecode():
|
||||||
print ("\n*** decode-status.py v12.4.0.5 by Theo Arends and Jacek Ziolkowski ***")
|
print ("\n*** decode-status.py v12.5.0.1 by Theo Arends and Jacek Ziolkowski ***")
|
||||||
|
|
||||||
# print("Decoding\n{}".format(obj))
|
# print("Decoding\n{}".format(obj))
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user