📡 API Dokumentácia pre IoTViewer

API Endpoint: https://app.iotviewer.eu/api.php

Autor: Tomas Schejbal | Verzia: 1.1 | Dátum: Október 2025

🔰 Základné informácie

Vlastnosti API

⚠️ Dôležité obmedzenia

🔐 Autentifikácia

Nové funkcie autentifikácie New

API teraz podporuje dva spôsoby autentifikácie:

  1. Session ID - Použitie existujúcej PHPSESSID cookie
  2. Username/Password - Automatické prihlásenie s vytvorením session

POST Prihlásenie (Login)

/index.php

POST Parametre:

Parameter Typ Popis Povinné
username string Používateľské meno Áno
password string Heslo Áno
login string Hodnota "1" (flag) Áno

Odpoveď:

HTTP 302 Redirect na viewer.php alebo admin.php + nastavenie PHPSESSID cookie

Python (IoTViewer klient)
from iotviewer_api_client import IoTViewerClient # Prihlásenie pomocou username/password client = IoTViewerClient( username='your_username', password='your_password' ) # Test spojenia if client.test_connection(): print("✅ Prihlásený!") devices = client.get_user_devices() else: print("❌ Chyba prihlásenia")
Python (requests)
import requests session = requests.Session() login_url = "https://app.iotviewer.eu/index.php" # GET login stránky pre získanie cookies session.get(login_url) # POST prihlásenie login_data = { 'username': 'your_username', 'password': 'your_password', 'login': '1' } response = session.post(login_url, data=login_data, allow_redirects=False) if response.status_code == 302: print("✅ Prihlásený!") # Teraz môžete používať session pre API volania

Session Pool New

Pre aplikácie s vysokou záťažou je možné vytvoriť pool autentifikovaných sessions:

