-
-
Notifications
You must be signed in to change notification settings - Fork 546
Description
Describe the problem/bug
When adding measurements via Python 3 Code input, the measurement is not correctly displayed in the debug log:
[...] DEBUG - mycodo.controllers.controller_input_30d13119 - Adding measurements to InfluxDB with ID 30d13119-069a-4dc1-aa03-7b87f7eebab4: {}.
The measurement itself is however correctly stored in the DB, as verified on the Live Measurements page and the Asynchronous Measurements graph.
Versions:
- Mycodo Version: 8.15.8, 8.15.7
- Raspberry Pi Version: 1B+
- Raspbian OS Version: Raspberry OS Bullseye Lite 32-bit
- Debian Version: Bullseye
Tested on Raspberry Pi and on Debian server.
Reproducibility
- Add new "Python 3 Code" input
- Configure measurement name and unit
- Set Log Level:Debug
- Save Input
- Activate Input
- Observe Daemon log
The issue appears when using the preset default example Python code as well as when using custom Python code (both storing measurements using the store_measurement() function.
Expected behavior
The Debug log should show the information of the added measurement. Similar to other inputs:
Adding measurement to influxdb: {0: {'measurement': 'unitless', 'unit': 'none', 'value': 42.0, 'timestamp_utc': datetime.datetime(2023, 4, 10, 10, 34, 6, 971382)}}
Screenshots
The measurement in the Live Measurements page:

Logfile
Output of the Daemon logfile
2023-04-10 12:39:29,837 - DEBUG - mycodo.inputs.python_code_30d13119 - Python Code:
import os
import sys
sys.path.append(os.path.abspath('/var/mycodo-root'))
from mycodo.databases.models import Conversion
from mycodo.mycodo_client import DaemonControl
from mycodo.utils.database import db_retrieve_table_daemon
from mycodo.utils.influx import add_measurements_influxdb
from mycodo.utils.inputs import parse_measurement
control = DaemonControl()
class PythonInputRun:
def __init__(self, logger, input_id, measurement_info, channels_conversion, channels_measurement):
self.logger = logger
self.input_id = input_id
self.measurement_info = measurement_info
self.channels_conversion = channels_conversion
self.channels_measurement = channels_measurement
def store_measurement(self, channel=None, measurement=None, timestamp=None):
if None in [channel, measurement]:
return
measure = {
channel: {
'measurement': self.measurement_info[channel]['measurement'],
'unit': self.measurement_info[channel]['unit'],
'value': measurement,
'timestamp_utc': None
}
}
if timestamp:
measure[channel]['timestamp_utc'] = timestamp
if channel in self.channels_conversion and self.channels_conversion[channel]:
conversion = db_retrieve_table_daemon(
Conversion,
unique_id=self.channels_measurement[channel].conversion_id)
if conversion: # Convert value/unit is conversion_id present and valid
meas_conv = parse_measurement(
self.channels_conversion[channel],
self.channels_measurement[channel],
measure,
channel,
measure[channel],
timestamp=measure[channel]['timestamp_utc'])
measure[channel]['measurement'] = meas_conv[channel]['measurement']
measure[channel]['unit'] = meas_conv[channel]['unit']
measure[channel]['value'] = meas_conv[channel]['value']
add_measurements_influxdb(self.input_id, measure)
def python_code_run(self):
import random # Import any external libraries
# Get measurements/values (for example, these are randomly-generated numbers)
random_value_channel_0 = random.uniform(10.0, 100.0)
# Store measurements in database (must specify the channel and measurement)
self.store_measurement(channel=0, measurement=random_value_channel_0)
2023-04-10 12:39:29,872 - DEBUG - mycodo.controllers.controller_input_30d13119 - Adding measurements to InfluxDB with ID 30d13119-069a-4dc1-aa03-7b87f7eebab4: {}