public static IRatesComunication _ratesComunication = null; // for now should only have one of these public static void ClearRatesAll() { // Quickfix MiningStats.ClearApiDataGroups(); _ratesComunication?.ClearRatesAll(); }
public static async Task MinerStatsCheck() { await _semaphore.WaitAsync(); try { foreach (var m in _runningMiners.Values) { // skip if not running or if await already in progress if (!m.IsRunning || m.IsUpdatingApi) { continue; } var ad = m.GetSummaryAsync(); } // Update GUI ApplicationStateManager.RefreshRates(); // now we shoud have new global/total rate display it var kwhPriceInBtc = ExchangeRateApi.GetKwhPriceInBtc(); var profitInBTC = MiningStats.GetProfit(kwhPriceInBtc); ApplicationStateManager.DisplayTotalRate(profitInBTC); } catch (Exception e) { Logger.Error(Tag, $"Error occured while getting mining stats: {e.Message}"); } finally { _semaphore.Release(); } // TODO put this somewhere else maybe await RestartStagnatedMiners(); }
public void Stop() { // TODO thing about this case, closing opening on switching // EthlargementIntegratedPlugin.Instance.Stop(_miningPairs); MinerApiWatchdog.RemoveGroup(GroupKey); MiningStats.RemoveGroup(MiningPairs.Select(pair => pair.Device.UUID), _plugin.PluginUUID); IsRunning = false; _miner.StopMining(); //if (_miner is IDisposable disposableMiner) //{ // disposableMiner.Dispose(); //} }
private static void SendMinerStatus(bool sendDeviceNames) { var devices = AvailableDevices.Devices; var rigStatus = ApplicationStateManager.CalcRigStatusString(); var paramList = new List <JToken> { rigStatus }; var deviceList = new JArray(); foreach (var device in devices) { try { var array = new JArray { sendDeviceNames?device.Name : "", device.B64Uuid // TODO }; var status = DeviceReportStatus(device.DeviceType, device.State); array.Add(status); array.Add((int)Math.Round(device.Load)); var speedsJson = new JArray(); var speeds = MiningStats.GetSpeedForDevice(device.Uuid); if (speeds != null && device.State == DeviceState.Mining) { foreach (var kvp in speeds) { speedsJson.Add(new JArray((int)kvp.type, kvp.speed)); } } array.Add(speedsJson); // Hardware monitoring array.Add((int)Math.Round(device.Temp)); array.Add(device.FanSpeed); array.Add((int)Math.Round(device.PowerUsage)); // Power mode array.Add((int)device.TDPSimple); // Intensity mode array.Add(0); deviceList.Add(array); } catch (Exception e) { NHM.Common.Logger.Error("SOCKET", e.Message); } } paramList.Add(deviceList); var data = new MinerStatusMessage { param = paramList }; var sendData = JsonConvert.SerializeObject(data); // This function is run every minute and sends data every run which has two auxiliary effects // Keeps connection alive and attempts reconnection if internet was dropped _socket?.SendData(sendData); }
private static string CreateMinerStatusMessage(bool sendDeviceNames = false) { var devices = AvailableDevices.Devices; var rigStatus = ApplicationStateManager.CalcRigStatusString(); var paramList = new List <JToken> { rigStatus }; var deviceList = new JArray(); foreach (var device in devices) { try { var array = new JArray { sendDeviceNames?device.Name : "", device.B64Uuid // TODO }; var status = DeviceReportStatus(device.DeviceType, device.State); array.Add(status); array.Add((int)Math.Round(device.Load)); var speedsJson = new JArray(); var speeds = MiningStats.GetSpeedForDevice(device.Uuid); if (speeds != null && device.State == DeviceState.Mining) { foreach (var kvp in speeds) { speedsJson.Add(new JArray((int)kvp.type, kvp.speed)); } } array.Add(speedsJson); // Hardware monitoring array.Add((int)Math.Round(device.Temp)); array.Add(device.FanSpeed); array.Add((int)Math.Round(device.PowerUsage)); // Power mode array.Add((int)device.TDPSimple); // Intensity mode array.Add(0); deviceList.Add(array); } catch (Exception e) { NHLog.Error("NHWebSocket", e.Message); } } paramList.Add(deviceList); var data = new MinerStatusMessage { param = paramList }; var sendData = JsonConvert.SerializeObject(data); return(sendData); }
public async Task <ApiData> GetSummaryAsync() { var apiData = new ApiData(); if (!IsUpdatingApi) { IsUpdatingApi = true; await _apiSemaphore.WaitAsync(); try { apiData = await _miner.GetMinerStatsDataAsync(); } catch (Exception e) { Logger.Error(MinerTag(), $"GetSummaryAsync error: {e.Message}"); } finally { IsUpdatingApi = false; _apiSemaphore.Release(); } } UpdateApiTimestamp(apiData); // TODO workaround plugins should return this info // create empty stub if it is null if (apiData == null) { Logger.Debug(MinerTag(), "GetSummary returned null... Will create ZERO fallback"); apiData = new ApiData(); } if (apiData.AlgorithmSpeedsPerDevice == null) { apiData = new ApiData(); var perDevicePowerDict = new Dictionary <string, int>(); var perDeviceSpeedsDict = new Dictionary <string, IReadOnlyList <AlgorithmTypeSpeedPair> >(); var perDeviceSpeeds = MiningPairs.Select(pair => (pair.Device.UUID, pair.Algorithm.IDs.Select(type => new AlgorithmTypeSpeedPair(type, 0d)))); foreach (var kvp in perDeviceSpeeds) { var uuid = kvp.Item1; // kvp.UUID compiler doesn't recognize ValueTypes lib??? perDeviceSpeedsDict[uuid] = kvp.Item2.ToList(); perDevicePowerDict[uuid] = 0; } apiData.AlgorithmSpeedsPerDevice = perDeviceSpeedsDict; apiData.PowerUsagePerDevice = perDevicePowerDict; apiData.PowerUsageTotal = 0; apiData.AlgorithmSpeedsTotal = perDeviceSpeedsDict.First().Value; } else if (apiData.AlgorithmSpeedsPerDevice != null && apiData.PowerUsagePerDevice.Count == 0) { var perDevicePowerDict = new Dictionary <string, int>(); foreach (var kvp in MiningPairs) { var uuid = kvp.Device.UUID; perDevicePowerDict[uuid] = 0; } apiData.PowerUsagePerDevice = perDevicePowerDict; apiData.PowerUsageTotal = 0; } // TODO temporary here move it outside later MiningStats.UpdateGroup(apiData, _plugin.PluginUUID, _plugin.Name); return(apiData); }
private MiningStats MapDTO(ClaymoreMessageDTO dto) { var entity = new MiningStats(); entity.MinerVersion = dto.Result[0]; entity.UptimeMinutes = int.Parse(dto.Result[1]); var primaryCoinHashrateAndShares = dto.Result[2].Split(";"); var primaryHashratesPerGPU = dto.Result[3].Split(";"); var secondaryCoinHashrateAndShares = dto.Result[4].Split(";"); var secondaryHashratesPerGPU = dto.Result[5].Split(";"); var temperaturesAndFanSpeedsPerGPU = dto.Result[6].Split(";"); var poolAddresses = dto.Result[7].Split(";"); var invalidsAndSwitches = dto.Result[8].Split(";"); var primaryCoin = new CoinStats(); primaryCoin.PoolAddress = poolAddresses[0]; primaryCoin.Hashrate = long.Parse(primaryCoinHashrateAndShares[0]); primaryCoin.Shares = int.Parse(primaryCoinHashrateAndShares[1]); primaryCoin.RejectedShares = int.Parse(primaryCoinHashrateAndShares[2]); primaryCoin.InvalidShares = int.Parse(invalidsAndSwitches[0]); primaryCoin.PoolSwitches = int.Parse(invalidsAndSwitches[1]); entity.PrimaryCoin = primaryCoin; entity.SecondaryCoin = null; if (poolAddresses.Length == 2) { var secondaryCoin = new CoinStats(); secondaryCoin.PoolAddress = poolAddresses[1]; secondaryCoin.Hashrate = long.Parse(secondaryCoinHashrateAndShares[0]); secondaryCoin.Shares = int.Parse(secondaryCoinHashrateAndShares[1]); secondaryCoin.RejectedShares = int.Parse(secondaryCoinHashrateAndShares[2]); secondaryCoin.InvalidShares = int.Parse(invalidsAndSwitches[2]); secondaryCoin.PoolSwitches = int.Parse(invalidsAndSwitches[3]); entity.SecondaryCoin = secondaryCoin; } var gpuList = new List <GPUStats>(); entity.GPUStats = gpuList; for (var i = 0; i < primaryHashratesPerGPU.Length; i++) { var gpuStat = new GPUStats(); var primaryHashrate = long.Parse(primaryHashratesPerGPU[i]); var rawSecondaryHashrate = secondaryHashratesPerGPU[i]; var secondaryHashrate = rawSecondaryHashrate == "off" ? (long?)null : long.Parse(rawSecondaryHashrate); var temperature = int.Parse(temperaturesAndFanSpeedsPerGPU[i * 2]); var fanspeed = int.Parse(temperaturesAndFanSpeedsPerGPU[i * 2 + 1]); gpuStat.PrimaryHashrate = primaryHashrate; gpuStat.SecondaryHashrate = secondaryHashrate; gpuStat.Temperature = temperature; gpuStat.FanSpeed = fanspeed; gpuList.Add(gpuStat); } return(entity); }