Medição do consumo de água - Método RF (433, 868MHz)

Havendo já alguns projetos pelo fórum (o do @nunor [link] é especialmente bom) de como medir o consumo de água, admito que a maioria dos métodos (fluxómetro, pulsos, câmeras e AI, etc.) nunca me atraiu; ora pela intervenção direta que se teria de fazer junto ao contador do fornecedor, ora a própria distância ao contador e, no meu caso, a falta de uma fonte de alimentação no local, assim como outras variantes logísticas.

Os pré-requisitos para este projeto eram bastante simples:

  • Pouco consumo
  • Distância
  • Comunicação com Home Assistant
  • …e outros tantos que me fui lembrando ‘pelo caminho’

Atenção que a solução que eu encontrei está limitada ao método que o próprio fornecedor de água utiliza para fazer as suas leituras. Se esse for alguém andar pela rua a tomar notas dos valores dos contadores, não vejo grandes alternativas.
Outra coisa a ter em atenção é que tem de haver acesso a WiFi. Como tenho Access Points exteriores isso não foi problema.

Felizmente, no meu caso, é utilizado um sensor de RF - aqueles utilizados em vários contadores de luz, gás e até de água, que emitem em períodos específicos uma comunicação que permite aos fornecedores, passando junto às casas num veículo, equipado com receptores, automaticamente receberem as leituras.

Exemplos:

Se tiverem a sorte de ter um desses, o passo seguinte será procurarem a documentação (caso exista) de dito aparelho e tentarem obter alguma informação técnica.

Exemplo de um Diehl IZAR RC I R4:
data

Isto permite-nos saber, por exemplo, quais as frequência utilizadas pelo módulo.


Tendo isto feito, existem duas soluções:

A primeira utiliza algo como um Raspberry (o único que tinha livre era um 4 :roll_eyes:; mas pelo que vi deve funcionar até com um Zero) e um receptor RTL-SDR - que é um dongle USB do estilo dos antigos DVB-T TV tuners.
modulos

O site www.rtl-sdr.com será uma optima fonte de referência para terem uma melhor ideia do que se trata e de todas as suas aplicações.
Ditos dipositivos podem ser comprados nos sitios habituais. Ex: Amazon.

Neste caso, a verdade é que o raspberry acaba por ser algo desaproveitado - os recursos utilizados não são demasiado elevados, mas de notar que as temperaturas sobem bastante; o próprio dongle USB junta-se à festa e passado algum tempo nem se pode tocar.

Exemplo de monitorização:
rtl-rasp

Não é a solução que eu aconselho, mas é óptima para testes iniciais.
Basta fazerem a instalação habitual do Raspberry Pi OS, através do Raspberry Pi Imager; escolherem uma imagem básica e realizarem a pré-configuração que permita aceder o raspberry por ssh.

Depois da instalação e a colocação do cartão SD, podem utilizar algo como o Putty e aceder ao Raspberry, colocando de seguida os inevitáveis comandos:

sudo apt update && sudo apt full-upgrade
sudo reboot now

Aconselho também instalarem o uhubctl, caso seja necessário remotamente desligar e ligar de novo o dongle USB. Eles costumam dar o habitual “error -6”, principalmente quando se anda a fazer testes e o dongle fica ocupado no processo anterior.

sudo apt-get install libusb-1.0-0-dev git build-essential
git clone https://github.com/mvp/uhubctl
cd uhubctl
make
sudo make install

Depois de novo reboot.

sudo uhubctl

Neste exemplo podem ver que o dongle USB (Nooelec NESDR SMART v5) está conectado no hub 1-1 e na porta 2.
Portanto, se fosse preciso desliga-lo e depois ligar:

sudo uhubctl -l 1-1 -p 2 -a off
sudo uhubctl -l 1-1 -p 2 -a on

Adiante…

Agora precisamos de falar de que programas vamos utilizar:

  • RTL_433 - apesar do nome é genérico e lê transmissões em várias frequências (433.92 MHz, 868 MHz (SRD), 315 MHz, 345 MHz, e 915 MHz).
  • Wmbusmeter - recepciona os telegrams transmitidos pelos contadores e converte-os em ‘formato legível para humanos’, csv e json.

O RTL_433 é, porventura, o mais simples.

Instalar:

sudo apt-get install rtl-433

