Gå til innhold

Python: hvordan bruke jinja2-shell-extension


Anbefalte innlegg

Jeg har en Raspberry Pi med en lokal webserver som jeg bruker til å styre ulike ting i huset med.
Jeg har fulgt oppskriften her: https://www.hackster.io/adhyoksh/controlling-gpio-pins-of-raspberry-pi-with-web-page-2d5bdc#code og ønsker å legge til knapper på websiden for å kjøre kommandoer på bringebærboksen. Etter litt googling fant jeg https://pypi.org/project/jinja2-shell-extension som virker til å kunne gjøre det jeg ønsker. Jeg er nybegynner innen programmering så selv om det er eksempelkode på den lenkede siden så kom jeg ikke lenger enn å kjøre: pip install jinja2-shell-extension. Det jeg lurer på er hvordan endrer jeg dette:

from jinja2 import Template, Environment
env = Environment(extensions=["jinja2_shell_extension.ShellExtension"])
template = env.from_string("{{ 'date --rfc-2822'|shell() }}")
result = template.render()

slik at jeg ved trykke på knapper på websiden kan sende kommandoer som "heyu on a1" og "heyu off a1" til RPi ?

index.html:
<html>
  <head>
    <title>Control</title>
  </head>
  <body>
   <h1>Control</h1>
   <h3>Click here:</h3>
   <br>
   <a href=\A><button>LED1 ON</button></a>
   <a href=\a><button>LED1 OFF</button></a><br>
   <a href=\B><button>LED2 ON</button></a>
   <a href=\b><button>LED2 OFF</button></a><br>
   <a href=\C><button>LED3 ON</button></a>
   <a href=\c><button>LED3 OFF</button></a>
  </body>
</html>

control.py:
from flask import Flask
from flask import render_template
import RPi.GPIO as rpi
import time
app= Flask(__name__)
led1,led2,led3= 3,5,7
rpi.setwarnings(False)
rpi.setmode(rpi.BOARD)
rpi.setup(led1, rpi.OUT)
rpi.setup(led2, rpi.OUT)
rpi.setup(led3, rpi.OUT)
rpi.output(led1, 0)
rpi.output(led2, 0)
rpi.output(led3, 0)
print("Done")
@app.route('/')
def index():
    return render_template('webpage.html')
@app.route('/A')
def led1on():
    rpi.output(led1,1)
    return render_template('webpage.html')
@app.route('/a')
def led1off():
    rpi.output(led1,0)
    return render_template('webpage.html')
@app.route('/B')
def led2on():
    rpi.output(led2,1)
    return render_template('webpage.html')
@app.route('/b')
def led2off():
    rpi.output(led2,0)
    return render_template('webpage.html')
@app.route('/C')
def led3on():
    rpi.output(led3,1)
    return render_template('webpage.html')
@app.route('/c')
def led3off():
    rpi.output(led3,0)
    return render_template('webpage.html')
if __name__=="__main__":
    print("Start")
    app.run(debug=True, host='192.168.1.57')


Jeg håper at noen som skjønner dette bedre enn meg har noen tips om hvordan dette kan settes opp.

Lenke til kommentar
Videoannonse
Annonse

Ja, GPIO-delen virker. Det er å sende shell-kommando fra knapp på websiden jeg ikke vet hvordan gjøres.

Jeg har lagt til følgende i begynnelsen av control.py:
from jinja2 import Template, Environment
env = Environment(extensions=["jinja2_shell_extension.ShellExtension"])

Det gir ingen feilmelding ved kjøring men siden jeg ikke vet hvordan jeg skal bruke funksjonen så kommer jeg ikke lenger.

Jeg har lagt til 2 knapper i index.html:
   <a href=\D><button>Light ON</button></a>
   <a href=\d><button>Light OFF</button></a>

Og i control.py har jeg lagt til:
@app.route('/D')

@app.route('/d')

Denne funksjonen fungerer alene:
import os
os.system('/home/pi/heyu-2.10.3/heyu on g3')

Men hvordan kan den legges inn i @app.route(/D') avsnittet ?

Lenke til kommentar
On 10/21/2021 at 9:12 PM, Bjørn Kristiansen said:

Ja, GPIO-delen virker. Det er å sende shell-kommando fra knapp på websiden jeg ikke vet hvordan gjøres.

Har du forsøkt os.popen() ?

import os

 output = os.popen('date')

 

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...