Skip to content

Instantly share code, notes, and snippets.

@dale3h
Created March 3, 2023 09:53
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save dale3h/b1c4e571947438728164dbe2ead728ec to your computer and use it in GitHub Desktop.
Save dale3h/b1c4e571947438728164dbe2ead728ec to your computer and use it in GitHub Desktop.
[Home Assistant] Verizon MiFi Jetpack 8800L
# IMPORTANT: Enable the package in `configuration.yaml`
# @see https://www.home-assistant.io/docs/configuration/packages/
# Option 1: Include all files inside `config/packages` as package files:
homeassistant:
packages: !include_dir_named packages
# Option 2: Use `packages/jetpack_8800l.yaml` file directly from `config/packages` folder:
homeassistant:
packages:
jetpack_8800l: !include packages/jetpack_8800l.yaml
# Option 3: Create `jetpack_8800l.yaml` file in the same directory as `configuration.yaml`:
homeassistant:
packages:
jetpack_8800l: !include jetpack_8800l.yaml
# ==============================================================================
# Packages / Jetpack 8800L
# @file packages/jetpack_8800l.yaml
#
# IMPORTANT: Enable packages in `configuration.yaml`
# @see https://www.home-assistant.io/docs/configuration/packages/
#
# @notes Set `input_text.jetpack_8800l_host` to the IP address of your Verizon
# Jetpack hotspot.
# @notes Set `input_number.jetpack_8800l_data_cap` to the amount of data that
# you are allotted. This is usually either 100GB or 150GB in the US.
# ==============================================================================
# ==============================================
# Input Text
# ==============================================
input_text:
jetpack_8800l_host:
name: Jetpack 8800L Host
icon: mdi:server
# ==============================================
# Input Number
# ==============================================
input_number:
jetpack_8800l_data_cap:
name: Jetpack 8800L Data Cap
icon: mdi:swap-horizontal
initial: 150
min: 0
max: 1000
step: 1
mode: box
unit_of_measurement: GB
# ==============================================
# Sensor
# ==============================================
sensor:
# ==============================
# Usage Info
# ==============================
- platform: rest
name: Jetpack 8800L Usage
unique_id: jetpack_8800l_usage
resource_template: "http://{{ states('input_text.jetpack_8800l_host') }}/apps_home/usageinfo/"
value_template: "OK"
json_attributes:
- allowance
- barLevelLineUsage
- barLevelTotalShrUsage
- barPercentageLineUsage
- barPercentageTotalShrUsage
- cycleEndDt
- daysLeft
- gBaseAssetsPath
- gHelpURL
- gHtmlLang
- gIsLoggedIn
- gLangDirection
- gLocale
- gPageId
- gProductName
- gProductNumber
- gSecureToken
- isHidden
- lineUsage
- planType
- remainingUsage
- totalShrUsage
- unit
- usageInformationState
- usageTimestamp
# ==============================
# Status Info
# ==============================
- platform: rest
name: Jetpack 8800L Status
unique_id: jetpack_8800l_status
resource_template: "http://{{ states('input_text.jetpack_8800l_host') }}/srv/status"
value_template: "OK"
json_attributes_path: "$.statusData"
json_attributes:
- statusBarAirplaneMode
- statusBarBatteryChargingSource
- statusBarBatteryChargingState
- statusBarBatteryDetection
- statusBarBatteryPercent
- statusBarBytesReceived
- statusBarBytesTotal
- statusBarBytesTransmitted
- statusBarClientListSize
- statusBarConnectionDuration
- statusBarConnectionState
- statusBarFemtoCellStatus
- statusBarGpsStatus
- statusBarGuestClientListSize
- statusBarGuestWifiEnabled
- statusBarMaxWiFiClientListSize
- statusBarMnsAvailable
- statusBarMnsInUse
- statusBarMnsScan
- statusBarMobileDataEnabled
- statusBarNetwork
- statusBarNetworkID
- statusBarNotificationFlag
- statusBarPrimaryClientListSize
- statusBarRoaming
- statusBarSdCardFreeSpace
- statusBarSdCardInUse
- statusBarSdCardStatus
- statusBarSdCardUsedSpace
- statusBarSignalBars
- statusBarSimStatus
- statusBarSmsUnreadCount
- statusBarTechnology
- statusBarTechnologyText
- statusBarTrafficStatus
- statusBarWiFiClientListSize
- statusBarWiFiEnabled
# ==============================================
# Template
# ==============================================
template:
# ==============================
# Calculated Sensors
# ==============================
- sensor:
- name: Jetpack 8800L Cycle Days
unique_id: jetpack_8800l_usage_cycleDays
icon: mdi:calendar-month
unit_of_measurement: days
# device_class: duration
state: >-
{% set dt = strptime(states('sensor.jetpack_8800l_cycle_end_date'), '%Y-%m-%d', as_datetime(0)) %}
{{ (dt.replace(day=1) - timedelta(days=1)).day }}
- name: Jetpack 8800L Days Used
unique_id: jetpack_8800l_usage_daysUsed
icon: mdi:calendar-clock
unit_of_measurement: days
# device_class: duration
state: >-
{{ states('sensor.jetpack_8800l_cycle_days') | int(0) - states('sensor.jetpack_8800l_days_left') | int(0) }}
- name: Jetpack 8800L Daily Threshold
unique_id: jetpack_8800l_usage_dailyThreshold
icon: mdi:calendar-month
unit_of_measurement: GB
state: >-
{{ (states('input_number.jetpack_8800l_data_cap') | float(0) / states('sensor.jetpack_8800l_cycle_days') | int(0) | default(-99, true)) | round(2) }}
- name: Jetpack 8800L Data Remaining
unique_id: jetpack_8800l_usage_dataRemaining
icon: mdi:database-clock
unit_of_measurement: GB
state: >-
{{ (states('input_number.jetpack_8800l_data_cap') | float(0) - states('sensor.jetpack_8800l_data_usage') | float(0)) | round(2) }}
- name: Jetpack 8800L Daily Allowance
unique_id: jetpack_8800l_usage_dailyAllowance
icon: mdi:calendar-month
unit_of_measurement: GB
state: >-
{{ (states('sensor.jetpack_8800l_data_remaining') | float(0) / states('sensor.jetpack_8800l_days_left') | int(0) | default(-99, true)) | round(2) }}
- name: Jetpack 8800L Average Daily Usage
unique_id: jetpack_8800l_usage_avgDailyUsage
icon: mdi:gauge
unit_of_measurement: GB
state: >-
{{ (states('sensor.jetpack_8800l_data_usage') | float(0) / (states('sensor.jetpack_8800l_days_used') | int(0) | default(-99, true))) | round(2) }}
# ==============================
# Usage Info Sensors
# ==============================
- sensor:
- name: Jetpack 8800L Allowance
unique_id: jetpack_8800l_usage_allowance
icon: mdi:wan
state: >-
{% if is_state_attr('sensor.jetpack_8800l_usage', 'usageInformationState', 'available') %}
{{ state_attr('sensor.jetpack_8800l_usage', 'allowance') }}
{% else %}
{{ states('sensor.jetpack_8800l_allowance') }}
{% endif %}
- name: Jetpack 8800L Cycle End Date
unique_id: jetpack_8800l_usage_cycleEndDt
icon: mdi:calendar-refresh
device_class: date
state: >-
{% if is_state_attr('sensor.jetpack_8800l_usage', 'usageInformationState', 'available') %}
{{ strptime(state_attr('sensor.jetpack_8800l_usage', 'cycleEndDt'), '%m/%d/%Y', '2001-01-01' | as_datetime).strftime('%Y-%m-%d') }}
{% else %}
{% if states('sensor.jetpack_8800l_cycle_end_date') in ['unknown', 'unavailable'] %}
2001-01-01
{% else %}
{{ states('sensor.jetpack_8800l_cycle_end_date') }}
{% endif %}
{% endif %}
- name: Jetpack 8800L Days Left
unique_id: jetpack_8800l_usage_daysLeft
icon: mdi:calendar-clock
unit_of_measurement: days
state: >-
{% if is_state_attr('sensor.jetpack_8800l_usage', 'usageInformationState', 'available') %}
{{ state_attr('sensor.jetpack_8800l_usage', 'daysLeft') }}
{% else %}
{{ states('sensor.jetpack_8800l_days_left') }}
{% endif %}
- name: Jetpack 8800L Data Usage
unique_id: jetpack_8800l_usage_totalShrUsage
icon: mdi:wan
unit_of_measurement: GB
state_class: total_increasing
state: >-
{% if is_state_attr('sensor.jetpack_8800l_usage', 'usageInformationState', 'available') %}
{{ state_attr('sensor.jetpack_8800l_usage', 'totalShrUsage') | round(2) }}
{% else %}
{{ states('sensor.jetpack_8800l_data_usage') }}
{% endif %}
- name: Jetpack 8800L Usage Unit
unique_id: jetpack_8800l_usage_unit
icon: mdi:wan
state: >-
{% if is_state_attr('sensor.jetpack_8800l_usage', 'usageInformationState', 'available') %}
{{ state_attr('sensor.jetpack_8800l_usage', 'unit') }}
{% else %}
{{ states('sensor.jetpack_8800l_usage_unit') }}
{% endif %}
- name: Jetpack 8800L Usage Timestamp
unique_id: jetpack_8800l_usage_usageTimestamp
icon: mdi:wan
device_class: date
state: >-
{% if is_state_attr('sensor.jetpack_8800l_usage', 'usageInformationState', 'available') %}
{{ strptime(state_attr('sensor.jetpack_8800l_usage', 'usageTimestamp'), '%m/%d/%Y', '2001-01-01' | as_datetime).strftime('%Y-%m-%d') }}
{% else %}
{% if states('sensor.jetpack_8800l_usage_timestamp') in ['unknown', 'unavailable'] %}
2001-01-01
{% else %}
{{ states('sensor.jetpack_8800l_usage_timestamp') }}
{% endif %}
{% endif %}
# ==============================
# Status Info Sensors
# ==============================
- sensor:
# ==============
# Battery
# ==============
- name: Jetpack 8800L Battery Charging Source
unique_id: jetpack_8800l_status_BatteryChargingSource
icon: >-
{% set icon_key = state_attr('sensor.jetpack_8800l_status', 'statusBarBatteryChargingSource') | lower %}
{% set icons = {
'chargingsourceac': 'mdi:power-plug',
'chargingsourceusb': 'mdi:usb-port',
'chargingsourcenone': 'mdi:power-plug-off'
} %}
{{ icons[icon_key] | default('mdi:power-plug-off') }}
state: >-
{% if is_state_attr('sensor.jetpack_8800l_status', 'statusBarBatteryChargingSource', 'ChargingSourceAC') %}
AC
{% elif is_state_attr('sensor.jetpack_8800l_status', 'statusBarBatteryChargingSource', 'ChargingSourceUSB') %}
USB
{% elif is_state_attr('sensor.jetpack_8800l_status', 'statusBarBatteryChargingSource', 'ChargingSourceNone') %}
None
{% else %}
{{ state_attr('sensor.jetpack_8800l_status', 'statusBarBatteryChargingSource') }}
{% endif %}
- name: Jetpack 8800L Battery Level
unique_id: jetpack_8800l_status_BatteryPercent
unit_of_measurement: "%"
device_class: battery
state_class: measurement
state: >-
{{ state_attr('sensor.jetpack_8800l_status', 'statusBarBatteryPercent') }}
# ==============
# Connection
# ==============
- name: Jetpack 8800L Connection Duration
unique_id: jetpack_8800l_status_ConnectionDuration
icon: mdi:web-clock
state: >-
{{ state_attr('sensor.jetpack_8800l_status', 'statusBarConnectionDuration') }}
unit_of_measurement: seconds
- name: Jetpack 8800L Connection State
unique_id: jetpack_8800l_status_ConnectionState
icon: >-
{% set icon_key = state_attr('sensor.jetpack_8800l_status', 'statusBarConnectionState') | lower %}
{% set icons = {
'initializing': 'mdi:web-sync',
'searching': 'mdi:web-sync',
'ready': 'mdi:web-check',
'connecting': 'mdi:web-sync',
'connected': 'mdi:web-check',
'dormant': 'mdi:web-clock',
'disconnecting': 'mdi:web-minus',
'activation in progress': 'mdi:web-sync',
'no service': 'mdi:web-off',
'unactivated': 'mdi:web-off',
'account restricted (pco 2)': 'mdi:web-cancel',
'account restricted (pco 2) disconnected': 'mdi:web-cancel',
'account out of credit (pco 3)': 'mdi:web-cancel',
'account not active (pco 5)': 'mdi:web-cancel',
} %}
{{ icons[icon_key] | default('mdi:web-remove') }}
state: >-
{{ state_attr('sensor.jetpack_8800l_status', 'statusBarConnectionState') }}
- name: Jetpack 8800L Traffic Status
unique_id: jetpack_8800l_status_TrafficStatus
icon: >-
{% set icon_key = state_attr('sensor.jetpack_8800l_status', 'statusBarTrafficStatus') | lower %}
{% set icons = {
'none': 'mdi:wifi-remove',
'uplink': 'mdi:wifi-arrow-up',
'downlink': 'mdi:wifi-arrow-down',
'uplinkdownlink': 'mdi:wifi-arrow-up-down',
} %}
{{ icons[icon_key] | default('mdi:wifi-arrow-up-down') }}
state: >-
{{ state_attr('sensor.jetpack_8800l_status', 'statusBarTrafficStatus') }}
# ==============
# WiFi / Devices / Clients
# ==============
- name: Jetpack 8800L Clients
unique_id: jetpack_8800l_status_ClientListSize
icon: mdi:devices
state: >-
{{ state_attr('sensor.jetpack_8800l_status', 'statusBarClientListSize') }}
state_class: measurement
- name: Jetpack 8800L Primary Clients
unique_id: jetpack_8800l_status_PrimaryClientListSize
icon: mdi:devices
state: >-
{{ state_attr('sensor.jetpack_8800l_status', 'statusBarPrimaryClientListSize') }}
state_class: measurement
- name: Jetpack 8800L Guest Clients
unique_id: jetpack_8800l_status_GuestClientListSize
icon: mdi:devices
state: >-
{{ state_attr('sensor.jetpack_8800l_status', 'statusBarGuestClientListSize') }}
state_class: measurement
- name: Jetpack 8800L WiFi Clients
unique_id: jetpack_8800l_status_WiFiClientListSize
icon: mdi:devices
state: >-
{{ state_attr('sensor.jetpack_8800l_status', 'statusBarWiFiClientListSize') }}
state_class: measurement
- name: Jetpack 8800L Max WiFi Clients
unique_id: jetpack_8800l_status_MaxWiFiClientListSize
icon: mdi:devices
state: >-
{{ state_attr('sensor.jetpack_8800l_status', 'statusBarMaxWiFiClientListSize') }}
state_class: measurement
# ==============
# GPS
# ==============
- name: Jetpack 8800L GPS Status
unique_id: jetpack_8800l_status_GpsStatus
icon: mdi:crosshairs-gps
state: >-
{{ state_attr('sensor.jetpack_8800l_status', 'statusBarGpsStatus') | replace('GpsOff', 'Off') }}
# ==============
# Network
# ==============
- name: Jetpack 8800L Network
unique_id: jetpack_8800l_status_Network
icon: mdi:signal
state: >-
{{ state_attr('sensor.jetpack_8800l_status', 'statusBarNetwork') }}
- name: Jetpack 8800L Network ID
unique_id: jetpack_8800l_status_NetworkID
icon: mdi:signal
state: >-
{{ state_attr('sensor.jetpack_8800l_status', 'statusBarNetworkID') }}
- name: Jetpack 8800L Signal
unique_id: jetpack_8800l_status_SignalBars
icon: >-
{% set signal = state_attr('sensor.jetpack_8800l_status', 'statusBarSignalBars') | int(0) %}
{% if signal >= 3 %}
mdi:signal-cellular-3
{% elif signal >= 2 %}
mdi:signal-cellular-2
{% elif signal >= 1 %}
mdi:signal-cellular-1
{% else %}
mdi:signal-cellular-outline
{% endif %}
state: >-
{{ state_attr('sensor.jetpack_8800l_status', 'statusBarSignalBars') }}
unit_of_measurement: bars
# device_class: signal_strength
state_class: measurement
- name: Jetpack 8800L Technology
unique_id: jetpack_8800l_status_Technology
icon: mdi:signal
state: >-
{{ state_attr('sensor.jetpack_8800l_status', 'statusBarTechnology') }}
- name: Jetpack 8800L Technology Text
unique_id: jetpack_8800l_status_TechnologyText
icon: mdi:signal-cellular-3
state: >-
{{ state_attr('sensor.jetpack_8800l_status', 'statusBarTechnologyText') }}
# ==============
# SIM
# ==============
- name: Jetpack 8800L SIM Status
unique_id: jetpack_8800l_status_SimStatus
icon: mdi:sim
state: >-
{{ state_attr('sensor.jetpack_8800l_status', 'statusBarSimStatus') }}
# ==============
# Notifications
# ==============
- name: Jetpack 8800L SMS Unread Count
unique_id: jetpack_8800l_status_SmsUnreadCount
icon: >-
{% if state_attr('sensor.jetpack_8800l_status', 'statusBarSmsUnreadCount') | int(0) %}
mdi:message-alert
{% else %}
mdi:message
{% endif %}
state: >-
{{ state_attr('sensor.jetpack_8800l_status', 'statusBarSmsUnreadCount') }}
# ==============================================
# Usage Info Binary Sensors
# ==============================================
- binary_sensor:
- name: Jetpack 8800L Usage Information State
unique_id: jetpack_8800l_usage_usageInformationState
icon: >-
{% set icon_key = state_attr('sensor.jetpack_8800l_usage', 'usageInformationState') | lower %}
{% set icons = {
'unavailable': 'mdi:close-network',
'available': 'mdi:check-network',
} %}
{{ icons[icon_key] | default('mdi:help-network') }}
state: >-
{{ is_state_attr('sensor.jetpack_8800l_usage', 'usageInformationState', 'available') }}
# ==============================================
# Status Info Binary Sensors
# ==============================================
- binary_sensor:
# ==============
# Network
# ==============
- name: Jetpack 8800L Airplane Mode
unique_id: jetpack_8800l_status_AirplaneMode
icon: >-
{% set icon_key = state_attr('sensor.jetpack_8800l_status', 'statusBarAirplaneMode') | lower %}
{% set icons = {
'airplanemodeon': 'mdi:airplane',
'airplanemodeoff': 'mdi:airplane-off',
'lowbatteryoff': 'mdi:airplane-alert'
} %}
{{ icons[icon_key] | default('mdi:airplane') }}
state: >-
{{ not is_state_attr('sensor.jetpack_8800l_status', 'statusBarAirplaneMode', 'AirplaneModeOff') }}
- name: Jetpack 8800L Mobile Data Enabled
unique_id: jetpack_8800l_status_MobileDataEnabled
icon: >-
{% if state_attr('sensor.jetpack_8800l_status', 'statusBarMobileDataEnabled') | int(0) %}
mdi:access-point-network
{% else %}
mdi:access-point-network-off
{% endif %}
state: >-
{{ state_attr('sensor.jetpack_8800l_status', 'statusBarMobileDataEnabled') }}
# ==============
# Battery
# ==============
- name: Jetpack 8800L Battery Charging State
unique_id: jetpack_8800l_status_BatteryChargingState
state: >-
{{ state_attr('sensor.jetpack_8800l_status', 'statusBarBatteryChargingState') }}
device_class: battery_charging
- name: Jetpack 8800L Battery Detection
unique_id: jetpack_8800l_status_BatteryDetection
icon: >-
{% set icon_key = state_attr('sensor.jetpack_8800l_status', 'statusBarBatteryDetection') | lower %}
{% set icons = {
'present': 'mdi:battery-check',
'notpresent': 'mdi:battery-remove',
'invalid': 'mdi:battery-alert-variant'
} %}
{{ icons[icon_key] | default('mdi:battery-alert-variant') }}
state: >-
{{ is_state_attr('sensor.jetpack_8800l_status', 'statusBarBatteryDetection', 'Present') }}
device_class: power
# ==============
# WiFi
# ==============
- name: Jetpack 8800L WiFi Enabled
unique_id: jetpack_8800l_status_WiFiEnabled
icon: >-
{% if state_attr('sensor.jetpack_8800l_status', 'statusBarWiFiEnabled') | int(0) %}
mdi:wifi
{% else %}
mdi:wifi-off
{% endif %}
state: >-
{{ state_attr('sensor.jetpack_8800l_status', 'statusBarWiFiEnabled') }}
- name: Jetpack 8800L Guest WiFi Enabled
unique_id: jetpack_8800l_status_GuestWifiEnabled
icon: >-
{% if state_attr('sensor.jetpack_8800l_status', 'statusBarGuestWifiEnabled') | int(0) %}
mdi:wifi
{% else %}
mdi:wifi-off
{% endif %}
state: >-
{{ state_attr('sensor.jetpack_8800l_status', 'statusBarGuestWifiEnabled') }}
# ==============
# Notifications
# ==============
- name: Jetpack 8800L Notification Flag
unique_id: jetpack_8800l_status_NotificationFlag
icon: >-
{% if state_attr('sensor.jetpack_8800l_status', 'statusBarNotificationFlag') | int(0) %}
mdi:message-alert
{% else %}
mdi:message
{% endif %}
state: >-
{{ state_attr('sensor.jetpack_8800l_status', 'statusBarNotificationFlag') }}
@uberoptix
Copy link

uberoptix commented Apr 9, 2023

Recommend adding an 'initial' line to the input_text on line 18 for clarity.

input_text:
jetpack_8800l_host:
name: Jetpack 8800L Host
icon: mdi:server
initial: 10.0.0.1 [replace with your device IP]

I also run 2 seperate Jetpack devices and was able to quickly deploy this for both by creating 2 copies of the file, doing a find and replace for 8800L in each, and making the resultant sensors unique (e.g. sensor.jetpack_2_status and sensor.jetpack_2_status, in my case). Modified config entry below for context.

homeassistant:
packages:
jetpack_1: !include jetpack_1.yaml
jetpack_2: !include jetpack_2.yaml

@Gliebig
Copy link

Gliebig commented Jun 25, 2023

Awesome! I have an Inseego M3000 hotspot and been having a real issue with the battery getting over charged and going into battery preservation mode. Then I sometimes lose the internet connection. My hotspot is in my RV and I have a home assistant server monitoring critical information. I ran across this trying to solve my issue and it works fantastic. I just did a search and replace to update the name and I'm able to get the battery levels and installed a HTC switch on the charger. With a simple automation I now can turn the charger on and off based on this percentage. It just works. Thank you for posting!!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment