Bonjour, je cherche à faire un truc simple, J'ai un capteur qui me donne une valeur numérique.
J'aimerais que si cette valeur dépasse les 50 pendant plus de 20 s, je passe en off un interrupteur.
Mais a condition que cette valeur soit toujours sup a 50 sinon je ne fais rien . je regarder en LUA ou DZevent mais je ne trouve pas comment faire .
Crée une minuterie conditionnelle
Re: Crée une minuterie conditionnelle
Ce n'est pas si complexe, mais pas forcément si simple non plus:
-Un script de type "device" va réagir sans délai, mais avec 20s de fenêtre, si le matériel qui envoie ces valeurs ne le fait pas souvent on ne pourra pas forcément réagir sur les 20s requises car il faut un matériel qui déclenche ce type de script (en pratique, un système domotique avec pas mal de choses a presque toujours un truc qui déclenche avec une périodocité << 20s et il serait possible pour la partie test exposée ci dessous en "time", de le faire en "device" sans filtrer sur le matos qui déclenche mais, au fond, rien ne l'assure!).
-Et un script "time", que ce soit seul à pooler ou en association avec un script "device" (qui va par exemple stocker le temps du déclenchement > 50 dans une variable utilisateur RAZ si on repasse en dessous ; il suffit ensuite de faire la différence, côté test, au temps actuel du script "time" si temps déclenchement stocké vu non nul), ne permet pas d'assurer les 20s car ce type de script est appelé toutes les minutes!
Je dirais que la finalité de ce type de mécanisme me pose aussi un peu question: Si c'est couper un dispositif susceptible de surchauffer au delà de 50°C pour éviter de foutre le feu, ce n'est AMHA pas raisonnable de vouloir assurer cela avec un système domotique, par exemple!
-Un script de type "device" va réagir sans délai, mais avec 20s de fenêtre, si le matériel qui envoie ces valeurs ne le fait pas souvent on ne pourra pas forcément réagir sur les 20s requises car il faut un matériel qui déclenche ce type de script (en pratique, un système domotique avec pas mal de choses a presque toujours un truc qui déclenche avec une périodocité << 20s et il serait possible pour la partie test exposée ci dessous en "time", de le faire en "device" sans filtrer sur le matos qui déclenche mais, au fond, rien ne l'assure!).
-Et un script "time", que ce soit seul à pooler ou en association avec un script "device" (qui va par exemple stocker le temps du déclenchement > 50 dans une variable utilisateur RAZ si on repasse en dessous ; il suffit ensuite de faire la différence, côté test, au temps actuel du script "time" si temps déclenchement stocké vu non nul), ne permet pas d'assurer les 20s car ce type de script est appelé toutes les minutes!
Je dirais que la finalité de ce type de mécanisme me pose aussi un peu question: Si c'est couper un dispositif susceptible de surchauffer au delà de 50°C pour éviter de foutre le feu, ce n'est AMHA pas raisonnable de vouloir assurer cela avec un système domotique, par exemple!
Re: Crée une minuterie conditionnelle
BASH un jour BASH toujours
Bonne exploitation
Code : Tout sélectionner
#!/bin/bash
# Initialisation des variables
sensor_value=0 # Valeur du capteur
threshold=50 # Seuil
time_limit=20 # Temps en secondes
start_time=0 # Temps de début où la valeur dépasse le seuil
switch_state="on" # État de l'interrupteur (on/off)
# Fonction pour simuler la lecture du capteur
read_sensor() {
# Remplacez cette ligne par le code de récupération de la valeur réelle du capteur
sensor_value=$(shuf -i 40-60 -n 1) # Exemple : génère une valeur aléatoire entre 40 et 60
}
# Fonction pour passer l'interrupteur en off
turn_off_switch() {
echo "Interrupteur désactivé (off)."
switch_state="off"
# FAIRE ICI LE CURL VERS TON DOMOTICZ
}
# Boucle principale
while true; do
read_sensor
echo "Valeur du capteur : $sensor_value"
if (( sensor_value > threshold )); then
# Si la valeur dépasse le seuil
if (( start_time == 0 )); then
start_time=$(date +%s) # Enregistrer le temps de début
else
current_time=$(date +%s)
elapsed_time=$((current_time - start_time))
if (( elapsed_time >= time_limit && switch_state == "on" )); then
turn_off_switch
fi
fi
else
# Si la valeur est en dessous du seuil
start_time=0 # Réinitialiser le temps de début
fi
# Attente avant la prochaine vérification
sleep 1
done
echo "Merci qui ? Merci GUIGUI"
exit 0
Bonne exploitation
-
eucliwood090
- Messages : 27
- Inscription : 29 juin 2019, 22:00
Re: Crée une minuterie conditionnelle
Merci pour vos réponse,
Ce script va me service pour évité une inondation ou une fuite d'eau.
J'ai un capteur sur mon circuit d'eau si j'ouvre un robinet j'ai une valeur qui va de 0 pas d'eau qui coule a 80 mais 80 correspond a un tuyaux qui a pété, 40 étant une consommation normal douche wc et robinet ouvert donc si on dépasse 50 j'ai pris large on coupe c'est qu'il y a un défaut .
merci pour le Bash ça va m'aider ^^
sinon je suis sur cette pise
J'ai pas encore faire de vrais essai sur ce script
Ce script va me service pour évité une inondation ou une fuite d'eau.
J'ai un capteur sur mon circuit d'eau si j'ouvre un robinet j'ai une valeur qui va de 0 pas d'eau qui coule a 80 mais 80 correspond a un tuyaux qui a pété, 40 étant une consommation normal douche wc et robinet ouvert donc si on dépasse 50 j'ai pris large on coupe c'est qu'il y a un défaut .
merci pour le Bash ça va m'aider ^^
sinon je suis sur cette pise
Code : Tout sélectionner
return {
on = {
devices = { 'Eau_Temp' }, -- Remplacez par le nom de votre capteur
timer = { 'every 10 seconds' } -- Vérifie la condition toutes les 10 secondes
},
data = {
above50Duration = { initial = 0 } -- Stocke la durée pendant laquelle la valeur est au-dessus de 50
},
execute = function(domoticz, device)
local capteur = domoticz.devices('Eau_Temp').rawData[1] -- Remplacez par votre capteur
local interrupteur = domoticz.devices('Inter_2 ferm_vanne_eau') -- Nom de l'interrupteur
if tonumber(capteur) > 50 then
domoticz.data.above50Duration = domoticz.data.above50Duration + 10 -- Augmente de 10s
if domoticz.data.above50Duration >= 20 then
interrupteur.switchOff() -- Éteint l'interrupteur si la durée dépasse 20s
end
else
domoticz.data.above50Duration = 0 -- Réinitialise si la valeur descend sous 50
end
end
}
Re: Crée une minuterie conditionnelle
Je pense que ton trigger device sur Eau_Temp ne sert à rien et risque même de te créer des problèmes.
Les triggers timer sont au minimum sur une minute. Pour le réaliser, j'ai dû faire un customevent exécuté chaque minute qui redéclenche le script après 10s, 20s, 30s, 40s et 50s.
Les triggers timer sont au minimum sur une minute. Pour le réaliser, j'ai dû faire un customevent exécuté chaque minute qui redéclenche le script après 10s, 20s, 30s, 40s et 50s.
Comment bien utiliser le forum : Poser une question, Mettre un script, un fichier, une image ou des logs
Mes petits guides : Débuter en programmation, Le débogage, Le choix de matériel, Les sauvegardes
Ma présentation - Mes Tutos
Mes petits guides : Débuter en programmation, Le débogage, Le choix de matériel, Les sauvegardes
Ma présentation - Mes Tutos