neděle 22. března 2015

Daně a smrt, nejlépe elektronicky

Jak říkává Joe Black, daně a smrt jsou jediné dvě jistoty, které v tom našem postdemokratickém světě máme. A jelikož tu první jistotu musím kvůli mé samostatně výdělečné činnosti řešit mnohem častěji než tu druhou, snažím se maximálně si to ulehčit. Proto jsem loni poprvé všechny tři březnové daně (z příjmu, sociální a zdravotní) vyřešil jak nejvíc elektronicky to šlo. Letos jsem to zkoušel znovu a opět jsem narazil na ty samé problémy co loni, které jsem ale za ten rok zapomněl! Tudíž jsem si tím marastem musel znovu projít jako by to bylo poprvé. No a abych si příští rok zase netrhal vlasy, raději si to už sem zdokumentuju.

Samotná daň z příjmu jde online pořešit překvapivě dobře. Daňový portál na webu Ministerstva financí funguje výborně - tedy hned poté, co člověk projde přes následující znalostní test z oblasti počítačové a Internetové bezpečnosti:

web českého ministerstva není důvěryhodný pro americký prohlížeč, protože soudruzi udělali někde chybu...

Po odhalení tajného tlačítka "pokračovat na nespolehlivý web" v "rozšířených nastaveních" se dá prokliknout na další stránku, kde si portál otestuje prohlížeč a systém a s potěšením oznámí, že v 64bitovém Ubuntu s Google Chrome budu mít možnost "Komfortní práce se službami daňového portálu" a také mám povoleno "Vyplnění inteligentních elektronických formulářů EPO2". Ještě před pár lety mělo ministerstvo jen EPO1, což jsou smrtící potvory pouze pro MS-Windows a Internet Exploder vyžadující instalaci nějakého binárního bazmeku, ale EPO2 už je čistá HTML aplikace a funguje multiplatformně a výtečně.

Na portálu člověk rychle v sekci "Elektronické formuláře" najde "Daň z příjmů fyzických osob - od roku 2013 včetně (EPO2)". Tam si pak může pustit skvělého průvodce, který se inteligentně ptá většinou jen na to skutečně potřebné a šikovně skrývá všechen ten kontextově nepotřebný balast. Když si člověk nevede žádné účetnictví a z daňové evidence si zapíše jen jedno číslo celkových ročních příjmů, je vyplnění celého přiznání jednodušší než když Vlastík Tlustý před volbami mával v TV korespondenčním lístkem a sliboval daňové přiznání na formulář velikosti A6.

Na závěr je možné si nechat celý vyplněný formulář zkontrolovat - tato funkce také funguje na jedničku. Dále je tam možnost tisku, která v PDF nasimuluje klasický růžový formulář se všemi stránkami pečlivě strojově vyplněnými. To bych ale musel zanést ten vytištěný formulář na podatelnu finančního úřadu, což by bylo zbytečně pomalé a pracné. Proto volím jinou možnost na daňovém portálu nově dostupnou - elektronické podání!

Po stisku tlačítka "Odeslání písemnosti" mám sice opticky na výběr ze tří možností, ale pokud člověk nechce přistoupit na další státní vydírání, ať už v podobě datových schránek, anebo v podobě kupování předražených státních certifikátů od oligopolu firem, které je poskytují, musí nutně zvolit možnost "Nepodepisovat". Písemnost se tak sice na ministerstvo odešle, ale stejně je nutné vytisknout si v dalším kroku potvrzení o tom, že jsem to fakt podal a utíkat s tím papírkem na podatelnu finančního úřadu, jinak je elektronické podání neplatné. To jsem na to vyzrál, co? ;-)

Další kladné body autorům EPO2 připisuji za možnost kdykoliv si celý formulář včetně všech příloh uložit do XML souboru a tento později znovu načíst do EPO2 a pokračovat v editaci. No a po podání je dobré uložit si jakési potvrzení (soubor typu p7s), díky kterému je možné sledovat průběh zpracování daňového přiznání.


Druhý krok je sociální daň, ze které žijí dnešní důchodci (ano, nejde o spoření na vlastní důchod, státní důchody jsou totiž typické "letadlo"), taky se z ní platí lidi bez práce (práce není a ani nebude protože robotizace), rodiče s dětmi na rodičovské dovolené (buďme rádi, že můžeme být doma s dětmi až 4 roky - v USA jen tři měsíce!), též živobytí mimořádně "přizpůsobivých" spoluobčanů a kdo ví co ještě. Proto hbitě naskočím na správné tiskopisy a vybírám si mezi "eTiskopisem" a běžným formulářem v PDF.  "eTiskopis" vyžaduje instalaci binárního smetí jménem Form Filler. Přestože mi pohrobek 602. základní organizace Svazarmu nabízí 37 MB blob i pro moje 64bitové Ubuntu pod názvem "archivní produkt" (he, to zní jako víno), zdravě paranoidně to odmítám a vydávám se cestou snad menšího odporu, tedy PDF formuláře.

Ten PDF formulář (OSVC_2014_v3.pdf) bohužel nejde v Evince vyplnit - možná je to jen dokument bez formulářových políček, nevím. Tak hledám dál něco interaktivnějšího, co by mě nenutilo vyplňovat kolonky rukou. Najdu tak úplně nový web jménem "ePortál", na kterém jsou sice interaktivní formuláře, ale bohužel vyžadují instalaci dalšího, ještě většího blobu:


Milou Javu si do Google Chrome nenainstaluji, protože dodavatel Javy trvá na starém API, zatímco dodavatel prohlížeče iniciativně vyvinul nové API a staré zahodil. Mohl bych udělat úkrok stranou, pustit Mozilla Firefox a Javu si nainstalovat, ale vzhledem k tomu, jaká díra do systému se Javou v prohlížeči otevírá, zvolil jsem vzdálené přihlášení na Windows stroj do kanceláře, kde Javu musím mít kvůli práci, a formulář vyplnil bez problémů tam. Dobré je, že formulář (resp. ten Java applet) opět napomáhá se správným vyplněním, přeskakuje položky, které nejsou potřeba a na konci umožní zkontrolovat, je-li vše vyplněno OK. A samotná funkce "Tisk" vygeneruje vyplněné PDF, které jsem si mohl pohodlně přetáhnout ze vzdáleného počítače k sobě a doma v klidu vytisknout.


Poslední z daní je zdravotní (je to tak, je to daň, protože je povinná - skutečné zdravotní pojištění by bylo dobrovolné). Jsem pořád u defaultní zdravotní pojišťovny s kódem 111, jejíž portfolio zahrnuje především děti a jiné nepříliš přispívající jedince, takže mě hřeje dobrý pocit, že z mých peněz někomu zafinancuju třeba novou přilbu na kolo či masáže. Protonovou léčbu asi ne, s tím bude asi konec. Takže šupky dupky na web pro plátce a hned mi nabízí správný formulář pro OSVČ. Skvěle! Kliknu tedy na "Tiskopis pro rok 2014" odkazující na http://www.vzp.cz/uploads/document/tiskopis-za-rok-2014.pdf a hledím na následující stránku:


Říkají "prosím čekejte", tak čekám jak trotl a pořád nic. Vracím se na předchozí stránku a nacházím tam následující návod: "Pokud se vám po kliknutí na odkaz tiskopisu zobrazuje chyba, stáhněte si tiskopis na disk vašeho počítače (pravým tlačítkem myši příkaz "Uložit odkaz jako...")". No jasně, takže nejsem jediný, komu ten klíčový formulář nejde stáhnout. Tak na něj klikám pravou myší a stahuji PDF na můj disk. Pak na něj dvakrát kliknu, aby se otevřel v systémovém prohlížeči Evince a co nevidím:


Pokud tomu dobře rozumím, tak má VZP na svém webu poškozený PDF, nebo PDF obsahující tady tu Please wait stránku místo skutečného formuláře? WTF? Tak jsem jim  bleskově napsal nevybíravý mail. Hned po jeho odeslání, kdy už to nejde vrátit, jsem dostal klasické Déjà vu - totéž se přece dělo loni, a taky jsem jim napsal,  že jsou úplní mantáci, když nemají na webu funkční formulář! A oni mi ho pak s omluvou poslali mailem... a ani ten stále nešel otevřít.

Abych vyloučil neblahý vliv svobodného operačního systému na toto kruté PDF, přihlásil jsem se opět vzdáleně na Windowsový stroj v kanceláři a zkusil to PDF otevřít tam. Stále ani ťuk, stejná stránka Please wait bla bla bla. No, zkrátím tuhle smutnou story - nakonec mi nezbylo než si dočíst tu PDF stránku s error hláškou až do konce - a oni tam píší, že musím mít Adobe Reader! Proboha na co? Vždyť produkty Adobe jsou dnes největší díry do systémů, kudy denně proudí malware desítkami známých a přesto neopravených chyb! Jen blázen by měl něco podobného na počítači.

No ale daně jsou daně, těm člověk neunikne, takže nakonec otevírám to dokumentem doporučené URL adobe.com/go/, kde se ale dovídám, že můj operační systém má smůlu (nebo spíš štěstí, jak se to vezme) a produkt Reader pro něj firma Adobe nenabízí. Takže znovu vzdáleně do kanceláře, zavirovat si dobrovolně pracovní stroj s Windows instalací Adobe Readeru a konečně otevřít to 53 kB PDF. Kupodivu je v tom souboru skutečně ukrytý i ten formulář pro VZP, ne jen ta pitomá chybová Please wait stránka. To jsem teda ještě s PDF nezažil.

Po vyplnění formuláře nastává další nečekaný zádrhel. Tisk z Adobe Readeru je sice v pohodě možný, ale vzhledem k tomu, že sedím doma a formulář jsem vyplnil v práci, tak to můžu vytisknout akorát tak v práci. No jo, ale já ten papír potřebuji doma... Vyplněné PDF je pořád prokleté, tj. stále nejde otevřít v jiném prohlížeči. Musím ho vytisknout na Windows chtě-nechtě. Takže nebudu tisknout na papír, ale vytisknu to přes virtuální tiskárnu do souboru, ten si přenesu domů a doma vytisknu na papír. OK.

Windows 8.1 ve výchozím stavu nabízejí tisk do "Microsoft XPS Document Writer". Na disku vznikne soubor s koncovkou .oxps, ale jak ho na Ubuntu otevřít? Studoval jsem nějakou dobu, co to ten XPS je, dokonce jsem si kvůli němu nainstaloval do mého systému jakýsi xpstopdf, ale výsledkem bylo jen binární smetí. On je ten XPS sice ECMA standard, ale asi vznikl podobně jako jiné podobné microsoftí "open standardy", takže je k ničemu. Musím jít jinou cestou a vytisknout ho ještě na Windows do PDF, které si teprve přenesu domů.

Google poradil, že nejlepší pro tisk ve Windows do PDF je CutePDF writer. Nainstaloval jsem ho tedy do Windows v práci a vytiskl - prázdnou stránku! Tak to je konec. Teď jsem sice mohl ještě nějakou dobu hledat další virtuální PDF drivery do Windows, ale protože jsem se s těmi daněmi mořil už pátou hodinu (!), nakonec jsem vyměkl a všechny své supercitlivé osobní údaje včetně ročního výdělku, adresy, rodného čísla a dalších klíčových údajů odeslal zoufale do Anglie do následující online webové služby: https://xps2pdf.co.uk/, kterou mi doporučil Google. Odtamtud mi obratem přijelo korektní PDF, které už jsem si doma konečně vytiskl jako normální člověk... A teď jen zapomenout, co jsem to udělal, a nepřemýšlet, jak s mými soukromými údaji v Anglii naloží.

Za tohle peklo s formulářem si VZP zaslouží 666 palců dolů. Napsal jsem jim další mail, který si nedají za rámeček. Pro vyplňování formulářů přece není nutné takto sviňsky vynucovat Adobe Reader - PDF formuláře umí pohodlně vyplňovat i Evince a další normální PDF prohlížeče...

Můj závěr z elektronického zpracování a podání daní na Ubuntu bez uzavřených děravých programů třetích stran? Daňový portál Ministerstva financí - jednička s hvězdičkou! Kdybych měl datovou schránku (dobrý sluha, ale zlý pán) nebo tzv. Kvalifikovaný certifikát (dle mého názoru předražený, když ho potřebuju jen 1x za dobu jeho platnosti), celé přiznání včetně jeho podepsání a elektronického podání bych v pohodě udělal za pár minut z tepla domova!

Sociálka - jedna mínus. Nabízí pro můj operační systém jak případný Form Filler, tak ani Javový applet není nikterak nedostupný (stačí použít Firefox). Je jen moje paranoidní volba, že jsem si ani jedno nechtěl nainstalovat a raději použil jiný počítač, shodou okolností s Windows. Šlo by to klidně i pod virtualizovaným Ubuntu, kdybych chtěl ty nedůvěryhodné programy udržet v sandboxu, ale co uživatelé tabletů, phabletů či Chrome booků? Vyžadovat instalaci čehokoliv do HTML5 prohlížeče či dokonce operačního systému je v roce 2015 docela ostuda - EPO2 ukazuje, že to jde i bez doplňků jen v čistém prohlížeči.
I u České správy sociálního zabezpečení je (podobně jako u Portálu Ministerstva financí) pravděpodobné, že s kvalifikovaným certifikátem bych mohl odeslat ten vyplněný formulář elektronicky pohodlně přímo z domova. Opět jen moje volba, že se raději projdu městem a jednou za rok tu paní, co mě má na sociálce na starosti, pozdravím. Vždycky si při tom uvědomím, že to, co jsem vyplnil do formuláře doma je zbytečná práce, protože rozhodují čísla, co jí v sekundě spočítá její systém. My to musíme vyplňovat a nosit tam vlastně jen proto, abychom potvrdili náš poddaný vztah pohůnků k státní vrchnosti.

Ale VZP, to je každopádně kalamita. Zmršený formulář v PDF, který trvá na Adobe Acrobat Readeru a v jiných zobrazuje zlou hlášku, je zásadní překážka. Do Ubuntu se sice dá Reader nainstalovat, ale z principu trvám na tom, že PDF nemá být vázán na jeden konkrétní program a má jít zpracovat v kterémkoliv z lepších PDF prohlížečů, které nejsou děravé jako cedník od Adobe. Přestože to většině lidí s Adobe Readerem nainstalovaným někdy z minula kvůli něčemu jinému bude fungovat naprosto bez problémů, ode mě má VZP za tři až čtyři, protože to PDF je rozhodně nějak poškozené, upozorňoval jsem je na to už před rokem a dodnes to nenapravili. Dokonce ani nenabízejí čistý formulář pro vyplnění propiskou, když je někdo zoufalý bez Adobe. Možnost elektronického podání jsem na VZP už ani nehledal, ale nevylučuji, že s kvalifikovaným certifikátem či datovou schránkou to jde. Nevím. Měl jsem dost i tak - z těch pěti hodin strávených touto akcí připadají více než 3 hodiny jen na vrub VZP!

Předpokládám, že příští rok už budu vědět, kde číhají nástrahy a proběhnu tím minovým polem nikoliv za odpoledne, ale za půl hodiny. Následná procházka rozkvétajícím jarním městem bez kvalifikovaného certifikátu a osobní roznos vytištěných formulářů po úřadech je taková milá třešnička, která mi připomíná, jak před volbami vždycky politici slibují Jednotná inkasní místa a podobné věci, ale nakonec vždy obíhá ovčan, nikoliv lejstro :-)

EDIT: tak jsem se s tím známkováním asi dost sekl - teď mi +Ctirad Feřtr ukázal jakousi webovou aplikaci, proti které ty formuláře výše popsané zblednou závistí a zalezou pod nejbližší kámen.

středa 18. března 2015

Tasker - "multitasking" na Arduinu

Poměrně rychle jsem přijal programovací styl navrhovaný Arduino IDE, tj. dvě hlavní funkce - setup() a loop(). Do setup() dám inicializační věci a do loop() dám samotné jádro programu, které provádí nějakou periodickou činnost. Dokud jde jen o jednu činnost, například blikání LEDkou v sekundovém rytmu, je to jednoduché: rozsvítím LED, počkám půl sekundy díky volání funkce delay(500), zhasnu, počkám další půlsekundu dík dalšímu volání delay(500) a je to:

void loop() {
    digitalWrite(13, HIGH);
    delay(500);
    digitalWrite(13, LOW);
    delay(500);
}

Bezva, ale co když potřebuji vykonávat činnosti dvě a navíc různé? Třeba během blikání LED chci ještě číst teploty z čidel. Anebo kreslit na displej. Anebo odpovídat na požadavky web klientů. Anebo tisíc jiných věcí. Co pak? Jak během delay(), kdy program stojí a čeká, vykonávat jinou činnost?

Když jsem pracoval na řídicím programu pro můj vytuněný domácí termostat, docela mě zarazilo, kolik chvílemi až protichůdných požadavků musí zvládat vyřizovat v podstatě naráz:
  • měřit teploty z obou větví digitálních čidel DS18B20, třeba jednou za tři sekundy
  • měřit teplotu a vlhkost z čidla DHT11, nesmí častěji než jednou za sekundu
  • podle teplot a dalších údajů spínat kotel, stačí jednou za pět sekund
  • řídit podsvícení displeje, to je potřeba nejméně dvakrát za sekundu
  • kontrolovat, jestli se někdo nedotkl displeje, to je potřeba co nejčastěji, aspoň 10x za sekundu
  • překreslovat displej, nejlépe přesně jednou za sekundu, pokud se ho někdo nedotkl, jinak dřív
  • sledovat požadavky na interní webserver, to stačí tak 2-3x za sekundu
  • občas ujistit watchdog, že ještě žiju a nemá mě zresetovat (aspoň jednou za 4 sekundy)
Mimochodem, stejné problémy vyvstanou třeba při řízení robotického auta (což mám se synem taky v řešení) - tam je potřeba číst údaje z různých snímačů (vzdálenosti, světla, rychlosti), poslouchat dálkové ovládání a zároveň neustále řídit motory, do toho sem-tam blikat blinkry, svítit světly, přehrávat hlasy či muziku a podobně.

Na tohle všechno by byl ideální nějaký multitasking/multithreading, ne? Po více než dvaceti letech strávených v multitáskových operačních systémech to k němu člověka tak nějak táhne.  Ono se to všechno sice dá nacpat do té funkce loop(), ale je potřeba u toho moooc přemýšlet a hlavně - nikdy nevolat delay()!

Takže můj termostat měl všechny výše uvedené činnosti napsané za sebou v loop() cyklu jednu za druhou, ale zároveň jsem si musel definovat hromadu proměnných, které si pamatují, kterou z těch výše popsaných událostí jsem kdy zavolal a pak je nutné kontrolovat, jestli už je čas ji zavolat znovu - a pokud ještě není, tak ji nevolat a pokračovat v cyklu dál.

Nemusím vysvětlovat, že zdrojový kód ty dodatečné podmínky a přeskoky docela znepřehledňují. Navíc čtení z digitálních čidel DS18B20 napájených parazitně je potřeba provádět vlastně nadvakrát - nejdřív je nutno požádat o změření teploty, pak počkat 750 milisekund (pro 12bitovou přesnost) a pak teprve přečíst samotné teploty z čidel. To je další komplikace.

