Skip to content

Import script for renpho scale in wiki #1217

@tonybenoy

Description

@tonybenoy
#!/usr/bin/env python
"""Convert Renpho CSV to OpenScale CSV format"""

import csv
import sys

FIELDNAMES = ['DATE', 'TIME', 'BICEPS', 'BMI', 'BMR', 'BODY_FAT', 'BONE', 'CALIPER',
              'CALIPER_1', 'CALIPER_2', 'CALIPER_3', 'CALORIES', 'CHEST', 'COMMENT',
              'HIPS', 'LBM', 'MUSCLE', 'NECK', 'TDEE', 'THIGH', 'VISCERAL_FAT',
              'WAIST', 'WATER', 'WEIGHT', 'WHR', 'WHTR']

def parse_date(date_str):
    """Convert Renpho date (2025.12.03) to YYYY-MM-DD"""
    return date_str.replace('.', '-')

def parse_time(time_str):
    """Convert Renpho time (10:11:50) to HH:MM"""
    parts = time_str.split(':')
    return f"{parts[0]}:{parts[1]}"

def get_value(row, key):
    """Get value from row if exists and not '--'"""
    val = row.get(key, '')
    return val if val and val != '--' else ''

if __name__ == '__main__':
    if len(sys.argv) != 3:
        print("Usage: python renpho_to_openscale.py <input.csv> <output.csv>")
        sys.exit(1)

    input_file, output_file = sys.argv[1], sys.argv[2]

    with open(input_file, 'r', encoding='utf-8-sig') as infile, \
         open(output_file, 'w', newline='', encoding='utf-8') as outfile:

        reader = csv.DictReader(infile)
        writer = csv.DictWriter(outfile, fieldnames=FIELDNAMES)
        writer.writeheader()

        count = 0
        for row in reader:
            # Strip any BOM or whitespace from keys
            row = {k.strip().replace('\ufeff', '').replace('', ''): v for k, v in row.items()}

            if not row.get('Date') or not row.get('Weight(kg)'):
                continue

            openscale_row = {field: '' for field in FIELDNAMES}

            # Date and Time
            openscale_row['DATE'] = parse_date(row['Date'])
            openscale_row['TIME'] = parse_time(row['Time'])

            # Core measurements
            openscale_row['WEIGHT'] = row['Weight(kg)']
            openscale_row['BMI'] = get_value(row, 'BMI')
            openscale_row['BMR'] = get_value(row, 'BMR(kcal)')
            openscale_row['CALORIES'] = get_value(row, 'BMR(kcal)')  # Same as BMR

            # Body composition
            openscale_row['BODY_FAT'] = get_value(row, 'Body Fat(%)')
            openscale_row['WATER'] = get_value(row, 'Body Water(%)')
            openscale_row['MUSCLE'] = get_value(row, 'Skeletal Muscle(%)')
            openscale_row['LBM'] = get_value(row, 'Fat-Free Mass(kg)')
            openscale_row['BONE'] = get_value(row, 'Bone Mass(kg)')
            openscale_row['VISCERAL_FAT'] = get_value(row, 'Visceral Fat')

            # Additional info to comment
            extras = []
            for key, label in [('Muscle Mass(kg)', 'Muscle Mass'),
                              ('Subcutaneous Fat(%)', 'Subcutaneous Fat'),
                              ('Protein(%)', 'Protein'),
                              ('Metabolic Age', 'Metabolic Age')]:
                val = get_value(row, key)
                if val:
                    extras.append(f"{label}: {val}")

            openscale_row['COMMENT'] = ' | '.join(extras) if extras else 'Renpho'

            writer.writerow(openscale_row)
            count += 1

    print(f"Converted {count} measurements to {output_file}")

I did use the script to import my historical data from renpho .

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementIndicates new feature requests

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions