Detta är något som länge var väldigt omständligt, men som tack vare en liten integration nu är väldigt enkelt! Du vill trigga ett flöde i Node-Red genom en knapptryckning i Home Assistant, hur gör du? Häng med så får du svaret!
Detta är det första inlägget av två (eller flera) där vi börjar knyta ihop säcken kring custom events.
OBS! Detta är en artikel som ursprungligen var publicerad på frosenlind.se den 13 februari 2021.
Länkar i inlägget som hänvisar till gamla sidan kommer inte att fungera!
Problemet…
Du använder Home Assistant som front end/GUI och Node-Red som hjärnan i ditt hemautomationssystem. Du vill ha en knapp på ditt dashboard och när du trycker på denna så triggas ett flöde i Node-Red. Enkelt kan det tyckas men skenet bedrar när du väl börja koda. Du inser snabbt att man måste gå omvägen kring scripts och när du också vill skicka med data i din request så blir det helt plötsligt ganska svårt.
Vilken tur då att jag har en lösning! Häng med, det är ganska lätt!
Målbild
I mitt exempel så ska jag bygga en trigger och koll för vad jag kallar Evening mode, eller helt enkelt kvällsläge. Jag har tidigare skrivit om hemma/borta/sov. Detta är ett komplement till det.
Sov-läget hanterar hela huset och används när ”huset ska sova”, kvällsläget kommer vi i vår familj trigga när det är dags att lägga lillkillen. Vi kommer sänka belysningen och sänka volymer på högtalare, även inkluderat ex. ringklockan.
Aktivera kvällsläge
Lästips innan vi startar
Jag kommer använda mig av custom events och subflows som vi har byggt i tidigare inlägg.
Om du är hyfsat kunnig så kan du ögna igenom hela serien och bara läsa del 3 (eller scrolla längst ner på det inlägget och hämta koden för subflowet). Är du nybörjare och inte har en aning om vad jag skriver om så finns länkarna nedan till hela serien samt första inlägget.
Förutsättningar
För att kunna göra det vi ska måste du, föruttom det uppenbara att ha installerat HA och Node-Red, även installera en custom integration via HACS.
Du hittar integrationen på följande länk:
https://github.com/Hernrup/homeassistant-svc2evnt
När du har lagt till den så måste du skriva följande rad i din configuration.ytaml (2021-02-07, detta kanske ändras framöver).
svc2evnt:
Starta om Home Assistant, klart!
Genomförande
Vi kommer göra enligt följande.
- Skapa en helper
- Skapa en knapp i Home Assistant med button card
- Skapa ett flöde i Node-Red som vi vill trigga
- Konfigurera knappen så den triggar flödet direkt, utan att gå omväg om ett script
Skapa helper
Skapa en input_boolean / toggle. Jag kommer använda följande värden.
Konfig | Värde |
---|---|
Name | Evening mode |
Icon | mdi:weather-sunset-down |
Är du osäker hur du skapar en helper så titta på länken här bredvid.
Skapa knappen
type: 'custom:button-card'
color_type: label_card
show_name: false
show_icon: true
aspect_ratio: 1/1
entity: input_boolean.evening_mode
state:
- value: 'on'
styles:
icon:
- color: red
- value: 'off'
styles:
icon:
- color: 'rgb(153,153,153)'
lock:
enabled: true
unlock: hold
Skapa knappar i button card är något som vi gjort tidigare. Använd sökrutan och sök på button card så får du lite andra inspel.
Jag har delat in koden i tre bitar, den fjärde som hanterar knapptryckningen kommer vi lägga till lite senare.
Första delen hanterar saker som gäller hela kortet och som vi ”måste” ha med. Är du osäker på någon del så finns dokumentationen här: https://github.com/custom-cards/button-card alternativt ställ frågan som en kommentar till inlägget.
Tanken är alltså att när
Node-Red
Som vanligt, glöm inte starta om Node-Red efter att du skapade helpern.
För dig som gjort ”Custom event och subflows – Del 3”
Hur många gånger måste jag länka till inlägget? Läser du detta och har inte gjort del tre av serien så gå och gör det, det kommer spara SÅ mycket tid framöver.
Så enkelt är det nu…
Ja, det är så enkelt för dig som gjort del 3. Dra in vår catch-nod (subflowet catch) och konfigurera det enligt tabellen.
Konfig | Värde |
---|---|
Name | Catch evening_mode |
Event ID | Evening_mode |
Sub ID | on |
Klart! Vill du nu bygga vidare på din sekvens så kan du göra det. Mitt tips är att koppla på en debug-nod på den undre anslutningen och fortsätta med guiden tills den är klar och därefter bygga det du vill att det ska hända.
För dig som INTE gjort ovan…
… det hade varit så mycket lättare om du gjort ovan. Här kommer en snabbvariant, jag har gått igenom detta tydligt i del 3 så är du osäker titta där eller kommentera nedan.
- Dra in en events:all nod, två switch-noder och en debug.
- Koppla dem med events:all först och därefter två switch-noder i följd och slutligen debug.
- Konfigurera events:all med event type: custom_event
- Konigurera därefter switch-noderna i ordning enligt nedan tabeller.
Konfig | Värde |
---|---|
Name | Kontrollera ID |
Property | msg.payload.event.event_id |
Rule 1 (string) | == Evening_mode |
Konfig | Värde |
---|---|
Name | Kontrollera SUB ID |
Property | msg.payload.event.sub_id |
Rule 1 (string) | == on |
Rule 2 (string) | == off |
Detta flöde ersätter inte alla delar av subflowet vi gjorde i del 3, men du klarar denna guiden!
Vill du nu bygga vidare på din sekvens så kan du göra det. Mitt tips är att koppla på en debug-nod och fortsätta med guiden tills den är klar och därefter bygga det du vill att det ska hända.
Button card och svc2evnt
Då ska vi tillbaka till Home Assistant och vårt button card. Det är på plats att erkänna en sak också nu: jag hade ett problem som jag ville lösa, jag använda scripts som en genväg men när mina sekvenser i Node-Red blev för komplexa och jag var tvungen att skicka data i mina knapptryckningar så fungerade det helt enkelt inte. Jag gjorde då vad alla borde göra, använde en livlina. I mitt fall var det min gode vän som (på någon timme) skrev svc2evnt-integrationen.
Den är i sin natur väldigt enkel och gör något som Home Assistant förhoppningsvis kommer kunna göra native framgent, den tillåter oss att kasta ett event som en service.
svc2evnt är en enkel integration
tap_action:
action: call-service
service: svc2evnt.fire_event
service_data:
event_type: custom_event
data:
event_id: Evening_mode
sub_id: 'on'
Det magiska
Som vanligt anger vi tap_action, eller vad vi nu vill använda för trigger.
Som action anropar vi call-service.
Som service anger vi vår custom integration.[det vi vill göra], dvs. svc2evnt.fire_event
Eftersom detta är en service så anger vi service_data om vi vill skicka med någon information, det var här jag gick bet när jag använda scripts. Här kan du nu i princip skicka med vad du vill.
I mitt exempel så vill vi skicka med tre saker.
- Event type, detta är tvingande. Vi kör ju vårt egna custom_event så detta anger du här.
- I vårt subflöde så lyssnar vi efter event_id och sub_id som båda ligger under en dictionary som heter data. Vi anger därför detta också.
KLART!
Du har nu triggat ett flöde i Node-Red direkt från en knapp i Home Assistant. Tänk på att du måste ändra state på din input_boolean så den visar rätt on eller off.
Ett flöde triggat direkt från
en knapp i Home Assistant
Tillägg
hold_action:
action: call-service
service: svc2evnt.fire_event
service_data:
event_type: custom_event
data:
event_id: Evening_mode
sub_id: 'off'
Man kan göra fel, man kan till och med göra fel fast vi har lock på knappen. Därför vill jag, i mitt exempel, kunna stänga av kvällsläge igen.
För att göra detta skickar jag ett nytt custom_event med sub_id off genom hold_action.