Receive zigbee sensor data on emonPi

Hi Glyn,

I tried a different Zigbee sensor when the Temp/Humidity sensor wasn’t creating an input, to see if another sensor would work.

The temp/humidity sensor is the one that I want to get working and I have put this back as the topic. My question is how do we create the inputs? Is there a way to manually create the inputs?

thank you,

Gordon

No. In emonCMS, Inputs are created automatically when it receives data in a format it recognises. emonHub is one source of data, and through a number of ‘Interfacers’ it can accept data in a number of different formats, convert and pass this data forward to emonCMS.

From Glyn’s comment, I suspect you need to look into writing your own Interfacer for your particular sensor. I’d like to be able to help, however I don’t know enough about the internals of emonHub, emonCMS, nor indeed the language.

1 Like

Got it Working!!

the problem turned out to be I needed two instances of [[emoncmsorg]]. One to send it to the cloud and the other to send it to the local RaspberryPi. (see my edits below).

    [[emoncmsorg]]
        Type = EmonHubEmoncmsHTTPInterfacer
        [[[init_settings]]]
        [[[runtimesettings]]]
            pubchannels = ToRFM12,
            subchannels = ToEmonCMS,
            url = http://emoncms.org
            apikey = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
            senddata = 1    # Enable sending data to Emoncms.org
            sendnames = 1    # Send full input names (compression will be automatically enabled)
            interval = 30    # Bulk send interval to Emoncms.org in seconds

    [[emoncmsorg_local]]
        Type = EmonHubEmoncmsHTTPInterfacer
        [[[init_settings]]]
        [[[runtimesettings]]]
            pubchannels = ToRFM12,
            subchannels = ToEmonCMS,
            url = http://localhost
            apikey = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
            senddata = 1    # Enable sending data to Emoncms.org
            sendnames = 1    # Send full input names (compression will be automatically enabled)
            interval = 30    # Bulk send interval to Emoncms.org in seconds

I plan to convert the Air Quality text into numeric values before they get picked up by emon.

To get multiple sensors working, I started with [[MQTT]] for the first sensor, and then added subsequent sensor sections as [[MQTT_sub1]] and [[MQTT_sub2]]

    [[MQTT]]
        Type = EmonHubMqttInterfacer
        [[[init_settings]]]
            mqtt_host = 127.0.0.1
            mqtt_port = 1883
            mqtt_user = emonpi
            mqtt_passwd = emonpimqtt2016
        [[[runtimesettings]]]
           pubchannels = ToEmonCMS,
           node_JSON_enable = 1
           node_JSON_basetopic = zigbee2mqtt/Ofc Air Quality
         
  [[MQTT_sub1]]
        Type = EmonHubMqttInterfacer
        [[[init_settings]]]
            mqtt_host = 127.0.0.1
            mqtt_port = 1883
            mqtt_user = emonpi
            mqtt_passwd = emonpimqtt2016
        [[[runtimesettings]]]
           pubchannels = ToEmonCMS,
           node_JSON_enable = 1
           node_JSON_basetopic = zigbee2mqtt/Ofc Temp Humid

 [[MQTT_sub2]]
        Type = EmonHubMqttInterfacer
        [[[init_settings]]]
            mqtt_host = 127.0.0.1
            mqtt_port = 1883
            mqtt_user = emonpi
            mqtt_passwd = emonpimqtt2016
        [[[runtimesettings]]]
           pubchannels = ToEmonCMS,
           node_JSON_enable = 1
           node_JSON_basetopic = zigbee2mqtt/Ofc Water Leak

I will document all the steps once I get it fully functional.

Gordon

2 Likes

No, it wasn’t (although the solution is a valid configuration).

Read the Basic Concepts about sub and pub channels.

Your MQTT interfacer has a pubchannel instead of a subchannel.

image

Default setup for comparison.

image

However, don’t change it else you will have 2 sets of inputs.

Also, the 2 MQTT interfacers will simply send the same data twice to 2 different base topics (if the have the sane subchannel).

Not needed (except the Zigbee part) - it was your misconfigured system that was the issue.

Nice work! :partying_face:

Brian,

thank you for the input. I was convinced I had a configuration issue and was determined to get it to work. This project has been a challenging one as I am starting with zero experience in Linux, but equally, it has been very rewarding to finally get it working.

I had three big issues. One, I could not get zigbee2mqtt to work via Docker and ended up going with a direct Linux install. Two, getting the data into emonCMS just wasn’t working locally, but did on emoncms.org. Third, multiple ZigBee sensors hadn’t been tested previously in Glyn’s project, so this looked to be new ground.

I will be updating this post with all the steps that worked for me so that anyone else wanting to do this has a roadmap to follow.

I do appreciate all the help and support from this community.

Regards,

Gordon

2 Likes

Will emonPi support both emonTH and Zigbee devices?
I have been able to configure an emonBase to support multiple emonTHs or multiple Zigbee devices. Still, when I try to run both on the same emonBase, the zigbee messages appear to combine with the emonTH message. However, I don’t believe the zigbee messages are being picked up.

Is this possible with the correct configuration? If it is, I would appreciate any advice.

Thanks,

Below is the messaging I am seeing. I would expect to see the zigbee data in the third line down, but it is the data from emonTH from the lines below.

2024-11-01 13:28:45,500 INFO     MQTT_sub1  Publishing 'node' formatted msg
2024-11-01 13:28:45,501 DEBUG    MQTT_sub1  Publishing: emonhub/rx/24/values 27,0,15,2.9000000000000004,1,-39
2024-11-01 13:28:45,502 DEBUG    MQTT_sub1  Publishing: zigbee2mqtt/BALAB S100 THBALAB_TH_S101 {"temperature": 27, "external temperature": 0, "humidity": 15, "battery": 2.9000000000000004, "pulseCount": 1, "time": 1730492925.2839205, "rssi": -39}
2024-11-01 13:28:45,503 DEBUG    MQTT       Publishing: emon/BALAB_TH_S101/temperature 27
2024-11-01 13:28:45,504 DEBUG    MQTT       Publishing: emon/BALAB_TH_S101/external temperature 0
2024-11-01 13:28:45,505 DEBUG    MQTT       Publishing: emon/BALAB_TH_S101/humidity 15
2024-11-01 13:28:45,506 DEBUG    MQTT       Publishing: emon/BALAB_TH_S101/battery 2.9000000000000004
2024-11-01 13:28:45,506 DEBUG    MQTT       Publishing: emon/BALAB_TH_S101/pulseCount 1
2024-11-01 13:28:45,507 DEBUG    MQTT       Publishing: emon/BALAB_TH_S101/rssi -39
2024-11-01 13:28:45,508 DEBUG    MQTT       Publishing: emon/BALAB_TH_S101 {"temperature": 27, "external temperature": 0, "humidity": 15, "battery": 2.9000000000000004, "pulseCount": 1, "time": 1730492925.2839205, "rssi": -39}

Below are my MQTT settings in emonHub.

    [[MQTT]]
        Type = EmonHubMqttInterfacer
        [[[init_settings]]]
            mqtt_host = 127.0.0.1
            mqtt_port = 1883
            mqtt_user = emonpi
            mqtt_passwd = emonpimqtt2016
        
        [[[runtimesettings]]]
            pubchannels = ToRFM12,
            subchannels = ToEmonCMS,
            
            # emonhub/rx/10/values format
            # Use with emoncms Nodes module
            node_format_enable = 0
            node_format_basetopic = emon/
            
            # emon/emontx/power1 format - use with Emoncms MQTT input
            # http://github.com/emoncms/emoncms/blob/master/docs/RaspberryPi/MQTT.md
            nodevar_format_enable = 1
            nodevar_format_basetopic = emon/
            
            # Single JSON payload published  - use with Emoncms MQTT
            node_JSON_enable = 1
            node_JSON_basetopic = emon/
            
[[MQTT_sub1]]
        Type = EmonHubMqttInterfacer
        [[[init_settings]]]
            mqtt_host = 127.0.0.1
            mqtt_port = 1883
            mqtt_user = emonpi
            mqtt_passwd = emonpimqtt2016

        [[[runtimesettings]]]
            pubchannels = ToRFM12,
            subchannels = ToEmonCMS,
            node_JSON_enable = 1
            node_JSON_basetopic =  zigbee2mqtt/BALAB S100 TH

What exactly are you trying to do?

At the moment you are publishing data to the same MQTT Broker on numerous different topics.

Don’t enable both - you are sending the same data twice which will really confuse emoncms.

node_JSON creates this publish to the broker;

node_format creates this publish to the broker;

This creates this publish to the broker (not collected by emoncms);

and

As you have taken out the line

(must default to on and topic emonhub)

Hi Brian,

I am attempting to use my emonBase to capture readings from several emonTHs and some Zigbee devices using zigbee2mqtt - all on the same emonBase. I can do one or the other successfully and now I am trying to do both on the same unit.

I made the changes you mentioned above, but still have the same issue. So I must have missed something. Below is my full emonHub configuration.


[hub]
    ### loglevel must be one of DEBUG, INFO, WARNING, ERROR, and CRITICAL
    loglevel = DEBUG
    autoconf = 0
### Uncomment this to also send to syslog
# use_syslog = yes
#######################################################################
#######################       Interfacers       #######################
#######################################################################

[interfacers]
    ### This interfacer manages the RFM12Pi/RFM69Pi/emonPi module
    [[EmonPi2]]
      Type = EmonHubOEMInterfacer
        [[[init_settings]]]
            com_port = /dev/ttyAMA0
            com_baud = 115200
        [[[runtimesettings]]]
            pubchannels = ToEmonCMS,
            subchannels = ToRFM12,
    
    [[USB0]]
      Type = EmonHubOEMInterfacer
        [[[init_settings]]]
            com_port = /dev/ttyUSB0
            com_baud = 115200
        [[[runtimesettings]]]
            pubchannels = ToEmonCMS,
            subchannels = ToRFM12,
            nodename = emonTx4
    
    [[SPI]]
        Type = EmonHubRFM69LPLInterfacer
        [[[init_settings]]]
            nodeid = 5
            networkID = 210
            resetPin = 24
            selPin = 26
        [[[runtimesettings]]]
            pubchannels = ToEmonCMS,
            nodelistonly = 1
    
    [[MQTT]]
        Type = EmonHubMqttInterfacer
        [[[init_settings]]]
            mqtt_host = 127.0.0.1
            mqtt_port = 1883
            mqtt_user = emonpi
            mqtt_passwd = emonpimqtt2016
        
        [[[runtimesettings]]]
            pubchannels = ToRFM12,
            subchannels = ToEmonCMS,
            
            # emonhub/rx/10/values format
            # Use with emoncms Nodes module
            node_format_enable = 0
            node_format_basetopic = emon/
            
            # emon/emontx/power1 format - use with Emoncms MQTT input
            # http://github.com/emoncms/emoncms/blob/master/docs/RaspberryPi/MQTT.md
            nodevar_format_enable = 0
            nodevar_format_basetopic = emon/
            
            # Single JSON payload published  - use with Emoncms MQTT
            node_JSON_enable = 1
            node_JSON_basetopic = emon/
            
