Some months ago, I had a problem where Emonhub was crashing with the following messages:
2016-01-21 20:29:05,490 DEBUG MQTT CONACK => Return code: 0 2016-01-21 20:29:05,595 INFO MQTT on_subscribe 2016-01-21 20:29:15,589 WARNING MainThread ArduinoMini thread is dead 2016-01-21 20:29:15,847 WARNING MainThread ArduinoMini thread is dead 2016-01-21 20:29:16,105 WARNING MainThread ArduinoMini thread is dead
My setup is an Arduino mini, connected to a Raspberry 2 via the serial port.
At this time, I had a discussion with Paul (pb66) and I suggested to use an external button that would generate a “sudo service emonhub restart” command. I built all that stuff and it finally worked.
Last week I revisited this project and found a solution that is now acceptable for me!
For some reasons, the mini generates “null” chars on the serial port when it is reset. Quite strange and I don’t know if it’s a particularity with this device. Anyway, these chars were just crashing Emonhub.
To sort this out, I have added 2 debug messages in the function below in EmonHubSerialInterfacer.py to show the differences and put a regular expression in between to get rid of all chars, except the ones from Octal 040 to 071 (Dec 32 to 57). This is the range I need and nothing else. This solved my problem!
import serial import time import Cargo from pydispatch import dispatcher import emonhub_interfacer as ehi import re def read(self): """Read data from serial port and process if complete line received. Return data as a list: [NodeID, val1, val2] """ # Read serial RX self._rx_buf = self._rx_buf + self._ser.readline() # If line incomplete, exit if '\r\n' not in self._rx_buf: return # Remove CR,LF f = self._rx_buf[:-2] # Keep only chars from 040 to 071 in octal and get rid of the message "thread is dead" self._log.debug("Serial Port buffer content before: " + str(f)) f = re.sub('[^\040-\071]', '', f) self._log.debug("Serial Port buffer content after: " + str(f)) # Reset buffer self._rx_buf = ''
Hope it can be of any help to you.