[Guide] Lag din egen Custom motion flow

Jeg har laget et eksempel på hvordan folk kan sette opp egen flow for å slå på lys ved bevegelse.

Kommenter gjerne om det er noe dere ikke forstår, eller burde omformuleres eller noe.

3 Likes

For å sette en statisk % ved første bevegelse etter modus er endet til home kan denne flowen brukes :slight_smile:

{
  "Id": "rkVqSnXehw2w52K",
  "ClassId": "Nqo6aLFaaFoKgW7",
  "Author": "espenh.no",
  "Version": 0,
  "CreatedAt": "2020-09-15T16:23:07.942061947+02:00",
  "UpdatedAt": "2020-09-15T16:35:08.463045152+02:00",
  "Name": "sensor_presence automations",
  "Group": "sensor_presence",
  "Description": "",
  "Nodes": [
    {
      "Id": "1",
      "Type": "trigger",
      "Label": "sensor_presence",
      "SuccessTransition": "8",
      "TimeoutTransition": "",
      "ErrorTransition": "",
      "Address": "pt:j1/mt:evt/rt:dev/rn:zw/ad:1/sv:sensor_presence/ad:49_0",
      "Service": "sensor_presence",
      "ServiceInterface": "evt.presence.report",
      "Config": {
        "InputVariableType": "",
        "IsValueFilterEnabled": false,
        "LookupServiceNameAndLocation": false,
        "PropFilterName": "",
        "PropFilterValue": "",
        "RegisterAsVirtualService": false,
        "Timeout": 0,
        "ValueFilter": {
          "Value": true,
          "ValueType": ""
        },
        "ValueJPath": "",
        "ValueJPathResultType": "",
        "VirtualServiceGroup": "",
        "VirtualServiceProps": null
      },
      "Ui": {
        "nodeType": "",
        "x": 702,
        "y": 118
      }
    },
    {
      "Id": "2",
      "Type": "action",
      "Label": "out_lvl_switch ON (Last known value)",
      "SuccessTransition": "",
      "TimeoutTransition": "",
      "ErrorTransition": "",
      "Address": "pt:j1/mt:cmd/rt:dev/rn:zw/ad:1/sv:out_lvl_switch/ad:32_1",
      "Service": "out_lvl_switch",
      "ServiceInterface": "cmd.binary.set",
      "Config": {
        "DefaultValue": {
          "Value": true,
          "ValueType": "bool"
        },
        "IsVariableGlobal": false,
        "Props": {},
        "RegisterAsVirtualService": false,
        "ResponseToTopic": "",
        "VariableName": "",
        "VirtualServiceGroup": "",
        "VirtualServiceProps": {}
      },
      "Ui": {
        "nodeType": "",
        "x": 400,
        "y": 878
      }
    },
    {
      "Id": "4",
      "Type": "wait",
      "Label": "wait 10 min",
      "SuccessTransition": "5",
      "TimeoutTransition": "",
      "ErrorTransition": "",
      "Address": "",
      "Service": "",
      "ServiceInterface": "",
      "Config": 600000,
      "Ui": {
        "nodeType": "",
        "x": 596,
        "y": 876
      }
    },
    {
      "Id": "5",
      "Type": "action",
      "Label": "out_lvl_switch OFF",
      "SuccessTransition": "",
      "TimeoutTransition": "",
      "ErrorTransition": "",
      "Address": "pt:j1/mt:cmd/rt:dev/rn:zw/ad:1/sv:out_lvl_switch/ad:32_1",
      "Service": "out_lvl_switch",
      "ServiceInterface": "cmd.binary.set",
      "Config": {
        "DefaultValue": {
          "Value": false,
          "ValueType": "bool"
        },
        "IsVariableGlobal": false,
        "Props": {},
        "RegisterAsVirtualService": false,
        "ResponseToTopic": "",
        "VariableName": "",
        "VirtualServiceGroup": "",
        "VirtualServiceProps": {}
      },
      "Ui": {
        "nodeType": "",
        "x": 594,
        "y": 1030
      }
    },
    {
      "Id": "6",
      "Type": "if",
      "Label": "if presence = true",
      "SuccessTransition": "",
      "TimeoutTransition": "",
      "ErrorTransition": "",
      "Address": "",
      "Service": "",
      "ServiceInterface": "",
      "Config": {
        "Expression": [
          {
            "BooleanOperator": "",
            "LeftVariableIsGlobal": false,
            "LeftVariableName": "",
            "Operand": "eq",
            "RightVariable": {
              "Value": true,
              "ValueType": "bool"
            }
          }
        ],
        "FalseTransition": "7",
        "TrueTransition": "2"
      },
      "Ui": {
        "nodeType": "",
        "x": 409,
        "y": 723
      }
    },
    {
      "Id": "7",
      "Type": "if",
      "Label": "if presence = false",
      "SuccessTransition": "",
      "TimeoutTransition": "",
      "ErrorTransition": "",
      "Address": "",
      "Service": "",
      "ServiceInterface": "",
      "Config": {
        "Expression": [
          {
            "BooleanOperator": "",
            "LeftVariableIsGlobal": false,
            "LeftVariableName": "",
            "Operand": "eq",
            "RightVariable": {
              "Value": false,
              "ValueType": "bool"
            }
          }
        ],
        "FalseTransition": "",
        "TrueTransition": "4"
      },
      "Ui": {
        "nodeType": "",
        "x": 598,
        "y": 730
      }
    },
    {
      "Id": "8",
      "Type": "if",
      "Label": "if home",
      "SuccessTransition": "",
      "TimeoutTransition": "",
      "ErrorTransition": "",
      "Address": "",
      "Service": "",
      "ServiceInterface": "",
      "Config": {
        "Expression": [
          {
            "BooleanOperator": "",
            "LeftVariableIsGlobal": true,
            "LeftVariableName": "fh.home.mode",
            "Operand": "eq",
            "RightVariable": {
              "Value": "home",
              "ValueType": "string"
            }
          }
        ],
        "FalseTransition": "9",
        "TrueTransition": "16"
      },
      "Ui": {
        "nodeType": "",
        "x": 498,
        "y": 343
      }
    },
    {
      "Id": "9",
      "Type": "if",
      "Label": "if sleep",
      "SuccessTransition": "",
      "TimeoutTransition": "",
      "ErrorTransition": "",
      "Address": "",
      "Service": "",
      "ServiceInterface": "",
      "Config": {
        "Expression": [
          {
            "BooleanOperator": "",
            "LeftVariableIsGlobal": true,
            "LeftVariableName": "fh.home.mode",
            "Operand": "eq",
            "RightVariable": {
              "Value": "sleep",
              "ValueType": "string"
            }
          }
        ],
        "FalseTransition": "",
        "TrueTransition": "10"
      },
      "Ui": {
        "nodeType": "",
        "x": 941,
        "y": 329
      }
    },
    {
      "Id": "10",
      "Type": "if",
      "Label": "if presence = true",
      "SuccessTransition": "",
      "TimeoutTransition": "",
      "ErrorTransition": "",
      "Address": "",
      "Service": "",
      "ServiceInterface": "",
      "Config": {
        "Expression": [
          {
            "BooleanOperator": "",
            "LeftVariableIsGlobal": false,
            "LeftVariableName": "",
            "Operand": "eq",
            "RightVariable": {
              "Value": true,
              "ValueType": "bool"
            }
          }
        ],
        "FalseTransition": "13",
        "TrueTransition": "12"
      },
      "Ui": {
        "nodeType": "",
        "x": 857,
        "y": 560
      }
    },
    {
      "Id": "12",
      "Type": "action",
      "Label": "out_lvl_switch cmd.lvl.set 10%",
      "SuccessTransition": "",
      "TimeoutTransition": "",
      "ErrorTransition": "",
      "Address": "pt:j1/mt:cmd/rt:dev/rn:zw/ad:1/sv:out_lvl_switch/ad:32_1",
      "Service": "out_lvl_switch",
      "ServiceInterface": "cmd.lvl.set",
      "Config": {
        "DefaultValue": {
          "Value": 10,
          "ValueType": "int"
        },
        "IsVariableGlobal": false,
        "Props": {},
        "RegisterAsVirtualService": false,
        "ResponseToTopic": "",
        "VariableName": "",
        "VirtualServiceGroup": "",
        "VirtualServiceProps": {}
      },
      "Ui": {
        "nodeType": "",
        "x": 865,
        "y": 724
      }
    },
    {
      "Id": "13",
      "Type": "if",
      "Label": "if presence = false",
      "SuccessTransition": "",
      "TimeoutTransition": "",
      "ErrorTransition": "",
      "Address": "",
      "Service": "",
      "ServiceInterface": "",
      "Config": {
        "Expression": [
          {
            "BooleanOperator": "",
            "LeftVariableIsGlobal": false,
            "LeftVariableName": "",
            "Operand": "eq",
            "RightVariable": {
              "Value": false,
              "ValueType": "bool"
            }
          }
        ],
        "FalseTransition": "",
        "TrueTransition": "14"
      },
      "Ui": {
        "nodeType": "",
        "x": 1069,
        "y": 558
      }
    },
    {
      "Id": "14",
      "Type": "wait",
      "Label": "wait 2 min",
      "SuccessTransition": "15",
      "TimeoutTransition": "",
      "ErrorTransition": "",
      "Address": "",
      "Service": "",
      "ServiceInterface": "",
      "Config": 120000,
      "Ui": {
        "nodeType": "",
        "x": 1066,
        "y": 720
      }
    },
    {
      "Id": "15",
      "Type": "action",
      "Label": "out_lvl_switch OFF",
      "SuccessTransition": "",
      "TimeoutTransition": "",
      "ErrorTransition": "",
      "Address": "pt:j1/mt:cmd/rt:dev/rn:zw/ad:1/sv:out_lvl_switch/ad:32_1",
      "Service": "out_lvl_switch",
      "ServiceInterface": "cmd.binary.set",
      "Config": {
        "DefaultValue": {
          "Value": false,
          "ValueType": "bool"
        },
        "IsVariableGlobal": false,
        "Props": {},
        "RegisterAsVirtualService": false,
        "ResponseToTopic": "",
        "VariableName": "",
        "VirtualServiceGroup": "",
        "VirtualServiceProps": {}
      },
      "Ui": {
        "nodeType": "",
        "x": 1066,
        "y": 882
      }
    },
    {
      "Id": "16",
      "Type": "if",
      "Label": "if firstMovement",
      "Address": "",
      "Service": "",
      "ServiceInterface": "",
      "SuccessTransition": "",
      "ErrorTransition": "",
      "Config": {
        "TrueTransition": "17",
        "FalseTransition": "6",
        "Expression": [
          {
            "Operand": "eq",
            "LeftVariableName": "firstMovement",
            "LeftVariableIsGlobal": true,
            "RightVariable": {
              "Value": true,
              "ValueType": "bool"
            },
            "BooleanOperator": ""
          }
        ]
      },
      "Ui": {
        "x": 309,
        "y": 531,
        "nodeType": ""
      }
    },
    {
      "Id": "17",
      "Type": "action",
      "Label": "out_lvl_switch 40%",
      "SuccessTransition": "18",
      "TimeoutTransition": "",
      "ErrorTransition": "",
      "Address": "pt:j1/mt:cmd/rt:dev/rn:zw/ad:1/sv:out_lvl_switch/ad:32_1",
      "Service": "out_lvl_switch",
      "ServiceInterface": "cmd.lvl.set",
      "Config": {
        "DefaultValue": {
          "Value": 40,
          "ValueType": "int"
        },
        "IsVariableGlobal": false,
        "Props": {},
        "RegisterAsVirtualService": false,
        "ResponseToTopic": "",
        "VariableName": "",
        "VirtualServiceGroup": "",
        "VirtualServiceProps": {}
      },
      "Ui": {
        "nodeType": "",
        "x": 121,
        "y": 706
      }
    },
    {
      "Id": "18",
      "Type": "set_variable",
      "Label": "set false firstMovement",
      "Address": "",
      "Service": "",
      "ServiceInterface": "",
      "SuccessTransition": "",
      "ErrorTransition": "",
      "Config": {
        "Name": "firstMovement",
        "UpdateGlobal": true,
        "UpdateInputMsg": false,
        "DefaultValue": {
          "Value": 0,
          "ValueType": "bool"
        }
      },
      "Ui": {
        "x": 116,
        "y": 867,
        "nodeType": ""
      }
    },
    {
      "Id": "20",
      "Type": "set_variable",
      "Label": "set true firstMovement",
      "Address": "",
      "Service": "",
      "ServiceInterface": "",
      "SuccessTransition": "",
      "ErrorTransition": "",
      "Config": {
        "Name": "firstMovement",
        "UpdateGlobal": true,
        "UpdateInputMsg": false,
        "DefaultValue": {
          "Value": true,
          "ValueType": "bool"
        }
      },
      "Ui": {
        "x": 155,
        "y": 297,
        "nodeType": ""
      }
    },
    {
      "Id": "21",
      "Type": "vinc_trigger",
      "Label": "Home event trigger",
      "Address": "",
      "Service": "",
      "ServiceInterface": "",
      "SuccessTransition": "20",
      "ErrorTransition": "",
      "Config": {
        "Timeout": 0,
        "ValueFilter": "home",
        "IsValueFilterEnabled": true,
        "EventType": "mode"
      },
      "Ui": {
        "x": 157,
        "y": 145,
        "nodeType": ""
      }
    }
  ],
  "Settings": null,
  "IsDisabled": false,
  "IsDefault": false,
  "ParallelExecution": "keep_last"
}
2 Likes

