Node-RED: 2. zápis dat do Google Tabulky

V předchozí části jsme si vyzkoušeli čtení dat z různých senzorů. Vše jsme zatím pouze vypisovali do konzole, což pro praktické použití nesačí. V tomto článku si ukážeme jak měření získaná Node-REDem ze senzoru TH2E průběžně ukládat do Google Tabulky (Google Sheet).

Nejdřív si vytvoříme Google Formulář, kterému budeme z Node-RED posílat naměřená data. Formulář pro každé přijaté měření vytvoří řádek v Google Tabulce. Data v Google Tabulce jde pak snadno dále zpracovat, vytvořit graf, apod.

Vytvoření Google Formuláře

1. Přihlašte se do svého Google účtu a otevřete si Google Disk.

2. Vytvořte nový formulář pomocí + Přidat > Více > Formuláře Google

Vytvoření nového formuláře na Google Disku

3. Otevře se okno s novým formulářem. V něm si můžete formulář pojmenovat (vlevo nahoře) a přidat nadpis. Hlavně je třeba pojmenovat formulářové pole (např. Teplota) a jako typ údaje vybrat Stručná odpověď, jako je ukázáno na obrázku. Potom klikněte na šipkou označené tlačítko +.

Vytvoření pole Teplota - jako typ hodnoty vyberte Stručná odpověď

4. Tlačítkem + (plus) přidejte podobně pole pro Vlhkost a Rosný bod. Obě typu Stručná odpověď. Potom klikněte na tři tečky vpravo nahoře a vyberte Získat předvyplněný odkaz.

Vytvoření dalších formulářových polí a získání odkazu na formulář

5. Zadejte do formuláře nějaké testovací hodnoty (každou jinou). Poté klikněte na Získat odkaz.

Získání odkazu na Google Formulář

6. Odkaz na formulář je tímto zkopírován do schránky. Vypadá takto:

https://docs.google.com/forms/d/e/1FAIpQLdel9wtddJU1wkWFZFnMvWsthuQmlia5xOCscfYnU9psfcl93w/viewform?usp=pp_url&entry.104545019=10&entry.17785970=20&entry.463752093=15

V textu odkazu jsou tři parametry entry - v nich jsou hodnoty pro tři formulářová pole, která jsme si před chvílí vytvořili. Poznáte je podle jejich hodnot, které jsou shodné s obrázkem výše. Například teplota 10 °C je v odkazu uvedena jako parametr entry.104545019=10.

Poznámka: Dlouhé číselné a řetězcové kódy budou ve Vašem odkazu jiné, protože jsou unikátní pro každý vytvořený formulář. Výše uvedený odkaz je jen příkladem. Příklad je upravený tak, že kódy jsou nefunkční.

7. Odkaz upravte následujícím způsobem:

  • Místo 10 vložte řetězec {{payload.temperature}}
  • Místo 20 vložte {{payload.humidity}} 
  • Místo 15 zadejte {{payload.dewpoint}}
  • Místo viewform vložte formResponse.

Odkaz bude po úpravě vypadat takto:

https://docs.google.com/forms/d/e/1FAIpQLdel9wtddJU1wkWFZFnMvWsthuQmlia5xOCscfYnU9psfcl93w/formResponse?usp=pp_url&entry.104545019={{payload.temperature}}&entry.17785970={{payload.humidity}}&entry.463752093={{payload.dewpoint}}

Odkaz si uložte, budete jej za chvíli potřebovat. Node-RED bude periodicky volat tento odkaz a na místa hodnot ve složených závorkách vloží naměřené údaje.

8. Ještě než se podíváme Node-RED, dokončíme nastavení služeb Google. Ještě je potřeba nastavit kam má Formulář ukládat přijatá data. Klepnutím na symbol tužky vpravo nahoře (na obrázku u bodu 5) se vraťte zpět k editaci formuláře a vyberte záložku Odpovědi. Zde klepněte na zelený symbol Google Tabulek.

Propojení Google Formuláře a Google Tabulky

9. V okně Vybrat cíl pro odpovědi vyberte Vytvořit novou tabulku a pojmenujte ji podle potřeby.

Výběr Google Tabulky pro ukládání hodnot z Node-RED

Nastavení odesílání z Node-RED do formuláře

10. V předchozím díle jsme zkoušeli číst data z TH2E a nyní si tento příklad rozšíříme o periodické čtení a o odesílání měření do Google Tabulky, kterou jsme si před chvílí vytvořili.

11. Ze seznamu nodů v levé části Node-RED vyberte v sekci Function nod pojmenovaný http request. Vložte jej do příkladu čtení TH2E mezi nody Get values a output.

Vložení nodu http request

12. Poklepejte na nově vložený nod a v jeho nastavení zadejte do políčka URL text odkazu, který jste vytvořili v bodě 7.

Nastavení adresy Google Formuláře v Node-RED

13. Aby kvůli každému novému měření nebylo potřeba klikat na úvodní tlačítko, nastavíme periodické měření. Poklepáním otevřete nastavení prvního nodu v řadě (Run!), zaškrtněte Inject once after..., u položky Repeat vyberte Interval a zadejte jak často chcete měřit. V příkladu máme nastavenou periodu 1 min.

14. Pokud chcete do svého Node-RED nahrát rovnou celý příklad, vložte následující kód pomocí Menu > Import > Clipboard. Po vložení nezapomeňte v kódu nodu Google Form upravit podle bodu 12 odkaz na Váš Google Formulář, jinak odesílání nebude fungovat.

