(“将TESS Instruments发布的测量数据收集到SQLite数据库的包”,
tessdb的Python项目详细描述
tessdb(概述)
Linux服务,通过MQTT收集由Tess Sky Quality Meter发布的测量值。TESS代表Cristobal Garcia望远镜编码器和天空传感器
tessdb正在用作stars4all项目的一部分
说明
tessdb是一个软件包,它从一个或多个 tess instruments into database(当前是sqlite数据库)。
这是一个python twisted应用程序 使用实现mqtt协议的自定义twisted库
桌面应用程序可以查询数据库以生成报告和图表 使用累积的历史数据。包中已经包含了一些报告脚本,特别是IDA格式的月度报告脚本。
注意:已删除Windows版本,因为它从未使用过。
这些数据源可用:
- 单个样本(实时、可配置,样本之间约1分钟)。
仪器应以配置文件中指定的时间分辨率(秒)的两倍发送读数。
警告:时间引用始终是UTC,而不是本地时间。
安装
要求
需要并应首先安装以下组件:
- python 2.7.x(在ubuntupython2.7.6上测试)或python 3.6+
注意:预计未来会进行Python3迁移,保持Python2.7.x的兼容性。
安装
从github完成安装:
git clone https://github.com/astrorafael/tessdb.git
cd tessdb
sudo python setup.py install
注意:从pypi安装现在已经过时。不要使用在pypi中上载的包。
- 所有可执行文件都复制到
/usr/local/bin
- 默认情况下,数据库位于
/var/dbase/tess.db
- 日志文件位于
/var/log/tessdb.log
- 将自动安装以下必需的PIP包:
- 扭曲,
- 扭曲mqtt
- 比重瓶
启动和验证
- 键入
sudo tessdb-k
在前台启动带有控制台输出的服务。 确认它在没有错误或异常的情况下启动。完成后,用^c
中止
从tessdb 1.2.0版开始,后台执行作为systemd
服务处理,而不是旧的system v样式的init脚本:
`sudo systemctl start tessdb`
尽管旧的sudo服务tessdb start命令仍然有效。
- 强烈建议在启动时通过发出:
sudo systemctl启用tessdb
配置
此服务有一个小配置文件:
/etc/tessdb/config
(Linux)
这个文件是不言而喻的。 在特殊情况下,数据库文件名和位置在此文件中指定。 此文件中标记的某些属性被标记为可重载属性。这意味着可以更改此值,进程将动态重新加载其新值。
日出/日落过滤
建议激活日出/日落过滤器,以拒绝白天出现的TESS读数,并避免数据库中出现不必要的抱怨。 每个位置都有纬度(度)、经度(度)和海拔(米)可忽略不计,因为不使用此过滤器。
激活此筛选器有以下条件:
- 每天一次,在UTC时间00:00左右,所有地点都将根据定义的本地地平线(可配置)计算日出和日落时间。
- 分配到位置的仪器如果发现是在白天,他们的读数将被拒绝。
- 新的:分配到
空
或未知
经度、纬度或高程位置的仪器将接受其读数。启用或禁用对数据库的写入的唯一方法是使用tess实用程序
日志记录
日志文件通常放在Linux中的/var/log/tessdb.log
下,或Windows中的C:\tessdb\log
文件夹下。
默认日志级别为info
。它在这个级别生成的日志很少。
只有在Linux下,文件才会通过logrotate进行旋转。
操作
服务器状态/启动/停止/重新启动
- 服务状态:
sudo systemctl status tessdb
或sudo service tessdb status
- 启动服务:
sudo systemctl start tessdb
或sudo service tessdb start
- 停止服务:
sudo systemctl stop tessdb
或sudo service tessdb stop
- 重新启动服务:
sudo systemctl restart tessdb
或sudo service tessdb stop
服务暂停/恢复
服务器可以置于暂停模式(pause mode),其中仍将接收传入的mqtt消息,但将在内部排队,而不会写入数据库。此外,所有到数据库的连接都已关闭。这允许在不丢失传入数据的情况下对数据库执行高风险操作。示例:
- 使用sqlite
vacuum
pragma压缩数据库 - 从表中迁移数据。
- 等
服务暂停/恢复使用内部信号sigusr1
和sigusr2
要暂停服务器,请键入: 注意:旧的sudo service tessdb pause命令不再工作。 要恢复正常操作,请键入sudo tessdb_resume并查看相同的日志文件: 在重新加载期间,不会停止服务并从配置文件中重新读取新值并应用更改。通常,可以重新加载与维护到mqtt代理的当前连接或更改数据库模式无关的所有方面。配置文件中描述了可重新加载属性的完整列表。 数据库维护是通过由tessdb reports包安装的 数据模型遵循[维度建模]
Ralph Kimball的方法(https://en.wikipedia.org/wiki/dimensional_modeling" rel="nofollow">https://en.wikipedia.org/wiki/dimensional_modeling)。更多参考也可以在星型模式中找到。
下图显示了tessdb的布局。
它们是: 几乎是标准的日期表从维度建模。包含天文学领域最常用的属性加上儒略日。 基本上是一天中的标准时间表。包含众所周知的属性。 此维度包含当前的TESS仪器列表。 这些附件是版本控制的,并保持其历史记录。它们中任何一个的新更改都将在 这些列管理给定tess属性的版本控制。 kimball博士将 此尺寸表包含所有已知的部署TESS光度计的位置。sudo tessdb_pause
并用tail-f/var/log/tessdb.log查看日志文件输出
&;日落。用于过滤白天读数的计算属性(每天OCE)。2018-11-23T13:08:25+0100 [dbase#info] TESS database writer paused
2018-11-23T13:08:25+0100 [dbase#info] Closed a DB Connection to /var/dbase/tess.db
2018-11-23T13:10:37+0100 [dbase#info] TESS database writer resumed
2018-11-23T13:10:37+0100 [dbase#info] Opened a DB Connection to /var/dbase/tess.db
服务重新加载
sudo systemctl reload tessdb
或sudo service tessdb reload
维护费用
tess
命令行实用程序进行的。
维护操作包括:数据模型
尺寸建模
数据模型
尺寸表
日期
:从2016年到2026年预装
时间t
:预装,秒分辨率(可配置)测试s_t
:注册的TESS仪器正在收集数据位置
:部署仪器的位置tess_units_t
:报告的各种单位标签集合,预装当前单位。tess v
:使用tess仪器和当前位置查看。建议报表应用程序使用此视图,而不是底层的tess\t
和location\t
表。日期维度
一天中的时间维度
仪器尺寸
mac_地址可能是自然键。
name
属性可以是可选键。tess instruments在mqtt有效负载中使用此名称发送读数。只要没有同名的其他乐器,就可以更改TESS乐器名称。位置id
是指定给仪器的当前位置的参考。位置id-1表示"未知"位置。模型
指当前的TESS模型。固件
包含当前固件版本。视野
包含视野,单位为度。cover_offset
是mag/arcserc^2中的附加偏移量,用于说明附加到tess本身的附加光学窗口衰减。默认为0.0。频道
是当前频道标识符。默认值为0。目前,TESS光度计只有一个通道。授权
允许TESS仪器将读数存储在数据库中。授权是由tess实用程序执行的手动过程注册
shos如果TESS仪器在数据库中注册了自己("自动")或是通过使用TESS实用程序的手动过程("手动")完成的。将此功能添加到软件之前注册的TESS仪器的默认值为"未知"。应逐个识别这些案例,并将其设置为"手动"或"自动"。版本控制属性
tess\t
表中生成新行过滤器
保存当前的tess过滤器(即"uvir"或二色玻璃)。默认为"uvir"方位角
和高度
属性保持光度计的当前方向,单位为度。默认方位角为0.0,默认高度为90.0版本控制属性
valid_since
和valid_直到
保留对版本控制属性的更改有效的时间戳。单位尺寸
tess\u units\u t
表表示为一个垃圾维度。它收集VA表示事实表中样本当前测量单位的不确定标签。valid_since
,valid_until
和valid_state
如果单元发生更改,请使用与上面类似的方法跟踪任何单元的更改。位置尺寸
站点
。描述此位置的唯一站点名称。联系您的人
。负责观察的人。组织
。联系人所属的组织或所在地设施的运营。联系电子邮件
。联系人电子邮件地址。经度
位置经度(度)。西部是负的。纬度
。位置纬度(度)高程
。位置高程(米)zipcode
。位置邮政编码省
。所在国家/地区国家
。所在国家/地区时区
。时区(用于计算本地时间),采用维基百科描述的标准格式[https://en.wikipedia.org/wiki/list-of-tz-u database-time-zones]
事实表
它们是:
tess_readings_t
:累积快照事实表,其中包含来自几个tess仪器的测量值。
带有加速计的TESS设备将发送方位角
和高度
值,否则它们为空
带有GPS的TESS设备将发送经度
,纬度
和高度
值,否则它们为空
SQL查询示例
以下是示例查询Illustraing如何使用数据模型。Stars4All项目实际上正在使用它们
- 获取每台仪器的每日读数报告:
#!/bin/bash sqlite3 /var/dbase/tess.db <<EOF.mode column.headers onSELECT d.sql_date, i.name, count(*) AS readingsFROM tess_readings_t AS rJOIN tess_t AS i USING (tess_id)JOIN date_t AS d USING (date_id)GROUP BY r.date_id, r.tess_idORDER BY d.sql_date DESC;EOF
- 提取一个csv(分号分隔),并将仪器的所有读数作为命令行参数传递:
#!/bin/bashinstrument_name=$1 sqlite3 -csv -header /var/dbase/tess.db <<EOFSELECT (d.julian_day + t.day_fraction) AS julian_day, (d.sql_date || 'T' || t.time) AS timestamp, r.sequence_number, l.site, i.name, r.frequency, r.magnitude, i.zero_point, r.sky_temperature, r.ambient_temperatureFROM tess_readings_t AS rJOIN tess_t AS i USING (tess_id)JOIN location_t AS l USING (location_id)JOIN date_t AS d USING (date_id)JOIN time_t AS t USING (time_id)WHERE i.name = "${instrument_name}"ORDER BY r.date_id ASC, r.time_id ASC;EOF
- 显示当前的TESS仪器。请注意,我们正在使用
tess v
视图,以便已包含当前位置信息。
#!/bin/bash sqlite3 /var/dbase/tess.db <<EOF.mode column.headers onSELECT v.name AS Name, v.mac_address AS MAC, (v.latitude || ' ' || v.longitude) AS Coordinates , (v.site || ', ' || v.location || ', ' || v.province) AS Location, v.contact_email as User, v.zero_point as ZP, v.filter as FilterFROM tess_v AS vWHERE v.valid_state = "Current"ORDER BY v.name ASC;EOF
- 显示TESS仪器更改(零点和/或过滤器)
#!/bin/bash sqlite3 /var/dbase/tess.db <<EOF.mode column.headers on;SELECT i.name AS Name, i.zero_point as ZP, i.filter as Filter, i.valid_since AS Since, i.valid_until AS Until, i.valid_state AS 'Change State'FROM tess_t AS iORDER BY i.name ASC, i.valid_since ASC;EOF
- 显示每个TESS读数的时间跨度
#!/bin/bash sqlite3 /var/dbase/tess.db <<EOF.mode column.headers on;SELECT i.name, MIN(d.sql_date || 'T' || t.time || 'Z') AS earliest, MAX(d.sql_date || 'T' || t.time || 'Z') AS latestFROM tess_readings_t AS rJOIN tess_t AS i USING (tess_id)JOIN location_t AS l USING (location_id)JOIN date_t AS d USING (date_id)JOIN time_t AS t USING (time_id)GROUP BY i.name;EOF
- 显示未分配给任何TESS的位置
git clone https://github.com/astrorafael/tessdb.git
cd tessdb
sudo python setup.py install
0
MQTT有效载荷信息
有效载荷以json格式传输,格式如下所述。
发布于主题"stars4all/{channel}/reading"
<表><广告>发布在"stars4all/register"主题上
<表><广告>字段名 键入 单位 可选
说明
< /广告><正文>名称 字符串 - 命令
乐器友好名称。在识别设备时应该是唯一的。 mac 字符串 - 命令。 设备MAC地址,格式"xx:yy:zz:rr:ss:tt" 校准
浮动 mag/arcsec^2 命令
每个设备的零点。作为nn.nn浮点发送。 转速 int - 命令
有效载荷数据格式修订号。当前版本是1。 通道 字符串 - 选择
此仪器将发布其读数的通道。 操作和维护
tess
实用程序
tess
实用程序tess
是一个命令行实用程序,用于在不必编写sql语句的情况下对数据库执行一些常见操作。当这个实用程序修改数据库时,有必要在使用sudo中调用它。此外,您应该确保数据库不是由tessdb
编写的,以避免数据库被锁定异常,可以在白天使用它,也可以暂停tessdb
服务。
它有几个子命令s.您可以通过键入 每个子命令都有自己的帮助,您可以通过发出 示例: TESS实用程序最重要的用途是将现有位置分配给仪器,因为全新注册的仪器被分配给默认的未知位置。这必须用sudo发出,因为它需要db write。 如果自动注册失败,此命令允许在数据库中手动创建TESS仪器 为了使tess的读数存储在数据库中,需要启用(授权)。在tessdb的早期版本中,当tess被分配到一个已知位置时,当daylingth筛选器处于活动状态时,会自动发生这种情况。现在这是一个单独但重要的过程 如果出于soem的原因,我们必须避免给定的tess来存储其读数,我们将继续并禁用它。 如果由于某种原因,仪器需要更改友好的用户名,此命令允许您这样做。
小心使用此选项,因为它会留下孤立的读数 这也将删除仪器的更改历史记录,如下例所示: 如果出于某种原因,我们需要更改其中任何一个,则此命令允许您这样做。请注意,您必须至少指定一个数量级。 由于这些属性对数据库中的列进行了版本控制,因此将使用更新的 例1:
例2:
此命令提供安全系统停止的开始时间和持续时间。届时,可以保证来自不同光度计的所有读数都会因日光而被丢弃。 以下是示例查询Illustraing如何使用数据模型。Stars4All项目实际上正在使用它们tess--help来查找all
1
git clone https://github.com/astrorafael/tessdb.git
cd tessdb
sudo python setup.py install
tess<;子命令>;--help来显示这些帮助
2
git clone https://github.com/astrorafael/tessdb.git
cd tessdb
sudo python setup.py install
列出位置
tess位置列表
3
git clone https://github.com/astrorafael/tessdb.git
cd tessdb
sudo python setup.py install
重命名位置
tess location rename<;旧站点名称>;<;新站点名称>;
列出TESS仪器
TESS仪器列表
4
git clone https://github.com/astrorafael/tessdb.git
cd tessdb
sudo python setup.py install
为仪器指定位置
sudo tess assign pruebas"克里斯托瓦尔实验室"
5
git clone https://github.com/astrorafael/tessdb.git
cd tessdb
sudo python setup.py install
TESS仪器列表
6
git clone https://github.com/astrorafael/tessdb.git
cd tessdb
sudo python setup.py install
创建一个全新的TESS仪器
tess instrument创建{name}{mac}{zero point}{filter}
启用/禁用TESS仪器
TESS仪器启用开始1
7
git clone https://github.com/astrorafael/tessdb.git
cd tessdb
sudo python setup.py install
tess instrument disable stars1
8
git clone https://github.com/astrorafael/tessdb.git
cd tessdb
sudo python setup.py install
重命名TESS仪器
tess仪器重命名{旧名称}{新名称}
9
git clone https://github.com/astrorafael/tessdb.git
cd tessdb
sudo python setup.py install
删除TESS仪器
tess instrument删除pruebas
0
`sudo systemctl start tessdb`
更新零点/滤波器/方位角/高度
valid_since
、valid_until
和valid_state
列创建新的仪器条目。但是,如果传递了--latest
标志,则update命令只更改当前的tess零点或过滤器。这有助于修正当前TESS仪器定义中的错误。tess仪器更新{name}——零点{new zp}——滤波器{new filter}——方位角{new方位角}——高度{new高度}[--latest]
TESS仪器更新开始3——零点23.45——过滤器BG39
TESS仪器更新开始3——零点19.99——过滤紫外线——最新
1
`sudo systemctl start tessdb`
列出单个TESS仪器的历史更改
TESS仪器历史记录开始2
2
`sudo systemctl start tessdb`
列出TESS读数
测试读数列表
3
`sudo systemctl start tessdb`
显示系统维护窗口
4
`sudo systemctl start tessdb`
SQL查询示例
#!/bin/bash
sqlite3 /var/dbase/tess.db <<EOF.mode column.headers onSELECT d.sql_date, i.name, count(*) AS readingsFROM tess_readings_t AS rJOIN tess_t AS i USING (tess_id)JOIN date_t AS d USING (date_id)GROUP BY r.date_id, r.tess_idORDER BY d.sql_date DESC;EOF
#!/bin/bashinstrument_name=$1
sqlite3 -csv -header /var/dbase/tess.db <<EOFSELECT (d.julian_day + t.day_fraction) AS julian_day, (d.sql_date || 'T' || t.time) AS timestamp, r.sequence_number, l.site, i.name, r.frequency, r.magnitude, i.zero_point, r.sky_temperature, r.ambient_temperatureFROM tess_readings_t AS rJOIN tess_t AS i USING (tess_id)JOIN location_t AS l USING (location_id)JOIN date_t AS d USING (date_id)JOIN time_t AS t USING (time_id)WHERE i.name = "${instrument_name}"ORDER BY r.date_id ASC, r.time_id ASC;EOF
tess v
视图,以便已包含当前位置信息。#!/bin/bash
sqlite3 /var/dbase/tess.db <<EOF.mode column.headers onSELECT v.name AS Name, v.mac_address AS MAC, (v.latitude || ' ' || v.longitude) AS Coordinates , (v.site || ', ' || v.location || ', ' || v.province) AS Location, v.contact_email as User, v.zero_point as ZP, v.filter as FilterFROM tess_v AS vWHERE v.valid_state = "Current"ORDER BY v.name ASC;EOF
#!/bin/bash
sqlite3 /var/dbase/tess.db <<EOF.mode column.headers on;SELECT i.name AS Name, i.zero_point as ZP, i.filter as Filter, i.valid_since AS Since, i.valid_until AS Until, i.valid_state AS 'Change State'FROM tess_t AS iORDER BY i.name ASC, i.valid_since ASC;EOF
推荐PyPI第三方库