Skip to content
View in the app

A better way to browse. Learn more.

Unraid

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

[Support] SasaKaranovic - OpenFan Controller

Featured Replies

  • Author

@Enfoxed That's odd. Can you log into your Unraid system and check if you have `/dev/ttyACM0`?


I can see `/dev/ttyACM0` is specified as the COM port
`Dec 18 2024 16:53:29.840 pid:7 webserver.py 295 INFO Using COM port `/dev/ttyACM0` (specified in `OPENFANCOMPORT` env variable).`


But immediately underneath it's selecting `/dev/ttyS0` which is obviously wrong

`Dec 18 2024 16:53:29.843 pid:7 serial_driver.py 89 DEBUG /dev/ttyS0`

  • Replies 99
  • Views 11.6k
  • Created
  • Last Reply

Top Posters In This Topic

Most Popular Posts

  • For anyone interested in this great project, i created an updated 3d printable case. This remix allows the installation of the fancontroller in a 2.5" SATA SSD slot. https://makerworld.com/en/models

  • SasaKaranovic
    SasaKaranovic

    New version should be live now. Main improvement should be that now you are able to specify multiple disks temperatures to be used for determining fan curve profile. This should hopefully make a life

  • JayBee_Unraid
    JayBee_Unraid

    That was it! I just needed to switch it to host. Thanks for figuring that out. No, that address is the one used my unRaid server, you can see it in the screenshot. No problem with the port either. It

Posted Images

Hmm, i cant find it...

 

Do i need to reactivate it (hardware side) after restart after an update? Never had this issue before

