Octoprint et Domoticz

4 octobre 2019

Un petit script lua pour récupérer les infos d’Octoprint dans Domoticz.

Il vous faut 7 Dummy devices :

  • OctoStatusIDX=’387′ — type: Text pour afficher le status de l’imprimante
  • OctoBebIDX=’388′ — type: Temperature pour afficher la température du plateau
  • OctoHeadIDX=’389′ — type: Temperature pour afficher la température de la tête d’impression
  • OctoTotalTimeIDX=’390′ — type: Text pour le temps total d’impression
  • OctoCompleteIDX=’391′ — type: Percentage pour le pourcentage d’avancement
  • OctoPrintTimeIDX=’392′ — type: Text pour la durée d’impression passé
  • OctoTimeLeftIDX=’393′ — type: Text pour le temps restant.

Dans les paramètres du script, il faut modifier les IDX de ces devices lignes 14 à 20.

Renseigner l’IP d’Octoprint ligne 5, la clé API d’Octoprint ligne 7.

Et enfin, si différent, l’emplacement du script JSON.lua et de curl, lignes 9 et 11.

Le script est disponible ici : https://github.com/chatainsim/scripts_domoticz/blob/master/octoprint.lua

-- Use Lua -> Time
-- For displaying debug messages
debug=false
-- IP address of octoprint (if you use a different port then 80 put IP:PORT
OctoIP='OctoprintIPAddress'
-- Octoprint API Key (found in Settings -> API)
OctoAPI='OctoprintAPIKey'
-- JSON.lua path
json = (loadfile "/home/pi/domoticz/scripts/lua/JSON.lua")()
-- Curl path
curl = '/usr/bin/curl'

-- IDX of your Dummy devices
OctoStatusIDX='387' -- type: Text
OctoBebIDX='388' -- type: Temperature
OctoHeadIDX='389' -- type: Temperature
OctoTotalTimeIDX='390' -- type: Text
OctoCompleteIDX='391' -- type: Percentage
OctoPrintTimeIDX='392' -- type: Text
OctoTimeLeftIDX='393' -- type: Text

OctoPrinter='http://'..OctoIP..'/api/printer'
OctoJob='http://'..OctoIP..'/api/job'

local function update(idx, value1)
    local cmd = idx..'|0|'..value1
    table.insert (commandArray, { ['UpdateDevice'] = cmd } )
end
local function online()
    DataOctoTemp = assert(io.popen(curl..' -s --max-time 8 -H "X-Api-Key: '..OctoAPI..'" "'..OctoPrinter..'"'))
    BlocOctoTemp = DataOctoTemp:read('*all')
    DataOctoTemp:close()
    JsonOctoTemp = json:decode(BlocOctoTemp)
end
local function round(num, n)
  local mult = 10^(n or 0)
  return math.floor(num * mult + 0.5) / mult
end
function SecondsToClock(seconds)
  local seconds = tonumber(seconds)

  if seconds <= 0 then
    return "00:00:00";
  else
    hours = string.format("%02.f", math.floor(seconds/3600));
    mins = string.format("%02.f", math.floor(seconds/60 - (hours*60)));
    secs = string.format("%02.f", math.floor(seconds - hours*3600 - mins *60));
    return hours..":"..mins..":"..secs
  end
end
commandArray = {}
    local status, retval = pcall(online,10);
    if (status) then
      DataOctoTemp = assert(io.popen(curl..' -s --max-time 8 -H "X-Api-Key: '..OctoAPI..'" "'..OctoPrinter..'"'))
      BlocOctoTemp = DataOctoTemp:read('*all')
      DataOctoTemp:close()
      JsonOctoTemp = json:decode(BlocOctoTemp)
      OctoBeb = JsonOctoTemp.temperature.bed.actual
      OctoHead = JsonOctoTemp.temperature.tool0.actual
      OctoStatus = JsonOctoTemp.state.text
      OctoState = JsonOctoTemp.state.flags.printing
      update(OctoBebIDX, OctoBeb)
      update(OctoHeadIDX, OctoHead)
      update(OctoStatusIDX, OctoStatus)
      
      if (OctoState) then
          DataOctoTime = assert(io.popen(curl..' -s --max-time 8 -H "X-Api-Key: '..OctoAPI..'" "'..OctoJob..'"'))
          BlocOctoTime = DataOctoTime:read('*all')
          DataOctoTime:close()
          JsonOctoTime = json:decode(BlocOctoTime)
          OctoTotalTime = JsonOctoTime.job.estimatedPrintTime
          OctoComplete = JsonOctoTime.progress.completion
          OctoPrintTime = JsonOctoTime.progress.printTime
          OctoTimeLeft = JsonOctoTime.progress.printTimeLeft
          update(OctoTotalTimeIDX, SecondsToClock(OctoTotalTime))
          update(OctoCompleteIDX, round(OctoComplete))
          update(OctoPrintTimeIDX, SecondsToClock(OctoPrintTime))
          update(OctoTimeLeftIDX, SecondsToClock(OctoTimeLeft))
      end
    else
      if (debug) then print("Printer not connected") end
      update(OctoStatusIDX, "Printer not connected")
      update(OctoBebIDX, 0)
      update(OctoHeadIDX, 0)
      update(OctoTotalTimeIDX, SecondsToClock(0))
      update(OctoCompleteIDX, 0)
      update(OctoPrintTimeIDX, SecondsToClock(0))
      update(OctoTimeLeftIDX, SecondsToClock(0))
    end
return commandArray
Température du plateau et de la tête.
Status de l’imprimante et des temps d’impression ainsi que le pourcentage d’avancement.

Pas de commentaire

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.