Commit Graph

93 Commits

Author SHA1 Message Date
Theo Arends 41c259767f
Merge pull request #6426 from laurentdong/pullrequest
Increase MQTT subscribe JSON data size.
2019-09-15 09:02:34 +02:00
Laurent 8f1a3ebdd0 IF command alwasy report a command error
IF command did not send command finish signal.
2019-09-14 21:39:21 -04:00
Laurent c3638289e2 Increase MQTT subscribe JSON data size. 2019-09-14 21:35:55 -04:00
Laurent ea3fcaf22c Rule did not been triggered if there's no comparation operator
Rule did not been triggered if there's no comparation operator provided as trigger.
For example:
Rule1 ON EVENT#POWERON DO ... ENDON
The rule_name should be assigned as "POWERON" by default.
2019-09-11 21:46:01 -04:00
Theo Arends b811956d2f Fix rules on core 2.3.0 compilation error
Fix rules on core 2.3.0 compilation error (#6392)
2019-09-10 11:05:53 +02:00
Laurent Dong 96098e4e09 Support If in Rules
The major features of IF statement are:
 - Support IF, ELSEIF, ELSE
 - Support not only comparison but also using logical expression as condition
 - Support run multiple commands
 - Support nested IF statement
 - All the commands run by IF statement will go to the BACKLOG!
 - No limit for logical operators, parenthesis and nested IF statement. Depends on your RAM!

Extended Backus-Naur Form of IF statement:
<if-statement> ::=
IF "(" <logical-expression> ")" <statement-list> {ELSEIF "(" <logical-expression> ")" <statement-list>} [ELSE <statement-list>] ENDIF
<logical-expression> :=
<comparison-expression> |
(<comparison-expression> | <logical-expression>) {(AND | OR) <logical-expression>} |
"(" <logical-expression ")" {(AND | OR) <logical expression>}
<comparison-expression> ::=
<math-expression> ("=" | "<" | ">" | "|" | "==" | "<=" | ">=" | "!=") <math-expression>
<statement-list> ::=
<statement> {";" <statement>}
<statement> ::=
<Sonoff-Tasmota-command> | <if-statement>

In English:
If statement support 3 format:
1. IF (<condition>) <statement-list> ENDIF
2. IF (<condition>) <statement-list> ELSE <statement-list> ENDIF
3. IF (<condition>) <statement-list> [ELSEIF (<condition>) <statement-list> ]* ELSE <statement-list> ENDIF

<condition> is a logical expression which can be:
1. A comparison expression for example:
   VAR1 >= 10
2. Multiple comparison expression with logical operator "AND" or "OR" between them. "AND" has higher priority than "OR". Fox example:
   UPTIME > 100 AND MEM1 == 1 OR MEM2 == 1
3. Parenthesis can be used to change the priority of logical expression. For example:
   UPTIME > 100 AND (MEM1 == 1 OR MEM2 == 1)

<statement-list> can be:
1. A Sonoff-Tasmota command. For example:
   ledpower on
2. A IF statement ("IF .... ENDIF")
3. Multiple Sonoff-Tasmota command or IF statement split with ";". For example:
   Power1 off; Ledpower on; if (mem1 == 0) Var1 Var1+1; mem1==1 endif; Delay 10; POWER1 on
4. Do not need to lead with "BACKLOG" for multiple commands.
2019-09-09 11:24:27 -04:00
Theo Arends 06135c6ccd Merged #5421
Merged #5421
2019-08-30 17:07:56 +02:00
Theo Arends d87181e22d Refactor rules saving code space
Refactor rules saving code space
2019-08-17 14:27:41 +02:00
Theo Arends 2d0143623d Refactor commands by processing optional prefix
Refactor commands by processing optional prefix
2019-08-11 18:12:18 +02:00
Theo Arends e5ecffe4dd Refactor commands
Refactor commands
2019-08-03 13:01:34 +02:00
Theo Arends 908b9ca74a Refactor Rules commands
Refactor Rules commands
2019-08-02 16:23:17 +02:00
Theo Arends 1068d59a63 Extent commands Var and Mem with option to show all parameters at once
Extent commands Var and Mem with option to show all parameters at once (#6107)
2019-07-24 11:10:15 +02:00
Stephan Hadinger 15e37ef0bb Change converted double to float in rules, and replaced trigonometric functions from stdlib with smaller versions. 2019-07-01 18:20:43 +02:00
Theo Arends 1b69502d9b Code optimization - Change for(uint8_t in for (uint32_t
Code optimization - Change for(uint8_t in for (uint32_t
2019-06-30 16:44:36 +02:00
Theo Arends 30adce5648 Revert "Code optimization - Change for(uint8_t in for (uint32_t"
This reverts commit 5e1eac3f74.
2019-06-30 15:56:55 +02:00
Theo Arends 5e1eac3f74 Code optimization - Change for(uint8_t in for (uint32_t
Code optimization - Change for(uint8_t in for (uint32_t
2019-06-30 15:47:32 +02:00
Theo Arends 8c132bd0ff Add rule System#Save executed just before a planned restart
Add rule System#Save executed just before a planned restart
2019-05-19 12:42:10 +02:00
Theo Arends dc3d0aea94 Add initial support for Scripts
Add initial support for Scripts as replacement for Rules. Default disabled but can be enabled in my_user_config.h (#5689)
2019-05-18 13:34:52 +02:00
Theo Arends 038079a865 Add rule support for single JSON value pair
Add rule support for single JSON value pair like {"SSerialReceived":"on"} by expanding it to {"SSerialReceived":{"Data":"on"}} allowing for trigger SSerialReceived#Data=on (#5638)
2019-05-15 16:31:13 +02:00
Theo Arends 0b6c62f5f9 Add support for Shelly 1PM Template
Add support for Shelly 1PM Template {"NAME":"Shelly 1PM","GPIO":[56,0,0,0,82,134,0,0,0,0,0,21,0],"FLAG":2,"BASE":18} (#5716)
2019-05-13 18:26:07 +02:00
Theo Arends 0dbbf413a8
Merge pull request #5604 from Staars/development
do not forget to handle the last vars_event and mems_event
2019-04-09 18:40:45 +02:00
Theo Arends be385ecb5c Add command WebColor
* Add rule Http#Initialized
 * Add command WebColor to change non-persistent GUI colors on the fly
   Use a rule like:
   rule3 on http#initialized do webcolor {"webcolor":["#eeeeee","#181818","#4f4f4f","#000000","#dddddd","#008000","#222222","#ff0000","#008000","#ffffff","#1fa3ec","#0e70a4","#d43535","#931f1f","#47c266","#5aaf6f","#ffffff","#999999","#000000"]} endon
   or
   rule3 on http#initialized do webcolor {"webcolor":["#eee","#181818","#4f4f4f","#000","#ddd","#008000","#222"]} endon
   to make color changes persistent)
2019-04-08 22:37:39 +02:00
Staars a5c4dcd5d2 do not forget the last vars_event and mems_event 2019-04-08 18:27:08 +02:00
Staars 1400a15076 always check for vars_events and mems_events 2019-03-29 09:42:50 +01:00
Theo Arends e1c92b701b Change NULL to nullptr
Change NULL to nullptr
2019-03-26 18:26:50 +01:00
Theo Arends 6922e657d9 Shrink code/flash space
Shrink code/flash space
2019-03-23 17:00:59 +01:00
Theo Arends baa5825569 Free some flash
Free some flash
2019-03-11 10:38:41 +01:00
Laurent Dong b87afc3bcb Code review: Copy string with strlcpy() instead of snprintf()
Copying string with snprintf() is unsafy and slow because it check and replace plcaehold (%?)
2019-03-08 13:24:02 -05:00
Theo Arends 06a9fbd792 Changed logging message handling
Changed logging message handling
2019-03-08 15:15:42 +01:00
Laurent dd27ade7ef Rules: Trigger Event with MQTT Subscriptions
Support subscribe/unsubscribe MQTT topics and trigger specified event with the subscribed MQTT topic.
You can subscribe a MQTT topic and assign an event name. Once we received subscribed MQTT message, an event will be automatically triggered. So you can set up a rule with "ON EVENT#<event_name> DO ..." to do whatever you want based on this MQTT message. The payload is passed as a parameter once the event been triggered. If the payload is in JSON format, you are able to get the value of specified key as parameter.
For example, if you have a Tasmota based thermostat and multiple temperature sensors in different place, usually you have to set up a centre home automation system like Domoticz to control the thermostat. Right now, with this new feature, you can write a rule to do this.
Two new commands in Rules:
1. Subscribe
Subscribe a MQTT topic (with or without key) and assign an event name to it.
Command format:
	Subscribe [<event_name>, <topic> [, <key>]]
		This command will subscribe a <topic> and give it an event name <event_name>.
		The optional parameter <key> is for parse the specified key/value from MQTT message
			payload with JSON format.
		In order to parse value from two level JSON data, you can use one dot (".") to split the key into two section.
		Subscribe command without any parameter will list all topics currently subscribed.
2. Unsubscribe
Unsubscribe specified MQTT event.
Command format:
	Unsubscribe [<event_name>]
		Unsubscribe a topic subscribed by specify the event name.
		If no event specified, Unsubscribe all topics subscribed.
Examples:
1.
	Subscribe BkLight, Tasmota/BackyardLight/stat/POWER
		And define a rule like:
	Rule1 on event#BkLight=ON do ruletimer4 60 endon
2.
	Subscribe DnTemp, Tasmota/RoomSensor1/stat/SENSOR, DS18B20.Temperature
		Define a rule to deal with the MQTT message like {"Time":"2017-02-16T10:13:52", "DS18B20":{"Temperature":20.6}}
	Rule1 ON EVENT#DnTemp>=21 DO ... ENDON
2019-02-23 22:33:09 -05:00
Theo Arends 280dd25a8b Optimize RAM for expression
Optimize RAM for expression and add two more constant variables (#5275)
2019-02-19 14:49:15 +01:00
Theo Arends 14d5f7fb54 Fix GUI password and Add rule expression
* Fix GUI wifi password acception starting with asteriks (*) (#5231, #5242)
 * Add rule expression enabled  by define USE_EXPRESSION in my_user_config.h (#5210)
2019-02-16 16:17:17 +01:00
Laurent 4b4b3709ad Introduce Expression in Rules
Support use an expression as paramter in some rule commands, include Var<x>, Mem<x> and Ruletimer<x>.
Expression is constructed by constants (float number), variables (var<x>, mem<x>, Time, Uptime, Sunrise, Sunset),  operators and round brackets.
Currently support 6 operators, order by priority from high to low:
^  (power)
% (modulo)
*, /
+, -
Commands examples:
Var1 3.14 * (MEM1 * (10 + VAR2 ^2) - 100) % 10 + uptime / (2 + MEM2)
Ruletimer4 Time - Sunrise + MEM2/2
2019-02-12 21:46:42 -05:00
Theo Arends ee2660b2bc Update xdrv_10_rules.ino
Move const to flash
2019-02-05 17:45:35 +01:00
Laurent Dong 09732c9f2d Add new compare operators ("==", "!=" ,">=" and "<=") for rule
Introduce new compare operators for rules and did some optimization as well.
The new "==" operator act as a real number comparison instead of the previous "=" operator which is doing string comparison which result in FALSE for "1 + 1 = 2". For example:
rule1 on event#test do backlog var1 1;add1 1; event CompareWith2=2 endon on event#CompareWith2=%var1% do ledpower on endon
ledpower off
rule1 on
event test
2019-02-05 09:34:17 -05:00
Theo Arends 304ac6fe44 6.4.1.12 code changes (byte/boolean)
6.4.1.12 20190128
 * Change code use of boolean to bool and byte to uint8_t
 * Change code uint8_t flags to bool flags
2019-01-28 14:08:33 +01:00
Theo Arends 0186a97cb0 Fix allowable MAX_RULE_VARS to 16
Fix allowable MAX_RULE_VARS to 16 (#4933)
2019-01-15 16:30:20 +01:00
Adrian Scillato 1d23c0b0c5
New Triggers for Rules: VARx#STATE and MEMx#STATE
Added new triggers for rules: `VARx#STATE` and `MEMx#STATE`

These new triggers allows to execute commands when VARs or MEMs change their values.

This is useful for automations where the parameter sent to Tasmota by MQTT is a SetPoint for example.

Before these triggers, the approach was using an `EVENT` to store a value but some components in home automation softwares can't use `cmnd/sonofftopic/EVENT SETVAR=25`, where `cmnd/sonofftopic/EVENT` is the mqtt message and `SETVAR=25` is the payload.

With this new triggers, it will be as simple as `cmnd/sonofftopic/VAR 25` so any automation software can use it.

_(Using `cmnd/sonofftopic/EVENT SETVAR=` as mqtt message and `25` as payload is not understood by Tasmota)_
2019-01-04 16:26:37 -03:00
Theo Arends 447ec6256e 6.4.1.4 Update Copyright (C) 2019
6.4.1.4 20190101
 * Update Copyright (C) 2019
2019-01-01 13:55:01 +01:00
Theo Arends 5a44b12870 6.4.1.2 Rewrite Switch driver
6.4.1.2 20181228
 * Change switch driver making it modular and introduce input filter (#4665, #4724)
 * Add define DS18B20_INTERNAL_PULLUP to select internal input pullup when only one DS18B20 sensor is connected eliminating external resistor (#4738)
 * Add variable %timestamp% to rules (#4749)
2018-12-28 16:35:19 +01:00
Adrian Scillato 4fcbaf99be
Add variable %timestamp% to be used in rules
This PR adds a new variable %timestamp% to be used in a rule to allow the user to include the Time Stamp as Tasmota has for Status, Sensors, etc, for example:

Command:

publish stat/topic/sensor {"Time":"%timestamp%","mysensor":"%var1%"}

Output:

{"Time":"2018-12-27T12:52:57","mysensor":"1"}

(https://github.com/arendst/Sonoff-Tasmota/issues/4734)
2018-12-27 14:57:27 -03:00
Theo Arends c1102a4863 6.4.0.2 Fix possible dtostrf bos
6.4.0.2 20181221
 * Fix possible dtostrf buffer overflows by increasing buffers
2018-12-21 16:17:06 +01:00
Adrian Scillato c68fe7e7ad
RULES: Added BREAK as an alternative ENDON 2018-12-01 19:00:34 -03:00
Adrian Scillato 7f2b3643f5
RULES: Added BREAK as an alternative ENDON
RULES: Added BREAK as an alternative ENDON that will stop the execution of the following rules.

If a rule that ends with BREAK, is triggered, then the following rules of that set will not be executed. This is useful for cases like: https://github.com/arendst/Sonoff-Tasmota/issues/4477
2018-12-01 18:12:33 -03:00
Adrian Scillato e3d1971e51
Add Command CalcRes 2018-11-26 23:08:23 -03:00
Adrian Scillato f7a8f39f89
Added command CalcRes 2018-11-26 21:22:44 -03:00
Erik bee50cba06 Add support for sensor discovery 2018-11-21 19:21:51 +01:00
andrethomas 4a7e7b0dbb Change C functions with () to (void) 2018-11-14 15:32:09 +02:00
Theo Arends 9fef82736d Prep drivers for management
Prep drivers for management
2018-11-07 10:30:03 +01:00
Adrian Scillato bcc9432214
Added Dimmer Trigger for Rules
For example

rule on Dimmer#state<30 do ... endon
rule on Dimmer#boot<10 do ... endon
2018-10-01 13:13:47 -03:00