<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[OSError: [Errno 116] ETIMEDOUT]]></title><description><![CDATA[<p dir="auto">Hey guys,</p>
<p dir="auto">I am using a Core2 connected to a M5Stack 4-channel relay. A PAHub is connected to each channel and six I2C Weight Units are connected to each PAHub. So I have a total of 24 I2C Weight Units in use. Unfortunately, I always get an error that I can't solve. This error occurs even when I connect the Core2 directly to a PAHub and six I2C Weight Units. Can someone help me out?</p>
<p dir="auto">Traceback (most recent call last):<br />
File "&lt;stdin&gt;", line 166, in &lt;module&gt;<br />
File "&lt;stdin&gt;", line 126, in setup<br />
File "unit/weight_i2c.py", line 36, in <strong>init</strong><br />
File "unit/weight_i2c.py", line 40, in _available<br />
File "unit/pahub.py", line 52, in scan<br />
File "unit/pahub.py", line 43, in release_channel<br />
OSError: [Errno 116] ETIMEDOUT</p>
]]></description><link>https://community.m5stack.com/topic/7162/oserror-errno-116-etimedout</link><generator>RSS for Node</generator><lastBuildDate>Wed, 29 Apr 2026 01:06:05 GMT</lastBuildDate><atom:link href="https://community.m5stack.com/topic/7162.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 06 Jan 2025 14:14:21 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to OSError: [Errno 116] ETIMEDOUT on Wed, 08 Jan 2025 14:10:21 GMT]]></title><description><![CDATA[<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="/user/ajb2k3" aria-label="Profile: ajb2k3">@<bdi>ajb2k3</bdi></a> The relay was not connected. I connected the Core2 directly to a Hub and used the following code. Do you see something that could be the reason for the error?</p>
<p dir="auto">import os, sys, io<br />
import M5<br />
from M5 import *<br />
from unit import WeightI2CUnit<br />
from hardware import *<br />
import time<br />
from unit import PAHUBUnit</p>
<p dir="auto">weight = None<br />
airScale = None<br />
notMedical = None<br />
tareButton = None<br />
measureButton = None<br />
kg = None<br />
i2c0 = None<br />
pahub_0 = None<br />
weight_i2c_0 = None<br />
weight_i2c_1 = None<br />
weight_i2c_2 = None<br />
weight_i2c_3 = None<br />
weight_i2c_4 = None<br />
weight_i2c_5 = None</p>
<p dir="auto">tare_weight = None<br />
total_weight = None<br />
adc0 = None<br />
adc1 = None</p>
<h1>Calibration</h1>
<p dir="auto">def calibration():<br />
global tare_weight, total_weight, adc0, adc1, weight, airScale, notMedical, tareButton, measureButton, kg, i2c0, pahub_0, weight_i2c_0, weight_i2c_1, weight_i2c_2, weight_i2c_3, weight_i2c_4, weight_i2c_5<br />
kg.setVisible(False)<br />
weight.setText(str('START'))<br />
time.sleep(5)<br />
weight_i2c_0.set_reset_offset()<br />
weight.setText(str('CAL'))<br />
time.sleep(2)<br />
adc0 = weight_i2c_0.get_adc_raw<br />
weight.setText(str('WEIGHT'))<br />
time.sleep(10)<br />
adc1 = weight_i2c_0.get_adc_raw<br />
weight.setText(str('DONE'))<br />
time.sleep(2)<br />
weight_i2c_0.set_calibration(0, adc0, 20000, adc1)<br />
time.sleep(5)<br />
weight_i2c_1.set_reset_offset()<br />
weight.setText(str('CAL'))<br />
time.sleep(2)<br />
adc0 = weight_i2c_1.get_adc_raw<br />
weight.setText(str('WEIGHT'))<br />
time.sleep(10)<br />
adc1 = weight_i2c_1.get_adc_raw<br />
weight.setText(str('DONE'))<br />
time.sleep(2)<br />
weight_i2c_1.set_calibration(0, adc0, 20000, adc1)<br />
time.sleep(5)<br />
weight_i2c_2.set_reset_offset()<br />
weight.setText(str('CAL'))<br />
time.sleep(2)<br />
adc0 = weight_i2c_2.get_adc_raw<br />
weight.setText(str('WEIGHT'))<br />
time.sleep(10)<br />
adc1 = weight_i2c_2.get_adc_raw<br />
weight.setText(str('DONE'))<br />
time.sleep(2)<br />
weight_i2c_2.set_calibration(0, adc0, 20000, adc1)<br />
time.sleep(5)<br />
weight_i2c_3.set_reset_offset()<br />
weight.setText(str('CAL'))<br />
time.sleep(2)<br />
adc0 = weight_i2c_3.get_adc_raw<br />
weight.setText(str('WEIGHT'))<br />
time.sleep(10)<br />
adc1 = weight_i2c_3.get_adc_raw<br />
weight.setText(str('DONE'))<br />
time.sleep(2)<br />
weight_i2c_3.set_calibration(0, adc0, 20000, adc1)<br />
time.sleep(5)<br />
weight_i2c_4.set_reset_offset()<br />
weight.setText(str('CAL'))<br />
time.sleep(2)<br />
adc0 = weight_i2c_4.get_adc_raw<br />
weight.setText(str('WEIGHT'))<br />
time.sleep(10)<br />
adc1 = weight_i2c_4.get_adc_raw<br />
weight.setText(str('DONE'))<br />
time.sleep(2)<br />
weight_i2c_4.set_calibration(0, adc0, 20000, adc1)<br />
time.sleep(5)<br />
weight_i2c_5.set_reset_offset()<br />
weight.setText(str('CAL'))<br />
time.sleep(2)<br />
adc0 = weight_i2c_5.get_adc_raw<br />
weight.setText(str('WEIGHT'))<br />
time.sleep(10)<br />
adc1 = weight_i2c_5.get_adc_raw<br />
weight.setText(str('DONE'))<br />
time.sleep(2)<br />
weight_i2c_5.set_calibration(0, adc0, 20000, adc1)<br />
weight.setText(str('END'))</p>
<h1>Tare</h1>
<p dir="auto">def tare():<br />
global tare_weight, total_weight, adc0, adc1, weight, airScale, notMedical, tareButton, measureButton, kg, i2c0, pahub_0, weight_i2c_0, weight_i2c_1, weight_i2c_2, weight_i2c_3, weight_i2c_4, weight_i2c_5<br />
weight_i2c_0.set_reset_offset()<br />
weight_i2c_1.set_reset_offset()<br />
weight_i2c_2.set_reset_offset()<br />
weight_i2c_3.set_reset_offset()<br />
weight_i2c_4.set_reset_offset()<br />
weight_i2c_5.set_reset_offset()<br />
tare_weight = sum([weight_i2c_0.get_weight_float, weight_i2c_1.get_weight_float, weight_i2c_2.get_weight_float, weight_i2c_3.get_weight_float, weight_i2c_4.get_weight_float, weight_i2c_5.get_weight_float])<br />
return tare_weight</p>
<h1>Measure</h1>
<p dir="auto">def measure():<br />
global tare_weight, total_weight, adc0, adc1, weight, airScale, notMedical, tareButton, measureButton, kg, i2c0, pahub_0, weight_i2c_0, weight_i2c_1, weight_i2c_2, weight_i2c_3, weight_i2c_4, weight_i2c_5<br />
total_weight = sum([weight_i2c_0.get_weight_float, weight_i2c_1.get_weight_float, weight_i2c_2.get_weight_float, weight_i2c_3.get_weight_float, weight_i2c_4.get_weight_float, weight_i2c_5.get_weight_float])<br />
return total_weight</p>
<p dir="auto">def setup():<br />
global weight, airScale, notMedical, tareButton, measureButton, kg, i2c0, pahub_0, weight_i2c_0, weight_i2c_1, weight_i2c_2, weight_i2c_3, weight_i2c_4, weight_i2c_5, tare_weight, total_weight, adc0, adc1</p>
<p dir="auto">M5.begin()<br />
Widgets.fillScreen(0x222222)<br />
weight = Widgets.Label("250.0", 8, 90, 1.0, 0xffffff, 0x222222, Widgets.FONTS.DejaVu72)<br />
airScale = Widgets.Label("airScale", 5, 7, 1.0, 0x89c6ff, 0x222222, Widgets.FONTS.DejaVu12)<br />
notMedical = Widgets.Label("Not for Medical Use!", 115, 5, 1.0, 0xff0000, 0x222222, Widgets.FONTS.DejaVu18)<br />
tareButton = Widgets.Label("Tare", 23, 210, 1.0, 0xffffff, 0x222222, Widgets.FONTS.DejaVu24)<br />
measureButton = Widgets.Label("Measure", 210, 210, 1.0, 0xffffff, 0x222222, Widgets.FONTS.DejaVu24)<br />
kg = Widgets.Label("kg", 230, 90, 1.0, 0xffffff, 0x222222, Widgets.FONTS.DejaVu72)</p>
<p dir="auto">i2c0 = I2C(0, scl=Pin(33), sda=Pin(32), freq=100000)<br />
pahub_0 = PAHUBUnit(i2c=i2c0, channel=0)<br />
weight_i2c_0 = WeightI2CUnit(PAHUBUnit(i2c=i2c0, channel=0), 0x26)<br />
weight_i2c_1 = WeightI2CUnit(PAHUBUnit(i2c=i2c0, channel=1), 0x26)<br />
weight_i2c_2 = WeightI2CUnit(PAHUBUnit(i2c=i2c0, channel=2), 0x26)<br />
weight_i2c_3 = WeightI2CUnit(PAHUBUnit(i2c=i2c0, channel=3), 0x26)<br />
weight_i2c_4 = WeightI2CUnit(PAHUBUnit(i2c=i2c0, channel=4), 0x26)<br />
weight_i2c_5 = WeightI2CUnit(PAHUBUnit(i2c=i2c0, channel=5), 0x26)<br />
weight.setVisible(False)<br />
weight_i2c_0.set_lowpass_filter(True)<br />
weight_i2c_1.set_lowpass_filter(True)<br />
weight_i2c_2.set_lowpass_filter(True)<br />
weight_i2c_3.set_lowpass_filter(True)<br />
weight_i2c_4.set_lowpass_filter(True)<br />
weight_i2c_5.set_lowpass_filter(True)<br />
weight_i2c_0.set_average_filter_level(50)<br />
weight_i2c_1.set_average_filter_level(50)<br />
weight_i2c_2.set_average_filter_level(50)<br />
weight_i2c_3.set_average_filter_level(50)<br />
weight_i2c_4.set_average_filter_level(50)<br />
weight_i2c_5.set_average_filter_level(50)<br />
weight.setText(str("%.1f"%((tare() / 1000))))</p>
<p dir="auto">def loop():<br />
global weight, airScale, notMedical, tareButton, measureButton, kg, i2c0, pahub_0, weight_i2c_0, weight_i2c_1, weight_i2c_2, weight_i2c_3, weight_i2c_4, weight_i2c_5, tare_weight, total_weight, adc0, adc1<br />
M5.update()<br />
if BtnA.wasClicked():<br />
kg.setVisible(False)<br />
weight.setText(str('Tare...'))<br />
time.sleep(3)<br />
weight.setText(str("%.1f"%((tare() / 1000))))<br />
kg.setVisible(True)<br />
if BtnB.wasHold():<br />
calibration()<br />
time.sleep(5)<br />
weight.setText(str("%.1f"%((tare() / 1000))))<br />
kg.setVisible(True)<br />
if BtnC.wasClicked():<br />
weight.setText(str('Warten..'))<br />
time.sleep(10)<br />
weight.setText(str("%.1f"%((measure() / 1000))))<br />
kg.setVisible(True)</p>
<p dir="auto">if <strong>name</strong> == '<strong>main</strong>':<br />
try:<br />
setup()<br />
while True:<br />
loop()<br />
except (Exception, KeyboardInterrupt) as e:<br />
try:<br />
from utility import print_error_msg<br />
print_error_msg(e)<br />
except ImportError:<br />
print("please update to latest firmware")</p>
]]></description><link>https://community.m5stack.com/post/27814</link><guid isPermaLink="true">https://community.m5stack.com/post/27814</guid><dc:creator><![CDATA[laursena]]></dc:creator><pubDate>Wed, 08 Jan 2025 14:10:21 GMT</pubDate></item><item><title><![CDATA[Reply to OSError: [Errno 116] ETIMEDOUT on Wed, 08 Jan 2025 13:40:00 GMT]]></title><description><![CDATA[<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="/user/laursena" aria-label="Profile: laursena">@<bdi>laursena</bdi></a> if you only have the relay connected but don’t change the code then you will continue to get the error becuase the code is still trying to look for them</p>
]]></description><link>https://community.m5stack.com/post/27813</link><guid isPermaLink="true">https://community.m5stack.com/post/27813</guid><dc:creator><![CDATA[ajb2k3]]></dc:creator><pubDate>Wed, 08 Jan 2025 13:40:00 GMT</pubDate></item><item><title><![CDATA[Reply to OSError: [Errno 116] ETIMEDOUT on Wed, 08 Jan 2025 13:04:20 GMT]]></title><description><![CDATA[<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="/user/ajb2k3" aria-label="Profile: ajb2k3">@<bdi>ajb2k3</bdi></a> thank you for your answer. I am connecting the hubs to the output of the relay and I see that the relay doesn't have an I2C output. But I also get the error without using the relay which is odd to me. Do you know why this could be?</p>
]]></description><link>https://community.m5stack.com/post/27812</link><guid isPermaLink="true">https://community.m5stack.com/post/27812</guid><dc:creator><![CDATA[laursena]]></dc:creator><pubDate>Wed, 08 Jan 2025 13:04:20 GMT</pubDate></item><item><title><![CDATA[Reply to OSError: [Errno 116] ETIMEDOUT on Tue, 07 Jan 2025 20:28:35 GMT]]></title><description><![CDATA[<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="/user/laursena" aria-label="Profile: laursena">@<bdi>laursena</bdi></a> You are connecting the hubs to the output of the relays?<br />
If so it's because the hubs cant communicate. hubs must be connected before the relay</p>
]]></description><link>https://community.m5stack.com/post/27799</link><guid isPermaLink="true">https://community.m5stack.com/post/27799</guid><dc:creator><![CDATA[ajb2k3]]></dc:creator><pubDate>Tue, 07 Jan 2025 20:28:35 GMT</pubDate></item></channel></rss>