E começar a usar; exemplo:

sudo rtl_433 -f 868M

Para verificar todos os dispositivos que estão, ao alcance, a transmitir na frequência 868MHz.
No Github do projecto podem ver os 260 dispositivos que são suportados.

Infelizmente, no meu caso, detectei estações meteorológicas, sistemas de rega, termostatos de aquecedores a óleo, etc.; mas não detectei nenhum contador de água.
No entanto, se encontrarem os vossos; de seguida terão de enviar esses dados por MQTT para o HA.

Video (site) com processo bem explicado.

Quanto ao wmbusmeter, têm várias formas de o utilizar. Como um docker container ou como um daemon, no raspberry.
Não vou passar para aqui todos os comandos. Apenas têm de seguir os passos que estão bem documentados, no GitHub, sobre como instalar nas várias plataformas.

Concluída a instalação têm de fazer um scan:

wmbusmeters auto:t1

Este método encontrou um sem fim de contadores de água. A melhor forma de conseguirem identificar o vosso é terem uma noção da leitura presente, e comparar com os resultados. Quando encontrarem o id & driver que corresponde ao vosso apenas têm de os acrescentar criando um ficheiro:

sudo nano /etc/wmbusmeters.d/MyTapWater

E pondo os dados que obtiveram no scan prévio:

name=MyTapWater
id=xxxxxxxx
driver=xxxxx
#key=caso exista

Estando isso feito, terão de alterar o ficheiro de configuração do wmbusmeters:

sudo nano /etc/wmbusmeters.conf
loglevel=normal
device=rtlwmbus
logtelegrams=false
format=json.
meterfiles=/var/lib/wmbusmeters/meter_readings
meterfilesaction=overwrite
shell=/usr/bin/mosquitto_pub -h ip_mqtt_broker -p 1883 -u mqtt_user -P mqtt_password -t wmbusmeters/"$METER_ID" -m "$METER_JSON"

Podem, depois disso, utilizar um programa como o MQTT Explorer e verificar se estão a receber os dados.

Exemplo:

mqtt

Se tiverem dúvidas podem perguntar que tentarei ajudar.
Podem, também, e se o francês não for problema - caso seja, os subtitles servem para algo :sweat_smile: - verificar este video com o processo de instalação do wmbusmeters do principio ao fim.

Nota:
Alguns contadores, ao que parece, têm o sinal encriptado. O meu vinha em sinal aberto sem qualquer encriptação. Mas do que li pela Internet, muitas pessoas na UE tiveram sucesso quando pediram a key de encriptação aos fornecedores argumentado o direito de acesso aos seus dados.

Article 8 - Protection of personal data

  1. Everyone has the right to the protection of personal data concerning him or her.
  2. Such data must be processed fairly for specified purposes and on the basis of the consent of the person concerned or some other legitimate basis laid down by law. Everyone has the right of access to data which has been collected concerning him or her, and the right to have it rectified.
  3. Compliance with these rules shall be subject to control by an independent authority.

Como sempre, nessas coisas, imagino que seja uma questão de sorte/azar e de quem vos atender.


Por fim, e como eu dizia no inicio; apesar de tudo esta solução - pelo menos no meu caso que apenas tinha um raspberry 4 disponível - funcionando sem qualquer problema, parecia-me algo desadequada (talvez com um Raspberry Zero faça mais sentido).

Por isso continuei a pesquisar e acabei por encontrar outra solução que me agradou mais, recorrendo à utilização de um ESP8266/ESP32 e um módulo CC1101 (atenção que há versão de 433MHz e de 868MHz).

cc1101

No GitHub podem encontrar dita solução, com uma documentação excelente e vários testes realizados.

Tenho um a funcionar desde ontem e parece promissor:
esp-rasp

Será também interessante ver se é possível uma solução all-in-one, como um Lora32.
lora32

3 Curtiram

Estás muita valente @MarAE obrigado pela partilha , muito bom.

1 Curtiu

Precisas de soldar o pin do DIO02 se acessível.

Para permitir o FSK.

Olá Marco, Post muito bem explicado, estou a tentar implementar a leitura do contador de agua com um esp32+cc1101, e como não tenho experiencial com esp estou com duvidas sobre a configuração dos ficheiro a enviar para o esp32, podes enviar a tua configuração?

Ao tentar compilar no esphome tenho erros:

Download wm-esp32-test.yaml

INFO ESPHome 2024.9.1
INFO Reading configuration /config/esphome/wm-esp32-test.yaml…
INFO Updating https://github.com/SzczepanLeon/esphome-components.git@main
WARNING GPIO5 is a strapping PIN and should only be used for I/O with care.
Attaching external pullup/down resistors to strapping pins can cause unexpected failures.
See https://esphome.io/guides/faq.html#why-am-i-getting-a-warning-about-strapping-pins
Failed config

wmbus: [source /config/esphome/wm-esp32-test.yaml:249]
mosi_pin: GPIO23
miso_pin: GPIO19
clk_pin: GPIO18
cs_pin: GPIO05
gdo0_pin: GPIO16
gdo2_pin: GPIO17

[log_unknown] is an invalid option for [wmbus]. Please check the indentation.
log_unknown: True

Boas, @carlosrino.

Houveram algumas alterações, com a última actualização do ESPHome.
Na tua configuração, apaga:

log_unknown: True

E altera logs & sensores.

Ex:

wmbus:
  mosi_pin: GPIO23  ## SI:   braun   3: MOSI Attached to Hardware SPI controller MOSI SPI Interface
  miso_pin: GPIO19  ## SO:   grün    5: MISO Attached to Hardware SPI controller MISO SPI Interface
  clk_pin: GPIO18   ## SCLK: violett 4: SCK  Attached to Hardware SPI controller CLK
  cs_pin: GPIO05    ## CSN:  orange  8: CSN  Attached to Hardware SPI controller
  gdo0_pin: GPIO16  ## GD00: gelb    7: RX Clock output. High Impedance !
  gdo2_pin: GPIO17  ## GD02: weiss   6: TX FIFO status signals. High Impedance !

#Onde antes tinhas log_unknown: True
  all_drivers: False
  log_all: False

sensor:
  - platform: wmbus
    meter_id: 0xXXXXXX #O id do teu meter
    type: izar #O type do teu meter
    sensors:
      - name: "my hot water RSSi"
        field: "rssi"
        accuracy_decimals: 0
        unit_of_measurement: "dBm"
        device_class: "signal_strength"
        state_class: "measurement"
        entity_category: "diagnostic"

      - name: "Watermeter Display"
        field: "total"
        accuracy_decimals: 3
        unit_of_measurement: "m³"
        device_class: "water"
        state_class: "total_increasing"
        icon: "mdi:counter"

O resto da configuração mantém-se igual.

Ps. Se ainda não tiveres o id to teu meter e o type, não colocas os sensors e pões “all_drivers: True” e “log_all: True”; alteras depois para False quando já tiveres a info do teu meter: id & type, e tiveres criado os sensores.

Ps2. Se já tiveres configurados utility_meters poderás ter de alterar o input_sensor, se o entity_id do teu sensor tiver mudado.

Já agora um exemplo de aplicação no frontend, que nunca cheguei a mostrar:

water_display

Dá para saber até qual o consumo de cada descarga do autoclismo, poucos segundos depois de o puxar. :sweat_smile:

2 Curtiram

Wow, que confusão… :exploding_head:

Para copiares a tua configuração e colar aqui, utiliza 3 acentos graves entre o code que partilhas (sem os parênteses):

(```)
code:

(```)

E separa a configuração do log que recebes com os erros; caso contrário é impossível ver se há algum erro de indentation na tua config.

1 Curtiu
---

## ---------------------------------------------------------------------------

## WMBUS METER az-delivery-devkit-v4 + CC1101 for Diehl IZAR RC 868 I R4 PL

## Hardware: ESP32 240MHz, 520KB RAM, 4MB Flash

##

## this version shows all watermeters. Use this for the first test

##

##  1. uses the latest wmbusmeter component from github

##  2. Optional uses syslog component

##

##  SYSLOG:  tail -f /var/log/syslog | grep "water-meter"

##

## ---------------------------------------------------------------------------

substitutions:

  ## device settings

  device_name_short: "water-meter-esp"

  device_description: "ESP32 CC1101 IZAR module"

  projectname: "Diehl IZAR RC 868.Watermeter"

  appversion: "2.0.7"

  ## all watermeters   wmid: "0"

  ## your watermeter: wmid: !secret watermeterId

  wmid: "0"

  ## logger settings

  log_level: "DEBUG"  # not that logging need memory, so in production mode use "WARN"

  log_wmbus: "DEBUG" # Loglevel for wmbus meters component

  log_baudrate: "0" # 0 disable uart logger messages