[{"id":"c8f801b5.485d08","type":"inject","z":"4fb0c5c4.cb66cc","name":"Run!","topic":"TH2E","payload":"true","payloadType":"bool","repeat":"60","crontab":"","once":true,"onceDelay":"2","x":330,"y":60,"wires":[["c5e248da.75ce6"]]},{"id":"c5e248da.75ce6","type":"http request","z":"4fb0c5c4.cb66cc","name":"GET TH2E","method":"GET","ret":"txt","url":"http://192.168.1.123/fresh.xml","tls":"","x":490,"y":60,"wires":[["17f1c701.9e7479"]]},{"id":"17f1c701.9e7479","type":"xml","z":"4fb0c5c4.cb66cc","name":"to XML","property":"payload","attr":"","chr":"","x":650,"y":60,"wires":[["c72e7dcb.e794c8"]]},{"id":"c72e7dcb.e794c8","type":"function","z":"4fb0c5c4.cb66cc","name":"Get values","func":"// Nody sns z XML si vložíme do samostatné proměnné (pole)\n// Veličiny v poli jsou vždy v pořadí teplota, vlhkost, rosný bod\nlet sns = msg.payload.root.sns;\n\n// Pokud hodnota teploty není aktuální, vyhlásíme chybu a ukončíme zpracování. (Není-li dostupná teplota, nejsou dostupné ani ostatní veličiny.)\nif (sns[0].$.status != \"0\") {\n    node.error(`Měření není dostupné!`);\n    return;\n}\n\n// Vytvoříme si pracovní objekt values a vložíme do nej teplotu\nlet values = {};\nvalues.temperature = parseFloat(sns[0].$.val);\n\n// Pokud je dostupná vlhkost, vložíme ji do objektu values\nif (sns[1].$.status == \"0\") values.humidity = parseFloat(sns[1].$.val);\n\n// Pokud je dostupný rosný bod, vložíme jej do objektu values\nif (sns[2].$.status == \"0\") values.dewpoint = parseFloat(sns[2].$.val);\n\n// Naplníme výstupní objekt msg zjištěnými hodnotami a \"pošleme dál\"\nmsg.payload = values;\nreturn msg;","outputs":1,"noerr":0,"x":810,"y":60,"wires":[["af5dd1e4.b3ed58"]]},{"id":"af5dd1e4.b3ed58","type":"http request","z":"4fb0c5c4.cb66cc","name":"Google Form","method":"GET","ret":"txt","url":"zde zadejte vas odkaz","tls":"","x":990,"y":60,"wires":[["c937da3.f616628"]]},{"id":"c937da3.f616628","type":"debug","z":"4fb0c5c4.cb66cc","name":"output","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","x":1150,"y":60,"wires":[]}]

15. Nyní se můžeme vrátit ke Google Tabulce, kterou jsme si vytvořili v bodě 9. Tabulka se v zadaném intervalu plní naměřenými hodnotami. Do prvního sloupce se automaticky vkládá časová značka, která představuje čas, kdy bylo měření přijato Google Formulářem.

Naměřená data v Google Tabulce

Na obrázku je vidět, že některá čísla jsou zarovnána ve sloupci vlevo a některá vpravo. Je to proto, že celá čísla jsou Googlem správně rozpoznaná jako číslo, ale čísla s desetinnou tečkou ne - jsou zarovnána vlevo jako by to byl obyčejný text. Co s tím?

Čísla s desetinnou tečkou v Google Tabulkách

Čísla s desetinnou tečkou jsou Google Tabulkách s českou lokalizací interpretována jako text a ne jako číslo. Je to proto, že na rozdíl od některých jiných zemí u nás používáme jako oddělovač desetin čárku. To Google respektuje, takže pokud máte Google v češtině, číslo s desetinnou tečkou nepovažuje za číslo, ale za řetězec.

Jednou z možností jak to řešit, je přepnout si lokalizaci Google tabulky například na Spojené království, kde používají jako oddělovač desetinných míst tečku. To jde snadno přes menu Soubor > Nastavení tabulky. Zde u položky Jazyk místo Česko vyberte například právě Spojené království. To ale způsobí i další změny ve formuláři - například zobrazení časových značek v prvním sloupci se změní na anglické. Toto nemusí být zrovna vítaná změna. Naštěstí to jde vyřešit i jinak.

Druhým způsobem je posílat data do Google Formuláře už s desetinnou čárkou. Stačí v Node-RED otevřít nastavení nodu Get values a upravit řádky 11 až 19 takto:

// Vytvoříme si pracovní objekt values a vložíme do něj teplotu
let values = {};
values.temperature = sns[0].$.val.replace(".",",");

// Pokud je dostupná vlhkost, vložíme ji do objektu values
if (sns[1].$.status == "0") values.humidity = sns[1].$.val.replace(".",",");

// Pokud je dostupný rosný bod, vložíme jej do objektu values
if (sns[2].$.status == "0") values.dewpoint = sns[2].$.val.replace(".",",");

Co jsme touto úpravou provedli? Původně jsme pomocí parseFloat hodnoty ve funkci převáděli na číslo. Touto úpravou necháme hodnoty jako textový řetězec. V řetězci vyhledáme pomocí replace tečku a pokud tam je, nahradíme ji čárkou. Tím se do Google Tabulky dostanou data už s desetinnou čárkou a Google je tím pádem správně interpretuje jako čísla.

Po této úpravě vypadají data v Google Tabulce o poznání lépe. Data můžeme dále zpracovávat, prezentovat, apod. - například vynést aktuální měření do grafu jako na obrázku.

Data z Node-RED v Google Tabulce, graf měření

(Na závěr je potřeba ještě zmínit, že Google Tabulky nemají neomezený počet řádků, takže pro opravdu dlouhodobé ukládání měření se hodí spíše databáze, ale to už je mimo rámec tohoto návodu.)

Vytvořeno02.01.2020