Skip to content

Instantly share code, notes, and snippets.

@Kovah
Last active December 4, 2024 08:16
Show Gist options
  • Save Kovah/3f3ce850f90f9070784f30d6915893da to your computer and use it in GitHub Desktop.
Save Kovah/3f3ce850f90f9070784f30d6915893da to your computer and use it in GitHub Desktop.
Health Dashboard: Health Metric Model
<?php
namespace App\Modules\AppleHealth\Models;
use App\Modules\AppleHealth\Enums\Unit; // @see https://gist.github.com/Kovah/5a8b17e33ddeca54fd8e4a402a46e158
use Illuminate\Database\Eloquent\Model;
class HealthMetric extends Model
{
public static array $metricUnits = [
'active_energy' => Unit::KILO_JOULE,
'apple_exercise_time' => Unit::MINUTES,
'apple_stand_hour' => Unit::COUNT,
'apple_stand_time' => Unit::MINUTES,
'basal_body_temperature' => Unit::DEGREES_CELSIUS,
'basal_energy_burned' => Unit::KILO_JOULE,
'blood_alcohol_content' => Unit::PERCENT,
'blood_glucose' => Unit::MOLARITY_LITRES,
'blood_oxygen_saturation' => Unit::PERCENT,
'blood_pressure' => Unit::MILLIMETRE_OF_MERCURY,
'body_fat_percentage' => Unit::PERCENT,
'body_mass_index' => Unit::COUNT,
'body_temperature' => Unit::DEGREES_CELSIUS,
'calcium' => Unit::MILLI_GRAMS,
'carbohydrates' => Unit::GRAMS,
'chloride' => Unit::MILLI_GRAMS,
'chromium' => Unit::MICRO_GRAMS,
'copper' => Unit::MILLI_GRAMS,
'cycling_distance' => Unit::KILO_METRES,
'dietary_biotin' => Unit::MICRO_GRAMS,
'dietary_caffeine' => Unit::MILLI_GRAMS,
'dietary_cholesterol' => Unit::MILLI_GRAMS,
'dietary_energy' => Unit::KILO_JOULE,
'dietary_sugar' => Unit::GRAMS,
'dietary_water' => Unit::MILLI_LITRES,
'distance_downhill_snow_sports' => Unit::KILO_METRES,
'environmental_audio_exposure' => Unit::SOUND_PRESSURE,
'fiber' => Unit::GRAMS,
'flights_climbed' => Unit::COUNT,
'folate' => Unit::MICRO_GRAMS,
'forced_expiratory_volume_1' => Unit::LITRES,
'forced_vital_capacity' => Unit::LITRES,
'handwashing' => Unit::SECONDS,
'headphone_audio_exposure' => Unit::SOUND_PRESSURE,
'heart_rate' => Unit::COUNT_PER_MIN,
'heart_rate_variability' => Unit::MILLI_SECONDS,
'height' => Unit::METRES,
'high_heart_rate_notifications' => Unit::COUNT,
'inhaler_usage' => Unit::COUNT,
'insulin_delivery' => Unit::INTERNATIONAL_UNITS,
'iodine' => Unit::MICRO_GRAMS,
'iron' => Unit::MILLI_GRAMS,
'irregular_heart_rate_notifications' => Unit::COUNT,
'lean_body_mass' => Unit::KILO_GRAMS,
'low_heart_rate_notifications' => Unit::COUNT,
'magnesium' => Unit::MILLI_GRAMS,
'manganese' => Unit::MILLI_GRAMS,
'mindful_minutes' => Unit::MINUTES,
'molybdenum' => Unit::MICRO_GRAMS,
'monounsaturated_fat' => Unit::GRAMS,
'niacin' => Unit::MILLI_GRAMS,
'number_of_times_fallen' => Unit::COUNT,
'pantothenic_acid' => Unit::MILLI_GRAMS,
'peak_expiratory_flow_rate' => Unit::LITRES_PER_MIN,
'peripheral_perfusion_index' => Unit::PERCENT,
'polyunsaturated_fat' => Unit::GRAMS,
'potassium' => Unit::MILLI_GRAMS,
'protein' => Unit::GRAMS,
'push_count' => Unit::COUNT,
'respiratory_rate' => Unit::COUNT_PER_MIN,
'resting_heart_rate' => Unit::COUNT_PER_MIN,
'riboflavin' => Unit::MILLI_GRAMS,
'saturated_fat' => Unit::GRAMS,
'selenium' => Unit::MICRO_GRAMS,
'sexual_activity' => Unit::COUNT,
'six_minute_walking_test_distance' => Unit::METRES,
'sleep_analysis' => Unit::HOURS,
'sodium' => Unit::MILLI_GRAMS,
'stair_speed_down' => Unit::METRES_PER_SECOND,
'stair_speed_up' => Unit::METRES_PER_SECOND,
'step_count' => Unit::COUNT,
'swimming_distance' => Unit::METRES,
'swimming_stroke_count' => Unit::COUNT,
'thiamin' => Unit::MILLI_GRAMS,
'toothbrushing' => Unit::SECONDS,
'total_fat' => Unit::GRAMS,
'vo2_max' => Unit::VO2_MAX,
'vitamin_a' => Unit::MICRO_GRAMS,
'vitamin_b12' => Unit::MICRO_GRAMS,
'vitamin_b6' => Unit::MILLI_GRAMS,
'vitamin_c' => Unit::MILLI_GRAMS,
'vitamin_d' => Unit::MICRO_GRAMS,
'vitamin_e' => Unit::MILLI_GRAMS,
'vitamin_k' => Unit::MICRO_GRAMS,
'waist_circumference' => Unit::CENTI_METRES,
'walking_running_distance' => Unit::KILO_METRES,
'walking_asymmetry_percentage' => Unit::PERCENT,
'walking_double_support_percentage' => Unit::PERCENT,
'walking_heart_rate_average' => Unit::COUNT_PER_MIN,
'walking_speed' => Unit::KILOMETRES_PER_HOUR,
'walking_step_length' => Unit::CENTI_METRES,
'weight_body_mass' => Unit::KILO_GRAMS,
'wheelchair_distance' => Unit::KILO_METRES,
'zinc' => Unit::MILLI_GRAMS,
];
public $incrementing = false;
public $timestamps = false;
protected $table = 'applehealth_metrics';
protected $keyType = 'string';
protected $fillable = [
'user_id',
'name',
'value',
'date',
];
protected $casts = [
'user_id' => 'int',
'date' => 'datetime',
];
public function getKey()
{
return 'date';
}
public function getFormattedValueAttribute(): string
{
$unit = self::$metricUnits[$this->name]?->value ?? '';
return match ($this->name) {
'sleep_analysis' => json_encode(json_decode($this->value, true), JSON_PRETTY_PRINT),
default => sprintf('%f %s', $this->value, $unit),
};
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment