Script dat willekeurig een tekst selecteert en dit schrijft naar variabele

Ik probeer om een willekeurige tekstregel uit een lijst naar een variabele te schrijven,
ChatGPT is met onderstaande script gekomen,
maar krijg een error:
“TypeError: Homey.flow.setVariable is not a function”

// Voorbeeld HomeyScript
// Dit script selecteert willekeurig een tekstregel uit een lijst en wijst deze toe aan de variabele SlaapTekst

// Lijst met tekstregels
const tekstRegels = [
  "Goede nacht en slaap lekker!",
  "Droom zoet!",
  "Rust goed uit!",
  "Welterusten!",
  "Slaap zacht!"
];

// Selecteer een willekeurige index uit de lijst
const randomIndex = Math.floor(Math.random() * tekstRegels.length);

// Haal de geselecteerde tekstregel op
const geselecteerdeTekst = tekstRegels[randomIndex];

// Wijs de geselecteerde tekstregel toe aan de variabele SlaapTekst
Homey.flow.setVariable('SlaapTekst', geselecteerdeTekst)
  .then(() => console.log('SlaapTekst succesvol bijgewerkt'))
  .catch((err) => console.error('Fout bij het bijwerken van SlaapTekst:', err));

enig idee wat hier niet klopt?

de updateVariable vereist volgens mij een ID, geen naam.

Zelf doe ik dit liever met de Better Logic Library:
Je kunt het direct een variabele zetten:
image

Of een Tag die je in een Homey variabele kan zetten:
image

BLL heeft standaard lodash ingebouwd (net als HomeyScript ook trouwens).
Die bevat de _.sample() functie, die geeft een Random waarde uit een Array terug.
Je kunt dit invoeren in de BLL Expression kaarten:

_.sample([ "Goede nacht en slaap lekker!", "Droom zoet!", "Rust goed uit!", "Welterusten!", "Slaap zacht!" ])

En klaar, dit is alles wat je nodig hebt:

2 Likes

dank je wel @Arie_J_Godschalk , dat werkt in een flow.

Toch ben ik ook benieuwd hoe het in een script zou werken… iemand?

Goed, één moment…

// Lijst met tekstregels
const tekstRegels = [
  "Goede nacht en slaap lekker!",
  "Droom zoet!",
  "Rust goed uit!",
  "Welterusten!",
  "Slaap zacht!"
];

// Selecteer een willekeurige index uit de lijst
const randomIndex = Math.floor(Math.random() * tekstRegels.length);

// Haal de geselecteerde tekstregel op
const geselecteerdeTekst = tekstRegels[randomIndex];

//Zoek de variabele op naam
let variable = _.find(await Homey.logic.getVariables(), x=>x.name=='SlaapTekst');

// Stel de waarde in
variable.value = geselecteerdeTekst;

// Wijs de geselecteerde tekstregel toe aan de variabele SlaapTekst
return await Homey.logic.updateVariable({id:variable.id, variable});

// door await ervoor, zorg je ervoor dat dit script voltooid wordt voordat de flowkaart waarmee je deze uitvoert is afgerond. Na de HS flowkaart is de variabele dus gewijzigd.

top @Arie_J_Godschalk ! dit werkt. dank je wel!

3 Likes

Je kunt, als je dat wil, het nog wel iets compacter maken door gebruik te maken van de lodash functie _.sample().
De code achter _.sample is hetzelfde als je random functie.

// Lijst met tekstregels
const tekstRegels = [
  "Goede nacht en slaap lekker!",
  "Droom zoet!",
  "Rust goed uit!",
  "Welterusten!",
  "Slaap zacht!"
];

//Zoek de variabele op naam
let variable = _.find(await Homey.logic.getVariables(), x=>x.name=='SlaapTekst');

// Stel de waarde in
variable.value = _.sample(tekstRegels);

// Wijs de geselecteerde tekstregel toe aan de variabele SlaapTekst
return await Homey.logic.updateVariable({id:variable.id, variable});

// door await ervoor, zorg je ervoor dat dit script voltooid wordt voordat de flowkaart waarmee je deze uitvoert is afgerond. Na de HS flowkaart is de variabele dus gewijzigd.
2 Likes

[Offtopic]
Van deze voorbeelden leer ik het meest als visueel gericht mens. >>> bookmark

1 Like