Implement Prometheus data exporters for CPU fan temperature and HDD temperature, along with utility functions for logging and command execution.

This commit is contained in:
2025-02-05 10:47:08 +08:00
parent d34588467b
commit 665a8ea05a
8 changed files with 546 additions and 0 deletions

132
awinlib/tapo.py Normal file
View File

@@ -0,0 +1,132 @@
from kasa import Discover
from kasa.exceptions import KasaException
from . import KasaSmartPowerStrip
from .utilities import log as log
class KasaPowerStrip:
def __init__(self, areaName, ip):
self.areaName = areaName
self.ip = ip
try:
self.powerStrip = KasaSmartPowerStrip.SmartPowerStrip(ip)
except:
self.powerStrip = None
def collectData(self):
dataDict = {}
devSysInfo = self.powerStrip.get_system_info()
for c in devSysInfo['system']['get_sysinfo']['children']:
try:
cid = int(c['id']) + 1
except:
continue
# aliasName = c['alias'].encode('latin1').decode('UTF-8')
gaugeName_Current_ma = f"{self.areaName}_{cid}_current_ma"
gaugeName_Current_ma_desc = f"Current(milliampere) of {self.areaName}:{cid}"
gaugeName_Voltage_mv = f"{self.areaName}_{cid}_voltage_mv"
gaugeName_Voltage_mv_desc = f"Voltage(millivolt) of {self.areaName}:{cid}"
gaugeName_Power_mw = f"{self.areaName}_{cid}_power_mw"
gaugeName_Power_mw_desc = f"Power(milliwatt) of {self.areaName}:{cid}"
gaugeName_TotalWh = f"{self.areaName}_{cid}_total_wh"
gaugeName_TotalWh_desc = f"Total watt-hour of {self.areaName}:{cid}"
## Get Data
realtimeInfo = self.powerStrip.get_realtime_energy_info(plug_num=cid)
realTime_current_ma = realtimeInfo.get("current_ma", 0)
realTime_voltage_mv = realtimeInfo.get("voltage_mv", 0)
realTime_power_mw = realtimeInfo.get("power_mw", 0)
realTime_total_wh = realtimeInfo.get("total_wh", 0)
# log(f"Set {gaugeName_Current_ma}: {realTime_current_ma}")
# log(f"Set {gaugeName_Voltage_mv}: {realTime_voltage_mv}")
# log(f"Set {gaugeName_Power_mw}: {realTime_power_mw}")
# log(f"Set {gaugeName_TotalWh}: {realTime_total_wh}")
dataDict[cid] = {
gaugeName_Current_ma: {
"description": gaugeName_Current_ma_desc,
"value": realTime_current_ma,
},
gaugeName_Voltage_mv: {
"description": gaugeName_Voltage_mv_desc,
"value": realTime_voltage_mv,
},
gaugeName_Power_mw: {
"description": gaugeName_Power_mw_desc,
"value": realTime_power_mw,
},
gaugeName_TotalWh: {
"description": gaugeName_TotalWh_desc,
"value": realTime_total_wh,
}
}
return dataDict
class TplinkT315:
def __init__(self, ip, username, password, devName):
self.ip = ip
self.username = username
self.password = password
self.devName = devName
self.hubDev = None
self.t315Dev = None
async def connect(self):
try:
self.hubDev = await Discover.discover_single(self.ip, username=self.username, password=self.password)
await self.hubDev.update()
except KasaException as e:
self.hubDev = None
log(f"Hub Error: {e}")
return False
try:
self.t315Dev = self.hubDev.get_plug_by_name(self.devName)
await self.t315Dev.update()
except KasaException as e:
self.t315Dev = None
log(f"Device Error: {e}")
return False
return True
async def getTemperature(self):
temperatureValue = await self.getProperty("temperature")
if temperatureValue is None:
log("temperatureValue is None")
return None
temperatureValue = float(temperatureValue)
return temperatureValue
async def getHumidity(self):
humidityValue = await self.getProperty("humidity")
if humidityValue is None:
log("humidityValue is None")
return None
humidityValue = float(humidityValue)
return humidityValue
async def getProperty(self, propName):
if self.t315Dev is None:
return None
await self.hubDev.update()
await self.t315Dev.update()
featuresOfTempDev = self.t315Dev.features
if propName not in featuresOfTempDev:
return None
return featuresOfTempDev[propName].value
async def disconnect(self):
if self.hubDev is None:
return
await self.hubDev.disconnect()