Closed hami89 closed 1 year ago
Well, OPTION_A are not "physical pins", but a workaround for providing a runtime configurable option for drivers to modify their behavior, without the driver expecting that they can get a physical pin number for an option. Only whether the option is selected. Thus it makes sense that gpio.pin_used
gives you what OPTION_A is meant for, while you cannot misuse gpio.pin to treat it as a physical pin assignment. The pins where OPTION_A is selected are not assigned to anything, they are still unused, with or without Berry. Thus it is working as designed that gpio.pin returns -1 for not assigned.
To reserve pins for Berry usage. you can configure as INPUT instead of expecting OPTION_A to be suitable for such.
This is due to the internal implementation of Tasmota. OPTION_A
is a virtual type and is not actually attached to a GPIO. So returning the GPIO number for OPTION_A
actually doesn't make much sense.
There is special code in gpio.pin_used()
to detect OPTION_A
although there is no GPIO attached.
Well, I see your logic and I can accept that.
Still, if a pin can be set as Option A (or anything else) it would be logical to be able to query the same thing. Option A is not highlighted as "Virtual" like Option E. Regarding the @s-hadinger 's logic, I would expect the exact opposite behavior. Pin_used() should return false, as the pin is "not used" by any other driver, but still, pin() call should provide the assignment.
Please, at least update the documentation about this.
Anyway, thanks for the quick reply, I'll close this.
This is a convenience and the corresponding PR is here: https://github.com/arendst/Tasmota/pull/13625
You can ignore it if you find it inconsistent. There is no pin assignment internally in Tasmota, so I can't retrieve the GPIO it was initially assigned to. And as said, the GPIO it is assigned to has no meaning.
Btw, I don't know any other way to get OPTION_A
information from Berry.
If what you want is to "reserve" a pin for Berry, and have the Berry code find it without having to know the physical pin gpio number, you can as already suggested configure the pin as "Input" instead of trying to misuse Option A.
As I mentioned, it can be worked around by either decoding the template or by var pins = tasmota.cmd("gpio 255")
and using the resulting berry object.
I closed the issue anyway.
What I meant was just do not misuse the Option A feature for something it is not meant for, especially when you have a more suitable option.
PROBLEM DESCRIPTION
In berry script, the
gpio.pin_used(gpio.OPTION_A,0)
command always returns -1, even if such a gpio pin is configured. Meanwhile,gpio.pin_used(gpio.OPTION_A, 0)
correctly returns true.REQUESTED INFORMATION
Make sure your have performed every step and checked the applicable boxes before submitting your issue. Thank you!
Backlog Template; Module; GPIO 255
:Status 0
:weblog
to 4 and then, when you experience your issue, provide the output of the Console log:TO REPRODUCE
Take an esp32 based device and configure a gpio pin as "Option A". From the berry console, issue command
gpio.pin(gpio.OPTION_A,0)
. It will return -1.EXPECTED BEHAVIOUR
The
gpio.pin(gpio.OPTION_A,0)
should return the configured gpio number (22 in this case) for the Option A pin.SCREENSHOTS
N/A
ADDITIONAL CONTEXT
I am developing a custom device. I configured gpio 19, 21, 22, 23 respectively as Option-A 1, Option-A 2, Option-A 3 and Option-A 4.
I am using a berry-script based driver to handle these pins. In berry,
gpio.pin_used(gpio.OPTION_A, 0)
works as expected, returning true for all 4 pins (0-3)"Berry console output:
But
gpio.pin(gpio.OPTION_A, 0)
returns 0, no matter the input. (But it works correctly for all other devices in my config).Berry console output:
I would expect
gpio.pin(gpio.OPTION_A, 0)
to return 22 (GPIO 22), asgpio 255
command output above shows, that it is configured to gpio 22.I would use
gpio.pin()
output to find the gpio assignment from the berry driver. I worked it around by issuing atasmota.cmd("gpio 255")
command from berry and processing the output, but it would be much easier to get the result in one code line.