Domoticz et Wiser de Schneider (la croix blanche)

Décrivez votre installation de Domotique,ce que vous gérez, quels sont les points forts de votre config illustrez par des photos, partagez et faites nous envie !
MikeW
Messages : 19
Enregistré le : 25 déc. 2017, 17:38

Domoticz et Wiser de Schneider (la croix blanche)

Message par MikeW » 17 août 2018, 16:23

Bonjour,

je voudrais vous présenter mes travaux avec Wiser de Schneider Electric.

Image

Avec Domoticz en réseau j'attaque le module de gestion domotique wiser

Disable adblock

This site is supported by ads and donations.
If you see this text you are blocking our ads.
Please consider a Donation to support the site.


MikeW
Messages : 19
Enregistré le : 25 déc. 2017, 17:38

Re: Domoticz et Wiser de Schneider (la croix blanche)

Message par MikeW » 17 août 2018, 17:03

Pour mon projet il faut créer le matériel Dommy (Wiser) pour après lui ajouter des capteurs virtuels :
Voici la liste des Capteurs a créer ;) : Attention en fonction de votre installation vous devrez plus ou moins ajouter d'équipements dans mon exemple je vous présente deux ou trois pièces comme la cuisine, chambre 001, Salon ext. Ce tuto n'est pas une visite de mon chez moi c'est un exemple, à vous de l'adapter pour votre installation

Boutons :
Image
Les boutons suivant sont de type Seletor :
Mode de chauffage ; Boost chauffage ; Jours de vacances; Mode Manu RDC; Simulation; Nombre de personnes;
0 ,Off , Off ,Off ,Off ,Off ,Off
10 ,Manuel ,pour 1 heure ,1 jour ,Manu 17°C ,présence ,2 personnes
20 ,Program ,pour 2 heures ,2 jours ,Manu 19°C ,3 personnes
30 ,Vacances ,pour 3 heures ,3 jours
40 ,4 jours
50 ,5 jours
60 ,6 jours
70 ,10 jours
80 ,11 jours
90 ,15 jours

Températures:
Image

Consignes et mesures :
Image


Il faut créer aussi des variables internes pour les besoins des scripts LUA : La toutes les variables sont essentiels pour le fonctionnement
Image
Modifié en dernier par MikeW le 30 août 2018, 16:58, modifié 5 fois.

MikeW
Messages : 19
Enregistré le : 25 déc. 2017, 17:38

Re: Domoticz et Wiser de Schneider (la croix blanche)

Message par MikeW » 17 août 2018, 17:05

Bon maintenant il faut ajouter des Script LUA :

On va commencer par la détection de présences d'équipements à ma sauce :

Code : Tout sélectionner

---------------------------------------
---------- Variables publics ----------
--------------------------------------- 
-- Dans un premier temps veuillez créer ces variables utilisateurs pour les besoin système
-- Réglages/Plus d'option/Variable utilisateur = "Cycle_PresenceEquip" de type entier
-- Réglages/Plus d'option/Variable utilisateur = "MinutesAbsence001" de type entier
-- Réglages/Plus d'option/Variable utilisateur = "MinutesAbsence002" de type entier
-- Réglages/Plus d'option/Variable utilisateur = "MinutesAbsence003" de type entier et x en fonction du nombre d'équipements

---------------------------------------
------------ Configuration ------------
--------------------------------------- 

local nom_script = "PresenceEquip"                          -- Scipt LUA de type Time cycle de 1 minute
local Desc_script = "Détection de présence équipement"
local version = "1.00"
local debugging = false	                                    -- true pour voir les logs dans la console log Dz ou false pour ne pas les voir
local NbPingPaquets = 2                                     -- (-C1) le ping s'arrêter après l'envoi de nombre paquets avant que la temporisation n'expire. Plus ce paramètre est grand et plus le ping sera présis mais prendra plus de temps
local TimeOut = 2                                           -- (-w1) temporisation en secondes du ping, avant que le ping ne se termine quel que soit le nombre de paquets envoyés ou reçus. Attention le temps total de ces temps pour tous les équipements ne doit pas dépasser 10 secondes
local VarTempsCycle = "Cycle_" .. nom_script                -- Facultatif : Variable pour la mesure de temps de cycle du script

-- Dans un premier temps veuillez créer les variables Domoticz nommées "MinutesAbsence00x" de type entier, x commence de 1 jusqu'au nombre maxi d'équipement que vous souhaitez surveiller

---------------------------------------------------------------------------
---------------------------------------------------------------------------
-- Fonctions 
---------------------------------------------------------------------------
-- Fonction des log
function voir_les_logs (s, debugging)
	if (debugging) then 
		if s ~= nil then
		print ("<font color='#0280e9'>".. s .."</font>")
		else
		print ("<font color='#f3031d'>aucune valeur affichable</font>")
		end
	end
end	
--Fonction calcule la différence de temps (en secondes) entre maintenant et la date passée en paramètre.
function timedifference (s)
  year = string.sub(s, 1, 4)
  month = string.sub(s, 6, 7)
  day = string.sub(s, 9, 10)
  hour = string.sub(s, 12, 13)
  minutes = string.sub(s, 15, 16)
  seconds = string.sub(s, 18, 19)
  t1 = os.time()
  t2 = os.time{year=year, month=month, day=day, hour=hour, min=minutes, sec=seconds}
  difference = os.difftime (t1, t2)
  return difference
end
--------------------------------------------
-------------- Fin Fonctions ---------------
--------------------------------------------

