Отображаем температуру процессора Raspberry в домотикз

Температура CPU


добавляем устройство с типом "Motherboard Sensors", через пару минут появятся несколько датчиков, среди которых есть "Internal Temperature".

Если не хочется использовать этот метод, то можно температуру получить командой (это одна строка!)

cpuTemp0=$(cat /sys/class/thermal/thermal_zone0/temp); cpuTemp1=$(($cpuTemp0/1000)); cpuTemp2=$(($cpuTemp0/100)); cpuTempM=$(($cpuTemp2 % $cpuTemp1)); echo "temp="$cpuTemp1"."$cpuTempM"'C"



pi@raspberrypi:~ $ cpuTemp0=$(cat /sys/class/thermal/thermal_zone0/temp); cpuTemp1=$(($cpuTemp0/1000)); cpuTemp2=$(($cpuTemp0/100)); cpuTempM=$(($cpuTemp2 % $cpuTemp1)); echo "temp="$cpuTemp1"."$cpuTempM"'C"
temp=54.7'C


и в dzVents обработать полученную строку и вывести её на датчик по аналогии с температурой GPU.

Температура GPU:


Кратко: получается температура одной комадной:

/opt/vc/bin/vcgencmd measure_temp


pi@raspberrypi:~ $ /opt/vc/bin/vcgencmd measure_temp
temp=56.9'C


Добавим эту цифру в домотикз за два шага:
1. Создаем dummy датчик с типом "Temperature" и названием "GPU Temperature" (если нужно другое имя, не забываем поменять его в скрипте)
2. Создаем dzVents скрипт "Raspberry Processor Temperature" :
-- Raspberry CPU/GPU Temperature

return {
 on = {
  timer = {'every minute'},
  devices = {'GPU Temperature'}  -- << dummy device name },
 logging = {
  level = domoticz.LOG_ERROR,
  marker = "RaspberryPiTemp"
 },
 execute = function(dz, item)

 local TempDevice    = dz.devices('GPU Temperature')   -- << dummy switch - type:Temperature
 
function GetStatus()
 cmd = "/opt/vc/bin/vcgencmd measure_temp"
end

function parseDec(str)
    local retValue = 0.0
    if (str ~= nil and str ~= '') then
  _, _, num1, num2 = string.find(str, "(%d+)[^%d]+(%d+)")
  --print('num1='..num1)
  --print('num2='..num2)
  retValue = tonumber(num1.."."..num2)
 end
 return retValue
end
  
  if (item.isTimer) then
   GetStatus()

   local h        = io.popen(cmd)
   local response = h:read("*a")
   h:close()
   --print('response='..response)
   
   if (response == nil or response == '') then
    response = ''
   else    
    t = {}
    for k, v in string.gmatch(response, "(%w+)=(.-)'C\n") do
     t[k] = v
     --print('# '..k..'='..v)
    end

    strTemp = t['temp']  -- температура
    --print('strTemp='..strTemp)
    
    if (strTemp ~= nil and strTemp ~= '') then
     Temp    = parseDec(strTemp)
     oldTemp = TempDevice.temperature
     strOldTemp = string.format("%.1f", oldTemp)
        
     if (Temp ~= 0 and strTemp ~= strOldTemp) then
      print('PI Processor Temperature='..strTemp..'; old value = '..strOldTemp)
      TempDevice.updateTemperature(Temp)
     end
    end
   end
  end
 end
}

Комментарии

Популярные сообщения