GithubHelp home page GithubHelp logo

fancon's Introduction

#fancon

License

A Linux user-space fan control daemon

  • System, DELL and NVIDIA GPU fan control support
  • %, RPM or PWM custom speed-temperature curve configuration

Contents

Installation

Ubuntu, Debian (PPA)
sudo add-apt-repository ppa:hbriese/fancon; sudo apt-get update
sudo apt install fancon
.deb (alternative)
wget https://github.com/hbriese/fancon/releases/latest/download/fancon_amd64.deb
sudo dpkg -i ./fancon*.deb; sudo apt install -f
Fedora, Red Hat, CentOS (.rpm)
wget https://github.com/hbriese/fancon/releases/latest/download/fancon.x86_64.rpm
sudo yum –nogpgcheck install ./fancon*.rpm
Arch Linux (AUR)
git clone https://aur.archlinux.org/fancon.git; cd fancon
makepkg -sirc

Configuration

/etc/fancon.conf is automatically created on first run once the tests complete

Only 'sensor' & 'temp_to_rpm' for each fan is required to be manually configured

config {
update_interval:
  1000 #Milliseconds between updating fan speeds dynamic
      : true #Interpolate speeds between temps e.g(30 : 800, 50 : 1200)
            results in 1000
        @40 smoothing_intervals : 3 #Intervals over which to smooth RPM changes
            top_stickiness_intervals : 2 #Intervals to wait before decreasing
                RPM temp_averaging_intervals : 3 #Intervals to average
                    temperatures over -
      eliminating temp spikes
}
devices {
  fan {
  type:
    SYS #One of : SYS(default), DELL, NVIDIA;
    may excluded if SYS label : "hwmon3/fan1" #Name of device -
                                anything you want sensor
        : "CPU Package" #Sensor to read -
          specify by label temp_to_rpm : "39: 0%, 40: 1%, 75: 50%, 90: 100%"
#temp(optional : f | F; default °C) : RPM(optional : % | PWM; default RPM)
# 40 : 0 % Stopped at or below 40°C(°C is used if F is omitted)
# 50 : 1 % Lowest running speed at 50°C
# 75 : 50 % 50 % of max RPM at 75°C,                                           \
    could also be written as 75 : 180PWM in this case
# 194f : 100 % Full speed at 194°F(194f = 90°C)
                                         rpm_to_pwm
        : "0: 0, 3206: 128, 4954: 180, 7281: 255" #Mappings of RPM to PWM
              start_pwm : 128 #PWM at which the fan starts
#interval : 500 #Fan - specific update time; increasing improves test accuracy
                  ignore
        : false #Don't control or test device; may be excluded if false
#Following only applicable to SYS &DELL devices
          driver_flag : 2 #Driver flag to enable manual control pwm_path
        : "/sys/class/hwmon/hwmon3/pwm1" #Path to read /
          write PWM rpm_path
        : "/sys/class/hwmon/hwmon3/fan1_input" #Path to read RPM
#Following only applicable to SYS devices
              enable_path
        : "/sys/class/hwmon/hwmon3/pwm1_enable" #Path to enable PWM control
  }
  fan{
    type : NVIDIA label : "980_Ti" sensor : "980_Ti_temp"
    temp_to_rpm : "54: 0%, 55: 1%, 90: 100%" rpm_to_pwm : "850: 0, 3832: 255"
    start_pwm : 128 interval : 500 id : 0 #Only applicable to NVIDIA devices
  } sensor {
  type:
    SYS #One of : SYS(default), NVIDIA;
    may excluded if SYS label : "CPU Package" #Name of device -
                                anything you want input_path
        : "/sys/class/hwmon/hwmon5/temp1_input" #Path to
          read(only applicable to SYS devices)
  }
  sensor {
  type:
    NVIDIA
  label:
    "980_Ti_temp" id : 0 #Only applicable to NVIDIA devices
  }
}

Usage

fancon arg [value] ...
h  help           Show this help
s  status         Status of all fans
e  enable         Enable control of all fans
e  enable  [fan]  Enable control of the fan
d  disable        Disable control of all fans
d  disable [fan]  Disable control of the fans
t  test           Test all (untested) fans
t  test    [fan]  Test the fan (forced)
f  force          Test even already tested fans (default: false)
m  monitor        Monitor all fans
m  monitor [fan]  Monitor the fan
r  reload         Reload config
c  config  [file] Config path (default: /etc/fancon.conf)
   service        Start as service
   daemon         Daemonize the process (default: false)
   stop-service   Stop the service
i  sysinfo [file] Save system info to file (default: sysinfo.txt)
   recover        Recover control of enabled devices
   nv-init        Init nvidia devices
v  verbose        Debug logging level
a  trace          Trace logging level

Managing service

Status

sudo systemctl status fancon

Start

sudo systemctl start fancon

Without systemd

sudo fancon service

Debugging issues

Monitoring fans and their status

fancon monitor

Logs

journalctl -u fancon

Logging levels

fancon verbose

fancon trace

Undetected fans

First try detecting devices using lm-sensors

sudo sensors-detect
  • You may need to reboot if unloaded kernel modules were added

Check to see if your device is detected

sensors

Mis-configured or unsupported devices

Devices (fans & sensors) that:

  • Expose a sysfs like interface but are not found by lm-sensors
  • Are reported as not having the required features but they do

May be configurable by altering their configuration

$XAUTHORITY and or $DISPLAY env variable(s) not set

X11 access is required for NVIDIA control

You will need to configure the unset environmental variable.

Manually configure the unset environmental variable(s)

Inside /etc/profile

  • export XAUTHORITY=...; You can find the XAuthority file by running xauth info
  • xhost si:localuser:root; May be necessary on Wayland

https://wiki.archlinux.org/index.php/Running_GUI_applications_as_root

Building from source:

With NVIDIA support:

sudo apt install clang cmake lm-sensors libsensors5 libsensors4-dev libboost-system-dev libboost-filesystem-dev libboost-log-dev libpthread-stubs0-dev libpstreams-dev libprotobuf-dev protobuf-compiler libgrpc++-dev protobuf-compiler protobuf-compiler-grpc libxnvctrl-dev libx11-dev

git clone https://github.com/hbriese/fancon.git && cd fancon; mkdir build; cd build
cmake -DNVIDIA_SUPPORT=ON .. && make -j && sudo make install

Without NVIDIA support:

sudo apt install clang cmake lm-sensors libsensors5 libsensors4-dev libboost-system-dev libboost-filesystem-dev libboost-log-dev libpthread-stubs0-dev libpstreams-dev libprotobuf-dev protobuf-compiler libgrpc++-dev protobuf-compiler protobuf-compiler-grpc

git clone https://github.com/hbriese/fancon.git && cd fancon; mkdir build; cd build
cmake -DNVIDIA_SUPPORT=OFF .. && make -j && sudo make install
CMake Option Default Description
NVIDIA_SUPPORT ON Support for NVIDIA GPUs
PROFILE OFF Support for Google Perf Tools CPU & heap profilers
LINT OFF Run Clang-Tidy

fancon's People

Contributors

hbriese avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar

fancon's Issues

fancon service segfaults

Describe the bug

Since the instructions for Arch installation did not succeed (it seems that Boost 1.72 is too old for this project), I used Boost 1.74 and 1.73 to test. I ran the fancon service command in one terminal, and in the other fancon, and said y to test the fans. The fancon service then segfaults. Also copied is the output from Valgrind.

fancon service output:

Service started
20/12/03 19:50 [2496] warning: hwmon2/fan1: skipping - curve not configured & sensor not configured
20/12/03 19:50 [2496] warning: hwmon2/fan2: skipping - curve not configured & sensor not configured
20/12/03 19:50 [2496] warning: hwmon2/fan7: skipping - curve not configured & sensor not configured
20/12/03 19:50 [2496] warning: hwmon2/fan3: skipping - curve not configured & sensor not configured
20/12/03 19:50 [2496] warning: hwmon2/fan6: skipping - curve not configured & sensor not configured
20/12/03 19:50 [2496] warning: hwmon2/fan4: skipping - curve not configured & sensor not configured
20/12/03 19:50 [2496] warning: hwmon2/fan5: skipping - curve not configured & sensor not configured
Segmentation fault

fancon output:

Test devices & generate a config? (y/n): y
Add 'force' option to test already tested fans
hwmon2/fan1: 0%
20/12/03 19:50 [2545] fatal: Unable to connect to service
Start with: sudo systemctl start fancon  OR  sudo fancon service
20/12/03 19:50 [2545] fatal: Unable to connect to service
Start with: sudo systemctl start fancon  OR  sudo fancon service
20/12/03 19:50 [2545] fatal: Unable to connect to service
Start with: sudo systemctl start fancon  OR  sudo fancon service
20/12/03 19:50 [2545] error: hwmon2/fan1: test failed
20/12/03 19:50 [2545] fatal: Unable to connect to service
Start with: sudo systemctl start fancon  OR  sudo fancon service
20/12/03 19:50 [2545] fatal: Unable to connect to service
Start with: sudo systemctl start fancon  OR  sudo fancon service
20/12/03 19:50 [2545] fatal: Unable to connect to service
Start with: sudo systemctl start fancon  OR  sudo fancon service
20/12/03 19:50 [2545] error: hwmon2/fan5: test failed
20/12/03 19:50 [2545] error: hwmon2/fan3: test failed
20/12/03 19:50 [2545] fatal: Unable to connect to service
Start with: sudo systemctl start fancon  OR  sudo fancon service
20/12/03 19:50 [2545] error: hwmon2/fan2: test failed
20/12/03 19:50 [2545] error: hwmon2/fan6: test failed
20/12/03 19:50 [2545] error: hwmon2/fan4: test failed
20/12/03 19:50 [2545] error: hwmon2/fan7: test failed

Valgrind output for fancon service:

==2618== Memcheck, a memory error detector
==2618== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al.
==2618== Using Valgrind-3.16.1 and LibVEX; rerun with -h for copyright info
==2618== Command: fancon service
==2618== 
Service started
20/12/03 18:47 [2618] warning: hwmon4/fan1: skipping - curve not configured & sensor not configured
20/12/03 18:47 [2618] warning: hwmon4/fan2: skipping - curve not configured & sensor not configured
20/12/03 18:47 [2618] warning: hwmon4/fan3: skipping - curve not configured & sensor not configured
20/12/03 18:47 [2618] warning: hwmon4/fan4: skipping - curve not configured & sensor not configured
20/12/03 18:47 [2618] warning: hwmon4/fan5: skipping - curve not configured & sensor not configured
20/12/03 18:47 [2618] warning: hwmon4/fan6: skipping - curve not configured & sensor not configured
20/12/03 18:47 [2618] warning: hwmon4/fan7: skipping - curve not configured & sensor not configured
terminate called after throwing an instance of 'boost::wrapexcept<boost::lock_error>'
  what():  boost: mutex lock failed in pthread_mutex_lock: Invalid argument
==2618== 
==2618== Process terminating with default action of signal 6 (SIGABRT): dumping core
==2618==    at 0x5549615: raise (in /usr/lib/libc-2.32.so)
==2618==    by 0x5532861: abort (in /usr/lib/libc-2.32.so)
==2618==    by 0x5265869: __gnu_cxx::__verbose_terminate_handler() [clone .cold] (vterminate.cc:95)
==2618==    by 0x5271D99: __cxxabiv1::__terminate(void (*)()) (eh_terminate.cc:48)
==2618==    by 0x5271E06: std::terminate() (eh_terminate.cc:58)
==2618==    by 0x2CF10E: __clang_call_terminate (in /usr/local/bin/fancon)
==2618==    by 0x3C1D3F: boost::thread::get_id() const (thread.hpp:712)
==2618==    by 0x3C07F5: boost::thread::join() (thread.hpp:733)
==2618==    by 0x3D63F8: fc::FanTask::join() (src/FanTask.cpp:18)
==2618==    by 0x3C80CB: fc::Controller::test(fc::FanInterface&, bool, bool, std::shared_ptr<fc::Util::ObservableNumber<int> >) (src/Controller.cpp:133)
==2618==    by 0x3AEFE3: fc::Service::Test(grpc::ServerContext*, fc_pb::TestRequest const*, grpc::ServerWriter<fc_pb::TestResponse>*) (src/Service.cpp:211)
==2618==    by 0x3677AB: fc_pb::DService::Service::Service()::$_13::operator()(fc_pb::DService::Service*, grpc::ServerContext*, fc_pb::TestRequest const*, grpc::ServerWriter<fc_pb::TestResponse>*) const (src/proto/DevicesSpec.grpc.pb.cc:579)
==2618== 
==2618== HEAP SUMMARY:
==2618==     in use at exit: 427,334 bytes in 2,690 blocks
==2618==   total heap usage: 10,146 allocs, 7,456 frees, 1,766,496 bytes allocated
==2618== 
==2618== 24 bytes in 1 blocks are possibly lost in loss record 110 of 530
==2618==    at 0x483ADEF: operator new(unsigned long) (vg_replace_malloc.c:342)
==2618==    by 0x4EF6280: grpc_core::Server::ChannelData::InitTransport(grpc_core::RefCountedPtr<grpc_core::Server>, grpc_channel*, unsigned long, grpc_transport*, long) (in /usr/lib/libgrpc.so.13.0.0)
==2618==    by 0x4EF85BF: grpc_core::Server::SetupTransport(grpc_transport*, grpc_pollset*, grpc_channel_args const*, grpc_core::RefCountedPtr<grpc_core::channelz::SocketNode> const&, grpc_resource_user*) (in /usr/lib/libgrpc.so.13.0.0)
==2618==    by 0x4E1775C: ??? (in /usr/lib/libgrpc.so.13.0.0)
==2618==    by 0x4E9818B: grpc_core::ExecCtx::Flush() (in /usr/lib/libgrpc.so.13.0.0)
==2618==    by 0x4E94437: ??? (in /usr/lib/libgrpc.so.13.0.0)
==2618==    by 0x4EF2B9F: ??? (in /usr/lib/libgrpc.so.13.0.0)
==2618==    by 0x50047D8: grpc::CompletionQueue::AsyncNextInternal(void**, bool*, gpr_timespec) (in /usr/lib/libgrpc++.so.1.33.2)
==2618==    by 0x5021B7C: grpc::Server::SyncRequestThreadManager::PollForWork(void**, bool*) (in /usr/lib/libgrpc++.so.1.33.2)
==2618==    by 0x502E36C: grpc::ThreadManager::MainWorkLoop() (in /usr/lib/libgrpc++.so.1.33.2)
==2618==    by 0x502E5BC: grpc::ThreadManager::WorkerThread::Run() (in /usr/lib/libgrpc++.so.1.33.2)
==2618==    by 0x7A8C3D3: ??? (in /usr/lib/libgpr.so.13.0.0)
==2618== 
==2618== 64 bytes in 2 blocks are possibly lost in loss record 278 of 530
==2618==    at 0x483ADEF: operator new(unsigned long) (vg_replace_malloc.c:342)
==2618==    by 0x35A026: CreateInternal<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, const std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > &> (arena.h:511)
==2618==    by 0x35A026: DoCreateMaybeMessage<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, const std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > &> (arena.h:559)
==2618==    by 0x35A026: CreateMaybeMessage<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, const std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > &> (arena.h:565)
==2618==    by 0x35A026: CreateNoMessage<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, const std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > &> (arena.h:585)
==2618==    by 0x35A026: Create<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, const std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > &> (arena.h:324)
==2618==    by 0x35A026: google::protobuf::internal::ArenaStringPtr::CreateInstance(google::protobuf::Arena*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const*) (arenastring.h:373)
==2618==    by 0x35A319: google::protobuf::internal::ArenaStringPtr::Mutable(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const*, google::protobuf::Arena*) (arenastring.h:96)
==2618==    by 0x357ED6: fc_pb::TestRequest::_internal_mutable_device_label[abi:cxx11]() (src/proto/DevicesSpec.pb.h:3990)
==2618==    by 0x34FD17: fc_pb::TestRequest::_InternalParse(char const*, google::protobuf::internal::ParseContext*) (src/proto/DevicesSpec.pb.cc:2782)
==2618==    by 0x4AD883F: bool google::protobuf::internal::MergeFromImpl<false>(google::protobuf::io::ZeroCopyInputStream*, google::protobuf::MessageLite*, google::protobuf::MessageLite::ParseFlags) (in /usr/lib/libprotobuf.so.23.0.4)
==2618==    by 0x3AD0F2: grpc::Status grpc::GenericDeserialize<grpc::ProtoBufferReader, fc_pb::TestRequest>(grpc::ByteBuffer*, google::protobuf::MessageLite*) (proto_utils.h:86)
==2618==    by 0x3ACEDA: grpc::SerializationTraits<fc_pb::TestRequest, void>::Deserialize(grpc::ByteBuffer*, google::protobuf::MessageLite*) (proto_utils.h:112)
==2618==    by 0x3AB6E5: grpc::internal::ServerStreamingHandler<fc_pb::DService::Service, fc_pb::TestRequest, fc_pb::TestResponse>::Deserialize(grpc_call*, grpc_byte_buffer*, grpc::Status*, void**) (method_handler.h:218)
==2618==    by 0x5029B95: grpc::Server::SyncRequestThreadManager::DoWork(void*, bool, bool) (in /usr/lib/libgrpc++.so.1.33.2)
==2618==    by 0x502E424: grpc::ThreadManager::MainWorkLoop() (in /usr/lib/libgrpc++.so.1.33.2)
==2618==    by 0x502E5BC: grpc::ThreadManager::WorkerThread::Run() (in /usr/lib/libgrpc++.so.1.33.2)
==2618== 
==2618== 71 bytes in 1 blocks are possibly lost in loss record 283 of 530
==2618==    at 0x483ADEF: operator new(unsigned long) (vg_replace_malloc.c:342)
==2618==    by 0x52B6A39: allocate (new_allocator.h:115)
==2618==    by 0x52B6A39: std::string::_Rep::_S_create(unsigned long, unsigned long, std::allocator<char> const&) (basic_string.tcc:1060)
==2618==    by 0x52B8779: _S_construct<char*> (basic_string.tcc:580)
==2618==    by 0x52B8779: char* std::string::_S_construct<char const*>(char const*, char const*, std::allocator<char> const&, std::forward_iterator_tag) (basic_string.tcc:565)
==2618==    by 0x52B8C56: _S_construct_aux<char const*> (basic_string.h:5121)
==2618==    by 0x52B8C56: _S_construct<char const*> (basic_string.h:5142)
==2618==    by 0x52B8C56: std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(char const*, std::allocator<char> const&) (basic_string.tcc:667)
==2618==    by 0x5299039: std::runtime_error::runtime_error(char const*) (cow-stdexcept.cc:122)
==2618==    by 0x498206B: boost::mutex::lock() (in /usr/lib/libboost_thread.so.1.74.0)
==2618==    by 0x4978646: boost::thread::native_handle() (in /usr/lib/libboost_thread.so.1.74.0)
==2618==    by 0x3C1CF1: boost::thread::get_id() const (thread.hpp:712)
==2618==    by 0x3C07F5: boost::thread::join() (thread.hpp:733)
==2618==    by 0x3D63F8: fc::FanTask::join() (src/FanTask.cpp:18)
==2618==    by 0x3C80CB: fc::Controller::test(fc::FanInterface&, bool, bool, std::shared_ptr<fc::Util::ObservableNumber<int> >) (src/Controller.cpp:133)
==2618==    by 0x3AEFE3: fc::Service::Test(grpc::ServerContext*, fc_pb::TestRequest const*, grpc::ServerWriter<fc_pb::TestResponse>*) (src/Service.cpp:211)
==2618== 
==2618== 184 bytes in 1 blocks are possibly lost in loss record 348 of 530
==2618==    at 0x483ADEF: operator new(unsigned long) (vg_replace_malloc.c:342)
==2618==    by 0x4EF7787: grpc_core::Server::RequestRegisteredCall(grpc_core::Server::RegisteredMethod*, grpc_call**, gpr_timespec*, grpc_metadata_array*, grpc_byte_buffer**, grpc_completion_queue*, grpc_completion_queue*, void*) (in /usr/lib/libgrpc.so.13.0.0)
==2618==    by 0x4EF80DA: grpc_server_request_registered_call (in /usr/lib/libgrpc.so.13.0.0)
==2618==    by 0x50274BC: grpc::Server::SyncRequest::Request(grpc_server*, grpc_completion_queue*) (in /usr/lib/libgrpc++.so.1.33.2)
==2618==    by 0x5029C5D: grpc::Server::SyncRequestThreadManager::DoWork(void*, bool, bool) (in /usr/lib/libgrpc++.so.1.33.2)
==2618==    by 0x502E424: grpc::ThreadManager::MainWorkLoop() (in /usr/lib/libgrpc++.so.1.33.2)
==2618==    by 0x502E5BC: grpc::ThreadManager::WorkerThread::Run() (in /usr/lib/libgrpc++.so.1.33.2)
==2618==    by 0x7A8C3D3: ??? (in /usr/lib/libgpr.so.13.0.0)
==2618==    by 0x48853E8: start_thread (in /usr/lib/libpthread-2.32.so)
==2618==    by 0x560C292: clone (in /usr/lib/libc-2.32.so)
==2618== 
==2618== 240 bytes in 1 blocks are possibly lost in loss record 365 of 530
==2618==    at 0x483A77F: malloc (vg_replace_malloc.c:307)
==2618==    by 0x5270BC4: __cxa_allocate_exception (eh_alloc.cc:284)
==2618==    by 0x4976632: void boost::throw_exception<boost::lock_error>(boost::lock_error const&) (in /usr/lib/libboost_thread.so.1.74.0)
==2618==    by 0x49820A8: boost::mutex::lock() (in /usr/lib/libboost_thread.so.1.74.0)
==2618==    by 0x4978646: boost::thread::native_handle() (in /usr/lib/libboost_thread.so.1.74.0)
==2618==    by 0x3C1CF1: boost::thread::get_id() const (thread.hpp:712)
==2618==    by 0x3C07F5: boost::thread::join() (thread.hpp:733)
==2618==    by 0x3D63F8: fc::FanTask::join() (src/FanTask.cpp:18)
==2618==    by 0x3C80CB: fc::Controller::test(fc::FanInterface&, bool, bool, std::shared_ptr<fc::Util::ObservableNumber<int> >) (src/Controller.cpp:133)
==2618==    by 0x3AEFE3: fc::Service::Test(grpc::ServerContext*, fc_pb::TestRequest const*, grpc::ServerWriter<fc_pb::TestResponse>*) (src/Service.cpp:211)
==2618==    by 0x3677AB: fc_pb::DService::Service::Service()::$_13::operator()(fc_pb::DService::Service*, grpc::ServerContext*, fc_pb::TestRequest const*, grpc::ServerWriter<fc_pb::TestResponse>*) const (src/proto/DevicesSpec.grpc.pb.cc:579)
==2618==    by 0x367742: grpc::Status std::__invoke_impl<grpc::Status, fc_pb::DService::Service::Service()::$_13&, fc_pb::DService::Service*, grpc::ServerContext*, fc_pb::TestRequest const*, grpc::ServerWriter<fc_pb::TestResponse>*>(std::__invoke_other, fc_pb::DService::Service::Service()::$_13&, fc_pb::DService::Service*&&, grpc::ServerContext*&&, fc_pb::TestRequest const*&&, grpc::ServerWriter<fc_pb::TestResponse>*&&) (invoke.h:60)
==2618== 
==2618== 326 bytes in 46 blocks are definitely lost in loss record 394 of 530
==2618==    at 0x483A77F: malloc (vg_replace_malloc.c:307)
==2618==    by 0x559BB4E: strdup (in /usr/lib/libc-2.32.so)
==2618==    by 0x49BD442: sensors_get_label (in /usr/lib/libsensors.so.5.0.0)
==2618==    by 0x3D8159: fc::SensorChips::enumerate(std::unordered_map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::unique_ptr<fc::FanInterface, std::default_delete<fc::FanInterface> >, std::hash<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::equal_to<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::unique_ptr<fc::FanInterface, std::default_delete<fc::FanInterface> > > > >&, std::unordered_map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::shared_ptr<fc::SensorInterface>, std::hash<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::equal_to<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::shared_ptr<fc::SensorInterface> > > >&) (src/Devices.cpp:25)
==2618==    by 0x3DA55B: fc::Devices::Devices(bool) (src/Devices.cpp:85)
==2618==    by 0x3C62C0: fc::Controller::reload(bool) (src/Controller.cpp:89)
==2618==    by 0x3C6079: fc::Controller::Controller(std::filesystem::__cxx11::path) (src/Controller.cpp:12)
==2618==    by 0x3AD2D0: fc::Service::Service(std::filesystem::__cxx11::path const&, bool) (src/Service.cpp:4)
==2618==    by 0x2CD3E6: main (src/main.cpp:34)
==2618== 
==2618== 384 bytes in 1 blocks are possibly lost in loss record 407 of 530
==2618==    at 0x483CB65: calloc (vg_replace_malloc.c:760)
==2618==    by 0x40142EB: _dl_allocate_tls (in /usr/lib/ld-2.32.so)
==2618==    by 0x488613C: pthread_create@@GLIBC_2.2.5 (in /usr/lib/libpthread-2.32.so)
==2618==    by 0x7A8C5AC: grpc_core::Thread::Thread(char const*, void (*)(void*), void*, bool*, grpc_core::Thread::Options const&) (in /usr/lib/libgpr.so.13.0.0)
==2618==    by 0x4E9895A: grpc_core::Executor::SetThreading(bool) (in /usr/lib/libgrpc.so.13.0.0)
==2618==    by 0x4E993EE: grpc_core::Executor::InitAll() (in /usr/lib/libgrpc.so.13.0.0)
==2618==    by 0x4E9AA11: grpc_iomgr_init() (in /usr/lib/libgrpc.so.13.0.0)
==2618==    by 0x4EF3DDE: grpc_init (in /usr/lib/libgrpc.so.13.0.0)
==2618==    by 0x36F4FA: grpc::GrpcLibraryCodegen::GrpcLibraryCodegen(bool) (grpc_library.h:45)
==2618==    by 0x4FFD73E: grpc::ChannelCredentials::ChannelCredentials() (in /usr/lib/libgrpc++.so.1.33.2)
==2618==    by 0x4FFD98B: grpc::InsecureChannelCredentials() (in /usr/lib/libgrpc++.so.1.33.2)
==2618==    by 0x3BF4F4: fc::Client::service_running() (src/Client.cpp:301)
==2618== 
==2618== 384 bytes in 1 blocks are possibly lost in loss record 408 of 530
==2618==    at 0x483CB65: calloc (vg_replace_malloc.c:760)
==2618==    by 0x40142EB: _dl_allocate_tls (in /usr/lib/ld-2.32.so)
==2618==    by 0x488613C: pthread_create@@GLIBC_2.2.5 (in /usr/lib/libpthread-2.32.so)
==2618==    by 0x7A8C5AC: grpc_core::Thread::Thread(char const*, void (*)(void*), void*, bool*, grpc_core::Thread::Options const&) (in /usr/lib/libgpr.so.13.0.0)
==2618==    by 0x4E9895A: grpc_core::Executor::SetThreading(bool) (in /usr/lib/libgrpc.so.13.0.0)
==2618==    by 0x4E993FB: grpc_core::Executor::InitAll() (in /usr/lib/libgrpc.so.13.0.0)
==2618==    by 0x4E9AA11: grpc_iomgr_init() (in /usr/lib/libgrpc.so.13.0.0)
==2618==    by 0x4EF3DDE: grpc_init (in /usr/lib/libgrpc.so.13.0.0)
==2618==    by 0x36F4FA: grpc::GrpcLibraryCodegen::GrpcLibraryCodegen(bool) (grpc_library.h:45)
==2618==    by 0x4FFD73E: grpc::ChannelCredentials::ChannelCredentials() (in /usr/lib/libgrpc++.so.1.33.2)
==2618==    by 0x4FFD98B: grpc::InsecureChannelCredentials() (in /usr/lib/libgrpc++.so.1.33.2)
==2618==    by 0x3BF4F4: fc::Client::service_running() (src/Client.cpp:301)
==2618== 
==2618== 384 bytes in 1 blocks are possibly lost in loss record 409 of 530
==2618==    at 0x483CB65: calloc (vg_replace_malloc.c:760)
==2618==    by 0x40142EB: _dl_allocate_tls (in /usr/lib/ld-2.32.so)
==2618==    by 0x488613C: pthread_create@@GLIBC_2.2.5 (in /usr/lib/libpthread-2.32.so)
==2618==    by 0x7A8C5AC: grpc_core::Thread::Thread(char const*, void (*)(void*), void*, bool*, grpc_core::Thread::Options const&) (in /usr/lib/libgpr.so.13.0.0)
==2618==    by 0x4EAF872: ??? (in /usr/lib/libgrpc.so.13.0.0)
==2618==    by 0x4EF3EBA: grpc_init (in /usr/lib/libgrpc.so.13.0.0)
==2618==    by 0x36F4FA: grpc::GrpcLibraryCodegen::GrpcLibraryCodegen(bool) (grpc_library.h:45)
==2618==    by 0x4FFD73E: grpc::ChannelCredentials::ChannelCredentials() (in /usr/lib/libgrpc++.so.1.33.2)
==2618==    by 0x4FFD98B: grpc::InsecureChannelCredentials() (in /usr/lib/libgrpc++.so.1.33.2)
==2618==    by 0x3BF4F4: fc::Client::service_running() (src/Client.cpp:301)
==2618==    by 0x2CD071: main (src/main.cpp:26)
==2618== 
==2618== 384 bytes in 1 blocks are possibly lost in loss record 410 of 530
==2618==    at 0x483CB65: calloc (vg_replace_malloc.c:760)
==2618==    by 0x40142EB: _dl_allocate_tls (in /usr/lib/ld-2.32.so)
==2618==    by 0x488613C: pthread_create@@GLIBC_2.2.5 (in /usr/lib/libpthread-2.32.so)
==2618==    by 0x7A8C5AC: grpc_core::Thread::Thread(char const*, void (*)(void*), void*, bool*, grpc_core::Thread::Options const&) (in /usr/lib/libgpr.so.13.0.0)
==2618==    by 0x4EAF872: ??? (in /usr/lib/libgrpc.so.13.0.0)
==2618==    by 0x4EAFE74: ??? (in /usr/lib/libgrpc.so.13.0.0)
==2618==    by 0x7A8C3D3: ??? (in /usr/lib/libgpr.so.13.0.0)
==2618==    by 0x48853E8: start_thread (in /usr/lib/libpthread-2.32.so)
==2618==    by 0x560C292: clone (in /usr/lib/libc-2.32.so)
==2618== 
==2618== 384 bytes in 1 blocks are possibly lost in loss record 411 of 530
==2618==    at 0x483CB65: calloc (vg_replace_malloc.c:760)
==2618==    by 0x40142EB: _dl_allocate_tls (in /usr/lib/ld-2.32.so)
==2618==    by 0x488613C: pthread_create@@GLIBC_2.2.5 (in /usr/lib/libpthread-2.32.so)
==2618==    by 0x7A8C5AC: grpc_core::Thread::Thread(char const*, void (*)(void*), void*, bool*, grpc_core::Thread::Options const&) (in /usr/lib/libgpr.so.13.0.0)
==2618==    by 0x502DDD8: grpc::ThreadManager::WorkerThread::WorkerThread(grpc::ThreadManager*) (in /usr/lib/libgrpc++.so.1.33.2)
==2618==    by 0x502E071: grpc::ThreadManager::Initialize() (in /usr/lib/libgrpc++.so.1.33.2)
==2618==    by 0x501F3D4: grpc::Server::Start(grpc::ServerCompletionQueue**, unsigned long) (in /usr/lib/libgrpc++.so.1.33.2)
==2618==    by 0x501B28F: grpc::ServerBuilder::BuildAndStart() (in /usr/lib/libgrpc++.so.1.33.2)
==2618==    by 0x3AD966: fc::Service::run() (src/Service.cpp:22)
==2618==    by 0x2CD401: main (src/main.cpp:36)
==2618== 
==2618== 416 bytes in 4 blocks are possibly lost in loss record 416 of 530
==2618==    at 0x483A6AF: malloc (vg_replace_malloc.c:306)
==2618==    by 0x7A88281: gpr_realloc (in /usr/lib/libgpr.so.13.0.0)
==2618==    by 0x4EE813A: ??? (in /usr/lib/libgrpc.so.13.0.0)
==2618==    by 0x4EEA4BE: ??? (in /usr/lib/libgrpc.so.13.0.0)
==2618==    by 0x4EF514F: grpc_core::Server::CallData::RecvInitialMetadataReady(void*, grpc_error*) (in /usr/lib/libgrpc.so.13.0.0)
==2618==    by 0x4E12B7F: ??? (in /usr/lib/libgrpc.so.13.0.0)
==2618==    by 0x4E9818B: grpc_core::ExecCtx::Flush() (in /usr/lib/libgrpc.so.13.0.0)
==2618==    by 0x4E94437: ??? (in /usr/lib/libgrpc.so.13.0.0)
==2618==    by 0x4EF2B9F: ??? (in /usr/lib/libgrpc.so.13.0.0)
==2618==    by 0x50047D8: grpc::CompletionQueue::AsyncNextInternal(void**, bool*, gpr_timespec) (in /usr/lib/libgrpc++.so.1.33.2)
==2618==    by 0x5021B7C: grpc::Server::SyncRequestThreadManager::PollForWork(void**, bool*) (in /usr/lib/libgrpc++.so.1.33.2)
==2618==    by 0x502E36C: grpc::ThreadManager::MainWorkLoop() (in /usr/lib/libgrpc++.so.1.33.2)
==2618== 
==2618== 504 bytes in 1 blocks are possibly lost in loss record 429 of 530
==2618==    at 0x483CB65: calloc (vg_replace_malloc.c:760)
==2618==    by 0x7A88243: gpr_zalloc (in /usr/lib/libgpr.so.13.0.0)
==2618==    by 0x4E6FDB9: grpc_channel_stack_builder_finish(grpc_channel_stack_builder*, unsigned long, int, void (*)(void*, grpc_error*), void*, void**) (in /usr/lib/libgrpc.so.13.0.0)
==2618==    by 0x4EED888: grpc_channel_create_with_builder(grpc_channel_stack_builder*, grpc_channel_stack_type) (in /usr/lib/libgrpc.so.13.0.0)
==2618==    by 0x4EEDE3D: grpc_channel_create(char const*, grpc_channel_args const*, grpc_channel_stack_type, grpc_transport*, grpc_resource_user*) (in /usr/lib/libgrpc.so.13.0.0)
==2618==    by 0x4EF84E2: grpc_core::Server::SetupTransport(grpc_transport*, grpc_pollset*, grpc_channel_args const*, grpc_core::RefCountedPtr<grpc_core::channelz::SocketNode> const&, grpc_resource_user*) (in /usr/lib/libgrpc.so.13.0.0)
==2618==    by 0x4E1775C: ??? (in /usr/lib/libgrpc.so.13.0.0)
==2618==    by 0x4E9818B: grpc_core::ExecCtx::Flush() (in /usr/lib/libgrpc.so.13.0.0)
==2618==    by 0x4E94437: ??? (in /usr/lib/libgrpc.so.13.0.0)
==2618==    by 0x4EF2B9F: ??? (in /usr/lib/libgrpc.so.13.0.0)
==2618==    by 0x50047D8: grpc::CompletionQueue::AsyncNextInternal(void**, bool*, gpr_timespec) (in /usr/lib/libgrpc++.so.1.33.2)
==2618==    by 0x5021B7C: grpc::Server::SyncRequestThreadManager::PollForWork(void**, bool*) (in /usr/lib/libgrpc++.so.1.33.2)
==2618== 
==2618== 768 bytes in 2 blocks are possibly lost in loss record 448 of 530
==2618==    at 0x483CB65: calloc (vg_replace_malloc.c:760)
==2618==    by 0x40142EB: _dl_allocate_tls (in /usr/lib/ld-2.32.so)
==2618==    by 0x488613C: pthread_create@@GLIBC_2.2.5 (in /usr/lib/libpthread-2.32.so)
==2618==    by 0x7A8C5AC: grpc_core::Thread::Thread(char const*, void (*)(void*), void*, bool*, grpc_core::Thread::Options const&) (in /usr/lib/libgpr.so.13.0.0)
==2618==    by 0x502DDD8: grpc::ThreadManager::WorkerThread::WorkerThread(grpc::ThreadManager*) (in /usr/lib/libgrpc++.so.1.33.2)
==2618==    by 0x502E494: grpc::ThreadManager::MainWorkLoop() (in /usr/lib/libgrpc++.so.1.33.2)
==2618==    by 0x502E5BC: grpc::ThreadManager::WorkerThread::Run() (in /usr/lib/libgrpc++.so.1.33.2)
==2618==    by 0x7A8C3D3: ??? (in /usr/lib/libgpr.so.13.0.0)
==2618==    by 0x48853E8: start_thread (in /usr/lib/libpthread-2.32.so)
==2618==    by 0x560C292: clone (in /usr/lib/libc-2.32.so)
==2618== 
==2618== 1,280 bytes in 4 blocks are possibly lost in loss record 472 of 530
==2618==    at 0x483A77F: malloc (vg_replace_malloc.c:307)
==2618==    by 0x7A8820E: gpr_malloc (in /usr/lib/libgpr.so.13.0.0)
==2618==    by 0x4EE78CA: grpc_raw_compressed_byte_buffer_create (in /usr/lib/libgrpc.so.13.0.0)
==2618==    by 0x4EEA99B: ??? (in /usr/lib/libgrpc.so.13.0.0)
==2618==    by 0x4E14038: ??? (in /usr/lib/libgrpc.so.13.0.0)
==2618==    by 0x4E1123F: ??? (in /usr/lib/libgrpc.so.13.0.0)
==2618==    by 0x4E9818B: grpc_core::ExecCtx::Flush() (in /usr/lib/libgrpc.so.13.0.0)
==2618==    by 0x4E94437: ??? (in /usr/lib/libgrpc.so.13.0.0)
==2618==    by 0x4EF2B9F: ??? (in /usr/lib/libgrpc.so.13.0.0)
==2618==    by 0x50047D8: grpc::CompletionQueue::AsyncNextInternal(void**, bool*, gpr_timespec) (in /usr/lib/libgrpc++.so.1.33.2)
==2618==    by 0x5021B7C: grpc::Server::SyncRequestThreadManager::PollForWork(void**, bool*) (in /usr/lib/libgrpc++.so.1.33.2)
==2618==    by 0x502E36C: grpc::ThreadManager::MainWorkLoop() (in /usr/lib/libgrpc++.so.1.33.2)
==2618== 
==2618== 2,880 bytes in 1 blocks are possibly lost in loss record 505 of 530
==2618==    at 0x483ADEF: operator new(unsigned long) (vg_replace_malloc.c:342)
==2618==    by 0x4EF62CB: grpc_core::Server::ChannelData::InitTransport(grpc_core::RefCountedPtr<grpc_core::Server>, grpc_channel*, unsigned long, grpc_transport*, long) (in /usr/lib/libgrpc.so.13.0.0)
==2618==    by 0x4EF85BF: grpc_core::Server::SetupTransport(grpc_transport*, grpc_pollset*, grpc_channel_args const*, grpc_core::RefCountedPtr<grpc_core::channelz::SocketNode> const&, grpc_resource_user*) (in /usr/lib/libgrpc.so.13.0.0)
==2618==    by 0x4E1775C: ??? (in /usr/lib/libgrpc.so.13.0.0)
==2618==    by 0x4E9818B: grpc_core::ExecCtx::Flush() (in /usr/lib/libgrpc.so.13.0.0)
==2618==    by 0x4E94437: ??? (in /usr/lib/libgrpc.so.13.0.0)
==2618==    by 0x4EF2B9F: ??? (in /usr/lib/libgrpc.so.13.0.0)
==2618==    by 0x50047D8: grpc::CompletionQueue::AsyncNextInternal(void**, bool*, gpr_timespec) (in /usr/lib/libgrpc++.so.1.33.2)
==2618==    by 0x5021B7C: grpc::Server::SyncRequestThreadManager::PollForWork(void**, bool*) (in /usr/lib/libgrpc++.so.1.33.2)
==2618==    by 0x502E36C: grpc::ThreadManager::MainWorkLoop() (in /usr/lib/libgrpc++.so.1.33.2)
==2618==    by 0x502E5BC: grpc::ThreadManager::WorkerThread::Run() (in /usr/lib/libgrpc++.so.1.33.2)
==2618==    by 0x7A8C3D3: ??? (in /usr/lib/libgpr.so.13.0.0)
==2618== 
==2618== 84,945 bytes in 7 blocks are possibly lost in loss record 530 of 530
==2618==    at 0x483A77F: malloc (vg_replace_malloc.c:307)
==2618==    by 0x7A8820E: gpr_malloc (in /usr/lib/libgpr.so.13.0.0)
==2618==    by 0x7A882C1: gpr_malloc_aligned (in /usr/lib/libgpr.so.13.0.0)
==2618==    by 0x7A8AFF1: grpc_core::Arena::CreateWithAlloc(unsigned long, unsigned long) (in /usr/lib/libgpr.so.13.0.0)
==2618==    by 0x4EEBE87: grpc_call_create(grpc_call_create_args const*, grpc_call**) (in /usr/lib/libgrpc.so.13.0.0)
==2618==    by 0x4EF73CE: grpc_core::Server::ChannelData::AcceptStream(void*, grpc_transport*, void const*) (in /usr/lib/libgrpc.so.13.0.0)
==2618==    by 0x4E1F425: grpc_chttp2_parsing_accept_stream(grpc_chttp2_transport*, unsigned int) (in /usr/lib/libgrpc.so.13.0.0)
==2618==    by 0x4E2D8CD: ??? (in /usr/lib/libgrpc.so.13.0.0)
==2618==    by 0x4E2E739: grpc_chttp2_perform_read(grpc_chttp2_transport*, grpc_slice const&) (in /usr/lib/libgrpc.so.13.0.0)
==2618==    by 0x4E2172A: ??? (in /usr/lib/libgrpc.so.13.0.0)
==2618==    by 0x4E8DAF5: grpc_combiner_continue_exec_ctx() (in /usr/lib/libgrpc.so.13.0.0)
==2618==    by 0x4E9813F: grpc_core::ExecCtx::Flush() (in /usr/lib/libgrpc.so.13.0.0)
==2618== 
==2618== LEAK SUMMARY:
==2618==    definitely lost: 326 bytes in 46 blocks
==2618==    indirectly lost: 0 bytes in 0 blocks
==2618==      possibly lost: 93,296 bytes in 30 blocks
==2618==    still reachable: 333,712 bytes in 2,614 blocks
==2618==                       of which reachable via heuristic:
==2618==                         stdstring          : 71 bytes in 1 blocks
==2618==                         newarray           : 408 bytes in 2 blocks
==2618==         suppressed: 0 bytes in 0 blocks
==2618== Reachable blocks (those to which a pointer was found) are not shown.
==2618== To see them, rerun with: --leak-check=full --show-leak-kinds=all
==2618== 
==2618== For lists of detected and suppressed errors, rerun with: -s
==2618== ERROR SUMMARY: 17 errors from 17 contexts (suppressed: 0 from 0)
Aborted

Steps to Reproduce

Run sudo fancon service in one terminal, and fancon in the other.

Expected behavior

It should let me configure and test fans, I guess.

Environment

  • Version: Latest Git
  • OS: Manjaro
  • Kernel: 5.9.1

unable to set log levels

How does the logging configuration work?

$ sudo ./fancon --help
fancon argument=value ...
…
-l  log-lvl      Sets the logging level: info, debug, trace, warning, error (default: info)

Based on the help text I assumed one of the following invocations should work. As you can see fancon always reports <debug> No config found

$ sudo ./fancon start -v -l=debug
20/07/07 08:49 [20757] <debug> No config found

$ sudo ./fancon start -v -l debug
20/07/07 08:50 [20844] <warning> Unknown argument 'debug' from statement 'debug'
20/07/07 08:50 [20844] <debug> No config found
Starting controller

Failed build due protoc version

Describe the bug

I tried to wwrite PKGBUILD for the Arch Linux distribution. But I faced with some problems.
Seems current version of the protobuf library not compatible with fancon sources.

Build log:

-- The CXX compiler identification is Clang 10.0.0
-- Check for working CXX compiler: /usr/lib/ccache/bin/clang++
-- Check for working CXX compiler: /usr/lib/ccache/bin/clang++ - works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Looking for C++ include pthread.h
-- Looking for C++ include pthread.h - found
-- Performing Test CMAKE_HAVE_LIBC_PTHREAD
-- Performing Test CMAKE_HAVE_LIBC_PTHREAD - Failed
-- Looking for pthread_create in pthreads
-- Looking for pthread_create in pthreads - not found
-- Looking for pthread_create in pthread
-- Looking for pthread_create in pthread - found
-- Found Threads: TRUE  
-- Found Boost: /usr/lib64/cmake/Boost-1.72.0/BoostConfig.cmake (found version "1.72.0") found components: log thread system filesystem 
-- Found Sensors: /usr/include/sensors  
-- Found Protobuf: /usr/lib/libprotobuf.so;-lpthread (found version "3.11.4") 
-- Found GRPC: /usr/lib/libgrpc.so  
-- Configuring done
-- Generating done
-- Build files have been written to: /var/cache/build/src/fancon/build
Scanning dependencies of target fancon
[  5%] Building CXX object CMakeFiles/fancon.dir/src/main.cpp.o
In file included from /var/cache/build/src/fancon/src/main.cpp:1:
In file included from /var/cache/build/src/fancon/src/main.hpp:23:
In file included from /var/cache/build/src/fancon/src/Controller.hpp:13:
In file included from /var/cache/build/src/fancon/src/Devices.hpp:6:
In file included from /var/cache/build/src/fancon/src/FanDell.hpp:4:
In file included from /var/cache/build/src/fancon/src/DellSMM.hpp:6:
In file included from /var/cache/build/src/fancon/src/FanInterface.hpp:7:
In file included from /var/cache/build/src/fancon/src/SensorInterface.hpp:8:
/var/cache/build/src/fancon/src/proto/DevicesSpec.pb.h:25:2: error: This file was generated by an older version of protoc which is
#error This file was generated by an older version of protoc which is
 ^
