TheThingsNetwork / lorawan-devices

Device Repository for LoRaWAN devices
Apache License 2.0
192 stars 370 forks source link

Validate on fresh cloned repository fails #397

Closed oholthau closed 2 years ago

oholthau commented 2 years ago

Summary

Steps to reproduce: git clone https://github.com/TheThingsNetwork/lorawan-devices.git make deps make validate

...

What do you see now?

netvox: r718wb: AU915-928: profile netvox/profile-au915 valid netvox: r718wb: KR920-923: profile netvox/profile-kr920 valid netvox: r718wb: IN865-867: profile netvox/profile-in865 valid netvox: r718wb: CN470-510: profile netvox/profile-cn470 valid node:events:504 throw er; // Unhandled 'error' event ^

Error: read ENOTCONN at tryReadStart (node:net:592:20) at Socket._read (node:net:603:5) at Socket.Readable.read (node:internal/streams/readable:487:10) at Socket.read (node:net:644:39) at new Socket (node:net:401:12) at Object.Socket (node:net:284:41) at createSocket (node:internal/child_process:328:14) at ChildProcess.spawn (node:internal/child_process:445:23) at spawn (node:child_process:700:9) at Object.execFile (node:child_process:327:17) Emitted 'error' event on Socket instance at: at emitErrorNT (node:internal/streams/destroy:157:8) at emitErrorCloseNT (node:internal/streams/destroy:122:3) at processTicksAndRejections (node:internal/process/task_queues:83:21) { errno: -57, code: 'ENOTCONN', syscall: 'read' } make: *** [validate] Error 1 ...

What do you want to see instead?

No error.....

...

How do you propose to implement this?

...

Can you do this yourself and submit a Pull Request?

...

johanstokking commented 2 years ago

@oholthau what is your environment? Operating system, Node version, etc? Can you paste the complete output of make validate?

Weirdly enough it complains about a socket, but there shouldn't be any network access necessary.

oholthau commented 2 years ago

Hi Johan,

here we are:

Operating System: macOS 12.3 on Intel Node version:v16.14.2 npm: v8.5.0 go version go1.18 darwin/amd64

@.*** lorawan-devices % make validate

npm run validate

@.*** validate

node bin/validate.js

vendor index: valid

example: valid index

example: windsensor: valid

example: windsensor: EU863-870: profile example/windsensor-profile valid

example: windsensor: US902-928: profile example/windsensor-profile valid

example: windsensor: EU863-870: profile example/windsensor-profile valid

example: windsensor: US902-928: profile example/windsensor-profile valid

example: windsensor: AS923: profile example/windsensor-profile valid

example: windsensor: windsensor.jpg image has correct extension

example: windsensor: windsensor-package.jpg image has correct extension

adeunis: valid index

adeunis: pulse: valid

adeunis: pulse: EU863-870: profile adeunis/pulse-profile-eu868 valid

adeunis: pulse: US902-928: profile adeunis/pulse-profile-us915 valid

adeunis: pulse: AS923: profile adeunis/pulse-profile-as923 valid

adeunis: analog: valid

adeunis: analog: EU863-870: profile adeunis/pulse-profile-eu868 valid

adeunis: dry-contact: valid

adeunis: dry-contact: EU863-870: profile adeunis/pulse-profile-eu868 valid

adeunis: ftd-network-tester: valid

adeunis: ftd-network-tester: EU863-870: profile adeunis/ftd-profile-eu868 valid

adeunis: modbus: valid

adeunis: modbus: EU863-870: profile adeunis/pulse-profile-eu868 valid

adeunis: temp: valid

adeunis: temp: EU863-870: profile adeunis/pulse-profile-eu868 valid

adeunis: pulse: pulse.png image has correct extension

adeunis: analog: analog.png image has correct extension

adeunis: dry-contact: drycontact.png image has correct extension

adeunis: ftd-network-tester: network.png image has correct extension

adeunis: modbus: modbus.png image has correct extension

adeunis: temp: temp.png image has correct extension

bosch: valid index

bosch: tps110: valid

bosch: tps110: EU863-870: profile bosch/tps110-eu868 valid

bosch: tps110: AS923: profile bosch/tps110-as923 valid

bosch: tps110: EU863-870: profile bosch/tps110-eu868 valid

bosch: tps110: AS923: profile bosch/tps110-as923 valid

bosch: tps110: tps110.png image has correct extension

comtac: valid index

comtac: lpn-td1: valid

comtac: lpn-td1: EU863-870: profile comtac/lpn-td1-profile-eu868 valid

comtac: lpn-km: valid

comtac: lpn-km: EU863-870: profile comtac/lpn-km-profile-eu868 valid

comtac: lpn-tsm: valid

comtac: lpn-tsm: EU863-870: profile comtac/lpn-tsm-profile-eu868 valid

comtac: lpn-cm4: valid

comtac: lpn-cm4: EU863-870: profile comtac/lpn-cm4-profile-eu868 valid

comtac: lpn-td1: lpn-td1-foto.png image has correct extension

comtac: lpn-km: lpn-km-foto.png image has correct extension

comtac: lpn-tsm: lpn-tsm-foto.png image has correct extension

comtac: lpn-cm4: lpn-cm4-foto.png image has correct extension

decentlab: valid index

decentlab: dl-iam: valid

decentlab: dl-iam: EU863-870: profile decentlab/profile-eu868 valid

decentlab: dl-iam: AS923: profile decentlab/profile-as923 valid

decentlab: dl-iam: US902-928: profile decentlab/profile-us915 valid

decentlab: dl-iam: AU915-928: profile decentlab/profile-au915 valid

decentlab: dl-pr26: valid

decentlab: dl-pr26: EU863-870: profile decentlab/profile-eu868 valid

decentlab: dl-pr26: AS923: profile decentlab/profile-as923 valid

decentlab: dl-pr26: US902-928: profile decentlab/profile-us915 valid

decentlab: dl-pr26: AU915-928: profile decentlab/profile-au915 valid

decentlab: dl-mbx: valid

decentlab: dl-mbx: EU863-870: profile decentlab/profile-eu868 valid

decentlab: dl-mbx: AS923: profile decentlab/profile-as923 valid

decentlab: dl-mbx: US902-928: profile decentlab/profile-us915 valid

decentlab: dl-mbx: AU915-928: profile decentlab/profile-au915 valid

decentlab: dl-5tm: valid

decentlab: dl-5tm: EU863-870: profile decentlab/profile-eu868 valid

decentlab: dl-5tm: AS923: profile decentlab/profile-as923 valid

decentlab: dl-5tm: US902-928: profile decentlab/profile-us915 valid

decentlab: dl-5tm: AU915-928: profile decentlab/profile-au915 valid

decentlab: dl-atm22: valid

decentlab: dl-atm22: EU863-870: profile decentlab/profile-eu868 valid

decentlab: dl-atm22: AS923: profile decentlab/profile-as923 valid

decentlab: dl-atm22: US902-928: profile decentlab/profile-us915 valid

decentlab: dl-atm22: AU915-928: profile decentlab/profile-au915 valid

decentlab: dl-atm41: valid

decentlab: dl-atm41: EU863-870: profile decentlab/profile-eu868 valid

decentlab: dl-atm41: AS923: profile decentlab/profile-as923 valid

decentlab: dl-atm41: US902-928: profile decentlab/profile-us915 valid

decentlab: dl-atm41: AU915-928: profile decentlab/profile-au915 valid

decentlab: dl-ctd10: valid

decentlab: dl-ctd10: EU863-870: profile decentlab/profile-eu868 valid

decentlab: dl-ctd10: AS923: profile decentlab/profile-as923 valid

decentlab: dl-ctd10: US902-928: profile decentlab/profile-us915 valid

decentlab: dl-ctd10: AU915-928: profile decentlab/profile-au915 valid

decentlab: dl-dlr2-002: valid

decentlab: dl-dlr2-002: EU863-870: profile decentlab/profile-eu868 valid

decentlab: dl-dlr2-002: AS923: profile decentlab/profile-as923 valid

decentlab: dl-dlr2-002: US902-928: profile decentlab/profile-us915 valid

decentlab: dl-dlr2-002: AU915-928: profile decentlab/profile-au915 valid

decentlab: dl-dlr2-003: valid

decentlab: dl-dlr2-003: EU863-870: profile decentlab/profile-eu868 valid

decentlab: dl-dlr2-003: AS923: profile decentlab/profile-as923 valid

decentlab: dl-dlr2-003: US902-928: profile decentlab/profile-us915 valid

decentlab: dl-dlr2-003: AU915-928: profile decentlab/profile-au915 valid

decentlab: dl-dlr2-004: valid

decentlab: dl-dlr2-004: EU863-870: profile decentlab/profile-eu868 valid

decentlab: dl-dlr2-004: AS923: profile decentlab/profile-as923 valid

decentlab: dl-dlr2-004: US902-928: profile decentlab/profile-us915 valid

decentlab: dl-dlr2-004: AU915-928: profile decentlab/profile-au915 valid

decentlab: dl-dlr2-005: valid

decentlab: dl-dlr2-005: EU863-870: profile decentlab/profile-eu868 valid

decentlab: dl-dlr2-005: AS923: profile decentlab/profile-as923 valid

decentlab: dl-dlr2-005: US902-928: profile decentlab/profile-us915 valid

decentlab: dl-dlr2-005: AU915-928: profile decentlab/profile-au915 valid

decentlab: dl-dlr2-006: valid

decentlab: dl-dlr2-006: EU863-870: profile decentlab/profile-eu868 valid

decentlab: dl-dlr2-006: AS923: profile decentlab/profile-as923 valid

decentlab: dl-dlr2-006: US902-928: profile decentlab/profile-us915 valid

decentlab: dl-dlr2-006: AU915-928: profile decentlab/profile-au915 valid

decentlab: dl-dlr2-008: valid

decentlab: dl-dlr2-008: EU863-870: profile decentlab/profile-eu868 valid

decentlab: dl-dlr2-008: AS923: profile decentlab/profile-as923 valid

decentlab: dl-dlr2-008: US902-928: profile decentlab/profile-us915 valid

decentlab: dl-dlr2-008: AU915-928: profile decentlab/profile-au915 valid

decentlab: dl-dlr2-010: valid

decentlab: dl-dlr2-010: EU863-870: profile decentlab/profile-eu868 valid

decentlab: dl-dlr2-010: AS923: profile decentlab/profile-as923 valid

decentlab: dl-dlr2-010: US902-928: profile decentlab/profile-us915 valid

decentlab: dl-dlr2-010: AU915-928: profile decentlab/profile-au915 valid

decentlab: dl-dlr2-012: valid

decentlab: dl-dlr2-012: EU863-870: profile decentlab/profile-eu868 valid

decentlab: dl-dlr2-012: AS923: profile decentlab/profile-as923 valid

decentlab: dl-dlr2-012: US902-928: profile decentlab/profile-us915 valid

decentlab: dl-dlr2-012: AU915-928: profile decentlab/profile-au915 valid

decentlab: dl-ds18: valid

decentlab: dl-ds18: EU863-870: profile decentlab/profile-eu868 valid

decentlab: dl-ds18: AS923: profile decentlab/profile-as923 valid

decentlab: dl-ds18: US902-928: profile decentlab/profile-us915 valid

decentlab: dl-ds18: AU915-928: profile decentlab/profile-au915 valid

decentlab: dl-dws: valid

decentlab: dl-dws: EU863-870: profile decentlab/profile-eu868 valid

decentlab: dl-dws: AS923: profile decentlab/profile-as923 valid

decentlab: dl-dws: US902-928: profile decentlab/profile-us915 valid

decentlab: dl-dws: AU915-928: profile decentlab/profile-au915 valid

decentlab: dl-itst: valid

decentlab: dl-itst: EU863-870: profile decentlab/profile-eu868 valid

decentlab: dl-itst: AS923: profile decentlab/profile-as923 valid

decentlab: dl-itst: US902-928: profile decentlab/profile-us915 valid

decentlab: dl-itst: AU915-928: profile decentlab/profile-au915 valid

decentlab: dl-kl66: valid

decentlab: dl-kl66: EU863-870: profile decentlab/profile-eu868 valid

