188 lines
5.9 KiB
ReStructuredText
188 lines
5.9 KiB
ReStructuredText
|
Web Framework & Plugins
|
|||
|
=======================
|
|||
|
|
|||
|
TL;DR: Examples
|
|||
|
---------------
|
|||
|
|
|||
|
The following examples include their documentation in the HTML page and source.
|
|||
|
Read the source and install them as plugins (see below) to see how they work.
|
|||
|
|
|||
|
.. toctree::
|
|||
|
:maxdepth: 1
|
|||
|
:caption: Basic usage
|
|||
|
|
|||
|
metrics
|
|||
|
commands
|
|||
|
notifications
|
|||
|
hooks
|
|||
|
solidgauge
|
|||
|
|
|||
|
.. toctree::
|
|||
|
:maxdepth: 1
|
|||
|
:caption: API usage
|
|||
|
|
|||
|
loadcmd
|
|||
|
fileapi
|
|||
|
|
|||
|
.. toctree::
|
|||
|
:maxdepth: 1
|
|||
|
:caption: UI elements
|
|||
|
|
|||
|
btn-longtouch
|
|||
|
dialogtest
|
|||
|
filedialog
|
|||
|
filebrowser
|
|||
|
input-slider
|
|||
|
|
|||
|
.. toctree::
|
|||
|
:maxdepth: 1
|
|||
|
:caption: Plugin examples
|
|||
|
|
|||
|
regenmon
|
|||
|
dashboard
|
|||
|
plugin-twizy/dashboard-tuneslider
|
|||
|
plugin-twizy/profile-editor
|
|||
|
plugin-twizy/drivemode-config
|
|||
|
|
|||
|
|
|||
|
Installing Plugins
|
|||
|
------------------
|
|||
|
|
|||
|
The framework supports installing user content as pages or extensions to
|
|||
|
pages. To install an example:
|
|||
|
|
|||
|
1. Menu Config → Web Plugins
|
|||
|
2. Add plugin: type "Page", name e.g. "dev.metrics" (used as the file
|
|||
|
name in ``/store/plugin``)
|
|||
|
3. Save → Edit
|
|||
|
4. Set page to e.g. "/usr/dev/metrics", label to e.g. "Dev: Metrics"
|
|||
|
5. Set the menu to e.g. "Tools" and auth to e.g. "None"
|
|||
|
6. Paste the page source into the content area
|
|||
|
7. Save → the page is now accessible in the "Tools" menu.
|
|||
|
|
|||
|
Hint: use the standard editor (tools menu) in a second session to edit a
|
|||
|
plugin repeatedly during test / development.
|
|||
|
|
|||
|
|
|||
|
Basics
|
|||
|
------
|
|||
|
|
|||
|
The OVMS web framework is based on HTML 5, Bootstrap 3 and jQuery 3.
|
|||
|
Plenty documentation and guides on these basic web technologies is
|
|||
|
available on the web, a very good resource is `w3schools.com`_.
|
|||
|
|
|||
|
For charts the framework includes Highcharts 6. Info and documentation
|
|||
|
on this is available on `Highcharts.com`_.
|
|||
|
|
|||
|
The framework is "AJAX" based. The index page ``/`` loads the framework
|
|||
|
assets and defines a default container structure including a ``#menu``
|
|||
|
and a ``#main`` container. Content pages are loaded into the ``#main``
|
|||
|
container. The window URL includes the page URL after the hash mark
|
|||
|
``#``:
|
|||
|
|
|||
|
- ``http://ovms.local/#/status`` – this loads page ``/status`` into
|
|||
|
``#main``
|
|||
|
- ``http://ovms.local/#/dashboard?nm=1`` – this loads the dashboard and
|
|||
|
activates night mode
|
|||
|
|
|||
|
Links and forms having id targets ``#…`` are automatically converted to
|
|||
|
AJAX by the framework:
|
|||
|
|
|||
|
- ``<a href="/edit?path=/sd/index.txt" target="#main">Edit index.txt</a>``
|
|||
|
– load the editor
|
|||
|
|
|||
|
Pages can be loaded outside the framework as well (e.g.
|
|||
|
``http://ovms.local/status``). See index source on framework scripts and
|
|||
|
styles to include if you'd like to design standalone pages using the
|
|||
|
framework methods.
|
|||
|
|
|||
|
If file system access is enabled, all URLs not handled by the system or
|
|||
|
a user plugin (see below) are mapped onto the file system under the
|
|||
|
configured web root. Of course, files can be loaded into the framework
|
|||
|
as well. For example, if the web root is ``/sd`` (default):
|
|||
|
|
|||
|
- ``http://ovms.local/#/mypage.htm`` – load file ``/sd/mypage.htm``
|
|||
|
into ``#main``
|
|||
|
- ``http://test1.local/#/logs`` – load directory listing ``/sd/logs``
|
|||
|
into ``#main``
|
|||
|
|
|||
|
**Important Note**: the framework has a global shared context (i.e. the
|
|||
|
``window`` object). To avoid polluting the global context with local
|
|||
|
variables, good practice is to wrap your local scripts into closures.
|
|||
|
Pattern:
|
|||
|
|
|||
|
::
|
|||
|
|
|||
|
<script>
|
|||
|
(function(){
|
|||
|
… insert your code here …
|
|||
|
})();
|
|||
|
</script>
|
|||
|
|
|||
|
|
|||
|
Authorization
|
|||
|
-------------
|
|||
|
|
|||
|
Page access can be restricted to authorized users either session based
|
|||
|
or per access. File access can be restricted using digest
|
|||
|
authentication.
|
|||
|
|
|||
|
The module password is used for all authorizations. A user account or
|
|||
|
API key administration is not yet included, the main username is
|
|||
|
``admin``.
|
|||
|
|
|||
|
To create a session, call the ``/login`` page and store the resulting
|
|||
|
cookie:
|
|||
|
|
|||
|
1. ``curl -c auth -b auth 'http://192.168.4.1/login' -d username=admin -d password=…``
|
|||
|
2. ``curl -c auth -b auth 'http://192.168.4.1/api/execute?command=xrt+cfg+info'``
|
|||
|
|
|||
|
To issue a single call, e.g. to execute a command from a Wifi button,
|
|||
|
supply the password as ``apikey``:
|
|||
|
|
|||
|
- ``curl 'http://192.168.4.1/api/execute?apikey=password&command=xrt+cfg+info'``
|
|||
|
- ``curl 'http://192.168.4.1/api/execute?apikey=password&type=js&command=print(Duktape.version)'``
|
|||
|
|
|||
|
|
|||
|
Web UI Development Framework
|
|||
|
----------------------------
|
|||
|
|
|||
|
To simplify and speed up UI and plugin development, you can simply run a local web server from
|
|||
|
the ``dev`` directory of the ``ovms_webserver`` component source.
|
|||
|
|
|||
|
Preparation: create your local git clone if you don't have one already::
|
|||
|
|
|||
|
> cd ~
|
|||
|
> git clone https://github.com/openvehicles/Open-Vehicle-Monitoring-System-3.git
|
|||
|
|
|||
|
Local web server options: `List of static web servers <https://gist.github.com/willurd/5720255>`_
|
|||
|
|
|||
|
Example::
|
|||
|
|
|||
|
> cd ~/Open-Vehicle-Monitoring-System-3/vehicle/OVMS.V3/components/ovms_webserver/dev
|
|||
|
> python3 -m http.server 8000
|
|||
|
Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ...
|
|||
|
|
|||
|
Now open the development framework in your browser at URI ``http://localhost:8000``. If that
|
|||
|
doesn't work, check your firewall settings for port 8000 on localhost.
|
|||
|
|
|||
|
You should see the examples home. Edit ``index.htm`` to add custom menus, edit ``home.htm`` to
|
|||
|
add custom home buttons.
|
|||
|
|
|||
|
Hint: to test your plugin for mobile devices, use the mobile emulation mode of your browser's
|
|||
|
development toolkit. Mobile mode allows to test small screen resolutions, rotation and touch
|
|||
|
events.
|
|||
|
|
|||
|
A static local HTTP server allows to use all frontend features, but cannot emulate the backend API
|
|||
|
(command/script execution). If using a CGI capable HTTP server, you can also add a proxy handler
|
|||
|
for ``/api/execute`` that forwards the requests to your module by HTTP or SSH.
|
|||
|
|
|||
|
If you want to add your results to a C++ module, use the tools ``mksrc`` and ``mksrcf`` to convert
|
|||
|
your HTML files into C++ compatible strings. ``mksrc`` is meant for static strings, ``mksrcf`` for
|
|||
|
strings with printf style placeholders.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
.. _w3schools.com: https://www.w3schools.com/
|
|||
|
.. _Highcharts.com: https://www.highcharts.com/
|