Det blir lätt många flöden, eller sekvenser som det egentligen heter, i Node-Red när vi skapar många och stora automationer. Det blir också lätt snabbt uppenbart att det är jättesvårt att få en bra överblick när ”trådarna” åker kors och tvärs över skärmen. Det ska vi börja råda bot på idag, med custom event.
OBS! Detta är en artikel som ursprungligen var publicerad på frosenlind.se den 26 november 2020.
Länkar i inlägget som hänvisar till gamla sidan kommer inte att fungera!
Se på bilden ovan, vad är det egentligen som händer när huset går in in ”Away-mode”? Nu kanske jag överdriver med ”hitte-på-noder”, men troligtvis gör jag inte det. För ganska snart trillar man in i Node-Red träsket och inser att alla hemautomationsproblem kan lösas här. Det blir också ganska tydligt hur bra detta är när man kan trigga samma sak från flera olika sätt.
I denna första del skapar vi våra custom events och hämtar upp dem på ett annat ställe. I nästa del ska vi snygga till det lite med riktigt snygga subflows!
Genomförande
- Vi bryter ut det vi vill göra.
- Vi ”kastar” ett event till Home Assistants event buss.
- Vi hämtar upp eventet, kontrollerar att det är rätt, och genomför det vill vill göra.
Separera triggers från resten
(Hälften av alla meningar är på svengelska)
Jag utgår från det vi gjorde i inläggen som handlar om hemma/borta/sov, se exempel: Snapshot med Home Assistant och Node-Red.
Vårt mål är att egentligen att separera triggers, dvs. det som startar en sekvens, från logik och ”genomförare”.
Den delen av sekvensen som är markerat i rött ovan vill vi separera från logiken som hanterar husets state. Koppla loss den delen från resten och lägg det någon annan stans för tillfället.
Kasta till event-bussen
Man skulle kunna säga att hela Home Assistant bygger på events som kastas, läs gärna mer här:
https://www.home-assistant.io/docs/configuration/events/
Dra in noden som heter fire event.
I Event skriver vi namnet på eventet vi vill skicka, detta kan vara vad du vill men akta dig från att kasta event som har samma namn som något annat, du vet inte vad som kan hända då.
Jag har valt att döpa det till custom_event, framförallt för att jag vet att det är bara JAG som i MITT system kan kasta något med detta namnet.
I Data skickar vi med ett JSON-objekt där vi definierar vilket custom_event vi skickar.
{"event_id":"house_away"}
Låt oss testa och se att det fungerar.
Dra in en inject-nod och koppla ihop den med fire event-noden, deploya Node-Red.
Gå in i Home Assistant -> Developer Tools -> Events, scrolla ner och fyll i custom_event och tryck på START LISTENING.
Om du nu trycker på inject-noden vi skapade innan fire-event-noden så kommer du i Home Assistant se att vi har kastat ett event med den data vi skrev in.
Ser det ut som detta (typ) så innebär det att du kastat ett eget event, från Node-Red, in i Home Assistants event-buss. Jippi! Du kan ta bort inject-noden igen.
Koppla nu ihop fire event-noden med Set house to away-noden.
Lyssna på eventet
Dra in en events: all -nod och skriv custom_event i Event Type. Nu lyssnar denna nod endast efter vår egna event-typ.
Dra därefter in en switch-nod. I Propery skriver väljer vi msg och skriver därefter: payload.event_id
Payload för att det är där vårt meddelande kommer och event_id eftersom detta var namnet vi definierade tidigare i vår fire event-nod.
Vi vill sedan kontrollera vilket event_id som vi har skickat, vi gör därför en kontroll att msg.payload.event_id == house_away.
Koppla nu samman events: all-noden, switch-noden och noderna vi plockade bort först i inlägget.
Det bör nu se ut som detta (om du följt alla inläggen).
Sammanfattning
- Vi har separerat våra triggers från logiken i våra sekvenser
- Vi har minskat längden på sekvenserna för att göra det lättare att få en överblick
- Vi lyssnar på våra egna event och gör det vi vill göra