Cartão Refeição MyEdenred

Bom dia. Parece que a minha empresa vai mudar para isto. Afinal ainda funciona?
Eu, com o Coverflex, consegui automatizar tudo pelas notificações da APP, consigo manter registo ao cêntimo sem ter de abrir app nenhuma, seja entrada seja saída de valores, mas é claro que tenho de permitir ao Home Assistant Mobile ler as minhas notificações dessa app.
Caso a API já não funcione, será viável usar as notificações da Edenred da mesma forma? (Ainda não tenho conta, não tenho como testar, mas já a precaver)
Obrigado!

Tenho edenred e não tem notificações de saldo

Não sei o que acontece, mas mesmo colocando:
Repository: https://github.com/netsoft-ruidias/ha-custom-component-myedenred/
e definindo type: Integration
Ao clicar em Add nada acontece!

Seria algum problema somente no meu home Assistant, estou fazendo algo mal com esse repositório?

Sh#&, passo de mal para ainda pior…
Nem notificação de recebimentos / gastos? Na coverflex posso ligar e permitir notificações para todos os movimentos, é o que uso para ter tudo registado. Funciona bastante bem:

Código automação
alias: "Financas: Movimentos Pedro"
description: ""
triggers:
  - entity_id:
      - sensor.telemovel_pedro_last_notification
    id: last_notification
    trigger: state
    to: null
conditions:
  - condition: template
    value_template: |-
      {% set texto = states('sensor.telemovel_pedro_last_notification')|lower %}
      {{
        'pagamento' in texto or
        'pag. servicos' in texto or
        'recebeu' in texto or
        'compra' in texto or
        'carregamento' in texto or
        'transferencia' in texto
      }}