/var/cache/build/src/fancon/src/proto/DevicesSpec.pb.h:26:2: error: incompatible with your Protocol Buffer headers.  Please
#error incompatible with your Protocol Buffer headers.  Please
 ^
/var/cache/build/src/fancon/src/proto/DevicesSpec.pb.h:27:2: error: regenerate this file with a newer version of protoc.
#error regenerate this file with a newer version of protoc.
 ^
/var/cache/build/src/fancon/src/proto/DevicesSpec.pb.h:215:56: error: only virtual member functions can be marked 'final'
      ::google::protobuf::io::CodedInputStream *input) final;
                                                       ^~~~~
/var/cache/build/src/fancon/src/proto/DevicesSpec.pb.h:217:64: error: only virtual member functions can be marked 'final'
      ::google::protobuf::io::CodedOutputStream *output) const final;
                                                               ^~~~~
/var/cache/build/src/fancon/src/proto/DevicesSpec.pb.h:219:68: error: only virtual member functions can be marked 'final'
      bool deterministic, ::google::protobuf::uint8 *target) const final;
                                                                   ^~~~~
/var/cache/build/src/fancon/src/proto/DevicesSpec.pb.h:336:56: error: only virtual member functions can be marked 'final'
      ::google::protobuf::io::CodedInputStream *input) final;
                                                       ^~~~~