## ----------------------------------------------------------------

## APPLICATION ESPHOME

## ----------------------------------------------------------------

esphome:

  name: ${device_name_short}

  comment: ${device_description}

  project:

    name: ${projectname}

    version: ${appversion}

  build_path: ./build/${device_name_short}

  on_boot:

    priority: 200

    then:

      - globals.set:

          id: boot_counter

          value: !lambda "return id(boot_counter)+=1;"

      - globals.set:

          id: send_millisecond

          value: !lambda "return millis();"

      - logger.log:

          level: INFO

          tag: "system"

          format: "BOOTMESSAGE:${device_name_short} API is connected, Device ready!"

      - component.update: bootcounter

  on_shutdown:

    priority: 700

    then:

      - logger.log:

          level: ERROR

          tag: "system"

          format: "BOOTMESSAGE:${device_name_short} is down!"

## ----------------------------------------------------------------

## HARDWARE az-delivery-devkit-v4

##          ESP32 240MHz, 520KB RAM, 4MB Flash

## ----------------------------------------------------------------

esp32:

  board: az-delivery-devkit-v4

  framework:

    type: arduino

## ----------------------------------------------------------------

## EXTERNAL COMPONENTS

## ----------------------------------------------------------------

external_components:

  # uses the latest version from SzczepanLeon

  # https://github.com/SzczepanLeon/esphome-components

  # You can make ESPHome check the repository every time by setting this option to 0s

  - source: github://SzczepanLeon/esphome-components@main

    refresh: 0s

    components: [wmbus]

  # use local component from

  # https://github.com/zdzichu6969/esphome-components

  - source:

      type: local

      path: custom_components

    components: [backup]

  # use local component from

  # https://github.com/TheStaticTurtle/esphome_syslog

  # - source:

  #     type: local

  #     path: custom_components

  #   components: [syslog]

## ---------------------------------------------------

## syslog service

## tail -f /var/log/syslog | grep "water-meter"

## ---------------------------------------------------

# syslog:

#   ip_address: !secret syslog_server

#   port: !secret syslog_port

#   min_level: DEBUG

#   enable_logger: true

# ----------------------------------------------------------------

# Save your ESPHome device configuration in firmware and and

# recover it if you lost source files.

# ----------------------------------------------------------------

backup:

  auth:

    username: !secret web_username

    password: !secret web_password

  force_update: false

## ----------------------------------------------------------------

## Global variables

## ----------------------------------------------------------------

globals:

  - id: boot_counter

    type: int

    restore_value: yes

    initial_value: "0"

  - id: last_value

    type: float

    restore_value: yes

    initial_value: "0.00"

  - id: alarm_error_text

    type: std::vector<std::string>

    restore_value: no

    initial_value: '{"no error", "general_alarm","leakage","meter_blocked","back_flow","underflow","overflow","submarine","sensor_fraud","mechanical_fraud"}'

## ---------------------------------------------------

## WIFI Settings 3 wifis

## ---------------------------------------------------

wifi:

  networks:

    - ssid: !secret ssid3_name

      password: !secret ssid3_pswd

      priority: 0

    - ssid: !secret ssid1_name

      password: !secret ssid1_pswd

      priority: 1

    - ssid: !secret ssid2_name

      password: !secret ssid2_pswd

      priority: 2

  domain: !secret domain

## ---------------------------------------------------

## The captive portal component in ESPHome is a

## fallback mechanism for when connecting to the

## configured WiFi fails.

## ---------------------------------------------------

captive_portal:

## ---------------------------------------------------

## LOGGER COMPONENT

## ---------------------------------------------------

logger:

  id: appslogger

  level: ${log_level}

  baud_rate: ${log_baudrate}

  logs:

    wmbus: ${log_wmbus}

    wMBus-lib: ${log_wmbus}

## ---------------------------------------------------

## OTA COMPONENT

## ---------------------------------------------------

ota:

  password: !secret ota_pswd

  platform: esphome

  on_error:

    then:

      - logger.log:

          level: INFO

          tag: "system"

          format: "OTA update error %d"

          args: ["x"]

