@sdetweil Thank you Sam! Can you please tell me what the letters in the bracket mean? (e, sdo, sde)
Read the statement by Michael Teeuw here.

Posts
-
RE: Volvo on Call
-
RE: Volvo on Call
@jerryp Hi Jerry - thank you for checking! I still stuck and I dont know where I’m doing something wrong. I dont want to give up because I know it is still working for you.
The weird thing is that the API works perfect. I can pull all informations from my car via
voc dashborad
.
Only the module is telling me: No vehicle foundThat is my current config:
{ module: "MMM-VolvoOnCall", disabled: false, debug: true, position: "top_left", config: { scanInterval: 1000 * 60 * 30, units: "metric", timestampFormat: "MMM D. HH:mm:ss", durationFormat: "HH:mm", display: { info: true, position: true, status: true, notice: true, trip: true, } } },
It is setup correctly I guess.
I’m wondering where in this node_helper.js is the
voc
pulled from? I’m not good in JavaScript :-(const exec = require('child_process').exec const spawn = require('child_process').spawn const moment = require("moment") var NodeHelper = require("node_helper") module.exports = NodeHelper.create({ start: function() { this.config = null this.carInfo = [] }, socketNotificationReceived: function(noti, payload) { if (noti == "SCAN") { this.scan() this.trip() } if (noti == "INIT") { this.config = payload this.list() } }, list: function() { exec("voc list", (e, sdo, sde)=>{ if (e) { console.log("[VOC] ERROR(>list):", e.toString()) } else { this.listResult(sdo) } }) }, listResult: function(output) { var re = /^([^ ]+)\s\(([^\)]+)\)\s([^ ]+)$/gm var matches = null var result = [] while (matches = re.exec(output)) { this.carInfo.push({ id: matches[1], type: matches[2], vin: matches[3] }) } if (this.carInfo.length > 0) { this.sendSocketNotification("INITIALIZED", this.carInfo) } else { console.log("[VOC] ERROR: No vehicle found. Check your account. Module stopped.") } }, scan: function() { exec("voc dashboard", (e, sdo, sde)=> { if (e) { console.log("[VOC] ERROR:", e.toString()) } else { this.scanResult(sdo) //this.sendSocketNotification("RESULT", sdo) } }) }, scanResult: function(output) { var carIndex = this.carInfo.map((value, index, array)=>{ return value.id }) var result = [] var re = /^([^\s]+)\s([\w\s]+)\:\s(.+)$/gm var matches = null while (matches = re.exec(output)) { var idx = carIndex.indexOf(matches[1]) var key = matches[2].trim() var value = this.reformValue(key, matches[3].trim()) if (typeof result[idx] == 'undefined') { result[idx] = [] } result[idx].push({ id: matches[1], key: key, value: value }) } if (Object.keys(result).length == 0) { console.log("[VOC] ERROR: No information could be retrieved.") console.log(output) } else { this.sendSocketNotification("SCAN_RESULT", result) } }, reformValue: function(key, value) { if (key == "Position") { var re = /([0-9\.\-]+)\,\s([0-9\.\-]+),\s\'([^\']+)\'/ var matches = re.exec(value) if (matches) { return { lat: matches[1], long: matches[2], time: moment(matches[3]).format("X") } } else { return null } } if (key == "Fuel level") { return value.replace(/\s/, "") } if (key == "Fuel amount" || key == "Range" || key == "Odometer" || key == "Average speed") { return value.replace(/[^0-9\.]+/g, '') } if (key == "Fuel consumption") { var re = /^([0-9\.]+)/g var matches = re.exec(value) if (matches) { return matches[1] } } return value }, trip: function() { for(var i = 0; i < this.carInfo.length; i++) { try { carId = this.carInfo[i].id var sdo = "" var result = spawn('voc', [ '-i', carId, '--json', 'trips' ]) result.stdout.on('data', (data)=>{ sdo += data }) result.on('close', (killcode)=>{ this.tripResult(carId, JSON.parse(sdo)) }) } catch (e) { console.log("[VOC] ERROR:", e.toString()) } } }, tripResult: function(carId, obj) { if (Array.isArray(obj) && obj.length > 0) { var trip = obj[0] var detail = trip.tripDetails[0] var ret = { title: trip.name, category: trip.category, note: trip.userNotes, fuelConsumption : detail.fuelConsumption, electricalConsumption : detail.electricalConsumption, electricalRegeneration: detail.electricalRegeneration, distance: detail.distance, startTime: moment(detail.startTime).format("X"), startPosition: detail.startPosition, endTime: moment(detail.endTime).format("X"), endPosition: detail.endPosition, } this.sendSocketNotification("TRIP_RESULT", {id:carId, data:ret}) } else { return } } })
-
RE: Volvo on Call
@jerryp Would you do me a favor and test it without the key or a wrong key? Just wondering if that is the issue
-
RE: Volvo on Call
@jerryp is it working for you without the map function? I’m actually not interested in it.
-
RE: Volvo on Call
Hey @jerryp - I’m getting the output as soon as I write
voc list
. So that seems to work.My config:
{ module: "MMM-VolvoOnCall", position: "top_right", config: { scanInterval: 1000 * 60 * 30, units: "metric", timestampFormat: "MMM D. HH:mm:ss", durationFormat: "HH:mm", } },
@JerryP Can you please share your config? I’m not sure what I’m doing wrong.
-
RE: Volvo on Call
I was able to fix the problem with the authorization issue (just reseted my password). So I’m able to pull the information with the python script from https://github.com/molobrakos/volvooncall.
Now I’m getting the following error as soon as I start the Mirror:
[28.02.2022 22:03.38.534] [LOG] [VOC] ERROR: No vehicle found. Check your account. Module stopped.
Which is weird because I can pull the data from my car by just typing
voc list
orvoc dashboard
Any advice would be really appreciated.
-
Volvo on Call
Hello there - I’m discovering the Volvo on Call API and I noticed that Volvo added a screenshot from a MagicMirror on their website. Does anyone knows to whom that belongs?
I tried to install the https://github.com/eouia/MMM-VolvoOnCall but I’m stuck. I’m getting an 401 Error with the message I’m unauthorised. :-/
https://developer.volvocars.com/volvo-api/
-
RE: Sequel of MMM-PublicTransportBerlin only displays "Loading..."
Hi @kai - I have the same issue and I noticed there is a problem with the BVG API service.
@KristjanESPERANTO just added a pull request. I guess, as soon as you do a
git pull
in the folder MMM-PublicTransportBerlin it should work. -
RE: Magic(Dashboard)Mirror
@vince Thank you! MMM-DarkSkyForecast isnt available anymore because Apple bought Dark Sky and decided to stop allowing free access to their weather API. @j-e-f-f create a new version with MMM-OpenWeatherForecast. Have a look at his post here: https://forum.magicmirror.builders/topic/9181/mmm-darkskyforecast-yet-another-weather-module