root@Unraid-Server:~# ls -l /dev/
total 0
crw-------  1 root root     10, 126 Dec 18 16:38 aer_inject
drwxr-xr-x  2 root root         740 Dec 18 17:22 block/
drwxr-xr-x  2 root root         460 Dec 18 16:38 bsg/
crw-rw----  1 root disk     10, 234 Dec 18 16:38 btrfs-control
drwxr-xr-x  3 root root          60 Dec 18 16:37 bus/
drwxr-xr-x  2 root root        6020 Dec 25 01:51 char/
crw-------  1 root root      5,   1 Dec 18 16:41 console
lrwxrwxrwx  1 root root          11 Dec 18 16:38 core -> /proc/kcore
drwxr-xr-x 66 root root        1320 Dec 18 16:37 cpu/
crw-------  1 root root     10, 125 Dec 18 16:38 cpu_dma_latency
drwxr-xr-x  7 root root         140 Dec 18 16:38 disk/
drwxrwxrwx  3 root root         100 Dec 18 16:38 dri/
crw-rw----  1 root video    29,   0 Dec 18 16:38 fb0
lrwxrwxrwx  1 root root          13 Dec 18 16:38 fd -> /proc/self/fd/
crw-rw-rw-  1 root root      1,   7 Dec 18 16:38 full
crw-rw-rw-  1 root root     10, 229 Dec 18 16:38 fuse
crw-------  1 root root     10, 228 Dec 18 16:38 hpet
crw-------  1 root root     10, 183 Dec 18 16:38 hwrng
prw-------  1 root root           0 Dec 18 16:38 initctl|
drwxr-xr-x  3 root root         140 Dec 18 16:38 input/
crw-r--r--  1 root root      1,  11 Dec 18 16:38 kmsg
crw-rw----  1 root users    10, 232 Dec 18 17:23 kvm
srw-rw-rw-  1 root root           0 Dec 18 16:38 log=
crw-rw----  1 root disk     10, 237 Dec 18 16:38 loop-control
brw-rw----  1 root disk      7,   0 Dec 18 16:38 loop0
brw-rw----  1 root disk      7,   1 Dec 18 16:38 loop1
brw-rw----  1 root disk      7,   2 Dec 18 17:22 loop2
brw-rw----  1 root disk      7,   3 Dec 18 17:23 loop3
brw-rw----  1 root disk      7,   4 Dec 18 16:38 loop4
brw-rw----  1 root disk      7,   5 Dec 18 16:38 loop5
brw-rw----  1 root disk      7,   6 Dec 18 16:38 loop6
brw-rw----  1 root disk      7,   7 Dec 18 16:38 loop7
drwxr-xr-x  2 root root          60 Dec 18 16:38 mapper/
crw-------  1 root root     10, 227 Dec 18 16:38 mcelog
brw-rw----  1 root disk      9,   1 Dec 18 17:22 md1p1
brw-rw----  1 root disk      9,   2 Dec 18 17:22 md2p1
brw-rw----  1 root disk      9,   3 Dec 18 17:22 md3p1
brw-rw----  1 root disk      9,   4 Dec 18 17:22 md4p1
brw-rw----  1 root disk      9,   5 Dec 18 17:22 md5p1
crw-r-----  1 root kmem      1,   1 Dec 18 16:38 mem
lrwxrwxrwx  1 root root          10 Dec 18 16:38 mouse -> input/mice
crw-------  1 root root     10, 221 Dec 18 16:38 mpt2ctl
crw-------  1 root root     10, 222 Dec 18 16:38 mpt3ctl
drwxr-xr-x  2 root root          60 Dec 18 16:38 net/
crw-------  1 root root    244,   0 Dec 18 16:38 ng0n1
crw-rw-rw-  1 root root      1,   3 Dec 18 16:38 null
drwxr-xr-x  2 root root          80 Dec 18 16:44 nvidia-caps/
crw-rw-rw-  1 root root    195, 254 Dec 18 16:44 nvidia-modeset
crw-rw-rw-  1 root root    240,   0 Dec 18 16:44 nvidia-uvm
crw-rw-rw-  1 root root    240,   1 Dec 18 16:44 nvidia-uvm-tools
crw-rw-rw-  1 root root    195,   0 Dec 18 16:44 nvidia0
crw-rw-rw-  1 root root    195, 255 Dec 18 16:44 nvidiactl
crw-------  1 root root    245,   0 Dec 18 16:38 nvme0
brw-rw----  1 root disk    259,   0 Dec 18 16:38 nvme0n1
brw-rw----  1 root disk    259,   1 Dec 18 16:38 nvme0n1p1
crw-r-----  1 root kmem      1,   4 Dec 18 16:38 port
crw-rw----  1 root dialout 108,   0 Dec 18 16:38 ppp
crw-rw-rw-  1 root tty       5,   2 Dec 25 01:57 ptmx
drwxr-xr-x  2 root root           0 Dec 18 16:38 pts/
crw-rw-rw-  1 root root      1,   8 Dec 18 16:38 random
lrwxrwxrwx  1 root root           4 Dec 18 16:38 rtc -> rtc0
crw-r--r--  1 root root    252,   0 Dec 18 16:38 rtc0
brw-rw----  1 root plugdev   8,   0 Dec 18 16:38 sda
brw-rw----  1 root plugdev   8,   1 Dec 18 16:38 sda1
brw-rw----  1 root disk      8,  16 Dec 18 16:38 sdb
brw-rw----  1 root disk      8,  17 Dec 18 16:38 sdb1
brw-rw----  1 root disk      8,  32 Dec 18 16:38 sdc
brw-rw----  1 root disk      8,  33 Dec 18 16:38 sdc1
brw-rw----  1 root disk      8,  48 Dec 18 16:38 sdd
brw-rw----  1 root disk      8,  49 Dec 18 16:38 sdd1
brw-rw----  1 root disk      8,  64 Dec 18 16:38 sde
brw-rw----  1 root disk      8,  65 Dec 18 16:38 sde1
brw-rw----  1 root disk      8,  80 Dec 18 16:38 sdf
brw-rw----  1 root disk      8,  81 Dec 18 16:38 sdf1
brw-rw----  1 root disk      8,  96 Dec 18 16:38 sdg
brw-rw----  1 root disk      8,  97 Dec 18 16:38 sdg1
brw-rw----  1 root disk      8, 112 Dec 18 16:38 sdh
brw-rw----  1 root disk      8, 113 Dec 18 16:38 sdh1
brw-rw----  1 root disk      8, 128 Dec 18 16:38 sdi
brw-rw----  1 root disk      8, 129 Dec 18 16:38 sdi1
brw-rw----  1 root disk      8, 144 Dec 18 16:38 sdj
brw-rw----  1 root disk      8, 145 Dec 18 16:38 sdj1
crw-rw----  1 root disk     21,   0 Dec 18 16:38 sg0
crw-rw----  1 root disk     21,   1 Dec 18 16:38 sg1
crw-rw----  1 root disk     21,   2 Dec 18 16:38 sg2
crw-rw----  1 root disk     21,   3 Dec 18 16:38 sg3
crw-rw----  1 root disk     21,   4 Dec 18 16:38 sg4
crw-rw----  1 root disk     21,   5 Dec 18 16:38 sg5
crw-rw----  1 root disk     21,   6 Dec 18 16:38 sg6
crw-rw----  1 root disk     21,   7 Dec 18 16:38 sg7
crw-rw----  1 root disk     21,   8 Dec 18 16:38 sg8
crw-rw----  1 root disk     21,   9 Dec 18 16:38 sg9
drwxrwxrwt  2 root root          40 Dec 18 16:38 shm/
drwxr-xr-x  2 root root          60 Dec 18 16:38 snd/
lrwxrwxrwx  1 root root          15 Dec 18 16:38 stderr -> /proc/self/fd/2
lrwxrwxrwx  1 root root          15 Dec 18 16:38 stdin -> /proc/self/fd/0
lrwxrwxrwx  1 root root          15 Dec 18 16:38 stdout -> /proc/self/fd/1
crw-rw-rw-  1 root tty       5,   0 Dec 18 16:38 tty
crw--w----  1 root tty       4,   0 Dec 18 16:38 tty0
crw--w----  1 root tty       4,   1 Dec 18 16:41 tty1
crw--w----  1 root tty       4,  10 Dec 18 16:38 tty10
crw--w----  1 root tty       4,  11 Dec 18 16:38 tty11
crw--w----  1 root tty       4,  12 Dec 18 16:38 tty12
crw--w----  1 root tty       4,  13 Dec 18 16:38 tty13
crw--w----  1 root tty       4,  14 Dec 18 16:38 tty14
crw--w----  1 root tty       4,  15 Dec 18 16:38 tty15
crw--w----  1 root tty       4,  16 Dec 18 16:38 tty16
crw--w----  1 root tty       4,  17 Dec 18 16:38 tty17
crw--w----  1 root tty       4,  18 Dec 18 16:38 tty18
crw--w----  1 root tty       4,  19 Dec 18 16:38 tty19
crw--w----  1 root tty       4,   2 Dec 18 16:41 tty2
crw--w----  1 root tty       4,  20 Dec 18 16:38 tty20
crw--w----  1 root tty       4,  21 Dec 18 16:38 tty21
crw--w----  1 root tty       4,  22 Dec 18 16:38 tty22
crw--w----  1 root tty       4,  23 Dec 18 16:38 tty23
crw--w----  1 root tty       4,  24 Dec 18 16:38 tty24
crw--w----  1 root tty       4,  25 Dec 18 16:38 tty25
crw--w----  1 root tty       4,  26 Dec 18 16:38 tty26
crw--w----  1 root tty       4,  27 Dec 18 16:38 tty27
crw--w----  1 root tty       4,  28 Dec 18 16:38 tty28
crw--w----  1 root tty       4,  29 Dec 18 16:38 tty29
crw--w----  1 root tty       4,   3 Dec 18 16:41 tty3
crw--w----  1 root tty       4,  30 Dec 18 16:38 tty30
crw--w----  1 root tty       4,  31 Dec 18 16:38 tty31
crw--w----  1 root tty       4,  32 Dec 18 16:38 tty32
crw--w----  1 root tty       4,  33 Dec 18 16:38 tty33
crw--w----  1 root tty       4,  34 Dec 18 16:38 tty34
crw--w----  1 root tty       4,  35 Dec 18 16:38 tty35
crw--w----  1 root tty       4,  36 Dec 18 16:38 tty36
crw--w----  1 root tty       4,  37 Dec 18 16:38 tty37
crw--w----  1 root tty       4,  38 Dec 18 16:38 tty38
crw--w----  1 root tty       4,  39 Dec 18 16:38 tty39
crw--w----  1 root tty       4,   4 Dec 18 16:41 tty4
crw--w----  1 root tty       4,  40 Dec 18 16:38 tty40
crw--w----  1 root tty       4,  41 Dec 18 16:38 tty41
crw--w----  1 root tty       4,  42 Dec 18 16:38 tty42
crw--w----  1 root tty       4,  43 Dec 18 16:38 tty43
crw--w----  1 root tty       4,  44 Dec 18 16:38 tty44
crw--w----  1 root tty       4,  45 Dec 18 16:38 tty45
crw--w----  1 root tty       4,  46 Dec 18 16:38 tty46
crw--w----  1 root tty       4,  47 Dec 18 16:38 tty47
crw--w----  1 root tty       4,  48 Dec 18 16:38 tty48
crw--w----  1 root tty       4,  49 Dec 18 16:38 tty49
crw--w----  1 root tty       4,   5 Dec 18 16:41 tty5
crw--w----  1 root tty       4,  50 Dec 18 16:38 tty50
crw--w----  1 root tty       4,  51 Dec 18 16:38 tty51
crw--w----  1 root tty       4,  52 Dec 18 16:38 tty52
crw--w----  1 root tty       4,  53 Dec 18 16:38 tty53
crw--w----  1 root tty       4,  54 Dec 18 16:38 tty54
crw--w----  1 root tty       4,  55 Dec 18 16:38 tty55
crw--w----  1 root tty       4,  56 Dec 18 16:38 tty56
crw--w----  1 root tty       4,  57 Dec 18 16:38 tty57
crw--w----  1 root tty       4,  58 Dec 18 16:38 tty58
crw--w----  1 root tty       4,  59 Dec 18 16:38 tty59
crw--w----  1 root tty       4,   6 Dec 18 16:41 tty6
crw--w----  1 root tty       4,  60 Dec 18 16:38 tty60
crw--w----  1 root tty       4,  61 Dec 18 16:38 tty61
crw--w----  1 root tty       4,  62 Dec 18 16:38 tty62
crw--w----  1 root tty       4,  63 Dec 18 16:38 tty63
crw--w----  1 root tty       4,   7 Dec 18 16:38 tty7
crw--w----  1 root tty       4,   8 Dec 18 16:38 tty8
crw--w----  1 root tty       4,   9 Dec 18 16:38 tty9
crw-rw----  1 root dialout   4,  64 Dec 18 16:38 ttyS0
crw-rw----  1 root dialout   4,  65 Dec 18 16:38 ttyS1
crw-rw----  1 root dialout   4,  66 Dec 18 16:38 ttyS2
crw-rw----  1 root dialout   4,  67 Dec 18 16:38 ttyS3
crw-------  1 root root     10, 223 Dec 18 16:38 uinput
crw-rw-rw-  1 root root      1,   9 Dec 18 16:38 urandom
crw-rw----  1 root tty       7,   0 Dec 18 16:38 vcs
crw-rw----  1 root tty       7,   1 Dec 18 16:38 vcs1
crw-rw----  1 root tty       7,   2 Dec 18 16:41 vcs2
crw-rw----  1 root tty       7,   3 Dec 18 16:41 vcs3
crw-rw----  1 root tty       7,   4 Dec 18 16:41 vcs4
crw-rw----  1 root tty       7,   5 Dec 18 16:41 vcs5
crw-rw----  1 root tty       7,   6 Dec 18 16:41 vcs6
crw-rw----  1 root tty       7, 128 Dec 18 16:38 vcsa
crw-rw----  1 root tty       7, 129 Dec 18 16:38 vcsa1
crw-rw----  1 root tty       7, 130 Dec 18 16:41 vcsa2
crw-rw----  1 root tty       7, 131 Dec 18 16:41 vcsa3
crw-rw----  1 root tty       7, 132 Dec 18 16:41 vcsa4
crw-rw----  1 root tty       7, 133 Dec 18 16:41 vcsa5
crw-rw----  1 root tty       7, 134 Dec 18 16:41 vcsa6
crw-rw----  1 root tty       7,  64 Dec 18 16:38 vcsu
crw-rw----  1 root tty       7,  65 Dec 18 16:38 vcsu1
crw-rw----  1 root tty       7,  66 Dec 18 16:41 vcsu2
crw-rw----  1 root tty       7,  67 Dec 18 16:41 vcsu3
crw-rw----  1 root tty       7,  68 Dec 18 16:41 vcsu4
crw-rw----  1 root tty       7,  69 Dec 18 16:41 vcsu5
crw-rw----  1 root tty       7,  70 Dec 18 16:41 vcsu6
drwxr-xr-x  2 root root          60 Dec 18 16:37 vfio/
crw-------  1 root root     10, 127 Dec 18 16:38 vga_arbiter
crw-------  1 root root     10, 137 Dec 18 16:38 vhci
crw-rw----  1 root users    10, 238 Dec 18 17:23 vhost-net
prw-r-----  1 root root           0 Dec 18 16:38 xconsole|
crw-rw-rw-  1 root root      1,   5 Dec 18 16:38 zero
crw-rw-rw-  1 root root     10, 249 Dec 18 16:41 zfs

 

  • Author