decentlab: dl-kl66: AS923: profile decentlab/profile-as923 valid

decentlab: dl-kl66: US902-928: profile decentlab/profile-us915 valid

decentlab: dl-kl66: AU915-928: profile decentlab/profile-au915 valid

decentlab: dl-lid: valid

decentlab: dl-lid: EU863-870: profile decentlab/profile-eu868 valid

decentlab: dl-lid: AS923: profile decentlab/profile-as923 valid

decentlab: dl-lid: US902-928: profile decentlab/profile-us915 valid

decentlab: dl-lid: AU915-928: profile decentlab/profile-au915 valid

decentlab: dl-lp8p: valid

decentlab: dl-lp8p: EU863-870: profile decentlab/profile-eu868 valid

decentlab: dl-lp8p: AS923: profile decentlab/profile-as923 valid

decentlab: dl-lp8p: US902-928: profile decentlab/profile-us915 valid

decentlab: dl-lp8p: AU915-928: profile decentlab/profile-au915 valid

decentlab: dl-optod: valid

decentlab: dl-optod: EU863-870: profile decentlab/profile-eu868 valid

decentlab: dl-optod: AS923: profile decentlab/profile-as923 valid

decentlab: dl-optod: US902-928: profile decentlab/profile-us915 valid

decentlab: dl-optod: AU915-928: profile decentlab/profile-au915 valid

decentlab: dl-par: valid

decentlab: dl-par: EU863-870: profile decentlab/profile-eu868 valid

decentlab: dl-par: AS923: profile decentlab/profile-as923 valid

decentlab: dl-par: US902-928: profile decentlab/profile-us915 valid

decentlab: dl-par: AU915-928: profile decentlab/profile-au915 valid

decentlab: dl-pm: valid

decentlab: dl-pm: EU863-870: profile decentlab/profile-eu868 valid

decentlab: dl-pm: AS923: profile decentlab/profile-as923 valid

decentlab: dl-pm: US902-928: profile decentlab/profile-us915 valid

decentlab: dl-pm: AU915-928: profile decentlab/profile-au915 valid

decentlab: dl-pr21: valid

decentlab: dl-pr21: EU863-870: profile decentlab/profile-eu868 valid

decentlab: dl-pr21: AS923: profile decentlab/profile-as923 valid

decentlab: dl-pr21: US902-928: profile decentlab/profile-us915 valid

decentlab: dl-pr21: AU915-928: profile decentlab/profile-au915 valid

decentlab: dl-pr36: valid

decentlab: dl-pr36: EU863-870: profile decentlab/profile-eu868 valid

decentlab: dl-pr36: AS923: profile decentlab/profile-as923 valid

decentlab: dl-pr36: US902-928: profile decentlab/profile-us915 valid

decentlab: dl-pr36: AU915-928: profile decentlab/profile-au915 valid

decentlab: dl-pr36ctd: valid

decentlab: dl-pr36ctd: EU863-870: profile decentlab/profile-eu868 valid

decentlab: dl-pr36ctd: AS923: profile decentlab/profile-as923 valid

decentlab: dl-pr36ctd: US902-928: profile decentlab/profile-us915 valid

decentlab: dl-pr36ctd: AU915-928: profile decentlab/profile-au915 valid

decentlab: dl-pyr: valid

decentlab: dl-pyr: EU863-870: profile decentlab/profile-eu868 valid

decentlab: dl-pyr: AS923: profile decentlab/profile-as923 valid

decentlab: dl-pyr: US902-928: profile decentlab/profile-us915 valid

decentlab: dl-pyr: AU915-928: profile decentlab/profile-au915 valid

decentlab: dl-rhc: valid

decentlab: dl-rhc: EU863-870: profile decentlab/profile-eu868 valid

decentlab: dl-rhc: AS923: profile decentlab/profile-as923 valid

decentlab: dl-rhc: US902-928: profile decentlab/profile-us915 valid

decentlab: dl-rhc: AU915-928: profile decentlab/profile-au915 valid

decentlab: dl-sht35-001: valid

decentlab: dl-sht35-001: EU863-870: profile decentlab/profile-eu868 valid

decentlab: dl-sht35-001: AS923: profile decentlab/profile-as923 valid

decentlab: dl-sht35-001: US902-928: profile decentlab/profile-us915 valid

decentlab: dl-sht35-001: AU915-928: profile decentlab/profile-au915 valid

decentlab: dl-sht35-002: valid

decentlab: dl-sht35-002: EU863-870: profile decentlab/profile-eu868 valid

decentlab: dl-sht35-002: AS923: profile decentlab/profile-as923 valid

decentlab: dl-sht35-002: US902-928: profile decentlab/profile-us915 valid

decentlab: dl-sht35-002: AU915-928: profile decentlab/profile-au915 valid

decentlab: dl-smtp: valid

decentlab: dl-smtp: EU863-870: profile decentlab/profile-eu868 valid

decentlab: dl-smtp: AS923: profile decentlab/profile-as923 valid

decentlab: dl-smtp: US902-928: profile decentlab/profile-us915 valid

decentlab: dl-smtp: AU915-928: profile decentlab/profile-au915 valid

decentlab: dl-tbrg: valid

decentlab: dl-tbrg: EU863-870: profile decentlab/profile-eu868 valid

decentlab: dl-tbrg: AS923: profile decentlab/profile-as923 valid

decentlab: dl-tbrg: US902-928: profile decentlab/profile-us915 valid

decentlab: dl-tbrg: AU915-928: profile decentlab/profile-au915 valid

decentlab: dl-trs11: valid

decentlab: dl-trs11: EU863-870: profile decentlab/profile-eu868 valid

decentlab: dl-trs11: AS923: profile decentlab/profile-as923 valid

decentlab: dl-trs11: US902-928: profile decentlab/profile-us915 valid

decentlab: dl-trs11: AU915-928: profile decentlab/profile-au915 valid

decentlab: dl-trs12: valid

decentlab: dl-trs12: EU863-870: profile decentlab/profile-eu868 valid

decentlab: dl-trs12: AS923: profile decentlab/profile-as923 valid

decentlab: dl-trs12: US902-928: profile decentlab/profile-us915 valid

decentlab: dl-trs12: AU915-928: profile decentlab/profile-au915 valid

decentlab: dl-trs21: valid

decentlab: dl-trs21: EU863-870: profile decentlab/profile-eu868 valid

decentlab: dl-trs21: AS923: profile decentlab/profile-as923 valid

decentlab: dl-trs21: US902-928: profile decentlab/profile-us915 valid

decentlab: dl-trs21: AU915-928: profile decentlab/profile-au915 valid

decentlab: dl-wrm: valid

decentlab: dl-wrm: EU863-870: profile decentlab/profile-eu868 valid

decentlab: dl-wrm: AS923: profile decentlab/profile-as923 valid

decentlab: dl-wrm: US902-928: profile decentlab/profile-us915 valid

decentlab: dl-wrm: AU915-928: profile decentlab/profile-au915 valid

decentlab: dl-zn1: valid

decentlab: dl-zn1: EU863-870: profile decentlab/profile-eu868 valid

decentlab: dl-zn1: AS923: profile decentlab/profile-as923 valid

decentlab: dl-zn1: US902-928: profile decentlab/profile-us915 valid

decentlab: dl-zn1: AU915-928: profile decentlab/profile-au915 valid

decentlab: dl-zn2: valid

decentlab: dl-zn2: EU863-870: profile decentlab/profile-eu868 valid

decentlab: dl-zn2: AS923: profile decentlab/profile-as923 valid

decentlab: dl-zn2: US902-928: profile decentlab/profile-us915 valid

decentlab: dl-zn2: AU915-928: profile decentlab/profile-au915 valid

decentlab: dl-iam: dl-iam.png image has correct extension

decentlab: dl-iam: dl-iam-2.jpg image has correct extension

decentlab: dl-iam: dl-iam-3.jpg image has correct extension

decentlab: dl-iam: dl-iam-4.jpg image has correct extension

decentlab: dl-iam: dl-iam-5.jpg image has correct extension

decentlab: dl-pr26: dl-pr26.png image has correct extension

decentlab: dl-pr26: dl-pr26-2.jpg image has correct extension

decentlab: dl-pr26: dl-pr26-3.jpg image has correct extension

decentlab: dl-mbx: dl-mbx.png image has correct extension

decentlab: dl-mbx: dl-mbx-004-005.png image has correct extension

decentlab: dl-mbx: dl-mbx-cable.jpg image has correct extension

decentlab: dl-mbx: dl-mbx-2.jpg image has correct extension

decentlab: dl-mbx: dl-mbx-3.jpg image has correct extension

decentlab: dl-mbx: dl-mbx-4.jpg image has correct extension

decentlab: dl-mbx: dl-mbx-5.jpg image has correct extension

decentlab: dl-mbx: dl-mbx-6.jpg image has correct extension

decentlab: dl-5tm: dl-5tm.png image has correct extension

decentlab: dl-atm22: dl-atm22.png image has correct extension

decentlab: dl-atm22: dl-atm22-2.jpg image has correct extension

decentlab: dl-atm22: dl-atm22-3.jpg image has correct extension

decentlab: dl-atm22: dl-atm22-4.jpg image has correct extension

decentlab: dl-atm22: dl-atm22-5.jpg image has correct extension

decentlab: dl-atm22: dl-atm22-6.jpg image has correct extension

decentlab: dl-atm22: dl-atm22-7.jpg image has correct extension

decentlab: dl-atm22: dl-atm22-8.jpg image has correct extension

decentlab: dl-atm22: dl-atm22-9.jpg image has correct extension

decentlab: dl-atm22: dl-atm22-10.jpg image has correct extension

decentlab: dl-atm41: dl-atm41.png image has correct extension

decentlab: dl-atm41: dl-atm41-2.jpg image has correct extension

decentlab: dl-ctd10: dl-ctd10.png image has correct extension

decentlab: dl-dlr2-002: dl-dlr2.png image has correct extension

decentlab: dl-dlr2-003: dl-dlr2.png image has correct extension

decentlab: dl-dlr2-004: dl-dlr2.png image has correct extension

decentlab: dl-dlr2-005: dl-dlr2.png image has correct extension

decentlab: dl-dlr2-006: dl-dlr2.png image has correct extension

decentlab: dl-dlr2-008: dl-dlr2.png image has correct extension

decentlab: dl-dlr2-010: dl-dlr2.png image has correct extension

decentlab: dl-dlr2-012: dl-dlr2.png image has correct extension

decentlab: dl-ds18: dl-ds18.png image has correct extension

decentlab: dl-dws: dl-dws.png image has correct extension

decentlab: dl-itst: dl-itst.png image has correct extension

decentlab: dl-kl66: dl-kl66.jpg image has correct extension

decentlab: dl-lid: dl-lid.png image has correct extension

decentlab: dl-lp8p: dl-lp8p.png image has correct extension

decentlab: dl-lp8p: dl-lp8p-2.jpg image has correct extension

decentlab: dl-lp8p: dl-lp8p-3.jpg image has correct extension

decentlab: dl-lp8p: dl-lp8p-4.jpg image has correct extension

decentlab: dl-optod: dl-optod.png image has correct extension

decentlab: dl-par: dl-pxr.png image has correct extension

decentlab: dl-pm: dl-pm.png image has correct extension

decentlab: dl-pr21: dl-pr21.png image has correct extension

decentlab: dl-pr36: dl-pr36.png image has correct extension

decentlab: dl-pr36ctd: dl-pr36ctd.png image has correct extension

decentlab: dl-pyr: dl-pxr.png image has correct extension

decentlab: dl-rhc: dl-rhc.png image has correct extension

decentlab: dl-sht35-001: dl-sht35-001.png image has correct extension

decentlab: dl-sht35-001: dl-sht35-001-2.jpg image has correct extension

decentlab: dl-sht35-001: dl-sht35-001-3.jpg image has correct extension

decentlab: dl-sht35-001: dl-sht35-001-4.jpg image has correct extension

decentlab: dl-sht35-001: dl-sht35-001-5.jpg image has correct extension

decentlab: dl-sht35-001: dl-sht35-001-6.jpg image has correct extension

