如何使用python脚本仅从json api接收选定序列号中的数据
如何仅从选定的序列号接收数据 或者添加要排除的序列号列表? ie)“序列号”:“121718037628”,已经死亡约2个月了 或者自动排除长时间未更新的数据 使用“lastReportDate”:1549920259 使用普罗米修斯刮取元数据 来自同相微逆变器控制器的电流如下所示 (本地网络) 我试着把这个加进去如何使用python脚本仅从json api接收选定序列号中的数据,python,json,web-scraping,prometheus,Python,Json,Web Scraping,Prometheus,如何仅从选定的序列号接收数据 或者添加要排除的序列号列表? ie)“序列号”:“121718037628”,已经死亡约2个月了 或者自动排除长时间未更新的数据 使用“lastReportDate”:1549920259 使用普罗米修斯刮取元数据 来自同相微逆变器控制器的电流如下所示 (本地网络) 我试着把这个加进去 ignore_list = ['121718037628'] for pattern in ignore_list: if fnmatch( pa
ignore_list = ['121718037628']
for pattern in ignore_list:
if fnmatch( pattern):
should_ignore = True
试过
[f for f in serial if not any(a in f.split() for a in faultyunit)]
这是python的原始代码
#!/usr/bin/env python -f
import os
import time
import json
import requests
import threading
from requests.auth import HTTPDigestAuth
from prometheus_client import start_http_server, Gauge
host = os.getenv('ENVOY_HOST')
password = os.getenv('ENVOY_PASS')
user = 'installer'
auth = HTTPDigestAuth(user, password)
marker = b'data: '
serials = {
121718037663: '#1',
121718037534: '#1',
121718037513: '#1',
121718037414: '#1',
121718037683: '#1',
121718037593: '',
121718037695: '#1',
121718037872: '#1',
121718037601: '#1',
121718037876: '#2',
121718037698: '#2',
121718037881: '#2',
121718037584: '#2',
121718037703: '#2',
}
stream_gauges = {
'p': Gauge('meter_active_power_watts', 'Active Power', ['type',
'phase']),
'q': Gauge('meter_reactive_power_watts', 'Reactive Power',
['type', 'phase']),
's': Gauge('meter_apparent_power_watts', 'Apparent Power',
['type', 'phase']),
'v': Gauge('meter_voltage_volts', 'Voltage', ['type', 'phase']),
'i': Gauge('meter_current_amps', 'Current', ['type', 'phase']),
'f': Gauge('meter_frequency_hertz', 'Frequency', ['type', 'phase']),
'pf': Gauge('meter_power_factor_ratio', 'Power Factor', ['type', 'phase']),
}
production_gauges = {
'activeCount': Gauge('production_active_count', 'Active Count', ['type']),
'wNow': Gauge('power_now_watts', 'Active Count', ['type']),
'whToday': Gauge('production_today_watthours', 'Total production today', ['type']),
'whLastSevenDays': Gauge('production_7days_watthours', 'Total production last seven days', ['type']),
'whLifetime': Gauge('production_lifetime_watthours', 'Total production lifetime', ['type']),
}
consumption_gauges = {
'wNow': Gauge('consumption_now_watts', 'Active Count', ['type']),
'whToday': Gauge('consumption_today_watthours', 'Total consumption today', ['type']),
'whLastSevenDays': Gauge('consumption_7days_watthours', 'Total consumption last seven days', ['type']),
'whLifetime': Gauge('consumption_lifetime_watthours', 'Total consumption lifetime', ['type']),
}
inverter_gauges = {
'last': Gauge('inverter_last_report_watts', 'Last reported watts', ['serial', 'location']),
'max': Gauge('inverter_max_report_watts', 'Max reported watts', ['serial', 'location']),
}
def scrape_stream():
while True:
try:
url = 'http://%s/stream/meter' % host
stream = requests.get(url, auth=auth, stream=True, timeout=5)
for line in stream.iter_lines():
if line.startswith(marker):
data = json.loads(line.replace(marker, b''))
print(data)
for meter_type in ['production', 'net-consumption', 'total-consumption']:
for phase in ['ph-a', 'ph-b']:
for key, value in data.get(meter_type, {}).get(phase, {}).items():
if key in stream_gauges:
stream_gauges[key].labels(type=meter_type, phase=phase).set(value)
except requests.exceptions.RequestException as e:
print('Exception fetching stream data: %s' % e)
time.sleep(5)
def scrape_production_json():
url = 'http://%s/production.json' % host
data = requests.get(url).json()
production = data['production']
print(production)
for each in production:
mtype = each['type']
for key in ['activeCount', 'wNow', 'whLifetime', 'whToday', 'whLastSevenDays']:
value = each.get(key)
if value is not None:
production_gauges[key].labels(type=mtype).set(value)
consumption = data['consumption']
print(consumption)
for each in consumption:
mtype = each['measurementType']
for key in ['wNow', 'whLifetime', 'whToday', 'whLastSevenDays']:
value = each.get(key)
if value is not None:
consumption_gauges[key].labels(type=mtype).set(value)
def scrape_inverters():
url = 'http://%s/api/v1/production/inverters' % host
data = requests.get(url, auth=auth).json()
print(data)
for inverter in data:
serial = int(inverter['serialNumber'])
location = serials.get(serial, '')
inverter_gauges['last'].labels(serial=serial,
location=location).set(inverter['lastReportWatts'])
inverter_gauges['max'].labels(serial=serial,
location=location).set(inverter['maxReportWatts'])
def main():
start_http_server(8000)
stream_thread = threading.Thread(target=scrape_stream)
stream_thread.setDaemon(True)
stream_thread.start()
while True:
try:
scrape_production_json()
scrape_inverters()
except Exception as e:
print('Exception fetching scrape data: %s' % e)
time.sleep(60)
if __name__ == '__main__':
main()
我试着加上这个
}
ignorelist = {
121718037628,
}
for inverter in data:
if inverter['serialNumber'] in ignorelist:
continue
serial = int(inverter['serialNumber'])
但是它跳过了所有的逆变器
我也尝试过这种方法
json_response = [
{
}
]
但不确定如何从API中读取数据
ignore_set = {'121718037628',}
for inverter in json_response:
if inverter['serialNumber'] not in ignore_set:
print(inverter)
终于解决了,谢谢你的帮助
ignorelist = {
'121718037628','121718037534'
}
for inverter in data:
if inverter['serialNumber'] not in ignorelist:
print(inverter)
serial = int(inverter['serialNumber'])
location = serials.get(serial, '')
也许检查序列在忽略列表中,然后跳过设备的进一步处理 数据中逆变器的
:
如果逆变器['serialNumber']不在信号列表中:
串行=整数(逆变器['serialNumber'])
我刚刚醒过来,所以没有注意到-您试图从请求中排除或从响应中过滤?感谢您的评论,早上好,我想我可以尝试查看排除,输出通常是这样的:inverter_last_report_watts{location=“”,serial=“121718037628”}18.0,如果是数字,我不需要输出“121718037628”但如果它只从本节中包含的序列中获取数据:serials={121718037663:“#1”,这将非常好,因为它们是手动输入的,以设置它们在图形上的数组。如果我以前尝试过,它将崩溃,除非我在设置忽略列表时出错?(很抱歉,我无法计算出此文件的格式)ignorelist={121718037628,}因此,很明显,由于缩进错误,我浪费了一天的时间,感谢您确认我的思路是正确的。然而,它现在忽略了所有内容`ignorelist={
121718037628,
`(叹气我仍然不知道如何用代码格式回复如何在不发送的情况下删除一行)谢谢,你是否有一个忽略列表作为字符串的示例无论我做什么都会跳过所有反相器:异常获取刮取数据:未定义名称“循环”
ignorelist = {
'121718037628','121718037534'
}
for inverter in data:
if inverter['serialNumber'] not in ignorelist:
print(inverter)
serial = int(inverter['serialNumber'])
location = serials.get(serial, '')
ignorelist = {
'121718037628','121718037534'
}
for inverter in data:
if inverter['serialNumber'] not in ignorelist:
print(inverter)
serial = int(inverter['serialNumber'])
location = serials.get(serial, '')