Création Paquets IPK - Luci

1. Télécharger et installer VirtualBox.
Image
2. Télécharger le fichier OVA.
Image
3. Ouvrir VirtualBox après l'installation.
4. Lancement d'OpenWRT.

5. Identification.

 Sélectionner "openwrt", taper le mot de passe "openwrt" et cliquer sur "Log In".

Image

6. Mise clavier en Français.

Lorsque la session est ouverte cliquer sur le "bouton démarrer" en bas à gauche, ensuite "System Tools" → "LXTerminal" pour ouvrir le terminal.

Image

6.1. Une nouvelle fenêtre s'ouvre:

Image
taper la commande et valider:
Clavier en QWERTY, taper "setxkb,qp"
setxkbmap fr
Le clavier est maintenant en Français.

7. Création d'un paquet luci en ipk (création d'un dossier avec fichier Makefile, dossier "root" et "luasrc").

Cliquer sur le "dossier" en bas à gauche, à côté du bouton démarrer. 

Image
La fenêtre "Home" s'ouvre. 
Image

Aller dans le dossier:

/home/openwrt/code/barrier_breaker/feeds/luci/applications

Créer un dossier ("Create New..." → "Folder"), exemple: "luci-modbus".

Créer 2 dossiers "luasrc" et "root" dans la dossier précédemment créé ("Create New..." → "Folder")

Créer un fichier dans le dossier "luci-modbus" ("Create New..." → "Empty File"), appeler le - "Makefile".

Lien fichier exemple: luci-modbus.zip

Code à mettre dans "Makefile".

PO = modbus

include ../../build/config.mk
include ../../build/module.mk

8. Modifier le fichier "Makefile".

Modifier le nom PO. (exemple: modbus ou webapi).

PO = modbus

9. Ajouter dossiers et fichiers dans le dossier "luasrc".

  • Ajouter un dossier "controller".
  • Ajouter dans le dossier "controller" un fichier .lua (exemple: modbus.lua).

exemple:

Remplacer "modbus" par le nom du fichier.lua, respecter les majuscules.

module ("luci.controller.modbus", package.seeall)

function index()
	if not nixio.fs.access("/etc/config/modbus") then
		return
	end

	local page

	page = entry({"admin", "services", "modbus"}, cbi("modbus"), _("Modbus"), 0)
	page.dependent = true
end
  • Ajouter un dossier "model".
  • Ajouter dans le dossier "model", un dossier "cbi".
  • Ajouter dans le dossier "cbi" un fichier .lua (exemple: modbus.lua).
Exemple code modbus.lua:
--[[
m = Map("helloworld", translate("Helloworld"))

s = m:section(TypedSection, "helloworld", translate("Parametrages Modbus"))
s.anonymous = true

name = s:option(Value, "nom", "Nom", "Entree votre nom")

greeting = s:option(ListValue, "greeting", "Greeting")
greeting:value("hi", "Hello")
greeting:value("bye", "Goodbye")

return m
]]--

local pythonfile = "/usr/lib/Script_python/Modbus.py", m, s

f = SimpleForm("modbus", translate("Parametrages Modbus"))

m = Map("luci", translate(""),
	translate("Cliquer sur Run pour lire les valeurs modbus"))

s = m:section(TypedSection, "command", "")
s.template = "commands"

t = f:field(TextValue, "lines")
t.rows = 28
function t.cfgvalue()
	return nixio.fs.readfile(pythonfile) or ""
end

function t.write(self, section, data)
	return nixio.fs.writefile(pythonfile, data:gsub("\r\n", "\n"))
end

function f.handle(self, state, data)
	return true
end

return f, m
Modifier les informations ci-dessous, texte, informations et emplacement fichier python, pour affichage dans la page web.

s = m:section(TypedSection, "helloworld", translate("Parametrages Modbus"))

local pythonfile = "/usr/lib/Script_python/Modbus.py", m, s

f = SimpleForm("modbus", translate("Parametrages Modbus"))

translate("Cliquer sur Run pour lire les valeurs modbus"))

10. Ajouter dossiers et fichiers dans le dossier "root". 

Dans le dossier "root", on peut ajouter des dossiers et fichiers, qui seront installés en lieu et place dans le routeur.

  • Ajouter un dossier "etc".
  • Ajouter dans le dossier "etc", un dossier "config".
  • Ajouter dans le dossier "config" un fichier "modbus" (nom à remplacer, sans extension)

exemple:

config modbus
  • Il est possible d'ajouter un fichier "luci" dans le dossier "config", pour ajouter des informations dans les commandes personnalisées de la page web.
Exemple code luci:
config core 'main'
	option lang 'auto'
	option mediaurlbase '/luci-static/openwrt.org'
	option resourcebase '/luci-static/resources'

config extern 'flash_keep'
	option uci '/etc/config/'
	option dropbear '/etc/dropbear/'
	option openvpn '/etc/openvpn/'
	option passwd '/etc/passwd'
	option opkg '/etc/opkg.conf'
	option firewall '/etc/firewall.user'
	option uploads '/lib/uci/upload/'

config internal 'languages'

config internal 'sauth'
	option sessionpath '/tmp/luci-sessions'
	option sessiontime '3600'

config internal 'ccache'
	option enable '1'

config internal 'themes'
	option Bootstrap '/luci-static/bootstrap'

config command
	option name 'Valeurs Modbus'
	option command './modbus.sh'

Dans le dossier "etc", on peut aussi ajouter un dossier "crontabs" pour des taches planifiées.

  • Ajouter dans le dossier "crontabs" un fichier "root" (sans extension)
Exemple code root:
00 23 * * * /usr/sbin/d2sphere/d2sphere_client.sh &
*/5 * * * * /usr/bin/python /usr/lib/Script_python/Modbus.py

  • Ajouter un dossier "usr" dans le dossier "root".
  • Ajouter dans le dossier "usr", un dossier "lib".
  • Ajouter dans le dossier "lib", un dossier "lua".
  • Ajouter dans le dossier "lua", un dossier "luci".
  • Ajouter dans le dossier "luci", un dossier "view".
  • Ajouter dans le dossier "view", un fichier "commands.htm" mettre le code ci-dessous dans le fichier.
Commands.htm code:
<%#
LuCI - Lua Configuration Interface
Copyright 2012 Jo-Philipp Wich <jow@openwrt.org>

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

	http://www.apache.org/licenses/LICENSE-2.0

-%>

<% css = [[

.commandbox {
	height: 12em;
	width: 30%;
	float: left;
	height: 12em;
	margin: 5px;
	position: relative;
}

.commandbox h3 {
	font-size: 1.5em !important;
	line-height: 2em !important;
	margin: 0 !important;
}

.commandbox input[type="text"] {
	width: 50% !important;
}

.commandbox div {
	position: absolute;
	left: 0;
	bottom: 1.5em;
}

]] -%>

<%+header%>

<script type="text/javascript" src="<%=resource%>/cbi.js"></script>
<script type="text/javascript">//<![CDATA[
	var stxhr = new XHR();

	function command_run(id)
	{
		var args;
		var field = document.getElementById(id);
		if (field)
			args = encodeURIComponent(field.value);

		var legend = document.getElementById('command-rc-legend');
		var output = document.getElementById('command-rc-output');

		if (legend && output)
		{
			output.innerHTML =
				'<img src="/<%=resource%>/icons/loading.gif" alt="<%:Loading%>" style="vertical-align:middle" /> ' +
				'<%:Waiting for command to complete...%>'
			;

			legend.parentNode.style.display = 'block';
			legend.style.display = 'inline';

			stxhr.get('<%=luci.dispatcher.build_url("admin", "system", "commands", "run")%>/' + id + (args ? '/' + args : ''), null,
				function(x, st)
				{
					if (st)
					{
						if (st.binary)
							st.stdout = '[<%:Binary data not displayed, download instead.%>]';

						legend.style.display = 'none';
						output.innerHTML = String.format(
							'<pre><strong># %h\n</strong>%h<span style="color:red">%h</span></pre>' +
							'<div class="alert-message warning">%s (<%:Code:%> %d)</div>',
							st.command, st.stdout, st.stderr,
							(st.exitcode == 0) ? '<%:Command successful%>' : '<%:Command failed%>',
							st.exitcode);
					}
					else
					{
						legend.style.display = 'none';
						output.innerHTML = '<span class="error"><%:Failed to execute command!%></span>';
					}

					location.hash = '#output';
				}
			);
		}
	}

	function command_download(id)
	{
		var args;
		var field = document.getElementById(id);
		if (field)
			args = encodeURIComponent(field.value);

		location.href = '<%=luci.dispatcher.build_url("admin", "system", "commands", "download")%>/' + id + (args ? '/' + args : '');
	}

	function command_link(id)
	{
		var legend = document.getElementById('command-rc-legend');
		var output = document.getElementById('command-rc-output');

		var args;
		var field = document.getElementById(id);
		if (field)
			args = encodeURIComponent(field.value);

		if (legend && output)
		{
			var link = location.protocol + '//' + location.hostname +
			           (location.port ? ':' + location.port : '') +
					   location.pathname.split(';')[0] + 'command/' +
					   id + (args ? '/' + args : '');

			legend.style.display = 'none';
			output.parentNode.style.display = 'block';
			output.innerHTML = String.format(
				'<div class="alert-message"><%:Access command with%> <a href="/%s">%s</a></div>',
				link, link
			);

			location.hash = '#output';
		}
	}

//]]></script>

<%
	local uci = require "luci.model.uci".cursor()
	local commands = { }

	uci:foreach("luci", "command", function(s) commands[#commands+1] = s end)
%>

<form method="get" action="<%=pcdata(luci.http.getenv("REQUEST_URI"))%>">
	<div class="cbi-map">
		<h2><a id="content" name="content"><%:Commandes Personnalisees%></a></h2>

		<fieldset class="cbi-section">
			<% local _, command; for _, command in ipairs(commands) do %>
			<div class="commandbox">
				<h3><%=pcdata(command.name)%></h3>
				<p><%:Command:%> <code><%=pcdata(command.command)%></code></p>
				<% if command.param == "1" then %>
					<p><%:Arguments:%> <input type="text" id="<%=command['.name']%>" /></p>
				<% end %>
				<div>
					<input type="button" value="<%:Run%>" class="cbi-button cbi-button-apply" onclick="command_run('<%=command['.name']%>')" />
					<input type="button" value="<%:Download%>" class="cbi-button cbi-button-download" onclick="command_download('<%=command['.name']%>')" />
					<% if command.public == "1" then %>
						<input type="button" value="<%:Link%>" class="cbi-button cbi-button-link" onclick="command_link('<%=command['.name']%>')" />
					<% end %>
				</div>
			</div>
			<% end %>

			<br style="clear:both" /><br />
			<a name="output"></a>
		</fieldset>
	</div>

	<fieldset class="cbi-section" style="display:none">
		<legend id="command-rc-legend"><%:Collecting data...%></legend>
		<span id="command-rc-output"></span>
	</fieldset>
</form>

<%+footer%>

  • Il est possible d'ajouter dans le dossier "lib", un dossier avec les script python, dossier "Script_Python" et dans ce dossier un fichier "Modbus.py".
Exemple code Modbus.py:
#!/usr/bin/env python

import time
import serial
import minimalmodbus
import requests
import sqlite3
import csv
from requests.auth import HTTPBasicAuth

#######################################################
#Valeur a modifie MODBUS Compteurs
#######################################################
Recepteur_ENLESS = 1
registre_Tp1 = 1008
registre_Tp2 = 1019
registre_Tp3 = 1030
registre_Tcontact = 1045

instrument = minimalmodbus.Instrument('/dev/ttyS1', Recepteur_ENLESS, mode='rtu')
instrument.serial.baudrate = 9600
instrument.serial.bytesize = 8
instrument.serial.parity = serial.PARITY_NONE
instrument.serial.stopbits = 1
instrument.serial.timeout = 2 # seconds

#######################################################
#Base de donnees transmetteur1
#######################################################
conn = sqlite3.connect('/www/mabase.db')
cursor = conn.cursor()

cursor.execute("""
CREATE TABLE IF NOT EXISTS tptransmetteur1(
     date DATE,
     temperature DECIMAL(4,2)
)
""")

conn.commit()

recup_date_heure = time.strftime("%d/%m/%Y %H:%M")

temp1 = instrument.read_register(registre_Tp1, 1, 3)
temp2 = instrument.read_register(registre_Tp2, 1, 3)
temp3 = instrument.read_register(registre_Tp3, 1, 3)

print "******Transmetteur de temperature 1 - 12117072*******"
print(recup_date_heure, temp1)
print "******Transmetteur de temperature 2 - 12115376*******"
print(recup_date_heure, temp2)
print "******Transmetteur de temperature 3 - 12022135*******"
print(recup_date_heure, temp3)

cursor.execute("""INSERT INTO tptransmetteur1(date, temperature) VALUES(?, ?)"""
, (recup_date_heure, temp1)) 

conn.commit() 

# Pour afficher les donnees d un tableau au format tableau
print "******Donnees du tableau des temperatures*******"
print "******Transmetteur de temperature 1 - 12117072*******"
cur = conn.cursor()
cur.execute('''SELECT * FROM tptransmetteur1''')
rows = cur.fetchall()
   
for row in rows:
 print(row)

#######################################################
#Base de donnees transmetteur2
####################################################### 
conn1 = sqlite3.connect('/www/mabase1.db')
cursor1 = conn1.cursor()

cursor1.execute("""
CREATE TABLE IF NOT EXISTS tptransmetteur2(
     date DATE,
     temperature DECIMAL(4,2)
)
""")

conn1.commit()

recup_date_heure = time.strftime("%d/%m/%Y %H:%M")

cursor1.execute("""INSERT INTO tptransmetteur2(date, temperature) VALUES(?, ?)"""
, (recup_date_heure, temp2)) 

conn1.commit() 

# Pour afficher les donnees d un tableau au format tableau
print "******Transmetteur de temperature 2 - 12115376*******"
cur1 = conn1.cursor()
cur1.execute('''SELECT * FROM tptransmetteur2''')
rows1 = cur1.fetchall()
   
for row1 in rows1:
 print(row1)
 
#######################################################
#Base de donnees transmetteur3
####################################################### 
conn2 = sqlite3.connect('/www/mabase2.db')
cursor2 = conn2.cursor()

cursor2.execute("""
CREATE TABLE IF NOT EXISTS tptransmetteur3(
     date DATE,
     temperature DECIMAL(4,2)
)
""")

conn2.commit()

recup_date_heure = time.strftime("%d/%m/%Y %H:%M")

cursor2.execute("""INSERT INTO tptransmetteur3(date, temperature) VALUES(?, ?)"""
, (recup_date_heure, temp3)) 

conn2.commit() 

# Pour afficher les donnees d un tableau au format tableau
print "******Transmetteur de temperature 3 - 12022135*******"
cur2 = conn2.cursor()
cur2.execute('''SELECT * FROM tptransmetteur3''')
rows2 = cur2.fetchall()
   
for row2 in rows2:
 print(row2)

 #######################################################
# Export donnees dans un fichier CSV
####################################################### 
print "Exportation de donnees vers CSV............"
cursor = conn.cursor()
cursor.execute("select * from tptransmetteur1")
with open("/www/modem1_tp1_data.csv", "w") as csv_file:
    csv_writer = csv.writer(csv_file, delimiter=";")
#   csv_writer.writerows([i[0] for i in cursor.description])
    csv_writer.writerows(cursor)

cursor1 = conn1.cursor()
cursor1.execute("select * from tptransmetteur2")
with open("/www/modem1_tp2_data.csv", "w") as csv_file:
    csv_writer1 = csv.writer(csv_file, delimiter=";")
#   csv_writer1.writerows([i[0] for i in cursor1.description])
    csv_writer1.writerows(cursor1)

cursor2 = conn2.cursor()
cursor2.execute("select * from tptransmetteur3")
with open("/www/modem1_tp3_data.csv", "w") as csv_file:
    csv_writer2 = csv.writer(csv_file, delimiter=";")
#   csv_writer2.writerows([i[0] for i in cursor2.description])
    csv_writer2.writerows(cursor2)

print "Les donnees ont ete exportees avec succes"

# Fermeture connexion databases
cursor.close()
conn.close()
cursor1.close()
conn1.close()
cursor2.close()
conn2.close()

#######################################################
#Lecture valeur MODBUS
#######################################################

recup_date_heure = time.strftime("%d/%m/%Y %H:%M")

tempalar3 = round(instrument.read_register(registre_Tp3, 1, 3))
tempalarme = 25

#try pour creation fichier historique1 si non existant
try:
    f = open("historique1", 'r')
    #recuperation
    tp3_alar_envoi = eval(f.readline().rstrip('\r\n'))
    f.close()

    print "******Transmetteur temperature - 12022135*******"
    print(recup_date_heure, tempalar3)
    print tp3_alar_envoi


    #######################################################
    #Verification si alarme temperature
    #######################################################
    if tempalar3 < tempalarme and tp3_alar_envoi == 0:
        print ("alarme temperature")

        data = "{'id': '@S.FR.AHU.Alarme_Temperature_Primaire', 'level': '9', 'val': " + str(tempalar3) + " , 'who': 'null'}"
        payload = eval(data)
        r = requests.get('http://192.168.10.2/haystack/pointWrite', auth=HTTPBasicAuth('RESTapi', 'Dumortier02'), params=payload)
        tp3_alar_envoi = 1
        
        print r.url
            
        f = open("historique1", 'w')
        #sauvegarde
        f.write(repr(tp3_alar_envoi)+'\r\n')
        f.close()
            
    elif tempalar3 > tempalarme and tp3_alar_envoi == 1:
        data = "{'id': '@S.FR.AHU.Alarme_Temperature_Primaire', 'level': '9', 'val': " + str(tempalar3) + " , 'who': 'null'}"
        payload = eval(data)
        r = requests.get('http://192.168.10.2/haystack/pointWrite', auth=HTTPBasicAuth('RESTapi', 'Dumortier02'), params=payload)
        print("pas d'alarme de temperature")
        tp3_alar_envoi = 0
        print tp3_alar_envoi
        print r.url
            
        f = open("historique1", 'w')
        #sauvegarde
        f.write(repr(tp3_alar_envoi)+'\r\n')
        f.close()

    else:
        print("pas d'alarme de temperature")
        print tp3_alar_envoi
            
        f = open("historique1", 'w')
        #sauvegarde
        f.write(repr(tp3_alar_envoi)+'\r\n')
        f.close()
        
except IOError:
    f = open("historique1", 'w')
    f.write(repr(0)+'\r\n')
    f.close()

    f = open("historique1", 'r')
    #recuperation
    tp3_alar_envoi = eval(f.readline().rstrip('\r\n'))
    f.close()

    print "******Transmetteur contact - 11511213*******"
    print(recup_date_heure, tempalar3)
    print tp3_alar_envoi


    #######################################################
    #Verification si alarme temperature
    #######################################################
    if tempalar3 < tempalarme and tp3_alar_envoi == 0:
        print ("alarme temperature")

        data = "{'id': '@S.FR.AHU.Alarme_Temperature_Primaire', 'level': '9', 'val': " + str(tempalar3) + " , 'who': 'null'}"
        payload = eval(data)
        r = requests.get('http://192.168.10.2/haystack/pointWrite', auth=HTTPBasicAuth('RESTapi', 'Dumortier02'), params=payload)
        tp3_alar_envoi = 1
        
        print r.url
            
        f = open("historique1", 'w')
        #sauvegarde
        f.write(repr(tp3_alar_envoi)+'\r\n')
        f.close()
            
    elif tempalar3 > tempalarme and tp3_alar_envoi == 1:
        data = "{'id': '@S.FR.AHU.Alarme_Temperature_Primaire', 'level': '9', 'val': " + str(tempalar3) + " , 'who': 'null'}"
        payload = eval(data)
        r = requests.get('http://192.168.10.2/haystack/pointWrite', auth=HTTPBasicAuth('RESTapi', 'Dumortier02'), params=payload)
        print("pas d'alarme de temperature")
        tp3_alar_envoi = 0
        print tp3_alar_envoi
        print r.url
            
        f = open("historique1", 'w')
        #sauvegarde
        f.write(repr(tp3_alar_envoi)+'\r\n')
        f.close()

    else:
        print("pas d'alarmes de temperature")
        print tp3_alar_envoi
            
        f = open("historique1", 'w')
        #sauvegarde
        f.write(repr(tp3_alar_envoi)+'\r\n')
        f.close()

tcontact = instrument.read_register(registre_Tcontact, 0, 3)

#try pour creation fichier historique si non existant
try:
    f = open("historique", 'r')
    #recuperation
    tcontact_stored = eval(f.readline().rstrip('\r\n'))
    f.close()

    print "******Transmetteur contact - 11511213*******"
    print(recup_date_heure, tcontact)
    print tcontact_stored


    #######################################################
    #Verification si alarme
    #######################################################
    if (tcontact == 306 or tcontact == 291 or tcontact == 290) and tcontact != tcontact_stored:
        print ("alarmes")

        data = "{'id': '@S.FR.AHU.ValeursContactsAlarmes', 'level': '9', 'val': " + str(tcontact) + " , 'who': 'null'}"
        payload = eval(data)
        r = requests.get('http://192.168.10.2/haystack/pointWrite', auth=HTTPBasicAuth('RESTapi', 'Dumortier02'), params=payload)

        print r.url
            
        f = open("historique", 'w')
        #sauvegarde
        f.write(repr(tcontact)+'\r\n')
        f.close()
            
    elif tcontact != tcontact_stored:
        data = "{'id': '@S.FR.AHU.ValeursContactsAlarmes', 'level': '9', 'val': " + str(tcontact) + " , 'who': 'null'}"
        payload = eval(data)
        r = requests.get('http://192.168.10.2/haystack/pointWrite', auth=HTTPBasicAuth('RESTapi', 'Dumortier02'), params=payload)
        print("pas d'alarmes ou de nouvelle alarmes")
        print tcontact_stored
        print r.url
            
        f = open("historique", 'w')
        #sauvegarde
        f.write(repr(tcontact)+'\r\n')
        f.close()

    else:
        print("pas d'alarmes ou de nouvelle alarmes")
        print tcontact_stored
            
        f = open("historique", 'w')
        #sauvegarde
        f.write(repr(tcontact)+'\r\n')
        f.close()
        
except IOError:
    f = open("historique", 'w')
    f.write(repr(307)+'\r\n')
    f.close()

    f = open("historique", 'r')
    #recuperation
    tcontact_stored = eval(f.readline().rstrip('\r\n'))
    f.close()

    print "******Transmetteur contact - 11511213*******"
    print(recup_date_heure, tcontact)
    print tcontact_stored


    #######################################################
    #Verification si alarme
    #######################################################
    if (tcontact == 306 or tcontact == 291 or tcontact == 290) and tcontact != tcontact_stored:
        print ("alarmes")

        data = "{'id': '@S.FR.AHU.ValeursContactsAlarmes', 'level': '9', 'val': " + str(tcontact) + " , 'who': 'null'}"
        payload = eval(data)
        r = requests.get('http://192.168.10.2/haystack/pointWrite', auth=HTTPBasicAuth('RESTapi', 'Dumortier02'), params=payload)

        print r.url
            
        f = open("historique", 'w')
        #sauvegarde
        f.write(repr(tcontact)+'\r\n')
        f.close()
            
    elif tcontact != tcontact_stored:
        data = "{'id': '@S.FR.AHU.ValeursContactsAlarmes', 'level': '9', 'val': " + str(tcontact) + " , 'who': 'null'}"
        payload = eval(data)
        r = requests.get('http://192.168.10.2/haystack/pointWrite', auth=HTTPBasicAuth('RESTapi', 'Dumortier02'), params=payload)
        print("pas d'alarmes ou de nouvelle alarmes")
        print tcontact_stored
        print r.url
            
        f = open("historique", 'w')
        #sauvegarde
        f.write(repr(tcontact)+'\r\n')
        f.close()

    else:
        print("pas d'alarmes ou de nouvelle alarmes")
        print tcontact_stored
            
        f = open("historique", 'w')
        #sauvegarde
        f.write(repr(tcontact)+'\r\n')
        f.close()

Si besoin ajouter dans le dossier "root", un dossier "www", dans ce dossier ajouter le fichier souhaité (exemple: modbus.sh) 

exemple de code du fichier "modbus.sh":

/usr/bin/python /usr/lib/Script_python/Modbus.py

11. Ajouter des dossiers et des fichiers pour la compilation.

Aller dans le dossier:

/home/openwrt/code/barrier_breaker/build_dir/target-mipsel_24kec+dsp_uClibc-0.9.33.2/luci-addons/applications

copier et coller le dossier créer précédemment dans "applications" , exemple: "luci-modbus".

Dans le dossier exemple "luci-modbus" créer un dossier supplémentaire "dist", dans ce dossier copier, coller les dossiers, de "root", dans l'exemple "etc", "usr", "www".

  • Dans le dossier:
/home/openwrt/code/barrier_breaker/build_dir/target-mipsel_24kec+dsp_uClibc-0.9.33.2/luci-addons/applications/luci-modbus/dist/usr/lib/lua/luci
  • Copier, coller les dossiers, du dossier "luasrc" créer précédemment en "8.", dans l'exemple "controller" et "model".
  • Ajouter aussi un dossier "i18n".

12. Ajouter un lien dans le menu. 

Aller dans le fichier:

/home/openwrt/code/barrier_breaker/feeds/luci/contrib/package/luci-addons/Makefile

Rechercher:

### Applications ###

Ajouter une ligne, (exemple dessous), avec les informations du paquet "luci" à installer.

$(eval $(call application,upnp,Universal Plug & Play configuration module,miniupnpd))
$(eval $(call application,ntpc,NTP time synchronisation configuration module,ntpclient))
$(eval $(call application,ddns,Dynamic DNS configuration module,ddns-scripts))
$(eval $(call application,samba,Network Shares - Samba SMB/CIFS module,samba36-server))
$(eval $(call application,mmc-over-gpio,MMC-over-GPIO configuration module,kmod-mmc-over-gpio))
$(eval $(call application,p910nd,p910nd - Printer server module,p910nd))
$(eval $(call application,ushare,uShare - UPnP A/V & DLNA Media Server,ushare))
$(eval $(call application,hd-idle,Hard Disk Idle Spin-Down module,hd-idle))
$(eval $(call application,tinyproxy,Tinyproxy - HTTP(S)-Proxy configuration,tinyproxy))
$(eval $(call application,polipo,LuCI Support for the Polipo Proxy,polipo))
$(eval $(call application,openvpn,LuCI Support for OpenVPN,openvpn @BROKEN))
$(eval $(call application,p2pblock,LuCI Support for the Freifunk P2P-Block addon,luci-app-firewall freifunk-p2pblock))
$(eval $(call application,multiwan,LuCI Support for the OpenWrt MultiWAN agent,luci-app-firewall multiwan))
$(eval $(call application,wol,LuCI Support for Wake-on-LAN,etherwake))
$(eval $(call application,vnstat,LuCI Support for VnStat,vnstat vnstati))
$(eval $(call application,radvd,LuCI Support for Radvd,radvd))
$(eval $(call application,ahcp,LuCI Support for AHCPd,ahcpd))
$(eval $(call application,wshaper,LuCI Support for wshaper,wshaper))
$(eval $(call application,modbus,LuCI modbus application))
$(eval $(call application,webapi,LuCI webapi))

Le paquet est prêt à être compilé. 

13. Compilation du dossier.
13.1. Cliquer sur le "bouton démarrer" en bas à gauche, ensuite "System Tools" → "LXTerminal" pour ouvrir le terminal.
Image
13.2. Une nouvelle fenêtre s'ouvre:
Image

Se mettre dans le dossier:

cd ~/code/barrier_breaker

Mise à jour des paquets:

./scripts/feeds/ update -a
./scripts/feeds/ update -i

Installer les paquets:

./scripts/feeds/ install -a

ouvrir le menu pour générer la compilation.

make menuconfig
Une nouvelle fenêtre s'ouvre:
13.3. Sélectionner avec les flèches "Luci" puis "Entrée".
Capture écran Luci
13.5. Sélectionner avec les flèches le(s) paquet(s), puis cliquer sur la "barre d'espace" pour avoir "<*>".
Capture écran Luci-App
13.7. Valider "<Ok>".
Capture écran Exit

13.4. Sélectionner avec les flèches "Applications" puis "Entrée".
Capture écran Applications

13.6. Avec les flèches sélectionner "<Save>".
Capture écran Save

Valider "<Exit>", plusieurs fois pour sortir et revenir au terminal. 

Dans le terminal taper la commande: (Compilation de tout openwrt).

make world

Les fichiers IPK créés sont dans le dossier:

/home/openwrt/code/barrier_breaker/bin/ramips/packages/luci

 

Recherche