Jeg har custom flows for lys ved bevegelse hvor jeg også tar med lux, slik at ikke lyset slår seg på dersom det er lyst i rommet fra før. Flowen bygger på den du har laget @espen, men med noen tillegg. Dette fungerer nå 95%, men jeg har et problem. Det skjer dersom det er bevegelse i rommet etter at eventet “presence = false” har blitt fyrt av, og man står i “wait” modus. Da blir ikke bevegelse fanget opp, og etter et visst antall minutter slår lyset seg av selv om man er i rommet.

Er dette en såkalt busy wait; altså at flowen ikke reagerer på andre events mens den venter?
Har forsøkt litt forskjellig, men får samme resultat uansett.

Har du valgt “keep new instance”?

Nei, jeg kjører i parallell. Jeg har flere triggere og variabler som blir oppdatert ifm lux, så måtte det for å få det til å fungere. Mener jeg har tatt høyde for parallell kjøring, men akkurat den “wait”-en gjør ikke som forventet…

Aha! Ja da blir ikke wait noden avbrutt ved ny bevegelse nei. Det jeg har gjort er at jeg har en egen flow med triggere som setter variabler. Så bruker jeg de i “lysflowen” som har “keep new instances”.
Usikker på om det finnes noen annen måte å gjøre det på for å få wait noden til å avbryte ved ny bevegelse🤔

