MagicMirror Forum
    • Recent
    • Tags
    • Unsolved
    • Solved
    • MagicMirror² Repository
    • Documentation
    • 3rd-Party-Modules
    • Donate
    • Discord
    • Register
    • Login
    A New Chapter for MagicMirror: The Community Takes the Lead
    Read the statement by Michael Teeuw here.

    Volvo on Call

    Scheduled Pinned Locked Moved Solved Troubleshooting
    34 Posts 4 Posters 9.6k Views 4 Watching
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • MZ-BERM Offline
      MZ-BER @JerryP
      last edited by

      @jerryp is it working for you without the map function? I’m actually not interested in it.

      JerryPJ 1 Reply Last reply Reply Quote 0
      • JerryPJ Offline
        JerryP @MZ-BER
        last edited by

        @mz-ber
        Yes but i have put the api key in the config. I dont have try it whitout the key

        MZ-BERM 1 Reply Last reply Reply Quote 0
        • MZ-BERM Offline
          MZ-BER @JerryP
          last edited by

          @jerryp Would you do me a favor and test it without the key or a wrong key? Just wondering if that is the issue

          JerryPJ 1 Reply Last reply Reply Quote 0
          • JerryPJ Offline
            JerryP @MZ-BER
            last edited by

            @mz-ber
            yes it’s working like above whit out api key

            MZ-BERM 1 Reply Last reply Reply Quote 0
            • MZ-BERM Offline
              MZ-BER @JerryP
              last edited by

              @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 found

              67c14e9f-cf68-4f2a-a410-4ec4b5289826-image.png

              That 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
                  }
                }
              
              })
              
              S 1 Reply Last reply Reply Quote 0
              • S Offline
                sdetweil @MZ-BER
                last edited by

                @mz-ber

                list: function() {
                    exec("voc list", (e, sdo, sde)=>{
                      if (e) {
                        console.log("[VOC] ERROR(>list):", e.toString())
                      } else {
                        this.listResult(sdo)
                      }
                    })
                  },
                

                then the good results are parsed in listResult()

                Sam

                How to add modules

                learning how to use browser developers window for css changes

                MZ-BERM 1 Reply Last reply Reply Quote 0
                • MZ-BERM Offline
                  MZ-BER @sdetweil
                  last edited by

                  @sdetweil Thank you Sam! Can you please tell me what the letters in the bracket mean? (e, sdo, sde)

                  MZ-BERM 1 Reply Last reply Reply Quote 0
                  • MZ-BERM Offline
                    MZ-BER @MZ-BER
                    last edited by MZ-BER

                    @mz-ber Oh I guess I understand. If the function is not getting the right details than -> e if everything is okay than -> sdo

                    S 1 Reply Last reply Reply Quote 0
                    • S Offline
                      sdetweil @MZ-BER
                      last edited by sdetweil

                      @mz-ber exec(“voc list”, (e, sdo, sde)=

                      execs the command “voc list”
                      and the exec function returns
                      error (e)
                      stdout (sdo)
                      and stderr(sde)

                      so if no error (e is null)

                      it sends the command output to the listResults function

                      Sam

                      How to add modules

                      learning how to use browser developers window for css changes

                      MZ-BERM 1 Reply Last reply Reply Quote 0
                      • MZ-BERM Offline
                        MZ-BER @sdetweil
                        last edited by

                        @sdetweil Thank you for the explanation. Is the function executing voc list in the terminal? If I’m doing manually voc list I’m getting a result.

                        Is there a way to see what the script is getting back in detail?

                        Again, thank you very much!

                        S 1 Reply Last reply Reply Quote 0
                        • 1
                        • 2
                        • 3
                        • 4
                        • 2 / 4
                        • First post
                          Last post
                        Enjoying MagicMirror? Please consider a donation!
                        MagicMirror created by Michael Teeuw.
                        Forum managed by Sam, technical setup by Karsten.
                        This forum is using NodeBB as its core | Contributors
                        Contact | Privacy Policy