decentlab: dl-sht35-001: dl-sht35-001-7.jpg image has correct extension

decentlab: dl-sht35-001: dl-sht35-001-8.jpg image has correct extension

decentlab: dl-sht35-001: dl-sht35-001-9.jpg image has correct extension

decentlab: dl-sht35-001: dl-sht35-001-10.jpg image has correct extension

decentlab: dl-sht35-001: dl-sht35-001-11.jpg image has correct extension

decentlab: dl-sht35-001: dl-sht35-001-12.jpg image has correct extension

decentlab: dl-sht35-002: dl-sht35-002.png image has correct extension

decentlab: dl-smtp: dl-smtp.png image has correct extension

decentlab: dl-smtp: dl-smtp-2.jpg image has correct extension

decentlab: dl-smtp: dl-smtp-3.jpg image has correct extension

decentlab: dl-tbrg: dl-tbrg.png image has correct extension

decentlab: dl-trs11: dl-trs1x.png image has correct extension

decentlab: dl-trs12: dl-trs1x.png image has correct extension

decentlab: dl-trs21: dl-trs21.png image has correct extension

decentlab: dl-wrm: dl-wrm.png image has correct extension

decentlab: dl-zn1: dl-znx.png image has correct extension

decentlab: dl-zn1: dl-zn1-2.jpg image has correct extension

decentlab: dl-zn1: dl-zn1-3.jpg image has correct extension

decentlab: dl-zn2: dl-znx.png image has correct extension

digital-matter: valid index

digital-matter: oyster: valid

digital-matter: oyster: EU863-870: profile digital-matter/oyster-profile valid

digital-matter: oyster: IN865-867: profile digital-matter/oyster-profile valid

digital-matter: oyster: RU864-870: profile digital-matter/oyster-profile valid

digital-matter: oyster: US902-928: profile digital-matter/oyster-profile valid

digital-matter: oyster: AU915-928: profile digital-matter/oyster-profile valid

digital-matter: oyster: AS923: profile digital-matter/oyster-profile valid

digital-matter: oyster: KR920-923: profile digital-matter/oyster-profile valid

digital-matter: oyster: US902-928: profile digital-matter/oyster-profile valid

digital-matter: oyster: AU915-928: profile digital-matter/oyster-profile valid

digital-matter: oyster: AS923: profile digital-matter/oyster-profile valid

digital-matter: oyster: KR920-923: profile digital-matter/oyster-profile valid

digital-matter: yabby-edge: valid

digital-matter: yabby-edge: EU863-870: profile digital-matter/yabby-edge-profile valid

digital-matter: yabby-edge: IN865-867: profile digital-matter/yabby-edge-profile valid

digital-matter: yabby-edge: RU864-870: profile digital-matter/yabby-edge-profile valid

digital-matter: yabby-edge: US902-928: profile digital-matter/yabby-edge-profile valid

digital-matter: yabby-edge: AU915-928: profile digital-matter/yabby-edge-profile valid

digital-matter: yabby-edge: AS923: profile digital-matter/yabby-edge-profile valid

digital-matter: yabby-edge: KR920-923: profile digital-matter/yabby-edge-profile valid

digital-matter: oyster: oyster.png image has correct extension

digital-matter: yabby-edge: yabby-edge.png image has correct extension

elsys: valid index

elsys: ers: valid

elsys: ers: EU863-870: profile elsys/elsys-eu868-profile valid

elsys: ers: US902-928: profile elsys/elsys-us902-profile valid

elsys: ers: AS923: profile elsys/elsys-as923-profile valid

elsys: ers: AU915-928: profile elsys/elsys-au915-profile valid

elsys: ers-co2: valid

elsys: ers-co2: EU863-870: profile elsys/elsys-eu868-profile valid

elsys: ers-co2: US902-928: profile elsys/elsys-us902-profile valid

elsys: ers-co2: AS923: profile elsys/elsys-as923-profile valid

elsys: ers-co2: AU915-928: profile elsys/elsys-au915-profile valid

elsys: ers-co2-lite: valid

elsys: ers-co2-lite: EU863-870: profile elsys/elsys-eu868-profile valid

elsys: ers-co2-lite: US902-928: profile elsys/elsys-us902-profile valid

elsys: ers-co2-lite: AS923: profile elsys/elsys-as923-profile valid

elsys: ers-co2-lite: AU915-928: profile elsys/elsys-au915-profile valid

elsys: ers-voc: valid

elsys: ers-voc: EU863-870: profile elsys/elsys-eu868-profile valid

elsys: ers-voc: US902-928: profile elsys/elsys-us902-profile valid

elsys: ers-voc: AS923: profile elsys/elsys-as923-profile valid

elsys: ers-voc: AU915-928: profile elsys/elsys-au915-profile valid

elsys: ers-eye: valid

elsys: ers-eye: EU863-870: profile elsys/elsys-eu868-profile valid

elsys: ers-eye: US902-928: profile elsys/elsys-us902-profile valid

elsys: ers-eye: AS923: profile elsys/elsys-as923-profile valid

elsys: ers-eye: AU915-928: profile elsys/elsys-au915-profile valid

elsys: ers-sound: valid

elsys: ers-sound: EU863-870: profile elsys/elsys-eu868-profile valid

elsys: ers-sound: US902-928: profile elsys/elsys-us902-profile valid

elsys: ers-sound: AS923: profile elsys/elsys-as923-profile valid

elsys: ers-sound: AU915-928: profile elsys/elsys-au915-profile valid

elsys: ers-lite: valid

elsys: ers-lite: EU863-870: profile elsys/elsys-eu868-profile valid

elsys: ers-lite: US902-928: profile elsys/elsys-us902-profile valid

elsys: ers-lite: AS923: profile elsys/elsys-as923-profile valid

elsys: ers-lite: AU915-928: profile elsys/elsys-au915-profile valid

elsys: elt-2: valid

elsys: elt-2: EU863-870: profile elsys/elsys-eu868-profile valid

elsys: elt-2: US902-928: profile elsys/elsys-us902-profile valid

elsys: elt-2: AS923: profile elsys/elsys-as923-profile valid

elsys: elt-2: AU915-928: profile elsys/elsys-au915-profile valid

elsys: elt-lite: valid

elsys: elt-lite: EU863-870: profile elsys/elsys-eu868-profile valid

elsys: elt-lite: US902-928: profile elsys/elsys-us902-profile valid

elsys: elt-lite: AS923: profile elsys/elsys-as923-profile valid

elsys: elt-lite: AU915-928: profile elsys/elsys-au915-profile valid

elsys: elt-ultrasonic: valid

elsys: elt-ultrasonic: EU863-870: profile elsys/elsys-eu868-profile valid

elsys: elt-ultrasonic: US902-928: profile elsys/elsys-us902-profile valid

elsys: elt-ultrasonic: AS923: profile elsys/elsys-as923-profile valid

elsys: elt-ultrasonic: AU915-928: profile elsys/elsys-au915-profile valid

elsys: ems: valid

elsys: ems: EU863-870: profile elsys/elsys-eu868-profile valid

elsys: ems: US902-928: profile elsys/elsys-us902-profile valid

elsys: ems: AS923: profile elsys/elsys-as923-profile valid

elsys: ems: AU915-928: profile elsys/elsys-au915-profile valid

elsys: ems-door: valid

elsys: ems-door: EU863-870: profile elsys/elsys-eu868-profile valid

elsys: ems-door: US902-928: profile elsys/elsys-us902-profile valid

elsys: ems-door: AS923: profile elsys/elsys-as923-profile valid

elsys: ems-door: AU915-928: profile elsys/elsys-au915-profile valid

elsys: ems-lite: valid

elsys: ems-lite: EU863-870: profile elsys/elsys-eu868-profile valid

elsys: ems-lite: US902-928: profile elsys/elsys-us902-profile valid

elsys: ems-lite: AS923: profile elsys/elsys-as923-profile valid

elsys: ems-lite: AU915-928: profile elsys/elsys-au915-profile valid

elsys: ems-desk: valid

elsys: ems-desk: EU863-870: profile elsys/elsys-eu868-profile valid

elsys: ems-desk: US902-928: profile elsys/elsys-us902-profile valid

elsys: ems-desk: AS923: profile elsys/elsys-as923-profile valid

elsys: ems-desk: AU915-928: profile elsys/elsys-au915-profile valid

elsys: ers: ers.png image has correct extension

elsys: ers-co2: ers.png image has correct extension

elsys: ers-co2-lite: erslite.png image has correct extension

elsys: ers-voc: ersvoc.png image has correct extension

elsys: ers-eye: erseye.png image has correct extension

elsys: ers-sound: erssound.png image has correct extension

elsys: ers-lite: erslite.png image has correct extension

elsys: elt-2: elt2.png image has correct extension

elsys: elt-lite: elt2.png image has correct extension

elsys: elt-ultrasonic: eltultrasonic.png image has correct extension

elsys: ems: ems.png image has correct extension

elsys: ems-door: ems.png image has correct extension

elsys: ems-lite: ems.png image has correct extension

elsys: ems-desk: ems.png image has correct extension

baylan: valid index

baylan: tk4-rf: valid

baylan: tk4-rf: EU863-870: profile baylan/tk4-rf-profile valid

baylan: tk4-rf: tk4-rf.png image has correct extension

baylan: tk4-rf: baylan.png image has correct extension

imst: valid index

imst: range-extender: valid

imst: range-extender: EU863-870: profile imst/range-extender-profile valid

imst: range-extender: EU863-870: profile imst/range-extender-profile-lw104 valid

imst: ioke868: valid

imst: ioke868: EU863-870: profile imst/ioke868-profile valid

imst: range-extender: range-extender.jpg image has correct extension

imst: range-extender: range-extender_sketch.jpg image has correct extension

imst: ioke868: io881a.jpg image has correct extension

imst: ioke868: ioke868.jpg image has correct extension

imst: ioke868: io881a_meter.jpg image has correct extension

imst: ioke868: io881a_sketch.jpg image has correct extension

iothings: valid index

iothings: iotracker3: valid

iothings: iotracker3: EU863-870: profile iothings/iotracker3-profile valid

iothings: iotracker3: US902-928: profile iothings/iotracker3-profile valid

iothings: iotracker3: iotracker3.png image has correct extension

keller: valid index

keller: adt1-tube: valid

keller: adt1-tube: EU863-870: profile keller/adt1-profile valid

keller: adt1-tube: US902-928: profile keller/adt1-profile valid

keller: adt1-tube: AU915-928: profile keller/adt1-profile valid

keller: adt1-tube: AS923: profile keller/adt1-profile valid

keller: adt1-tube: KR920-923: profile keller/adt1-profile valid

keller: adt1-tube: IN865-867: profile keller/adt1-profile valid

keller: adt1-box: valid

keller: adt1-box: EU863-870: profile keller/adt1-profile valid

keller: adt1-box: US902-928: profile keller/adt1-profile valid

keller: adt1-box: AU915-928: profile keller/adt1-profile valid

keller: adt1-box: AS923: profile keller/adt1-profile valid

keller: adt1-box: KR920-923: profile keller/adt1-profile valid

keller: adt1-box: IN865-867: profile keller/adt1-profile valid

keller: arc1-tube: valid

keller: arc1-tube: EU863-870: profile keller/arc1-profile valid

keller: arc1-tube: US902-928: profile keller/arc1-profile valid

keller: arc1-box: valid

keller: arc1-box: EU863-870: profile keller/arc1-profile valid

keller: arc1-box: US902-928: profile keller/arc1-profile valid

keller: adt1-tube: adt1-tube-open.jpg image has correct extension

keller: adt1-tube: adt1-tube-02.jpg image has correct extension

keller: adt1-box: adt1-box-open.jpg image has correct extension

keller: adt1-box: adt1-box-01.jpg image has correct extension

keller: adt1-box: adt1-box-02.jpg image has correct extension

keller: arc1-tube: arc1-tube.jpg image has correct extension

keller: arc1-tube: arc1-tube-open.jpg image has correct extension

keller: arc1-tube: arc1-tube-back.jpg image has correct extension

keller: arc1-box: arc1-box-front.jpg image has correct extension

