I don't see that you ever got a reply. Python f-strings allow for field width specifiers. For example:
f"{record['outTemp']:.0f}°" f"{record['barometer']:.2f} Hope that helps. - Nate On Sunday, October 15, 2023 at 12:38:06 PM UTC-5 Lorin Tremblay wrote: > 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. > > [image: snap_wx-3.jpeg] > -- 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 weewx-user+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/weewx-user/7916ee7d-15ee-4795-b5f4-f2c6a8e2126bn%40googlegroups.com.