@@ -144,51 +144,65 @@ void vdev_enumerate(device_record_t* record, void* arg)
144
144
145
145
json_object * cmd_value = json_object_new_object ();
146
146
command_class_t * vdev_cmd_class = vdev_manager_get_command_class (record -> nodeId );
147
- variant_t * value = command_class_exec (vdev_cmd_class , vdev_command -> name , record );
148
- char * string_value ;
149
- variant_to_string (value , & string_value );
150
147
151
- if (NULL == vdev_command -> data_holder )
148
+ // Get device record
149
+ device_record_t * device_record = resolver_resolve_id (record -> nodeId , 0 , vdev_command -> command_id );
150
+
151
+
152
+ if (NULL == device_record )
152
153
{
153
- // The string value is json string to be appended directly under "dh" key
154
- json_object_put (cmd_value );
155
- cmd_value = json_tokener_parse (string_value );
154
+ // We dont have resolver entry for this command class. Lets query the root device
155
+ device_record = record ;
156
156
}
157
- else if (strchr (vdev_command -> data_holder , '.' ) != NULL )
158
- {
159
- json_object * parameter_array = json_object_new_array ();
160
- char * data_holder = strdup (vdev_command -> data_holder );
161
- char * saveptr ;
162
- char * tok = strtok_r (data_holder , "." , & saveptr );
163
- json_object * dh_item = json_object_new_object ();
164
157
165
- if (NULL != tok )
158
+ if (NULL != device_record )
159
+ {
160
+ variant_t * value = command_class_exec (vdev_cmd_class , vdev_command -> name , device_record );
161
+ char * string_value ;
162
+ variant_to_string (value , & string_value );
163
+
164
+ if (NULL == vdev_command -> data_holder )
165
+ {
166
+ // The string value is json string to be appended directly under "dh" key
167
+ json_object_put (cmd_value );
168
+ cmd_value = json_tokener_parse (string_value );
169
+ }
170
+ else if (strchr (vdev_command -> data_holder , '.' ) != NULL )
166
171
{
172
+ json_object * parameter_array = json_object_new_array ();
173
+ char * data_holder = strdup (vdev_command -> data_holder );
174
+ char * saveptr ;
175
+ char * tok = strtok_r (data_holder , "." , & saveptr );
176
+ json_object * dh_item = json_object_new_object ();
177
+
178
+ if (NULL != tok )
179
+ {
180
+
181
+ json_object_object_add (dh_item , "data_holder" , json_object_new_string (tok ));
182
+ }
183
+
184
+ tok = strtok_r (NULL , "." , & saveptr );
185
+
186
+ if (NULL != tok )
187
+ {
188
+ json_object_object_add (dh_item , tok , json_object_new_string (string_value ));
189
+ }
167
190
168
- json_object_object_add (dh_item , "data_holder" , json_object_new_string (tok ));
191
+ json_object_array_add (parameter_array , dh_item );
192
+ json_object_object_add (cmd_value , "parameters" , parameter_array );
193
+ free (data_holder );
169
194
}
170
-
171
- tok = strtok_r (NULL , "." , & saveptr );
172
-
173
- if (NULL != tok )
195
+ else
174
196
{
175
- json_object_object_add (dh_item , tok , json_object_new_string (string_value ));
197
+
198
+ json_object_object_add (cmd_value , vdev_command -> data_holder , json_object_new_string (string_value ));
176
199
}
177
200
178
- json_object_array_add (parameter_array , dh_item );
179
- json_object_object_add (cmd_value , "parameters" , parameter_array );
180
- free (data_holder );
181
- }
182
- else
183
- {
184
-
185
- json_object_object_add (cmd_value , vdev_command -> data_holder , json_object_new_string (string_value ));
186
- }
187
-
188
- free (string_value );
189
- variant_free (value );
201
+ free (string_value );
202
+ variant_free (value );
190
203
191
- json_object_object_add (cmd_class , "dh" , cmd_value );
204
+ json_object_object_add (cmd_class , "dh" , cmd_value );
205
+ }
192
206
193
207
json_object_array_add (cmd_classes_array , cmd_class );
194
208
}
@@ -575,42 +589,56 @@ bool cmd_get_sensor_command_class_info(vty_t* vty, variant_stack_t* params)
575
589
bool get_sensor_command_class_data (vty_t * vty , ZWBYTE node_id , ZWBYTE instance_id , ZWBYTE command_id , const char * path )
576
590
{
577
591
json_object * json_resp = json_object_new_object ();
578
- const char * resolver_name = resolver_name_from_id (node_id , instance_id , command_id );
579
- if (NULL != resolver_name )
592
+
593
+ device_record_t * record = resolver_resolve_id (node_id , instance_id , command_id );
594
+
595
+ if (NULL == record )
580
596
{
581
- json_object_object_add (json_resp , "name" , json_object_new_string (resolver_name ));
582
-
583
- zdata_acquire_lock (ZDataRoot (zway ));
584
- ZDataHolder dh = zway_find_device_instance_cc_data (zway , node_id , instance_id , command_id , path );
585
-
586
- if (NULL == dh )
587
- {
588
- http_set_response ((http_vty_priv_t * )vty -> priv , HTTP_RESP_USER_ERR );
589
- }
590
- else
597
+ // Maybe its virtual device, lets get its root
598
+ const char * name = resolver_name_from_node_id (node_id );
599
+ if (NULL != name )
591
600
{
592
- json_object * device_data = json_object_new_object ();
593
- zway_json_data_holder_to_json (device_data , dh );
594
- json_object_object_add (json_resp , "device_data" , device_data );
595
- http_set_response ((http_vty_priv_t * )vty -> priv , HTTP_RESP_OK );
601
+ record = resolver_get_device_record (name );
596
602
}
597
- zdata_release_lock (ZDataRoot (zway ));
598
603
}
599
- else
604
+
605
+ if (NULL != record )
600
606
{
601
- resolver_name = resolver_name_from_node_id (node_id );
602
- if (NULL != resolver_name )
607
+ //const char* resolver_name = resolver_name_from_id (node_id, instance_id, command_id );
608
+ if (record -> devtype == ZWAVE )
603
609
{
604
- device_record_t * record = resolver_get_device_record (resolver_name );
605
- if (NULL != record && record -> devtype == VDEV )
610
+ json_object_object_add (json_resp , "name" , json_object_new_string (record -> deviceName ));
611
+
612
+ zdata_acquire_lock (ZDataRoot (zway ));
613
+ ZDataHolder dh = zway_find_device_instance_cc_data (zway , node_id , instance_id , command_id , path );
614
+
615
+ if (NULL == dh )
606
616
{
607
- // This is VDEV response...
608
- // { "name": "3.0.SensorBinary", "device_data": { "sensorTypeString": "General purpose", "level": false, "parameters": [ ] } }
617
+ http_set_response ((http_vty_priv_t * )vty -> priv , HTTP_RESP_USER_ERR );
618
+ }
619
+ else
620
+ {
621
+ json_object * device_data = json_object_new_object ();
622
+ zway_json_data_holder_to_json (device_data , dh );
623
+ json_object_object_add (json_resp , "device_data" , device_data );
624
+ http_set_response ((http_vty_priv_t * )vty -> priv , HTTP_RESP_OK );
625
+ }
626
+ zdata_release_lock (ZDataRoot (zway ));
627
+ }
628
+ else
629
+ {
630
+ // This is VDEV response...
631
+ // { "name": "3.0.SensorBinary", "device_data": { "sensorTypeString": "General purpose", "level": false, "parameters": [ ] } }
609
632
610
- json_object_object_add (json_resp , "name" , json_object_new_string (resolver_name ));
611
-
612
- vdev_t * vdev = vdev_manager_get_vdev (record -> deviceName );
633
+ json_object_object_add (json_resp , "name" , json_object_new_string (record -> deviceName ));
634
+
635
+ // Find root VDEV
636
+ const char * root_vdev_name = resolver_name_from_node_id (node_id );
613
637
638
+ if (NULL != root_vdev_name )
639
+ {
640
+ vdev_t * vdev = vdev_manager_get_vdev (root_vdev_name );
641
+
614
642
stack_for_each (vdev -> supported_method_list , vdev_command_variant )
615
643
{
616
644
vdev_command_t * vdev_command = VARIANT_GET_PTR (vdev_command_t , vdev_command_variant );
@@ -621,8 +649,14 @@ bool get_sensor_command_class_data(vty_t* vty, ZWBYTE node_id, ZWBYTE instanc
621
649
variant_t * value = command_class_exec (vdev_cmd_class , vdev_command -> name , record );
622
650
char * string_value ;
623
651
variant_to_string (value , & string_value );
624
-
625
- if (strchr (vdev_command -> data_holder , '.' ) != NULL )
652
+
653
+ if (NULL == vdev_command -> data_holder )
654
+ {
655
+ // The string value is json string to be appended directly under "dh" key
656
+ json_object_put (cmd_value );
657
+ cmd_value = json_tokener_parse (string_value );
658
+ }
659
+ else if (strchr (vdev_command -> data_holder , '.' ) != NULL )
626
660
{
627
661
char * data_holder = strdup (vdev_command -> data_holder );
628
662
char * saveptr ;
@@ -660,13 +694,11 @@ bool get_sensor_command_class_data(vty_t* vty, ZWBYTE node_id, ZWBYTE instanc
660
694
661
695
json_object_object_add (cmd_value , vdev_command -> data_holder , json_object_new_string (string_value ));
662
696
}
663
-
664
-
665
-
697
+
666
698
//json_object_object_add(cmd_value, vdev_command->data_holder, json_object_new_string(string_value));
667
699
free (string_value );
668
700
variant_free (value );
669
-
701
+
670
702
json_object_object_add (json_resp , "device_data" , cmd_value );
671
703
http_set_response ((http_vty_priv_t * )vty -> priv , HTTP_RESP_OK );
672
704
break ;
@@ -678,10 +710,10 @@ bool get_sensor_command_class_data(vty_t* vty, ZWBYTE node_id, ZWBYTE instanc
678
710
http_set_response ((http_vty_priv_t * )vty -> priv , HTTP_RESP_SERVER_ERR );
679
711
}
680
712
}
681
- else
682
- {
683
- http_set_response (( http_vty_priv_t * ) vty -> priv , HTTP_RESP_USER_ERR );
684
- }
713
+ }
714
+ else
715
+ {
716
+ http_set_response (( http_vty_priv_t * ) vty -> priv , HTTP_RESP_USER_ERR );
685
717
}
686
718
687
719
http_set_content_type ((http_vty_priv_t * )vty -> priv , CONTENT_TYPE_JSON );
0 commit comments