Custom event och subflows – Del 3

I del tre av denna serie kommer vi snygga till flödena ytterligare genom att hämta våra custom events med ett subflow. När vi är klara med denna del så kan vi helt separera triggers från logik på ett riktigt snygg sätt.

OBS! Detta är en artikel som ursprungligen var publicerad på frosenlind.se den 24 januari 2021.
Länkar i inlägget som hänvisar till gamla sidan kommer inte att fungera!

Förutsättningen för detta inlägg är att ni läst (minst) följande inlägg: http://frosenlind.se/hemautomation/custom-event-och-subflows-med-home-assistant-och-node-red-del-2/

För att sammanfatta tidigare inlägg

  • Vi skapade ett subflow med en input och en output
  • Vi skickade ett custom event med den data vi skickat in till vår nod
  • Vi angav ett ID och möjlighet till ett sub id

Målbild

När vi är klara vill vi:

  • Fånga våra kastade event och filtrera ut genom EN nod
  • Använda den data vi skickat med vårt custom event
Målbild

Genomförande

  1. Skapa ett subflow
  2. Fånga upp våra kastade custom event
  3. Kontrollera att det är rätt ID
  4. Kontrollera att det är rätt sub ID om det finns
  5. Skicka output med event payload om ovan stämmer

Skapa subflow

Det första vi måste göra är skapa ett subflow som vi kan använda när vi ska kasta våra event. Vi gör detta i huvudmenyn -> Subflows -> Create subflow

Skapa ett nytt subflow

Denna nod kommer användas som första nod i en sekvens, vi behöver därför inte ha en input utan bara en output. Vi vill även ha en nod för debug. Välj därför ingen input och två output.
Du justerar detta i ovankant i subflow-vyn.

Node-Red, Edit subflow input/output

Definera Environment Variables

När vi deployar vårt subflow i en sekvens så vill vi kunna, på ett enkelt sätt, skriva in vilket event vi vill lyssna på. Därför definerade vi i ”kasta event inlägget” (länkat ovan) ID och sub id.

För att kunna göra detta så måste vi definera variabler som vi kan använda i vårt subflow, dessa kallas Environment Variables.

Klicka på edit properties högst upp till vänster inne i subflowt, längst ner i fliken Environment Variables står det add, lägg till två variabler och ge dem egenskaper enligt tabellen nedan.

Node-Red, Edit subflow properties
NameLabelInput type
CUSTOM_EVENT_IDEvent IDstring
CUSTOM_EVENT_SUB_IDSub IDstring
Table: Node-Red, subflow Variables

Vi vill inte ha något default value på någon av variablerna.

I UI Preview kan ni se hur det kommer se ut!

Skapa vår sekvens…. flöde

Igen, flöde/flow är enligt Node-Red flikarna, det som vi tycker är ett flow kallas sekvens.

Dra in en events:all-nod och tre switch-noder.

Lyssna, på… allt

Switch

Vad vi ska åstadkomma är nu följande:

  1. Lyssna efter custom_events
  2. Kontrollera om det är rätt event ( ID )
  3. Kontrollera om det finns ett sub id
    • Om det finns ett sub-id så kontrollera om det är rätt
    • Om det inte finns ett sub-id så gå till output.

Vi vill dessutom även ha möjlighet att debugga vårt subflow.

Events:all

Vi inleder med att konfigurera event:all-noden. I Event Type skriver du custom_event. Klart!

Koppla därefter output 2 direkt till events:all-noden.

Switch, rätt ID?

Förutom output 2 kopplar du även in en switch-nod. Denna nod ska kontrollera om det ID som du anger i ditt subflow är samma som kommer med vårt custom_event.

EgenskapVärdeKommentar
NameKontrollera ID
Propertymsg.payload.event.event_idDetta är ”sökvägen” till events ID
Rule 1== $ CUSTOM_EVENT_IDDu skapar regeln genom add längst ner till vänster
Table: switch node

Switch, finns sub id?

Nu ska vi kontrollera om det finns ett SUB ID inlagt i subflowet. Koppla en switch-nod till föregående switch-nod.

EgenskapVärdeKommentar
NameFinns SUB ID?
Property$CUSTOM_EVENT_SUB_IDDetta är miljövariabeln (Environment Variables) vi angav tidigare.
Rule 1is empty
Rule 2is not empty
Table: switch node

Längst ner kan du också ändra till ”stopping after first match”, det spelar inte så stor roll för oss men det är rätt!

is empty