Python - Session Pool
client = IoTViewerClient( username='user', password='pass', pool_size=10 # 10 súbežných sessions ) # Sessions sa automaticky spravujú # Pri každom requeste sa použije session z poolu

📱 Zariadenia a senzory

GET Zoznam zariadení používateľa

/api.php?action=get_user_devices

Príklad odpovede:

{ "devices": [ { "id": 1, "name": "Meteostanica", "location": "Záhrada", "sensor_count": 5, "measurement_count": 1250, "created_at": "2025-01-15 10:30:00" }, { "id": 2, "name": "Domáce čidlá", "location": "Obývačka", "sensor_count": 3, "measurement_count": 890, "created_at": "2025-02-20 14:15:00" } ] }
Python klient
devices = client.get_user_devices() for device in devices: print(f"📱 {device['name']}") print(f" Lokalita: {device['location']}") print(f" Senzory: {device['sensor_count']}") print(f" Merania: {device['measurement_count']}")

GET Senzory zariadenia

/api.php?action=get_device_sensors&device_id=1

Parametre:

Parameter Typ Popis Povinné
device_id integer ID zariadenia Áno

Príklad odpovede:

{ "sensors": [ { "id": 1, "name": "Teplota", "unit": "°C", "last_value": 22.5, "last_timestamp": "2025-10-22 14:30:00", "measurement_count": 450, "color": "#FF6384" }, { "id": 2, "name": "Vlhkosť", "unit": "%", "last_value": 65.3, "last_timestamp": "2025-10-22 14:30:00", "measurement_count": 450, "color": "#36A2EB" } ] }
Python klient
sensors = client.get_device_sensors(device_id=1) for sensor in sensors: print(f"🌡️ {sensor['name']}") print(f" Hodnota: {sensor['last_value']} {sensor['unit']}") print(f" Čas: {sensor['last_timestamp']}")

📊 Získavanie dát

GET Dáta konkrétneho senzora

/api.php?action=get_sensor_data&sensor_id=1&time_filter=24h

Parametre:

Parameter Typ Popis Možné hodnoty Povinné
sensor_id integer ID senzora - Áno
time_filter string Časový filter 1h, 6h, 24h, 7d, 30d, custom Nie
custom_from datetime Vlastný začiatok YYYY-MM-DD HH:MM:SS Nie
custom_to datetime Vlastný koniec YYYY-MM-DD HH:MM:SS Nie

Príklad odpovede:

{ "labels": [ "2025-10-22 12:00", "2025-10-22 12:15", "2025-10-22 12:30" ], "data": [22.5, 23.1, 22.8], "sensor_name": "Teplota", "unit": "°C", "device_name": "Meteostanica" }
Python klient - Základné použitie
# Získanie dát za posledných 24 hodín data = client.get_sensor_data( sensor_id=1, time_filter='24h' ) print(f"Senzor: {data['sensor_name']}") print(f"Počet bodov: {len(data['data'])}") # Vlastný časový rozsah data = client.get_sensor_data( sensor_id=1, time_filter='custom', custom_from='2025-10-20 00:00:00', custom_to='2025-10-22 23:59:59' )
Python klient - Štatistiky New
# Helper funkcia pre štatistiky stats = client.get_sensor_statistics( sensor_id=1, time_filter='7d' ) print(f"📈 Štatistiky za 7 dní:") print(f" Min: {stats['min']:.2f}") print(f" Max: {stats['max']:.2f}") print(f" Avg: {stats['avg']:.2f}") print(f" Count: {stats['count']}")

GET Dáta z viacerých senzorov

/api.php?action=get_multiple_sensors_data&sensor_ids=1,2,3&time_filter=7d

Parametre:

Parameter Typ Popis Príklad
sensor_ids string Zoznam ID senzorov (čiarkou oddelené) 1,2,3
time_filter string Časový filter 7d

Príklad odpovede (Chart.js formát):

{ "labels": ["12:00", "12:15", "12:30"], "datasets": [ { "label": "Teplota (°C)", "data": [22.5, 23.1, 22.8], "borderColor": "#FF6384", "backgroundColor": "rgba(255, 99, 132, 0.1)", "tension": 0.4 }, { "label": "Vlhkosť (%)", "data": [65.0, 64.5, 65.3], "borderColor": "#36A2EB", "backgroundColor": "rgba(54, 162, 235, 0.1)", "tension": 0.4 } ] }
Python klient
data = client.get_multiple_sensors_data( sensor_ids=[1, 2, 3], time_filter='24h' ) print(f"Datasets: {len(data['datasets'])}") for dataset in data['datasets']: print(f" - {dataset['label']}")

➕ Pridávanie meraní

POST Pridanie jedného merania

/api.php?action=add_measurement

Telo požiadavky (JSON):

{ "sensor_id": 1, "value": 22.5, "timestamp": "2025-10-22 14:30:00" // Voliteľné }

Príklad odpovede:

{ "success": true, "message": "Meranie bolo úspešne pridané", "measurement_id": 12345, "sensor_id": 1, "value": 22.5, "timestamp": "2025-10-22 14:30:00" }
Python klient
# Pridanie merania s aktuálnym časom result = client.add_measurement( sensor_id=1, value=22.5 ) print(f"✅ Measurement ID: {result['measurement_id']}") # Pridanie merania s vlastným časom result = client.add_measurement( sensor_id=1, value=23.1, timestamp='2025-10-22 14:00:00' )
JavaScript (fetch)
fetch('https://app.iotviewer.eu/api.php?action=add_measurement', { method: 'POST', credentials: 'include', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ sensor_id: 1, value: 22.5 }) }) .then(response => response.json()) .then(data => { console.log('✅ Meranie pridané:', data.measurement_id); }) .catch(error => console.error('❌ Chyba:', error));

POST Hromadné pridanie meraní

/api.php?action=add_bulk_measurements

Telo požiadavky (JSON):

{ "measurements": [ { "sensor_id": 1, "value": 22.5, "timestamp": "2025-10-22 14:00:00" }, { "sensor_id": 1, "value": 22.7, "timestamp": "2025-10-22 14:15:00" }, { "sensor_id": 2, "value": 65.3, "timestamp": "2025-10-22 14:00:00" } ] }

Príklad odpovede:

{ "success": true, "message": "Merania boli úspešne pridané", "added_count": 3, "total_requested": 3 }
Python klient
measurements = [ {'sensor_id': 1, 'value': 22.5}, {'sensor_id': 1, 'value': 22.7}, {'sensor_id': 2, 'value': 65.3} ] result = client.add_bulk_measurements(measurements) print(f"✅ Pridaných {result['added_count']} meraní")

GET Najnovšie meranie New

Helper funkcia v Python klientovi:

Python klient
latest = client.get_latest_measurement(sensor_id=1) if latest: print(f"Hodnota: {latest['value']}") print(f"Čas: {latest['timestamp']}") else: print("Žiadne merania")

🚨 Alarmy

GET Zoznam alarmov

/api.php?action=get_alarms

