Page 1 sur 1
Petit script de présence en LUA
Publié : 23 avr. 2020, 11:29
par Seidel76
Bonjour à tous, voilà j'y connais pas grand chose en LUA, en fait je souhaiterais changer mon device principal "Presence" lorsque "Presence Watch" et "Presence iPhone" est à Off ( Script utilisant la géolocalisation de l'iPhone via iCloud mais qui n'est pas ultra précis ) et avec un petit script qui tourne sur mon Pi 4, qui détecte le wifi et le bluetooth de ceux ci, et qui met une variable à 1 ou 0 suivant la détection...
Voilà ce que j'ai tenté de faire, mais rien ne marche forcément !
Code : Tout sélectionner
commandArray = {}
if (otherdevices['Presence'] == "On") then
if (otherdevices['Presence Watch']=='Off') then
if (otherdevices['Presence iPhone']=='Off') then
if ( uservariables["Varriable iPhone"] == "0" ) then
if ( uservariables["Variable Watch"] == "0" ) then
print ("Presence Off")
commandArray['Presence'] = 'Off'
end
end
end
end
end
return commandArray
Je l'avais fait en Blockly aussi, mais apparemment les variables ne sont pas prises en compte...
Merci pour vos avis !
Re: Petit script de présence en LUA
Publié : 23 avr. 2020, 16:40
par denis_brasseur
Tu peux largement simplifier ton script, mais le probleme n'est pas là.
Que dise tes log dans l'état de ton script ?
Commence par afficher l'état de tes 3 devices et 2 variables afin de comprendre ce qui se passe.
par exemple.
En l'absence de devicechanged, sI ton script est en mode device, il va s’exécuter à chaque changement d'état d'un device, en mode time, il va s'éxécuter par défaut toute les minutes.
'Varriable iPhone' : variable avec 2 r, c'est bien le nom de ta variable ?
Re: Petit script de présence en LUA
Publié : 23 avr. 2020, 17:43
par Seidel76
J'avoue que mon code est très très moche et qu'il y a moyen de l'améliorer... Mais déjà ça serait cool qui fonctionne !
Sinon voici l'état des devices:
Code : Tout sélectionner
2020-04-23 17:42:04.441 Status: LUA: Presence: On
2020-04-23 17:42:04.441 Status: LUA: Presence iPhone: Off
2020-04-23 17:42:04.441 Status: LUA: Presence Watch: Off
2020-04-23 17:42:04.441 Status: LUA: Variable iPhone: 0
2020-04-23 17:42:04.441 Status: LUA: Variable Watch: 0
Mais rien ne fonctionne
PS: Oui oui pour la variable c'est normal, me suis planté à la création et j'ai pas rectifié ^^
Re: Petit script de présence en LUA
Publié : 23 avr. 2020, 18:45
par Seidel76
Je me répond à moi même, il ne fallait faire qu'un seul devicechanged.
Voici au final ce que ça donne:
Code : Tout sélectionner
commandArray = {}
if (otherdevices['Presence'] == "On") then
-- print("Presence On")
if (devicechanged['Presence iPhone']=='Off') then
-- print("Presence iPhone Off")
if (otherdevices['Presence Watch']=='Off') then
-- print("Presence Watch Off")
if ( uservariables["Varriable iPhone"] == 0 ) then
-- print("Variable iPhone à 0")
if (uservariables["Variable Watch"] == 0 ) then
-- print("Variable Watch à 0")
print ("Presence Off")
commandArray['Presence']='Off'
end
end
else
if (otherdevices['Presence Watch']=='On') then
-- print("Presence Watch Off")
if ( uservariables["Varriable iPhone"] == 0 ) then
-- print("Variable iPhone à 0")
print ("Presence Off")
commandArray['Presence']='Off'
end
end
end
end
end
motionDetected = (otherdevices['Presence iPhone'] == 'On' or uservariables["Varriable iPhone"] == 0)
if ( motionDetected and otherdevices['Presence'] == "Off") then
print ("Presence On")
commandArray['Presence']='On'
end
return commandArray
Par contre si quelqu'un veut bien me l'améliorer, je suis preneur !
Re: Petit script de présence en LUA
Publié : 24 avr. 2020, 07:42
par denis_brasseur
Ca peux donner quelque chose comme ceci, l'amélioration n'étant que visuel :
Code : Tout sélectionner
commandArray = {}
if otherdevices['Presence'] == "On" and devicechanged['Presence iPhone']=='Off' then
if uservariables["Varriable iPhone"] == 0 and ((otherdevices['Presence Watch']=='Off' and uservariables["Variable Watch"] == 0) or otherdevices['Presence Watch']=='On') then
print ("Presence Off")
commandArray['Presence']='Off'
end
end
if (otherdevices['Presence iPhone'] == 'On' or uservariables["Varriable iPhone"] == 0) and otherdevices['Presence'] == "Off" then
print ("Presence On")
commandArray['Presence']='On'
end
return commandArray
Re: Petit script de présence en LUA
Publié : 24 avr. 2020, 10:21
par boum
Allez, juste pour le fun, la curiosité et pour comparer, une version dzVents (non testée et avec les mêmes tests logiques) :
Code : Tout sélectionner
return {
on = {
devices = { 'Presence iPhone', 'Presence Watch', }
variables = { 'Varriable iPhone', 'Variable Watch', },
},
execute = function(domoticz, item)
local presenceIphone = domoticz.devices('Presence iPhone').state
local variableIphone = domoticz.variables('Varriable iPhone').value
local presence = domoticz.devices('Presence')
if presence.state == 'Off' then
if presenceIphone == 'On' or variableIphone == 0 then
print('Presence On')
presence.switchOn()
end
else -- presence.state == 'On'
if presenceIphone == 'Off' and variableIphone == 0 then
local presenceWatch = domoticz.devices('Presence Watch').state
local variableWatch = domoticz.variables('Variable Watch').value
if not (presenceWatch == 'Off' and variableWatch ~= 0) then
print('Presence Off')
presence.switchOff()
end
end
end
end
}
Re: Petit script de présence en LUA
Publié : 24 avr. 2020, 12:03
par Seidel76
Ah bah parfait ! Merci les gars je vais voir ça e me lancer dans LUA, car j'ai que des evenements en Blockly et des fois c'est pas terrible...
Re: Petit script de présence en LUA
Publié : 28 avr. 2020, 16:41
par Seidel76
Du coup je suis en train de refaire tous mes blockly en LUA, mais je galère avec une notification de batterie, je vois pas où ça bloque.
Voici mon code:
Code : Tout sélectionner
commandArray = {}
function round(num, numDecimalPlaces)
local mult = 10^(numDecimalPlaces or 0)
return math.floor(num * mult + 0.5) / mult
end
batterie_watch = tonumber(otherdevices_svalues['Batterie Watch']:match("([^;]+)"))
batterie_watch = round(batterie_watch,0)
print (batterie_watch)
if (devicechanged['Batterie Watch']) then
print ("Verification Watch")
if (batterie_watch == "100.0" and otherdevices_idx['Etat batterie Watch'] == "Charged" and uservariables["Notification Watch"] ~= 1) then
commandArray['SendNotification']='iCloud#Votre Apple Watch est entièrement rechargée !#0###pushover'
commandArray['Variable:Notification Watch'] = '1'
print("Variable Watch à 1")
elseif batterie_watch == "7.0" and uservariables["Notification Watch"] ~= 2 then
commandArray['SendNotification']='iCloud#Votre Apple Watch est à 10% de batterie !#0###pushover'
commandArray['Variable:Notification Watch'] = '2'
print("Variable Watch à 2")
elseif batterie_watch == "5.0" and uservariables["Notification Watch"] ~= 3 then
commandArray['SendNotification']='iCloud#Votre Apple Watch est à 5% de batterie !#0###pushover'
commandArray['Variable:Notification Watch'] = '3'
print("Variable Watch à 3")
elseif batterie_watch == "1.0" and uservariables["Notification Watch"] ~= 4 then
commandArray['SendNotification']='iCloud#Votre Apple Watch est à 1% de batterie !#0###pushover'
commandArray['Variable:Notification Watch'] = '4'
print("Variable Watch à 4")
end
end
return commandArray
Ça affiche bien ma batterie: 7.0 par exemple
Mais jamais "Verification Watch", à croire que ca merde au niveau de if (devicechanged['Batterie Watch']), sachant que la valeur est en pourcentage et mise à jour toutes les 2 minutes...
Re: Petit script de présence en LUA
Publié : 28 avr. 2020, 19:34
par denis_brasseur
Seidel76 a écrit : 28 avr. 2020, 16:41
Ça affiche bien ma batterie: 7.0 par exemple
Mais jamais "Verification Watch", à croire que ca merde au niveau de if (devicechanged['Batterie Watch']), sachant que la valeur est en pourcentage et mise à jour toutes les 2 minutes...
Je crois comprendre que l'affichage de 7.0 correspond à
Dans ton code, if (devicechanged['Batterie Watch']) correspond à un changement du niveau de batterie.
Tant que la valeur de batterie_watch n'est pas est égale à 7.0, pas de changement, donc pas dans la boucle.
De plus, avec un condition comme if batterie_watch == "5.0", si au changement d'état de la batterie, la valeur est de 4.9, ta condition ne sera pas respectée.
Pas sur que la condition
soit adapter à ton besoin, et mieux vaut comparer à une valeur strictement numerique
Beaucoup (trop) de strictes conditions à respecter dans ton code
Code : Tout sélectionner
elseif batterie_watch == "7.0" and uservariables["Notification Watch"] ~= 2 then
Re: Petit script de présence en LUA
Publié : 29 avr. 2020, 01:38
par Seidel76
En effet je me suis largement compliqué la tâche...
Voici mon script final:
Code : Tout sélectionner
commandArray = {}
function round(num, numDecimalPlaces)
local mult = 10^(numDecimalPlaces or 0)
return math.floor(num * mult + 0.5) / mult
end
batterie_watch = tonumber(otherdevices_svalues['Batterie Watch']:match("([^;]+)"))
batterie_watch = round(batterie_watch,0)
--print (batterie_watch)
if batterie_watch == 100 and uservariables["Notification Watch"] ~= 1 then
commandArray['SendNotification']='iCloud#Votre Apple Watch est entièrement rechargée !#0###pushover'
commandArray['Variable:Notification Watch'] = '1'
print("Variable Watch à 1")
end
if batterie_watch == 10 and uservariables["Notification Watch"] ~= 2 then
commandArray['SendNotification']='iCloud#Votre Apple Watch est à 10% de batterie !#0###pushover'
commandArray['Variable:Notification Watch'] = '2'
print("Variable Watch à 2")
end
if batterie_watch == 5 and uservariables["Notification Watch"] ~= 3 then
commandArray['SendNotification']='iCloud#Votre Apple Watch est à 5% de batterie !#0###pushover'
commandArray['Variable:Notification Watch'] = '3'
print("Variable Watch à 3")
end
if batterie_watch == 1 and uservariables["Notification Watch"] ~= 4 then
commandArray['SendNotification']='iCloud#Votre Apple Watch va bientôt s\'éteindre !#0###pushover'
commandArray['Variable:Notification Watch'] = '4'
print("Variable Watch à 4")
end
if (otherdevices['Etat batterie Watch'] == "Charging" and uservariables["Notification Watch"] ~= 0) then
commandArray['Variable:Notification Watch'] = '0'
print("Variable Watch à 0")
end
return commandArray
Merci denis_brasseur !
