# Saldo Cartão Refeição Santander - AppDaemon + Python + Selenium

**URL:** https://forum.cpha.pt/t/saldo-cartao-refeicao-santander-appdaemon-python-selenium/8695
**Category:** Tutoriais
**Created:** [29 Outubro , 2021 15:46 UTC](https://forum.cpha.pt/t/saldo-cartao-refeicao-santander-appdaemon-python-selenium/8695 "2021-10-29T15:46:48Z")
**Posts on this page:** 20
**Page:** 1

<div class="post-metadata">

### Author: ![Boxexas](https://forum.cpha.pt/user_avatar/forum.cpha.pt/boxexas/32/10526_2.png) [@Boxexas](https://forum.cpha.pt/u/Boxexas)
#### Post date: [29 Outubro , 2021 15:46 UTC](https://forum.cpha.pt/t/saldo-cartao-refeicao-santander-appdaemon-python-selenium/8695/1 "2021-10-29T15:46:49Z")

</div>

Boas,

De forma a visualizar o saldo do cartão refeição do Santander no Home Assistant, configurei e desenvolvi o seguinte script aqui disponibilizado para quem necessitar de fazer o mesmo ou até para novas ideias.  
Este projeto ainda está em fase de desenvolvimento/testes e melhoria, pelo que todas as opiniões, críticas ou sugestões serão sempre bem vindas.

---------- SANTANDER BALANCE ----------
  

 ![Capturar](https://forum.cpha.pt/uploads/default/original/2X/d/d2b4b258de7805fcdab79c686507785a4d2a6b6b.png)

Add-On utilizados:

- AppDaemon
- Visual Studio Code ou File Editor

**1º - Criar Sensor e Switch de atualização**  
De forma a termos presente o valor do saldo no dashboard, necessitamos de criar um sensor para o efeito. Utilizaremos o “Sensor Template”, bastando adicionar as linhas abaixo no nosso configuration.yaml

```auto
# Santander Balance Value
sensor:
  - platform: template
    sensors:
      santander_balance:
        value_template: "00,00"

```

O Switch é opcional, mas eu tinha em mente a possibilidade de querer despoletar manualmente ou até por uma automatização a atualização. Para o efeito recorremos ao “Switch Template” e adicionamos as linhas abaixo ao nosso configuration.yaml

```auto
switch:
# Santander Balance Update Switch
  - platform: template
    switches:
      updatebalance:
        turn_on:
          service: switch.turn_on
          target:
            entity_id: switch.updatebalance_on
        turn_off:
          service: switch.turn_off
          target:
            entity_id: switch.updatebalance_off

```

Como em qualquer outra alteração ao configuration.yaml, será necessário reiniciar o Home Assistant para que os sensores sejam carregados

**2º - Criar cartão de visualização**  
No meu caso, criei um Dashboard específico para visualizar os dados presentes e adicionei um “Entities Card”

```auto
type: entities
entities:
  - entity: switch.updatebalance
    name: Atualizar
    secondary_info: last-changed
  - entity: sensor.santander_balance
    icon: mdi:currency-eur
    name: Saldo
    secondary_info: last-updated
state_color: true
show_header_toggle: false

```

**3º - Configurar dependências Add-On AppDaemon**  
Após o download e instalação do Add-On AppDaemon, terão de ser configuradas algumas necessidades e dependências, nomeadamente o Chromium e o Selenium

```auto
system_packages:
  - chromium-chromedriver
  - chromium
python_packages:
  - selenium
init_commands: []

```

Aquando do arranque do Add-On, estas dependências irão ser instaladas e poderão ser importadas nos scripts.

**4º - Configurar App no AppDaemon**  
Através do Visual Studio Code/File Editor, criar no diretório “/config/appdaemon/apps/” um ficheiro com o código da nossa App, nomeadamente “GetSantanderBalance.py”.

 ![createfile](https://forum.cpha.pt/uploads/default/original/2X/8/843eab9cde009faf15ed3f3699547b4073dd13cc.png)

Abrir o ficheiro apps.yaml e adicionar a configuração da nossa app

```auto
SantanderBalance:
  module: GetSantanderBalance
  class: GetSantanderBalance

```

Gravar o ficheiro e abrir o GetSantanderBalance.py  
Copiar o código abaixo para o ficheiro e alterar os valores identificados na função “GetBalance”

```auto
Na função "GetBalance" existem dois campos de texto a preencher:
" **************CARD NUMBER***********" - Substituir pelo número de cartão sem espaços, exemplo "000000000"
" **************CARD CODE***********" - Substituir pelo código do cartão, exemplo "123123"

```

Código:  
Notas:

- Sim, tem melhorias a fazer 😅, foi desenvolvido por mim já a pensar em ir para a cama
- O código espera que tenham o switch de atualização configurado, mas poderão adaptar o código para simplesmente atualizar o valor quando quiserem
- Para a navegação no código HTML foi utilizado o XPATH bem como funções do Selenium
- Devido aos iFrames presentes no site do Santander, é necessário saltar entre os mesmos para o contexto do seletor
- Está previsto no código aceitar todos os cookies presentes no site

Melhorias a fazer quando possível:

- Retirar timeout, isto torna o script mais lento, o mais correto seria a utilização de um wait for element com o devido seletor
- Colocar o número de cartão numa variável mais acessível e de fácil configuração (usar ficheiro !secrets)
- Colocar o código do cartão numa variável mais acessível e de fácil configuração(usar ficheiro !secrets)
- Para testes, recorri ao run\_minutely para executar a cada minuto, mas tal não é necessário podendo este tempo ser alargado a 30min ou mesmo 1h, irei ver no futuro com que recorrência necessito

Pequeno resumo:

- Função initialize: Responsável por iniciar a aplicação e gerar as threads por minuto
- Função CallListenProcess: É invocada pela inicialização da thread e é responsável por esperar que o switch de atualização mude para o estado ON, tendo um timeout de 59 segundos. Caso o switch não seja ativado, a thread é cancelada.
- Função StartProcess: Arranca quando o swith é ligado e atribui os novos valores ao sensor e ao switch, no caso do switch irá desligá-lo
- Função GetBalance: É responsável por toda a extração e movimentação no site Santander. Retorna o valor do saldo existente. No caso da existência de um erro, o saldo ficará a “0,00”

```auto
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import appdaemon.plugins.hass.hassapi as hass
import time
import datetime

class GetSantanderBalance(hass.Hass):

  def initialize(self):
    self.log("Starting Santander App")
    runtime = datetime.time(0 ,0 ,0)
    self.run_minutely(self.CallListenProcess,runtime) 

  def CallListenProcess(self, kwargs):
    self.log("--------- SANTANDER BALANCE ---------")
    # listen for state ON for update balance
    self.listen_state(self.StartProcess,"switch.updatebalance", new = "on", timeout = 59)

  #Callback Function to Start the process 
  def StartProcess(self, entity, attribute, old, new, kwargs):
    self.log("-- SWITCH ON --")
    balance = self.GetBalance()
    self.log("Balance: " + balance)
    try:
      self.set_state('sensor.santander_balance', state = balance)
    except Exception as e:
      self.log("Set Sensor State Error: " + str(e))
    try:
      self.set_state("switch.updatebalance", state = old)
    except Exception as e:
      self.log("Set Swith State Error: " + str(e))

  def GetBalance(self):
    timeout = 4
    balance = "0,00"
    try:
      self.log("Start GetBalance")
      chrome_options = Options()
      chrome_options.add_argument('--headless')
      chrome_options.add_argument('--no-sandbox')
      chrome_options.add_argument('--disable-gpu')
      chrome_options.add_argument('--disable-dev-shm-usage')
      browser = webdriver.Chrome('chromedriver', options=chrome_options)
      try:
        self.log("Start Request")
        browser.get('https://www.particulares.santander.pt/pagina/indice/0,,840_1_2,00.html')
        time.sleep(timeout)
        try:
          browser.find_element_by_id('onetrust-accept-btn-handler').click()
        except Exception as e:
          self.log("No cookies")

        self.log("Login form")
        browser.switch_to.frame('ws')
        browser.find_element_by_xpath('//input[@autocomplete="userNameInputId"]').send_keys(" **************CARD NUMBER***********")
        browser.find_element_by_xpath('//input[@autocomplete="passwordInputId"]').send_keys(" **************CARD CODE***********")
        browser.find_element_by_id('submit_button').click()
        time.sleep(timeout)

        self.log("Success Login")
        browser.switch_to.frame('ws')
        time.sleep(timeout)

        self.log("Extracted Balance")
        balance = str(browser.find_element_by_xpath('//p[@class="balance-value text-green"]').text)
        browser.switch_to.default_content()

        self.log("Start Logout")
        browser.find_element_by_id('quick-logout').click()
        browser.close()
        self.log("Closed")
      except Exception as e:
        self.log("Request Error: " + str(e))
        browser.close()
    except Exception as e:
      self.log("GetBalance Error: " + str(e))
    return balance

```

Após guardar o ficheiro, o AppDaemon irá reiniciar o módulo e será possível visualizar nos logs do Add-On se tudo está conforme o esperado.

Próximo objetivo:

- Executar as melhorias identificadas
- Extrair os movimentos apresentados no banco
- Apresentar os movimentos num cartão para posterior visualização no Dashboard

Notas finais:

- Este é um projeto pessoal que disponibilizo a toda a gente na comunidade, poderão editar/alterar o código
- Foi a minha primeira abordagem ao AppDaemon, pelo que poderão existir melhorias nesse aspeto também
- O código está dependente dos seletores do site, pelo que, se o mesmo alterar, o script poderá deixar de funcionar

Estarei ao dispor para qualquer esclarecimento  
Abraço

---

<div class="post-metadata">

### Author: ![Leo\_Castro](https://forum.cpha.pt/user_avatar/forum.cpha.pt/leo_castro/32/3347_2.png) [@Leo\_Castro](https://forum.cpha.pt/u/Leo_Castro)
#### Post date: [29 Outubro , 2021 21:23 UTC](https://forum.cpha.pt/t/saldo-cartao-refeicao-santander-appdaemon-python-selenium/8695/2 "2021-10-29T21:23:18Z")

</div>

Funcional para o Brasil?

---

<div class="post-metadata">

### Author: ![Boxexas](https://forum.cpha.pt/user_avatar/forum.cpha.pt/boxexas/32/10526_2.png) [@Boxexas](https://forum.cpha.pt/u/Boxexas)
#### Post date: [31 Outubro , 2021 01:40 UTC](https://forum.cpha.pt/t/saldo-cartao-refeicao-santander-appdaemon-python-selenium/8695/3 "2021-10-31T01:40:17Z")

</div>

Boas  
Não sei dizer…  
O site em si não deve alterar muito, tens de trocar o link. Mas só testando…  
Abraço

---

<div class="post-metadata">

### Author: ![avense](https://forum.cpha.pt/letter_avatar_proxy/v4/letter/a/51bf81/32.png) [@avense](https://forum.cpha.pt/u/avense)
#### Post date: [4 Novembro , 2021 20:17 UTC](https://forum.cpha.pt/t/saldo-cartao-refeicao-santander-appdaemon-python-selenium/8695/4 "2021-11-04T20:17:11Z")

</div>

Baos noites.  
Onde posso estar a falhar?  
 ![satander](https://forum.cpha.pt/uploads/default/original/2X/a/a1a2ffe5b6b3421a7392dba5044b037f6b59bffc.jpeg)

---

<div class="post-metadata">

### Author: ![Boxexas](https://forum.cpha.pt/user_avatar/forum.cpha.pt/boxexas/32/10526_2.png) [@Boxexas](https://forum.cpha.pt/u/Boxexas)
#### Post date: [8 Novembro , 2021 17:46 UTC](https://forum.cpha.pt/t/saldo-cartao-refeicao-santander-appdaemon-python-selenium/8695/5 "2021-11-08T17:46:55Z")

</div>

Boas,

Pode verificar os logs do AppDaemon?  
O resultado esperado será este aqui quando o switch fica ON

 ![Capturar](https://forum.cpha.pt/uploads/default/original/2X/0/032ef491ad4593d49e4e6cf65ee6dbc37a3af653.png)

Abraço

---

<div class="post-metadata">

### Author: ![avense](https://forum.cpha.pt/letter_avatar_proxy/v4/letter/a/51bf81/32.png) [@avense](https://forum.cpha.pt/u/avense)
#### Post date: [9 Novembro , 2021 15:39 UTC](https://forum.cpha.pt/t/saldo-cartao-refeicao-santander-appdaemon-python-selenium/8695/6 "2021-11-09T15:39:09Z")

</div>

Dá-me este erro.

`ERROR 'log' directive deprecated, please convert to new 'logs' syntax`

---

<div class="post-metadata">

### Author: ![Boxexas](https://forum.cpha.pt/user_avatar/forum.cpha.pt/boxexas/32/10526_2.png) [@Boxexas](https://forum.cpha.pt/u/Boxexas)
#### Post date: [10 Novembro , 2021 09:43 UTC](https://forum.cpha.pt/t/saldo-cartao-refeicao-santander-appdaemon-python-selenium/8695/7 "2021-11-10T09:43:55Z")

</div>

> [@avense](#):
>
> ‘log’ directive deprecated, please convert to new ‘logs’ syntax

Qual o AppDaemon que está a correr? o 3 ou o 4?  
Esse erro acontece quando já correu o 3 e é necessário migrar para o 4

[https://github.com/hassio-addons/addon-appdaemon/issues/2](https://github.com/hassio-addons/addon-appdaemon/issues/2)

Abraço

---

<div class="post-metadata">

### Author: ![avense](https://forum.cpha.pt/letter_avatar_proxy/v4/letter/a/51bf81/32.png) [@avense](https://forum.cpha.pt/u/avense)
#### Post date: [12 Novembro , 2021 18:57 UTC](https://forum.cpha.pt/t/saldo-cartao-refeicao-santander-appdaemon-python-selenium/8695/8 "2021-11-12T18:57:50Z")

</div>

Estou a correr o 4.  
Agora da-me este erro  
`2021-11-12 18:55:21.322272 WARNING HASS: Disconnected from Home Assistant, retrying in 5 seconds`

Edit: Problema resolvido eram problemas com o https.  
Muito bom trabalho amigo Obrigado.

---

<div class="post-metadata">

### Author: ![Boxexas](https://forum.cpha.pt/user_avatar/forum.cpha.pt/boxexas/32/10526_2.png) [@Boxexas](https://forum.cpha.pt/u/Boxexas)
#### Post date: [12 Novembro , 2021 19:23 UTC](https://forum.cpha.pt/t/saldo-cartao-refeicao-santander-appdaemon-python-selenium/8695/9 "2021-11-12T19:23:08Z")

</div>

Parece ser mesmo um problema do AppDaemon e não do Script em si… Visto que o AppDaemon nem chega a ser inicializado.

Instalou o AppDaemon de raiz?  
Tem algum certificado do estilo Let’s encript?  
Talvez tentar desinstalar e instalar…

[https://community.home-assistant.io/t/hadashboard-and-appdaemon-error-warning-disconnected-from-home-assistant-retrying-in-5-seconds/43898](https://community.home-assistant.io/t/hadashboard-and-appdaemon-error-warning-disconnected-from-home-assistant-retrying-in-5-seconds/43898)

Abraço

---

<div class="post-metadata">

### Author: ![avense](https://forum.cpha.pt/letter_avatar_proxy/v4/letter/a/51bf81/32.png) [@avense](https://forum.cpha.pt/u/avense)
#### Post date: [12 Novembro , 2021 19:31 UTC](https://forum.cpha.pt/t/saldo-cartao-refeicao-santander-appdaemon-python-selenium/8695/10 "2021-11-12T19:31:51Z")

</div>

Problema Resolvido Obrigado.

![satander](https://forum.cpha.pt/uploads/default/original/2X/8/81fe7da6ba9abec312050985160790b1a20f6790.jpeg)

---

<div class="post-metadata">

### Author: ![j\_assuncao](https://forum.cpha.pt/user_avatar/forum.cpha.pt/j_assuncao/32/3_2.png) [@j\_assuncao](https://forum.cpha.pt/u/j_assuncao)
#### Post date: [13 Novembro , 2021 06:39 UTC](https://forum.cpha.pt/t/saldo-cartao-refeicao-santander-appdaemon-python-selenium/8695/11 "2021-11-13T06:39:36Z")

</div>

Era bom saber como foi resolvido para que outros utilizadores tenham essa informação se necessário…

---

<div class="post-metadata">

### Author: ![avense](https://forum.cpha.pt/letter_avatar_proxy/v4/letter/a/51bf81/32.png) [@avense](https://forum.cpha.pt/u/avense)
#### Post date: [13 Novembro , 2021 17:03 UTC](https://forum.cpha.pt/t/saldo-cartao-refeicao-santander-appdaemon-python-selenium/8695/12 "2021-11-13T17:03:07Z")

</div>

Mas eu já mencionei foi devido a eu usar https…

---

<div class="post-metadata">

### Author: ![lagastor](https://forum.cpha.pt/letter_avatar_proxy/v4/letter/l/e79b87/32.png) [@lagastor](https://forum.cpha.pt/u/lagastor)
#### Post date: [24 Novembro , 2021 12:48 UTC](https://forum.cpha.pt/t/saldo-cartao-refeicao-santander-appdaemon-python-selenium/8695/13 "2021-11-24T12:48:29Z")

</div>

@Boxexas,

Excelente partilha!

Fez-me ver que estava claramente a complicar na abordagem que estava a seguir para atingir o mesmo resultado. Eu uso o selenium para recolher informação de várias fontes, mas o que fiz foi levantar um container à parte (via Portainer) com python + selenium, usando scripts no AppDaemon para comunicar com ele através de mqtt, integrando depois os resultados no HA.

Muito mais complexo do que colocar os packages directamente no AppDaemon!!  
Vou certamente migrar o que tenho para a tua abordagem, bem mais direta.

Obrigado!

---

<div class="post-metadata">

### Author: ![jocamane](https://forum.cpha.pt/user_avatar/forum.cpha.pt/jocamane/32/10730_2.png) [@jocamane](https://forum.cpha.pt/u/jocamane)
#### Post date: [28 Dezembro , 2021 19:33 UTC](https://forum.cpha.pt/t/saldo-cartao-refeicao-santander-appdaemon-python-selenium/8695/14 "2021-12-28T19:33:43Z")

</div>

Boa tarde.  
Por aqui parece que correu bem no entanto tenho no log do HA o seguinte:

Logger: homeassistant.helpers.service  
Source: helpers/service.py:129  
First occurred: 12:30:36 PM (1 occurrences)  
Last logged: 12:30:36 PM

Unable to find referenced entities switch.updatebalance\_on

Eu acho que é quando o HA faz restart mas não tenho a certeza.  
O que tenho a certeza é que quando o HA faz o restart o valor do saldo que tenho no meu cartão fica a 0 e não fica correto enquanto eu não aciono o botão de update.

Se puderem ajudar…  
Obrigado

---

<div class="post-metadata">

### Author: ![Boxexas](https://forum.cpha.pt/user_avatar/forum.cpha.pt/boxexas/32/10526_2.png) [@Boxexas](https://forum.cpha.pt/u/Boxexas)
#### Post date: [30 Dezembro , 2021 15:33 UTC](https://forum.cpha.pt/t/saldo-cartao-refeicao-santander-appdaemon-python-selenium/8695/15 "2021-12-30T15:33:24Z")

</div>

Boa tarde Jorge,

Sim, de facto tenho obtido o mesmo problema sempre que reinicio o servidor.  
Inclusive tenho de desligar e ligar manualmente o switch para a atualização ficar a funcionar…

Irei tentar analisar e ver com mais calma, mas até agora não consegui resolver.

Abraço

---

<div class="post-metadata">

### Author: ![jocamane](https://forum.cpha.pt/user_avatar/forum.cpha.pt/jocamane/32/10730_2.png) [@jocamane](https://forum.cpha.pt/u/jocamane)
#### Post date: [30 Dezembro , 2021 20:17 UTC](https://forum.cpha.pt/t/saldo-cartao-refeicao-santander-appdaemon-python-selenium/8695/16 "2021-12-30T20:17:53Z")

</div>

Ok Tiago.  
Desde já o meu obrigado pela resposta.  
Vou então ficar a espera.  
Cheguei a conclusão que quando aciono o botão de update dá o erro no log.

---

<div class="post-metadata">

### Author: ![jocamane](https://forum.cpha.pt/user_avatar/forum.cpha.pt/jocamane/32/10730_2.png) [@jocamane](https://forum.cpha.pt/u/jocamane)
#### Post date: [18 Fevereiro , 2022 19:36 UTC](https://forum.cpha.pt/t/saldo-cartao-refeicao-santander-appdaemon-python-selenium/8695/17 "2022-02-18T19:36:17Z")

</div>

Boa noite Tiago.

Temos alguma novidade sobre este bug ?

O erro surge sempre que activo o update e confirmo que após restar o valor fica sempre a zero

Se precisar que faça alguns testes estou disponivel

Obrigado

---

<div class="post-metadata">

### Author: ![Boxexas](https://forum.cpha.pt/user_avatar/forum.cpha.pt/boxexas/32/10526_2.png) [@Boxexas](https://forum.cpha.pt/u/Boxexas)
#### Post date: [8 Março , 2022 14:22 UTC](https://forum.cpha.pt/t/saldo-cartao-refeicao-santander-appdaemon-python-selenium/8695/18 "2022-03-08T14:22:34Z")

</div>

Boas

Ainda não o consegui resolver, e não consigo perceber a origem… Desconfio que seja algo com o template do switch e o seu contexto, porque após a primeira utilização, ele funciona normalmente…

Abraço

---

<div class="post-metadata">

### Author: ![Lesso](https://forum.cpha.pt/user_avatar/forum.cpha.pt/lesso/32/11716_2.png) [@Lesso](https://forum.cpha.pt/u/Lesso)
#### Post date: [20 Abril , 2022 15:45 UTC](https://forum.cpha.pt/t/saldo-cartao-refeicao-santander-appdaemon-python-selenium/8695/19 "2022-04-20T15:45:24Z")

</div>

Alguém sabe como ficaria para extrair o saldo deste site: [https://www.verocard.com.br/para-voce](https://www.verocard.com.br/para-voce). Não manjo nada.

---

<div class="post-metadata">

### Author: ![jocamane](https://forum.cpha.pt/user_avatar/forum.cpha.pt/jocamane/32/10730_2.png) [@jocamane](https://forum.cpha.pt/u/jocamane)
#### Post date: [17 Julho , 2022 12:00 UTC](https://forum.cpha.pt/t/saldo-cartao-refeicao-santander-appdaemon-python-selenium/8695/20 "2022-07-17T12:00:57Z")

</div>

Bom dia.  
Depois de instalar o AppDaemon 0.9.1 deixou de funcionar o resto que funcionava.  
Ele já não dava o valor do saldo sempre que se fazia reboot ao HA. Obrigava a carregar no botão.  
Ao carregar no botãoi dava o erro que já tinha reportado anteriormente “Unable to find referenced entities switch.updatebalance\_on” e agora nada funciona.

No log do appdeamon tem este erro sempre que carrego no botão e o valor continua a 0€, não sei se tem alguma coisa a ver.

2022-07-17 13:49:10.888326 INFO SantanderBalance: – SWITCH ON –  
2022-07-17 13:49:10.892569 INFO SantanderBalance: Start GetBalance  
2022-07-17 13:49:12.299647 INFO SantanderBalance: Start Request  
2022-07-17 13:49:19.815522 INFO SantanderBalance: No cookies  
2022-07-17 13:49:19.821944 INFO SantanderBalance: Login form  
2022-07-17 13:49:20.133192 INFO SantanderBalance: Request Error: ‘WebDriver’ object has no attribute ‘find\_element\_by\_xpath’  
2022-07-17 13:49:20.405660 INFO SantanderBalance: Balance: 0,00  
2022-07-17 13:49:20.496034 WARNING AppDaemon: callback StartProcess() in SantanderBalance has now completed

[Próxima página](https://forum.cpha.pt/t/saldo-cartao-refeicao-santander-appdaemon-python-selenium/8695.md?page=2)