@Enfoxed  You can try power-cycling the OpenFAN Controller and/or restarting the Unraid.
For some reason your system is not registering the board. Maybe the one of the cables got disconnected?

A restart didnt work, i have to open the server tomorrow to check all cables but i dont think they are disconnected. maybe a replug will work

  • Author
16 minutes ago, Enfoxed said:

A restart didnt work, i have to open the server tomorrow to check all cables but i dont think they are disconnected. maybe a replug will work

If you can power cycle everything and double check that all the cable are plugged in correctly, that would be great. Please let me know how it goes.

  • 2 weeks later...

@SasaKaranovic this actually looks really good.

 

While i understand the unraid service is there, wouldn't it be possible to integrate the service into the docker? At least that the openfan docker has the ability to view temps and build scripts from within it, as this kinda feels like the last part to make this a truly great piece of hardware... And honestly you are only a few steps away from having something which is extremely good.

  • Author

Thanks @PeterDB!

 

I can't make any promises but I will try to add GUI to the Unraid Service app and also create a community application so it's easier to install.

Right now it's more of a "set it and forget it" kind of Unraid app, at least for my use case.

 

To be honest I am also hoping that Unraid adds an API that we could use instead of sensors.ini file and/or include CPU/GPU temperatures as well so we can use those to create fan curves as well.

 

For anyone interested in this great project, i created an updated 3d printable case. This remix allows the installation of the fancontroller in a 2.5" SATA SSD slot.
https://makerworld.com/en/models/973679

  • 2 weeks later...

Hello there. I am having an error when starting the openfanservice docker. my .yaml is a copy paste of the provided example and then changes sensors, temperatures, speeds, along with per header assignments made to the profiles. Per yamlchecker it is valid. Totally possible I am missing something super simple. Thank you for your help!

Here is the log,

Jan 18 2025 14:47:47.357 pid:7 base_logger.py            62 INFO  Logging level: DEBUG
Jan 18 2025 14:47:47.357 pid:7 start.py                 127 INFO  ---- Starting OpenFAN UnRAID Service ----
Jan 18 2025 14:47:47.357 pid:7 start.py                 128 INFO  -- API Host: `192.168.10.25:3000`
Jan 18 2025 14:47:47.357 pid:7 start.py                 129 INFO  -- Sensors: `/mnt/OpenFanService/sensors/disks.ini`
Jan 18 2025 14:47:47.357 pid:7 start.py                 130 INFO  -- Profile: `/mnt/OpenFanService/data/fan_profiles.yaml`
Jan 18 2025 14:47:47.357 pid:7 start.py                 131 INFO  -- LiveReload: `True`
Jan 18 2025 14:47:47.357 pid:7 start.py                  20 INFO  Starting OpenFAN - Unraid fan control app
Jan 18 2025 14:47:47.357 pid:7 start.py                  22 INFO  Loading temperature sensors
Jan 18 2025 14:47:47.361 pid:7 temperature_sensors.py    24 DEBUG Sensor `parity` temperature is `25°C`
Jan 18 2025 14:47:47.361 pid:7 temperature_sensors.py    24 DEBUG Sensor `disk1` temperature is `24°C`
Jan 18 2025 14:47:47.361 pid:7 temperature_sensors.py    24 DEBUG Sensor `disk2` temperature is `23°C`
Jan 18 2025 14:47:47.361 pid:7 temperature_sensors.py    24 DEBUG Sensor `disk3` temperature is `24°C`
Jan 18 2025 14:47:47.361 pid:7 temperature_sensors.py    24 DEBUG Sensor `disk4` temperature is `24°C`
Jan 18 2025 14:47:47.361 pid:7 temperature_sensors.py    24 DEBUG Sensor `disk5` temperature is `25°C`
Jan 18 2025 14:47:47.361 pid:7 temperature_sensors.py    24 DEBUG Sensor `disk6` temperature is `24°C`
Jan 18 2025 14:47:47.361 pid:7 temperature_sensors.py    24 DEBUG Sensor `disk7` temperature is `29°C`
Jan 18 2025 14:47:47.361 pid:7 temperature_sensors.py    24 DEBUG Sensor `disk8` temperature is `28°C`
Jan 18 2025 14:47:47.361 pid:7 temperature_sensors.py    24 DEBUG Sensor `disk9` temperature is `27°C`
Jan 18 2025 14:47:47.361 pid:7 temperature_sensors.py    24 DEBUG Sensor `disk10` temperature is `28°C`
Jan 18 2025 14:47:47.361 pid:7 temperature_sensors.py    24 DEBUG Sensor `disk11` temperature is `27°C`
Jan 18 2025 14:47:47.361 pid:7 temperature_sensors.py    24 DEBUG Sensor `disk12` temperature is `27°C`
Jan 18 2025 14:47:47.361 pid:7 temperature_sensors.py    24 DEBUG Sensor `disk13` temperature is `39°C`
Jan 18 2025 14:47:47.361 pid:7 temperature_sensors.py    24 DEBUG Sensor `disk14` temperature is `40°C`
Jan 18 2025 14:47:47.361 pid:7 temperature_sensors.py    24 DEBUG Sensor `disk15` temperature is `32°C`
Jan 18 2025 14:47:47.361 pid:7 temperature_sensors.py    24 DEBUG Sensor `parity2` temperature is `25°C`
Jan 18 2025 14:47:47.361 pid:7 temperature_sensors.py    24 DEBUG Sensor `cache` temperature is `33°C`
Jan 18 2025 14:47:47.361 pid:7 temperature_sensors.py    24 DEBUG Sensor `cache2` temperature is `33°C`
Jan 18 2025 14:47:47.361 pid:7 temperature_sensors.py    24 DEBUG Sensor `downloadcache` temperature is `33°C`
Jan 18 2025 14:47:47.362 pid:7 temperature_sensors.py    24 DEBUG Sensor `downloadcache2` temperature is `33°C`
Jan 18 2025 14:47:47.362 pid:7 temperature_sensors.py    24 DEBUG Sensor `vm` temperature is `33°C`
Jan 18 2025 14:47:47.362 pid:7 temperature_sensors.py    24 DEBUG Sensor `vm2` temperature is `27°C`
Jan 18 2025 14:47:47.362 pid:7 temperature_sensors.py    24 DEBUG Sensor `vm4tb` temperature is `26°C`
Jan 18 2025 14:47:47.362 pid:7 temperature_sensors.py    24 DEBUG Sensor `flash` temperature is `*°C`
Jan 18 2025 14:47:47.362 pid:7 start.py                  25 INFO  Loading fan profiles
Jan 18 2025 14:47:47.362 pid:7 fan_configuration.py      23 ERROR Error parsing json file
Jan 18 2025 14:47:47.362 pid:7 fan_configuration.py      24 ERROR Error: Expecting value: line 1 column 1 (char 0)

