Archive for February, 2008

Security Script for W800RF32 & Indigo

Wednesday, February 20th, 2008

Here’s the v1.00 revision of the Indigo Security Script sample.

The Changes included here are:

* Fixed bug in the Chime code that would not reset the Chime_Last_Sounded_ms value properly.
* Added the date back to the XXXXX_Last_update value.

- Benjamin

Security_Script-100.zip

The Adventures of Systems Boy!: Delayed ACK Startup Item for Intel Macs

Wednesday, February 20th, 2008

The Adventures of Systems Boy!: Delayed ACK Startup Item for Intel Macs: ”
Delayed ACK Startup Item for Intel Macs
MacFixit just reported about troubles the new Intel-based Macs are having with network speeds, particularly AFP connections to, of all things, other Macs. The solution, they report, is to set the delayed_ack property to 0. In order for this change to survive a reboot, however, they recommend editing /etc/rc. The problem with this is that, often, edits made to /etc/rc will be overwritten by future updates to Mac OSX. In my experience, such modifications are better handled with a startup item, which is also a lot easier to add and remove. So I’ve suggested as much to the fine folks over at MacFixit, and I’ve even put my money where my mouth is. I’m offering to those who need it this delayedACK Startup Item, hand made by yours truly.

The linked disc image contains the delayedACK Startup Item, and also includes an installer and an uninstaller for the Startup Item.

Enjoy, you lucky Intel Mac owners (of which, alas, I am not one… Yet…)

UPDATE:

(Via .)

Security Script for W800RF32 & Indigo

Sunday, February 17th, 2008

Here’s a revision of the Indigo security script sample, that adds GROWL support, X10 Chime support, and the data is stored in a array/matrix.

Please be Kind… This is the first major Applescript that I have done… So any suggestions on improving it, are welcome…

The key to customizing this script, is as follows:

1) Use_Growl, if true, Growl notifications will be broadcast for any Opened / Closed events. If False, no Growl notifications will be sent.

2) The X10 Chime support is activated on a Alarm by Alarm Basis… (See Alarm_Matrix)

3) The Chime can be set to only be activated on a OPEN status change
4) The Chime can be set to not activate until xx minutes have past since the last chime.
(For example, I trigger the chime by opening the door to take the trash out… I don’t
want the chime to go off again until 3 minutes later… That way when I come back in
the chime won’t go off… The Growl notifications & log entries are still created,
the chime just doesn’t go off..)

5) The Alarm’s to monitor are stored in a array…
The array stores the Alarm ID, the English name that you want to use in the
log & growl notifications (NO SPACES IN THE English name!). The Growl notification
flag for each sensor, the chime flag for each sensor, and the Indigo label for the chime module.

– 1 - Device ID
– 2 - English Name,
– 3 - Growl flag
– 4 - Chime flag
– 5 - Indigo Chime Device ID (Label)

Example:

property Alarm_Matrix : {¬
{9, “Test_Sensor”, true, true, “G01 = Remote Chime”}, ¬
}

- Benjamin

Here’s the code ZIPPED…new security sample 2.scpt.zip

And in plain text…

-- 153 is Kitchen Door
--  45 is Garage Door
-- 217 is Dinning Room
property Use_Growl : true
property Growl_Notifications_List : {"Opened", "Closed"}
property Growl_Enabled_Notifications : {"Opened"}

property Chime_Only_On_Open : true
property Chime_Min_delay : 3
-- 1 - Device ID
-- 2 - English Name,
--  3 - Growl Enabled
--  4 - Chime
--  5 - Chime Device ID (Label)

property Alarm_Matrix : {¬
	{9, "Test_Sensor", true, true, "G01 = Remote Chime"}, ¬
	{153, "Kitchen_Door", true, true, "G01 = Remote Chime"}, ¬
	{45, "Garage_Door", true, true, "G01 = Remote Chime"}, ¬
	{217, "Dining_Room", true, true, "G01 = Remote Chime"} ¬
		}

-- Send Growl Notification
on Send_to_Growl(door, action)
	tell application "GrowlHelperApp"
		-- Make a list of all the notification types
		-- that this script will ever send:
		set the allNotificationsList to Growl_Notifications_List
		set the enabledNotificationsList to Growl_Enabled_Notifications

		register as application ¬
			"Indigo Security" all notifications allNotificationsList ¬
			default notifications enabledNotificationsList ¬
			icon of application "Script Editor"

		notify with name ¬
			action title ¬
			door & " " & action description ¬
			door & " " & action application name "Indigo Security"
	end tell
end Send_to_Growl

using terms from application "IndigoServer"
	on Set_Variable(variable_name, variable_value)
		if not (variable (variable_name) exists) then
			make new variable with properties {name:variable_name, value:variable_value}
		else
			set value of (variable (variable_name)) to variable_value
		end if
	end Set_Variable
end using terms from

using terms from application "IndigoServer"
	on decode_security(eventType, device_ID)
		set door to ""
		set action to ""
		set alarm_detected to false
		set growling to false
		set chiming to false
		set chime_device to ""

		repeat with alarmdata in Alarm_Matrix
			if device_ID is item 1 in alarmdata then
				set door to item 2 in alarmdata
				if eventType is sec_SensorNormal_min then set action to "Closed"
				if eventType is sec_SensorAlert_min then set action to "Opened"
				set alarm_detected to true
				set growling to item 3 in alarmdata
				set chiming to item 4 in alarmdata
				set chime_device to item 5 in alarmdata
			end if
		end repeat
		return {door, action, alarm_detected, growling, chiming, chime_device}
	end decode_security
end using terms from

using terms from application "IndigoServer"
	on receive security event of eventType with code devID
		--		if eventType is sec_ArmHome_min then log "arm home (min)" using type "Security Sample"
		--		if eventType is sec_ArmHome_max then log "arm home (max)" using type "Security Sample"
		--		if eventType is sec_ArmAway_min then log "arm away (min)" using type "Security Sample"
		--		if eventType is sec_ArmAway_max then log "arm away (max)" using type "Security Sample"
		--		if eventType is sec_Disarm then log "disarm" using type "Security Sample"
		--		if eventType is sec_Panic then log "panic" using type "Security Sample"
		--		if eventType is sec_LightsOn then log "security lights on" using type "Security Sample"
		--		if eventType is sec_LightsOff then log "security lights off" using type "Security Sample"
		--		if eventType is sec_SensorNormal_min then log "sensor normal (min delay)" using type "Security Sample"
		--		if eventType is sec_SensorNormal_max then log "sensor normal (max delay)" using type "Security Sample"
		--		if eventType is sec_SensorAlert_min then log "sensor alert (min delay)" using type "Security Sample"
		--		if eventType is sec_SensorAlert_max then log "sensor alert (max delay)" using type "Security Sample"

		set alarm_detected to false

		set decoded_data to decode_security(eventType, devID)
		-- door, action, alarm_detected

		set chime_device to item 6 of decoded_data
		set chime_enabled to item 5 of decoded_data
		set growl_enabled to item 4 of decoded_data
		set alarm_detected to item 3 of decoded_data
		set action to item 2 of decoded_data
		set door to item 1 of decoded_data
		if alarm_detected is false then
			-- Unknown Security Device
			log "(device ID " & devID & ")" using type "Security Sample"
		else if alarm_detected is true then
			log (time string of (current date) as string) & " " & door & " " & action
			if action is "Opened" then beep

			-- Send Growl Notification
			if Use_Growl then
				if growl_enabled then Send_to_Growl(door, action)
			end if

			if chime_enabled then
				set last_chimed_ms to value of variable "Chime_Last_Sounded_ms"
				if (time of (current date) ≥ last_chimed_ms + (Chime_Min_delay * 60)) then
					if Chime_Only_On_Open is false then
						turn on chime_device for 1
						Set_Variable(("Chime_Last_Sounded_ms"), time of (current date) as string)
						Set_Variable(("Chime_Last_Sounded_ms"), time string of (current date) as string)

					else
						if action is "Opened" then
							Set_Variable(("Chime_Last_Sounded_ms"), time of (current date) as string)
							Set_Variable(("Chime_Last_Sounded"), time string of (current date) as string)
							turn on chime_device for 1
						end if
					end if
				end if
			end if

			Set_Variable((door & "_last_update"), time string of (current date) as string)
			Set_Variable((door & "_last_status") as string, action as string)

			--log value of variable "SoundChime" as string

		end if
		--log "(device ID " & devID & ")" using type "Security Sample"

	end receive security event
end using terms from