## ---------------------------------------------------

## WEBSERVER COMPONENT

## Include supporting javascript locally allowing

## it to work without internet access.

## local: true  ## without internet access.

## local: false ## with internet access.

## ---------------------------------------------------

web_server:

  port: 80

  version: 2

  local: true

## ---------------------------------------------------

## Home Assistant API COMPONENT

## ---------------------------------------------------

api:

  id: espapi_wmbus_esp32

  port: 6053

  reboot_timeout: 0s

## ---------------------------------------------------

## SNTP COMPONENT

## ---------------------------------------------------

time:

  - platform: sntp

    id: time_sntp

    timezone: Europe/Berlin

    servers:

      - 0.at.pool.ntp.org

      - 0.pool.ntp.org

      - 1.pool.ntp.org

    on_time_sync:

      then:

        - logger.log:

            tag: "system"

            level: INFO

            format: "Synchronized sntp clock"

## ------------------------------------------------------------------

##           WMBUS CC1101 --> ESP32 az-delivery-devkit-v4

## ------------------------------------------------------------------

##

##

##                                                               o 1 (3.3V)

##                                                               |

##   ╭――x――x――x――x――x――x――x――x――x――x――x――x――x――x――x――x――x――x――x――o―╮

##   |                                                             |

##   |                                                             |

## - | 5v               az-delivery-devkit-v4                      | -- ANT

##   |                                                             |

##   |                          16 17 5  18 19               23    |

##   ╰――x――x――x――x――x――x――x――x――o――x――o――o――o――o――o――o――o――o――o――o―╯

##                              |  |  |  |  |                 |   |

##                              o  |  |  o  |                 |   ╰-o - 2 (GND)

##                              7  o  |  4  o                 o

##                            GDO0 6  | CLK 5                 3

##                               GD02 o    MISO              M0SI

##                                    8

##                                   CSN

##

## ------------------------------------------------------------------

wmbus:

  mosi_pin: GPIO23  ## SI:   braun   3: MOSI Attached to Hardware SPI controller MOSI SPI Interface

  miso_pin: GPIO19  ## SO:   grün    5: MISO Attached to Hardware SPI controller MISO SPI Interface

  clk_pin: GPIO18   ## SCLK: violett 4: SCK  Attached to Hardware SPI controller CLK

  cs_pin: GPIO05    ## CSN:  orange  8: CSN  Attached to Hardware SPI controller

  gdo0_pin: GPIO16  ## GD00: gelb    7: RX Clock output. High Impedance !

  gdo2_pin: GPIO17  ## GD02: weiss   6: TX FIFO status signals. High Impedance !

  # log_unknown (Optional): Show telegrams from not configured meters in log.

  # Defaults to False

 # log_unknown: True

  all_drivers: true

  log_all: true

## ---------------------------------------------------

## SWITCHES

## ---------------------------------------------------

switch:

  # reset boot counter value

  - platform: template

    name: Device Boot Counter reset

    turn_on_action:

      then:

        - lambda: |-

            id(boot_counter) = 0;

            id(bootcounter).publish_state(id(boot_counter));

        - logger.log:

            level: INFO

            tag: "system"

            format: "${device_name_short} reset boot counter o.k!"

        - component.update: bootcounter

  - platform: safe_mode

    name: "Device Restart (Safe Mode)"

  - platform: restart

    name: "Restart"

    id: restart_switch

  - platform: factory_reset

    name: Device Restart Factory

## ---------------------------------------------------

## SENSORS

## ---------------------------------------------------

#sensor:

Log de erros:

INFO ESPHome 2024.9.1
INFO Reading configuration /config/esphome/wm-esp32-test.yaml...
INFO Updating https://github.com/SzczepanLeon/esphome-components.git@main
WARNING GPIO5 is a strapping PIN and should only be used for I/O with care.
Attaching external pullup/down resistors to strapping pins can cause unexpected failures.
See https://esphome.io/guides/faq.html#why-am-i-getting-a-warning-about-strapping-pins
Failed config

