Zenner Water Meter "Problems"

Good morning.
Last week I installed three brand new Water meters from the company Zenner with an EDC Lorawan Module in my basement (concrete).
After I received the Keys I registered them inside TTN.
Everything looked fine until I received my first Payload. Or should I say message? because I don’t receive a useful “message” which includes the used Water meters value.
I only get this:
Screenshot (1)

  "name": "as.up.data.forward",
  "time": "2022-10-31T02:25:55.262456174Z",
  "identifiers": [
      "device_ids": {
        "device_id": "zaelergesamt",
        "application_ids": {
          "application_id": "wasserzaeler"
  "context": {
    "tenant-id": "CgN0dG4="
  "visibility": {
    "rights": [
  "unique_id": "01GGNXR61Y9RS5FF3VY87NSJN5"

I tried a few different network layer Settings but nothing changed at all. I’m not sure if this is a problem with the network coverage or the fact that I don’t have a “Payload formatters”.
These Water meters are for Citys and therefore the documentation is pretty complex (for me).
I will upload the documentation to my dropbox.

I’m hoping someone has an idea.
If there are any questions please ask them.

Tank you very much in advance!

1 Like

Looks like messages being received ok and forwarded - 1st image tells you there is a decoder failure…

Yep you will be receiving the message with its encapsulated payload… but without a payload decoder on the uplink you wont get any useable information out…

Up link frequency looks high based on the small sample given, and uplinks appear to be trigggering downlinks - you need to under what and why and fix if device isnt handling any e.g. LNS MAC commands etc, I trust you are NOT using confirmed uplinks (forum search)…

1 Like

Or you could use “Uplink”. The job of the LNS is to get the byte array to you, you have to decode it based on your device’s format. Payload formatters are fully documented.

Your send rate will be attracting the interests of the local police and is a mockery of the Fair Use Policy for TTN.

You would benefit from reviewing these pages - https://www.thethingsnetwork.org/docs/lorawan/ - FUP is covered in Duty Cycle.

1 Like

I do know that this frequency is too high. But I don’t know exactly why it’s that high. The Water meter should only send once every day…

But one additional question. Why are the police interested in this?

When I’m not using any payload formatter there should be an unformatted payload, right? But there isn’t.

So I need to write my own payload formatted for this… There are none out there for this water meter.

Duty Cycle breaches (rather than busting the FUP) are generally legally enforced :police_car: :policeman: :policewoman: :oncoming_police_car:

I believe Zenner has been mentioned on the Forum many times in the past - use forum search (top right) and you might find a helpful gem :slight_smile:

Then you need to be responsibe and do something about it!

Sounds like you need to read the device documentation and compare with the links Nicks has provided, then take action to reduce…before proceeding to use the TTN services…

1 Like

There is. But the console is not a dashboard - it is a debugging tool - if you click on a live “Forward uplink data message” you will see the whole JSON message with the frm_payload and you will see the encoded bytes on the console line.

It’s all in the docs …

1 Like

btw this kind of “police” is called “Bundesnetzagentur” in DE. They are monitoring the frequencies and don’t like it, if your device exeeds the duty-cycle limits.
In DE the user of a transmitter is responsible too, that his device fulfills the legal requirements.

1 Like

I checked if there are any "duty cycle problems and it seems like in the past 2 nights there were none.
So this problem is not a problem anymore. but the next problem I’m running into is that there is no “Payload decoder” for this device.
I got so far that I have the “frm_payload” and now I need to make my own Payload decoder but I have no clue how I’m going to do this…

I tried to decode the message an got something but I’m not sure if that’s the right way to do this job.
I’m logging the Data I’m getting from the water meter nodes and there I’m getting the “frm_payload”, the “f_port”, “f_cnt” and the “decoded_payload”.


The frm_payload is in the Base64 format. When I remember correctly the frm_payload is not the one I should decode with. but the decoded payload seems wrong to me.
So I tried it with the frm_payload.
I converted the frm_Payload into Hex and got “11 47 1b 00 00”.
According to the datasheet, the part after the 11 is the current water meter value.
So I took the “d903” and converted it with big endian so I got “1b 47”.
After converting this into Decimal I have the value of the water meter (6983) which is the correct one.

I never wrote a javascript Payload decoder before so my knowledge is more than nothing about this…
Is there any documentation about this? More than TTN has on the docs.

Why does the bytes from the “decoded Payload” not match with the bytes I converted from the “frm_payload”

Can someone assist me with writing the payload decoder to get the value from the water meters?

Thank you very much in advance!

frm_payload IS your data, a hex array encoded as Base64.

This is correct - bearing in mind it’s a HEX array - 0x11 = 17, 0x47 = 71 etc

What is “d903”??

But overall, you arrived at the reading.

Given the huge number of example payload formatters on here, the docs, the number of JavaScript tutorials on the inter webs and assuming you have some basic programming skills so you could use those to program in what is just another dialect of a procedural language.

It does, it’s which number base you are using.

Have you asked Zenner for a PF as it’s in their best interests to provide one.

But at the least, you could start with the template that the console provides and add a bit in that matches the words you use above to get to the reading and post it here.

1 Like

I would also like to read a Zenner water meter.
Anything new here?

Did it work?
If so, would you upload the payload?

Thank you very much

Can you please post in English? Even if you need to use Google translate

As above, by agreement this is an English language forum due to the mix of different nationalities even if you happen to know the native language of the person you are replying to - it precludes anyone else answering and means others searching for answers can lose out.

Posting in native language underneath is OK but somewhat redundant.

Thank you for the information. I will take it into account in the future.

Regarding the Zenner Lora water meter:

Have you gained any new insights there?
Were you able to solve it?

Many thanks

Yes, it more or less worked for me.
I then edit the payload heavily in Nodered. But the following decoder at least gets me the payload.

If you need anything else feel free to ask.

function encodeDownlink(input) {

return {

bytes: []

fPort: 1,

warnings: [],

errors: []



function decodeDownlink(input) {

return {

data: {

bytes: input.bytes


warnings: [],

errors: []



But I just copied the decoder by hand because I can’t copy it on my cell phone. So there could be errors.

If you share what you do in Node-Red then someone possibly can turn it into a decoder you can use in the application.


@0815 & @Johan_Scheepers

Thank you very much for your replies
Please excuse me, I have only just seen the message. this is my first Lora Payloader, also with NodeRed

In NodeRed it looks like this. I have loaded the decoder from 0815. I’ll see tomorrow what values the counter outputs. Do I need an encoder?

Screenshot 2024-03-08 155034
Screenshot 2024-03-08 155730

Kind regards

Node-Red are not always just drag and drop, sometimes you need to understand a bit of code somewhere along the line.

Those little red squiggles mean you have syntax errors.

This code will only give you the payload (if corrected), you still need the decoder (most probably), depending how they have encoded the data.