Nuc System Monitoring Card

Thanks for this excellent guide! I need to finetune some things (not all values are correct), but this is my view for now:

2 Likes

Well, that’s a start. It’s difficult to understand which documentation is outdated. I actually thought HACS was the community addons that show up naturally…and of course Custom Cards is not there. I’ll work on getting the HACS installed.

Everything in this card is custom, so the documents do not cover it. You have to search the forums or google. Here’s a link to HACS.

So, if I just want to monitor data about my NUC, I can just use the sensor code in my configuration.yaml file, correct? From liamstears post 3days ago.

Most of that will work. The command_line sensor platform may not but most likely does.

Maybe you can get some ideas from this topic too: Rapsberry Pi MQTT monitor

I use it to get data from remote servers.

What the heck am I doing wrong.
I have all the cards needed installed through HACS. Also listed in the ui-lovelace file.
But as one of the posters stated I get…


What is going on?
Thanks

If you’re using chrome, hit f12 on your keyboard. In the lower right corner should be a console and it will have JS errors, take a screenshot and post it here. You might also be able to see these errors in the home-assistant.log file as well, I cant remember though because I hid all JS errors.

Do you also have card-mod installed? I missed it and it was causing me all sorts of problems like this. Double check you have all the cards installed.

If you don’t have card-mod then go into HACS, search for card-mod in “Frontend” - it won’t find it, so click on the “Explore & add repositories” big blue button at the bottom right of the screen to add the Thomas Loven Github repo, and then you can add card-mod.

Thank you for the help.
All cards installed.
Cleared cache, restarted, but a full reboot took care of the problem.

1 Like

Can you tell me how to get the CPU percentage info from the Ubuntu VM, I’m not able to find that.

Can you post your code for the proxmox? Im trying here but with no success.

Another question is, how did you get the disk, ram, cpu and temperature from proxmox?

Forgive my ignorance, but how do you add multiple instances of these monitors onto one screen?

I use this setup to send my Proxmox stats via MQTT to HA, I just changed to from RPi to Proxmox, which is almost the same:

This is my script in Proxmox:

# Python 2 script to check cpu load, cpu temperature and free space,
# on a Raspberry Pi computer and publish the data to a MQTT server.
# RUN pip install paho-mqtt
# RUN sudo apt-get install python-pip

from __future__ import division
import subprocess, time, socket, os
import paho.mqtt.client as paho
import json
import config

# get device host name - used in mqtt topic
hostname = socket.gethostname()


def check_used_space(path):
                st = os.statvfs(path)
                free_space2 = st.f_bavail * st.f_frsize
                total_space2 = st.f_blocks * st.f_frsize
                used_space = int(100 - ((free_space2 / total_space2) * 100))
                return used_space

def check_free_space(path):
                st = os.statvfs(path)
                free_space = st.f_bavail * st.f_frsize
                #total_space = st.f_blocks * st.f_frsize
                #used_space = int(100 - ((free_space / total_space) * 100))
                gb = 1024 * 1024 * 1024
                return round(float(free_space / gb), 1)

def check_total_space(path):
                st = os.statvfs(path)
                #free_space = st.f_bavail * st.f_frsize
                total_space = st.f_blocks * st.f_frsize
                #used_space = int(100 - ((free_space / total_space) * 100))
                gb = 1024 * 1024 * 1024
                return round(float(total_space / gb), 1)

def check_cpu_load():
                # bash command to get cpu load from uptime command
                p = subprocess.Popen("uptime", shell=True, stdout=subprocess.PIPE).communicate()[0]
                cores = subprocess.Popen("nproc", shell=True, stdout=subprocess.PIPE).communicate()[0]
                cpu_load = p.split("average:")[1].split(",")[0].replace(' ', '')
                cpu_load = float(cpu_load)/int(cores)*100
                cpu_load = round(float(cpu_load), 1)
                return cpu_load

def check_uptime():
                p = subprocess.Popen("uptime -p", shell=True, stdout=subprocess.PIPE).communicate()[0]
                #uptime = p.split("up ")
                uptime = p.replace('up ', '').replace(',', '').replace('\n', '')
                return uptime

def check_voltage():
                full_cmd = "vcgencmd measure_volts | cut -f2 -d= | sed 's/000//'"
                voltage = subprocess.Popen(full_cmd, shell=True, stdout=subprocess.PIPE).communicate()[0]
                voltage = voltage.strip()[:-1]
                return voltage

def check_swap():
                full_cmd = "free -t | awk 'NR == 3 {print $3/$2*100}'"
                swap = subprocess.Popen(full_cmd, shell=True, stdout=subprocess.PIPE).communicate()[0]
                swap = round(float(swap), 1)
                return swap

def check_memory():
                full_cmd = "free -t | awk 'NR == 2 {print $3/$2*100}'"
                memory = subprocess.Popen(full_cmd, shell=True, stdout=subprocess.PIPE).communicate()[0]
                memory = round(float(memory), 1)
                return memory

def check_cpu_temp():
                #full_cmd = "cat /sys/class/thermal/thermal_zone3/temp"
                cpu_temp = subprocess.check_output("cat /sys/class/thermal/thermal_zone5/temp", shell=True)
                #cpu_temp = subprocess.Popen(full_cmd, shell=True, stdout=subprocess.PIPE).communicate()[0]
                #cpu_temp = p.replace('\n', ' ').replace('\r', '').split("=")[1].split("'")[0]
                cpu_temp = [int(i) for i in cpu_temp.split() if i.isdigit()][0]
                return cpu_temp/1000


def check_sys_clock_speed():
                full_cmd = "awk '{printf (\"%0.0f\",$1/1000); }' </sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq"
                return subprocess.Popen(full_cmd, shell=True, stdout=subprocess.PIPE).communicate()[0]


def publish_to_mqtt (cpu_load = 0, cpu_temp = 0, used_space = 0, free_space = 0, uptime = 0, total_space = 0, memory = 0):
                # connect to mqtt server
                client = paho.Client()
                client.username_pw_set(config.mqtt_user, config.mqtt_password)
                client.connect(config.mqtt_host, config.mqtt_port)

                # publish monitored values to MQTT
                if config.cpu_load:
                        client.publish(config.mqtt_topic_prefix+"/"+hostname+"/cpuload", cpu_load, qos=1)
                        time.sleep(config.sleep_time)
                if config.cpu_temp:
                        client.publish(config.mqtt_topic_prefix+"/"+hostname+"/cputemp", cpu_temp, qos=1)
                        time.sleep(config.sleep_time)
                if config.used_space:
                        client.publish(config.mqtt_topic_prefix+"/"+hostname+"/diskusage", used_space, qos=1)
                        time.sleep(config.sleep_time)
                if config.free_space:
                        client.publish(config.mqtt_topic_prefix+"/"+hostname+"/freespace", free_space, qos=1)
                        time.sleep(config.sleep_time)
                if config.total_space:
                        client.publish(config.mqtt_topic_prefix+"/"+hostname+"/totalspace", total_space, qos=1)
                        time.sleep(config.sleep_time)
                if config.memory:
                        client.publish(config.mqtt_topic_prefix+"/"+hostname+"/memory", memory, qos=1)
                        time.sleep(config.sleep_time)
                if config.uptime:
                        client.publish(config.mqtt_topic_prefix+"/"+hostname+"/uptime", uptime, qos=1)
                        time.sleep(config.sleep_time)
                # disconect from mqtt server
                client.disconnect()

def bulk_publish_to_mqtt (cpu_load = 0, cpu_temp = 0, used_space = 0, free_space = 0, uptime = 0, total_space = 0, memory = 0):
                # compose the CSV message containing the measured values

                values = cpu_load, float(cpu_temp), used_space, free_space, uptime, total_space, memory
                values = str(values)[1:-1]

                # connect to mqtt server
                client = paho.Client()
                client.username_pw_set(config.mqtt_user, config.mqtt_password)
                client.connect(config.mqtt_host, config.mqtt_port)

                # publish monitored values to MQTT
                client.publish(config.mqtt_topic_prefix+"/"+hostname, values, qos=1)

                # disconect from mqtt server
                client.disconnect()



if __name__ == '__main__':
                # set all monitored values to False in case they are turned off in the config
                cpu_load = cpu_temp = used_space = free_space = uptime = total_space = memory = False

                # delay the execution of the script
                time.sleep(config.random_delay)

                # collect the monitored values
                if config.cpu_load:
                        cpu_load = check_cpu_load()
                if config.cpu_temp:
                        cpu_temp = check_cpu_temp()
                if config.used_space:
                        used_space = check_used_space('/')
                if config.free_space:
                        free_space = check_free_space('/')
                if config.uptime:
                        uptime = check_uptime()
                if config.total_space:
                        total_space = check_total_space('/')
                if config.memory:
                        memory = check_memory()

                # Publish messages to MQTT
                if config.group_messages:
                        bulk_publish_to_mqtt(cpu_load, cpu_temp, used_space, free_space, uptime, total_space, memory)
                else:
                        publish_to_mqtt(cpu_load, cpu_temp, used_space, free_space, uptime, total_space, memory)



1 Like

I just added more cards to a view. Every card is another template custom card.

I’d like to do get the same data from Proxmox into Home Assistant.
Is this a script you run inside Home Assistant, or in a seperate vm?
Can you please provide more info on this?

def check_cpu_load():
                # bash command to get cpu load from uptime command
                p = subprocess.Popen("uptime", shell=True, stdout=subprocess.PIPE).communicate()[0]
                cores = subprocess.Popen("nproc", shell=True, stdout=subprocess.PIPE).communicate()[0]
                cpu_load = p.split("average:")[1].split(",")[0].replace(' ', '')
                cpu_load = float(cpu_load)/int(cores)*100
                cpu_load = round(float(cpu_load), 1)
                return cpu_load

You need to run the script in Proxmox, so ssh into it. Then follow the guide just like the one for the RPi.
You can run that script on every debian based machine to get its stats.

There is an integration for Proxmox