Blog previously known as 'Home Theatre PC'

Keräilyhaku, added another search section

  11/18/13 18:38, by Esa, Categories: Hardware

Added finnish design glass and ceramics to the search engine.

Keräilyhaku v2

  11/14/13 01:28, by Esa, Categories: Hardware

Seems it was a needed service, so it was moved to a separate domain. kerailyhaku.eu

Keräilyhakukone - combined search for finnish collectible coin selling sites

  11/10/13 17:02, by Esa, Categories: Hardware

It's been a while since I did anything that is actually worth publishing. I recently needed to find a few collectible coins and it was a pain in the *** to search all separate sites, let the images etc load, make notes to compare different sites etc. I thought it would be way faster to find the best prices for what I was looking for if I just made a little tool for it.

So this weekend project is now published:
http://www.viitalat.net/hakukone

It's all in finnish, but so are the webshops it searches from. The actual 'how to use the site' doesn't need much explaining (you've seen google right?). It's been tested of recent Safari, Chrome and Firefox on OSX Mavericks. Gotta get my hands on some windows machine to test recent IE as well . I don't have any plans on supporting ancient browsers (seriously, to those IE7 user agents - UPGRADE!).

Reset Kiosk 0.4

  08/16/11 22:14, by Esa, Categories: Software

Updated reset kiosk plugin to support Firefox 6.0.

It's being in queue for approval in the addons.mozilla.org.

Edit 5.10.2011: It took Mozilla 8 weeks to review the version and now there is already Firefox 7. ARGH! The manifest in the plugin says this is compatible only up to 6.0. But I marked this release compatible with up to Firefox 10.0a1 in addons.mozilla.org so you should be able to install it anyway. . .

3 comments »

1-wire temperatures with Arduino

  07/27/11 18:47, by Esa, Categories: Hardware, Software

I have used 1-wire temperature sensors (DS18S20) around my house for a few years now. Just recently the home made serial port adapter stopped working and I thought I'd look into replacing it with Arduino.

There was already 1-wire library and dallas temperature library available for Arduino under GPL license and wiring only required connecting data line to any of the digital io ports (I chose port 2) and 4k7 resistor between Arduino 5V and 1-wire bus data line for parasite power and grounding of course. Here's the code which reads the sensors and outputs to the usbserial.

#include <OneWire.h>
#include "DallasTemperature.h"

#define ONE_WIRE_BUS_DATA_PORT 3
#define LOOP_DELAY_1 30000 // max 32k...
#define LOOP_DELAY_2 30000
#define _NUM_SAMPLES 3
#define _SAMPLE_DELAY 1000

OneWire oneWire(ONE_WIRE_BUS_DATA_PORT);
DallasTemperature sensors(&oneWire);

void setup(void)
{
  Serial.begin(9600);
}

char* batoh(uint8_t deviceAddress[]) {
  char* buf_str = (char*) malloc(2*8 + 1);
  char* buf_ptr = buf_str;
  for (uint8_t i = 0; i < 8; i++) {
    buf_ptr += sprintf(buf_ptr, "%02X", deviceAddress[i]);
  }
  *(buf_ptr) = '\0';
  return buf_str;
}

float getTemp(uint8_t* addr, int samples, int delay_ms) {
  float sample[samples];
  float tmp;
  uint8_t l,i,j;
  for ( l = 0; l < samples; l++) {
    sensors.requestTemperaturesByAddress(addr); 
    sample[l] = sensors.getTempC(addr); 
    Serial.print("D "); 
    Serial.print(batoh(addr)); Serial.print(" "); 
    Serial.print(sample[l]); 
    Serial.println(" D");
    delay(delay_ms);
  }
  
  for ( i = 0; i < samples; i++ ) {
    for ( j = 1; j < (samples-i); j++ ) {
      if (sample[j-1] > sample[j]) {
        tmp = sample[j-1];
        sample[j-1]=sample[j];
        sample[j]=tmp;
      }
    }
  }
 
    
  return sample[samples/2];
}

void loop(void)
{ 
  uint8_t i;
  uint8_t addr[8];  
  uint8_t dcnt;
  
  sensors.begin();

  dcnt = sensors.getDeviceCount();
  //sensors.requestTemperatures();
  
  for ( i = 0; i < dcnt; i++ ) {
    sensors.getAddress(addr,i);
    float temp_c = getTemp(addr,_NUM_SAMPLES,_SAMPLE_DELAY);
    if (temp_c < -55.0 || temp_c > 125.0) { // range really -55 - +125, retry once if value returned is outside that range
      delay(_SAMPLE_DELAY);
      sensors.begin();
      temp_c = getTemp(addr,_NUM_SAMPLES,_SAMPLE_DELAY);
    } 
      Serial.print(batoh(addr));
      Serial.print(" ");
      Serial.println(temp_c);
  } 
  
  delay(LOOP_DELAY_1);
  delay(LOOP_DELAY_2);
}

Why read the same sensor several times? Because some of my sensors want to send either 85.00 or -127.00 every now and then once or twice in a row. Also sometimes I've been getting reading of the previous requested sensor when reading the next one. Reading 3 times and discarding the highest & lowest is not optimal, but it's good enough for me, for now. I had these same problems with the old, now broken, system using digitemp.

All the readings go to mysql database from which I create graphs with jpgraph library. I didn't want to include any date & time logic in the arduino part, so I'm reading the values from the serial port and inserting them to the db with 'current_timestamp'. I do that by reading the serial port constantly, with awk

awk '{ gsub("\\r",""); if (NF == 2) print "insert into temps (time_date,temp_c,sensor_serial) values (current_timestamp,\047"$2"\047,\047"$1"\047);"; fflush();}' /dev/cu.usbserial-A9007TRT | /opt/local/bin/mysql5 -u temps -pxxxxxx automation2

I use OSX for that, so I've made a little launchd script out of it (in linux the same can be done with inittab), it just makes sure the process keeps running.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Disabled</key>
    <false/>
    <key>KeepAlive</key>
    <true/>
    <key>Label</key>
    <string>com.cue.onewire.temperatures</string>
    <key>RunAtLoad</key>
    <true/>
    <key>Umask</key>
    <integer>7</integer>
    <key>ProgramArguments</key>
    <array>
        <string>/opt/local/bin/storetemperatures.sh</string>
    </array>    
    <key>UserName</key>
    <string>esav</string>
</dict>
</plist>

Tell launchd to load your plist and you're done. Note that I've put the awk into a shell script because I didn't want to escape those parameters to plist &amp;#58;&amp;#41;

sudo launchctl load /Library/LaunchDaemons/your.own.plist

Ubuntu 10.04 Lucid Lynx - PXE bootable installation without any bootable media to begin with

  09/21/10 23:22, by Esa, Categories: Software

I have an old Thinkpad, which cannot boot from anything else than over the network using PXE client. I do have server in the lan that can handle PXE clients.

A quick summary how to get Lucid Lynx to be served over NFS, using installation CD and USB stick to install it to. Or like me, using PXE booting installation CD (there are instructions on the net on how to do it, if you have problems, ask here).

  • Boot the machine with the installation cd and do whatever kind of installation you want to the USB stick, make it one partition with no swap.
  • When finished, reboot the machine with the installation CD again, mount the USB stick, mount proc & dev to it and then chroot

Assuming your USB stick goes to sda1

sudo mkdir -p /mnt/stick
sudo mount /dev/sda1 /mnt/stick
sudo mount -t proc none /mnt/stick/proc
sudo mount -o bind /dev /mnt/stick/dev
sudo chroot /mnt/stick
source /etc/profile

You're now basically using your brand new Lucid Lynx on a stick. Next you need to generate initrd image which contains necessary modules etc for your pxe boot.

  • Create a copy of /etc/initramfs-tools
  • Edit /etc/initramfs-tools-pxe/initramfs.conf. Change line 'MODULES=most' to 'MODULES=netboot' and line 'BOOT=local' to 'BOOT=nfs'
  • Generate new initrd.
  • Edit fstab, remove existing root definition, add new usig /dev/nfs
  • Transfer the USB stick contents to PXE server
cp -R /etc/initramfs-tools /etc/initramfs-tools-pxe
nano /etc/initramfs-tools-pxe/initramfs.conf
mkinitramfs -d /etc/initramfs-tools-pxe -o /boot/initrd.img-2.6.32-21-generic-pxe 2.6.32-21-generic
nano /etc/fstab

Contents of /etc/fstab after editing

# /etc/fstab: static file system information.
#
# Use 'blkid -o value -s UUID' to print the universally unique identifier
# for a device; this may be used with UUID= as a more robust way to name
# devices that works even if disks are added and removed. See fstab(5).
#
# <file system> <mount point>   <type>  <options>       <dump>  <pass>
/dev/nfs	/		nfs	defaults	1	1
proc            /proc           proc    nodev,noexec,nosuid 0       0

To transfer the filesystem contents to PXE server you can use whatever method you want, just preserver file permissions. I used rsync over ssh.

rsync -avz --exclude /proc -e ssh / root@10.10.10.1:/tftproot/stick/

Now you're done on the client side. Next copy boot/initrd.img-2.6.32-21-generic-pxe and boot/vmlinuz-2.6.32-21-generic to the root of your tftp server. Then configure the rest PXE server (use google, or ask here). Remember to add the directory with the stick contents to /etc/exports. This is my /tftproot/pxelinux.cfg/01-XX-XX-XX-XX-XX-XX (x's being the mac address of the thinkpad)

timeout 10
prompt 1
default Ubuntu

label Ubuntu
        kernel vmlinuz-2.6.32-21-generic
        append root=/dev/nfs initrd=initrd.img-2.6.32-21-generic-pxe nfsroot=10.10.10.100:/tftproot/stick ip=dhcp rw nosplash 

Reboot the client and you're done.

Samba (smb,cifs) share from Mac OSX Snow Leopard to Linux

  09/08/10 20:15, by Esa, Categories: Software

If you are trying to mount a directory from OSX with 'Windows sharing' enabled and you have problems with characters not showing properly then your linux system has something else than utf8 in nls_default.

To make it work, simply put something like


//10.10.10.10/music /mnt/music cifs rw,credentials=/etc/credentials,iocharset=utf8 0 0

into your /etc/fstab (the important bit being iocharset=utf8). To avoid having to type plaintext passwords in world readable file (/etc/fstab) you can specify credentials file, which can be readable by only root. Credentials file needs to have two lines in it

username=zzzz
password=yyyy

All you need to do now is

umount /mnt/music & mount /mnt/music

:: Next >>