Categoria Node-RED

porRicardo Jorge

COVID-19 Dados Reflexões e Estatísticas

Neste artigo sobre COVID-19 Dados Reflexões e Estatísticas, teremos uma abordagem diferente dos demais artigos já publicados neste Blog.

É claro que todos nós já percebemos o impacto mundial causado por esta pandemia do coronavírus, mas desejo aproveitar este espaço para colocar alguns dados coletados dos sites About Corona e WHO (OMS) onde é possível avaliar o status do Brasil, perante outras nações no que diz respeito a esta pandemia.

Espero que isto possa contribuir para melhor entendermos porque tanto se fala sobre este vírus, mas também percebermos que ainda há muito por ser feito, mesmo no âmbito mundial.

COVID-19 um pouco de história

Em 31 de dezembro de 2019, a Organização Mundial da Saúde (OMS) foi alertada sobre vários casos de pneumonia na cidade de Wuhan, província de Hubei, na República Popular da China. Tratava-se de uma nova cepa (tipo) de coronavírus que não havia sido identificada antes em seres humanos.

Uma semana depois, em 7 de janeiro de 2020, as autoridades chinesas confirmaram que haviam identificado um novo tipo de coronavírus. Os coronavírus estão por toda parte. Eles são a segunda principal causa de resfriado comum (após rinovírus) e, até as últimas décadas, raramente causavam doenças mais graves em humanos do que o resfriado comum.

Ao todo, sete coronavírus humanos (HCoVs) já foram identificados: HCoV-229E, HCoV-OC43, HCoV-NL63, HCoV-HKU1, SARS-COV (que causa síndrome respiratória aguda grave), MERS-COV (que causa síndrome respiratória do Oriente Médio) e o, mais recente, novo coronavírus (que no início foi temporariamente nomeado 2019-nCoV e, em 11 de fevereiro de 2020, recebeu o nome de SARS-CoV-2). Esse novo coronavírus é responsável por causar a doença COVID-19.

A OMS tem trabalhado com autoridades chinesas e especialistas globais desde o dia em que foi informada, para aprender mais sobre o vírus, como ele afeta as pessoas que estão doentes, como podem ser tratadas e o que os países podem fazer para responder.

A Organização Pan-Americana da Saúde (OPAS) tem prestado apoio técnico aos países das Américas e recomendado manter o sistema de vigilância alerta, preparado para detectar, isolar e cuidar precocemente de pacientes infectados com o novo coronavírus.

Dados obtidos do site : PAHO

Reflexões sobre saúde e qualidade de vida

É importante entender que, embora o coronavírus seja um assunto muito divulgado nas Redes Sociais e na mídia em geral, existem muitos outros focos de atenção que deveriam estar em nossos radares, durante e após esta pandemia.

Imaginar que basta tomar a vacina e tudo voltará ao normal, parece ser algo distante da realidade para muitas pessoas no mundo.

O motivo é que várias outras ameaças continuarão a existir, mas que são pouco divulgadas ou pouco percebidas, porque não afetam a maioria das pessoas com melhores condições sócio econômicas.

Contudo, isto não significa que não sejam importantes e que não deveriam ser tanto ou mais divulgadas do que a pandemia de COVID-19.

Alguns dados importantes e tristes ao mesmo tempo :

Como podemos ver, em apenas 4 tópicos acima, ainda temos muito com o que nos preocuparmos e também com o que contribuirmos para melhorar.

Usando tecnologia para entender nosso mundo

Como eu mencionei no início deste artigo, elaborei um pequeno “Flow” usando Node-RED para obter dados sobre COVID-19, selecionando alguns países e assim poder comparar com o Brasil.

Conhecer, comparar e entender o que acontece, é o primeiro passo para definir o que pode e deve ser feito.

Cada um, como cidadão, terá sua visão e assim uma forma de contribuição.

Após a execução do “Flow”, o resultado é uma tela similar a que é vista abaixo.

As coletas anteriores podem ser vistas aqui.

Observação : nem todos os países atualizam os dados com a mesma frequência.


Abaixo, segue o “Flow” Node RED usado para estas coletas.

Na versão 3, existem informações adicionais como :

  • Percentual de vacinados, que é obtida do site WHO / OMS.
  • Dados sobre território dos países
  • Informação sobre Renda Per Capita, obtida deste link no site Wikipédia.

Blog atualizado em 24/05/2021

Encontrou algum erro ou tem uma ideia para melhorar o código, envie sua sugestão!


Flow – versão 3

[{"id":"1b35239f.67dcdc","type":"tab","label":"COVID-19","disabled":false,"info":""},{"id":"8cecea9a.393958","type":"inject","z":"1b35239f.67dcdc","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"15 21 * * *","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":130,"y":240,"wires":[["5f3b6ebb.187e5"]]},{"id":"e28fcea8.5235b","type":"json","z":"1b35239f.67dcdc","name":"","property":"payload","action":"","pretty":true,"x":530,"y":100,"wires":[["3b331cf6.603b34"]]},{"id":"ffb139b8.592478","type":"http request","z":"1b35239f.67dcdc","name":"","method":"GET","ret":"txt","paytoqs":"ignore","url":"https://corona-api.com/countries","tls":"","persist":false,"proxy":"","authType":"","x":370,"y":100,"wires":[["e28fcea8.5235b"]]},{"id":"ba7a1fef.62ec3","type":"debug","z":"1b35239f.67dcdc","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":850,"y":100,"wires":[]},{"id":"3b331cf6.603b34","type":"function","z":"1b35239f.67dcdc","name":"","func":"var brasilTime = new Date().toLocaleString(\"pt-BR\", {timeZone: \"America/Sao_Paulo\"});\n\nvar d = new Date(brasilTime);\n\nvar diaSemanaA = new Array('Dom', 'Seg', 'Ter', 'Qua', 'Qui', 'Sex', 'Sáb');\nvar curDiaSemanaA = diaSemanaA[d.getDay()];\n\nvar curHour = d.getHours();\nvar curMin = d.getMinutes();\nvar curDay = d.getDate();\nvar curMonth = d.getMonth() + 1;\nvar curYear = d.getFullYear();\n\nif (curMin < 10) {\n        curMin = \"0\" + curMin;\n}\n\nif (curHour < 10) {\n    curHour = \"0\" + curHour;\n}\n\nvar cur_date = curDiaSemanaA + \" \" + curDay + \"/\" + curMonth + \"/\" + curYear + \" - \" + curHour + \":\" + curMin;\n\nmsg.cur_date = cur_date;\n\n// Site OMS utiliza ISO3 ( 3 digitios ) para identificar os paises\n// Site About Corona utiliza 2 digitos para identificar os paises\n// A ordem dos paises deve ser a mesma para os 2 sites\n//\n\nvar countries_code = [\"BR\", \"US\", \"MX\", \"AR\", \"CL\", \"GB\", \"IT\", \"ES\", \"PT\", \"BE\", \"DE\", \"FR\", \"ZA\", \"RU\", \"IN\", \"CN\"];\nvar countries_iso3 = [\"BRA\", \"USA\", \"MEX\", \"ARG\", \"CHL\", \"GBR\", \"ITA\", \"ESP\", \"PRT\", \"BEL\", \"DEU\", \"FRA\", \"ZAF\", \"RUS\", \"IND\", \"CHN\"];\n\n/*\nBrasil\t\t    8515767\nUSA\t\t        8081867\nMexico\t\t    1972550\nArgentina\t    2780400\nChile\t\t    756096\nUK\t\t        240000\nItalia\t\t    301340\nEspanha\t\t    505990\nPortugal\t    92090\nBelgica\t\t    30689\nAlemanha\t    349380\nFrança\t\t    551500\nAfrica do Sul\t1213090\nRussia\t\t    17098246\nIndia\t\t    2973190\nChina\t\t    9424702\n*/\n\nvar countries_territory = [\"8.515.767\", \"8.081.867\", \"1.972.550\", \"2.780.400\", \"756.096\", \"240.000\", \"301.340\", \"505.990\", \"92.090\", \"30.689\", \"349.380\", \"551.500\", \"1.213.090\", \"17.098.246\", \"2.973.190\", \"9.424.702\"];\nvar countries_per_capita = [\"11.075\", \"65.111\", \"10.118\", \"9.887\", \"15.399\", \"41.030\", \"32.946\", \"29.961\", \"23.030\", \"45.175\", \"46.563\", \"41.760\", \"6.100\", \"11.162\", \"2.171\", \"10.098\"];\n\nvar countries_arr = [];\n\nvar d_rate,r_rate,c_million,confirmed,recovered,critical,deaths,population,percent;\n\nvar countriesLen = countries_code.length;\n\nvar covidLen = msg.payload.data.length;\n\nvar vaccinated_arr = flow.get('vaccinated_arr') || {};\nvar vaccines_arr = flow.get('vaccines_arr') || {};\n\nvar vaccinated,vaccines;\n\nfor (n = 0; n <countriesLen; n++) {\n    \n    for (i = 0; i < covidLen; i++) {\n        if(msg.payload.data[i].code == countries_code[n]) {\n\n            population = msg.payload.data[i].population;\n            deaths = msg.payload.data[i].latest_data.deaths;\n            percent = (deaths / population) * 100;\n            msg.payload.data[i].percent = percent.toPrecision(2);\n\n            msg.payload.data[i].territory = countries_territory[n];\n            msg.payload.data[i].per_capita = countries_per_capita[n];\n\n            msg.payload.data[i].population = msg.payload.data[i].population.toLocaleString('pt-BR');\n            msg.payload.data[i].latest_data.deaths = msg.payload.data[i].latest_data.deaths.toLocaleString('pt-BR');\n            d_rate = msg.payload.data[i].latest_data.calculated.death_rate;\n            msg.payload.data[i].latest_data.calculated.death_rate = d_rate.toPrecision(4);\n            r_rate = msg.payload.data[i].latest_data.calculated.recovery_rate;\n            msg.payload.data[i].latest_data.calculated.recovery_rate = r_rate.toPrecision(4);\n            c_million = msg.payload.data[i].latest_data.calculated.cases_per_million_population;\n            msg.payload.data[i].latest_data.calculated.cases_per_million_population = c_million.toLocaleString('pt-BR');\n            confirmed = msg.payload.data[i].latest_data.confirmed;\n            msg.payload.data[i].latest_data.confirmed = confirmed.toLocaleString('pt-BR');\n            recovered = msg.payload.data[i].latest_data.recovered;\n            msg.payload.data[i].latest_data.recovered = recovered.toLocaleString('pt-BR');\n            critical = msg.payload.data[i].latest_data.critical;\n            msg.payload.data[i].latest_data.critical = critical.toLocaleString('pt-BR');\n\n            if(vaccinated_arr[n]===undefined) {\n                vaccinated = 0;\n            } else {\n                vaccinated = vaccinated_arr[n];\n            }\n\n            if(vaccines_arr[n]===undefined) {\n                vaccines = 0;\n            } else {\n                vaccines = vaccines_arr[n];\n            }\n            \n            vaccinated = (vaccinated / population) * 100;\n\n            msg.payload.data[i].vaccinated = vaccinated.toPrecision(2);\n            msg.payload.data[i].vaccines = vaccines.toLocaleString('pt-BR');\n            \n            countries_arr.push(JSON.parse(JSON.stringify(msg.payload.data[i])));\n        }\n    }\n}\n\nmsg.payload = countries_arr;\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":680,"y":100,"wires":[["ba7a1fef.62ec3","981ebf4a.016de"]]},{"id":"981ebf4a.016de","type":"ui_template","z":"1b35239f.67dcdc","group":"ac573138.1cb5b","name":"Covid-19 - Estatísticas","order":1,"width":"26","height":"16","format":"<style>\ntable {\n  border-collapse: collapse;\n  width: 100%;\n}\n\nth, td {\n  padding: 8px;\n  text-align: left;\n  border-bottom: 1px solid #ddd;\n}\n\ntr:nth-child(even) {background-color: #e6ffcc;}\n\ntr:nth-child(odd) {background-color: #bfff80;}\n\nth {\n  background-color: black;\n  color: white;\n  text-align: center;\n}\n\n}\n</style>\n<center>\n    <h2>Informações COVID-19</h2>\n    <br>\n    <h4>Estes dados são obtidos dos sites <a href=\"https://about-corona.net\" target=\"_blank\">About Corona</a> e <a href=\"https://covid19.who.int/info/\" target=\"_blank\">WHO (OMS)</a></h4>\n    <br>\n</center>\n<table id=\"table\">\n <tr>\n <th>Pais</th>\n <th>Território km2</th>\n <th>Per Capita US$</th>\n <th>Habitantes</th>\n <th>Mortes</th>\n <th>% Populacional</th>\n <th>Confirmados</th>\n <th>Recuperados</th>\n <th>Críticos</th>\n <th>Taxa de mortalidade</th>\n <th>Taxa de recuperados</th>\n <th>Casos por milhão</th>\n <th>Doses aplicadas</th>\n <th>% vacinados</th>\n </tr>\n <tbody>\n <tr ng-repeat=\"row in msg.payload\">\n <td>{{::row.name}}</td>\n <td>{{::row.territory}}</td>\n <td>{{::row.per_capita}}</td>\n <td>{{::row.population}}</td>\n <td>{{::row.latest_data.deaths}}</td>\n <td>{{::row.percent}}</td>\n <td>{{::row.latest_data.confirmed}}</td>\n <td>{{::row.latest_data.recovered}}</td>\n <td>{{::row.latest_data.critical}}</td>\n <td>{{::row.latest_data.calculated.death_rate}}</td>\n <td>{{::row.latest_data.calculated.recovery_rate}}</td>\n <td>{{::row.latest_data.calculated.cases_per_million_population}}</td>\n <td>{{::row.vaccines}}</td>\n <td>{{::row.vaccinated}}</td>\n </tr>\n </tbody>\n</table>\n<p><br><br><b>Coleta feita em :</b> {{msg.cur_date}}</p>","storeOutMessages":false,"fwdInMessages":true,"templateScope":"local","x":880,"y":180,"wires":[[]]},{"id":"a83a28ee.7e39b8","type":"http request","z":"1b35239f.67dcdc","name":"","method":"GET","ret":"bin","paytoqs":"ignore","url":"https://covid19.who.int/who-data/vaccination-data.csv","tls":"","persist":false,"proxy":"","authType":"","x":330,"y":340,"wires":[["52c552ca.e6991c"]]},{"id":"52c552ca.e6991c","type":"file","z":"1b35239f.67dcdc","name":"","filename":"/home/pi/who_vaccination.csv.gz","appendNewline":false,"createDir":false,"overwriteFile":"true","encoding":"none","x":320,"y":420,"wires":[["f353a813.660b08"]]},{"id":"f353a813.660b08","type":"exec","z":"1b35239f.67dcdc","command":"/home/pi/who.sh","addpay":"","append":"","useSpawn":"false","timer":"","oldrc":false,"name":"","x":600,"y":420,"wires":[[],[],[]]},{"id":"b73c490b.639498","type":"csv","z":"1b35239f.67dcdc","name":"","sep":",","hdrin":true,"hdrout":"none","multi":"mult","ret":"\\r\\n","temp":"","skip":"0","strings":true,"include_empty_strings":"","include_null_values":"","x":290,"y":160,"wires":[["3ba823a8.2337dc"]]},{"id":"5f3b6ebb.187e5","type":"file in","z":"1b35239f.67dcdc","name":"","filename":"/home/pi/who_vaccination.csv","format":"utf8","chunk":false,"sendError":false,"encoding":"none","x":510,"y":240,"wires":[["b73c490b.639498"]]},{"id":"3ba823a8.2337dc","type":"function","z":"1b35239f.67dcdc","name":"","func":"//\n// Site OMS utiliza ISO3 para identificar os paises\n//\n// A ordem dos paises deve ser a mesma ordem da coleta do site About Corona\n//\n\nvar countries_iso3 = [\"BRA\", \"USA\", \"MEX\", \"ARG\", \"CHL\", \"GBR\", \"ITA\", \"ESP\", \"PRT\", \"BEL\", \"DEU\", \"FRA\", \"ZAF\", \"RUS\", \"IND\", \"CHN\"];\n\nvar vaccinated_arr = [];\nvar vaccinated;\n\nvar vaccines_arr = [];\nvar vaccines;\n\nvar countriesLen = countries_iso3.length;\n\nvar covidLen = msg.payload.length;\n\nfor (n = 0; n <countriesLen; n++) {\n    \n    for (i = 0; i < covidLen; i++) {\n        if(msg.payload[i].ISO3 == countries_iso3[n]) {\n\n            vaccinated = msg.payload[i].PERSONS_VACCINATED_1PLUS_DOSE;\n            vaccines = msg.payload[i].TOTAL_VACCINATIONS;\n            \n            if(vaccinated === undefined) {\n                vaccinated = 0;\n            }\n\n            if(vaccines === undefined) {\n                vaccines = 0;\n            }\n\n            vaccinated_arr.push(vaccinated);\n            vaccines_arr.push(vaccines);\n        }\n    }\n}\n\nflow.set('vaccinated_arr',vaccinated_arr);\nflow.set('vaccines_arr',vaccines_arr);\n\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":420,"y":160,"wires":[["ffb139b8.592478"]]},{"id":"f7e44017.8c1f2","type":"inject","z":"1b35239f.67dcdc","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":120,"y":300,"wires":[["a83a28ee.7e39b8","344d13a7.c349dc"]]},{"id":"344d13a7.c349dc","type":"delay","z":"1b35239f.67dcdc","name":"","pauseType":"delay","timeout":"8","timeoutUnits":"seconds","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"x":300,"y":280,"wires":[["5f3b6ebb.187e5"]]},{"id":"cad7a71a.ef5328","type":"comment","z":"1b35239f.67dcdc","name":"Estatísticas COVID-19 - Versão 3","info":"Nesta versão temos o percentual de vacinados e a indormação é obtidia do site OMS ( https://covid19.who.int/info/ )","x":170,"y":40,"wires":[]},{"id":"9fe3cedb.7b7a7","type":"inject","z":"1b35239f.67dcdc","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"10 21 * * *","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":130,"y":340,"wires":[["a83a28ee.7e39b8"]]},{"id":"ac573138.1cb5b","type":"ui_group","name":"COVID-19","tab":"42287a7d.74e004","order":2,"disp":true,"width":"26","collapse":true},{"id":"42287a7d.74e004","type":"ui_tab","name":"COVID","icon":"dashboard","disabled":false,"hidden":false}]

Assuntos relacionados :

Node-RED – apresentação


Image by Pete Linforth from Pixabay

porRicardo Jorge

Node-RED – apresentação

Conhecendo Node-RED

Node-RED é uma ferramenta de desenvolvimento baseada em fluxos e foi originalmente criada pela IBM para interconexão de dispositivos de hardware, APIs e serviços online, tendo como foco aplicações IoT.

Todo o acesso ao ambiente de desenvolvimento é feito através de uma interface WEB.

Através desta interface, é possível desenvolver inúmeras aplicações utilizando várias bibliotecas já disponíveis, denominadas “nós”, ou programando diretamente em JavaScript.

Utilizo Node-RED faz alguns anos tanto para prototipagem, como em produção, juntamente com MQTT, JSON, arduino, Raspberry, “família” ESP8266, mosquitto e muitas outras ferramentas e recursos.

Acesse o site Node-RED e saiba mais.

Devido a sua versatilidade, inúmeros projetos focados em IoT utilizam Node-RED.

Mas nem só de IoT vive o Node-RED, já que, através do uso de APIs e acesso a serviços online, é possível criar muita coisa interessante.

Posso citar alguns casos de uso ( próprio ) :

  • Integração com Twitter
  • Gerenciador de bot para Telegram
  • Sistema de automação residencial
  • Conector para armazenamento de dados ( bancos de série histórica )
  • Automação de processos, como por exemplo : rotinas de backup

Devido a forma de programação ser orientada por fluxos, tudo o que você “escreve” e desenvolve, fica auto documentado de maneira visual.

É claro que existem algumas técnicas para evitar a “poluição” visual e facilitar o entendimento do fluxo.

Nos próximos artigos, abordaremos mais detalhes e formas de uso de Node-RED.

Fique ligado !