Files
wiki/teplitsa_export.sh
2026-05-31 02:20:01 +03:00

131 lines
4.6 KiB
Bash
Executable File
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/bin/bash
# Экспорт данных по теплице из Home Assistant за указанный период (через curl + jq)
set -euo pipefail
# ============ НАСТРОЙКИ ============
HA_URL="https://ha.homenet542.keenetic.pro"
TOKEN="eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJmOTkyNzMxNmNlZTI0MjYzOWU4NjRhMGZlOGI2OTExZSIsImlhdCI6MTc3NTIzOTM1OCwiZXhwIjoyMDkwNTk5MzU4fQ.eumM2Vhk68uZZTvA4uIjKDqzlwBPKhBV6JeVRmSAJos"
DAYS=7
ENTITIES=(
"sensor.ulitsa_teplitsa_klimat_temperature"
"sensor.ulitsa_teplitsa_klimat_humidity"
"switch.ulitsa_teplitsa_vytiazhka"
"switch.ulitsa_teplitsa_obogrev"
"sun.sun"
)
OUTPUT_FILE="/home/node/.openclaw/workspace/teplitsa_export.json"
# ====================================
if ! command -v jq >/dev/null 2>&1; then
echo "❌ jq не найден. Установи: apt-get install -y jq"
exit 1
fi
if ! command -v curl >/dev/null 2>&1; then
echo "❌ curl не найден"
exit 1
fi
START_ISO=$(date -u -d "$DAYS days ago" +"%Y-%m-%dT%H:%M:%S+00:00" 2>/dev/null || date -u -v-${DAYS}d +"%Y-%m-%dT%H:%M:%S+00:00" 2>/dev/null || echo "")
if [ -z "$START_ISO" ]; then
# Fallback: python для даты
START_ISO=$(python3 -c "
from datetime import datetime, timedelta, timezone
print((datetime.now(timezone.utc) - timedelta(days=$DAYS)).isoformat())
" )
fi
echo "📊 Сбор данных за $DAYS дней с ${START_ISO:0:10}..."
# История
ENTITIES_CSV=$(IFS=,; echo "${ENTITIES[*]}")
HISTORY=$(curl -sS -H "Authorization: Bearer $TOKEN" \
"$HA_URL/api/history/period/$START_ISO?filter_entity_id=$ENTITIES_CSV&minimal_response=true" \
| jq 'map(map(select(.state != "unavailable" and .state != "unknown" and .state != null)))')
TOTAL=$(echo "$HISTORY" | jq '[.[] | length] | add')
COUNT=$(echo "$HISTORY" | jq 'length')
echo "✅ История: $TOTAL записей по $COUNT сущностям"
# Логбук
LOGBOOK=$(curl -sS -H "Authorization: Bearer $TOKEN" \
"$HA_URL/api/logbook/$START_ISO" \
| jq --argjson ents "$(printf '%s\n' "${ENTITIES[@]}" | jq -R . | jq -s .)" '
map(select(
(.entity_id as $eid | $ents | index($eid)) != null
or (.name // "" | ascii_downcase | contains("теплиц"))
))
')
LOGBOOK_COUNT=$(echo "$LOGBOOK" | jq 'length')
echo "✅ Логбук: $LOGBOOK_COUNT релевантных событий"
# Текущие состояния
STATES_JSON="[]"
for eid in "${ENTITIES[@]}"; do
STATE=$(curl -sS -H "Authorization: Bearer $TOKEN" "$HA_URL/api/states/$eid" || true)
if echo "$STATE" | jq -e '.entity_id' >/dev/null 2>&1; then
STATES_JSON=$(echo "$STATES_JSON" | jq --argjson s "$STATE" '. + [$s]')
else
echo "⚠️ Не удалось получить $eid"
fi
done
# Собираем результат
jq -n \
--arg exported_at "$(date -Iseconds)" \
--argjson days "$DAYS" \
--argjson entities "$(printf '%s\n' "${ENTITIES[@]}" | jq -R . | jq -s .)" \
--argjson states "$STATES_JSON" \
--argjson history "$HISTORY" \
--argjson logbook "$LOGBOOK" '
{
exported_at: $exported_at,
period_days: $days,
entities: $entities,
current_states: $states,
history: $history,
logbook: $logbook
}' > "$OUTPUT_FILE"
echo ""
echo "💾 Сохранено: $OUTPUT_FILE"
echo ""
echo "=================================================="
echo "📈 КРАТКАЯ СВОДКА"
echo "=================================================="
for eid in "${ENTITIES[@]}"; do
if [[ $eid == sensor.* ]]; then
VALUES=$(echo "$HISTORY" | jq -r --arg eid "$eid" '
.[] | select(.[0].entity_id == $eid) | .[].state | tonumber
' 2>/dev/null || true)
if [ -n "$VALUES" ]; then
MIN=$(echo "$VALUES" | sort -n | head -1)
MAX=$(echo "$VALUES" | sort -n | tail -1)
AVG=$(echo "$VALUES" | awk '{s+=$1; c++} END {printf "%.1f", s/c}')
echo ""
echo "$eid"
echo " Мин/Макс/Среднее: $MIN / $MAX / $AVG"
fi
elif [[ $eid == switch.* ]]; then
ON=$(echo "$HISTORY" | jq -r --arg eid "$eid" '
.[] | select(.[0].entity_id == $eid) | .[] | select(.state == "on") | .state
' | wc -l)
OFF=$(echo "$HISTORY" | jq -r --arg eid "$eid" '
.[] | select(.[0].entity_id == $eid) | .[] | select(.state == "off") | .state
' | wc -l)
TRANS=$(echo "$HISTORY" | jq -r --arg eid "$eid" '
.[] | select(.[0].entity_id == $eid) as $h |
range(1; ($h | length)) |
select( ($h[.].state) != ($h[.-1].state) )
' | wc -l)
echo ""
echo "$eid"
echo " Состояний 'on': $ON, 'off': $OFF"
echo " Переключений: $TRANS"
fi
done
echo ""
echo "📤 Загрузи файл teplitsa_export.json в чат для анализа."