From 895f2dcdc425295d3364f9c8dfc5f6c4d9da4eab Mon Sep 17 00:00:00 2001 From: tuxudo Date: Thu, 23 Feb 2023 16:47:50 -0500 Subject: [PATCH] Apple silicon fixes for MR 5 Python 3 (#23) * Fixed CPU Arch check * Fix for missing data on Big Sur+ * Fix broken widget * Update power_battery_condition_widget.php * Update for Apple Silicon Fixes battery manufacture date --- README.md | 11 +++++- locales/en.json | 8 ++++ .../2022_08_25_000001_power_apple_silicon.php | 39 +++++++++++++++++++ power_controller.php | 17 +++++--- power_model.php | 34 ++++++++-------- views/batteries_listing.php | 3 +- views/battery_tab.php | 28 +++++++++++-- views/power_battery_condition_widget.php | 4 +- 8 files changed, 112 insertions(+), 32 deletions(-) create mode 100644 migrations/2022_08_25_000001_power_apple_silicon.php diff --git a/README.md b/README.md index 1eced26..be15afa 100755 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ Reports on Power and Battery information - Power Supply information (Energy Saving settings) - Sleep / Wake settings - Other Power related information from pmset -- Battery information +- Battery and UPS information Note: Battery condition can fluctuate between "Service Battery" and "Normal". Data can be viewed at @@ -101,4 +101,11 @@ Table Schema * charging_current - FLOAT - Adapter current in use * charging_voltage - FLOAT - Adapter voltage in use * adapter_manufacturer - VARCHAR(255) - Adapter manufacturer -* adapter_name - VARCHAR(255) - Adapter name \ No newline at end of file +* adapter_name - VARCHAR(255) - Adapter name +* adapter_description - VARCHAR(255) - Adapter description +* max_charge_current - VARCHAR(255) - Battery maximum charge current +* max_discharge_current - VARCHAR(255) - Battery maximum discharge current +* max_pack_voltage - VARCHAR(255) - Battery maximum voltage +* min_pack_voltage - VARCHAR(255) - Battery minimum voltage +* max_temperature - VARCHAR(255) - Battery maximum temperature +* min_temperature - VARCHAR(255) - Battery minimum temperature \ No newline at end of file diff --git a/locales/en.json b/locales/en.json index 8ea2702..e74cb9b 100755 --- a/locales/en.json +++ b/locales/en.json @@ -4,6 +4,7 @@ "acwake": "AC Wake", "adapter": "Power Adapter", "adapter_id": "Adapter ID", + "adapter_description": "Adapter Description", "adapter_manufacturer": "Adapter Manufacturer", "adapter_name": "Adapter Name", "adapter_serial_number": "Adapter Serial Number", @@ -80,12 +81,19 @@ "manufacture_date": "Manufactured", "manufacturer": "Battery Manufacturer", "max_capacity": "Full Charge Capacity", + "max_charge_current": "Maximum Charge Current", + "max_discharge_current": "Maximum Discharge Current", + "max_pack_voltage": "Maximum Battery Voltage", "max_percent": "Health %", + "max_temperature": "Maximum Battery Temperature", + "min_pack_voltage": "Minimum Battery Voltage", + "min_temperature": "Minimum Battery Temperature", "minute": "minute", "minutes": "minutes", "networkclientactive": "Network Client Active", "networkoversleep": "Network Over Sleep", "never": "Never", + "pd_charger": "USB-C Power Delivery", "packreserve": "Battery Reserve Power", "permanentfailurestatus": "Battery Has Permanently Failed", "power": "Power", diff --git a/migrations/2022_08_25_000001_power_apple_silicon.php b/migrations/2022_08_25_000001_power_apple_silicon.php new file mode 100644 index 0000000..38a4d67 --- /dev/null +++ b/migrations/2022_08_25_000001_power_apple_silicon.php @@ -0,0 +1,39 @@ +table($this->tableName, function (Blueprint $table) { + $table->string('adapter_description')->nullable(); + $table->string('max_charge_current')->nullable(); + $table->string('max_discharge_current')->nullable(); + $table->string('max_pack_voltage')->nullable(); + $table->string('min_pack_voltage')->nullable(); + $table->string('max_temperature')->nullable(); + $table->string('min_temperature')->nullable(); + }); + } + + public function down() + { + $capsule = new Capsule(); + + $capsule::schema()->table($this->tableName, function (Blueprint $table) { + $table->dropColumn('adapter_description'); + $table->dropColumn('max_charge_current'); + $table->dropColumn('max_discharge_current'); + $table->dropColumn('max_pack_voltage'); + $table->dropColumn('min_pack_voltage'); + $table->dropColumn('max_temperature'); + $table->dropColumn('min_temperature'); + }); + } +} diff --git a/power_controller.php b/power_controller.php index 7ee6437..528254b 100755 --- a/power_controller.php +++ b/power_controller.php @@ -31,10 +31,16 @@ public function index() **/ public function get_stats() { + $sql = "SELECT COUNT(CASE WHEN max_percent>89 THEN 1 END) AS success, + COUNT(CASE WHEN max_percent BETWEEN 80 AND 89 THEN 1 END) AS warning, + COUNT(CASE WHEN max_percent BETWEEN 0 AND 79 THEN 1 END) AS danger + FROM power + LEFT JOIN reportdata USING(serial_number) + ".get_machine_group_filter(); + $obj = new View(); $pm = new Power_model; - $out[] = $pm->get_stats(); - $obj->view('json', array('msg' => $out)); + $obj->view('json', array('msg' => $pm->query($sql))); } /** @@ -45,8 +51,6 @@ public function get_stats() **/ public function conditions() { - $obj = new View(); - $queryobj = new Power_model(); $sql = "SELECT COUNT(CASE WHEN `condition` = 'Normal' OR `condition` = 'Good' THEN 1 END) AS good, COUNT(CASE WHEN `condition` = 'Service Battery' OR `condition` = 'ServiceBattery' OR `condition` = 'Check Battery' THEN 1 END) AS service, COUNT(CASE WHEN `condition` = 'Replace Soon' OR `condition` = 'ReplaceSoon' OR `condition` = 'Fair' THEN 1 END) AS fair, @@ -55,6 +59,9 @@ public function conditions() FROM power LEFT JOIN reportdata USING (serial_number) ".get_machine_group_filter(); + + $obj = new View(); + $queryobj = new Power_model(); $obj->view('json', array('msg' => current($queryobj->query($sql)))); } @@ -66,7 +73,7 @@ public function get_data($serial_number = '') { $serial_number = preg_replace("/[^A-Za-z0-9_\-]]/", '', $serial_number); - $sql = "SELECT `manufacture_date`, `design_capacity`, `max_capacity`, `max_percent`, `current_capacity`, `current_percent`, `cycle_count`, `designcyclecount`, `condition`, `temperature`, `externalconnected`, `ischarging`, `fullycharged`, `avgtimetofull`, `avgtimetoempty`, `timeremaining`, `instanttimetoempty`, `amperage`, `voltage`, `cellvoltage`, `permanentfailurestatus`, `manufacturer`, `batteryserialnumber`, `packreserve`, `wattage`, `adapter_name`, `adapter_manufacturer`, `adapter_current`, `adapter_voltage`, `adapter_id`, `family_code`, `adapter_serial_number`, `ups_name`, `ups_percent`, `ups_charging_status`, `haltlevel`, `haltafter`, `haltremain`, `active_profile`, `schedule`, `sleep_count`, `dark_wake_count`, `user_wake_count`, `standbydelay`, `standby`, `womp`, `halfdim`, `hibernatefile`, `gpuswitch`, `sms`, `networkoversleep`, `disksleep`, `sleep`, `autopoweroffdelay`, `hibernatemode`, `autopoweroff`, `ttyskeepawake`, `displaysleep`, `acwake`, `lidwake`, `sleep_on_power_button`, `powernap`, `autorestart`, `destroyfvkeyonstandby`, `cpu_scheduler_limit`, `cpu_available_cpus`, `cpu_speed_limit`, `combined_sys_load`, `user_sys_load`, `battery_level`, `thermal_level`, `backgroundtask`, `applepushservicetask`, `userisactive`, `preventuseridledisplaysleep`, `preventsystemsleep`, `externalmedia`, `preventuseridlesystemsleep`, `networkclientactive`, `sleep_prevented_by` + $sql = "SELECT `manufacture_date`, `design_capacity`, `max_capacity`, `max_percent`, `current_capacity`, `current_percent`, `cycle_count`, `designcyclecount`, `condition`, `temperature`, `externalconnected`, `ischarging`, `fullycharged`, `avgtimetofull`, `avgtimetoempty`, `timeremaining`, `instanttimetoempty`, `amperage`, `voltage`, `cellvoltage`, `permanentfailurestatus`, `manufacturer`, `batteryserialnumber`, `packreserve`, `max_charge_current`, `max_discharge_current`, `max_pack_voltage`, `min_pack_voltage`, `max_temperature`, `min_temperature`, `adapter_name`, `adapter_description`, `adapter_manufacturer`, `wattage`, `adapter_current`, `adapter_voltage`, `adapter_id`, `family_code`, `adapter_serial_number`, `ups_name`, `ups_percent`, `ups_charging_status`, `haltlevel`, `haltafter`, `haltremain`, `active_profile`, `schedule`, `sleep_count`, `dark_wake_count`, `user_wake_count`, `standbydelay`, `standby`, `womp`, `halfdim`, `hibernatefile`, `gpuswitch`, `sms`, `networkoversleep`, `disksleep`, `sleep`, `autopoweroffdelay`, `hibernatemode`, `autopoweroff`, `ttyskeepawake`, `displaysleep`, `acwake`, `lidwake`, `sleep_on_power_button`, `powernap`, `autorestart`, `destroyfvkeyonstandby`, `cpu_scheduler_limit`, `cpu_available_cpus`, `cpu_speed_limit`, `combined_sys_load`, `user_sys_load`, `battery_level`, `thermal_level`, `backgroundtask`, `applepushservicetask`, `userisactive`, `preventuseridledisplaysleep`, `preventsystemsleep`, `externalmedia`, `preventuseridlesystemsleep`, `networkclientactive`, `sleep_prevented_by` FROM power WHERE serial_number = '$serial_number'"; diff --git a/power_model.php b/power_model.php index 3b71206..692eec2 100755 --- a/power_model.php +++ b/power_model.php @@ -92,6 +92,13 @@ public function __construct($serial = '') $this->rs['charging_voltage'] = 0; $this->rs['adapter_manufacturer'] = ''; $this->rs['adapter_name'] = ''; + $this->rs['adapter_description'] = ''; + $this->rs['max_charge_current'] = ''; + $this->rs['max_discharge_current'] = ''; + $this->rs['max_pack_voltage'] = ''; + $this->rs['min_pack_voltage'] = ''; + $this->rs['max_temperature'] = ''; + $this->rs['min_temperature'] = ''; if ($serial) { @@ -101,22 +108,6 @@ public function __construct($serial = '') $this->serial = $serial; } - /** - * Get Power statistics - * - * - **/ - public function get_stats() - { - $sql = "SELECT COUNT(CASE WHEN max_percent>89 THEN 1 END) AS success, - COUNT(CASE WHEN max_percent BETWEEN 80 AND 89 THEN 1 END) AS warning, - COUNT(CASE WHEN max_percent BETWEEN 0 AND 79 THEN 1 END) AS danger - FROM power - LEFT JOIN reportdata USING(serial_number) - ".get_machine_group_filter(); - return current($this->query($sql)); - } - // ------------------------------------------------------------------------ /** * Process data sent by postflight @@ -285,11 +276,18 @@ private function _process_xml($data) 'IsCharging' => 'ischarging', 'DesignCycleCount9C' => 'designcyclecount', 'AvgTimeToEmpty' => 'avgtimetoempty', - 'sleep_prevented_by' => 'sleep_prevented_by' + 'sleep_prevented_by' => 'sleep_prevented_by', + 'adapter_description' => 'adapter_description', + 'max_charge_current' => 'max_charge_current', + 'max_discharge_current' => 'max_discharge_current', + 'max_pack_voltage' => 'max_pack_voltage', + 'min_pack_voltage' => 'min_pack_voltage', + 'max_temperature' => 'max_temperature', + 'min_temperature' => 'min_temperature' ); // Array of strings - $strings = array('manufacture_date', 'condition', 'hibernatefile', 'adapter_id', 'family_code', 'adapter_serial_number', 'adapter_manufacturer', 'adapter_name', 'combined_sys_load', 'user_sys_load', 'thermal_level', 'battery_level', 'ups_name', 'active_profile', 'ups_charging_status', 'externalconnected', 'cellvoltage', 'manufacturer', 'batteryserialnumber', 'fullycharged', 'ischarging','sleep_prevented_by','schedule'); + $strings = array('manufacture_date', 'condition', 'hibernatefile', 'adapter_id', 'family_code', 'adapter_serial_number', 'adapter_manufacturer', 'adapter_name', 'combined_sys_load', 'user_sys_load', 'thermal_level', 'battery_level', 'ups_name', 'active_profile', 'ups_charging_status', 'externalconnected', 'cellvoltage', 'manufacturer', 'batteryserialnumber', 'fullycharged', 'ischarging','sleep_prevented_by','schedule','adapter_description'); // Traverse the xml with translations foreach ($translate as $search => $field) { diff --git a/views/batteries_listing.php b/views/batteries_listing.php index 4aa1ae6..8d691cc 100755 --- a/views/batteries_listing.php +++ b/views/batteries_listing.php @@ -176,7 +176,8 @@ // Format percentage var charge=$('td:eq(9)', nRow).text(); if (charge != "" && (charge)) { - $('td:eq(9)', nRow).text(charge+'%').addClass('text-right'); + var cls = charge > 89 ? 'success' : (charge > 79 ? 'warning' : 'danger'); + $('td:eq(9)', nRow).html('
'+charge+'%
'); } else { $('td:eq(9)', nRow).text(''); } diff --git a/views/battery_tab.php b/views/battery_tab.php index 00d2c15..aa569d7 100644 --- a/views/battery_tab.php +++ b/views/battery_tab.php @@ -83,6 +83,12 @@ } else if(prop == "voltage" && d[prop] != "0.00" && d[prop] != "0"){ battery_rows = battery_rows + ''+i18n.t('power.'+prop)+''+d[prop]+" "+i18n.t('power.volts')+''; + // Format lifetime current + } else if(prop == "max_charge_current" || prop == "max_discharge_current"){ + battery_rows = battery_rows + ''+i18n.t('power.'+prop)+''+(d[prop]/1000).toFixed(2)+' '+i18n.t('power.amps')+''; + } else if(prop == "max_pack_voltage" || prop == "min_pack_voltage"){ + battery_rows = battery_rows + ''+i18n.t('power.'+prop)+''+(d[prop]/1000).toFixed(2)+' '+i18n.t('power.volts')+''; + // Format timeremaining, instanttimetoempty, avgtimetofull, avgtimetoempty } else if((prop == "timeremaining" || prop == "instanttimetoempty" || prop == "avgtimetofull" || prop == "avgtimetoempty") && d[prop] !== -1 && d[prop] !== '0' && d[prop] !== '65535'){ battery_rows = battery_rows + ''+i18n.t('power.'+prop)+''+moment.duration(parseInt(d[prop]), "minutes").humanize()+''; @@ -130,11 +136,19 @@ $('#battery-cnt').text(d['current_percent']+"%"); // Format temperature F/C - } else if(prop == "temperature" && d[prop] >= 10 && d['temp_format'] >= "F"){ + } else if((prop == "temperature" || prop == "max_temperature" || prop == "min_temperature") && d[prop] >= 10 && d['temp_format'] >= "F"){ + if (prop == "max_temperature" || prop == "min_temperature"){ + // This vaule is stored differently + d[prop] = (d[prop]*100) + } outtemp_c = (d[prop] / 100)+"°C"; outtemp_f = (((d[prop] * 9/5) + 3200) / 100).toFixed(2)+"°F"; battery_rows = battery_rows + ''+i18n.t('power.'+prop)+''+outtemp_f+''; - } else if(prop == "temperature" && d[prop] >= 10){ + } else if((prop == "temperature" || prop == "max_temperature" || prop == "min_temperature") && d[prop] >= 10){ + if (prop == "max_temperature" || prop == "min_temperature"){ + // This vaule is stored differently + d[prop] = (d[prop]*100) + } outtemp_c = (d[prop] / 100)+"°C"; outtemp_f = (((d[prop] * 9/5) + 3200) / 100).toFixed(2)+"°F"; battery_rows = battery_rows + ''+i18n.t('power.'+prop)+''+outtemp_c+''; @@ -148,11 +162,17 @@ } else if(prop == "adapter_voltage"){ adapter_rows = adapter_rows + ''+i18n.t('power.'+prop)+''+d[prop]+" "+i18n.t('power.volts')+''; // Format adapter amperage - } else if(prop == "adapter_voltage"){ + } else if(prop == "adapter_current"){ adapter_rows = adapter_rows + ''+i18n.t('power.'+prop)+''+d[prop]+" "+i18n.t('power.amps')+''; // Format adapter watts } else if(prop == "wattage"){ - adapter_rows = adapter_rows + ''+i18n.t('power.'+prop)+''+d[prop]+" "+i18n.t('power.watts')+''; + adapter_rows = adapter_rows + ''+i18n.t('power.adapter_wattage')+''+d[prop]+" "+i18n.t('power.watts')+''; + + // Format adapter description + } else if(prop == "adapter_description" && d[prop] == "pd charger"){ + adapter_rows = adapter_rows + ''+i18n.t('power.'+prop)+''+i18n.t('power.pd_charger')+''; + } else if(prop == "adapter_description" && d[prop] !== "pd charger"){ + adapter_rows = adapter_rows + ''+i18n.t('power.'+prop)+''+d[prop]+''; // Add adapter_rows strings } else if((prop == "adapter_id" || prop == "family_code" || prop == "adapter_serial_number" || prop == "adapter_name" || prop == "adapter_manufacturer")){ diff --git a/views/power_battery_condition_widget.php b/views/power_battery_condition_widget.php index da81c7d..bb35839 100755 --- a/views/power_battery_condition_widget.php +++ b/views/power_battery_condition_widget.php @@ -34,10 +34,10 @@ if(data.service && data.service != "0"){ panel.append(' '+data.service+'
'+i18n.t('power.widget.service')+'
'); } - if(data.fair && data.service != "0"){ + if(data.fair && data.fair != "0"){ panel.append(' '+data.fair+'
'+i18n.t('power.widget.soon')+'
'); } - if(data.good && data.service != "0"){ + if(data.good && data.good != "0"){ panel.append(' '+data.good+'
'+i18n.t('power.widget.normal')+'
'); } if(data.missing && data.missing != "0"){