How I Set Up My RV for HA

The Mifi address is 192.168.1.1. I enabled the built in GPS stream on port 10110. Below is the shell command that an automation calls every 30 minutes when the camper is away from home.

#!/bin/bash

GPSLOC="` curl -s --http0.9 192.168.1.1:10110 --output - | grep -a GPGGA -m 1 | cut -d, -f 3-10 `"
GPSLAT="` echo $GPSLOC | cut -d, -f 1 `"
GPSNS="` echo $GPSLOC | cut -d, -f 2 `"
GPSLON="` echo $GPSLOC | cut -d, -f 3 `"
GPSEW="` echo $GPSLOC | cut -d, -f 4 `"
GPSALT="` echo $GPSLOC | cut -d, -f 8 `"


if [[ $GPSNS =~ "S" ]]; then GPSLAT=`echo "0-$GPSLAT" | bc`; fi
if [[ $GPSEW =~ "W" ]]; then GPSLON=`echo "0-$GPSLON" | bc`; fi

GPSLAT=`echo "($GPSLAT/100)+(($GPSLAT%100)*.016666667)" | bc`
GPSLON=`echo "($GPSLON/100)+(($GPSLON%100)*.016666667)" | bc`
GPSALT=`echo "($GPSALT-1.8)/1" | bc`
printf '{"latitude":"%s","longitude":"%s","altitude":"%s"}\n' "$GPSLAT" "$GPSLON" "$GPSALT"

The automation runs this command with a response variable “gps_response”:

The next step of the automation is a set_location action using this response variable:

Edit: The shell script above subtracts 1.8m from the altitude because that’s approximately how high the Mifi is typically above ground level.

1 Like

Considering this as well. Likely on a Mini PC or something but my home runs on ProxMox for so many resources so it seems like the right thing to do for the camper as well lol.

1 Like

@CO_4X4
This week I setup a spare HP 600 G3 Mini I had; Upgraded the ram to 32GB, 1TB M.2 and 256GB SSD with ProxMox 8.4; Then loaded HA and Emby VMs onto it.

Hope to install this next week and replace the 2 Pi4s I have running HA & Kodi and then see where that leaves me. Also need to setup the BM6 battery monitor at some point.

2 Likes

I did a new thing: doubled my solar production (now ~2KW) and reverse-engineered my new MPPT’s BLE communication to slurp its data into ESPHome:

1 Like

Mini PC with ProxMox, HA, and Emby is a go!
Unfortunately, somewhere in there I added the newer Starlink integration and lost GPS options. I looked in HACS but can’t find the old version.

Anyone using Starlink and still getting GPS data?

Found them - hidden under a device_location that just says I’m home.
I swear I did something like this long ago… is there a way to extract the attributes and display them?

I have been fighting with my Winegard 5G Gateway all season. Has 2 ethernet ports but for some odd reason they both either want to be WAN or LAN, instead of 1 each.
This is a massive hindrance to me as I generally use Starlink once I’ve arrived and keep my AT&T 5G as back-up and then WIFI is still available as a source AND then run an Ethernet to my ProxMox PC.

Even if I can get it working right, the interface sucks and seemingly does not have API access of any kind, nor can I perform any detail configuration of the router as I would like to.

All that said, I have started looking at Peplink devices and am deeply appreciative of the code you posted (assuming I purchase one).

Same or similar here; I swear I used to have entities for lat/long, w high precision. Now just attributes under Device Location entity, w only 2 decimal digits precision.

Relatively minor upgrade to this setup:

When my fireplace (glorified space heater) turns off at the outlet due to power shedding, it doesn’t turn back on once the outlet turns back on (it requires either a capacitive touch button to be touched or a remote control ON button to be pressed.)

I set up an ESP32 and an IR transmitter that sends the ON command when a virtual button is pressed.

I then set up an automation to detect the forced powering off of the outlet (either via my hardware shedding that turns the load from ~1000W to Unavailable or via my software shedding) and then presses the above virtual button once the power is restored.

I double-side taped the transmitter daughter board inside the fireplace housing so it’s mostly out of sight.

A little more background, for those interested: I used my Flipper Zero to read what command was being sent by the remote when the ON button is pressed, then used the Flipper again to confirm that I was sending the same command (so I didn’t have to bed sitting next to the fireplace the whole time.)

I tried using an ESP8266 at first because I didn’t need Bluetooth for this application. This was a bad idea, because everything was wired up exactly the same, but it just didn’t work. After much banging of my head against a wall, I noticed the ESPHome docs mentioned that they recommend an ESP32. I wired up a new board with one of those, and it worked first try :joy:. Don’t be like me. Read the docs before you heat up your iron.

1 Like

I just realized today that although my location updates dynamically, none of the standard weather integrations allow dynamic location updates out of the box - they are all set up with initial coordinates and stay static. After a bit of research, I did find a solution. Rather than rewrite the same information, the solution I found is here - Yet Another Smart Camper Project - #12 by woodsby.

@dan.t would love to see that SeeLevel BT integration you have! happy to work with your code in whatever shape it is :slight_smile:
I’ve connected my Power Watchdog Gen 2 (the WiFi+BT version). Will contribute it to HACS once I get a bit of time.

Hey, @noliran, I’ll upload my code to my git account for you to get to it. It will be tomorrow though as I am currently traveling. The code has been working for me for quite some time now

1 Like

I have pushed my code on github. You can add it as a custom repository in HACS:

top right menu button in HACS → Customer repositories and add it as an integration. The github URL is https://github.com/danTapps/garnet

The integration is called “Garnet SeeLevel II”. I am still waiting for the brand image to be posted to include it in the default HACS repository.

Once installed, restart home assistant and you should see a new device suggestion popping up once BLE data from the unit is received.

Let me know if you have any issues.

Hey :slight_smile: Thanks Dan. Apologies for the delay, only got around to install the module today.

In any case… the plot thickens. Installed successfully but no device was found:

  1. It seems my device’s manufacturer ID is not 305, but rather 3264.
  2. Looks like the BLE packet structure is very different than what your component is looking for :slight_smile:

It’s making me think we might be using slightly different models / firmwares? I’m using 709-BTP7.

The BLE packets my SeeLevel is sending are also 14 bytes long, but seem to contain all the sensor values in the one packet. Here’s an example:

2025-05-19 03:14:43.513 DEBUG (MainThread) [custom_components.garnet.parser] Got data b'1\x91\x00!\x00\x0cnnnnn\x86\x00\x00' len 14

Packet: 3191 00 21 00 0c 6e 6e 6e 6e 6e 86 00 00

CCCC F2 F1 B2 B1 ?? ?? ?? ?? ?? BV G2 G1
3191 00 21 00 0c 6e 6e 6e 6e 6e 86 00 00

CCCC - Coach code
F2 = Fresh water 2, not installed, 0
F1 = Fresh water 1, 0x21, 33, 33% (validated correct with app UI)
B2 = Black tank 2, not installed, 0
B1 = Black tank 1, 0x0c, 12, 12% (validated correct with app UI) 
?? = Not sure what those are yet. This unit can also monitor LPG, might be related
BV = Battery voltage, 0x86, 134, 13.4 V (validated correct with app UI)
G2 = Gray tank 2, not installed, 0
G1 = Gray tank 1, 0x00, 0, 0% (but this is a guess.. will report back when I have some water in the gray tank :)

Let me know what you think.

P.S. G2, F2 and B2 are me guessing… they could also be just G1, F1, and B1 as uint16, but I don’t think that’s the case

Hey, ok, interesting, but it shouldn’t be too hard to add this variant to the code. For the tanks that are not installed, did you configure them that way also on the Garnet unit? I am wondering if they always report 0 or if they would show a different value.

All of the #2 tanks show up as “disabled” on the unit itself - which isn’t something I configured.

Okay, I finally have some gray water reading - here’s the updated mapping.
I no longer have a guess about where the tank #2 readings are. It might be the 6E (maybe that’s the code for disabled).

CCCC ?? F1 G1 B1 ?? ?? ?? ?? ?? BV ?? ??
3191 00 21 06 12 6e 6e 6e 6e 6e 86 00 00

CCCC - Coach code
F1 = Fresh water 1, 0x21, 33, 33% (validated correct with app UI)
G1 = Gray tank 1, not installed, 0
B1 = Black tank 1, 0x0c, 12, 12% (validated correct with app UI) 
BV = Battery voltage, 0x86, 134, 13.4 V (validated correct with app UI)
G1 = Gray tank 1, 0x06, 6, 6% (validated correct with app UI)

Here’s the snippet that currently works for me (in parser.py method GarnetBluetoothDeviceData._process_update)

    # Reminder to change MFR_ID to accept 3264 as well

    def _process_update(self, data: bytes) -> None:
        """Update from BLE advertisement data."""
        _LOGGER.debug("Got data %s len %d", format(data), len(data))
        (coach_id, fresh_1, grey_1, black_1, voltage) = (
            unpack("<HxBBB5xBxx", data)
        )

        voltage = round(voltage / 10, 2)

        self.update_sensor(
            key=GarnetTypes.FRESH_TANK,
            native_unit_of_measurement="%",
            native_value=fresh_1,
            device_class=None,
        )

        self.update_sensor(
            key=GarnetTypes.GREY_TANK,
            native_unit_of_measurement="%",
            native_value=grey_1,
            device_class=None,
        )

        self.update_sensor(
            key=GarnetTypes.BLACK_TANK,
            native_unit_of_measurement="%",
            native_value=black_1,
            device_class=None,
        )

        self.update_sensor(
            key=GarnetTypes.BATTERY,
            native_unit_of_measurement="V",
            native_value=voltage,
            device_class="VOLTAGE",
        )

By the way, out of curiosity, are you also using the 709-BTP7 or are you using a 709-BTP3?

I have the BTP3, I checked out the BTP7 description and it actually has 2 black, two fresh and 3 grey tanks, which is interesting. So your 6e values could represent F2, G2, B2, G3 and LPG, potentially. Hard to say without real data. I have most of my code already adjusted to handle both units, will adapt it to the above structure. Shouldn’t be too much to get this done in one integration.

There is a new version 1.1.0 available, that adds support for you BTP7 module. I have limited it to the sensors that you were able to identify, the other tanks are currently not shown. Easy to add if I get some data that identifies them in the data stream. Thanks for great input, made it easy to extend it!

You rock @dan.t - only one tiny fix that needs to be done :slight_smile: here’s the PR. Cheers!

All set, new version, v1.1.1, is on GitHub. Thanks for the PR!