Talk Weather - Anúncio do tempo e temperatura em voz sintetizada

Publicado por Khayla Elias dos Santos (última atualização em 25/09/2015)

[ Hits: 6.376 ]

Homepage: https://linktr.ee/khayla.elias

Download talk-weather

Download 1442259524.talk-weather (versão 2)




Este script permite a exibição do tempo (temperatura, umidade relativa do ar e outros) de uma determinada localidade através do terminal. Além de atualizar e exibir periodicamente os dados, este código permite o anúncio do tempo em voz sintetizada. Para ver como usá-lo, leia o comentário nas primeiras linhas do código.

Pré-requisito: é necessário ter instalado os pacotes do espeak.

Sugestão de uso: rodar em uma das janelas do "Screen" ou do "Terminator".

  



Versões atualizadas deste script

Versão 2 - Enviado por Khayla Elias dos Santos em 14/09/2015

Changelog: talk-weather (version 2 - 2015.09.14)

Últimas atualizações:

- Inclusão do help através da opção --help.
- Incluída três opções de perfil: silencioso; voz com pausador do 'mocp'; e default, somente com voz.
- Verificação dos parâmetros de entrada e outras (sanity checks).
- Reimplementação do tratamento de flexão gramatical (singular/plural).

Download 1442259524.talk-weather


Esconder código-fonte

#!/bin/bash
# Description: get, talk and display weather data of station selected.
#
# Parameters:
# 1) CODE:  station code of local (get in http://www.nws.noaa.gov/tg/siteloc.shtml)
# 2) INTERVAL:  interval to updade data (in minutes)
# 3) QUIET: desable speech synthesizer when weather is updated (use -q )
#
# General use:
#           talk-weather [CODE [INTERVAL [-q]]]
# Examples of use:
#           talk-weather SBCF
#           talk-weather SCSP 15
#           talk-weather SLLP 30 -q
#
# By: Alexandre Elias dos Santos (aleniac@ufmg.br)
# Date: July 2015

intervalo=$2; intervalo=${intervalo:=20} # intervalo de atualização
intervalo=$(($intervalo*60))        # conversão de intervalo para segundos
[ "$intervalo" -eq 0 ] && intervalo=1200
DIR="$HOME/.wmWeatherReports"
COD="`echo "$1"|cut -c -4|tr '[:lower:]' '[:upper:]'`"
COD="`echo ${COD:=SBBH}`" # define por default a estação de Belo Horizonte
FILE="http://weather.noaa.gov/pub/data/observations/metar/decoded/$COD.TXT"
UPDATE0="`ls -ltu $DIR/$COD.TXT 2>/dev/null|sed 's/  */ /g'|cut -d' ' -f 6-8|sed 's/[ :]//g'`"
UPDATE="$UPDATE0"   # flag de update
QUIET=$3        # desable talk
QUIET=${QUIET:=null}

# vetor rosa do vento
declare -A ROSA=([N]=Norte [NNE]=Nor-nordeste [NE]=Nordeste [ENE]=Lés-nordeste
[E]=Leste [ESE]=Lés-sudeste [SE]=Sudeste [SSE]=Su-sudeste
[S]=Sul [SSW]=Su-sudoeste [SW]=Sudoeste [WSW]=Oés-sudoeste
[W]=Oeste [WNW]=Oés-noroeste [NW]=Noroeste [NNW]=Nor-noroeste [null]=null)


if [ ! -d $DIR ]; then
    mkdir $DIR
fi # verifica existencia do diretorio de trabalho

cd $DIR
clear
printf "To get $COD each $(($intervalo/60)) minutes."
[ "$QUIET" = "-q" ] && printf " Quiet."
sleep 3

