Live sensordata van Home Assistant op je website
Ik heb, speciaal voor Home Assistant, zelf een sensor gemaakt welke de luchtkwaliteit van mijn kantoor weergeeft, niet alleen in Home Assistant maar ook op de sensor zelf. Dit project heb ik in mijn Engelstalige YouTube kanaal als video gezet. Mocht je hierin geïnteresseerd zijn: Build your own Home Assistant air quality monitor. Niet alleen leuk om te maken, maar ook zeer leerzaam en de basis van de gegevens van het onderstaande project. Om de realtime gegevens uit Home Assistant op een veilige manier op mijn website te publiceren heb ik een methode gebruikt die uit een aantal stappen bestaat.Ik zal hier de verschillende stappen beschrijven en links naar de code geven.
Omdat we de gegevens vanaf de "drive" van Home Assistant moeten kopieren moet je de "Samba share" add-on geinstalleerd hebben.

Home Assistant
Ik heb een script moeten maken voor Home Assistant welke de waarden uit de verschillende sensoren in een .json bestand zet.Dit script wordt vanuit een automation iedere minuut uitgevoerd.
Het script maakt gebruik van een "Long-lived access token".
Long-lived access token
- Start Home Assistant op en zorg dat je bent aangemeld.- Onderaan de menubalk zie je jou naam staan en als je daar op klikt, dan krijg je de verschillende instellingen.
- Klik in het menu aan de bovenkant op "Security" en scroll naar beneden naar "Long-lived access tokens"
- Maak een token. LET OP, het token krijg je maar eenmalig te zien. Dit token heb je nodig voor het "write_sensor_json.py" script.
"write_sensor_json.py" script
Kijk of er binnen Home Assistant in de folder /config/ een folder scrips is. Als deze er niet is, maak deze dan. Maak in de scripts folder het bestand: write_sensor_json.py" script met de volgende code:
import json
import requests
from datetime import datetime
hass_url = "http://homeassistant.local:8123"
token = "JE_LONG_LIVED_ACCESS_TOKEN"
headers = {
"Authorization": f"Bearer {token}",
"Content-Type": "application/json"
}
sensors = {
"tvoc": "sensor.office_airquality_voc",
"eco2": "sensor.office_airquality_co2",
"aqi": "sensor.office_airquality_status",
"temp": "sensor.office_temperaturec",
"hum": "sensor.office_humidity"
}
data = {
"timestamp": datetime.now().isoformat(),
"ens160": {},
"woonkamer": {}
}
for key, entity in sensors.items():
r = requests.get(f"{hass_url}/api/states/{entity}", headers=headers)
if r.status_code == 200:
value = r.json().get("state")
if key in ["tvoc", "eco2", "aqi"]:
data["ens160"][key] = value
else:
data["woonkamer"][key] = value
with open("/config/www/sensor_data.json", "w") as f:
json.dump(data, f)
Pas de sensoren die genoemd zijn in het gedeelte: sensors ={ .......} aan naar je eigen sensoren.Om ervoor te zorgen dat Home Assistant snapt dat deze een stuk Python code moet kunnen uitvoeren moet het volgende worden opgenomen in de configuration.yaml:
shell_command:
write_sensor_data: >
python3 /config/scripts/write_sensor_json.py
Ik heb Home Assistant herstart om ervoor te zorgen dat niet alleen de configuration.yaml file opnieuw werd ingelezen, maar dat ook het Python script werd herkend.Via "Developer tools" => Actions => "Shell Command: write_sensor_data" kan het script getest worden en als alles goed gegeaan is krijg je als terugkoppeling dat sensor_data.json is opgeslagen. Dit bestand is terug te vinden in de folder: "/config/www".
Nu moet er alleen nog een Automation gemaakt worden om ervoor te zorgen dat het Python code iedere minuut wordt uitgevoerd.
Ik heb hieronder de Yaml code voor de automation, maar je kan deze ook via de GUI maken.
< code class="language-yaml"> alias: Schrijf sensordata naar JSON trigger: - platform: time_pattern minutes: "/1" action: - service: shell_command.write_sensor_data mode: single

Overzetten gegevens naar de webserver.
We hebben nu een bestand "sensor_data.json" wat iedere minuut aangemaakt wordt binnen Home Assistant en de gegevens van verschillende sensoren bevat. Dit bestand moet vanuit de Home Assistant server gekopieerd worden naar de webserver.De webserver die ik gebruik is een Windows machine met daarop IIS. Dit betekend dat het onderstaande stukje specifiek voor Windows is.
Wachtwoord
Ik wil niet hebben dat mijn wachtwoorden direct leesbaar zijn in mijn scripts dus moet ik deze versleuteld opslaan. Om het wachtwoord versleuteld op te slaan in de c:\scripts\ha_pass.txt moet het volgende PowerShell als admin worden uitgevoerd:
Read-Host "Geef wachtwoord" -AsSecureString | ConvertFrom-SecureString | Set-Content "C:\Scripts\ha_pass.txt"
Geef hier het wachtwoord in wat je gebruikt voor je Samba share in Home Assistant. Nu moeten we de het bestand "sensor_data.json" overzetten van Home Assistant naar de Windows webserver. In de code hieronder staat een voorbeeld PowerShell script wat het bestand "sensor_data.json" kopieert naar de folder "C:\WebsiteData\Matteman.nl\SensorData\". Deze map correspondeert met, in mijn geval, https://matteman.nl/SensorData.
# Configuratie
$server = [IP of naam van de Home Assistant server]
$share = "config"
$remote = "\\$server\$share\www\sensor_data.json"
$local = "C:\WebsiteData\Matteman.nl\SensorData\sensor_data.json"
$username = "[UserName]"
$passFile = "C:\Scripts\ha_pass.txt"
# Haal wachtwoord op uit bestand
$password = Get-Content $passFile | ConvertTo-SecureString
$cred = New-Object System.Management.Automation.PSCredential ($username, $password)
# Koppel netwerkschijf
$drive = "Z:"
Try {
New-PSDrive -Name "Z" -PSProvider FileSystem -Root "\\$server\$share" -Credential $cred -ErrorAction Stop
# Kopieer bestand
Copy-Item -Path "Z:\www\sensor_data.json" -Destination $local -Force
Write-Host "✅ Bestand gekopieerd naar $local"
}
Catch {
Write-Error "❌ Fout: $_"
}
Finally {
Remove-PSDrive -Name "Z" -Force -ErrorAction SilentlyContinue
}
Nu wordt er automatisch een .json bestand aangemaakt en we hebben een script wat deze vanuit Home Assistant kan overzetten naar de Windows Web-server. Nu moeten we er alleen voor zorgen dat dit ook automatisch op de
webserver wordt geplaatst.Om dit te kunnen doen kan je gebruik maken van de "Task Scheduler" (taakplanner) die in Windows zit. Maak ik de Task Scheduler een nieuwe taak aan en zet daarin als Action:
Program/Script: powershell.exe
Add arguments: -ExecutionPolicy Bypass -File C:\Scripts\Get_json.ps1 <= [pad naar het script en de naam ervan]

Vervolgens moeten we bij Triggers nog aangeven wanneer en hoe vaak dit wordt uitgevoerd:

In dit geval iedere dag met een herhaling van 5 minuten. Dit is de kleinste tussenpoze. Het herhalen gebeurd 1 dag lang.
Je kan 5 triggers maken met steeds een minuut starttijd verschil om iedere minuut het bestand te kopieren. Ik heb ervoor gekozen dat iedere 5 minuten voldoende is.

Weergave als webpagina.
Het json bestand staat op de webserver en hoeft alleen nog maar ingelezen te worden door de webpagina. Ik heb mijn gehele site gemaakt met Visual Studio en maak gebruik van Razor webpagina's.Ik schrijf mijn site dus in HTML code en maak geen gebruik van een CMS systeem zoals bijvoorbeeld WordPress. Ik kan je dus ook alleen maar laten zien hoe ik de gegevens vanuit het json bestand in mijn Razor pagina kan inlezen.
<script>
async function fetchData() {
try {
const response = await fetch('/SensorData/sensor_data.json');
if (!response.ok) throw new Error('Bestand niet gevonden');
const data = await response.json();
document.getElementById("timestamp").innerText = data.timestamp ?? "-";
document.getElementById("tvoc").innerText = data.tvoc ?? "-";
document.getElementById("eco2").innerText = data.eco2 ?? "-";
document.getElementById("aqi").innerText = data.aqi ?? "-";
document.getElementById("temp").innerText = data.temp ?? "-";
document.getElementById("hum").innerText = data.hum ?? "-";
} catch (error) {
console.error("❌ Fout bij ophalen van sensor data:", error);
}
}
fetchData();
setInterval(fetchData, 10000);
/<script>
Uiteindelijk heb ik nog wat cosmettics toegevoegd door de datum/tijd wat mooier zichtbaar te maken.Vervang in de Razor code:
document.getElementById("timestamp").innerText = data.timestamp ?? "-";
Voor:
const dt = new Date(data.timestamp);
const formattedTime = dt.toLocaleString("nl-NL", {
day: "2-digit",
month: "long",
year: "numeric",
hour: "2-digit",
minute: "2-digit"
});
document.getElementById("timestamp").innerText = formattedTime;
Het eindresultaat:
De realtime gegevens vanuit mijn ThuisKantoor: TVOC: - ppb
eCO₂: - ppm
AQI: -
Temp: - °C
Vocht: - %
Laatste update: -