Issue in logs with a Netatmo camera while images display

Hello,In the logs, I have an error with a Netatmo camera, but the image displays in Gladys.

2026-07-21T11:37:18+0200  poll.js:14 (RtspCameraHandler.poll) Unable to poll camera
2026-07-21T11:37:20+0200  getImage.js:79 () Error: Command failed: ffmpeg -i http://192.168.*.*/a859f7810d059863a8e7f3b113b40ef5/live/index.m3u8 -f image2 -vframes 1 -qscale:v 15 -vf scale=1280:-1 /tmp/gladysassistant/camera-ec77fd13-5ac1-4edb-b340-d2b0447995d9-526-0-37-11.jpg
ffmpeg version 5.1.9-0+deb12u1 Copyright (c) 2000-2026 the FFmpeg developers
built with gcc 12 (Debian 12.2.0-14+deb12u1)
configuration: --prefix=/usr --extra-version=0+deb12u1 --toolchain=hardened --libdir=/usr/lib/x86_64-linux-gnu --incdir=/usr/include/x86_64-linux-gnu --arch=amd64 --enable-gpl --disable-stripping --enable-gnutls --enable-ladspa --enable-libaom --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libcodec2 --enable-libdav1d --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libglslang --enable-libgme --enable-libgsm --enable-libjack --enable-libmp3lame --enable-libmysofa --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-libpulse --enable-librabbitmq --enable-librist --enable-librubberband --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libsrt --enable-libssh --enable-libsvtav1 --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx265 --enable-libxml2 --enable-libxvid --enable-libzimg --enable-libzmq --enable-libzvbi --enable-lv2 --enable-omx --enable-openal --enable-opencl --enable-opengl --enable-sdl2 --disable-sndio --enable-libjxl --enable-pocketsphinx --enable-librsvg --enable-libmfx --enable-libdc1394 --enable-libdrm --enable-libiec61883 --enable-chromaprint --enable-frei0r --enable-libx264 --enable-libplacebo --enable-librav1e --enable-shared
libavutil      57. 28.100 / 57. 28.100
libavcodec     59. 37.100 / 59. 37.100
libavformat    59. 27.100 / 59. 27.100
libavdevice    59.  7.100 / 59.  7.100
libavfilter     8. 44.100 /  8. 44.100
libswscale      6.  7.100 /  6.  7.100
libswresample   4.  7.100 /  4.  7.100
libpostproc    56.  6.100 / 56.  6.100
\[hls @ 0x60877d48a880\] Skip ('#EXT-X-INDEPENDENT-SEGMENTS')
\[hls @ 0x60877d48a880\] Opening 'http://192.168.*.*/a859f7810d059863a8e7f3b113b40ef5/live/files/high/index.m3u8' for reading
\[hls @ 0x60877d48a880\] Skip ('#EXT-X-VERSION:7')
\[http @ 0x60877d498080\] Opening 'http://192.168.*.*/a859f7810d059863a8e7f3b113b40ef5/live/files/medium/index.m3u8' for reading
\[hls @ 0x60877d48a880\] Skip ('#EXT-X-VERSION:7')
\[http @ 0x60877d498080\] Opening 'http://192.168.*.*/a859f7810d059863a8e7f3b113b40ef5/live/files/low/index.m3u8' for reading
\[hls @ 0x60877d48a880\] Skip ('#EXT-X-VERSION:7')
\[http @ 0x60877d498080\] Opening 'http://192.168.*.*/a859f7810d059863a8e7f3b113b40ef5/live/files/poor/index.m3u8' for reading
\[hls @ 0x60877d48a880\] Skip ('#EXT-X-VERSION:7')
\[hls @ 0x60877d48a880\] Opening 'http://192.168.*.*/a859f7810d059863a8e7f3b113b40ef5/live/files/high/live0000036907.ts' for reading
\[hls @ 0x60877d48a880\] Opening 'http://192.168.*.*/a859f7810d059863a8e7f3b113b40ef5/live/files/high/live0000036908.ts' for reading
\[hls @ 0x60877d48a880\] Opening 'http://192.168.*.*/a859f7810d059863a8e7f3b113b40ef5/live/files/medium/live0000036907.ts' for reading
\[hls @ 0x60877d48a880\] Opening 'http://192.168.*.*/a859f7810d059863a8e7f3b113b40ef5/live/files/medium/live0000036908.ts' for reading
\[hls @ 0x60877d48a880\] Opening 'http://192.168.*.*/a859f7810d059863a8e7f3b113b40ef5/live/files/low/live0000036907.ts' for reading
\[hls @ 0x60877d48a880\] Opening 'http://192.168.*.*/a859f7810d059863a8e7f3b113b40ef5/live/files/low/live0000036908.ts' for reading
\[http @ 0x60877d498080\] Opening 'http://192.168.*.*/a859f7810d059863a8e7f3b113b40ef5/live/files/poor/index.m3u8' for reading
\[hls @ 0x60877d48a880\] Skip ('#EXT-X-VERSION:7')
\[hls @ 0x60877d48a880\] skipping 4 segments ahead, expired from playlists
\[hls @ 0x60877d48a880\] Opening 'http://192.168.*.*/a859f7810d059863a8e7f3b113b40ef5/live/files/poor/live0000036911.ts' for reading
\[hls @ 0x60877d48a880\] Opening 'http://192.168.*.*/a859f7810d059863a8e7f3b113b40ef5/live/files/poor/live0000036912.ts' for reading
\[http @ 0x60877d498080\] Opening 'http://192.168.*.*/a859f7810d059863a8e7f3b113b40ef5/live/files/high/index.m3u8' for reading
\[hls @ 0x60877d48a880\] Skip ('#EXT-X-VERSION:7')
\[hls @ 0x60877d48a880\] skipping 3 segments ahead, expired from playlists
\[http @ 0x60877d4c66c0\] Opening 'http://192.168.*.*/a859f7810d059863a8e7f3b113b40ef5/live/files/high/live0000036912.ts' for reading
\[mpegts @ 0x60877d49c5c0\] Packet corrupt (stream = 0, dts = 6643436250).
\[hls @ 0x60877d48a880\] Packet corrupt (stream = 0, dts = 6643432500)```

Hi,

I’ve looked at your logs and I think there are actually two different issues compounding, which explains why live streaming works but image retrieval doesn’t.

The first issue is the Netatmo stream itself. The token in the URL (the a859f78… in /live/index.m3u8) is a local session that isn’t permanent: it rotates, and the stream is only available when a streaming session is active. You can see this in your logs: sometimes ffmpeg opens the stream, retrieves a few segments, then gets stuck in a loop of 404 errors on the medium and low playlists with « Packet corrupt Â» messages, and it eventually times out. At other times, it’s a direct 404 on the main m3u8 file, where the token is already invalid. So, when you manually open the camera, it starts a fresh stream and it works, but the background poll hits an expired URL.

The second issue, and I think this is the one blocking your input, is this line:

PayloadTooLargeError: request entity too large
expected: 103788, length: 103788, limit: 102400

Basically, ffmpeg manages to output the image, but it’s 103 KB and Gladys refuses anything over 100 KB. The image is captured but never saved. This matches your issue: your input is outdoors, the scene is more detailed, so the JPEG is heavier and consistently exceeds the limit. Your indoor cameras produce lighter images, which pass when the stream cooperates. That’s probably why this input fails every time while the others work intermittently.

Both issues seem more like integration problems than configuration issues on your part. The PayloadTooLargeError especially: the 100 KB limit is a bit tight for a 1280px outdoor capture, you’d either need to increase it, or lower the resolution or quality of the snapshot.

@Terdious does this make sense to you?

Yes!! It’s the integration of the PRs that are made to integrate the Netatmo cameras that will solve this. But the porting to external gladys-netatmo can take over. I won’t hide the fact that some core bricks will still be necessary :face_with_peeking_eye:. But normally, detached PRs already exist :wink:.

I agree!

I’m starting tomorrow :winking_face_with_tongue: it was planned ^^

Thanks @pierre-gilles and @Terdious :wink::+1:

Oh man, way too impatient!!
It’s on its way…



With the arrival of the cameras:

Then integration of the images:


In short, it already works… well, almost, missing the video stream ^^ But a topic to discuss with @pierre-gilles. I’m preparing a point with Claude!!

Well the stream actually works! It’s just that the re-encoding adds a 10/15 second delay!
And no sound!! But this will be handled separately on the core side apparently.

EDIT: PRs merged, release 1.0.0 out → Package gladys-netatmo · GitHub

Hi @pierre-gilles,

Apparently, to test this better, and logically, we should be able to display one of the device’s parameters to select the stream quality « camera_quality Â»:

[
    {
        "id": "6b193d78-1fab-4edd-87b2-37e3a46b5fd4",
        "device_id": "8f70c343-7642-47e1-883a-dabf6cc0694a",
        "name": "CAMERA_URL",
        "value": "http://10.6.0.23/token/live/files/high/index.m3u8",
        "created_at": "2026-07-21T22:04:32.684Z",
        "updated_at": "2026-07-21T22:04:32.684Z"
    },
    {
        "id": "c66dca61-b96b-431e-8894-db94ce1f9e42",
        "device_id": "8f70c343-7642-47e1-883a-dabf6cc0694a",
        "name": "camera_quality",
        "value": "high",
        "created_at": "2026-07-21T22:04:32.697Z",
        "updated_at": "2026-07-21T22:04:32.697Z"
    }
]

I already have a request to Tuya to allow entering the IP and protocol version fields in the Device files. This goes in the same direction.

We have bypassed this for the moment with a global parameter in the configuration for all cameras in the integration

I haven’t found a solution for the audio stream yet.

And on the other hand, we really need to be able to create documentation with access to the links of the dev platforms because in this case we have no information left to create accounts etc. as we had on the core integrations (or find a way to define starter chapters in the configuration that can include external links?)

EDIT:

  • For the sound, apparently it’s my test camera that’s broken :sweat_smile: :face_with_peeking_eye: and no longer gives any sound… sorry
  • Otherwise, regarding the live delay, Claude makes a proposal:

It’s done!

You’re right! The solution:

1. section field type — starter blocks in the config form (Netatmo port needed)

  • Manifest validation: new section type in the config_schema (and action fields, same engine) — label (chapter title, multilingual), description as plain text ≤ 1000 characters/language, optional links (1–5 entries {url, label}, url https required, unknown fields rejected). Purely presentational: required, default, and placeholder on a section → manifest rejected with 422. The vendored schema reflects everything (enum + links + allOf rules).
  • No value: validateConfigValue rejects a section key in any config payload (front and integration → 422 „section fields have no value“), nothing is ever written to t_variable, and getConfigForFront does not expose the key.
  • Front-end rendering (declarative, zero markdown/HTML): title + text + links opened in a new tab with the target domain displayed in parentheses next to the label. As the config_schema is ordered, sections naturally split large forms — including action mini-forms.

2. Permanent „Documentation“ link on the Configuration screen

  • New getDocsUrls on the server side: the detail GET /api/v1/external_integration/:selector now exposes docs (URLs re-hosted per language, from the store index cache, linked by store_slug — null for a dev install, which has no re-hosted documentation).
  • The front-end displays a „Documentation“ button in the header of the Configuration card (user language, fallback en), for „device“ as well as „communication“ integrations (shared component).
  • Fixing an existing gap: getCatalog was not passing the docs field from the index — the documentation link on the installation screen was reading a field that was always missing. It now passes (docs: entry.docs || null), with assertions in the store tests.

Available in SDK v0.8.0!