121 lines
4.6 KiB
Python
121 lines
4.6 KiB
Python
|
import asyncio
|
|||
|
|
|||
|
from discord.ext import commands, tasks
|
|||
|
from discord.utils import get
|
|||
|
from requests import get
|
|||
|
from requests.structures import CaseInsensitiveDict
|
|||
|
|
|||
|
from re import findall # Импортируем библиотеку по работе с регулярными выражениями
|
|||
|
from subprocess import check_output # Импортируем библиотеку по работе с внешними процессами
|
|||
|
|
|||
|
from json import loads
|
|||
|
from cogs.emojis import check_mark, XX
|
|||
|
from subprocess import run as cmd
|
|||
|
import discord
|
|||
|
from discord import app_commands
|
|||
|
|
|||
|
from loguru import logger
|
|||
|
|
|||
|
class SSC(commands.Cog, name="SSC"):
|
|||
|
"""Управление моей Системой Умной Комнаты Альфа-версия"""
|
|||
|
|
|||
|
def __init__(self, bot):
|
|||
|
self.bot = bot
|
|||
|
self.cooler.start()
|
|||
|
logger.debug("Cooler.start()")
|
|||
|
self.last_temp = 0
|
|||
|
|
|||
|
def cog_unload(self):
|
|||
|
self.cooler.cancel()
|
|||
|
|
|||
|
async def cog_check(self, ctx):
|
|||
|
return ctx.message.author.id in (self.bot.owner_id, 779697451404886016)
|
|||
|
|
|||
|
@commands.command(brief="Включает/выключает свет")
|
|||
|
async def light(self, ctx):
|
|||
|
headers = CaseInsensitiveDict()
|
|||
|
headers["Authorization"] = "Bearer cvbnmjhgvbnmj"
|
|||
|
get("http://localhost:80/API/light", headers=headers)
|
|||
|
|
|||
|
await asyncio.sleep(3)
|
|||
|
await ctx.message.delete()
|
|||
|
|
|||
|
@commands.command(brief="Показывает темпераруру",
|
|||
|
aliases=['temp'])
|
|||
|
async def temperature(self, ctx):
|
|||
|
headers = CaseInsensitiveDict()
|
|||
|
headers["Authorization"] = "Bearer cvbnmjhgvbnmj"
|
|||
|
r = get("http://localhost:80/API/temperature", headers=headers)
|
|||
|
j = loads(r.text)
|
|||
|
await ctx.send(f"__DHT__\n"
|
|||
|
f"Температура: {j['DHT']['temperature']}\n"
|
|||
|
f"Влажность: {j['DHT']['humidity']}\n"
|
|||
|
f"__CPU__\n"
|
|||
|
f"Температура: {j['CPU']['temperature']}")
|
|||
|
|
|||
|
@tasks.loop(minutes=1)
|
|||
|
async def cooler(self):
|
|||
|
temp0 = 55
|
|||
|
temp1 = 80
|
|||
|
min_pwm = 125
|
|||
|
|
|||
|
temp = get_temp()
|
|||
|
# logger.info(f"Температура процессора: {temp}")
|
|||
|
|
|||
|
pwm = (temp-temp0) / (temp1-temp0)
|
|||
|
pwm = int((255 - min_pwm)*pwm + min_pwm)
|
|||
|
|
|||
|
if self.last_temp < temp: pwm += 25
|
|||
|
self.last_temp = temp
|
|||
|
# if temp <= 65: pwm += 50
|
|||
|
|
|||
|
if pwm < min_pwm: pwm = 0
|
|||
|
if pwm > 255: pwm = 255
|
|||
|
|
|||
|
# logger.info(f"Мощность куллера: {pwm} ({int(pwm/256*100)}%)")
|
|||
|
|
|||
|
headers = CaseInsensitiveDict()
|
|||
|
headers["Authorization"] = "Bearer cvbnmjhgvbnmj"
|
|||
|
get(f"http://localhost/API/cooler/{pwm}", headers=headers)
|
|||
|
|
|||
|
@app_commands.command()
|
|||
|
async def host(self, inter):
|
|||
|
await inter.response.send_message(cmd(["neofetch", "--stdout"], capture_output=True).stdout.decode("utf-8"))
|
|||
|
|
|||
|
|
|||
|
# @tasks.loop(seconds=1)
|
|||
|
# async def open_door(self):
|
|||
|
# if self.arduino.inWaiting() > 0:
|
|||
|
# data = self.arduino.readline()
|
|||
|
# if data == b'door\r\n':
|
|||
|
# embed = discord.Embed(title="Дверь открыта!", color=discord.Color(0xFF0000))
|
|||
|
# await get(self.bot.users, id=self.bot.owner_id).send(embed=embed, delete_after=15)
|
|||
|
# elif data == b'test\r\n':
|
|||
|
# self.arduino.write(b'2')
|
|||
|
# else:
|
|||
|
# await get(self.bot.users, id=self.bot.owner_id).send(data)
|
|||
|
|
|||
|
# @tasks.loop(seconds=1)
|
|||
|
# async def alarm(self):
|
|||
|
# now = datetime.datetime.now()
|
|||
|
# time = datetime.time(7)
|
|||
|
# delta = datetime.timedelta(seconds=2)
|
|||
|
# combine = datetime.datetime.combine(now.date(), time)
|
|||
|
#
|
|||
|
# if combine-delta <= now <= combine+delta:
|
|||
|
# await get(self.bot.users, id=self.bot.owner_id).send("!!!")
|
|||
|
# self.arduino.write(b'1')
|
|||
|
# await asyncio.sleep(1)
|
|||
|
# self.arduino.write(b'1')
|
|||
|
# await asyncio.sleep(1)
|
|||
|
# self.arduino.write(b'1')
|
|||
|
|
|||
|
def get_temp():
|
|||
|
temp = check_output(["vcgencmd", "measure_temp"]).decode() # Выполняем запрос температуры
|
|||
|
temp = float(findall('\d+\.\d+', temp)[
|
|||
|
0]) # Извлекаем при помощи регулярного выражения значение температуры из строки "temp=47.8'C"
|
|||
|
return (temp)
|
|||
|
|
|||
|
async def setup(bot):
|
|||
|
await bot.add_cog(SSC(bot))
|