first commit
This commit is contained in:
31
tuya/Victron.py
Normal file
31
tuya/Victron.py
Normal file
@@ -0,0 +1,31 @@
|
||||
import requests
|
||||
import json
|
||||
import prettytable as pt
|
||||
|
||||
# URL de l'API
|
||||
url = "http://192.168.1.49/getVictron"
|
||||
|
||||
# Faire la requete GET
|
||||
response = requests.get(url)
|
||||
|
||||
# Verifier que la requete a reussi
|
||||
if response.status_code == 200:
|
||||
# Charger le JSON recu
|
||||
data = response.json()
|
||||
|
||||
# Creer un tableau PrettyTable
|
||||
table = pt.PrettyTable()
|
||||
table.field_names = ["ID", "Key Label", "Label", "Value"]
|
||||
|
||||
# Ajouter les lignes au tableau
|
||||
for item in data:
|
||||
table.add_row([
|
||||
item.get("id", "N/A"),
|
||||
item.get("key_label", "N/A"),
|
||||
item.get("label", "N/A"),
|
||||
item.get("value", "N/A")
|
||||
])
|
||||
# Afficher le tableau
|
||||
print(table)
|
||||
|
||||
|
||||
139
tuya/device.py
Normal file
139
tuya/device.py
Normal file
@@ -0,0 +1,139 @@
|
||||
import tinytuya
|
||||
import requests
|
||||
import time
|
||||
|
||||
def get_value_safely(data, key):
|
||||
try:
|
||||
# Tente d'obtenir la valeur associée à la clé, si elle existe
|
||||
value = data['dps'].get(key, None)
|
||||
|
||||
# Si la valeur est None, renvoie 0
|
||||
return value if value is not None else 0
|
||||
|
||||
except Exception as e:
|
||||
# En cas d'erreur, imprime un message d'erreur et renvoie 0
|
||||
print(f"Erreur : {e}")
|
||||
return 0
|
||||
|
||||
# Connect to Device
|
||||
#"apiKey": "hgkvdyrstyhqudku3xdu",
|
||||
#"apiSecret": "704a1bad394a4efe805f46fb04c46916",
|
||||
#"apiRegion": "eu-w",
|
||||
#"apiDeviceID": "bf4d021ef10d39ea17gpwo"
|
||||
|
||||
response = ""
|
||||
while True:
|
||||
d = tinytuya.OutletDevice(
|
||||
dev_id='bf4d021ef10d39ea17gpwo',
|
||||
address='192.168.1.15', # 53 Or set to 'Auto' to auto-discover IP address
|
||||
local_key='4.p}ZHi*hO>wVFl-',
|
||||
version=3.5)
|
||||
|
||||
# Get Status
|
||||
data = d.status()
|
||||
print('set_status() result %r' % data)
|
||||
|
||||
#data = json.loads(data)
|
||||
|
||||
# Utilisation de la fonction get_value_safely pour remplacer les lignes existantes
|
||||
value_105 = get_value_safely(data, '105')
|
||||
value_106 = get_value_safely(data, '106')
|
||||
value_107 = get_value_safely(data, '107')
|
||||
value_108 = get_value_safely(data, '108') or 0
|
||||
value_109 = get_value_safely(data, '109') or 0
|
||||
value_115 = get_value_safely(data, '115')
|
||||
value_116 = get_value_safely(data, '116')
|
||||
value_117 = get_value_safely(data, '117')
|
||||
value_118 = get_value_safely(data, '118') or 0
|
||||
value_119 = get_value_safely(data, '119') or 0
|
||||
|
||||
# Afficher les valeurs
|
||||
print("=================================")
|
||||
#print("103 :", data['dps'].get('103', None) or 0)
|
||||
#print("104 :", data['dps'].get('104', None) or 0)
|
||||
print("105 Valeur watt :", value_105 / 10)
|
||||
print("106 Valeur mA :", value_106)
|
||||
print("107 Valeur Volt :", value_107 / 10)
|
||||
print("108 Cumul kWh :", value_108 / 1000)
|
||||
print("109 Valeur kWh :", value_109 / 1000)
|
||||
#print("110 :", data['dps'].get('110', None))
|
||||
#print("111 Alerte 1 :", data['dps'].get('111', None))
|
||||
print("=================================")
|
||||
#print("113 :", data['dps'].get('113', None))
|
||||
#print("114 :", data['dps'].get('114', None))
|
||||
print("115 Valeur watt :", value_115 / 10)
|
||||
print("116 Valeur mA :", value_116)
|
||||
print("117 Valeur Volt :", value_117 / 10)
|
||||
print("118 Cumul kWh :", value_118 / 1000)
|
||||
print("119 Valeur kWh :", value_119 / 1000)
|
||||
#print("120 :", data['dps'].get('120', None))
|
||||
#print("121 Alerte 2 :", data['dps'].get('121', None))
|
||||
print("=================================")
|
||||
|
||||
#print("122 :", data['dps'].get('122', None))
|
||||
#print("123 :", data['dps'].get('123', None))
|
||||
#print("124 :", data['dps'].get('124', None))
|
||||
# Turn On
|
||||
#d.turn_on()
|
||||
|
||||
# id domoticz 1181
|
||||
# print('1121|0|' + str(value_105) + ";0;" + str(value_115) + ";0;" + str(value_108) + ";" + str(value_118))
|
||||
|
||||
# Effectuer une requête GET
|
||||
#url = "http://192.168.1.3:81/json.htm?type=command¶m=udevice&idx=1181&nvalue=0&svalue=" + str(value_109) + ";" + str(value_105 / 10) + ";" + str(value_119) + ";" + str(value_115 / 10) + ";;"
|
||||
url = "http://192.168.1.3:81/json.htm?type=command¶m=udevice&idx=1181&nvalue=0&svalue=" + str(value_109) + ";0;" + str(value_119) + ";0;" + str(value_105 / 10) + ";" + str(value_115 / 10) #USAGE1;USAGE2;RETURN1;RETURN2;CONS;PROD
|
||||
|
||||
#USAGE1;USAGE2;RETURN1;RETURN2;CONS;PROD
|
||||
print(url)
|
||||
try:
|
||||
response = requests.get(url)
|
||||
print(response)
|
||||
except requests.RequestException as e:
|
||||
# Gérez les autres erreurs liées aux requêtes ici
|
||||
print(f"Erreur de requête : {e}")
|
||||
|
||||
time.sleep(1)
|
||||
|
||||
|
||||
# 1185 Radiateur
|
||||
idx = "1185"
|
||||
url = "http://192.168.1.3:81/json.htm?type=command¶m=udevice&idx=" + idx + "&svalue=" + str(value_115 / 10) + ";0&nvalue=0";
|
||||
try:
|
||||
response = requests.get(url)
|
||||
print(response)
|
||||
except requests.RequestException as e:
|
||||
# Gérez les autres erreurs liées aux requêtes ici
|
||||
print(f"Erreur de requête : {e}")
|
||||
print(response)
|
||||
time.sleep(1)
|
||||
|
||||
# 1184 Chauffe eau 2
|
||||
idx = "1184"
|
||||
url = "http://192.168.1.3:81/json.htm?type=command¶m=udevice&idx=" + idx + "&svalue=" + str(value_105 / 10) + ";0&nvalue=0";
|
||||
try:
|
||||
response = requests.get(url)
|
||||
print(response)
|
||||
except requests.RequestException as e:
|
||||
# Gérez les autres erreurs liées aux requêtes ici
|
||||
print(f"Erreur de requête : {e}")
|
||||
|
||||
# --USAGE1= energy usage meter tariff 1, This is an incrementing counter
|
||||
# --USAGE2= energy usage meter tariff 2, This is an incrementing counter
|
||||
# --RETURN1= energy return meter tariff 1, This is an incrementing counter
|
||||
# --RETURN2= energy return meter tariff 2, This is an incrementing counter
|
||||
# --CONS= actual usage power (Watt)
|
||||
# --PROD= actual return power (Watt)
|
||||
# .. tostring(math.floor(watt_p1)) .. ';'
|
||||
# .. tostring(math.floor(watt_p2)) .. ';'
|
||||
# -- + value_solar2 - counter_solar2
|
||||
# .. tostring(math.floor(value_solar - counter_solar + value_solar2 - counter_solar2)) .. ';'
|
||||
# .. '0;'
|
||||
# .. tostring(math.floor(math.max(0,watt) + watt_solaire)).. ';'
|
||||
# .. tostring(math.floor(watt_solaire)) --math.floor(ConsumoEnergyBalance / 1000)) --round(watt,0))
|
||||
|
||||
|
||||
# Turn Off
|
||||
#d.turn_off()
|
||||
time.sleep(25)
|
||||
|
||||
|
||||
248
tuya/device2.py
Normal file
248
tuya/device2.py
Normal file
@@ -0,0 +1,248 @@
|
||||
import tinytuya
|
||||
import requests
|
||||
import time
|
||||
import math
|
||||
import numpy as np
|
||||
from scipy import stats
|
||||
|
||||
from datetime import datetime
|
||||
|
||||
def get_value_safely(data, key):
|
||||
try:
|
||||
# Tente d'obtenir la valeur associée à la clé, si elle existe
|
||||
value = data['dps'].get(key, None)
|
||||
|
||||
# Si la valeur est None, renvoie 0
|
||||
return value if value is not None else 0
|
||||
|
||||
except Exception as e:
|
||||
# En cas d'erreur, imprime un message d'erreur et renvoie 0
|
||||
print(f"Erreur : {e}")
|
||||
return 0
|
||||
|
||||
# Obtenir la date et l'heure actuelles
|
||||
maintenant = datetime.now()
|
||||
|
||||
# Formater la date et l'heure
|
||||
format_date_heure = maintenant.strftime("%Y-%m-%d %H:%M:%S")
|
||||
|
||||
# Imprimer la date et l'heure
|
||||
print("Date et Heure actuelles :", format_date_heure)
|
||||
|
||||
|
||||
# Connect to Device
|
||||
#"apiKey": "hgkvdyrstyhqudku3xdu",
|
||||
#"apiSecret": "704a1bad394a4efe805f46fb04c46916",
|
||||
#"apiRegion": "eu-w",
|
||||
#"apiDeviceID": "bf4d021ef10d39ea17gpwo"
|
||||
|
||||
response = ""
|
||||
previous_sens = ""
|
||||
watt_1_p = 0
|
||||
watt_2_p = 0
|
||||
PUISSANCE_DELESTAGE = 750 # Watts
|
||||
MAX_VALUES = 5
|
||||
|
||||
# Initialisation de la liste des dernières valeurs
|
||||
last_values = []
|
||||
|
||||
# Initialisation de la somme des valeurs
|
||||
sum_values = 0
|
||||
|
||||
# Initialisation du compteur pour suivre le nombre de valeurs ajoutées
|
||||
counter = 0
|
||||
|
||||
|
||||
def remove_outliers(values):
|
||||
if len(values) < 2:
|
||||
return values
|
||||
z_scores = stats.zscore(values)
|
||||
abs_z_scores = np.abs(z_scores)
|
||||
filtered_entries = (abs_z_scores < 3)
|
||||
return values[filtered_entries]
|
||||
|
||||
while True:
|
||||
d = tinytuya.OutletDevice(
|
||||
dev_id='bf9109f5435d9bb3c6avlr',
|
||||
address='192.168.1.14', # Or set to 'Auto' to auto-discover IP address
|
||||
local_key='/Pht&M$(/nt@t}qV',
|
||||
version=3.4)
|
||||
# Get Status
|
||||
data = d.status()
|
||||
print('set_status() result %r' % data)
|
||||
|
||||
#data = json.loads(data)
|
||||
# for key, value in data['dps'].items():
|
||||
# print(f'{key.ljust(5)}: {str(value).ljust(10)}')
|
||||
|
||||
|
||||
# Extraire les valeurs des champs spécifiques
|
||||
#total = data['dps'].get('115', None) / 10
|
||||
# Utilisation de la fonction get_value_safely pour remplacer les lignes existantes
|
||||
total_1 = get_value_safely(data, '1')
|
||||
total_2 = get_value_safely(data, '2')
|
||||
volt_1 = get_value_safely(data, '112') / 10 or 0
|
||||
freq_1 = get_value_safely(data, '111') / 100 or 0
|
||||
current_1 = get_value_safely(data, '113') or 0
|
||||
factor_1 = get_value_safely(data, '110') / 100 or 0
|
||||
prod_1 = get_value_safely(data, '107') or 0
|
||||
|
||||
watt_1 = get_value_safely(data, '101') / 10 or 0
|
||||
watt_2 = get_value_safely(data, '105') / 10 or 0
|
||||
prod_2 = get_value_safely(data, '108') or 0
|
||||
current_2 = get_value_safely(data, '114') or 0
|
||||
sens_1 = get_value_safely(data, '102')
|
||||
sens_2 = get_value_safely(data, '104')
|
||||
|
||||
value_106 = get_value_safely(data, '106') or 0
|
||||
value_109 = get_value_safely(data, '109') or 0
|
||||
|
||||
|
||||
# Afficher les valeurs
|
||||
print("=================================")
|
||||
print("1 kWh :", total_1 )
|
||||
print("2 kWh :", total_2 )
|
||||
# print("101 total :", total_1)
|
||||
print("101 Watt 1 :", watt_1)
|
||||
print("105 Watt 2 :", watt_2)
|
||||
print("102 Sens 1 :", sens_1)
|
||||
print("104 Sens 2 :", sens_2)
|
||||
|
||||
print("106 conso jour 1:", value_106)
|
||||
print("107 prod jour 1 :", prod_1)
|
||||
print("108 conso jour 2:", prod_2)
|
||||
print("109 prod jour 2:", value_109)
|
||||
print("110 factor :", factor_1)
|
||||
print("111 freq :", freq_1)
|
||||
print("112 Volt :", volt_1)
|
||||
print("113 Current 1 :", current_1)
|
||||
print("114 Current 2 :", current_2)
|
||||
#print("115 :", value_115 / 10)
|
||||
print("=================================")
|
||||
# Turn On
|
||||
#d.turn_on()
|
||||
#if (sens_1 == "FORWARD" and watt_1 > watt_2 - 100):
|
||||
# sens_1 = "NORMAL"
|
||||
if (watt_1 == 0 and watt_2 == 0):
|
||||
time.sleep(10)
|
||||
continue
|
||||
if (watt_1 == watt_1_p and watt_2 == watt_2_p):
|
||||
time.sleep(10)
|
||||
continue
|
||||
|
||||
watt_1_p = watt_1
|
||||
watt_2_p = watt_2
|
||||
if (sens_1 != previous_sens):
|
||||
previous_sens = sens_1
|
||||
time.sleep(15)
|
||||
continue
|
||||
previous_sens = sens_1
|
||||
|
||||
# id domoticz 1181
|
||||
# print('1121|0|' + str(value_105) + ";0;" + str(value_115) + ";0;" + str(value_108) + ";" + str(value_118))
|
||||
#if sens_1 == "REVERSE":
|
||||
# watt_1 = 0
|
||||
|
||||
# 1087 Solaire production
|
||||
solaire = watt_2 if watt_2 > 0 else 0
|
||||
|
||||
if watt_1 < 0 and solaire < - watt_1 + 90:
|
||||
time.sleep(15)
|
||||
continue
|
||||
|
||||
value = (watt_1 if sens_1 == "FORWARD" else - watt_1)
|
||||
|
||||
# Tuya Device 2
|
||||
url = "http://192.168.1.3:81/json.htm?type=command¶m=udevice&idx=1182&nvalue=0&svalue=" + str(total_1) + ";0;" + str(total_2) + ";0;" + str(watt_1) + ";" + str(solaire) #USAGE1;USAGE2;RETURN1;RETURN2;CONS;PROD
|
||||
if watt_1 or watt_2:
|
||||
print(url)
|
||||
try:
|
||||
response = requests.get(url)
|
||||
print(response)
|
||||
except requests.RequestException as e:
|
||||
# Gérez les autres erreurs liées aux requêtes ici
|
||||
print(f"Erreur de requête : {e}")
|
||||
time.sleep(1)
|
||||
|
||||
|
||||
|
||||
#value=moyenne
|
||||
idx = "1087"
|
||||
url = "http://192.168.1.3:81/json.htm?type=command¶m=udevice&idx=" + idx + "&svalue=" + str(solaire) + ";0&nvalue=0";
|
||||
#response = requests.get(url)
|
||||
#print(response)
|
||||
time.sleep(1)
|
||||
|
||||
|
||||
# 1123 Consommation_Apparente
|
||||
last_values.append(value)
|
||||
sum_values += value
|
||||
counter += 1
|
||||
# Vérifier si la liste des dernières valeurs dépasse éléments
|
||||
if len(last_values) > MAX_VALUES:
|
||||
# Si oui, retirer la première valeur de la liste et ajuster la somme
|
||||
sum_values -= last_values.pop(0)
|
||||
|
||||
# Calculer la moyenne des dernières valeurs
|
||||
print(f"Valeurs non filtrées : {last_values}")
|
||||
# Convertir en numpy array pour le filtrage
|
||||
#last_values_np = np.array(last_values)
|
||||
|
||||
# Enlever les valeurs aberrantes
|
||||
#last_values_np = remove_outliers(last_values_np)
|
||||
|
||||
# Convertir le résultat filtré en liste et mettre à jour last_values
|
||||
#last_values = list(last_values_np)
|
||||
|
||||
print(f"Valeurs filtrées (sans aberrantes): {last_values}")
|
||||
|
||||
moyenne = sum_values / min(counter, MAX_VALUES)
|
||||
#value=moyenne
|
||||
#watt_1=moyenne
|
||||
|
||||
# Utiliser la moyenne comme vous le souhaitez (par exemple, l'afficher)
|
||||
print("Moyenne des dernières valeurs :", moyenne)
|
||||
|
||||
|
||||
if 1 == 1: #(sens_1 == previous_sens):
|
||||
#if value < 0 and (abs(value) > watt_2):
|
||||
# value = -value
|
||||
#if value < 0 and abs(value) > solaire - 100:
|
||||
# time.sleep(3)
|
||||
# continue
|
||||
idx = "1123"
|
||||
url = "http://192.168.1.3:81/json.htm?type=command¶m=udevice&idx=" + idx + "&svalue=" + str(value) + ";0&nvalue=0";
|
||||
try:
|
||||
response = requests.get(url)
|
||||
print(response)
|
||||
except requests.RequestException as e:
|
||||
# Gérez les autres erreurs liées aux requêtes ici
|
||||
print(f"Erreur de requête : {e}")
|
||||
|
||||
time.sleep(1)
|
||||
|
||||
# 1138 Mesure Courant
|
||||
idx = "1138"
|
||||
url = "http://192.168.1.3:81/json.htm?type=command¶m=udevice&idx=" + idx + "&svalue=" + str(watt_2) + ";0&nvalue=0";
|
||||
try:
|
||||
response = requests.get(url)
|
||||
print(response)
|
||||
except requests.RequestException as e:
|
||||
# Gérez les autres erreurs liées aux requêtes ici
|
||||
print(f"Erreur de requête : {e}")
|
||||
|
||||
time.sleep(1)
|
||||
|
||||
|
||||
# 1115 CONSOMMATION_GENERALE
|
||||
idx = "1115"
|
||||
url = "http://192.168.1.3:81/json.htm?type=command¶m=udevice&idx=" + idx + "&svalue=" + str(watt_1) + ";0&nvalue=0";
|
||||
try:
|
||||
#response = requests.get(url)
|
||||
print(response)
|
||||
except requests.RequestException as e:
|
||||
# Gérez les autres erreurs liées aux requêtes ici
|
||||
print(f"Erreur de requête : {e}")
|
||||
previous_sens = sens_1
|
||||
time.sleep(5)
|
||||
|
||||
20
tuya/devices.json
Normal file
20
tuya/devices.json
Normal file
@@ -0,0 +1,20 @@
|
||||
[
|
||||
{
|
||||
"name": "Double Digital Meter",
|
||||
"id": "bf4d021ef10d39ea17gpwo",
|
||||
"key": "4.p}ZHi*hO>wVFl-",
|
||||
"mac": "c4:82:e1:d1:61:71",
|
||||
"uuid": "bdc119a10da28a03",
|
||||
"sn": "YHLD-14500023",
|
||||
"category": "cz",
|
||||
"product_name": "Double Digital Meter",
|
||||
"product_id": "79a7z01v3n35kytb",
|
||||
"biz_type": 0,
|
||||
"model": "",
|
||||
"sub": false,
|
||||
"icon": "https://images.tuyaeu.com/smart/icon/ay1504535816017oOfFp/3ccdd6937c07d34f2ee22721b4aa1247.jpg",
|
||||
"mapping": {},
|
||||
"ip": "192.168.1.53",
|
||||
"version": "3.5"
|
||||
}
|
||||
]
|
||||
9
tuya/energie.sh
Executable file
9
tuya/energie.sh
Executable file
@@ -0,0 +1,9 @@
|
||||
#!/bin/bash
|
||||
|
||||
for i in {1..10}
|
||||
do
|
||||
/usr/bin/python3 /opt/domoticz/scripts/tuya/device.py
|
||||
#/usr/bin/python3 /opt/domoticz/scripts/tuya/device2.py
|
||||
sleep 5
|
||||
done
|
||||
|
||||
67
tuya/micro.py
Normal file
67
tuya/micro.py
Normal file
@@ -0,0 +1,67 @@
|
||||
from flask import Flask, request
|
||||
import tinytuya
|
||||
|
||||
app = Flask(__name__)
|
||||
|
||||
def get_value_safely(data, key):
|
||||
try:
|
||||
# Tente d'obtenir la valeur associée à la clé, si elle existe
|
||||
value = data['dps'].get(key, None)
|
||||
|
||||
# Si la valeur est None, renvoie 0
|
||||
return value if value is not None else 0
|
||||
|
||||
except Exception as e:
|
||||
# En cas d'erreur, imprime un message d'erreur et renvoie 0
|
||||
print(f"Erreur : {e}")
|
||||
return 0
|
||||
|
||||
@app.route('/control', methods=['POST'])
|
||||
def control_device():
|
||||
action = request.json.get('action')
|
||||
device_id = 'bf9109f5435d9bb3c6avlr'
|
||||
local_key = '/Pht&M$(/nt@t}qV'
|
||||
ip_address = '192.168.1.14'
|
||||
|
||||
d = tinytuya.OutletDevice(dev_id=device_id, address=ip_address, local_key=local_key, version=3.4)
|
||||
d.set_version(3.4) # Set the version of Tuya protocol
|
||||
|
||||
# if action == 'on':
|
||||
# d.turn_on()
|
||||
# elif action == 'off':
|
||||
# d.turn_off()
|
||||
data = d.status()
|
||||
print('set_status() result %r' % data)
|
||||
|
||||
#data = json.loads(data)
|
||||
# for key, value in data['dps'].items():
|
||||
# print(f'{key.ljust(5)}: {str(value).ljust(10)}')
|
||||
|
||||
|
||||
# Extraire les valeurs des champs spécifiques
|
||||
#total = data['dps'].get('115', None) / 10
|
||||
# Utilisation de la fonction get_value_safely pour remplacer les lignes existantes
|
||||
total_1 = get_value_safely(data, '1')
|
||||
total_2 = get_value_safely(data, '2')
|
||||
volt_1 = get_value_safely(data, '112') / 10 or 0
|
||||
freq_1 = get_value_safely(data, '111') / 100 or 0
|
||||
current_1 = get_value_safely(data, '113') or 0
|
||||
factor_1 = get_value_safely(data, '110') / 100 or 0
|
||||
prod_1 = get_value_safely(data, '107') or 0
|
||||
|
||||
watt_1 = get_value_safely(data, '101') / 10 or 0
|
||||
watt_2 = get_value_safely(data, '105') / 10 or 0
|
||||
prod_2 = get_value_safely(data, '108') or 0
|
||||
current_2 = get_value_safely(data, '114') or 0
|
||||
sens_1 = get_value_safely(data, '102')
|
||||
sens_2 = get_value_safely(data, '104')
|
||||
|
||||
value_106 = get_value_safely(data, '106') or 0
|
||||
value_109 = get_value_safely(data, '109') or 0
|
||||
|
||||
|
||||
return {"conso_apparente": (watt_1 if sens_1 == "FORWARD" else - watt_1), "production": watt_2 if watt_2 > 0 else 0 }
|
||||
|
||||
if __name__ == '__main__':
|
||||
app.run(host='0.0.0.0', port=5000)
|
||||
|
||||
24
tuya/snapshot.json
Normal file
24
tuya/snapshot.json
Normal file
@@ -0,0 +1,24 @@
|
||||
{
|
||||
"timestamp": 1710608212.8361237,
|
||||
"devices": [
|
||||
{
|
||||
"id": "bf4d021ef10d39ea17gpwo",
|
||||
"name": "Double Digital Meter",
|
||||
"key": "4.p}ZHi*hO>wVFl-",
|
||||
"mac": "c4:82:e1:d1:61:71",
|
||||
"uuid": "bdc119a10da28a03",
|
||||
"sn": "YHLD-14500023",
|
||||
"category": "cz",
|
||||
"product_name": "Double Digital Meter",
|
||||
"product_id": "79a7z01v3n35kytb",
|
||||
"biz_type": 0,
|
||||
"model": "",
|
||||
"sub": false,
|
||||
"icon": "https://images.tuyaeu.com/smart/icon/ay1504535816017oOfFp/3ccdd6937c07d34f2ee22721b4aa1247.jpg",
|
||||
"mapping": {},
|
||||
"ip": "",
|
||||
"origin": "cloud",
|
||||
"ver": "3.5"
|
||||
}
|
||||
]
|
||||
}
|
||||
46
tuya/test.py
Normal file
46
tuya/test.py
Normal file
@@ -0,0 +1,46 @@
|
||||
import time
|
||||
import numpy as np
|
||||
|
||||
def get_dynamic_values():
|
||||
# Simule la récupération des valeurs dynamiques.
|
||||
# Par exemple, elle pourrait lire des valeurs depuis un capteur ou une API.
|
||||
# Pour cet exemple, nous allons générer une valeur aléatoire.
|
||||
return np.random.normal(loc=50, scale=10) # Valeur aléatoire avec une moyenne de 50 et un écart-type de 10
|
||||
|
||||
def update_values(values, new_value, threshold=3):
|
||||
if len(values) == 0:
|
||||
return [new_value]
|
||||
|
||||
old_mean = np.mean(values)
|
||||
|
||||
# Ajouter la nouvelle valeur et retirer la première valeur (si nécessaire)
|
||||
if len(values) >= 10: # par exemple, une fenêtre de 10 valeurs
|
||||
values.pop(0)
|
||||
|
||||
values.append(new_value)
|
||||
|
||||
new_mean = np.mean(values)
|
||||
|
||||
# Vérifier si la nouvelle valeur change significativement la moyenne
|
||||
if abs(new_mean - old_mean) > threshold:
|
||||
return values # Accepter la nouvelle valeur
|
||||
else:
|
||||
values.pop() # Rejeter la nouvelle valeur
|
||||
return values
|
||||
|
||||
# Tableau pour stocker les dernières valeurs
|
||||
last_values = []
|
||||
|
||||
# Boucle principale
|
||||
while True:
|
||||
new_value = get_dynamic_values()
|
||||
print(f"Nouvelle valeur récupérée: {new_value}")
|
||||
|
||||
# Mettre à jour les valeurs avec la nouvelle valeur
|
||||
last_values = update_values(last_values, new_value)
|
||||
|
||||
print(f"Valeurs mises à jour: {last_values}")
|
||||
|
||||
# Attendre 5 secondes avant de récupérer la nouvelle valeur
|
||||
time.sleep(1)
|
||||
|
||||
57
tuya/test2.py
Normal file
57
tuya/test2.py
Normal file
@@ -0,0 +1,57 @@
|
||||
import numpy as np
|
||||
|
||||
def get_dynamic_values():
|
||||
# Simule la récupération des valeurs dynamiques.
|
||||
return np.random.normal(loc=50, scale=10) # Valeur aléatoire avec une moyenne de 50 et un écart-type de 10
|
||||
|
||||
def update_values(values, new_value, rejected_values, threshold=10):
|
||||
if len(values) == 0:
|
||||
return [new_value], rejected_values
|
||||
|
||||
old_mean = np.mean(values) # Calcul de la moyenne actuelle
|
||||
print(f"Ancienne moyenne: {old_mean}")
|
||||
|
||||
if new_value in rejected_values:
|
||||
# Si la nouvelle valeur a été rejetée précédemment, l'accepter maintenant
|
||||
values.append(new_value)
|
||||
rejected_values.remove(new_value)
|
||||
print(f"Valeur {new_value} acceptée après rejet initial")
|
||||
else:
|
||||
# Ajouter la nouvelle valeur et retirer la première valeur (si nécessaire)
|
||||
if len(values) >= 10: # par exemple, une fenêtre de 10 valeurs
|
||||
values.pop(0)
|
||||
|
||||
values.append(new_value)
|
||||
|
||||
new_mean = np.mean(values) # Calcul de la nouvelle moyenne
|
||||
print(f"Nouvelle moyenne avec la nouvelle valeur: {new_mean}")
|
||||
|
||||
# Vérifier si la nouvelle valeur change significativement la moyenne
|
||||
difference = abs(new_mean - old_mean)
|
||||
print(f"Différence entre les moyennes: {difference}")
|
||||
|
||||
if difference > threshold:
|
||||
# Rejeter temporairement la nouvelle valeur
|
||||
rejected_values.add(new_value)
|
||||
values.pop() # Retirer la nouvelle valeur
|
||||
print(f"Valeur {new_value} rejetée temporairement")
|
||||
else:
|
||||
print(f"Valeur {new_value} acceptée")
|
||||
|
||||
return values, rejected_values
|
||||
|
||||
# Tableau pour stocker les dernières valeurs
|
||||
last_values = [10, 10, 10]
|
||||
rejected_values = set()
|
||||
|
||||
# Nouvelles valeurs à recevoir
|
||||
new_values = [30, 30]
|
||||
|
||||
for new_value in new_values:
|
||||
print(f"Nouvelle valeur récupérée: {new_value}")
|
||||
last_values, rejected_values = update_values(last_values, new_value, rejected_values)
|
||||
print(f"Valeurs mises à jour: {last_values}\n")
|
||||
|
||||
# Afficher le tableau final
|
||||
print(f"Tableau final des valeurs: {last_values}")
|
||||
|
||||
1
tuya/tinytuya
Submodule
1
tuya/tinytuya
Submodule
Submodule tuya/tinytuya added at 879d896e74
6
tuya/tinytuya.json
Normal file
6
tuya/tinytuya.json
Normal file
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"apiKey": "dprdvq43qxca8e4nres7",
|
||||
"apiSecret": "fb14e8b28fde462886ca19e05351773b",
|
||||
"apiRegion": "eu",
|
||||
"apiDeviceID": "scan"
|
||||
}
|
||||
6
tuya/tinytuya.old
Normal file
6
tuya/tinytuya.old
Normal file
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"apiKey": "hgkvdyrstyhqudku3xdu",
|
||||
"apiSecret": "704a1bad394a4efe805f46fb04c46916",
|
||||
"apiRegion": "eu-w",
|
||||
"apiDeviceID": "bf4d021ef10d39ea17gpwo"
|
||||
}
|
||||
39
tuya/tuya-raw.json
Normal file
39
tuya/tuya-raw.json
Normal file
@@ -0,0 +1,39 @@
|
||||
{
|
||||
"result": [
|
||||
{
|
||||
"active_time": 1707412318,
|
||||
"biz_type": 0,
|
||||
"category": "cz",
|
||||
"create_time": 1707412318,
|
||||
"icon": "smart/icon/ay1504535816017oOfFp/3ccdd6937c07d34f2ee22721b4aa1247.jpg",
|
||||
"id": "bf4d021ef10d39ea17gpwo",
|
||||
"ip": "92.139.36.216",
|
||||
"lat": "47.7300",
|
||||
"local_key": "4.p}ZHi*hO>wVFl-",
|
||||
"lon": "-2.1299",
|
||||
"model": "",
|
||||
"name": "Double Digital Meter",
|
||||
"online": true,
|
||||
"owner_id": "77373556",
|
||||
"product_id": "79a7z01v3n35kytb",
|
||||
"product_name": "Double Digital Meter",
|
||||
"status": [],
|
||||
"sub": false,
|
||||
"time_zone": "+01:00",
|
||||
"uid": "eu1672858188675Mwj0l",
|
||||
"update_time": 1707415198,
|
||||
"uuid": "bdc119a10da28a03",
|
||||
"mapping": {}
|
||||
}
|
||||
],
|
||||
"success": true,
|
||||
"t": 1707417101936,
|
||||
"tid": "4de5774cc6b011eeb4228e673063ebcd",
|
||||
"file": {
|
||||
"name": "tuya-raw.json",
|
||||
"description": "Full raw list of Tuya devices.",
|
||||
"account": "dprdvq43qxca8e4nres7",
|
||||
"date": "2024-02-08T19:31:42.313408",
|
||||
"tinytuya": "1.13.1"
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user