août 4

Plateforme Dev avec Pi4 8Go – SSD 500 Go dual screen ( 15.6″ ou 17.3″ )

But :

Faire une plateforme de dev ( Electronique , arduino , esp8266 ) a partir d’un raspberry pi 4 , disque SSD et double écran .plutôt que dédier un PC portable
le boitier du 1er écran  contiendras :
– un raspberry PI 4 8Go

– un SSD de 500 Go

– un module Buck down permettant de générer le 5V pour le Pi , Le SSD , les Hub USB

– un module buck down permettant de générer le 12V pour les 2 cartes controleur HDMI

– 2 cartes contrôleur HDMI / lvds pour gérer les 2 écrans

– 2 Hub USB 4 ports , un USB3.0 et un USB 2.0

– les 2 écrans ( qui sont des dalles de récuperation sur des pc portables HS ) seront relies ensemble avec une charnière qui permettra au 2eme écran de se se replier sur le 1er écran.

– le bloc d’alimentation sera externe ( pareil bloc de récupération d’un portable HS 19v 5A

– un clavier / souris Raspberry Pi

Préparation Logicielle :

    • modification de la sequence de boot sur le raspberry pi 4
    • création de l‘image Debian 64 bits depuis un poste linux (*****)
      scripts a modifier pour les dernières versions du bootloader ( raspberrypi-bootloader_1.20200723-1_arm64.deb au 2020/08/04 )  et du kernel ( bcm2711-kernel-5.4.51.20200728.tar.xz au 2020/08/04 ) ,
      dans stage2.sh modifier l’utilisateur debian par votre nom d’utilisateur dans mon cas : thierryadduser thierry
      usermod -aG sudo,video,audio,cdrom thierry
      pour l’instant ne pas activer l’option deskop (dans stage2.sh)
      • avant de démonter l’image fichiers a modifier :
        fichier /boot/config.txt:
        enable_uart=1
        dtparam=audio=on
        start_x=1
        gpu_mem=128
        [pi4]
        dtoverlay=vc4-fkms-v3d
        max_framebuffers=2
        arm_64bit=1
        # differentiate from Pi3 64-bit kernels
        kernel=kernel8-p4.imgfichier /boot/cmdline.txt :
        dwc_otg.lpm_enable=0 console=serial0,115200 console=tty1 root=/dev/sda2 rootfstype=ext4 elevator=deadline rootwait usb-storage.quirks=13fdc:3960:u ipv6.disable=1
        j’avais des pb avec l’adaptateur USB3/SATA , j’ai du rajouter usb-storage.quirks=13fdc:3960:u  dans le cmdline.txtfichier /etc/fstab :
        proc /proc proc defaults 0 0
        /dev/sda1 /boot vfat defaults 0 2
        /dev/sda2 / ext4 defaults,noatime 0 1
    • transfert de l’image sur le SDD ( ici mon sdd est /dev/sdg a adapter selon votre config) :
      sudo dd if=debian-rpi64.img of=/dev/sdg bs=1024k status=progress
    • brancher le SSD sur le Pi4 avec pour l’instant un moniteur hdmi / clavier / souris
    • si le Boot fonctionne on peux continuer sinon on recommence depuis le début .
    • on vas maintenant installer l’interface graphique ( une seule ):
      apt install task-xfce-desktop -y # For XFCE
      apt install task-gnome-desktop -y # For GNOME
      apt install task-kde-desktop-y # For KDE Plasma
      apt install task-mate-desktop -y # For MATE  <== celle que j’ai choisi
      apt install task-lxde-desktop -y # For LXDE
      apt install task-lxqt-desktop -y # For LXQT
    • et on reboote le système , normalement l’interface graphique se lance .
    • encore quelques petites configurations ajout de logiciels
      on lance un terminal :
      sudo apt-get install devscripts build-essential lintian git
      sudo mkdir /opt/Softs
      sudo chown -R thierry: /opt/Softs
      cd /opt/Softs
    • on vas récupérer sur https://github.com/RPi-Distro ce que l’on vas avoir besoin ; raspberrypi-sys-mods , raspi-config ,pi-bluetooth
      git clone https://github.com/RPi-Distro/raspberrypi-sys-mods.git
      git clone https://github.com/RPi-Distro/raspi-config.git
      git clone https://github.com/RPi-Distro/pi-bluetooth.git
    • on compile :
      cd pi-bluetooth
      debuild -us -uc
      cd ..
      cd raspi-config
      debuild -us -uc
      cd ..
      cd raspberrypi-sys-mods
      debuild -us -uc
      cd ..
    • on verifie que tout est compilé : ls -al *.deb
      pi-bluetooth_0.1.13_all.deb raspberrypi-sys-mods_20200729_arm64.deb raspi-config_20200727_all.deb
    • on installe : sudo dpkg -i *.deb
      si on as un message d’erreur de dépendance on lance sudo apt -f install , et tout devrais s’installer correctement
    • on installe la partie bluetooth :
      sudo apt-get install bluetooth bluez blueman

La partie logicielle est pratiquement  terminé , reste encore a installer kicad , arduino , codium et tous les gadgets nécessaire

Partie Matérielle

  • un clavier / Souris Officiel Raspberry Pi
  • Un raspberry Pi 4 8 Go
  • Un SSD 500Go + adaptateur USB/SATA
  • un hub USB 2.0 4 ports
  • un hub USB 3.0 4 ports
  • 2 modules alim Buck down
  • 2 dalles écrans 17″ de recupérations (modele LP173WD1 )
  • 2 cartes contrôleurs HDMI
  • 2 câbles HDMI / micro HDMI

 

***** => il existe maintenant une image 64bit de raspberry pi OS , https://downloads.raspberrypi.org/ raspios_arm64 ( version complète avec bureau ) et raspios_lite_arm64

bientôt la suite ………………………………………….

 

 

Catégorie : Uncategorized | Commentaires fermés sur Plateforme Dev avec Pi4 8Go – SSD 500 Go dual screen ( 15.6″ ou 17.3″ )
mars 23

RadioPi

But: transformer un vieux poste radio a lampes HS des années 60/70 récupéré en vide grenier en poste mp3 avec un raspberry Pi.

Au niveau Matériel :
– un vieux poste radio a lampes HS des années 60/70
– un Raspberry Pi
– un ampli 2.1 20W
– 3 HP 5W
– un Afficheur 128×128 pixels
– deux encodeurs rotatifs
– un disque dur SSD avec adaptateur USB
– horloge RTC en I2C
– bande de led RGB
– deux alimentations 220v/5V  ( une pour la partie Audio , l’autre pour la partie “numérique” 5A) et conneteur alimentation et interrupteur M/A
– un ventilateur 5V avec grille
– un disque dur SSD ( dans mon cas un 120Go)

ou trouvez les divers éléments :
1 x Raspberry Pi
2 x 3-inch-Full-Range-Speaker-4ohm-5W
1 x 4-Pouces Haut-Parleur-4-Ohm-15-W graves
1x Ampli 2.1 20W 5V
2 x Encodeur rotatif
1 x Horloge I2C 
2 x alimentation 220v -5v 3A
2 x câble USB
1 x câble réseau
1 x ventilateur 5v+1 x grille 60mm
1 x interrupteur + 1 x connecteur alimentation

 

Au niveau logiciel :
– Raspbian lite dernière version
– daemon mpd
– python3
– scripts divers ( gestion des encodeurs rotatif en émulation clavier UP,DOWN,LEFT,RIGHT,ENTER,PLAUY/PAUSE).

 

Photos de la transformation :

bon j’avoue en étant électronicien / informaticien , je déteste la partie “mécanique” ( boitier et autre ) , c’est donc mon beau-frère qui s’occupe de cette partie en plus ayant son Fablab perso il a tous les outils nécessaire

pour remplacer la lampe de “l’Œil magique” un afficheur 1.44” SPI  de 128×128 pixels qui permettra d’afficher divers menu et aussi la pochette de la piste en cours a base de st7735 / ili9163

 

câblage des GPIO ( provisoire)

Name Usage Board Usage Name
3.3V RTC.VCC 01 | | 02 LED.VCC 5V
GPIO02 RTC.SDA 03 | | 04 LCD.VCC 5V
GPIO03 RTC.SCL 05 | | 06 GND
GPIO04 07 | | 08 U_TXD GPIO14
GND RTC.GND 09 | | 10 U_RXD GPIO15
GPIO17 ENC1.B 11 | | 12 SPI1_CE0 GPIO18
GPIO27 ENC1.A 13 | | 14 LCD.GND GND
GPIO22 ENC1.SW 15 | | 16 LCD.LED GPIO23
3.3V 17 | | 18 LCD.A0 GPIO24
GPIO10 LCD.SDA 19 | | 20 GND
GPIO09 21 | | 22 LCD.RST GPIO25
GPIO11 LCD.SCK 23 | | 24 LCD.CS GPIO08
GND ENC1.GND 25 | | 26 GPIO07
ID_SD0 * 27 | | 28 * ID_SC1
GPIO05 ENC2.A 29 | | 30 FAN.GND GND
GPIO06 ENC2.B 31 | | 32 FAN.PWM GPIO12
GPIO13 ENC2.SW 33 | | 34 LED.GND GND
GPIO19 SPI1_MISO 35 | | 36 GPIO16
GPIO26 37 | | 38 LED.DI GPIO20
GND ENC2.GND 39 | | 40 SPI1_SCLK GPIO21

installation logicielle , j’ai décidé de me passer de carte SD sur le Raspberry et booter directement sur le SSD ( voir  article frambroise 314 )

j’ai fait 3 partions sur le hdd (/dev/sda1 vfat 100M , /dev/sda2 ext4 8Go , /dev/sda3  ext4 le reste du disque pour stockage des fichiers audios )
mon /etc/fstab

proc            /proc           proc    defaults          0       0
PARTUUID=0c9f0562-01  /boot           vfat    defaults          0       2
PARTUUID=0c9f0562-02  /               ext4    defaults,noatime  0       1
PARTUUID=0c9f0562-03  /var/lib/mpd    ext4    defaults,noatime  0       1

une fois raspbian lite installé et le raspberry pi en route on commence a installer les paquets nécessaire :

sudo apt install python3-pygame python-pygame python-spidev python3-spidev
sudo apt install mpd python-pip python3-pip
sudo apt install evtest telnet samba lame flac faad vorbis-tools 
sudo apt install mc alsa-utils libmpdclient-dev cython

pip install python-uinput
pip install python-mpd2
pip3 install python-mpd2

fichier a créer / modifier

  • /etc/modprobe.d/fbtft.conf
options fbtft_device name=fb_ili9163 gpios=reset:25,dc:24,led:23 speed=40000000 rotate=90 bgr=1 custom=1 fps=60
  • /etc/modules-load.d/fbtft.conf
spi-bcm2835
fbtft_device
  • /etc/modules-load.d/RotaryKey.conf
uinput

logiciels a installer /compiler , je met tous dans /opt/scripts

cd /opt
mkdir scripts
cd /opt/scripts
  • Automatic library-wide shuffle for mpd ( gestion playlist aléatoire )
git clone https://github.com/joshkunz/ashuffle.git
cd ashuffle/
make
sudo make install
  • mpd Album Art
git clone https://github.com/jameh/mpd-album-art.git
cd mpd-album-art
sudo python3 setup.py install
  • gestion du clavier virtuel depuis les 2 encodeurs rotatifs
    • /opt/scripts/RadioKey.py ( script pour gerer le “clavier”) pour l’instant un seul encodeur géré UP,DOWN,ENTER
      #!/usr/bin/env python
      import RPi.GPIO as GPIO
      import uinput
      from time import sleep
      
      # version PCB
      pin_a1 = 37 #GPIO  13
      pin_b1 = 35 #GPIO  19
      pin_sw1= 33 #GPIO  26
      pin_a2 = 36 #GPIO  16
      pin_b2 = 38 #GPIO  20
      pin_sw2= 40 #GPIO  21
      
      GPIO.setmode(GPIO.BOARD)
      GPIO.setup(pin_a1,  GPIO.IN, pull_up_down=GPIO.PUD_UP)
      GPIO.setup(pin_b1,  GPIO.IN, pull_up_down=GPIO.PUD_UP)
      GPIO.setup(pin_sw1, GPIO.IN, pull_up_down=GPIO.PUD_UP)
      GPIO.setup(pin_a2,  GPIO.IN, pull_up_down=GPIO.PUD_UP)
      GPIO.setup(pin_b2,  GPIO.IN, pull_up_down=GPIO.PUD_UP)
      GPIO.setup(pin_sw2, GPIO.IN, pull_up_down=GPIO.PUD_UP)
      
      device = uinput.Device([uinput.KEY_UP, uinput.KEY_DOWN,uinput.KEY_ENTER,uinput.KEY_PLAYPAUSE,uinput.KEY_LEFT,uinput.KEY_RIGHT])
      seq_a1 = seq_b1 = seq_sw1=0
      seq_a2 = seq_b2 = seq_sw2=0
      
      def on_Sw(pin):
          sw = GPIO.input(pin_sw2)
          if sw == 0:
              device.emit_click(uinput.KEY_ENTER)
          sw = GPIO.input(pin_sw1)
          if sw == 0:
              device.emit_click(uinput.KEY_PLAYPAUSE)
      
      def on_edge1(pin):
          global seq_a1, seq_b1
          a1 = GPIO.input(pin_a1)
          b1 = GPIO.input(pin_b1)
          seq_a1 = ((seq_a1 << 1) | a1) & 0b1111
          seq_b1 = ((seq_b1 << 1) | b1) & 0b1111
          if seq_a1 == 0b0011 and seq_b1 == 0b1001:
              device.emit_click(uinput.KEY_UP)
          elif seq_a1 == 0b1001 and seq_b1 == 0b0011:
              device.emit_click(uinput.KEY_DOWN)
      
      def on_edge2(pin):
          global seq_a2, seq_b2
          a2 = GPIO.input(pin_a2)
          b2 = GPIO.input(pin_b2)
          seq_a2 = ((seq_a2 << 1) | a2) & 0b1111
          seq_b2 = ((seq_b2 << 1) | b2) & 0b1111
          if seq_a2 == 0b0011 and seq_b2 == 0b1001:
              device.emit_click(uinput.KEY_LEFT)
          elif seq_a2 == 0b1001 and seq_b2 == 0b0011:
              device.emit_click(uinput.KEY_RIGHT)
      
      GPIO.add_event_detect(pin_a1,  GPIO.BOTH, callback=on_edge1)
      GPIO.add_event_detect(pin_b1,  GPIO.BOTH, callback=on_edge1)
      GPIO.add_event_detect(pin_a2,  GPIO.BOTH, callback=on_edge2)
      GPIO.add_event_detect(pin_b2,  GPIO.BOTH, callback=on_edge2)
      GPIO.add_event_detect(pin_sw1, GPIO.BOTH, callback=on_Sw)
      GPIO.add_event_detect(pin_sw2, GPIO.BOTH, callback=on_Sw)
      
      try:
          while True:
              sleep(300)
      except KeyboardInterrupt:
          GPIO.cleanup()
      

       

    • Service RadioKey ( deamon clavier ) : /etc/systemd/system/RadioKey.service
      [Unit]
      Description=Python start + foreground + keyboard input.
      Requires=multi-user.target
      After=multi-user.target rc-local.service
      AllowIsolate=yes
      
      [Service]
      Type=simple
      ExecStart=/usr/bin/python /opt/scripts/RadioKey.py
      
      [Install]
      WantedBy=multi-user.target
    • activation du service
      systemctl daemon-reload
      service RadioKey start
      
    • test du clavier virtuel
  • script au démarrage qui affiche l’IP du pi sur l’afficheur 128×128 ( /opt/scripts/ip.py) pendant 10 secondes
    #!/usr/bin/env python
    import os
    import sys
    import time
    import pygame
    import socket
    
    def get_ip_address():
     ip_address = '';
     s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
     try:
         s.connect(("8.8.8.8",80))
         ip_address = s.getsockname()[0]
         s.close()
         return ip_address
     except socket.error, msg:
         return "0.0.0.0"
    os.environ["SDL_FBDEV"] = "/dev/fb1"
    os.environ['SDL_VIDEODRIVER']="fbcon"
    mapMask= pygame.image.load("/home/pi/mask.png")
    
    def displaytext(text,size,line,color,clearscreen):
        if clearscreen:
            screen.fill((255,0,0))
    
        font = pygame.font.Font(None,size)
        text = font.render(text,0,color)
        rotated = pygame.transform.rotate(text,0)
        textpos = rotated.get_rect()
        textpos.centerx = 64
        textpos.centery = 64
        screen.blit(rotated,textpos)
    
    def main():
        global screen
        pygame.init()
        pygame.mouse.set_visible(0)
        size = width,height = 128,128
        screen = pygame.display.set_mode(size)
        str=get_ip_address() 
        displaytext( str,26,1,(255,255,255),True)
        screen.blit(mapMask, (0,0))
        pygame.display.flip()
        time.sleep(10)
        pygame.quit()
        exit()
    if __name__ == '__main__':
        main()
    
  • interface web pour playlist (https://www.ympd.org/ )
    cd /opt/scripts
    wget https://www.ympd.org/downloads/ympd-1.2.3-armhf.tar.bz2
    tar -xvf ympd-1.2.3-armhf.tar.bz2
    sudo ./ympd --webport 80
  • partage dossier réseau ( /etc/samba/smb.conf )
    #======================= Global Settings =======================
    [global]
       workgroup = WORKGROUP
       dns proxy = no
       log file = /var/log/samba/log.%m
       max log size = 1000
       syslog = 0
       panic action = /usr/share/samba/panic-action %d
       server role = standalone server
       passdb backend = tdbsam
       obey pam restrictions = yes
       unix password sync = yes
       passwd program = /usr/bin/passwd %u
       passwd chat = *Enter\snew\s*\spassword:* %n\n *Retype\snew\s*\spassword:* %n\n *password\supdated\ssuccessfully* .
       pam password change = yes
       map to guest = bad user
       usershare allow guests = yes
    
    #======================= Share Definitions =======================
    [home]
       browseable = yes
       create mask = 0700
       directory mask = 0700
       guest ok = yes
       path = /home/pi
       force user =  pi
       force group = pi
       read only = No
    
    [scripts]
       browseable = yes
       create mask = 0700
       directory mask = 0700
       guest ok = yes
       path = /opt/scripts
       force user =  pi
       force group = pi
       read only = No
    
    [Media]
       browseable = yes
       create mask = 0700
       directory mask = 0700
       guest ok = yes
       path = /var/lib/mpd/
       force user =  mpd
       force group = audio
       read only = No
    
    

     

  • gestion de led RGB ws2812 , pour cela on va activer le 2eme port SPI ( raspberry pi 3
    dans /boot/config.txt ajouter/modifier

    spidev.bufsiz=32768
    dtoverlay=spi1-1cs
    

    ensuite on vas ajouter py-spidev et  ws2812-spi

    sudo apt install python-spidev python3-spidev
    
    cd /opt/scripts
    git clone https://github.com/doceme/py-spidev.git
    cd py-spidev
    make
    make install
    
    cd /opt/scripts
    git clone https://github.com/joosteto/ws2812-spi.git
    cd ws2812-spi
    

    en fonction du Pi utilisé il faut modifier le fichier ws2812.py , dans def write2812_numpy4(spi,data): commenter toutes les lignes spi.xfer  et de-commenter celle ci : spi.xfer(tx.tolist(), int(4/.55e-6))
    ensuite

    sudo python setup.py install

    on vas tester le bandeau :

    cd /opt/scripts
    nano loop.py

    dans mon cas il y auras 20 led RGB ws2812 donc :

    import spidev
    import ws2812
    import time
    import getopt
    
    def test_loop(spi, nLED=8, intensity=20):
        stepTime=0.1
        iStep=0
        while True:
            d=[[0,0,0]]*nLED
            d[iStep%nLED]=[intensity]*3
            ws2812.write2812(spi, d)
            iStep=(iStep+1)%nLED
            time.sleep(stepTime)
    
    if __name__=="__main__":
        spi = spidev.SpiDev()
        spi.open(1,0)
    
        test_loop(spi, nLED=20)
    

    puis python loop.py

  • (en cours de dev …….)  gestion du bandeau lumineux en fonction de la musique ( basé sur https://github.com/nvbn/soundlights)
    cd /opt/scripts
    git clone https://github.com/nvbn/soundlights.git
    ./autogen.sh
    ./configure
    make
    sudo make install
    création du fichier de config : nano /opt/scripts/config.led :
    [general]
    mode = normal
    framerate = 60
    bars = 20
    
    [input]
    method = fifo
    source = /tmp/mpd.fifo
    
    [output]
    method =raw
    channels = stereo
    bit_format = 8bit
    
    [eq]
    1=2
    2=2
    3=1
    4=1
    5=0.5
    

    fichier /opt/scripts/soundlights.py

    import sys
    import time
    import spidev
    import ws2812
    
    COLORS_COUNT = 255
    nLED=20
    spi = spidev.SpiDev() 
    spi.open(1,0)
    d=[(0,0,0)]*nLED
    ws2812.write2812(spi, d)
    
    def _get_spaced_colors(n):
        max_value = 4144959
        interval = int(max_value / n)
        colors = [hex(i)[2:].zfill(6) for i in range(0, max_value, interval)]
        return [ (int(i[:2], 16), int(i[2:4], 16), int(i[4:], 16)) for i in colors]
    
    def _handle_stdin(colors,d):
        while True:
            try:
                ws2812.write2812(spi, colors)
            except Exception as e:
                print e
    
    if __name__ == '__main__':
        _handle_stdin(_get_spaced_colors(COLORS_COUNT),d)
    

    puis on teste en lançant :

    cava -p config.led | python soundlights.py

     

  • version alpha partie affichage covertArt piste en cours et passer piste suivante/précédente
    #!/usr/bin/python3
    # -*- coding: utf-8 -*-
    import pygame
    import math
    import os
    import time
    import sys
    import mpd_album_art
    from mpd import (MPDClient, CommandError)
    
    # ecran TFT en /dev/fb1
    os.putenv("SDL_VIDEODRIVER", "fbcon")
    os.environ["SDL_FBDEV"] = "/dev/fb1"
    
    # pour daemon mpd
    HOST = 'localhost'
    PORT = '6600'
    CON_ID = {'host':HOST, 'port':PORT}
    def mpdConnect(client, con_id):
        try:
            client.connect(**con_id)
        except:
            return False
        return True
    
    #maj covertArt
    def update_folder(client,pygame,window):
        status = client.status()
        now_playing = client.currentsong()
        print ('file    : ' + now_playing.get('file'))
    # chercher coverart et lien vers "/home/pi/.covers/current"
        grabber = mpd_album_art.Grabber(
            save_dir="/home/pi/.covers", 
            library_dir="/var/lib/mpd/music"
            )
        grabber.get_local_art(now_playing)
    # maj affichage
        mapImg = pygame.image.load("/home/pi/.covers/current")
        mapImg = pygame.transform.scale(mapImg, (128, 128))
        mapMask= pygame.image.load("/home/pi/mask.png") # masque pour faire la forme de "l’œil magique"
        window.blit(mapImg, (0,0)) #<<will not blit
        window.blit(mapMask, (0,0))
        pygame.display.update() # solution: you forgot this...
    
    def main():
    # on se connecte au daemon mpd
        client = MPDClient()
        if mpdConnect(client, CON_ID):
            print('Got connected!')
        else:
            print('fail to connect MPD server.')
            sys.exit(1)
        elapsed=0.00
    # init pygame /  afficheur
        pygame.display.init()
        pygame.mouse.set_visible(0)
        window = pygame.display.set_mode((128, 128))
        pygame.event.clear()
        window.fill((0,0,0))
    # affiche coverArt piste en cours
        update_folder(client,pygame,window)
        while True:
            status = client.status()
    #  test si temp_lecture < temp_lecture precedent pour detecter nouvelle piste
            if (elapsed < float(status.get('elapsed', 0))): # non , meme piste rien a faire
                elapsed=float(status.get('elapsed', 0))
            else:                                           # oui , nouvelle piste raz temp_lecture et maj covertArt
                elapsed=float(status.get('elapsed', 0))
    #            print ( status.get('elapsed', 0))
                now_playing = client.currentsong()
                update_folder(client,pygame,window)
                #print ('file    : ' + now_playing.get('file'))
            time.sleep(1)
    
    	# check si piste 
            event = pygame.event.poll() #wait()
    # regarde si evemnent clavier (encodeur rotatif)
            if event.type==pygame.KEYDOWN:
                if event.key==pygame.K_RETURN: # pour l'instant arret soft , a terme play/pause
                    pygame.quit()
                    client.disconnect()
                    sys.exit(0)
                if event.key==pygame.K_UP: # piste suivante
                    client.next()
                    pygame.event.clear()
    		#time.sleep(1)
                    elapsed=0
                    update_folder(client,pygame,window)
                if event.key==pygame.K_DOWN: # piste precedente
                    client.previous()
                    pygame.event.clear()
    		#time.sleep(1)
                    elapsed=0
                    update_folder(client,pygame,window)
    
    if __name__ == "__main__":
        main()
    

     

pour l’instant partie “mécanique” finis à 90¨% , et partie Electronique / dev finis a 70%

lorsque le soft seras terminé a 100% , je mettrais dispo les sources de tous les fichiers/scripts utilisés

la suite bientôt ……..

Articles qui m’on servis pour développer
https://github.com/petervflocke/rotaryencoder_rpi
https://www.instructables.com/id/PWM-Regulated-Fan-Based-on-CPU-Temperature-for-Ras/
https://www.pihomeserver.fr/2014/03/08/raspberry-pi-home-server-ajouter-une-horloge-rtc-ds1307-sur-le-bus-i2c/
http://blog.gegg.us/2017/01/setting-up-a-gpio-button-keyboard-on-a-raspberry-pi/
https://blog.oddbit.com/2019/01/19/pipower-a-raspberry-pi-ups/https://github.com/joshkunz/ashuffle
https://github.com/joosteto/ws2812-spi
https://github.com/nvbn/soundlights

 

Catégorie : Hardware, Software | Commentaires fermés sur RadioPi
décembre 25

Serveur Domoticz pour TD/TP en BTS SN

But: monter un serveur Domoticz avec des modules sonoff a base de esp8266 pour faire des TD / TP en BTS SN ( ancien BTS Electronique ).
le Raspberry communique avec les modules sonoff avec un réseau wifi séparé du réseau local.
Matériel nécessaire :
– Un Raspberry PI 3 ( ou un autre avec dongle wifi ) avec carte SD de 8Go ( actuellement ~3.5Go utilisé )
– Un écran 7″ officiel tactile pour le Raspberry pi ( optionnel )
– plusieurs modules “SonOff” pour la partie purement Domotique ( attention présence de tension secteur 220v )

le tuto est découpée en plusieurs parties a suivre dans l’ordre
-Installation du Raspberry PI
-Début du paramétrage
-Installation de Node-Red
-Installation de Webmin
-Hotspot Wifi et DHCP
-Serveur Web nginx
-Installation phpmyadmin depuis les sources
-Configuration de Samba
-Installation de eZServerMonitor
-l’ecran 7″ tactile officiel du Rapsberry pi
-Test divers
-Mise à jour de domoticz par tache cron ( Optionel )
-Sauvegarde des bases de données SQL

Partie 1 ) Installation du Raspberry PI
On récupère l’image “raspbian lite” sur https://www.raspberrypi.org/downloads/raspbian/
Une fois l’image récupérée on va la copier sur la carte SD , avec Win32diskimage ou autre logiciel
On accède a la partition FAT32 de la carte SD et on crée un fichier texte que l’on appelle ssh , cela activera le serveur ssh du Pi au démarrage
On met la carte SD dans le Raspberry et on démarre le système , si l’écran est branché on peux suivre le processus , sinon attendre environ 5mn
On Scanne son réseau avec un utilitaire ( dans mon cas Angry Ip Scanner => http://angryip.org/ ) pour trouver l’adresse du PI
on se connecte en SSH ( utilisateur: pi , mot de passe: raspberry )

Dans le reste du Tuto lorsqu’il y a des lignes de commandes, celles commençant par $ sont lancées avec l’utilisateur pi et celles commençant par # par l’utilisateur root ( ne pas taper $ ou # lors des commandes ). et lorsque dans les lignes de commandes si en fin de ligne il y a \ cela veux dire que la commande continue sur la ligne suivante il faut tous taper sur une seule ligne et de pas mettre le \ .
quand je dis on edite le fichier x , cela veux dire : sudo nano x

 

on vas changer locale , timezone , key, wifi

$sudo raspi-config

on vas changer le mot de passe du compte root => “Domotic”

$sudo passwd root

Mise a jour kernel & firmware

$sudo rpi-update

Une fois a jour on reboot et on enlève l’ancien firmware (4.14.34 dans mon cas ) , faire ls -al /lib/modules pour voir les versions installées . on peux meme enlever celui qui ne se termine pas pas v7+

$sudo rm -fr /lib/modules/4.14.34*

on met a jour les paquets

$sudo apt-get clean 
$sudo apt-get autoclean 
$sudo apt-get update
$sudo apt-get upgrade -y
$sudo apt-get dist-upgrade -y
$sudo reboot

on commence a installer tous ce que l’on a besoin on paramétreras ça plus tard

sudo apt-get install cmake make gcc g++ git libcurl4-openssl-dev libusb-dev python3-dev libcurl4-openssl-dev libssl1.0-dev \
 python-rpi.gpio f2fs-tools mosquitto-clients mosquitto dnsmasq hostapd ntp nginx php7.0-fpm php-apcu php7.0-mysql php7.0-curl \
 php7.0-gd php7.0-intl php-pear php-imagick php7.0-imap php7.0-mcrypt php-memcache php7.0-pspell php7.0-recode php7.0-sqlite3 \
 php7.0-tidy php7.0-xmlrpc php7.0-xsl php7.0-mbstring php-gettext mariadb-server samba perl libnet-ssleay-perl openssl nscd \
 libauthen-pam-perl libpam-runtime libio-pty-perl apt-show-versions python x11-xserver-utils xinit xserver-xorg matchbox-window-manager \
 unclutter firefox-esr-l10n-fr firefox-esr xdotool libboost-dev libboost-thread-dev libboost-system-dev libudev-dev xterm \
 automysqlbackup resolvconf avahi-utils avahi-daemon

un petit reboot et on vas commencer le paramétrage

 

Partie 2 ) Début du paramétrage

on vas autoriser tous les utilisateur a lancer le serveur graphique

$sudo dpkg-reconfigure xserver-xorg-legacy

on vas sécuriser les bases SQL ( Domotic en mdp , supprimer les bases test , autoriser le remote …)
Remove anonymous users? => Y
Disallow root login remotely? => N
Remove test database and access to it? => Y

$sudo mysql_secure_installation
$echo "update mysql.user set plugin = 'mysql_native_password' where user='root';" | sudo mysql -u root -p  

maintenant on vas installer  Domoticz. Plus besoin d’installer les sources et de compiler

$sudo curl -L install.domoticz.com | bash

en réseau local pas besoin de IPV6 , on vas le desactiver  , editer /etc/sysctl.conf et ajouter a la fin :

# désactivation de ipv6 pour toutes les interfaces
net.ipv6.conf.all.disable_ipv6 = 1
# désactivation de l’auto configuration pour toutes les interfaces
net.ipv6.conf.all.autoconf = 0
# désactivation de ipv6 pour les nouvelles interfaces (ex:si ajout de carte réseau)
net.ipv6.conf.default.disable_ipv6 = 1
# désactivation de l’auto configuration pour les nouvelles interfaces
net.ipv6.conf.default.autoconf = 0

on actualise

$sudo sysctl -p

Partie 3 ) Installation de Node-Red 

$cd
$bash <(curl -sL https://raw.githubusercontent.com/node-red/raspbian-deb-package/master/resources/update-nodejs-and-nodered)
$sudo systemctl enable nodered.service
$sudo service nodered restart

Partie 4 ) Installation de Webmin

$cd /tmp
$sudo wget http://prdownloads.sourceforge.net/webadmin/webmin_1.881_all.deb
$sudo dpkg -i webmin_1.881_all.deb

on editer /etc/webmin/miniserv.conf , et changer ssl=1 en ssl=0

$sudo service webmin restart

se connecter sur la page de webmin http://ip_du_pi:1000 ( user: root , mdp : Domotic)
passer webmin en Francais : menu webmin , Configuration de Webmin , langue
télécharger le module de gestion de nginx sur https://www.justindhoffman.com/sites/justindhoffman.com/files/nginx-0.10.wbm_.gz
ajouter le module dans webmin : menu webmin , Configuration de Webmin , modules webmin ,

Partie 5 ) Hotspot Wifi et DHCP

$sudo nano /etc/dhcpcd.conf

ajouter a la fin: le PI chercheras un dhcp sur son interface filaire , mais pour la partie wifi c’est lui qui serat serveur DHCP

denyinterfaces wlan0

on attaque la partie hotspot en éditant  /etc/hostapd/hostapd.conf
si vous voulez changer le code wifi ou le ssid c’est le moment

driver=nl80211
ctrl_interface=/var/run/hostapd
ctrl_interface_group=0
beacon_int=100
auth_algs=1
wpa_key_mgmt=WPA-PSK
ssid=Domo-Jules
channel=6
hw_mode=g
wpa_passphrase=Domoticz_Jules
interface=wlan0
wpa=2
wpa_pairwise=TKIP
country_code=FR

le PI vas aussi servir de serveur DNS pour le reseau Wifi , on edite  /etc/hosts

127.0.0.1       localhost
127.0.1.1       raspberrypi

192.168.254.1    domo.home www.domo.home
192.168.254.1    sql.domo.home www.sql.domo.home
192.168.254.1    webmin.domo.home www.webmin.domo.home
192.168.254.1    nofuss.domo.home www.nofuss.domo.home
192.168.254.1    node.domo.home www.node.domo.home
192.168.254.1    status.domo.homewww.status.domo.home
192.168.254.1    system.domo.home www.system.domo.home

config serveur dhcp sur wlan0 bloc adr de 192.168.254.10 -> 192.168.254.200 . On vas forcer l’ip de wlan0 ,  on édite  /etc/network/interfaces
et ajouter :

auto lo
iface lo inet loopback

allow-hotplug eth0
iface eth0 inet dhcp

allow-hotplug wlan0
iface wlan0 inet static
    address 192.168.254.1
    netmask 255.255.255.0
    network 192.168.254.0
    broadcast 192.168.254.255

partie serveur dhcp

$sudo rm /etc/dnsmasq.conf
$sudo nano /etc/dnsmasq.conf
interface=wlan0      # Use interface wlan0
#no-resolv
no-poll

listen-address=192.168.254.1 # Explicitly specify the address to listen on
bind-interfaces      # Bind to the interface to make sure we aren't sending things elsewhere
server=8.8.8.8       # Forward DNS requests to Google DNS
server=192.168.254.1 # 
domain-needed        # Don't forward short names
bogus-priv           # Never forward addresses in the non-routed address spaces.
addn-hosts=/etc/dnsmasq_static_hosts.conf

# Assign IP addresses between 192.168.254.10 and 192.168.254.200 with a 12 hour lease time
dhcp-range=192.168.254.10,192.168.254.200,12h

# force appariel adr mac b4:7c:9c:fe:11:50 => IP 192.168.254.201
dhcp-host=b4:7c:9c:fe:11:50,192.168.254.201

Editez /etc/default/hostapd , ajouter :

DAEMON_CONF="/etc/hostapd/hostapd.conf"

dans /etc/sysctl.conf ajouter

net.ipv4.ip_forward=1

le Pi vas servir de serveur ntp (time) pour les modules domotiques sonoff , on édite /etc/ntp.conf et on ajoute

restrict 192.168.254.0 mask 255.255.255.0
broadcast 192.168.254.255
broadcast 224.0.1.1
$sudo service hostapd start  
$sudo service dnsmasq start  

 

Partie 6 ) Serveur Web nginx

Au lieu d’utiliser Apache en serveur Web on vas utiliser nginx ( moins gourmand en mémoire) , ne gérant pas l’activation / désactivation des sites virtuels comme apache on vas creer un fichier nginx_modsite et le rendre executable

$sudo nano /usr/bin/nginx_modsite
$chmod +x /usr/bin/nginx_modsite

contenu de nginx_modsite

#!/bin/bash

##
#  File:
#    nginx_modsite
#  Description:
#    Provides a basic script to automate enabling and disabling websites found
#    in the default configuration directories:
#      /etc/nginx/sites-available and /etc/nginx/sites-enabled
#    For easy access to this script, copy it into the directory:
#      /usr/local/sbin
#    Run this script without any arguments or with -h or --help to see a basic
#    help dialog displaying all options.
##

# Copyright (C) 2010 Michael Lustfield <mtecknology@ubuntu.com>

# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
# 1. Redistributions of source code must retain the above copyright
#    notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
#    notice, this list of conditions and the following disclaimer in the
#    documentation and/or other materials provided with the distribution.
#
# THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED.  IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
# SUCH DAMAGE.

##
# Default Settings
##

NGINX_CONF_FILE="$(awk -F= -v RS=' ' '/conf-path/ {print $2}' <<< $(nginx -V 2>&1))"
NGINX_CONF_DIR="${NGINX_CONF_FILE%/*}"
NGINX_SITES_AVAILABLE="$NGINX_CONF_DIR/sites-available"
NGINX_SITES_ENABLED="$NGINX_CONF_DIR/sites-enabled"
SELECTED_SITE="$2"

##
# Script Functions
##

ngx_enable_site() {
    [[ ! "$SELECTED_SITE" ]] &&
        ngx_select_site "not_enabled"

    [[ ! -e "$NGINX_SITES_AVAILABLE/$SELECTED_SITE" ]] && 
        ngx_error "Site does not appear to exist."
    [[ -e "$NGINX_SITES_ENABLED/$SELECTED_SITE" ]] &&
        ngx_error "Site appears to already be enabled"

    ln -sf "$NGINX_SITES_AVAILABLE/$SELECTED_SITE" -T "$NGINX_SITES_ENABLED/$SELECTED_SITE"
    ngx_reload
}

ngx_disable_site() {
    [[ ! "$SELECTED_SITE" ]] &&
        ngx_select_site "is_enabled"

    [[ ! -e "$NGINX_SITES_AVAILABLE/$SELECTED_SITE" ]] &&
        ngx_error "Site does not appear to be \'available\'. - Not Removing"
    [[ ! -e "$NGINX_SITES_ENABLED/$SELECTED_SITE" ]] &&
        ngx_error "Site does not appear to be enabled."

    rm -f "$NGINX_SITES_ENABLED/$SELECTED_SITE"
    ngx_reload
}

ngx_list_site() {
    echo "Available sites:"
    ngx_sites "available"
    echo "Enabled Sites"
    ngx_sites "enabled"
}

##
# Helper Functions
##

ngx_select_site() {
    sites_avail=($NGINX_SITES_AVAILABLE/*)
    sa="${sites_avail[@]##*/}"
    sites_en=($NGINX_SITES_ENABLED/*)
    se="${sites_en[@]##*/}"

    case "$1" in
        not_enabled) sites=$(comm -13 <(printf "%s\n" $se) <(printf "%s\n" $sa));;
        is_enabled) sites=$(comm -12 <(printf "%s\n" $se) <(printf "%s\n" $sa));;
    esac

    ngx_prompt "$sites"
}

ngx_prompt() {
    sites=($1)
    i=0

    echo "SELECT A WEBSITE:"
    for site in ${sites[@]}; do
        echo -e "$i:\t${sites[$i]}"
        ((i++))
    done

    read -p "Enter number for website: " i
    SELECTED_SITE="${sites[$i]}"
}

ngx_sites() {
    case "$1" in
        available) dir="$NGINX_SITES_AVAILABLE";;
        enabled) dir="$NGINX_SITES_ENABLED";;
    esac

    for file in $dir/*; do
        echo -e "\t${file#*$dir/}"
    done
}

ngx_reload() {
    read -p "Would you like to reload the Nginx configuration now? (Y/n) " reload
    [[ "$reload" != "n" && "$reload" != "N" ]] && invoke-rc.d nginx reload
}

ngx_error() {
    echo -e "${0##*/}: ERROR: $1"
    [[ "$2" ]] && ngx_help
    exit 1
}

ngx_help() {
    echo "Usage: ${0##*/} [options]"
    echo "Options:"
    echo -e "\t<-e|--enable> \tEnable site"
    echo -e "\t<-d|--disable> \tDisable site"
    echo -e "\t<-l|--list>\t\tList sites"
    echo -e "\t<-h|--help>\t\tDisplay help"
    echo -e "\n\tIf  is left out a selection of options will be presented."
    echo -e "\tIt is assumed you are using the default sites-enabled and"
    echo -e "\tsites-disabled located at $NGINX_CONF_DIR."
}

##
# Core Piece
##

case "$1" in
    -e|--enable)    ngx_enable_site;;
    -d|--disable)   ngx_disable_site;;
    -l|--list)  ngx_list_site;;
    -h|--help)  ngx_help;;
    *)      ngx_error "No Options Selected" 1; ngx_help;;
esac

on vas supprimer les config par defaut de nginx

$sudo rm /etc/nginx/sites-available/default et /etc/nginx/sites-enabled/default

on vas créer tous les fichiers de config nginx

$cd /etc/nginx/sites-available
$sudo nano 0000-default 
$sudo nano domo.home 
$sudo nano node.home
$sudo nano nofuss.home
$sudo nano sql.home
$sudo nano status.home
$sudo nano system.home
$sudo nano webmin.home

contenu de 0000-default

server {
    listen 80 default;
    server_name _;
        access_log  /var/log/nginx/access.log ;
        error_log   /var/log/nginx/error.log;
uninitialized_variable_warn off;
root           /var/www/;
    location / {
        autoindex on;
        index  index.php index.html index.htm;
    }
    location ~ /\.ht {
        deny  all;
    }
 location ~ \.php$ {
 include snippets/fastcgi-php.conf;
    fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
 }
  location /php_status {
    fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
    fastcgi_param SCRIPT_FILENAME $fastcgi_script_name;
    include fastcgi_params;
    allow 127.0.0.1;
    deny all;
  }
}

contenu de domo.home

server {
        listen   80;
        server_name  domo.home www.domo.home;
        access_log  /var/log/nginx/domo.home_access.log;
        error_log   /var/log/nginx/domo.home_error.log;
uninitialized_variable_warn off;
  location / {
        proxy_pass http://localhost:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        }
}

contenu de node.home

server {
  listen 80;
  server_name node.domo.home www.node.domo.home;
        access_log  /var/log/nginx/node.domo.home_access.log;
        error_log   /var/log/nginx/node.domo.home_error.log;
  location / {
        proxy_pass http://localhost:1880;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        }
}

contenu de nofuss.home

server {
        listen   80;
        server_name  nofuss.domo.home www.nofuss.domo.home;
        access_log  /var/log/nginx/nofuss.domo.home_access.log;
        error_log   /var/log/nginx/nofuss.domo.home_error.log;
        uninitialized_variable_warn off;
        root   /var/www/nofuss.domo.home/;
    location / {
        root   /var/www/nofuss.domo.home/;
        autoindex on;
        index  index.php index.html index.htm;
    }
    location ~ /\.ht {
        deny  all;
    }
 location ~ \.php$ {
 include snippets/fastcgi-php.conf;
 fastcgi_pass unix:/run/php/php7.0-fpm.sock;
 }
}

contenu de sql.home

server {
        listen   80;
        server_name  sql.domo.home www.sql.domo.home;
        access_log  /var/log/nginx/sql.domo.home_access.log;
        error_log   /var/log/nginx/sql.domo.home_error.log;
uninitialized_variable_warn off;
root /usr/share/phpmyadmin/;
   location / {
           index  index.php;
       }
       ## Images and static content is treated different
       location ~* ^.+.(jpg|jpeg|gif|css|png|js|ico|xml)$ {
           access_log        off;
           expires           360d;
       }
       location ~ /\.ht {
           deny  all;
       }
       location ~ /(libraries|setup/frames|setup/libs) {
           deny all;
           return 404;
}
    location ~ \.php$ {
        fastcgi_pass unix:/run/php/php7.0-fpm.sock;
        fastcgi_split_path_info ^(.+\.php)(/.*)$;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME /usr/share/phpmyadmin$fastcgi_script_name;
        fastcgi_param  HTTPS off;
    }
}

contenu de status.home

server {
        listen   80;
        server_name  status.domo.home www.status.domo.home;
        access_log  /var/log/nginx/status.domo.home_access.log;
        error_log   /var/log/nginx/status.domo.home_error.log;
        uninitialized_variable_warn off;
        root   /var/www/eZServerMonitor-2.5/;
    location / {
        autoindex on;
        index  index.php index.html index.htm;
    }
    location ~ /\.ht {
        deny  all;
    }
 location ~ \.php$ {
 include snippets/fastcgi-php.conf;
 fastcgi_pass unix:/run/php/php7.0-fpm.sock;
 }
}

contenu de system.home

server {
        listen   80;
        server_name  system.domo.home www.system.domo.home;
        access_log  /var/log/nginx/system.domo.home_access.log;
        error_log   /var/log/nginx/system.domo.home_error.log;
        uninitialized_variable_warn off;
        root   /var/www/system/;
    location / {
        autoindex on;
        index  index.php index.html index.htm;
    }
    location ~ /\.ht {
        deny  all;
    }
 location ~ \.php$ {
 include snippets/fastcgi-php.conf;
 fastcgi_pass unix:/run/php/php7.0-fpm.sock;
 }
}

contenu de webmin.home

server {
  listen 80;
  server_name webmin.domo.home www.webmin.domo.home;
                access_log off;
                error_log off;
  location / {
                proxy_pass      http://127.0.0.1:10000;
                proxy_redirect  off;

                #Proxy Settings
                proxy_redirect     off;
                proxy_set_header   Host             $host:$server_port;
                proxy_set_header   X-Real-IP        $remote_addr;
                proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;

                proxy_max_temp_file_size 0;
                proxy_connect_timeout      90;
                proxy_send_timeout         90;
                proxy_read_timeout         90;
                proxy_buffer_size          128k;
                proxy_buffers              32 32k;
                proxy_busy_buffers_size    256k;
                proxy_temp_file_write_size 256k;
        }
}

maintenant on active les sites

$sudo nginx_modsite -e 0000-default
$sudo nginx_modsite -e domo.home
$sudo nginx_modsite -e node.home
$sudo nginx_modsite -e nofuss.home
$sudo nginx_modsite -e sql.home
$sudo nginx_modsite -e tatus.home
$sudo nginx_modsite -e system.home
$sudo nginx_modsite -e webmin.home

on vérifie les sites avec : $sudo nginx_modsite -l
On ne redémarre pas encore nginx car pas encore installés les différents sites

Available sites:
 0000-default
 domo.home
 node.home
 nofuss.home
 sql.home
 status.home
 system.home
 webmin.home
Enabled Sites
 0000-default
 domo.home
 node.home
 nofuss.home
 sql.home
 status.home
 system.home
 webmin.home

 Partie 7 ) Installation phpmyadmin depuis les sources (version 4.8.1 au 2018/05/27)

$cd /tmp
$wget https://files.phpmyadmin.net/phpMyAdmin/4.8.1/phpMyAdmin-4.8.1-all-languages.tar.gz
$tar -zxvf phpMyAdmin-4.8.1-all-languages.tar.gz
$sudo mv phpMyAdmin-4.8.1-all-languages    /usr/share/phpmyadmin
sudo cd /usr/share/phpmyadmin
$sudo cp config.sample.inc.php config.inc.php
$sudo phpenmod mcrypt
$sudo phpenmod mbstring
$sudo systemctl restart php7.0-fpm

pour accéder a phpmyadmin en root , on édite /etc/mysql/mariadb.conf.d/50-server.cnf et ajouter apres bind-address = 127.0.0.1

sql-mode="NO_ENGINE_SUBSTITUTION"

on édite /etc/mysql/debian.cnf et on met le mot de passe sql  (Domotic) puis on lance :

$echo "update mysql.user set plugin = 'mysql_native_password' where user='root';" | sudo mysql -u root -p
$sudo cp /usr/share/phpmyadmin/config.sample.inc.php /usr/share/phpmyadmin/config.inc.php

on édite /usr/share/phpmyadmin/config.inc.php

modifier:
$cfg['blowfish_secret'] =>mettre n'importe quoi (32cars)
/* User used to manipulate with storage */
$cfg['Servers'][$i]['controlhost'] = '';
$cfg['Servers'][$i]['controluser'] = 'root';
$cfg['Servers'][$i]['controlpass'] = 'Domotic';  => mdp SQL

on relance le service sql

$sudo service mysql restart

 

 Partie 8 ) Configuration de Samba

$sudo rm -fr /etc/samba/smb.conf
$sudo nano /etc/samba/smb.conf

on vas créer 3 partages : [Web] => /var/www/ , [Home] => /home/pi/ , [Logs] => /var/log/
contenu de smb.conf

#======================= Global Settings =======================
[global]
   workgroup = WORKGROUP
#   wins support = no
   dns proxy = no

#### Networking ####
;   interfaces = 127.0.0.0/8 eth0
;   bind interfaces only = yes

#### Debugging/Accounting ####
   log file = /var/log/samba/log.%m
   max log size = 1000
   syslog = 0
   panic action = /usr/share/samba/panic-action %d

####### Authentication #######
   server role = standalone server
   passdb backend = tdbsam
   obey pam restrictions = yes
   unix password sync = yes
   passwd program = /usr/bin/passwd %u
   passwd chat = *Enter\snew\s*\spassword:* %n\n *Retype\snew\s*\spassword:* %n\n *password\supdated\ssuccessfully* .
   pam password change = yes
   map to guest = bad user

########## Domains ###########

############ Misc ############
   usershare allow guests = yes
   
#======================= Share Definitions =======================
[Web]
        public = yes
        path = /var/www
        delete readonly = yes
        force group = www-data
        force user = www-data
        writeable = yes

[Home]
        delete readonly = yes
        path = /home/pi/
        public = yes
        writeable = yes
        force user = pi
        force group = pi

[Logs]
        delete readonly = yes
        path = /var/log
        public = yes
        writeable = yes
        force user = root
        force group = root

 

Partie 9 ) Installation de eZServerMonitor

$cd /var/www
$sudo wget https://www.ezservermonitor.com/esm-web/downloads/version/2.5
$sudo unzip 2.5
$sudo rm 2.5

On edite /var/www/eZServerMonitor-2.5/conf/esm.config.json , enlever la section ping dans services enlever email server , ftp et ajouter apres la section Web Server :

           {
                "name": "Webmin",
                "host": "localhost",
                "port": 10000,
                "protocol": "tcp"
            },
           {
                "name": "Node Red",
                "host": "localhost",
                "port": 1880,
                "protocol": "tcp"
            },

           {
                "name": "Domoticz",
                "host": "localhost",
                "port": 8080,
                "protocol": "tcp"
            },

 

Partie 10 ) l’ecran 7″ tactile officiel du Rapsberry PI ( optionnel  )

On vas lancer Firefox en plein écran au démarrage du PI

on Édite /boot/config.txt et on ajoute , a adapter en fonction de la position du PI

lcd_rotate=0

on vas forcer le paramétrage de Firefox

$cd
$mkdir -p .mozilla/firefox/profile.default
$nano .mozilla/firefox/profiles.ini

contenu de profiles.ini

[General]
StartWithLastProfile=1

[Profile0]
Name=default
IsRelative=1
Path=profile.default
Default=1

on vas éditer .bashrc pour forcer le lancement de firefox au démarrage du PI , a rajouter a la fin du .bashrc

# ne se lance que depuis le pi , pas en ssh a distance
if [ $(tty) == /dev/tty1 ]; then
xinit ./kiosk
fi

contenu de kiosk

#!/bin/sh
# disable DPMS (Energy Star) features.
xset -dpms
# disable screen saver
xset s off
# don't blank the video device
xset s noblank
# disable mouse pointer
unclutter &
# run window manager
matchbox-window-manager -use_cursor no -use_titlebar no  &
/usr/bin/firefox   -fullscreen

puis un chmod +x ./kiosk et on reboot le pi , normalement vas lancer firefox en plein ecran .
toujours en ssh faire : pkill firefox

$nano .mozilla/firefox/profile.default/prefs.js
et ajouter :
nano .mozilla/firefox/profile.default/prefs.js et ajouter :
user_pref("browser.startup.homepage", "http://domo.home");
user_pref("network.protocol-handler.warn-external.dnupdate", false);
user_pref("network.protocol-handler.warn-external.dnupdate", false);
user_pref("network.protocol-handler.warn-external.dnupdate", false);
user_pref("browser.sessionstore.resume_from_crash", false);
user_pref("browser.sessionstore.resume_session_once", true);

relancer le PI , maintenant le PI lance firefox au démarrage avec la page www.domo.home

 

Partie 11 ) Test divers 
se connecter sur le wifi du PI depuis une tablette ou un smartphone et tester les sites suivants :
domo.home,www.domo.home,  => Serveur Web Domoticz
sql.domo.home,www.sql.domo.home, => Admnistration des bases SQL
webmin.domo.home,www.webmin.domo.home, => Webmin pour configuration serveur
nofuss.domo.home,www.nofuss.domo.home, ** => Pour maj des firmware des modules SonOff en cours de Dev
node.domo.home,www.node.domo.home, => pour faire des Scripts en NodeRed
status.domo.loca,www.status.domo.home, => affichage status du PI , cpu , memoire , espace disque
system.domo.home,www.system.domo.home** => interface générale pour lancer les sites

** devrait sortir un message d’erreur pas pas encore de fichiers/dossiers crées

sur un PC windows en connexion filaire éditer le fichier C:\Windows\System32\drivers\etc et ajouter , en remplaçant 192.168.xxx.xxx par l’IP ‘filaire’ du PI

192.168.xxx.xxx domo.home www.domo.home
192.168.xxx.xxx sql.domo.home www.sql.domo.home
192.168.xxx.xxx webmin.domo.home www.webmin.domo.home
192.168.xxx.xxx nofuss.domo.home www.nofuss.domo.home
192.168.xxx.xxx node.domo.home www.node.domo.home
192.168.xxx.xxx status.domo.homewww.status.domo.home
192.168.xxx.xxx system.domo.home www.system.domo.home

 

Partie 12 ) Mise à jour de domoticz par tache cron ( Optionel )
mise a jour de domoticz automatique

$nano ~/domo_update
et tapez :
#!/bin/dash
cd /home/pi/domoticz
git pull
make
sudo service domoticz.sh restart

rendre le script exécutable et ajouter tache cron a 0h30 , 6h30 , 12h30 , 18h30,21h30

$chmod +x ~/domo_update

$crontab -e

et saisir :

30 0,6,12,18,21 * * * /home/pi/domo_update

 

Partie 13 ) Sauvegarde des bases de données SQL

script de sauvegarde des bases dans /opt/SAVE/sql ( daily latest monthly weekly )

$sudo mkdir -p /opt/SAVE/sql 
$sudo nano /etc/default/automysqlbackup

et changer :
SEPDIR=yes
BACKUPDIR="/opt/SAVE/sql"
LATEST=yes
DOWEEKLY=7

planification taches cron sauvegarde tous les soir a 22h30

$sudo crontab -e
et ajouter
30 22 * * * /usr/sbin/automysqlbackup

pour eviter le message “– Warning: Skipping the data of table mysql.event. Specify the –events option explicitly.”

$sudo nano /etc/mysql/conf.d/automysqlbackup.cnf

ensuite insérer le code suivant :

[mysqldump]
events
ignore-table = mysql.events

 

Partie 14 ) xxxxx

En cours d’éciture

Partie 15 ) xxxxx

En cours d’éciture

Conclusion ( provisoire )
Reste a faire les dossier /var/www/nofuss.domo.home et /var/www/system et pour ceux qui sont perdu  , un fichier .gz avec tous les fichiers conf modifiés pour injection directe dans le PI ( il faudras faire juste les parties 1,2,3 et 4 ) sera disponible très bientôt

 

Liens divers utilisée pour faire ce Tuto :

http://www.instructables.com/id/Raspberry-Pi-Web-Server-Nginx-PHP-MySql/
https://frillip.com/using-your-raspberry-pi-3-as-a-wifi-access-point-with-hostapd/
http://linuxfr.org/wiki/raspberrypi-remplacer-son-systeme-de-fichier-par-f2fs-formatage
https://www.howtoforge.com/tutorial/installing-nginx-with-php7-fpm-and-mysql-on-ubuntu-16.04-lts-lemp
https://www.digitalocean.com/community/questions/phpmyadmin-or-alternative-for-php7-nginx-mysql-5-7-ubuntu-16-04
https://www.citizenz.info/mariadb-mysql-connexion-root-avec-phpmyadmin-sous-ubuntu-16-04
https://publications.jbfavre.org/web/nginx-vhosts-automatiques-avec-SSL-et-authentification.fr
https://www1.zonewebmaster.eu/serveur-debian-mysql:automysqlbackup
https://serverfault.com/questions/424452/nginx-enable-site-command
https://anderson69s.com/2017/03/18/domoticz-domotique-diy/6/
http://hallard.me/pitinfov12/
http://hallard.me/pitinfo/

Catégorie : Uncategorized | Commentaires fermés sur Serveur Domoticz pour TD/TP en BTS SN
août 13

Serveur Tvheadend avec stockage ( Partie 2 – Hardware )

 

Recepteur USB TNT module TNT seul
Kit  USB TNT avec Antenne
CD et Télécommande
dans note cas besoin seulement
de l’adaptateur TNT seul
on commence a démonter le module usbtnt_05
On commence par démonter les modules modules démontés
usbtnt_06  usbtnt_07
démontage led IR et prise Antenne  un bout de cuivre pour la cnx antenne
 On a aussi besoin d'un repartiteur TNT  usbtnt_08
On a aussi besoin d’un répartiteur TNT  Test Répartiteur avec 3 modules USB , reste
à souder les masses et déporter les cnx USB
3dproto usbtnt_10
simulation sous openscad :Répartiteur, tuner
TNT et HDD avec support imprimé en 3D
Disque dur 314Go avec câble USB pour
Sauvegarder les programmes TNT
Assemblage deport USB
 le tout assemblé sur le support imprimé 3D liaison USB déporté et alimentation aussi
Boitier Assemblage
Récupération boitier decodeur SAT/TNT
pour intégrer le tout avec afficheur LCD
de 320×240 en face avant pour aff menu
Mise en place dans le boitier

……………………………. En cours de conception ………………………..

Catégorie : Uncategorized | Commentaires fermés sur Serveur Tvheadend avec stockage ( Partie 2 – Hardware )
août 12

Serveur Tvheadend avec stockage ( Partie 1 – installation tvheadend et epg )

  • Objectif : faire un serveur de diffusion / stockage des chaines TNT
  • Materiel :
    • Un Raspberry PI2 ou PI3
    • un disque dur USB ( dans mon cas un WD PiDrive 314 Go )
    • un ou plusieurs adaptateur TNT USB ( dans mon cas 3 x R820T DVB-T => ebay)
    • et si plusieurs adaptateur TNT , un Répartiteur Adaptateur Antenne
    • un boitier avec alimentation 5V , mini 3A ( interne ou externe selon boitier )
  • Logiciels :
    • la dernière version de raspbian-lite
    • tvheadend
    • samba

== Préparation du Raspberry pi

  • installer dernière version raspbian lite
    avec raspi-config :

    • passer langue français , timezone Europe …..
    • changer mot de passer user : pi
  • autoriser root ssh :
    • dans /etc/ssh/sshd_config
      • remplacer : PermitRootLogin without-password
      • par : PermitRootLogin yes
  • dans /boot/cmdline.txt ajouter
    • logo.nologo loglevel=3
  • dans /boot/config.txt ajouter :
    • disable_splash=1
    • max_usb_current=1
  • mise a jour système :
$sudo apt-get clean && sudo apt-get autoclean && sudo apt-get update
$sudo apt-get dist-upgrade -y && sudo apt-get upgrade -y
$sudo apt-get install firmware-linux-nonfree firmware-linux-free -y
  • Installation des firmwares supplémentaires des récepteurs TNT :
$wget http://www.linuxtv.org/downloads/firmware/dvb-firmwares.tar.bz2
$mkdir FW
$cd FW
$tar xjvf ../dvb-firmwares.tar.bz2
$sudo cp * /lib/firmware
  • ajout des paquets pour compiler tvheadend et utilitaires divers:
$sudo apt-get install build-essential git pkg-config libssl-dev bzip2 wget python-rpi.gpio\
libavahi-client-dev zlib1g-dev libavcodec-dev libavutil-dev libavformat-dev libswscale-dev\
libcurl4-gnutls-dev liburiparser-dev debhelper cmake dvb-apps libpcre3-dev ffmpeg locate -y
$git clone https://github.com/tvheadend/tvheadend.git -b release/4.0
$cd tvheadend
$./configure
$AUTOBUILD_CONFIGURE_EXTRA=--disable-libav_static ./Autobuild.sh
  • puis installation :
$cd ..
$sudo dpkg -i tvheadend_4.0.10_armhf.deb
  • changement dur port http par defaut 9981 :
    $sudo nano /etc/default/tvheadend

    remplacer TVH_HTTP_PORT=”” par TVH_HTTP_PORT=”80″

  • puis relancer tvheadend :
$sudo service tvheadend restart
  • installation de la version 4.2 ou si vous voulez pas compiler a partir des sources
$echo "deb https://dl.bintray.com/mpmc/deb raspbianjessie stable-4.2" | sudo tee -a /etc/apt/sources.list

puis :

$sudo apt-get update
$sudo sudo apt-get install tvheadend
  • gestion de l’EPG , se connecter avec le user hts
$sudo -u hts /bin/bash
$sudo apt-get install xmltv
$/usr/bin/tv_grab_fr_kazer --configure

et entrez votre Userash ( creation du compte sur https://www.kazer.org/ )

  • Installation afficheur 320×240 TFT SPI ( a base de ili9341) , câblage de l’afficheur :
    TFT Screen Raspberry Pin
     VCC 3.3V #1
    GND GND #9
    CS GPIO8 #24
    RESET GPIO23 #22
    DC\RS GPIO24 #18
    SD1\MOSI GPIO10 #19
    SCK GPIO11 #23
    LED GPIO18 #12
    SD0\MISO GPIO9 #21

    on edite le fichier config.txt pour ajouter la gestion de l’afficheur au démarrage

    $sudo nano /boot/config.txt

    et on rajoute :

    dtoverlay=rpi-display 
    dtparam=rotate=90 
    dtparam=speed=16000000

    ( rotate=90 a adapter selon position afficheur ) .On edite aussi cmdline.txt

    $sudo nano /boot/cmdline.txt

    et on ajoute en fin de ligne :

    fbcon=map:10

    on reboote et normalement l’afficheur fonctionne , si ne marche pas bien vérifier le câblage et que c’est bien un ili9341
    Pour tester  le rétro-éclairage (1:OFF , 0:ON) : ( pour plus d’info voir : https://github.com/notro/fbtft/wiki/Backlight )

    $echo 1 | sudo tee /sys/class/backlight/*/bl_power
    $echo 0 | sudo tee /sys/class/backlight/*/bl_power

     

  • Installation de samba et HDD USB ( en cours ………)
  • ………….
  • …………………
Catégorie : Hardware, Software | Commentaires fermés sur Serveur Tvheadend avec stockage ( Partie 1 – installation tvheadend et epg )
août 15

Bus CAN

Création d’un carte avec horloge en temps réel (I2C ) et contrôleur de bus CAN (SPI)  , avec connecteur pour port série / I2c et SPI utilisable .

photo du proto ( les cartes viennent d’arriver de chez seeedstudio , vais commencer a en monter une )
PI-canPI-can2

La suite quand j’aurais finis de monter et tester la carte et développé le soft qui vas avec ( deja dispo fichier au format sketchup )

Catégorie : Hardware, Software | Commentaires fermés sur Bus CAN
août 1

Shutdown Raspberry PI par gpio

Encore un petit manque dans le monde du raspberry pi , un bouton arrêt ( propre , pas en coupant  a la sauvage l’alimentation du PI ).
besoin d’avoir python et rpi.gpio installé , un boutton poussoir (dans cet exemple cablé entre le GPIO17  et gnd )

 

installation de rpi.gpio
1- Paquets debian :

apt-get install  python-rpi.gpio

2- install depuis sources :

wget https://pypi.python.org/packages/source/R/RPi.GPIO/RPi.GPIO-0.6.3.tar.gz

tar -xvf RPi.GPIO-0.6.3.tar.gz

cd RPi.GPIO-0.6.3

sudo python setup.py install

cd ~
sudo rm -rf RPi.GPIO-0.*

script pour attendre appuie sur le bouton et lancer shutdown lorsque l’on appuie sur le bouton  : pishutdown.py =>

#!/usr/bin/python
# Import the modules to send commands to the system and access GPIO pins
import RPi.GPIO as gpio
import os
#set up GPIO using BCM numbering
gpio.setmode(gpio.BCM)
#Set up pin 7 as an input
gpio.setup(17, gpio.IN, pull_up_down = gpio.PUD_UP)
# Set up an interrupt to look for pressed button
gpio.wait_for_edge(17, gpio.FALLING)
# Shutdown
os.system('shutdown now -h')

script qui va se lancer au demérrage du PI : pishutdown.sh =>

#!/bin/sh
cd /
cd home/tools
python pishutdown.py
cd /

puis chmod +x pishutdown.sh

on édite le fichier /etc/rc.local

/home/tools/pishutdown.sh &

a rajouter avant la ligne exit 0 , a adapter selon l’endroit ou vous copiez les 2 fichiers ( pishutdown.py , pishutdown.sh) et du gpio utilisé .

Catégorie : Hardware, Software | Commentaires fermés sur Shutdown Raspberry PI par gpio
juillet 26

Domoticz

Installation de domoticz a partir des sources et depuis une image debian minimum ( pas de GUI , a l’ancienne en ligne de commande ) , l’image minimum est a télécharger ici. L’image viens de chez Minibian , image mise à jour en debian jessie et kernel 4.09

Une fois l’image récupérée et copié sur une carte SD de 8Go. on boote le raspberry PI B (B+) , login/mdp : root /pi . le Raspberry est en dhcp donc vérifiez qu’il y a un serveur dchp sur le reseau sinon modifier le fichier /etc/network/interfaces :

auto lo
iface lo inet loopback

auto eth0
iface eth0 inet static
address 192.168.0.221
netmask 255.255.255.0
network 192.168.0.0
broadcast 192.168.0.255
gateway 192.168.0.1
dns-nameservers 192.168.0.1

ici dans mon cas  , la box en 192.168.0.1 et le raspberry en 192.168.0.221

maintenant on passe aux choses sérieuses ( installation des outils dev/compilation , wiringPi , OpenZWave et enfin domoticz )
on se connecte sur le pi en root / mot de passe pi

installation des outils nécessaires a la compilations de tous les soft utilisés :

apt-get install -y sudo build-essential git cmake libboost-dev libboost-thread-dev libboost-system-dev libsqlite3-dev subversion curl libcurl4-openssl-dev libusb-dev zlib1g-dev
libssl-dev git-core unzip libraspberrypi-dev

edition fichier sudo pour acces utilisateur sans mot de passe

visudo

remplacer :
%sudo ALL=(ALL:ALL) ALL
par
%sudo ALL=(ALL) NOPASSWD:ALL

creation utilisateur pi / mot de passe pi

adduser pi

utilisateur pi membre de sudo et de dialout ( si besoin d’utiliser le port serie , par ex si on ajoute un arduino a domoticz :

adduser pi sudo
adduser pi dialout

maintenant on se connecte sur le pi en utilisateur pi et on commence par compiler wiringpi (site du tuto )

su pi
cd ~
git clone git://git.drogon.net/wiringPi
cd wiringPi/wiringPi
make static
sudo make install-static

maintenant le Support de OpenZWave

cd ~
sudo apt-get install libudev-dev

git clone https://github.com/OpenZWave/open-zwave open-zwave-read-only
cd open-zwave-read-only
sudo git fetch
make

comme dans l’image minibian il n’y a pas de swap on vas en créer un tempo pour la compilation :

sudo apt-get install dphys-swapfile

puis nano /etc/dphys-swapfile
et mettre : CONF_SWAPSIZE=350

puis

sudo /etc/init.d/dphys-swapfile start

maintenant on passe a la compilation de domoticz :

cd ~
svn checkout svn://svn.code.sf.net/p/domoticz/code/trunk domoticz-code
mv domoticz-code domoticz

cd domoticz
cmake -DCMAKE_BUILD_TYPE=Release CMakeLists.txt
sudo make

attention sur un B/B+ la compilation prends quelques temps ( 1 apero prolongé + 1 bbq + café ) .

maintenant si pas de pb de compilation , lancement de domoticz au démarrage du systeme :

sudo cp domoticz.sh /etc/init.d
sudo chmod +x /etc/init.d/domoticz.sh
sudo update-rc.d domoticz.sh defaults

si vous voulez modifier l’utilisateur qui lance domoticz , le port web utilisé ( 8080 par défaut )

sudo vi /etc/init.d/domoticz.sh

USERNAME=pi
DAEMON=/home/$USERNAME/domoticz/$NAME
DAEMON_ARGS="-daemon -www 8080"

on va désactiver et supprimer le swap

sudo /etc/init.d/dphys-swapfile start
sudo apt-get remove dphys-swapfile

maintenant on vas lancer domoticz

sudo service domoticz.sh start

et on peux se connecter depuis un navigateur aux adresses suivante :

– http://adr_ip_du_pi:8080
– https://adr_ip_du_pi

et on accède a l’interface web de domoticz . il y auras bientôt un autre article sur la configuration / gestion de domoticz , en attendant il y a plusieurs tuto sur le net ( google est ton amis ! )

peux ceux qui n’ont pas envie d’attendre des heures les compilations ( et surtout avoir des erreurs ) . j’ai fait une image que vous trouverez içi

Catégorie : Software | Commentaires fermés sur Domoticz