OvmsMetricVector<string> causing console.log error
Hi, I am trying to resolve the ovms web interface throwing an "undefined" error because the following metric is defined with OvmsMetricVector<string> and does not get quoted when parsed to JSON.parse(ev.data) in ovms.js. Output from console error log: "xnl.v.c.duration.label":[full.l2,full.l1,full.l0,range.l2,range.l1,range.l0] However, when using JSON.print(OvmsMetrics.GetValues("xnl.v.c.duration.label")) a properly formed json string is returned: "xnl.v.c.duration.label": [ "full.l2", "full.l1", "full.l0", "range.l2", "range.l1", "range.l0" ] Can this be corrected at the ev.data source or use JSON.print on ev.data before parsing it? Kind regards Derek
Derek, see ovms_metrics.h: /** * OvmsMetricVector<type>: metric wrapper for std::vector<type> * - string representation as comma separated values * - TODO: escaping / string encoding for non-numeric types … The template hasn't been specialized for non-numeric types yet, simply as they haven't been needed up to now. You're welcome to add this template specialization. DukPush() works without specialization because the DukContext.Push() method has specializations for the most common types, and Duktape knows about the types added to the array. AsString() and SetValue(string) need special handling for string vectors (quotes & escapes). AsJSON() is used for the websocket transport of metrics. If you can use json_encode() for AsString(), AsJSON() doesn't need additional handling, but you'll need to add a string parser to SetValue(), as std::quoted cannot handle JSON encoded strings. Regards, Michael Am 06.09.20 um 12:07 schrieb Derek Caudwell:
Hi,
I am trying to resolve the ovms web interface throwing an "undefined" error because the following metric is defined with OvmsMetricVector<string> and does not get quoted when parsed to JSON.parse(ev.data) in ovms.js.
Output from console error log: "xnl.v.c.duration.label":[full.l2,full.l1,full.l0,range.l2,range.l1,range.l0]
However, when using JSON.print(OvmsMetrics.GetValues("xnl.v.c.duration.label")) a properly formed json string is returned: "xnl.v.c.duration.label": [ "full.l2", "full.l1", "full.l0", "range.l2", "range.l1", "range.l0" ]
Can this be corrected at the ev.data source or use JSON.print on ev.data before parsing it?
Kind regards Derek
_______________________________________________ OvmsDev mailing list OvmsDev@lists.openvehicles.com http://lists.openvehicles.com/mailman/listinfo/ovmsdev
-- Michael Balzer * Helkenberger Weg 9 * D-58256 Ennepetal Fon 02333 / 833 5735 * Handy 0176 / 206 989 26
participants (2)
-
Derek Caudwell -
Michael Balzer