Skip to content

Duty cycle default moet de ETSI sub-band van de ingestelde frequentie volgen #4

Description

@efiten

Probleem

De uitgeleverde default is airtime_factor = 1.0, wat neerkomt op 50% duty cycle. get dutycycle rapporteert dat ook zo. De default frequentie is -D LORA_FREQ=869.618 (platformio.ini:29), die in de 869.4 tot 869.65 MHz sub-band valt. ETSI EN 300 220-2 begrenst die sub-band op 10%.

De default staat dus vijf keer hoger dan wat op de eigen default frequentie is toegestaan. Elke EU-operator moet dit met de hand per node aanpassen, en de waarde is niet vindbaar tenzij je al weet dat af over duty cycle gaat.

Upstream ligt hiervoor meshcore-dev#3351 open, met een enkele build-constante MAX_DUTY_CYCLE (default 10). Dat getal klopt voor 869.618, maar niet voor de rest van de band: 868.5 mag 1%, 869.0 mag 0.1%, en een US of ANZ build kent de limiet helemaal niet. Een enkele constante kan die spreiding niet uitdrukken.

Voorstel

De limiet afleiden uit de ingestelde frequentie in plaats van uit een build-constante.

Nieuw src/helpers/DutyCycleLimits.h / .cpp met twee vrije functies:

float getMaxDutyCyclePercent(float freq_mhz);   // 100.0 = geen limiet
float dutyCycleToAirtimeFactor(float percent);  // (100/dc) - 1

De tabel geldt alleen voor 863.0 tot 870.0 MHz, daarbuiten is het resultaat 100 en verandert er niets:

sub-band (MHz) max duty cycle
863.0 tot 865.0 0.1%
865.0 tot 868.0 1%
868.0 tot 868.6 1%
868.7 tot 869.2 0.1%
869.4 tot 869.65 10%
869.7 tot 870.0 1%
de gaten ertussen 0.1%

Dit dekt ook de land-presets binnen de EU. Een preset die alleen in SF verschilt, zoals NL op SF7, zit op dezelfde sub-band als de algemene EU-preset en krijgt dus dezelfde limiet. SF, BW en CR raken de regelgeving niet, alleen de frequentie.

Nieuwe pref uint8_t dutycycle_auto, default 1, in src/helpers/CommonCLI.h en examples/companion_radio/NodePrefs.h, serializer-key dc_auto:

  • set dutycycle <n> en set af <n> zetten hem op 0, de handmatige waarde blijft dan leidend
  • set dutycycle auto zet hem terug op 1
  • get dutycycle rapporteert de effectieve waarde en of die auto of handmatig is

De vijf getAirtimeBudgetFactor() overrides (companion_radio, simple_repeater, simple_room_server, simple_secure_chat, simple_sensor) geven bij dutycycle_auto de uit _prefs.freq afgeleide factor terug, anders _prefs.airtime_factor. Dispatcher::updateTxBudget() evalueert die functie bij elke aanroep opnieuw (src/Dispatcher.cpp:42), dus de limiet volgt de frequentie meteen na set freq of set radio, zonder herstart en zonder wijziging in Dispatcher.

Gedragsverandering

dutycycle_auto staat ook aan na migratie van een bestaande prefs-file. Een node die vandaag op 869.618 met de default 50% draait, zakt na de update naar 10%. Dat is het doel van de wijziging, maar het is een stille verandering voor bestaande nodes. Wie bewust hoger wil zitten zet dat met set dutycycle <n> terug, en die keuze blijft dan staan.

Buiten scope

applyTempRadioParams (src/helpers/CommonCLI.cpp:251) zet een tijdelijke frequentie zonder _prefs.freq aan te raken. Tijdens tempradio blijft de limiet dus die van de opgeslagen frequentie. Ik laat dat hier liggen, het is een aparte wijziging.

Testen

getMaxDutyCyclePercent is een pure functie zonder radio-afhankelijkheid en krijgt een unit test in test/: grenswaarden per sub-band, de gaten, en frequenties buiten 863 tot 870. De rest is compile-coverage via de build matrix, want [env:native] compileert Dispatcher.cpp niet.

Activity

  1. ErikBrown2 commented on Sep 5, 2026

    @ErikBrown2

    Is het juist om dit toe te voegen aan deze firmware of zou het aan de officiële firmware toegevoegd moeten worden? Dit begrenst de werking van een repeater dus veel mensen zullen zeggen dat de werking van de repeater beter is met de officiële firmware dan met de DMC firmware. En dus niet de DMC firmware gebruiken. En dat terwijl we juist willen dat iedereen de DMC firmware gaat gebruiken vanwege de filter functionaliteit van de DMC firmware i.v.m. de spam.

    Ik besef dat de huidige standaard instelling een illegale situatie kan opleveren en dat het veranderd moet worden. Maar ik denk dat veel mensen het maximale uit hun repeater willen halen. En dan dus niet deze firmware zullen gebruiken. Kijk maar eens bijvoorbeeld naar hoeveel mensen hun Heltec v4 werkelijk op 22 dBm output (10dBm in de instelling) hebben staan en niet op 27 dBm (22 dBm in de instelling).

    Ik denk dat dit een een goede extra functionaliteit van de firmware zal zijn maar dan wel voor de officiële Meshcore firmware, niet de DMC firmware.

  2. Elektr0Vodka commented on Sep 11, 2026

    @Elektr0Vodka

    Fixed by PR #5, now consolidated onto dmc-dev (v1.17.1.01, dmc-dev @ 1b1a25f): the duty-cycle default is derived from the configured frequency's ETSI sub-band via src/helpers/DutyCycleLimits.* (set dutycycle auto, default on).

  3. efiten commented on Sep 21, 2026

    @efiten
    Author

    @ErikBrown2 , ik heb dat daar ook als PR ingezet, maar daar wordt gewoon niet naar gekeken...
    meshcore-dev#3361

    En hier in België zijn er amateurs die moeilijk doen over die Duty Cycle, en die wil ik de mond snoeren, ook al klopt de bewering niet : https://shop.rf.guru/pages/meshtastic-meshcore-eu-868-srd-duty-cycle-power-amateur-radio

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions