I2c relay board stopped working after update

I just booted my mycodo after 6mth and updated to the latest release (It was like 15 releases behind). Everything seems to be working, except my 2 Seeed 4 channel i2c relay boards. I complains about the output channel not existing. I verified via i2cdetect that the boards are connected.

Here is the last 60 lines from the log

2022-07-15 09:36:58,343 - ERROR - mycodo.outputs.grove_multichannel_relay_4ch_612d6f7a - Cannot manipulate Output 612d6f7a-714b-4af0-8f86-14a4611c5198: output channel doesn't exist: 1
2022-07-15 09:37:58,423 - ERROR - mycodo.outputs.grove_multichannel_relay_4ch_612d6f7a - Cannot manipulate Output 612d6f7a-714b-4af0-8f86-14a4611c5198: output channel doesn't exist: 1
2022-07-15 09:38:58,430 - ERROR - mycodo.outputs.grove_multichannel_relay_4ch_612d6f7a - Cannot manipulate Output 612d6f7a-714b-4af0-8f86-14a4611c5198: output channel doesn't exist: 1
2022-07-15 09:39:58,393 - ERROR - mycodo.outputs.grove_multichannel_relay_4ch_612d6f7a - Cannot manipulate Output 612d6f7a-714b-4af0-8f86-14a4611c5198: output channel doesn't exist: 1
2022-07-15 09:40:58,340 - ERROR - mycodo.outputs.grove_multichannel_relay_4ch_612d6f7a - Cannot manipulate Output 612d6f7a-714b-4af0-8f86-14a4611c5198: output channel doesn't exist: 1
2022-07-15 09:41:58,375 - ERROR - mycodo.outputs.grove_multichannel_relay_4ch_612d6f7a - Cannot manipulate Output 612d6f7a-714b-4af0-8f86-14a4611c5198: output channel doesn't exist: 1
2022-07-15 09:42:58,344 - ERROR - mycodo.outputs.grove_multichannel_relay_4ch_612d6f7a - Cannot manipulate Output 612d6f7a-714b-4af0-8f86-14a4611c5198: output channel doesn't exist: 1
2022-07-15 09:43:58,453 - ERROR - mycodo.outputs.grove_multichannel_relay_4ch_612d6f7a - Cannot manipulate Output 612d6f7a-714b-4af0-8f86-14a4611c5198: output channel doesn't exist: 1
2022-07-15 09:44:58,476 - ERROR - mycodo.outputs.grove_multichannel_relay_4ch_612d6f7a - Cannot manipulate Output 612d6f7a-714b-4af0-8f86-14a4611c5198: output channel doesn't exist: 1
2022-07-15 09:45:58,395 - ERROR - mycodo.outputs.grove_multichannel_relay_4ch_612d6f7a - Cannot manipulate Output 612d6f7a-714b-4af0-8f86-14a4611c5198: output channel doesn't exist: 1
2022-07-15 09:46:58,326 - ERROR - mycodo.outputs.grove_multichannel_relay_4ch_612d6f7a - Cannot manipulate Output 612d6f7a-714b-4af0-8f86-14a4611c5198: output channel doesn't exist: 1
2022-07-15 09:47:58,406 - ERROR - mycodo.outputs.grove_multichannel_relay_4ch_612d6f7a - Cannot manipulate Output 612d6f7a-714b-4af0-8f86-14a4611c5198: output channel doesn't exist: 1
2022-07-15 09:48:58,415 - ERROR - mycodo.outputs.grove_multichannel_relay_4ch_612d6f7a - Cannot manipulate Output 612d6f7a-714b-4af0-8f86-14a4611c5198: output channel doesn't exist: 1
2022-07-15 09:49:40,904 - ERROR - mycodo.outputs.grove_multichannel_relay_4ch_1ee6161e - Cannot manipulate Output 1ee6161e-7631-4036-9574-86daf49c9dd9: output channel doesn't exist: 0
2022-07-15 09:49:58,457 - ERROR - mycodo.outputs.grove_multichannel_relay_4ch_612d6f7a - Cannot manipulate Output 612d6f7a-714b-4af0-8f86-14a4611c5198: output channel doesn't exist: 1
2022-07-15 09:50:58,479 - ERROR - mycodo.outputs.grove_multichannel_relay_4ch_612d6f7a - Cannot manipulate Output 612d6f7a-714b-4af0-8f86-14a4611c5198: output channel doesn't exist: 1
2022-07-15 09:51:53,713 - ERROR - mycodo.controllers.controller_output - Stopping output
Traceback (most recent call last):
  File "/var/mycodo-root/mycodo/controllers/controller_output.py", line 189, in add_mod_output
    self.output[output_id].stop_output()
  File "/home/pi/Mycodo/mycodo/outputs/custom_outputs/grove_multichannel_relay_4ch.py", line 294, in stop_output
    self.sensor.port(self.dict_to_list_states(dict_states))
AttributeError: 'NoneType' object has no attribute 'port'
2022-07-15 09:51:54,405 - ERROR - mycodo.outputs.grove_multichannel_relay_4ch_1ee6161e - OutputModule did not overwrite the initialize() method. All subclasses of the AbstractOutput class are required to overwrite this method
2022-07-15 09:51:54,405 - ERROR - mycodo.outputs.grove_multichannel_relay_4ch_1ee6161e - Error initializing, trying again in 5 seconds: 
Traceback (most recent call last):
  File "/var/mycodo-root/mycodo/abstract_base_controller.py", line 54, in try_initialize
    self.initialize()
  File "/var/mycodo-root/mycodo/outputs/base_output.py", line 107, in initialize
    raise NotImplementedError
NotImplementedError
2022-07-15 09:51:57,434 - DEBUG - mycodo.outputs.grove_multichannel_relay_4ch_1ee6161e - output_on_off(on, 0, sec, 0.0, 0.0, True)
2022-07-15 09:51:57,434 - ERROR - mycodo.outputs.grove_multichannel_relay_4ch_1ee6161e - Cannot manipulate Output 1ee6161e-7631-4036-9574-86daf49c9dd9: output channel doesn't exist: 0
2022-07-15 09:51:58,355 - ERROR - mycodo.outputs.grove_multichannel_relay_4ch_612d6f7a - Cannot manipulate Output 612d6f7a-714b-4af0-8f86-14a4611c5198: output channel doesn't exist: 1
2022-07-15 09:51:59,412 - ERROR - mycodo.outputs.grove_multichannel_relay_4ch_1ee6161e - OutputModule did not overwrite the initialize() method. All subclasses of the AbstractOutput class are required to overwrite this method
2022-07-15 09:51:59,412 - ERROR - mycodo.outputs.grove_multichannel_relay_4ch_1ee6161e - Error initializing, trying again in 5 seconds: 
Traceback (most recent call last):
  File "/var/mycodo-root/mycodo/abstract_base_controller.py", line 54, in try_initialize
    self.initialize()
  File "/var/mycodo-root/mycodo/outputs/base_output.py", line 107, in initialize
    raise NotImplementedError
NotImplementedError
2022-07-15 09:52:04,414 - ERROR - mycodo.outputs.grove_multichannel_relay_4ch_1ee6161e - OutputModule did not overwrite the initialize() method. All subclasses of the AbstractOutput class are required to overwrite this method
2022-07-15 09:52:04,415 - ERROR - mycodo.outputs.grove_multichannel_relay_4ch_1ee6161e - Initialization errored 3 times; giving up. Maybe the following traceback can help diagnose the issue.
Traceback (most recent call last):
  File "/var/mycodo-root/mycodo/abstract_base_controller.py", line 54, in try_initialize
    self.initialize()
  File "/var/mycodo-root/mycodo/outputs/base_output.py", line 107, in initialize
    raise NotImplementedError
