Searching for a flow that use a specific push text?

Now and then (not that very often) it get a push with the text “Homey” nothing more, just “Homey”.

I don’t understand why, because I can’t remember making a flow with a push with just the word “Homey”. Is there a way to search for specific words in flows or in push texts?

Going through all my flows to find it manually would take a long time…

You can have all flows in text returned with these commands
Homey.flow.getAdvancedFlows();
Homey.flow.getFlows();
@ https://tools.developer.homey.app/tools/api-playground

The output can be searched with your browser’s search tool, or copy/paste output into your text editor and use it’s search function

Thank you, I will give it a try tomorrow.

Indeed, Peter, so you need to repeat the export for all the flows you want to include in your search:
Then you can use your search tool to query any regex query. Your approach will, of course, show them all, although the output will vary.

Here’s a script that allows you to perform a preliminary search using Homey.flow.getAdvancedFlows(); and Homey.flow.getFlows(); in your flows.

/**
 * 
 * Homey Flow Script and Code Filter Utility
 *
 * This script fetches all Homey standard and advanced flows and provides filtered views
 * based on current settings. It supports filtering to list:
 * - Flow cards that run HomeyScript scripts,
 * - Flow cards that run HomeyScript code,
 * - Or show all flow names unfiltered.
 *
 * The filtering mode is controlled by the state in oState (SCRIPT, CODE, or OFF).
 *
 * Key Features:
 * - Retrieve all flows and advanced flows combined.
 * - Filter cards by script/codde name presence.
 * - Show script card names or excerpt code samples with length limit.
 * - Provides detailed logging of filtered results and flow counts.
 *
 * Variable Naming:
 * Uses short Hungarian notation for improved clarity:
 * - i for integers or counters
 * - a for arrays
 * - o for objects
 * - s for strings
 * - b for booleans
 *
 * Usage:
 * - Set the desired state via `oState.state` in SETTINGS: 
 *    (StateContainer.SCRIPT, StateContainer.CODE, StateContainer.OFF).
 * - The script outputs filtered flow data to the Output log.
 *
 * Author: Ruurd
 * Assistance: Perplexity AI Assistant
 * Date: November 2025
 */

//-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!
//-!-!-!-!-!-!-!-!-!-! PRIMARY SETTING !-!-!-!-!-!-!-!-!-!-!-!
//-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!
class StateRecord { constructor(t, e) { this.value = t, this.description = e } } class StateContainer { static SHOW_OBJ_ID = true;  static CODE = new StateRecord("CODE", "Show CODE samples"); static SCRIPT = new StateRecord("SCRIPT", "Show script names"); static OFF = new StateRecord("OFF", "No filter, show all flow names"); static OFF_RX = new StateRecord("OFF_RX", "Regex based filter") }

//-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!
//-!-!-!-!-!-!-!-!-!-!-!-!- APPLY SETTINGS -!-!-!-!-!-!-!-!-!-!
//-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!


// StateContainer. CODE SCRIPT OFF OFF_RX
await applySettings(StateContainer.OFF);


//-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!
//-!-!-!-!-!-!-!-!-!-!-!-!-!-!- RUN -!-!-!-!-!-!-!-!-!-!-!-!-!
//-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!
let iCounter = 0;
let iCounterFilter = 0;
let iCounterDisabled = 0;
let sAllText = ``;