Príklad odpovede:

{ "alarms": [ { "id": 1, "name": "Vysoká teplota", "sensor_id": 1, "sensor_name": "Teplota", "condition_type": "max", "max_value": 30.0, "min_value": null, "is_active": true, "email_notification": true, "last_triggered": "2025-10-20 15:30:00", "total_triggers": 5, "created_at": "2025-01-15 10:00:00" } ] }
Python klient
alarms = client.get_alarms() for alarm in alarms: status = "🟢 Aktívny" if alarm['is_active'] else "🔴 Neaktívny" print(f"{status} {alarm['name']}") print(f" Senzor: {alarm['sensor_name']}") print(f" Spustení: {alarm['total_triggers']}×")

GET História alarmu (logy)

/api.php?action=get_alarm_logs&alarm_id=1&limit=50&offset=0

Parametre:

Parameter Typ Popis Default
alarm_id integer ID alarmu -
limit integer Počet záznamov (max 100) 50
offset integer Offset pre stránkovanie 0

Príklad odpovede:

{ "logs": [ { "id": 123, "triggered_at": "2025-10-22 15:30:00", "measurement_value": 31.2, "alarm_type": "max", "threshold_value": 30.0, "sensor_name": "Teplota" } ], "total_logs": 45, "current_page": 1, "total_pages": 1 }
Python klient
logs = client.get_alarm_logs( alarm_id=1, limit=20, offset=0 ) print(f"Celkom logov: {logs['total_logs']}") for log in logs['logs']: print(f"⚠️ {log['triggered_at']}") print(f" Hodnota: {log['measurement_value']}")

GET Štatistiky alarmov

/api.php?action=get_alarm_stats

Príklad odpovede:

{ "stats": { "total_alarms": 8, "active_alarms": 6, "inactive_alarms": 2, "triggered_today": 3, "triggered_this_week": 15, "triggered_this_month": 42, "most_triggered_alarm": { "id": 1, "name": "Vysoká teplota", "trigger_count": 25 } } }
Python klient
stats_result = client.get_alarm_stats() stats = stats_result['stats'] print("📊 Štatistiky alarmov:") print(f" Celkom: {stats['total_alarms']}") print(f" Aktívne: {stats['active_alarms']}") print(f" Spustené dnes: {stats['triggered_today']}")

GET Health check alarmov

/api.php?action=get_alarm_health

Príklad odpovede:

{ "status": "OK", "database": "connected", "alarms_checked": 8, "last_check": "2025-10-22 14:30:00", "checks": { "database_connection": "OK", "alarm_processing": "OK", "email_service": "OK" } }
Python klient
health = client.get_alarm_health() print(f"Status: {health['status']}") print(f"Database: {health['database']}") print(f"Alarmov skontrolovaných: {health['alarms_checked']}")

📈 Štatistiky a grafické dáta

GET Grafické dáta pre viewera

/api.php?action=viewer_chart_data&time_filter=24h

Parametre:

Parameter Typ Možné hodnoty Default
time_filter string 1h, 6h, 24h, 7d, 30d 24h
user_id integer ID používateľa (admin) current

Príklad odpovede:

{ "labels": ["12:00", "12:15", "12:30"], "datasets": [ { "label": "Teplota (°C)", "data": [22.5, 23.1, 22.8], "borderColor": "#FF6384", "tension": 0.4 } ] }
Python klient
data = client.get_viewer_chart_data(time_filter='7d') print(f"Labels: {len(data['labels'])}") print(f"Datasets: {len(data['datasets'])}")

GET Grafické dáta pre admina

/api.php?action=admin_chart_data

Vyžaduje: Admin alebo Superadmin oprávnenia

Príklad odpovede:

{ "labels": ["12:00", "12:15"], "datasets": [ { "label": "Používateľ1 - Teplota (°C)", "data": [22.5, 23.1], "borderColor": "#FF6384" }, { "label": "Používateľ2 - Vlhkosť (%)", "data": [65.0, 64.5], "borderColor": "#36A2EB" } ] }
Python klient
# Len pre adminov data = client.get_admin_chart_data() print(f"Celkom datasets: {len(data['datasets'])}") for dataset in data['datasets']: print(f" 📊 {dataset['label']}")

💻 Komplexné príklady použitia