/var/cache/build/src/fancon/src/proto/DevicesSpec.pb.h:338:64: error: only virtual member functions can be marked 'final'
      ::google::protobuf::io::CodedOutputStream *output) const final;
                                                               ^~~~~
/var/cache/build/src/fancon/src/proto/DevicesSpec.pb.h:340:68: error: only virtual member functions can be marked 'final'
      bool deterministic, ::google::protobuf::uint8 *target) const final;
                                                                   ^~~~~
/var/cache/build/src/fancon/src/proto/DevicesSpec.pb.h:459:56: error: only virtual member functions can be marked 'final'
      ::google::protobuf::io::CodedInputStream *input) final;
                                                       ^~~~~
/var/cache/build/src/fancon/src/proto/DevicesSpec.pb.h:461:64: error: only virtual member functions can be marked 'final'
      ::google::protobuf::io::CodedOutputStream *output) const final;
                                                               ^~~~~
/var/cache/build/src/fancon/src/proto/DevicesSpec.pb.h:463:68: error: only virtual member functions can be marked 'final'
      bool deterministic, ::google::protobuf::uint8 *target) const final;
                                                                   ^~~~~
/var/cache/build/src/fancon/src/proto/DevicesSpec.pb.h:567:56: error: only virtual member functions can be marked 'final'
      ::google::protobuf::io::CodedInputStream *input) final;
                                                       ^~~~~