[[MQTT_sub1]]
        Type = EmonHubMqttInterfacer
        [[[init_settings]]]
            mqtt_host = 127.0.0.1
            mqtt_port = 1883
            mqtt_user = emonpi
            mqtt_passwd = emonpimqtt2016

        [[[runtimesettings]]]
            pubchannels = ToRFM12,
            subchannels = ToEmonCMS,
            # pubchannels = ToEmonCMS,

            # emonhub/rx/10/values format
            # Use with emoncms Nodes module
            node_format_enable = 1
            node_format_basetopic = emonhub/

           # emon/emontx/power1 format - use with Emoncms MQTT input
            # http://github.com/emoncms/emoncms/blob/master/docs/RaspberryPi/MQTT.md
            nodevar_format_enable = 0
            nodevar_format_basetopic = emonhub/

            node_JSON_enable = 1
            node_JSON_basetopic = zigbee2mqtt/BALAB S100 TH
  
    [[emoncmsorg]]
        Type = EmonHubEmoncmsHTTPInterfacer
        [[[init_settings]]]
        [[[runtimesettings]]]
            pubchannels = ToRFM12,
            subchannels = ToEmonCMS,
            url = http://localhost
            apikey = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
            senddata = 1    # Enable sending data to Emoncms.org
            sendnames = 1    # Send full input names (compression will be automatically enabled)
            interval = 30    # Bulk send interval to Emoncms.org in seconds
    
    [[DS18B20]]
        Type = EmonHubDS18B20Interfacer
        [[[init_settings]]]
        [[[runtimesettings]]]
            pubchannels = ToEmonCMS,
            read_interval = 10
            nodename = sensors
# ids = 28-000008e2db06, 28-000009770529, 28-0000096a49b4
# names = ambient, cyl_bot, cyl_top

#######################################################################
#######################          Nodes          #######################
#######################################################################

## See config user guide: https://github.com/openenergymonitor/emonhub
## If autoconf is enabled above, node configuration will automatically
## populate based on templates listed in available.conf

[nodes]
    
    [[24]]
        nodename = BALAB_TH_S101
        [[[rx]]]
            names = temperature, external temperature, humidity, battery, pulseCount
            datacodes = h, h, h, h, L
            scales = 0.1, 0.1, 0.1, 0.1, 1
            units = C, C, %, V, p
    [[19]]
        nodename = BALAB_TH_OUT
        [[[rx]]]
            names = temperature, external temperature, humidity, battery, pulsecount
            datacodes = h, h, h, h, L
            scales = 0.1, 0.1, 0.1, 0.1, 1.0
            units = C, C, %, V, p
    [[26]]
        nodename = BALAB_TH_S102
        [[[rx]]]
            names = temperature, external temperature, humidity, battery, pulsecount
            datacodes = h, h, h, h, L
            scales = 0.1, 0.1, 0.1, 0.1, 1.0
            units = C, C, %, V, p
    [[25]]
        nodename = BALAB_TH_GAR
        [[[rx]]]
            names = temperature, external temperature, humidity, battery, pulsecount
            datacodes = h, h, h, h, L
            scales = 0.1, 0.1, 0.1, 0.1, 1.0
            units = C, C, %, V, p

Can you configure zigbee2mqtt to publish the data onto a base topic of emon. If you publish this directly to that topic on the Broker, emoncms will pick it up. No need to use emonhub.

Lets try this

You have 2 MQTT Interfacers, both taking data from the ToEmonCMS channel (plus the emoncmsorg interface) so emonhub is sending the same data to 3 different targets (different base topics on the 2 MQTT interfaces in this case).

You have 4 external source interfacers placing data onto the ToEmonCMS channel (via pubchannel)

  • EmonPi2
  • USB0
  • SPI
  • DS18B20

@glyn.hudson - I cannot see in the code that the MQTT interface will subscribe to a different topic and pass it through other than using the nodevar - I’me really surprised this works!

Oh I missed this - perhaps it should be merged :thinking:.

@grod55 - if you actually use the example given, it will just work
MQTT JSON subscribe by glynhudson · Pull Request #198 · openenergymonitor/emonhub

As a note @glyn.hudson, @TrystanLea - the MQTT interface is not listed in the docs :frowning:

Brian, this helps a lot - thank you for putting this together. I now understand Pub = publication and Sub = subscription, I wasn’t getting this earlier.

