#!/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 .
I did use the script to import my historical data from renpho .