Aller au contenu

Filament ABS

nothing_fr

Python, Octoprint et Matrices de LED sont dans un bateau...

Recommended Posts

Coucou tout le monde...

Juste un petit topic pour partager un truc avec lequel j'ai fait un peu mumuse aujourd'hui sur mon Raspberry.

J'ai commandé des matrices de led Max7219 et j'ai fait un pti script python rapidos pour interroger octoprint et afficher les infos dessus.

Si ça vous intéresse, il faut juste un prérequis pour interroger l'url octo :

pip install requests

et voilà mon script :

#! /usr/bin/env python

import json
import requests
import time
import math
from random import randrange
# Import library
import multilineMAX7219 as LEDMatrix
# Import fonts
from multilineMAX7219_fonts import CP437_FONT, SINCLAIRS_FONT, LCD_FONT, TINY_FONT
# The following imported variables make it easier to feed parameters to the library functions
from multilineMAX7219 import DIR_L, DIR_R, DIR_U, DIR_D
from multilineMAX7219 import DIR_LU, DIR_RU, DIR_LD, DIR_RD
from multilineMAX7219 import DISSOLVE, GFX_ON, GFX_OFF, GFX_INVERT
# Initialise the library and the MAX7219/8x8LED arrays
LEDMatrix.init()

#### A MODIFIER ####
octo_api_url = 'http://monurlocto/api'
api_key = 'maclefapi'
####################

job_url = "{}/job?apikey={}".format(octo_api_url, api_key)
reponse = requests.get(job_url, verify=False)
data = reponse.json()

print "-------------"
print data
print "-------------"

state = data['state']
completion = data['progress']['completion']
time_left = data['progress']['printTimeLeft']
print_time = data['progress']['printTime']
printed_object = data['job']['file']['name']
msg_state = "@:{}".format(state)

if msg_state == "@:Printing":
	if type(completion) == int or type(completion) == float:
		msg_completion = "%:{}".format(round(completion, 2))
	else:
		msg_completion = "%:{}".format(completion)

	if type(print_time) == int or type(print_time) == float:
		msg_printtime = "PT~:{}".format(print_time/60)
	else:
		msg_printtime = "PT~:{}".format(print_time)

	if type(time_left) == int or type(time_left) == float:
		msg_timeleft = "~ETA:{}".format(time_left/60)
	else:
		msg_timeleft = "~ETA~:{}".format(time_left)

	msg_matrix = " " + msg_state + " (" + printed_object +  ") - " + msg_completion + " - " + msg_printtime + " - " + msg_timeleft
	LEDMatrix.brightness(0)
	LEDMatrix.scroll_message_horiz([msg_matrix], 4.5//3, 4.5, DIR_L)
else:
	exit(0)

Il faut d'abord récupérer le projet multilineMAX7219 ici -> https://github.com/tutRPi/multilineMAX7219

en faisant un pti :

git clone https://github.com/tutRPi/multilineMAX7219.git

 -- ATTENTION A BIEN LIRE LA DOC DU FICHIER multilineMAX7219.py -- Il y a des choses a changer en fonction de votre setup de matrices LED --

puis copier mon script dans le dossier, et l'éditer pour modifier l'url et la clé API avec les lignes :

octo_api_url = 'http://monurlocto/api'

api_key = 'maclefapi'

puis pour le tester le script :

python octoprint.py

ATTENTION, par défaut, mon script n'affiche quelque chose que si un print est en cours...

Une fois que vous êtes sur qu'il fonctionne, vous pouvez le mettre en crontab toutes les 5min dans le style :

*/5 * * * * /home/pi/multilineMAX7219/octoprint.py

Normalement ça doit donner un truc du genre :

 

  • J'aime 6

Partager ce message


Lien à poster
Partager sur d’autres sites

Faut que je me fasse un pti boitier pour tout ça un peu sympa et ça sera encore mieux ;)

Je dois aussi voir pour afficher des pictos a la place du texte, genre un sablier, une montre etc... (mais j'ai pas encore pris le temps pour ça)

Modifié (le) par nothing_fr

Partager ce message


Lien à poster
Partager sur d’autres sites

Excellent, merci Nothing. Je me demandais comment interroger Octoprint. C'est juste pile poil ce que je cherchais!

Partager ce message


Lien à poster
Partager sur d’autres sites

non, pas du tout, mais je ne l'ai pas encore :)

Dès que je le reçois je m'y colle... la c'était plus en attendant pour m'amuser...

En plus, ça a l'avantage d'être visible de loin.

Modifié (le) par nothing_fr

Partager ce message


Lien à poster
Partager sur d’autres sites

Ptite update, pas grand chose de changé, juste le texte + effacement de la matrice en cas d'interrupt au clavier...

#! /usr/bin/env python

import json
import requests
import time
import math
from random import randrange

# Import library
import multilineMAX7219 as LEDMatrix
# Import fonts
from multilineMAX7219_fonts import CP437_FONT, SINCLAIRS_FONT, LCD_FONT, TINY_FONT

# The following imported variables make it easier to feed parameters to the library functions
from multilineMAX7219 import DIR_L, DIR_R, DIR_U, DIR_D
from multilineMAX7219 import DIR_LU, DIR_RU, DIR_LD, DIR_RD
from multilineMAX7219 import DISSOLVE, GFX_ON, GFX_OFF, GFX_INVERT

# Initialise the library and the MAX7219/8x8LED arrays
LEDMatrix.init()

#### A MODIFIER ####
octo_api_url = 'http://monurlocto/api'
api_key = 'maclefapi'
####################

job_url = "{}/job?apikey={}".format(octo_api_url, api_key)

reponse = requests.get(job_url, verify=False)
data = reponse.json()

print "-------------"
print data
print "-------------"

state = data['state']
completion = data['progress']['completion']
time_left = data['progress']['printTimeLeft']
print_time = data['progress']['printTime']
printed_object = data['job']['file']['name']

msg_state = "{}".format(state)

try:
	if msg_state == "Printing":
		if type(completion) == int or type(completion) == float:
        		msg_completion = "Completed:{}%".format(round(completion, 2))
		else:
	        	msg_completion = "Completed:{}%".format(completion)

		if type(print_time) == int or type(print_time) == float:
			msg_printtime = "Elapsed Time:{}min".format(print_time/60)
		else:
			msg_printtime = "Elapsed Time:{}".format(print_time)

		if type(time_left) == int or type(time_left) == float:
        		 msg_timeleft = "~ETA:{}min".format(time_left/60)
		else:
        		 msg_timeleft = "~ETA~:{}".format(time_left)

		msg_matrix = " " + msg_state + " (" + printed_object +  ") - " + msg_completion + " - " + msg_printtime + " - " + msg_timeleft

		LEDMatrix.brightness(0)
		LEDMatrix.scroll_message_horiz([msg_matrix], 4.8//3, 4.8, DIR_L)
	else:
		exit(0)
except KeyboardInterrupt:
	LEDMatrix.clear_all()

 

Partager ce message


Lien à poster
Partager sur d’autres sites

Créer un compte ou se connecter pour commenter

Vous devez être membre afin de pouvoir déposer un commentaire

Créer un compte

Créez un compte sur notre communauté. C’est facile !

Créer un nouveau compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.

Connectez-vous maintenant


×