The files contained in this repository can be downloaded to your computer using a svn client.
On Linux you simply type the command displayed below.

This URL has Read-Only access.

Statistics
| Revision:

root / trunk / DomotiGa / Energy.module @ 245

History | View | Annotate | Download (3.4 kB)

1 2 riemers
' Gambas module file
2 2 riemers
3 2 riemers
' Description:
4 2 riemers
' Energy.module
5 2 riemers
' Routines for logging energy usage.
6 2 riemers
' Need to check accuracy!
7 2 riemers
8 2 riemers
' DomotiGa - an open source home automation program.
9 2 riemers
' Copyright(C) 2008 Ron Klinkien
10 2 riemers
11 25 rdnzl
' Read file called COPYING for license details.
12 2 riemers
13 2 riemers
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
14 60 rdnzl
' create tables
15 2 riemers
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
16 60 rdnzl
PUBLIC SUB InitTable(sName AS String)
17 2 riemers
18 2 riemers
  DIM tableEnergy AS Table
19 2 riemers
20 60 rdnzl
  Main.hDB.Tables.Remove(sName)
21 60 rdnzl
  tableEnergy = Main.hDB.Tables.Add(sName)
22 2 riemers
  tableEnergy.Fields.Add("id", db.Serial)
23 2 riemers
  tableEnergy.Fields.Add("counter", db.Long)
24 2 riemers
  tableEnergy.Fields.Add("stamp", db.Date)
25 140 rdnzl
  tableEnergy.Fields.Add("consumption", db.Long)
26 2 riemers
  tableEnergy.PrimaryKey = ["id"]
27 2 riemers
  tableEnergy.Update()
28 2 riemers
29 2 riemers
END
30 2 riemers
31 60 rdnzl
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
32 60 rdnzl
' read values from rfxmeter and pulse devices and write them to *_usage tables
33 60 rdnzl
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
34 60 rdnzl
PUBLIC SUB Log()
35 2 riemers
36 2 riemers
  DIM rResult AS Result
37 60 rdnzl
  DIM iRFX, iRFXMeter, iFactor AS Integer
38 60 rdnzl
  DIM iUsage, iNewCounter, iPrevCounter, iValue AS Float
39 60 rdnzl
  DIM aRFXMeters AS String[] = ["RFXPwr Module", "RFXPulse Gas", "RFXPulse Water"]
40 60 rdnzl
  DIM sMeter, sTable AS String
41 2 riemers
42 153 rdnzl
  IF NOT Main.bRFXComRXEnabled THEN RETURN
43 2 riemers
44 60 rdnzl
  FOR EACH sMeter IN aRFXMeters
45 60 rdnzl
    ' first find devicetype id for RFXMeter
46 60 rdnzl
    rResult = Main.hDB.Exec("SELECT id FROM devicetypes WHERE name = &1 ", sMeter)
47 2 riemers
48 113 rdnzl
    IF rResult.Available THEN
49 60 rdnzl
      iRFX = rResult!id
50 60 rdnzl
    ELSE
51 245 rdnzl
      IF Main.bEnergyDebug THEN Main.WriteDebugLog(("[Energy] No Devicetype called ") & sMeter & (" found!"))
52 60 rdnzl
      RETURN
53 60 rdnzl
    END IF
54 2 riemers
55 60 rdnzl
    ' then find device with this devicetype
56 238 rdnzl
    rResult = Main.hDB.Exec("SELECT value, id FROM devices WHERE enabled = TRUE AND module = &1", iRFX)
57 2 riemers
58 60 rdnzl
    IF rResult.Count = 1 THEN
59 213 rdnzl
      IF NOT rResult!value THEN RETURN
60 60 rdnzl
      iNewCounter = CFloat(rResult!value)
61 60 rdnzl
      iRFXMeter = rResult!id
62 2 riemers
63 60 rdnzl
      ' get previous counter value
64 60 rdnzl
      SELECT sMeter
65 60 rdnzl
        CASE "RFXPwr Module"
66 60 rdnzl
          sTable = "power_usage"
67 60 rdnzl
        CASE "RFXPulse Gas"
68 60 rdnzl
          sTable = "gas_usage"
69 60 rdnzl
        CASE "RFXPulse Water"
70 60 rdnzl
          sTable = "water_usage"
71 60 rdnzl
      END SELECT
72 2 riemers
73 60 rdnzl
      ' get previous counter value
74 60 rdnzl
      rResult = Main.hDB.Exec(Subst("SELECT counter FROM &1 ORDER BY stamp DESC LIMIT 1", sTable))
75 2 riemers
76 60 rdnzl
      IF rResult.Count = 1 THEN
77 60 rdnzl
        iPrevCounter = rResult!counter
78 60 rdnzl
        iUsage = iNewCounter - iPrevCounter
79 60 rdnzl
        ' calculate right amount used
80 60 rdnzl
        SELECT sMeter
81 60 rdnzl
          CASE "RFXPwr Module"
82 60 rdnzl
            iValue = iUsage * 10 ' every pulse is 0.1 watt
83 60 rdnzl
          CASE "RFXPulse Gas"
84 60 rdnzl
            iValue = iUsage / 100 ' every pulse is 0.01 m3
85 60 rdnzl
          CASE "RFXPulse Water"
86 60 rdnzl
            iValue = iUsage / 2 ' every pulse is 0.5 liter
87 60 rdnzl
        END SELECT
88 68 rdnzl
      ELSE
89 68 rdnzl
        iUsage = 0
90 68 rdnzl
        iValue = 0
91 68 rdnzl
      END IF
92 68 rdnzl
      ' write value in usage table
93 68 rdnzl
      Main.hDB.Begin()
94 68 rdnzl
      rResult = Main.hDB.Create(sTable)
95 140 rdnzl
      rResult!consumption = iUsage
96 68 rdnzl
      rResult!stamp = Now()
97 68 rdnzl
      rResult!counter = iNewCounter
98 68 rdnzl
      rResult.Update()
99 68 rdnzl
      Main.hDB.Commit()
100 2 riemers
101 68 rdnzl
      ' update value2 field of device
102 68 rdnzl
      rResult = Main.hDB.Exec("UPDATE devices SET value2 = &1 WHERE id = &2", CStr(iValue), iRFXMeter)
103 60 rdnzl
    ELSE IF rResult.Count > 1 THEN
104 245 rdnzl
      IF Main.bEnergyDebug THEN Main.WriteDebugLog(("[Energy] More then one ") & sMeter & (" device found, not supported!"))
105 60 rdnzl
    END IF
106 60 rdnzl
  NEXT
107 60 rdnzl
108 2 riemers
END