New Files
This commit is contained in:
199
README.md
199
README.md
@@ -1,2 +1,197 @@
|
|||||||
# Home-Assistant-finder
|
# 
|
||||||
Looking for Home Assistant Server on local network
|
|
||||||
|
# 🔍 Home Assistant Auto-Finder (Windows + Linux)
|
||||||
|
|
||||||
|
Et lille Python-script, der automatisk scanner dit lokale netværk og finder, hvilken IP-adresse din **Home Assistant**-server bruger (port **8123**).
|
||||||
|
|
||||||
|
Scriptet kan køres både på **Windows** og **Linux**, så længe Python 3 er installeret.
|
||||||
|
|
||||||
|
Perfekt til:
|
||||||
|
- Headless Home Assistant installationer (ingen skærm på boksen)
|
||||||
|
- Proxmox / VM-miljøer
|
||||||
|
- Raspberry Pi og andre små bokse
|
||||||
|
- Hurtigt at finde ny IP efter reinstall / flytning
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🚀 Funktioner
|
||||||
|
|
||||||
|
- Fungerer på både **Windows** og **Linux**
|
||||||
|
- Finder automatisk din lokale IPv4-adresse
|
||||||
|
- Antager et /24-netværk (fx `192.168.2.0/24`)
|
||||||
|
- Scanner hele subnettet efter åben port **8123**
|
||||||
|
- Kører i loop indtil en Home Assistant-server svarer
|
||||||
|
- Kan altid stoppes med **CTRL + C**
|
||||||
|
- Ingen eksterne Python-pakker – kun standardbiblioteket
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📦 Krav
|
||||||
|
|
||||||
|
- **Python 3.x**
|
||||||
|
- Netværksforbindelse til det subnet, hvor Home Assistant kører
|
||||||
|
- På Windows: Python tilføjet til `PATH` (valgfrit, men rart)
|
||||||
|
- På Linux: Standard Python 3-installation (Debian/Ubuntu/RPiOS mv.)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📥 Installation
|
||||||
|
|
||||||
|
Pak ZIP-filen ud, så du har disse filer:
|
||||||
|
|
||||||
|
```text
|
||||||
|
find_ha.py
|
||||||
|
README.md
|
||||||
|
banner.png
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ▶️ Brug på Linux
|
||||||
|
|
||||||
|
Åbn en terminal i mappen med filerne og kør:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
chmod +x find_ha.py
|
||||||
|
./find_ha.py
|
||||||
|
```
|
||||||
|
|
||||||
|
Eller:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
python3 find_ha.py
|
||||||
|
```
|
||||||
|
|
||||||
|
Eksempel-output:
|
||||||
|
|
||||||
|
```text
|
||||||
|
🔍 Home Assistant Auto-Finder (Windows + Linux)
|
||||||
|
Scanner efter Home Assistant på port 8123
|
||||||
|
Kører indtil en server findes – stop med CTRL+C
|
||||||
|
|
||||||
|
🌐 Opdaget lokal IP-range (baseret på /24): 192.168.2.0/24
|
||||||
|
|
||||||
|
⏳ Ingen Home Assistant fundet endnu... prøver igen om 5 sekunder.
|
||||||
|
⏳ Ingen Home Assistant fundet endnu... prøver igen om 5 sekunder.
|
||||||
|
✅ Fundet Home Assistant: http://192.168.2.84:8123
|
||||||
|
|
||||||
|
Færdig. Åbn adressen ovenfor i din browser.
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ▶️ Brug på Windows
|
||||||
|
|
||||||
|
1. Sørg for at **Python 3** er installeret
|
||||||
|
(du kan teste i **PowerShell** eller **Kommandoprompt**):
|
||||||
|
|
||||||
|
```powershell
|
||||||
|
python --version
|
||||||
|
```
|
||||||
|
eller
|
||||||
|
```powershell
|
||||||
|
py --version
|
||||||
|
```
|
||||||
|
|
||||||
|
2. Navigér til mappen med `find_ha.py`:
|
||||||
|
|
||||||
|
```powershell
|
||||||
|
cd C:\sti\til\mappen
|
||||||
|
```
|
||||||
|
|
||||||
|
3. Kør scriptet:
|
||||||
|
|
||||||
|
```powershell
|
||||||
|
python .\find_ha.py
|
||||||
|
```
|
||||||
|
eller
|
||||||
|
|
||||||
|
```powershell
|
||||||
|
py .\find_ha.py
|
||||||
|
```
|
||||||
|
|
||||||
|
Stop med **CTRL + C** hvis du vil afbryde.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔍 Hvordan virker det?
|
||||||
|
|
||||||
|
1. **Finder lokal IPv4-adresse**
|
||||||
|
Scriptet laver en "falsk" UDP-forbindelse til `8.8.8.8:80` for at finde den IP, dit system ville bruge til at gå på nettet.
|
||||||
|
Der sendes ingen rigtig trafik, men OS vælger det rigtige interface.
|
||||||
|
|
||||||
|
2. **Antager et /24-subnet**
|
||||||
|
Hvis IP f.eks. er `192.168.2.57`, antager scriptet netværket:
|
||||||
|
|
||||||
|
```text
|
||||||
|
192.168.2.0/24
|
||||||
|
```
|
||||||
|
|
||||||
|
og scanner alle adresser fra `192.168.2.1` til `192.168.2.254`.
|
||||||
|
|
||||||
|
3. **Scanner port 8123**
|
||||||
|
For hver IP prøves en TCP-forbindelse til port **8123**.
|
||||||
|
Hvis den svarer, antages det, at det er en Home Assistant-instans.
|
||||||
|
|
||||||
|
4. **Looper indtil succes**
|
||||||
|
Hvis der ikke findes nogen, venter scriptet et par sekunder og prøver igen.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🧪 Typiske scenarier
|
||||||
|
|
||||||
|
- Du har lige installeret Home Assistant på en **Raspberry Pi** uden skærm
|
||||||
|
- Du har lavet en ny **VM i Proxmox** med Home Assistant
|
||||||
|
- Din router har givet en anden IP end du forventede
|
||||||
|
- Du sætter Home Assistant op for andre, og vil hurtigt kunne finde IP’en
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ❗ Fejlfinding
|
||||||
|
|
||||||
|
### Scriptet siger: *"Kunne ikke finde en ikke-127.x IPv4-adresse."*
|
||||||
|
|
||||||
|
Mulige årsager:
|
||||||
|
- Maskinen er ikke forbundet til et netværk
|
||||||
|
- Der er kun loopback (127.0.0.1) aktivt
|
||||||
|
- VPN / specielle netværksopsætninger
|
||||||
|
|
||||||
|
➜ Tjek din netværksforbindelse og prøv igen.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Scriptet finder ingen Home Assistant
|
||||||
|
|
||||||
|
Tjek følgende:
|
||||||
|
- Kører Home Assistant faktisk?
|
||||||
|
- Er port **8123** åben i firewall?
|
||||||
|
- Er den maskine, du kører scriptet fra, på **samme subnet**?
|
||||||
|
- Bruger du VLANs, hvor der måske ikke er routing mellem netværkene?
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📂 Projektstruktur
|
||||||
|
|
||||||
|
```text
|
||||||
|
homeassistant-autofinder/
|
||||||
|
├── find_ha.py
|
||||||
|
├── README.md
|
||||||
|
└── banner.png
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📜 License
|
||||||
|
|
||||||
|
MIT License
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 💡 Idéer til videreudvikling
|
||||||
|
|
||||||
|
- Tilføje scanning af flere porte (fx HTTPS, add-ons osv.)
|
||||||
|
- Enkel web-UI der viser scanning live
|
||||||
|
- Docker-version der kan køre i container
|
||||||
|
- Mulighed for at angive subnet manuelt via argumenter
|
||||||
|
|
||||||
|
PR’er og forks er naturligvis velkomne 🙂
|
||||||
|
|||||||
BIN
banner.png
Normal file
BIN
banner.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 12 KiB |
78
find_ha.py
Normal file
78
find_ha.py
Normal file
@@ -0,0 +1,78 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
import ipaddress
|
||||||
|
import socket
|
||||||
|
import time
|
||||||
|
import sys
|
||||||
|
|
||||||
|
PORT = 8123
|
||||||
|
SLEEP_SECONDS = 5
|
||||||
|
CIDR_PREFIX = 24 # Antag /24-netværk (fx 192.168.2.0/24)
|
||||||
|
|
||||||
|
def get_local_ipv4():
|
||||||
|
'''
|
||||||
|
Find lokal IPv4-adresse på tværs af Windows og Linux.
|
||||||
|
Vi laver et "falsk" UDP-kald til 8.8.8.8 for at finde den udgående IP.
|
||||||
|
Der sendes ingen rigtig trafik, men OS vælger det rigtige interface.
|
||||||
|
'''
|
||||||
|
try:
|
||||||
|
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
|
||||||
|
try:
|
||||||
|
s.connect(("8.8.8.8", 80))
|
||||||
|
ip = s.getsockname()[0]
|
||||||
|
finally:
|
||||||
|
s.close()
|
||||||
|
except OSError:
|
||||||
|
# Fallback – virker ofte, men kan give 127.x på nogle Linux-installationer
|
||||||
|
ip = socket.gethostbyname(socket.gethostname())
|
||||||
|
|
||||||
|
if ip.startswith("127."):
|
||||||
|
print("[FEJL] Kunne ikke finde en ikke-127.x IPv4-adresse.")
|
||||||
|
print(" Er du forbundet til et netværk?")
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
return ip
|
||||||
|
|
||||||
|
def get_network():
|
||||||
|
ip = get_local_ipv4()
|
||||||
|
try:
|
||||||
|
net = ipaddress.ip_network(f"{ip}/{CIDR_PREFIX}", strict=False)
|
||||||
|
except ValueError as e:
|
||||||
|
print(f"[FEJL] Ugyldigt netværk for IP {ip}: {e}")
|
||||||
|
sys.exit(1)
|
||||||
|
return net
|
||||||
|
|
||||||
|
def scan_port(host, port=PORT, timeout=0.3):
|
||||||
|
try:
|
||||||
|
with socket.create_connection((str(host), port), timeout=timeout):
|
||||||
|
return True
|
||||||
|
except OSError:
|
||||||
|
return False
|
||||||
|
|
||||||
|
def main():
|
||||||
|
print("🔍 Home Assistant Auto-Finder (Windows + Linux)")
|
||||||
|
print(f" Scanner efter Home Assistant på port {PORT}")
|
||||||
|
print(" Kører indtil en server findes – stop med CTRL+C\n")
|
||||||
|
|
||||||
|
net = get_network()
|
||||||
|
print(f"🌐 Opdaget lokal IP-range (baseret på /{CIDR_PREFIX}): {net}\n")
|
||||||
|
|
||||||
|
try:
|
||||||
|
while True:
|
||||||
|
found = False
|
||||||
|
for host in net.hosts():
|
||||||
|
if scan_port(host):
|
||||||
|
print(f"✅ Fundet Home Assistant: http://{host}:{PORT}")
|
||||||
|
found = True
|
||||||
|
break
|
||||||
|
|
||||||
|
if found:
|
||||||
|
print("\nFærdig. Åbn adressen ovenfor i din browser.")
|
||||||
|
return
|
||||||
|
|
||||||
|
print(f"⏳ Ingen Home Assistant fundet endnu... prøver igen om {SLEEP_SECONDS} sekunder.")
|
||||||
|
time.sleep(SLEEP_SECONDS)
|
||||||
|
except KeyboardInterrupt:
|
||||||
|
print("\n🛑 Afbrudt af bruger (CTRL+C). Farvel!")
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
main()
|
||||||
Reference in New Issue
Block a user