Files
NWC2026-AstropotaPOD/flair2MQTT.sh
T
2026-09-06 12:08:05 -04:00

90 lines
3.4 KiB
Bash
Executable File

#!/bin/bash
# --- CONFIGURATION FROM ENVIRONMENT VARIABLES ---
CLIENT_ID="${FLAIR_CLIENT_ID}"
CLIENT_SECRET="${FLAIR_CLIENT_SECRET}"
if [ -z "$CLIENT_ID" ] || [ -z "$CLIENT_SECRET" ]; then
echo "Error: Missing environment variables." >&2
echo "Please set FLAIR_CLIENT_ID and FLAIR_CLIENT_SECRET before running this script." >&2
exit 1
fi
MQTT_BROKER="192.168.0.6"
MQTT_PORT="1883"
# Matching your requested structure
MQTT_TOPIC_BASE="AstropotaPOD/sensor"
# --- HELPER: GET OAUTH2 TOKEN ---
get_flair_token() {
local token_response
token_response=$(curl -s -X POST "https://api.flair.co/oauth2/token" \
-d "grant_type=client_credentials" \
-d "client_id=${CLIENT_ID}" \
-d "client_secret=${CLIENT_SECRET}")
echo "$token_response" | jq -r '.access_token // empty'
}
# --- FETCH REFRESHED TOKEN ---
TOKEN=$(get_flair_token)
if [ -z "$TOKEN" ] || [ "$TOKEN" == "null" ]; then
echo "Failed to authenticate with Flair." >&2
exit 1
fi
# --- FETCH AND PUBLISH TO MQTT ---
PAYLOAD=$(curl -s -X GET "https://api.flair.co/api/puck2s" \
-H "Authorization: Bearer ${TOKEN}" \
-H "Accept: application/json")
do_pub() {
mosquitto_pub -h "$MQTT_BROKER" -p "$MQTT_PORT" -t "${TARGET_TOPIC}/${1}" -m "$2" -r
}
while read -r puck_data; do
if [ -z "$puck_data" ]; then continue; fi
# Grab the human-readable name from your payload (e.g., "AstropotaPOD-e9af")
puck_name=$(echo "$puck_data" | jq -r '.attributes.name // empty')
# Fallback to ID just in case a device doesn't have a custom name assigned
if [ -z "$puck_name" ] || [ "$puck_name" == "null" ]; then
puck_name=$(echo "$puck_data" | jq -r '.id')
fi
# Extract metrics from payload attributes
temp_c=$(echo "$puck_data" | jq -r '.attributes."current-temperature-c" // empty')
humidity=$(echo "$puck_data" | jq -r '.attributes."current-humidity" // empty')
wifi_rssi=$(echo "$puck_data" | jq -r '.attributes."current-wifi-rssi" // empty')
power_source=$(echo "$puck_data" | jq -r '.attributes."power-source" // empty')
reporting_interval=$(echo "$puck_data" | jq -r '.attributes."reporting-interval-ds" // empty')
firmware=$(echo "$puck_data" | jq -r '.attributes."firmware-version" // empty')
beacon_ms=$(echo "$puck_data" | jq -r '.attributes."beacon-interval-ms" // empty')
voltage=$(echo "$puck_data" | jq -r '.attributes.voltage')
last_voltage=$(echo "$puck_data" | jq -r '.attributes."last-reported-voltage"')
if [ "$voltage" == "0" ] || [ "$voltage" == "0.0" ]; then
battery="$last_voltage"
else
battery="$voltage"
fi
# Dynamic target base matching your requested pattern: AstropotaPOD/sensor/AstropotaPOD-e9af/
TARGET_TOPIC="${MQTT_TOPIC_BASE}/${puck_name}"
# Blast sub-topics cleanly to Mosquitto
[ -n "$temp_c" ] && do_pub "temperature" "$temp_c"
[ -n "$humidity" ] && do_pub "humidity" "$humidity"
[ -n "$wifi_rssi" ] && do_pub "wifi_rssi" "$wifi_rssi"
[ -n "$power_source" ] && do_pub "power_source" "$power_source"
[ -n "$battery" ] && do_pub "battery_voltage" "$battery"
[ -n "$reporting_interval" ] && do_pub "reporting_interval" "$reporting_interval"
[ -n "$firmware" ] && do_pub "firmware_version" "$firmware"
[ -n "$beacon_ms" ] && do_pub "beacon_interval" "$beacon_ms"
# echo "Published to MQTT under: ${TARGET_TOPIC}/"
done < <(echo "$PAYLOAD" | jq -c '.data[]')