Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in
Toggle navigation
Open sidebar
energy
bmon
Commits
2b033735
Commit
2b033735
authored
Feb 03, 2015
by
Alan Mitchell
Browse files
Progress towards conversion to YAML parameters.
parent
3c4898a5
Changes
8
Hide whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
74 additions
and
78 deletions
+74
-78
bmsapp/admin.py
bmsapp/admin.py
+2
-2
bmsapp/calcs/calcreadings.py
bmsapp/calcs/calcreadings.py
+7
-7
bmsapp/calcs/transforms.py
bmsapp/calcs/transforms.py
+2
-54
bmsapp/models.py
bmsapp/models.py
+6
-8
bmsapp/reports/basechart.py
bmsapp/reports/basechart.py
+4
-3
bmsapp/reports/normalizedbyddbyft2.py
bmsapp/reports/normalizedbyddbyft2.py
+3
-2
bmsapp/reports/normalizedbyft2.py
bmsapp/reports/normalizedbyft2.py
+3
-2
bmsapp/scripts/to_YAML.py
bmsapp/scripts/to_YAML.py
+47
-0
No files found.
bmsapp/admin.py
View file @
2b033735
...
...
@@ -72,14 +72,14 @@ class MultiBuildingChartTypeAdmin(admin.ModelAdmin):
class
ChartBuildingInfoInline
(
admin
.
TabularInline
):
model
=
ChartBuildingInfo
formfield_overrides
=
{
models
.
TextField
:
{
'widget'
:
Textarea
(
attrs
=
{
'rows'
:
1
,
'cols'
:
6
0
})},
models
.
TextField
:
{
'widget'
:
Textarea
(
attrs
=
{
'rows'
:
5
,
'cols'
:
4
0
})},
}
extra
=
1
class
MultiBuildingChartAdmin
(
admin
.
ModelAdmin
):
inlines
=
(
ChartBuildingInfoInline
,)
formfield_overrides
=
{
models
.
TextField
:
{
'widget'
:
Textarea
(
attrs
=
{
'rows'
:
1
,
'cols'
:
6
0
})},
models
.
TextField
:
{
'widget'
:
Textarea
(
attrs
=
{
'rows'
:
6
,
'cols'
:
4
0
})},
}
admin
.
site
.
register
(
Building
,
BuildingAdmin
)
...
...
bmsapp/calcs/calcreadings.py
View file @
2b033735
...
...
@@ -4,7 +4,7 @@ Code related to adding calculated fields to the sensor reading database.
import
time
,
logging
import
numpy
as
np
import
pandas
as
pd
import
transforms
import
yaml
# Make a logger for this module
_logger
=
logging
.
getLogger
(
'bms.'
+
__name__
)
...
...
@@ -164,7 +164,7 @@ class CalculateReadings:
"""
# Get the function parameters as a dictionary
params
=
transforms
.
makeKeywordArgs
(
calcParams
)
params
=
yaml
.
load
(
calcParams
)
# Start a List to hold the sensor IDs that need to be synchronized. Also start
# a separate dictionary that will map the parameter names to these IDs, since the
...
...
@@ -178,13 +178,14 @@ class CalculateReadings:
for
nm
,
id
in
params
.
items
():
if
nm
.
startswith
(
'id_'
):
str_id
=
str
(
id
)
# convert id to string
if
nm
.
endswith
(
'_sync'
):
# the sensor to sync on needs to be the first in the ID list.
ids
.
insert
(
0
,
id
)
id_dict
[
nm
[
3
:
-
5
]]
=
id
# strip 'id_' and '_sync' from the name
ids
.
insert
(
0
,
str_
id
)
id_dict
[
nm
[
3
:
-
5
]]
=
str_
id
# strip 'id_' and '_sync' from the name
else
:
ids
.
append
(
id
)
id_dict
[
nm
[
3
:]]
=
id
# strip 'id_' from the name
ids
.
append
(
str_
id
)
id_dict
[
nm
[
3
:]]
=
str_
id
# strip 'id_' from the name
# delete the parameter from the main parameter dictionary, since it is now
# stored in the id_dict.
...
...
@@ -270,4 +271,3 @@ class CalcReadingFuncs_base:
# past readings in the reading database.
self
.
calc_id
=
None
\ No newline at end of file
bmsapp/calcs/transforms.py
View file @
2b033735
...
...
@@ -5,46 +5,7 @@ Transform functions for scaling and transforming sensor readings
from
__future__
import
division
from
math
import
*
import
sys
def
makeKeywordArgs
(
keyword_str
):
'''
Turns a string that looks like a set of keyword arguments into a dictionary of those
arguments. Numbers are converted to floats, except the 'id_' exception mentioned below.
Boolean are created if the text looks like a boolean. Otherwise a string is created as
the value. There is a special exception for keyword names that start with the string 'id_':
these are always converted to strings. This conveniently allows sensor ids to be entered
without quotes in parameter lists.
'''
result
=
{}
keyword_str
=
keyword_str
.
strip
()
# need to exit if this is a blank string
if
len
(
keyword_str
)
==
0
:
return
result
for
it
in
keyword_str
.
strip
().
split
(
','
):
kw
,
val
=
it
.
split
(
'='
)
kw
=
kw
.
strip
()
val
=
val
.
strip
()
if
kw
.
startswith
(
'id_'
):
# special case of keyword starting with 'id_'. Assume val is a string
# and strip any surrounding quotes of both types.
val
=
val
.
strip
(
'"
\'
'
)
else
:
try
:
val
=
float
(
val
)
except
:
if
val
in
(
'True'
,
'true'
,
'Y'
,
'y'
,
'Yes'
,
'yes'
):
val
=
True
elif
val
in
(
'False'
,
'false'
,
'N'
,
'n'
,
'No'
,
'no'
):
val
=
False
else
:
# must be a string.
# get rid of surrounding quotes of both types.
val
=
val
.
strip
(
'"
\'
'
)
result
[
kw
]
=
val
return
result
import
yaml
class
Transformer
:
...
...
@@ -68,7 +29,7 @@ class Transformer:
All three elements of the reading--ts, id, and val--can be transformed by the function.
'''
params
=
makeKeywordArgs
(
trans_params
)
params
=
yaml
.
load
(
trans_params
)
if
hasattr
(
self
,
trans_func
.
strip
()):
the_func
=
getattr
(
self
,
trans_func
.
strip
())
return
the_func
(
ts
,
id
,
val
,
**
params
)
...
...
@@ -225,16 +186,3 @@ class Transformer:
# ******** End of Transform Function Section **********
# ------------ Test functions --------------
def
test_kw
():
'''
Test function for makeKeywordArgs.
'''
print
makeKeywordArgs
(
'abc=True, xyz=23.3, jlk="Hello"'
)
print
makeKeywordArgs
(
"abc=Yes, xyz=23.3, jlk='Hello'"
)
print
makeKeywordArgs
(
"abc=Yes, xyz=23.3, jlk=Hello"
)
bmsapp/models.py
View file @
2b033735
...
...
@@ -62,8 +62,8 @@ class Sensor(models.Model):
tran_calc_function
=
models
.
CharField
(
"Transform or Calculated Field Function Name"
,
max_length
=
35
,
blank
=
True
)
# the function parameters, if any, for the transform or calculation function above. parameters are
# entered
as one comma-separated string in keyword style, such as 'id_flow="124356", heat_capacity=40.2'
function_parameters
=
models
.
TextField
(
"Function Parameters in
Keyword
form"
,
blank
=
True
)
# entered
in YAML format.
function_parameters
=
models
.
TextField
(
"Function Parameters in
YAML
form"
,
blank
=
True
)
# Calculation order. If this particular calculated field depends on the completion of other calculated fields
# first, make sure the calculation_order for this field is higher than the fields it depends on.
...
...
@@ -263,9 +263,8 @@ class MultiBuildingChart(models.Model):
# the general parameters for this chart, if any. These are parameters that are
# *not* associated with a particular building. The parameters are
# entered as one comma-separated string in keyword style,
# such as 'id_flow="124356", heat_capacity=40.2'
parameters
=
models
.
TextField
(
"General Chart Parameters in Keyword Form"
,
blank
=
True
)
# entered in YAML format.
parameters
=
models
.
TextField
(
"General Chart Parameters in YAML Form"
,
blank
=
True
)
# determines order of Chart displayed in Admin interface
sort_order
=
models
.
IntegerField
(
default
=
999
)
...
...
@@ -289,9 +288,8 @@ class ChartBuildingInfo(models.Model):
building
=
models
.
ForeignKey
(
Building
)
# the parameters for this chart associated with this building, if any.
# The parameters are entered as one comma-separated string in keyword style,
# such as 'id_flow="124356", heat_capacity=40.2'
parameters
=
models
.
TextField
(
"Chart Parameters in Keyword Form"
,
blank
=
True
)
# The parameters are entered in YAML format.
parameters
=
models
.
TextField
(
"Chart Parameters in YAML Form"
,
blank
=
True
)
# determines the order that this building appears in the chart
sort_order
=
models
.
IntegerField
(
default
=
999
)
...
...
bmsapp/reports/basechart.py
View file @
2b033735
...
...
@@ -4,8 +4,9 @@ Reports.
"""
import
time
,
logging
,
copy
,
importlib
from
django.conf
import
settings
import
yaml
import
bmsapp.models
,
bmsapp
.
readingdb
.
bmsdata
import
bmsapp.calcs.transforms
,
bmsapp
.
schedule
import
bmsapp.schedule
import
bmsapp.view_util
,
bmsapp
.
data_util
import
chart_config
...
...
@@ -126,9 +127,9 @@ class BaseChart(object):
self
.
request_params
=
request_params
# for the multi-building chart object, take the keyword parameter string
# and convert it to a dictionary.
# and convert it to a
Python
dictionary
or list
.
if
bldg_id
==
'multi'
:
self
.
chart_params
=
bmsapp
.
calcs
.
transforms
.
makeKeywordArgs
(
chart_info
.
parameters
)
self
.
chart_params
=
yaml
.
load
(
chart_info
.
parameters
)
# open the reading database and save it for use by the methods of this object.
# It is closed automatically in the destructor of the BMSdata class.
...
...
bmsapp/reports/normalizedbyddbyft2.py
View file @
2b033735
import
pandas
as
pd
import
bmsapp.models
,
bmsapp
.
data_util
,
bmsapp
.
calcs
.
transforms
import
yaml
import
bmsapp.models
,
bmsapp
.
data_util
import
basechart
class
NormalizedByDDbyFt2
(
basechart
.
BaseChart
):
...
...
@@ -54,7 +55,7 @@ class NormalizedByDDbyFt2(basechart.BaseChart):
bldg_name
=
bldg_info
.
building
.
title
# get the building name
# get the parameters associated with this building
bldg_params
=
bmsapp
.
calcs
.
transforms
.
makeKeywordArgs
(
bldg_info
.
parameters
)
bldg_params
=
yaml
.
load
(
bldg_info
.
parameters
)
# get the value records and average into one hour intervals
db_recs
=
self
.
reading_db
.
rowsForOneID
(
bldg_params
[
'id_value'
],
st_ts
,
end_ts
)
...
...
bmsapp/reports/normalizedbyft2.py
View file @
2b033735
import
bmsapp.models
,
bmsapp
.
data_util
,
bmsapp
.
calcs
.
transforms
import
yaml
import
bmsapp.models
,
bmsapp
.
data_util
import
basechart
class
NormalizedByFt2
(
basechart
.
BaseChart
):
...
...
@@ -44,7 +45,7 @@ class NormalizedByFt2(basechart.BaseChart):
bldg_name
=
bldg_info
.
building
.
title
# get the building name
# get the parameters associated with this building
bldg_params
=
bmsapp
.
calcs
.
transforms
.
makeKeywordArgs
(
bldg_info
.
parameters
)
bldg_params
=
yaml
.
load
(
bldg_info
.
parameters
)
# get the value records
db_recs
=
self
.
reading_db
.
rowsForOneID
(
bldg_params
[
'id_value'
],
st_ts
,
end_ts
)
...
...
bmsapp/scripts/to_YAML.py
0 → 100644
View file @
2b033735
"""Converts my original keyword parameters to YAML parameters
"""
import
bmsapp.models
import
yaml
def
makeKeywordArgs
(
keyword_str
):
'''Original function to convert keyword string into dictionary, except special
handling of 'id_' keywords was removed.
'''
result
=
{}
keyword_str
=
keyword_str
.
strip
()
# need to exit if this is a blank string
if
len
(
keyword_str
)
==
0
:
return
result
for
it
in
keyword_str
.
strip
().
split
(
','
):
kw
,
val
=
it
.
split
(
'='
)
kw
=
kw
.
strip
()
val
=
val
.
strip
()
try
:
val
=
float
(
val
)
except
:
if
val
in
(
'True'
,
'true'
,
'Y'
,
'y'
,
'Yes'
,
'yes'
):
val
=
True
elif
val
in
(
'False'
,
'false'
,
'N'
,
'n'
,
'No'
,
'no'
):
val
=
False
else
:
# must be a string.
# get rid of surrounding quotes of both types.
val
=
val
.
strip
(
'"
\'
'
)
result
[
kw
]
=
val
return
result
def
run
():
for
sen
in
bmsapp
.
models
.
Sensor
.
objects
.
exclude
(
function_parameters
=
''
):
print
sen
.
function_parameters
obj
=
makeKeywordArgs
(
str
(
sen
.
function_parameters
))
sen
.
function_parameters
=
yaml
.
dump
(
obj
,
default_flow_style
=
False
)
sen
.
save
()
print
for
sen
in
bmsapp
.
models
.
Sensor
.
objects
.
exclude
(
function_parameters
=
''
):
print
sen
.
function_parameters
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment