Package: tinkerforge-async
TinkerforgeAsyncThis is a reimplementation of the Tinkerforge Python bindings (original Python bindings) using Python 3 asyncio. The original bindings used threads to manage the blocking operations. A much cleaner implementation is possible using theawaitsyntax from asyncio.Note: This API implementation is not an official Tinkerforge implementation. I am in no way affiliated with the Tinkerforge GmbH. Use at your own risk. If you find any bugs, please report them.The library is fully type-hinted.Supported Bricks/BrickletsBrickSupportedTestedCommentsMaster:heavy_check_mark::heavy_check_mark:BrickletSupportedTestedAmbient Light 2.0:heavy_check_mark::heavy_check_mark:Ambient Light 3.0:heavy_check_mark::heavy_check_mark:Analog In:heavy_check_mark::heavy_check_mark:Barometer:heavy_check_mark::heavy_check_mark:Barometer 2.0:heavy_check_mark::heavy_check_mark:Humidity:heavy_check_mark::heavy_check_mark:Humidity 2.0:heavy_check_mark::heavy_check_mark:Industrial Dual Analog In Bricklet 2.0:heavy_check_mark::heavy_check_mark:Industrial PTC:heavy_check_mark::heavy_check_mark:IO-4 2.0:heavy_check_mark::heavy_check_mark:IO-16:heavy_check_mark::heavy_check_mark:Moisture:heavy_check_mark::heavy_check_mark:Motion Detector 2.0:heavy_check_mark::heavy_check_mark:PTC Bricklet:heavy_check_mark::heavy_check_mark:PTC Bricklet 2.0:heavy_check_mark::heavy_check_mark:RS232 Bricklet 2.0:heavy_check_mark::heavy_check_mark:Segment Display 4x7 Bricklet:heavy_check_mark::heavy_check_mark:Segment Display 4x7 Bricklet 2.0:heavy_check_mark::heavy_check_mark:Temperature:heavy_check_mark::heavy_check_mark:Temperature 2.0:heavy_check_mark::heavy_check_mark:DocumentationThe documentation is currently work in progress. The full documentation will be moved tohttps://patrickbaus.github.io/tinkerforge_async/. Below you can
find the current state of the documentation. I use theNumpydocstyle for documentation andSphinxfor compiling it.SetupTo install the library in a virtual environment (always use venvs with every project):python3-mvenvenv# virtual environment, optionalsourceenv/bin/activate# only if the virtual environment is usedpipinstalltinkerforge-asyncChanges made to the APISome design choices of the original Tinkerforge API are overly complex. I therefore replaced them with a simpler and more intuitive approach. A list of things that were changed can be found below:Design ChangesOnly Python 3 is supported (3.7+)Replaced threads with an async event loopCompletely rewritten how responses from bricks/bricklets work. All setters now have aresponse_expectedparameter, which is set toTrueby default. If there is an error when calling the function, it will then raise an exception - either anAttributeErrorif the function is unknown, or aValueErrorif one or more parameters are invalid.Old style:bricklet=BrickletHumidity(UID,ipcon)bricklet.set_response_expected(BrickletHumidity.FUNCTION_SET_HUMIDITY_CALLBACK_PERIOD,True)bricklet.set_humidity_callback_period(1000)New style:bricklet=BrickletHumidity(UID,ipcon)awaitbricklet.set_humidity_callback_period(1000,response_expected=True)# Raises an exception if unsuccessfulReplaced all constants with Enums and enforced their use using assertions. This will allow beginners to spot their mistakes earlier and make the code more readable, including any debug output statements.Old style:classBrickletHumidity(Device):FUNCTION_GET_HUMIDITY=1FUNCTION_GET_ANALOG_VALUE=2FUNCTION_SET_HUMIDITY_CALLBACK_PERIOD=3FUNCTION_GET_HUMIDITY_CALLBACK_PERIOD=4FUNCTION_SET_ANALOG_VALUE_CALLBACK_PERIOD=5FUNCTION_GET_ANALOG_VALUE_CALLBACK_PERIOD=6FUNCTION_SET_HUMIDITY_CALLBACK_THRESHOLD=7FUNCTION_GET_HUMIDITY_CALLBACK_THRESHOLD=8FUNCTION_SET_ANALOG_VALUE_CALLBACK_THRESHOLD=9FUNCTION_GET_ANALOG_VALUE_CALLBACK_THRESHOLD=10FUNCTION_SET_DEBOUNCE_PERIOD=11FUNCTION_GET_DEBOUNCE_PERIOD=12FUNCTION_GET_IDENTITY=255New style:classBrickletHumidity(Device):@uniqueclassFunctionID(Enum):GET_HUMIDITY=1GET_ANALOG_VALUE=2SET_HUMIDITY_CALLBACK_PERIOD=3GET_HUMIDITY_CALLBACK_PERIOD=4SET_ANALOG_VALUE_CALLBACK_PERIOD=5GET_ANALOG_VALUE_CALLBACK_PERIOD=6SET_HUMIDITY_CALLBACK_THRESHOLD=7GET_HUMIDITY_CALLBACK_THRESHOLD=8SET_ANALOG_VALUE_CALLBACK_THRESHOLD=9GET_ANALOG_VALUE_CALLBACK_THRESHOLD=10SET_DEBOUNCE_PERIOD=11GET_DEBOUNCE_PERIOD=12Moved from base58 encoded uids to integers.Moved from callbacks to queues in order to keep users out of the callback hell. It makes the code style more readable when using theawaitsyntax anyway.Payloads will now be decoded by theDeviceobject and no longer by theip_connection. This makes the code a lot more readable. To do so, the payload and decoded header will be handed to the device. It will then decode it, if possible, and pass it on to the queue.If physical quantities are measured we will now return standard SI units, not some unexpected stuff like centi °C (Temperature Bricklet). To preserve the precision the Decimal package is used. The only exception to this rule is the use of °C for temperature. This is for convenience.All callbacks now contain a timestamp (Unix timestamp) and the device object.Example:Event(timestamp=1658756708.6839857, sender=Temperature Bricklet 2.0 with uid 161085 connected at IPConnectionAsync(192.168.1.164:4223), sid=0, function_id=CallbackID.TEMPERATURE, payload=305.46)Added the concept of secondary ids (sid). By default, the secondary id is0. If there is more than one sensor on the bricklet, they will have asidvalue of 1,2, etc. This is especially useful for sensors like theIndustrial Dual Analog In Bricklet 2.0, which returns its two channels via the same callback.New functions:BrickMaster.set_wpa_enterprise_username(username): Set the WPA enterprise username without callingBrickMaster.set_wifi_certificate(). Takes astringinstead of an array ofint.BrickMaster.set_wpa_enterprise_password(password): Set the WPA enterprise password without callingBrickMaster.set_wifi_certificate(). Takes astringinstead of an array ofint.BrickMaster.get_wpa_enterprise_username(): Get the WPA enterprise password without callingBrickMaster.get_wifi_certificate(). Also returns astringinstead of an array ofint.BrickMaster.get_wpa_enterprise_password(): Get the WPA enterprise password without callingBrickMaster.get_wifi_certificate(). Also returns astringinstead of an array ofint.IP ConnectionIPConnection.authenticate(secret): removed. This can now be done through connect()IPConnection.set_timeout/IPConnection.get_timeout: Replaced by a propertyIPConnection.register_callback(callback_id, function): Replaced byregister_event_queue()IPConnection.connect(host, port=4223, authentication_secret=''): Ifauthentication_secretis not empty, try to authenticate.IP ConnectionBrickletIO4V2.set_pwm_configuration()will now take the frequency in units of Hz and the duty cycle is normalized to 1, so it will take a float from [0...1].BrickletIO4V2.get_pwm_configuration()will return the frequency in units of HZ and the duty cycle is normalized to 1.Master BrickBrickMaster.set_wifi_configuration()/BrickMaster.get_wifi_configuration()will take/return all ips in natural orderBrickMaster.set_ethernet_configuration()/BrickMaster.get_ethernet_configuration()will take/return all ips in natural orderBrickMaster.write_wifi2_serial_port()will only accept abytestringand no length argument. The length will be automatically determined from the string.BrickMaster.set_wifi2_status_led(enabled)added. This allows setting the status led by value instead of callingenable_wifi2_status_led/disable_wifi2_status_ledPTC BrickletBrickletPtc()takes an additional parameter to define the type of sensor. The options areBrickletPtc.SensorType.PT_100andBrickletPtc.SensorType.PT_1000. This only determines the resistance returned by the bricklet. The default isBrickletPtc.SensorType.PT_100.BrickletPtc.sensor_typegetter and setter to change the type of sensor used.PTC Bricklet 2.0BrickletPtcV2()takes an additional parameter to define the type of sensor. The options areBrickletPtc.SensorType.PT_100andBrickletPtc.SensorType.PT_1000. This only determines the resistance returned by the bricklet. The default isBrickletPtc.SensorType.PT_100.BrickletPtcV2.sensor_typegetter and setter to change the type of sensor used.Segment Display 4x7 Bricklet 2.0BrickletSegmentDisplay4x7V2.set_segments()takes alist/tupleof 4intinstead of digit0, digit1, digit2, digit3. This is the same API as the olderSegment Display 4x7 Bricklet.SetupThere are currently no packages available at the PyPi repository. To install the module, clone the repository and run:python3-mvenvenv# virtual environment, optionalsourceenv/bin/activate# only if the virtual environment is usedpython3setup.pyinstallVersioningI useSemVerfor versioning. For the versions available, see thetags on this repository.AuthorsPatrick Baus-Initial work-PatrickBausLicenseThis project is licensed under the GPL v3 license - see theLICENSEfile for details