My initial configuration was exactly as Glyn’s in the referenced document, which is when I started having the issue.

[[MQTT_sub]]
    Type = EmonHubMqttInterfacer
    [[[init_settings]]]
        mqtt_host = 127.0.0.1
        mqtt_port = 1883
        mqtt_user = emonpi
        mqtt_passwd = emonpimqtt2016
    [[[runtimesettings]]]
        pubchannels = ToEmonCMS,
        node_JSON_enable = 1
        node_JSON_basetopic = zigbee2mqtt/BALAB S100 TH

So, with this understanding, I am now wondering if the issue is the USB connection. My Zigbee USB controller is using com_port = /dev/ttyAMA0, which is the same as emonPi2 is using. This probably explains why it works with emonTH only or Zigbee only, but not both.

Is there a way to change the USB port for emonPi2 as the Zigbee dongle always connects to ttyAMA0.

Alternatively, I will attempt to change the USB port for the Zigbee dongle following this process.

thank

I don’t think 2 devices ever use the same serial interface.

I am mistaken.
The ConBee Zigbee device is ttyACM0, whereas the emonPi2 is ttyAMA0
Back to the drawing board

I tried this, but no change.

  [[USB0]]
      Type = EmonHubOEMInterfacer
        [[[init_settings]]]
            com_port = /dev/ttyACM0
            com_baud = 115200
        [[[runtimesettings]]]
            pubchannels = ToEmonCMS,
            subchannels = ToRFM12,
            nodename = zigbee

I am starting over. Everything is back to default settings, and I have configured [[MQTT-sub]] per Glyn’s settings below. (I also turned off the [[emoncmsorg]] as @borpin indicates, this is redundant).

    Type = EmonHubMqttInterfacer
    [[[init_settings]]]
        mqtt_host = 127.0.0.1
        mqtt_port = 1883
        mqtt_user = emonpi
        mqtt_passwd = emonpimqtt2016
    [[[runtimesettings]]]
        pubchannels = ToEmonCMS,
        node_JSON_enable = 1
        node_JSON_basetopic = zigbee2mqtt/BALABTH

From the logs, it creates both the MQTT and MQTT_sub

2024-11-03 16:41:22,612 INFO     MainThread Creating EmonHubMqttInterfacer 'MQTT_sub'
2024-11-03 16:41:22,613 DEBUG    MainThread Setting MQTT_sub pubchannels: ['ToEmonCMS']
2024-11-03 16:41:22,613 INFO     MainThread Setting MQTT_sub node_JSON_enable: 1
2024-11-03 16:41:22,613 INFO     MainThread Setting MQTT_sub node_JSON_basetopic: zigbee2mqtt/BALABTH

However, only the MQTT gets subscribed to and acknowledged

2024-11-03 16:41:22,913 INFO     MQTT       Connecting to MQTT Server
2024-11-03 16:41:23,014 INFO     MQTT       connection status: Connection successful
2024-11-03 16:41:23,015 DEBUG    MQTT       CONACK => Return code: 0
2024-11-03 16:41:23,017 DEBUG    emoncmsorg Buffer size: 1
2024-11-03 16:41:23,116 INFO     MQTT       on_subscribe

Adding a subchannel to the [[MQTT_sub]] gets the connection and acknowledgment for both MQTT and MQTT-sub. Note that it doesn’t matter what I put in the subchannel (I have tried both subchannels = ToEmonCMS and subchannels = ToRFM12). I get the same results.

024-11-03 16:48:26,434 INFO     MQTT_sub   Connecting to MQTT Server
2024-11-03 16:48:26,435 INFO     MQTT       Connecting to MQTT Server
2024-11-03 16:48:26,531 DEBUG    emoncmsorg Buffer size: 1
2024-11-03 16:48:26,536 INFO     MQTT       connection status: Connection successful
2024-11-03 16:48:26,536 DEBUG    MQTT       CONACK => Return code: 0
2024-11-03 16:48:26,537 INFO     MQTT_sub   connection status: Connection successful
2024-11-03 16:48:26,537 DEBUG    MQTT_sub   CONACK => Return code: 0
2024-11-03 16:48:34,453 DEBUG    MQTT       Publishing: emon/BALAB_TH_S101/temperature 26.700000000000003
2024-11-03 16:48:34,453 DEBUG    MQTT_sub   Publishing: emonhub/rx/24/values 26.700000000000003,0,26.8,2.9000000000000004,1,-42
2024-11-03 16:48:34,454 DEBUG    MQTT       Publishing: emon/BALAB_TH_S101/external temperature 0
2024-11-03 16:48:34,455 DEBUG    MQTT       Publishing: emon/BALAB_TH_S101/humidity 26.8
2024-11-03 16:48:34,455 DEBUG    MQTT       Publishing: emon/BALAB_TH_S101/battery 2.9000000000000004
2024-11-03 16:48:34,456 DEBUG    MQTT       Publishing: emon/BALAB_TH_S101/pulseCount 1
2024-11-03 16:48:34,454 DEBUG    MQTT_sub   Publishing: zigbee2mqtt/BALABTHBALAB_TH_S101 {"temperature": 26.700000000000003, "external temperature": 0, "humidity": 26.8, "battery": 2.9000000000000004, "pulseCount": 1, "time": 1730677714.3364685, "rssi": -42}
2024-11-03 16:48:34,457 DEBUG    MQTT       Publishing: emon/BALAB_TH_S101/rssi -42

