Homey Community Forum

Homey ZEG en een limiet van 255 karakters

Ik heb een flow die een nieuws bericht voorleest. Nu blijkt dat zodra er meer dan 255 karakters in het bericht staan, dat Homey niks zegt. Is er een workaround, bijvoorbeeld door het stuk tekst (staat in een variabele) op te delen in woorden tot een lengte van max. 255 karakters? Of nog beter: kan ik Homey instellen op meer voor te lezen tekst ?

Twee teksten na elkaar laten lezen, de tweede met een vertraging starten.
zover ik weet kun je nergens de max. lengte instellen.

Een andere optie is misschien een bericht Casten?

Bedankt voor je snelle antwoord.
Met vaste tekst is dit goed mogelijk , maar de tekst staat in een variabele. Ik ken geen standaard functionaliteit om een variabele op te delen in stukken met hele woorden tot max 255 karakters.

Een bericht casten : geen idee of dat kan. Wie verzorgt dan de Text-to-speech functionaliteit?

Text-to-speech is een Homey-App voor Google-Home apparaten, maar die zal waarschijnlijk de zelfde beperkingen hebben.
Maar zoek eens op Cast op dit forum, ideeën genoeg denk ik.image

Ik heb het op kunnen lossen met Homey Script, waarin de tekst wordt opgedeeld in kleinere delen. Dat script kan ik aanroepen met de voor te lezen tekst als tag. Voor diegene die tegen hetzelfde probleem aanlopen, deel ik graag mijn opgedane kennis. Onderstaand het script. Daarnaast moet je de app HomeyScript installeren, en het script maak je online in homeyscript.homey.app . Succes!

// Narrator script
// Workaround script for Homey limitation only saying max 255 character strings
// Script returns number of spoken sentences.
// Author : Heronimus@community.Homey
// Date   : 2020.05.02
// Version: 0.1

var narratortext = args[0];
var sentence = "";
var sentencepart = "";  
var loopcount1 = 0;
var loopcount2 = 0;

// delete unwanted characters in narratortext which give unwanted results
// () remove thousand seperators in text
narratortext=narratortext.replace(/(\d+)\.(?=\d{3}(\D|$))/g, "$1");
narratortext=narratortext.replace(/(\d+),(?=\d{3}(\D|$))/g, "$1");

// () remove hyperlinks in narratortext
narratortext=narratortext.replace(/https?\:\/\//gi, "");

// () replace double or triple ... with one . and .{space}. with .
narratortext=narratortext.replace(/\ \./g, "");
narratortext=narratortext.replace(/\.\.\.?/g, ".");

while (narratortext.length > 0 && loopcount1 <= 50) {
    // endless loop protection 
    loopcount1++;
    // take a sentence from narratortext
    if (narratortext.indexOf(".") != -1) {
        sentence = narratortext.slice(0,narratortext.indexOf(".")+1);
    } else {
        // narratortext doesn't have a . => take the whole text
        sentence = narratortext;
    }
    // shorten narratortext for the next loop
    narratortext = narratortext.slice(sentence.length);

    if (sentence.length <= 255) {
        // sentence is small enough to be spoken in 1 say cycle
        say(sentence);
    } else {
        // sentence is longer then max. Split it up in multiple parts
        while (sentence.length > 0 && loopcount2 <= 50) {
            // endless loop protection
            loopcount2++;
            // take first 200 characters but don't break last word
            sentencepart = sentence.replace(/^(.{200}[^\s]*).*/, "$1")
            // cuttoff if last word was more than 54 characters
            sentencepart = sentencepart.slice(0,254);
            // shorten sentence for the next loop
            sentence = sentence.slice(sentencepart.length+1);             
            say(sentencepart);
        }
    }
}

return loopcount1
2 Likes