keller: arc1-box: arc1-box-5sensors.jpg image has correct extension

keller: arc1-box: arc1-box-dim.jpg image has correct extension

laird: valid index

laird: rs1xx-temp-rh-sensor: valid

laird: rs1xx-temp-rh-sensor: EU863-870: profile laird/rs1xx-sensor-profile valid

laird: rs1xx-temp-rh-sensor: US902-928: profile laird/rs1xx-sensor-profile valid

laird: rs1xx-temp-rh-sensor: AU915-928: profile laird/rs1xx-sensor-profile valid

laird: rs1xx-temp-rh-sensor: AS923: profile laird/rs1xx-sensor-profile valid

laird: rs1xx-ext-temp-1w-sensor: valid

laird: rs1xx-ext-temp-1w-sensor: EU863-870: profile laird/rs1xx-sensor-profile valid

laird: rs1xx-ext-temp-1w-sensor: US902-928: profile laird/rs1xx-sensor-profile valid

laird: rs1xx-ext-temp-1w-sensor: AU915-928: profile laird/rs1xx-sensor-profile valid

laird: rs1xx-ext-temp-1w-sensor: AS923: profile laird/rs1xx-sensor-profile valid

laird: rs1xx-ext-multi-sensor: valid

laird: rs1xx-ext-multi-sensor: EU863-870: profile laird/rs1xx-sensor-profile valid

laird: rs1xx-ext-multi-sensor: US902-928: profile laird/rs1xx-sensor-profile valid

laird: rs1xx-ext-multi-sensor: AU915-928: profile laird/rs1xx-sensor-profile valid

laird: rs1xx-ext-multi-sensor: AS923: profile laird/rs1xx-sensor-profile valid

laird: rs1xx-ext-temp-rtd-sensor: valid

laird: rs1xx-ext-temp-rtd-sensor: EU863-870: profile laird/rs1xx-sensor-profile valid

laird: rs1xx-ext-temp-rtd-sensor: US902-928: profile laird/rs1xx-sensor-profile valid

laird: rs1xx-ext-temp-rtd-sensor: AU915-928: profile laird/rs1xx-sensor-profile valid

laird: rs1xx-ext-temp-rtd-sensor: AS923: profile laird/rs1xx-sensor-profile valid

laird: rs1xx-temp-rh-sensor: rs1xx-temp-rh-sensor.jpg image has correct extension

laird: rs1xx-ext-temp-1w-sensor: rs1xx-ext-sensor.jpg image has correct extension

laird: rs1xx-ext-temp-1w-sensor: rs1xx-ext-temp-1w-sensor.jpg image has correct extension

laird: rs1xx-ext-multi-sensor: rs1xx-ext-sensor.jpg image has correct extension

laird: rs1xx-ext-multi-sensor: rs1xx-ext-openclosed-sensor.jpg image has correct extension

laird: rs1xx-ext-temp-rtd-sensor: rs1xx-ext-sensor.jpg image has correct extension

laird: rs1xx-ext-temp-rtd-sensor: rs1xx-ext-temp-rtd-sensor.jpg image has correct extension

mcci: valid index

mcci: catena4430: valid

mcci: catena4430: EU863-870: profile mcci/catena4430-profile valid

mcci: catena4430: US902-928: profile mcci/catena4430-profile valid

mcci: catena4430: AU915-928: profile mcci/catena4430-profile valid

mcci: catena4430: AS923: profile mcci/catena4430-profile valid

mcci: catena4430: KR920-923: profile mcci/catena4430-profile valid

mcci: catena4430: IN865-867: profile mcci/catena4430-profile valid

mcci: catena4450: valid

mcci: catena4450: EU863-870: profile mcci/catena4450-profile valid

mcci: catena4450: US902-928: profile mcci/catena4450-profile valid

mcci: catena4450: AU915-928: profile mcci/catena4450-profile valid

mcci: catena4450: AS923: profile mcci/catena4450-profile valid

mcci: catena4450: KR920-923: profile mcci/catena4450-profile valid

mcci: catena4450: IN865-867: profile mcci/catena4450-profile valid

mcci: catena4460: valid

mcci: catena4460: EU863-870: profile mcci/catena4460-profile valid

mcci: catena4460: US902-928: profile mcci/catena4460-profile valid

mcci: catena4460: AU915-928: profile mcci/catena4460-profile valid

mcci: catena4460: AS923: profile mcci/catena4460-profile valid

mcci: catena4460: KR920-923: profile mcci/catena4460-profile valid

mcci: catena4460: IN865-867: profile mcci/catena4460-profile valid

mcci: catena4470: valid

mcci: catena4470: EU863-870: profile mcci/catena4470-profile valid

mcci: catena4470: US902-928: profile mcci/catena4470-profile valid

mcci: catena4470: AU915-928: profile mcci/catena4470-profile valid

mcci: catena4470: AS923: profile mcci/catena4470-profile valid

mcci: catena4470: KR920-923: profile mcci/catena4470-profile valid

mcci: catena4470: IN865-867: profile mcci/catena4470-profile valid

mcci: catena4610: valid

mcci: catena4610: EU863-870: profile mcci/catena4610-profile valid

mcci: catena4610: US902-928: profile mcci/catena4610-profile valid

mcci: catena4610: AU915-928: profile mcci/catena4610-profile valid

mcci: catena4610: AS923: profile mcci/catena4610-profile valid

mcci: catena4610: KR920-923: profile mcci/catena4610-profile valid

mcci: catena4610: IN865-867: profile mcci/catena4610-profile valid

mcci: catena4612: valid

mcci: catena4612: EU863-870: profile mcci/catena4612-profile valid

mcci: catena4612: US902-928: profile mcci/catena4612-profile valid

mcci: catena4612: AU915-928: profile mcci/catena4612-profile valid

mcci: catena4612: AS923: profile mcci/catena4612-profile valid

mcci: catena4612: KR920-923: profile mcci/catena4612-profile valid

mcci: catena4612: IN865-867: profile mcci/catena4612-profile valid

mcci: catena4618: valid

mcci: catena4618: EU863-870: profile mcci/catena4618-profile valid

mcci: catena4618: US902-928: profile mcci/catena4618-profile valid

mcci: catena4618: AU915-928: profile mcci/catena4618-profile valid

mcci: catena4618: AS923: profile mcci/catena4618-profile valid

mcci: catena4618: KR920-923: profile mcci/catena4618-profile valid

mcci: catena4618: IN865-867: profile mcci/catena4618-profile valid

mcci: catena4618m201: valid

mcci: catena4618m201: EU863-870: profile mcci/catena4618m201-profile valid

mcci: catena4618m201: US902-928: profile mcci/catena4618m201-profile valid

mcci: catena4618m201: AU915-928: profile mcci/catena4618m201-profile valid

mcci: catena4618m201: AS923: profile mcci/catena4618m201-profile valid

mcci: catena4618m201: KR920-923: profile mcci/catena4618m201-profile valid

mcci: catena4618m201: IN865-867: profile mcci/catena4618m201-profile valid

mcci: catena4801: valid

mcci: catena4801: EU863-870: profile mcci/catena4801-profile valid

mcci: catena4801: US902-928: profile mcci/catena4801-profile valid

mcci: catena4801: AU915-928: profile mcci/catena4801-profile valid

mcci: catena4801: AS923: profile mcci/catena4801-profile valid

mcci: catena4801: KR920-923: profile mcci/catena4801-profile valid

mcci: catena4801: IN865-867: profile mcci/catena4801-profile valid

mcci: catena4802: valid

mcci: catena4802: EU863-870: profile mcci/catena4802-profile valid

mcci: catena4802: US902-928: profile mcci/catena4802-profile valid

mcci: catena4802: AU915-928: profile mcci/catena4802-profile valid

mcci: catena4802: AS923: profile mcci/catena4802-profile valid

mcci: catena4802: KR920-923: profile mcci/catena4802-profile valid

mcci: catena4802: IN865-867: profile mcci/catena4802-profile valid

mcci: model4811: valid

mcci: model4811: EU863-870: profile mcci/model4811-profile valid

mcci: model4811: US902-928: profile mcci/model4811-profile valid

mcci: model4811: AU915-928: profile mcci/model4811-profile valid

mcci: model4811: AS923: profile mcci/model4811-profile valid

mcci: model4811: KR920-923: profile mcci/model4811-profile valid

mcci: model4811: IN865-867: profile mcci/model4811-profile valid

mcci: model4821: valid

mcci: model4821: EU863-870: profile mcci/model4821-profile valid

mcci: model4821: US902-928: profile mcci/model4821-profile valid

mcci: model4821: AU915-928: profile mcci/model4821-profile valid

mcci: model4821: AS923: profile mcci/model4821-profile valid

mcci: model4821: KR920-923: profile mcci/model4821-profile valid

mcci: model4821: IN865-867: profile mcci/model4821-profile valid

mcci: model4822: valid

mcci: model4822: EU863-870: profile mcci/model4822-profile valid

mcci: model4822: US902-928: profile mcci/model4822-profile valid

mcci: model4822: AU915-928: profile mcci/model4822-profile valid

mcci: model4822: AS923: profile mcci/model4822-profile valid

mcci: model4822: KR920-923: profile mcci/model4822-profile valid

mcci: model4822: IN865-867: profile mcci/model4822-profile valid

mcci: model4823: valid

mcci: model4823: EU863-870: profile mcci/model4823-profile valid

mcci: model4823: US902-928: profile mcci/model4823-profile valid

mcci: model4823: AU915-928: profile mcci/model4823-profile valid

mcci: model4823: AS923: profile mcci/model4823-profile valid

mcci: model4823: KR920-923: profile mcci/model4823-profile valid

mcci: model4823: IN865-867: profile mcci/model4823-profile valid

mcci: model4831: valid

mcci: model4831: EU863-870: profile mcci/model4831-profile valid

mcci: model4831: US902-928: profile mcci/model4831-profile valid

mcci: model4831: AU915-928: profile mcci/model4831-profile valid

mcci: model4831: AS923: profile mcci/model4831-profile valid

mcci: model4831: KR920-923: profile mcci/model4831-profile valid

mcci: model4831: IN865-867: profile mcci/model4831-profile valid

mcci: model4832: valid

mcci: model4832: EU863-870: profile mcci/model4832-profile valid

mcci: model4832: US902-928: profile mcci/model4832-profile valid

mcci: model4832: AU915-928: profile mcci/model4832-profile valid

mcci: model4832: AS923: profile mcci/model4832-profile valid

mcci: model4832: KR920-923: profile mcci/model4832-profile valid

mcci: model4832: IN865-867: profile mcci/model4832-profile valid

mcci: model4841: valid

mcci: model4841: EU863-870: profile mcci/model4841-profile valid

mcci: model4841: US902-928: profile mcci/model4841-profile valid

mcci: model4841: AU915-928: profile mcci/model4841-profile valid

mcci: model4841: AS923: profile mcci/model4841-profile valid

mcci: model4841: KR920-923: profile mcci/model4841-profile valid

mcci: model4841: IN865-867: profile mcci/model4841-profile valid

mcci: catena4430: catena4430.png image has correct extension

mcci: catena4450: catena4450.png image has correct extension

mcci: catena4460: catena4450.png image has correct extension

mcci: catena4470: catena4470.png image has correct extension

mcci: catena4470: catena4470-sys.jpg image has correct extension

mcci: catena4610: catena4610.png image has correct extension

mcci: catena4610: catena4610-pinmapping.jpg image has correct extension

mcci: catena4612: catena4612.png image has correct extension

mcci: catena4612: catena4612-encl.png image has correct extension

mcci: catena4612: catena4612_4618-pinout.png image has correct extension

mcci: catena4618: catena4618.png image has correct extension

mcci: catena4618: catena4612_4618-pinout.png image has correct extension

mcci: catena4618m201: catena4618.png image has correct extension

mcci: catena4618m201: catena4612_4618-pinout.png image has correct extension

mcci: catena4801: catena4801.png image has correct extension

mcci: catena4801: catena4801-breakout.png image has correct extension

mcci: catena4802: catena4802.png image has correct extension

mcci: catena4802: catena4802-terminals.jpg image has correct extension

