Changeset 45


Ignore:
Timestamp:
2012-11-02 20:18:57 (12 years ago)
Author:
lolodomo
Message:

Support for Mertik-Maxitrol thermostats added (nirb contrib)

Location:
trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • TabularUnified trunk/I_RFXtrx.xml

    r43 r45  
    397397      <run>if (pluginLib ~= nil) then pluginLib.sendATICode(lul_device, lul_settings.Code or "") end</run> 
    398398    </action> 
     399    <action> 
     400        <serviceId>urn:upnp-org:serviceId:HVAC_UserOperatingMode1</serviceId> 
     401        <name>SetModeTarget</name> 
     402        <run>if (pluginLib ~= nil) then pluginLib.setModeTarget(lul_device, lul_settings.NewModeTarget) end</run> 
     403    </action> 
     404    <action> 
     405        <serviceId>urn:micasaverde-com:serviceId:HaDevice1</serviceId> 
     406        <name>ToggleState</name> 
     407        <run>if (pluginLib ~= nil) then pluginLib.toggleState(lul_device) end</run> 
     408    </action> 
    399409    </actionList> 
    400410</implementation> 
  • TabularUnified trunk/L_RFXtrx.lua

    r44 r45  
    4848    LIGHTING_BLYSS = { 0x15, 0x0, 11, nil, "Thomson", "Blyss" }, 
    4949     
     50    HEATER3_MERTIK1 = { 0x42, 0x0, 8, nil, "Mertik", "Mertik Maxitrol G6R-H4T1" }, 
     51    HEATER3_MERTIK2 = { 0x42, 0x1, 8, nil, "Mertik", "Mertik Maxitrol G6R-H4TB" }, 
     52 
    5053    TEMP1 = { 0x50, 0x1, 8, nil, "Oregon Scientific", "THR128/138, THC138" }, 
    5154    TEMP2 = { 0x50, 0x2, 8, nil, "Oregon Scientific", "THC238/268, THN132, THWR288, THRN122, THN122, AW129/131" }, 
     
    175178    CMD_ATI_SCENE_ON = { "ATISceneOn", "ATI_REMOTE", "VAR_SCENE_ON" }, 
    176179    CMD_ATI_SCENE_OFF = { "ATISceneOff", "ATI_REMOTE", "VAR_SCENE_OFF" }, 
     180    CMD_HEATER = { "Heater", "HEATER", "VAR_HEATER" }, 
     181    CMD_HEATER_SW = { "HeaterSwitch", "HEATER", "VAR_HEATER_SW" }, 
     182    CMD_HEATER_UP = { "HeaterUp", "HEATER", nil }, 
     183    CMD_HEATER_DOWN = { "HeaterDown", "HEATER", nil } 
    177184} 
    178185 
     
    213220    VAR_SCENE_OFF = { "urn:micasaverde-com:serviceId:SceneController1", "sl_SceneDeactivated", false, false }, 
    214221    VAR_EXIT_DELAY = { "urn:rfxcom-com:serviceId:SecurityRemote1", "ExitDelay", false, false }, 
    215      
     222    VAR_HEATER = { "urn:upnp-org:serviceId:HVAC_UserOperatingMode1", "ModeStatus", false, false }, 
     223    VAR_HEATER_SW = { "urn:upnp-org:serviceId:SwitchPower1", "Status", false, false }, 
     224    --VAR_HEATER_HA = { "urn:micasaverde-com:serviceId:HaDevice1", "Status", false, false }, 
     225 
    216226    VAR_PLUGIN_VERSION = { "upnp-rfxcom-com:serviceId:rfxtrx1", "PluginVersion", false, false }, 
    217227    VAR_AUTO_CREATE = { "upnp-rfxcom-com:serviceId:rfxtrx1", "AutoCreate", true, false }, 
     
    272282    REMOTE = { "urn:rfxcom-com:device:X10ChaconRemote:1", "D_X10ChaconRemote1.xml", "RFX Remote ", "RC/", false, false, false }, 
    273283    LWRF_REMOTE = { "urn:rfxcom-com:device:LWRFRemote:1", "D_LWRFRemote1.xml", "RFX Remote ", "RC/", false, false, false }, 
    274     ATI_REMOTE = { "urn:rfxcom-com:device:ATIRemote:1", "D_ATIRemote1.xml", "RFX Remote ", "RC/", false, false, false } 
     284    ATI_REMOTE = { "urn:rfxcom-com:device:ATIRemote:1", "D_ATIRemote1.xml", "RFX Remote ", "RC/", false, false, false }, 
     285    HEATER = { "urn:schemas-upnp-org:device:Heater:1", "D_Heater1.xml", "RFX Heater ", "HT/", false, false, false } 
    275286} 
    276287 
     
    389400    tableMsgTypes.LIGHTING_LIGHTWARERF[4] = decodeLighting5 
    390401    tableMsgTypes.LIGHTING_BLYSS[4] = decodeLighting6 
     402    tableMsgTypes.HEATER3_MERTIK1[4] = decodeThermostat3 
     403    tableMsgTypes.HEATER3_MERTIK2[4] = decodeThermostat3 
    391404    tableMsgTypes.TEMP1[4] = decodeTemp 
    392405    tableMsgTypes.TEMP2[4] = decodeTemp 
     
    683696    then 
    684697        category = 7 
     698    elseif ((string.len(id) == 15) and (string.sub(id, 1, 5) == "HT/HT") and (string.sub(id, 7, 7) == ".")  and (string.sub(id, 9, 9) == "/")) 
     699    then 
     700        category = 8 
    685701    else 
    686702        log("Unexpected device id " .. id .. ". Switch Power command not sent", 2) 
     
    852868                                cmdCode, 0) 
    853869        end 
     870    -- elseif (category == 8) 
     871    -- then 
     872        -- TODO: Mertik 
    854873    else 
    855874        log("Unimpemented lighting type " .. category .. ". Switch Power command not sent", 2) 
     
    15021521end 
    15031522 
     1523function setModeTarget(device, NewModeTarget) 
     1524    local id = luup.devices[device].id 
     1525    log("setModeTarget " .. id .. " target " .. NewModeTarget) 
     1526 
     1527    local category 
     1528    if ((string.len(id) == 15) and (string.sub(id, 1, 5) == "HT/HT") and (string.sub(id, 7, 7) == ".")  and (string.sub(id, 9, 9) == "/")) 
     1529    then 
     1530        category = 3 
     1531    else 
     1532        log("Unexpected device id " .. id .. ". Set Mode command not sent", 2) 
     1533        return 
     1534    end 
     1535 
     1536    local type = nil 
     1537    local subType = nil 
     1538    local data = nil 
     1539 
     1540    if (category == 3) -- Mertik 
     1541    then 
     1542        type = tableMsgTypes.HEATER3_MERTIK1[1] 
     1543        subType = tonumber(string.sub(id, 8, 8)) 
     1544        local tableCmds = {} 
     1545        local cmdCode = nil 
     1546        --local currentState = luup.variable_get(tabVars.VAR_HEATER[1], tabVars.VAR_HEATER[2], device) or "Off" 
     1547        local currentSwState = luup.variable_get(tabVars.VAR_HEATER_SW[1], tabVars.VAR_HEATER_SW[2], device) or "0" 
     1548        if (NewModeTarget == "HeatOn") 
     1549        then 
     1550            if (currentSwState == "0") 
     1551            then 
     1552                cmdCode = 0x01 -- Turn on 
     1553                table.insert(tableCmds, { string.sub(id, 4), tableCommands.CMD_HEATER_SW[1], 1, 0 }) 
     1554                table.insert(tableCmds, { string.sub(id, 4), tableCommands.CMD_HEATER[1], "HeatOn", 0 }) 
     1555            else 
     1556                cmdCode = 0x04 -- Run up 
     1557                table.insert(tableCmds, { string.sub(id, 4), tableCommands.CMD_HEATER[1], "HeatOn", 0 }) 
     1558            end 
     1559        elseif (NewModeTarget == "Off") 
     1560        then 
     1561            if (currentSwState == "1") 
     1562            then 
     1563                cmdCode = 0x00 -- Turn off 
     1564                table.insert(tableCmds, { string.sub(id, 4), tableCommands.CMD_HEATER_SW[1], 0, 0 }) 
     1565                table.insert(tableCmds, { string.sub(id, 4), tableCommands.CMD_HEATER[1], "Off", 0 }) 
     1566            else 
     1567                cmdCode = 0x05 -- Run down 
     1568                table.insert(tableCmds, { string.sub(id, 4), tableCommands.CMD_HEATER[1], "Off", 0 }) 
     1569            end 
     1570        else 
     1571            log("setModeTarget: unexpected value for NewModeTarget parameter", 2) 
     1572            return 
     1573        end 
     1574        local remoteId = string.sub(id, 10, 15) 
     1575        data = string.char(tonumber(string.sub(remoteId, 1, 2), 16), 
     1576                            tonumber(string.sub(remoteId, 3, 4), 16), 
     1577                            tonumber(string.sub(remoteId, 5, 6), 16), 
     1578                            cmdCode, 0) 
     1579    end 
     1580 
     1581    if (data ~= nil) 
     1582    then 
     1583        sendCommand(type, subType, data, tableCmds) 
     1584    end 
     1585 
     1586end 
     1587 
     1588function toggleState(device) 
     1589    local devType = string.sub(luup.devices[device].id, 1, 2) 
     1590     
     1591    -- Only implemented for Light Switches and HeaTers so far 
     1592    if (devType == "LS")  
     1593    then 
     1594        local curStat = luup.variable_get(tabVars.VAR_LIGHT[1], tabVars.VAR_LIGHT[2], device) or "0" 
     1595        local newTargetState 
     1596        if (curStat == "0") 
     1597        then 
     1598            newTargetState = "1" 
     1599        else 
     1600            newTargetState = "0" 
     1601        end 
     1602        switchPower(device, newTargetState) 
     1603    elseif (devType == "HT") 
     1604    then 
     1605        local curStat = luup.variable_get(tabVars.VAR_HEATER[1], tabVars.VAR_HEATER[2], device) or "Off" 
     1606        local NewModeTarget 
     1607        if (curStat == "Off") 
     1608        then 
     1609            NewModeTarget = "HeatOn" 
     1610        else 
     1611            NewModeTarget = "Off" 
     1612        end 
     1613        setModeTarget(device, NewModeTarget) 
     1614    end 
     1615end 
     1616 
    15041617function addX10Switch(houseCode, unitCode) 
    15051618 
     
    28642977    return tableCmds 
    28652978     
     2979end 
     2980 
     2981function decodeThermostat3(subType, data, seqNum) 
     2982 
     2983    local altid = "HT3." .. subType .. "/" 
     2984                        .. string.format("%02X", tonumber(string.byte(data, 1))) 
     2985                        .. string.format("%02X", tonumber(string.byte(data, 2))) 
     2986                        .. string.format("%02X", tonumber(string.byte(data, 3))) 
     2987 
     2988    local tableCmds = {} 
     2989    local cmdCode = string.byte(data, 4) 
     2990     
     2991    -- 0: "Off", 1: "On", 2: "Up", 3: "Down", 4: "Run Up/2nd Off", 5: "Run Down/2nd On", 6: "Stop" 
     2992    if (cmdCode == 0x00) 
     2993    then 
     2994        table.insert(tableCmds, { altid, tableCommands.CMD_HEATER_SW[1], 0, 0 } ) 
     2995        table.insert(tableCmds, { altid, tableCommands.CMD_HEATER[1], "Off", 0 } ) 
     2996    elseif (cmdCode == 0x01) 
     2997    then 
     2998        table.insert(tableCmds, { altid, tableCommands.CMD_HEATER_SW[1], 1, 0 } ) 
     2999        table.insert(tableCmds, { altid, tableCommands.CMD_HEATER[1], "HeatOn", 0 } ) 
     3000    elseif (cmdCode == 0x02) 
     3001    then 
     3002        table.insert(tableCmds, { altid, tableCommands.CMD_HEATER_UP[1], nil, 0 } ) 
     3003    elseif (cmdCode == 0x03) 
     3004    then 
     3005        table.insert(tableCmds, { altid, tableCommands.CMD_HEATER_DOWN[1], nil, 0 } ) 
     3006    elseif (cmdCode == 0x04) 
     3007    then 
     3008        if (subType == 0x00) 
     3009        then 
     3010            table.insert(tableCmds, { altid, tableCommands.CMD_HEATER[1], "HeatOn", 0 } ) 
     3011        else 
     3012            --table.insert(tableCmds, { altid, tableCommands.CMD_HEATER_2NDOFF[1], 0, 0 } ) 
     3013        end 
     3014    elseif (cmdCode == 0x05) 
     3015    then 
     3016        if (subType == 0x00) 
     3017        then 
     3018            table.insert(tableCmds, { altid, tableCommands.CMD_HEATER[1], "Off", 0 } ) 
     3019        else 
     3020            --table.insert(tableCmds, { altid, tableCommands.CMD_HEATER_2NDON[1], 0, 0 } ) 
     3021        end 
     3022    elseif (cmdCode == 0x06) and (subType == 0x00) 
     3023    then 
     3024        table.insert(tableCmds, { altid, tableCommands.CMD_HEATER[1], "Off", 0 } ) 
     3025    else 
     3026        log("Thermostat3 command not yet implemented: " .. cmdCode, 2) 
     3027    end 
     3028 
     3029    return tableCmds 
     3030 
    28663031end 
    28673032 
     
    42214386    local countSR = 0 
    42224387    local countRC = 0 
     4388    local countHT = 0 
    42234389    for i, v in ipairs(tableDevices) 
    42244390    do 
     
    42694435        then 
    42704436            countRC = countRC + 1 
     4437        elseif (key == "HEATER") 
     4438        then 
     4439            countHT = countHT + 1 
    42714440        end 
    42724441    end 
     
    42874456    log("   security remotes: " .. countSR) 
    42884457    log("    remote controls: " .. countRC) 
     4458    log("    heating devices: " .. countHT) 
    42894459 
    42904460end 
Note: See TracChangeset for help on using the changeset viewer.