/var/cache/build/src/fancon/src/proto/DevicesSpec.pb.h:569:64: error: only virtual member functions can be marked 'final'
      ::google::protobuf::io::CodedOutputStream *output) const final;
                                                               ^~~~~
/var/cache/build/src/fancon/src/proto/DevicesSpec.pb.h:571:68: error: only virtual member functions can be marked 'final'
      bool deterministic, ::google::protobuf::uint8 *target) const final;
                                                                   ^~~~~
/var/cache/build/src/fancon/src/proto/DevicesSpec.pb.h:800:56: error: only virtual member functions can be marked 'final'
      ::google::protobuf::io::CodedInputStream *input) final;
                                                       ^~~~~
/var/cache/build/src/fancon/src/proto/DevicesSpec.pb.h:802:64: error: only virtual member functions can be marked 'final'
      ::google::protobuf::io::CodedOutputStream *output) const final;
                                                               ^~~~~
/var/cache/build/src/fancon/src/proto/DevicesSpec.pb.h:804:68: error: only virtual member functions can be marked 'final'
      bool deterministic, ::google::protobuf::uint8 *target) const final;
                                                                   ^~~~~
/var/cache/build/src/fancon/src/proto/DevicesSpec.pb.h:1010:56: error: only virtual member functions can be marked 'final'
      ::google::protobuf::io::CodedInputStream *input) final;
                                                       ^~~~~
fatal error: too many errors emitted, stopping now [-ferror-limit=]
20 errors generated.
make[2]: *** [CMakeFiles/fancon.dir/build.make:83: CMakeFiles/fancon.dir/src/main.cpp.o] Error 1
make[1]: *** [CMakeFiles/Makefile2:96: CMakeFiles/fancon.dir/all] Error 2
make: *** [Makefile:150: all] Error 2

PKGBUILD link: https://aur.archlinux.org/cgit/aur.git/tree/PKGBUILD?h=fancon-git

Steps to Reproduce

Start docker container with the build environment:

docker run -t -i --rm registry.gitlab.com/aur1/utils:latest bash

Inside container:

sudo pacman --sync --refresh --sysupgrade --noconfirm
aur sync fancon-git --noview --noconfirm

Expected behavior

Sucess build.

Environment

  • Version: 0.20.1.r3.gbebdfc8
  • OS: Arch Linux
  • Kernel: 5.6.10-zen1-1-zen
  • CMake: 3.17.2
  • CLang: 10.0.0
  • ProtoBuf: 3.11.4

build failure on Arch

  1. https://aur.archlinux.org/fancon.git fails to build on Arch, due to 404 link to https://github.com/hbriese/fancon/archive/v0.23.7.tar.gz
    Actual tar.gz is published without starting "v"

  2. Latest git https://aur.archlinux.org/fancon-git.git doesn't build as well, throws error:

CMake Error at CMakeLists.txt:65 (add_executable):
  Cannot find source file:

    /home/user/fancon-git/src/fancon/src/proto/DevicesSpec.pb.cc

  Tried extensions .c .C .c++ .cc .cpp .cxx .cu .mpp .m .M .mm .h .hh .h++
  .hm .hpp .hxx .in .txx .f .F .for .f77 .f90 .f95 .f03 .ispc


CMake Error at CMakeLists.txt:65 (add_executable):
  No SOURCES given to target: fancon


CMake Generate step failed.  Build files cannot be regenerated correctly.
==> ERROR: A failure occurred in build().
    Aborting...
  1. README config example is broken, due to commit e377965#diff-b335630551682c19a781afebcf4d07bf978fb1f8ac04c6bf87428ed5106870f5

Build fails: cannot find source file

Describe the bug

Cannot build fancon despite all dependencies

Steps to Reproduce

  1. Install all dependencies
  2. mkdir build; cd build && cmake -DCMAKE_BUILD_TYPE=Release -DNVIDIA_SUPPORT=ON .. && make -j && sudo make install
  3. Build fails
$ mkdir build; cd build && cmake -DCMAKE_BUILD_TYPE=Release -DNVIDIA_SUPPORT=ON .. && make -j && sudo make install
-- The CXX compiler identification is GNU 7.5.0
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Looking for C++ include pthread.h
-- Looking for C++ include pthread.h - found
-- Looking for pthread_create
-- Looking for pthread_create - not found
-- Looking for pthread_create in pthreads
-- Looking for pthread_create in pthreads - not found
-- Looking for pthread_create in pthread
-- Looking for pthread_create in pthread - found
-- Found Threads: TRUE  
-- Boost version: 1.66.0
-- Found the following Boost libraries:
--   log
--   thread
--   system
--   filesystem
--   date_time
--   log_setup
--   chrono
-- Found Sensors: /usr/include/sensors  
-- Looking for XOpenDisplay in /usr/lib64/libX11.so;/usr/lib64/libXext.so
-- Looking for XOpenDisplay in /usr/lib64/libX11.so;/usr/lib64/libXext.so - found
-- Looking for gethostbyname
-- Looking for gethostbyname - found
-- Looking for connect
-- Looking for connect - found
-- Looking for remove
-- Looking for remove - found
-- Looking for shmat
-- Looking for shmat - found
-- Looking for IceConnectionNumber in ICE
-- Looking for IceConnectionNumber in ICE - found
-- Found X11: /usr/lib64/libX11.so
-- Found NVCtrl: /usr/include/NVCtrl  
NVIDIA support enabled
-- Found Protobuf: /usr/lib64/libprotobuf.so;-lpthread (found version "3.5.0") 
-- Found GRPC: /usr/lib64/libgrpc.so  
-- Configuring done
CMake Error at CMakeLists.txt:54 (add_executable):
  Cannot find source file:

    /home/chris/Software/fancon/src/proto/DevicesSpec.grpc.pb.cc

  Tried extensions .c .C .c++ .cc .cpp .cxx .m .M .mm .h .hh .h++ .hm .hpp
  .hxx .in .txx


