Install Gambas¶
Remote Management Install¶
If you want remote login, install ssh and nomachine's nx:
$ sudo apt-get install ssh
I use nx for remote X sessions, but you can also use something else like vnc for example ...
$ mkdir ~/install/nx $ cd ~/install/nx x86_i386: $ wget http://64.34.161.181/download/3.3.0/Linux/nxclient_3.3.0-6_i386.deb $ wget http://64.34.161.181/download/3.3.0/Linux/nxnode_3.3.0-12_i386.deb $ wget http://64.34.161.181/download/3.3.0/Linux/FE/nxserver_3.3.0-15_i386.deb $ sudo dpkg -i nxclient_3.3.0-6_i386.deb $ sudo dpkg -i nxnode_3.3.0-12_i386.deb $ sudo dpkg -i nxserver_3.3.0-15_i386.deb x86_64: $ wget http://64.34.161.181/download/3.3.0/Linux/nxclient_3.3.0-6_x86_64.deb $ wget http://64.34.161.181/download/3.3.0/Linux/nxnode_3.3.0-12_x86_64.deb $ wget http://64.34.161.181/download/3.3.0/Linux/FE/nxserver_3.3.0-14_x86_64.deb $ sudo dpkg -i nxclient_3.3.0-6_x86_64.deb $ sudo dpkg -i nxnode_3.3.0-12_x86_64.deb $ sudo dpkg -i nxserver_3.3.0-14_x86_64.deb
You can download clients here.
If you enable Multimedia support while defining a connection you can hear the audio from your server too!
Apache install¶
If you want to use the web client module, you have to run Apache with the php5 and xmlrpc modules.
Please be aware of the security risks you take, the software is not fully tested.
You can also use lighttpd see below, not tested the security/user auth part, but xmlrpc ajax runs ok.
Install Apache2, PHP and XMLRPC support:
$ sudo apt-get install apache2 php5 libapache2-mod-php5 php5-xmlrpc
Then you need to tweak the apache config file a bit, to be able to have authentication and customlog settings changed:
NOTE: The example below is from default Ubuntu Hardy installation, your file may look a bit different.
$ sudo vi /etc/apache2/sites-available/default
You see this, change the two lines where the arrows point below.
[[NameVirtualHost]] *
<VirtualHost *>
[[ServerAdmin]] webmaster@localhost
[[DocumentRoot]] /var/www/
<Directory />
Options [[FollowSymLinks]]
[[AllowOverride]] None
</Directory>
<Directory /var/www/>
Options Indexes [[FollowSymLinks]] MultiViews
------> [[AllowOverride]] All
Order allow,deny
allow from all
</Directory>
[[ScriptAlias]] /cgi-bin/ /usr/lib/cgi-bin/
<Directory "/usr/lib/cgi-bin">
[[AllowOverride]] None
Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
Order allow,deny
Allow from all
</Directory>
[[ErrorLog]] /var/log/apache2/error.log
# Possible values include: debug, info, notice, warn, error, crit,
# alert, emerg.
[[LogLevel]] warn
------> [[CustomLog]] /var/log/apache2/access.log combined env=!dontlog
[[ServerSignature]] On
Next restart Apache to let it read the config file, watch for error messages.
$ sudo /etc/init.d/apache2 restart
lighttpd install¶
Install base part.
$ sudo aptitude install lighttpd
Install PHP modules.
$ sudo aptitude install php5-cgi php5-mysql php5-xmlrpc
To enable PHP5 in Lighttpd, we must modify /etc/php5/cgi/php.ini and add the line cgi.fix_pathinfo = 1 right at the end of the file:
$ sudo vi /etc/php5/cgi/php.ini cgi.fix_pathinfo = 1
To enable the fastcgi configuration (which is stored in /etc/lighttpd/conf-available/10-fastcgi.conf), run the following command:
$ sudo lighttpd-enable-mod fastcgi
This creates a symlink /etc/lighttpd/conf-enabled/10-fastcgi.conf which points to /etc/lighttpd/conf-available/10-fastcgi.conf
Then reload Lighttpd:
$ sudo /etc/init.d/lighttpd force-reload
Clock synchronisation with ntp¶
It's important that your domotica server has the right time, you can achieve this by running ntpd on it, this describes how you can get it running.
Install the needed package:
$ sudo apt-get install ntp
Change it's config file to choose nearby ntp servers:
$ sudo vi /etc/ntp.conf
Replace line with server ntp.ubuntu.com with the following (if you live in the Netherlands):
server 0.nl.pool.ntp.org server 1.nl.pool.ntp.org server 2.nl.pool.ntp.org server 3.nl.pool.ntp.org
Restart the daemon:
$ sudo /etc/init.d/ntp restart * Stopping NTP server ntpd [ OK ] * Starting NTP server ntpd [ OK ]
Now you can check it with:
ntpq> peers
remote refid st t when poll reach delay offset jitter
==============================================================================
metronoom.dmz.c PPS(0) 2 u 18 64 1 28.042 36694.5 0.001
ntp1.hro.nl 193.67.79.202 2 u 17 64 1 30.153 36694.5 0.001
canopus.no-sens 192.87.106.3 2 u 16 64 1 26.090 36694.6 0.001
ntp1.trans-ix.n 193.79.237.14 2 u 15 64 1 25.615 36696.2 0.001
The offset is the difference between your servers clock and the atomclock time.
After a few minutes you will see that the difference is corrected.
ntpq> peers
remote refid st t when poll reach delay offset jitter
==============================================================================
metronoom.dmz.c PPS(0) 2 u 10 64 1 26.920 -0.251 0.001
ntp1.hro.nl 193.67.79.202 2 u 25 64 1 30.268 0.648 0.001
canopus.no-sens 192.87.106.3 2 u 25 64 1 26.651 0.273 0.001
ntp1.trans-ix.n 193.79.237.14 2 u 49 64 1 24.986 2.846 0.001
ntpq> exit
Lock serial device names¶
USB Serial devices get a random device name after reboot on Linux, they don't stay the same, which makes it very difficult to find out which is which every time.
By writing udev rules you can lock names to adapters with a certain serial number embedded.
But the adapters using a Prolific PL2303 chip all have the same device id and serial number, so you have a small problem.
What I have done, is lock the usb port to a certain serial device (actually to another symlink)
Here is how I did it.
Plug in all your interfaces, remove one and plug it back in, look up it's device name.
$ dmesg [ 3041.219431] usb 1-3.2.4: USB disconnect, address 19 [ 3041.222094] pl2303 ttyUSB9: pl2303 converter now disconnected from ttyUSB9 [ 3041.222158] pl2303 1-3.2.4:1.0: device disconnected [ 3045.257373] usb 1-3.2.4: new full speed USB device using ehci_hcd and address 20 [ 3045.355654] usb 1-3.2.4: configuration #1 chosen from 1 choice [ 3045.356225] pl2303 1-3.2.4:1.0: pl2303 converter detected [ 3045.359626] usb 1-3.2.4: pl2303 converter now attached to ttyUSB9
Now find out which device path it has.
$ udevadm info --attribute-walk -p /class/tty/ttyUSB9
looking at device '/devices/pci0000:00/0000:00:04.1/usb1/1-3/1-3.2/1-3.2.4/1-3.2.4:1.0/ttyUSB9/tty/ttyUSB9':
KERNEL=="ttyUSB9"
SUBSYSTEM=="tty"
DRIVER==""
looking at parent device '/devices/pci0000:00/0000:00:04.1/usb1/1-3/1-3.2/1-3.2.4/1-3.2.4:1.0/ttyUSB9':
KERNELS=="ttyUSB9"
SUBSYSTEMS=="usb-serial"
DRIVERS=="pl2303"
ATTRS{port_number}=="0"
looking at parent device '/devices/pci0000:00/0000:00:04.1/usb1/1-3/1-3.2/1-3.2.4/1-3.2.4:1.0':
KERNELS=="1-3.2.4:1.0"
SUBSYSTEMS=="usb"
DRIVERS=="pl2303"
ATTRS{bInterfaceNumber}=="00"
ATTRS{bAlternateSetting}==" 0"
ATTRS{bNumEndpoints}=="03"
ATTRS{bInterfaceClass}=="ff"
ATTRS{bInterfaceSubClass}=="00"
ATTRS{bInterfaceProtocol}=="00"
ATTRS{modalias}=="usb:v067Bp2303d0300dc00dsc00dp00icFFisc00ip00"
ATTRS{supports_autosuspend}=="1"
Look for the first KERNELS string with a path in it, so KERNELS=="1-3.2.4:1.0" in the above example.
Create or edit the custom udev rules file and add a line for this device.
$ sudo vi /etc/udev/rules.d/100-usbadapter.rules SUBSYSTEMS=="usb",KERNELS=="1-1.4:1.0",NAME="ttyUSBzwave" SUBSYSTEMS=="usb",KERNELS=="1-1.5:1.0",NAME="ttyUSBplugwise" SUBSYSTEMS=="usb",KERNELS=="1-1.3.1.2",NAME="ttyUSBonkyo" SUBSYSTEMS=="usb",KERNELS=="1-1.3.1.4",NAME="ttyUSBdigitemp" SUBSYSTEMS=="usb",KERNELS=="1-1.3.2.1",NAME="ttyUSBled" SUBSYSTEMS=="usb",KERNELS=="1-1.3.1.3",NAME="ttyUSBspare"
Let udev reload it's new rules file, if you add rules to same file, udev will be notified, a restart is not needed then.
$ sudo /etc/init.d/udev restart
Now unplug the adapter and put it back in.
Check the creation of the extra symlinked device name.
$ ls -l /dev/ttyUSB* crw------- 1 root root 188, 0 2011-11-29 10:18 /dev/ttyUSB0 crw------- 1 root root 188, 1 2011-11-29 10:33 /dev/ttyUSB1 crw------- 1 root root 188, 2 2011-11-29 10:16 /dev/ttyUSB2 crw------- 1 root root 188, 3 2011-11-29 10:13 /dev/ttyUSB3 crw------- 1 root root 188, 4 2011-11-29 10:23 /dev/ttyUSB4 crw------- 1 root root 188, 5 2011-11-29 10:23 /dev/ttyUSB5 crw-rw---- 1 root dialout 188, 1 2011-11-29 10:33 /dev/ttyUSBdigitemp crw-rw---- 1 root dialout 188, 5 2011-11-29 10:30 /dev/ttyUSBled crw-rw---- 1 root dialout 188, 0 2011-11-29 10:18 /dev/ttyUSBonkyo crw-rw---- 1 root dialout 188, 2 2011-11-29 10:31 /dev/ttyUSBplugwise crw-rw---- 1 root dialout 188, 4 2011-11-29 10:23 /dev/ttyUSBspare crw-rw---- 1 root dialout 188, 3 2011-11-29 10:31 /dev/ttyUSBzwave
Now use the symlinks in your program to address the adapters.
So /dev/ttyUSBled for example. The link between the /dev/ttyUSB and /dev/ttyUSBled device change, but not the link between the physical USB port and the ttyUSBled device.
Another way to do this that makes the USB device port Independent is to assign the symlink by serial number.
Like before, using udevadm, we're going to get device information. However, This time, we're going to look for the ATTRS{serial} line (almost all FTDI have this, as well as other devices such as the Aeon Labs Z-Stick S2)
Example:
root@hal:~# udevadm info -a -n /dev/ttyUSB0
Udevadm info starts with the device specified by the devpath and then
walks up the chain of parent devices. It prints for every device
found, all possible attributes in the udev rules key format.
A rule to match, can be composed by the attributes of the device
and the attributes from one single parent device.
looking at device '/devices/pci0000:00/0000:00:1d.1/usb3/3-2/3-2:1.0/ttyUSB0/tty/ttyUSB0':
KERNEL=="ttyUSB0"
SUBSYSTEM=="tty"
DRIVER==""
looking at parent device '/devices/pci0000:00/0000:00:1d.1/usb3/3-2/3-2:1.0/ttyUSB0':
KERNELS=="ttyUSB0"
SUBSYSTEMS=="usb-serial"
DRIVERS=="ftdi_sio"
ATTRS{latency_timer}=="1"
ATTRS{port_number}=="0"
looking at parent device '/devices/pci0000:00/0000:00:1d.1/usb3/3-2/3-2:1.0':
KERNELS=="3-2:1.0"
SUBSYSTEMS=="usb"
DRIVERS=="ftdi_sio"
ATTRS{interface}=="USB <-> RS232"
ATTRS{bInterfaceNumber}=="00"
ATTRS{bAlternateSetting}==" 0"
ATTRS{bNumEndpoints}=="02"
ATTRS{bInterfaceClass}=="ff"
ATTRS{bInterfaceSubClass}=="ff"
ATTRS{bInterfaceProtocol}=="ff"
ATTRS{supports_autosuspend}=="1"
looking at parent device '/devices/pci0000:00/0000:00:1d.1/usb3/3-2':
KERNELS=="3-2"
SUBSYSTEMS=="usb"
DRIVERS=="usb"
ATTRS{configuration}==""
ATTRS{bNumInterfaces}==" 1"
ATTRS{bConfigurationValue}=="1"
ATTRS{bmAttributes}=="a0"
ATTRS{bMaxPower}=="180mA"
ATTRS{urbnum}=="84215905"
ATTRS{idVendor}=="0403" <=== This line is the vendor ID
ATTRS{idProduct}=="6001" <=== This line is the product ID
ATTRS{bcdDevice}=="0400"
ATTRS{bDeviceClass}=="00"
ATTRS{bDeviceSubClass}=="00"
ATTRS{bDeviceProtocol}=="00"
ATTRS{bNumConfigurations}=="1"
ATTRS{bMaxPacketSize0}=="8"
ATTRS{speed}=="12"
ATTRS{busnum}=="3"
ATTRS{devnum}=="19"
ATTRS{devpath}=="2"
ATTRS{version}==" 1.10"
ATTRS{maxchild}=="0"
ATTRS{quirks}=="0x0"
ATTRS{avoid_reset_quirk}=="0"
ATTRS{authorized}=="1"
ATTRS{manufacturer}=="FTDI"
ATTRS{product}=="USB <-> RS232"
ATTRS{serial}=="abc123" <=== This line is the serial number.
------------- SNIP -------------------
Once you know the serial number, create a file for the udev rules (/etc/udev/rules.d/99-usb-rs232.rules) and add the following information to it:
/etc/udev/rules.d/99-usb-rs232.rules
SUBSYSTEM=="tty", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", ATTRS{serial}=="abc123", SYMLINK+="dsc"
When you unplug and plug in your device, it will now still have /dev/ttyUSB0, but also /dev/dsc or whatever you changed the symlink name to.
Related Resources¶
Comment¶
Updated by: tradiuz, Updated about 1 month ago
Access count: 1273 since 2011-08-25
Attached Files¶