DLMS-SPODES 0.86.9__tar.gz → 0.86.11__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.
- {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/PKG-INFO +3 -2
- {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/pyproject.toml +11 -5
- {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/cosem_interface_classes/collection.py +19 -10
- {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/cosem_interface_classes/ln_pattern.py +155 -66
- {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/cosem_interface_classes/parameter.py +0 -1
- dlms_spodes-0.86.11/src/DLMS_SPODES/cosem_interface_classes/parameters.py +18 -0
- {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/pardata.py +1 -1
- {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES.egg-info/PKG-INFO +3 -2
- {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES.egg-info/SOURCES.txt +2 -0
- {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES.egg-info/requires.txt +1 -1
- {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/test/test_LNPatterns.py +6 -6
- dlms_spodes-0.86.11/test/test_pars.py +11 -0
- {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/.gitignore +0 -0
- {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/README.md +0 -0
- {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/config.toml +0 -0
- {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/setup.cfg +0 -0
- {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/Values/EN/__init__.py +0 -0
- {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/Values/EN/actors.py +0 -0
- {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/Values/EN/relation_to_obis_names.py +0 -0
- {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/Values/RU/__init__.py +0 -0
- {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/Values/RU/actors.py +0 -0
- {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/Values/RU/relation_to_obis_names.py +0 -0
- {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/Values/__init__.py +0 -0
- {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/__init__.py +0 -0
- {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/configEN.ini +0 -0
- {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/config_parser.py +0 -0
- {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/cosem_interface_classes/__class_init__.py +0 -0
- {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/cosem_interface_classes/__init__.py +0 -0
- {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/cosem_interface_classes/a_parameter.py +0 -0
- {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/cosem_interface_classes/activity_calendar.py +0 -0
- {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/cosem_interface_classes/arbitrator.py +0 -0
- {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/cosem_interface_classes/association_ln/__init__.py +0 -0
- {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/cosem_interface_classes/association_ln/abstract.py +0 -0
- {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/cosem_interface_classes/association_ln/authentication_mechanism_name.py +0 -0
- {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/cosem_interface_classes/association_ln/mechanism_id.py +0 -0
- {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/cosem_interface_classes/association_ln/method.py +0 -0
- {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/cosem_interface_classes/association_ln/ver0.py +0 -0
- {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/cosem_interface_classes/association_ln/ver1.py +0 -0
- {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/cosem_interface_classes/association_ln/ver2.py +0 -0
- {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/cosem_interface_classes/association_ln/ver3.py +0 -0
- {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/cosem_interface_classes/association_sn/__init__.py +0 -0
- {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/cosem_interface_classes/association_sn/ver0.py +0 -0
- {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/cosem_interface_classes/attr_indexes.py +0 -0
- {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/cosem_interface_classes/clock.py +0 -0
- {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/cosem_interface_classes/cosem_interface_class.py +0 -0
- {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/cosem_interface_classes/data.py +0 -0
- {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/cosem_interface_classes/demand_register/__init__.py +0 -0
- {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/cosem_interface_classes/demand_register/ver0.py +0 -0
- {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/cosem_interface_classes/disconnect_control.py +0 -0
- {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/cosem_interface_classes/extended_register.py +0 -0
- {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/cosem_interface_classes/gprs_modem_setup.py +0 -0
- {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/cosem_interface_classes/gsm_diagnostic/__init__.py +0 -0
- {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/cosem_interface_classes/gsm_diagnostic/ver0.py +0 -0
- {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/cosem_interface_classes/gsm_diagnostic/ver1.py +0 -0
- {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/cosem_interface_classes/gsm_diagnostic/ver2.py +0 -0
- {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/cosem_interface_classes/iec_hdlc_setup/__init__.py +0 -0
- {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/cosem_interface_classes/iec_hdlc_setup/ver0.py +0 -0
- {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/cosem_interface_classes/iec_hdlc_setup/ver1.py +0 -0
- {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/cosem_interface_classes/iec_local_port_setup.py +0 -0
- {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/cosem_interface_classes/image_transfer/__init__.py +0 -0
- {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/cosem_interface_classes/image_transfer/image_transfer_status.py +0 -0
- {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/cosem_interface_classes/image_transfer/ver0.py +0 -0
- {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/cosem_interface_classes/implementations/__init__.py +0 -0
- {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/cosem_interface_classes/implementations/arbitrator.py +0 -0
- {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/cosem_interface_classes/implementations/data.py +0 -0
- {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/cosem_interface_classes/implementations/profile_generic.py +0 -0
- {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/cosem_interface_classes/ipv4_setup.py +0 -0
- {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/cosem_interface_classes/limiter.py +0 -0
- {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/cosem_interface_classes/modem_configuration/__init__.py +0 -0
- {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/cosem_interface_classes/modem_configuration/ver0.py +0 -0
- {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/cosem_interface_classes/modem_configuration/ver1.py +0 -0
- {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/cosem_interface_classes/ntp_setup/__init__.py +0 -0
- {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/cosem_interface_classes/ntp_setup/ver0.py +0 -0
- {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/cosem_interface_classes/obis.py +0 -0
- {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/cosem_interface_classes/overview.py +0 -0
- {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/cosem_interface_classes/profile_generic/__init__.py +0 -0
- {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/cosem_interface_classes/profile_generic/ver0.py +0 -0
- {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/cosem_interface_classes/profile_generic/ver1.py +0 -0
- {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/cosem_interface_classes/push_setup/__init__.py +0 -0
- {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/cosem_interface_classes/push_setup/ver0.py +0 -0
- {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/cosem_interface_classes/push_setup/ver1.py +0 -0
- {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/cosem_interface_classes/push_setup/ver2.py +0 -0
- {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/cosem_interface_classes/register.py +0 -0
- {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/cosem_interface_classes/register_activation/__init__.py +0 -0
- {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/cosem_interface_classes/register_activation/ver0.py +0 -0
- {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/cosem_interface_classes/register_monitor.py +0 -0
- {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/cosem_interface_classes/reports.py +0 -0
- {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/cosem_interface_classes/schedule.py +0 -0
- {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/cosem_interface_classes/script_table.py +0 -0
- {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/cosem_interface_classes/security_setup/__init__.py +0 -0
- {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/cosem_interface_classes/security_setup/__pycache__/__init__.cpython-311.pyc +0 -0
- {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/cosem_interface_classes/security_setup/ver0.py +0 -0
- {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/cosem_interface_classes/security_setup/ver1.py +0 -0
- {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/cosem_interface_classes/single_action_schedule.py +0 -0
- {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/cosem_interface_classes/special_days_table.py +0 -0
- {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/cosem_interface_classes/tcp_udp_setup.py +0 -0
- {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/cosem_pdu.py +0 -0
- {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/enums.py +0 -0
- {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/exceptions.py +0 -0
- {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/firmwares.py +0 -0
- {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/hdlc/__init__.py +0 -0
- {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/hdlc/frame.py +0 -0
- {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/hdlc/sub_layer.py +0 -0
- {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/literals.py +0 -0
- {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/obis/__init__.py +0 -0
- {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/obis/abstract_objects.py +0 -0
- {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/obis/media_id.py +0 -0
- {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/pdu_enums.py +0 -0
- {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/py.typed +0 -0
- {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/relation_to_OBIS.py +0 -0
- {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/settings.py +0 -0
- {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/types/__init__.py +0 -0
- {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/types/choices.py +0 -0
- {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/types/common_data_types.py +0 -0
- {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/types/cosem_service_types.py +0 -0
- {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/types/implementations/__init__.py +0 -0
- {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/types/implementations/arrays.py +0 -0
- {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/types/implementations/bitstrings.py +0 -0
- {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/types/implementations/double_long_usingneds.py +0 -0
- {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/types/implementations/enums.py +0 -0
- {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/types/implementations/integers.py +0 -0
- {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/types/implementations/long_unsigneds.py +0 -0
- {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/types/implementations/octet_string.py +0 -0
- {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/types/implementations/structs.py +0 -0
- {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/types/useful_types.py +0 -0
- {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES.egg-info/dependency_links.txt +0 -0
- {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES.egg-info/top_level.txt +0 -0
- {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/__init__.py +0 -0
- {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/test/__init__.py +0 -0
- {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/test/collection_init.py +0 -0
- {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/test/config.toml +0 -0
- {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/test/config.zip +0 -0
- {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/test/init_collection.py +0 -0
- {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/test/test.typ +0 -0
- {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/test/test.xml +0 -0
- {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/test/test_ActivityCalendar.py +0 -0
- {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/test/test_AssociationLN.py +0 -0
- {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/test/test_COSEMInterfaceClass.py +0 -0
- {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/test/test_Data.py +0 -0
- {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/test/test_DemandRegister.py +0 -0
- {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/test/test_DisconnectControl.py +0 -0
- {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/test/test_DisplayReadoutProfile.py +0 -0
- {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/test/test_GSMDiagnostic.py +0 -0
- {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/test/test_IC.py +0 -0
- {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/test/test_ImageTransfer.py +0 -0
- {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/test/test_KPZ.py +0 -0
- {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/test/test_Limiter.py +0 -0
- {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/test/test_NTPSetup.py +0 -0
- {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/test/test_Parameter.py +0 -0
- {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/test/test_ProfileGeneric.py +0 -0
- {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/test/test_Register.py +0 -0
- {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/test/test_RegisterActivation.py +0 -0
- {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/test/test_RegisterMonitor.py +0 -0
- {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/test/test_ScalerUnitType.py +0 -0
- {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/test/test_Schedule.py +0 -0
- {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/test/test_Structures.py +0 -0
- {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/test/test_a_param.py +0 -0
- {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/test/test_benchmark_create_obj.py +0 -0
- {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/test/test_cdt.py +0 -0
- {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/test/test_collection.py +0 -0
- {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/test/test_config.py +0 -0
- {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/test/test_electric_obj.py +0 -0
- {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/test/test_enums.py +0 -0
- {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/test/test_hdlc.py +0 -0
- {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/test/test_overview.py +0 -0
- {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/test/test_report.py +0 -0
- {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/test/test_save_type.typ +0 -0
- {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/test/test_settings.py +0 -0
- {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/test/test_to_xml.xml +0 -0
- {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/test/test_to_xml2.xml +0 -0
- {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/test/test_to_xml3.xml +0 -0
- {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/test/test_to_xml4.xml +0 -0
- {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/test/test_userfulType.py +0 -0
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: DLMS_SPODES
|
|
3
|
-
Version: 0.86.
|
|
3
|
+
Version: 0.86.11
|
|
4
4
|
Summary: dlms-spodes
|
|
5
5
|
Author-email: Serj Kotilevski <youserj@outlook.com>
|
|
6
|
+
Project-URL: Source, https://github.com/youserj/DlmsSPODES-project
|
|
6
7
|
Keywords: dlms
|
|
7
8
|
Classifier: Programming Language :: Python :: 3
|
|
8
9
|
Classifier: License :: OSI Approved :: MIT License
|
|
@@ -13,7 +14,7 @@ Requires-Dist: pydantic>=2.11
|
|
|
13
14
|
Requires-Dist: cryptography>=45.0
|
|
14
15
|
Requires-Dist: semver>=3.0
|
|
15
16
|
Requires-Dist: typing-extensions>=4.12.2
|
|
16
|
-
Requires-Dist: StructResult>=0.
|
|
17
|
+
Requires-Dist: StructResult>=0.8.0
|
|
17
18
|
Provides-Extra: dev
|
|
18
19
|
Requires-Dist: mypy>=1.5.0; extra == "dev"
|
|
19
20
|
Requires-Dist: ruff>=0.11; extra == "dev"
|
|
@@ -1,18 +1,20 @@
|
|
|
1
1
|
[build-system]
|
|
2
2
|
requires = [
|
|
3
3
|
"setuptools",
|
|
4
|
-
"setuptools-scm"
|
|
4
|
+
"setuptools-scm"
|
|
5
|
+
]
|
|
5
6
|
build-backend = "setuptools.build_meta"
|
|
6
7
|
|
|
7
|
-
|
|
8
|
-
|
|
8
|
+
[tool.setuptools]
|
|
9
|
+
license-files = []
|
|
10
|
+
|
|
9
11
|
[tool.setuptools.packages.find]
|
|
10
12
|
where = ["src"]
|
|
11
13
|
exclude = ["test","KPZ"]
|
|
12
14
|
|
|
13
15
|
[project]
|
|
14
16
|
name = "DLMS_SPODES"
|
|
15
|
-
version = "0.86.
|
|
17
|
+
version = "0.86.11"
|
|
16
18
|
authors = [
|
|
17
19
|
{name="Serj Kotilevski", email="youserj@outlook.com"}
|
|
18
20
|
]
|
|
@@ -21,7 +23,7 @@ dependencies = [
|
|
|
21
23
|
"cryptography>=45.0",
|
|
22
24
|
"semver>=3.0",
|
|
23
25
|
"typing-extensions>=4.12.2", # remove for 3.13(use for @deprecated)
|
|
24
|
-
"StructResult>=0.
|
|
26
|
+
"StructResult>=0.8.0"
|
|
25
27
|
]
|
|
26
28
|
description="dlms-spodes"
|
|
27
29
|
readme = "README.md"
|
|
@@ -33,6 +35,10 @@ classifiers = [
|
|
|
33
35
|
"Operating System :: OS Independent",
|
|
34
36
|
]
|
|
35
37
|
|
|
38
|
+
[project.urls]
|
|
39
|
+
Source = "https://github.com/youserj/DlmsSPODES-project"
|
|
40
|
+
|
|
41
|
+
|
|
36
42
|
[project.optional-dependencies]
|
|
37
43
|
dev = [
|
|
38
44
|
"mypy>=1.5.0",
|
{dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/cosem_interface_classes/collection.py
RENAMED
|
@@ -522,8 +522,6 @@ __func_map_for_create.update({
|
|
|
522
522
|
(1, 0, 148, 136, 0): RegisterMap,
|
|
523
523
|
(1, 94, 7, 0): ProfileGenericMap.renew(1, impl.profile_generic.SPODES3CurrentProfile),
|
|
524
524
|
(1, 94, 7, (1, 2, 3, 4, 5, 6)): ProfileGenericMap.renew(1, impl.profile_generic.SPODES3ScalesProfile), # Todo: RU. Scaler-profile With 1 entry and more
|
|
525
|
-
# KPZ
|
|
526
|
-
(128, 0, tuple(range(20)), 0, 0): RegisterMap
|
|
527
525
|
})
|
|
528
526
|
|
|
529
527
|
func_maps["SPODES_3"] = get_func_map(__func_map_for_create)
|
|
@@ -537,6 +535,7 @@ __func_map_for_create.update({
|
|
|
537
535
|
(0, 128, 96, 13, 1): ClassMap({0: impl.data.ITEBitMap}),
|
|
538
536
|
(0, 128, 154, 0, 0): ClassMap({0: impl.data.KPZGSMPingIP}),
|
|
539
537
|
(0, 0, 128, (100, 101, 102, 103, 150, 151, 152, 170)): DataMap,
|
|
538
|
+
(128, 0, tuple(range(20)), 0, 0): RegisterMap
|
|
540
539
|
})
|
|
541
540
|
func_maps["KPZ"]: FUNC_MAP = get_func_map(__func_map_for_create)
|
|
542
541
|
# KPZ1 with bag in log event profiles
|
|
@@ -607,7 +606,7 @@ def get_filtered(objects: Iterable[InterfaceClass],
|
|
|
607
606
|
keys: ObjFilteredKey) -> list[InterfaceClass]:
|
|
608
607
|
c_ids: list[ut.CosemClassId] = list()
|
|
609
608
|
patterns: list[LNPattern] = list()
|
|
610
|
-
ch: Channel
|
|
609
|
+
ch: Optional[Channel] = None
|
|
611
610
|
for k in keys:
|
|
612
611
|
if isinstance(k, ut.CosemClassId):
|
|
613
612
|
c_ids.append(k)
|
|
@@ -680,7 +679,7 @@ class Collection:
|
|
|
680
679
|
self.__country_ver = cntr_ver
|
|
681
680
|
"""country version specification"""
|
|
682
681
|
self.spec_map = "DLMS_6"
|
|
683
|
-
self.__objs =
|
|
682
|
+
self.__objs = {}
|
|
684
683
|
""" all DLMS objects container with obis key """
|
|
685
684
|
|
|
686
685
|
@property
|
|
@@ -1128,6 +1127,19 @@ class Collection:
|
|
|
1128
1127
|
res.append_err(e)
|
|
1129
1128
|
return res
|
|
1130
1129
|
|
|
1130
|
+
def iter_classID_objects(self,
|
|
1131
|
+
class_id: ut.CosemClassId) -> Iterator[InterfaceClass]:
|
|
1132
|
+
return (obj for obj in self.__objs.values() if obj.CLASS_ID == value)
|
|
1133
|
+
|
|
1134
|
+
def LNPattern2objects(self,
|
|
1135
|
+
pat: LNPattern) -> list[InterfaceClass]:
|
|
1136
|
+
ret = []
|
|
1137
|
+
for obj in self.__objs.values():
|
|
1138
|
+
if obj.logical_name in pat:
|
|
1139
|
+
ret.append(obj)
|
|
1140
|
+
return ret
|
|
1141
|
+
|
|
1142
|
+
|
|
1131
1143
|
def get_attr(self, value: ut.CosemAttributeDescriptor) -> cdt.CommonDataTypes:
|
|
1132
1144
|
"""attribute value from descriptor"""
|
|
1133
1145
|
return self.__get_object(value.instance_id.contents).get_attr(int(value.attribute_id))
|
|
@@ -1142,17 +1154,14 @@ class Collection:
|
|
|
1142
1154
|
else:
|
|
1143
1155
|
raise exc.NoObject(F"not found at least one DLMS Objects from collection with {values=}")
|
|
1144
1156
|
|
|
1157
|
+
@deprecated("use <iter_classID_objects>")
|
|
1145
1158
|
def get_objects_by_class_id(self, value: ut.CosemClassId) -> list[InterfaceClass]:
|
|
1146
1159
|
return list(filter(lambda obj: obj.CLASS_ID == value, self.__objs.values()))
|
|
1147
1160
|
|
|
1148
|
-
def get_objects_descriptions(self) -> list[tuple[cst.LogicalName, cdt.LongUnsigned, cdt.Unsigned]]:
|
|
1149
|
-
""" return container of objects for get device clone """
|
|
1150
|
-
return list(map(lambda obj: (obj.logical_name, obj.CLASS_ID, obj.VERSION), self.__objs.values()))
|
|
1151
|
-
|
|
1152
1161
|
def get_writable_attr(self) -> UsedAttributes:
|
|
1153
1162
|
"""return all writable {obj.ln: {attribute_index}}"""
|
|
1154
1163
|
ret: UsedAttributes = dict()
|
|
1155
|
-
for ass in self.
|
|
1164
|
+
for ass in self.iter_classID_objects(ClassID.ASSOCIATION_LN):
|
|
1156
1165
|
if (
|
|
1157
1166
|
ass.logical_name.e == 0
|
|
1158
1167
|
or ass.object_list is None
|
|
@@ -1352,7 +1361,7 @@ class Collection:
|
|
|
1352
1361
|
raise ValueError(F"absent association with {client_sap}")
|
|
1353
1362
|
|
|
1354
1363
|
def sap2association(self, sap: enums.ClientSAP) -> AssociationLN:
|
|
1355
|
-
for ass in
|
|
1364
|
+
for ass in self.iter_classID_objects(ClassID.ASSOCIATION_LN):
|
|
1356
1365
|
if (
|
|
1357
1366
|
ass.associated_partners_id is not None
|
|
1358
1367
|
and ass.associated_partners_id.client_SAP == sap
|
{dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/cosem_interface_classes/ln_pattern.py
RENAMED
|
@@ -1,48 +1,87 @@
|
|
|
1
1
|
from dataclasses import dataclass
|
|
2
2
|
from typing import Self, Literal
|
|
3
3
|
from ..types import cst
|
|
4
|
+
from copy import copy
|
|
4
5
|
|
|
5
|
-
SKIP =
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
6
|
+
SKIP: int = 0
|
|
7
|
+
RANGE256 = set(range(256))
|
|
8
|
+
RANGE64 = bytes(range(64))
|
|
9
|
+
RANGE64_WITH_LENGTH = b'\x40' + RANGE64
|
|
9
10
|
|
|
10
11
|
|
|
11
|
-
@dataclass
|
|
12
|
+
@dataclass(frozen=True, slots=True)
|
|
12
13
|
class LNPattern:
|
|
13
|
-
"""pattern for use in get_filtered.
|
|
14
|
-
value "x.x.x.x.x.x" where x is:
|
|
15
|
-
0..255 - simple value
|
|
16
|
-
a,b,c,d,e,f - for skip value in each group
|
|
17
|
-
(y, z, ...) - set of simple values(y or z)
|
|
18
|
-
((y-z), ...) - set of simple values with range(from y to z)
|
|
19
|
-
!() - as () but, set of exclude values
|
|
20
|
-
example: "a.0.(1,2,3).(0-64).0.f"
|
|
21
14
|
"""
|
|
22
|
-
|
|
15
|
+
LNPattern ::= SEQUENCE (SIZE (6)) OF GroupPattern
|
|
16
|
+
|
|
17
|
+
GroupPattern ::= CHOICE {
|
|
18
|
+
skip [0] NULL, -- SKIP marker
|
|
19
|
+
single [1] INTEGER (0..255), -- single value
|
|
20
|
+
multiple [2] SEQUENCE OF INTEGER (0..255) -- set of values
|
|
21
|
+
}
|
|
22
|
+
LNPattern Binary Encoding Specification:
|
|
23
|
+
---------------------------------------
|
|
24
|
+
A compact tag-less binary format for storing 6 OBIS-like groups.
|
|
25
|
+
|
|
26
|
+
Structure:
|
|
27
|
+
[L1][V1][L2][V2]...[L6][V6]
|
|
28
|
+
where:
|
|
29
|
+
- Ln: 1-byte length prefix for group n (0-255)
|
|
30
|
+
- Vn: Value bytes (interpretation depends on Ln)
|
|
23
31
|
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
32
|
+
Length Semantics:
|
|
33
|
+
- L=0 : SKIP group (no value bytes follow)
|
|
34
|
+
- L=1 : Single value (V is 1-byte integer 0-255)
|
|
35
|
+
- L=2..255 : Value set (V contains L bytes as possible values)
|
|
36
|
+
|
|
37
|
+
Special Cases:
|
|
38
|
+
- Group 'b' (index 1) when marked SKIP uses predefined RANGE64 (0-64)
|
|
39
|
+
- Empty exclusion sets "!()" are prohibited
|
|
40
|
+
|
|
41
|
+
Example:
|
|
42
|
+
Pattern "a.1.(2-5).!().0.f" encodes as:
|
|
43
|
+
[00][01][01][04][02][03][04][05][00][01][00][00]
|
|
44
|
+
(SKIP|1|{2,3,4,5}|SKIP|0|SKIP)
|
|
45
|
+
|
|
46
|
+
Properties:
|
|
47
|
+
- Fixed overhead: 6 bytes (1 length byte per group)
|
|
48
|
+
- Max size: 6 + 255*6 = 1536 bytes
|
|
49
|
+
- Order-preserving
|
|
50
|
+
- Comparison-friendly memory layout
|
|
51
|
+
"""
|
|
52
|
+
buffer: bytes
|
|
27
53
|
|
|
28
54
|
@classmethod
|
|
29
55
|
def parse(cls, value: str) -> Self:
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
):
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
56
|
+
buffer = bytearray()
|
|
57
|
+
parts = value.split('.', maxsplit=5)
|
|
58
|
+
if len(parts) != 6:
|
|
59
|
+
raise ValueError(f"got {len(parts)} elements, expected 6")
|
|
60
|
+
for i, val in enumerate(parts):
|
|
61
|
+
if val.isdigit():
|
|
62
|
+
num = int(val)
|
|
63
|
+
if 0 <= num <= 255:
|
|
64
|
+
buffer.extend((1, num))
|
|
65
|
+
continue
|
|
66
|
+
raise ValueError(f"Value {val} out of range 0-255")
|
|
67
|
+
if len(val) == 1:
|
|
68
|
+
if val == "x":
|
|
69
|
+
buffer.append(SKIP)
|
|
70
|
+
continue
|
|
71
|
+
elif (
|
|
72
|
+
i == 1
|
|
73
|
+
and val == "b"
|
|
74
|
+
):
|
|
75
|
+
buffer.extend(RANGE64_WITH_LENGTH)
|
|
39
76
|
continue
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
77
|
+
elif ord(val) == i + 97:
|
|
78
|
+
buffer.append(SKIP)
|
|
79
|
+
continue
|
|
80
|
+
if val == "":
|
|
81
|
+
buffer.append(SKIP)
|
|
82
|
+
continue
|
|
83
|
+
if val[0]=='(' and val[-1]==')':
|
|
84
|
+
el = set()
|
|
46
85
|
val = val.replace('(', "").replace(')', "")
|
|
47
86
|
for j in val.split(","):
|
|
48
87
|
j = j.replace(" ", '')
|
|
@@ -53,12 +92,16 @@ class LNPattern:
|
|
|
53
92
|
start, end = j.split("-")
|
|
54
93
|
el.update(range(
|
|
55
94
|
cls.__simple_validate(start),
|
|
56
|
-
cls.__simple_validate(end)+1))
|
|
95
|
+
cls.__simple_validate(end) + 1))
|
|
57
96
|
case err:
|
|
58
97
|
raise ValueError(F"got a lot of <-> in pattern: {value}, expected one")
|
|
59
|
-
values
|
|
60
|
-
|
|
61
|
-
|
|
98
|
+
# values = bytes(el)
|
|
99
|
+
# buffer.extend([len(values)] + list(values))
|
|
100
|
+
buffer.append(len(el))
|
|
101
|
+
buffer.extend(el)
|
|
102
|
+
continue
|
|
103
|
+
if val.startswith('!(') and val.endswith(')'):
|
|
104
|
+
el = copy(RANGE256)
|
|
62
105
|
val = val.replace('!(', "").replace(')', "")
|
|
63
106
|
for j in val.split(","):
|
|
64
107
|
j = j.replace(" ", '')
|
|
@@ -69,15 +112,18 @@ class LNPattern:
|
|
|
69
112
|
start, end = j.split("-")
|
|
70
113
|
el.difference_update(range(
|
|
71
114
|
cls.__simple_validate(start),
|
|
72
|
-
cls.__simple_validate(end)+1))
|
|
115
|
+
cls.__simple_validate(end) + 1))
|
|
73
116
|
case err:
|
|
74
117
|
raise ValueError(F"got a lot of <-> in pattern: {value}, expected one")
|
|
75
|
-
if len(el)
|
|
76
|
-
raise ValueError(F"no one element in group: {chr(97+i)}")
|
|
77
|
-
values
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
118
|
+
if len(el)==0:
|
|
119
|
+
raise ValueError(F"no one element in group: {chr(97 + i)}")
|
|
120
|
+
# values = bytes(el)
|
|
121
|
+
# buffer.extend([len(values)] + list(values))
|
|
122
|
+
buffer.append(len(el))
|
|
123
|
+
buffer.extend(el)
|
|
124
|
+
continue
|
|
125
|
+
raise ValueError(f"Invalid pattern: {val}")
|
|
126
|
+
return cls(bytes(buffer))
|
|
81
127
|
|
|
82
128
|
@staticmethod
|
|
83
129
|
def __simple_validate(value: str) -> int:
|
|
@@ -86,26 +132,66 @@ class LNPattern:
|
|
|
86
132
|
else:
|
|
87
133
|
raise ValueError(F"got not valid element: {value} in pattern, expected 0..255")
|
|
88
134
|
|
|
89
|
-
def
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
for i, j in zip(self.__values, other):
|
|
96
|
-
if i == j or (i == -1):
|
|
97
|
-
continue
|
|
98
|
-
elif isinstance(i, set) and j in i:
|
|
135
|
+
def __eq__(self, other: "LNPattern") -> bool:
|
|
136
|
+
ptr = 0
|
|
137
|
+
for i in range(6):
|
|
138
|
+
length = self.buffer[ptr]
|
|
139
|
+
ptr += 1
|
|
140
|
+
if length == 0: # SKIP
|
|
99
141
|
continue
|
|
100
|
-
|
|
101
|
-
|
|
142
|
+
other_byte = other.contents[i]
|
|
143
|
+
if length == 1: # Single byte
|
|
144
|
+
if self.buffer[ptr]!=other_byte:
|
|
145
|
+
return False
|
|
146
|
+
else: # Multiple bytes
|
|
147
|
+
if other_byte not in self.buffer[ptr:ptr + length]:
|
|
148
|
+
return False
|
|
149
|
+
ptr += length
|
|
102
150
|
return True
|
|
103
151
|
|
|
104
|
-
|
|
105
|
-
|
|
152
|
+
@staticmethod
|
|
153
|
+
def _format_ranges(values: list[int]) -> str:
|
|
154
|
+
if not values:
|
|
155
|
+
return "!()"
|
|
156
|
+
ranges = []
|
|
157
|
+
start = end = values[0]
|
|
158
|
+
for num in values[1:]:
|
|
159
|
+
if num==end + 1:
|
|
160
|
+
end = num
|
|
161
|
+
else:
|
|
162
|
+
ranges.append((start, end))
|
|
163
|
+
start = end = num
|
|
164
|
+
ranges.append((start, end))
|
|
165
|
+
parts = []
|
|
166
|
+
for start, end in ranges:
|
|
167
|
+
if start==end:
|
|
168
|
+
parts.append(str(start))
|
|
169
|
+
elif end==start + 1: # Диапазон из 2 чисел
|
|
170
|
+
parts.extend([str(start), str(end)])
|
|
171
|
+
else:
|
|
172
|
+
parts.append(f"{start}-{end}")
|
|
173
|
+
if len(parts) > 3 and len(values) > 128: # Эмпирический порог
|
|
174
|
+
all_values = set(range(256))
|
|
175
|
+
excluded = sorted(all_values - set(values))
|
|
176
|
+
if len(excluded) < len(values):
|
|
177
|
+
return f"!({','.join(self._format_ranges(excluded))})"
|
|
178
|
+
return f"({','.join(parts)})"
|
|
106
179
|
|
|
107
|
-
def
|
|
108
|
-
|
|
180
|
+
def __str__(self) -> str:
|
|
181
|
+
parts = []
|
|
182
|
+
ptr = 0
|
|
183
|
+
for _ in range(6):
|
|
184
|
+
length = self.buffer[ptr]
|
|
185
|
+
ptr += 1
|
|
186
|
+
if length == 0:
|
|
187
|
+
parts.append("x")
|
|
188
|
+
elif length == 1:
|
|
189
|
+
parts.append(str(self.buffer[ptr]))
|
|
190
|
+
else:
|
|
191
|
+
values = sorted(set(self.buffer[ptr:ptr + length]))
|
|
192
|
+
parts.append(self._format_ranges(values))
|
|
193
|
+
ptr += length
|
|
194
|
+
return ".".join(parts)
|
|
109
195
|
|
|
110
196
|
|
|
111
197
|
@dataclass
|
|
@@ -115,14 +201,17 @@ class LNPatterns:
|
|
|
115
201
|
def __iter__(self):
|
|
116
202
|
return iter(self.value)
|
|
117
203
|
|
|
204
|
+
def __str__(self) -> str:
|
|
205
|
+
return f"[{" | ".join(map(str, self.value))}]"
|
|
206
|
+
|
|
118
207
|
|
|
119
|
-
ABSTRACT = LNPattern.parse("0")
|
|
120
|
-
ELECTRICITY = LNPattern.parse("1")
|
|
121
|
-
HCA = LNPattern.parse("4")
|
|
122
|
-
THERMAL = LNPattern.parse("(5,6)")
|
|
123
|
-
GAS = LNPattern.parse("7")
|
|
124
|
-
WATER = LNPattern.parse("(8,9)")
|
|
125
|
-
OTHER_MEDIA = LNPattern.parse("15")
|
|
208
|
+
ABSTRACT = LNPattern.parse("0.....")
|
|
209
|
+
ELECTRICITY = LNPattern.parse("1.....")
|
|
210
|
+
HCA = LNPattern.parse("4.....")
|
|
211
|
+
THERMAL = LNPattern.parse("(5,6).....")
|
|
212
|
+
GAS = LNPattern.parse("7.....")
|
|
213
|
+
WATER = LNPattern.parse("(8,9).....")
|
|
214
|
+
OTHER_MEDIA = LNPattern.parse("15.....")
|
|
126
215
|
|
|
127
216
|
|
|
128
217
|
BILLING_PERIOD_VALUES_RESET_COUNTER_ENTRIES = LNPatterns((
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
from typing import Protocol, ClassVar
|
|
2
|
+
from functools import cached_property
|
|
3
|
+
from .parameter import Parameter
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class Base(Protocol):
|
|
7
|
+
OBIS: ClassVar[Parameter]
|
|
8
|
+
|
|
9
|
+
@cached_property
|
|
10
|
+
def LN(self) -> Parameter:
|
|
11
|
+
return self.OBIS.set_i(1)
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class Data(Base, Protocol):
|
|
15
|
+
|
|
16
|
+
@cached_property
|
|
17
|
+
def VALUE(self) -> Parameter:
|
|
18
|
+
return self.OBIS.set_i(2)
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: DLMS_SPODES
|
|
3
|
-
Version: 0.86.
|
|
3
|
+
Version: 0.86.11
|
|
4
4
|
Summary: dlms-spodes
|
|
5
5
|
Author-email: Serj Kotilevski <youserj@outlook.com>
|
|
6
|
+
Project-URL: Source, https://github.com/youserj/DlmsSPODES-project
|
|
6
7
|
Keywords: dlms
|
|
7
8
|
Classifier: Programming Language :: Python :: 3
|
|
8
9
|
Classifier: License :: OSI Approved :: MIT License
|
|
@@ -13,7 +14,7 @@ Requires-Dist: pydantic>=2.11
|
|
|
13
14
|
Requires-Dist: cryptography>=45.0
|
|
14
15
|
Requires-Dist: semver>=3.0
|
|
15
16
|
Requires-Dist: typing-extensions>=4.12.2
|
|
16
|
-
Requires-Dist: StructResult>=0.
|
|
17
|
+
Requires-Dist: StructResult>=0.8.0
|
|
17
18
|
Provides-Extra: dev
|
|
18
19
|
Requires-Dist: mypy>=1.5.0; extra == "dev"
|
|
19
20
|
Requires-Dist: ruff>=0.11; extra == "dev"
|
|
@@ -48,6 +48,7 @@ src/DLMS_SPODES/cosem_interface_classes/ln_pattern.py
|
|
|
48
48
|
src/DLMS_SPODES/cosem_interface_classes/obis.py
|
|
49
49
|
src/DLMS_SPODES/cosem_interface_classes/overview.py
|
|
50
50
|
src/DLMS_SPODES/cosem_interface_classes/parameter.py
|
|
51
|
+
src/DLMS_SPODES/cosem_interface_classes/parameters.py
|
|
51
52
|
src/DLMS_SPODES/cosem_interface_classes/register.py
|
|
52
53
|
src/DLMS_SPODES/cosem_interface_classes/register_monitor.py
|
|
53
54
|
src/DLMS_SPODES/cosem_interface_classes/reports.py
|
|
@@ -159,6 +160,7 @@ test/test_electric_obj.py
|
|
|
159
160
|
test/test_enums.py
|
|
160
161
|
test/test_hdlc.py
|
|
161
162
|
test/test_overview.py
|
|
163
|
+
test/test_pars.py
|
|
162
164
|
test/test_report.py
|
|
163
165
|
test/test_save_type.typ
|
|
164
166
|
test/test_settings.py
|
|
@@ -11,19 +11,19 @@ from src.DLMS_SPODES.exceptions import NeedUpdate, NoObject
|
|
|
11
11
|
|
|
12
12
|
|
|
13
13
|
class TestType(unittest.TestCase):
|
|
14
|
+
def setUp(self):
|
|
15
|
+
self.pattern = ln_pattern.LNPattern.parse("0.b.0.(1-5, 7-8).0.255")
|
|
14
16
|
|
|
15
17
|
@staticmethod
|
|
16
18
|
def get_pattern():
|
|
17
19
|
return ln_pattern.LNPattern.parse("0.b.0.1.0.255")
|
|
18
20
|
|
|
19
21
|
def test_create(self):
|
|
20
|
-
|
|
21
|
-
print(p)
|
|
22
|
+
print(self.pattern)
|
|
22
23
|
|
|
23
24
|
def test_equal(self):
|
|
24
|
-
|
|
25
|
-
self.
|
|
26
|
-
self.assertNotEqual(p, cst.LogicalName.from_obis("1.0.0.1.0.255"))
|
|
25
|
+
self.assertEqual(self.pattern, cst.LogicalName.from_obis("0.2.0.1.0.255"))
|
|
26
|
+
self.assertNotEqual(self.pattern, cst.LogicalName.from_obis("1.0.0.1.0.255"))
|
|
27
27
|
|
|
28
28
|
def test_country(self):
|
|
29
29
|
print(ln_pattern.COUNTRY_SPECIFIC_IDENTIFIERS)
|
|
@@ -34,4 +34,4 @@ class TestType(unittest.TestCase):
|
|
|
34
34
|
|
|
35
35
|
def test_convert(self):
|
|
36
36
|
clock_pat = ln_pattern.CLOCK
|
|
37
|
-
print(clock_pat)
|
|
37
|
+
print(clock_pat)
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import unittest
|
|
2
|
+
from src.DLMS_SPODES.cosem_interface_classes.parameter import Parameter
|
|
3
|
+
from src.DLMS_SPODES.cosem_interface_classes import parameters as prs
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class TestType(unittest.TestCase):
|
|
7
|
+
def test_one(self):
|
|
8
|
+
class My(prs.Data):
|
|
9
|
+
OBIS = Parameter.parse("0.0.0.1.0.255")
|
|
10
|
+
|
|
11
|
+
print(My().LN)
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/Values/EN/relation_to_obis_names.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/Values/RU/relation_to_obis_names.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/cosem_interface_classes/__class_init__.py
RENAMED
|
File without changes
|
{dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/cosem_interface_classes/__init__.py
RENAMED
|
File without changes
|
{dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/cosem_interface_classes/a_parameter.py
RENAMED
|
File without changes
|
|
File without changes
|
{dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/cosem_interface_classes/arbitrator.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/cosem_interface_classes/attr_indexes.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|