NotImplementedError
2022-07-15 09:52:04,416 - INFO - mycodo.outputs.grove_multichannel_relay_4ch_1ee6161e - Initialized in 10692.5 ms
2022-07-15 09:52:13,960 - DEBUG - mycodo.outputs.grove_multichannel_relay_4ch_1ee6161e - output_on_off(on, 2, sec, 0.0, 0.0, True)
2022-07-15 09:52:13,961 - ERROR - mycodo.outputs.grove_multichannel_relay_4ch_1ee6161e - Cannot manipulate Output 1ee6161e-7631-4036-9574-86daf49c9dd9: output channel doesn't exist: 2
2022-07-15 09:52:58,357 - ERROR - mycodo.outputs.grove_multichannel_relay_4ch_612d6f7a - Cannot manipulate Output 612d6f7a-714b-4af0-8f86-14a4611c5198: output channel doesn't exist: 1
2022-07-15 09:53:58,316 - ERROR - mycodo.outputs.grove_multichannel_relay_4ch_612d6f7a - Cannot manipulate Output 612d6f7a-714b-4af0-8f86-14a4611c5198: output channel doesn't exist: 1
2022-07-15 09:54:58,379 - ERROR - mycodo.outputs.grove_multichannel_relay_4ch_612d6f7a - Cannot manipulate Output 612d6f7a-714b-4af0-8f86-14a4611c5198: output channel doesn't exist: 1
2022-07-15 09:55:58,352 - ERROR - mycodo.outputs.grove_multichannel_relay_4ch_612d6f7a - Cannot manipulate Output 612d6f7a-714b-4af0-8f86-14a4611c5198: output channel doesn't exist: 1
2022-07-15 09:56:58,349 - ERROR - mycodo.outputs.grove_multichannel_relay_4ch_612d6f7a - Cannot manipulate Output 612d6f7a-714b-4af0-8f86-14a4611c5198: output channel doesn't exist: 1
2022-07-15 09:57:58,460 - ERROR - mycodo.outputs.grove_multichannel_relay_4ch_612d6f7a - Cannot manipulate Output 612d6f7a-714b-4af0-8f86-14a4611c5198: output channel doesn't exist: 1
2022-07-15 09:58:58,355 - ERROR - mycodo.outputs.grove_multichannel_relay_4ch_612d6f7a - Cannot manipulate Output 612d6f7a-714b-4af0-8f86-14a4611c5198: output channel doesn't exist: 1

Output modules are initialized when Mycodo starts and this is likely where the most relevant log lines for diagnosing an issue will be. The log lines you pasted don’t indicate what the issue is.

2022-07-15 18:03:28,161 - INFO - mycodo.daemon - Mycodo daemon v8.13.10 starting
2022-07-15 18:03:29,681 - ERROR - mycodo.outputs.grove_multichannel_relay_4ch_1ee6161e - OutputModule did not overwrite the initialize() method. All subclasses of the AbstractOutput class are required to overwrite this method
2022-07-15 18:03:29,681 - ERROR - mycodo.outputs.grove_multichannel_relay_4ch_1ee6161e - Error initializing, trying again in 5 seconds: 
Traceback (most recent call last):
  File "/var/mycodo-root/mycodo/abstract_base_controller.py", line 54, in try_initialize
    self.initialize()
  File "/var/mycodo-root/mycodo/outputs/base_output.py", line 107, in initialize
    raise NotImplementedError
NotImplementedError
2022-07-15 18:03:34,689 - ERROR - mycodo.outputs.grove_multichannel_relay_4ch_1ee6161e - OutputModule did not overwrite the initialize() method. All subclasses of the AbstractOutput class are required to overwrite this method
2022-07-15 18:03:34,689 - ERROR - mycodo.outputs.grove_multichannel_relay_4ch_1ee6161e - Error initializing, trying again in 5 seconds: 
Traceback (most recent call last):
  File "/var/mycodo-root/mycodo/abstract_base_controller.py", line 54, in try_initialize
    self.initialize()
  File "/var/mycodo-root/mycodo/outputs/base_output.py", line 107, in initialize
    raise NotImplementedError
NotImplementedError

FIY it works with the Output Configuration: On/Off: Grove Multichannel Relay (4- or 8-Channel board) , so unless there is an easy fix, I can redo them with this module

1 Like

It appears you’re using a custom output, but you have not explicitly stated that. It makes it very difficult to help if you don’t describe the issue in enough detail, especially if you’re using custom code (custom output), since the only code we have access to is what’s in the Mycodo repository. It’s impossible to diagnose any custom code without the code itself. From the error, it looks like you haven’t implemented the initialize() function in the class.

A quick fix would be to add to the class:

def initialize(self):
    pass

But I would recommend using the built-in output since it will be maintained.

Will port to the other module. I must have used a legacy version from back when we got it working

Check the Custom Outputs page of the Configuration.