On 1/10/2025 at 5:26 AM, visiolab said:

For anyone interested in this great project, i created an updated 3d printable case. This remix allows the installation of the fancontroller in a 2.5" SATA SSD slot.
https://makerworld.com/en/models/973679

Thanks! I ordered a print of them and they look great. Sadly I ordered two sets be accident, so if anyone is interested I have a spare.

  • Author
9 hours ago, Gingersnap155 said:

Hello there. I am having an error when starting the openfanservice docker. my .yaml is a copy paste of the provided example and then changes sensors, temperatures, speeds, along with per header assignments made to the profiles. Per yamlchecker it is valid. Totally possible I am missing something super simple. Thank you for your help!

Hey @Gingersnap155

 

There is a docs page for UnraidService (which is a different service/app from the one this thread is for).

It is probably easier if you use .yaml for your fan profile definition since it's easier to use and less strict compared to .json

Keep in mind that the application expects you to provide two files, one is Unraid's `sensors.ini` file and the other one is your fan `profiles.yaml` where you have defined your fan curves and assigned them to each sensor/fan.

 

p.s. I am also working on a more user-friendly version of the application that will have a GUI and also allow for different drivers (ie. interact with OpenFAN via serial port, Web API, multiple devices etc) and different sensors (ie. load data from a text file, API, shell/python command etc). But obviously this will take a while so I can't promise when it will be available...