CMake Error: CMake can not determine linker language for target: fancon
CMake Error: Cannot determine link language for target "fancon".
-- Generating done
-- Build files have been written to: /home/chris/Software/fancon/build

Expected behavior

Environment

  • Tested on versions: 1ca6aaa and d5ec8c7 (v0.20.0).
  • OS: Opensuse Leap 15.1
  • Kernel: 4.12.14-lp151.28.40-default

Additional context

Not working on Ubuntu 18.04 LTS

(base) zhe@zhe:~$ fancon
05/03 11:19 [18766] <debug> Failed to load libXNVCtrl.so: 
libXNVCtrl.so: cannot open shared object file: 
No such file or directory; see `fancon --help` for more info
段错误 (核心已转储)

In addition, i cannot find the text file configuration in /etc/fancon.conf.

link error when build form source

Describe the bug

link error when build form source

Steps to Reproduce

cd fancon/build
cmake ../
make -j

Expected behavior

link successfully

Environment

  • Version: latest
  • OS: Ubuntu 20.04
  • Kernel: 5.4.0-65-generic

Additional context

root@master-node:/home/ubuntu/WorkAtHome/fancon/build# make -j
Scanning dependencies of target fancon
[ 4%] Building CXX object CMakeFiles/fancon.dir/src/main.cpp.o
[ 9%] Building CXX object CMakeFiles/fancon.dir/src/proto/DevicesSpec.grpc.pb.cc.o
[ 14%] Building CXX object CMakeFiles/fancon.dir/src/proto/DevicesSpec.pb.cc.o
[ 19%] Building CXX object CMakeFiles/fancon.dir/src/Service.cpp.o
[ 23%] Building CXX object CMakeFiles/fancon.dir/src/Client.cpp.o
[ 28%] Building CXX object CMakeFiles/fancon.dir/src/SensorInterface.cpp.o
[ 33%] Building CXX object CMakeFiles/fancon.dir/src/FanInterface.cpp.o
[ 38%] Building CXX object CMakeFiles/fancon.dir/src/FanSysfs.cpp.o
[ 42%] Building CXX object CMakeFiles/fancon.dir/src/Devices.cpp.o
[ 47%] Building CXX object CMakeFiles/fancon.dir/src/NvidiaDevices.cpp.o
[ 52%] Building CXX object CMakeFiles/fancon.dir/src/Controller.cpp.o
[ 57%] Building CXX object CMakeFiles/fancon.dir/src/NvidiaNvml.cpp.o
[ 61%] Building CXX object CMakeFiles/fancon.dir/src/DellSMM.cpp.o
[ 66%] Building CXX object CMakeFiles/fancon.dir/src/NvidiaUtil.cpp.o
[ 71%] Building CXX object CMakeFiles/fancon.dir/src/FanDell.cpp.o
[ 76%] Building CXX object CMakeFiles/fancon.dir/src/SensorSysfs.cpp.o
[ 80%] Linking CXX executable fancon
CMakeFiles/fancon.dir/src/Service.cpp.o:在函数‘fc::Service::SubscribeDevices(grpc::ServerContext*, fc_pb::Empty const*, grpc::ServerWriter<fc_pb::Devices>)’中:
/home/ubuntu/WorkAtHome/fancon/src/Service.cpp:78:对‘grpc::ServerContextBase::IsCancelled() const’未定义的引用
CMakeFiles/fancon.dir/src/Service.cpp.o:在函数‘operator()’中:
/home/ubuntu/WorkAtHome/fancon/src/Service.cpp:64:对‘grpc::ServerContextBase::IsCancelled() const’未定义的引用
CMakeFiles/fancon.dir/src/Service.cpp.o:在函数‘fc::Service::SubscribeFanStatus(grpc::ServerContext
, fc_pb::Empty const*, grpc::ServerWriter<fc_pb::FanStatus>*)’中:
/home/ubuntu/WorkAtHome/fancon/src/Service.cpp:150:对‘grpc::ServerContextBase::IsCancelled() const’未定义的引用
CMakeFiles/fancon.dir/src/Service.cpp.o:在函数‘operator()’中:
/home/ubuntu/WorkAtHome/fancon/src/Service.cpp:130:对‘grpc::ServerContextBase::IsCancelled() const’未定义的引用
/home/ubuntu/WorkAtHome/fancon/src/Service.cpp:137:对‘grpc::ServerContextBase::IsCancelled() const’未定义的引用
clang: error: linker command failed with exit code 1 (use -v to see invocation)
CMakeFiles/fancon.dir/build.make:396: recipe for target 'fancon' failed
make[2]: *** [fancon] Error 1
CMakeFiles/Makefile2:94: recipe for target 'CMakeFiles/fancon.dir/all' failed
make[1]: *** [CMakeFiles/fancon.dir/all] Error 2
Makefile:148: recipe for target 'all' failed
make: *** [all] Error 2

Please add how to use the program in the readme

Hi

Its would be really great if instructions on how to use the program were included in the readme. I understand that it is somehow controlled through the command line but other than that I can't work it out.

A GUI would be really amazing, currently there don't seem to be any other options for Ubuntu

Thaniks very much for making this

Boost shared library problem on Ubuntu 18.04 snap?

This is what I get when I try to execute

hbarta@cypress:~$ fancon
------------------------------------------------------------------------------------------------------------
First use: please run 'sudo fancon test && sudo fancon -lf', then configure fan profiles in /etc/fancon.conf
------------------------------------------------------------------------------------------------------------

Usage:
  fancon <command> [options]

Available commands (and options <default>):
-lf list-fans       Lists the UIDs of all fans
-ls list-sensors    List the UIDs of all temperature sensors
-wc write-config    Writes missing fan UIDs to /etc/fancon.conf
test                Tests the fan characteristic of all fans, required for usage of RPM in /etc/fancon.conf
  -r retries 4      Number of retries a test does before failure, increase if you think a failing fan can pass!
start               Starts the fancon daemon
  -f fork           Forks off the parent process
  -t threads        Ignores "threads=" in /etc/fancon.conf and sets maximum number of threads to run
stop                Stops the fancon daemon
reload              Reloads the fancon daemon

Global options: 
  -d debug          Write debug level messages to log
  -q quiet          Only write error level messages to log
Segmentation fault (core dumped)
hbarta@cypress:~$ fancon -lf
------------------------------------------------------------------------------------------------------------
First use: please run 'sudo fancon test && sudo fancon -lf', then configure fan profiles in /etc/fancon.conf
------------------------------------------------------------------------------------------------------------

Segmentation fault (core dumped)
hbarta@cypress:~$ sudo -s
[sudo] password for hbarta: 
root@cypress:~# fancon test
------------------------------------------------------------------------------------------------------------
First use: please run 'sudo fancon test && sudo fancon -lf', then configure fan profiles in /etc/fancon.conf
------------------------------------------------------------------------------------------------------------

/snap/fancon/11/bin/fancon: error while loading shared libraries: /snap/fancon/11/usr/lib/x86_64-linux-gnu/libboost_log.so.1.61.0: shared object not open
root@cypress:~# 

The shared object seems to exist.

hbarta@cypress:~$ ls -l /snap/fancon/11/usr/lib/x86_64-linux-gnu/libboost_log.so.1.61.0
-rw-r--r-- 1 root root 778496 Aug  3  2016 /snap/fancon/11/usr/lib/x86_64-linux-gnu/libboost_log.so.1.61.0

System and snap info

hbarta@cypress:~$ cat /etc/issue
Ubuntu 18.04.2 LTS \n \l

hbarta@cypress:~$ snap list fancon
Name    Version  Rev  Tracking  Publisher  Notes
fancon  0.7.2.5  11   stable    hbriese    -
hbarta@cypress:~$ dpkg -l snapd
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||/ Name                     Version           Architecture      Description
+++-========================-=================-=================-======================================================
ii  snapd                    2.37.4+18.04.1    amd64             Daemon and tooling that enable snap packages
hbarta@cypress:~$ 

Let me know if there is further information that would help (or if this is not the correct place to file this bug.)

please release a new version