So this is leading me to think that I am not using the right subchannel, but I do not know what that channel should be.

Post a complete set of logs and emonhub configuration, please?

I modified my diagram :slight_smile:

Also, set this as it is enabled by default.

Brian, here is my emonHub configuration.


[hub]
    ### loglevel must be one of DEBUG, INFO, WARNING, ERROR, and CRITICAL
    loglevel = DEBUG
    autoconf = 0
### Uncomment this to also send to syslog
# use_syslog = yes
#######################################################################
#######################       Interfacers       #######################
#######################################################################

[interfacers]
    ### This interfacer manages the RFM12Pi/RFM69Pi/emonPi module
    [[EmonPi2]]
      Type = EmonHubOEMInterfacer
        [[[init_settings]]]
            com_port = /dev/ttyAMA0
            com_baud = 115200
        [[[runtimesettings]]]
            pubchannels = ToEmonCMS,
            subchannels = ToRFM12,
    
    [[USB0]]
      Type = EmonHubOEMInterfacer
        [[[init_settings]]]
            com_port = /dev/ttyUSB0
            com_baud = 115200
        [[[runtimesettings]]]
            pubchannels = ToEmonCMS,
            subchannels = ToRFM12,
            nodename = emonTx4
    
    [[SPI]]
        Type = EmonHubRFM69LPLInterfacer
        [[[init_settings]]]
            nodeid = 5
            networkID = 210
            resetPin = 24
            selPin = 26
        [[[runtimesettings]]]
            pubchannels = ToEmonCMS,
            nodelistonly = 1
    
    [[MQTT]]
        Type = EmonHubMqttInterfacer
        [[[init_settings]]]
            mqtt_host = 127.0.0.1
            mqtt_port = 1883
            mqtt_user = emonpi
            mqtt_passwd = emonpimqtt2016
        
        [[[runtimesettings]]]
            pubchannels = ToRFM12,
            subchannels = ToEmonCMS,
            
            # emonhub/rx/10/values format
            # Use with emoncms Nodes module
            node_format_enable = 0
            node_format_basetopic = emon/
            
            # emon/emontx/power1 format - use with Emoncms MQTT input
            # http://github.com/emoncms/emoncms/blob/master/docs/RaspberryPi/MQTT.md
            nodevar_format_enable = 1
            nodevar_format_basetopic = emon/
            
            # Single JSON payload published  - use with Emoncms MQTT
            node_JSON_enable = 0
            node_JSON_basetopic = emon/
            
[[MQTT_sub]]
        Type = EmonHubMqttInterfacer
        [[[init_settings]]]
            mqtt_host = 127.0.0.1
            mqtt_port = 1883
            mqtt_user = emonpi
            mqtt_passwd = emonpimqtt2016

        [[[runtimesettings]]]
            #device = /dev/serial/by-id/usb-dresden_elektronik_ingenieurtechnik_GmbH_ConBee_II_DE2690137-if00-ACM0
            #baud = 115200
            pubchannels = ToEmonCMS,
            subchannels = ToEmonCMS,
            node_JSON_enable = 1
            node_JSON_basetopic = zigbee2mqtt/BALABTH
              
    [[emoncmsorg]]
        Type = EmonHubEmoncmsHTTPInterfacer
        [[[init_settings]]]
        [[[runtimesettings]]]
            pubchannels = ToRFM12,
            subchannels = ToEmonCMS,
            url = http://localhost
            apikey = 
            senddata = 0    # Enable sending data to Emoncms.org
            sendnames = 1    # Send full input names (compression will be automatically enabled)
            interval = 30    # Bulk send interval to Emoncms.org in seconds
    
    [[DS18B20]]
        Type = EmonHubDS18B20Interfacer
        [[[init_settings]]]
        [[[runtimesettings]]]
            pubchannels = ToEmonCMS,
            read_interval = 10
            nodename = sensors
# ids = 28-000008e2db06, 28-000009770529, 28-0000096a49b4
# names = ambient, cyl_bot, cyl_top

#######################################################################
#######################          Nodes          #######################
#######################################################################

## See config user guide: https://github.com/openenergymonitor/emonhub
## If autoconf is enabled above, node configuration will automatically
## populate based on templates listed in available.conf

[nodes]
    
    [[24]]
        nodename = BALAB_TH_S101
        [[[rx]]]
            names = temperature, external temperature, humidity, battery, pulseCount
            datacodes = h, h, h, h, L
            scales = 0.1, 0.1, 0.1, 0.1, 1
            units = C, C, %, V, p
    [[19]]
        nodename = BALAB_TH_OUT
        [[[rx]]]
            names = temperature, external temperature, humidity, battery, pulsecount
            datacodes = h, h, h, h, L
            scales = 0.1, 0.1, 0.1, 0.1, 1.0
            units = C, C, %, V, p
    [[26]]
        nodename = BALAB_TH_S102
        [[[rx]]]
            names = temperature, external temperature, humidity, battery, pulsecount
            datacodes = h, h, h, h, L
            scales = 0.1, 0.1, 0.1, 0.1, 1.0
            units = C, C, %, V, p
    [[25]]
        nodename = BALAB_TH_GAR
        [[[rx]]]
            names = temperature, external temperature, humidity, battery, pulsecount
            datacodes = h, h, h, h, L
            scales = 0.1, 0.1, 0.1, 0.1, 1.0
            units = C, C, %, V, p