@nilsml “Keep new instance” er nøkkelen her. Ellers kan du risikera at det blir kjørt veldig mange flows i parallell - kanskje fleire enn hubben og spesielt z-wave nettverket ditt klarer å handtera. Løysinga er då å splitta opp flowen du har no i fleire mindre, og få dei til å samhandla (vha globale variabler og kreativ bruk av triggere).

(Apropos dette - skulle gjerne ha hatt muligheit til å fyra i gang flows ved oppdatering av global variabel - har ikkje kjørt meg fast endå men ser at det kan vera nyttig :nerd_face:)

Takker for tips. Får sette meg ned og splitte opp flow i flere og bruke globale variabler. Men vil jo anta at hver flow avsluttes så snart den har gjort sitt, og på den måten så blir det ikke så mange parallelle. Har ikke hatt noe problemer med det så langt ihvertfall. Kun det med wait-noden. Men flere flows gjør kanskje feilsøkingen noe enklere uansett, så tror det er et godt tips.

1 Like

Jeg får ikke denne til å virke. Flowen slår lys ved bevegelse, men etter satt tid (10 min) slås det av.

Egentlig er det nå verre enn med standard “trigger ved bevegelse i rom”, for når lyset nå slår seg av hjelper det ikke med ny bevegelse. Jeg kan hoppe og vifte foran sensor, og ser det lyser grønt i LED-en, men lyset slår seg ikke på. Etter et antall minutter slår lyset seg på ved bevegelse.

Hva gjør jeg feil?

Kan du åpne source code og se hva “ParallelExecution” er satt til?

Skal stå til:
“ParallelExecution”: “keep_last”

Kan også endres ved å trykke på pensel øverst hvor du kan redigere navn

"ParallelExecution": "keep_last"

Bilde 21.10.2020 klokken 23.09

Kan du dele flowen du bruker, så må jeg nesten lese gjennom om det er en feil et sted