MagicMirror Forum
    • Recent
    • Tags
    • Unsolved
    • Solved
    • MagicMirror² Repository
    • Documentation
    • 3rd-Party-Modules
    • Donate
    • Discord
    • Register
    • Login
    1. Home
    2. MZ-BER
    3. Posts
    A New Chapter for MagicMirror: The Community Takes the Lead
    Read the statement by Michael Teeuw here.
    Offline
    • Profile
    • Following 1
    • Followers 7
    • Topics 9
    • Posts 83
    • Groups 0

    Posts

    Recent Best Controversial
    • RE: Volvo on Call

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

      posted in Troubleshooting
      MZ-BERM
      MZ-BER
    • 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 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
          }
        }
      
      })
      
      posted in Troubleshooting
      MZ-BERM
      MZ-BER
    • 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

      posted in Troubleshooting
      MZ-BERM
      MZ-BER
    • RE: Volvo on Call

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

      posted in Troubleshooting
      MZ-BERM
      MZ-BER
    • RE: Volvo on Call

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

      posted in Troubleshooting
      MZ-BERM
      MZ-BER
    • RE: Volvo on Call

      Hey @jerryp - I’m getting the output as soon as I write voc list. So that seems to work.

      f60f9ae1-a829-42ba-8a4d-fc17b43b10c6-image.png

      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.

      posted in Troubleshooting
      MZ-BERM
      MZ-BER
    • 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 or voc dashboard

      Any advice would be really appreciated.

      posted in Troubleshooting
      MZ-BERM
      MZ-BER
    • 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/

      6e088e37-0f02-4f9b-b3f1-7249cec02d7b-image.png

      posted in Troubleshooting
      MZ-BERM
      MZ-BER
    • 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.

      posted in Troubleshooting
      MZ-BERM
      MZ-BER
    • 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

      posted in Show your Mirror
      MZ-BERM
      MZ-BER
    • 1 / 1