Skip to content
Open
Show file tree
Hide file tree
Changes from 4 commits
Commits
Show all changes
108 commits
Select commit Hold shift + click to select a range
9517f07
add auto tune
KillerInk Jul 17, 2025
aca0d95
Merge branch 'master' into master_autoclock
KillerInk Jul 18, 2025
ae3fc1e
add corevoltage and frequency to chart and statistics_task
KillerInk Jul 21, 2025
0bb3c8b
Merge remote-tracking branch 'killerink/master_autoclock' into master…
KillerInk Jul 21, 2025
3d2a3af
requested changes
KillerInk Jul 24, 2025
cbddaa9
add overshot values for power and fan to adjust critical limits
KillerInk Jul 24, 2025
bfa5d98
beautify autotune settings and add tooltip
KillerInk Jul 25, 2025
4fca33d
add vf ratios limits
KillerInk Jul 25, 2025
2f4825f
load vf ratio from nvs
KillerInk Jul 25, 2025
8ac323f
fix double loading and saving
KillerInk Jul 25, 2025
e540b4e
Merge branch 'master' into master_autoclock
KillerInk Jul 25, 2025
6d563af
auto_tune setting style match now overall style. move it out of setti…
KillerInk Jul 26, 2025
3c0b64b
Merge branch 'master_autoclock' of https://github.com/KillerInk/ESP-M…
KillerInk Jul 26, 2025
906d929
disable autotune on clean start. try to get the autotune checkbox wor…
KillerInk Jul 27, 2025
b109fca
fix settings
KillerInk Jul 27, 2025
d3d0760
Merge branch 'master' into master_autoclock
KillerInk Jul 28, 2025
dd8ff3e
fix settings
KillerInk Jul 28, 2025
64bfde7
fix chart tooltip showed h/s on all datasets. fix that applied voltag…
KillerInk Jul 28, 2025
f5ffac1
Merge branch 'master_autoclock' of https://github.com/KillerInk/ESP-M…
KillerInk Jul 28, 2025
98f8c80
always update avghashrate and last hashrate also if not tuning
KillerInk Jul 28, 2025
ccfcdf9
extend tooltip descriptions.
KillerInk Jul 28, 2025
a755df7
clean up and make things easier. bring back hashrate_decreased to swi…
KillerInk Jul 29, 2025
89cf2a4
remove switch and decrease_values
KillerInk Jul 30, 2025
ec86fe9
replace input with slider
KillerInk Jul 31, 2025
737bacf
Fix component layout
Jul 31, 2025
b48b6a2
Merge pull request #1 from duckAxe/feature/pr/autotune
KillerInk Jul 31, 2025
6d63f52
add vr temp limit
KillerInk Jul 31, 2025
a3143bb
Merge remote-tracking branch 'killerink/master_autoclock' into master…
KillerInk Jul 31, 2025
5af830b
add max vr temp to settings
KillerInk Jul 31, 2025
799860f
track hashrate
KillerInk Aug 4, 2025
a0951ea
Merge remote-tracking branch 'killerink/master' into master_autoclock
KillerInk Aug 5, 2025
54a23e5
update hashrate history always
KillerInk Aug 5, 2025
d71018d
Merge remote-tracking branch 'origin/master' into master_autoclock
KillerInk Aug 10, 2025
486b5f2
fix build
KillerInk Aug 10, 2025
08fd1b1
optimize descriptions, add defaults to description
KillerInk Aug 10, 2025
1508498
Merge remote-tracking branch 'origin/master' into master_autoclock
KillerInk Aug 17, 2025
62321ca
Merge remote-tracking branch 'killerink/master' into master_autoclock
KillerInk Aug 28, 2025
7f5dfdd
Merge remote-tracking branch 'killerink/master' into master_autoclock
KillerInk Aug 28, 2025
a8d7e52
Merge branch 'master' into master_autoclock
KillerInk Sep 2, 2025
afaabca
Merge branch 'master' into master_autoclock
KillerInk Sep 4, 2025
90becea
switch to double precision for frequency and core_voltage
KillerInk Sep 6, 2025
8e44ebc
trim to two decimals
KillerInk Sep 6, 2025
1cbe629
Merge branch 'master' into master_autoclock
KillerInk Sep 7, 2025
8393f1d
Merge branch 'master' into master_autoclock
KillerInk Sep 15, 2025
1860be0
no need to send status ok
KillerInk Sep 15, 2025
27d24dc
indent
KillerInk Sep 15, 2025
13178ab
rename
KillerInk Sep 15, 2025
08c4eb8
if pid active set minimum for temperature limit to pid target temp +1
KillerInk Sep 15, 2025
3852860
use ISystemInfo instead of any
KillerInk Sep 15, 2025
56cc93e
add api endpoints to readme
KillerInk Sep 15, 2025
72c7cac
Merge remote-tracking branch 'killerink/master' into master_autoclock
KillerInk Sep 21, 2025
1e308f5
Merge branch 'master' into master_autoclock
KillerInk Sep 23, 2025
12d86bd
Merge branch 'master' into master_autoclock
KillerInk Sep 25, 2025
1eaa8b9
Merge branch 'master' into master_autoclock
KillerInk Oct 5, 2025
20557ec
send empty status...^^
KillerInk Oct 5, 2025
44d179a
remove not used pid_control_fanspeed
KillerInk Oct 5, 2025
4b995e5
autotune.component: limit min fanspeed to pid min+1 in
KillerInk Oct 5, 2025
cb52a96
use minFanSpeed
KillerInk Oct 5, 2025
6548816
set same max as pid target temp
KillerInk Oct 5, 2025
eabf7f1
fix merge
KillerInk Oct 5, 2025
257e246
fix frequency stats
KillerInk Oct 6, 2025
35d0f8f
Merge remote-tracking branch 'killerink/master' into master_autoclock
KillerInk Oct 7, 2025
1873664
Merge branch 'master' into master_autoclock
KillerInk Oct 8, 2025
eaa839e
fix stats frequency. maybe interval would be better^^
KillerInk Oct 20, 2025
3870a49
Merge remote-tracking branch 'killerink/master_autoclock' into master…
KillerInk Oct 20, 2025
13c6c77
Merge remote-tracking branch 'killerink/master' into master_autoclock
KillerInk Oct 20, 2025
fe66e8b
back to floats
KillerInk Oct 22, 2025
1236020
Merge branch 'master' into master_autoclock
KillerInk Oct 22, 2025
9065d16
Merge remote-tracking branch 'killerink/master' into master_autoclock
KillerInk Oct 27, 2025
ebc6350
fix merge
KillerInk Oct 28, 2025
12b6905
limit floats diff
KillerInk Oct 28, 2025
0e928cd
Merge remote-tracking branch 'killerink/master' into master_autoclock
KillerInk Oct 29, 2025
83a176b
fix things
KillerInk Oct 29, 2025
337d6ea
fix more^^
KillerInk Oct 29, 2025
77b32b5
Merge remote-tracking branch 'killerink/master' into master_autoclock
KillerInk Nov 2, 2025
7663066
Merge branch 'master' into master_autoclock
KillerInk Nov 2, 2025
d2dd049
Merge branch 'master' into master_autoclock
KillerInk Nov 3, 2025
6591b47
float hashrate
KillerInk Nov 3, 2025
4e7f936
add chip_temp2_avg to autotune
KillerInk Nov 3, 2025
80bf160
Merge remote-tracking branch 'killerink/master' into master_autoclock
KillerInk Nov 3, 2025
30bce36
Merge remote-tracking branch 'killerink/master_autoclock' into master…
KillerInk Nov 3, 2025
8353fab
code align
KillerInk Nov 4, 2025
1bcb02e
Merge remote-tracking branch 'killerink/master' into master_autoclock
KillerInk Nov 4, 2025
e8512e9
Merge branch 'master' into master_autoclock
KillerInk Nov 5, 2025
a7e69b0
Merge branch 'master' into master_autoclock
KillerInk Nov 6, 2025
9bcb9e4
Merge remote-tracking branch 'killerink/master' into master_autoclock
KillerInk Nov 9, 2025
ce00cd7
Merge remote-tracking branch 'killerink/master' into master_autoclock
KillerInk Nov 10, 2025
42fcbcd
use power limit from info.maxpower, use max voltage from asic.default…
KillerInk Nov 10, 2025
dbaa819
change voltage precisions to 2
KillerInk Nov 10, 2025
5f65ca8
floating frequency
KillerInk Nov 10, 2025
36be93a
workaround hashrate drop 0 on frequency change
KillerInk Nov 10, 2025
b978fba
return on frequency change and ignore register for this round
KillerInk Nov 10, 2025
36047b0
Revert "return on frequency change and ignore register for this round"
KillerInk Nov 11, 2025
a4cab83
Revert "workaround hashrate drop 0 on frequency change"
KillerInk Nov 11, 2025
767fd58
Merge remote-tracking branch 'killerink/master' into master_autoclock
KillerInk Nov 11, 2025
a40e542
drop vr min max limits
KillerInk Nov 11, 2025
830dae5
use device specific max values for frequency and voltage
KillerInk Nov 11, 2025
a55d0eb
Merge branch 'master' into master_autoclock
KillerInk Nov 15, 2025
b2f5bb3
Merge branch 'master' into master_autoclock
KillerInk Nov 18, 2025
97ee116
increase voltage precision to 3
KillerInk Nov 18, 2025
0a0c195
poll every 1000ms
KillerInk Nov 18, 2025
3c27720
tune against error
KillerInk Nov 18, 2025
638c63e
Merge remote-tracking branch 'killerink/master_autoclock' into master…
KillerInk Nov 18, 2025
05ec3d0
Merge branch 'master' into master_autoclock
KillerInk Nov 19, 2025
febc0e4
Use <tooltip-text-icon> component for tooltips
Nov 19, 2025
f918565
Code indent
Nov 19, 2025
7b892d3
Merge pull request #4 from duckaxe/cr/1152
KillerInk Nov 20, 2025
ee7735c
Merge remote-tracking branch 'killerink/master' into master_autoclock
KillerInk Nov 20, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions main/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ SRCS
"./thermal/TMP1075.c"
"./thermal/thermal.c"
"./thermal/PID.c"
"./thermal/auto_tune.c"
"./power/TPS546.c"
"./power/DS4432U.c"
"./power/INA260.c"
Expand Down
2 changes: 2 additions & 0 deletions main/http_server/axe-os/src/app/app.module.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ import { SystemComponent } from './components/system/system.component';
import { UpdateComponent } from './components/update/update.component';
import { NetworkComponent } from './components/network/network.component';
import { SettingsComponent } from './components/settings/settings.component';
import { AutotuneComponent } from './components/autotune/autotune.component';
import { SwarmComponent } from './components/swarm/swarm.component';
import { ThemeConfigComponent } from './components/design/theme-config.component';
import { DesignComponent } from './components/design/design.component';
Expand All @@ -37,6 +38,7 @@ import { DialogService, DialogListComponent } from './services/dialog.service';
const components = [
AppComponent,
EditComponent,
AutotuneComponent,
NetworkEditComponent,
HomeComponent,
ModalComponent,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
<ng-container>
<div class="card">
<form [formGroup]="autotuneForm" (ngSubmit)="updateAutotune()" *ngIf="autotuneForm">
<h3>Autotune Settings</h3>
<div class="form-check mb-3">
<label for="auto_tune_hashrate">Auto Tune Hashrate</label>
<input type="checkbox" id="auto_tune_hashrate" formControlName="auto_tune_hashrate" />
</div>
<div class="row">
<div class="col">
<label>Power Limit</label>
<input type="number" class="form-control" formControlName="power_limit">
</div>
<div class="col">
<label>Fan Limit</label>
<input type="number" class="form-control" formControlName="fan_limit">
</div>
<div class="col">
<label>Max Voltage ASIC</label>
<input type="number" class="form-control" formControlName="max_voltage_asic">
</div>
<div class="col">
<label>Max Frequency ASIC</label>
<input type="number" class="form-control" formControlName="max_frequency_asic">
</div>
<div class="col">
<label>Max ASIC Temperatur</label>
<input type="number" class="form-control" formControlName="max_asic_temperatur">
</div>
</div>
<button type="submit" class="btn btn-primary" [disabled]="!autotuneForm.valid">Save Autotune
Settings</button>
</form>
</div>
</ng-container>
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
import { ComponentFixture, TestBed } from '@angular/core/testing';

import { AutotuneComponent } from './autotune.component';

describe('SettingsComponent', () => {
let component: AutotuneComponent;
let fixture: ComponentFixture<AutotuneComponent>;

beforeEach(() => {
TestBed.configureTestingModule({
declarations: [AutotuneComponent]
});
fixture = TestBed.createComponent(AutotuneComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});

it('should create', () => {
expect(component).toBeTruthy();
});
});
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
import { Component, OnInit, ViewChild } from '@angular/core';
import { FormBuilder, FormGroup, Validators } from '@angular/forms';
import { HttpErrorResponse, HttpEventType } from '@angular/common/http';
import { SystemService } from 'src/app/services/system.service';
import { ToastrService } from 'ngx-toastr';

@Component({
selector: 'autotune',
templateUrl: './autotune.component.html',
})
export class AutotuneComponent implements OnInit {
constructor(private fb: FormBuilder,
private systemService: SystemService,
private toastr: ToastrService,) { }
public autotuneForm!: FormGroup;
public autotuneInfo: any = {};

//private toastr: ToastrService;
//private toastrService: ToastrService;
//private loadingService: LoadingService;


ngOnInit() {
this.autotuneForm = this.fb.group({
auto_tune_hashrate: [true, [Validators.required, Validators.required]],
power_limit: [20, [Validators.required, Validators.min(1)]],
fan_limit: [75, [Validators.required, Validators.min(1)]],
max_voltage_asic: [1400, [Validators.required, Validators.min(1)]],
max_frequency_asic: [1000, [Validators.required, Validators.min(1)]],
max_asic_temperatur: [65, [Validators.required, Validators.min(1)]],
});

// Load autotune settings from API and patch the form if available
this.systemService.getAutotune().subscribe({
next: autotune => {
this.autotuneInfo = autotune;
this.autotuneForm.patchValue({
auto_tune_hashrate: autotune.auto_tune_hashrate,
power_limit: autotune.power_limit ?? 20,
fan_limit: autotune.fan_limit ?? 75,
max_voltage_asic: autotune.max_voltage_asic ?? 1400,
max_frequency_asic: autotune.max_frequency_asic ?? 1000,
max_asic_temperatur: autotune.max_asic_temperatur ?? 65,
});
},
error: err => { this.toastr.error('Failed to load autotune settings'); }
});
}



public updateAutotune() {
if (!this.autotuneForm.valid) return;
this.systemService.updateAutotune(this.autotuneForm.value)
.subscribe({
next: () => this.toastr.success('Autotune settings saved!', 'Success'),
error: (err: HttpErrorResponse) => this.toastr.error('Could not save autotune settings.', err.message)
});
}
}
94 changes: 89 additions & 5 deletions main/http_server/axe-os/src/app/components/home/home.component.ts
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,8 @@ export class HomeComponent {
public hashrateData: number[] = [];
public temperatureData: number[] = [];
public powerData: number[] = [];
public frequencyData: number[] = [];
public voltageData: number[] = [];
public chartData?: any;

public maxPower: number = 0;
Expand Down Expand Up @@ -72,13 +74,19 @@ export class HomeComponent {
const textColorSecondary = documentStyle.getPropertyValue('--text-color-secondary');
const surfaceBorder = documentStyle.getPropertyValue('--surface-border');
const primaryColor = documentStyle.getPropertyValue('--primary-color');
const frequencyColor = documentStyle.getPropertyValue('--green-800');
const voltageColor = documentStyle.getPropertyValue('--orange-800');

// Update chart colors
if (this.chartData && this.chartData.datasets) {
this.chartData.datasets[0].backgroundColor = primaryColor + '30';
this.chartData.datasets[0].borderColor = primaryColor;
this.chartData.datasets[1].backgroundColor = textColorSecondary;
this.chartData.datasets[1].borderColor = textColorSecondary;
this.chartData.datasets[2].backgroundColor = frequencyColor;
this.chartData.datasets[2].borderColor = frequencyColor;
this.chartData.datasets[3].backgroundColor = voltageColor;
this.chartData.datasets[3].borderColor = voltageColor;
}

// Update chart options
Expand All @@ -90,6 +98,10 @@ export class HomeComponent {
this.chartOptions.scales.y.grid.color = surfaceBorder;
this.chartOptions.scales.y2.ticks.color = textColorSecondary;
this.chartOptions.scales.y2.grid.color = surfaceBorder;
this.chartOptions.scales.y3.ticks.color = frequencyColor;
this.chartOptions.scales.y3.grid.color = surfaceBorder;
this.chartOptions.scales.y4.ticks.color = voltageColor;
this.chartOptions.scales.y4.grid.color = surfaceBorder;
}

// Force chart update
Expand All @@ -104,6 +116,8 @@ export class HomeComponent {
const textColorSecondary = documentStyle.getPropertyValue('--text-color-secondary');
const surfaceBorder = documentStyle.getPropertyValue('--surface-border');
const primaryColor = documentStyle.getPropertyValue('--primary-color');
const frequencyColor = documentStyle.getPropertyValue('--green-800');
const voltageColor = documentStyle.getPropertyValue('--orange-800');

this.chartData = {
labels: [],
Expand Down Expand Up @@ -133,6 +147,32 @@ export class HomeComponent {
pointHoverRadius: 5,
borderWidth: 1,
yAxisID: 'y2',
},
{
type: 'line',
label: 'Frequency',
data: [this.temperatureData],
fill: false,
backgroundColor: frequencyColor,
borderColor: frequencyColor,
tension: 0,
pointRadius: 2,
pointHoverRadius: 5,
borderWidth: 1,
yAxisID: 'y3',
},
{
type: 'line',
label: 'Voltage',
data: [this.temperatureData],
fill: false,
backgroundColor: voltageColor,
borderColor: voltageColor,
tension: 0,
pointRadius: 2,
pointHoverRadius: 5,
borderWidth: 1,
yAxisID: 'y4',
}
]
};
Expand All @@ -155,7 +195,14 @@ export class HomeComponent {
}
if (tooltipItem.dataset.label === 'ASIC Temp') {
label += tooltipItem.raw + '°C';
} else {
}
if (tooltipItem.dataset.label === 'Frequency') {
label += tooltipItem.raw + 'mhz';
}
if (tooltipItem.dataset.label === 'Voltage') {
label += tooltipItem.raw + 'mv';
}
else {
label += HashSuffixPipe.transform(tooltipItem.raw);
}
return label;
Expand Down Expand Up @@ -201,13 +248,43 @@ export class HomeComponent {
color: surfaceBorder
},
suggestedMax: 80
},
y3: {
type: 'linear',
display: true,
position: 'right',
ticks: {
color: frequencyColor,
callback: (value: number) => value + 'mhz'
},
grid: {
drawOnChartArea: false,
color: surfaceBorder
},
suggestedMax: 1200
},
y4: {
type: 'linear',
display: true,
position: 'right',
ticks: {
color: voltageColor,
callback: (value: number) => value + 'mv'
},
grid: {
drawOnChartArea: false,
color: surfaceBorder
},
suggestedMax: 1400
}
}
};

this.chartData.labels = this.dataLabel;
this.chartData.datasets[0].data = this.hashrateData;
this.chartData.datasets[1].data = this.temperatureData;
this.chartData.datasets[2].data = this.frequencyData;
this.chartData.datasets[3].data = this.voltageData;

// load previous data
this.stats$ = this.systemService.getStatistics().pipe(shareReplay({ refCount: true, bufferSize: 1 }));
Expand All @@ -222,21 +299,24 @@ export class HomeComponent {
this.temperatureData.push(element[idxTemperature]);
this.powerData.push(element[idxPower]);
this.dataLabel.push(new Date().getTime() - stats.currentTimestamp + element[idxTimestamp]);
this.frequencyData.push(element[4]);
this.voltageData.push(element[5]);

if (this.hashrateData.length >= 720) {
this.hashrateData.shift();
this.temperatureData.shift();
this.powerData.shift();
this.dataLabel.shift();
this.frequencyData.shift();
this.voltageData.shift();
}
}),
this.startGetLiveData();
this.startGetLiveData();
});
}