A když jsem teď začal znovu rozvíjet ten můj termostat a chtěl jsem tam přidat další funkci, která by na definovaný interval, třeba 30 minut, změnila nějaké nastavení a po uplynutí času ho zase sama vrátila zpět (ano, jde o větrání), uvědomil jsem si, že už to dál nechci takto plácat. A začal jsem hledat nějakou knihovnu, která by toto spouštění úloh v čase řešila za mě.

Poměrně brzy jsem našel celou řadu hotových řešení přímo pro Arduino (či pro nejbližší ATMEL procesory), které všechny slibovaly modré z nebe a světový mír. Vlastně je tu všechny můžu vypsat, ať ušetřím jiným hledačům čas:
No, strávil jsem docela dost času procházením těch existujících řešení, našel v nich chyby v návrhu i implementaci a nakonec jsem se rozhodl: napíšu si vlastní!

Upřímně řečeno, většinou lidi znovuvynalézající kolo nepovažuju za nejmoudřejší, ale v tomto případě jsem si byl docela jistý, že žádné z 11 dostupných řešení nefunguje tak, jak potřebuju, a že tedy bude OK věnovat část mé životní energie na řešení dvanácté, napsané mně na míru. Stanovil jsem si přitom následující zásady:
  1. co nejjednodušší použití (NE C++ třídám, dědičnosti, složitému API, mnoha parametrům)
  2. co nejkratší implementace (aby bylo na první pohled zřejmé, že to funguje správně)
  3. co nejúspornější provoz (malá zabraná jak flash tak RAM paměť)
  4. co nejpružnější a nejmocnější vlastnosti (předávání parametrů do volaných funkcí, ideálně dynamické vytváření úkolů za běhu)
  5. 100% kompatibila s Arduinem (žádný vlastní časovač či přerušení)
  6. a samozřejmě bez chyb přetečení časovače po 49 dnech
Nakonec bylo napsání vlastního řešení rychlejší, než jsem čekal. Výsledný kód implementace se vejde na jednu obrazovku monitoru, pro použití stačí zavolat jednu jedinou funkci s navíc intuitivním jménem i parametry, v RAM zabírá jedna úloha jen 14 bajtů včetně parametru předávaného do volané funkce a dokonce je možné vytvářet další úlohy dynamicky za běhu!

Výsledek jsem nazval Tasker pro Arduino a ihned ho použil v mém termostatu. Špagetový kód z funkce loop() jsem rozdělil na jednotlivé malé funkce a volám je jako samostatné úlohy v jejich pravý čas. Zdrojový kód termostatu se tím krásně pročistil a výsledek funguje díky prioritám implementovaným v Taskeru mnohem lépe, než dříve (například vyhodnocení dotykové vrstvy má teď jednu z nejvyšších priorit, aby reakce na dotyk byla okamžitá - tohle mi dřív trochu zlobilo). Super!

Můj Tasker jsem s radostí uvolnil pro všechny na GitHubu: https://github.com/joysfera/arduino-tasker

Nechci zde opisovat či překládat anglicky psaný manuál viditelný hned na tom URL uvedeném výše, ale pár ukázek elegantního řešení typických problémů s mým Taskerem si neodpustím. Pro začátek obligátní blikání LEDkou - na čtyři řádky a bez delay():

Tasker tasker;
void blik(int) { digitalWrite(13, !digitalRead(13)); }
void setup() { tasker.setInterval(blik, 500); }
void loop() { tasker.loop(); }

A ještě třeba nekompletní ukázka možnosti čtení těch DS18B20 periodicky každé tři sekundy, a to bez jakéhokoliv čekání na cokoliv, postaveném na zřetězení úkolů díky možnosti dynamického přidávání nových úkolů za běhu:

Tasker tasker;
OneWire oneWire(4);
DallasTemperature sensor(&oneWire);
float g_teplota;

void ctiSensor(int) {
    g_teplota = sensor.getTempC(0);
}

void ctiTeplotu(int) {
    sensor.requestTemperatures();
    tasker.setTimeout(ctiSensor, 750);
}

void setup() {
    sensor.begin();
    sensor.setWaitForConversion(false);
    tasker.setInterval(ctiTeplotu, 3000);
    tasker.run();
}

void loop() { }

To mi připomíná, že bych měl vyvézt na GitHub i mé úpravy v knihovně DallasTemperature... Snad někdy brzy.

Lepší ukázka využití Taskeru a kompletní popis API je na URL výše. A samozřejmě nejlepší dokumentací je samotný zdrojový kód, o kterém si troufám tvrdit, že je přehledný a dobře čitelný. Tak si to užijte! :)

EDIT 2017/01/27:
Na přání jsem doplnil klíčový řádek do příkladu se čtením čidel od Dallasu, takže už to nebude blokovat. A víte co? Rovnou jsem tam doplnil i tři další řádky, aby ten program byl celý funkční.
Tento příklad najdete i v mém git repozitáři jako druhý example vedle MultiBlink.

Inteligentní internetový termostat se sítí digitálních teplotních čidel

Pokusy s měřením teplot v síti digitálních teplotních čidel DS18B20 jsem popisoval na jaře 2013 v tomto článku. Tehdy jsem narazil na potíže se stabilitou čtení hodnot z čidel, protože jsem měl síť připojenou přes dva převodníky v sérii (levný čínský USB na RS232 se sotva TTL úrovněmi a z RS232 přes pár nějakých diod a odporů na OneWire), byla napěťově podvyživená, takže parazitní napájení selhávalo a vůbec to bylo celé takové nešikovné.

amatérský převodník z RS232 na OneWire sběrnici
Už tehdy před dvěma lety jsem měl poměrně jasno v tom, že si postavím vlastní digitální termostat, jehož srdcem bude Arduino, tento termostat bude online a budu tak moci řídit teploty nejen v obýváku, ale i kdekoliv ze světa. Zároveň bude mít informace z celé sítě teploměrů po domě i jeho okolí a proto bude schopen mnohem inteligentněji řídit vytápění podlah s tou jejich několikahodinovou setrvačností a nenechá se vykývat občasným přehřátím obýváku díky pasivnímu příjmu spousty energie ze Slunce.

Proto jsem postupně začal nakupovat potřebné součástky. Nejdřív dorazil (už 4. dubna 2013) ethernetový modul pro Arduino s TCP/IP v HW díky čipu Wiznet 5100:


Cestou z daleké Číny mu pošťáci pěkně pokřivili všechny nožičky. Naštěstí nejsou při připojování k Arduino Pro Mini potřeba - stačí zapojit SPI konektor (a ještě teda pin 10):


Ověřil jsem si, že není problém zároveň komunikovat po ethernetu a zároveň něco zobrazovat na displeji z Nokia 5110 (bohužel připojeném na ne-SPI piny, což byl falešný test - viz níže). Nastal čas na další krok - zmenšování, aby termostat nevypadal v obýváku jako krabice od bot přilepená na zdi.


17. dubna dorazil z dálav nový ethernetový převodník, mnohem menší, formátem odpovídající Arduino Pro Mini. Super.


1. května 2013 jsem si pokusně zapojil DS18B20 k Arduinu a nechal vypisovat naměřené hodnoty na displej. Vše v pohodě, žádné převodníky nejsou potřeba. Paráda!


Při pokusech s novým ethernetovým převodníkem jsem zjistil, že má chybu ve svém zapojení, která v podstatě znemožňuje sdílení SPI sběrnice s jiným zařízením (protože pořád drží MISO signál, i když s ním zrovna nikdo nemluví). Jelikož ale potřebuji mít na SPI rozhraní připojený jak Ethernet, tak i displej (kvůli rychlosti vykreslování), musel jsem strašným hackem opravit tu chybu v zapojení - přilepil jsem zezadu na RJ45 konektor CMOS 4011, přeškrábal jsem cestičku na plošném spoji k signálu SEN a s pomocí hradla znegoval signál od CSC (čip select). Popis problému a jeho řešení je v Aplikačních poznámkách k W5100. Jo a přidal jsem na Wiznet maličký chladič, protože se ten čip za provozu skutečně hodně ohřívá. To bylo 18. června.


Pak jsem (1. září) začal pracovat na čidlu na sluneční straně. Jsem asi jeden z mála lidí na světě, který chce měřit teplotu přímo na Slunci a nikoliv ve stínu (popravdě jsem o dalším podobném bláznovi ještě neslyšel). Vyrobil jsem proto vodotěsnou krytku na nevodotěsné čidlo DS18B20, jejímž cílem bylo simulovat pro čidlo podmínky připomínající hodně prosklenou místnost - tj. čidlo mělo přijímat maximum tepelného záření od Slunce, přitom nemělo být na přímém vlivu větru (který by ho moc ochlazoval), ale zároveň nemělo ani být ve vzduchotěsném "skleníku", který by zkresloval (idealizoval) venku panující poměry. Nemaje nic lepšího po ruce, použil jsem plastový obal na vrták i s původní čepičkou. Na fotce je též vidět, že čidlo je skutečně napájeno jen pasivně a navíc má mezi nohama transil, což v mé fantazii chrání síť s čidly proti přepětí, které se venku na tak dlouhém vedení může naindukovat raz-dva.


3. září 2013 už čidlo pěkně visí, přilepené jen průhlednou izolepou, prý voděvzdornou, no uvidíme, jestli to časem neupadne. Spodní část krytky není uzavřená, takže čidlo může volně "dýchat". Doufám, že toto odstraní ten "skleníkový efekt", kterého jsem se mírně obával.


