How-to: Automatisch opsporen van 'broken' en uitgeschakelde flows

Soms doet een flow niet wat je verwacht of helemaal niets. Daar krijg je niet altijd een melding van helaas.

Flows kunnen door Homey uitgeschakeld worden, als Homey vindt dat ze te vaak worden gestart. Hiervan komt 1 melding op de tijdlijn voorbij.

Maar je kunt ook met een flow een andere flow uitschakelen. Als er ergens iets misgaat/misgegaan is, kan die flow uitgeschakeld blijven, zonder enige melding, en dan kun je soms erg lang moeten zoeken…

Verder kan een flow breken / stukgaan, als er een apparaat / app niet meer op je Homey aanwezig is, welke in die flow gebruikt werd als trigger, voorwaarde of actie. Dit wordt standaard niet gemeld, maar het is wel te zien aan het flow icoontje op de web app, en in de telefoon app doordat de knop en flownaam beiden ‘grijs’ (grayed out) zijn.
Maar je zit niet de hele dag door je flows te scrollen of alles nog klopt toch?

Maar hier is natuurlijk een oplossing voor, middels een flow welke elke X uur een check doet. Je zou het ook handmatig kunnen runnen als je iets vaags tegenkomt.
(en nu hopen dat deze flow het wél blijft doen natuurlijk.

Ik heb dus een flow gemaakt (zie hieronder) en 2 bijbehorende scripts met hulp van 2 script guru’s op het forum en aanvullingen van FB Homeygroep leden.

  • Benodigdheden: de HomeyScript app
    (Niet schrikken, het is copy/paste werk, geen kennis benodigd)

  • Belangrijk: Om de beide variabelen automagisch aan te laten maken, dienen beide scripts 1x in de HomeyScript console te worden gedraaid middels de test knop.
    Daarna doet de flow de rest!

Enjoy! Opmerkingen/Aanvullingen/tips/boe-geluiden altijd welkom.

  • Flow: Vindt Uitgeschakelde en Gebroken Flows

  • Script FindBrokenFlows.js
// Get broken flows and write result to a variable/tag [BrokenFlows], else OK msg

const flows = Object.values(await Homey.flow.getFlows({filter: { broken: true }})).map(f =>  f.name)

// Create string [FlowString] from array [flows], so it can be written into variable "BrokenFlows"
const flowsString = JSON.stringify(flows) 

// Check if flowsString is empty (besides [ and ] >> flowsString.length > 2) 
  if (flowsString.length > 2) {
     // Remove the starting & trailing brackets
     var flowsStringTrimmed = flowsString.slice(1, -1);
     // (create&)write variable/tag [BrokenFlows] with contents of [flowsStringTrimmed]
     await tag("BrokenFlows", flowsStringTrimmed ); 
     // Timeline notification
     await Homey.flow.runFlowCardAction({
       uri: 'homey:manager:notifications',
       id: 'create_notification',
       args: {
          text: 'Broken Flows today:  ' + flowsStringTrimmed + ' [script: FindBrokenFlows.js]'
        },
      });
     // OR / AND 
     // per flow while using an action card of your choice. 
     // Create a flow which sends the value of variable [BrokenFlows] to timeline f.i. 
     // Now we're going to trigger that flow from here, you'll need the flow-ID
     // The flow-ID can be found in the last part of my.homey.app URL when you edit that flow
//     await Homey.flow.triggerFlow({id:'a2b655d1-78be-4de0-8f3d-2de2d463fe1d'});
   } else {
        var flowsStringTrimmed = "No broken flows found";
        await tag("BrokenFlows", flowsStringTrimmed );
        // OPTIONAL, if you'd like to be informed all's fine
        // Timeline notification
        await Homey.flow.runFlowCardAction({
          uri: 'homey:manager:notifications',
          id: 'create_notification',
          args: {
            text: 'Broken Flows today:  ' + flowsStringTrimmed + ' [script: FindBrokenFlows.js]'
        },
      });
        //
        // OR / AND IF you also want to be notified when all's fine per flow:
        // Create a flow which sends the value of variable [BrokenFlows] to timeline f.i. 
        // Now we're going to trigger that flow from here, you'll need the flow-ID
        // The flow-ID can be found in the last part of my.homey.app URL when you edit that flow
//        await Homey.flow.triggerFlow({id:'a2b655d1-78be-4de0-8f3d-2de2d463fe1d'});
      }
return (true);
  • Script FindDisabledFlows.js
// Get disabled flows and write result to a variable/tag [DisabledFlows], else send OK msg
//
const flows = Object.values(await Homey.flow.getFlows({filter: { enabled: false }})).map(f =>  f.name)
// Create string [FlowString] from array [flows], so it can be written into variable "DisabledFlows"
const flowsString = JSON.stringify(flows)
// Check if flowsString is empty (besides [ and ] >> flowsString.length > 2) 
  if (flowsString.length > 2) {
     // Remove the starting & trailing brackets
     var flowsStringTrimmed = flowsString.slice(1, -1);
     // (create&)write variable/tag [DisabledFlows] with contents of [flowsStringTrimmed]
     await tag("DisabledFlows", flowsStringTrimmed ); 
     //
     // Timeline notification
        await Homey.flow.runFlowCardAction({
          uri: 'homey:manager:notifications',
          id: 'create_notification',
          args: {
            text: 'Disabled Flows today:  ' + flowsStringTrimmed + ' [script: FindDisabledFlows.js]'
          },
        });
     // OR 
     // per flow while using a timeline action card. 
     // Create a flow which sends the value of variable [DisabledFlows] to timeline f.i. 
     // Now we're going to trigger that flow from here, you'll need the flow-ID
     // The flow-ID can be found in the last part of my.homey.app URL when you edit that flow
//     await Homey.flow.triggerFlow({id:'cae167dc-8fb0-4681-bbe4-6f0b392a32a2'});
   } else {
        var flowsStringTrimmed = "No disabled flows found";
        await tag("DisabledFlows", flowsStringTrimmed );
        //
        // OPTIONAL, if you'd like to be informed all's fine, per Timeline
        await Homey.flow.runFlowCardAction({
          uri: 'homey:manager:notifications',
          id: 'create_notification',
          args: {
            text: 'Disabled Flows today:  ' + flowsStringTrimmed + ' [script: FindDisabledFlows.js]'
        },
      });
        //
        // OR IF you want to be notified when all's fine, per flow:
        //
        // Create a flow which sends the value of variable [DisabledFlows] to timeline f.i. 
        // Now we're going to trigger that flow from here, you'll need the flow-ID
        // The flow-ID can be found in the last part of my.homey.app URL when you edit that flow
//        await Homey.flow.triggerFlow({id:'cae167dc-8fb0-4681-bbe4-6f0b392a32a2'});
      }
return (true);

Thanks to: Jeroen @jero, Tjeerd @tb1962 & Thomas Schadron

5 Likes

Thx, dit zijn nuttige howto’s.

Bedenk wel dat flows uitschakelen ook een belangrijke functie is om “normaal” te gebruiken voor flows die niet actief horen te zijn. Dat maakt Homey efficiënter, omdat de trigger niet meer geëvalueerd hoeft te worden.

Waar sommige mensen dus een boolean variabele introduceren of een device status testen om een flow met een test inactief te maken kun je ook de flowcards gebruiken die een flow aan- of uitzetten.

Ik gebruik dat b.v. vaak om “computer says no” situaties te voorkomen.

b.v. een versimpeld voorbeeld:
Flow 1: als helderheid <50 zet lamp aan, disable flow 1 en enable flow 2:
Flow 2: als helderheid>100 zet lamp uit, disable flow 2 en enable flow 1

Dit houdt de lamp bedienbaar terwijl deze ook automatisch aan en uit gaat. Doe je dit niet, en je probeert b.v. het licht met de hand uit te zetten, dan blijft Homey het licht weer aandoen.

Misschien is dit niet het beste voorbeeld (dit is b.v. ook op te lossen met wordt groter en wordt kleiner flowcards) maar het idee is breed toepasbaar.

2 Likes

Klopt hoor, een uitgeschakelde flow kan een normale status zijn. Maar als zo’n via een flow uitgeschakelde flows niet meer ingeschakeld wordt, terwijl het normaliter wel zou moeten, kun je soms flink zoeken naar de oorzaak.

Helaas maakt Homey geen verschil tussen de status “door Homey uitgeschakeld” en “handmatig uitgeschakeld” en “uitgeschakeld via een andere flow”, behalve dat de eerste een melding geeft op de tijdlijn.

Soms worden Apps op pauze gezet door Homey, zonder melding.
Dat levert theoretisch altijd “broken flows” op, en kan met de “Broken flow checker” dan vrij snel achterhaald worden.

Dat is inderdaad waardeloos. Dat er bescherming is ingebouwd is fijn, maar een melding op de tijdlijn zou in alle gevallen moeten komen. Dat is soms wel zo maar idd niet altijd.

1 Like

Ja da’s wel een dingetje van Homey.
Ook dat ze onaangekondigd een fw update installeren (die incidenteel een aantal Homey’s om zeep helpen).
Een optie als
“Wilt u de nieuwe FW update om 03:00 uur laten uitvoeren? Nee / Stel 24 uur uit”
lijkt me niet verkeerd.
Als verse eigenaar weet je vaak niet dat dit zomaar wordt geïnstalleerd, en dat je de auto updates kunt uitschakelen.

@Peter_Kawa, automatische firmware updates kan je uitschakelen in instellingen.

Dat weet ik, ik wilde er mee zeggen dat ik regelmatig lees dat Homey eigenaren werden verrast met een fw update, waarna e.e.a. niet meer werkte, en (nog) niet wisten dat je auto-update uit kunt schakelen.

1 Like

since today there’s an app which can do the same thing for you :slight_smile:

https://community.homey.app/t/app-flowchecker/50986

Doc: Homey app: Flow checker – Homey Cornelisse

4 Likes