30
30
#define NODE_PARAMS_LOCAL_INIT_TOPIC_SUFFIX "params/local/init"
31
31
#define NODE_PARAMS_REMOTE_TOPIC_SUFFIX "params/remote"
32
32
#define TIME_SERIES_DATA_TOPIC_SUFFIX "params/ts_data"
33
+ #define NODE_PARAMS_ALERT_TOPIC_SUFFIX "alert"
34
+
35
+ #define ESP_RMAKER_ALERT_KEY "esp.alert.str"
33
36
34
37
#define MAX_PUBLISH_TOPIC_LEN 64
35
- #define RMAKER_PARAMS_SIZE_MARGIN 50
38
+ #define RMAKER_PARAMS_SIZE_MARGIN 50 /* To accommodate for changes in param values while creating JSON */
39
+ #define RMAKER_ALERT_STR_MARGIN 25 /* To accommodate rest of the alert payload {"esp.alert.str":""} */
36
40
37
41
static size_t max_node_params_size = CONFIG_ESP_RMAKER_MAX_PARAM_DATA_SIZE ;
38
42
/* This buffer will be allocated once and will be reused for all param updates.
@@ -210,17 +214,25 @@ static esp_err_t esp_rmaker_allocate_and_populate_params(uint8_t flags, bool res
210
214
return err ;
211
215
}
212
216
213
- esp_err_t esp_rmaker_report_param_internal (void )
217
+ static esp_err_t esp_rmaker_report_param_internal (uint8_t flags )
214
218
{
215
219
esp_err_t err = esp_rmaker_allocate_and_populate_params (RMAKER_PARAM_FLAG_VALUE_CHANGE , true);
216
220
if (err == ESP_OK ) {
217
221
/* Just checking if there are indeed any params to report by comparing with a decent enough
218
222
* length as even the smallest possible data, Eg. '{"d":{"p":0}}' will be > 10 bytes.
219
223
*/
220
224
if (strlen (node_params_buf ) > 10 ) {
221
- snprintf (publish_topic , sizeof (publish_topic ), "node/%s/%s" ,
222
- esp_rmaker_get_node_id (), NODE_PARAMS_LOCAL_TOPIC_SUFFIX );
223
- ESP_LOGI (TAG , "Reporting params: %s" , node_params_buf );
225
+ if (flags == RMAKER_PARAM_FLAG_VALUE_CHANGE ) {
226
+ snprintf (publish_topic , sizeof (publish_topic ), "node/%s/%s" ,
227
+ esp_rmaker_get_node_id (), NODE_PARAMS_LOCAL_TOPIC_SUFFIX );
228
+ ESP_LOGI (TAG , "Reporting params: %s" , node_params_buf );
229
+ } else if (flags == RMAKER_PARAM_FLAG_VALUE_NOTIFY ) {
230
+ snprintf (publish_topic , sizeof (publish_topic ), "node/%s/%s" ,
231
+ esp_rmaker_get_node_id (), NODE_PARAMS_ALERT_TOPIC_SUFFIX );
232
+ ESP_LOGI (TAG , "Notifying params: %s" , node_params_buf );
233
+ } else {
234
+ return ESP_FAIL ;
235
+ }
224
236
if (esp_rmaker_params_mqtt_init_done ) {
225
237
esp_rmaker_mqtt_publish (publish_topic , node_params_buf , strlen (node_params_buf ), RMAKER_MQTT_QOS1 , NULL );
226
238
} else {
@@ -688,7 +700,21 @@ esp_err_t esp_rmaker_param_report(const esp_rmaker_param_t *param)
688
700
return ESP_ERR_INVALID_ARG ;
689
701
}
690
702
((_esp_rmaker_param_t * )param )-> flags |= RMAKER_PARAM_FLAG_VALUE_CHANGE ;
691
- return esp_rmaker_report_param_internal ();
703
+ return esp_rmaker_report_param_internal (RMAKER_PARAM_FLAG_VALUE_CHANGE );
704
+ }
705
+
706
+ esp_err_t esp_rmaker_param_notify (const esp_rmaker_param_t * param )
707
+ {
708
+ if (!param ) {
709
+ ESP_LOGE (TAG , "Param handle cannot be NULL." );
710
+ return ESP_ERR_INVALID_ARG ;
711
+ }
712
+ ((_esp_rmaker_param_t * )param )-> flags |= (RMAKER_PARAM_FLAG_VALUE_CHANGE | RMAKER_PARAM_FLAG_VALUE_NOTIFY );
713
+ esp_err_t err = esp_rmaker_report_param_internal (RMAKER_PARAM_FLAG_VALUE_NOTIFY );
714
+ if (err != ESP_OK ) {
715
+ ESP_LOGW (TAG , "Failed to report parameter" );
716
+ }
717
+ return esp_rmaker_report_param_internal (RMAKER_PARAM_FLAG_VALUE_CHANGE );
692
718
}
693
719
694
720
esp_err_t esp_rmaker_param_update_and_report (const esp_rmaker_param_t * param , esp_rmaker_param_val_t val )
@@ -701,6 +727,16 @@ esp_err_t esp_rmaker_param_update_and_report(const esp_rmaker_param_t *param, es
701
727
return err ;
702
728
}
703
729
730
+ esp_err_t esp_rmaker_param_update_and_notify (const esp_rmaker_param_t * param , esp_rmaker_param_val_t val )
731
+ {
732
+ esp_err_t err = esp_rmaker_param_update (param , val );
733
+ /** Report parameter only if the RainMaker has started */
734
+ if ((err == ESP_OK ) && (esp_rmaker_get_state () == ESP_RMAKER_STATE_STARTED )) {
735
+ err = esp_rmaker_param_notify (param );
736
+ }
737
+ return err ;
738
+ }
739
+
704
740
char * esp_rmaker_param_get_name (const esp_rmaker_param_t * param )
705
741
{
706
742
if (!param ) {
@@ -718,3 +754,15 @@ char *esp_rmaker_param_get_type(const esp_rmaker_param_t *param)
718
754
}
719
755
return ((_esp_rmaker_param_t * )param )-> type ;
720
756
}
757
+
758
+ esp_err_t esp_rmaker_raise_alert (const char * alert_str )
759
+ {
760
+ char msg [ESP_RMAKER_MAX_ALERT_LEN + 1 ]; /* + 1 for NULL terminattion */
761
+ strlcpy (msg , alert_str , sizeof (msg ));
762
+ char buf [ESP_RMAKER_MAX_ALERT_LEN + RMAKER_ALERT_STR_MARGIN ];
763
+ snprintf (buf , sizeof (buf ), "{\"%s\":\"%s\"}" , ESP_RMAKER_ALERT_KEY , msg );
764
+ snprintf (publish_topic , sizeof (publish_topic ), "node/%s/%s" ,
765
+ esp_rmaker_get_node_id (), NODE_PARAMS_ALERT_TOPIC_SUFFIX );
766
+ ESP_LOGI (TAG , "Reporting alert: %s" , buf );
767
+ return esp_rmaker_mqtt_publish (publish_topic , buf , strlen (buf ), RMAKER_MQTT_QOS1 , NULL );
768
+ }
0 commit comments