Veckans Skolmat

Hej nÄgon som vet om man kan gÄ in skolmaten i flödet?

HallÄ!

Har du redan kollat upp att skolan du vill ha maten ifrÄn finns tillgÀnglig?

Jag tror att det Àr enklast Àr att skapa ett homeyscript för att fÄ in i flöden.

PrimÀrt verkar skolmaten.se, matilda foodtech vara de som Àr vanligast.

HĂ€lsningar,
David

Hej nÄgon som kan hjÀlpa mig med ett script till Homey pro.

har suttit nÄgra timmar med att testa att fÄ igÄng sÄ man fÄr menyn frÄn barnens skola.

Men fÄr ett fel hela tiden nÀr jag testar det.

/* Matilda Platform - Nyköpings Gymnasium */

/* Slutgiltig version: 2026-01-08 */

async function run() {

try {

const cleanUrl = "https://menu.matildaplatform.com/api/v1/meals/week/685427abb1ee448fd5710ce1_gymnasium";



console.log("Anropar: " + cleanUrl);



const response = await fetch(cleanUrl, {

  method: 'GET',

  headers: { 'Accept': 'application/json' }

});



if (!response.ok) throw new Error("HTTP-fel: " + response.status);



const data = await response.json();



// HÀmta lokalt datum i Nyköping (format: 2026-01-08)

const now = new Date();

const todayStr = now.toLocaleDateString('sv-SE'); 

const dayOfWeek = now.getDay(); 



if (dayOfWeek === 0 || dayOfWeek === 6) {

  await tag("DagensSkolmat", "Det Àr helg.");

  return "Helg";

}



// Letar efter dagens datum i menyn

const todayEntry = data.find(item => item.date.startsWith(todayStr));



if (todayEntry && todayEntry.meals) {

  const meals = todayEntry.meals.map(m => m.name).join(". ");

  await tag("DagensSkolmat", meals);

  console.log("SUCCÉ! Dagens mat (" + todayStr + "): " + meals);

  return true;

} else {

  // Fallback: Ta maten baserat pÄ veckodag (MÄn=0)

  const fallbackEntry = data\[dayOfWeek - 1\];

  if (fallbackEntry && fallbackEntry.meals) {

    const meals = fallbackEntry.meals.map(m => m.name).join(". ");

    await tag("DagensSkolmat", meals);

    console.log("SUCCÉ (fallback)! Dagens mat: " + meals);

    return true;

  }

  throw new Error("Ingen mat hittades i datan.");

}

} catch (e) {

console.error("DEBUG-INFO: " + e.message);

await tag("DagensSkolmat", "Kunde inte hÀmta menyn.");

return false;

}

}

return await run();

HallÄ @DagonIVE

Detta script fungerar, har precis testat via homeyscript!

/* Matilda Platform - Nyköpings Gymnasium */

/* Fungerande version: 2026-01-09 */

async function run() {

const url = “https://menu.matildaplatform.com/meals/week/685427abb1ee448fd5710ce1_gymnasium”;

try {

// HĂ€mta HTML-sidan

const response = await fetch(url);

const html = await response.text();

// Extrahera _NEXT_DATA_ JSON

const nextDataMatch = html.match(/]*>([\s\S]*?)<\/script>/);

if (!nextDataMatch) {

throw new Error(“Kunde inte hitta menydata pĂ„ sidan”);

}

const data = JSON.parse(nextDataMatch[1]);

const meals = data.props.pageProps.meals;

if (!meals || meals.length === 0) {

throw new Error(“Ingen menydata hittades”);

}

// HĂ€mta dagens datum (YYYY-MM-DD format)

const now = new Date();

const todayStr = now.toISOString().split(‘T’)[0];

const dayOfWeek = now.getDay();

console.log("Dagens datum:", todayStr);

// Helgkoll (0 = söndag, 6 = lördag)

if (dayOfWeek === 0 || dayOfWeek === 6) {

await tag(“DagensSkolmat”, “Det Ă€r helg - ingen skolmat.”);

  console.log("Det Àr helg.");

return “Helg”;

}

// Hitta dagens mĂ„ltider (filtrera pĂ„ “Dagens”, inte “Tillbehör”)

const todayMeals = meals.filter(meal => {

const mealDate = meal.date.split(‘T’)[0];

return mealDate === todayStr && meal.name === “Dagens”;

});

if (todayMeals.length > 0 && todayMeals[0].courses && todayMeals[0].courses.length > 0) {

// HÀmta alla rÀtter för dagen

const courses = todayMeals[0].courses

    .map(c => c.name)

    .filter(name => name && name.trim() !== "")

    .join(". ");

if (courses) {

await tag(“DagensSkolmat”, courses);

    console.log("✅ Dagens skolmat:", courses);

return true;

  }

}

// Om inget hittas för idag

await tag(“DagensSkolmat”, “Ingen meny tillgĂ€nglig för idag.”);

console.log("Ingen meny hittades för", todayStr);

return false;

} catch (e) {

console.error("FEL:", e.message);

await tag(“DagensSkolmat”, “Kunde inte hĂ€mta menyn.”);

return false;

}

}

return await run();

HĂ€lsningar,
David

Hej

Konstigt jag fÄr fel i mitt HomeyScript.

/* Matilda Platform - Nyköpings Gymnasium */
/* Fungerande version: 2026-01-09 */