while true; do
    clear
    printf "Downloading $COD... "; tput cup 0 0
    wget -qN $FILE || printf "\e[31;1mwget (`date +%H:%M:%S`): error to get file $COD.TXT\e[m\n"

    if [ -f $DIR/$COD.TXT ]; then
        printf "\e[1;36m`egrep "[0-9]-[0-9]|UTC" $DIR/$COD.TXT`\n"
        # EXTRAI DADOS DO ARQUIVO
        estacao="`grep "[0-9]-[0-9]" $DIR/$COD.TXT|sed 's/ *,.*//'`"; estacao=${estacao:=Estação desconhecida}
        temperatura="`grep Temp  $DIR/$COD.TXT|cut -d"(" -f2|cut -d" " -f1`"; temperatura=${temperatura:=null}
        humid="`grep Hum  $DIR/$COD.TXT|sed 's/.*:.//'|sed 's/%//'`"; humid=${humid:=null}
        est="`ls -ltu $DIR/$COD.TXT 2>/dev/null|sed 's/  */ /g'|cut -d' ' -f 6-8|sed -r 's/ [0-9][0-9]:/,&/'`"; est=${est:=null}
        from="`grep Wind: $DIR/$COD.TXT| cut -d" " -f4`"; from=${from:=null}
        angulo="`grep Wind: $DIR/$COD.TXT|sed -r "s/^.*\(([0-9][0-9]*) deg.*$/\1/"`"; angulo=${angulo:=null}
        velocidade="`grep Wind: $DIR/$COD.TXT|sed -r 's/^.*at ([0-9][0-9]*).MPH.*$/\1/'`"; velocidade=${velocidade:=null}
        grep -q "Calm:0" $DIR/$COD.TXT
        if [ "$?" = 0 ]; then
            wind="Vento calmo."
        else    wind="Vento à $velocidade milhas por hora, vindo do ${ROSA[$from]}."
        fi
        sky="`grep Sky  $DIR/$COD.TXT|sed 's/.*:.//'`"
        weather="`grep Weat  $DIR/$COD.TXT|sed 's/.*:.//'`"
        ############################

        printf '\e[33mTemperature:\e[m%s\n' " $temperatura °C"
        printf '\e[1;33mWind:\e[m%s\n' "`grep "^Wind:" $DIR/$COD.TXT|cut -d":" -f2`"
        grep -q "^Win.*ill:" $DIR/$COD.TXT && printf '\e[1;33mWindchill:\e[m%s\n' "`grep "^Win.*ll:" $DIR/$COD.TXT|cut -d":" -f2`"
        grep -q "^Vis.*:" $DIR/$COD.TXT && printf '\e[1;33mVisibility:\e[m%s\n' "`grep "^Vis.*:" $DIR/$COD.TXT|cut -d":" -f2`"
        grep -q "^Sky.*:" $DIR/$COD.TXT && printf '\e[1;33mSky conditions:\e[m%s\n' "`grep "^Sky.*:" $DIR/$COD.TXT|cut -d":" -f2`"
        grep -q "^Weather:" $DIR/$COD.TXT && printf '\e[1;33mWeather:\e[m%s\n' "`grep "^Wea.*:" $DIR/$COD.TXT|cut -d":" -f2`"
        grep -q "^Precip.*:" $DIR/$COD.TXT && printf '\e[1;33mPrecipitation last hour:\e[m%s\n' "`grep "^Precip.*:" $DIR/$COD.TXT|cut -d":" -f2`"
        grep -q "^Heat.*:" $DIR/$COD.TXT && printf '\e[1;33mHeat index:\e[m%s\n' "`grep "^Heat.*:" $DIR/$COD.TXT|cut -d":" -f2`"
        grep -q "Dew.*:" $DIR/$COD.TXT && printf '\e[1;33mDew Point:\e[m%s\n' "`grep "^Dew.*t:" $DIR/$COD.TXT|cut -d":" -f2`"
        grep -q "^Relat.*:" $DIR/$COD.TXT && printf '\e[1;33mRelative Humidity:\e[m%s\n' "`grep "^Relat.*:" $DIR/$COD.TXT|cut -d":" -f2`"
        grep -q "^Press.*):" $DIR/$COD.TXT && printf '\e[1;33mPressurre (altimeter):\e[m%s\n' "`grep "^Press.*):" $DIR/$COD.TXT|cut -d":" -f2`"
        grep -q "^Press.*y:" $DIR/$COD.TXT && printf '\e[1;33mPressurre tendency:\e[m%s\n' "`grep "^Press.*y:" $DIR/$COD.TXT|cut -d":" -f2`"
        ### grep -q "^ob:" $DIR/$COD.TXT && printf '\e[1;33mob:\e[m%s\n' "`grep "^ob:" $DIR/$COD.TXT|sed 's/ob://'`"

        grep -q "^cycle:" $DIR/$COD.TXT && printf '\e[1;33mcycle:\e[m%s' "`grep "^cycle:" $DIR/$COD.TXT|cut -d":" -f2`"
        UPDATE0="`ls -ltu $DIR/$COD.TXT 2>/dev/null|sed 's/  */ /g'|cut -d' ' -f 6-8|sed 's/[ :]//g'`"

        if [ "$QUIET" != "-q" ] && [ "$UPDATE" != "$UPDATE0" ]; then
            UPDATE="$UPDATE0"
            temp="`echo "scale=1; ($temperatura^2)/1"|bc`"
            if [ "$temp" = "1.0"  ]; then
                grau="grau"
                negativo="negativo"
                temp="`echo "scale=0; $temperatura/1"|bc`"
            else    grau="graus"
                negativo="negativos"
            fi # faz tratamento de plural

            if [ "`echo "scale=0; 10*$temperatura/1"|bc`" -lt 0 ]; then
                if [ "$temp" = "-1" ]; then
                    temp=1
                else
                    if [ `echo "$temperatura"|grep -q "\."; echo $?` = 0 ]; then
                        temp="`echo "scale=1; $temperatura/(-1)"|bc`"
                    else
                        temp=$((-1*$temperatura))
                    fi
                fi
                temp="`echo $temp|sed 's/^\./0\./'`"
                temp="$temp $grau $negativo"
            else
                if [ "$temp" != "1" ]; then
                    temp="`echo $temperatura|sed 's/^\./0\./'`"
                fi
                temp="$temp $grau"
            fi # faz tratamento de  negativos

            ( # talking weather...
                pausado="" # estado do mocp (Muscic On Console Player)
                                mocp -i|head -1|grep -q "PAUSE" &>/dev/null  && pausado="on"
                                mocp -P &>/dev/null # unpaused mocp
                espeak -k -20 -ven-us+m2 "$HOSTNAME: weather:"
                espeak -k -20 -vpt+f2  "Em $estacao, `echo $temp|sed 's/\./ponto/'`. Humidade relativa do ar: $humid por cento."
                [ -n "$sky" ] && espeak -k -20 -ven-us+m2 "Sky conditions: $sky`[ -n "$weather" ] && echo ","` $weather."
                [ $((`date +%H|sed 's/^0//'` % 3)) -eq 0 ] && espeak -k -20 -vpt+f2 "$wind"
                [ "$pausado" = "on" ] || mocp -U &>/dev/null # unpased mocp
            )
        fi # saida de voz - tempo e temperatura
    fi

    sleep $intervalo
done # atualiza e exibe os dados periodicamente

Scripts recomendados

organização_topografia quarto arquivo

Gravando jogos do XBOX 360

Varredura com Nmap a procura do serviço Apache

Limpar conflito Dropbox

Monitore seu pc com um comando fácil


  

Comentários
[1] Comentário enviado por fabio em 03/08/2015 - 10:00h

Muito bom! Pena que minha cidade não possui o código alfabético. No caso ela tem apenas os 5 dígitos numéricos no site indicado pelo script. Tem alguma solução?

[2] Comentário enviado por khayla em 03/08/2015 - 15:34h

Eu acho que não, Fábio. Acredito que as cidades que possuem apenas o identificador numérico, não possuem estação medidoras cadastradas no http://www.noaa.gov. Uma alternativa seria usar o código da cidade mais próxima já que a variação climática não é tão discrepante neste caso.

Alexandre Elias dos Santos

[3] Comentário enviado por khayla em 03/08/2015 - 17:57h

Screenshot referente: http://www.vivaolinux.com.br/screenshot/Xfce-Usando-o-talk-weather-em-multiplas-janelas-no-terminato...
Alexandre Elias dos Santos

[4] Comentário enviado por removido em 04/08/2015 - 02:19h



A liberdade indocil e domada pela propria desgraça -William Shakespeare

[5] Comentário enviado por removido em 04/08/2015 - 02:20h

Como faz pra para esse script eu exclui mais continua falando o tempo errado?

A liberdade indocil e domada pela propria desgraça -William Shakespeare

[6] Comentário enviado por khayla em 04/08/2015 - 15:32h

Você quis dizer interromper a execução do script, SamsonBurke? Para interrompê-lo, basta usar <Control C>. Agora, com relação a "falando o tempo errado", se for o que estou pensando, o arquivo baixado referente ao código da localidade pode está faltando as variáveis que são anunciadas pelo sintetizador de voz. Às vezes estas variáveis estão faltantes. Você pode conferir estes valores acessando o arquivo armazenado no diretório "~$/.wmWeatherReports/????.TXT" substituindo as interrogações pelo código do local.




[5] Comentário enviado por SamsonBurke em 04/08/2015 - 02:20h

Como faz pra para esse script eu exclui mais continua falando o tempo errado?

A liberdade indocil e domada pela propria desgraça -William Shakespeare



[7] Comentário enviado por Lwkas em 07/08/2015 - 09:55h

Bom script

[8] Comentário enviado por khayla em 11/09/2015 - 22:28h

Esqueçam este código, embora ele funcione! A versão 2, melhorada e reestruturada, já está sendo avaliada para publicação.

Alexandre Elias dos Santos


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts