From 9670f25bb4fc695f2bbc4e83f7e245276762f274 Mon Sep 17 00:00:00 2001 From: Thomas Date: Wed, 3 Dec 2025 17:14:39 +0100 Subject: [PATCH] New Files --- README.md | 199 ++++++++++++++++++++++++++++++++++++++++++++++++++++- banner.png | Bin 0 -> 12139 bytes find_ha.py | 78 +++++++++++++++++++++ 3 files changed, 275 insertions(+), 2 deletions(-) create mode 100644 banner.png create mode 100644 find_ha.py diff --git a/README.md b/README.md index efcd297..b889c64 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,197 @@ -# Home-Assistant-finder -Looking for Home Assistant Server on local network +# ![Banner](banner.png) + +# 🔍 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 🙂 diff --git a/banner.png b/banner.png new file mode 100644 index 0000000000000000000000000000000000000000..82e3b93866681cc886fea3505e3273339b5daa97 GIT binary patch literal 12139 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 C8+zXW literal 0 HcmV?d00001 diff --git a/find_ha.py b/find_ha.py new file mode 100644 index 0000000..ffb6d51 --- /dev/null +++ b/find_ha.py @@ -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()