for (let oFlow of aAllFlows) { // StateContainer.OFF or StateContainer.OFF_RX

  /**
   * Check if flow should be processed based on enabled flag and filter setting.
   *
   * @param {Object} oFlow - The flow object to check.
   * @param {boolean} b_ENABLED_ONLY - Flag to enable filtering by flow enabled state.
   * @returns {boolean} True if the flow passes the enabled state check, false otherwise.
   */

  if (!b_ENABLED_ONLY || oFlow.enabled) {
    if (!bFilter) {
      // regex to replace unallowed filename characters with "_"
      if (oState.state === StateContainer.OFF_RX) {
        const sResult = (SHOW_OBJ_ID ? `{name: '${oFlow.name}'` : `${oFlow.name.replace(sFilter, (match) => aReplacements[match] || "")}`) + (SHOW_OBJ_ID ? `, id: '${oFlow.id}'}` : '');
        // log(`${oFlow.name.replace(sFilter, '_')}`); // ...  /[\\\/:\*\?"<>\|]/g
        sAllText += (`${sResult}\n`);
        iCounter++;
      }
      else if (oState.state === StateContainer.OFF) { // Show all flow names unfiltered
        sAllText += (`${oFlow.name}\n`);
        iCounter++;
      }
      else {
        sAllText = (`unknown STATE`);
      }
    }
    if (bFilter && oFlow.cards) {
      const sResult = filter(oFlow.cards, oFlow); // Filter & show results
      if (sResult !== null) {
        const sJsonString = JSON.stringify(sResult, null, 2);
        const sStrippedString = sJsonString.replace(/"/g, ''); // Remove double quotes for readability
        sAllText += (`${sStrippedString}\n`);
        // iCounter++;
        iCounterFilter++;
      }
    }
  }
  else {
    iCounterDisabled++;
  }
}

// -!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!
// SHOW - RETURN
//-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!
const sCounters = iCounterFilter == 0 ? `(Enabled:${iCounter}, Disabled:${iCounterDisabled})` :
  `(Filtered:${iCounterFilter})`;

log(
  `## State: ${JSON.stringify(oState.state)}\n` +
  `## Filter ${b_ENABLED_ONLY ? 'Enabled' : ''}: ${bFilter ? `-> "${sFilter}"` : StateContainer.OFF.value}\n` +
  `## allFlows: ${aAllFlows.length} ${sCounters}\n` +
  `## Enabled Flows Only: ${b_ENABLED_ONLY}\n` +
  `## Show as Object: ${SHOW_OBJ_ID} (Show as Object with ID)\n\n` +
  (SHOW_OBJ_ID ? 'const aFlows = [\n' : '') +
  sAllText +
  (SHOW_OBJ_ID ? ']\n' : '')
);

return iCounter;


//-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!
//-!-!-!-!-!-!-!-!-!-!-!-!- FUNCTIONS -!-!-!-!-!-!-!-!-!-!-!-!
//-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!

/**
 * applySettings function initializes and sets global constants,
 * variables, and state for flow filtering in HomeyScript.
 *
 * @param {string} sState - The desired state to set on initialization.
 *                          Accepts one of: "CODE", "SCRIPT", "OFF", "OFF_RX".
 *                          Defaults to "OFF_RX" if an unknown state is passed.
 *
 * @returns {Promise<void>} - Returns a promise as it performs asynchronous flow data fetching.
 */
async function applySettings(sStateValue) {
  // 
  globalThis.i_CODE_LEN = 20;           // length of Code samples to display
  globalThis.b_ENABLED_ONLY = true;     // filter by enabled status

  globalThis.aReplacements = {          // replacement chars for filenames
    '\\': "_",
    '/': "_",
    ':': "_",
    '*': "_",
    '?': "_",
    '"': "_",
    '<': "_",
    '>': "_",
    '|': "__"
  };

  // Define stateful variables globally too
  globalThis.bScriptCard = false;
  globalThis.bFilter = false;
  globalThis.sFilter = '';
  globalThis.SHOW_OBJ_ID = StateContainer.SHOW_OBJ_ID;;

  globalThis.oState = {
    state: StateContainer.OFF_RX,
    evaluate() {
      if (sStateValue === StateContainer.SCRIPT) {
        globalThis.bScriptCard = true;
        globalThis.bFilter = true;
        globalThis.sFilter = "homey:app:com.athom.homeyscript:run";
        return StateContainer.SCRIPT;
      } else if (sStateValue === StateContainer.CODE) {
        globalThis.bScriptCard = false;
        globalThis.bFilter = true;
        globalThis.sFilter = "homey:app:com.athom.homeyscript:runCode";
        return StateContainer.CODE;
      } else if (sStateValue === StateContainer.OFF) {
        globalThis.bFilter = false;
        globalThis.sFilter = '';
        // globalThis.SHOW_OBJ_ID = StateContainer.SHOW_OBJ_ID;
        return StateContainer.OFF;
      } else if (sStateValue === StateContainer.OFF_RX) {
        globalThis.bFilter = false;
        globalThis.sFilter = new RegExp("[\\\\/:*?\"<>|]", "g");
        return StateContainer.OFF_RX;
      } else {
        console.log("Unknown state");
      }
    }
  };

  globalThis.aStandardFlows = Object.values(await Homey.flow.getFlows()); // Get all standard flows
  globalThis.aAdvancedFlows = Object.values(await Homey.flow.getAdvancedFlows()); // Get all advanced flows
  globalThis.aAllFlows = await getAllFlowsRaw(); // Combined flows array

  // Set state as requested - CODE SCRIPT OFF OFF_RX
  if (sStateValue === 'CODE') {
    globalThis.oState.state = StateContainer.CODE;
  } else if (sStateValue === 'SCRIPT') {
    globalThis.oState.state = StateContainer.SCRIPT;
  } else if (sStateValue === 'OFF') {
    globalThis.oState.state = StateContainer.OFF;
  } else if (sStateValue === 'OFF_RX') {
    globalThis.oState.state = StateContainer.OFF_RX;
  } else {
    globalThis.oState.state = StateContainer.OFF_RX; // default
  }
  globalThis.oState.evaluate(); // 
}

/**
 * Retrieves all flows including advanced flows, merged into a single array without duplicates.
 * @returns {Array<Object>} - Combined array of standard and advanced flow objects.
 */
async function getAllFlowsRaw() {
  return _.union(aStandardFlows, aAdvancedFlows);
}

/**
 * Filters flow cards based on current filter criteria.
 * @param {Object} oCards - Flow cards object indexed by card ids.
 * @param {Object} oFlow - Parent flow object for context.
 * @returns {string|null} - Summary string of filtered card names or code, or null if none match.
 */
function filter(oCards, oFlow = {}) {
  // Filter cards matching filter string and script condition
  const aFilteredEntries = Object.entries(oCards)
    .filter(([sKey, oCard]) =>
      oCard.id && oCard.id.includes(sFilter) &&
      (bScriptCard ? oCard.args?.script?.name : true)
    );

  // Build filtered object from entries
  const oFilteredCards = aFilteredEntries.reduce((obj, [sKey, oCard]) => {
    obj[sKey] = oCard;
    return obj;
  }, {});

  const iFilteredCount = aFilteredEntries.length;
  let sCardNames = '';
  let sCode = '';

  if (bScriptCard) {
    // Join script names with commas
    sCardNames = aFilteredEntries
      .map(([_, oCard]) => oCard.args.script.name)
      .join(', ')
      .replace(/, $/, ''); // Trim trailing comma/space
  } else {
    // Extract code samples truncated to i_CODE_LEN
    let sCodeSamples = '';
    let iCounter = 0;
    for (let oCard2 of Object.values(oFilteredCards)) {
      if (oCard2.args.code) {
        iCounter++;
        sCodeSamples += ` #${iCounter}${oCard2.args.code.substring(0, i_CODE_LEN)}`;
      }
    }
    sCode = sCodeSamples !== '' ? sCodeSamples : '"Code" not found';
  }

  if (iFilteredCount > 0) {
    return oFlow.name + (bScriptCard ? ` (${iFilteredCount} -> ${sCardNames})` : ` (${sCode.trim()})`);
  }
  return null;
}

That’s beyond my knowledge level. I got another issue to deal with right now, a broken wifi router. :man_facepalming:t3:

Ah, can you tell me how, Ruurd?
The new “tool” (with the ‘ALT’ button involved) can only export one flow at a time, as far as I know.

Peter, you can also use the Homey Experiments SSH Sandbox to run a custom Node.js to export flows, like:



async function exportAllFlows() {
  try {
    // Fetch all standard flows
    const standardFlows = await Homey.flow.getFlows();

    // Fetch all advanced flows
    const advancedFlows = await Homey.flow.getAdvancedFlows();

    // Save each flow to individual JSON files
    await fs.writeFile('standardFlows.json', JSON.stringify(standardFlows, null, 2));
    await fs.writeFile('advancedFlows.json', JSON.stringify(advancedFlows, null, 2));

    console.log('Flows exported successfully!');
  } catch (error) {
    console.error('Error exporting flows:', error);
  }
}

// Run the export function
exportAllFlows();

type or paste code here

Peter, Kim, this is the flow export script with PUSH cards added:

/**
 * 
 * Homey Flow Push, Script and Code Filter Utility
 *
 * This script fetches all Homey standard and advanced flows and provides filtered views
 * based on current settings. It supports filtering to list:
 * - Flow cards that run HomeyScript scripts,
 * - Flow cards that run HomeyScript code,
 * - Or show all flow names unfiltered.
 *
 * The filtering mode is controlled by the state in oState (SCRIPT, CODE, or OFF).
 *
 * Key Features:
 * - Retrieve all flows and advanced flows combined.
 * - Filter cards by push, script/code name presence.
 * - Show script card names or excerpt code samples with length limit.
 * - Provides detailed logging of filtered results and flow counts.
 *
 * Variable Naming:
 * Uses short Hungarian notation for improved clarity:
 * - i for integers or counters
 * - a for arrays
 * - o for objects
 * - s for strings
 * - b for booleans
 *
 * Usage:
 * - Set the desired state via `oState.state` in SETTINGS: 
 *    (StateContainer.PUSH, StateContainer.SCRIPT, StateContainer.CODE, StateContainer.OFF).
 * - The script outputs filtered flow data to the Output log.
 *
 * Author: Ruurd
 * Assistance: Perplexity AI Assistant
 * Date: December 2025 - Version 2025-12-02 - improved formatted output
 * 
 */


class StateRecord {
  constructor(value, description) {
    this.value = value;
    this.description = description;
  }
}

class StateContainer {
  static SHOW_OBJ_ID = true;
  static CODE = new StateRecord("CODE", "Show CODE samples");
  static SCRIPT = new StateRecord("SCRIPT", "Show script names");
  static PUSH = new StateRecord("PUSH", "Show Push cards contents");
  static OFF = new StateRecord("OFF", "No filter, show all flow names");
  static OFF_RX = new StateRecord("OFF_RX", "Regex based filter");

  static allStates = [
    StateContainer.CODE,
    StateContainer.SCRIPT,
    StateContainer.PUSH,
    StateContainer.OFF,
    StateContainer.OFF_RX,
  ];
}

await applySettings(StateContainer.PUSH); // Change State here for testing (CODE, SCRIPT, PUSH, OFF, OFF_RX)

let iCounter = 0;
let iCounterFilter = 0;
let iCounterDisabled = 0;
let sAllText = "";

for (const oFlow of aAllFlows) {
  if (!b_ENABLED_ONLY || oFlow.enabled) {
    if (!bFilter) {
      if (oState.state.value === StateContainer.OFF_RX.value) {
        const sResult = (SHOW_OBJ_ID
          ? `{name: '${oFlow.name}'`
          : `${oFlow.name.replace(sFilter, (match) => aReplacements[match] || "")}`
        ) + (SHOW_OBJ_ID ? `, id: '${oFlow.id}'}` : "");
        sAllText += `${sResult}\n`;
        iCounter++;
      } else if (oState.state.value === StateContainer.OFF.value) {
        sAllText += `${oFlow.name}\n`;
        iCounter++;
      }
    }
    if (bFilter && oFlow.cards) {
      const sResult = filter(oFlow.cards, oFlow);
      if (sResult !== null) {
        sAllText += `${sResult}\n`;
        iCounterFilter++;
      }
    }
  } else {
    iCounterDisabled++;
  }
}

const sCounters =
  iCounterFilter === 0
    ? `(Enabled:${iCounter}, Disabled:${iCounterDisabled})`
    : `(Filtered:${iCounterFilter})`;

log(
  `## State: ${JSON.stringify(oState.state)}\n` +
  `## Filter ${b_ENABLED_ONLY ? "Enabled" : ""}: ${bFilter
    ? typeof sFilter === "string"
      ? `"${sFilter}"`
      : sFilter.toString()
    : StateContainer.OFF.value
  }\n` +
  `## allFlows: ${aAllFlows.length} ${sCounters}\n` +
  `## Enabled Flows Only: ${b_ENABLED_ONLY}\n` +
  `## Show as Object: ${SHOW_OBJ_ID} (Show as Object with ID)\n\n` +
  (SHOW_OBJ_ID ? "const aFlows = [\n" : "") +
  sAllText +
  (SHOW_OBJ_ID ? "]\n" : "")
);

return iCounter;

async function applySettings(sStateValue) {
  globalThis.i_CODE_LEN = 20;
  globalThis.b_ENABLED_ONLY = true;
  globalThis.aReplacements = {
    "\\": "_",
    "/": "_",
    ":": "_",
    "*": "_",
    "?": "_",
    '"': "_",
    "<": "_",
    ">": "_",
    "|": "__",
  };

  globalThis.bScriptCard = false;
  globalThis.bFilter = false;
  globalThis.sFilter = "";
  globalThis.SHOW_OBJ_ID = StateContainer.SHOW_OBJ_ID;

  globalThis.oState = {
    state: StateContainer.OFF_RX,
    evaluate() {
      if (sStateValue.value === StateContainer.SCRIPT.value) {
        globalThis.bScriptCard = true;
        globalThis.bFilter = true;
        globalThis.sFilter = "homey:app:com.athom.homeyscript:run";
        return StateContainer.SCRIPT;
      } else if (sStateValue.value === StateContainer.CODE.value) {
        globalThis.bScriptCard = false;
        globalThis.bFilter = true;
        globalThis.sFilter = "homey:app:com.athom.homeyscript:runCode";
        return StateContainer.CODE;
      } else if (sStateValue.value === StateContainer.PUSH.value) {
        globalThis.bScriptCard = false;
        globalThis.bFilter = true;
        globalThis.sFilter = "homey:manager:mobile";
        return StateContainer.PUSH;
      } else if (sStateValue.value === StateContainer.OFF.value) {
        globalThis.bFilter = false;
        globalThis.sFilter = "";
        return StateContainer.OFF;
      } else if (sStateValue.value === StateContainer.OFF_RX.value) {
        globalThis.bFilter = false;
        globalThis.sFilter = new RegExp("[\\\\/:*?\"<>|]", "g");
        return StateContainer.OFF_RX;
      } else {
        console.log("Unknown state");
      }
    },
  };

  globalThis.aStandardFlows = Object.values(await Homey.flow.getFlows());
  globalThis.aAdvancedFlows = Object.values(await Homey.flow.getAdvancedFlows());
  globalThis.aAllFlows = await getAllFlowsRaw();
  globalThis.sSep = `\n-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!\n`;

  oState.state = oState.evaluate();
}

async function getAllFlowsRaw() {
  // Combine standard and advanced flows, remove duplicates by id
  const map = new Map();
  aStandardFlows.forEach((flow) => map.set(flow.id, flow));
  aAdvancedFlows.forEach((flow) => map.set(flow.id, flow));
  return Array.from(map.values());
}

function filter(oCards, oFlow = {}) {
  const aFilteredEntries = Object.entries(oCards).filter(([sKey, oCard]) => {
    if (oState.state.value === StateContainer.SCRIPT.value) {
      return oCard.id && oCard.id.includes(sFilter) && oCard.args?.script?.name;
    } else if (oState.state.value === StateContainer.CODE.value) {
      return oCard.id && oCard.id.includes(sFilter);
    }
    else if (oState.state.value === StateContainer.PUSH.value) {
      const allowlist = ["homey:manager:mobile", "homey:manager:mobile:push_text"]; // mobile push notifications
      const blocklist = [
        "homey:manager:cron", // cron scheduling
        "homey:manager:date", // calendar/date selection
        "homey:manager:logic", // logic group cards
        "homey:manager:time", // time related cards
        "homey:manager:system", // system internal cards
        "homey:manager:schedule", // scheduling cards
        "homey:manager:event", // event trigger cards
        "homey:manager:flow", // flow-related cards
        "homey:manager:energy", // energy monitoring cards
      ];

      const id = oCard.id || "";
      const allowed = allowlist.some((prefix) => id.startsWith(prefix));
      const blocked = blocklist.some((prefix) => id.startsWith(prefix));
      return allowed && !blocked;
    }
    return false;
  });

  const oFilteredCards = aFilteredEntries.reduce((obj, [sKey, oCard]) => {
    obj[sKey] = oCard;
    return obj;
  }, {});

  const iFilteredCount = aFilteredEntries.length;
  let sCardNames = "";
  let sCode = "";
  let sPushContent = "";

  if (oState.state.value === StateContainer.SCRIPT.value) {
    sCardNames = aFilteredEntries
      .map(([_, oCard]) => oCard.args.script.name)
      .join(", ")
      .replace(/, $/, "");
  } else if (oState.state.value === StateContainer.CODE.value) {
    let sCodeSamples = "";
    let iCounter = 0;
    for (const oCard2 of Object.values(oFilteredCards)) {
      //if (oCard2.args?.code) {
      if (oCard2.id?.includes("homey:app:com.athom.homeyscript:runCode") || (oCard2.args?.code)) { //  
        iCounter++;
        sCodeSamples += (`\n#${iCounter} ${oCard2.args.code.substring(0, i_CODE_LEN).replace(/[\r\n]+|\s{2,}/g, ' ')}`)
        // Replace newlines and multiple spaces with single space
      }
    }
    sCode = sCodeSamples !== "" ? sCodeSamples : 'Code not found';
  }
  else if (oState.state.value === StateContainer.PUSH.value) {
    let iCounter = 0;
    let rawText = "";

    // log(Object.values(oFilteredCards).length)
    for (const oCard2 of Object.values(oFilteredCards)) {
      iCounter++;
      if (oCard2.id?.includes("homey:manager:mobile:push_text") || oCard2.uri?.includes("homey:manager:mobile")) { // 
        // This is the push card message
        rawText = oCard2.args?.text || ""; // || oCard2.args?.message 
      }/*
      else
        rawText = `#${iCounter}` + JSON.stringify(oCard2);*/

      const cleanText = rawText
        .replace(/\[\[.*?\]\]/g, '')  // Remove [[...]] tokens
        .replace(/[\r\n]+/g, ' ')     // Replace newlines with space (keep before collapsing spaces)
        // .replace(/\s{2,}/g, ' ')      // Collapse multiple spaces into one
        .replace(/- /g, '')           // Remove "- " sequences
        .replace(/\s{2,}/g, ' ')      // Collapse multiple spaces into one
        .trim();

      sPushContent += `#${iCounter} ${cleanText}\n`;
    }
  }

  if (iFilteredCount > 0) {
    if (oState.state.value === StateContainer.PUSH.value)
      return `${sSep}${oFlow.name}${sSep}${sPushContent.trim()}`;
    else if (oState.state.value === StateContainer.SCRIPT.value)
      return `${sSep}${oFlow.name}${sSep}${iFilteredCount} ->> ${sCardNames}`;
    else return `${sSep}${oFlow.name}${sSep}${sCode.trim()}${sSep}`;
  }
  return null;
}

output example:

-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!
sensTuin
-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!
#1 Het is buiten nu koeler dan binnen!
#2 Het is buiten nu warmer dan binnen!
#3 Het is voor nu warmer dan in de studio!
#4 Het is voor nu koeler dan in de studio!
#5 De buitentemperatuur is nu < 0℃, zet warmtepomp SPAARSTAND LAGER. (niveau 2 of 1)

-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!
Storing
-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!
#1 WP Buiten is offline.
#2 WP Binnen is offline.
#3 :: Ecoflow online: werd weer ingeschakeld.
#4 :: KruipQlima online: werd weer ingeschakeld.
#5 Storing Net@EcoHW OFFLINE zie: sInterim ; bInterim
#6 Storing Net@KruipQ OFFLINE zie: sInterim ; bInterim
#7 Storing Net@Ecoflow OFFLINE zie: sInterim ; bInterim
#8 Storing Net@Ecoflow OFFLINE zie: sInterim ; bInterim

I see. No Pro 2023 yet :man_shrugging::winking_face_with_tongue:

The project is under development (specially to add the get and replace varibles that are used in a push notification),.
Next to my 2023 I use a 2019, so testing can be done.
The script runs fine on Pro 2019 (here).

output for my 2019:

State: {“value”:“PUSH”,“description”:“Show Push notification cards contents”}

Filter Enabled: “homey:manager:mobile”

allFlows: 56 (Filtered:6)

Enabled Flows Only: true

Show as Object: true (Show as Object with ID)

const aFlows = [

-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!
triggerGordijnenZ
-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!
#1 date time : GordijnOpen = UITGEZET Nu: iGordijnPositie: ba5f62b2-7184-434e-84fe-7ae8eda46f03 bGordijnenOpen: fcdeede8-c355-4214-b834-d868da2b7c00 - date
#2 date time : GordijnClose = UITGEZET Nu: iGordijnPositie: ba5f62b2-7184-434e-84fe-7ae8eda46f03 bGordijnenOpen: fcdeede8-c355-4214-b834-d868da2b7c00 - date

-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!
AlarmNachtCheck
-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!
#1 date time ERROR Timers/AlarmNachtCheck GordijnOpen en/of GrordijnClose was niet uit. - date

-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!
triggerPRO2023
-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!
#1 date time triggerPRO2023 - date

-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!
receiveSens
-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!
#1 testHomesh - testHomesh

-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!
DiogenesD Aangezet
-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!
#1 DiogenesD werd naar dda8f647-f9f6-4bf8-b757-b9a8085de3c2 gedimd. - DiogenesD

-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!
triggerLampenZ
-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!
#1 TolomeoS :boolean1 - TolomeoS
#2 TolomeoR :boolean1 - TolomeoR
#3 DiogenesD :boolean1 - DiogenesD
]

Thank you, I tried it and it found my notifications but not the one with just “Homey”.