mcci: catena4802: catena4802-pinout.png image has correct extension

mcci: model4811: model4811.jpg image has correct extension

mcci: model4811: model4811-data.png image has correct extension

mcci: model4821: model482x.png image has correct extension

mcci: model4822: model482x.png image has correct extension

mcci: model4823: model482x.png image has correct extension

mcci: model4831: model483x-closed.png image has correct extension

mcci: model4831: model483x-open.jpg image has correct extension

mcci: model4832: model483x-closed.png image has correct extension

mcci: model4832: model483x-open.jpg image has correct extension

mcci: model4841: model4841.png image has correct extension

mcci: model4841: model4841-2.jpg image has correct extension

mcf88: valid index

mcf88: mcf-lw06davk: valid

mcf88: mcf-lw06davk: EU863-870: profile mcf88/eu868-profile-a valid

mcf88: mcf-lw06davk: US902-928: profile mcf88/us915-profile-a valid

mcf88: mcf-lw06davk: AU915-928: profile mcf88/au915-profile-a valid

mcf88: mcf-lw06davk: AS923: profile mcf88/as923-profile-a valid

mcf88: mcf-lw06davpk: valid

mcf88: mcf-lw06davpk: EU863-870: profile mcf88/eu868-profile-a valid

mcf88: mcf-lw06davpk: US902-928: profile mcf88/us915-profile-a valid

mcf88: mcf-lw06davpk: AU915-928: profile mcf88/au915-profile-a valid

mcf88: mcf-lw06davpk: AS923: profile mcf88/as923-profile-a valid

mcf88: mcf-lw12co2: valid

mcf88: mcf-lw12co2: EU863-870: profile mcf88/eu868-profile-a valid

mcf88: mcf-lw12co2: US902-928: profile mcf88/us915-profile-a valid

mcf88: mcf-lw12co2: AU915-928: profile mcf88/au915-profile-a valid

mcf88: mcf-lw12co2: AS923: profile mcf88/as923-profile-a valid

mcf88: mcf-lw12co2e: valid

mcf88: mcf-lw12co2e: EU863-870: profile mcf88/eu868-profile-a valid

mcf88: mcf-lw12co2e: US902-928: profile mcf88/us915-profile-a valid

mcf88: mcf-lw12co2e: AU915-928: profile mcf88/au915-profile-a valid

mcf88: mcf-lw12co2e: AS923: profile mcf88/as923-profile-a valid

mcf88: mcf-lw12met: valid

mcf88: mcf-lw12met: EU863-870: profile mcf88/eu868-profile-c valid

mcf88: mcf-lw12met: US902-928: profile mcf88/us915-profile-c valid

mcf88: mcf-lw12met: AU915-928: profile mcf88/au915-profile-c valid

mcf88: mcf-lw12met: AS923: profile mcf88/as923-profile-c valid

mcf88: mcf-lw12plg: valid

mcf88: mcf-lw12plg: EU863-870: profile mcf88/eu868-profile-c valid

mcf88: mcf-lw12plg: US902-928: profile mcf88/us915-profile-c valid

mcf88: mcf-lw12plg: AU915-928: profile mcf88/au915-profile-c valid

mcf88: mcf-lw12plg: AS923: profile mcf88/as923-profile-c valid

mcf88: mcf-lw12ter: valid

mcf88: mcf-lw12ter: EU863-870: profile mcf88/eu868-profile-a valid

mcf88: mcf-lw12ter: US902-928: profile mcf88/us915-profile-a valid

mcf88: mcf-lw12ter: AU915-928: profile mcf88/au915-profile-a valid

mcf88: mcf-lw12ter: AS923: profile mcf88/as923-profile-a valid

mcf88: mcf-lw12terwp: valid

mcf88: mcf-lw12terwp: EU863-870: profile mcf88/eu868-profile-a valid

mcf88: mcf-lw12terwp: US902-928: profile mcf88/us915-profile-a valid

mcf88: mcf-lw12terwp: AU915-928: profile mcf88/au915-profile-a valid

mcf88: mcf-lw12terwp: AS923: profile mcf88/as923-profile-a valid

mcf88: mcf-lw12terpm: valid

mcf88: mcf-lw12terpm: EU863-870: profile mcf88/eu868-profile-a valid

mcf88: mcf-lw12terpm: US902-928: profile mcf88/us915-profile-a valid

mcf88: mcf-lw12terpm: AU915-928: profile mcf88/au915-profile-a valid

mcf88: mcf-lw12terpm: AS923: profile mcf88/as923-profile-a valid

mcf88: mcf-lw12voc: valid

mcf88: mcf-lw12voc: EU863-870: profile mcf88/eu868-profile-a valid

mcf88: mcf-lw12voc: US902-928: profile mcf88/us915-profile-a valid

mcf88: mcf-lw12voc: AU915-928: profile mcf88/au915-profile-a valid

mcf88: mcf-lw12voc: AS923: profile mcf88/as923-profile-a valid

mcf88: mcf-lw13io: valid

mcf88: mcf-lw13io: EU863-870: profile mcf88/eu868-profile-c valid

mcf88: mcf-lw13io: US902-928: profile mcf88/us915-profile-c valid

mcf88: mcf-lw13io: AU915-928: profile mcf88/au915-profile-c valid

mcf88: mcf-lw13io: AS923: profile mcf88/as923-profile-c valid

mcf88: mcf-lw13mio: valid

mcf88: mcf-lw13mio: EU863-870: profile mcf88/eu868-profile-c valid

mcf88: mcf-lw13mio: US902-928: profile mcf88/us915-profile-c valid

mcf88: mcf-lw13mio: AU915-928: profile mcf88/au915-profile-c valid

mcf88: mcf-lw13mio: AS923: profile mcf88/as923-profile-c valid

mcf88: mcf-lwws00: valid

mcf88: mcf-lwws00: EU863-870: profile mcf88/eu868-profile-a valid

mcf88: mcf-lwws00: US902-928: profile mcf88/us915-profile-a valid

mcf88: mcf-lwws00: AU915-928: profile mcf88/au915-profile-a valid

mcf88: mcf-lwws00: AS923: profile mcf88/as923-profile-a valid

mcf88: mcf-lwws01: valid

mcf88: mcf-lwws01: EU863-870: profile mcf88/eu868-profile-a valid

mcf88: mcf-lwws01: US902-928: profile mcf88/us915-profile-a valid

mcf88: mcf-lwws01: AU915-928: profile mcf88/au915-profile-a valid

mcf88: mcf-lwws01: AS923: profile mcf88/as923-profile-a valid

mcf88: mcf-lwws02: valid

mcf88: mcf-lwws02: EU863-870: profile mcf88/eu868-profile-a valid

mcf88: mcf-lwws02: US902-928: profile mcf88/us915-profile-a valid

mcf88: mcf-lwws02: AU915-928: profile mcf88/au915-profile-a valid

mcf88: mcf-lwws02: AS923: profile mcf88/as923-profile-a valid

mcf88: mcf-lwws03: valid

mcf88: mcf-lwws03: EU863-870: profile mcf88/eu868-profile-a valid

mcf88: mcf-lwws03: US902-928: profile mcf88/us915-profile-a valid

mcf88: mcf-lwws03: AU915-928: profile mcf88/au915-profile-a valid

mcf88: mcf-lwws03: AS923: profile mcf88/as923-profile-a valid

mcf88: mcf-lw06davk: mcf-lwws00.jpg image has correct extension

mcf88: mcf-lw06davpk: mcf-lwws00.jpg image has correct extension

mcf88: mcf-lw12co2: mcf-lw12co2.jpg image has correct extension

mcf88: mcf-lw12co2e: mcf-lw12co2e.png image has correct extension

mcf88: mcf-lw12met: mcf-lw12met.jpg image has correct extension

mcf88: mcf-lw12plg: mcf-lw12plg.jpg image has correct extension

mcf88: mcf-lw12ter: mcf-lw12ter.jpg image has correct extension

mcf88: mcf-lw12terwp: mcf-lw12terwp.jpg image has correct extension

mcf88: mcf-lw12terpm: mcf-lw12terpm.jpg image has correct extension

mcf88: mcf-lw12voc: mcf-lw12voc.jpg image has correct extension

mcf88: mcf-lw13io: mcf-lw13io.jpg image has correct extension

mcf88: mcf-lw13mio: mcf-lw13mio.jpg image has correct extension

mcf88: mcf-lwws00: mcf-lwws00.jpg image has correct extension

mcf88: mcf-lwws01: mcf-lwws00.jpg image has correct extension

mcf88: mcf-lwws02: mcf-lwws00.jpg image has correct extension

mcf88: mcf-lwws03: mcf-lwws00.jpg image has correct extension

multi-tech: valid index

multi-tech: multi-tech-xdot: valid

multi-tech: multi-tech-xdot: EU863-870: profile multi-tech/multi-tech-xdot-profile-eu868 valid

multi-tech: multi-tech-xdot: US902-928: profile multi-tech/multi-tech-xdot-profile-us902 valid

multi-tech: multi-tech-xdot: AU915-928: profile multi-tech/multi-tech-xdot-profile-au915 valid

multi-tech: multi-tech-xdot: AS923: profile multi-tech/multi-tech-xdot-profile-as923 valid

multi-tech: multi-tech-xdot: IN865-867: profile multi-tech/multi-tech-xdot-profile-in865 valid

multi-tech: multi-tech-xdot: KR920-923: profile multi-tech/multi-tech-xdot-profile-kr920 valid

multi-tech: multi-tech-xdot: multi-tech-xdot.png image has correct extension

netvox: valid index

netvox: r311a: valid

netvox: r311a: EU863-870: profile netvox/profile-eu868 valid

netvox: r311a: AS923: profile netvox/profile-as923 valid

netvox: r311a: US902-928: profile netvox/profile-us915 valid

netvox: r311a: AU915-928: profile netvox/profile-au915 valid

netvox: r311a: KR920-923: profile netvox/profile-kr920 valid

netvox: r311a: IN865-867: profile netvox/profile-in865 valid

netvox: r311a: CN470-510: profile netvox/profile-cn470 valid

netvox: r311b: valid

netvox: r311b: EU863-870: profile netvox/profile-eu868 valid

netvox: r311b: AS923: profile netvox/profile-as923 valid

netvox: r311b: US902-928: profile netvox/profile-us915 valid

netvox: r311b: AU915-928: profile netvox/profile-au915 valid

netvox: r311b: KR920-923: profile netvox/profile-kr920 valid

netvox: r311b: IN865-867: profile netvox/profile-in865 valid

netvox: r311b: CN470-510: profile netvox/profile-cn470 valid

netvox: r311g: valid

netvox: r311g: EU863-870: profile netvox/profile-eu868 valid

netvox: r311g: AS923: profile netvox/profile-as923 valid

netvox: r311g: US902-928: profile netvox/profile-us915 valid

netvox: r311g: AU915-928: profile netvox/profile-au915 valid

netvox: r311g: KR920-923: profile netvox/profile-kr920 valid

netvox: r311g: IN865-867: profile netvox/profile-in865 valid

netvox: r311g: CN470-510: profile netvox/profile-cn470 valid

netvox: r311la: valid

netvox: r311la: EU863-870: profile netvox/profile-eu868 valid

netvox: r311la: AS923: profile netvox/profile-as923 valid

netvox: r311la: US902-928: profile netvox/profile-us915 valid

netvox: r311la: AU915-928: profile netvox/profile-au915 valid

netvox: r311la: KR920-923: profile netvox/profile-kr920 valid

netvox: r311la: IN865-867: profile netvox/profile-in865 valid

netvox: r311la: CN470-510: profile netvox/profile-cn470 valid

netvox: r311w: valid

netvox: r311w: EU863-870: profile netvox/profile-eu868 valid

netvox: r311w: AS923: profile netvox/profile-as923 valid

netvox: r311w: US902-928: profile netvox/profile-us915 valid

netvox: r311w: AU915-928: profile netvox/profile-au915 valid

netvox: r311w: KR920-923: profile netvox/profile-kr920 valid

netvox: r311w: IN865-867: profile netvox/profile-in865 valid

