I always wanted to learn how to code but never had time or a need.
Now my first attempt to build an extension is in the works.
The 1st question is acceptable to ask help or opinions in this group/community?
If so continue reading :)
Now I don’t know if this extension already exists, but I know that here a
similar extension to do the same, but regardless I want it to be a learning
experience.
I’m using pillow to add text to a jpg picture.
So far I capable of adding the txt to the picture with the variable that I want.
My problems occurs when I want added it in the unit_system (aka US, METRIC and
METRICWX) and also rounding it to 2 decimal when there is more than 2.
Here is where I’m at right now
Running on a Raspberry Pi3b with weewx 4.10.2 with all the current version as
of this date 10/15/2023.
The weewx.conf is modified the following way:
[Engine]
# The following section specifies which services should be run and in what
order.
[[Services]]
prep_services = weewx.engine.StdTimeSynch
data_services = user.airlink.AirLink, user.AddTxt2Jpg.AddTxt2Jpg
process_services = weewx.engine.StdConvert, weewx.engine.StdCalibrate,
weewx.engine.StdQC, weewx.wxservices.StdWXCalculate, user.aprx.WeewxAprx
xtype_services = weewx.wxxtypes.StdWXXTypes,
weewx.wxxtypes.StdPressureCooker, weewx.wxxtypes.StdRainRater,
weewx.wxxtypes.StdDelta
archive_services = weewx.engine.StdArchive
restful_services = weewx.restx.StdStationRegistry,
weewx.restx.StdWunderground, weewx.restx.StdPWSweather, weewx.restx.StdCWOP,
weewx.restx.StdWOW, weewx.restx.StdAWEKAS, user.mqtt.MQTT
report_services = weewx.engine.StdPrint, weewx.engine.StdReport
[AddTxt2Jpg]
image_path = "/var/www/html/weewx/webcam/snap.jpg"
output_path = "/var/www/html/weewx/webcam/snap_wx.jpg"
font_path = "/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf"
text_format = "Temperature: {outTemp}°C, Humidity: {outHumidity}%, Total
rain:{rain24}, AQI: {pm2_5_aqi}"
text_x = 50
text_y = 1450
text_color = white
text_font_size = 36
fields = "outTemp, outHumidity, pm2_5_aqi, windSpeed, barometer, rain24,
windDir.ordinal_compass"
Now the script itself which can be or is a complete mess looks like this:
#!/usr/bin/python3
import weewx
from weewx.engine import StdService
import weeutil.weeutil
import syslog
from weewx.units import convert, getStandardUnitType
# Check for Pillow library installation
try:
from PIL import Image, ImageDraw, ImageFont
except ImportError:
syslog.syslog(syslog.LOG_ERR, "AddTxt2Jpg: Pillow library not found. Please
install with 'pip install Pillow'.")
exit(1)
class AddTxt2Jpg(StdService):
def __init__(self, engine, config_dict):
super(AddTxt2Jpg, self).__init__(engine, config_dict)
# Logging tag
self.log_tag = "AddTxt2Jpg"
# Get configuration options from weewx.conf
self.image_path = config_dict.get('AddTxt2Jpg', {}).get('image_path',
'')
self.output_path = config_dict.get('AddTxt2Jpg', {}).get('output_path',
'')
self.font_path = config_dict.get('AddTxt2Jpg', {}).get('font_path', '')
self.text_format = config_dict.get('AddTxt2Jpg', {}).get('text_format',
'Weather Data: {outTemp}°C, Humidity: {outHumidity}%')
self.text_x = int(config_dict.get('AddTxt2Jpg', {}).get('text_x', '20'))
self.text_y = int(config_dict.get('AddTxt2Jpg', {}).get('text_y', '20'))
self.text_color = config_dict.get('AddTxt2Jpg', {}).get('text_color',
'white')
self.text_font_size = int(config_dict.get('AddTxt2Jpg',
{}).get('text_font_size', '20'))
# Set up the converter
target_unit_nickname = config_dict.get("StdConvert",
{}).get("target_unit", "METRIC")
target_unit = weewx.units.unit_constants[target_unit_nickname.upper()]
self.converter = weewx.units.StdUnitConverters[target_unit]
# Get the list of fields to be extracted from the archive record
fields = config_dict.get('AddTxt2Jpg', {}).get('fields', [])
if isinstance(fields, str):
self.fields = [x.strip() for x in fields.split(',')]
elif isinstance(fields, list):
self.fields = fields
else:
self.fields = []
# Bind to the new archive record event
self.bind(weewx.NEW_ARCHIVE_RECORD, self.new_archive_record)
syslog.syslog(syslog.LOG_INFO, f"{self.log_tag}: initialized.")
def new_archive_record(self, event):
syslog.syslog(syslog.LOG_INFO, f"{self.log_tag}: New archive record
event triggered.")
try:
# Access the record containing the archived weather data
record = event.record
# Convert all fields to the desired unit system using the converter
for field in self.fields:
if field in record:
value = record[field]
std_unit_type, group =
getStandardUnitType(record['usUnits'], field)
value_converted = self.converter.convert((value,
std_unit_type, group))
record[field] = value_converted[0]
# Extract fields from configuration
field_values = {field: record.get(field) for field in self.fields}
# Open the existing image
image = Image.open(self.image_path)
# Create a drawing context
draw = ImageDraw.Draw(image)
# Load the specified font
font = ImageFont.truetype(self.font_path, size=self.text_font_size)
# Format the text using weather data from the record
formatted_text = self.text_format.format(**field_values)
# Add the formatted text to the image
draw.text((self.text_x, self.text_y), formatted_text,
fill=self.text_color, font=font)
# Save the modified image to the output path
image.save(self.output_path)
# Log a message to the system log
syslog.syslog(syslog.LOG_INFO, f"{self.log_tag}: Text added to
image and saved as {self.output_path}")
except Exception as e:
# Handle any exceptions and log them
syslog.syslog(syslog.LOG_ERR, f"{self.log_tag}: Error: {str(e)}")
How bad is it, I’m I far, can it be better coded (obviously YES) but is my
first attempt any close.
PS I never coded before, this was done just by reading other extension making
the best of it with chatgpt.

--
You received this message because you are subscribed to the Google Groups
"weewx-user" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/weewx-user/1C13CAC0-4238-4047-8A25-E3B2F54F7F19%40gmail.com.