(“将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读数,并避免数据库中出现不必要的抱怨。 每个位置都有纬度(度)、经度(度)和海拔(米)可忽略不计,因为不使用此过滤器。

激活此筛选器有以下条件:

  1. 每天一次,在UTC时间00:00左右,所有地点都将根据定义的本地地平线(可配置)计算日出和日落时间。
  2. 分配到位置的仪器如果发现是在白天,他们的读数将被拒绝。
  3. 新的分配到未知经度、纬度或高程位置的仪器将接受其读数。启用或禁用对数据库的写入的唯一方法是使用tess实用程序

日志记录

日志文件通常放在Linux中的/var/log/tessdb.log下,或Windows中的C:\tessdb\log文件夹下。 默认日志级别为info。它在这个级别生成的日志很少。 只有在Linux下,文件才会通过logrotate进行旋转。

操作

服务器状态/启动/停止/重新启动

  • 服务状态:sudo systemctl status tessdbsudo service tessdb status
  • 启动服务:sudo systemctl start tessdbsudo service tessdb start
  • 停止服务:sudo systemctl stop tessdbsudo service tessdb stop
  • 重新启动服务:sudo systemctl restart tessdbsudo service tessdb stop

服务暂停/恢复

服务器可以置于暂停模式(pause mode),其中仍将接收传入的mqtt消息,但将在内部排队,而不会写入数据库。此外,所有到数据库的连接都已关闭。这允许在不丢失传入数据的情况下对数据库执行高风险操作。示例:

  • 使用sqlitevacuumpragma压缩数据库
  • 从表中迁移数据。

服务暂停/恢复使用内部信号sigusr1sigusr2

要暂停服务器,请键入:sudo tessdb_pause并用tail-f/var/log/tessdb.log查看日志文件输出

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

注意:旧的sudo service tessdb pause命令不再工作。

要恢复正常操作,请键入sudo tessdb_resume并查看相同的日志文件:

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

服务重新加载

在重新加载期间,不会停止服务并从配置文件中重新读取新值并应用更改。通常,可以重新加载与维护到mqtt代理的当前连接或更改数据库模式无关的所有方面。配置文件中描述了可重新加载属性的完整列表。

  • 键入sudo systemctl reload tessdbsudo service tessdb reload

维护费用

数据库维护是通过由tessdb reports包安装的tess命令行实用程序进行的。 维护操作包括:

  • 创建新位置
  • 创建新的TESS仪器(手动)
  • 为仪表指定位置
  • 启用记录从仪器接收的数据
  • 列出当前工具
  • 列出未分配到任何已知位置的仪器

数据模型

尺寸建模

数据模型遵循[维度建模] Ralph Kimball的方法(https://en.wikipedia.org/wiki/dimensional_modeling" rel="nofollow">https://en.wikipedia.org/wiki/dimensional_modeling)。更多参考也可以在星型模式中找到。

数据模型

下图显示了tessdb的布局。

TESS数据库模型

尺寸表

它们是:

  • 日期:从2016年到2026年预装
  • 时间t:预装,秒分辨率(可配置)
  • 测试s_t:注册的TESS仪器正在收集数据
  • 位置:部署仪器的位置
  • tess_units_t:报告的各种单位标签集合,预装当前单位。
  • tess v:使用tess仪器和当前位置查看。建议报表应用程序使用此视图,而不是底层的tess\tlocation\t表。

日期维度

几乎是标准的日期表从维度建模。包含天文学领域最常用的属性加上儒略日。

一天中的时间维度

基本上是一天中的标准时间表。包含众所周知的属性。

仪器尺寸

此维度包含当前的TESS仪器列表。

  • 真正的键是链接到事实表的人工键
  • 如果没有零点和滤波历史记录跟踪,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表中生成新行

  • 零点保持仪器校准常数的当前值。默认为"20.5"(未校准光度计)。
  • 过滤器保存当前的tess过滤器(即"uvir"或二色玻璃)。默认为"uvir"
  • 方位角高度属性保持光度计的当前方向,单位为度。默认方位角为0.0,默认高度为90.0
版本控制属性

这些列管理给定tess属性的版本控制。

  • valid_sincevalid_直到保留对版本控制属性的更改有效的时间戳。
  • "有效状态"列是一个指示器。它的值要么是当前的,要么是过期的。 当前有效的TESS仪器将其有效状态设置为当前状态,并将过期日期设置为遥远的未来(1999年)。

单位尺寸

kimball博士将tess\u units\u t表表示为一个垃圾维度。它收集VA表示事实表中样本当前测量单位的不确定标签。

  • valid_sincevalid_untilvalid_state如果单元发生更改,请使用与上面类似的方法跟踪任何单元的更改。

位置尺寸

此尺寸表包含所有已知的部署TESS光度计的位置。

  • 站点。描述此位置的唯一站点名称。
  • 联系您的人。负责观察的人。
  • 组织。联系人所属的组织或所在地设施的运营。
  • 联系电子邮件。联系人电子邮件地址。
  • 经度位置经度(度)。西部是负的。
  • 纬度。位置纬度(度)
  • 高程。位置高程(米)
  • zipcode。位置邮政编码
  • 。所在国家/地区
  • 国家。所在国家/地区
  • 时区。时区(用于计算本地时间),采用维基百科描述的标准格式[https://en.wikipedia.org/wiki/list-of-tz-u database-time-zones]
  • 日出&;日落。用于过滤白天读数的计算属性(每天OCE)。

事实表

它们是:

  • tess_readings_t:累积快照事实表,其中包含来自几个tess仪器的测量值。

带有加速计的TESS设备将发送方位角高度值,否则它们为

带有GPS的TESS设备将发送经度纬度高度值,否则它们为

SQL查询示例

以下是示例查询Illustraing如何使用数据模型。Stars4All项目实际上正在使用它们

  1. 获取每台仪器的每日读数报告:
#!/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
  1. 提取一个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
  1. 显示当前的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
  1. 显示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
  1. 显示每个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
  1. 显示未分配给任何TESS的位置
git clone https://github.com/astrorafael/tessdb.git
cd tessdb
sudo python setup.py install
0

MQTT有效载荷信息

有效载荷以json格式传输,格式如下所述。

发布于主题"stars4all/{channel}/reading"

<表><广告>字段名键入单位可选 说明 < /广告><正文>顺序 int-命令 序列号。如果可能,使用32位。每次重新启动设备时,序列号将从1开始。名称字符串-命令 乐器友好名称。在识别设备时应该是唯一的。频率 浮动赫兹命令 原始读数为3位小数精度(毫赫兹)nnnnn.nnn的频率mag浮动mag/arcsec^2命令。视觉幅度(公式?)对应于原始读数)。最多传送两位小数nn.nntamb浮动摄氏度 命令。环境温度。传送到小数点后一位。tsky浮动摄氏度 命令。天空温度。传送到小数点后一位。WDBMintdbm选择 WiFi接收信号强度。azint度 选择 光度计光轴方位角仅在带加速计的仪器上发送。高度int度 选择 光度计光轴高度(角度):仅在带有加速计的仪器上发送。纬度浮动度 选择 仪器纬度。仅由带有GPS积分的仪器发送。长浮动度 选择 仪器经度。仅由带有GPS积分的仪器发送。高度浮动米选择 仪器高于海平面的高度。仅由带有GPS积分的仪器发送。转速int-命令 有效载荷数据格式修订号。当前版本是1。tstamp字符串UTC选择 时间戳,"yyyy-mm-ddthh:mm:ss"格式。必须是UTC。

发布在"stars4all/register"主题上 <表><广告>字段名键入单位可选 说明 < /广告><正文>名称字符串-命令 乐器友好名称。在识别设备时应该是唯一的。mac字符串-命令。设备MAC地址,格式"xx:yy:zz:rr:ss:tt"校准 浮动mag/arcsec^2命令 每个设备的零点。作为nn.nn浮点发送。转速int-命令 有效载荷数据格式修订号。当前版本是1。通道字符串-选择 此仪器将发布其读数的通道。

操作和维护

tess实用程序

tess是一个命令行实用程序,用于在不必编写sql语句的情况下对数据库执行一些常见操作。当这个实用程序修改数据库时,有必要在使用sudo中调用它。此外,您应该确保数据库不是由tessdb编写的,以避免数据库被锁定异常,可以在白天使用它,也可以暂停tessdb服务。

它有几个子命令s.您可以通过键入tess--help来查找all

git clone https://github.com/astrorafael/tessdb.git
cd tessdb
sudo python setup.py install
1

每个子命令都有自己的帮助,您可以通过发出tess<;子命令>;--help来显示这些帮助

示例:

git clone https://github.com/astrorafael/tessdb.git
cd tessdb
sudo python setup.py install
2

列出位置

tess位置列表

git clone https://github.com/astrorafael/tessdb.git
cd tessdb
sudo python setup.py install
3

重命名位置

tess location rename<;旧站点名称>;<;新站点名称>;

列出TESS仪器

TESS仪器列表

git clone https://github.com/astrorafael/tessdb.git
cd tessdb
sudo python setup.py install
4

为仪器指定位置

TESS实用程序最重要的用途是将现有位置分配给仪器,因为全新注册的仪器被分配给默认的未知位置。这必须用sudo发出,因为它需要db write。

sudo tess assign pruebas"克里斯托瓦尔实验室"

git clone https://github.com/astrorafael/tessdb.git
cd tessdb
sudo python setup.py install
5

TESS仪器列表

git clone https://github.com/astrorafael/tessdb.git
cd tessdb
sudo python setup.py install
6

创建一个全新的TESS仪器

如果自动注册失败,此命令允许在数据库中手动创建TESS仪器

tess instrument创建{name}{mac}{zero point}{filter}

启用/禁用TESS仪器

为了使tess的读数存储在数据库中,需要启用(授权)。在tessdb的早期版本中,当tess被分配到一个已知位置时,当daylingth筛选器处于活动状态时,会自动发生这种情况。现在这是一个单独但重要的过程

TESS仪器启用开始1

git clone https://github.com/astrorafael/tessdb.git
cd tessdb
sudo python setup.py install
7

如果出于soem的原因,我们必须避免给定的tess来存储其读数,我们将继续并禁用它。

tess instrument disable stars1

git clone https://github.com/astrorafael/tessdb.git
cd tessdb
sudo python setup.py install
8

重命名TESS仪器

如果由于某种原因,仪器需要更改友好的用户名,此命令允许您这样做。 tess仪器重命名{旧名称}{新名称}

git clone https://github.com/astrorafael/tessdb.git
cd tessdb
sudo python setup.py install
9

删除TESS仪器

小心使用此选项,因为它会留下孤立的读数

这也将删除仪器的更改历史记录,如下例所示:

tess instrument删除pruebas

`sudo systemctl start tessdb`
0

更新零点/滤波器/方位角/高度

如果出于某种原因,我们需要更改其中任何一个,则此命令允许您这样做。请注意,您必须至少指定一个数量级。

由于这些属性对数据库中的列进行了版本控制,因此将使用更新的valid_sincevalid_untilvalid_state列创建新的仪器条目。但是,如果传递了--latest标志,则update命令只更改当前的tess零点或过滤器。这有助于修正当前TESS仪器定义中的错误。

tess仪器更新{name}——零点{new zp}——滤波器{new filter}——方位角{new方位角}——高度{new高度}[--latest]

例1: TESS仪器更新开始3——零点23.45——过滤器BG39

例2: TESS仪器更新开始3——零点19.99——过滤紫外线——最新

`sudo systemctl start tessdb`
1

列出单个TESS仪器的历史更改

TESS仪器历史记录开始2

`sudo systemctl start tessdb`
2

列出TESS读数

测试读数列表

`sudo systemctl start tessdb`
3

显示系统维护窗口

此命令提供安全系统停止的开始时间和持续时间。届时,可以保证来自不同光度计的所有读数都会因日光而被丢弃。

`sudo systemctl start tessdb`
4

SQL查询示例

以下是示例查询Illustraing如何使用数据模型。Stars4All项目实际上正在使用它们

  1. 获取每台仪器的每日读数报告:
#!/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
  1. 提取一个csv(分号分隔),并将仪器的所有读数作为逗号传递d行参数:
#!/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
  1. 显示当前的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
  1. 显示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

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java如何在JUNIT/Mockito中验证以下情况   Map<A,List<B>>元素的Java组合算法   java为什么mvn dependency:purgelocalrepository不获取与mvn install相同的依赖项?   java如何将输入转换为程序能够理解的方法   java使用Jackson ObjectMapper的默认展开序列化程序   java SpringBoot:400错误请求错误,即使参数存在   java使用“Spring数据Jpa查询”检索“hibernate代理对象”列表   java JSON返回空内容   用某些整数表示字符串的java   java上传一个文件。来自REST服务的二进制输入流zip文件   java截击请求在单击按钮时执行两次   返回存储长值所需的字节数的java函数   Java将嵌套的Json对象反序列化为Java对象   使用差分bean服务的JavaSpring测试   Lucene 4.0中的java术语频率   java基本实体和可序列化   java CArray和Array在PyTables之外的兼容性   什么是Java中的备份集合?   java如何防止用户关闭我的应用程序?(Linux触摸屏应用程序)   JavaSpark:运行时reduce元素的技术术语?