
Automatische Anpassung bei Temperaturänderung
Hi Kollegen 🖖
Nachdem mir während der letzen heißen Tage die Bit Axes öfter mal zu warm wurden, habe ich mich mal hingesetzt und überlegt, wie man das Problem handeln und die Jungs in einem gesunden Zustand halten kann, auch wenn man mal weg ist.
Die Lösung ist einfach, ich hab noch nen raspi4 laufen, auf dem iobroker installiert ist.
Dort habe ich den Adapter „BitOXMining“ hinzugefügt womit man schon mal die wichtigsten Parameter auslesen oder auch visualisieren kann.
Zum Schluß habe ich ChatGpt noch gebeten, mir eine Regelung via Javascript zu coden, die Asic und Vr unter 70 Grad hält und das Ergebnis ist prima.
Anbei das script: (c) by ChatGpt
// =====================
// DATENPUNKTE
// =====================
const TEMP_DP = 'bitaxe.4.temperature.temp';
const VRM_DP = 'bitaxe.4.temperature.vrTemp';
const FREQ_DP = 'bitaxe.4.hardware.frequency';
const FAN_DP = 'bitaxe.4.configuration.fanrpm';
const REJ_DP = 'bitaxe.4.mining.sharesRejected';
const VCORE_DP = 'bitaxe.4.hardware.coreVoltage';
// =====================
// LIMITS
// =====================
const MIN_FREQ = 400;
const MAX_FREQ = 700;
// =====================
// LEARNING STATE
// =====================
let best = {
freq: null,
score: -9999
};
let lastRejects = null;
// =====================
// SCORE FUNCTION
// =====================
function calcScore(temp, vrm, freq, rej, volt) {
let score = 0;
// Performance Bonus
score += (freq - 400) * 0.8;
// Temperatur penalty
score -= Math.max(0, temp - 60) * 6;
// VRM penalty
if (vrm > 75) score -= (vrm - 75) * 8;
// Reject penalty
if (rej !== null) score -= rej * 10;
// Voltage inefficiency penalty
if (volt < 1050) score -= 10;
if (volt > 1150) score -= 5;
return score;
}
// =====================
// LOOP
// =====================
schedule('*/10 * * * * *', () => {
const temp = getState(TEMP_DP).val;
const vrm = getState(VRM_DP).val;
const freq = getState(FREQ_DP).val;
const fan = getState(FAN_DP).val;
const rej = getState(REJ_DP).val;
const volt = getState(VCORE_DP).val;
if ([temp, vrm, freq, fan].includes(null)) return;
// =====================
// CURRENT SCORE
// =====================
const score = calcScore(temp, vrm, freq, rej, volt);
// =====================
// STORE BEST STATE
// =====================
if (score > best.score) {
best = { freq, score };
}
// =====================
// VRM SAFETY (HARD OVERRIDE)
// =====================
let newFreq = freq;
if (vrm >= 85) {
newFreq -= 20;
} else if (vrm >= 75) {
newFreq -= 5;
}
// =====================
// TEMPERATURE CONTROL
// =====================
if (temp >= 65) {
newFreq -= 10;
} else if (temp < 58) {
newFreq += 1;
}
// =====================
// LEARNING PUSH (exploration)
// =====================
if (Math.random() < 0.2) {
// explore slightly above/below best
if (best.freq !== null) {
newFreq = best.freq + (Math.random() > 0.5 ? 1 : -1);
}
}
// =====================
// LIMITS
// =====================
newFreq = Math.max(MIN_FREQ, Math.min(MAX_FREQ, newFreq));
// =====================
// APPLY
// =====================
if (newFreq !== freq) {
setState(FREQ_DP, newFreq);
}
// =====================
// LOGGING
// =====================
log(
`Bitaxe AI | T=${temp}°C VRM=${vrm}°C V=${volt}mV REJ=${rej} F=${freq}→${newFreq} SCORE=${score.toFixed(1)} BEST=${best.freq}`,
'info'
);
});
Die Anwendung erfolgt natürlich auf eigene Verantwortung, ihr könnt die parameter natürlich noch nach eigenen Wünschen anpassen.
Hier noch ein screenshot wie es in freier Wildbahn ausschaut: