bbfmodels 0.1.0__tar.gz → 0.2.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- bbfmodels-0.2.1/.release-please-manifest.json +3 -0
- bbfmodels-0.2.1/CHANGELOG.md +25 -0
- {bbfmodels-0.1.0 → bbfmodels-0.2.1}/CLAUDE.md +6 -1
- {bbfmodels-0.1.0 → bbfmodels-0.2.1}/CONTRIBUTING.md +2 -1
- {bbfmodels-0.1.0 → bbfmodels-0.2.1}/Makefile +4 -1
- {bbfmodels-0.1.0 → bbfmodels-0.2.1}/PKG-INFO +29 -8
- {bbfmodels-0.1.0 → bbfmodels-0.2.1}/README.md +28 -7
- {bbfmodels-0.1.0 → bbfmodels-0.2.1}/context/README.md +1 -0
- bbfmodels-0.2.1/context/decisions/0010-generated-python-packages.md +64 -0
- bbfmodels-0.2.1/docs/guides/cli.md +22 -0
- bbfmodels-0.2.1/docs/guides/documents.md +117 -0
- bbfmodels-0.2.1/docs/guides/models.md +146 -0
- bbfmodels-0.2.1/docs/guides/quickstart.md +57 -0
- bbfmodels-0.2.1/docs/guides/runtime.md +106 -0
- bbfmodels-0.2.1/docs/guides/vendor-models.md +119 -0
- {bbfmodels-0.1.0 → bbfmodels-0.2.1}/docs/index.md +3 -3
- {bbfmodels-0.1.0 → bbfmodels-0.2.1}/mkdocs.yml +5 -0
- {bbfmodels-0.1.0 → bbfmodels-0.2.1}/pyproject.toml +2 -2
- bbfmodels-0.2.1/release-notes/0.2.0.md +8 -0
- bbfmodels-0.2.1/release-notes/0.2.1.md +4 -0
- {bbfmodels-0.1.0 → bbfmodels-0.2.1}/src/bbfmodels/__init__.py +1 -1
- {bbfmodels-0.1.0 → bbfmodels-0.2.1}/src/bbfmodels/cli.py +25 -0
- bbfmodels-0.2.1/src/bbfmodels/generate.py +271 -0
- bbfmodels-0.2.1/src/bbfmodels/model.py +240 -0
- {bbfmodels-0.1.0 → bbfmodels-0.2.1}/src/bbfmodels/parser.py +67 -17
- {bbfmodels-0.1.0 → bbfmodels-0.2.1}/src/bbfmodels/sources.py +3 -0
- bbfmodels-0.2.1/src/bbfmodels/tr098/__init__.py +20 -0
- bbfmodels-0.2.1/src/bbfmodels/tr098/bulkdata.py +51 -0
- bbfmodels-0.2.1/src/bbfmodels/tr098/capabilities.py +23 -0
- bbfmodels-0.2.1/src/bbfmodels/tr098/captiveportal.py +19 -0
- bbfmodels-0.2.1/src/bbfmodels/tr098/deviceconfig.py +17 -0
- bbfmodels-0.2.1/src/bbfmodels/tr098/deviceinfo.py +167 -0
- bbfmodels-0.2.1/src/bbfmodels/tr098/dlna.py +29 -0
- bbfmodels-0.2.1/src/bbfmodels/tr098/dns.py +51 -0
- bbfmodels-0.2.1/src/bbfmodels/tr098/downloadavailability.py +43 -0
- bbfmodels-0.2.1/src/bbfmodels/tr098/downloaddiagnostics.py +28 -0
- bbfmodels-0.2.1/src/bbfmodels/tr098/fap.py +317 -0
- bbfmodels-0.2.1/src/bbfmodels/tr098/faultmgmt.py +97 -0
- bbfmodels-0.2.1/src/bbfmodels/tr098/firewall.py +19 -0
- bbfmodels-0.2.1/src/bbfmodels/tr098/internetgatewaydevice.py +95 -0
- bbfmodels-0.2.1/src/bbfmodels/tr098/ippingdiagnostics.py +28 -0
- bbfmodels-0.2.1/src/bbfmodels/tr098/ir.json.gz +0 -0
- bbfmodels-0.2.1/src/bbfmodels/tr098/lanconfigsecurity.py +16 -0
- bbfmodels-0.2.1/src/bbfmodels/tr098/landevice.py +384 -0
- bbfmodels-0.2.1/src/bbfmodels/tr098/laninterfaces.py +39 -0
- bbfmodels-0.2.1/src/bbfmodels/tr098/layer2bridging.py +125 -0
- bbfmodels-0.2.1/src/bbfmodels/tr098/layer3forwarding.py +37 -0
- bbfmodels-0.2.1/src/bbfmodels/tr098/managementserver.py +147 -0
- bbfmodels-0.2.1/src/bbfmodels/tr098/nslookupdiagnostics.py +35 -0
- bbfmodels-0.2.1/src/bbfmodels/tr098/periodicstatistics.py +55 -0
- bbfmodels-0.2.1/src/bbfmodels/tr098/queuemanagement.py +226 -0
- bbfmodels-0.2.1/src/bbfmodels/tr098/security.py +32 -0
- bbfmodels-0.2.1/src/bbfmodels/tr098/selftestdiagnostics.py +17 -0
- bbfmodels-0.2.1/src/bbfmodels/tr098/services.py +15 -0
- bbfmodels-0.2.1/src/bbfmodels/tr098/smartcardreader.py +35 -0
- bbfmodels-0.2.1/src/bbfmodels/tr098/softwaremodules.py +96 -0
- bbfmodels-0.2.1/src/bbfmodels/tr098/time.py +29 -0
- bbfmodels-0.2.1/src/bbfmodels/tr098/traceroutediagnostics.py +35 -0
- bbfmodels-0.2.1/src/bbfmodels/tr098/udpechoconfig.py +28 -0
- bbfmodels-0.2.1/src/bbfmodels/tr098/uploaddiagnostics.py +28 -0
- bbfmodels-0.2.1/src/bbfmodels/tr098/upnp.py +154 -0
- bbfmodels-0.2.1/src/bbfmodels/tr098/usbhosts.py +72 -0
- bbfmodels-0.2.1/src/bbfmodels/tr098/user.py +21 -0
- bbfmodels-0.2.1/src/bbfmodels/tr098/userinterface.py +64 -0
- bbfmodels-0.2.1/src/bbfmodels/tr098/wandevice.py +650 -0
- bbfmodels-0.2.1/src/bbfmodels/tr098/xmpp.py +63 -0
- bbfmodels-0.2.1/src/bbfmodels/tr104_1/__init__.py +20 -0
- bbfmodels-0.2.1/src/bbfmodels/tr104_1/capabilities.py +91 -0
- bbfmodels-0.2.1/src/bbfmodels/tr104_1/ir.json.gz +0 -0
- bbfmodels-0.2.1/src/bbfmodels/tr104_1/phyinterface.py +28 -0
- bbfmodels-0.2.1/src/bbfmodels/tr104_1/voiceprofile.py +508 -0
- bbfmodels-0.2.1/src/bbfmodels/tr104_1/voiceservice.py +24 -0
- bbfmodels-0.2.1/src/bbfmodels/tr104_cwmp/__init__.py +20 -0
- bbfmodels-0.2.1/src/bbfmodels/tr104_cwmp/callcontrol.py +333 -0
- bbfmodels-0.2.1/src/bbfmodels/tr104_cwmp/calllog.py +199 -0
- bbfmodels-0.2.1/src/bbfmodels/tr104_cwmp/capabilities.py +117 -0
- bbfmodels-0.2.1/src/bbfmodels/tr104_cwmp/clocksynchronization.py +29 -0
- bbfmodels-0.2.1/src/bbfmodels/tr104_cwmp/codecprofile.py +20 -0
- bbfmodels-0.2.1/src/bbfmodels/tr104_cwmp/dect.py +78 -0
- bbfmodels-0.2.1/src/bbfmodels/tr104_cwmp/h323.py +57 -0
- bbfmodels-0.2.1/src/bbfmodels/tr104_cwmp/interwork.py +66 -0
- bbfmodels-0.2.1/src/bbfmodels/tr104_cwmp/ir.json.gz +0 -0
- bbfmodels-0.2.1/src/bbfmodels/tr104_cwmp/isdn.py +65 -0
- bbfmodels-0.2.1/src/bbfmodels/tr104_cwmp/mgcp.py +61 -0
- bbfmodels-0.2.1/src/bbfmodels/tr104_cwmp/pots.py +101 -0
- bbfmodels-0.2.1/src/bbfmodels/tr104_cwmp/reservedports.py +17 -0
- bbfmodels-0.2.1/src/bbfmodels/tr104_cwmp/sip.py +246 -0
- bbfmodels-0.2.1/src/bbfmodels/tr104_cwmp/terminal.py +99 -0
- bbfmodels-0.2.1/src/bbfmodels/tr104_cwmp/tone.py +71 -0
- bbfmodels-0.2.1/src/bbfmodels/tr104_cwmp/trunk.py +28 -0
- bbfmodels-0.2.1/src/bbfmodels/tr104_cwmp/voiceservice.py +57 -0
- bbfmodels-0.2.1/src/bbfmodels/tr104_cwmp/voipprofile.py +83 -0
- bbfmodels-0.2.1/src/bbfmodels/tr104_usp/__init__.py +20 -0
- bbfmodels-0.2.1/src/bbfmodels/tr104_usp/callcontrol.py +333 -0
- bbfmodels-0.2.1/src/bbfmodels/tr104_usp/calllog.py +199 -0
- bbfmodels-0.2.1/src/bbfmodels/tr104_usp/capabilities.py +117 -0
- bbfmodels-0.2.1/src/bbfmodels/tr104_usp/clocksynchronization.py +29 -0
- bbfmodels-0.2.1/src/bbfmodels/tr104_usp/codecprofile.py +20 -0
- bbfmodels-0.2.1/src/bbfmodels/tr104_usp/dect.py +78 -0
- bbfmodels-0.2.1/src/bbfmodels/tr104_usp/h323.py +57 -0
- bbfmodels-0.2.1/src/bbfmodels/tr104_usp/interwork.py +66 -0
- bbfmodels-0.2.1/src/bbfmodels/tr104_usp/ir.json.gz +0 -0
- bbfmodels-0.2.1/src/bbfmodels/tr104_usp/isdn.py +65 -0
- bbfmodels-0.2.1/src/bbfmodels/tr104_usp/mgcp.py +61 -0
- bbfmodels-0.2.1/src/bbfmodels/tr104_usp/pots.py +83 -0
- bbfmodels-0.2.1/src/bbfmodels/tr104_usp/reservedports.py +17 -0
- bbfmodels-0.2.1/src/bbfmodels/tr104_usp/sip.py +246 -0
- bbfmodels-0.2.1/src/bbfmodels/tr104_usp/terminal.py +90 -0
- bbfmodels-0.2.1/src/bbfmodels/tr104_usp/tone.py +71 -0
- bbfmodels-0.2.1/src/bbfmodels/tr104_usp/trunk.py +28 -0
- bbfmodels-0.2.1/src/bbfmodels/tr104_usp/voiceservice.py +57 -0
- bbfmodels-0.2.1/src/bbfmodels/tr104_usp/voipprofile.py +83 -0
- bbfmodels-0.2.1/src/bbfmodels/tr135_cwmp/__init__.py +20 -0
- bbfmodels-0.2.1/src/bbfmodels/tr135_cwmp/applications.py +82 -0
- bbfmodels-0.2.1/src/bbfmodels/tr135_cwmp/avplayers.py +38 -0
- bbfmodels-0.2.1/src/bbfmodels/tr135_cwmp/avstreams.py +34 -0
- bbfmodels-0.2.1/src/bbfmodels/tr135_cwmp/capabilities.py +211 -0
- bbfmodels-0.2.1/src/bbfmodels/tr135_cwmp/components.py +433 -0
- bbfmodels-0.2.1/src/bbfmodels/tr135_cwmp/ir.json.gz +0 -0
- bbfmodels-0.2.1/src/bbfmodels/tr135_cwmp/servicemonitoring.py +361 -0
- bbfmodels-0.2.1/src/bbfmodels/tr135_cwmp/stbservice.py +30 -0
- bbfmodels-0.2.1/src/bbfmodels/tr135_usp/__init__.py +20 -0
- bbfmodels-0.2.1/src/bbfmodels/tr135_usp/applications.py +79 -0
- bbfmodels-0.2.1/src/bbfmodels/tr135_usp/avplayers.py +37 -0
- bbfmodels-0.2.1/src/bbfmodels/tr135_usp/avstreams.py +34 -0
- bbfmodels-0.2.1/src/bbfmodels/tr135_usp/capabilities.py +211 -0
- bbfmodels-0.2.1/src/bbfmodels/tr135_usp/components.py +400 -0
- bbfmodels-0.2.1/src/bbfmodels/tr135_usp/ir.json.gz +0 -0
- bbfmodels-0.2.1/src/bbfmodels/tr135_usp/servicemonitoring.py +358 -0
- bbfmodels-0.2.1/src/bbfmodels/tr135_usp/stbservice.py +30 -0
- bbfmodels-0.2.1/src/bbfmodels/tr140_cwmp/__init__.py +20 -0
- bbfmodels-0.2.1/src/bbfmodels/tr140_cwmp/capabilities.py +24 -0
- bbfmodels-0.2.1/src/bbfmodels/tr140_cwmp/ftpserver.py +29 -0
- bbfmodels-0.2.1/src/bbfmodels/tr140_cwmp/httpserver.py +22 -0
- bbfmodels-0.2.1/src/bbfmodels/tr140_cwmp/httpsserver.py +22 -0
- bbfmodels-0.2.1/src/bbfmodels/tr140_cwmp/ir.json.gz +0 -0
- bbfmodels-0.2.1/src/bbfmodels/tr140_cwmp/logicalvolume.py +70 -0
- bbfmodels-0.2.1/src/bbfmodels/tr140_cwmp/netinfo.py +17 -0
- bbfmodels-0.2.1/src/bbfmodels/tr140_cwmp/networkserver.py +19 -0
- bbfmodels-0.2.1/src/bbfmodels/tr140_cwmp/physicalmedium.py +49 -0
- bbfmodels-0.2.1/src/bbfmodels/tr140_cwmp/sftpserver.py +20 -0
- bbfmodels-0.2.1/src/bbfmodels/tr140_cwmp/storagearray.py +22 -0
- bbfmodels-0.2.1/src/bbfmodels/tr140_cwmp/storageservice.py +47 -0
- bbfmodels-0.2.1/src/bbfmodels/tr140_cwmp/useraccount.py +22 -0
- bbfmodels-0.2.1/src/bbfmodels/tr140_cwmp/usergroup.py +18 -0
- bbfmodels-0.2.1/src/bbfmodels/tr140_usp/__init__.py +20 -0
- bbfmodels-0.2.1/src/bbfmodels/tr140_usp/capabilities.py +24 -0
- bbfmodels-0.2.1/src/bbfmodels/tr140_usp/ftpserver.py +29 -0
- bbfmodels-0.2.1/src/bbfmodels/tr140_usp/httpserver.py +22 -0
- bbfmodels-0.2.1/src/bbfmodels/tr140_usp/httpsserver.py +22 -0
- bbfmodels-0.2.1/src/bbfmodels/tr140_usp/ir.json.gz +0 -0
- bbfmodels-0.2.1/src/bbfmodels/tr140_usp/logicalvolume.py +70 -0
- bbfmodels-0.2.1/src/bbfmodels/tr140_usp/netinfo.py +17 -0
- bbfmodels-0.2.1/src/bbfmodels/tr140_usp/networkserver.py +19 -0
- bbfmodels-0.2.1/src/bbfmodels/tr140_usp/physicalmedium.py +49 -0
- bbfmodels-0.2.1/src/bbfmodels/tr140_usp/sftpserver.py +20 -0
- bbfmodels-0.2.1/src/bbfmodels/tr140_usp/storagearray.py +22 -0
- bbfmodels-0.2.1/src/bbfmodels/tr140_usp/storageservice.py +47 -0
- bbfmodels-0.2.1/src/bbfmodels/tr140_usp/useraccount.py +22 -0
- bbfmodels-0.2.1/src/bbfmodels/tr140_usp/usergroup.py +18 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_cwmp/__init__.py +20 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_cwmp/atm.py +93 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_cwmp/basapm.py +45 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_cwmp/bridging.py +199 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_cwmp/bulkdata.py +112 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_cwmp/captiveportal.py +19 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_cwmp/cellular.py +147 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_cwmp/collectiondevice.py +30 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_cwmp/connectionmonitoring.py +58 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_cwmp/device.py +199 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_cwmp/deviceinfo.py +364 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_cwmp/dhcpv4.py +237 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_cwmp/dhcpv6.py +234 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_cwmp/dlna.py +29 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_cwmp/dns.py +246 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_cwmp/docsis.py +248 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_cwmp/dsl.py +559 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_cwmp/dslite.py +34 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_cwmp/dynamicdns.py +62 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_cwmp/ethernet.py +231 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_cwmp/etsim2m.py +179 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_cwmp/fap.py +240 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_cwmp/fast.py +188 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_cwmp/faultmgmt.py +97 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_cwmp/firewall.py +309 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_cwmp/fwe.py +51 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_cwmp/gatewayinfo.py +18 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_cwmp/ghn.py +216 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_cwmp/gre.py +105 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_cwmp/hardware.py +99 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_cwmp/homeplug.py +83 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_cwmp/hosts.py +96 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_cwmp/hpna.py +225 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_cwmp/ieee1905.py +405 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_cwmp/ieee8021x.py +76 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_cwmp/interfacestack.py +20 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_cwmp/ip.py +553 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_cwmp/ipsec.py +225 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_cwmp/ipv6rd.py +33 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_cwmp/ir.json.gz +0 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_cwmp/l2tpv3.py +113 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_cwmp/lanconfigsecurity.py +16 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_cwmp/leds.py +57 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_cwmp/lldp.py +74 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_cwmp/lmap.py +333 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_cwmp/logical.py +135 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_cwmp/managementserver.py +204 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_cwmp/map.py +89 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_cwmp/moca.py +365 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_cwmp/mqtt.py +254 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_cwmp/nat.py +108 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_cwmp/neighbordiscovery.py +64 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_cwmp/optical.py +53 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_cwmp/packetcapturediagnostics.py +37 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_cwmp/pcp.py +131 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_cwmp/pdu.py +94 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_cwmp/periodicfiletransfer.py +104 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_cwmp/periodicstatistics.py +57 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_cwmp/ppp.py +105 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_cwmp/ptm.py +52 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_cwmp/qos.py +265 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_cwmp/radsecproxy.py +93 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_cwmp/routeradvertisement.py +57 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_cwmp/routing.py +290 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_cwmp/schedules.py +32 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_cwmp/security.py +44 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_cwmp/selftestdiagnostics.py +17 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_cwmp/services.py +15 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_cwmp/sessionmanagement.py +164 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_cwmp/sfps.py +209 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_cwmp/smartcardreaders.py +42 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_cwmp/softwaremodules.py +243 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_cwmp/ssh.py +90 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_cwmp/stomp.py +40 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_cwmp/syslog.py +108 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_cwmp/thread.py +195 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_cwmp/time.py +106 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_cwmp/trustedelements.py +54 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_cwmp/unixdomainsockets.py +37 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_cwmp/upa.py +121 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_cwmp/upnp.py +164 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_cwmp/usb.py +154 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_cwmp/userinterface.py +121 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_cwmp/users.py +80 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_cwmp/uspagent.py +247 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_cwmp/uspservices.py +37 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_cwmp/vxlan.py +103 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_cwmp/wifi.py +2300 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_cwmp/wireguard.py +93 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_cwmp/wwc.py +82 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_cwmp/xmpp.py +64 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_cwmp/xpon.py +276 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_cwmp/zigbee.py +243 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_usp/__init__.py +20 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_usp/atm.py +77 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_usp/basapm.py +45 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_usp/bridging.py +198 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_usp/bulkdata.py +113 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_usp/captiveportal.py +19 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_usp/cellular.py +146 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_usp/collectiondevice.py +31 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_usp/connectionmonitoring.py +58 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_usp/cwmpmanagementserver.py +16 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_usp/device.py +204 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_usp/deviceinfo.py +390 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_usp/dhcpv4.py +234 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_usp/dhcpv6.py +231 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_usp/dlna.py +29 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_usp/dns.py +219 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_usp/docsis.py +245 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_usp/dsl.py +469 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_usp/dslite.py +34 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_usp/dynamicdns.py +62 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_usp/ethernet.py +224 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_usp/fap.py +239 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_usp/fast.py +187 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_usp/faultmgmt.py +97 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_usp/firewall.py +309 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_usp/fwe.py +50 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_usp/gatewayinfo.py +21 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_usp/ghn.py +141 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_usp/gre.py +104 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_usp/hardware.py +99 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_usp/homeplug.py +82 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_usp/hosts.py +96 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_usp/hpna.py +118 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_usp/ieee1905.py +405 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_usp/ieee8021x.py +73 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_usp/interfacestack.py +20 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_usp/iotcapability.py +196 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_usp/ip.py +201 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_usp/ipsec.py +225 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_usp/ipv6rd.py +33 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_usp/ir.json.gz +0 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_usp/l2tpv3.py +112 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_usp/lanconfigsecurity.py +16 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_usp/leds.py +57 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_usp/lldp.py +74 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_usp/lmap.py +333 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_usp/localagent.py +357 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_usp/logical.py +132 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_usp/map.py +88 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_usp/moca.py +328 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_usp/mqtt.py +252 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_usp/nat.py +108 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_usp/neighbordiscovery.py +64 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_usp/node.py +18 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_usp/optical.py +52 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_usp/pcp.py +131 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_usp/pdu.py +94 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_usp/periodicfiletransfer.py +105 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_usp/periodicstatistics.py +57 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_usp/ppp.py +103 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_usp/proxieddevice.py +34 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_usp/ptm.py +51 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_usp/qos.py +265 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_usp/radsecproxy.py +93 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_usp/routeradvertisement.py +57 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_usp/routing.py +285 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_usp/schedules.py +32 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_usp/security.py +45 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_usp/services.py +15 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_usp/sessionmanagement.py +164 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_usp/sfps.py +209 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_usp/smartcardreaders.py +41 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_usp/softwaremodules.py +253 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_usp/ssh.py +90 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_usp/standby.py +17 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_usp/stomp.py +40 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_usp/syslog.py +108 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_usp/thread.py +193 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_usp/time.py +106 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_usp/trustedelements.py +54 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_usp/unixdomainsockets.py +37 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_usp/upa.py +108 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_usp/upnp.py +164 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_usp/usb.py +152 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_usp/userinterface.py +120 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_usp/users.py +71 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_usp/uspservices.py +37 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_usp/vxlan.py +102 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_usp/wifi.py +2250 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_usp/wireguard.py +92 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_usp/wwc.py +82 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_usp/xmpp.py +64 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_usp/xpon.py +275 -0
- bbfmodels-0.2.1/src/bbfmodels/tr181_usp/zigbee.py +242 -0
- bbfmodels-0.2.1/src/bbfmodels/tr196_cwmp/__init__.py +20 -0
- bbfmodels-0.2.1/src/bbfmodels/tr196_cwmp/accessmgmt.py +148 -0
- bbfmodels-0.2.1/src/bbfmodels/tr196_cwmp/capabilities.py +116 -0
- bbfmodels-0.2.1/src/bbfmodels/tr196_cwmp/cellconfig.py +2292 -0
- bbfmodels-0.2.1/src/bbfmodels/tr196_cwmp/fapcontrol.py +195 -0
- bbfmodels-0.2.1/src/bbfmodels/tr196_cwmp/fapservice.py +31 -0
- bbfmodels-0.2.1/src/bbfmodels/tr196_cwmp/ir.json.gz +0 -0
- bbfmodels-0.2.1/src/bbfmodels/tr196_cwmp/rem.py +357 -0
- bbfmodels-0.2.1/src/bbfmodels/tr196_cwmp/transport.py +143 -0
- bbfmodels-0.2.1/src/bbfmodels/tr196_usp/__init__.py +20 -0
- bbfmodels-0.2.1/src/bbfmodels/tr196_usp/accessmgmt.py +148 -0
- bbfmodels-0.2.1/src/bbfmodels/tr196_usp/capabilities.py +116 -0
- bbfmodels-0.2.1/src/bbfmodels/tr196_usp/cellconfig.py +2292 -0
- bbfmodels-0.2.1/src/bbfmodels/tr196_usp/fapcontrol.py +195 -0
- bbfmodels-0.2.1/src/bbfmodels/tr196_usp/fapservice.py +31 -0
- bbfmodels-0.2.1/src/bbfmodels/tr196_usp/ir.json.gz +0 -0
- bbfmodels-0.2.1/src/bbfmodels/tr196_usp/rem.py +357 -0
- bbfmodels-0.2.1/src/bbfmodels/tr196_usp/transport.py +143 -0
- bbfmodels-0.2.1/src/bbfmodels/tr517_usp/__init__.py +20 -0
- bbfmodels-0.2.1/src/bbfmodels/tr517_usp/accesscontrolcluster.py +88 -0
- bbfmodels-0.2.1/src/bbfmodels/tr517_usp/accountlogincluster.py +16 -0
- bbfmodels-0.2.1/src/bbfmodels/tr517_usp/actionscluster.py +43 -0
- bbfmodels-0.2.1/src/bbfmodels/tr517_usp/activatedcarbonfiltermonitoringcluster.py +31 -0
- bbfmodels-0.2.1/src/bbfmodels/tr517_usp/administratorcommissioningcluster.py +19 -0
- bbfmodels-0.2.1/src/bbfmodels/tr517_usp/airqualitycluster.py +17 -0
- bbfmodels-0.2.1/src/bbfmodels/tr517_usp/applicationbasiccluster.py +31 -0
- bbfmodels-0.2.1/src/bbfmodels/tr517_usp/applicationlaunchercluster.py +32 -0
- bbfmodels-0.2.1/src/bbfmodels/tr517_usp/audiooutputcluster.py +28 -0
- bbfmodels-0.2.1/src/bbfmodels/tr517_usp/basicinformationcluster.py +54 -0
- bbfmodels-0.2.1/src/bbfmodels/tr517_usp/bindingcluster.py +28 -0
- bbfmodels-0.2.1/src/bbfmodels/tr517_usp/booleanstatecluster.py +17 -0
- bbfmodels-0.2.1/src/bbfmodels/tr517_usp/booleanstateconfigurationcluster.py +23 -0
- bbfmodels-0.2.1/src/bbfmodels/tr517_usp/bridgeddevicebasicinformationcluster.py +41 -0
- bbfmodels-0.2.1/src/bbfmodels/tr517_usp/cameraavsettingsuserlevelmanagementcluster.py +64 -0
- bbfmodels-0.2.1/src/bbfmodels/tr517_usp/cameraavstreammanagementcluster.py +213 -0
- bbfmodels-0.2.1/src/bbfmodels/tr517_usp/carbondioxideconcentrationmeasurementcluster.py +26 -0
- bbfmodels-0.2.1/src/bbfmodels/tr517_usp/carbonmonoxideconcentrationmeasurementcluster.py +26 -0
- bbfmodels-0.2.1/src/bbfmodels/tr517_usp/channelcluster.py +54 -0
- bbfmodels-0.2.1/src/bbfmodels/tr517_usp/chimecluster.py +28 -0
- bbfmodels-0.2.1/src/bbfmodels/tr517_usp/closurecontrolcluster.py +39 -0
- bbfmodels-0.2.1/src/bbfmodels/tr517_usp/closuredimensioncluster.py +58 -0
- bbfmodels-0.2.1/src/bbfmodels/tr517_usp/colorcontrolcluster.py +68 -0
- bbfmodels-0.2.1/src/bbfmodels/tr517_usp/commissionercontrolcluster.py +17 -0
- bbfmodels-0.2.1/src/bbfmodels/tr517_usp/commoditymeteringcluster.py +28 -0
- bbfmodels-0.2.1/src/bbfmodels/tr517_usp/commoditypricecluster.py +73 -0
- bbfmodels-0.2.1/src/bbfmodels/tr517_usp/commoditytariffcluster.py +275 -0
- bbfmodels-0.2.1/src/bbfmodels/tr517_usp/contentappobservercluster.py +16 -0
- bbfmodels-0.2.1/src/bbfmodels/tr517_usp/contentcontrolcluster.py +86 -0
- bbfmodels-0.2.1/src/bbfmodels/tr517_usp/contentlaunchercluster.py +18 -0
- bbfmodels-0.2.1/src/bbfmodels/tr517_usp/descriptorcluster.py +42 -0
- bbfmodels-0.2.1/src/bbfmodels/tr517_usp/deviceenergymanagementcluster.py +92 -0
- bbfmodels-0.2.1/src/bbfmodels/tr517_usp/deviceenergymanagementmodecluster.py +16 -0
- bbfmodels-0.2.1/src/bbfmodels/tr517_usp/diagnosticlogscluster.py +16 -0
- bbfmodels-0.2.1/src/bbfmodels/tr517_usp/dishwasheralarmcluster.py +20 -0
- bbfmodels-0.2.1/src/bbfmodels/tr517_usp/dishwashermodecluster.py +37 -0
- bbfmodels-0.2.1/src/bbfmodels/tr517_usp/doorlockcluster.py +61 -0
- bbfmodels-0.2.1/src/bbfmodels/tr517_usp/ecosysteminformationcluster.py +59 -0
- bbfmodels-0.2.1/src/bbfmodels/tr517_usp/electricalenergymeasurementcluster.py +104 -0
- bbfmodels-0.2.1/src/bbfmodels/tr517_usp/electricalgridconditionscluster.py +43 -0
- bbfmodels-0.2.1/src/bbfmodels/tr517_usp/electricalpowermeasurementcluster.py +98 -0
- bbfmodels-0.2.1/src/bbfmodels/tr517_usp/endpoint.py +19 -0
- bbfmodels-0.2.1/src/bbfmodels/tr517_usp/energyevsecluster.py +39 -0
- bbfmodels-0.2.1/src/bbfmodels/tr517_usp/energyevsemodecluster.py +16 -0
- bbfmodels-0.2.1/src/bbfmodels/tr517_usp/energypreferencecluster.py +39 -0
- bbfmodels-0.2.1/src/bbfmodels/tr517_usp/ethernetnetworkdiagnosticscluster.py +25 -0
- bbfmodels-0.2.1/src/bbfmodels/tr517_usp/fabric.py +20 -0
- bbfmodels-0.2.1/src/bbfmodels/tr517_usp/fancontrolcluster.py +28 -0
- bbfmodels-0.2.1/src/bbfmodels/tr517_usp/fixedlabelcluster.py +26 -0
- bbfmodels-0.2.1/src/bbfmodels/tr517_usp/flowmeasurementcluster.py +18 -0
- bbfmodels-0.2.1/src/bbfmodels/tr517_usp/formaldehydeconcentrationmeasurementcluster.py +26 -0
- bbfmodels-0.2.1/src/bbfmodels/tr517_usp/generalcommissioningcluster.py +35 -0
- bbfmodels-0.2.1/src/bbfmodels/tr517_usp/generaldiagnosticscluster.py +40 -0
- bbfmodels-0.2.1/src/bbfmodels/tr517_usp/groupkeymanagementcluster.py +39 -0
- bbfmodels-0.2.1/src/bbfmodels/tr517_usp/groupscluster.py +17 -0
- bbfmodels-0.2.1/src/bbfmodels/tr517_usp/hepafiltermonitoringcluster.py +31 -0
- bbfmodels-0.2.1/src/bbfmodels/tr517_usp/icdmanagementcluster.py +36 -0
- bbfmodels-0.2.1/src/bbfmodels/tr517_usp/identifycluster.py +18 -0
- bbfmodels-0.2.1/src/bbfmodels/tr517_usp/illuminancemeasurementcluster.py +19 -0
- bbfmodels-0.2.1/src/bbfmodels/tr517_usp/ir.json.gz +0 -0
- bbfmodels-0.2.1/src/bbfmodels/tr517_usp/jointfabricadministratorcluster.py +17 -0
- bbfmodels-0.2.1/src/bbfmodels/tr517_usp/jointfabricdatastorecluster.py +219 -0
- bbfmodels-0.2.1/src/bbfmodels/tr517_usp/keypadinputcluster.py +16 -0
- bbfmodels-0.2.1/src/bbfmodels/tr517_usp/laundrydryercontrolscluster.py +18 -0
- bbfmodels-0.2.1/src/bbfmodels/tr517_usp/laundrywashercontrolscluster.py +20 -0
- bbfmodels-0.2.1/src/bbfmodels/tr517_usp/laundrywashermodecluster.py +37 -0
- bbfmodels-0.2.1/src/bbfmodels/tr517_usp/levelcontrolcluster.py +26 -0
- bbfmodels-0.2.1/src/bbfmodels/tr517_usp/localizationconfigurationcluster.py +18 -0
- bbfmodels-0.2.1/src/bbfmodels/tr517_usp/lowpowercluster.py +16 -0
- bbfmodels-0.2.1/src/bbfmodels/tr517_usp/matterservice.py +423 -0
- bbfmodels-0.2.1/src/bbfmodels/tr517_usp/mediainputcluster.py +29 -0
- bbfmodels-0.2.1/src/bbfmodels/tr517_usp/mediaplaybackcluster.py +99 -0
- bbfmodels-0.2.1/src/bbfmodels/tr517_usp/messagescluster.py +41 -0
- bbfmodels-0.2.1/src/bbfmodels/tr517_usp/meteridentificationcluster.py +29 -0
- bbfmodels-0.2.1/src/bbfmodels/tr517_usp/microwaveovencontrolcluster.py +24 -0
- bbfmodels-0.2.1/src/bbfmodels/tr517_usp/microwaveovenmodecluster.py +16 -0
- bbfmodels-0.2.1/src/bbfmodels/tr517_usp/modeselectcluster.py +41 -0
- bbfmodels-0.2.1/src/bbfmodels/tr517_usp/network.py +4217 -0
- bbfmodels-0.2.1/src/bbfmodels/tr517_usp/networkcommissioningcluster.py +36 -0
- bbfmodels-0.2.1/src/bbfmodels/tr517_usp/nitrogendioxideconcentrationmeasurementcluster.py +26 -0
- bbfmodels-0.2.1/src/bbfmodels/tr517_usp/occupancysensingcluster.py +18 -0
- bbfmodels-0.2.1/src/bbfmodels/tr517_usp/onoffcluster.py +21 -0
- bbfmodels-0.2.1/src/bbfmodels/tr517_usp/operationalcredentialscluster.py +44 -0
- bbfmodels-0.2.1/src/bbfmodels/tr517_usp/operationalstatecluster.py +39 -0
- bbfmodels-0.2.1/src/bbfmodels/tr517_usp/otasoftwareupdateprovidercluster.py +16 -0
- bbfmodels-0.2.1/src/bbfmodels/tr517_usp/otasoftwareupdaterequestorcluster.py +29 -0
- bbfmodels-0.2.1/src/bbfmodels/tr517_usp/ovencavityoperationalstatecluster.py +39 -0
- bbfmodels-0.2.1/src/bbfmodels/tr517_usp/ovenmodecluster.py +16 -0
- bbfmodels-0.2.1/src/bbfmodels/tr517_usp/ozoneconcentrationmeasurementcluster.py +26 -0
- bbfmodels-0.2.1/src/bbfmodels/tr517_usp/pm10concentrationmeasurementcluster.py +26 -0
- bbfmodels-0.2.1/src/bbfmodels/tr517_usp/pm1concentrationmeasurementcluster.py +26 -0
- bbfmodels-0.2.1/src/bbfmodels/tr517_usp/pm25concentrationmeasurementcluster.py +26 -0
- bbfmodels-0.2.1/src/bbfmodels/tr517_usp/powersourcecluster.py +48 -0
- bbfmodels-0.2.1/src/bbfmodels/tr517_usp/powersourceconfigurationcluster.py +17 -0
- bbfmodels-0.2.1/src/bbfmodels/tr517_usp/powertopologycluster.py +18 -0
- bbfmodels-0.2.1/src/bbfmodels/tr517_usp/pressuremeasurementcluster.py +21 -0
- bbfmodels-0.2.1/src/bbfmodels/tr517_usp/pumpconfigurationandcontrolcluster.py +39 -0
- bbfmodels-0.2.1/src/bbfmodels/tr517_usp/pushavstreamtransportcluster.py +99 -0
- bbfmodels-0.2.1/src/bbfmodels/tr517_usp/radonconcentrationmeasurementcluster.py +26 -0
- bbfmodels-0.2.1/src/bbfmodels/tr517_usp/refrigeratoralarmcluster.py +20 -0
- bbfmodels-0.2.1/src/bbfmodels/tr517_usp/refrigeratorandtemperaturecontrolledcabinetmodecluster.py +37 -0
- bbfmodels-0.2.1/src/bbfmodels/tr517_usp/relativehumiditymeasurementcluster.py +18 -0
- bbfmodels-0.2.1/src/bbfmodels/tr517_usp/rvccleanmodecluster.py +16 -0
- bbfmodels-0.2.1/src/bbfmodels/tr517_usp/rvcoperationalstatecluster.py +39 -0
- bbfmodels-0.2.1/src/bbfmodels/tr517_usp/rvcrunmodecluster.py +16 -0
- bbfmodels-0.2.1/src/bbfmodels/tr517_usp/scenesmanagementcluster.py +30 -0
- bbfmodels-0.2.1/src/bbfmodels/tr517_usp/serviceareacluster.py +74 -0
- bbfmodels-0.2.1/src/bbfmodels/tr517_usp/smokecoalarmcluster.py +29 -0
- bbfmodels-0.2.1/src/bbfmodels/tr517_usp/softwarediagnosticscluster.py +32 -0
- bbfmodels-0.2.1/src/bbfmodels/tr517_usp/soilmeasurementcluster.py +43 -0
- bbfmodels-0.2.1/src/bbfmodels/tr517_usp/switchcluster.py +19 -0
- bbfmodels-0.2.1/src/bbfmodels/tr517_usp/targetnavigatorcluster.py +27 -0
- bbfmodels-0.2.1/src/bbfmodels/tr517_usp/temperaturecontrolcluster.py +20 -0
- bbfmodels-0.2.1/src/bbfmodels/tr517_usp/temperaturemeasurementcluster.py +18 -0
- bbfmodels-0.2.1/src/bbfmodels/tr517_usp/thermostatcluster.py +127 -0
- bbfmodels-0.2.1/src/bbfmodels/tr517_usp/thermostatuserinterfaceconfigurationcluster.py +19 -0
- bbfmodels-0.2.1/src/bbfmodels/tr517_usp/threadborderroutermanagementcluster.py +22 -0
- bbfmodels-0.2.1/src/bbfmodels/tr517_usp/threadnetworkdiagnosticscluster.py +143 -0
- bbfmodels-0.2.1/src/bbfmodels/tr517_usp/threadnetworkdirectorycluster.py +29 -0
- bbfmodels-0.2.1/src/bbfmodels/tr517_usp/timeformatlocalizationcluster.py +19 -0
- bbfmodels-0.2.1/src/bbfmodels/tr517_usp/timesynchronizationcluster.py +57 -0
- bbfmodels-0.2.1/src/bbfmodels/tr517_usp/tlscertificatemanagementcluster.py +39 -0
- bbfmodels-0.2.1/src/bbfmodels/tr517_usp/tlsclientmanagementcluster.py +31 -0
- bbfmodels-0.2.1/src/bbfmodels/tr517_usp/totalvolatileorganiccompoundsconcentrationmeasurementcluster.py +26 -0
- bbfmodels-0.2.1/src/bbfmodels/tr517_usp/unitlocalizationcluster.py +18 -0
- bbfmodels-0.2.1/src/bbfmodels/tr517_usp/userlabelcluster.py +26 -0
- bbfmodels-0.2.1/src/bbfmodels/tr517_usp/valveconfigurationandcontrolcluster.py +27 -0
- bbfmodels-0.2.1/src/bbfmodels/tr517_usp/wakeonlancluster.py +18 -0
- bbfmodels-0.2.1/src/bbfmodels/tr517_usp/waterheatermanagementcluster.py +22 -0
- bbfmodels-0.2.1/src/bbfmodels/tr517_usp/waterheatermodecluster.py +16 -0
- bbfmodels-0.2.1/src/bbfmodels/tr517_usp/watertanklevelmonitoringcluster.py +31 -0
- bbfmodels-0.2.1/src/bbfmodels/tr517_usp/webrtctransportprovidercluster.py +31 -0
- bbfmodels-0.2.1/src/bbfmodels/tr517_usp/webrtctransportrequestorcluster.py +31 -0
- bbfmodels-0.2.1/src/bbfmodels/tr517_usp/wifinetworkdiagnosticscluster.py +29 -0
- bbfmodels-0.2.1/src/bbfmodels/tr517_usp/wifinetworkmanagementcluster.py +18 -0
- bbfmodels-0.2.1/src/bbfmodels/tr517_usp/windowcoveringcluster.py +30 -0
- bbfmodels-0.2.1/src/bbfmodels/tr517_usp/zonemanagementcluster.py +71 -0
- {bbfmodels-0.1.0 → bbfmodels-0.2.1}/tests/fixtures/mini-cwmp-full.xml +16 -1
- bbfmodels-0.2.1/tests/fixtures/mini-service-full.xml +21 -0
- bbfmodels-0.2.1/tests/test_generate.py +234 -0
- {bbfmodels-0.1.0 → bbfmodels-0.2.1}/tests/test_parser.py +55 -3
- {bbfmodels-0.1.0 → bbfmodels-0.2.1}/tests/test_schema.py +4 -1
- {bbfmodels-0.1.0 → bbfmodels-0.2.1}/uv.lock +1 -1
- bbfmodels-0.1.0/.release-please-manifest.json +0 -3
- bbfmodels-0.1.0/CHANGELOG.md +0 -9
- bbfmodels-0.1.0/docs/guides/quickstart.md +0 -127
- {bbfmodels-0.1.0 → bbfmodels-0.2.1}/.github/workflows/ci.yml +0 -0
- {bbfmodels-0.1.0 → bbfmodels-0.2.1}/.github/workflows/docs.yml +0 -0
- {bbfmodels-0.1.0 → bbfmodels-0.2.1}/.github/workflows/pr-title.yml +0 -0
- {bbfmodels-0.1.0 → bbfmodels-0.2.1}/.github/workflows/publish.yml +0 -0
- {bbfmodels-0.1.0 → bbfmodels-0.2.1}/.github/workflows/release-please.yml +0 -0
- {bbfmodels-0.1.0 → bbfmodels-0.2.1}/.gitignore +0 -0
- {bbfmodels-0.1.0 → bbfmodels-0.2.1}/.python-version +0 -0
- {bbfmodels-0.1.0 → bbfmodels-0.2.1}/LICENSE +0 -0
- {bbfmodels-0.1.0 → bbfmodels-0.2.1}/NOTICE +0 -0
- {bbfmodels-0.1.0 → bbfmodels-0.2.1}/context/decisions/0001-one-parser-one-ir-several-emitters.md +0 -0
- {bbfmodels-0.1.0 → bbfmodels-0.2.1}/context/decisions/0002-names-stay-as-the-forum-wrote-them.md +0 -0
- {bbfmodels-0.1.0 → bbfmodels-0.2.1}/context/decisions/0003-parse-the-flattened-full-documents.md +0 -0
- {bbfmodels-0.1.0 → bbfmodels-0.2.1}/context/decisions/0004-generated-output-is-committed.md +0 -0
- {bbfmodels-0.1.0 → bbfmodels-0.2.1}/context/decisions/0005-python-models-are-pydantic.md +0 -0
- {bbfmodels-0.1.0 → bbfmodels-0.2.1}/context/decisions/0006-everything-optional-unknown-paths-kept.md +0 -0
- {bbfmodels-0.1.0 → bbfmodels-0.2.1}/context/decisions/0007-vendor-extensions-are-overlays.md +0 -0
- {bbfmodels-0.1.0 → bbfmodels-0.2.1}/context/decisions/0008-python-toolchain.md +0 -0
- {bbfmodels-0.1.0 → bbfmodels-0.2.1}/context/decisions/0009-the-tree-keeps-wire-text.md +0 -0
- {bbfmodels-0.1.0 → bbfmodels-0.2.1}/docs/assets/images/ispx-icon.png +0 -0
- {bbfmodels-0.1.0 → bbfmodels-0.2.1}/docs/assets/js/copy-code.js +0 -0
- {bbfmodels-0.1.0 → bbfmodels-0.2.1}/docs/assets/js/powered-by.js +0 -0
- {bbfmodels-0.1.0 → bbfmodels-0.2.1}/docs/assets/stylesheets/extra.css +0 -0
- {bbfmodels-0.1.0 → bbfmodels-0.2.1}/docs/changelog.md +0 -0
- {bbfmodels-0.1.0 → bbfmodels-0.2.1}/hooks/changelog.py +0 -0
- {bbfmodels-0.1.0 → bbfmodels-0.2.1}/hooks/test_changelog.py +0 -0
- {bbfmodels-0.1.0 → bbfmodels-0.2.1}/release-notes/0.1.0.md +0 -0
- {bbfmodels-0.1.0 → bbfmodels-0.2.1}/release-please-config.json +0 -0
- {bbfmodels-0.1.0 → bbfmodels-0.2.1}/requirements.txt +0 -0
- {bbfmodels-0.1.0 → bbfmodels-0.2.1}/scripts/bootstrap.sh +0 -0
- {bbfmodels-0.1.0 → bbfmodels-0.2.1}/src/bbfmodels/codec.py +0 -0
- {bbfmodels-0.1.0 → bbfmodels-0.2.1}/src/bbfmodels/ir.py +0 -0
- {bbfmodels-0.1.0 → bbfmodels-0.2.1}/src/bbfmodels/py.typed +0 -0
- {bbfmodels-0.1.0 → bbfmodels-0.2.1}/src/bbfmodels/schema.py +0 -0
- {bbfmodels-0.1.0 → bbfmodels-0.2.1}/src/bbfmodels/tree.py +0 -0
- {bbfmodels-0.1.0 → bbfmodels-0.2.1}/tests/fixtures/mini-usp-full.xml +0 -0
- {bbfmodels-0.1.0 → bbfmodels-0.2.1}/tests/test_cli.py +0 -0
- {bbfmodels-0.1.0 → bbfmodels-0.2.1}/tests/test_codec.py +0 -0
- {bbfmodels-0.1.0 → bbfmodels-0.2.1}/tests/test_documents.py +0 -0
- {bbfmodels-0.1.0 → bbfmodels-0.2.1}/tests/test_tree.py +0 -0
- {bbfmodels-0.1.0 → bbfmodels-0.2.1}/wrangler.jsonc +0 -0
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
## [0.2.1](https://github.com/ispx-limited/bbfmodels/compare/v0.2.0...v0.2.1) (2026-11-02)
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
### Fixed
|
|
7
|
+
|
|
8
|
+
* **models:** generated files no longer record the tool version, which broke the release build ([#10](https://github.com/ispx-limited/bbfmodels/issues/10)) ([ab909c7](https://github.com/ispx-limited/bbfmodels/commit/ab909c7d67b102b11f09122d8c01cea674859e8c))
|
|
9
|
+
* **parser:** a vendor document's empty syntax is read as a string instead of failing ([#11](https://github.com/ispx-limited/bbfmodels/issues/11)) ([7cdb4a1](https://github.com/ispx-limited/bbfmodels/commit/7cdb4a1c4fa39b7741c90a67c84b43812c889fe2))
|
|
10
|
+
* **parser:** a vendor document's unknown vocabulary values fall back with a warning instead of failing ([#13](https://github.com/ispx-limited/bbfmodels/issues/13)) ([bb3e807](https://github.com/ispx-limited/bbfmodels/commit/bb3e80723320fdd69d2b2263ef066d790a28feb2))
|
|
11
|
+
|
|
12
|
+
## [0.2.0](https://github.com/ispx-limited/bbfmodels/compare/v0.1.0...v0.2.0) (2026-11-02)
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
### Added
|
|
16
|
+
|
|
17
|
+
* **models:** generated pydantic models for every published data model, and a generator for any document ([#7](https://github.com/ispx-limited/bbfmodels/issues/7)) ([adf73f2](https://github.com/ispx-limited/bbfmodels/commit/adf73f2004eb7cf24673a52298a251af45f39364))
|
|
18
|
+
|
|
19
|
+
## 0.1.0 (2026-11-02)
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
### Added
|
|
23
|
+
|
|
24
|
+
* **parser:** read a published document into the intermediate representation ([#1](https://github.com/ispx-limited/bbfmodels/issues/1)) ([462d045](https://github.com/ispx-limited/bbfmodels/commit/462d04530a7d3a7d62a3da440404f4afcadb2c4f))
|
|
25
|
+
* **runtime:** resolve paths, hold a device's values and validate them against the schema ([#3](https://github.com/ispx-limited/bbfmodels/issues/3)) ([35146ad](https://github.com/ispx-limited/bbfmodels/commit/35146adb52757ac9a05836415f87815135c55b94))
|
|
@@ -10,7 +10,12 @@ is for anyone, person or coding agent, working in the repository.
|
|
|
10
10
|
architecture decision records and `context/README.md` indexes them. Read
|
|
11
11
|
it before touching the parser, the IR or a generator, and add a record
|
|
12
12
|
when a change makes or reverses a significant decision.
|
|
13
|
-
- `src/bbfmodels/` is the package. `cli.py` is the command line entry point
|
|
13
|
+
- `src/bbfmodels/` is the package. `cli.py` is the command line entry point,
|
|
14
|
+
`parser.py` reads the XML into the IR in `ir.py`, `schema.py`, `tree.py`
|
|
15
|
+
and `codec.py` are the runtime, `generate.py` writes the model packages.
|
|
16
|
+
- `src/bbfmodels/tr*/` are generated packages, one per published document.
|
|
17
|
+
Never edit them; run `make generate` after changing the generator or
|
|
18
|
+
the pinned documents in `sources.py`. A test fails when they are stale.
|
|
14
19
|
- `tests/` holds the pytest suite.
|
|
15
20
|
- `docs/` is the documentation site (mkdocs), built strictly in CI. A page
|
|
16
21
|
exists when it has content; nothing is scaffolded empty.
|
|
@@ -20,7 +20,8 @@ make lint # format check, lint and type check, what CI runs
|
|
|
20
20
|
rejects any other title.
|
|
21
21
|
- One change per PR. PRs are squash merged, so the title is the commit.
|
|
22
22
|
- Generated files are never edited by hand. Change the generator or the
|
|
23
|
-
source document and
|
|
23
|
+
pinned source document and run `make generate`; CI fails when committed
|
|
24
|
+
output is stale.
|
|
24
25
|
- Attribute and class names keep the Forum's PascalCase verbatim.
|
|
25
26
|
- The tool carries no knowledge of any vendor or product. Vendor behaviour
|
|
26
27
|
comes from a vendor's own data model document, never from code.
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
.DEFAULT_GOAL := help
|
|
2
|
-
.PHONY: help build test lint run docs clean
|
|
2
|
+
.PHONY: help build test lint run generate docs clean
|
|
3
3
|
|
|
4
4
|
help: ## List available targets
|
|
5
5
|
@awk 'BEGIN {FS = ":.*## "} /^[a-zA-Z_-]+:.*## / {printf "%-12s %s\n", $$1, $$2}' $(MAKEFILE_LIST)
|
|
@@ -18,6 +18,9 @@ lint: ## Format check, lint and type check, the same commands CI runs
|
|
|
18
18
|
run: ## Run the command line tool
|
|
19
19
|
uv run bbfmodels
|
|
20
20
|
|
|
21
|
+
generate: ## Regenerate the shipped model packages from the pinned documents
|
|
22
|
+
uv run bbfmodels generate
|
|
23
|
+
|
|
21
24
|
docs: ## Build the documentation site strictly
|
|
22
25
|
uv run --with-requirements requirements.txt --no-project python -m unittest discover -s hooks
|
|
23
26
|
uv run --with-requirements requirements.txt --no-project mkdocs build --strict
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: bbfmodels
|
|
3
|
-
Version: 0.1
|
|
3
|
+
Version: 0.2.1
|
|
4
4
|
Summary: Typed models and schema tooling for Broadband Forum data models (TR-181, TR-098, TR-104 and more), generated from the published XML
|
|
5
5
|
Project-URL: Homepage, https://github.com/ispx-limited/bbfmodels
|
|
6
6
|
Project-URL: Documentation, https://docs.bbfmodels.ispx.co/
|
|
@@ -40,20 +40,41 @@ the same parameter paths as strings. bbfmodels does it once:
|
|
|
40
40
|
- A Python runtime that works from that representation: resolve a path,
|
|
41
41
|
validate a value against the model's constraints, convert between the flat
|
|
42
42
|
path and value lists that CWMP and USP carry on the wire and a typed tree.
|
|
43
|
-
- Generated typed bindings: pydantic models for Python
|
|
44
|
-
|
|
43
|
+
- Generated typed bindings: pydantic models for Python, shipped for TR-181
|
|
44
|
+
and TR-098 and the service models (TR-104 voice, TR-135 set-top box,
|
|
45
|
+
TR-140 storage, TR-196 femtocell, TR-517 Matter), and generated on demand
|
|
46
|
+
for any other document, a vendor's included. JSON Schema and TypeScript follow from the
|
|
47
|
+
same representation, Go when there is a consumer.
|
|
45
48
|
|
|
46
49
|
Names stay as the Forum wrote them. `Device.WiFi.SSID.{i}.SSID` is a table of
|
|
47
50
|
`SSID` entries indexed by instance number, and the attribute is `SSID`, not
|
|
48
51
|
`ssid`.
|
|
49
52
|
|
|
53
|
+
## Install
|
|
54
|
+
|
|
55
|
+
```sh
|
|
56
|
+
pip install bbfmodels
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
Python 3.11 or later. The one runtime dependency is pydantic.
|
|
60
|
+
|
|
50
61
|
## Status
|
|
51
62
|
|
|
52
|
-
|
|
53
|
-
are in place
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
63
|
+
Early. The parser, the intermediate representation, the runtime and the
|
|
64
|
+
generated Python models are in place. Commands and events in the generated
|
|
65
|
+
models, JSON Schema and TypeScript come next. Before 1.0 a minor release
|
|
66
|
+
may change the IR and the runtime API.
|
|
67
|
+
|
|
68
|
+
```python
|
|
69
|
+
from bbfmodels.tr181_cwmp import Device
|
|
70
|
+
|
|
71
|
+
device = Device.from_flat(values_from_the_device)
|
|
72
|
+
radio = device.WiFi.Radio[1]
|
|
73
|
+
radio.Channel # 36, an int
|
|
74
|
+
radio.Enable # True
|
|
75
|
+
device.problems() # every value outside the model's constraints
|
|
76
|
+
device.flatten() # back to path and text pairs
|
|
77
|
+
```
|
|
57
78
|
|
|
58
79
|
The design decisions behind the code are in `context/decisions/`, indexed in
|
|
59
80
|
`context/README.md`. Read them before changing the parser or the IR.
|
|
@@ -15,20 +15,41 @@ the same parameter paths as strings. bbfmodels does it once:
|
|
|
15
15
|
- A Python runtime that works from that representation: resolve a path,
|
|
16
16
|
validate a value against the model's constraints, convert between the flat
|
|
17
17
|
path and value lists that CWMP and USP carry on the wire and a typed tree.
|
|
18
|
-
- Generated typed bindings: pydantic models for Python
|
|
19
|
-
|
|
18
|
+
- Generated typed bindings: pydantic models for Python, shipped for TR-181
|
|
19
|
+
and TR-098 and the service models (TR-104 voice, TR-135 set-top box,
|
|
20
|
+
TR-140 storage, TR-196 femtocell, TR-517 Matter), and generated on demand
|
|
21
|
+
for any other document, a vendor's included. JSON Schema and TypeScript follow from the
|
|
22
|
+
same representation, Go when there is a consumer.
|
|
20
23
|
|
|
21
24
|
Names stay as the Forum wrote them. `Device.WiFi.SSID.{i}.SSID` is a table of
|
|
22
25
|
`SSID` entries indexed by instance number, and the attribute is `SSID`, not
|
|
23
26
|
`ssid`.
|
|
24
27
|
|
|
28
|
+
## Install
|
|
29
|
+
|
|
30
|
+
```sh
|
|
31
|
+
pip install bbfmodels
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
Python 3.11 or later. The one runtime dependency is pydantic.
|
|
35
|
+
|
|
25
36
|
## Status
|
|
26
37
|
|
|
27
|
-
|
|
28
|
-
are in place
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
38
|
+
Early. The parser, the intermediate representation, the runtime and the
|
|
39
|
+
generated Python models are in place. Commands and events in the generated
|
|
40
|
+
models, JSON Schema and TypeScript come next. Before 1.0 a minor release
|
|
41
|
+
may change the IR and the runtime API.
|
|
42
|
+
|
|
43
|
+
```python
|
|
44
|
+
from bbfmodels.tr181_cwmp import Device
|
|
45
|
+
|
|
46
|
+
device = Device.from_flat(values_from_the_device)
|
|
47
|
+
radio = device.WiFi.Radio[1]
|
|
48
|
+
radio.Channel # 36, an int
|
|
49
|
+
radio.Enable # True
|
|
50
|
+
device.problems() # every value outside the model's constraints
|
|
51
|
+
device.flatten() # back to path and text pairs
|
|
52
|
+
```
|
|
32
53
|
|
|
33
54
|
The design decisions behind the code are in `context/decisions/`, indexed in
|
|
34
55
|
`context/README.md`. Read them before changing the parser or the IR.
|
|
@@ -20,3 +20,4 @@ changes, a new record is written and the old one is marked superseded.
|
|
|
20
20
|
| [0007](decisions/0007-vendor-extensions-are-overlays.md) | Vendor extensions are overlays in the same schema | Accepted |
|
|
21
21
|
| [0008](decisions/0008-python-toolchain.md) | Python toolchain: uv, ruff, mypy, pytest, standard library XML | Accepted |
|
|
22
22
|
| [0009](decisions/0009-the-tree-keeps-wire-text.md) | The data tree keeps wire text and decodes on demand | Accepted |
|
|
23
|
+
| [0010](decisions/0010-generated-python-packages.md) | One generated package per document, lenient on input, strict in `problems` | Accepted |
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
# 0010: One generated package per document, lenient on input, strict in `problems`
|
|
2
|
+
|
|
3
|
+
## Context
|
|
4
|
+
|
|
5
|
+
Decision 0005 settled on pydantic models built lazily. Generating them
|
|
6
|
+
raised questions the decision did not answer: how packages and classes are
|
|
7
|
+
named, what a field's type is when the model gives an enumeration or a
|
|
8
|
+
range, how values the model does not allow are treated, and how a Forum
|
|
9
|
+
parameter can be named like a Python helper.
|
|
10
|
+
|
|
11
|
+
## Decision
|
|
12
|
+
|
|
13
|
+
- **One package per published document**, named after it: `tr181_cwmp`,
|
|
14
|
+
`tr181_usp`, `tr098`, `tr104_cwmp`, and so on. The CWMP and USP editions
|
|
15
|
+
of a document differ in commands, events and a few objects, and a user
|
|
16
|
+
works against one of them; an older issue that is still deployed carries
|
|
17
|
+
its issue number (`tr104_1`, the voice model of TR-098 gateways). The
|
|
18
|
+
package ships the IR it was generated from as `ir.json.gz` and exposes
|
|
19
|
+
it through `schema()`.
|
|
20
|
+
- **Service models are generated as the document writes them.** A service
|
|
21
|
+
model's root (`VoiceService.{i}.`) is a table that a device mounts under
|
|
22
|
+
its `Services.` object, and the document does not say under which root.
|
|
23
|
+
The classes carry the document's paths; the mount is given when
|
|
24
|
+
converting: `VoiceService.from_flat(values, "Device.Services.VoiceService.1.")`.
|
|
25
|
+
Documents that only hold components (TR-143, TR-157) are not generated,
|
|
26
|
+
because their content is already merged into the root models.
|
|
27
|
+
- **A class per object, a module per top-level subtree.** The root object
|
|
28
|
+
is a class named after it (`Device`) in `device.py`; every other object
|
|
29
|
+
is `WiFi_Radio_Stats`, its path with the root dropped, in `wifi.py`.
|
|
30
|
+
Children are emitted before parents, annotations are evaluated eagerly
|
|
31
|
+
rather than as strings, and every helper is imported under a
|
|
32
|
+
leading-underscore alias. Together these make a class body resolve a
|
|
33
|
+
class name before a field of the same name exists in it, and keep a
|
|
34
|
+
parameter named `Param` (TR-181 has one) from shadowing the helper.
|
|
35
|
+
The class's own metadata, its schema path and the package holding its
|
|
36
|
+
IR, lives in dunder attributes (`__bbf_path__`, `__bbf_package__`):
|
|
37
|
+
Forum names never start with an underscore, so nothing can collide with
|
|
38
|
+
them, and pydantic leaves dunder names alone.
|
|
39
|
+
- **Types coerce, facets report.** A field's type is the parameter's
|
|
40
|
+
Python type: `int`, `bool`, `datetime`, `bytes`, `Decimal`, `str`, or a
|
|
41
|
+
comma-list of one of them. Ranges, sizes, patterns and enumerations are
|
|
42
|
+
not pydantic constraints, because a real device returns out-of-range
|
|
43
|
+
values and vendor enumeration members and a model that rejects them
|
|
44
|
+
cannot hold what the device said (decision 0006). `problems()` reports
|
|
45
|
+
every facet violation from the shipped IR instead. An enumeration is
|
|
46
|
+
typed `Literal[...] | str`, so an editor completes the Forum's values and
|
|
47
|
+
any other string still validates.
|
|
48
|
+
- **Everything optional, tables are `dict[int, Child]`, unknown paths are
|
|
49
|
+
kept** as pydantic extras, nested dicts for unknown objects, and
|
|
50
|
+
`flatten()` writes them back. `flatten()` writes canonical text (`true`,
|
|
51
|
+
not `1`) because the model holds typed values, not wire text; the data
|
|
52
|
+
tree (decision 0009) is the exact round-trip surface.
|
|
53
|
+
- **No descriptions in generated code.** They are three megabytes for
|
|
54
|
+
TR-181 and live in the shipped IR, reachable through `schema()`.
|
|
55
|
+
|
|
56
|
+
## Consequences
|
|
57
|
+
|
|
58
|
+
- `import bbfmodels.tr181_cwmp` takes about a third of a second and the
|
|
59
|
+
first validation about a fifth; the test suite asserts a ceiling.
|
|
60
|
+
- A field whose Forum name collides with a pydantic attribute is emitted
|
|
61
|
+
with a trailing underscore and an alias of the original name, so wire
|
|
62
|
+
conversion is unaffected. None of the shipped documents needs it today.
|
|
63
|
+
- Generated code is excluded from the formatter and the linter, and
|
|
64
|
+
type-checked like the rest of the package.
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
# Command line
|
|
2
|
+
|
|
3
|
+
```
|
|
4
|
+
bbfmodels fetch [NAME ...] [--list cwmp|usp] [--into DIR]
|
|
5
|
+
bbfmodels ir DOCUMENT [-o FILE] [--indent N]
|
|
6
|
+
bbfmodels ir-schema
|
|
7
|
+
bbfmodels generate [DOCUMENT --package NAME] [--root DIR]
|
|
8
|
+
bbfmodels --version
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
| Command | Does |
|
|
12
|
+
| --- | --- |
|
|
13
|
+
| `fetch` | Downloads published documents into the cache; no names means the core set. `--list` prints what the Forum publishes for a protocol. |
|
|
14
|
+
| `ir` | Parses a document and writes the IR as JSON, to stdout or `-o`. |
|
|
15
|
+
| `ir-schema` | Prints the JSON Schema of the IR. |
|
|
16
|
+
| `generate` | Writes a package of pydantic models from a document under `--root` (default `src`). With no document, regenerates every shipped package. |
|
|
17
|
+
|
|
18
|
+
The cache is `~/.cache/bbfmodels`, or `$XDG_CACHE_HOME/bbfmodels`, or
|
|
19
|
+
`$BBFMODELS_CACHE` when set.
|
|
20
|
+
|
|
21
|
+
Exit status is 0 on success, 1 when a document cannot be read or a file
|
|
22
|
+
cannot be written, with the reason on stderr, and 2 for a usage error.
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
# Documents and the IR
|
|
2
|
+
|
|
3
|
+
The Broadband Forum publishes each data model as XML in the TR-106 schema,
|
|
4
|
+
in two forms. The modular files assemble objects from imports and reusable
|
|
5
|
+
components; the flattened `-full.xml` files have all of that resolved.
|
|
6
|
+
bbfmodels reads the flattened form only.
|
|
7
|
+
|
|
8
|
+
## Fetching
|
|
9
|
+
|
|
10
|
+
`fetch` downloads a document into a local cache, `~/.cache/bbfmodels` or
|
|
11
|
+
`$BBFMODELS_CACHE`, and reuses what is there. Published files never change.
|
|
12
|
+
|
|
13
|
+
```sh
|
|
14
|
+
bbfmodels fetch # the core set
|
|
15
|
+
bbfmodels fetch tr-181-2-21-0-usp-full.xml # one document
|
|
16
|
+
bbfmodels fetch --list cwmp # everything published for CWMP
|
|
17
|
+
bbfmodels fetch --list usp
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
The core set is TR-098, TR-104 (both issues), TR-135, TR-140, TR-157,
|
|
21
|
+
TR-181 (CWMP and USP), TR-196 and TR-517. The same call exists in Python:
|
|
22
|
+
|
|
23
|
+
```python
|
|
24
|
+
from bbfmodels.sources import fetch, available, CORE
|
|
25
|
+
|
|
26
|
+
path = fetch("tr-181-2-21-0-cwmp-full.xml")
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
## The intermediate representation
|
|
30
|
+
|
|
31
|
+
`ir` parses a document into the intermediate representation (IR), the one
|
|
32
|
+
structure everything else in bbfmodels reads:
|
|
33
|
+
|
|
34
|
+
```sh
|
|
35
|
+
bbfmodels ir tr-181-2-21-0-cwmp-full.xml -o tr-181.json --indent 2
|
|
36
|
+
bbfmodels ir-schema > ir-schema.json # the IR's JSON Schema
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
A document has named data types and models. A model has objects keyed by
|
|
40
|
+
path, with `{i}` marking a table exactly as the specification writes it.
|
|
41
|
+
An object has parameters, and in USP documents commands and events; a
|
|
42
|
+
parameter has a syntax with its base type, the name of its data type if it
|
|
43
|
+
used one, and its facets.
|
|
44
|
+
|
|
45
|
+
```json
|
|
46
|
+
{
|
|
47
|
+
"spec": "urn:broadband-forum-org:tr-181-2-21-0-cwmp",
|
|
48
|
+
"protocol": "cwmp",
|
|
49
|
+
"models": [{
|
|
50
|
+
"name": "Device:2.21",
|
|
51
|
+
"objects": {
|
|
52
|
+
"Device.WiFi.Radio.{i}.": {
|
|
53
|
+
"path": "Device.WiFi.Radio.{i}.",
|
|
54
|
+
"access": "readOnly",
|
|
55
|
+
"min_entries": 0,
|
|
56
|
+
"max_entries": null,
|
|
57
|
+
"num_entries_parameter": "RadioNumberOfEntries",
|
|
58
|
+
"unique_keys": [{"functional": false, "parameters": ["Alias"]}, {"functional": false, "parameters": ["Name"]}],
|
|
59
|
+
"parameters": {
|
|
60
|
+
"Channel": {
|
|
61
|
+
"name": "Channel",
|
|
62
|
+
"access": "readWrite",
|
|
63
|
+
"syntax": {
|
|
64
|
+
"base_type": "unsignedInt",
|
|
65
|
+
"facets": {"ranges": [{"min_inclusive": 1, "max_inclusive": 255}]}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}]
|
|
72
|
+
}
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
Fields at their default are left out: an object without `status` is
|
|
76
|
+
current, a parameter without `list` is a single value, `max_entries` of
|
|
77
|
+
`null` is unbounded.
|
|
78
|
+
|
|
79
|
+
Named data types are resolved. A parameter declared as `IPv4Address` has
|
|
80
|
+
`"data_type": "IPv4Address"` and a syntax whose base type and facets are
|
|
81
|
+
the fully inherited ones, so no consumer needs a second lookup. The
|
|
82
|
+
document's `data_types` table is there for emitters that want to generate
|
|
83
|
+
a named type.
|
|
84
|
+
|
|
85
|
+
In Python:
|
|
86
|
+
|
|
87
|
+
```python
|
|
88
|
+
from bbfmodels.parser import parse_file
|
|
89
|
+
|
|
90
|
+
doc = parse_file("tr-181-2-21-0-cwmp-full.xml")
|
|
91
|
+
model = doc.models[0]
|
|
92
|
+
radio = model.objects["Device.WiFi.Radio.{i}."]
|
|
93
|
+
radio.multi_instance # True
|
|
94
|
+
radio.name, radio.parent_path # 'Radio', 'Device.WiFi.'
|
|
95
|
+
channel = radio.parameters["Channel"].syntax
|
|
96
|
+
channel.base_type # <BaseType.UNSIGNED_INT: 'unsignedInt'>
|
|
97
|
+
channel.facets.ranges[0].max_inclusive # 255
|
|
98
|
+
reboot = parse_file("tr-181-2-21-0-usp-full.xml").models[0].objects["Device."].commands["Reboot()"]
|
|
99
|
+
reboot.input.parameters["Cause"].mandatory # False
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
## What the parser tolerates
|
|
103
|
+
|
|
104
|
+
The published documents are not always well-formed XML, and vendor
|
|
105
|
+
documents captured from devices depart from the schema in small ways. The
|
|
106
|
+
parser repairs what it has seen and warns where it had to decide:
|
|
107
|
+
|
|
108
|
+
| In the document | What happens |
|
|
109
|
+
| --- | --- |
|
|
110
|
+
| Bare `&` or literal `<OUI>` markup in prose | Escaped before parsing |
|
|
111
|
+
| An attribute published as `value="""` | Read as a quote |
|
|
112
|
+
| Whitespace around a name (`name="Queueing "`) | Dropped |
|
|
113
|
+
| An empty `<syntax/>` | Read as a string, with a `ParseWarning` |
|
|
114
|
+
| An unknown `status`, `access` or `activeNotify` value | The conservative default (`current`, `readOnly`, `normal`), with a `ParseWarning` |
|
|
115
|
+
| `<import>` or `<component>` elements | Rejected: use the flattened `-full.xml` edition |
|
|
116
|
+
|
|
117
|
+
Anything else the schema does not allow is a `ParseError` naming the place.
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
# Generated models
|
|
2
|
+
|
|
3
|
+
A generated package has a pydantic class per object, a typed optional
|
|
4
|
+
field per parameter and a `dict[int, Child]` per table. Names are the
|
|
5
|
+
Forum's names, PascalCase and all. These packages ship with bbfmodels:
|
|
6
|
+
|
|
7
|
+
| Package | Document | Root class |
|
|
8
|
+
| --- | --- | --- |
|
|
9
|
+
| `bbfmodels.tr181_cwmp` | TR-181 issue 2, CWMP edition | `Device` |
|
|
10
|
+
| `bbfmodels.tr181_usp` | TR-181 issue 2, USP edition | `Device` |
|
|
11
|
+
| `bbfmodels.tr098` | TR-098 | `InternetGatewayDevice` |
|
|
12
|
+
| `bbfmodels.tr104_1` | TR-104 issue 1, voice on TR-098 gateways | `VoiceService` |
|
|
13
|
+
| `bbfmodels.tr104_cwmp`, `bbfmodels.tr104_usp` | TR-104 issue 2, voice | `VoiceService` |
|
|
14
|
+
| `bbfmodels.tr135_cwmp`, `bbfmodels.tr135_usp` | TR-135, set-top box | `STBService` |
|
|
15
|
+
| `bbfmodels.tr140_cwmp`, `bbfmodels.tr140_usp` | TR-140, storage | `StorageService` |
|
|
16
|
+
| `bbfmodels.tr196_cwmp`, `bbfmodels.tr196_usp` | TR-196, femtocell | `FAPService` |
|
|
17
|
+
| `bbfmodels.tr517_usp` | TR-517, Matter | `MatterService` |
|
|
18
|
+
|
|
19
|
+
Each package records `SOURCE`, `SPEC` and `MODEL`, and `schema()` returns
|
|
20
|
+
the `Schema` of the IR it was generated from.
|
|
21
|
+
|
|
22
|
+
## From device values and back
|
|
23
|
+
|
|
24
|
+
`from_flat` takes the path and value pairs an ACS or USP controller
|
|
25
|
+
returns. Values coerce to their Python type: integers, booleans (`1` and
|
|
26
|
+
`true` alike), dates, binary, decimals, and comma-separated lists.
|
|
27
|
+
|
|
28
|
+
```python
|
|
29
|
+
from bbfmodels.tr181_cwmp import Device
|
|
30
|
+
|
|
31
|
+
device = Device.from_flat({
|
|
32
|
+
"Device.DeviceInfo.UpTime": "1234",
|
|
33
|
+
"Device.DeviceInfo.FirstUseDate": "2026-01-02T03:04:05Z",
|
|
34
|
+
"Device.WiFi.Radio.1.Enable": "1",
|
|
35
|
+
"Device.WiFi.Radio.1.Channel": "36",
|
|
36
|
+
"Device.WiFi.SSID.1.LowerLayers": "Device.WiFi.Radio.1",
|
|
37
|
+
})
|
|
38
|
+
device.DeviceInfo.UpTime # 1234
|
|
39
|
+
device.DeviceInfo.FirstUseDate # datetime(2026, 1, 2, 3, 4, 5, tzinfo=UTC)
|
|
40
|
+
device.WiFi.Radio[1].Enable # True
|
|
41
|
+
device.WiFi.SSID[1].LowerLayers # ['Device.WiFi.Radio.1']
|
|
42
|
+
device.WiFi.Radio[2] # KeyError: only instance 1 was given
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
Every field is optional, because no device exposes the whole model, and a
|
|
46
|
+
child object that was not given is `None`. Paths may also be relative to
|
|
47
|
+
the object: `Device.from_flat({"WiFi.Radio.1.Channel": "36"})`.
|
|
48
|
+
|
|
49
|
+
`flatten` writes the model back as path and text pairs in canonical form:
|
|
50
|
+
`true` for a boolean, `a,b` for a list, upper-case hex for binary.
|
|
51
|
+
|
|
52
|
+
```python
|
|
53
|
+
device.flatten()
|
|
54
|
+
# {'Device.DeviceInfo.UpTime': '1234', ..., 'Device.WiFi.Radio.1.Enable': 'true', ...}
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
## Validation
|
|
58
|
+
|
|
59
|
+
Parsing is lenient on purpose. Ranges, sizes, patterns and enumerations are
|
|
60
|
+
not enforced when a model is built, because a real device returns values
|
|
61
|
+
outside them and a model that refused them could not hold what the device
|
|
62
|
+
said. `problems()` reports every violation against the shipped schema:
|
|
63
|
+
|
|
64
|
+
```python
|
|
65
|
+
device.WiFi.Radio[1].Channel = 999
|
|
66
|
+
device.WiFi.Radio[1].Status = "zz"
|
|
67
|
+
device.problems()
|
|
68
|
+
# [('Device.WiFi.Radio.1.Status', "'zz' is not one of the enumerated values"),
|
|
69
|
+
# ('Device.WiFi.Radio.1.Channel', '999 is outside the allowed ranges')]
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
An enumeration is typed `Literal[...] | str`: an editor completes the
|
|
73
|
+
Forum's values, and a vendor's extra value still validates. A parameter
|
|
74
|
+
that takes its allowed values from another parameter, as
|
|
75
|
+
`OperatingChannelBandwidth` does from `SupportedOperatingChannelBandwidths`,
|
|
76
|
+
is not checked against a fixed list, because the list is the device's.
|
|
77
|
+
|
|
78
|
+
## Tables and construction
|
|
79
|
+
|
|
80
|
+
A table is a plain `dict[int, Child]`. Classes construct directly, and
|
|
81
|
+
`flatten` takes the data path to write under:
|
|
82
|
+
|
|
83
|
+
```python
|
|
84
|
+
from bbfmodels.tr181_cwmp.wifi import WiFi_Radio
|
|
85
|
+
|
|
86
|
+
radio = WiFi_Radio(Enable=True, Channel=36, OperatingFrequencyBand="5GHz")
|
|
87
|
+
radio.flatten("Device.WiFi.Radio.1.")
|
|
88
|
+
# {'Device.WiFi.Radio.1.Enable': 'true', 'Device.WiFi.Radio.1.OperatingFrequencyBand': '5GHz', 'Device.WiFi.Radio.1.Channel': '36'}
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
Class names are the object's path with the root dropped and dots replaced:
|
|
92
|
+
`WiFi_Radio`, `WiFi_Radio_Stats`, `IP_Interface_IPv4Address`. They live in
|
|
93
|
+
the module of their top-level subtree: `bbfmodels.tr181_cwmp.wifi`,
|
|
94
|
+
`bbfmodels.tr181_cwmp.ip`.
|
|
95
|
+
|
|
96
|
+
## Vendor parameters
|
|
97
|
+
|
|
98
|
+
Parameters and objects the model does not define are kept as pydantic
|
|
99
|
+
extras and written back by `flatten`. An unknown parameter is text; an
|
|
100
|
+
unknown object is a nested dict with instance numbers as string keys.
|
|
101
|
+
|
|
102
|
+
```python
|
|
103
|
+
device = Device.from_flat({
|
|
104
|
+
"Device.WiFi.Radio.1.X_ACME_TxPower": "high",
|
|
105
|
+
"Device.X_ACME_Mesh.1.Role": "controller",
|
|
106
|
+
})
|
|
107
|
+
device.WiFi.Radio[1].X_ACME_TxPower # 'high'
|
|
108
|
+
device.X_ACME_Mesh # {'1': {'Role': 'controller'}}
|
|
109
|
+
device.flatten() # both paths come back
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
For typed access to a vendor's extensions, generate a package from the
|
|
113
|
+
vendor's document: see [vendor models](vendor-models.md).
|
|
114
|
+
|
|
115
|
+
## Service models
|
|
116
|
+
|
|
117
|
+
A service model's root is a table, `VoiceService.{i}.`, that a device
|
|
118
|
+
mounts under its `Services.` object. The generated classes carry the
|
|
119
|
+
document's paths and the mount is given when converting:
|
|
120
|
+
|
|
121
|
+
```python
|
|
122
|
+
from bbfmodels.tr104_cwmp import VoiceService
|
|
123
|
+
|
|
124
|
+
voice = VoiceService.from_flat(values, "Device.Services.VoiceService.1.")
|
|
125
|
+
voice.Capabilities.MaxLineCount
|
|
126
|
+
voice.flatten("Device.Services.VoiceService.1.")
|
|
127
|
+
voice.problems("Device.Services.VoiceService.1.")
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
Without a prefix, `from_flat` takes paths relative to the instance
|
|
131
|
+
(`Capabilities.MaxLineCount`) and `problems` reports against instance 1.
|
|
132
|
+
|
|
133
|
+
## Names that had to change
|
|
134
|
+
|
|
135
|
+
Three kinds of Forum name cannot be a Python field as written. The field
|
|
136
|
+
gets a safe name and the Forum's name as its alias, so `from_flat` and
|
|
137
|
+
`flatten` are unaffected:
|
|
138
|
+
|
|
139
|
+
| Forum name | Field | Why |
|
|
140
|
+
| --- | --- | --- |
|
|
141
|
+
| `Config` | `Config_` | pydantic reads `Config` from a class body as its legacy configuration |
|
|
142
|
+
| `11kRSSIHighThresholdOffset` | `N11kRSSIHighThresholdOffset` | an identifier cannot start with a digit |
|
|
143
|
+
| a name with a hyphen or other symbol | the symbol becomes `_` | not an identifier |
|
|
144
|
+
|
|
145
|
+
None of the Forum's own documents needs the second or third; vendor
|
|
146
|
+
documents do.
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
# Quickstart
|
|
2
|
+
|
|
3
|
+
```sh
|
|
4
|
+
pip install bbfmodels
|
|
5
|
+
```
|
|
6
|
+
|
|
7
|
+
Python 3.11 or later; the one runtime dependency is pydantic.
|
|
8
|
+
|
|
9
|
+
## Typed models of a device
|
|
10
|
+
|
|
11
|
+
The packages `bbfmodels.tr181_cwmp`, `bbfmodels.tr181_usp`, `bbfmodels.tr098`
|
|
12
|
+
and the service models ship with the package. Build a model from the path
|
|
13
|
+
and value pairs an ACS returns and read typed values:
|
|
14
|
+
|
|
15
|
+
```python
|
|
16
|
+
from bbfmodels.tr181_cwmp import Device
|
|
17
|
+
|
|
18
|
+
device = Device.from_flat({
|
|
19
|
+
"Device.DeviceInfo.UpTime": "1234",
|
|
20
|
+
"Device.WiFi.Radio.1.Enable": "1",
|
|
21
|
+
"Device.WiFi.Radio.1.Channel": "36",
|
|
22
|
+
"Device.WiFi.Radio.1.SupportedFrequencyBands": "2.4GHz,5GHz",
|
|
23
|
+
})
|
|
24
|
+
radio = device.WiFi.Radio[1]
|
|
25
|
+
radio.Channel # 36
|
|
26
|
+
radio.SupportedFrequencyBands # ['2.4GHz', '5GHz']
|
|
27
|
+
device.problems() # [] : every value is within the model's constraints
|
|
28
|
+
device.flatten() # back to path and text pairs
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
The [models guide](models.md) covers construction, validation, tables,
|
|
32
|
+
vendor parameters and the service models.
|
|
33
|
+
|
|
34
|
+
## Resolve and validate paths without generated code
|
|
35
|
+
|
|
36
|
+
```python
|
|
37
|
+
from bbfmodels.parser import parse_file
|
|
38
|
+
from bbfmodels.schema import Schema
|
|
39
|
+
from bbfmodels.sources import fetch
|
|
40
|
+
|
|
41
|
+
schema = Schema.from_documents(parse_file(fetch("tr-181-2-21-0-cwmp-full.xml")))
|
|
42
|
+
r = schema.resolve("Device.WiFi.Radio.2.Channel")
|
|
43
|
+
r.schema_path # 'Device.WiFi.Radio.{i}.Channel'
|
|
44
|
+
r.parameter.syntax.facets.ranges # (Range(min_inclusive=1, max_inclusive=255, step=None),)
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
The [runtime guide](runtime.md) covers the schema, the data tree and the
|
|
48
|
+
codec.
|
|
49
|
+
|
|
50
|
+
## Generate models for a vendor's document
|
|
51
|
+
|
|
52
|
+
```sh
|
|
53
|
+
bbfmodels generate vendor-datamodel.xml --package acme.gateway --root src
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
The [vendor models guide](vendor-models.md) walks through a real vendor
|
|
57
|
+
document from the Forum's XML to typed access to its `X_` extensions.
|