Automação de Iluminação com Raspberry Pi [3/3]

Olá, pessoal.

Vamos dar sequência ao tutorial Automação de Iluminação com Raspberry Pi (Parte 1 e Parte 2).

Esse é o último post [3/3] desse tutorial, abordaremos os itens:

  • Programação de acionamento de GPIO usando Python3
  • Programação de página web em PHP
  • Finalização

Vamos começar!


6. Programação de acionamento de GPIO usando Python3

Primeiro, acesso a RPi via SSH.

Vá até a pasta /var/www/html/

cd /var/www/html

 Eu criei uma pasta chamada GPIO.

mkdir gpio

 depois eu entrei na pasta gpio e eu criei mais 4 pastas, uma para cada GPIO que eu usei. Para melhor entendimento, uma para cada interruptor.

mkdir gpio03
mkdir gpio05
mkdir gpio08
mkdir gpio10

 Dentro de cada pasta eu criei dois scripts em Python3. Um para acender e outro para apagar.

vim acender.py
vim apagar.py

A seguir o código para acender:

import RPi.GPIO as GPIO 
import time 
import sys 
import os 
GPIO.setmode(GPIO.BOARD) 
GPIO.setwarnings(False) 
GPIO.setup(3, GPIO.OUT) 
rele_quarto = 3 

def ligar(): 
    GPIO.output(rele_quarto, GPIO.HIGH) 

if __name__ == "__main__": 
    ligar()

Para salvar e sair apertar a tecla “:” e depois wq. Assim “:wq”.

E o código para desligar:

import RPi.GPIO as GPIO 
import time 
import sys 
import os 
GPIO.setmode(GPIO.BOARD) 
GPIO.setwarnings(False) 
GPIO.setup(3, GPIO.OUT) 
rele_quarto = 3 

def desligar(): 
    GPIO.output(rele_quarto, GPIO.LOW) 

if __name__ == "__main__": 
    desligar()

Fazer isso em todas as pastas que criar!

Teste se está funcionando:

python3 /var/www/html/gpio/gpio05/acender.py
python3 /var/www/html/gpio/gpio05/apagar.py

7. Programação de página web em PHP

Entrar com o comando:

cd ..

 2 vezes. Para navegarmos até a pasta /var/www/html/

Usei na página de controle um plug-in com front-end pronto, o AdminLTE.

Basta fazer o download e descompactar os arquivos na pasta /var/www/html/.

Entrar com o comando vim para editar a página index.php:

vim index.php

Adicionar o código:

<html style="height: auto; min-height: 97%;">
<head>
  <meta charset="utf-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <title>CONTROLE DE LUZ HUGO</title>
  <!-- Tell the browser to be responsive to screen width -->
  <meta content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" name="viewport">
  <!-- Bootstrap 3.3.7 -->
  <link rel="stylesheet" href="../../bower_components/bootstrap/dist/css/bootstrap.min.css">
  <!-- Font Awesome -->
  <link rel="stylesheet" href="../../bower_components/font-awesome/css/font-awesome.min.css">
  <!-- Ionicons -->
  <link rel="stylesheet" href="../../bower_components/Ionicons/css/ionicons.min.css">
  <!-- daterange picker -->
  <link rel="stylesheet" href="../../bower_components/bootstrap-daterangepicker/daterangepicker.css">
  <!-- bootstrap datepicker -->
  <link rel="stylesheet" href="../../bower_components/bootstrap-datepicker/dist/css/bootstrap-datepicker.min.css">
  <!-- iCheck for checkboxes and rgpioio inputs -->
  <link rel="stylesheet" href="../../plugins/iCheck/all.css">
  <!-- Bootstrap Color Picker -->
  <link rel="stylesheet" href="../../bower_components/bootstrap-colorpicker/dist/css/bootstrap-colorpicker.min.css">
  <!-- Bootstrap time Picker -->
  <link rel="stylesheet" href="../../plugins/timepicker/bootstrap-timepicker.min.css">
  <!-- Select2 -->
  <link rel="stylesheet" href="../../bower_components/select2/dist/css/select2.min.css">
  <!-- Theme style -->
  <link rel="stylesheet" href="../../dist/css/AdminLTE.min.css">
  <!-- AdminLTE Skins. Choose a skin from the css/skins
       folder instead of downloading all of them to reduce the load. -->
  <link rel="stylesheet" href="../../dist/css/skins/_all-skins.min.css">

  <!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media queries -->
  <!-- WARNING: Respond.js doesn't work if you view the page via file: -->
  <!-- [if lt IE 9] -->
  <script src="https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js"></script>
  <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
  <!-- [endif]-->

  <!-- Google Font -->
  <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Source+Sans+Pro:300,400,600,700,300italic,400italic,600italic">
</head>
 <body>

 	<div class="box">
            <div class="box-header with-border">
              <h3 class="box-title">CONTROLE DE ILUMINAÇÃO HUGO'S HOUSE</h3>
            </div>
            <!-- /.box-header -->
            <div class="box-body">
              <table class="table table-bordered">
                <tbody><tr>
                  <th style="width: 10px">#</th>
                  <th>CÔMODO</th>
                  <th>ACENDER</th>
                  <th style="width: 40px">APAGAR</th>
                </tr>
                <tr>
                  <td>1.</td>
                  <td><b>BANHEIRO</b> [GPIO 3]</td>
                  <td>
                    <div >
                      <div>
					  <form action="" method="post">
 <button type="submit" class="btn btn-block btn-success btn-lg"  name="acender03" value="Acender">Acender</button>
 </form>
					  </div>
                    </div>
                  </td>
                  <td><div><form action="" method="post">
 <button type="submit" class="btn btn-block btn-success btn-lg" name="apagar03" value="Apagar">Apagar</button>
 </form></div></td>
                </tr>
                <tr>
                  <td>2.</td>
                  <td><b>QUARTO</b> [GPIO 5]</td>
                  <td>
                    <div><form action="" method="post">
 <button type="submit" class="btn btn-block btn-success btn-lg" name="acender05" value="Acender">Acender</button>
 </form>  </div>
                  </td>
                  <td><div><form action="" method="post">
 <button type="submit" class="btn btn-block btn-success btn-lg" name="apagar05" value="Apagar">Apagar</button>
 </form></div></td>
                </tr>
                <tr>
                  <td>3.</td>
                  <td><b>SALA</b> [GPIO 8]</td>
                  <td>
                    <div><form action="" method="post">
 <button type="submit" class="btn btn-block btn-success btn-lg" name="acender08" value="Acender">Acender</button>
 </form>  </div>
                  </td>
                  <td><div><form action="" method="post">
 <button type="submit" class="btn btn-block btn-success btn-lg" name="apagar08" value="Apagar">Apagar</button>
 </form></div></td>
                </tr>
                <tr>
                  <td>4.</td>
                  <td><b>COZINHA</b> [GPIO 10]</td>
                  <td>
                    <div><form action="" method="post">
 <button type="submit" class="btn btn-block btn-success btn-lg" name="acender10" value="Acender">Acender</button>
 </form>  </div>
                  </td>
                  <td><div><form action="" method="post">
 <button type="submit" class="btn btn-block btn-success btn-lg" name="apagar10" value="Apagar">Apagar</button>
 </form></div></td>
                </tr>
              </tbody></table>
            </div>
            <!-- /.box-body -->
            <div class="box-footer clearfix">
              <ul class="pagination pagination-sm no-margin pull-right">
                <li><a href="#">«</a></li>
                <li><a href="#">1</a></li>
                <li><a href="#">2</a></li>
                <li><a href="#">3</a></li>
                <li><a href="#">»</a></li>
              </ul>
            </div>
          </div>
		  <!-- ./wrapper -->

<!-- jQuery 3 -->
<script src="../../bower_components/jquery/dist/jquery.min.js"></script>
<!-- Bootstrap 3.7 -->
<script src="../../bower_components/bootstrap/dist/js/bootstrap.min.js"></script>
<!-- Select2 -->
<script src="../../bower_components/select2/dist/js/select2.full.min.js"></script>
<!-- InputMask -->
<script src="../../plugins/input-mask/jquery.inputmask.js"></script>
<script src="../../plugins/input-mask/jquery.inputmask.date.extensions.js"></script>
<script src="../../plugins/input-mask/jquery.inputmask.extensions.js"></script>
<!-- date-range-cker -->
<script src="../../bower_components/moment/min/moment.min.js"></script>
<script src="../../bower_components/bootstrap-daterangepicker/daterangepicker.js"></script>
<!-- bootstrap depicker -->
<script src="../../bower_components/bootstrap-datepicker/dist/js/bootstrap-datepicker.min.js"></script>
<!-- bootstrap cor picker -->
<script src="../../bower_components/bootstrap-colorpicker/dist/js/bootstrap-colorpicker.min.js"></script>
<!-- bootstrap te picker -->
<script src="../../plugins/timepicker/bootstrap-timepicker.min.js"></script>
<!-- SlimScroll -->
<script src="../../bower_components/jquery-slimscroll/jquery.slimscroll.min.js"></script>
<!-- iCheck 1.0.-->
<script src="../../plugins/iCheck/icheck.min.js"></script>
<!-- FastClick -->
<script src="../../bower_components/fastclick/lib/fastclick.js"></script>
<!-- AdminLTE A-->
<script src="../../dist/js/adminlte.min.js"></script>
<!-- AdminLTE fodemo purposes -->
<script src="../../dist/js/demo.js"></script>
<!-- Page script -->
<script>
  $(function () {
    //Initialize Select2 Elements
    $('.select2').select2()

    //Datemask dd/mm/yyyy
    $('#datemask').inputmask('dd/mm/yyyy', { 'placeholder': 'dd/mm/yyyy' })
    //Datemask2 mm/dd/yyyy
    $('#datemask2').inputmask('mm/dd/yyyy', { 'placeholder': 'mm/dd/yyyy' })
    //Money Euro
    $('[data-mask]').inputmask()

    //Date range picker
    $('#reservation').daterangepicker()
    //Date range picker with time picker
    $('#reservationtime').daterangepicker({ timePicker: true, timePickerIncrement: 30, format: 'MM/DD/YYYY h:mm A' })
    //Date range as a button
    $('#daterange-btn').daterangepicker(
      {
        ranges   : {
          'Today'       : [moment(), moment()],
          'Yesterday'   : [moment().subtract(1, 'days'), moment().subtract(1, 'days')],
          'Last 7 Days' : [moment().subtract(6, 'days'), moment()],
          'Last 30 Days': [moment().subtract(29, 'days'), moment()],
          'This Month'  : [moment().startOf('month'), moment().endOf('month')],
          'Last Month'  : [moment().subtract(1, 'month').startOf('month'), moment().subtract(1, 'month').endOf('month')]
        },
        startDate: moment().subtract(29, 'days'),
        endDate  : moment()
      },
      function (start, end) {
        $('#daterange-btn span').html(start.format('MMMM D, YYYY') + ' - ' + end.format('MMMM D, YYYY'))
      }
    )

    //Date picker
    $('#datepicker').datepicker({
      autoclose: true
    })

    //iCheck for checkbox and radio inputs
    $('input[type="checkbox"].minimal, input[type="radio"].minimal').iCheck({
      checkboxClass: 'icheckbox_minimal-blue',
      radioClass   : 'iradio_minimal-blue'
    })
    //Red color scheme for iCheck
    $('input[type="checkbox"].minimal-red, input[type="radio"].minimal-red').iCheck({
      checkboxClass: 'icheckbox_minimal-red',
      radioClass   : 'iradio_minimal-red'
    })
    //Flat red color scheme for iCheck
    $('input[type="checkbox"].flat-red, input[type="radio"].flat-red').iCheck({
      checkboxClass: 'icheckbox_flat-green',
      radioClass   : 'iradio_flat-green'
    })

    //Colorpicker
    $('.my-colorpicker1').colorpicker()
    //color picker with addon
    $('.my-colorpicker2').colorpicker()

    //Timepicker
    $('.timepicker').timepicker({
      showInputs: false
    })
  })
