FiatTripData: bekijk de ecoDrive data

devoloper
Berichten: 8
Lid geworden op: vr mar 30, 2012 8:16

Re: FiatTripData: bekijk de ecoDrive data

Bericht door devoloper »

Het is me eindelijk gelukt!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Ik heb de structuur van de bin-files doorgrond en ben nu in staat deze mbv een Excel-macro in te lezen. De data staat binair opgeslagen in de files.
Hoef ik tenminste niet eerste de data te uploaden via Adobe Air, maar kan de data direct van mijn USB inlezen. Heb dan natuurlijk niet zo'n luxe evaluatie van mijn rijgedrag, maar daar zat ik toch niet op te wachten.

Als er interesse voor bestaat, wil ik dit macro'tje wel online zetten.
Gebruikersavatar
SANDER
Junior Stato
Berichten: 307
Lid geworden op: di mei 22, 2007 21:24
Locatie: Amsterdam

Re: FiatTripData: bekijk de ecoDrive data

Bericht door SANDER »

devoloper schreef:Het is me eindelijk gelukt!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Ik heb de structuur van de bin-files doorgrond en ben nu in staat deze mbv een Excel-macro in te lezen. De data staat binair opgeslagen in de files.
Hoef ik tenminste niet eerste de data te uploaden via Adobe Air, maar kan de data direct van mijn USB inlezen. Heb dan natuurlijk niet zo'n luxe evaluatie van mijn rijgedrag, maar daar zat ik toch niet op te wachten.

Als er interesse voor bestaat, wil ik dit macro'tje wel online zetten.

Heel graag!! En kun je een korte handleiding erbij doen svp?
Sander: De trotse ex-eigenaar van een bij Savali gechipte (145 pk, 240 nm) zwarte GP 1.4 T-jet SPORT

17" Velgen, Blue&me, Cruisecontrol, Zwarte zijknipperlichten, Pipercross luchtfilter.


Inmiddels de trotse eigenaar van een Focus 1.6 ecoboost
Gebruikersavatar
OlafH
Junior Stato
Berichten: 423
Lid geworden op: wo aug 24, 2011 22:57
Locatie: Veenendaal
Contacteer:

Re: FiatTripData: bekijk de ecoDrive data

Bericht door OlafH »

graag!
Phantom
Junior Stato
Berichten: 299
Lid geworden op: vr apr 06, 2012 19:13

Re: FiatTripData: bekijk de ecoDrive data

Bericht door Phantom »

Ik zeg doen !!. :-]
paul1959
Berichten: 6
Lid geworden op: vr apr 27, 2012 18:02

Re: FiatTripData: bekijk de ecoDrive data

Bericht door paul1959 »

Zou mooi zijn deze macro. :-]
Fiat Punto Evo 1.3 Multi Jet Glory White. KM 50.000 gem 4,2lt per 100 km.
devoloper
Berichten: 8
Lid geworden op: vr mar 30, 2012 8:16

Re: FiatTripData: bekijk de ecoDrive data

Bericht door devoloper »

Oke, belofte maakt schuld. Ben benieuwd naar jullie ervaringen!

Open in Excel een nieuw bestand, neem een kort macro op, zodat je vervolgens naar de macro-code kunt gaan.
Wis het opgenomen macro'tje en voeg onderstaande code in:

Function Chr2Hex(InputChr As Integer) As String
ReturnStr = Hex(InputChr)
If Len(ReturnStr) = 1 Then
ReturnStr = "0" + ReturnStr
End If
Chr2Hex = ReturnStr
End Function

Function Hex2Dec(HexNumber As String) As Long
Hex2Dec = CLng("&H" & HexNumber)
End Function

Sub Read_Trip_Data()
Dim FileToOpen As Variant
Dim FilePos, FileSize As Long
Dim ByteValue As Integer
Dim StartTimeStr, KMStr As String

Windows(Application.ThisWorkbook.Name).Activate
'Check for presence of sheet "DATA" and create this sheet if not found
Workbookname = ActiveWorkbook.Name
SheetPresent = False
For i = 1 To Sheets.Count
If UCase(Sheets(i).Name) = "DATA" Then
DataSheet = i
Sheets(i).Select
SheetPresent = True
Exit For
End If
Next i
If Not SheetPresent Then
Sheets.Add(, Sheets(Sheets.Count)).Name = "Data"
DataSheet = Sheets.Count
Sheets(DataSheet).Select
ActiveWindow.Zoom = 60
Columns("B:Z").HorizontalAlignment = xlCenter
Columns(1).ColumnWidth = 50
Columns(2).ColumnWidth = 15
Columns("C:Z").ColumnWidth = 11
Range("A2").Select
ActiveWindow.FreezePanes = True

Cells(1, 1) = "filenaam"
Cells(1, 2) = "datum"
Cells(1, 3) = "km-stand begin"
Cells(1, 4) = "km-stand eind"
Cells(1, 5) = "trip afstand"
Cells(1, 6) = "triptijd"
Cells(1, 7) = "gem. snelheid"
Cells(1, 8) = "max. snelheid"
Cells(1, 9) = "gem.verbr. [km/l]"
Cells(1, 10) = "verbruik [liter]"
Cells(1, 11) = "max. toeren"
Cells(1, 12) = "actie radius"
Cells(1, 13) = "buiten temp.[°C]"
Rows("1:1").VerticalAlignment = xlCenter
Rows("1:1").WrapText = True
End If

'find first free row in Sheet "DATA"
DataRow = Sheets("Data").Cells(Cells.Rows.Count, "B").End(xlUp).Row

FileToOpen = Application.GetOpenFilename _
(FileFilter:="Bin files (*.bin), *.bin", _
Title:="Read bin file", MultiSelect:=True)