Seems like release 0.20.1 does not compile (#8) and these issues were fixed since then. How about releasing a new version so users don't have to resort to git versions? (Ideally after fixing #12 ;-)

Not doing it on a macBook Pro

Hi,

It's not working on Mac, there's some msg fancon test gives that it can't find files in /sys/class/..., messy output about pwm or similar, what doesn't surprise when you're aware that all seems to be is in /sys/devices/platform/applesmc.768/ where you can change fans via rpm. Can this be fixed? Listing fans and sensors seems ok, it's applesmc/1:fan1, applesmc/1:fan2 for fans or alike..

T2MS
Mark

fancon always tests fans, tries to write /etc/fancon.conf

I compiled git version de5bb40 on Fedora 31.

Steps to Reproduce

sudo ./fancon start
20/07/06 16:45 [81198] <warning> Unknown argument 'start' from statement 'start'
Starting controller
Testing fans, this may take a long time.
Don't stress your system!
Tests …

Expected behavior

  • no warning about "Unknown argument 'start'"
  • fancon just uses the preconfigured /etc/fanconf.conf, does not write to /etc

Environment

  • Version: git version de5bb40
  • OS: Fedora 31
  • Kernel: 5.7.7-100.fc31.x86_64

Additional context

fancon_system_info.txt

Dependency problems

On a Kubuntu x64 16.04.05:

╰─$ sudo dpkg -i fancon_0.12.0_amd64.deb                                                                                                                                                 
dpkg: warning: downgrading fancon from 0.12.8 to 0.12.0
(Reading database ... 393708 files and directories currently installed.)
Preparing to unpack fancon_0.12.0_amd64.deb ...
Unpacking fancon (0.12.0) over (0.12.8) ...
dpkg: dependency problems prevent configuration of fancon:
 fancon depends on libboost-atomic1.62.0; however:
  Package libboost-atomic1.62.0 is not installed.
 fancon depends on libboost-chrono1.62.0; however:
  Package libboost-chrono1.62.0 is not installed.
 fancon depends on libboost-date-time1.62.0; however:
  Package libboost-date-time1.62.0 is not installed.
 fancon depends on libboost-filesystem1.62.0; however:
  Package libboost-filesystem1.62.0 is not installed.
 fancon depends on libboost-log1.62.0; however:
  Package libboost-log1.62.0 is not installed.
 fancon depends on libboost-system1.62.0; however:
  Package libboost-system1.62.0 is not installed.
 fancon depends on libboost-thread1.62.0; however:
  Package libboost-thread1.62.0 is not installed.
 fancon depends on libstdc++6 (>= 6); however:
  Version of libstdc++6:amd64 on system is 5.4.0-6ubuntu1~16.04.10.
 fancon depends on libc++-helpers; however:
  Package libc++-helpers is not installed.

dpkg: error processing package fancon (--install):
 dependency problems - leaving unconfigured
Processing triggers for systemd (229-4ubuntu21.10) ...
Processing triggers for ureadahead (0.100.0-19) ...
Errors were encountered while processing:
 fancon

unable to compile git since commit d76e6780

Describe the bug

I'm unable to compile fancon since git commit d76e678 (I used cmake … -DNVIDIA_SUPPORT=OFF ..).

commit d76e6780ff87fdb4a76e65934b0592d6b338ef6d
Author: Hayden Briese <[email protected]>
Date:   Thu May 7 02:02:38 2020 +1000

    - Fixed bug where configured NVIDIA devices may be run without NVIDIA control
    
    Signed-off-by: Hayden Briese <[email protected]>

Steps to Reproduce

$ make
Scanning dependencies of target fancon
[  5%] Building CXX object CMakeFiles/fancon.dir/src/main.cpp.o
[ 11%] Building CXX object CMakeFiles/fancon.dir/src/Controller.cpp.o
…/upstream.git/src/Controller.cpp:12:3: error: use of undeclared identifier 'NV'
  NV::init();
  ^
1 error generated.
make[2]: *** [CMakeFiles/fancon.dir/build.make:148: CMakeFiles/fancon.dir/src/Controller.cpp.o] Fehler 1
make[1]: *** [CMakeFiles/Makefile2:96: CMakeFiles/fancon.dir/all] Fehler 2
make: *** [Makefile:150: all] Fehler 2

Expected behavior

compilation works

Environment

  • Version: fancon git (commit d76e678)
  • OS: Fedora 31
  • Kernel: 5.7.7
  • clang: 9.0.1
  • g++: 9.3.1

Additional context

fancon_amd64.deb for 0.23.7: "not installable" dependencies on Bookworm

Describe the bug

The following packages have unmet dependencies:
 fancon : Depends: libgrpc++1 but it is not installable
          Depends: libprotobuf23 (>= 3.12.3) but it is not installable

Steps to Reproduce

After downloading from https://github.com/hbriese/fancon/releases/download/0.23.7/fancon_amd64.deb
apt install /tmp/fancon_amd64.deb

Expected behavior

fancon installed

Environment

  • Version: 0.23.7
  • OS: Debian Bookworm
  • Kernel: 6.1.0-15-amd64

core dump when running test

I'm testing fancon_0.12.0_amd64.deb on Ubuntu 17.04

$ fancon test
07/28 15:34 [12860] <debug> NVIDIA fan control not supported
Adding 1 new fans
Starting tests. This may take some time (to ensure accurate results)
terminate called after throwing an instance of 'std::ios_base::failure[abi:cxx11]'
  what():  basic_filebuf::underflow error reading the file: iostream error
Aborted (core dumped)

the fancon.conf contains following:

# <Fan UID>     <Sensor UID>     <Fan Config>
#nouveau/0:fan1
dell_smm/1:fan1
dell_smm/1:fan2

Start with root/systemd unit fails

Describe the bug

Failed with NVIDIA control by root user.

# LANG=C fancon
No protocol specified
20/05/06 20:27 [109117] <warning> $XAUTHORITY env variable(s) not set, set to enable NVIDIA support
20/05/06 20:27 [109117] <fatal> X11Display must be connected
terminate called after throwing an instance of 'std::exception'
  what():  std::exception

But I can't run as normal user:

$ funcon
20/05/06 20:32 [109236] <fatal> Must be run as root

Seems service which needs running the Xorg should be running by non root user.

Steps to Reproduce

  • build fancon with NVIDIA support
  • run fancon by root ro with systemd unit file

Expected behavior

Run without errors with systemd unit file.

Additional context

Config:

config {
  update_interval: 1000
  dynamic: true
  smoothing_intervals: 3
  top_stickiness_intervals: 2
  temp_averaging_intervals: 3
}
devices {
  fan {
    type: SYS
    label: "hwmon1/fan2"
    sensor: "hwmon0/Tdie"
    temp_to_rpm: "40: 0%, 50: 20%, 60: 50%, 70: 80%, 80: 100%"
    rpm_to_pwm: "0: 30, 175: 34, 181: 36, 203: 38, 212: 40, 219: 42, 239: 44, 249: 46, 261: 48, 262: 50, 266: 52, 283: 54, 297: 56, 310: 58, 320: 60, 336: 62, 349: 64, 352: 66, 370: 68, 377: 70, 398: 72, 406: 74, 418: 76, 424: 78, 451: 80, 466: 82, 476: 84, 496: 86, 498: 88, 499: 90, 518: 92, 533: 94, 543: 96, 547: 98, 569: 100, 573: 102, 584: 104, 597: 106, 606: 108, 625: 110, 633: 112, 639: 114, 648: 116, 656: 118, 669: 120, 685: 122, 695: 124, 699: 126, 717: 128, 722: 130, 727: 132, 734: 134, 754: 136, 758: 138, 779: 140, 781: 142, 790: 144, 791: 146, 810: 148, 821: 150, 841: 152, 849: 154, 856: 156, 861: 158, 867: 160, 882: 162, 889: 164, 903: 166, 916: 168, 950: 170, 954: 172, 964: 174, 968: 176, 976: 178, 982: 180, 984: 182, 1000: 184, 1021: 186, 1038: 188, 1040: 190, 1042: 192, 1044: 194, 1051: 196, 1065: 198, 1094: 200, 1102: 202, 1109: 204, 1116: 206, 1128: 208, 1129: 210, 1147: 212, 1149: 214, 1159: 216, 1171: 218, 1185: 220, 1190: 222, 1198: 224, 1217: 226, 1220: 228, 1236: 230, 1250: 232, 1256: 234, 1261: 236, 1274: 238, 1275: 242, 1299: 244, 1305: 246, 1309: 250, 1323: 252, 1337: 254, 1356: 255"
    pwm_path: "/sys/class/hwmon/hwmon1/pwm2"
    rpm_path: "/sys/class/hwmon/hwmon1/fan2_input"
    enable_path: "/sys/class/hwmon/hwmon1/pwm2_enable"
    driver_flag: 5
  }
  fan {
    type: NVIDIA
    label: "1660_SUPER"
    sensor: "1660_SUPER_temp"
    temp_to_rpm: "60: 0%, 70: 30%, 80: 50%, 90: 100%"
    rpm_to_pwm: "1315: 102, 2454: 188, 2646: 204, 3303: 255"
    start_pwm: 102
  }
  sensor {
    type: NVIDIA
    label: "1660_SUPER_temp"
  }
  sensor {
    label: "hwmon0/Tdie"
    input_path: "/sys/class/hwmon/hwmon0/temp1_input"
    max_path: "/sys/class/hwmon/hwmon0/temp1_max"
  }
}

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.