esphome: None
  name: water-meter-esp
  comment: ESP32 CC1101 IZAR module
  project: 
    name: Diehl IZAR RC 868.Watermeter
    version: 2.0.7
  build_path: ./build/water-meter-esp
  on_boot: 
    - priority: 200.0
      then: 
        - globals.set: 
            id: boot_counter
            value: !lambda |-
              return id(boot_counter)+=1;
        - globals.set: 
            
            Couldn't find ID 'send_millisecond'. Please check you have defined an ID with that name in your configuration.
            id: send_millisecond
            value: !lambda |-
              return millis();
        - logger.log: 
            level: INFO
            tag: system
            format: BOOTMESSAGE:water-meter-esp API is connected, Device ready!
            args: []
        - component.update: 
            
            Couldn't find ID 'bootcounter'. Please check you have defined an ID with that name in your configuration. These IDs look similar: "boot_counter".
            id: bootcounter
  on_shutdown: 
    - priority: 700.0
switch.template: [source /config/esphome/wm-esp32-test.yaml:267]
  platform: template
  name: Device Boot Counter reset
  turn_on_action: 
    then: 
      - 
        Couldn't find ID 'bootcounter'. Please check you have defined an ID with that name in your configuration. These IDs look similar: "boot_counter".
        lambda: !lambda |-
          id(boot_counter) = 0;
          id(bootcounter).publish_state(id(boot_counter));
      - logger.log: 
          level: INFO
          tag: system
          format: water-meter-esp reset boot counter o.k!
          args: []
      - component.update: 
          
          Couldn't find ID 'bootcounter'. Please check you have defined an ID with that name in your configuration. These IDs look similar: "boot_counter".
          id: bootcounter
  disabled_by_default: False
  restore_mode: ALWAYS_OFF

Desculpem a confusão na publicação anterior, mas já estou a ver que sem ajuda não vou lá.
Muito obrigado pela atenção dispensada.

1 Curtiu

Ok, vamos simplificar as coisas; admito que não sou fã do método utlizado que ‘enfia’ tudo para o esphome.

Não é ideal, mas… vamos tentar de outra forma.

Imagino que seja a primeira configuração que estás a fazer para o device e ainda não tenhas o id e o type do meter, certo?
Se for o caso, cria um novo device no ESPHome e utiliza esta configuração - alterando os valores em “XXXX”, em ap, ota, api que são criados (copia esses valores e insere-os nesta configuração) quando crias o novo device:

esphome:
  name: watermeter
  friendly_name: watermeter

esp32:
  board: az-delivery-devkit-v4
  framework:
    type: arduino

logger:
  id: appslogger
  level: DEBUG
  baud_rate: 0
  logs:
    wmbus: DEBUG
    wMBus-lib: WARN
    sensor: WARN
    sensor.filter: WARN
    text_sensor: WARN
    api.service: ERROR
    json: ERROR
    mqtt: WARN
    scheduler: ERROR
    wifi: WARN
    component: ERROR
    api: WARN

time:
  - platform: sntp
    id: time_sntp
    timezone: Europe/Lisbon
    servers:
      - 0.at.pool.ntp.org
      - 0.pool.ntp.org
      - 1.pool.ntp.org

api:
  encryption:
    key: "XXXX" #altera valor

ota:
  - platform: esphome
    password: "XXXX" #altera valor

wifi:
  networks:
  - ssid: "XXXXX" #coloca o SSID do teu WIFI
    password: "XXXXX" #coloca a password

  ap:
    ssid: "Watermeter Fallback Hotspot"
    password: "XXXX" #altera valor


captive_portal:

    
external_components:
  - source: github://SzczepanLeon/esphome-components@main


wmbus:
  mosi_pin: GPIO23  ## SI:   braun   3: MOSI Attached to Hardware SPI controller MOSI SPI Interface
  miso_pin: GPIO19  ## SO:   grün    5: MISO Attached to Hardware SPI controller MISO SPI Interface
  clk_pin: GPIO18   ## SCLK: violett 4: SCK  Attached to Hardware SPI controller CLK
  cs_pin: GPIO05    ## CSN:  orange  8: CSN  Attached to Hardware SPI controller
  gdo0_pin: GPIO16  ## GD00: gelb    7: RX Clock output. High Impedance !
  gdo2_pin: GPIO17  ## GD02: weiss   6: TX FIFO status signals. High Impedance !


  all_drivers: True
  log_all: True

Se tudo correr bem, irá surgir no log algo assim:

[12:07:35][D][mbus:035]: Received T1 A frame
[12:07:35][I][wmbus:085]: izar [0xXXXXXXX] RSSI: -76dBm T: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX (26) T1 A
[12:07:39][D][mbus:035]: Received T1 A frame
[12:07:39][I][wmbus:085]: izar [0xXXXXXXX] RSSI: -83dBm T: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX (26) T1 A

Daí podemos descobrir o type; que neste caso é “izar”, e o id do meter que é o valor seguinte [0xXXXXXX]. Mas como vês surgem 2 meters - podem até aparecer mais, e daí eu dizer que não é o método ideal, pois a forma de descobrir qual será o teu será pela força do sinal RSSI: quando maior, mais perto estará do teu device.

Mas de qualquer forma, pode-se depois confirmar com a criação dos sensores e confirmar se o valor total que o contador apresenta bate certo, ou ir alterando o id do meter até ter o mesmo valor do contador.


Estando isso feito apenas tens de acrescentar os sensores/switches à configuração:

sensor:
  - platform: wmbus
    meter_id: 0xXXXXXXX #altera pelo id do teu contador
    type: izar #altera pelo type do teu contador
    sensors:
      - name: "my hot water RSSi"
        field: "rssi"
        accuracy_decimals: 0
        unit_of_measurement: "dBm"
        device_class: "signal_strength"
        state_class: "measurement"
        entity_category: "diagnostic"

      - name: "Watermeter Display"
        field: "total"
        accuracy_decimals: 3
        unit_of_measurement: "m³"
        device_class: "water"
        state_class: "total_increasing"
        icon: "mdi:counter"


switch:
  - platform: restart
    name: "Restart Device"
    id: restart_switch
    icon: mdi:restart
2 Curtiram

:ok_hand:
Tens toda a razão, visto assim fica tudo muito mais claro, vou testar e depois já comento.
Mais uma vez muitíssimo obrigado pela atenção.

1 Curtiu

Olá, tenho este log, devo ter algo mal:

