Files
Luanti-HA-Bridge/ha_bridge.sh
2026-03-06 19:23:05 +00:00

97 lines
4.9 KiB
Bash

#!/bin/bash
# --- KONFIGURATION ---
LOGFILE="/home/DeinKonto/.minetest/debug.txt"
TOKEN="DeinToken"
HA_URL="http://192.168.178.40:8123/api/states"
DB_PATH="/home/DeinHomeVerzeichnis/.minetest/worlds/DeineWelt/players.sqlite"
# --- INITIALER STARTWERT (Aus der DB beim Start des Scripts) ---
# Holt alle Spieler, die in den letzten 2 Min aktiv waren als Basiswert
PLAYER_COUNT=$(sqlite3 "$DB_PATH" "SELECT COUNT(name) FROM player WHERE modification_date > datetime('now', '-2 minutes');")
[[ -z "$PLAYER_COUNT" ]] && PLAYER_COUNT=0
# --- TELEMETRIE SCHLEIFE (UPTIME, CPU, DIAMANTEN & SPIELZEIT) ---
(
while true; do
PID=$(pgrep luanti)
if [ ! -z "$PID" ]; then
# 1. Uptime & CPU berechnen
UPTIME_SEC=$(ps -p $PID -o etimes= | tr -d ' ')
UPTIME_HOURS=$(echo "scale=1; $UPTIME_SEC / 3600" | bc -l | sed 's/^\./0./')
CPU_LOAD=$(ps -p $PID -o %cpu= | tr -d ' ' | tr ',' '.')
curl -s -X POST -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
-d "{\"state\": \"$UPTIME_HOURS\", \"attributes\": {\"unit_of_measurement\": \"h\", \"friendly_name\": \"ServerUp\"}}" \
"$HA_URL/sensor.luanti_uptime"
curl -s -X POST -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
-d "{\"state\": \"$CPU_LOAD\", \"attributes\": {\"unit_of_measurement\": \"%\", \"friendly_name\": \"CPU Last\"}}" \
"$HA_URL/sensor.luanti_cpu"
# 2. Reichtums-Scan & Live-Spielzeit
if [ -f "$DB_PATH" ]; then
# --- DIAMANTEN (Rohdiamanten x1, Blöcke x9) ---
sqlite3 "$DB_PATH" "SELECT player, item FROM player_inventory_items WHERE item LIKE '%diamond%' AND item NOT LIKE '%pick%' AND item NOT LIKE '%axe%' AND item NOT LIKE '%shovel%';" | awk -F'|' '{
item=$2; player=$1; count=1;
split(item, parts, " ");
if (parts[2] ~ /^[0-9]+$/) { count = parts[2]; }
if (item ~ /block/) { value = count * 9; } else { value = count; }
sum[player] += value
} END {
for (p in sum) print p "|" sum[p]
}' | while read ROW; do
P_NAME=$(echo "$ROW" | cut -d'|' -f1)
P_TOTAL=$(echo "$ROW" | cut -d'|' -f2)
P_LOWER=$(echo "$P_NAME" | tr '[:upper:]' '[:lower:]' | sed 's/[^a-z0-9]/_/g')
curl -s -X POST -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
-d "{\"state\": \"$P_TOTAL\", \"attributes\": {\"unit_of_measurement\": \"💎\", \"friendly_name\": \"Diamant-Vermögen $P_NAME\"}}" \
"$HA_URL/sensor.luanti_diamonds_$P_LOWER"
done
# --- LIVE SPIELZEIT (Aktivität in den letzten 2 Min) ---
sqlite3 "$DB_PATH" "SELECT name FROM player WHERE modification_date > datetime('now', '-2 minutes');" | while read P_ONLINE; do
P_LOWER=$(echo "$P_ONLINE" | tr '[:upper:]' '[:lower:]' | sed 's/[^a-z0-9]/_/g')
CURRENT_PT=$(curl -s -H "Authorization: Bearer $TOKEN" "$HA_URL/sensor.luanti_playtime_$P_LOWER" | jq -r '.state')
if [[ "$CURRENT_PT" == "null" || "$CURRENT_PT" == "unknown" ]]; then CURRENT_PT="0.0"; fi
NEW_PT=$(echo "scale=3; $CURRENT_PT + 0.016" | bc -l | sed 's/^\./0./')
curl -s -X POST -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
-d "{\"state\": \"$NEW_PT\", \"attributes\": {\"unit_of_measurement\": \"h\", \"friendly_name\": \"Spielzeit $P_ONLINE\"}}" \
"$HA_URL/sensor.luanti_playtime_$P_LOWER"
done
fi
fi
sleep 60
done
) &
# --- LOG-PARSER (ECHTZEIT SPIELER STATUS & ZÄHLER) ---
tail -n 0 -F "$LOGFILE" | grep --line-buffered -E "joins game|leaves game" | while read LINE ; do
if [[ "$LINE" == *"joins game"* ]]; then
PLAYER=$(echo "$LINE" | sed -n 's/.*ACTION\[Server\]: \(.*\) \[.*/\1/p')
[[ -z "$PLAYER" ]] && PLAYER=$(echo "$LINE" | awk '{print $4}' | tr -d '[]')
STATE="on"
PLAYER_COUNT=$((PLAYER_COUNT + 1))
else
PLAYER=$(echo "$LINE" | awk '{print $4}')
STATE="off"
PLAYER_COUNT=$((PLAYER_COUNT - 1))
fi
# Zähler-Check (darf nicht unter 0 fallen)
if [ "$PLAYER_COUNT" -lt 0 ]; then PLAYER_COUNT=0; fi
# 1. Binary Sensor für den einzelnen Spieler
PLAYER_LOWER=$(echo "$PLAYER" | tr '[:upper:]' '[:lower:]' | sed 's/[^a-z0-9]/_/g')
curl -s -X POST -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
-d "{\"state\": \"$STATE\", \"attributes\": {\"friendly_name\": \"$PLAYER\", \"device_class\": \"connectivity\"}}" \
"$HA_URL/binary_sensor.luanti_${PLAYER_LOWER}"
# 2. Gesamt-Zähler sofort an HA senden
curl -s -X POST -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
-d "{\"state\": \"$PLAYER_COUNT\", \"attributes\": {\"unit_of_measurement\": \"Spieler\", \"friendly_name\": \"Spieler Online\", \"icon\": \"mdi:account-group\"}}" \
"$HA_URL/sensor.luanti_spieler_online"
done