Skip to content

Commit

Permalink
Apple silicon fixes for MR 5 Python 3 (#23)
Browse files Browse the repository at this point in the history
* 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
  • Loading branch information
tuxudo authored Feb 23, 2023
1 parent 53a1809 commit 895f2dc
Show file tree
Hide file tree
Showing 8 changed files with 112 additions and 32 deletions.
11 changes: 9 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
* 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
8 changes: 8 additions & 0 deletions locales/en.json
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand Down Expand Up @@ -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",
Expand Down
39 changes: 39 additions & 0 deletions migrations/2022_08_25_000001_power_apple_silicon.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
<?php
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Capsule\Manager as Capsule;

class PowerAppleSilicon extends Migration
{
private $tableName = 'power';

public function up()
{
$capsule = new Capsule();

$capsule::schema()->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');
});
}
}
17 changes: 12 additions & 5 deletions power_controller.php
Original file line number Diff line number Diff line change
Expand Up @@ -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)));
}

/**
Expand All @@ -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,
Expand All @@ -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))));
}

Expand All @@ -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'";

Expand Down
34 changes: 16 additions & 18 deletions power_model.php
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand All @@ -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
Expand Down Expand Up @@ -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) {
Expand Down
3 changes: 2 additions & 1 deletion views/batteries_listing.php
Original file line number Diff line number Diff line change
Expand Up @@ -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('<div class="progress"><div class="progress-bar progress-bar-'+cls+'" style="width: '+charge+'%;">'+charge+'%</div></div>');
} else {
$('td:eq(9)', nRow).text('');
}
Expand Down
28 changes: 24 additions & 4 deletions views/battery_tab.php
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,12 @@
} else if(prop == "voltage" && d[prop] != "0.00" && d[prop] != "0"){
battery_rows = battery_rows + '<tr><th>'+i18n.t('power.'+prop)+'</th><td>'+d[prop]+" "+i18n.t('power.volts')+'</td></tr>';

// Format lifetime current
} else if(prop == "max_charge_current" || prop == "max_discharge_current"){
battery_rows = battery_rows + '<tr><th>'+i18n.t('power.'+prop)+'</th><td>'+(d[prop]/1000).toFixed(2)+' '+i18n.t('power.amps')+'</td></tr>';
} else if(prop == "max_pack_voltage" || prop == "min_pack_voltage"){
battery_rows = battery_rows + '<tr><th>'+i18n.t('power.'+prop)+'</th><td>'+(d[prop]/1000).toFixed(2)+' '+i18n.t('power.volts')+'</td></tr>';

// 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 + '<tr><th>'+i18n.t('power.'+prop)+'</th><td><span title="'+d[prop]+' '+i18n.t('power.minutes')+'">'+moment.duration(parseInt(d[prop]), "minutes").humanize()+'</span></td></tr>';
Expand Down Expand Up @@ -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 + '<tr><th>'+i18n.t('power.'+prop)+'</th><td><span title="'+outtemp_c+'">'+outtemp_f+'</span></td></tr>';
} 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 + '<tr><th>'+i18n.t('power.'+prop)+'</th><td><span title="'+outtemp_f+'">'+outtemp_c+'</span></td></tr>';
Expand All @@ -148,11 +162,17 @@
} else if(prop == "adapter_voltage"){
adapter_rows = adapter_rows + '<tr><th>'+i18n.t('power.'+prop)+'</th><td>'+d[prop]+" "+i18n.t('power.volts')+'</td></tr>';
// Format adapter amperage
} else if(prop == "adapter_voltage"){
} else if(prop == "adapter_current"){
adapter_rows = adapter_rows + '<tr><th>'+i18n.t('power.'+prop)+'</th><td>'+d[prop]+" "+i18n.t('power.amps')+'</td></tr>';
// Format adapter watts
} else if(prop == "wattage"){
adapter_rows = adapter_rows + '<tr><th>'+i18n.t('power.'+prop)+'</th><td>'+d[prop]+" "+i18n.t('power.watts')+'</td></tr>';
adapter_rows = adapter_rows + '<tr><th>'+i18n.t('power.adapter_wattage')+'</th><td>'+d[prop]+" "+i18n.t('power.watts')+'</td></tr>';

// Format adapter description
} else if(prop == "adapter_description" && d[prop] == "pd charger"){
adapter_rows = adapter_rows + '<tr><th>'+i18n.t('power.'+prop)+'</th><td>'+i18n.t('power.pd_charger')+'</td></tr>';
} else if(prop == "adapter_description" && d[prop] !== "pd charger"){
adapter_rows = adapter_rows + '<tr><th>'+i18n.t('power.'+prop)+'</th><td>'+d[prop]+'</td></tr>';

// Add adapter_rows strings
} else if((prop == "adapter_id" || prop == "family_code" || prop == "adapter_serial_number" || prop == "adapter_name" || prop == "adapter_manufacturer")){
Expand Down
4 changes: 2 additions & 2 deletions views/power_battery_condition_widget.php
Original file line number Diff line number Diff line change
Expand Up @@ -34,10 +34,10 @@
if(data.service && data.service != "0"){
panel.append(' <a href="'+baseUrl+'#service" class="btn btn-danger"><span class="bigger-150">'+data.service+'</span><br>'+i18n.t('power.widget.service')+'</a>');
}
if(data.fair && data.service != "0"){
if(data.fair && data.fair != "0"){
panel.append(' <a href="'+baseUrl+'#fair" class="btn btn-warning"><span class="bigger-150">'+data.fair+'</span><br>'+i18n.t('power.widget.soon')+'</a>');
}
if(data.good && data.service != "0"){
if(data.good && data.good != "0"){
panel.append(' <a href="'+baseUrl+'#good" class="btn btn-success"><span class="bigger-150">'+data.good+'</span><br>'+i18n.t('power.widget.normal')+'</a>');
}
if(data.missing && data.missing != "0"){
Expand Down

0 comments on commit 895f2dc

Please sign in to comment.