Navigation

    • Register
    • Login
    • OpenHardware.io
    • Categories
    • Recent
    • Tags
    • Popular
    1. Home
    2. franzelare
    3. Topics
    • Profile
    • Following
    • Followers
    • Topics
    • Posts
    • Best
    • Groups

    Topics created by franzelare

    • franzelare

      Copy philps Hue settings to other RGB device with Domoticz/Mysensor
      My Project • • franzelare  

      2
      0
      Votes
      2
      Posts
      3709
      Views

      franzelare

      in domoticz I have 2 lua scripts running for the HUE control, 1 time based and one triggered by the device change next to that I have 1 watchdog script that switches on ID 100 to the node and the node will reply with an off at that ID so the node can be reset if there is no communication a user variable has to be creased to store the current HUE settings (String) a dummy text utility has to be created to store the HSV or RGB and dimmer values for the mysensor node to request The device script contains calculations from HSV to RGB and RGB hex, I tried different formats for fowarding the data to the mysensor node and just kept it in the script in case I might need it later for troubleshooting -- this script reads the setting of 1 HUE RGB device and forwards this to a mysensor RGB dimmer -- one script will do this time based and the second script will do this on a device change, in order to capture changed made from domoticz and through the HUE bridge directly -- HUE stores the values in HSV format where the mysensor node uses RGB values for the RGB LED's so these have to be converted before forwarding -- a user variable has to be creased to store the current HUE settings (String) -- a dummy text utility has to be created to store the HSV or RGB and dimmer values for the mysensor node to request -- additional libraries for lua have to be installed -- how to do this can be found in the help wiki http://www.domoticz.com/wiki/Upload_energy_data_to_PVoutput#Install_socket_library -- or from http://www.domoticz.com/forum/viewtopic.php?f=5&t=1847&p=22638#p22638 -- for json processing I use http://regex.info/code/JSON.lua on a raspberry pi -- on a synology nas dkjson seems to do a better job http://dkolf.de/src/dkjson-lua.fsl/home -- all need to end up in /usr/local/lib/lua/5.2 commandArray = {} -- fixed values base_url = 'http://192.168.2.150/api/fd81c2245c8797cec333e351d01a3' -- hue URL and username domoticz_url = 'http://192.168.2.140:8080' --URL of domoticz server HUE_Strip_ID = 6 -- HUE ID of deviced to be replicated HUE_CURRENT = 'Led_HUE' -- Uservariable (String) to store HUE setting Source_Name = 'HueStrip' -- Name of the HUE device to be copied in Domoticz Target_IDX = 229 -- IDX of target device Target_Name = 'RGB_Led' -- exact device name Target_IDX_TXT=38 -- IDX for HSV values ForwardType = 'HSV' -- HSV or RGB to be forwarded to the mysensor node PRINT_MODE = false -- when true wil print output to log and send notifications if (devicechanged[Source_Name]) then -- optional and (uservariables['HUE_Forward_LAN']==1) if (otherdevices[Source_Name] == 'Off') then -- set copied device to off commandArray[Target_Name] = 'Off' else -- Only load libaries now http = require('socket.http') ltn12 = require('ltn12') json = require('JSON') io = require('io') -- set some local variables device = '' mode = 'GET' params = '' function hueread(device, operation, mode) local t = {} local url = base_url .. device local req_body = operation if PRINT_MODE == true then print(url) print(req_body) end local headers = { ["Content-Type"] = "application/json"; ["Content-Length"] = #req_body; } client, code, headers, status = http.request{url=url, headers=headers, source=ltn12.source.string(req_body), sink = ltn12.sink.table(t), method=mode} if PRINT_MODE == true then print(status) end return t end function processJSON(t) obj, pos, err = json:decode(table.concat(t),1,nil) if PRINT_MODE == true then print(table.concat(t)) print("check for error") end if err then print ("Error for HUE Bridge:", err) else if PRINT_MODE == true then print("no error") end data = '' i=HUE_Strip_ID state=obj.lights[tostring(i)].state dataHUE = data .. state.bri ..'|'.. state.hue ..'|'.. state.sat dataStatus = state.on -- checking if HUE strip is off if state.on==false then if PRINT_MODE == true then if otherdevices[Target_Name] ~= 'Off' then print('HUE LED is off, but RGB LED was on') else print('HUE LED is off, no action') end commandArray[Target_Name] = 'Off' if PRINT_MODE == true then print('Sending off switch command just to be sure') end end else -- checking if HUE strip is on but led strip is off if state.on==true then if otherdevices[Target_Name] == 'Off' then if PRINT_MODE == true then print('Switching RGB led on') end commandArray[Target_Name] = 'On' if PRINT_MODE == true then print('Hue ID checked: ' .. i) print('Status on: On') print('HUE: ' .. dataHUE) print('length of encode '..#dataHUE) end else if PRINT_MODE == true then print('RGB led already on, checking settings') end commandArray[Target_Name] = 'On' if PRINT_MODE == true then print('Sending on switch command just to be sure') end end -- Collecting color data to compare Old_data = tostring(uservariables[HUE_CURRENT]) New_data = tostring(dataHUE) if New_data ~= Old_data then print('HUE data changed') if PRINT_MODE == true then print('New data:' .. New_data) print('Old data:' ..Old_data) print('') end -- convert HUE values to HSV H=((state.hue)/65534) S=((state.sat)/254) V=((state.bri)/254) --convert HUE to domoticz values Hue=tostring(math.floor(H*360)) Sat=tostring(math.floor(S*100)) Bri=tostring(math.floor(V*100)) -- convert HSV to RGB and RGB hex values R, G, B =HSVtoRGB(H, S, V) if R >= 16 then Rhex=num2hex(R) else Rhex='0'.. num2hex(R) end if G >= 16 then Ghex=num2hex(G) else Ghex='0'.. num2hex(G) end if B >= 16 then Bhex=num2hex(B) else Bhex='0'.. num2hex(B) end RGB= R ..'|'.. G ..'|'.. B RGBhex= Rhex ..''.. Ghex ..''.. Bhex if PRINT_MODE == true then -- Reverse calculations of hue values for validation Hr, Sr, Vr =RGBtoHSV(R, G, B) Hrev=round((Hr*65536),0) Srev=round((Sr*256),0) Vrev=round((Vr*256),0) -- print all calculated data print('Hue Hue light: ' .. state.hue) print('Sat Hue light: ' .. state.sat) print('Bright Hue light: ' .. state.bri) print(' ') print('Hue domoticz: ' .. Hue) print('Sat domoticz: ' .. Sat) print('Bri domoticz: ' .. Bri) print(' ') print('H: ' .. H) print('S: ' .. S) print('V: ' .. V) print(' ') print('R: ' .. R) print('G: ' .. G) print('B: ' .. B) print('RGB: ' .. RGB) print(' ') print('Rhex: ' .. Rhex) print('Ghex: ' .. Ghex) print('Bhex: ' .. Bhex) print('RGBhex: ' .. RGBhex) print(' ') print('H reversed: ' .. Hrev) print('S reversed: ' .. Srev) print('V reversed: ' .. Vrev) end -- set LED strip if (ForwardType=='RGB') then -- store RGB as text datanew_TXT=RGBhex..";"..Bri..";" commandArray['UpdateDevice'] = Target_IDX_TXT .. '|0|' .. tostring(datanew_TXT) if PRINT_MODE == true then print('Storing RGB text value:' .. datanew_TXT) end end if (ForwardType=='HSV') then -- store HSV as text datanew_HSV=state.hue..";"..state.sat..";"..state.bri..";" commandArray['UpdateDevice'] = Target_IDX_TXT .. '|0|' .. tostring(datanew_HSV) if PRINT_MODE == true then print('Storing HSV text value:' .. datanew_HSV) end end --send HUE values to domoticz urlRGBLED = 'http://127.0.0.1:8080/json.htm?type=command&param=setcolbrightnessvalue&idx=' .. Target_IDX .. '&hue=' ..Hue.. '&brightness=' ..Bri..'&saturation=' ..Sat.. '&iswhite=false' commandArray['OpenURL']= urlRGBLED -- store new HUE values in variables commandArray['Variable:Led_HUE'] = New_data else print('No change in HUE values') end end end end return end function HSVtoRGB(h, s, v) local r, g, b local i = math.floor(h * 6); local f = h * 6 - i; local p = v * (1 - s); local q = v * (1 - f * s); local t = v * (1 - (1 - f) * s); i = i % 6 if i == 0 then r, g, b = v, t, p end if i == 1 then r, g, b = q, v, p end if i == 2 then r, g, b = p, v, t end if i == 3 then r, g, b = p, q, v end if i == 4 then r, g, b = t, p, v end if i == 5 then r, g, b = v, p, q end R=round((r*255),0) G=round((g*255),0) B=round((b*255),0) return R, G, B end function RGBtoHSV(r, g, b) r, g, b = r / 255, g / 255, b / 255 local max, min = math.max(r, g, b), math.min(r, g, b) local h, s, v v = max local d = max - min if max == 0 then s = 0 else s = d / max end if max == min then h = 0 -- achromatic else if max == r then h = (g - b) / d if g < b then h = h + 6 end elseif max == g then h = (b - r) / d + 2 elseif max == b then h = (r - g) / d + 4 end h = h / 6 end return h, s, v end function round(num, idp) local mult = 10^(idp or 0) return math.floor(num * mult + 0.5) / mult end function num2hex(num) local hexstr = '0123456789ABCDEF' local s = '' while num > 0 do local mod = math.fmod(num, 16) s = string.sub(hexstr, mod+1, mod+1) .. s num = math.floor(num / 16) end if s == '' then s = '0' end return s end t = hueread(device, params, mode) processJSON(t) end end return commandArray The time based lua script -- this script reads the setting of 1 HUE RGB device and forwards this to a mysensor RGB dimmer -- one script will do this time based and the second script will do this on a device change, in order to capture changed made from domoticz and through the HUE bridge directly -- HUE stores the values in HSV format where the mysensor node uses RGB values for the RGB LED's so these have to be converted before forwarding -- a user variable has to be creased to store the current HUE settings (String) -- a dummy text utility has to be created to store the HSV or RGB and dimmer values for the mysensor node to request -- additional libraries for lua have to be installed -- how to do this can be found in the help wiki http://www.domoticz.com/wiki/Upload_energy_data_to_PVoutput#Install_socket_library -- or from http://www.domoticz.com/forum/viewtopic.php?f=5&t=1847&p=22638#p22638 -- for json processing I use http://regex.info/code/JSON.lua on a raspberry pi -- on a synology nas dkjson seems to do a better job http://dkolf.de/src/dkjson-lua.fsl/home -- all need to end up in /usr/local/lib/lua/5.2 commandArray = {} -- fixed values base_url = 'http://192.168.2.150/api/fd81c2245c8797cec333e351d01a3' -- hue URL and username domoticz_url = 'http://192.168.2.140:8080' --URL of domoticz server HUE_Strip_ID = 6 -- HUE ID of deviced to be replicated HUE_CURRENT = 'Led_HUE' -- uservariable (String) to store HUE setting Source_Name = 'HueStrip' -- Name of the HUE device to be copied in Domoticz Target_IDX = 229 -- IDX of target device Target_Name = 'RGB_Led' -- exact device name Target_IDX_TXT=38 -- IDX for HSV values ForwardType = 'HSV' -- HSV or RGB to be forwarded to the mysensor node PRINT_MODE = false -- when true wil print output to log and send notifications -- Only load libaries now http = require('socket.http') ltn12 = require('ltn12') json = require('JSON') io = require('io') -- set some local variables device = '' mode = 'GET' params = '' function hueread(device, operation, mode) local t = {} local url = base_url .. device local req_body = operation if PRINT_MODE == true then print(url) print(req_body) end local headers = { ["Content-Type"] = "application/json"; ["Content-Length"] = #req_body; } client, code, headers, status = http.request{url=url, headers=headers, source=ltn12.source.string(req_body), sink = ltn12.sink.table(t), method=mode} if PRINT_MODE == true then print(status) end return t end function processJSON(t) obj, pos, err = json:decode(table.concat(t),1,nil) if PRINT_MODE == true then print(table.concat(t)) print("check for error") end if err then print ("Error for HUE Bridge:", err) else if PRINT_MODE == true then print("no error") end data = '' i=HUE_Strip_ID state=obj.lights[tostring(i)].state dataHUE = data .. state.bri ..'|'.. state.hue ..'|'.. state.sat dataStatus = state.on -- checking if HUE strip is off if state.on==false then if PRINT_MODE == true then if otherdevices[Target_Name] ~= 'Off' then print('HUE LED is off, but RGB LED was on') else print('HUE LED is off, no action') end commandArray[Target_Name] = 'Off' if PRINT_MODE == true then print('Sending off switch command just to be sure') end end else -- checking if HUE strip is on but led strip is off if state.on==true then if otherdevices[Target_Name] == 'Off' then if PRINT_MODE == true then print('Switching RGB led on') end commandArray[Target_Name] = 'On' if PRINT_MODE == true then print('Hue ID checked: ' .. i) print('Status on: On') print('HUE: ' .. dataHUE) print('length of encode '..#dataHUE) end else if PRINT_MODE == true then print('RGB led already on, checking settings') end commandArray[Target_Name] = 'On' if PRINT_MODE == true then print('Sending on switch command just to be sure') end end -- Collecting color data to compare Old_data = tostring(uservariables[HUE_CURRENT]) New_data = tostring(dataHUE) if New_data ~= Old_data then print('HUE data changed') if PRINT_MODE == true then print('New data:' .. New_data) print('Old data:' ..Old_data) print('') end -- convert HUE values to HSV H=((state.hue)/65534) S=((state.sat)/254) V=((state.bri)/254) --convert HUE to domoticz values Hue=tostring(math.floor(H*360)) Sat=tostring(math.floor(S*100)) Bri=tostring(math.floor(V*100)) -- convert HSV to RGB and RGB hex values R, G, B =HSVtoRGB(H, S, V) if R >= 16 then Rhex=num2hex(R) else Rhex='0'.. num2hex(R) end if G >= 16 then Ghex=num2hex(G) else Ghex='0'.. num2hex(G) end if B >= 16 then Bhex=num2hex(B) else Bhex='0'.. num2hex(B) end RGB= R ..'|'.. G ..'|'.. B RGBhex= Rhex ..''.. Ghex ..''.. Bhex if PRINT_MODE == true then -- Reverse calculations of hue values for validation Hr, Sr, Vr =RGBtoHSV(R, G, B) Hrev=round((Hr*65536),0) Srev=round((Sr*256),0) Vrev=round((Vr*256),0) -- print all calculated data print('Hue Hue light: ' .. state.hue) print('Sat Hue light: ' .. state.sat) print('Bright Hue light: ' .. state.bri) print(' ') print('Hue domoticz: ' .. Hue) print('Sat domoticz: ' .. Sat) print('Bri domoticz: ' .. Bri) print(' ') print('H: ' .. H) print('S: ' .. S) print('V: ' .. V) print(' ') print('R: ' .. R) print('G: ' .. G) print('B: ' .. B) print('RGB: ' .. RGB) print(' ') print('Rhex: ' .. Rhex) print('Ghex: ' .. Ghex) print('Bhex: ' .. Bhex) print('RGBhex: ' .. RGBhex) print(' ') print('H reversed: ' .. Hrev) print('S reversed: ' .. Srev) print('V reversed: ' .. Vrev) end -- set LED strip if (ForwardType=='RGB') then -- store RGB as text datanew_TXT=RGBhex..";"..Bri..";" commandArray['UpdateDevice'] = Target_IDX_TXT .. '|0|' .. tostring(datanew_TXT) if PRINT_MODE == true then print('Storing RGB text value:' .. datanew_TXT) end end if (ForwardType=='HSV') then -- store HSV as text datanew_HSV=state.hue..";"..state.sat..";"..state.bri..";" commandArray['UpdateDevice'] = Target_IDX_TXT .. '|0|' .. tostring(datanew_HSV) if PRINT_MODE == true then print('Storing HSV text value:' .. datanew_HSV) end end --send HUE values to domoticz urlRGBLED = 'http://127.0.0.1:8080/json.htm?type=command&param=setcolbrightnessvalue&idx=' .. Target_IDX .. '&hue=' ..Hue.. '&brightness=' ..Bri..'&saturation=' ..Sat.. '&iswhite=false' commandArray['OpenURL']= urlRGBLED -- store new HUE values in variables commandArray['Variable:Led_HUE'] = New_data else print('No change in HUE values') end end end end return end function HSVtoRGB(h, s, v) local r, g, b local i = math.floor(h * 6); local f = h * 6 - i; local p = v * (1 - s); local q = v * (1 - f * s); local t = v * (1 - (1 - f) * s); i = i % 6 if i == 0 then r, g, b = v, t, p end if i == 1 then r, g, b = q, v, p end if i == 2 then r, g, b = p, v, t end if i == 3 then r, g, b = p, q, v end if i == 4 then r, g, b = t, p, v end if i == 5 then r, g, b = v, p, q end R=round((r*255),0) G=round((g*255),0) B=round((b*255),0) return R, G, B end function RGBtoHSV(r, g, b) r, g, b = r / 255, g / 255, b / 255 local max, min = math.max(r, g, b), math.min(r, g, b) local h, s, v v = max local d = max - min if max == 0 then s = 0 else s = d / max end if max == min then h = 0 -- achromatic else if max == r then h = (g - b) / d if g < b then h = h + 6 end elseif max == g then h = (b - r) / d + 2 elseif max == b then h = (r - g) / d + 4 end h = h / 6 end return h, s, v end function round(num, idp) local mult = 10^(idp or 0) return math.floor(num * mult + 0.5) / mult end function num2hex(num) local hexstr = '0123456789ABCDEF' local s = '' while num > 0 do local mod = math.fmod(num, 16) s = string.sub(hexstr, mod+1, mod+1) .. s num = math.floor(num / 16) end if s == '' then s = '0' end return s end t = hueread(device, params, mode) processJSON(t) return commandArray I use a watchdog script, where this is a simplified version of, currently I have 5 ESP units in this watchdog script commandArray = {} PRINT_MODE = false -- when true wil print output to log and send notifications 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 LastupdateESP = otherdevices_lastupdate['HeartbeatESP'] ESPdifference=timedifference (LastupdateESP) if PRINT_MODE == true then print('Lastupdate ESP ' .. LastupdateESP) print('Time difference ' .. ESPdifference) end if (ESPdifference>=130) then if (otherdevices['ESPAlive'] == 'On')then commandArray['ESPAlive'] = 'Off' CurrentTime=os.date("%Y-%m-%d %H:%M:%S") file = io.open("/home/pi/domoticz/www/log/MysensorWatchdog.log", "a") io.output(file) io.write(CurrentTime.. " Mysensor ESP connection lost" .. "\n") io.close(file) if PRINT_MODE == true then print('Writing to error log') end end end if (ESPdifference<130 and otherdevices['ESPAlive'] == 'Off')then if PRINT_MODE == true then print('ESP is a live again') end commandArray['ESPAlive'] = 'On' CurrentTime=os.date("%Y-%m-%d %H:%M:%S") file = io.open("/home/pi/domoticz/www/log/MysensorWatchdog.log", "a") io.output(file) io.write(CurrentTime.. " Mysensor ESP connection operational again" .. "\n") io.close(file) if PRINT_MODE == true then print('Writing to error log') end end commandArray['HeartbeatESP'] = 'On' return commandArray
    • franzelare

      Get version response
      Development • • franzelare  

      3
      0
      Votes
      3
      Posts
      851
      Views

      franzelare

      nobody knows how to catch the get version message?
    • franzelare

      IR remote using ESP8266 to power down AV devices
      My Project • • franzelare  

      1
      6
      Votes
      1
      Posts
      2749
      Views

      No one has replied