Easy-to-manage touch screens
Free, open-source touch screens. Guided USB setup, a drag-and-drop editor and local control. Made for Home Assistant.
翻訳待ち
Loading the full README. The saved excerpt is shown below.
Ugentlige madplaner bygget ud fra de varer, der faktisk er på tilbud i danske supermarkeder – med prishistorik, så man kan se om et "tilbud" er et tilbud, og notifikationer på de varer, man selv køber tit. Kæderne udgiver ikke deres aviser på samme ugedag, så opgaven kører dagligt frem for ugentligt. Kørslen er idempotent – kun tilbud, databasen ikke har set før, indsættes – så en ekstra kørsel koster ingenting. Den henter tilbud, opdaterer butiksregisteret én gang om ugen, kører dine overvågninger og skriver et resumé til logs/update.log.Read the full README ↗
Ugentlige madplaner bygget ud fra de varer, der faktisk er på tilbud i danske supermarkeder – med prishistorik, så man kan se om et "tilbud" er et tilbud, og notifikationer på de varer, man selv køber tit.
npm install
npm run ingest # henter denne uges tilbudsaviser (~1 min)
npm run recipes # henter opskrifter (~20 min, kun første gang)
npm start # http://localhost:3000
npm run schedule # opretter en daglig Windows-opgave kl. 07:00
npm run schedule:status # se sidste/næste kørsel og seneste loglinjer
npm run schedule:remove # fjern den igen
Kæderne udgiver ikke deres aviser på samme ugedag, så opgaven kører dagligt
frem for ugentligt. Kørslen er idempotent – kun tilbud, databasen ikke har set
før, indsættes – så en ekstra kørsel koster ingenting. Den henter tilbud,
opdaterer butiksregisteret én gang om ugen, kører dine overvågninger og
skriver et resumé til logs/update.log.
Uden planlagt opgave er npm run update den samme rutine kørt i hånden.
npm run android:sync # byg config.js og kopiér public/ ind i projektet
npm run android:apk # debug-APK
Capacitor pakker public/ ind i en APK – samme kode som websiden, ingen
bundler, ingen omskrivning. Det, der kommer med, er dét, en fane ikke kan:
rigtige notifikationer. Overvågningerne er hele tiden blevet evalueret
hver nat; det, der manglede, var at levere dem, så man opdager tilbuddet
mens det gælder og ikke ugen efter.
Se ANDROID.md for opsætning, push og Play Store.
Vercel (frontend) + Supabase (data) + GitHub Actions (den daglige kørsel). Se DEPLOY.md for opsætningen.
Kort fortalt: den tunge beregning bliver i GitHub Actions mod en lokal SQLite-fil, fordi opslagene mod en fjern database ville tage op mod et minut. Supabase modtager færdige resultater, så frontenden laver rene SELECTs.
Madplanen er den ene undtagelse, og med vilje. Den afhænger af brugerens
favoritbutikker, og dem findes der 32.767 kombinationer af – de kan ikke
forudberegnes. Actions bygger derfor de to små opslagstabeller, planen består
af (offer_index: ~550 rækker, recipe_index: ~2.100), og public/engine.js
sætter planen sammen i browseren. Samme fil kører begge steder, så en plan
bygget lokalt og en bygget i skyen er den samme plan – det er der en test på.
Madplan i tre spor – sund & proteinrig (lavt kulhydrat), klassisk, gourmet. Syv retter, hvor rettens hovedråvare er på tilbud i de butikker, du selv handler i. Hver ret linker til opskriften hos kilden, og der følger en indkøbsliste med, grupperet efter butik.
Mine butikker. Man vælger de kæder, der ligger i nærheden – har man Rema og Netto, bygges planen kun af deres tilbud. Uden det valg er en madplan ikke en indkøbsliste, men en køretur: femten kæder på tværs af landet er ikke et sted, man handler. Valget gælder også "Ugens fund" og "Alle tilbud".
Planen varierer fra uge til uge: retter fra de seneste fire ugers planer trykkes ned i rangeringen, og "Ny plan" omroker feltet, så man ikke får de samme syv retter igen. Sund-sporet vægter både højt protein og få kulhydrater – protein alene ville lukke pasta bolognese ind.
Prishistorik pr. varetype målt i kr/kg – ikke i stykpris. Det er dét, der gør det muligt at svare på, om 35 kr for hakket oksekød er billigt. Hver ret vare får en vurdering: rigtig god pris, god pris, normal pris eller dyrere end normalt.
Følg varer – skriv fx skyr, og appen holder øje med den i alle kæder.
Notifikationer kan begrænses til en mindste rabat og en maksimal afstand til
nærmeste butik.
squid-api.tjek.com leverer struktureret tilbudsdata for 15 dagligvarekæder:
Netto, føtex, REMA 1000, Bilka, Lidl, SuperBrugsen, Kvickly, MENY, SPAR,
365discount, Brugsen, Min Købmand, ABC Lavpris, LET-KØB og Salling.
Vigtigt er quantity.unit.si.factor sammen med size: 33 cl × 0,01 = 0,33 l,
og 3 kr / 0,33 l = 9,09 kr/l – præcis det tal, avisen selv trykker.
Enhedsprisen er altså regnestykke, ikke gætværk.
API'et giver også førpris, gyldighedsperiode, sidetal, produktbillede og butikssøgning på koordinater (2.700 butikker med position).
| Kilde | Sprog | Format | Rolle |
|---|---|---|---|
| Valdemarsro | da | microdata | dansk hverdagsmad |
| Arla | da | JSON-LD | dansk, med næringsdeklaration |
| BBC Good Food | en | JSON-LD | bredt udvalg + fulde makroer |
| Great British Chefs | en | JSON-LD | restaurantkokke → gourmet-sporet |
Alle fire udstiller struktureret opskriftsdata (schema.org) og tillader crawl
af opskriftsstier i deres robots.txt. Crawleren kører ~1 kald/sekund.
Vi gemmer fakta – titel, ingrediensliste, næringsindhold, billede og link – og henter ikke fremgangsmåden. Brugeren sendes til kilden for selve opskriften. Ingrediensmængder er dét, matchningen har brug for; metodeteksten tilhører udgiveren.
Tjek API ──► normalisering ──► varetype ──► prishistorik ──┐
(kr/kg) (taksonomi) ├──► madplan
▲ │
opskriftssider ──► ingredienser ────┘ indkøbsliste
(da + en) notifikationer
src/lib/taxonomy.js er en dansk fødevare-taksonomi med danske og engelske
synonymer. Den løser tre problemer på én gang:
This is the beginning of the README. Read the rest at the original. Read the full README ↗