56 minutes ago, SasaKaranovic said:

Hey @Gingersnap155

 

There is a docs page for UnraidService (which is a different service/app from the one this thread is for).

It is probably easier if you use .yaml for your fan profile definition since it's easier to use and less strict compared to .json

Keep in mind that the application expects you to provide two files, one is Unraid's `sensors.ini` file and the other one is your fan `profiles.yaml` where you have defined your fan curves and assigned them to each sensor/fan.

 

p.s. I am also working on a more user-friendly version of the application that will have a GUI and also allow for different drivers (ie. interact with OpenFAN via serial port, Web API, multiple devices etc) and different sensors (ie. load data from a text file, API, shell/python command etc). But obviously this will take a while so I can't promise when it will be available...

Yes I read through the documentation. That is why I am here. I created the YAML as instructed, placed it where instructed. So where do I ask for support for this issue then? It’s a separate docker that you provide and is required for the automatic fan control. The documentations talks about a disks.ini but no where to obtain it? It’s in the location mapped in the suggested docker compose command. It appears the log shows disk temperatures so I would assume that means that part is covered and working.  
 

I never mentioned that I am using a json the log file is stating it. The docker run command I used came from that page and it’s set to use the YAML.

 

I am not sure what I’m missing in my errors. 

Or where to get help with something you’ve provided documentation to. I’m fine without a community app and just using the background service and YAML. Just need it to work since following what’s provided did not work for me. 

13 minutes ago, Gingersnap155 said:

Yes I read through the documentation. That is why I am here. I created the YAML as instructed, placed it where instructed. So where do I ask for support for this issue then? It’s a separate docker that you provide and is required for the automatic fan control. The documentations talks about a disks.ini but no where to obtain it? It’s in the location mapped in the suggested docker compose command. It appears the log shows disk temperatures so I would assume that means that part is covered and working.  
 

I never mentioned that I am using a json the log file is stating it. The docker run command I used came from that page and it’s set to use the YAML.

 

I am not sure what I’m missing in my errors. 

Or where to get help with something you’ve provided documentation to. I’m fine without a community app and just using the background service and YAML. Just need it to work since following what’s provided did not work for me. 

Ok so I switch to using a JSON and adjusted the docker run command accordingly. Now it works fine.  It’s possible I messed up something with my docker run command with a typo and that was the problem. Either way it works perfectly fine now. And I can even edit it in notepad++ and save and it will adjust on the fly. 

Is there anyone working on getting open fan to automate fab speeds based on drive temps?

2 hours ago, crowdx42 said:

Is there anyone working on getting open fan to automate fab speeds based on drive temps?

I am! :)

 

Currently there is a docker app called "OpenFAN Unraid Service" which is documented here and source code is on GitHub.

Feel free to contribute.

This is a relatively "hacked up" solution but it works exactly what you asked for (I use it every day and know multiple people who said it does the job for them).

But I am also working on a more functional version that will support plugins, drivers and eventually have a nice GUI. Obviously this will take some time...

 

p.s. Keep in mind that this is not a stand-alone app. You will also need to run the original OpenFAN Unraid App (link here).

35 minutes ago, ColdKeyboard said:

I am! :)

 

Currently there is a docker app called "OpenFAN Unraid Service" which is documented here and source code is on GitHub.

Feel free to contribute.

This is a relatively "hacked up" solution but it works exactly what you asked for (I use it every day and know multiple people who said it does the job for them).

But I am also working on a more functional version that will support plugins, drivers and eventually have a nice GUI. Obviously this will take some time...

 

p.s. Keep in mind that this is not a stand-alone app. You will also need to run the original OpenFAN Unraid App (link here).

Very cool, I have Open Fan Controller working with the docker, I think I will wait until there is an update with a less hack version lol

6 hours ago, crowdx42 said:

Very cool, I have Open Fan Controller working with the docker, I think I will wait until there is an update with a less hack version lol

I'm waiting for mine, but honestly this "hacky version" is still better than trying to get Dynamix Auto Fan to work with various chipsets and fans, and on top of it Dynamix Auto Fan will only control one PWM fan, so you need a splitter. I gave up on getting my chipset working with Dynamix Auto Fan and after reading a lot settled on either OpenFan or Aqua Computer OCTO Fan. After 4 days of battling with Dynamix Auto Fan and Aqua Computer OCTO Fan or running scripts, I gave up.

 

I'm sticking with OpenFan (and I don't even have it yet, but I know and can see that it will work better!)

7 hours ago, ColdKeyboard said:

I am! :)

 

Currently there is a docker app called "OpenFAN Unraid Service" which is documented here and source code is on GitHub.

Feel free to contribute.

This is a relatively "hacked up" solution but it works exactly what you asked for (I use it every day and know multiple people who said it does the job for them).

But I am also working on a more functional version that will support plugins, drivers and eventually have a nice GUI. Obviously this will take some time...

 

p.s. Keep in mind that this is not a stand-alone app. You will also need to run the original OpenFAN Unraid App (link here).

 

If you need any help testing your "more functional version" sign me up

  • 2 weeks later...
  • 2 months later...

I have two of these bad boys (OpenFan Controller). Absolutely loving it in my Windows machine, the plugin for 'FanControl' works a treat! It provides quite alot of flexibility.

Just wondering if there is any more functionality coming to the docker container on unraid? I'd love to be able to set a fan curve (based off of a sensor reading); I've just gone from full fan curves via IPMI to being able to set static fan profiles via the docker container :'( I'm a little underwhelmed to be honest. 

 

Any movement on the approval of the 'automated' install of the OpenFanService for unraid? 

 

I do very much appreciate the hard work! absolutely banger of a product you've created.

On 12/25/2024 at 3:27 AM, SasaKaranovic said:

If you can power cycle everything and double check that all the cable are plugged in correctly, that would be great. Please let me know how it goes.

 

Hi, this helped for a short time. I have to shutdown the complete server and disconnect the fancontroller a few minutes and plug it back in and boot up the server again. Then it works for a period of time. Since this post i had to do several of these restarts because of the fan controller. The usb port works fine for other devices and also changing the port doesnt help. I also dont knwo why the connection from Hardware to docker has to be there. everytime the docker is not reachable because of this connection issue, the fans will run in 100%mode. I have another fan controller from aquacomputer in another rig and there it works without any usb connection after a first setup.

 

The Docker Log when it happens: Apr 10 2025 08:57:29.623 pid:7 base_logger.py            59 INFO  Logging level: INFO
Apr 10 2025 08:57:29.633 pid:7 config.py                 49 DEBUG Server config:
Apr 10 2025 08:57:29.633 pid:7 config.py                 58 DEBUG {'hostname': 'localhost', 'port': 3000, 'communication_timeout': 1}
Apr 10 2025 08:57:29.633 pid:7 config.py                 60 DEBUG Hardware config:
Apr 10 2025 08:57:29.633 pid:7 config.py                 69 DEBUG {'port': None}
Apr 10 2025 08:57:29.633 pid:7 config.py                 71 DEBUG Fan profile config:
Apr 10 2025 08:57:29.633 pid:7 config.py                 80 DEBUG {'1000 RPM': {'type': 'rpm', 'values': [1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000], 'name': '1000 RPM'}, 'MadMax': {'type': 'PWM', 'values': [100, 100, 100, 100, 100, 100, 100, 100, 100, 100], 'name': 'MadMax'}, '1200RPM': {'type': 'RPM', 'values': [1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200], 'name': '1200RPM'}}
Apr 10 2025 08:57:29.633 pid:7 config.py                 83 DEBUG Fan aliases:
Apr 10 2025 08:57:29.633 pid:7 config.py                 92 DEBUG {0: 'Fan #1', 1: 'Fan #2', 2: 'Fan #3', 3: 'Fan #4', 4: 'Fan #5', 5: 'Fan #6', 6: 'Fan #7', 7: 'Fan #8', 8: 'Fan #9', 9: 'Fan #10'}
Apr 10 2025 08:57:29.633 pid:7 webserver.py             295 INFO  Using COM port `/dev/ttyACM0` (specified in `OPENFANCOMPORT` env variable).
Apr 10 2025 08:57:29.633 pid:7 webserver.py             304 INFO  Fan Controller port: /dev/ttyACM0
Apr 10 2025 08:57:29.634 pid:7 serial_driver.py          87 DEBUG Searching for COM port `/dev/ttyACM0`
Apr 10 2025 08:57:29.634 pid:7 webserver.py             373 ERROR OpenFan API service crashed during setup.
Traceback (most recent call last):
  File "/mnt/OpenFan/webserver.py", line 371, in main
    FAN_API_Service().run_forever()
  File "/mnt/OpenFan/webserver.py", line 305, in __init__
    self.fan_commander = FanCommander(self.serialPort)
  File "/mnt/OpenFan/FanCommander.py", line 10, in __init__
    super(FanCommander, self).__init__(port_info, timeout=2)
  File "/mnt/OpenFan/serial_driver.py", line 28, in __init__
    raise TypeError("The port_info must be of type {} (given: {})".format(self.__class__, _lpc.ListPortInfo))
TypeError: The port_info must be of type <class 'FanCommander.FanCommander'> (given: <class 'serial.tools.list_ports_common.ListPortInfo'>)

 

 

ls -l dev.txt

  • 2 weeks later...
  • Author

Hey @Enfoxed!
Sorry about the delay. In the future, if you need support, please email shop [at] sasakaranovic [dot] com directly.

 

There can be a lot of reasons why the app is intermittently not working as expected and it's very hard to debug it remotely. I suggest opening a support ticket by emailing the above mentioned address.
Also make sure you are running the latest version of the docker application and that you have a good quality (and as short-as-possible) USB cable.

 

The Docker application is just one of the ways you can use this controller (with Unraid).
The official documentation should help you jump off if you want to build your own solution.

 

Quote

everytime the docker is not reachable because of this connection issue, the fans will run in 100%mode

I am not sure what is going on in your setup but this should _not_ be the possible, by design... If your docker application stops/is-not running, the fans will remain in the last state they were until told otherwise. They will not spin up to 100% on their own. Is it possible that you have some other application that is "fighting" to control this COM port?

 

I have to admit that even though I try my best, this is probably still a very "hacky" open-source open-hardware DIY project. But I still think people should be happy with their purchase, especially if they are supporting my project!
With that said, if you are not happy with the controller (for whatever reason) or you have a better solution that you would like to use, please email me and we can arrange to have you ship the unit back and I will issue a refund for your order, no questions asked.

  • Author
On 4/5/2025 at 7:57 AM, chomeop said:

I have two of these bad boys (OpenFan Controller). Absolutely loving it in my Windows machine, the plugin for 'FanControl' works a treat! It provides quite alot of flexibility.

Just wondering if there is any more functionality coming to the docker container on unraid? I'd love to be able to set a fan curve (based off of a sensor reading); I've just gone from full fan curves via IPMI to being able to set static fan profiles via the docker container :'( I'm a little underwhelmed to be honest. 

 

Any movement on the approval of the 'automated' install of the OpenFanService for unraid? 

 

I do very much appreciate the hard work! absolutely banger of a product you've created.

 

Thank you @chomeop!
I am still working on the improved version of the docker app. But you are right, I should submit the control app to the app store and make installation and update a bit easier.
Until then, there is documentation explaining on how to get it up and running manually and how to define curves. Personally I did this once and forgot about it, so while it's not an "easy" way to do it, I doubt people will have to adjust their fan curves often.

 

p.s. Keep in mind that there are two docker applications, one is OpenFan Controller and the second one is Unraid service. The first talks to the controller and provides an API/GUI and the latter allows you to define fan curves based on the HDD temperatures.

 

Once you give it a try, let me know if you have any suggestions!

Hi there,

 

I installed the main container which works well, and followed the doc for the service container with a custom yaml (that I checked with the yaml tool), but it keeps telling me Error parsing json file.

Apr 22 2025 08:51:41.777 pid:7 start.py                  25 INFO  Loading fan profiles
Apr 22 2025 08:51:41.777 pid:7 fan_configuration.py      23 ERROR Error parsing json file
Apr 22 2025 08:51:41.777 pid:7 fan_configuration.py      24 ERROR Error: Expecting value: line 1 column 1 (char 0)

 

How can I fix that?
It sounds to me that the container is expecting a json file even though I'm using a yaml file?

Was the container installation command in the doc tested with yaml?

 

I converted to json and modified the install command accordingly, and indeed it works now, there seems to be an issue with how yaml is handled.

 

Edit: I believe the container downloaded from ghcr.io/sasakaranovic/openfanunraidservice:release isn't up to date at all, the newer fan_configuration.py file doesn't contain the "Error parsing json file" error, it uses "Error parsing profile file" instead. It seems like the version installed predates the yaml addition...

Edited by JayBee_Unraid
Added details

There is another little issue in the guide, for the fan_profiles.yaml the fan identifiers are supposed to be starting with 0 not 1.

So fan 1 is "OpenFAN/Fan/0", fan 2 is "OpenFAN/Fan/1" and so on.

 

Would it be possible to have multiple temp sources per profile, and control the temp curve with the highest temp one?

I have 2 fans that cool down 8 drives (4 for each fan) in my NAS, so having them controlled by only one HDD will cause issue whenever that specific disk isn't spinning, which forces me to use fixed speed.

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

Account

Navigation

Search

Search

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.