INFO ESPHome 2024.9.1
INFO Reading configuration /config/esphome/watermeter.yaml...
WARNING GPIO5 is a strapping PIN and should only be used for I/O with care.
Attaching external pullup/down resistors to strapping pins can cause unexpected failures.
See https://esphome.io/guides/faq.html#why-am-i-getting-a-warning-about-strapping-pins
INFO Starting log output from 192.168.17.48 using esphome API
INFO Successfully connected to watermeter @ 192.168.17.48 in 0.122s
INFO Successful handshake with watermeter @ 192.168.17.48 in 0.063s
[21:58:08][I][app:100]: ESPHome version 2024.9.1 compiled on Sep 27 2024, 21:14:48
[21:58:08][C][logger:185]: Logger:
[21:58:08][C][logger:186]:   Level: DEBUG
[21:58:08][C][logger:188]:   Log Baud Rate: 0
[21:58:08][C][logger:189]:   Hardware UART: UART0
[21:58:08][C][logger:193]:   Level for 'wmbus': DEBUG
[21:58:08][C][logger:193]:   Level for 'wMBus-lib': WARN
[21:58:08][C][logger:193]:   Level for 'sensor': WARN
[21:58:08][C][logger:193]:   Level for 'sensor.filter': WARN
[21:58:08][C][logger:193]:   Level for 'text_sensor': WARN
[21:58:08][C][logger:193]:   Level for 'api.service': ERROR
[21:58:08][C][logger:193]:   Level for 'json': ERROR
[21:58:08][C][logger:193]:   Level for 'mqtt': WARN
[21:58:08][C][logger:193]:   Level for 'scheduler': ERROR
[21:58:08][C][logger:193]:   Level for 'wifi': WARN
[21:58:08][C][logger:193]:   Level for 'component': ERROR
[21:58:08][C][logger:193]:   Level for 'api': WARN
[21:58:08][C][captive_portal:089]: Captive Portal:
[21:58:08][C][sntp:048]: SNTP Time:
[21:58:08][C][sntp:049]:   Server 1: '0.at.pool.ntp.org'
[21:58:08][C][sntp:050]:   Server 2: '0.pool.ntp.org'
[21:58:08][C][sntp:051]:   Server 3: '1.pool.ntp.org'
[21:58:08][C][sntp:052]:   Timezone: 'WET0WEST,M3.5.0/1,M10.5.0'
[21:58:08][C][mdns:116]: mDNS:
[21:58:08][C][mdns:117]:   Hostname: watermeter
[21:58:08][C][esphome.ota:073]: Over-The-Air updates:
[21:58:08][C][esphome.ota:074]:   Address: 192.168.17.48:3232
[21:58:08][C][esphome.ota:075]:   Version: 2
[21:58:08][C][esphome.ota:078]:   Password configured
[21:58:08][C][safe_mode:018]: Safe Mode:
[21:58:08][C][safe_mode:020]:   Boot considered successful after 60 seconds
[21:58:08][C][safe_mode:021]:   Invoke after 10 boot attempts
[21:58:08][C][safe_mode:023]:   Remain in safe mode for 300 seconds
[21:58:08][C][wmbus:299]: wM-Bus v4.0.5-1.17.1-b8f4a945:
[21:58:08][C][wmbus:316]:   MAC: CDF9D108
[21:58:08][C][wmbus:317]:   CC1101 frequency: 868.950 MHz
[21:58:08][C][wmbus:318]:   CC1101 SPI bus:
[21:58:08][E][wmbus:320]:    Check connection to CC1101!
[21:58:08][C][wmbus:322]:     MOSI Pin: GPIO23
[21:58:08][C][wmbus:323]:     MISO Pin: GPIO19
[21:58:08][C][wmbus:324]:     CLK Pin:  GPIO18
[21:58:08][C][wmbus:325]:     CS Pin:   GPIO5
[21:58:08][C][wmbus:326]:     GDO0 Pin: GPIO16
[21:58:08][C][wmbus:327]:     GDO2 Pin: GPIO17
[21:58:08][C][wmbus:333]:   Available drivers: wme5, weh_07, watertech, waterstarm, vario451mid, vario451, vario411, unknown, unismart, ultrimis, ultraheat, tsd2, topaseskr, supercom587, sontex868, sharky774, sharky, sensostar, rfmtx1, rfmamb, qwater, qualcosonic, qsmoke, qheat_55_us, qheat, qcaloric, q400, pollucomf, piigth, omnipower, nemo, munia, multical21, mkradio4a, mkradio4, mkradio3, minomess, microclima, lse_08, lse_07_17, lansenth, lansensm, lansenrp, lansenpu, lansendw, kampress, kamheat, izar, iwm
[21:58:08][E][component:082]:   Component wmbus is marked FAILED
[21:58:40][I][safe_mode:041]: Boot seems successful; resetting boot loop counter
[21:58:40][D][esp32.preferences:114]: Saving 1 preferences to flash...
[21:58:40][D][esp32.preferences:143]: Saving 1 preferences to flash: 0 cached, 1 written, 0 failed

Olá, já verifiquei todas as ligações e parecem-me bem, pela foto podem-me confirmar que está tudo ok?

A seguir ao GND é o 19.

Edit:

Bem depende.

Tenta trocar no yaml o 19 com o 23

1 Curtiu

já troquei o 19 com o 23 e dá o mesmo erro.

À primeira vista as conexões anteriores parecem estar certas.
Experimenta, ainda assim, fazer um teste de continuidade entre a solda nas traseiras do CC1101 e os pins inferiores do ESP32.

Em último caso pode até ser um problema de um dos componentes; daí eu gostar de ter sempre mais do que um - pelo sim, pelo não.

Edit:
No github vês, em issues, muita gente a queixar-se de boards CC1101 defeituosas…
Eu comprei esta.

1 Curtiu

OK, Marco, quase de certeza que deve ser a placa CC1101 com defeito, vou tentar comprar de outro fornecedor.
obg.

Por baixo facilmente fazem shunt com o ground plane, basta calor a mais.

Pelo preço provavelmente há muitos defeituosos.

1 Curtiu

Olá, já recebi o novo CC1101 de outro fornecedor e este já funciona,

[21:06:53][D][mbus:035]: Received T1 A frame
[21:06:53][I][wmbus:091]: izar [0x21xxxxxxx] RSSI: -79dBm T: 1944304CE3B14F214404B131180013E6C41CD3CCFEC69E2B6004 (26) T1 A
[21:07:02][D][mbus:035]: Received T1 A frame

Mais uma vez obrigado pela ajuda.

2 Curtiram

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


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