Sponsored

theUNSTABLE

Well-known member
First Name
Ryan
Joined
Feb 5, 2023
Threads
8
Messages
104
Reaction score
132
Location
Florida
Website
github.com
Vehicles
2023 F150 Lightning Lariat
Occupation
Cyber Engineer
Hello again internet strangers!

I'm back with a large update on my LightningROD project.

It has been quite the journey so far.
Without rambling about this 2+ year journey I will just say I've learned a lot and decided to try and make I've wanted this entire time.

Open Source self-hosted charging analytics for the F-150 Lightning

Project: https://github.com/SquidBytes/LightningROD
Documentation: https://squidbytes.github.io/LightningROD/

Because of my experience with the difficulty of the Ford API, I am currently - and intentionally - avoiding any authentication with Ford servers.
My ultimate goal is to support multiple "data sources" to ingest the data for the views and visualizations.

1. Manual entry
2. Manual Import of historical records
3. Home Assistant
4. OBD (this is a very long term stretch goal)

As of right now I have a minimal viable product I'm quite happy with. It is currently primarily focused around Charge Sessions, but I'm working on adding the other areas.

Currently data ingested is supported by:
1. Manual entry
2. CSV import
3. If you're using marq24's Home Assistant integration I have that working.

I've thought about seeing about implementing a similar auth flow and making this entirely self-contained, but I still use Home Assistant and wanted to minimize the amount of connections.

It will have bugs, issues, problems, and a variety of other things.
But it does work.

Anyway I'm putting it out there for some feedback, input, and ideas from other people.

Quick video of what it looks like as of v0.2



Disclaimer:
This is all done in my spare time and is primarily built around how I have been storing my data.
Yes I have been using AI and Claude Code. I am alone and not pretending to be creating an enterprise product for money.
I just want to bring my vision to life, and learn throughout the process.

Link to my first post
Sponsored

 

chriserx

Well-known member
First Name
Chris
Joined
Oct 3, 2025
Threads
2
Messages
706
Reaction score
530
Location
Louisiana
Vehicles
2025 Ford Lightning Flash Job 2 😭
You were having troubles with implementing Ford's API into this app or using HA Fordpass? I assume it's the former cuz I swear I saw your name in the release notes for HA, but just checking.
 
OP
OP
theUNSTABLE

theUNSTABLE

Well-known member
First Name
Ryan
Joined
Feb 5, 2023
Threads
8
Messages
104
Reaction score
132
Location
Florida
Website
github.com
Vehicles
2023 F150 Lightning Lariat
Occupation
Cyber Engineer
The very brief quick summary of the Ford API journey is I wanted more data. Started looking into the FordPass App and came across the "fodpass-ha" custom integration for Home Assistant by itchannel.

I started tweaking that code locally and got some things to work for me. Figured I would put it out there and submitted a PR with some feature requests. itchannel did not have an EV to test with, so I started testing with my vehicle and implementing the EV related features into that repo. He then brought me on as a contributor as we updated and added things.

Then there were countless API issues over time, and both of us had no free time (and were very unmotivated because of the difficulty over time) to continue constantly troubleshooting and fixing things.

I actually got in touch with someone at Ford we all emailed a few times to try and get a meeting setup to ideally get some type of support, answers, or a solution to making this work. We never really heard back and never had a meeting. I did email him back after some time passed once again inquiring about something, or possible developer accounts (that was its own mini-tangent that happened for a bit) and the last I heard was "we should have a solution sometime soon".

Then marq24 forked the repo and rewrote some things, primarily the authentication (and fixed some of my bad EV implementations as I don't now what I'm doing). "ha-fordpass"

I then worked with marq24 to give him the information and examples that I had for sensors and switches I never got around to implementing (Charging Switch, Zone Lightning, Heated/Cooled Seats, Charge Logs, etc). He got those working as well and was able to maintain and work on this much more than we were able to.

So you may have seen my name (theUNSTABLE / SquidBytes) around for one of those repo's or something, especially for EV and F-150 Lightning features as that was either my bad code - or a proper implementation of it 🤣
 
Last edited:

chriserx

Well-known member
First Name
Chris
Joined
Oct 3, 2025
Threads
2
Messages
706
Reaction score
530
Location
Louisiana
Vehicles
2025 Ford Lightning Flash Job 2 😭
Well thank you for the effort y'all have put in, I got my OpenEVSE and HA setup with a tapered charge automation I made and absolutely love it. No more deep sleep, worries about charge limits, fiddling with extra cables to the 12v. It just works.
 

astrand1

Well-known member
First Name
Alex
Joined
Dec 16, 2021
Threads
9
Messages
718
Reaction score
755
Location
Michigan
Vehicles
2023 Ford F150 Lightning lariat ER
Occupation
Studio truck driver
What does ROD mean?
 

Sponsored
OP
OP
theUNSTABLE

theUNSTABLE