</script>


 </body>
</html>

<?php
// Funciones PHP del pin GPIO 03
 //ini_set("display_errors",1);
 if ($_POST[acender03]) {
 $a = shell_exec("sudo python3 /var/www/html/gpio/gpio03/acender.py");
 echo $a;
 }

 if ($_POST[apagar03]) {
 $a = shell_exec("sudo python3 /var/www/html/gpio/gpio03/apagar.py");
 echo $a;
 }

 if ($_POST[acender05]) {
 $a = shell_exec("sudo python3 /var/www/html/gpio/gpio05/acender.py");
 echo $a;
 }

 if ($_POST[apagar05]) {
 $a = shell_exec("sudo python3 /var/www/html/gpio/gpio05/apagar.py");
 echo $a;
 }
 if ($_POST[acender08]) {
 $a = shell_exec("sudo python3 /var/www/html/gpio/gpio08/acender.py");
 echo $a;
 }

 if ($_POST[apagar08]) {
 $a = shell_exec("sudo python3 /var/www/html/gpio/gpio08/apagar.py");
 echo $a;
 }
 if ($_POST[acender10]) {
 $a = shell_exec("sudo python3 /var/www/html/gpio/gpio10/acender.py");
 echo $a;
 }

 if ($_POST[apagar10]) {
 $a = shell_exec("sudo python3 /var/www/html/gpio/gpio10/apagar.py");
 echo $a;
 }
?>

 Salve com o comando “:wq”


8. Finalização

Através de um Notebook, PC ou Smartphone acesse o link no navegador. http://seuip/index.php

Não esqueça que vc deve estar na rede Wi-Fi.

Seu Dashboard vai aparecer dessa maneira, responsivo, simples e funcional!!! 

dashboard de controle de iluminação

Espero que tenham gostado e que consigam executar esse projeto!

Caso tenham dúvidas, comente que eu responderei, ok?

Caso queiram que eu detalhe algum passo, basta pedir nos comentários que eu crio o post.

Abraço e até o próximo!

Hugo Baur

Mais artigos deste autor »

Graduado em Sistemas de Informação pela UFF e mestrando em Inteligência Artificial pela mesma instituição, atua nas áreas de Data Science, BI e Big Data. Entusiasta em IoT, eletrônica, automação, Machine Learning e IA.


24 Comentários

Lino Mateus
1

Boa tarde segui os 3 passos, mas quando eu abro o endereço ao clicar no botão para acender não aciona o rele, a fiação esta correta, tem ideia do que eu fiz de errado ?, instalei o apache o php

Hugo Baur
2

Olá Lino,
Para testar se está correto a instalação elétrica e programação de hardware, use o comando:
sudo python3 /var/www/html/gpio/gpio03/acender.py
Para apagar:
sudo python3 /var/www/html/gpio/gpio03/apagar.py
Certifique que seu jumper esteja instalado no gpio03 e qual relé está configurado para esse gpio.
Para teste, sugiro rodar esses comandos para todos os pgio, pode ser que tenha colocado em algum local errado.
Se precisar, mande mais detalhes para que eu possa te ajudar.
Abraço e bom projeto.

João
3

Boa noite,
Estou com dificuldade para acionar o relé pelo navegador. Não sei se estou fazendo correto, la na código index.php, para acionar a gpio03 eu tenho que cetar o form dessa maneira. Ex:
Acender
Mas dessa forma apresenta erro na pagina: 404 Not Found.

Hugo Baur
4

Bom dia João,
Não entendi sua dúvida, pode detalhar mais?
O código está correto, não precisa alterar nada, apenas o caminho pra acionar o arquivo Python da sua Raspberry se vc criou as pastas e arquivos diferente do que eu fiz.
Esse código recebe a entrada do clique do botão “acender03”
Abre um terminal e executa esse comando : sudo python3 /var/www/html/gpio/gpio03/acender.py
Eu crio uma pasta gpio, depois uma para cada gpio, nesse caso o pgio03, depois eu executo o script em python acender.
Se vc entrar pelo SSH na Raspberry pi e executar o comando sua luz tem que ligar.
if ($_POST[acender03]) {
$a = shell_exec(“sudo python3 /var/www/html/gpio/gpio03/acender.py”);
echo $a;
}
Abraço joão, avise se conseguir resolver.