Pak (22. září) byl čas na návrh a výtisk krásné krabičky. Vytvořil jsem pracně dokonalý 3D model v OpenSCADu, který se mi ale těžce nedařilo vytisknout na naší 3D tiskárně. Smršťování ABS při chládnutí roztrhá vysokou krabičku po vrstvách a nazdar.


Na fotce z 4. října je vidět prakticky hotový HW nového termostatu. Je to sendvič, kdy na desce s oboustranným "plošným spojem" je v konektoru zasunutý barevný TFT displej o krásném rozlišení 220 x 176 bodů s dotykovou vrstvou. Displej má dost nešikovně vyvedený ten dvouřadý konektor, jen tak to vlaje na tom tenkém ohebném plošném spoji a čekám, že se to utrhne - ale levnému koni na zuby nehleď... Gumička a pěnová podložka jen dokresluje mou tehdejší bezradnost ohledně řešení mechanické stránky termostatu.


Z druhé strany plošného spoje je vidět, jak jsem posadil Arduino Pro Mini vedle Ethernetového převodníku a nemilosrdně je prodrátoval přes převodník napěťových úrovní CD4050E. Ano, je to řešení poplatné době - tehdy jsem ještě neuměl vyrábět plošné spoje jako to umím dnes.


19. října, prakticky na prahu topné sezóny (naštěstí byl tehdy teplý podzim), jsem narychlo ve sklepě řešil spínání kotle signálem z nového termostatu. Vyrobil jsem tam jakousi krabičku, do které vede z obýváku CAT5 kabel a v krabičce se rozděluje na tři různé svazky: jeden napájí termostat v obýváku zálohovaným napětím ze sklepa, druhý svazek vede signál od termostatu pro sepnutí relé (to je taky v té krabičce), které spustí kotel, a třetí svazek propojuje síť digitálních teplotních čidel s termostatem.


Toto je už finální zapojení termostatu. Vepředu vlevo je MOSFET řídící podsvícení displeje podle úrovně okolního světla, vepředu vpravo je stabilizátor 3,3 V pro napájení ethernetového převodníku. Vpravo vzadu je vestavěné čidlo DHT11 a DS18B20 pro měření teploty a vlhkosti v obýváku. To se bohužel neosvědčilo, protože v krabičce termostatu panují zcela nereálné teplotní a vlhkostní poměry, neboť ten ethernetový převodník opravdu topí a celou krabičku termostatu tak parádně vyhřeje a vysuší. Vzadu jsou pak vidět všechny zapojené kabely - síťový (RJ45 na CAT5) do routeru, plochý kabel, který později ve zdi redukuju na další CAT5 vedoucí do sklepa k výše popsané krabičce, a také dvoulinku k fotorezistoru na snímání úrovně světla v obýváku.


22. října 2013 jsem v obýváku sundal původní termostat (na fotce ještě visí na kablíku) a začal přemýšlet, jak na jeho místo nacpu ten nový termostat se všemi těmi dráty a redukcemi.


Tady je ještě vidět, že jsem si nakonec slušně poradil s tou mechanickou stránkou - vytiskl jsem takové "lože" pro displej, do kterého přesně zapadá, a toto lože jsem přišrouboval díky pacičkám (ze spodní strany) k tomu plošnému spoji konektoru. Tím se to nejenom zpevnilo, ale hlavně to dostalo tvar jednolité desky plošného spoje, kterou jsem poté mohl z boku zasunout do lyžin v krabičce (snad se mi ji jednoho dne povede vytisknout).


25. října 2013 už termostat pevně visí, ale zatím na dočasném místě na parapetu v pracovně. Díky prosíťování celého domu nebyl problém přepojit všechnu kabeláž z obýváku do pracovny a mít tak termostat funkční i tam. Dokonce už mi tam běží software, který jsem mezitím napsal - zobrazuje přesný datum a čas (získaný z Internetu díky NTP), relativní vlhkost 38 % a úroveň okolního osvětlení 394 (z rozsahu 0-1023). Dále jsou tam vidět teploty z obou sítí - levý sloupec je vnitřní (bytová) síť, pravý sloupec je vnější (sklep a venku) síť. Toto rozdělení na dvě sítě vysvětlím později. No a vypisuju si taktéž úroveň napětí, abych viděl, kolik voltů ze sklepa po těch dlouhých CAT5 drátech přijelo, a navíc i uptime, abych viděl, jestli je termostat stabilní a vydrží běžet bez restartů či výtuhů měsíce nebo raději roky.


27. října se mi pořád ještě nedařilo vytisknout krabičku dobře. Je zkroucená a má potrhanou většinu "mostů" těch ventilačních otvorů. Čert aby ten 3D tisk spral! Takové skvělé teoretické možnosti a taková zklamání při praktickém tisku...


29. října 2013 jsem konečně spokojen, krabička je celá a po přelakování acetonem (který zalepí prasklinky) i docela pevná.

No a tady mé fotografie končí. Dá se předpokládat, že ještě koncem října jsem termostat skutečně přišrouboval na správné místo v obýváku, zapojil kabely a úspěšně je nacpal do zdi a celé to začalo fungovat. Finální foto jsem nenašel, ale v historii vývoje software termostatu je vidět, že od 30. října 2013 topí naplno.

Dnes je březen 2015, takže termostat má za sebou dvě úspěšné topné sezóny, a musím říct, že se mimořádně osvědčil. Podle grafů teplot, které celý systém okolo termostatu také generuje, je vidět, že přestalo docházet k přetopení a tedy protopení zbytečného plynu navíc. Také faktury za plyn hovoří jednoznačně. A v bytě je tepleji, teplota tolik nekolísá, řídím to zkrátka tak, jak jsem si roky předtím jen představoval.


Samozřejmě hlavní kouzlo je v software, který je uvnitř termostatu. Nacpal jsem do Arduina hromadu knihoven, abych dokázal obsluhovat všechen ten připojený hardware:
  • OneWire sběrnici a na ní DallasSemiconductors čidla
  • displej s řadičem ILI9225B
  • grafickou knihovnu od Adafruitu pro vykreslování textů a možno i grafiky
  • knihovnu pro dotykovou vrstvu, abych mohl snímat dotyky prstů na obrazovce
  • Ethernetovou knihovnu, abych mohl komunikovat po LAN síti a na Internet
  • DHT11 knihovnu, abych mohl číst teplotu a vlhkost z vnitřního čidla
  • Time knihovnu, abych měl datum a čas, den v týdnu a podobné vymoženosti
  • NTP knihovnu, abych měl přesný čas synchronizovaný přes Internet
  • a možná jsem ještě na něco zapomněl...
Přestože jsem původně počítal s tím, že termostat bude díky tomu, že je neustále plně online, schopen například stahovat a zobrazovat předpověď počasí z ČHMÚ či odjinud, anebo bude podle předpovědi na nejbližší hodiny schopen dokonce topit (wow), nakonec jsem musel ze  svých představ významně slevit. Dokonce se mi ani nepodařilo plně využít krásnou barevnou grafiku displeje pro zobrazení nějakých tlačítek, posuvníků pro nastavování teploty, grafů zobrazujících průběh teplot či otopný program atd. Bohužel, došlo mi místo v paměti Arduina.

Je to tak - ta přemíra knihoven zaplácala přes 80 % z celkové volné kapacity 31 kB flash paměti procesoru ATMEGA328, který je srdcem Arduina Pro Mini. Nejenže mi nezbylo místo na nějaké grafické srandičky, ikonky mráčků, sluníček, šipečky a podobně, ale nemám bohužel ani dost místa na naprogramování aspoň nějakého uživatelského rozhraní či pokročilého ovládání přes Internet. Proto je zatím rozhraní docela spartánské - displej zobrazuje jen čas a čtyři klíčové teploty (plus minima a maxima vnějších teplot za posledních 24 hodin). Podle vnitřních teplot termostat topí, a podle vnějších teplot se oblékáme, když jdeme ven.


Měření teploty na přímém Slunci se velmi osvědčilo - a ani čidlo přilepené izolepou na svodu rýny a vystavené dešti, plném slunečním svitu a mrazu za těch 17 měsíců neodpadlo. Jen jsem ještě neměl čas naprogramovat podle něj topení. Současný algoritmus pracující s průměrem teplot v obou patrech domu funguje dostatečně dobře.

V posledních týdnech jsem po chvilkách obnovil práci na SW termostatu a pokouším se vyšetřit aspoň pár bajtů flash paměti navíc, abych dokázal kromě dvou obrazovek s čísly dát na displej i nějaká tlačítka. Mám představu tlačítka pro větrání ("netop, větráme") a možná i nějakého nouzového topení ("zatop trochu víc, večer bude zima"). Přitom jsem narazil na několik zásadních věcí, které mě přiměly definovat dva úplně nové projekty, na kterých jsem začal ihned pracovat a které popíšu v blogu vzápětí (kódová označení "multitasking" a "pořádný font")...

Každopádně budu chtít vyřešit tu slepou uličku s nedostatkem místa v paměti procesoru. Buďto jsem měl oddělit logiku síťování a topení (backend) od grafického zobrazování a uživatelského vstupu (frontend) a dát tam dvě Arduina (což jsem původně skutečně zvažoval, ale nakonec jsem se na to bůhvíproč vykašlal), anebo prostě musím nasadit procesor s větší pamětí. Přemýšlel jsem nad ATMEGA1284p (který má už podle označení 128 kB flash paměti), ale +Ctirad Feřtr mě upozornil, že cenově mnohem výhodnější je nějaký 32bitový ARM. Takže jsem si za 4 dolary koupil Maple Mini a uvidím, jestli se mi podaří ho rozchodit jak potřebuji. Určitě si zaslouží vlastní článeček, snad někdy brzy.