Here is the most recent log. I did a restart of emonHub to get a clean set.

2024-11-04 08:55:23,609 INFO     MainThread Exit completed
2024-11-04 08:55:24,363 INFO     MainThread EmonHub v2.6.15
2024-11-04 08:55:24,363 INFO     MainThread Opening hub...
2024-11-04 08:55:24,363 INFO     MainThread Running as user: pi
2024-11-04 08:55:24,364 INFO     MainThread Logging level set to DEBUG
2024-11-04 08:55:24,364 INFO     MainThread Creating EmonHubOEMInterfacer 'EmonPi2'
2024-11-04 08:55:24,365 DEBUG    MainThread Opening serial port: /dev/ttyAMA0 @ 115200 bits/s
2024-11-04 08:55:24,366 INFO     MainThread Creating EmonHubOEMInterfacer 'USB0'
2024-11-04 08:55:24,367 ERROR    MainThread Could not open serial port: /dev/ttyUSB0 @ 115200 bits/s (retry every 10s)
2024-11-04 08:55:24,368 INFO     MainThread Creating EmonHubRFM69LPLInterfacer 'SPI'
2024-11-04 08:55:24,374 INFO     MainThread Creating RFM69 LowPowerLabs interfacer
2024-11-04 08:55:24,375 INFO     MainThread RFM69 node_id = 5
2024-11-04 08:55:24,375 INFO     MainThread RFM69 network_id = 210
2024-11-04 08:55:24,375 INFO     MainThread RFM69 interruptPin = 22
2024-11-04 08:55:24,375 INFO     MainThread RFM69 resetPin = 24
2024-11-04 08:55:24,375 INFO     MainThread RFM69 selPin = 26
2024-11-04 08:55:24,376 INFO     MainThread Starting radio setup
2024-11-04 08:55:24,988 INFO     MainThread Radio setup complete
2024-11-04 08:55:24,989 DEBUG    MainThread Setting SPI pubchannels: ['ToEmonCMS']
2024-11-04 08:55:24,989 DEBUG    MainThread Setting SPI nodelistonly: True
2024-11-04 08:55:24,990 INFO     MainThread Creating EmonHubMqttInterfacer 'MQTT'
2024-11-04 08:55:24,991 DEBUG    MainThread Setting MQTT pubchannels: ['ToRFM12']
2024-11-04 08:55:24,991 DEBUG    MainThread Setting MQTT subchannels: ['ToEmonCMS']
2024-11-04 08:55:24,991 INFO     MainThread Setting MQTT node_format_enable: 0
2024-11-04 08:55:24,992 INFO     MainThread Setting MQTT node_format_basetopic: emon/
2024-11-04 08:55:24,992 INFO     MainThread Setting MQTT nodevar_format_enable: 1
2024-11-04 08:55:24,992 INFO     MainThread Setting MQTT nodevar_format_basetopic: emon/
2024-11-04 08:55:24,992 INFO     MainThread Setting MQTT node_JSON_enable: 0
2024-11-04 08:55:24,993 INFO     MainThread Creating EmonHubMqttInterfacer 'MQTT_sub'
2024-11-04 08:55:24,994 DEBUG    MainThread Setting MQTT_sub pubchannels: ['ToEmonCMS']
2024-11-04 08:55:24,994 DEBUG    MainThread Setting MQTT_sub subchannels: ['ToEmonCMS']
2024-11-04 08:55:24,994 INFO     MainThread Setting MQTT_sub node_JSON_enable: 1
2024-11-04 08:55:24,994 INFO     MainThread Setting MQTT_sub node_JSON_basetopic: zigbee2mqtt/BALABTH
2024-11-04 08:55:24,995 INFO     MainThread Creating EmonHubEmoncmsHTTPInterfacer 'emoncmsorg'
2024-11-04 08:55:24,996 DEBUG    MainThread Setting emoncmsorg interval: 30
2024-11-04 08:55:24,996 DEBUG    MainThread Setting emoncmsorg pubchannels: ['ToRFM12']
2024-11-04 08:55:24,996 DEBUG    MainThread Setting emoncmsorg subchannels: ['ToEmonCMS']
2024-11-04 08:55:24,996 INFO     MainThread Setting emoncmsorg apikey: null
2024-11-04 08:55:24,997 INFO     MainThread Setting emoncmsorg url: http://localhost
2024-11-04 08:55:24,997 INFO     MainThread Setting emoncmsorg senddata: 0
2024-11-04 08:55:24,997 INFO     MainThread Setting emoncmsorg sendstatus: 0
2024-11-04 08:55:24,997 INFO     MainThread Setting emoncmsorg sendnames: 1
2024-11-04 08:55:24,997 INFO     MainThread Setting emoncmsorg compress: 0
2024-11-04 08:55:24,998 INFO     MainThread Creating EmonHubDS18B20Interfacer 'DS18B20'
2024-11-04 08:55:25,014 INFO     MainThread Setting DS18B20 read_interval: 10
2024-11-04 08:55:25,014 INFO     MainThread Setting DS18B20 nodename: sensors
2024-11-04 08:55:25,015 INFO     MainThread Setting DS18B20 ids: 
2024-11-04 08:55:25,015 INFO     MainThread Setting DS18B20 names: 
2024-11-04 08:55:25,015 DEBUG    MainThread Setting DS18B20 pubchannels: ['ToEmonCMS']
2024-11-04 08:55:25,016 DEBUG    MainThread Automatic configuration of nodes disabled
2024-11-04 08:55:37,205 INFO     SPI        Packet received 12 bytes
2024-11-04 08:55:37,205 DEBUG    SPI        2 NEW FRAME : 
2024-11-04 08:55:37,206 DEBUG    SPI        2 Timestamp : 1730735737.205582
2024-11-04 08:55:37,206 DEBUG    SPI        2 From Node : 19
2024-11-04 08:55:37,206 DEBUG    SPI        2    Values : [12.3, 0, 43.6, 2.9000000000000004, 1]
2024-11-04 08:55:37,206 DEBUG    SPI        2      RSSI : -76
2024-11-04 08:55:37,207 DEBUG    SPI        2 Sent to channel(start)' : ToEmonCMS
2024-11-04 08:55:37,207 DEBUG    SPI        2 Sent to channel(end)' : ToEmonCMS
2024-11-04 08:55:37,313 INFO     MQTT       Connecting to MQTT Server
2024-11-04 08:55:37,313 INFO     MQTT_sub   Connecting to MQTT Server
2024-11-04 08:55:37,413 DEBUG    emoncmsorg Buffer size: 1
2024-11-04 08:55:37,415 INFO     MQTT       connection status: Connection successful
2024-11-04 08:55:37,415 DEBUG    MQTT       CONACK => Return code: 0
2024-11-04 08:55:37,416 INFO     MQTT_sub   connection status: Connection successful
2024-11-04 08:55:37,416 DEBUG    MQTT_sub   CONACK => Return code: 0
2024-11-04 08:55:37,516 INFO     MQTT       on_subscribe
2024-11-04 08:55:37,517 INFO     MQTT_sub   on_subscribe
2024-11-04 08:56:12,756 INFO     SPI        Packet received 12 bytes
2024-11-04 08:56:12,756 DEBUG    SPI        7 NEW FRAME : 
2024-11-04 08:56:12,757 DEBUG    SPI        7 Timestamp : 1730735772.756843
2024-11-04 08:56:12,757 DEBUG    SPI        7 From Node : 24
2024-11-04 08:56:12,757 DEBUG    SPI        7    Values : [25.5, 0, 27.700000000000003, 2.9000000000000004, 1]
2024-11-04 08:56:12,757 DEBUG    SPI        7      RSSI : -44
2024-11-04 08:56:12,758 DEBUG    SPI        7 Sent to channel(start)' : ToEmonCMS
2024-11-04 08:56:12,758 DEBUG    SPI        7 Sent to channel(end)' : ToEmonCMS
2024-11-04 08:56:12,889 INFO     MQTT_sub   Publishing 'node' formatted msg
2024-11-04 08:56:12,889 DEBUG    MQTT_sub   Publishing: emonhub/rx/24/values 25.5,0,27.700000000000003,2.9000000000000004,1,-44
2024-11-04 08:56:12,890 DEBUG    MQTT_sub   Publishing: zigbee2mqtt/BALABTHBALAB_TH_S101 {"temperature": 25.5, "external temperature": 0, "humidity": 27.700000000000003, "battery": 2.9000000000000004, "pulseCount": 1, "time": 1730735772.7568433, "rssi": -44}
2024-11-04 08:56:12,891 DEBUG    MQTT       Publishing: emon/BALAB_TH_S101/temperature 25.5
2024-11-04 08:56:12,891 DEBUG    MQTT       Publishing: emon/BALAB_TH_S101/external temperature 0
2024-11-04 08:56:12,892 DEBUG    MQTT       Publishing: emon/BALAB_TH_S101/humidity 27.700000000000003
2024-11-04 08:56:12,892 DEBUG    MQTT       Publishing: emon/BALAB_TH_S101/battery 2.9000000000000004
2024-11-04 08:56:12,893 DEBUG    MQTT       Publishing: emon/BALAB_TH_S101/pulseCount 1
2024-11-04 08:56:12,893 DEBUG    MQTT       Publishing: emon/BALAB_TH_S101/rssi -44
2024-11-04 08:56:13,058 DEBUG    emoncmsorg Buffer size: 1
2024-11-04 08:56:16,161 INFO     SPI        Packet received 12 bytes
2024-11-04 08:56:16,162 DEBUG    SPI        8 NEW FRAME : 
2024-11-04 08:56:16,162 DEBUG    SPI        8 Timestamp : 1730735776.161967
2024-11-04 08:56:16,162 DEBUG    SPI        8 From Node : 25
2024-11-04 08:56:16,162 DEBUG    SPI        8    Values : [25.5, 39.6, 21.400000000000002, 2.9000000000000004, 1]
2024-11-04 08:56:16,162 DEBUG    SPI        8      RSSI : -65
2024-11-04 08:56:16,163 DEBUG    SPI        8 Sent to channel(start)' : ToEmonCMS
2024-11-04 08:56:16,163 DEBUG    SPI        8 Sent to channel(end)' : ToEmonCMS
2024-11-04 08:56:16,298 INFO     MQTT_sub   Publishing 'node' formatted msg
2024-11-04 08:56:16,299 DEBUG    MQTT_sub   Publishing: emonhub/rx/25/values 25.5,39.6,21.400000000000002,2.9000000000000004,1,-65
2024-11-04 08:56:16,299 DEBUG    MQTT_sub   Publishing: zigbee2mqtt/BALABTHBALAB_TH_GAR {"temperature": 25.5, "external temperature": 39.6, "humidity": 21.400000000000002, "battery": 2.9000000000000004, "pulsecount": 1, "time": 1730735776.1619673, "rssi": -65}
2024-11-04 08:56:16,301 DEBUG    MQTT       Publishing: emon/BALAB_TH_GAR/temperature 25.5
2024-11-04 08:56:16,301 DEBUG    MQTT       Publishing: emon/BALAB_TH_GAR/external temperature 39.6
2024-11-04 08:56:16,302 DEBUG    MQTT       Publishing: emon/BALAB_TH_GAR/humidity 21.400000000000002
2024-11-04 08:56:16,302 DEBUG    MQTT       Publishing: emon/BALAB_TH_GAR/battery 2.9000000000000004
2024-11-04 08:56:16,303 DEBUG    MQTT       Publishing: emon/BALAB_TH_GAR/pulsecount 1
2024-11-04 08:56:16,303 DEBUG    MQTT       Publishing: emon/BALAB_TH_GAR/rssi -65
2024-11-04 08:56:19,170 INFO     SPI        Packet received 12 bytes
2024-11-04 08:56:19,170 DEBUG    SPI        9 NEW FRAME : 
2024-11-04 08:56:19,170 WARNING  SPI        9 Discarded RX frame not in nodelist, node:23, length:12 bytes
2024-11-04 08:56:20,872 INFO     SPI        Packet received 12 bytes
2024-11-04 08:56:20,873 DEBUG    SPI        11 NEW FRAME : 
2024-11-04 08:56:20,873 DEBUG    SPI        11 Timestamp : 1730735780.873068
2024-11-04 08:56:20,873 DEBUG    SPI        11 From Node : 26
2024-11-04 08:56:20,874 DEBUG    SPI        11    Values : [21.1, 0, 36.7, 2.9000000000000004, 1]
2024-11-04 08:56:20,874 DEBUG    SPI        11      RSSI : -58
2024-11-04 08:56:20,874 DEBUG    SPI        11 Sent to channel(start)' : ToEmonCMS
2024-11-04 08:56:20,874 DEBUG    SPI        11 Sent to channel(end)' : ToEmonCMS
2024-11-04 08:56:20,910 INFO     MQTT_sub   Publishing 'node' formatted msg
2024-11-04 08:56:20,911 DEBUG    MQTT       Publishing: emon/BALAB_TH_S102/temperature 21.1
2024-11-04 08:56:20,911 DEBUG    MQTT_sub   Publishing: emonhub/rx/26/values 21.1,0,36.7,2.9000000000000004,1,-58
2024-11-04 08:56:20,912 DEBUG    MQTT       Publishing: emon/BALAB_TH_S102/external temperature 0
2024-11-04 08:56:20,912 DEBUG    MQTT_sub   Publishing: zigbee2mqtt/BALABTHBALAB_TH_S102 {"temperature": 21.1, "external temperature": 0, "humidity": 36.7, "battery": 2.9000000000000004, "pulsecount": 1, "time": 1730735780.873068, "rssi": -58}
2024-11-04 08:56:20,913 DEBUG    MQTT       Publishing: emon/BALAB_TH_S102/humidity 36.7
2024-11-04 08:56:20,913 DEBUG    MQTT       Publishing: emon/BALAB_TH_S102/battery 2.9000000000000004
2024-11-04 08:56:20,914 DEBUG    MQTT       Publishing: emon/BALAB_TH_S102/pulsecount 1
2024-11-04 08:56:20,914 DEBUG    MQTT       Publishing: emon/BALAB_TH_S102/rssi -58
Log Level: DEBUG 

And to provide a complete picture, here is the zigbee message as seen in the zigbee2mqtt logs

info 2024-11-04 08:51:53z2m:mqtt: MQTT publish: topic 'zigbee2mqtt/BALABTH', payload '{"battery":100,"humidity":28.4,"linkquality":255,"temperature":25.7}'
info 2024-11-04 08:51:53z2m:mqtt: MQTT publish: topic 'zigbee2mqtt/BALABTH', payload '{"battery":100,"humidity":28.4,"linkquality":255,"temperature":25.8}'
info 2024-11-04 08:51:53z2m:mqtt: MQTT publish: topic 'zigbee2mqtt/BALABTH', payload '{"battery":100,"humidity":29.9,"linkquality":255,"temperature":25.8}'