OpenHAB
(→Creating an items file) |
(→Creating an items file) |
||
Line 9: | Line 9: | ||
== Tools == | == Tools == | ||
− | === Creating | + | === Creating openHAB configuration files (items, sitemap, rrd4j persistence) === |
+ | Adjust unit_name and output_directory. | ||
+ | |||
+ | ==== items ==== | ||
https://github.com/openhab/openhab/wiki/Explanation-of-items | https://github.com/openhab/openhab/wiki/Explanation-of-items | ||
+ | Place *.items in: /openHAB/runtime/configurations/items | ||
+ | |||
+ | ==== sitemap ==== | ||
+ | https://github.com/openhab/openhab/wiki/Explanation-of-Sitemaps | ||
+ | |||
+ | Place *.sitemap in: /openHAB/runtime/configurations/sitemaps | ||
+ | |||
+ | ==== rrd4j persistence ==== | ||
+ | https://github.com/openhab/openhab/wiki/Persistence | ||
+ | |||
+ | Add rrd4j.persist_add to the Items section in /openHAB/runtime/configurations/persistence/rrd4j.persist and make sure that the strategies used are defined in the Strategies section. | ||
+ | |||
+ | ==== Luup code for MiOS devices ==== | ||
<source lang="text"> | <source lang="text"> | ||
− | local unit_name = 'house' | + | -- by Ap15e |
+ | |||
+ | local unit_name = 'house' | ||
+ | local output_directory = '/dataMine' | ||
local device_types = | local device_types = | ||
− | { [ 'urn:schemas-upnp-org:device:DimmableLight:1' ] = { 'Dimmer' , ' [%d]%' | + | { [ 'urn:schemas-upnp-org:device:DimmableLight:1' ] = { 'Dimmer' , ' [%d]%' , '<slider>' , '/service/Dimming1/LoadLevelStatus,command:MAP(miosDimmerCommand.map)' }, |
− | [ 'urn:schemas-upnp-org:device:BinaryLight:1' ] = { 'Switch' , '' | + | [ 'urn:schemas-upnp-org:device:BinaryLight:1' ] = { 'Switch' , '' , '' , '/service/SwitchPower1/Status,command:ON=SwitchPower1/SetTarget(newTargetValue=1)|OFF=SwitchPower1/SetTarget(newTargetValue=0),in:MAP(miosSwitchIn.map)' }, |
− | [ 'urn:schemas-micasaverde-com:device:TemperatureSensor:1' ] = { 'Number' , ' [%.1f °C]' , '<temperature>', '/service/TemperatureSensor1/CurrentTemperature' }, | + | [ 'urn:schemas-micasaverde-com:device:TemperatureSensor:1' ] = { 'Number' , ' [%.1f °C]', '<temperature>' , '/service/TemperatureSensor1/CurrentTemperature' }, |
− | [ 'urn:schemas-micasaverde-com:device:HumiditySensor:1' ] = { 'Number' , ' [%d]%' | + | [ 'urn:schemas-micasaverde-com:device:HumiditySensor:1' ] = { 'Number' , ' [%d]%' , '' , '/service/HumiditySensor1/CurrentLevel' }, |
− | [ 'urn:schemas-micasaverde-com:device:MotionSensor:1' ] = { 'Contact', ' [%s]' | + | [ 'urn:schemas-micasaverde-com:device:MotionSensor:1' ] = { 'Contact', ' [%s]' , '<contact>' , '/service/SecuritySensor1/Tripped,in:MAP(miosContactIn.map)' }, |
− | [ 'urn:schemas-micasaverde-com:device:LightSensor:1' ] = { 'Number' , ' [%.2f]%' | + | [ 'urn:schemas-micasaverde-com:device:LightSensor:1' ] = { 'Number' , ' [%.2f]%' , '' , '/service/urn:micasaverde-com:serviceId:LightSensor1/CurrentLevel' }, |
− | [ 'urn:schemas-micasaverde-com:device:DoorSensor:1' ] = { 'Contact', ' [%s]' | + | [ 'urn:schemas-micasaverde-com:device:DoorSensor:1' ] = { 'Contact', ' [%s]' , '<contact>' , '/service/SecuritySensor1/Tripped,in:MAP(miosContactIn.map)' }, |
− | [ 'urn:schemas-upnp-org:device:Heater:1' ] = { 'Number' , ' [%.1f °C]' , '<temperature>', '/service/urn:upnp-org:serviceId:TemperatureSetpoint1_Heat/CurrentSetpoint' }, | + | [ 'urn:schemas-upnp-org:device:Heater:1' ] = { 'Number' , ' [%.1f °C]', '<temperature>' , '/service/urn:upnp-org:serviceId:TemperatureSetpoint1_Heat/CurrentSetpoint' }, |
− | [ 'urn:schemas-micasaverde-com:device:UvSensor:1' ] = { 'Number' , ' [%d]' | + | [ 'urn:schemas-micasaverde-com:device:UvSensor:1' ] = { 'Number' , ' [%d]' , '' , '/service/urn:upnp-org:serviceId:UvSensor1/CurrentLevel' }, |
− | [ 'urn:schemas-micasaverde-com:device:RainSensor:1' ] = { 'Number' , ' [%.1f]' | + | [ 'urn:schemas-micasaverde-com:device:RainSensor:1' ] = { 'Number' , ' [%.1f]' , '' , '/service/urn:upnp-org:serviceId:RainSensor1/CurrentTRain' }, |
− | [ 'urn:schemas-micasaverde-com:device:ScaleSensor:1' ] = { 'Number' , ' [%.1f]' | + | [ 'urn:schemas-micasaverde-com:device:ScaleSensor:1' ] = { 'Number' , ' [%.1f]' , '' , '/service/urn:micasaverde-com:serviceId:ScaleSensor1/Weight' }, |
− | [ 'urn:schemas-micasaverde-com:device:BarometerSensor:1' ] = { 'Number' , ' [%.2f]hPa' , '' | + | [ 'urn:schemas-micasaverde-com:device:BarometerSensor:1' ] = { 'Number' , ' [%.2f]hPa', '' , '/service/urn:upnp-org:serviceId:BarometerSensor1/CurrentPressure' }, |
− | [ 'urn:schemas-micasaverde-com:device:WindSensor:1' ] = { 'Number' , ' [%.1f]' | + | [ 'urn:schemas-micasaverde-com:device:WindSensor:1' ] = { 'Number' , ' [%.1f]' , '<wind>' , '/service/urn:upnp-org:serviceId:WindSensor1/AvgSpeed' }, |
− | [ 'urn:schemas-micasaverde-com:device:SmokeSensor:1' ] = { 'Contact', ' [%s]' | + | [ 'urn:schemas-micasaverde-com:device:SmokeSensor:1' ] = { 'Contact', ' [%s]' , '<contact>' , '/service/urn:upnp-org:serviceId:SmokeSensor1/Tripped,in:MAP(miosContactIn.map)' }, |
− | [ 'urn:demo-micasaverde-com:device:weather:1' ] = { 'String' , ' [%s]' | + | [ 'urn:demo-micasaverde-com:device:weather:1' ] = { 'String' , ' [%s]' , '' , '/service/urn:micasaverde-com:serviceId:Weather1/Condition' }, |
− | [ 'urn:schemas-ap15e-com:device:DAD' ] = { 'String' , ' [%s]' | + | [ 'urn:schemas-ap15e-com:device:DAD' ] = { 'String' , ' [%s]' , '<sun>' , '/service/urn:upnp-ap15e-com:serviceId:DAD1/Sunrise_HHMMSS' }, |
− | [ 'urn:schemas-micasaverde-com:device:WindowCovering:1' ] = { 'Switch' , '' | + | [ 'urn:schemas-micasaverde-com:device:WindowCovering:1' ] = { 'Switch' , '' , '<rollershutter>', '/service/SwitchPower1/Status,command:ON=SwitchPower1/SetTarget(newTargetValue=1)|OFF=SwitchPower1/SetTarget(newTargetValue=0),in:MAP(miosSwitchIn.map)' } } |
Line 44: | Line 63: | ||
end | end | ||
− | |||
− | + | function write_items() | |
− | + | ||
− | + | outf = io.open( output_directory .. '/' .. unit_name .. '.items', 'w\n' ) | |
− | + | ||
− | + | ||
− | + | outf:write( 'Group Rooms (All)\n' ) | |
− | for k, v in pairs( | + | for k, v in pairs( device_types ) |
− | + | do | |
− | + | t = string.match( k or '', '%:(%a*)%:1' ) | |
+ | outf:write( 'Group _' .. tostring( t ) .. 's "' .. tostring( t ) .. 's" (Rooms)\n' ) | ||
+ | outf:write( 'Number _' .. tostring( t ) .. 'sChartPeriod\n' ) | ||
− | + | end | |
− | luup. | + | for k, v in pairs( luup.rooms ) |
+ | do | ||
− | + | outf:write( 'Group ' .. normalize_name( tostring( v ) ) .. ' "' .. tostring( v ) .. '" <' .. normalize_name( tostring( v ) ) .. '> (Rooms)\n' ) | |
− | + | end | |
− | + | outf:write( 'Group _no_room "no room" <_no_room> (Rooms)\n' ) | |
− | + | ||
− | + | for k, v in pairs(luup.devices) | |
+ | do | ||
− | + | dt = device_types[ v.device_type ] | |
+ | |||
+ | if dt ~= nil | ||
+ | then | ||
+ | |||
+ | t = string.match( v.device_type or '', '%:(%a*)%:1' ) | ||
+ | |||
+ | outf:write( tostring( dt[ 1 ] ) .. ' ' .. normalize_name( tostring( v.description ) ) .. ' "' .. tostring( v.description ) .. tostring( dt[ 2 ] ) .. '" ' .. tostring( dt[ 3 ] ) .. ' (' .. normalize_name( tostring( luup.rooms[ v.room_num ] ) ) .. ',_' .. tostring( t ) .. 's) {mios="unit:' .. tostring( unit_name ) .. ',device:' .. k .. tostring( dt[ 4 ] ) .. '"}\n' ) | ||
+ | |||
+ | end | ||
end | end | ||
− | end | + | outf:close() |
+ | |||
+ | end -- function write_items() | ||
+ | |||
+ | |||
+ | function write_sitemap() | ||
+ | |||
+ | outf = io.open( output_directory .. '/' .. unit_name .. '.sitemap', 'w\n' ) | ||
+ | |||
+ | outf:write( 'sitemap ' .. unit_name .. ' label="Main Menu"\n' ) | ||
+ | outf:write( '{\n' ) | ||
+ | outf:write( ' Frame {\n' ) | ||
+ | outf:write( ' Group item=Rooms label="Rooms"\n' ) | ||
+ | outf:write( ' }\n' ) | ||
+ | |||
+ | for k, v in pairs( device_types ) | ||
+ | do | ||
+ | |||
+ | t = string.match( k or '', '%:(%a*)%:1' ) | ||
+ | |||
+ | p = '_' .. tostring( t ) .. 'sChartPeriod' | ||
+ | |||
+ | i = '_' .. tostring( t ) .. 's' | ||
+ | |||
+ | outf:write( ' Frame {\n' ) | ||
+ | outf:write( ' Switch item=' .. p .. ' label="Chart Period" mappings=[0="Hour", 1="Day", 2="Week"]\n' ) | ||
+ | outf:write( ' Chart item=' .. i .. ' period=h refresh=600 visibility=[' .. p .. '==0, ' .. p .. '=="Uninitialized"]\n' ) | ||
+ | outf:write( ' Chart item=' .. i .. ' period=D refresh=600 visibility=[' .. p .. '==1]\n' ) | ||
+ | outf:write( ' Chart item=' .. i .. ' period=W refresh=600 visibility=[' .. p .. '==2]\n' ) | ||
+ | outf:write( ' }\n' ) | ||
+ | |||
+ | end | ||
+ | |||
+ | outf:write( '}\n' ) | ||
+ | |||
+ | outf:close() | ||
+ | |||
+ | end -- persistence_rrd4j() | ||
+ | |||
+ | |||
+ | function write_persistence_rrd4j() | ||
+ | |||
+ | outf = io.open( output_directory .. '/rrd4j.persist_add', 'w' ) | ||
+ | |||
+ | for k, v in pairs( device_types ) | ||
+ | do | ||
+ | |||
+ | t = string.match( k or '', '%:(%a*)%:1' ) | ||
+ | |||
+ | i = '_' .. tostring( t ) .. 's' | ||
+ | |||
+ | outf:write( i .. '* : strategy = everyChange, everyMinute, restoreOnStartup\n' ) | ||
+ | |||
+ | end | ||
+ | |||
+ | outf:close() | ||
+ | |||
+ | end -- write_persistence_rrd4j() | ||
+ | |||
+ | write_items() | ||
+ | write_sitemap() | ||
+ | write_persistence_rrd4j() | ||
</source> | </source> |
Revision as of 22:28, 29 November 2014
Contents |
openHAB Downloads
http://www.openhab.org/downloads.html
openHAB MiOS binding
https://github.com/openhab/openhab/tree/master/bundles/binding/org.openhab.binding.mios
Tools
Creating openHAB configuration files (items, sitemap, rrd4j persistence)
Adjust unit_name and output_directory.
items
https://github.com/openhab/openhab/wiki/Explanation-of-items
Place *.items in: /openHAB/runtime/configurations/items
sitemap
https://github.com/openhab/openhab/wiki/Explanation-of-Sitemaps
Place *.sitemap in: /openHAB/runtime/configurations/sitemaps
rrd4j persistence
https://github.com/openhab/openhab/wiki/Persistence
Add rrd4j.persist_add to the Items section in /openHAB/runtime/configurations/persistence/rrd4j.persist and make sure that the strategies used are defined in the Strategies section.
Luup code for MiOS devices
-- by Ap15e local unit_name = 'house' local output_directory = '/dataMine' local device_types = { [ 'urn:schemas-upnp-org:device:DimmableLight:1' ] = { 'Dimmer' , ' [%d]%' , '<slider>' , '/service/Dimming1/LoadLevelStatus,command:MAP(miosDimmerCommand.map)' }, [ 'urn:schemas-upnp-org:device:BinaryLight:1' ] = { 'Switch' , '' , '' , '/service/SwitchPower1/Status,command:ON=SwitchPower1/SetTarget(newTargetValue=1)|OFF=SwitchPower1/SetTarget(newTargetValue=0),in:MAP(miosSwitchIn.map)' }, [ 'urn:schemas-micasaverde-com:device:TemperatureSensor:1' ] = { 'Number' , ' [%.1f °C]', '<temperature>' , '/service/TemperatureSensor1/CurrentTemperature' }, [ 'urn:schemas-micasaverde-com:device:HumiditySensor:1' ] = { 'Number' , ' [%d]%' , '' , '/service/HumiditySensor1/CurrentLevel' }, [ 'urn:schemas-micasaverde-com:device:MotionSensor:1' ] = { 'Contact', ' [%s]' , '<contact>' , '/service/SecuritySensor1/Tripped,in:MAP(miosContactIn.map)' }, [ 'urn:schemas-micasaverde-com:device:LightSensor:1' ] = { 'Number' , ' [%.2f]%' , '' , '/service/urn:micasaverde-com:serviceId:LightSensor1/CurrentLevel' }, [ 'urn:schemas-micasaverde-com:device:DoorSensor:1' ] = { 'Contact', ' [%s]' , '<contact>' , '/service/SecuritySensor1/Tripped,in:MAP(miosContactIn.map)' }, [ 'urn:schemas-upnp-org:device:Heater:1' ] = { 'Number' , ' [%.1f °C]', '<temperature>' , '/service/urn:upnp-org:serviceId:TemperatureSetpoint1_Heat/CurrentSetpoint' }, [ 'urn:schemas-micasaverde-com:device:UvSensor:1' ] = { 'Number' , ' [%d]' , '' , '/service/urn:upnp-org:serviceId:UvSensor1/CurrentLevel' }, [ 'urn:schemas-micasaverde-com:device:RainSensor:1' ] = { 'Number' , ' [%.1f]' , '' , '/service/urn:upnp-org:serviceId:RainSensor1/CurrentTRain' }, [ 'urn:schemas-micasaverde-com:device:ScaleSensor:1' ] = { 'Number' , ' [%.1f]' , '' , '/service/urn:micasaverde-com:serviceId:ScaleSensor1/Weight' }, [ 'urn:schemas-micasaverde-com:device:BarometerSensor:1' ] = { 'Number' , ' [%.2f]hPa', '' , '/service/urn:upnp-org:serviceId:BarometerSensor1/CurrentPressure' }, [ 'urn:schemas-micasaverde-com:device:WindSensor:1' ] = { 'Number' , ' [%.1f]' , '<wind>' , '/service/urn:upnp-org:serviceId:WindSensor1/AvgSpeed' }, [ 'urn:schemas-micasaverde-com:device:SmokeSensor:1' ] = { 'Contact', ' [%s]' , '<contact>' , '/service/urn:upnp-org:serviceId:SmokeSensor1/Tripped,in:MAP(miosContactIn.map)' }, [ 'urn:demo-micasaverde-com:device:weather:1' ] = { 'String' , ' [%s]' , '' , '/service/urn:micasaverde-com:serviceId:Weather1/Condition' }, [ 'urn:schemas-ap15e-com:device:DAD' ] = { 'String' , ' [%s]' , '<sun>' , '/service/urn:upnp-ap15e-com:serviceId:DAD1/Sunrise_HHMMSS' }, [ 'urn:schemas-micasaverde-com:device:WindowCovering:1' ] = { 'Switch' , '' , '<rollershutter>', '/service/SwitchPower1/Status,command:ON=SwitchPower1/SetTarget(newTargetValue=1)|OFF=SwitchPower1/SetTarget(newTargetValue=0),in:MAP(miosSwitchIn.map)' } } function normalize_name( s ) s = string.gsub( s or '', '[%s-/%.:]', '_' ) return '_' .. s end function write_items() outf = io.open( output_directory .. '/' .. unit_name .. '.items', 'w\n' ) outf:write( 'Group Rooms (All)\n' ) for k, v in pairs( device_types ) do t = string.match( k or '', '%:(%a*)%:1' ) outf:write( 'Group _' .. tostring( t ) .. 's "' .. tostring( t ) .. 's" (Rooms)\n' ) outf:write( 'Number _' .. tostring( t ) .. 'sChartPeriod\n' ) end for k, v in pairs( luup.rooms ) do outf:write( 'Group ' .. normalize_name( tostring( v ) ) .. ' "' .. tostring( v ) .. '" <' .. normalize_name( tostring( v ) ) .. '> (Rooms)\n' ) end outf:write( 'Group _no_room "no room" <_no_room> (Rooms)\n' ) for k, v in pairs(luup.devices) do dt = device_types[ v.device_type ] if dt ~= nil then t = string.match( v.device_type or '', '%:(%a*)%:1' ) outf:write( tostring( dt[ 1 ] ) .. ' ' .. normalize_name( tostring( v.description ) ) .. ' "' .. tostring( v.description ) .. tostring( dt[ 2 ] ) .. '" ' .. tostring( dt[ 3 ] ) .. ' (' .. normalize_name( tostring( luup.rooms[ v.room_num ] ) ) .. ',_' .. tostring( t ) .. 's) {mios="unit:' .. tostring( unit_name ) .. ',device:' .. k .. tostring( dt[ 4 ] ) .. '"}\n' ) end end outf:close() end -- function write_items() function write_sitemap() outf = io.open( output_directory .. '/' .. unit_name .. '.sitemap', 'w\n' ) outf:write( 'sitemap ' .. unit_name .. ' label="Main Menu"\n' ) outf:write( '{\n' ) outf:write( ' Frame {\n' ) outf:write( ' Group item=Rooms label="Rooms"\n' ) outf:write( ' }\n' ) for k, v in pairs( device_types ) do t = string.match( k or '', '%:(%a*)%:1' ) p = '_' .. tostring( t ) .. 'sChartPeriod' i = '_' .. tostring( t ) .. 's' outf:write( ' Frame {\n' ) outf:write( ' Switch item=' .. p .. ' label="Chart Period" mappings=[0="Hour", 1="Day", 2="Week"]\n' ) outf:write( ' Chart item=' .. i .. ' period=h refresh=600 visibility=[' .. p .. '==0, ' .. p .. '=="Uninitialized"]\n' ) outf:write( ' Chart item=' .. i .. ' period=D refresh=600 visibility=[' .. p .. '==1]\n' ) outf:write( ' Chart item=' .. i .. ' period=W refresh=600 visibility=[' .. p .. '==2]\n' ) outf:write( ' }\n' ) end outf:write( '}\n' ) outf:close() end -- persistence_rrd4j() function write_persistence_rrd4j() outf = io.open( output_directory .. '/rrd4j.persist_add', 'w' ) for k, v in pairs( device_types ) do t = string.match( k or '', '%:(%a*)%:1' ) i = '_' .. tostring( t ) .. 's' outf:write( i .. '* : strategy = everyChange, everyMinute, restoreOnStartup\n' ) end outf:close() end -- write_persistence_rrd4j() write_items() write_sitemap() write_persistence_rrd4j()
Tips & Tricks
Synchronizing Vera's devices with openHAB
Mount ~/openHAB/runtime/configurations/items on Vera (see http://forum.micasaverde.com/index.php/topic,16452.msg125963.html#msg125963) and write the items file via Apps -> Develop Apps -> Edit Startup Lua.