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.7k 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.
    • JerryPJ Offline
      JerryP @MZ-BER
      last edited by JerryP

      @mz-ber
      yes but now you miss the data in the config

      			module: "MMM-VolvoOnCall",
      			disabled: false, //false, true
      			position: "bottom_left",
      			config: {
      			units: "metric", 
      			mapConfig: {
      				apiKey: "",  // Your Google Map API Key
      			display: { // You can control which section will be displayed or not.
      				info: false,
      				position: false,
      				status: true,
      				notice: true,
      				trip: false,
      		}}},
      
      MZ-BERM 1 Reply Last reply Reply Quote 0
      • MZ-BERM Offline
        MZ-BER @JerryP
        last edited by

        @jerryp Okay, do I need an api key from google maps?

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

          @mz-ber
          yes i’f you use the map function. I have add the api and it’s working fine

          MZ-BERM 1 Reply Last reply Reply Quote 0
          • 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
                        • 1
                        • 2
                        • 3
                        • 4
                        • 1 / 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