Well-known member
First Name
Ryan
Joined
Feb 5, 2023
Threads
8
Messages
104
Reaction score
132
Location
Florida
Website
github.com
Vehicles
2023 F150 Lightning Lariat
Occupation
Cyber Engineer
When I first started it, it was primarily focused around charging sessions. When I was talking with some friends, one of them gave me the idea for [R]ecord [O]f [D]ocks, so I stuck with it.
 

flux capacitor

Well-known member
First Name
Jeff
Joined
Nov 21, 2023
Threads
0
Messages
99
Reaction score
101
Location
Florida
Vehicles
2023 F-150 Lightning
I have been monitoring my charges since new on a spreadsheet and one thing I included was equivalent ICE MPG (kwh charged/miles driven)*33.705. I do not see anything else adding that, but I like it. It just makes me feel better and how incredible it is to drive a pickup with 4wd with that kind of efficiency.
 

Jiji

Well-known member
First Name
Rick
Joined
Aug 5, 2024
Threads
3
Messages
65
Reaction score
62
Location
Finger Lakes, NY
Vehicles
2024 F-150 Lightning
4. OBD (this is a very long term stretch goal)
Very easy to do, documented here.

But L2 charging ties up a device for many hours which is why I added the ability to edit a charge and copy the duration, final SoC, and energy added from the Ford app. Now I can grab the start of the charge and log the time, location, charge type, odometer, SoC, and battery state of health then walk away and not need to record the entire charge.

And I hear you on using Claude Code, my first try used a + symbol in the toolbar (which the view previously didn't have) but I asked Claude to replace it with a + gesture and 5 minutes later it was working and the toolbar is gone. You can't be an expert in everything and allowing Claude Code to do the heavy lifting where I would be disadvantaged saved precious time.

 
Last edited:

Aminorjourney

Well-known member
First Name
Nikki
Joined
Jun 6, 2022
Threads
16
Messages
361
Reaction score
815
Location
Internet
Website
www.transportevolved.com
Vehicles
2023 F150 Lightning Lariat, 2017 Chevrolet Bolt EV, 2006 Vectrix VX-1
Allright! Nice work @theUNSTABLE! Gonna put a quick how-to for folks with UNRAID who want to make this work for them - assuming they already have HomeAssistant running in a VM or docker.

Ford F-150 Lightning LightningROD - Self-hosted charging analytics Screenshot 2026-03-10 at 5.57.06 PM


1) Make sure you have Docker Compose Manager for UNRAID installed - you can find it here: https://forums.unraid.net/topic/114415-plugin-docker-compose-manager/

2) Log into your UNRAID server using either a terminal, or using a terminal add-on.

3) Run:
Code:
git clone https://github.com/SquidBytes/LightningROD.git /mnt/user/appdata/LightningROD/
4) Go to the Docker window in your UNRAID GUI - go to the bottom section, where Docker Compose Manager should be - and click "Add New Stack". I called mine "LightningROD" but whatever floats your boat.

5) Click on the gear icon next to the name to change the description to your taste. Then click "Edit Stack" and "Stack Settings" to get to "Stack Settings: ENV File Path". You'll need to change this by typing in the window that appears to match where you downloaded the git file to. In my case it's:
Code:
/mnt/user/appdata/LightningROD/.env
6) Go back to that same gear icon and this time select "Edit Stack" followed by "Env File". You'll need to edit this as per @theUNSTABLE's original readme - that means picking a POSTGRES_USER name and POSTGRES_PASSWORD. Write your password down somewhere safe in case you need it in the future, and click "SAVE". (You do use a password manager, right?)

7) One final setup step. Go back to the gear icon again, this time click "Edit Stack" followed by "Compose File". You'll need to modify it slightly - specifically the build context paths and the port mapping:

Code:
services:
  db:
    image: postgres:16
    volumes:
      - pgdata:/var/lib/postgresql/data
    env_file: .env
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}"]
      interval: 5s
      timeout: 5s
      retries: 10
      start_period: 10s
    restart: unless-stopped

  web:
    build:
      context: /mnt/user/appdata/LightningROD
      dockerfile: /mnt/user/appdata/LightningROD/Dockerfile
    ports:
      - "8000:8000"
    env_file: .env
    environment:
      - POSTGRES_HOST=db
    depends_on:
      db:
        condition: service_healthy
    restart: unless-stopped

volumes:
  pgdata:

Note: If you already have a service running on port 8090, pick any other free external port to map to the internal 8000. The format is EXTERNAL:INTERNAL - so "8090:8000" means your UNRAID host serves it on 8090, while the container always uses 8000 internally.

8) OPTIONAL: Go back to the gear icon, click "UI Labels" and set an icon for the two services. For the db service I used:
Code:
https://www.postgresql.org/media/img/about/press/elephant.png
For the web service, I converted the logo.svg from the project repo and saved it locally as logo.png on my server at:
Code:
/mnt/user/appdata/LightningROD/logo.png
You can also set up the UI address by putting
Code:
 http://[IP]:8000
