Thursday, March 19, 2009
OSDBuffer Update
I have updated OSDBuffer to correctly handle osd.basic messages with delay=0. I've also added a clear buffer function, which you can get to by right-clicking the icon in the tray. Download here.
Monday, March 16, 2009
A Watchdog Timer for Your Online Life
Death Switch (via Lifehacker) will ping you, and if you don't respond to enough pings, they'll send out emails to your friends, family, online gaming buddies, etc. informing them of your apparent demise.
Don't Forget to Vacuum Out Your Servers
This weekend, I powered down my HA server to install a new disk and do my periodic server vacuuming. I have two 120mm fans in the case to keep things cool, so it pulls in a ton of dust that ends up resting on drives, cards and in the CPU heat sink. The CPU heat sink was especially caked and I had to blow it out using a can of compressed air. The clean heat sink makes a huge difference in the CPU temps - about a 10 degree difference as you can see in the graph below:


Saturday, March 14, 2009
xEKG Monitors xPL and xAP Heartbeats
I just finished another application called xEKG. It monitors your xPL and xAP devices and informs you via osd messages that a device hasn't checked in. Read more about and download it from here.
Friday, March 13, 2009
OSDBuffer, an xPL OSD Display
Sometimes I just miss seeing an OSD message on my PC and there's no way to see what it was (unless I'm logging xPL messages). That inconvenience served as the inspiration for OSDBuffer, my second C# application. OSDBuffer is a typical OSD popup application, however, it buffers the last 10 OSD messages received. You can scroll through them when you want. You can also customize the frame around the popup to your liking. Here's a video of it in action.
Read more about it & download it from here.
Read more about it & download it from here.
Monday, March 9, 2009
Welcome!
Welcome! I've imported all blog posts from kjsdoghouse.blogspot.com and updated links. Hopefully, I haven't missed anything, but if I did, leave a comment & let me know. Thanks!
Saturday, March 7, 2009
Announcing xScript
After some pains, I've completed my first C# application. It's called xScript. It's a free form scripting engine for xPL and xAP - no point and click - just a text file as input. You can use either vbscript, jscript, perl or python as your scripting language of choice. The zip file contains 4 sample scripts - xScript.js.sample is the most complete. Whichever language you decide to use, remove the .sample suffix from the script name. Valid scripting file names are xScript.js, xScript.vbs, xScript.py and xScript.pl. Make sure you have only one valid file name otherwise you may confuse yourself as xScript automatically picks a script file based on the first one it finds with a valid name. Finally, make sure you have installed the latest .NET frameworks by using Windows update or downloading directly from microsoft.com.
Download xScript here and let me know how it works out for you.
Download xScript here and let me know how it works out for you.
Friday, March 6, 2009
Trying My Hand at C#
All the applications I've written so far have been in VB.net. It's very structured which makes learning it really easy. Yesterday, I decided it's time to take the plunge and learn C#. So far, it's been a pain trying to relearn things I knew so well in VB.net. I'm making slow progress, but it doesn't seem to be very intuitive to me right now. Hopefully that changes...
Thursday, March 5, 2009
Adobe Acrobat Reader Vulnerability
In case you're unaware, there is a major problem with Adobe Acrobat which doesn't even require you to open a PDF file. The best thing to do? Uninstall Acrobat Reader and install Foxit Reader. Foxit Reader is much lighter on resources as well.
Update: Foxit Reader has a problem as well, but they released a new version on 3/9/09
Update: Foxit Reader has a problem as well, but they released a new version on 3/9/09
Tuesday, March 3, 2009
xPL Gameport Enhanced & Released
This weekend, I was trying to add a CDS sensor in the family room to more accurately sense darkness. It works great with a DS10A, but I wanted to hardwire it to make it more reliable. I tried connecting it to an input on my gameport device that I use for contact closure detection, but the resistance of the CDS sensor with the light on is apparently too high for the gameport to detect a closed condition. What else can I use? What about using the X and Y axis inputs on the gameport as analog inputs? So that's what I did. I updated my gameport app to read the axis values and send out sensor.basic messages on changes. I had to add a larger debounce delay when sampling since the CDS input bounces a little when changing. In any case, it's up & running for a couple days now and works well.
This is probably one of my most favorite apps I've written and I know I haven't released it yet, so here it is. You'll need a config.txt file in the same directory. For each gameport you have hooked up, you'll need to label the inputs - 4 button inputs and 2 axis inputs. The final parameter will be the polling time in ms. The polling interval for the axis inputs in derived from the polling time specified in the file.
config.txt format:
<gameport0_button0>,<gameport0_button1>,<gameport0_button2>,<gameport0_button3>,<gameport0_xaxis>,<gameport0_yaxis>,<polling interval>
example:
garagedoor,doorbell,blank02,blank03,FRDark,yaxis0,50
If you have more than one gameport connected, then specify all the inputs first, then the polling interval (all on a single line):
garagedoor,doorbell,backdoor,garagemotion,FRDark,yaxis0, amppower,dvdpower,tvpower,blank13,xaxis1,yaxis1,50
Finally, don't forget to install the DirectX redistributable runtime from here.
I have only tested the app with the Super Joy Box 8 USB to gameport adapter, which has 4 gameports and gives you 16 digital and 8 analog inputs for about $20.
This is probably one of my most favorite apps I've written and I know I haven't released it yet, so here it is. You'll need a config.txt file in the same directory. For each gameport you have hooked up, you'll need to label the inputs - 4 button inputs and 2 axis inputs. The final parameter will be the polling time in ms. The polling interval for the axis inputs in derived from the polling time specified in the file.
config.txt format:
<gameport0_button0>,<gameport0_button1>,<gameport0_button2>,<gameport0_button3>,<gameport0_xaxis>,<gameport0_yaxis>,<polling interval>
example:
garagedoor,doorbell,blank02,blank03,FRDark,yaxis0,50
If you have more than one gameport connected, then specify all the inputs first, then the polling interval (all on a single line):
garagedoor,doorbell,backdoor,garagemotion,FRDark,yaxis0, amppower,dvdpower,tvpower,blank13,xaxis1,yaxis1,50
Finally, don't forget to install the DirectX redistributable runtime from here.
I have only tested the app with the Super Joy Box 8 USB to gameport adapter, which has 4 gameports and gives you 16 digital and 8 analog inputs for about $20.
Monday, March 2, 2009
Sample EventGhost Python Script for Parsing xPL Messages
To make my EventGhost xPL plugin really useful, you really need to be able to pick apart an xPL message to extract data from it. Luckily, EG allows you to associate a script with a macro. This makes it pretty simple to create complex interactions based on xPL messages. Just create an event to trigger on 'xPL.*' and add an action to it that's a Python script. Here's a sample script that sends an acknowledgment message when Blabber receives the word 'test' from a user. This script can easily be extended to handle all your xPL interactions.
import re
# split up the event components
xPLSplit = eg.event.suffix.split(':')
# make the pieces easy to remember
xPLType = xPLSplit[0]
xPLSchema = xPLSplit[1]
xPLSource = xPLSplit[2]
xPLTarget = xPLSplit[3]
xPLBody = xPLSplit[4]
# we only want xpl-trig messages
if xPLType == "xpl-trig":
# only want messages from blabber
if re.search('doghouse-blabber',xPLSource):
bodySplit = xPLBody.split(',')
# extract the components of the message body
for i in range(3):
if re.search('device',bodySplit[i]):
senderSplit = bodySplit[i].split('=')
elif re.search('type',bodySplit[i]):
typeSplit = bodySplit[i].split('=')
elif re.search('current',bodySplit[i]):
currentSplit = bodySplit[i].split('=')
# we only want the message type and messages that
# contain the word 'test'
if typeSplit[1] == "message" and currentSplit[1]=="test":
# if we get 'test' we'll reply back to the sender
# that we got his message
returnMsg = "device="+senderSplit[1]+"\n"+"current=EG got your test"
eg.plugins.xPL.sendxPL(u'xpl-cmnd', u'control.basic', xPLSource, \
returnMsg)
Subscribe to:
Posts (Atom)