actions:
  - variables:
      texto: "{{ states('sensor.telemovel_pedro_last_notification')|lower }}"
      app: "{{ state_attr('sensor.telemovel_pedro_last_notification','package')}}"
  - choose:
      - conditions:
          - alias: Notificação BPI
            condition: template
            value_template: "{{ app in ['pt.bancobpi.mobile.fiabilizacao']}}"
        sequence:
          - action: input_number.set_value
            metadata: {}
            data:
              value: >-
                {% if 'efetuado um pagamento' in texto or 'pag. servicos' in
                texto or 'levantamento' in texto %}
                  {{ 0 - (texto |regex_findall_index('(\d+(?:\.\d+)?)\s+eur')|float(default=0))}}
                {% elif 'recebeu' in texto %}
                  {{(texto |regex_findall_index('(\d+(?:\.\d+)?)\s+eur')|float(default=0))}}
                {% elif 'transferencia' in texto %}
                  {{ 0 - (texto |regex_findall_index('(\d+(?:\.\d+)?)\s+eur')|float(default=0))}}
                {% else %}
                  0
                {% endif %}
            target:
              entity_id: input_number.financas_movimentos_pedro
          - action: input_number.set_value
            metadata: {}
            data:
              value: >-
                {{ states('input_number.financas_bpi_saldo')|float(default=0) +
                states('input_number.financas_movimentos_pedro')|float(default=0)
                }}
            target:
              entity_id: input_number.financas_bpi_saldo
          - data:
              config_entry: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
              worksheet: Financas_Pedro
              data:
                Valor: >-
                  {% if 'efetuado um pagamento' in texto or 'pag. servicos' in
                  texto or 'levantamento' in texto %}
                    {{ 0 - (texto |regex_findall_index('(\d+(?:\.\d+)?)\s+eur')|float(default=0))}}
                  {% elif 'recebeu' in texto %}
                    {{(texto |regex_findall_index('(\d+(?:\.\d+)?)\s+eur')|float(default=0))}}
                  {% elif 'transferencia' in texto %}
                    {{(texto |regex_findall_index('(\d+(?:\.\d+)?)\s+eur')|float(default=0))}}
                  {% else %}
                    0
                  {% endif %}
                Entidade: |-
                  {%- if 'efetuado um pagamento' in texto -%}
                    {{- texto | regex_findall_index('eur em (.+)') | default('Desconhecida') | upper -}}
                  {% elif 'pag. servicos' in texto %}
                    {{ 'ENTIDADE '}} {{- texto | regex_findall_index('entidade\s(\d{5})') | default('Desconhecida') | upper -}}
                  {%- elif 'recebeu' in texto -%}
                    PEDRO BPI Ordem
                  {%- elif 'transferencia' in texto -%}
                    {{ 'TRANSF. '}} {{-  texto | upper | regex_findall_index('CONTA\s+([A-Za-z0-9]+)') -}}
                  {%- elif 'levantamento' in texto -%}
                    PEDRO Trocos
                  {% else %}
                    Desconhecida
                  {%- endif -%}
            action: google_sheets.append_sheet
      - conditions:
          - alias: Notificação Mensagens BPI
            condition: template
            value_template: >-
              {{ app in ['com.google.android.apps.messaging'] and 'bpi net' in
              texto }}
        sequence:
          - action: input_number.set_value
            metadata: {}
            data:
              value: |-
                {% if 'pagamento ao estado' in texto  %}
                  {{ 0 - (texto |regex_findall_index('(\d+(?:\.\d+)?)\s+eur')|float(default=0))}}
                {% elif 'transferencia' in texto %}
                  {{ 0 - (texto |regex_findall_index('(\d+(?:\.\d+)?)\s+eur')|float(default=0))}}
                {% else %}
                  0
                {% endif %}
            target:
              entity_id: input_number.financas_movimentos_pedro
          - action: input_number.set_value
            metadata: {}
            data:
              value: >-
                {{ states('input_number.financas_bpi_saldo')|float(default=0) +
                states('input_number.financas_movimentos_pedro')|float(default=0)
                }}
            target:
              entity_id: input_number.financas_bpi_saldo
          - data:
              config_entry: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
              worksheet: Financas_Pedro
              data:
                Valor: |-
                  {% if 'pagamento ao estado' in texto  %}
                    {{ 0 - (texto |regex_findall_index('(\d+(?:\.\d+)?)\s+eur')|float(default=0))}}
                  {% elif 'transferencia' in texto %}
                    {{(texto |regex_findall_index('(\d+(?:\.\d+)?)\s+eur')|float(default=0))}}
                  {% else %}
                    0
                  {% endif %}
                Entidade: |-
                  {%- if 'pagamento ao estado' in texto -%}
                    Pagamento Estado
                  {%- elif 'transferencia' in texto -%}
                    {{ 'TRANSF. '}} {{-  texto | upper | regex_findall_index('CONTA\s+([A-Za-z0-9]+)') -}}
                  {% else %}
                    Desconhecida
                  {%- endif -%}
            action: google_sheets.append_sheet
      - conditions:
          - alias: Notificação CoverFlex
            condition: template
            value_template: "{{ app in ['com.coverflex']}}"
        sequence:
          - action: input_number.set_value
            metadata: {}
            data:
              value: |-
                {% if 'compra' in texto %}
                  {{ 0 - (texto |regex_findall_index('€(\d+.\d{2})')|float(default=0)) }}
                {% elif 'carregamento' in texto %}
                  {% if 'alimentação' in texto %}
                    {{ (texto |regex_findall_index('€(\d+.\d{2})')|float(default=0)) }}
                  {% elif 'benefícios' in texto %}
                    {{ (texto |regex_findall_index('€(\d+.\d{2})')|float(default=0)) }}
                  {% else %}
                    0
                  {% endif %}
                {% else %}
                  0
                {% endif %}
            target:
              entity_id: input_number.financas_movimentos_pedro
          - if:
              - condition: template
                value_template: >-
                  {{ 0 -
                  states('input_number.financas_movimentos_pedro')|float(default=0)
                  >
                  states('input_number.financas_coverflex_beneficios_saldo')|float(default=0)
                  }}
            then:
              - action: input_number.set_value
                metadata: {}
                data:
                  value: >-
                    {{
                    states('input_number.financas_coverflex_alimentacao_saldo')|float(default=0)
                    +
                    states('input_number.financas_movimentos_pedro')|float(default=0)
                    }}
                target:
                  entity_id: input_number.financas_coverflex_alimentacao_saldo
            else:
              - if:
                  - condition: template
                    value_template: >-
                      {{ 'farm' in texto or 'phar' in texto or 'well' in texto
                      or 'benefícios' in texto }}
                then:
                  - action: input_number.set_value
                    metadata: {}
                    data:
                      value: >-
                        {{
                        states('input_number.financas_coverflex_beneficios_saldo')|float(default=0)
                        +
                        states('input_number.financas_movimentos_pedro')|float(default=0)
                        }}
                    target:
                      entity_id: input_number.financas_coverflex_beneficios_saldo
                else:
                  - action: input_number.set_value
                    metadata: {}
                    data:
                      value: >-
                        {{
                        states('input_number.financas_coverflex_alimentacao_saldo')|float(default=0)
                        +
                        states('input_number.financas_movimentos_pedro')|float(default=0)
                        }}
                    target:
                      entity_id: input_number.financas_coverflex_alimentacao_saldo
          - data:
              config_entry: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
              worksheet: Financas_Pedro
              data:
                Valor: |-
                  {% if 'compra' in texto %}
                    {{ 0 - (texto |regex_findall_index('€(\d+.\d{2})')|float(default=0)) }}
                  {% elif 'carregamento' in texto %}
                    {% if 'alimentação' in texto %}
                      {{ (texto |regex_findall_index('€(\d+.\d{2})')|float(default=0)) }}
                    {% elif 'benefícios' in texto %}
                      {{ (texto |regex_findall_index('€(\d+.\d{2})')|float(default=0)) }}
                    {% else %}
                      0
                    {% endif %}
                  {% else %}
                    0
                  {% endif %}
                Entidade: |-
                  {%- if 'compra' in texto -%}
                    {{- texto | regex_findall_index('confirmada, (.+)') | default('Desconhecida') | upper -}}
                  {% elif 'carregamento' in texto %}
                    {% if 'alimentação' in texto %}
                      CoverFlex Alimentação
                    {% elif 'benefícios' in texto %}
                      CoverFlex Benefícios
                    {% else %}
                      Desconhecida
                    {% endif %}
                  {% else %}
                    Desconhecida
                  {%- endif -%}
            action: google_sheets.append_sheet
mode: queued
max: 10

Neste caso utilizo também para apanhar coisas da app do meu banco (basicamente esta automação tem as coisas que quero capturar a nível financeiro por notificações).
Será que não dá para ter a mesma abordagem com a Edenred?

Mesmo não existindo notificações seria possivel implementar algo, de forma, a trazer essas “notificações”.

Como sugeres essa implementação? Vou precisar no início do próximo mês…

Sobre o home assistant não posso falar mas é possivel criar um script em python para fazer essas questão das notificações.

Podes dar uma orientação / ideia sobre isto? Home Assistant é python; não tenho muitos conhecimentos, mas se souber por onde ir talvez consiga “cavar” o suficiente… Obrigado!

Deixa ver se consigo criar aqui um exemplo simples

Há uma app da PlayStore (https://play.google.com/store/apps/details?id=pt.fstn.mymealcardfull), que permite consultar os saldos de vários cartões refeição. Deverá pois ser possível ter alguma abordagem semelhante à deste desenvolvedor para conseguir fazer isto no HA… Já tentei contactar o autor, ainda sem resposta. Esta app não dá à mesma notificações, que era o que pretendia, portanto fico na mesma. Da EdenRed já me responderam que não está previsto qualquer tipo de notificações push de saldo ou movimentos na app deles.
Está-me a fazer confusão não ter isto controlado…
Tenho de arranjar maneira de conseguir fazer isto, ando a explorar hipóteses com autenticação no site deles, mas as autorizações de cookies e os popups dão-me cabo da abordagem…

Bem, acho que já tenho progresso e já tenho algo que funciona, mas tenho de consolidar os passos. Estou a fazer 2 requests por CURL, o primeiro dá-me um token e o segundo, onde uso o token, dá o saldo que pretendo; têm de ser usados em sequência.
Faltam-me consolidar isto numa sequência, e obter um valor para o 2º CURL, que no meu caso sei (um id de cartão que consigo obter por análise dos meus dados), mas não sei como o obter automaticamente para adaptar a toda a gente.
Se alguém quiser ajudar… HELP!

Deixa ver se durante o dia de hoje consigo criar um script para te ajudar com isso.

Se quiseres podes partilhar o código que tens. Assim é mais rápido para dar “setup” aqui

Estava a testar e consegues usar este script.

Podes extrair apenas a função get_balance() para o que pretendes. Só tens que definir a lógica para teres as notificações.

Por exemplo uma variavel com o dia em que recebes e outra que vai guardando o saldo.

Se precisares de algum ajuda é só dizeres

1 Curtiu

Preciso realmente estar em controlo das minhas finanças, e sou teimoso. Os recursos hoje em dia facilitam estas coisas; depois de umas quantas cabeçadas, muito teste com CURLs para obter tudo o que queria, e com a ajuda de IA, aqui vai a minha primeira abordagem:

:slight_smile:

Dá para instalar como repositório custom no HACS.
Aceita-se ajuda / melhorias, mas não peçam demais que não sou expert. :smiley:

Abraços a todos!!!

Já agora, como já usas isto há mais tempo, qual aconselhas ser o mínimo tempo de refresh para não haver algum tipo de ban?

Acho que podes partir de 60 em 60min, para teres as notificações de saldo.
Podes ir mais a fundo e ter inclusivé o que foi gasto nesse ultimo periodo.

Não percebo muito de HA, mas se tiveres alguma questão com o código posso dar uma olhadela.

1 Curtiu

A minha cidade é pequena, e posso-me dar ao luxo de mapear os principais supermercados em zonas. Todos estão identificados com “Supermercado XXXXX”. Com isto consigo fazer algumas automações com o telemóvel, notificações e cartões condicionais, por exemplo para abrir automaticamente a lista de compras e mostrar-me o saldo que tenho em cada cartão, para saber qual utilizar. Agora já consigo ter isto. Além disso, posso também agora, coma minha integração, atualizar automaticamente o saldo Edenred 1 minuto depois de sair de um supermercado :stuck_out_tongue: .

description: "Edenred – Atualizar ao sair de qualquer supermercado"
mode: single
triggers:
  - trigger: state
    entity_id:
      - person.pedro
    for:
      minutes: 1
conditions:
  - condition: template
    value_template: |
      {{ trigger.from_state is not none
               and trigger.from_state.state != trigger.to_state.state
               and trigger.from_state.state != 'unknown'
               and trigger.from_state.state != 'unavailable'
               and trigger.from_state.name is not none
               and 'supermercado' in trigger.from_state.name | lower }}
actions:
  - action: edenred_pt.force_update
    metadata: {}
    data: {}

Maluqueiras, enquanto não há € para comprar mais um dispositivo qualquer que me dê mais para coçar… :slight_smile:

1 Curtiu

@RuiDias, já não tenho CoverFlex, mas provavelmente a abordagem acima deve dar caminho. A API não é oficial, mas andei a cavar na depuração do browser para achar os pedidos do site. Pode ser que para os outros cartões seja algo semelhante…

Adicionei uns quantos atributos aos sensores, para facilitar a utilização de custom:list-card para listar os movimentos.

type: custom:list-card
entity: sensor.edenred_XXXXXXXX_ultimo_movimento
feed_attribute: movements
title: Movimentos Edenred
row_limit: 10
columns:
  - title: Data / Hora
    field: date_time
    style:
      - text-align: center
  - title: Entidade
    field: description
  - title: Cat.
    field: cat
  - title: M
    field: t
  - title: T
    field: type
  - title: Valor
    field: amount
    postfix: " €"
    style:
      - text-align: right
      - white-space: nowrap

Adicionei ainda mais uns atributos para quem quiser usar (cada um opcional, e várias escolhas), e renomeei os atributos para EN para consistência. Movimentos a 0 filtrados.
Abraços!

1 Curtiu

Boa tarde a todos

Tenho (mais ou menos) acompanhado a thread pelas notificações no e-mail, apesar do trabalho que não deixa tempo para (quase) mais nada…

Infelizmente já não tenho Coverflex por isso não posso testar esta nova abordagem, mas estou disponível para ajustar o código no que seja necessário para reativar esta integração

Vou reservar os próximos sábados para isto, irei dando novidades, entretanto, continuem com o bom trabalho

Abraço

2 Curtiram

Copyright © 2017-. Todos os direitos reservados
CPHA.pt - info@cpha.pt


FAQ | Termos de Serviço/Regras | Política de Privacidade