in the Web UI setting for the Lightning ROD web service.

9) Once everything is saved, go ahead and click "Compose Up". It should boot!
 
OP
OP
theUNSTABLE

theUNSTABLE

Well-known member
First Name
Ryan
Joined
Feb 5, 2023
Threads
8
Messages
104
Reaction score
132
Location
Florida
Website
github.com
Vehicles
2023 F150 Lightning Lariat
Occupation
Cyber Engineer
I have been monitoring my charges since new on a spreadsheet
That is one of the reasons I wanted to have the ability to have a CSV import. Originally I had it where it would accept nearly anything and allow you to map specific values to where it would be imported into the database - but it was a bit tricky to get working properly and account for a variety of things. So I adjusted it to be a specific template (granted, it is a bit broken now as it doesn't show you the column reference at the start).

If you're willing to share, I'd love to see how you have your column headers so I have an additional data point of being able to handle imports.

and one thing I included was equivalent ICE MPG (kwh charged/miles driven)*33.705. I do not see anything else adding that, but I like it. It just makes me feel better and how incredible it is to drive a pickup with 4wd with that kind of efficiency.
Totally agree, which is why I wanted to have the "Savings estimator". Right now it is just input gas price and MPG, but for me - I would love to expand it to add some more configuration options, or go all out advanced of auto grabbing the cost of gas over time for better data and cost calculations.

Simple idea I have in mind: Allow gas cost for date ranges along with MPG for highway/city (for "non-ev would have had vehicle" to get an average and better estimations for price over time and different "fill ups".

Advanced idea: Configure what "most likely" gas station(s) would have been used to "fill up" (Wholesale membership for example), and then for each charge session (historical if possible) calculate the estimated amount of fuel for the soc increase and get the price/gallon at that time. Then use that for comparison. I mean it can also get crazy advanced with the (planned) Trip reports and estimated MPG based on speed, distance, time and then get gas prices for stations around charge areas. But then I run into feature creep.

I get free charging at work, so I wanted to be able to see the cost savings and estimations for free charges as well as gas savings.



Very easy to do, documented here.
Yeah, I've been watching and following along!

But L2 charging ties up a device for many hours which is why I added the ability to edit a charge and copy the duration, final SoC, and energy added from the Ford app. Now I can grab the start of the charge and log the time, location, charge type, odometer, SoC, and battery state of health then walk away and not need to record the entire charge.
Yeah, when I get to OBD things I'm sure I will be leaving heavily on some of your implementation decisions.


And I hear you on using Claude Code, my first try used a + symbol in the toolbar (which the view previously didn't have) but I asked Claude to replace it with a + gesture and 5 minutes later it was working and the toolbar is gone. You can't be an expert in everything and allowing Claude Code to do the heavy lifting where I would be disadvantaged saved precious time.
I have 8 years of experience at my current job working with and around software doing a variety of things. But all of it has been offline. So I don't have any experience in web related development. However, I have a solid understanding of everything.

I personally believe there is nothing wrong with "vibe coding". It has recently shifted towards a negative meaning that I don't really agree with. Yes, there are "projects" that are just the result of random prompts that output code and someone published it as "I made XYZ". However, I think there is a difference between a project like that, and a project that is created using AI/Claude as a tool.

To steal and combine other terms - I think there is "vibe slop" and then "vibe development" basically. To get great results and create a maintainable and properly functional project - skills and an understanding of how things work are still needed.

I could have probably created something like this by hand, but it would have taken me years and be a lesser quality product with a variety of issues I didn't account for. But I don't have that much free time, or even spare brain power after work and kids :ROFLMAO:. Hence Claude/AI development. I setup a proper foundation, rules, requirements, and scaffolding. Then give claude singular tasks. Then I test it, verify it, break it, and document any issues or improvements I find/want. Then craft a new task for Claude and repeat. Using it as a tool. It is especially useful, and very good at, documentation.

Some people still don't want or like AI in their products which is why I added the disclaimer. It's also free and open source so they can then do whatever they want lol.

But that is just my opinion and how I've been using it because I wanted to make something that I want lol.
 
OP
OP
theUNSTABLE

theUNSTABLE

Well-known member
First Name
Ryan
Joined
Feb 5, 2023
Threads
8
Messages
104
Reaction score
132
Location
Florida
Website
github.com
Vehicles
2023 F150 Lightning Lariat
Occupation
Cyber Engineer
Allright! Nice work @theUNSTABLE! Gonna put a quick how-to for folks with UNRAID who want to make this work for them - assuming they already have HomeAssistant running in a VM or docker.
Fantastic!
Thank you!

I will add this to the docs.

I am also on/using Unraid but as I've been working on this and testing it I don't have it running there just yet because I rebuild it constantly. When it's closer to what I completely envisioned I was thinking about setting it and configuring it to be an easily installable Unraid docker.
Sponsored

 
 







Top