private startGetLiveData()
{
// live data
private startGetLiveData() {
// live data
this.info$ = interval(5000).pipe(
startWith(() => this.systemService.getInfo()),
switchMap(() => {
Expand All @@ -249,12 +329,16 @@ export class HomeComponent {
this.temperatureData.push(info.temp);
this.powerData.push(info.power);
this.dataLabel.push(new Date().getTime());
this.frequencyData.push(info.frequency);
this.voltageData.push(info.coreVoltage);

if ((this.hashrateData.length) >= 720) {
this.hashrateData.shift();
this.temperatureData.shift();
this.powerData.shift();
this.dataLabel.shift();
this.frequencyData.shift();
this.voltageData.shift();
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,3 +2,4 @@
<h2>Settings</h2>
<app-edit></app-edit>
</div>
<autotune></autotune>
8 changes: 8 additions & 0 deletions main/http_server/axe-os/src/app/services/system.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -185,4 +185,12 @@ export class SystemService {
public updateSwarm(uri: string = '', swarmConfig: any) {
return this.httpClient.patch(`${uri}/api/swarm`, swarmConfig);
}

public getAutotune() {
return this.httpClient.get<any>('/api/system/autotune');
}

public updateAutotune(data: any) {
return this.httpClient.post('/api/system/autotune', data);
}
}
Loading
Loading