This forum uses cookies
This forum makes use of cookies to store your login information if you are registered, and your last visit if you are not. Cookies are small text documents stored on your computer; the cookies set by this forum can only be used on this website and pose no security risk. Cookies on this forum also track the specific topics you have read and when you last read them. Please confirm that you accept these cookies being set.

Nabaztag control
#1
Hi all as a contribution here after you will find my code done to pilot a Nabaztag

as a reminder Nabaztag is a communicating rabbit, that can speak(TTS), play music, move ears, have an embded RFID sensor. I personnaly use it as vocal feedback of my homeautomation system (homelynk based)

Code:
--[[
Author: Gilles38
Name: Class_Nabaztag
Version: 0.0.1
Design for HomeLYnk and spaceLYnk

Available methodes:
        Is_Reachable() return boolean
                Is_Connected() return boolean
                Is_Sleeping() return boolean
                Reboot() return true or error message
                SetEars($Pos_Gauche,$Pos_Droite) return true or error message
                Speak($Texte,$Voix)    return true or error message
                Play_Stream($Url) return true or error message
         Get_Name()    return string
                Get_Voices()    return array
                Wakeup() return true or error message
                Goto_Sleep() return true or error message

Required for constructor:
                Adresse_main:define standard server adresse
                Adresse_Unified: define alternativ server
                Name: is the name of the Rabbit
                Token: define the token of the rabbit
                Mac: Mac adress of the rabbit
                Voice: define the list of voices available
]]--


Nabaztag={Name="",Token="",Mac="", Adresse_Main="", Adresse_Unified="", Voice={}}
Nabaztag.__index = Nabaztag

--Nabaztag class constructor
function Nabaztag:new( o,Name, Token, Mac)
 o=o or {}
 setmetatable(o, self)
 self.Name = Name
 self.Token = Token
 self.Mac = Mac
 self.Adresse_Main="http://openjabnab.fr/ojn/FR/api.jsp"
 self.Adresse_Unified="http://api.wizz.cc/?server=pixel"
 self.Voices= {"Alice","Antoine","Bruno","Claire","Julie","Margaux","Lorise","Deepa","Graham","Lucy","Peter","Rachel"}
 log("Creation classe name:"..self.Name.." Token:"..self.Token)
 return o
end

--Send standard command  to Nabaztag return true or false
function Nabaztag:Send_Command(action)
  Query=self.Adresse_Main.."?sn="..self.Mac.."&token="..self.Token.."&action="..action
 return(self:Launch_Query(Query))
end

function Nabaztag:Launch_Query(Query)
 log("Launch-Query")
 require ("socket")
    require ("socket.http")
 respResult, respcode, respHeaders, respStatus = socket.http.request(Query)
 return(respResult)
end

--************Get Rabbit name**********
function Nabaztag:Get_name()
 return(self.Name)
end

--**********Get voices available*******
function Nabaztag:Get_Voices()
 return(self.Voices)
end

--************Goto slip****************
function Nabaztag:Goto_Sleep()
 return(self:Send_Command(14))
end
 
--**********Make the rabbit wakeup**********
function Nabaztag:Wakeup()
   return(self:Send_Command(13))
end

--*********Play sounds from URL***********
function Nabaztag:Play_Stream(Url)
 Query=self.Adresse_Unified.."&sn="..self.Mac.."&token="..self.Token.."&urlList="..Url
 result=self:Launch_Query(Query)
end

--********Make the rabbit speak**********
function Nabaztag:Speak(Text,Voice)
     --*******Url encode**********
  if (Text) then
     Text = string.gsub (Text, "\n", "\r\n")
     --Text = string.gsub (Text, "([^%w ])",
       -- function (c) return string.format ("%%%02X", string.byte(c)) end)
   Text = string.gsub (Text, " ", "+")
   Text=string.gsub(Text,"é","%%%e9")
   Text=string.gsub(Text,"è","%%%e8")
   Text=string.gsub(Text,"ç","%%%e7")
   Text=string.gsub(Text,"ê","%%%ea")
   Text=string.gsub(Text,"ô","%%%f4")
   Text=string.gsub(Text,"� ","%%%e0")
   Text=string.gsub(Text,"â","%%%e2")
   Text=string.gsub(Text,"?","%%%3f")
   Text=string.gsub(Text,":","%%%3a")
  end
 log(Text)
 Query=self.Adresse_Unified.."&sn="..self.Mac.."&token="..self.Token.."&tts="..Text.."&ws_acapela="..Voice
 result=self:Launch_Query(Query)
end

--*******Ears position changing****************
--*******Parameters: Left ears, right ears value from 0 to 16
--*******return tru if OK else an error message
function Nabaztag:SetEars(Pos_Gauche,Pos_Droite)
 if(Pos_Gauche>16) then
   Pos_Gauche=16
 end
 
 if(Pos_Droite>16) then
   Pos_Droite=16
 end
 
 Query=self.Adresse_Main.."&sn="..self.Mac.."&token="..self.Token.."&posleft="..Pos_Gauche.."&posright="..Pos_Droite
 result=self:Launch_Query(Query)
end


--*****Reboot rabbit*********
function Nabaztag:Reboot()
 return(self:Send_Command(17))
end

--*********Check if rabbit is connected********
function Nabaztag:Is_Connected()
 if(self:Send_Command(15)~=nil) then
     if (string.find(self:Send_Command(15),"YES") ~= nil) then
       return(true)
        else
       return(false)
        end
 else
   return(false)
 end
end

--*********Check if rabbit is sleeping********
function Nabaztag:Is_Sleeping()
 if (string.find(self:Send_Command(7),"YES") ~= nil) then
   return(true)
    else
   return(false)
    end
end

--*********Check if rabbit can launch an action********
function Nabaztag:Is_Reachable()
    return(self:Is_Sleeping() and self:Is_Connected())
end


function  Nabaztag:Status()
 
 if(self:Is_Connected()) then
   if(self:Is_Sleeping()) then
     return(2)
   else
     return(1)
   end
 else
   return (0)
 end
 
end
Reply
#2
Nice, one small suggestion: have you tried using socket.url.escape instead of multiple string.gsub? It should handle other language-specific characters as well.
Reply
#3
(22.02.2018, 11:29)admin Wrote: Nice, one small suggestion: have you tried using socket.url.escape instead of multiple string.gsub? It should handle other language-specific characters as well.

thanks I will try Wink  and update the code accordingly.
Reply


Forum Jump: