Octoprint & Pushover
Leestijd: 3 MinutenIk gebruik al heel lang Pushover om notificaties te ontvangen op mijn telefoon. Sinds kort gebruik ik Octoprint om 3d objecten te printen op mijn 3d printer. Octoprint heeft geen ondersteuning voor Pushover en ook geen plugins die dat kunnen. Echter.. Pushover is gemaakt in Python, en laat ik dat nu net een beetje onder de knie te hebben. Dus ik ben aan de slag gegaan.
Proof of concept
Een plugin maken voor een bestaand pakket is toch iets anders dan een Fibonacci in een console tonen. Misschien had ik toch iets teveel hooi op mijn vork genomen. Ik begon met simpel, kan ik een notificatie sturen met Python naar Pushover ? Ja dat kan en dat is eigenlijk wel heel simpel .
1 2 3 4 5 6 7 8 |
conn = httplib.HTTPSConnection("api.pushover.net:443") conn.request("POST", "/1/messages.json", urllib.urlencode({ "token": "xx_app_token_xx", "user": "xx_user_token_xx", "message": "hello world", }), { "Content-type": "application/x-www-form-urlencoded" }) conn.getresponse() |
Een notificatie kan, nu de rest; Zoeken naar documentatie, kijken hoe andere mensen plugins hebben gemaakt. Al snel werd het duidelijk dat ik geen idee had hoe ik het moest testen. Daarom heb ik een standalone class gemaakt zonder dependencies naar het Octoprint framework. Dat werkte, ik kon mijn token valideren en berichten versturen. Tijd om de dependencies in te bouwen en te kijken of het werkte. En dat deed het.
Jinja2
Om alles instelbaar te maken maakt Octoprint gebruik van Jinja2. Jinja2 is zoals ze zelf zeggen:
Jinja2 is a modern and designer-friendly templating language for Python
Het is een soort template parser, om je front end en je backend gescheiden te houden. Ook dat was niet al te moeilijk. Je maakt input velden en de bind deze velden met je settings in je backend door middel van een unieke key. Het Octoprint framework regelt de rest. Ik wou met een API call alle geluiden ophalen van Pushover. zodat ik die kan weergeven in de settings pagina. Wat mij een tijdje heeft gekost is hoe ik bepaalde waardes meegaf vanuit je backend naar Jinja2.
1 2 3 4 5 6 7 8 9 10 |
def get_template_vars(self): return dict(sounds=self.get_sounds()) def get_sounds(self): HTTPResponse = self.get("sounds.json") if not HTTPResponse: return return json.loads(HTTPResponse.read())["sounds"] |
Github
Alles werkt, tijd om een mijn plugin te distribueren. Om mijn plugin in de repository te krijgen van Octoprint moet je hun project forken om vervolgens je aanpassing te doen, eenmaal klaar kan je je pull request doen. En na goedkeuring staat jouw plugin op plugins.octoprint.org.
Versies
Om gebruik te maken van de Octoprint update manager maak je gebruik van releases in Github. Om dit in te stellen maak je jouw release aan in Github. Je zorgt dat jouw plugin_version in setup.py correspondeert met jouw huidige versie, en wanneer je een nieuwe versie aanmaakt geeft Octoprint je een melding dat je kan updaten.
En nu verder
Uiteindelijk stelt het allemaal niet heel veel voor, zolang je het maar in kleine stukjes opdeelt. Waar ik veel an heb gehad tijdens het ontwikkelen is de Getting started. Mijn uiteindelijke code kan je vinden hier: Github – Octoprint Pushover
Ik heb nog een idee voor een nieuwe kleine plugin wat ik kan maken, tot nu toe heb ik genoten van dit kleine maar doch leuke projectje.