Skalman i Home Assistant
Skalman i Home Assistant
Det här är berättelsen om hur vi fick vår robotgräsklippare – en Husqvarna Automower 310 som går under namnet Skalman – att dyka upp i Home Assistant, med batteristatus, vad den håller på med just nu, och knappar för att starta, pausa och skicka hem den. Det lät enkelt i teorin. Det var det inte riktigt.
Bakgrunden
Skalman är en äldre modell (årsmodell runt 2016). Den har ingen molntjänst vi kommer åt – "Automower Connect"-menyn i klipparen är låst bakom "kontakta din återförsäljare", så den vanliga vägen via Husqvarnas app och officiella integration var stängd för oss. Det enda vi hade att jobba med var Bluetooth (BLE), som klipparen pratar lokalt.
Problemet med Bluetooth är räckvidd. Klipparen och dess laddstation står en bra bit bort, och vår Home Assistant-server når inte dit med Bluetooth. Så vi behövde något som sitter nära.
Så ser lösningen ut
Lösningen blev en liten Raspberry Pi som står ute nära klipparen. Den fungerar som en brygga: den pratar Bluetooth med Skalman på ena sidan, och skickar informationen vidare till Home Assistant via ett meddelandeprotokoll som heter MQTT på den andra sidan.
I stora drag:
Skalman ──Bluetooth──► Raspberry Pi (bryggan) ──MQTT──► Home Assistant
◄──kommandon──── ◄──kommandon──
Pi:n står tillräckligt nära för att få hyfsad Bluetooth-kontakt, och den är ändå alltid igång eftersom den sköter andra saker ute i förrådet. Home Assistant behöver aldrig själv bry sig om Bluetooth – den prenumererar bara på det bryggan publicerar.
Bluetooth-parningen – den kluriga biten
Det här var det som tog absolut längst tid, och det är värt att skriva ner så vi slipper svettas lika mycket nästa gång.
En modern Bluetooth-stack (som den i en ny Raspberry Pi) vill som standard para med den säkraste metoden: krypterad "secure connections" med skydd mot avlyssning. En gammal gräsklippare från 2016 kan inte det. Den pratar bara den enklare, äldre dialekten ("legacy pairing" med metoden "Just Works"). Resultatet blir att klipparen svarar med ett artigt "parning stöds inte" och lägger på – och man sitter där och kliar sig i huvudet.
Nyckeln var att tvinga Bluetooth-kontrollern på Pi:n att prata den gamla dialekten och stänga av kraven på det avancerade säkerhetsläget. När båda sidorna väl pratade samma språk gick det vägen.
Ett extra hinder: eftersom parningsmenyn i klipparen är låst går det inte att sätta den i parningsläge på vanligt sätt. Tricket är att slå av och på huvudströmbrytaren – då öppnar klipparen ett tre minuter långt parningsfönster. Under det fönstret behöver telefonens Bluetooth vara avstängd (klipparen släpper bara in en enhet i taget), och så kör man parningen på repeat tills den nappar. Hos oss tog det ett par försök.
En viktig detalj: själva Bluetooth-parningen och klipparens PIN-kod är två helt olika lager. Bluetooth-bindningen i sig kräver ingen kod, medan maskinens PIN skickas av programvaran först efteråt, på applikationsnivå. Bra att veta när man felsöker – man kan ha en fungerande Bluetooth-koppling och ändå bli nekad för att PIN-lagret strular, eller tvärtom.
Notera: Bluetooth-bindningen är knuten till den specifika Bluetooth-adaptern. Byter vi dongle, eller flyttar över till en annan enhet längre fram, får vi köra hela parningsproceduren igen.
Bryggan som håller ihop allt
På Pi:n kör två delar:
- En läsare som gör exakt en sak i taget: kopplar upp mot Skalman, läser av status (eller skickar ett kommando), och kopplar ner igen snyggt. Den använder ett smart bibliotek som återanvänder en cachad enhetsreferens istället för att söka igenom etern varje gång, vilket gör uppkopplingen betydligt snabbare. En lås-mekanism ser till att bara en Bluetooth-session pågår åt gången, så inget krockar.
- Själva bryggan som med jämna mellanrum (var femte minut) kör läsaren, och publicerar resultatet till MQTT. Den skickar också ut så kallad auto-discovery, vilket betyder att Home Assistant automatiskt skapar rätt entiteter utan att vi behöver konfigurera något för hand. Åt andra hållet lyssnar bryggan på kommandon från Home Assistant och översätter dem till klipparens språk.
Allt körs som en tjänst som startar automatiskt och startar om sig själv om något krånglar.
Vad som dök upp i Home Assistant
När discovery väl var på plats poppade det upp en rad entiteter, helt automatiskt:
- Batterinivå
- Vad klipparen gör just nu (klipper, på väg ut, på väg hem, laddar, parkerad …)
- Laddningsstatus
- Eventuella felkoder
- Och en riktig gräsklippar-kontroll med knappar för att starta, pausa och docka
Klipparens många olika lägen översätts till några få begripliga tillstånd i gränssnittet, så att kortet i Home Assistant helt enkelt visar "klipper", "dockad", "pausad" eller "fel".
Säkerhet
Från början låg meddelandetrafiken på en delad community-broker. Det gick vi ifrån ganska snabbt och flyttade allt till en egen, privat broker med inloggning. Anledningen är enkel: kommando-topicen är vägen in för att faktiskt styra klipparen. Ligger de på en broker som andra kommer åt, kan andra i teorin skicka iväg gräsklipparen. Nu är trafiken privat och autentiserad.
En bugg vi fick jaga
En rolig detalj som är värd att minnas: under flera dagar rapporterade Skalman fin status i Home Assistant, men Play-knappen gjorde ingenting – klipparen vägrade lämna dockan.
Det visade sig att start-kommandot översattes till "återuppta", vilket bara fungerar om klipparen redan är mitt i en pausad klippsession. Från dockad/parkerad/schemastyrd status hände alltså ingenting alls. Fixen var att låta Play istället skicka ett "klipp nu"-kommando som går förbi schemat och skickar ut den direkt en stund. Efter det lydde den.
Räckvidd och tillförlitlighet
Bluetooth genom en förrådsvägg är inte magi. Signalen är ganska svag, och det märks:
- När Skalman står i dockan är kontakten stabil och avläsningarna funkar fint.
- När hon är ute och klipper och rör sig runt tomten missar bryggan ofta en avläsning. Det gör inget allvarligt – bryggan loggar, hoppar över, och försöker igen nästa gång utan att krascha.
Vill vi ha stenhård status även under klippning finns ett par vägar framåt: hålla en Bluetooth-koppling öppen hela tiden istället för att koppla upp om och om igen, eller sätta en Bluetooth-repeater närmare tomten. Men för vårt behov – veta batteri och läge, och kunna styra – räcker dagens lösning gott.
Bonus: regnvakt
Eftersom vi ändå hade kontroll över klipparen byggde vi en liten regnvakt. Vi har ingen egen regnsensor, så vi använder väderprognosen. När det regnar hålls Skalman kvar i dockan, och hon får dessutom vänta en inställbar stund efter att regnet slutat så att gräset hinner torka lite innan hon åker ut igen. Det finns reglage i gränssnittet för att slå av och på skyddet och justera hur länge hon ska vänta. Regnvakten respekterar klipparens eget schema – den släpper bara spärren, den tvingar aldrig ut henne.
Status
Skalman är i drift: status syns i Home Assistant, och start, paus och docka fungerar. Det som återstår är mest finlir – framför allt att göra avläsningen mer tillförlitlig medan hon är ute och rör på sig. Men grunden står stadigt, och hon klipper på.