On Error GoTo ErrorHandler
FilesSelected = (FileToOpen <> False)
On Error GoTo 0
If FilesSelected Then
For Each File2Open In FileToOpen
Open File2Open For Binary Access Read As #1
If Err.Number <> 0 Then
Sheets(DataSheet).Cells(DataRow, 10) = "Error opening file"
Err.Clear
Else
'Application.ScreenUpdating = False
FileSize = LOF(1)
FileStr = Input(FileSize, #1)
Close #1

BinFilename = File2Open
Do
SearchPos = InStr(1, BinFilename, "\")
If SearchPos > 0 Then BinFilename = Mid(BinFilename, SearchPos + 1)
Loop Until SearchPos = 0

FilePos = 28
Do 'start of new session, reset variables
DataRow = DataRow + 1
Cells(DataRow, 1) = BinFilename

EndOfSession = False
FirstTripDistance = -1
TripDistanceLoops = 0
TotalFuelCons = 0
NrOfSets = 0
MaxSpeed = 0
MaxEngine = 0
NrExtTemp = 0
ExtTemp = 0

Do
ByteValue = Asc(Mid(FileStr, FilePos + 1, 1))
SetStart = Int(ByteValue / 16)
Select Case SetStart
Case 0: NrOfBytes = 14 'start set met datum, tijd en km-stand
Case 4: NrOfBytes = 13 'normale set met tijd, toeren, snelheid, verbruik in liter/uur en verbruik in km/liter
Case 5: NrOfBytes = 5 'set met alleen buitentemperatuur
Case 7: NrOfBytes = 3 'afsluitende set met triptijd
Case 1: NrOfBytes = 21 'afsluitende set met triptijd, km-stand en actie-radius
End Select

setStr = ""
For i = 1 To NrOfBytes
setStr = setStr + Chr2Hex(Asc(Mid(FileStr, FilePos + i, 1)))
Next i
FilePos = FilePos + NrOfBytes

If SetStart = 0 Then 'start set met datum&tijd en km-stand
StartTimeStr = ""
For i = 1 To 4
StartTimeStr = StartTimeStr + Mid(setStr, 10 - 2 * i, 2)
Next i
Cells(DataRow, 2).NumberFormat = "dd/mm/yy hh:mm;@"
Cells(DataRow, 2) = 367 + 36525 + Hex2Dec(Left(StartTimeStr, 4)) * (65536 / 24 / 3600) + Hex2Dec(Right(StartTimeStr, 4)) / 24 / 3600
DummyStr = Mid(Hex(Hex2Dec(Mid(setStr, 10, 5)) * 2), 2, 5)
KMStr = Right(DummyStr, 1) + Mid(DummyStr, 3, 2) + Left(DummyStr, 2)
Cells(DataRow, 3) = Hex2Dec(KMStr)
End If

If SetStart = 4 Then 'set met tijdstip, toeren, snelheid, verbruik
NrOfSets = NrOfSets + 1
TimeStamp = Hex2Dec(Mid(setStr, 4, 2)) * 256 + Hex2Dec(Mid(setStr, 2, 2)) '[seconds]
EngineSpeed = Hex2Dec(Mid(Hex(Hex2Dec(Mid(setStr, 6, 3)) * 2), 2, 2)) * 32 '[rotations]
If EngineSpeed > MaxEngine Then MaxEngine = EngineSpeed
VehicleSpeed = (256 * Int(Hex2Dec(Mid(setStr, 11, 2)) / 8) + Hex2Dec(Mid(setStr, 9, 2))) * 0.06415 '[km/h], geen 0,0625
If VehicleSpeed > MaxSpeed Then MaxSpeed = VehicleSpeed
DummyStr = Mid(Hex(Hex2Dec(Mid(setStr, 18, 5)) * 2), 2, 4)
InstFuelConsumption = Hex2Dec(Mid(DummyStr, 3, 2) + Left(DummyStr, 2)) * 0.0022 '[l/h]
TotalFuelCons = TotalFuelCons + InstFuelConsumption
FuelDigit1 = Hex2Dec("0" & Mid(setStr, 13, 1))
FuelDigit2 = Hex2Dec("0" & Mid(Hex(Hex2Dec(Mid(setStr, 14, 2)) * 2), 2, 1))
FuelDigit3 = Hex2Dec("0" & Mid(Hex(Hex2Dec(Mid(setStr, 15, 2)) * 4), 2, 1))
TripDistance = Int(Hex2Dec(Mid(setStr, 23, 3)) / 4) - 256 '[*9,8 m]
If FirstTripDistance < 0 Then
FirstTripDistance = TripDistance
PreviousTripDistance = TripDistance
End If
If PreviousTripDistance - TripDistance > 200 Then TripDistanceLoops = TripDistanceLoops + 1
PreviousTripDistance = TripDistance
End If

If SetStart = 5 Then
NrExtTemp = NrExtTemp + 1
ExtTemp = ExtTemp + Hex2Dec(Mid(setStr, 7, 2))
End If

If SetStart = 1 Then
KMStr = Mid(Hex(Hex2Dec(Mid(setStr, 6, 5)) * 2), 2, 5)
Cells(DataRow, 4) = Hex2Dec(Right(KMStr, 1) & Mid(KMStr, 3, 2) & Left(KMStr, 2))
Cells(DataRow, 6).NumberFormat = "h:mm:ss"
Cells(DataRow, 6).HorizontalAlignment = xlCenter
Cells(DataRow, 6) = (Hex2Dec(Mid(setStr, 4, 2)) * 256 + Hex2Dec(Mid(setStr, 2, 2))) / 3600 / 24 'Timestamp
KmLeftStr = Mid(Hex(Hex2Dec(Mid(setStr, 21, 4)) * 2), 2, 4)
Cells(DataRow, 12) = Int(Hex2Dec(Right(KmLeftStr, 2)) / 32) * 256 + Hex2Dec(Left(KmLeftStr, 2))
Cells(DataRow, 13).NumberFormat = "0.0"
If NrExtTemp > 0 Then Cells(DataRow, 13) = ExtTemp / NrExtTemp / 2 - 40
If (FileSize - FilePos > 8) Then EndOfSession = True
End If

If SetStart = 7 Then
Cells(DataRow, 6).NumberFormat = "h:mm:ss"
Cells(DataRow, 6).HorizontalAlignment = xlCenter
Cells(DataRow, 6) = (Hex2Dec(Mid(setStr, 4, 2)) * 256 + Hex2Dec(Mid(setStr, 2, 2))) / 3600 / 24 'Timestamp
If NrOfSets > 0 Then
Cells(DataRow, 5).NumberFormat = "0.00" 'TripDistance
TripDistanceKM = (TripDistance - FirstTripDistance + 256 * TripDistanceLoops) * 0.01 'geen 0.098
Cells(DataRow, 5) = TripDistanceKM
Cells(DataRow, 7).NumberFormat = "0.0" 'Average Speed
Cells(DataRow, 7) = TripDistanceKM / (NrOfSets / 3600)
Cells(DataRow, 8).NumberFormat = "0.0" 'Max Speed
Cells(DataRow, 8) = MaxSpeed
FuelConsumptionLiter = TotalFuelCons / 3600
If FuelConsumptionLiter > 0.05 Then
Cells(DataRow, 9).NumberFormat = "0.0" 'Average Fuel Consumption
Cells(DataRow, 9) = TripDistanceKM / FuelConsumptionLiter
End If
Cells(DataRow, 10).NumberFormat = "0.000" 'Fuel in liters
Cells(DataRow, 10) = FuelConsumptionLiter
Cells(DataRow, 11) = MaxEngine
'Cells(DataRow, 15) = NrOfSets
End If
If (FileSize - FilePos > 5) Then
If (Int(Asc(Mid(FileStr, FilePos + 1, 1)) / 16) <> 1) Then EndOfSession = True
End If
End If
Loop Until (FileSize - FilePos < 5) Or EndOfSession
Application.ScreenUpdating = True
Loop Until FileSize - FilePos < 5
End If
Next File2Open
End If
MsgBox "Ready"
Exit Sub

ErrorHandler:
FilesSelected = True
Resume Next

End Sub ' of Read_Trip_Data

Sub Read_Complete_Trip()
Dim FileToOpen As Variant
Dim FilePos, FileSize As Long
Dim ByteValue As Integer
Dim StartTimeStr, KMStr As String

Windows(Application.ThisWorkbook.Name).Activate

FileToOpen = Application.GetOpenFilename _
(FileFilter:="Bin files (*.bin), *.bin", _
Title:="Read bin file", MultiSelect:=False)

ShowData = False

On Error GoTo ErrorHandler
FilesSelected = (FileToOpen <> False)
On Error GoTo 0
If FilesSelected Then
'For Each File2Open In FileToOpen
Open FileToOpen For Binary Access Read As #1
If Err.Number <> 0 Then
MsgBox "Error opening file " & FileToOpen
Err.Clear
Else
FileSize = LOF(1)
FileStr = Input(FileSize, #1)
Close #1

BinFilename = FileToOpen
Do
SearchPos = InStr(1, BinFilename, "\")
If SearchPos > 0 Then BinFilename = Mid(BinFilename, SearchPos + 1)
Loop Until SearchPos = 0

FilePos = 28
Do 'start of new session, reset variables
EndOfSession = False
FirstTripDistance = -1
TripDistanceLoops = 0

Do
ByteValue = Asc(Mid(FileStr, FilePos + 1, 1))
SetStart = Int(ByteValue / 16)
Select Case SetStart
Case 0: NrOfBytes = 14 'start set met datum, tijd en km-stand
Case 4: NrOfBytes = 13 'normale set met tijd, toeren, snelheid, verbruik in liter/uur en verbruik in km/liter
Case 5: NrOfBytes = 5 'set met alleen buitentemperatuur
Case 7: NrOfBytes = 3 'afsluitende set met triptijd
Case 1: NrOfBytes = 21 'afsluitende set met triptijd, km-stand en actie-radius
End Select

setStr = ""
For i = 1 To NrOfBytes
setStr = setStr + Chr2Hex(Asc(Mid(FileStr, FilePos + i, 1)))
Next i
FilePos = FilePos + NrOfBytes

If SetStart = 0 Then 'startset met datum&tijd en km-stand
ShowData = True
StartTimeStr = ""
For i = 1 To 4
StartTimeStr = StartTimeStr + Mid(setStr, 10 - 2 * i, 2)
Next i
StartTime = 36892 + Hex2Dec(Left(StartTimeStr, 4)) * (65536 / 24 / 3600) + Hex2Dec(Right(StartTimeStr, 4)) / 24 / 3600
DateStr = Format(StartTime, "dd-mm-yy")

'Check for presence of the sheet with the specified date and create this sheet if not found
SheetPresent = False
For i = 1 To Sheets.Count
If UCase(Sheets(i).Name) = DateStr Then
TripSheet = i
Sheets(i).Select
SheetPresent = True
Exit For
End If
Next i
If Not SheetPresent Then
Sheets.Add(, Sheets(Sheets.Count)).Name = DateStr
TripSheet = Sheets.Count
Sheets(TripSheet).Select
ActiveWindow.Zoom = 60
Columns("A:J").HorizontalAlignment = xlCenter
Columns("A:J").ColumnWidth = 10
Cells(1, 1) = "tijd": Cells(2, 1) = "[sec]"
Cells(1, 2) = "toeren": Cells(2, 2) = "[rpm]"
Cells(1, 3) = "snelheid": Cells(2, 3) = "[km/h]"
Cells(1, 4) = "verbruik": Cells(2, 4) = "[l/h]"
Cells(1, 5) = "verbruik": Cells(2, 5) = "[km/l]"
Cells(1, 6) = "afstand": Cells(2, 6) = "[m]"
Cells(1, 7) = "temp.": Cells(2, 7) = "[°C]"
Cells(1, 8) = "km-stand": Cells(2, 8) = "[km]"
Cells(1, 9) = "datum"
Cells(1, 10) = "tijd"
Cells(1, 11) = "filenaam"
Range("A3").Select
ActiveWindow.FreezePanes = True
End If
DataRow = Cells(Cells.Rows.Count, "A").End(xlUp).Row + 1

KMStr = Mid(Hex(Hex2Dec(Mid(setStr, 10, 5)) * 2), 2, 5)
Cells(DataRow, 8) = Hex2Dec(Right(KMStr, 1) + Mid(KMStr, 3, 2) + Left(KMStr, 2))
Cells(DataRow, 9).NumberFormat = "dd-mm-yy": Cells(DataRow, 9) = StartTime
Cells(DataRow, 10).NumberFormat = "hh:mm": Cells(DataRow, 10) = StartTime
Cells(DataRow, 11) = BinFilename
Application.ScreenUpdating = False
End If 'SetStart = 0

If SetStart = 4 Then 'set met tijdstip, toeren, snelheid, verbruik
TimeStamp = Hex2Dec(Mid(setStr, 4, 2)) * 256 + Hex2Dec(Mid(setStr, 2, 2)) '[seconds]
EngineSpeed = Hex2Dec(Mid(Hex(Hex2Dec(Mid(setStr, 6, 3)) * 2), 2, 2)) * 32 '[rotations]
VehicleSpeed = (256 * Int(Hex2Dec(Mid(setStr, 11, 2)) / 8) + Hex2Dec(Mid(setStr, 9, 2))) * 0.06415 '[km/h], geen 0,0625
DummyStr = Mid(Hex(Hex2Dec(Mid(setStr, 18, 5)) * 2), 2, 4)
InstFuelConsumption = Hex2Dec(Mid(DummyStr, 3, 2) + Left(DummyStr, 2)) * 0.0022 '[l/h]
TotalFuelCons = TotalFuelCons + InstFuelConsumption
FuelDigit1 = Hex2Dec("0" & Mid(setStr, 13, 1))
FuelDigit2 = Hex2Dec("0" & Mid(Hex(Hex2Dec(Mid(setStr, 14, 2)) * 2), 2, 1))
FuelDigit3 = Hex2Dec("0" & Mid(Hex(Hex2Dec(Mid(setStr, 15, 2)) * 4), 2, 1))
TripDistance = Int(Hex2Dec(Mid(setStr, 23, 3)) / 4) - 256 '[*9,8 m]
If FirstTripDistance < 0 Then
FirstTripDistance = TripDistance
PreviousTripDistance = TripDistance
End If
If PreviousTripDistance - TripDistance > 200 Then TripDistanceLoops = TripDistanceLoops + 1
PreviousTripDistance = TripDistance
If ShowData Then
DataRow = DataRow + 1
Cells(DataRow, 1) = TimeStamp
Cells(DataRow, 2) = EngineSpeed
Cells(DataRow, 3) = VehicleSpeed
Cells(DataRow, 4) = InstFuelConsumption
Cells(DataRow, 5) = FuelDigit1 * 10 + FuelDigit2 + FuelDigit3 * 0.1
Cells(DataRow, 6) = (TripDistance - FirstTripDistance + 256 * TripDistanceLoops) * 10
'Cells(DataRow, 8) = FilePos - NrOfBytes
'Cells(DataRow, 9) = setStr
If DataRow > 65000 Then ShowData = False
End If
End If 'SetStart = 4

If SetStart = 5 Then
If ShowData Then Cells(DataRow, 7) = Hex2Dec(Mid(setStr, 7, 2)) / 2 - 40
End If

If SetStart = 1 Then
KMStr = Mid(Hex(Hex2Dec(Mid(setStr, 6, 5)) * 2), 2, 5)
If ShowData Then Cells(DataRow, 8) = Hex2Dec(Right(KMStr, 1) & Mid(KMStr, 3, 2) & Left(KMStr, 2))
ShowData = False
Application.ScreenUpdating = True
If (FileSize - FilePos > 5) Then EndOfSession = True
End If

If SetStart = 7 Then
Application.ScreenUpdating = True
If (FileSize - FilePos > 5) Then
If (Int(Asc(Mid(FileStr, FilePos + 1, 1)) / 16) <> 1) Then
Application.ScreenUpdating = True
ShowData = False
EndOfSession = True
End If
End If
End If
Loop Until (FileSize - FilePos < 5) Or EndOfSession
Loop Until FileSize - FilePos < 5
Application.ScreenUpdating = True
End If 'Err.Number=0
End If 'FilesSelected
MsgBox "Ready"
Exit Sub

ErrorHandler:
FilesSelected = True
Resume Next

End Sub ' of Read_Complete_Trip
devoloper
Berichten: 8
Lid geworden op: vr mar 30, 2012 8:16

Re: FiatTripData: bekijk de ecoDrive data

Bericht door devoloper »

zie net dat er een aantal lachebekjes in staan. Dat moet "8)" zijn.
devoloper
Berichten: 8
Lid geworden op: vr mar 30, 2012 8:16

Re: FiatTripData: bekijk de ecoDrive data

Bericht door devoloper »

voor alle zekerheid nog een keer de code:

Function Chr2Hex(InputChr As Integer) As String
ReturnStr = Hex(InputChr)
If Len(ReturnStr) = 1 Then
ReturnStr = "0" + ReturnStr
End If
Chr2Hex = ReturnStr
End Function

Function Hex2Dec(HexNumber As String) As Long
Hex2Dec = CLng("&H" & HexNumber)
End Function

Sub Read_Trip_Data()
Dim FileToOpen As Variant
Dim FilePos, FileSize As Long
Dim ByteValue As Integer
Dim StartTimeStr, KMStr As String

Windows(Application.ThisWorkbook.Name).Activate
'Check for presence of sheet "DATA" and create this sheet if not found
Workbookname = ActiveWorkbook.Name
SheetPresent = False
For i = 1 To Sheets.Count
If UCase(Sheets(i).Name) = "DATA" Then
DataSheet = i
Sheets(i).Select
SheetPresent = True
Exit For
End If
Next i
If Not SheetPresent Then
Sheets.Add(, Sheets(Sheets.Count)).Name = "Data"
DataSheet = Sheets.Count
Sheets(DataSheet).Select
ActiveWindow.Zoom = 60
Columns("B:Z").HorizontalAlignment = xlCenter
Columns(1).ColumnWidth = 50
Columns(2).ColumnWidth = 15
Columns("C:Z").ColumnWidth = 11
Range("A2").Select
ActiveWindow.FreezePanes = True

Cells(1, 1) = "filenaam"
Cells(1, 2) = "datum"
Cells(1, 3) = "km-stand begin"
Cells(1, 4) = "km-stand eind"
Cells(1, 5) = "trip afstand"
Cells(1, 6) = "triptijd"
Cells(1, 7) = "gem. snelheid"
Cells(1, 8) = "max. snelheid"
Cells(1, 9) = "gem.verbr. [km/l]"
Cells(1, 10) = "verbruik [liter]"
Cells(1, 11) = "max. toeren"
Cells(1, 12) = "actie radius"
Cells(1, 13) = "buiten temp.[°C]"
Rows("1:1").VerticalAlignment = xlCenter
Rows("1:1").WrapText = True
End If

'find first free row in Sheet "DATA"
DataRow = Sheets("Data").Cells(Cells.Rows.Count, "B").End(xlUp).Row

FileToOpen = Application.GetOpenFilename _
(FileFilter:="Bin files (*.bin), *.bin", _
Title:="Read bin file", MultiSelect:=True)

On Error GoTo ErrorHandler
FilesSelected = (FileToOpen <> False)
On Error GoTo 0
If FilesSelected Then
For Each File2Open In FileToOpen
Open File2Open For Binary Access Read As #1
If Err.Number <> 0 Then
Sheets(DataSheet).Cells(DataRow, 10) = "Error opening file"
Err.Clear
Else
'Application.ScreenUpdating = False
FileSize = LOF(1)
FileStr = Input(FileSize, #1)
Close #1

BinFilename = File2Open
Do
SearchPos = InStr(1, BinFilename, "\")
If SearchPos > 0 Then BinFilename = Mid(BinFilename, SearchPos + 1)
Loop Until SearchPos = 0

FilePos = 28
Do 'start of new session, reset variables
DataRow = DataRow + 1
Cells(DataRow, 1) = BinFilename

EndOfSession = False
FirstTripDistance = -1
TripDistanceLoops = 0
TotalFuelCons = 0
NrOfSets = 0
MaxSpeed = 0
MaxEngine = 0
NrExtTemp = 0
ExtTemp = 0

Do
ByteValue = Asc(Mid(FileStr, FilePos + 1, 1))
SetStart = Int(ByteValue / 16)
Select Case SetStart
Case 0: NrOfBytes = 14 'start set met datum, tijd en km-stand
Case 4: NrOfBytes = 13 'normale set met tijd, toeren, snelheid, verbruik in liter/uur en verbruik in km/liter
Case 5: NrOfBytes = 5 'set met alleen buitentemperatuur
Case 7: NrOfBytes = 3 'afsluitende set met triptijd
Case 1: NrOfBytes = 21 'afsluitende set met triptijd, km-stand en actie-radius
End Select

setStr = ""
For i = 1 To NrOfBytes
setStr = setStr + Chr2Hex(Asc(Mid(FileStr, FilePos + i, 1)))
Next i
FilePos = FilePos + NrOfBytes

If SetStart = 0 Then 'start set met datum&tijd en km-stand
StartTimeStr = ""
For i = 1 To 4
StartTimeStr = StartTimeStr + Mid(setStr, 10 - 2 * i, 2)
Next i
Cells(DataRow, 2).NumberFormat = "dd/mm/yy hh:mm;@"
Cells(DataRow, 2) = 367 + 36525 + Hex2Dec(Left(StartTimeStr, 4)) * (65536 / 24 / 3600) + Hex2Dec(Right(StartTimeStr, 4)) / 24 / 3600
DummyStr = Mid(Hex(Hex2Dec(Mid(setStr, 10, 5)) * 2), 2, 5)
KMStr = Right(DummyStr, 1) + Mid(DummyStr, 3, 2) + Left(DummyStr, 2)
Cells(DataRow, 3) = Hex2Dec(KMStr)
End If

If SetStart = 4 Then 'set met tijdstip, toeren, snelheid, verbruik
NrOfSets = NrOfSets + 1
TimeStamp = Hex2Dec(Mid(setStr, 4, 2)) * 256 + Hex2Dec(Mid(setStr, 2, 2)) '[seconds]
EngineSpeed = Hex2Dec(Mid(Hex(Hex2Dec(Mid(setStr, 6, 3)) * 2), 2, 2)) * 32 '[rotations]
If EngineSpeed > MaxEngine Then MaxEngine = EngineSpeed
VehicleSpeed = (256 * Int(Hex2Dec(Mid(setStr, 11, 2)) / 8) + Hex2Dec(Mid(setStr, 9, 2))) * 0.06415 '[km/h], geen 0,0625
If VehicleSpeed > MaxSpeed Then MaxSpeed = VehicleSpeed
DummyStr = Mid(Hex(Hex2Dec(Mid(setStr, 18, 5)) * 2), 2, 4)
InstFuelConsumption = Hex2Dec(Mid(DummyStr, 3, 2) + Left(DummyStr, 2)) * 0.0022 '[l/h]
TotalFuelCons = TotalFuelCons + InstFuelConsumption
FuelDigit1 = Hex2Dec("0" & Mid(setStr, 13, 1))
FuelDigit2 = Hex2Dec("0" & Mid(Hex(Hex2Dec(Mid(setStr, 14, 2)) * 2), 2, 1))
FuelDigit3 = Hex2Dec("0" & Mid(Hex(Hex2Dec(Mid(setStr, 15, 2)) * 4), 2, 1))
TripDistance = Int(Hex2Dec(Mid(setStr, 23, 3)) / 4) - 256 '[*9,8 m]
If FirstTripDistance < 0 Then
FirstTripDistance = TripDistance
PreviousTripDistance = TripDistance
End If
If PreviousTripDistance - TripDistance > 200 Then TripDistanceLoops = TripDistanceLoops + 1
PreviousTripDistance = TripDistance
End If

If SetStart = 5 Then
NrExtTemp = NrExtTemp + 1
ExtTemp = ExtTemp + Hex2Dec(Mid(setStr, 7, 2))
End If

If SetStart = 1 Then
KMStr = Mid(Hex(Hex2Dec(Mid(setStr, 6, 5)) * 2), 2, 5)
Cells(DataRow, 4) = Hex2Dec(Right(KMStr, 1) & Mid(KMStr, 3, 2) & Left(KMStr, 2))
Cells(DataRow, 6).NumberFormat = "h:mm:ss"
Cells(DataRow, 6).HorizontalAlignment = xlCenter
Cells(DataRow, 6) = (Hex2Dec(Mid(setStr, 4, 2)) * 256 + Hex2Dec(Mid(setStr, 2, 2))) / 3600 / 24 'Timestamp
KmLeftStr = Mid(Hex(Hex2Dec(Mid(setStr, 21, 4)) * 2), 2, 4)
Cells(DataRow, 12) = Int(Hex2Dec(Right(KmLeftStr, 2)) / 32) * 256 + Hex2Dec(Left(KmLeftStr, 2))
Cells(DataRow, 13).NumberFormat = "0.0"
If NrExtTemp > 0 Then Cells(DataRow, 13) = ExtTemp / NrExtTemp / 2 - 40
If (FileSize - FilePos > 8) Then EndOfSession = True
End If

If SetStart = 7 Then
Cells(DataRow, 6).NumberFormat = "h:mm:ss"
Cells(DataRow, 6).HorizontalAlignment = xlCenter
Cells(DataRow, 6) = (Hex2Dec(Mid(setStr, 4, 2)) * 256 + Hex2Dec(Mid(setStr, 2, 2))) / 3600 / 24 'Timestamp
If NrOfSets > 0 Then
Cells(DataRow, 5).NumberFormat = "0.00" 'TripDistance
TripDistanceKM = (TripDistance - FirstTripDistance + 256 * TripDistanceLoops) * 0.01 'geen 0.098
Cells(DataRow, 5) = TripDistanceKM
Cells(DataRow, 7).NumberFormat = "0.0" 'Average Speed
Cells(DataRow, 7) = TripDistanceKM / (NrOfSets / 3600)
Cells(DataRow, 8).NumberFormat = "0.0" 'Max Speed
Cells(DataRow, 8) = MaxSpeed
FuelConsumptionLiter = TotalFuelCons / 3600
If FuelConsumptionLiter > 0.05 Then
Cells(DataRow, 9).NumberFormat = "0.0" 'Average Fuel Consumption
Cells(DataRow, 9) = TripDistanceKM / FuelConsumptionLiter
End If
Cells(DataRow, 10).NumberFormat = "0.000" 'Fuel in liters
Cells(DataRow, 10) = FuelConsumptionLiter
Cells(DataRow, 11) = MaxEngine
'Cells(DataRow, 15) = NrOfSets
End If
If (FileSize - FilePos > 5) Then
If (Int(Asc(Mid(FileStr, FilePos + 1, 1)) / 16) <> 1) Then EndOfSession = True
End If
End If
Loop Until (FileSize - FilePos < 5) Or EndOfSession
Application.ScreenUpdating = True
Loop Until FileSize - FilePos < 5
End If
Next File2Open
End If
MsgBox "Ready"
Exit Sub

ErrorHandler:
FilesSelected = True
Resume Next

End Sub ' of Read_Trip_Data

Sub Read_Complete_Trip()
Dim FileToOpen As Variant
Dim FilePos, FileSize As Long
Dim ByteValue As Integer
Dim StartTimeStr, KMStr As String

Windows(Application.ThisWorkbook.Name).Activate

FileToOpen = Application.GetOpenFilename _
(FileFilter:="Bin files (*.bin), *.bin", _
Title:="Read bin file", MultiSelect:=False)

ShowData = False

On Error GoTo ErrorHandler
FilesSelected = (FileToOpen <> False)
On Error GoTo 0
If FilesSelected Then
'For Each File2Open In FileToOpen
Open FileToOpen For Binary Access Read As #1
If Err.Number <> 0 Then
MsgBox "Error opening file " & FileToOpen
Err.Clear
Else
FileSize = LOF(1)
FileStr = Input(FileSize, #1)
Close #1

BinFilename = FileToOpen
Do
SearchPos = InStr(1, BinFilename, "\")
If SearchPos > 0 Then BinFilename = Mid(BinFilename, SearchPos + 1)
Loop Until SearchPos = 0

FilePos = 28
Do 'start of new session, reset variables
EndOfSession = False
FirstTripDistance = -1
TripDistanceLoops = 0

Do
ByteValue = Asc(Mid(FileStr, FilePos + 1, 1))
SetStart = Int(ByteValue / 16)
Select Case SetStart
Case 0: NrOfBytes = 14 'start set met datum, tijd en km-stand
Case 4: NrOfBytes = 13 'normale set met tijd, toeren, snelheid, verbruik in liter/uur en verbruik in km/liter
Case 5: NrOfBytes = 5 'set met alleen buitentemperatuur
Case 7: NrOfBytes = 3 'afsluitende set met triptijd
Case 1: NrOfBytes = 21 'afsluitende set met triptijd, km-stand en actie-radius
End Select

setStr = ""
For i = 1 To NrOfBytes
setStr = setStr + Chr2Hex(Asc(Mid(FileStr, FilePos + i, 1)))
Next i
FilePos = FilePos + NrOfBytes

If SetStart = 0 Then 'startset met datum&tijd en km-stand
ShowData = True
StartTimeStr = ""
For i = 1 To 4
StartTimeStr = StartTimeStr + Mid(setStr, 10 - 2 * i, 2)
Next i
StartTime = 36892 + Hex2Dec(Left(StartTimeStr, 4)) * (65536 / 24 / 3600) + Hex2Dec(Right(StartTimeStr, 4)) / 24 / 3600
DateStr = Format(StartTime, "dd-mm-yy")

'Check for presence of the sheet with the specified date and create this sheet if not found
SheetPresent = False
For i = 1 To Sheets.Count
If UCase(Sheets(i).Name) = DateStr Then
TripSheet = i
Sheets(i).Select
SheetPresent = True
Exit For
End If
Next i
If Not SheetPresent Then
Sheets.Add(, Sheets(Sheets.Count)).Name = DateStr
TripSheet = Sheets.Count
Sheets(TripSheet).Select
ActiveWindow.Zoom = 60
Columns("A:J").HorizontalAlignment = xlCenter
Columns("A:J").ColumnWidth = 10
Cells(1, 1) = "tijd": Cells(2, 1) = "[sec]"
Cells(1, 2) = "toeren": Cells(2, 2) = "[rpm]"
Cells(1, 3) = "snelheid": Cells(2, 3) = "[km/h]"
Cells(1, 4) = "verbruik": Cells(2, 4) = "[l/h]"
Cells(1, 5) = "verbruik": Cells(2, 5) = "[km/l]"
Cells(1, 6) = "afstand": Cells(2, 6) = "[m]"
Cells(1, 7) = "temp.": Cells(2, 7) = "[°C]"
Cells(1, 8) = "km-stand": Cells(2, 8) = "[km]"
Cells(1, 9) = "datum"
Cells(1, 10) = "tijd"
Cells(1, 11) = "filenaam"
Range("A3").Select
ActiveWindow.FreezePanes = True
End If
DataRow = Cells(Cells.Rows.Count, "A").End(xlUp).Row + 1

KMStr = Mid(Hex(Hex2Dec(Mid(setStr, 10, 5)) * 2), 2, 5)
Cells(DataRow, 8) = Hex2Dec(Right(KMStr, 1) + Mid(KMStr, 3, 2) + Left(KMStr, 2))
Cells(DataRow, 9).NumberFormat = "dd-mm-yy": Cells(DataRow, 9) = StartTime
Cells(DataRow, 10).NumberFormat = "hh:mm": Cells(DataRow, 10) = StartTime
Cells(DataRow, 11) = BinFilename
Application.ScreenUpdating = False
End If 'SetStart = 0

If SetStart = 4 Then 'set met tijdstip, toeren, snelheid, verbruik
TimeStamp = Hex2Dec(Mid(setStr, 4, 2)) * 256 + Hex2Dec(Mid(setStr, 2, 2)) '[seconds]
EngineSpeed = Hex2Dec(Mid(Hex(Hex2Dec(Mid(setStr, 6, 3)) * 2), 2, 2)) * 32 '[rotations]
VehicleSpeed = (256 * Int(Hex2Dec(Mid(setStr, 11, 2)) / 8) + Hex2Dec(Mid(setStr, 9, 2))) * 0.06415 '[km/h], geen 0,0625
DummyStr = Mid(Hex(Hex2Dec(Mid(setStr, 18, 5)) * 2), 2, 4)
InstFuelConsumption = Hex2Dec(Mid(DummyStr, 3, 2) + Left(DummyStr, 2)) * 0.0022 '[l/h]
TotalFuelCons = TotalFuelCons + InstFuelConsumption
FuelDigit1 = Hex2Dec("0" & Mid(setStr, 13, 1))
FuelDigit2 = Hex2Dec("0" & Mid(Hex(Hex2Dec(Mid(setStr, 14, 2)) * 2), 2, 1))
FuelDigit3 = Hex2Dec("0" & Mid(Hex(Hex2Dec(Mid(setStr, 15, 2)) * 4), 2, 1))
TripDistance = Int(Hex2Dec(Mid(setStr, 23, 3)) / 4) - 256 '[*9,8 m]
If FirstTripDistance < 0 Then
FirstTripDistance = TripDistance
PreviousTripDistance = TripDistance
End If
If PreviousTripDistance - TripDistance > 200 Then TripDistanceLoops = TripDistanceLoops + 1
PreviousTripDistance = TripDistance
If ShowData Then
DataRow = DataRow + 1
Cells(DataRow, 1) = TimeStamp
Cells(DataRow, 2) = EngineSpeed
Cells(DataRow, 3) = VehicleSpeed
Cells(DataRow, 4) = InstFuelConsumption
Cells(DataRow, 5) = FuelDigit1 * 10 + FuelDigit2 + FuelDigit3 * 0.1
Cells(DataRow, 6) = (TripDistance - FirstTripDistance + 256 * TripDistanceLoops) * 10
'Cells(DataRow, 8) = FilePos - NrOfBytes
'Cells(DataRow, 9) = setStr
If DataRow > 65000 Then ShowData = False
End If
End If 'SetStart = 4

If SetStart = 5 Then
If ShowData Then Cells(DataRow, 7) = Hex2Dec(Mid(setStr, 7, 2)) / 2 - 40
End If

If SetStart = 1 Then
KMStr = Mid(Hex(Hex2Dec(Mid(setStr, 6, 5)) * 2), 2, 5)
If ShowData Then Cells(DataRow, 8) = Hex2Dec(Right(KMStr, 1) & Mid(KMStr, 3, 2) & Left(KMStr, 2))
ShowData = False
Application.ScreenUpdating = True
If (FileSize - FilePos > 5) Then EndOfSession = True
End If

If SetStart = 7 Then
Application.ScreenUpdating = True
If (FileSize - FilePos > 5) Then
If (Int(Asc(Mid(FileStr, FilePos + 1, 1)) / 16) <> 1) Then
Application.ScreenUpdating = True
ShowData = False
EndOfSession = True
End If
End If
End If
Loop Until (FileSize - FilePos < 5) Or EndOfSession
Loop Until FileSize - FilePos < 5
Application.ScreenUpdating = True
End If 'Err.Number=0
End If 'FilesSelected
MsgBox "Ready"
Exit Sub

ErrorHandler:
FilesSelected = True
Resume Next

End Sub ' of Read_Complete_Trip
paul1959
Berichten: 6
Lid geworden op: vr apr 27, 2012 18:02

Re: FiatTripData: bekijk de ecoDrive data

Bericht door paul1959 »

Daar moet heel wat tijd en werk ingezeten hebben. Zal 'm vandaag proberen.
Laat weten hoe het gegaan is.
Alvast bedankt voor je moeite. .)


Edit:
Macro omzetten gaat goed.
Ik kan echter geen bin bestand vinden in mijn fiat directories (c:/fiat/ en C:/gebruikers/user/appdata/roaming/com.fiat.convergence

In de laatste directory staan alleen db extensies. Ik heb de extensie db gewijzigd in bin maar dat brengt helaas geen soulaas.

Zijn er misschien twee verschillende versies van Ecodrive, of zit ik in de verkeerde directory te zoeken.

Nogmaals bedankt voor het plaatsen van de macro.
Fiat Punto Evo 1.3 Multi Jet Glory White. KM 50.000 gem 4,2lt per 100 km.
Gebruikersavatar
scoop
Supporto Tecnico
Supporto Tecnico
Berichten: 1656
Lid geworden op: za dec 02, 2006 11:48
Locatie: Boxmeer

Re: FiatTripData: bekijk de ecoDrive data

Bericht door scoop »

@devoloper: Mooi dat het gelukt is, bedankt voor het delen van de Macro. Het zou ook erg verdienstelijk zijn als je misschien kort kunt omschrijven hoe het bin formaat in elkaar zit (voort de liefhebbers). Dan hoeven geïnteresseerden niet door de code heen de waden om het te achterhalen.

@paul1959: het is de bedoeling dat je hiermee direct de bestanden uitleest. die door Eco:Drive in je auto op de USB stick weggeschreven worden. Eenmaal ingelezen door de Eco:Drive applicatie van FIAT op de computer zelf zijn deze bestanden weg. Je moet ze dus op je USB stick zoeken, voordat je ze met de Eco:Drive applicatie ingelezen hebt.
paul1959
Berichten: 6
Lid geworden op: vr apr 27, 2012 18:02

Re: FiatTripData: bekijk de ecoDrive data

Bericht door paul1959 »

@paul1959: het is de bedoeling dat je hiermee direct de bestanden uitleest. die door Eco:Drive in je auto op de USB stick weggeschreven worden. Eenmaal ingelezen door de Eco:Drive applicatie van FIAT op de computer zelf zijn deze bestanden weg. Je moet ze dus op je USB stick zoeken, voordat je ze met de Eco:Drive applicatie ingelezen hebt.[/quote]


Gevonden op USB stick. Krijg wel vreemde data na uitvoeren macro.
Ben benieuwd naar ervaringen van anderen
Fiat Punto Evo 1.3 Multi Jet Glory White. KM 50.000 gem 4,2lt per 100 km.
Maarten
Junior Stato
Berichten: 405
Lid geworden op: zo aug 01, 2010 21:09

Re: FiatTripData: bekijk de ecoDrive data

Bericht door Maarten »

scoop :-]

Vind je het goed als ik hiermee verder ga en kijk of ik dit gestructureerd in een Access database kan zetten?
paul1959
Berichten: 6
Lid geworden op: vr apr 27, 2012 18:02

Re: FiatTripData: bekijk de ecoDrive data

Bericht door paul1959 »

Met respect voor devoloper en scoop.

Ik kom op een Duitse Fiat forum http://www.motor-talk.de/blogs/ecodrive ... 69534.html" onclick="window.open(this.href);return false;
het programma ifiat.exe tegen. Dit is een windows VB versie en heeft bij mij ook beperkingen.

Op http://www.motor-talk.de/blogs/ecodrive-fiat500-dateien" onclick="window.open(this.href);return false; staat nog meer info over het bin formaat.
Het kan overigens zijn dat deze info gaat over de vorige eco drive versie.


Wel eerst registreren.
Fiat Punto Evo 1.3 Multi Jet Glory White. KM 50.000 gem 4,2lt per 100 km.
Gebruikersavatar
scoop
Supporto Tecnico
Supporto Tecnico
Berichten: 1656
Lid geworden op: za dec 02, 2006 11:48
Locatie: Boxmeer

Re: FiatTripData: bekijk de ecoDrive data

Bericht door scoop »

Ik wil voor de volledigheid nog even vermelden dat alle eer gewoon naar devoloper gaan voor het uitpluizen van het bin formaat en het schrijven van de macro. Ik heb daar geen aandeel in gehad. Voor zover ik kan zien is er niet/nauwelijks voordeel t.o.v. een OBD-II bluetooth adapter met smartphone / table app die ik al heb, behalve dat dit natuurlijk al standaard uit een FIAT komt rollen.
devoloper
Berichten: 8
Lid geworden op: vr mar 30, 2012 8:16

Re: FiatTripData: bekijk de ecoDrive data

Bericht door devoloper »

Een bin-file bestaat uit een 28 byte header, gevolgd door een of meerdere reeksen. Aan de hand van de eerste 4 bits van de reeks, kan afgeleid worden, welke soort reeks volgt:

$0x een start-reeks, 14 bytes lang, bevat datum, tijd en km-stand aan het begin van een nieuwe rit

$4x een data-reeks, 13 bytes lang, wordt tijdens de rit (bijna) elke seconde opgeslagen en bevat het tijdstip sinds het begin van de rit, het toerental, de snelheid (te vermenigvuldigen met een factor), het huidige verbruik (in km/liter, zoals aangegeduid op het display in de auto), het aktuele verbruik in liter per uur en de afgelegde weg (getal tussen 0 en 255, die het aantal deca-meters aangeven)

$5x een reeks (5 bytes) die elke 300 seconden wordt opgeslagen en het tijdstip (in seconden) en de buitentemperatuur bevat. De buitentemperatuur wordt berekend door het getal te delen door 2 en van het resultaat 40 af te trekken.

$7x een slot-reeks (3 bytes) die het einde aangeeft van een rit (bevat tijdstip)

$1x een samenvattende reeks (21 bytes) die de tijdsduur, km-stand en de actie-radius bevat.


Wanneer er een USB-stick aanwezig is, wordt elke rit in een aparte file opgeslagen. Zonder USB-stick worden meerdere ritten opgeslagen opgeslagen in een file, die maximaal ca 60000 reeksen kan bevatten, alvorens er reeksen overschreven worden. In dit geval bevat een bin-file (na de 28 bytes header) in het begin meestal alleen $0x- en $7x-reeksen, totdat er uiteindelijk weer complete reeksen volgen ($0x....., $4x....., $5x....., $4x....., $7x......, $1x......)

Overigens wordt in $4x-reeksen geen informatie opgeslagen over de versnelling. Deze kan echter vrij eenvoudig berekend worden door de snelheid te delen door het aantal toeren. Men ziet dan dat het resultaat per versnelling een constant getal is.

Tijdens een Start&stop worden er geen reeksen opgeslagen en men ziet in de data dus eenvoudigweg een sprong in de tijd. Valt overigens een geplande temperatuursregistratie in zo'n s&s periode, dan wordt die $5x-reeks opgeslagen nadat de eerste $4x-reeks weggeschreven is.

In de geposte macro code ziet men 2 functies die gebruikt worden door de 2 daaropvolgende procedures: read-trip-data en read-complete-trip. Met de eerste proc kunnen meerdere bin-files ingelezen worden en worden per file de belangrijkste gegevens weergegeven (zoals km-standen aan begin en eind, de afgelegde afstand, het gemiddelde verbruik in km/l en het aantal verbruikte liters, de maximale snelheid en de gemiddelde buitentemperatuur, als de rit lang genoeg geduurd heeft).
Met de 2e proc kan van 1 file alle data (toeren, snelheid, verbruik in km/liter en liter/uur en afgelegde weg) uitgelezen worden.

Beide macro's kijken of de benodigde output-sheets aanwezig zijn en maken die bij afwezigheid aan. Beide macro's zijn overigens ook niet fool-proof: zo wordt er bijv. niet gecontroleerd op de inhoud van de eerste 28 bytes van de bin-files.

Indien er behoefte is aan nog gedetailleerdere info, aub aangeven waarover.
Ik heb er overigens geen probleem mee als aan de hand van de macro's andere (nog betere) progs ontwikkeld worden.
Plaats reactie