João
5

Boa noite,
Só alterei a gpio, que está ligada a gpio12 e o caminho da pasta do apache que é a \var\www\www. E realizai o teste executando: /var/www/www/gpio/gpio12/acender.py. O qual não apresentou nenhum erro, mas não acionou o rele.

Hugo Baur
7

Oi João,
Tem certeza que seu caminho pro apache é /var/www/www/gpio/… ?
Faça o teste com:
sudo python3 /var/www/gpio/gpio12/acender.py
Com o script:
import RPi.GPIO as GPIO
import time
import sys
import os
GPIO.setmode(GPIO.BOARD)
GPIO.setwarnings(False)
GPIO.setup(12, GPIO.OUT)
def ligar():
GPIO.output(12, GPIO.HIGH)
if __name__ == “__main__”:
ligar()
Se realmente for, sudo python3 /var/www/www/gpio/gpio12/acender.py , vc vai precisar alterar os código da página web, porém só na parte do PHP e no botão de acionamento do html. assim:
Acender
_________________________________________________________________________________________
if ($_POST[acender12]) {
$a = shell_exec(“sudo python3 /var/www/www/html/gpio/gpio12/acender.py”);
echo $a;
}
Confirma se deu certo e avisa aqui pra gente saber se foi.
Um baraço.

João
8

Boa noite Hugo.
Tenho certeza absoluta que o caminho é: /var/www/www/gpio/gpio12/acender.py.
meu cód acender.py:
import RPi.GPIO as GPIO
import time
import sys
import os
GPIO.setmode(GPIO.BOARD)
GPIO.setwarnings(False)
GPIO.setup(12, GPIO.OUT)
rele_quarto = 12
def ligar():
GPIO.output(rele_quarto, GPIO.HIGH)
if __name__ == “__main__”:
ligar()
————————————————————————-
E o caminho do meu PHP: /var/www/www/index.php
Cód PHP:
if ($_POST[acender12]) {
$a = shell_exec(“sudo python3 /var/www/www/gpio/gpio12/acender.py”);
echo $a;
}
————————————————————————–
Estou executando o comando no terminal: sudo python3
var/www/www/gpio/gpio12/acender.py, acessando o meu raspberry via SSH. Mas o relé não é acionado. Não tenho ideia do que pode ser!

João
10

Meu amigo Hugo, mil desculpas. alterei a numeração da GPIO para 32, e acendeu. Mas não está apagando.
Cód apagar.py:
import RPi.GPIO as GPIO
import time
import sys
import os
GPIO.setmode(GPIO.BOARD)
GPIO.setwarnings(False)
GPIO.setup(32, GPIO.OUT)
rele_quarto = 32
def desligar():
GPIO.output(rele_quarto, GPIO.LOW)
if __name__ == “__main__”:
desligar()

João
11

Hugo,
Consegui realizar o teste para ligar e desligar o relé, só não está pegando com o index.php, pelo navegador!

Hugo Baur
12

João,
Além de alterar o PHP, vc tem que alterar o button, esse código aqui:
Acender
Alterou ele também?
Vc consegue ver a página, aperta e não vai? Ou vc não consegue abrir a página?

João
13

A pagina abre sim, mas ao executar o botão para acender, por exemplo, não faz nada.
Segue o Cód do index.php.
CONTROLE DE LUZ HUGO

















CONTROLE DE ILUMINAÇÃO HUGO’S HOUSE

#
CÔMODO
ACENDER
APAGAR
1.
BANHEIRO [GPIO 32]
Acender
Apagar
2.
QUARTO [GPIO 5]
Acender
Apagar
3.
SALA [GPIO 8]
Acender
Apagar
4.
COZINHA [GPIO 10]
Acender
Apagar

«
1
2
3
»















$(function () {
//Initialize Select2 Elements
$(‘.select2’).select2()
//Datemask dd/mm/yyyy
$(‘#datemask’).inputmask(‘dd/mm/yyyy’, { ‘placeholder’: ‘dd/mm/yyyy’ })
//Datemask2 mm/dd/yyyy
$(‘#datemask2’).inputmask(‘mm/dd/yyyy’, { ‘placeholder’: ‘mm/dd/yyyy’ })
//Money Euro
$(‘[data-mask]’).inputmask()
//Date range picker
$(‘#reservation’).daterangepicker()
//Date range picker with time picker
$(‘#reservationtime’).daterangepicker({ timePicker: true, timePickerIncrement: 30, format: ‘MM/DD/YYYY h:mm A’ })
//Date range as a button
$(‘#daterange-btn’).daterangepicker(
{
ranges : {
‘Today’ : [moment(), moment()],
‘Yesterday’ : [moment().subtract(1, ‘days’), moment().subtract(1, ‘days’)],
‘Last 7 Days’ : [moment().subtract(6, ‘days’), moment()],
‘Last 30 Days’: [moment().subtract(29, ‘days’), moment()],
‘This Month’ : [moment().startOf(‘month’), moment().endOf(‘month’)],
‘Last Month’ : [moment().subtract(1, ‘month’).startOf(‘month’), moment().subtract(1, ‘month’).endOf(‘month’)]
},
startDate: moment().subtract(29, ‘days’),
endDate : moment()
},
function (start, end) {
$(‘#daterange-btn span’).html(start.format(‘MMMM D, YYYY’) + ‘ – ‘ + end.format(‘MMMM D, YYYY’))
}
)
//Date picker
$(‘#datepicker’).datepicker({
autoclose: true
})
//iCheck for checkbox and radio inputs
$(‘input[type=”checkbox”].minimal, input[type=”radio”].minimal’).iCheck({
checkboxClass: ‘icheckbox_minimal-blue’,
radioClass : ‘iradio_minimal-blue’
})
//Red color scheme for iCheck
$(‘input[type=”checkbox”].minimal-red, input[type=”radio”].minimal-red’).iCheck({
checkboxClass: ‘icheckbox_minimal-red’,
radioClass : ‘iradio_minimal-red’
})
//Flat red color scheme for iCheck
$(‘input[type=”checkbox”].flat-red, input[type=”radio”].flat-red’).iCheck({
checkboxClass: ‘icheckbox_flat-green’,
radioClass : ‘iradio_flat-green’
})
//Colorpicker
$(‘.my-colorpicker1’).colorpicker()
//color picker with addon
$(‘.my-colorpicker2’).colorpicker()
//Timepicker
$(‘.timepicker’).timepicker({
showInputs: false
})
})

felipe
17

vc ensina de um meio muito eficaz , parabens, eu segui seu passo-a-passo mas no final nao acende clicando no botao no site
fiz os testes pelo terminal executando o script py e acende e apaga, mas pela web nao. o sera que está errado?

Hugo Baur
18

Felipe, muito obrigado. Se não funciona na web o código php que é o problema.
Da uma revisada. Boa sorte amigo.

felipe
19

eu revisei mas esse projeto é minha primeira experiencia com linux
nao sei mas oq fazer, sao 3 noites mexendo , sem resultados.
editei o painel admin e o codigo esta assim
PAINEL DE CONTROLE

















PAINEL DE CONTROLE

#
CÔMODO
ACENDER
APAGAR
1.
BANHEIRO [GPIO 3]
Acender
Apagar
2.
QUARTO [GPIO 5]
Acender
Apagar
3.
SALA [GPIO 8]
Acender
Apagar
4.
COZINHA [GPIO 10]
Acender
Apagar















$(function () {
//Initialize Select2 Elements
$(‘.select2’).select2()
//Datemask dd/mm/yyyy
$(‘#datemask’).inputmask(‘dd/mm/yyyy’, { ‘placeholder’: ‘dd/mm/yyyy’ })
//Datemask2 mm/dd/yyyy
$(‘#datemask2’).inputmask(‘mm/dd/yyyy’, { ‘placeholder’: ‘mm/dd/yyyy’ })
//Money Euro
$(‘[data-mask]’).inputmask()
//Date range picker
$(‘#reservation’).daterangepicker()
//Date range picker with time picker
$(‘#reservationtime’).daterangepicker({ timePicker: true, timePickerIncrement: 30, format: ‘MM/DD/YYYY h:mm A’ })
//Date range as a button
$(‘#daterange-btn’).daterangepicker(
{
ranges : {
‘Today’ : [moment(), moment()],
‘Yesterday’ : [moment().subtract(1, ‘days’), moment().subtract(1, ‘days’)],
‘Last 7 Days’ : [moment().subtract(6, ‘days’), moment()],
‘Last 30 Days’: [moment().subtract(29, ‘days’), moment()],
‘This Month’ : [moment().startOf(‘month’), moment().endOf(‘month’)],
‘Last Month’ : [moment().subtract(1, ‘month’).startOf(‘month’), moment().subtract(1, ‘month’).endOf(‘month’)]
},
startDate: moment().subtract(29, ‘days’),
endDate : moment()
},
function (start, end) {
$(‘#daterange-btn span’).html(start.format(‘MMMM D, YYYY’) + ‘ – ‘ + end.format(‘MMMM D, YYYY’))
}
)
//Date picker
$(‘#datepicker’).datepicker({
autoclose: true
})
//iCheck for checkbox and radio inputs
$(‘input[type=”checkbox”].minimal, input[type=”radio”].minimal’).iCheck({
checkboxClass: ‘icheckbox_minimal-blue’,
radioClass : ‘iradio_minimal-blue’
})
//Red color scheme for iCheck
$(‘input[type=”checkbox”].minimal-red, input[type=”radio”].minimal-red’).iCheck({
checkboxClass: ‘icheckbox_minimal-red’,
radioClass : ‘iradio_minimal-red’
})
//Flat red color scheme for iCheck
$(‘input[type=”checkbox”].flat-red, input[type=”radio”].flat-red’).iCheck({
checkboxClass: ‘icheckbox_flat-green’,
radioClass : ‘iradio_flat-green’
})
//Colorpicker
$(‘.my-colorpicker1’).colorpicker()
//color picker with addon
$(‘.my-colorpicker2’).colorpicker()
//Timepicker
$(‘.timepicker’).timepicker({
showInputs: false
})
})


















$.widget.bridge(‘uibutton’, $.ui.button)











Hugo Baur
20

Felipe, não da pra entender seu código Sugiro vc copiar e colar os códigos que te garanto que vai funcionar.

Matheus
22

Boa tarde!
Ao invés de colocar par carregar um arquivo .py para cada acionamento da página web, é possível que se faça por exemplo POST em um programa principal que esteja rodando o tempo todo checando as entradas??

SILVIO FREITAS
23

Olá Hugo … Estou seguindo seu passo a passo e primeiramente parabéns pelo trabalho … Meu problema é que minha pagina no BROWSER não vem com as configuraçãoes do BOOTSTRAP .. Na pasta do HTML como os arquivos do ADMINLTEdeveriam estar ? Obrigado !!!

JUNIOR
24

Consegui descobrir o erro no PHP que não deixava disparar o comando acender.py ou apagar.py
Funcionava via terminal, mas não funcionava via site web.
1 – Edite o arquivo sudoers através do terminal com o comando: sudo visudo
2 – Depois da ultima linha desse arquivo, insira a linha:
www-data ALL=(ALL) NOPASSWD: ALL
3 – Salve a alteração e saia do arquivo sudoers
4 – Na sua programação php o comando de disparo deve ficar assim:
shell_exec(“sudo nice /var/www/html/gpio/gpio3/acender.py”)
OBS: a grande sacada foi a alteração do sudoers para permitir que o user ww-data tenha permissão de executar o shell_exec, e a outra sacada foi acrescentar a sintaxe nice junto com o sudo no comando de execução no shell_exec.

Deixe seu comentário

Seu endereço de e-mail não será publicado. Campos com * são obrigatórios!