async function run() {
  const url = "https://menu.matildaplatform.com/meals/week/685427abb1ee448fd5710ce1_gymnasium";
  
  try {
    const response = await fetch(url);
    const html = await response.text();
    
    const regex = /<script id="__NEXT_DATA__"[^>]*>([\s\S]*?)<\/script>/;
    const nextDataMatch = html.match(regex);
    
    if (!nextDataMatch) {
      throw new Error("Kunde inte hitta menydata pÄ sidan");
    }
    
    const data = JSON.parse(nextDataMatch[1]);
    const meals = data.props.pageProps.meals;
    
    if (!meals || meals.length === 0) {
      throw new Error("Ingen menydata hittades");
    }
    
    const now = new Date();
    const todayStr = now.toISOString().split('T')[0];
    const dayOfWeek = now.getDay();
    
    console.log("Dagens datum:", todayStr);
    
    if (dayOfWeek === 0 || dayOfWeek === 6) {
      await tag("DagensSkolmat", "Det Àr helg - ingen skolmat.");
      return "Helg";
    }
    
    const todayMeals = meals.filter(meal => {
      const mealDate = meal.date.split('T')[0];
      return mealDate === todayStr && meal.name === "Dagens";
    });
    
    if (todayMeals.length > 0 && todayMeals[0].courses && todayMeals[0].courses.length > 0) {
      const courses = todayMeals[0].courses
        .map(c => c.name)
        .filter(name => name && name.trim() !== "")
        .join(". ");
      
      if (courses) {
        await tag("DagensSkolmat", courses);
        console.log("Dagens skolmat:", courses);
        return true;
      }
    }
    
    await tag("DagensSkolmat", "Ingen meny tillgÀnglig för idag.");
    return false;
    
  } catch (e) {
    console.error("FEL:", e.message);
    await tag("DagensSkolmat", "Kunde inte hÀmta menyn.");
    return false;
  }
}

return await run();
/* Matilda Platform - Nyköpings Gymnasium */
/* Fungerande version: 2026-01-09 */

async function run() {
  const url = "https://menu.matildaplatform.com/meals/week/685427abb1ee448fd5710ce1_gymnasium";
  
  try {
    const response = await fetch(url);
    const html = await response.text();
    
    const regex = /<script id="__NEXT_DATA__"[^>]*>([\s\S]*?)<\/script>/;
    const nextDataMatch = html.match(regex);
    
    if (!nextDataMatch) {
      throw new Error("Kunde inte hitta menydata pÄ sidan");
    }
    
    const data = JSON.parse(nextDataMatch[1]);
    const meals = data.props.pageProps.meals;
    
    if (!meals || meals.length === 0) {
      throw new Error("Ingen menydata hittades");
    }
    
    const now = new Date();
    const todayStr = now.toISOString().split('T')[0];
    const dayOfWeek = now.getDay();
    
    console.log("Dagens datum:", todayStr);
    
    if (dayOfWeek === 0 || dayOfWeek === 6) {
      await tag("DagensSkolmat", "Det Àr helg - ingen skolmat.");
      return "Helg";
    }
    
    const todayMeals = meals.filter(meal => {
      const mealDate = meal.date.split('T')[0];
      return mealDate === todayStr && meal.name === "Dagens";
    });
    
    if (todayMeals.length > 0 && todayMeals[0].courses && todayMeals[0].courses.length > 0) {
      const courses = todayMeals[0].courses
        .map(c => c.name)
        .filter(name => name && name.trim() !== "")
        .join(". ");
      
      if (courses) {
        await tag("DagensSkolmat", courses);
        console.log("Dagens skolmat:", courses);
        return true;
      }
    }
    
    await tag("DagensSkolmat", "Ingen meny tillgÀnglig för idag.");
    return false;
    
  } catch (e) {
    console.error("FEL:", e.message);
    await tag("DagensSkolmat", "Kunde inte hÀmta menyn.");
    return false;
  }
}

return await run();

Sorry, jag klistrade in det fel!

Tack :slight_smile: Nu fÄr jag upp dagens mat.

Nu Àr det bara hur man ska bygga ett flow sÄ det fungerar.

Vet du hur man kan göra ett flow sÄ den lÀser upp maten pÄ Google högtalare? Kollat lite men vet inte vad man kan anvÀnda. Har bara hittat dÀr man mÄste skriva in egen text.

Sen Àven om man kan göra nÄgot sÄ man fÄr upp dagens mat pÄ en skÀrm.

Mvh Andreas

@DagonIVE - Enklast Àr nog efter att du sparat homeyscriptet som t.ex. skolmat


Detta flow kör scriptet kl 07.00 varje morgon mÄn-fre.
Du kan sen beroende pÄ vad du Àr ute efter skapa ett flow med en pushnotis:

Har tyvÀrr ingen Google högtalare, men antar att du lagt till Homey via Google Home och dÀrmed kan se högtalare i Homey? i sÄ fall kan du kanske anvÀnda ett script som typ ovan exempel men anvÀnda Googles broadcast, t.ex. Broadcast dagens skolmat Àr: [[DagensSkolmat]] eller till specifik högtalare genom Broadcast to Köket: dagens skolmat Àr [[DagensSkolmat]]

SÀg till om det löser sig :slight_smile:

HĂ€lsningar,
David

Hej

Tackar nu har jag fÄtt allt att fungera med bÄde högtalare och fÄ upp informationen pÄ skÀrmen :grin:

1 Like