Python - Context Manager Odporúčané
from iotviewer_api_client import IoTViewerClient # Automatické zatvorenie sessions with IoTViewerClient(username='user', password='pass') as client: # Test spojenia if not client.test_connection(): print("❌ Chyba spojenia") exit() # Získanie zariadení devices = client.get_user_devices() print(f"📱 Zariadení: {len(devices)}") # Pre každé zariadenie získaj senzory for device in devices: sensors = client.get_device_sensors(device['id']) # Pre každý senzor pridaj meranie for sensor in sensors: result = client.add_measurement( sensor_id=sensor['id'], value=round(random.uniform(20, 30), 2) ) print(f"✅ {sensor['name']}: {result['measurement_id']}") # Sessions sa automaticky zatvoria po ukončení
Python - Monitoring script
import time from iotviewer_api_client import IoTViewerClient client = IoTViewerClient(username='user', password='pass') # Monitoring loop while True: try: # Získaj všetky zariadenia devices = client.get_user_devices() for device in devices: sensors = client.get_device_sensors(device['id']) for sensor in sensors: # Získaj najnovšie meranie latest = client.get_latest_measurement(sensor['id']) if latest: print(f"🌡️ {sensor['name']}: {latest['value']} {sensor['unit']}") # Získaj štatistiky za poslednú hodinu stats = client.get_sensor_statistics( sensor_id=sensor['id'], time_filter='1h' ) if stats['count'] > 0: print(f" 📊 Min: {stats['min']:.1f}, Max: {stats['max']:.1f}, Avg: {stats['avg']:.1f}") # Kontrola alarmov alarm_stats = client.get_alarm_stats() triggered = alarm_stats['stats']['triggered_today'] if triggered > 0: print(f"⚠️ Alarmy spustené dnes: {triggered}") time.sleep(300) # 5 minút except Exception as e: print(f"❌ Chyba: {e}") time.sleep(60)
Python - Export dát do CSV
import csv from datetime import datetime from iotviewer_api_client import IoTViewerClient client = IoTViewerClient(username='user', password='pass') # Získaj zariadenie a senzory devices = client.get_user_devices() device_id = devices[0]['id'] sensors = client.get_device_sensors(device_id) # Export dát každého senzora for sensor in sensors: data = client.get_sensor_data( sensor_id=sensor['id'], time_filter='30d' ) # Vytvor CSV súbor filename = f"sensor_{sensor['id']}_{datetime.now().strftime('%Y%m%d')}.csv" with open(filename, 'w', newline='', encoding='utf-8') as f: writer = csv.writer(f) writer.writerow(['Timestamp', 'Value', 'Unit']) for i, label in enumerate(data['labels']): writer.writerow([ label, data['data'][i], sensor['unit'] ]) print(f"✅ Export: {filename}")
JavaScript - Real-time graf s Chart.js
// HTML: // Získanie dát z API async function fetchSensorData() { const response = await fetch( 'https://app.iotviewer.eu/api.php?action=get_sensor_data&sensor_id=1&time_filter=24h', { credentials: 'include' } ); return await response.json(); } // Vytvorenie grafu async function createChart() { const data = await fetchSensorData(); const ctx = document.getElementById('myChart').getContext('2d'); new Chart(ctx, { type: 'line', data: { labels: data.labels, datasets: [{ label: `${data.sensor_name} (${data.unit})`, data: data.data, borderColor: '#FF6384', tension: 0.4, fill: true }] }, options: { responsive: true, plugins: { title: { display: true, text: data.sensor_name } } } }); } // Spustenie createChart(); // Auto-refresh každých 5 minút setInterval(createChart, 300000);
cURL - Príklady
# Prihlásenie curl -c cookies.txt -X POST \ https://app.iotviewer.eu/index.php \ -d "username=user&password=pass&login=1" # Získanie zariadení curl -b cookies.txt \ https://app.iotviewer.eu/api.php?action=get_user_devices # Pridanie merania curl -b cookies.txt -X POST \ https://app.iotviewer.eu/api.php?action=add_measurement \ -H "Content-Type: application/json" \ -d '{"sensor_id":1,"value":22.5}' # Získanie dát senzora curl -b cookies.txt \ "https://app.iotviewer.eu/api.php?action=get_sensor_data&sensor_id=1&time_filter=24h"

🔧 Python klient - Inštalácia

# Skopírujte súbor iotviewer_api_client.py do vášho projektu # Import from iotviewer_api_client import IoTViewerClient # Použitie client = IoTViewerClient(username='user', password='pass') devices = client.get_user_devices()

Požiadavky: