Adding a new device type

From ago control wiki
Jump to: navigation, search

Contents

Tutorial for adding a new device type

This tutorial will take you through all steps and files needed to add a new device type to agocontrol. As an example the "Computer" device type used by Wake-on-LAN (WOL) will be used.

Add to schema

If you're introducing a new device type to agocontrol, you need to make the system aware of it. This is done by adding it to a configuration file.

File name: conf/schema.d/ - select a relevant .yaml-file This example: conf/schema.d/10-automation.yaml

 computer:
   name: General computer (for WOL)
   description: A computer
   commands: ["on"]

Add to main web script

Add your device type to supported_devices
File name: core/rpc/html/js/app.js

var supported_devices = [ "switch", "dimmer", "binarysensor", "dimmerrgb", "multilevelsensor",
"scenario", "drapes", "brightnesssensor", "powermeter", "energysensor", "humiditysensor", "phone",
"pushbutton", "placeholder", "temperaturesensor", "energymeter", "squeezebox", "computer" ];

HTLM template for device

This template is a copy of switch.in.html. The OFF-command is obviously taken away and the icon is changed from icon-lamp to icon-keyboard.
N.B! The file name has to be the same as the device type.
File name: core/rpc/html/templates/devices/computer.in.html

 <div class="four columns grid-item device"  data-bind="attr: {'data-uuid': uuid}"> 
	<div class="row">
		<div class="three columns">
			<div class="pretty large primary btn grid-item-icon handle">
				<i class="icon-keyboard" data-bind="click: showDetails"></i>
			</div>
		</div>
		<div class="nine columns">
			<div class="grid-item-header">
				<h3 data-bind="text: name, if: name"></h3>
				<ko opts="if: room ">
					<p class="room"><i class="icon-location"></i><span data-bind="text: room"></span></p>
				</ko>
                                <p class="info"><i class="icon-info"></i>
                                        <ko opts="if: state() == 0">
                                                <_span data-translateable="true">OFF</_span>
                                        </ko>
                                        <ko opts="if: state() == 255">
                                                <_span data-translateable="true">ON</_span>
                                        </ko>
                                </p>
			</div>
		</div>
	</div>
	<div class="row grid-item-controls">
		<div class="six columns">
		    <ko opts="if: state ">
                <_div data-translateable="true" class="cmd-btn pretty medium default btn btn-full grid-command" data-bind="click: turnOn" data-value="on">ON</_div>
            </ko>
            <ko opts="ifnot: state ">
                <_div data-translateable="true" class="cmd-btn pretty medium primary btn btn-full grid-command" data-bind="click: turnOn" data-value="on">ON</_div>
            </ko>
		</div>
	</div>
 </div>

debian install script

configobj.py and pinger.py are additional programs used by this example, likelly irrelevant for other device types.
File name: debian/agocontrol-wake_on_lan.install

lib/systemd/system/agowake_on_lan.service
opt/agocontrol/bin/agowake_on_lan.py
opt/agocontrol/bin/configobj.py
opt/agocontrol/bin/pinger.py 

debian package

Add section to the main install script
File name: debian/control

Package: agocontrol-wake_on_lan
Architecture: all
Depends: ${shlibs:Depends}, ${misc:Depends}, libagoclient1.0
Description: Wake on LAN support

Update cmake

Create a CMakeLists.txt

cmake_minimum_required (VERSION 2.6)
install (PROGRAMS agowake_on_lan.py pinger.py configobj.py DESTINATION ${BINDIR})

Update devices/CMakeLists.txt

set (AGODEVICES
  shvt250
  ...
  ...
  webcam
  temperatur.nu
  wake_on_lan       <<--- Add this line
)

Device driver

Main logic

Finally, a device driver that uses the new device type. This is a plain vanilla task as outlined in Example Device.
File name: devices/wake_on_lan/agowake_on_lan.py

    client.addDevice(deviceId, "computer")

Config file

File name: devices/wake_on_lan/wake_on_lan.conf

[wake_on_lan]
debug=false

[Computers]
	[[DCErouter]]
	name=DCErouter
	mac=01:14:DD:D1:B9:5D
	host=dcerouter

	[[Test]]
	name=test
	mac=00:01:02:03:04:FF
	host=thisshouldfail

New cmake list

Compiling on the hardware running agocontrol

Ago utilizes cmake to build your C++ program. CMake requires a CMakeList.txt in your program's folder and Ago requires another to know which programs to build. It is probably easiest to copy and edit the CMakeList.txt from the example folder to your folder:

For installations with a common install structure, the files are here (where USER is your username):

File name: agcontrol/devices/

Within your folder, edit the CMakeList.txt to match your conditions. For example:

cmake_minimum_required (VERSION 2.6)

file (GLOB_RECURSE DEVICE_SOURCE_FILES *.cpp)

set (DEVICE_EXTRA_LIBRARIES
     agoclient
)

#set a device name. This will be the 'target'
set (DEVICE "(YOUR_DEVICE_NAME_HERE")

include_directories("${CMAKE_CURRENT_SOURCE_DIR}")

# add the executable
add_executable (${DEVICE} ${DEVICE_SOURCE_FILES})
target_link_libraries (${DEVICE} ${DEVICE_EXTRA_LIBRARIES})

install (TARGETS ${DEVICE} RUNTIME DESTINATION ${BINDIR})

Then, you must add your device to the build CMakeList.txt (located within the devices folder):

cmake_minimum_required (VERSION 2.6)

set (AGODEVICES
  enocean3
  blinkm
  chromoflex
  firmata
  i2c
  ...
  YOUR_DEVICE_NAME_HERE
)

Once completed, we just need to run CMake from our target location to start the build process. I build into a new folder I've created at /home/run. A simple script simplifies the process for future builds. Here are the contents from my "build.sh" file that I store in /home:

#!/bin/bash
cd /home/run/
rm -r *
cmake /home/USER/agocontrol/
cd devices/YOUR_DEVICE_NAME_HERE
make
chmod a+rx YOUR_DEVICE_NAME_HERE
chown agocontrol YOUR_DEVICE_NAME_HERE
chgrp agocontrol YOUR_DEVICE_NAME_HERE

This simply enters into the /home/run folder, removes all previous files, runs cmake on the available devices, and the makes only your new device. The last three lines add premissions and change the owner to agocontrol

TODO- Cross compiling

Service definition

File name: conf/systemd/agowake_on_lan.service

[Unit]
Description=ago control Wake on LAN handler

[Service]
ExecStart=/opt/agocontrol/bin/agowake_on_lan.py
WorkingDirectory=/opt/agocontrol/bin
StandardOutput=syslog
StandardError=syslog
Restart=always
RestartSec=2
User=root

[Install]
WantedBy=multi-user.target
Personal tools