netvox: r311w: CN470-510: profile netvox/profile-cn470 valid

netvox: r312: valid

netvox: r312: EU863-870: profile netvox/profile-eu868 valid

netvox: r312: AS923: profile netvox/profile-as923 valid

netvox: r312: US902-928: profile netvox/profile-us915 valid

netvox: r312: AU915-928: profile netvox/profile-au915 valid

netvox: r312: KR920-923: profile netvox/profile-kr920 valid

netvox: r312: IN865-867: profile netvox/profile-in865 valid

netvox: r312: CN470-510: profile netvox/profile-cn470 valid

netvox: r312a: valid

netvox: r312a: EU863-870: profile netvox/profile-eu868 valid

netvox: r312a: AS923: profile netvox/profile-as923 valid

netvox: r312a: US902-928: profile netvox/profile-us915 valid

netvox: r312a: AU915-928: profile netvox/profile-au915 valid

netvox: r312a: KR920-923: profile netvox/profile-kr920 valid

netvox: r312a: IN865-867: profile netvox/profile-in865 valid

netvox: r312a: CN470-510: profile netvox/profile-cn470 valid

netvox: r602a: valid

netvox: r602a: EU863-870: profile netvox/profile-eu868 valid

netvox: r602a: AS923: profile netvox/profile-as923 valid

netvox: r602a: US902-928: profile netvox/profile-us915 valid

netvox: r602a: AU915-928: profile netvox/profile-au915 valid

netvox: r602a: KR920-923: profile netvox/profile-kr920 valid

netvox: r602a: IN865-867: profile netvox/profile-in865 valid

netvox: r602a: CN470-510: profile netvox/profile-cn470 valid

netvox: r711: valid

netvox: r711: EU863-870: profile netvox/profile-eu868 valid

netvox: r711: AS923: profile netvox/profile-as923 valid

netvox: r711: US902-928: profile netvox/profile-us915 valid

netvox: r711: AU915-928: profile netvox/profile-au915 valid

netvox: r711: KR920-923: profile netvox/profile-kr920 valid

netvox: r711: IN865-867: profile netvox/profile-in865 valid

netvox: r711: CN470-510: profile netvox/profile-cn470 valid

netvox: r711a: valid

netvox: r711a: EU863-870: profile netvox/profile-eu868 valid

netvox: r711a: AS923: profile netvox/profile-as923 valid

netvox: r711a: US902-928: profile netvox/profile-us915 valid

netvox: r711a: AU915-928: profile netvox/profile-au915 valid

netvox: r711a: KR920-923: profile netvox/profile-kr920 valid

netvox: r711a: IN865-867: profile netvox/profile-in865 valid

netvox: r711a: CN470-510: profile netvox/profile-cn470 valid

netvox: r718a: valid

netvox: r718a: EU863-870: profile netvox/profile-eu868 valid

netvox: r718a: AS923: profile netvox/profile-as923 valid

netvox: r718a: US902-928: profile netvox/profile-us915 valid

netvox: r718a: AU915-928: profile netvox/profile-au915 valid

netvox: r718a: KR920-923: profile netvox/profile-kr920 valid

netvox: r718a: IN865-867: profile netvox/profile-in865 valid

netvox: r718a: CN470-510: profile netvox/profile-cn470 valid

netvox: r718ab: valid

netvox: r718ab: EU863-870: profile netvox/profile-eu868 valid

netvox: r718ab: AS923: profile netvox/profile-as923 valid

netvox: r718ab: US902-928: profile netvox/profile-us915 valid

netvox: r718ab: AU915-928: profile netvox/profile-au915 valid

netvox: r718ab: KR920-923: profile netvox/profile-kr920 valid

netvox: r718ab: IN865-867: profile netvox/profile-in865 valid

netvox: r718ab: CN470-510: profile netvox/profile-cn470 valid

netvox: r718ad: valid

netvox: r718ad: EU863-870: profile netvox/profile-eu868 valid

netvox: r718ad: AS923: profile netvox/profile-as923 valid

netvox: r718ad: US902-928: profile netvox/profile-us915 valid

netvox: r718ad: AU915-928: profile netvox/profile-au915 valid

netvox: r718ad: KR920-923: profile netvox/profile-kr920 valid

netvox: r718ad: IN865-867: profile netvox/profile-in865 valid

netvox: r718ad: CN470-510: profile netvox/profile-cn470 valid

netvox: r718b: valid

netvox: r718b: EU863-870: profile netvox/profile-eu868 valid

netvox: r718b: AS923: profile netvox/profile-as923 valid

netvox: r718b: US902-928: profile netvox/profile-us915 valid

netvox: r718b: AU915-928: profile netvox/profile-au915 valid

netvox: r718b: KR920-923: profile netvox/profile-kr920 valid

netvox: r718b: IN865-867: profile netvox/profile-in865 valid

netvox: r718b: CN470-510: profile netvox/profile-cn470 valid

netvox: r718b2: valid

netvox: r718b2: EU863-870: profile netvox/profile-eu868 valid

netvox: r718b2: AS923: profile netvox/profile-as923 valid

netvox: r718b2: US902-928: profile netvox/profile-us915 valid

netvox: r718b2: AU915-928: profile netvox/profile-au915 valid

netvox: r718b2: KR920-923: profile netvox/profile-kr920 valid

netvox: r718b2: IN865-867: profile netvox/profile-in865 valid

netvox: r718b2: CN470-510: profile netvox/profile-cn470 valid

netvox: r718ck: valid

netvox: r718ck: EU863-870: profile netvox/profile-eu868 valid

netvox: r718ck: AS923: profile netvox/profile-as923 valid

netvox: r718ck: US902-928: profile netvox/profile-us915 valid

netvox: r718ck: AU915-928: profile netvox/profile-au915 valid

netvox: r718ck: KR920-923: profile netvox/profile-kr920 valid

netvox: r718ck: IN865-867: profile netvox/profile-in865 valid

netvox: r718ck: CN470-510: profile netvox/profile-cn470 valid

netvox: r718ck2: valid

netvox: r718ck2: EU863-870: profile netvox/profile-eu868 valid

netvox: r718ck2: AS923: profile netvox/profile-as923 valid

netvox: r718ck2: US902-928: profile netvox/profile-us915 valid

netvox: r718ck2: AU915-928: profile netvox/profile-au915 valid

netvox: r718ck2: KR920-923: profile netvox/profile-kr920 valid

netvox: r718ck2: IN865-867: profile netvox/profile-in865 valid

netvox: r718ck2: CN470-510: profile netvox/profile-cn470 valid

netvox: r718ct: valid

netvox: r718ct: EU863-870: profile netvox/profile-eu868 valid

netvox: r718ct: AS923: profile netvox/profile-as923 valid

netvox: r718ct: US902-928: profile netvox/profile-us915 valid

netvox: r718ct: AU915-928: profile netvox/profile-au915 valid

netvox: r718ct: KR920-923: profile netvox/profile-kr920 valid

netvox: r718ct: IN865-867: profile netvox/profile-in865 valid

netvox: r718ct: CN470-510: profile netvox/profile-cn470 valid

netvox: r718ct2: valid

netvox: r718ct2: EU863-870: profile netvox/profile-eu868 valid

netvox: r718ct2: AS923: profile netvox/profile-as923 valid

netvox: r718ct2: US902-928: profile netvox/profile-us915 valid

netvox: r718ct2: AU915-928: profile netvox/profile-au915 valid

netvox: r718ct2: KR920-923: profile netvox/profile-kr920 valid

netvox: r718ct2: IN865-867: profile netvox/profile-in865 valid

netvox: r718ct2: CN470-510: profile netvox/profile-cn470 valid

netvox: r718e: valid

netvox: r718e: EU863-870: profile netvox/profile-eu868 valid

netvox: r718e: AS923: profile netvox/profile-as923 valid

netvox: r718e: US902-928: profile netvox/profile-us915 valid

netvox: r718e: AU915-928: profile netvox/profile-au915 valid

netvox: r718e: KR920-923: profile netvox/profile-kr920 valid

netvox: r718e: IN865-867: profile netvox/profile-in865 valid

netvox: r718e: CN470-510: profile netvox/profile-cn470 valid

netvox: r718f: valid

netvox: r718f: EU863-870: profile netvox/profile-eu868 valid

netvox: r718f: AS923: profile netvox/profile-as923 valid

netvox: r718f: US902-928: profile netvox/profile-us915 valid

netvox: r718f: AU915-928: profile netvox/profile-au915 valid

netvox: r718f: KR920-923: profile netvox/profile-kr920 valid

netvox: r718f: IN865-867: profile netvox/profile-in865 valid

netvox: r718f: CN470-510: profile netvox/profile-cn470 valid

netvox: r718g: valid

netvox: r718g: EU863-870: profile netvox/profile-eu868 valid

netvox: r718g: AS923: profile netvox/profile-as923 valid

netvox: r718g: US902-928: profile netvox/profile-us915 valid

netvox: r718g: AU915-928: profile netvox/profile-au915 valid

netvox: r718g: KR920-923: profile netvox/profile-kr920 valid

netvox: r718g: IN865-867: profile netvox/profile-in865 valid

netvox: r718g: CN470-510: profile netvox/profile-cn470 valid

netvox: r718h: valid

netvox: r718h: EU863-870: profile netvox/profile-eu868 valid

netvox: r718h: AS923: profile netvox/profile-as923 valid

netvox: r718h: US902-928: profile netvox/profile-us915 valid

netvox: r718h: AU915-928: profile netvox/profile-au915 valid

netvox: r718h: KR920-923: profile netvox/profile-kr920 valid

netvox: r718h: IN865-867: profile netvox/profile-in865 valid

netvox: r718h: CN470-510: profile netvox/profile-cn470 valid

netvox: r718h2: valid

netvox: r718h2: EU863-870: profile netvox/profile-eu868 valid

netvox: r718h2: AS923: profile netvox/profile-as923 valid

netvox: r718h2: US902-928: profile netvox/profile-us915 valid

netvox: r718h2: AU915-928: profile netvox/profile-au915 valid

netvox: r718h2: KR920-923: profile netvox/profile-kr920 valid

netvox: r718h2: IN865-867: profile netvox/profile-in865 valid

netvox: r718h2: CN470-510: profile netvox/profile-cn470 valid

netvox: r718ka: valid

netvox: r718ka: EU863-870: profile netvox/profile-eu868 valid

netvox: r718ka: AS923: profile netvox/profile-as923 valid

netvox: r718ka: US902-928: profile netvox/profile-us915 valid

netvox: r718ka: AU915-928: profile netvox/profile-au915 valid

netvox: r718ka: KR920-923: profile netvox/profile-kr920 valid

netvox: r718ka: IN865-867: profile netvox/profile-in865 valid

netvox: r718ka: CN470-510: profile netvox/profile-cn470 valid

netvox: r718n1: valid

netvox: r718n1: EU863-870: profile netvox/profile-eu868 valid

netvox: r718n1: AS923: profile netvox/profile-as923 valid

netvox: r718n1: US902-928: profile netvox/profile-us915 valid

netvox: r718n1: AU915-928: profile netvox/profile-au915 valid

netvox: r718n1: KR920-923: profile netvox/profile-kr920 valid

netvox: r718n1: IN865-867: profile netvox/profile-in865 valid

netvox: r718n1: CN470-510: profile netvox/profile-cn470 valid

netvox: r718n3: valid

netvox: r718n3: EU863-870: profile netvox/profile-eu868 valid

netvox: r718n3: AS923: profile netvox/profile-as923 valid

netvox: r718n3: US902-928: profile netvox/profile-us915 valid

netvox: r718n3: AU915-928: profile netvox/profile-au915 valid

netvox: r718n3: KR920-923: profile netvox/profile-kr920 valid

netvox: r718n3: IN865-867: profile netvox/profile-in865 valid

netvox: r718n3: CN470-510: profile netvox/profile-cn470 valid

netvox: r718t: valid

netvox: r718t: EU863-870: profile netvox/profile-eu868 valid

netvox: r718t: AS923: profile netvox/profile-as923 valid

netvox: r718t: US902-928: profile netvox/profile-us915 valid

netvox: r718t: AU915-928: profile netvox/profile-au915 valid

netvox: r718t: KR920-923: profile netvox/profile-kr920 valid

netvox: r718t: IN865-867: profile netvox/profile-in865 valid

netvox: r718t: CN470-510: profile netvox/profile-cn470 valid

netvox: r720a: valid

netvox: r720a: EU863-870: profile netvox/profile-eu868 valid

netvox: r720a: AS923: profile netvox/profile-as923 valid

netvox: r720a: US902-928: profile netvox/profile-us915 valid

netvox: r720a: AU915-928: profile netvox/profile-au915 valid

netvox: r720a: KR920-923: profile netvox/profile-kr920 valid

netvox: r720a: IN865-867: profile netvox/profile-in865 valid

netvox: r720a: CN470-510: profile netvox/profile-cn470 valid

netvox: r720f: valid

netvox: r720f: EU863-870: profile netvox/profile-eu868 valid

netvox: r720f: AS923: profile netvox/profile-as923 valid

netvox: r720f: US902-928: profile netvox/profile-us915 valid

netvox: r720f: AU915-928: profile netvox/profile-au915 valid

netvox: r720f: KR920-923: profile netvox/profile-kr920 valid

netvox: r720f: IN865-867: profile netvox/profile-in865 valid

netvox: r720f: CN470-510: profile netvox/profile-cn470 valid

netvox: r72615: valid

netvox: r72615: EU863-870: profile netvox/profile-eu868 valid

netvox: r72615: AS923: profile netvox/profile-as923 valid

netvox: r72615: US902-928: profile netvox/profile-us915 valid

netvox: r72615: AU915-928: profile netvox/profile-au915 valid

netvox: r72615: KR920-923: profile netvox/profile-kr920 valid

netvox: r72615: IN865-867: profile netvox/profile-in865 valid

netvox: r72615: CN470-510: profile netvox/profile-cn470 valid

netvox: r72615a: valid

netvox: r72615a: EU863-870: profile netvox/profile-eu868 valid

netvox: r72615a: AS923: profile netvox/profile-as923 valid

netvox: r72615a: US902-928: profile netvox/profile-us915 valid

netvox: r72615a: AU915-928: profile netvox/profile-au915 valid

netvox: r72615a: KR920-923: profile netvox/profile-kr920 valid

netvox: r72615a: IN865-867: profile netvox/profile-in865 valid

netvox: r72615a: CN470-510: profile netvox/profile-cn470 valid

netvox: r72616: valid

netvox: r72616: EU863-870: profile netvox/profile-eu868 valid

netvox: r72616: AS923: profile netvox/profile-as923 valid

netvox: r72616: US902-928: profile netvox/profile-us915 valid

netvox: r72616: AU915-928: profile netvox/profile-au915 valid

netvox: r72616: KR920-923: profile netvox/profile-kr920 valid

netvox: r72616: IN865-867: profile netvox/profile-in865 valid

netvox: r72616: CN470-510: profile netvox/profile-cn470 valid

netvox: r72616a: valid

netvox: r72616a: EU863-870: profile netvox/profile-eu868 valid

netvox: r72616a: AS923: profile netvox/profile-as923 valid

netvox: r72616a: US902-928: profile netvox/profile-us915 valid

netvox: r72616a: AU915-928: profile netvox/profile-au915 valid

netvox: r72616a: KR920-923: profile netvox/profile-kr920 valid

netvox: r72616a: IN865-867: profile netvox/profile-in865 valid

netvox: r72616a: CN470-510: profile netvox/profile-cn470 valid

netvox: r72716: valid

netvox: r72716: EU863-870: profile netvox/profile-eu868 valid

netvox: r72716: AS923: profile netvox/profile-as923 valid

netvox: r72716: US902-928: profile netvox/profile-us915 valid

netvox: r72716: AU915-928: profile netvox/profile-au915 valid

netvox: r72716: KR920-923: profile netvox/profile-kr920 valid

netvox: r72716: IN865-867: profile netvox/profile-in865 valid

netvox: r72716: CN470-510: profile netvox/profile-cn470 valid

netvox: r809a: valid

netvox: r809a: EU863-870: profile netvox/profile-eu868 valid

netvox: r809a: AS923: profile netvox/profile-as923 valid

netvox: r809a: US902-928: profile netvox/profile-us915 valid

netvox: r809a: AU915-928: profile netvox/profile-au915 valid

netvox: r809a: KR920-923: profile netvox/profile-kr920 valid

netvox: r809a: IN865-867: profile netvox/profile-in865 valid

netvox: r809a: CN470-510: profile netvox/profile-cn470 valid

netvox: r816b: valid

netvox: r816b: EU863-870: profile netvox/profile-eu868 valid

netvox: r816b: AS923: profile netvox/profile-as923 valid

netvox: r816b: US902-928: profile netvox/profile-us915 valid

netvox: r816b: AU915-928: profile netvox/profile-au915 valid

netvox: r816b: KR920-923: profile netvox/profile-kr920 valid

netvox: r816b: IN865-867: profile netvox/profile-in865 valid

netvox: r816b: CN470-510: profile netvox/profile-cn470 valid

netvox: ra0715: valid

netvox: ra0715: EU863-870: profile netvox/profile-eu868 valid

netvox: ra0715: AS923: profile netvox/profile-as923 valid

netvox: ra0715: US902-928: profile netvox/profile-us915 valid

netvox: ra0715: AU915-928: profile netvox/profile-au915 valid

netvox: ra0715: KR920-923: profile netvox/profile-kr920 valid

netvox: ra0715: IN865-867: profile netvox/profile-in865 valid

netvox: ra0715: CN470-510: profile netvox/profile-cn470 valid

netvox: ra0715y: valid

netvox: ra0715y: EU863-870: profile netvox/profile-eu868 valid

netvox: ra0715y: AS923: profile netvox/profile-as923 valid

netvox: ra0715y: US902-928: profile netvox/profile-us915 valid

netvox: ra0715y: AU915-928: profile netvox/profile-au915 valid

netvox: ra0715y: KR920-923: profile netvox/profile-kr920 valid

netvox: ra0715y: IN865-867: profile netvox/profile-in865 valid

netvox: ra0715y: CN470-510: profile netvox/profile-cn470 valid

netvox: ra0716: valid

netvox: ra0716: EU863-870: profile netvox/profile-eu868 valid

netvox: ra0716: AS923: p

johanstokking commented 2 years ago

If this is the complete output, it seems like the first attempt on validating the codec or the image dimensions fail. That might be because the main validation utility isn't able to execute those utilities.

I'm assuming that make deps succeeds without errors?

Can you try running:

$ ./bin/runscript -codec-path "vendor/example/windsensor.js" -routine decodeUplink -input '{"fPort":1,"bytes":[0,1]}'

That should output:

{"data":{"direction":"N","speed":1}}
oholthau commented 2 years ago

Hi Johan,

yes, the make deps succeeds without any error.

The commands does exact the output you are expecting.

Since the issue occurs when doing a fresh git clone without any change, I would assume something is wrong with some vendor data.

I have removed netvox from the directory - then the make validate runs though.

My suspect is the netvox/r720a.

Unfortunately, even if I could fix the issue, I cannot push it to the repository.

Best Regards Olaf.


From: Johan Stokking @.> Sent: Tuesday, March 29, 2022 16:01 To: TheThingsNetwork/lorawan-devices @.> Cc: Olaf Holthausen @.>; Mention @.> Subject: Re: [TheThingsNetwork/lorawan-devices] Validate on fresh cloned repository fails (Issue #397)

If this is the complete output, it seems like the first attempt on validating the codec or the image dimensions fail. That might be because the main validation utility isn't able to execute those utilities.

I'm assuming that make deps succeeds without errors?

Can you try running:

$ ./bin/runscript -codec-path "vendor/example/windsensor.js" -routine decodeUplink -input '{"fPort":1,"bytes":[0,1]}'

That should output:

{"data":{"direction":"N","speed":1}}

— Reply to this email directly, view it on GitHubhttps://github.com/TheThingsNetwork/lorawan-devices/issues/397#issuecomment-1081910333, or unsubscribehttps://github.com/notifications/unsubscribe-auth/AO6JU665NXLAEYOTYM6BL4DVCMELHANCNFSM5RN46SSQ. You are receiving this because you were mentioned.Message ID: @.***>

johanstokking commented 2 years ago

Hmm, I can't reproduce. I don't see anything weird in that Netvox payload codec either.

Try for example:

$ ./bin/runscript -codec-path "vendor/netvox/payload/r711_r718a_r718ab_r720a.js" -routine decodeUplink -input '{"fPort":7,"bytes":[130,110,3,132,7,8,1,0,50,0,50]}'

Unfortunately, even if I could fix the issue, I cannot push it to the repository.

You could clone the repository and file a pull request with a fix, if you would have any.


@Jaime-Trinidad can you reproduce?

oholthau commented 2 years ago

Does the

make validate

on a fresh git clone work on your PC?

Von: Johan Stokking @.> Gesendet: Dienstag, 29. März 2022 16:42 An: TheThingsNetwork/lorawan-devices @.> Cc: Olaf Holthausen @.>; Mention @.> Betreff: Re: [TheThingsNetwork/lorawan-devices] Validate on fresh cloned repository fails (Issue #397)

Hmm, I can't reproduce. I don't see anything weird in that Netvox payload codec either.

Try for example:

$ ./bin/runscript -codec-path "vendor/netvox/payload/r711_r718a_r718ab_r720a.js" -routine decodeUplink -input '{"fPort":7,"bytes":[130,110,3,132,7,8,1,0,50,0,50]}'

Unfortunately, even if I could fix the issue, I cannot push it to the repository.

You could clone the repository and file a pull request with a fix, if you would have any.


@Jaime-Trinidadhttps://github.com/Jaime-Trinidad can you reproduce?

— Reply to this email directly, view it on GitHubhttps://github.com/TheThingsNetwork/lorawan-devices/issues/397#issuecomment-1081958492, or unsubscribehttps://github.com/notifications/unsubscribe-auth/AO6JU676OCUP727K7BM25FDVCMJDFANCNFSM5RN46SSQ. You are receiving this because you were mentioned.Message ID: @.**@.>>

johanstokking commented 2 years ago

Does the make validate on a fresh git clone work on your PC?

Yes. Also continuous integration here on GitHub makes sure that we cannot even merge something that breaks. Using the very same simple steps: https://github.com/TheThingsNetwork/lorawan-devices/blob/master/.github/workflows/validate.yml

For certainty I tried again with the same Go version (1.18) and Node (16.14.2), but successful. Only difference is that I'm on an Arm based Mac and not Intel. But that shouldn't matter; GitHub Actions run on Intel.

Jaime-Trinidad commented 2 years ago

Hello Olaf,

I can reproduced it neither, can you run Johan answer to see if it run? If it sends you error can you send it please I continue searching.

Thanks

El mar, 29 de mar. de 2022 15:45, Olaf Holthausen @.***> escribió:

Does the

make validate

on a fresh git clone work on your PC?

Von: Johan Stokking @.> Gesendet: Dienstag, 29. März 2022 16:42 An: TheThingsNetwork/lorawan-devices @.> Cc: Olaf Holthausen @.>; Mention @.> Betreff: Re: [TheThingsNetwork/lorawan-devices] Validate on fresh cloned repository fails (Issue #397)

Hmm, I can't reproduce. I don't see anything weird in that Netvox payload codec either.

Try for example:

$ ./bin/runscript -codec-path "vendor/netvox/payload/r711_r718a_r718ab_r720a.js" -routine decodeUplink -input '{"fPort":7,"bytes":[130,110,3,132,7,8,1,0,50,0,50]}'

Unfortunately, even if I could fix the issue, I cannot push it to the repository.

You could clone the repository and file a pull request with a fix, if you would have any.


@Jaime-Trinidadhttps://github.com/Jaime-Trinidad can you reproduce?

— Reply to this email directly, view it on GitHub< https://github.com/TheThingsNetwork/lorawan-devices/issues/397#issuecomment-1081958492>, or unsubscribe< https://github.com/notifications/unsubscribe-auth/AO6JU676OCUP727K7BM25FDVCMJDFANCNFSM5RN46SSQ>.

You are receiving this because you were mentioned.Message ID: @.**@.>>

— Reply to this email directly, view it on GitHub https://github.com/TheThingsNetwork/lorawan-devices/issues/397#issuecomment-1081962230, or unsubscribe https://github.com/notifications/unsubscribe-auth/ATRJPGFAYJR5C2VNTTWNHNLVCMJPZANCNFSM5RN46SSQ . You are receiving this because you were mentioned.Message ID: @.***>

oholthau commented 2 years ago

This is interesting: Here is my command sequence to reproduce the issue:

git clone https://github.com/TheThingsNetwork/lorawan-devices.git

cd lorawan-devices

make deps

make validate

---> Exception somewhere in the nevox folder

Additional Findings:

The r720wb device is the last of the netvox list

If I remove the entire netvox folder, make validate works as it should.


From: Johan Stokking @.> Sent: Tuesday, March 29, 2022 16:50 To: TheThingsNetwork/lorawan-devices @.> Cc: Olaf Holthausen @.>; Mention @.> Subject: Re: [TheThingsNetwork/lorawan-devices] Validate on fresh cloned repository fails (Issue #397)

Does the make validate on a fresh git clone work on your PC?

Yes. Also continuous integration here on GitHub makes sure that we cannot even merge something that breaks. Using the very same simple steps: https://github.com/TheThingsNetwork/lorawan-devices/blob/master/.github/workflows/validate.yml

For certainty I tried again with the same Go version (1.18) and Node (16.14.2), but successful. Only difference is that I'm on an Arm based Mac and not Intel. But that shouldn't matter.

— Reply to this email directly, view it on GitHubhttps://github.com/TheThingsNetwork/lorawan-devices/issues/397#issuecomment-1081968677, or unsubscribehttps://github.com/notifications/unsubscribe-auth/AO6JU64H7NYT4JZVMOGW2WTVCMKEVANCNFSM5RN46SSQ. You are receiving this because you were mentioned.Message ID: @.***>

oholthau commented 2 years ago

The command

./bin/runscript -codec-path "vendor/netvox/payload/r711_r718a_r718ab_r720a.js" -routine decodeUplink -input '{"fPort":7,"bytes":[130,110,3,132,7,8,1,0,50,0,50]}'

worked well.


From: Jaime Trinidad @.> Sent: Tuesday, March 29, 2022 17:02 To: TheThingsNetwork/lorawan-devices @.> Cc: Olaf Holthausen @.>; Mention @.> Subject: Re: [TheThingsNetwork/lorawan-devices] Validate on fresh cloned repository fails (Issue #397)

Hello Olaf,

I can reproduced it neither, can you run Johan answer to see if it run? If it sends you error can you send it please I continue searching.

Thanks

El mar, 29 de mar. de 2022 15:45, Olaf Holthausen @.***> escribió:

Does the

make validate

on a fresh git clone work on your PC?

Von: Johan Stokking @.> Gesendet: Dienstag, 29. März 2022 16:42 An: TheThingsNetwork/lorawan-devices @.> Cc: Olaf Holthausen @.>; Mention @.> Betreff: Re: [TheThingsNetwork/lorawan-devices] Validate on fresh cloned repository fails (Issue #397)

Hmm, I can't reproduce. I don't see anything weird in that Netvox payload codec either.

Try for example:

$ ./bin/runscript -codec-path "vendor/netvox/payload/r711_r718a_r718ab_r720a.js" -routine decodeUplink -input '{"fPort":7,"bytes":[130,110,3,132,7,8,1,0,50,0,50]}'

Unfortunately, even if I could fix the issue, I cannot push it to the repository.

You could clone the repository and file a pull request with a fix, if you would have any.


@Jaime-Trinidadhttps://github.com/Jaime-Trinidad can you reproduce?

— Reply to this email directly, view it on GitHub< https://github.com/TheThingsNetwork/lorawan-devices/issues/397#issuecomment-1081958492>, or unsubscribe< https://github.com/notifications/unsubscribe-auth/AO6JU676OCUP727K7BM25FDVCMJDFANCNFSM5RN46SSQ>.

You are receiving this because you were mentioned.Message ID: @.**@.>>

— Reply to this email directly, view it on GitHub https://github.com/TheThingsNetwork/lorawan-devices/issues/397#issuecomment-1081962230, or unsubscribe https://github.com/notifications/unsubscribe-auth/ATRJPGFAYJR5C2VNTTWNHNLVCMJPZANCNFSM5RN46SSQ . You are receiving this because you were mentioned.Message ID: @.***>

— Reply to this email directly, view it on GitHubhttps://github.com/TheThingsNetwork/lorawan-devices/issues/397#issuecomment-1081983503, or unsubscribehttps://github.com/notifications/unsubscribe-auth/AO6JU65VYNYS2AKYRUNAQELVCMLPPANCNFSM5RN46SSQ. You are receiving this because you were mentioned.Message ID: @.***>

Jaime-Trinidad commented 2 years ago

@oholthau the error that validation throws is in Netvox photos? in this case ... netvox/photos/r720.jpg

Jaime-Trinidad commented 2 years ago

@johanstokking I run make validate on my Mac (macOS Monterey, M1) instead of Ubuntu and I got:

Error: spawn /bin/sh EAGAIN at Process.ChildProcess._handle.onexit (node:internal/child_process:283:19) at onErrorNT (node:internal/child_process:476:16) at processTicksAndRejections (node:internal/process/task_queues:83:21) { errno: -35, code: 'EAGAIN', syscall: 'spawn /bin/sh', path: '/bin/sh', spawnargs: [ '-c', 'bin/validate-image ./vendor/netvox/photos/r718qa.jpg' ], cmd: 'bin/validate-image ./vendor/netvox/photos/r718qa.jpg'

I run(all netvox images): $ ./bin/validate-image "vendor/netvox/photos/r718qa.jpg

without any error message, Netvox is the carpet that cause this error

johanstokking commented 2 years ago

Hmm I'm also on Monterey, M1 Pro, and still can't reproduce.

What Go version are you using? I'm using 1.18. Check with go version.

What could happen here is that all these validations are being run in parallel, and your machine just goes out of memory.

Here's a patch; can you test this?

diff --git a/bin/validate.js b/bin/validate.js
index e9c7bdad5..d7d43c3d5 100644
--- a/bin/validate.js
+++ b/bin/validate.js
@@ -51,25 +51,21 @@ function requireFile(path) {
   });
 }

-function requireDimensions(path) {
-  return requireFile(path).then(
-    () =>
-      new Promise((resolve, reject) => {
-        sizeOf(path, (err, dimensions) => {
-          if (err) {
-            reject(new Error(`load image ${path}: ${err}`));
-          } else if (dimensions.width > 2000 || dimensions.height > 2000) {
-            reject(
-              new Error(
-                `image ${path} too large: maximum is 2000x2000 but loaded ${dimensions.width}x${dimensions.height}`
-              )
-            );
-          } else {
-            resolve();
-          }
-        });
-      })
-  );
+async function requireDimensions(path) {
+  await requireFile(path);
+  return await new Promise((resolve, reject) => {
+    sizeOf(path, (err, dimensions) => {
+      if (err) {
+        reject(new Error(`load image ${path}: ${err}`));
+      } else if (dimensions.width > 2000 || dimensions.height > 2000) {
+        reject(
+          new Error(`image ${path} too large: maximum is 2000x2000 but loaded ${dimensions.width}x${dimensions.height}`)
+        );
+      } else {
+        resolve();
+      }
+    });
+  });
 }

 function validatePayloadCodecs(vendorId, payloadEncoding) {
@@ -199,7 +195,7 @@ vendors.vendors.forEach((v) => {

     const codecs = {};

-    vendor.endDevices.forEach((d) => {
+    vendor.endDevices.forEach(async (d) => {
       const key = `${v.id}: ${d}`;

       const endDevice = yaml.load(fs.readFileSync(`${folder}/${d}.yaml`));
@@ -227,7 +223,7 @@ vendors.vendors.forEach((v) => {
           });
         }

-        Object.keys(version.profiles).forEach((region) => {
+        Object.keys(version.profiles).forEach(async (region) => {
           const regionProfile = version.profiles[region];
           const key = `${v.id}: ${d}: ${region}`;
           const vendorID = regionProfile.vendorID ?? v.id;
@@ -259,7 +255,7 @@ vendors.vendors.forEach((v) => {
               process.exit(1);
             }
             codecs[regionProfile.codec] = true;
-            validatePayloadCodecs(folder, codec)
+            await validatePayloadCodecs(folder, codec)
               .then(() => console.log(`${key}: payload codec ${regionProfile.codec} valid`))
               .catch((err) => {
                 console.error(`${key}: payload codec ${regionProfile.codec} invalid`);
@@ -271,39 +267,39 @@ vendors.vendors.forEach((v) => {
       });

       if (endDevice.photos) {
-        validateImageExtension(`${folder}/${endDevice.photos.main}`)
+        await validateImageExtension(`${folder}/${endDevice.photos.main}`)
           .then(() => console.log(`${key}: ${endDevice.photos.main} image has correct extension`))
           .catch((err) => {
             console.error(err);
             process.exit(1);
           });
-        requireImageDecode(`${folder}/${endDevice.photos.main}`)
+        await requireImageDecode(`${folder}/${endDevice.photos.main}`)
           .then(() => console.log(`${key}: ${endDevice.photos.main} is valid`))
           .catch((err) => {
             console.error(err);
             process.exit(1);
           });
-        requireDimensions(`${folder}/${endDevice.photos.main}`)
+        await requireDimensions(`${folder}/${endDevice.photos.main}`)
           .then(() => console.log(`${key}: ${endDevice.photos.main} has the right dimensions`))
           .catch((err) => {
             console.error(`${key}: ${err}`);
             process.exit(1);
           });
         if (endDevice.photos.other) {
-          endDevice.photos.other.forEach((p) => {
-            validateImageExtension(`${folder}/${p}`)
+          endDevice.photos.other.forEach(async (p) => {
+            await validateImageExtension(`${folder}/${p}`)
               .then(() => console.log(`${key}: ${p} image has correct extension`))
               .catch((err) => {
                 console.error(err);
                 process.exit(1);
               });
-            requireImageDecode(`${folder}/${p}`)
+            await requireImageDecode(`${folder}/${p}`)
               .then(() => console.log(`${key}: ${p} is valid`))
               .catch((err) => {
                 console.error(err);
                 process.exit(1);
               });
-            requireDimensions(`${folder}/${p}`)
+            await requireDimensions(`${folder}/${p}`)
               .then(() => console.log(`${key}: ${p} has the right dimensions`))
               .catch((err) => {
                 console.error(`${key}: ${err}`);
johanstokking commented 2 years ago

This has been resolved; the above patched fixed the issue and this has been committed to master.

oholthau commented 1 year ago

Hi Jaime,

I did not check for the root cause with the netvox issue, I just moved the whole folder away to run the verification (and moved back for commit/push).

[image002]https://www.plenom.com/?utm_source=email-signature&utm_medium=emailMit freundlichen Grüßen Best regards, Dr. Olaf Holthausen Lead Software Architect Plenom A/S

T: +45 7877 2465 | M: +49 162 7844015 | Email: @.**@.> | Web: www.plenom.comhttp://www.plenom.com/ @.***

Von: Jaime Trinidad @.> Gesendet: Montag, 4. April 2022 10:49 An: TheThingsNetwork/lorawan-devices @.> Cc: Olaf Holthausen @.>; Mention @.> Betreff: Re: [TheThingsNetwork/lorawan-devices] Validate on fresh cloned repository fails (Issue #397)

@oholthauhttps://github.com/oholthau the error that validation throws is in Netvox photos? in this case ... netvox/photos/r720.jpg

— Reply to this email directly, view it on GitHubhttps://github.com/TheThingsNetwork/lorawan-devices/issues/397#issuecomment-1087284395, or unsubscribehttps://github.com/notifications/unsubscribe-auth/AO6JU64QWFF7MK4R23TAY3LVDKUGBANCNFSM5RN46SSQ. You are receiving this because you were mentioned.Message ID: @.**@.>>