Koppla det översta alternativet på ”Finns SUB ID-switch-noden” till output 1.

Detta innebär att om det är rätt ID i första switch-noden och det inte finns något SUB ID angivit i subflowet, då skickar vi datan vidare till output. Dvs. allting stämmer.

is not empty

Koppla det undre alternativet på ”Finns SUB ID-switch-noden” till sista switch-noden, koppla därefter den noden till output 1.

EgenskapVärdeKommentar
NameKontrollera SUB ID
Propertypayload.event.sub_idDetta är ”sökvägen” till events SUB ID
Rule 1== $ CUSTOM_EVENT_SUB_ID
Table: switch node

Längst ner kan du också ändra till ”stopping after first match”, det spelar inte så stor roll för oss men det är rätt!

Detta innebär att om det är rätt ID i första switch-noden och det finns ett SUB ID angivit i subflowet och det ID överensstämmer med det som kommer med vårt custom_event, då skickar vi datan vidare till output. Dvs. allting stämmer.

Hela sekvensen

Du borde nu ha något som ser ut som följande bild.

Node-Red, hela sekvensen

Funktionstest

För att kontrollera att det verkligen fungerar vill vi testa följande:

  • Skicka ett custom event med bara ID
    • Kontrollera att det kommer fram med debug noden
    • Kontrollera att det kommer fram om vi anger rätt ID i subflowet
  • Skicka ett custom event med ID och SUB ID
    • Kontrollera att det inte kommer fram om SUB ID är TOMT i trigger-noden
    • Kontrollera att det inte kommer fram om SUB ID är FEL i trigger-noden
    • Kontrollera att det kommer fram om SUB ID är RÄTT i trigger-noden
  • Skicka med data i json
    • Kontrollera att det kommer fram

Uppställning

Dra in en inject-nod och vår trigger-nod från förra inlägget och koppla dessa.
Ange TestEvent som Event ID, lämna Sub ID tomt och låt DATA vara default value {}

Dra därefter in vår catch-nod (och ange TestEvent där också) och därefter en debug-nog, kolla debug till den understa kopplingen och ändra därefter debug till complete msg object.

Home Assistant, debug

Dina flöden borde se ut som nedan.

Node-Red, nodes

Skicka ett custom event med bara ID

Trigga inject-noden. I debuggen borde du se ett resultat som innehåller:

object
{"event_type":"custom_event","topic":"custom_event" 
...}

Ser du detta så innebär det att du har fångat vårt custom_event.

Ändra nu så att debug-noden är kopplad till den övre anslutningspunkten, glöm inte deploya igen.

Kontrollera att det står TestEvent i både trigger- och catch-subflowna. Trigga inject-noden.

Node-Red, debug

Ser du detta fungerar det.

Skicka ett custom event med ID och SUB ID

Nu ska vi göra tre tester.

  1. Lägg in ”MittSubID” som SUB ID i catch-subflowet men inte i trigger-subflowet. Trigga inject-noden. Du borde INTE få någon output.
  2. Lägg in ett FELAKTIGT sub id i SUB ID i trigger-subflowet. Trigga inject-noden. Du borde INTE få något output.
  3. Lägg in ”MittSubID” även i trigger-subflowet. Trigga inject-noden. Du ska få en output.

OBS! En fördel med att bygga upp det på detta viset är att du nu kan skippa SUB ID i catch-subflowet och då få respons på alla custom_event som har rätt ID, trots att de har ett SUB ID i trigger-noden.

Skicka med data i json

Lägg in någon information i JSON-format i trigger-subflowet.

{"information":"frosenlind.se"}

Deploy och trigga inject-noden. Kontrollera att datan du skrev in kommer fram.

Du har nu gjort alla tester för att kontrollera att det fungerar som det ska!

Node-Red, debug

Avslutningsvis

Grattis, du har nu alla förutsättningar för att göra riktigt smidiga flows! (Ja, sekvenser heter det faktiskt).

För tillfället tänker jag mig att det kommer tre delar till i denna serie.

  • Skicka in data med msg i trigger-subflowet som kommer med eventet
  • Inlägg med exempel på vad man kan göra och hur dessa subflow underlättar
  • Använda en custom integration som gör att du kan trigga ett Node-Red flöde direkt från en knapp i ditt lovelace dashboard.

Vad tycker ni? Kommentera nedan eller någonstans där du hittar mig!

Leave a Reply

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *

Denna webbplats använder Akismet för att minska skräppost. Lär dig hur din kommentardata bearbetas.