Initial load
This commit is contained in:
Executable
+89
@@ -0,0 +1,89 @@
|
||||
#!/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[]')
|
||||
Reference in New Issue
Block a user