Hi,
I'am trying to get the data from my light electric vehicles (LEV) via ANT.
I started with the Moxy sample and can now connect to the bike.
But How do I have to interpret the data out of the payload ?
Any help really appreciated
Hi,
I'am trying to get the data from my light electric vehicles (LEV) via ANT.
I started with the Moxy sample and can now connect to the bike.
But How do I have to interpret the data out of the payload ?
from where have you received all this information. Is there an ANT document explaining this?
I am also search from the Power produced by the motor [W] an the human power produced by the biker [W]
This is shown in the Fazua Mobile APP, but not listed in your code.
Hi Seli17
I‘m trying to write a datafield for Ant+ LEV for my Specialized Levo 2019. All I want is to connect to bike and read ID, battery status and support level. Unfortunately I did not manage so far to come along.
I downloaded Ant+_LEV from ThisisAnt and I will attach it here. Maybe it is of any help for you.
In revers I would be very grateful if you could share your code which would certainly help me to get along…
Thanks!
Hi MC,
First step:
I took the Moxy Sample of Garmin and changed the deviceType to 20
So I could connect my Fenix to my Fazua Bike.
MOSensor.mc
//const DEVICE_TYPE = 31; //Muscle Oxygen //const DEVICE_TYPE = 11; //Bike Power const DEVICE_TYPE = 20; //Light Electric Vehicle
Second step:
I read the payload according to
https://github.com/maca88/E-Bike-Edge-MultiField/blob/master/Source/EBikeEdgeMultiField/source/EBikeSensor.mc
for the moment, (I am really at the beginning) I did for Battery Charge only:
function parsePage3(payload, data) { data.batteryCharge = parseBatteryCharge (payload); } hidden function parseBatteryCharge(payload) { return (payload[1] & 0x7F); // Battery SOC (State of Charge) } function onMessage(msg) { // Parse the payload var payload = msg.getPayload(); if( Ant.MSG_ID_BROADCAST_DATA == msg.messageId ) { var pageNumber = (payload[0] & 0xFF); if (pageNumber == 1) { //if( MuscleOxygenDataPage.PAGE_NUMBER == (payload[0].toNumber() & 0xFF) ) { // Were we searching? if (searching) { searching = false; // Update our device configuration primarily to see the device number of the sensor we paired to deviceCfg = GenericChannel.getDeviceConfig(); } var dp = new MuscleOxygenDataPage(); //data.batteryTemperature = parseBatteryTemperature(payload); dp.parse(payload, data); // Check if the data has changed if (pastEventCount != data.eventCount) { pastEventCount = data.eventCount; } } else if (pageNumber == 3) { var dp = new MuscleOxygenDataPage(); dp.parsePage3(payload, data); //data.batteryCharge = parseBatteryCharge (payload); } } else if(Ant.MSG_ID_CHANNEL_RESPONSE_EVENT == msg.messageId) { if (Ant.MSG_ID_RF_EVENT == (payload[0] & 0xFF)) { if (Ant.MSG_CODE_EVENT_CHANNEL_CLOSED == (payload[1] & 0xFF)) { // Channel closed, re-open open(); } else if( Ant.MSG_CODE_EVENT_RX_FAIL_GO_TO_SEARCH == (payload[1] & 0xFF) ) { searching = true; } } else { //It is a channel response. } } }
It is only proof of concept, it works with FAZUA Ride 60 and Fenix 6X but should also work with your bike!
Hope this helps you
I am interested in BikePower and MotorPower, but this is not in LEV but shown on the Fazua App.
There is only Assist in %, but this is only half of what I need.
I will try to ask FAZUA where they transmit this information.
Many Thanks Seli17!
I‘m also working on Moxy sample base, but I‘m afraid, I had deleted too much of code I was thinking I do not need .
So - back to the start!
Regarding rider power: my Spesh Levo sends rider(bike) power as „normal“ sensor. I get bikepower and cadence simply by searching and connecting my Levo as power sensor. No Ant programming necessary - only activity.info.currentPower and currentCadence
I will report back!
Hi Seli17
I managed to get batterySOC, assistMode, totalAssistModes to work.
I followed your steps, but simply parse the variables inside of onMessage() and then I pass it via function call from/to MoxyField.mc
I tested the output on my Edge 1040 and with my Spesh Levo - it works!
public function onMessage(msg as Message) as Void { // Parse the payload var payload = msg.getPayload(); //if ((Ant.MSG_ID_BROADCAST_DATA == msg.messageId) && ($.PAGE_NUMBER == (payload[0].toNumber() & 0xFF))) { if ( Ant.MSG_ID_BROADCAST_DATA == msg.messageId) { var pageNumber = (payload[0] & 0xFF); if (pageNumber == 1) { // Were we searching? if (_searching) { _searching = false; // Update our device configuration primarily to see the device number of the sensor we paired to _deviceCfg = GenericChannel.getDeviceConfig(); } _data.parse(msg.getPayload()); // Update the event count _pastEventCount = _data.getEventCount(); } else if (pageNumber == 3) { batSOC = (payload[1] & 0x7F); //battery Status travelMode = (payload[2] >> 3 & 0x07); //Assist Mode } else if (pageNumber == 5) { totalAssistModes = (payload[2] >> 3) & 0x07; // Number of Assist modes supported } else if (pageNumber == 80) { manufacturerId = (payload[5] << 8) | payload[4]; // Manufacturer ID } } else if ((Ant.MSG_ID_CHANNEL_RESPONSE_EVENT == msg.messageId) && (Ant.MSG_ID_RF_EVENT == (payload[0] & 0xFF))) { if (Ant.MSG_CODE_EVENT_CHANNEL_CLOSED == (payload[1] & 0xFF)) { // Channel closed, re-open open(); } else if (Ant.MSG_CODE_EVENT_RX_FAIL_GO_TO_SEARCH == (payload[1] & 0xFF)) { _searching = true; } } }
Next step:
reduce and rename the Moxy datafield to my needs for my LEV datafield.
A question: Does the datafield work in the simulator if a ANT dongle is connected to the PC?
Problem for me to test: my PC is upstairs and my eBike downstairs. Too wide range for connection I assume...
All tests I do are with the datafield sideloaded to the Edge - it's a litte complicated.
I added activity.info.currentPower and currentCadence to my BigFont DataField and have now to add the Moxy (LEV) stuff to it.
What Edge do you have?
I have no ANT dongle, I am testing directly with my Fenix to my bike, not very confortable!
=> so same as you