--------------------------------------------
-- Liste des équipements
--------------------------------------------
Equipement = {};
--{ nom de l'équipement, ip du périphérique, Temps de détection de l'absence de l'équipement en minutes }
Equipement[1] = {nom="Présence de M", ip = "192.168.0.100", TempsDetectionAbsence = 60} -- La particularité des smartphones est que pour des économie d'énergie le wifi se connecte seulement si l'écran est allumé. Ajustez TempsDetectionAbsence pour éviter les absences à chaque extinction de l'écran
Equipement[3] = {nom="Présence TV"  , ip = "192.168.0.102",  TempsDetectionAbsence = 1}




---------------------------------------------------------------------------
commandArray = {}

commandArray['Variable:' .. VarTempsCycle]= '600'

voir_les_logs("Info Script ".. nom_script .. " : " .. Desc_script .. " (v".. version ..") by MikeW",debugging)

--Test de préseces
for i, v in pairs(Equipement) do
    local ping = false;
    local string = 'ping -c' .. NbPingPaquets .. ' -w' .. TimeOut .. ' ' .. v.ip 
    voir_les_logs ("Info Script ".. nom_script .. " : " .. string, debugging)
    ping = os.execute(string);
    if (ping) then 
        if (otherdevices[v.nom]~='On') then
            commandArray[v.nom]='On'
            voir_les_logs ("Info Script ".. nom_script .. " : "..v.nom..", présence détectée", debugging)
        end 
        commandArray['Variable:MinutesAbsence00' .. i] = '0'
    else
        if uservariables['MinutesAbsence00' .. i]<32768 then
            commandArray['Variable:MinutesAbsence00' .. i] = tostring(tonumber(uservariables['MinutesAbsence00' .. i]) + 1)
        end
        if uservariables['MinutesAbsence00' .. i]>=v.TempsDetectionAbsence then
            if (otherdevices[v.nom]~='Off') then
                commandArray[v.nom]='Off'
                voir_les_logs ("Info Script ".. nom_script .. " : "..v.nom..", absence détectée", debugging)
            end
        end 
    end
end

commandArray['Variable:' .. VarTempsCycle]=tostring(timedifference(tostring(uservariables_lastupdate[VarTempsCycle])))

return commandArray
Modifié en dernier par MikeW le 17 août 2018, 17:36, modifié 1 fois.

MikeW
Messages : 19
Enregistré le : 25 déc. 2017, 17:38

Re: Domoticz et Wiser de Schneider (la croix blanche)

Message par MikeW » 17 août 2018, 17:12

Apres nous allons ajouter les échanges avec Wiser en Http réponse en Json : Script en LUA comme toujours adaptez ces scripts en fonction de votre installation ip mdp équipements

Les commandes vers Wiser

Code : Tout sélectionner

---------------------------------------
---------- Variables publics ----------
--------------------------------------- 
-- Dans un premier temps veuillez créer ces variables utilisateurs pour les besoin système
-- Réglage/Plus d'option/Variable utilisateur = "StepWiser" de type entier
-- Réglage/Plus d'option/Variable utilisateur = "Cycle_CmdWiser" de type entier
-- Réglage/Plus d'option/Variable utilisateur = "RemoteCmdWiser" de type entier

---------------------------------------
------------ Configuration ------------
--------------------------------------- 

local nom_script = "CmdWiser"                           -- Scipt LUA de type Device
local Desc_script = "Ecriture des commandes Wiser"
local version = "2.60"
local debugging = false				                    -- true pour voir les logs dans la console log Dz ou false pour ne pas les voir
local IpAddr = "192.168.0.2"		                    -- adresse du Wiser
local LogAdmin = "admin"	                        	-- Login Wiser
local Mdp = "admin"		                                -- mot de passe Wiser
local TempsSansActivite = 15                            -- Temps sans activité des équipements
local JoursDeVacances = 2                               -- Jours de vacances pour le passage du mode vacances
local RemoteCmd = uservariables["RemoteCmdWiser"]       -- Commande Wiser provenant d'un autre script ajoutez -> commandArray['Variable:RemoteCmdWiser']=tostring(otherdevices_idx['Votre actionneur']), pour relancer la commande de votre actionneur dans vos scripts
local VarTempsCycle = "Cycle_" .. nom_script            -- Facultatif : Variable pour la mesure de temps de cycle du script



-- Rebonds d'écritures après lecture des données
-- Si vous constatez ce type d'effets dans les logs ajustez le paramètre "TempoApresLecWiser" qui bloque ce problème
--17:41:00.457 dzVents: Info Script MajCapteursWiser : Lecture des données de températures Wiser, dernière lecture il y à 358 sec
--17:41:31.510 dzVents: Info Script CmdWiser : Start requete = /usr/bin/curl -H "Content-Type: application/json" -X POST -d '{"targetTemp":[{"locationId":"Cuisine","targetValue":19.00}]}' http://admin:admin@192.168.0.2/rpc/hvac/set_loc_temp
--17:41:31.735 (Wiser) Thermostat (Csg de la cuisine)
local TempoApresLecWiser = 100                           -- Temps en secondes après la lecture des données Wiser : Ajustez ce temps pour éviter les rebonds de commandes apres la lecture Wiser



-- Liste des requêtes disponibles Wiser                 -- /rpc/mode/set_home_mode                  | Wiser <- Ecriture du mode de chauffe
                                                        -- /rpc/hvac/set_loc_temp                   | Wiser <- Ecriture d'une consigne de température
                                                        -- /rpc/loadmanagement/set_appliance_state  | Wiser <- Commande d'un équipement de type Interupteur
                                                        


-- Sur un navigateur internet lancer "http://192.168.0.2/rpc/loadmanagement/get_appliances" (avec l'IP du votre Wiser) pour trouver les applianceId de vos équipements
-- Favorisez FireFoxe qui traduit directement le Json
-- Attention quand vous ajoutez des nouveaux équipements, il est possible que votre Wiser reclasse vos équipements, l'ordre de vos équipements peut bouger. Contrôler l'ordre après votre ajout.

--------------------------------------------
---------------- Fonctions -----------------
-------------------------------------------- 
-- Fonction des log
function voir_les_logs (s, debugging)
	if (debugging) then 
		if s ~= nil then
		print ("<font color='#01CC43'>".. s .."</font>")
		else
		print ("<font color='#f3031d'>aucune valeur affichable</font>")
		end
	end
end	

-- Fonction commande d'équipement Wiser
function CmdCapteur(ID_Equip, IdxEquip, Type, Valeur001, Valeur002, FonctionReqWiser)
    if (uservariables["StepWiser"]==0) then
        if (Type == "PrisePilotée") then
            local Cmd = "true"
           
            if (Valeur001~="nil") or (RemoteCmd==IdxEquip) then
        
                if Valeur001 == "On" then
                    Cmd = "true"
                else
                    Cmd = "false"
                end
                
                Req = '/usr/bin/curl -H "Content-Type: application/json" -X POST -d \'{"applianceState":[{"applianceId":"' .. ID_Equip .. '","state":' .. Cmd .. '}]}\'  http://' .. LogAdmin .. ':' .. Mdp .. '@' .. IpAddr .. FonctionReqWiser
                local config=assert(io.popen(Req))--Commande Json dans la requête HTTP : {"applianceState":[{"applianceId":"' .. ID_Equip .. '","state":' .. Cmd .. '}]}
                voir_les_logs("Info Script ".. nom_script .. " : Start requete = " .. Req ,true)
            
            end
        end
        
        if (Type == "ModeChauffe") then
            local Cmd = '{"homeMode":"schedule","antiFreeze":false}'--Commande Json
           
            if (Valeur001~="nil") or (RemoteCmd==IdxEquip) then
        
                if (Valeur001 == "Off") then
                    Cmd = '{"homeMode":"energysaver","antiFreeze":false}'--Commande Json
                end
                if (Valeur001 == "Manuel") then
                    Cmd = '{"homeMode":"manual","antiFreeze":false}'--Commande Json
                end
                if (Valeur001 == "Vacances") then
                    Cmd = '{"homeMode":"holiday","antiFreeze":true,"endTime":' .. os.time()+ tonumber(Valeur002) * 24 * 60 * 60 ..'}'--Commande Json
                end
                if (Cmd == '{"homeMode":"schedule","antiFreeze":false}') then
                    commandArray['Jours de vacances']="Off"
                    commandArray['Simulation']='Set Level: 0'
                end  
                
                Req = '/usr/bin/curl -H "Content-Type: application/json" -X POST -d \'' .. Cmd .. '\'  http://' .. LogAdmin .. ':' .. Mdp .. '@' .. IpAddr .. FonctionReqWiser
                local config=assert(io.popen(Req))
                voir_les_logs("Info Script ".. nom_script .. " : Start requete = " .. Req ,true)
            
            end
        end    
    
        if (Type == "ConsigneTemp") then

            if (Valeur001~="nil") or (RemoteCmd==IdxEquip) then
        
                local Cmd = '{"targetTemp":[{"locationId":"'.. ID_Equip .. '","targetValue":' .. Valeur002 .. '}]}'--Commande Json
                
                Req = '/usr/bin/curl -H "Content-Type: application/json" -X POST -d \'' .. Cmd .. '\'  http://' .. LogAdmin .. ':' .. Mdp .. '@' .. IpAddr .. FonctionReqWiser
                local config=assert(io.popen(Req))
                voir_les_logs("Info Script ".. nom_script .. " : Start requete = " .. Req ,true)
            
            end
        end 
        if (RemoteCmd==IdxEquip) then    
            commandArray['Variable:RemoteCmdWiser']='0'
        end
    
    end

end 
--Fonction calcule la différence de temps (en secondes) entre maintenant et la date passée en paramètre.
function timedifference (s)
  year = string.sub(s, 1, 4)
  month = string.sub(s, 6, 7)
  day = string.sub(s, 9, 10)
  hour = string.sub(s, 12, 13)
  minutes = string.sub(s, 15, 16)
  seconds = string.sub(s, 18, 19)
  t1 = os.time()
  t2 = os.time{year=year, month=month, day=day, hour=hour, min=minutes, sec=seconds}
  difference = os.difftime (t1, t2)
  return difference
end
--------------------------------------------
-------------- Fin Fonctions ---------------
--------------------------------------------

--------------------------------------------

commandArray = {}

commandArray['Variable:' .. VarTempsCycle]= '600'


voir_les_logs("Info Script ".. nom_script .. " : " .. Desc_script .. " (v".. version ..") by MikeW",debugging)


if (uservariables["StepWiser"]==0) and (timedifference(otherdevices_lastupdate["Mode de chauffage"]) > TempsSansActivite * 60) then
    
    -- Pour ajouter votre consigne wiser ajouter une ligne comme celles suvantent avec les nom de votre installation
    -- ajoutez aussi une ligne avec votre configuration juste après "if (uservariables["StepWiser"]==1 and"
    -- CmdCapteur("Nom de l'équipement dans Wiser", "ConsigneTemp", tostring(devicechanged["Nom de votre capteur virtuel dans Domoticz"]), "/rpc/hvac/set_loc_temp")
    if tonumber(otherdevices_svalues["Batteries du Rad salle à manger"]:match("([^;]+)"))>0 then
        CmdCapteur("Salle à manger", otherdevices_idx["Csg de la salle a manger"], "ConsigneTemp", tostring(devicechanged["Csg de la salle a manger"]), tostring(tonumber(string.format("%.2f",tostring(otherdevices_svalues["Csg de la salle a manger"])))), "/rpc/hvac/set_loc_temp")
    end
    if tonumber(otherdevices_svalues["Batteries du Rad du salon"]:match("([^;]+)"))>0 then
        CmdCapteur("Salon", otherdevices_idx["Csg du salon"], "ConsigneTemp", tostring(devicechanged["Csg du salon"]), tostring(tonumber(string.format("%.2f",tostring(otherdevices_svalues["Csg du salon"])))), "/rpc/hvac/set_loc_temp")
    end
    if tonumber(otherdevices_svalues["Batteries du Rad du salon"]:match("([^;]+)"))>0 then
        CmdCapteur("Buanderie", otherdevices_idx["Csg de la Buanderie"], "ConsigneTemp", tostring(devicechanged["Csg de la Buanderie"]), tostring(tonumber(string.format("%.2f",tostring(otherdevices_svalues["Csg de la Buanderie"])))), "/rpc/hvac/set_loc_temp")
    end
 

    -- CmdCapteur("Nom de l'équipement dans Wiser", "ConsigneTemp", tostring(devicechanged["Nom de votre capteur virtuel dans Domoticz"]), "/rpc/mode/set_home_mode")
    CmdCapteur("", otherdevices_idx["Mode de chauffage"], "ModeChauffe", tostring(devicechanged["Mode de chauffage"]),tonumber(JoursDeVacances), "/rpc/mode/set_home_mode")
    
    -- Sur un navigateur internet lancer "http://192.168.0.2/rpc/loadmanagement/get_appliances" (avec l'IP du votre Wiser) pour trouver les applianceId de vos équipements
    -- CmdCapteur("applianceId", "PrisePilotée", tostring(devicechanged["Nom de votre capteur virtuel dans Domoticz"]), "/rpc/loadmanagement/set_appliance_state")
    CmdCapteur("124b00042a2401-11", otherdevices_idx["Interrupteur Divers 1"], "PrisePilotée", tostring(devicechanged["Interrupteur Divers 1"]),0, "/rpc/loadmanagement/set_appliance_state")
    CmdCapteur("124b00011fbf67-11", otherdevices_idx["Interrupteur Divers 2"], "PrisePilotée", tostring(devicechanged["Interrupteur Divers 2"]),0, "/rpc/loadmanagement/set_appliance_state")
    

end
-- Test lecture en cours pour éviter larsen informatique
-- Ajoutez votre équipement à cette liste
if (uservariables["StepWiser"]==1 and
    

    (timedifference(otherdevices_lastupdate["Csg du salon"]) > TempoApresLecWiser) and
    (timedifference(otherdevices_lastupdate["Csg de la Buanderie"]) > TempoApresLecWiser) and
    (timedifference(otherdevices_lastupdate["Interrupteur Divers 1"]) > TempoApresLecWiser) and
    (timedifference(otherdevices_lastupdate["Interrupteur Divers 2"]) > TempoApresLecWiser) and
    (timedifference(otherdevices_lastupdate["Mode de chauffage"]) > TempoApresLecWiser)

    ) then
    commandArray['Variable:StepWiser']='0'
end

-- Initialisation des commandes Wiser en cas de blockage des commandes Manu, ajoutez -> commandArray['Variable:RemoteCmdWiser']="-1", dans votre script pour initialiser les commandes Wiser
if (RemoteCmd==-1) and 
    (otherdevices["Interrupteur Divers 1"]=="Off") and -- On controle les interrupteurs car Wiser initilise les inters pendant son initialisation, si un inter est à on wiser va le mettre à off
    (otherdevices["Interrupteur Divers 2"]=="Off") then
        
        commandArray['Variable:RemoteCmdWiser']=tostring(otherdevices_idx['Mode de chauffage'])
end 

-- Selection du nombre de jours de vacances par un capteur virtuel Inter Sellecteur Off; 1 Jour; 2 Jours ext ...
if tostring(devicechanged['Jours de vacances'])~="Off" and tostring(devicechanged['Jours de vacances'])~="nil" then
    JoursDeVacances = tostring(string.format("%.0f",string.gsub(otherdevices['Jours de vacances'], "%D", "")))
    CmdCapteur("", otherdevices_idx["Mode de chauffage"], "ModeChauffe", "Vacances",tonumber(JoursDeVacances), "/rpc/mode/set_home_mode")
end
if (tostring(devicechanged['Jours de vacances'])=="Off") and tostring(otherdevices['Mode de chauffage'])~="Program"then
    CmdCapteur("", otherdevices_idx["Mode de chauffage"], "ModeChauffe", "Program",0, "/rpc/mode/set_home_mode")
end


commandArray['Variable:' .. VarTempsCycle]=tostring(timedifference(tostring(uservariables_lastupdate[VarTempsCycle])))
return commandArray
Les lectures depuis Wiser

Code : Tout sélectionner

-- Attention sur cette version nous utilisons l'état des Batteries pour savoir si nous pouvons intéroger certains capteurs avec Batteries (vannes thermostatiques). L'état des batteries est mis à jour par Wiser une à deux fois par jour

---------------------------------------
---------- Variables publics ----------
--------------------------------------- 
-- Dans un premier temps veuillez créer ces variables utilisateurs pour les besoin système
-- Réglage/Plus d'option/Variable utilisateur = "StepWiser" de type entier
-- Réglage/Plus d'option/Variable utilisateur = "Cycle_CmdAuto" de type entier
-- Réglage/Plus d'option/Variable utilisateur = "CycleTime001" de type Chaîne

---------------------------------------
------------ Configuration ------------
--------------------------------------- 

local nom_script = "MajCapteursWiser"                   -- Scipt LUA de type Time cycle de 1 minute
local Desc_script = "Récupération des données Wiser"
local version = "3.01"
local debugging = false				                    -- true pour voir les logs dans la console log Dz ou false pour ne pas les voir
local MajCycle = false                                  -- true pour une mise à jour des capteurs à chaque tour de cycle ou false pour une mise à jour sur exception
local IpAddr = "192.168.0.2"		                    -- Adresse IP du Wiser
local LogAdmin = "admin"	                        	-- Login installateur Wiser
local Mdp = "admin"		                                -- Mot de passe installateur Wiser
local system = "Synology"				                -- Systeme d'exploitation sur lequel est éxécuté ce script : linux, windows, synology pour le  chemin vers JSON.LUA	
local BpModeEco = "Mode de chauffage"                   -- Nom de votre capteur virtuel mode de chauffe wiser, Indiquez ici le nom du capteur virtuel Mode de chauffe
local IndexJson = 1                                     -- Index de réponse des requetes HTTP en Json
local TempsMajCapteur = 5                               -- Temps de mise à jour des mesures en minutes : exemple les mesures de températures wiser sont maj par le Wiser tout les 5 minutes
local VarTempsCycle = "Cycle_" .. nom_script            -- Facultatif : Variable pour la mesure de temps de cycle du script


-- Liste des requêtes disponibles Wiser                 -- /rpc/hvac/get_all_loc_temp               | Wiser -> Liste des équipements de température
                                                        -- /rpc/homedevice/device_list              | Wiser -> Lecture des de tout les équipements
                                                        -- /rpc/loadmanagement/get_appliances       | Wiser -> Liste des équipements Interupteur
                                                        -- /rpc/mode/get_home_mode                  | Wiser -> Lecture du mode de chauffe en cours
                                                        

-- Sur un navigateur internet lancez -> "http://192.168.0.2/rpc/hvac/get_all_loc_temp" (avec l'IP du votre Wiser) pour trouver les IndexJson températures de vos pièces
-- retour en Json
-- Exemple : {"hcMode":"manual","locationTempDetails":[
                                            --{"locationId":"Cuisine",
                                            --"locationName":"Cuisine",
                                            --"unit":"C",
-- Votre pièce dite Cuisine est donc le premier IndexBlock = 1 et ainsi suite 
-- idème pour la Fonction "http://192.168.0.2/rpc/homedevice/device_list" qui vous donne votre liste d'équipements installés
-- ou bien "http://192.168.0.2/rpc/loadmanagement/get_appliances" qui vous donne votre liste des Interrupteurs
-- Attention quand vous ajoutez des nouveaux équipements, il est possible que votre Wiser reclasse vos équipements, l'ordre de vos équipements peut bouger. Contrôler l'ordre après votre ajout.

--------------------------------------------
if system == "Windows" then
	json = (loadfile "c:\\Domoticz\\scripts\\lua\\json.lua")()                  -- Pour Windows
elseif system == "Synology" then
	json = (loadfile "/volume1/@appstore/domoticz/var/scripts/lua/JSON.lua")()  -- Pour Synology
else
	json = (loadfile "/home/pi/domoticz/scripts/lua/JSON.lua")()                -- Pour Linux
end
--------------------------------------------
---------------- Fonctions -----------------
-------------------------------------------- 
-- Fonction des log
function voir_les_logs (s, debugging)
	if (debugging) then 
		if s ~= nil then
		print ("<font color='#01CC43'>".. s .."</font>")
		else
		print ("<font color='#f3031d'>aucune valeur affichable</font>")
		end
	end
end	
-- Fonction de mise à jour des données Wiser
function MajCapteur(IndexBlock, Capteur001, Capteur002, Type, Name, Valeur001, UnitCapteur001, Valeur002, UnitCapteur002)
    if (Type == "PrisePilotée") then
        ModeInter = "Off"
        if (Valeur001 == "true") then
        	ModeInter="On"
        end
        voir_les_logs("Info Script ".. nom_script .. " : Lecture BlocJson Wiser " .. Type .. " : Num " .. IndexBlock .. ", " .. Name .. "| " .. Type .. " = " .. ModeInter ,debugging)

        if (otherdevices[Capteur001]~=ModeInter) then
            voir_les_logs("Info Script ".. nom_script .. " : Ecriture " .. Capteur001 .." = " .. tostring(ModeInter),debugging)
            commandArray[Capteur001]=ModeInter
            commandArray['Variable:StepWiser']='1' 
        end
    else
        if (UnitCapteur002 ~= "") then
            if (Capteur001~="") then
                voir_les_logs("Info Script ".. nom_script .. " : Lecture BlocJson Wiser : Num " .. IndexBlock .. ", " .. Name .. "| " .. Type .. " = " .. Valeur001 .. UnitCapteur001 .. " / " .. Valeur002 .. UnitCapteur002 ,debugging)
                update(Type, Capteur001,Valeur001,Valeur002,UnitCapteur001,UnitCapteur002)
            end
            if (Capteur002~="") then
                update(Type .. "2", Capteur002,Valeur001,Valeur002,UnitCapteur001,UnitCapteur002)
            end
        else
            if (Capteur001~="") then
                voir_les_logs("Info Script ".. nom_script .. " : Lecture BlocJson Wiser : Num " .. IndexBlock .. ", " .. Name .. "| " .. Type .. " = " .. Valeur001 .. " " .. UnitCapteur001 ,debugging)
                update(Type, Capteur001,Valeur001,0,UnitCapteur001,UnitCapteur002)
            end
            if (Capteur002~="") then
                update(Type .. "2", Capteur002,Valeur001,0,UnitCapteur001,UnitCapteur002)
            end
        end
    end

end
-- Fonctions tabeau de commandes de domoticz pour Wiser
function update(Type, dev, value1, value2, Unit1 , Unit2)
    
    local Val1, Val2 = otherdevices_svalues[dev]:match("([^;]+);([^;]+)")
    if tostring(Val1)=="nil" then
        Val1=tonumber(otherdevices_svalues[dev])
    end

    if (Unit2 =="") then
            
        if ( ( tonumber(tostring(string.format("%.1f",tostring(Val1)))) ~= tonumber(tostring(string.format("%.1f",tostring(value1)))) )
             or MajCycle) then

            commandArray['Variable:StepWiser']='1'
            voir_les_logs("Info Script ".. nom_script .. " : Ecriture sur le block " .. Type .. "  " .. string.format("%.1f",tostring(Val1)) .. Unit1 .. " : " .. dev .. " = Val1 <- ".. tostring(string.format("%.1f",tostring(value1))) .. Unit1 .. " BolckJson N" .. tostring(IndexJson) ,debugging)
            local cmd = tostring(otherdevices_idx[dev] .. '|0|'.. tostring(string.format("%.1f",tostring(value1))) ..';'.. tostring(string.format("%.1f",tostring(value2))) ..';'.. '1')
            table.insert (commandArray, { ['UpdateDevice'] = cmd } )
                
        end     
            
    else
            
        if ( ( tonumber(tostring(string.format("%.1f",tostring(Val1)))) ~= tonumber(tostring(string.format("%.1f",tostring(value1)))) ) or 
             ( tonumber(tostring(string.format("%.1f",tostring(Val2)))) ~= tonumber(tostring(string.format("%.1f",tostring(value2)))) )
             or MajCycle) then
    
            commandArray['Variable:StepWiser']='1'
            voir_les_logs("Info Script ".. nom_script .. " : Ecriture sur le block " .. Type .. "  " .. string.format("%.1f",tostring(Val1)) .. Unit1 .. " ; " .. string.format("%.1f",tostring(Val2)) .. Unit2 .. " : " .. dev .. " = Val1 <- ".. tostring(string.format("%.1f",tostring(value1))) .. Unit1 .. " = Val2 <- ".. tostring(string.format("%.1f",tostring(value2))) .. Unit2 .. " BolckJson N" .. tostring(IndexJson) ,debugging)
            local cmd = tostring(otherdevices_idx[dev] .. '|0|'.. tostring(string.format("%.1f",tostring(value1))) ..';'.. tostring(string.format("%.1f",tostring(value2))) ..';'.. '1')
            table.insert (commandArray, { ['UpdateDevice'] = cmd } )
                
        end   
            
    end
end
-- Fonction construction de la requête HTTP
function RequeteHTTP(FonctionReqWiser)
  local Req = '/usr/bin/curl http://' .. LogAdmin .. ':' .. Mdp .. '@' .. IpAddr .. FonctionReqWiser
  voir_les_logs("Info Script ".. nom_script .. " : Start requete = " .. Req,debugging)
  return Req 
end
--Fonction calcule la différence de temps (en secondes) entre maintenant et la date passée en paramètre.
function timedifference (s)
  year = string.sub(s, 1, 4)
  month = string.sub(s, 6, 7)
  day = string.sub(s, 9, 10)
  hour = string.sub(s, 12, 13)
  minutes = string.sub(s, 15, 16)
  seconds = string.sub(s, 18, 19)
  t1 = os.time()
  t2 = os.time{year=year, month=month, day=day, hour=hour, min=minutes, sec=seconds}
  difference = os.difftime (t1, t2)
  return difference
end

--------------------------------------------
-------------- Fin Fonctions ---------------
--------------------------------------------

--------------------------------------------

voir_les_logs("Info Script ".. nom_script .. " : " .. Desc_script .. " (v".. version ..") by MikeW",debugging)

commandArray = {}

commandArray['Variable:' .. VarTempsCycle]= '600'

-- Test de mise à jour sous conditions
if  (timedifference(tostring(uservariables_lastupdate['CycleTime001'])) > TempsMajCapteur *60) or MajCycle then
    
    voir_les_logs("Info Script ".. nom_script .. " : Lecture des données de températures Wiser, derniére lecture il y à " .. timedifference(tostring(uservariables_lastupdate['CycleTime001'])) .. " Sec" ,debugging)
    
    ----------------------Niveaux de Batteries---------------------------------

    local config=assert(io.popen(RequeteHTTP("/rpc/homedevice/device_list")))
    local blocjson = config:read('*all')
    config:close()
    local jsonValeur = json:decode(blocjson) 

    
    -- Pour ajouter votre consigne "vanne thermostatiques" wiser ajouter une ligne comme celles suvantes avec les noms de votre installation
    -- MajCapteur(IndexJson, "Nom de votre 1er capteur virtuel", "Nom de votre 2eme capteur virtuel", "Batteries", tostring(jsonValeur.device[IndexJson].name),tostring(((tonumber(jsonValeur.device[IndexJson].batteryLevel) +1)*100)/7),"%", 0,"")
    IndexJson = 2
    MajCapteur(IndexJson, "Batteries du Rad de la cuisine", "", "Batteries", tostring(jsonValeur.device[IndexJson].name),tostring(((tonumber(jsonValeur.device[IndexJson].batteryLevel) +1)*100)/7),"%", 0,"")
     IndexJson = IndexJson + 1
    MajCapteur(IndexJson, "Batteries du Rad 001", "", "Batteries", tostring(jsonValeur.device[IndexJson].name),tostring(((tonumber(jsonValeur.device[IndexJson].batteryLevel) +1)*100)/7),"%", 0,"")
    IndexJson = IndexJson + 1
    MajCapteur(IndexJson, "Batteries du Rad 002", "", "Batteries", tostring(jsonValeur.device[IndexJson].name),tostring(((tonumber(jsonValeur.device[IndexJson].batteryLevel) +1)*100)/7),"%", 0,"")
    IndexJson = IndexJson + 1
    MajCapteur(IndexJson, "Batteries du Rad 003", "", "Batteries", tostring(jsonValeur.device[IndexJson].name),tostring(((tonumber(jsonValeur.device[IndexJson].batteryLevel) +1)*100)/7),"%", 0,"")
    IndexJson = IndexJson + 1
    MajCapteur(IndexJson, "Batteries du Rad du salon", "", "Batteries", tostring(jsonValeur.device[IndexJson].name),tostring(((tonumber(jsonValeur.device[IndexJson].batteryLevel) +1)*100)/7),"%", 0,"")
    IndexJson = IndexJson + 1
    MajCapteur(IndexJson, "Batteries du Rad de la buanderie", "", "Batteries", tostring(jsonValeur.device[IndexJson].name),tostring(((tonumber(jsonValeur.device[IndexJson].batteryLevel) +1)*100)/7),"%", 0,"")
    IndexJson = IndexJson + 1
    MajCapteur(IndexJson, "Batteries du Bouton mode eco", "", "Batteries", tostring(jsonValeur.device[IndexJson].name),tostring(((tonumber(jsonValeur.device[IndexJson].batteryLevel) +1)*100)/7),"%", 0,"")


-------------------------------Mesures Wiser------------------------------------

    local config=assert(io.popen(RequeteHTTP("/rpc/hvac/get_all_loc_temp")))
    local blocjson = config:read('*all')
    config:close()
    local jsonValeur = json:decode(blocjson) 



    -- Pour ajouter votre mesure sur "vanne thermostatiques" wiser ajouter une ligne comme celles suvantes avec les noms de votre installation
    --  MajCapteur(IndexJson, "Nom de votre 1er capteur virtuel", "Nom de votre 2eme capteur virtuel", "Mesure et Vanne", tostring(jsonValeur.locationTempDetails[IndexJson].locationName),jsonValeur.locationTempDetails[IndexJson].currentValue,"°C", jsonValeur.locationTempDetails[IndexJson].valve[1].valvePosition,"%")
    IndexJson = 1
    if tonumber(otherdevices_svalues["Batteries du Rad du salon"]:match("([^;]+)"))>0 then
        MajCapteur(IndexJson, "T du salon / Vanne", "", "Mesure et Vanne", tostring(jsonValeur.locationTempDetails[IndexJson].locationName),jsonValeur.locationTempDetails[IndexJson].currentValue,"°C", jsonValeur.locationTempDetails[IndexJson].valve[1].valvePosition,"%")
    end
    IndexJson = IndexJson + 1
    if tonumber(otherdevices_svalues["Batteries du Rad de la buanderie"]:match("([^;]+)"))>0 then
        MajCapteur(IndexJson, "T de la Buanderie / Vanne", "", "Mesure et Vanne", tostring(jsonValeur.locationTempDetails[IndexJson].locationName),jsonValeur.locationTempDetails[IndexJson].currentValue,"°C", jsonValeur.locationTempDetails[IndexJson].valve[1].valvePosition,"%")
    end
    IndexJson = IndexJson + 1
    if tonumber(otherdevices_svalues["Batteries du Rad de l entrée"]:match("([^;]+)"))>0 then
        MajCapteur(IndexJson, "T de l entree / Vanne", "", "Mesure et Vanne", tostring(jsonValeur.locationTempDetails[IndexJson].locationName),jsonValeur.locationTempDetails[IndexJson].currentValue,"°C", jsonValeur.locationTempDetails[IndexJson].valve[1].valvePosition,"%")
    end
    IndexJson = IndexJson + 1
    if tonumber(otherdevices_svalues["Batteries du Rad de la cuisine"]:match("([^;]+)"))>0 then
        MajCapteur(IndexJson, "T de la cuisine / Vanne", "", "Mesure et Vanne", tostring(jsonValeur.locationTempDetails[IndexJson].locationName),jsonValeur.locationTempDetails[IndexJson].currentValue,"°C", jsonValeur.locationTempDetails[IndexJson].valve[1].valvePosition,"%")
    end


-----------------------------Consignes Wiser------------------------------------

    -- Pour ajouter votre consigne wiser ajouter une ligne comme celles suvantes avec les noms de votre installation
    -- MajCapteur(IndexJson, "Nom de votre 1er capteur virtuel", "Nom de votre 2eme capteur virtuel", "Consigne", tostring(jsonValeur.locationTempDetails[IndexJson].locationName),jsonValeur.locationTempDetails[IndexJson].targetValue,"°C", 0,"")
    IndexJson = 1
    MajCapteur(IndexJson, "CT du salon", "Csg du salon", "Consigne", tostring(jsonValeur.locationTempDetails[IndexJson].locationName),jsonValeur.locationTempDetails[IndexJson].targetValue,"°C", 0,"")
    IndexJson = IndexJson + 1
    MajCapteur(IndexJson, "CT de la Buanderie", "Csg de la Buanderie", "Consigne", tostring(jsonValeur.locationTempDetails[IndexJson].locationName),jsonValeur.locationTempDetails[IndexJson].targetValue,"°C", 0,"")
    IndexJson = IndexJson + 1
    MajCapteur(IndexJson, "CT de la cuisine", "Csg de la cuisine", "Consigne", tostring(jsonValeur.locationTempDetails[IndexJson].locationName),jsonValeur.locationTempDetails[IndexJson].targetValue,"°C", 0,"")


    --------------------------------------------------------------------------------
    -- Fin de mise à jour sous conditions
    
    commandArray['Variable:CycleTime001'] = tostring(os.date('%Y-%m-%d %H:%M:%S'))

end


-- Mise à jour toutes les minutes

----------------------Etats interrupteurs Wiser---------------------------------

local config=assert(io.popen(RequeteHTTP("/rpc/loadmanagement/get_appliances")))
local blocjson = config:read('*all')
config:close()
local jsonValeur = json:decode(blocjson) 
    
    -- Pour ajouter l'état de votre "interrupteur" wiser ajouter une ligne comme celles suvantes avec les noms de votre installation
    -- MajCapteur(IndexJson, "Nom de votre 1er capteur virtuel", "Nom de votre 2eme capteur virtuel", "PrisePilotée", tostring(jsonValeur.applianceDetails[IndexJson].locationName),tostring(jsonValeur.applianceDetails[IndexJson].state),"", 0,"")
    IndexJson = 1
    MajCapteur(IndexJson, "Interrupteur Divers 1", "", "PrisePilotée", tostring(jsonValeur.applianceDetails[IndexJson].locationName),tostring(jsonValeur.applianceDetails[IndexJson].state),"", 0,"")
    IndexJson = IndexJson + 1
    MajCapteur(IndexJson, "Interrupteur Divers 2", "", "PrisePilotée", tostring(jsonValeur.applianceDetails[IndexJson].locationName),tostring(jsonValeur.applianceDetails[IndexJson].state),"", 0,"")
    
    IndexJson = 1
    MajCapteur(IndexJson, "P Interrupteur Divers 1", "", "PuissancePrise", tostring(jsonValeur.applianceDetails[IndexJson].locationName),tostring(jsonValeur.applianceDetails[IndexJson].powerConsump),"W", 0,"")
    IndexJson = IndexJson + 1
    MajCapteur(IndexJson, "P Interrupteur Divers 2", "", "PuissancePrise", tostring(jsonValeur.applianceDetails[IndexJson].locationName),tostring(jsonValeur.applianceDetails[IndexJson].powerConsump),"W", 0,"")
    

----------------------Mode de chauffege Wiser-----------------------------------

local config=assert(io.popen(RequeteHTTP("/rpc/mode/get_home_mode")))
local blocjson = config:read('*all')
config:close()
local jsonValeur = json:decode(blocjson) 

    voir_les_logs("Info Script ".. nom_script .. " : Lecture du mode de chauffe Wiser : Mode = ".. jsonValeur.homeMode ,debugging)
    
    RHomeMode = 'Set Level: 0'
    CHomeMode = "Off"
    if (tostring(jsonValeur.homeMode) == "schedule") then
    	RHomeMode='Set Level: 20'
    	CHomeMode = "Program"
    end
    if (tostring(jsonValeur.homeMode) == "holiday") then
    	RHomeMode='Set Level: 30'
    	CHomeMode = "Vacances"
    end
    if (tostring(jsonValeur.homeMode) == "manual") then
    	RHomeMode='Set Level: 10'
    	CHomeMode = "Manuel"
    	
    end
    if (otherdevices[BpModeEco]~=CHomeMode) then
        commandArray['Variable:StepWiser']='1' 
        voir_les_logs("Info Script ".. nom_script .. " : Ecriture du mode = " .. RHomeMode,debugging)
        commandArray[BpModeEco]=RHomeMode
        if CHomeMode ~= "Vacances" then
            commandArray['Jours de vacances']="Off"
            commandArray['Simulation']='Set Level: 0'
        else
            commandArray['Simulation']='Set Level: 10'
        end
    end
    

--------------------------------------------------------------------------------

commandArray['Variable:' .. VarTempsCycle]=tostring(timedifference(tostring(uservariables_lastupdate[VarTempsCycle])))

return commandArray

Disable adblock

This site is supported by ads and donations.
If you see this text you are blocking our ads.
Please consider a Donation to support the site.


MikeW
Messages : 19
Enregistré le : 25 déc. 2017, 17:38

Re: Domoticz et Wiser de Schneider (la croix blanche)

Message par MikeW » 17 août 2018, 17:17

A cette étape vous pouvez piloter votre Wiser sans problème : Moi j'ai ajouté d'autres fonctions :

Des commandes automatiques du type coupure de chambre non utilisées, surveillances de prises non utilisées, simulation de présences
un "Boost chauffage" et oui Wiser a une faille, pour gérer votre chauffage Wiser applique un modèle en fonction des température de la veille s'il y a un brusque changement de température à l’extérieur votre Wiser va galérer à chauffer. Pour pallier ça j'ai ajouté un mode Boost qui est connecté à une station météo du coin et en cas de changement brutal Domoticz applique une consigne plus forte au RDC pendant un temps histoire d'aider Wiser ;). Pour cette fonction ajoutez une mesure de température extérieur moi j'utilise Weather Underground et ce scripte dans l'un de vos programme: Moi j'ai créé un programme LUA EtatDivers, désolé je ne le publie pas car il n'est pas propre. Voici l’extrait :

Code : Tout sélectionner

-- Mesure de l'écart de température de nuit
if (tonumber(os.date('%H'))<3) then
    
	commandArray['Variable:EcartTempNuit']='0'
	
elseif (uservariables["EcartTempNuit"]==0) then
    
    commandArray['Variable:EcartTempNuit']= tostring(tonumber(uservariables["TempNuitDerniere"])- tonumber(string.format("%.2f",otherdevices_temperature['Température extérieur'])))
	commandArray['Variable:TempNuitDerniere']= tostring(tonumber(string.format("%.2f",otherdevices_temperature['Température extérieur'])))
	
end
Script des commandes automatiques :

Code : Tout sélectionner

---------------------------------------
---------- Variables publics ----------
--------------------------------------- 
-- Dans un premier temps veuillez créer ces variables utilisateurs pour les besoin système
-- Réglage/Plus d'option/Variable utilisateur = "Cycle_CmdAuto" de type entier
-- Réglage/Plus d'option/Variable utilisateur = "RemoteCmdWiser" de type entier
-- Réglage/Plus d'option/Variable utilisateur = "TempNuitDerniere" de type decimal
-- Réglage/Plus d'option/Variable utilisateur = "EcartTempNuit" de type decimal


---------------------------------------
------------ Configuration ------------
--------------------------------------- 

local nom_script = "CmdAuto"                                                            -- Scipt LUA de type Device
local Desc_script = "Commandes Auto Domoticz"
local version = "1.40"
local debugging = false				                                                    -- true pour voir les logs dans la console log Dz ou false pour ne pas les voir
local JoursDeVacances = 2                                                               -- Jours de vacances pour le passage du mode vacances
local TempMode3Pers = tostring(otherdevices_temperature["CT de la Buanderie"])          -- Température des pièces sans présences
local TempNormal = tostring(otherdevices_temperature["CT de la suite parentale"])       -- Température de retour à la normal après mode personnes
local TempsSansActivite = 15                                                            -- Temps sans activité des équipements
local VarTempsCycle = "Cycle_" .. nom_script                                            -- Variable pour la mesure de temps de cycle du script
local EcartTempNuit = 3                                                                 -- Ecrat de température pour le mode boost en °C
local HeureBoost = 1                                                                    -- Temps de boost pour les écarts de températures de la nuit 1h 2h ou 3h
local leverSoleil = string.sub(os.date("!%X",60*timeofday['SunriseInMinutes']), 1, 5)   -- retourne l'heure du lever de soleil ex: "06:41"
local coucherSoleil = string.sub(os.date("!%X",60*timeofday['SunsetInMinutes']), 1, 5)  -- retourne l'heure du coucher de soleil ex: "22:15"

--------------------------------------------
---------------- Fonctions -----------------
-------------------------------------------- 
-- Fonction des log
function voir_les_logs (s, debugging)
	if (debugging) then 
		if s ~= nil then
		print ("<font color='#0280e9'>".. s .."</font>")
		else
		print ("<font color='#f3031d'>aucune valeur affichable</font>")
		end
	end
end	

--Fonction calcule la différence de temps (en secondes) entre maintenant et la date passée en paramètre.
function timedifference (s)
  year = string.sub(s, 1, 4)
  month = string.sub(s, 6, 7)
  day = string.sub(s, 9, 10)
  hour = string.sub(s, 12, 13)
  minutes = string.sub(s, 15, 16)
  seconds = string.sub(s, 18, 19)
  t1 = os.time()
  t2 = os.time{year=year, month=month, day=day, hour=hour, min=minutes, sec=seconds}
  difference = os.difftime (t1, t2)
  return difference
end
-- Commandes sur capteurs
function update(Type, dev, value1, value2, Unit)
        voir_les_logs("Info Script ".. nom_script .. " : Ecriture sur le block type Consigne : " .. dev .. " = ValTemp <- ".. value1 .. Unit ,true)
        local cmd = tostring(otherdevices_idx[dev] .. '|0|'.. value1)
        table.insert (commandArray, { ['UpdateDevice'] = cmd } )
end
--------------------------------------------
-------------- Fin Fonctions ---------------
--------------------------------------------

--------------------------------------------

commandArray = {}
commandArray['Variable:' .. VarTempsCycle]= '600'

voir_les_logs("Info Script ".. nom_script .. " : " .. Desc_script .. " (v".. version ..") by MikeW",debugging)



-- Selection du mode de présence 2 ou 3 ou 6 personnes
if  (timedifference(otherdevices_lastupdate['Nombre de personnes']) > 10 * 60) and (timedifference(otherdevices_lastupdate["Mode de chauffage"]) > TempsSansActivite * 60) then
    
    if  (timedifference(otherdevices_lastupdate['Nombre de personnes']) < 12 * 60) then
        commandArray['Variable:RemoteCmdWiser']="-1"
    end

    if (tostring(otherdevices['Nombre de personnes'])=="3 personnes") or (tostring(otherdevices['Nombre de personnes'])=="2 personnes") then 

        if (tostring(tonumber(string.format("%.2f",tostring(string.gsub(otherdevices_svalues["Csg de la chamb 001"], "%a", ""))))) ~=tostring(tonumber(string.format("%.2f",tostring(TempMode3Pers))))) and tonumber(otherdevices_svalues["Batteries du Rad de 001"]:match("([^;]+)"))>0 then
                voir_les_logs("Info Script ".. nom_script .. " : Ecriture sur le block type Consigne : Csg de la chamb 001" .. " = ValTemp <- ".. TempMode3Pers .. "°C" ,true)
                local cmd = tostring('18|0|'.. string.format("%.2f",tostring(TempMode3Pers)))
                table.insert (commandArray, { ['UpdateDevice'] = cmd } )
                commandArray['Variable:RemoteCmdWiser']=tostring(otherdevices_idx['Csg de la chamb 001'])
        end
        if (tostring(string.format("%.2f",tostring(string.gsub(otherdevices_svalues["Csg de la chamb 003"], "%a", ""))))~=tostring(string.format("%.2f",tostring(TempMode3Pers)))) and tonumber(otherdevices_svalues["Batteries du Rad d Inès et Loo"]:match("([^;]+)"))>0 then
                voir_les_logs("Info Script ".. nom_script .. " : Ecriture sur le block type Consigne : Csg de la chamb 003" .. " = ValTemp <- ".. TempMode3Pers .. "°C" ,true)
                local cmd = tostring('16|0|'.. string.format("%.2f",tostring(TempMode3Pers)))
                table.insert (commandArray, { ['UpdateDevice'] = cmd } )
                commandArray['Variable:RemoteCmdWiser']=tostring(otherdevices_idx['Csg de la chamb 003'])
        end
    end
    if (tostring(otherdevices['Nombre de personnes'])=="2 personnes") then 
        if (tostring(string.format("%.2f",tostring(string.gsub(otherdevices_svalues["Csg de la chamb 002"], "%a", "")))) ~=tostring(string.format("%.2f",tostring(TempMode3Pers)))) and tonumber(otherdevices_svalues["Batteries du Rad de 002"]:match("([^;]+)"))>0 then
                voir_les_logs("Info Script ".. nom_script .. " : Ecriture sur le block type Consigne : Csg de la chamb 002" .. " = ValTemp <- ".. TempMode3Pers .. "°C" ,true)
                local cmd = tostring('17|0|'.. string.format("%.2f",tostring(TempMode3Pers)))
                table.insert (commandArray, { ['UpdateDevice'] = cmd } )
                commandArray['Variable:RemoteCmdWiser']=tostring(otherdevices_idx['Csg de la chamb 002'])
        end
    end
    
    if (tostring(otherdevices['Nombre de personnes'])=="6 personnes") and ((timedifference(otherdevices_lastupdate['Nombre de personnes']) < 60 * 60)) then 
        if (tonumber(string.format("%.2f",tostring(string.gsub(otherdevices_svalues["Csg de la chamb 001"], "%a", "")))) ~=tonumber(string.format("%.2f",tostring(TempNormal)))) and tonumber(otherdevices_svalues["Batteries du Rad de 001"]:match("([^;]+)"))>0 then
                voir_les_logs("Info Script ".. nom_script .. " : Ecriture sur le block type Consigne : Csg de la chamb 001" .. " = ValTemp <- ".. TempNormal .. "°C" ,true)
                local cmd = tostring('18|0|'.. string.format("%.2f",tostring(TempNormal)))
                table.insert (commandArray, { ['UpdateDevice'] = cmd } )
                commandArray['Variable:RemoteCmdWiser']=tostring(otherdevices_idx['Csg de la chamb 001'])
        end
        if (tonumber(string.format("%.2f",tostring(string.gsub(otherdevices_svalues["Csg de la chamb 003"], "%a", ""))))~=tonumber(string.format("%.2f",tostring(TempNormal)))) and tonumber(otherdevices_svalues["Batteries du Rad d Inès et Loo"]:match("([^;]+)"))>0 then
                voir_les_logs("Info Script ".. nom_script .. " : Ecriture sur le block type Consigne : Csg de la chamb 003" .. " = ValTemp <- ".. TempNormal .. "°C" ,true)
                local cmd = tostring('16|0|'.. string.format("%.2f",tostring(TempNormal)))
                table.insert (commandArray, { ['UpdateDevice'] = cmd } )
                commandArray['Variable:RemoteCmdWiser']=tostring(otherdevices_idx['Csg de la chamb 003'])
        end
    end
    if ((tostring(otherdevices['Nombre de personnes'])=="6 personnes") or (tostring(otherdevices['Nombre de personnes'])=="3 personnes"))  and ((timedifference(otherdevices_lastupdate['Nombre de personnes']) < 60 * 60))  then 
        if (tonumber(string.format("%.2f",tostring(string.gsub(otherdevices_svalues["Csg de la chamb 002"], "%a", "")))) ~=tonumber(string.format("%.2f",tostring(TempNormal)))) and tonumber(otherdevices_svalues["Batteries du Rad de 002"]:match("([^;]+)"))>0 then
                voir_les_logs("Info Script ".. nom_script .. " : Ecriture sur le block type Consigne : Csg de la chamb 002" .. " = ValTemp <- ".. TempNormal .. "°C" ,true)
                local cmd = tostring('17|0|'.. string.format("%.2f",tostring(TempNormal)))
                table.insert (commandArray, { ['UpdateDevice'] = cmd } )
                commandArray['Variable:RemoteCmdWiser']=tostring(otherdevices_idx['Csg de la chamb 002'])
        end
    end
end



-- Surveillance des non utilisations des prises pilotées pour l'économie d'énergie   
Equip001 = 'Interrupteur Divers 1'
if  (timedifference(otherdevices_lastupdate['P ' .. Equip001]) > TempsSansActivite * 60) and tonumber(string.format("%.1f",string.gsub(string.sub(tostring(otherdevices['P '.. Equip001]), 1, 3),";",".")))>0 and tonumber(string.format("%.1f",string.gsub(string.sub(tostring(otherdevices['P '.. Equip001]), 1, 3),";",".")))<10 and otherdevices[Equip001]~="Off" then
        commandArray[Equip001]="Off"
        voir_les_logs("Info Script ".. nom_script .. " : Ecriture sur le block type Interrupteur : Arrêt de " .. Equip001 .. ", sur détection d'inactivité" ,true)
end
Equip001 = 'Inter TV'
if  (timedifference(otherdevices_lastupdate['P ' .. Equip001]) > TempsSansActivite * 60) and tonumber(string.format("%.1f",string.gsub(string.sub(tostring(otherdevices['P '.. Equip001]), 1, 3),";",".")))>0 and tonumber(string.format("%.1f",string.gsub(string.sub(tostring(otherdevices['P '.. Equip001]), 1, 3),";",".")))<40 and otherdevices[Equip001]~="Off" then
        commandArray[Equip001]="Off"
        voir_les_logs("Info Script ".. nom_script .. " : Ecriture sur le block type Interrupteur : Arrêt de " .. Equip001 .. ", sur détection d'inactivité" ,true)
end
Equip001 = 'Interrupteur Divers 2'
if  (timedifference(otherdevices_lastupdate['P ' .. Equip001]) > TempsSansActivite * 60) and tonumber(string.format("%.1f",string.gsub(string.sub(tostring(otherdevices['P '.. Equip001]), 1, 3),";",".")))>0 and tonumber(string.format("%.1f",string.gsub(string.sub(tostring(otherdevices['P '.. Equip001]), 1, 3),";",".")))<2 and otherdevices[Equip001]~="Off" then
        commandArray[Equip001]="Off"
        voir_les_logs("Info Script ".. nom_script .. " : Ecriture sur le block type Interrupteur : Arrêt de " .. Equip001 .. ", sur détection d'inactivité" ,true)
end

-- Gestion du mode Boost
local TempBoost = 22
if (tostring(otherdevices['Boost chauffage'])~="Off") then
    if  (timedifference(otherdevices_lastupdate['Boost chauffage']) > string.format("%.0f",string.gsub(otherdevices['Boost chauffage'], "%D", "")) * 60 * 60) then
        
        commandArray['Boost chauffage']='Set Level: 0'
        commandArray['Variable:RemoteCmdWiser']="-1"
        
    else 
        

        if (string.format("%.2f",tostring(otherdevices["Csg du salon"]))~=string.format("%.2f",tostring(TempBoost))) then
            update('','Csg du salon',string.format("%.2f",tostring(TempBoost)),'','°C')
        end
        if (string.format("%.2f",tostring(otherdevices["Csg de la cuisine"])) ~=string.format("%.2f",tostring(TempBoost))) then
            update('','Csg de la cuisine',string.format("%.2f",tostring(TempBoost)),'','°C')
        end

    end
end

if (uservariables["EcartTempNuit"]>=EcartTempNuit and 
tonumber(string.format("%.2f",otherdevices_temperature['Température extérieur']))<1) and 
tonumber(os.date('%H'))<5
then
    commandArray['Boost chauffage']='Set Level: ' .. HeureBoost .. '0'
end

-- Gestion du mode simulation
local ActionneurSimul001 = 'Interrupteur Divers 1'
local ActionneurSimul002 = 'Interrupteur Divers 2'


local CmdSimul001 = ""
local CmdSimul002 = ""


if (otherdevices['Simulation']=='présence') then

    if (timeofday['Nighttime']) then
        if ((tonumber(os.date('%M')) == 20) or (tonumber(os.date('%M')) == 39) or (tonumber(os.date('%M')) == 58)) and (tonumber(os.date('%S')) > 40) and
            (tonumber(os.date('%H'))>5 and tonumber(os.date('%H'))<23) then
            
            
            local NbAction = math.random(5)
            if (NbAction == 1) then
                CmdSimul001="On"
                CmdSimul002="On"
            end    
            if (NbAction == 2) or (NbAction == 4)  then
                CmdSimul001="On"
                CmdSimul002="Off"
            end       
     
        end        
    else
    
        CmdSimul001="Off"
        CmdSimul002="Off"

     
    end
    
else
    if (timedifference(otherdevices_lastupdate['Simulation']) < 2 * 60) then
        
        CmdSimul001="Off"
        CmdSimul002="Off"

        
    end
end

if (timedifference(otherdevices_lastupdate['Simulation']) < 5 * 60) or (otherdevices['Simulation']=='présence') then

    if (otherdevices[ActionneurSimul001]~=CmdSimul001) and CmdSimul001~="" then
        commandArray[ActionneurSimul001]=CmdSimul001
    end
    if (otherdevices[ActionneurSimul002]~=CmdSimul002) and CmdSimul002~="" then
        commandArray[ActionneurSimul002]=CmdSimul002
    end


end

commandArray['Variable:' .. VarTempsCycle]=tostring(timedifference(tostring(uservariables_lastupdate[VarTempsCycle])))
return commandArray
J'ai ajouté aussi une prise de commandes multiple vers Wiser comme le passage de plusieurs zone à une consigne

Code : Tout sélectionner

---------------------------------------
---------- Variables publics ----------
--------------------------------------- 
-- Dans un premier temps veuillez créer ces variables utilisateurs pour les besoin système
-- Réglage/Plus d'option/Variable utilisateur = "Cycle_CmdManu" de type entier

---------------------------------------
------------ Configuration ------------
--------------------------------------- 

local nom_script = "CmdManu"                                                    -- Scipt LUA de type Time
local Desc_script = "Commandes Manu groupées Domoticz"
local version = "1.00"
local debugging = false				                                            -- true pour voir les logs dans la console log Dz ou false pour ne pas les voir
local JoursDeVacances = 2                                                       -- Jours de vacances pour le passage du mode vacances
local TempsSansActivite = 60                                                    -- Temps sans activité des équipements
local VarTempsCycle = "Cycle_" .. nom_script                                    -- Facultatif : Variable pour la mesure de temps de cycle du script


--------------------------------------------
---------------- Fonctions -----------------
-------------------------------------------- 
-- Fonction des log
function voir_les_logs (s, debugging)
	if (debugging) then 
		if s ~= nil then
		print ("<font color='#0280e9'>".. s .."</font>")
		else
		print ("<font color='#f3031d'>aucune valeur affichable</font>")
		end
	end
end	

--Fonction calcule la différence de temps (en secondes) entre maintenant et la date passée en paramètre.
function timedifference (s)
  year = string.sub(s, 1, 4)
  month = string.sub(s, 6, 7)
  day = string.sub(s, 9, 10)
  hour = string.sub(s, 12, 13)
  minutes = string.sub(s, 15, 16)
  seconds = string.sub(s, 18, 19)
  t1 = os.time()
  t2 = os.time{year=year, month=month, day=day, hour=hour, min=minutes, sec=seconds}
  difference = os.difftime (t1, t2)
  return difference
end
-- Commandes sur capteurs
function update(Type, dev, value1, value2, Unit)
        voir_les_logs("Info Script ".. nom_script .. " : Ecriture sur le block type Consigne : " .. dev .. " = ValTemp <- ".. value1 .. Unit ,true)
        local cmd = tostring(otherdevices_idx[dev] .. '|0|'.. value1)
        table.insert (commandArray, { ['UpdateDevice'] = cmd } )
end
--------------------------------------------
-------------- Fin Fonctions ---------------
--------------------------------------------

--------------------------------------------

commandArray = {}
commandArray['Variable:' .. VarTempsCycle]= '600'

voir_les_logs("Info Script ".. nom_script .. " : " .. Desc_script .. " (v".. version ..") by MikeW",debugging)


-- Selection du mode manu RDC
if (tostring(otherdevices['Mode Manu RDC'])~="Off") and (tostring(otherdevices['Boost chauffage'])=="Off") then
    if  (timedifference(otherdevices_lastupdate['Mode Manu RDC']) > TempsSansActivite * 60) then
        
        commandArray['Mode Manu RDC']='Set Level: 0'
        
    else 
        local TempManu = string.format("%.2f",string.sub(tostring(otherdevices['Mode Manu RDC']), 5, 7))


        if (string.format("%.2f",tostring(otherdevices["Csg du salon"]))~=string.format("%.2f",tostring(TempManu))) then
            update('','Csg du salon',string.format("%.2f",tostring(TempManu)),'','°C')
        end
        if (string.format("%.2f",tostring(otherdevices["Csg de la cuisine"])) ~=string.format("%.2f",tostring(TempManu))) then
            update('','Csg de la cuisine',string.format("%.2f",tostring(TempManu)),'','°C')
        end

    end
end

commandArray['Variable:' .. VarTempsCycle]=tostring(timedifference(tostring(uservariables_lastupdate[VarTempsCycle])))
return commandArray
Modifié en dernier par MikeW le 30 août 2018, 17:17, modifié 7 fois.

MikeW
Messages : 19
Enregistré le : 25 déc. 2017, 17:38

Re: Domoticz et Wiser de Schneider (la croix blanche)

Message par MikeW » 17 août 2018, 17:21

Et enfin j'ai ajouté des envois de mails pour la maintenance du système, mailing à ma sauce ;)

Code : Tout sélectionner

---------------------------------------
---------- Variables publics ----------
--------------------------------------- 
-- Dans un premier temps veuillez créer ces variables utilisateurs pour les besoin système
-- Réglage/Plus d'option/Variable utilisateur = "Cycle_InfosMails" de type entier

---------------------------------------
------------ Configuration ------------
--------------------------------------- 

local nom_script = "InfosMails"                                                 -- Scipt LUA de type Device
local Desc_script = "Gestion des mails maintenance"
local version = "1.10"
local debugging = false				                                            -- true pour voir les logs dans la console log Dz ou false pour ne pas les voir
local TempsSansActivite = 15                                                    -- Temps sans activité des équipements
local Personne001 = 'mail001@hotmail.fr'                			-- Mail de la première personne
local Personne002 = 'mail002@hotmail.fr'                                        -- Mail de la seconde personne
local Titre = 'Serveur de la maison'                                            -- Nom de l'équipement domotique
local NiveauBasBatteire = 25                                                    -- Niveau bas des batteries pour la surveillance de remplacement en %
local IntervalMail = 18                                                         -- Interval de temps d'envoie de mail en secondes
local VarTempsCycle = "Cycle_" .. nom_script                                    -- Facultatif : Variable pour la mesure de temps de cycle du script


--------------------------------------------
---------------- Fonctions -----------------
-------------------------------------------- 
-- Fonction des log
function voir_les_logs (s, debugging)
	if (debugging) then 
		if s ~= nil then
		print ("<font color='#0280e9'>".. s .."</font>")
		else
		print ("<font color='#f3031d'>aucune valeur affichable</font>")
		end
	end
end	

--Fonction calcule la différence de temps (en secondes) entre maintenant et la date passée en paramètre.
function timedifference (s)
  year = string.sub(s, 1, 4)
  month = string.sub(s, 6, 7)
  day = string.sub(s, 9, 10)
  hour = string.sub(s, 12, 13)
  minutes = string.sub(s, 15, 16)
  seconds = string.sub(s, 18, 19)
  t1 = os.time()
  t2 = os.time{year=year, month=month, day=day, hour=hour, min=minutes, sec=seconds}
  difference = os.difftime (t1, t2)
  return difference
end
-- Fonction d'envoie de mail
function InfoMail_cmd( dev, Objet, Mail001, Mail002, Message)
    if (dev~='nil') then
        local Sujet = Titre .. ' : ' .. Objet .. ' '.. tostring(dev)
        voir_les_logs("Info Script ".. nom_script .. " : envoie du message mail ; " .. Sujet .. " à " ..  tostring(Mail001),true)
        commandArray[1]={['SendEmail']= Sujet .. '#Bonjour, <BR><BR>   ' .. Message .. '<BR> <BR> <BR> ' .. Titre .. '#' .. Mail001}
        if (Mail002~='') then
           voir_les_logs("Info Script ".. nom_script .. " : envoie du message mail ; " .. Sujet .. " à " ..  tostring(Mail002),true)
            commandArray[2]={['SendEmail']= Sujet .. '#Bonjour, <BR><BR>   ' .. Message .. '<BR> <BR> <BR> ' .. Titre .. '#' .. Mail002}
        end
    end
end
--------------------------------------------
-------------- Fin Fonctions ---------------
--------------------------------------------

--------------------------------------------

commandArray = {}

commandArray['Variable:' .. VarTempsCycle]= '600'
local CapteurVirtuel = 'nil'

voir_les_logs("Info Script ".. nom_script .. " : " .. Desc_script .. " (v".. version ..") by MikeW",debugging)

-- Infos divers états

-- Si action sur mode manu
CapteurVirtuel = 'Mode Manu RDC'
if (tostring(devicechanged[CapteurVirtuel])~="nil") and (tostring(devicechanged[CapteurVirtuel])~="Off") then
    InfoMail_cmd(CapteurVirtuel, 'modification de la commande',Personne001,Personne002, 'le système de chauffage est passé en ' .. tostring(otherdevices[CapteurVirtuel]) .. ' pour le RDC' )
end
-- Si action sur Mode de chauffage
CapteurVirtuel = 'Mode de chauffage'
if (tostring(devicechanged[CapteurVirtuel])~="nil") then
    InfoMail_cmd(CapteurVirtuel, 'modification de la commande',Personne001,Personne002, 'le système de chauffage est passé en ' .. tostring(otherdevices[CapteurVirtuel]) .. '' )
end
-- Si action Nombre de personnes
CapteurVirtuel = 'Nombre de personnes'
if (tostring(devicechanged[CapteurVirtuel])~="nil") then
    InfoMail_cmd(CapteurVirtuel, 'modification de la commande',Personne001,Personne002, 'la maison est passée en mode ' .. tostring(otherdevices[CapteurVirtuel]) .. '' )
end


-- Infos niveaux de batteries
CapteurVirtuel = 'Batteries du Rad de la cuisine'
if ((timedifference(otherdevices_lastupdate[CapteurVirtuel]) < IntervalMail) and  tonumber(string.format("%.1f",string.gsub(string.sub(tostring(otherdevices[CapteurVirtuel]), 1, 3),";",".")))<NiveauBasBatteire) then
    InfoMail_cmd(CapteurVirtuel, 'Etat des ',Personne001, Personne002, 'Niveau de ' .. tostring(CapteurVirtuel) .. ' à ' .. string.format("%.1f",string.gsub(string.sub(tostring(otherdevices[CapteurVirtuel]), 1, 3),";",".")) .. '%')
end
CapteurVirtuel = 'Batteries du Rad du salon'
if ((timedifference(otherdevices_lastupdate[CapteurVirtuel]) < IntervalMail)  and  tonumber(string.format("%.1f",string.gsub(string.sub(tostring(otherdevices[CapteurVirtuel]), 1, 3),";",".")))<NiveauBasBatteire) then
    InfoMail_cmd(CapteurVirtuel, 'Etat des ',Personne001, Personne002, 'Niveau de ' .. tostring(CapteurVirtuel) .. ' à ' .. string.format("%.1f",string.gsub(string.sub(tostring(otherdevices[CapteurVirtuel]), 1, 3),";",".")) .. '%')
end
CapteurVirtuel = 'Batteries du Rad de la buanderie'
if ((timedifference(otherdevices_lastupdate[CapteurVirtuel]) < IntervalMail)  and  tonumber(string.format("%.1f",string.gsub(string.sub(tostring(otherdevices[CapteurVirtuel]), 1, 3),";",".")))<NiveauBasBatteire) then
    InfoMail_cmd(CapteurVirtuel, 'Etat des ',Personne001, Personne002, 'Niveau de ' .. tostring(CapteurVirtuel) .. ' à ' .. string.format("%.1f",string.gsub(string.sub(tostring(otherdevices[CapteurVirtuel]), 1, 3),";",".")) .. '%')
end



commandArray['Variable:' .. VarTempsCycle]=tostring(timedifference(tostring(uservariables_lastupdate[VarTempsCycle])))
return commandArray
Modifié en dernier par MikeW le 04 févr. 2019, 15:03, modifié 1 fois.

MikeW
Messages : 19
Enregistré le : 25 déc. 2017, 17:38

Re: Domoticz et Wiser de Schneider (la croix blanche)

Message par MikeW » 17 août 2018, 17:34

Pour infos pour les mesures de puissance seules les mesures des prises fonctionne. Pour la central de mesures au tableau je n'ai pas poussé, ces mesures remontent directement sur le site de Wiser et ne sont pas dans la Box chez vous, mais mon projet pourrait être adapté pour les consulter. Si vous avez le courage de continuer je suis preneur.

Juste un second point, quand les batteries sont HS les réponses Json changes et ça fausse les scripts, il se peut que vous ayez ce genre de message
"2018-03-08 15:13:17.422 Error: EventSystem: in CmdAuto: [string "--------------------------------------- ..."]:106: bad argument #2 to 'format' (number expected, got string)". Moi pour pallier ce problème je test les niveaux de batteries pour effectuer des requêtes. Si vous avez là solution que je n'ai pas trouvé c'est a dire tester l'intégrité de la réponse Json avant de la traiter, ça m’intéresse !



Voila !! Enjoy ;)

MikeW
Messages : 19
Enregistré le : 25 déc. 2017, 17:38

Re: Domoticz et Wiser de Schneider (la croix blanche)

Message par MikeW » 30 août 2018, 17:21

N’hésitez à me faire votre retour, merci ;)

Neutrino
Messages : 1331
Enregistré le : 10 juil. 2015, 15:42
Localisation : Challans (85)
Contact :

Re: Domoticz et Wiser de Schneider (la croix blanche)

Message par Neutrino » 30 août 2018, 21:57

J'ai pas ce matos chez moi, donc je ne peux pas tester, mais je salue le travail réalisé ! :)
Ma maison à plein d'IP ! :mrgreen:

MikeW
Messages : 19
Enregistré le : 25 déc. 2017, 17:38

Re: Domoticz et Wiser de Schneider (la croix blanche)

Message par MikeW » 05 sept. 2018, 16:13

Merci j’ai testé ça pendant un an. Aujourd’hui il fait partie du quotidien, c’est avec grand plaisir de le partager.

Disable adblock

This site is supported by ads and donations.
If you see this text you are blocking our ads.
Please consider a Donation to support the site.


Répondre