Aller au contenu
Did

VD Robonect pour HC2

Recommended Posts

 Bonjour tout le monde,

J'ai installé mon module Robonect sur l'Automower, tout fonctionne parfaitement sans les remontées vers la HC2,

 

1560766028_RobonectHx.PNG.fb88f0c0d0074d339f456a892f705e1c.PNG

 

mais après pas mal de recherche, je suis enfin tombé sur un VD pour HC2 concernant la carte Robonect (sur leur site d'ailleurs, je ne l'avais pas vu la première fois).

https://robonect.de/viewtopic.php?f=12&t=287

Le problème est qu'il est en allemand, j'ai commencé à traduire quelques étiquettes, entrer mes identifiants et créer les trois variables requises, il fonctionne mais quelques petits soucis subsistent, même en rentrant les numéros des icônes, celle du VD reste invariablement sur la OFFline (même quand elle tond).

 

large.Automower.PNG.ede4d46c11c4ee4c785cef2c0189cf18.PNG

 

Je n'ai pas non plus encore testé les boutons de mode, juste le "Statut".

Voici la mainloop (je vous livre celle du VD d'origine pour ne pas laisser mes identifiants):

fibaro:debug('Starte PING')

local IP = '192.168.xx.xx'
local PORT = 80
local versuche = 3
local iconOFFLINE = "1009" -- ANPASSEN; Gerät ist offline
local iconONLINE = "1001" -- ANPASSEN; Gerät ist online
local iconCHECK = "1003" -- ANPASSEN; Gerät wird angepingt

local function _ping(retry)
  fibaro:call(fibaro:getSelfId(), "setProperty", "currentIcon", iconCHECK)
  retry = retry or 0
  local tcpSocket = Net.FTcpSocket(IP, PORT)
  tcpSocket:setReadTimeout(250)
  fibaro:debug('Suche..., versuche #' .. retry .. ' bitte warten...')
  fibaro:sleep(250)
  local bytes, errorCode = tcpSocket:write('ping')
    
  if errorCode == 0 then
    return true
  else
    if retry < versuche then
      fibaro:debug('Nicht gefunden, erneut versuchen, bitte warten...')
      fibaro:sleep(1000);
      return _ping(retry + 1)
    end
    return false
  end
end

local f, result = pcall(_ping)

if (f) then
  if (result == true) and (fibaro:getGlobalValue("Variable_AM_Timer") == "Aktiv" ) then
 fibaro:debug(IP.. ':' .. PORT .. ' wurde gefunden, der Timer Status des Automower ist Aktiv')
 fibaro:debug("Status wird abgefragt");
 fibaro:call(175, "pressButton", "6");
 fibaro:debug("Status wurde abgefragt, warte für 2 Minuten");
 fibaro:call(175, "setProperty", "currentIcon", iconONLINE);
 fibaro:sleep(120000)

 elseif (result == true) and (fibaro:getGlobalValue("Variable_AM_Timer") == "Standby" ) then
 fibaro:debug(IP.. ':' .. PORT .. ' wurde gefunden, der Timer Status des Automower ist Standby')
 fibaro:debug("Status wird abgefragt");
 fibaro:call(175, "pressButton", "6");
 fibaro:debug("Status wurde abgefragt, warte für 30 Minuten");
 fibaro:call(175, "setProperty", "currentIcon", iconONLINE);
 fibaro:sleep(1800000)

 elseif (result == true) and (fibaro:getGlobalValue("Variable_AM_Timer") == "Deaktiviert" ) then
 fibaro:debug(IP.. ':' .. PORT .. ' wurde gefunden, der Timer Status des Automower ist Deaktiviert')
 fibaro:debug("Status wird abgefragt");
 fibaro:call(175, "pressButton", "6");
 fibaro:debug("Status wurde abgefragt, warte für 30 Minuten");
 fibaro:call(175, "setProperty", "currentIcon", iconONLINE);
 fibaro:sleep(1800000)

 elseif (result == true) and (fibaro:getGlobalValue("Variable_AM_Timer") == "Manuell" ) then
 fibaro:debug(IP.. ':' .. PORT .. ' wurde gefunden, der Timer Status des Automower ist Manuell')
 fibaro:debug("Status wird abgefragt");
 fibaro:call(175, "pressButton", "6");
 fibaro:debug("Status wurde abgefragt, warte für 10 Minuten");
 fibaro:call(175, "setProperty", "currentIcon", iconONLINE);
 fibaro:sleep(600000)

 else
 fibaro:debug(IP.. ':' .. PORT .. ' wurde nicht gefunden.')
 fibaro:call(fibaro:getSelfId(), "setProperty", "currentIcon", iconOFFLINE)
 fibaro:call(175, "setProperty", "currentIcon", iconOFFLINE);
 fibaro:debug("Status des Automower wird aufgrund mangelnder Erreichbarkeit nicht abgefragt")
 fibaro:debug("Status wurde nicht abgefragt, warte für 10 Minuten)");
 fibaro:sleep(600000)
 end

 else
 fibaro:debug('Error: ' .. f)
 end

Et le bouton n°6 "Status" (les autres n'ont que quelques lignes):

-- Setze Verbindungsdaten
-- Benutzername Passwort fuer MOWER
mowerUser = "MOWER"
mowerPW = "PWD"

-- hole ip adresse aus virtuellem modul
selfId = fibaro:getSelfId()
mowerIP = fibaro:get(selfId, "IPAddress")
mowerPort = fibaro:get(selfId, "TCPPort")
-- setze variable MOWER aus IP und Logindaten
MOWER = Net.FHttp(mowerIP)
MOWER:setBasicAuthentication(mowerUser, mowerPW)
-- -------------------------------------------------
-- -------------------------------------------------
 
-- geting info about specific device
  response = MOWER:GET("/json?cmd=status")
 
-- decoding json string to table
  extractedjson = json.decode(response)
 
-- "status/battery": "Battery Status"
-- "status/duration": "Mode Duration"
-- "status/hours": "Hours"
-- "status/mode": "Mode"
-- "status/status": "Status"
-- "timer/status": "Timer Status"

  battery = extractedjson.status.battery
  duration = extractedjson.status.duration
  hours = extractedjson.status.hours
  AM_Status = extractedjson.status.status
  AM_Mode = extractedjson.status.mode
  AM_Timer = extractedjson.timer.status


fibaro:debug(battery.."%")
fibaro:debug(duration.."s")
fibaro:debug(hours.."h")
fibaro:debug(AM_Status)
fibaro:debug(AM_Mode)
fibaro:debug(AM_Timer)


  fibaro:call(selfId, "setProperty", "ui.LabelBatterystatus.value",(battery).." %");
 
  fibaro:call(selfId, "setProperty", "ui.LabelModeDuration.value",(duration).." s");
   
  fibaro:call(selfId, "setProperty", "ui.LabelHours.value",(hours).."h");
 
  fibaro:call(selfId, "setProperty", "ui.LabelMode.value",(AM_Mode));

  fibaro:call(selfId, "setProperty", "ui.LabelStatus.value",(AM_Status));

  fibaro:call(selfId, "setProperty", "ui.LabelTimer.value",(AM_Timer));

 
fibaro:debug("Status Auswertung gestartet")


if (AM_Status == 0) then
  fibaro:call(selfId, "setProperty", "ui.LabelStatus.value"," Status wird ermittelt");
  fibaro:log("Status: Status wird ermittelt")
  fibaro:debug("Status wird ermittelt")
elseif (AM_Status == 1) then
  fibaro:call(selfId, "setProperty", "ui.LabelStatus.value"," Automower parkt");
  fibaro:log("Status: Automower parkt")
  fibaro:debug("Automower parkt")
elseif (AM_Status == 2) then
  fibaro:call(selfId, "setProperty", "ui.LabelStatus.value"," Automower mäht");
  fibaro:log("Status: Automower mäht")
  fibaro:debug("Automower mäht")
elseif (AM_Status == 3) then
  fibaro:call(selfId, "setProperty", "ui.LabelStatus.value"," Automower sucht die Ladestation");
  fibaro:log("Status: Automower sucht die Ladestation")
  fibaro:debug("Automower sucht die Ladestation")
elseif (AM_Status == 4) then
  fibaro:call(selfId, "setProperty", "ui.LabelStatus.value"," Automower lädt");
  fibaro:log("Status: Automower lädt")
  fibaro:debug("Automower lädt")
elseif (AM_Status == 5) then
  fibaro:call(selfId, "setProperty", "ui.LabelStatus.value"," Automower sucht (wartet auf das Umsetzen im manuellen Modus)");
  fibaro:log("Status: Automower sucht (wartet auf das Umsetzen im manuellen Modus)")
  fibaro:debug("Automower sucht (wartet auf das Umsetzen im manuellen Modus)")
elseif (AM_Status == 7) then
  fibaro:call(selfId, "setProperty", "ui.LabelStatus.value"," Fehlerstatus");
  fibaro:log("Status: Fehlerstatus")
  fibaro:debug("Fehlerstatus")
elseif (AM_Status == 8) then
  fibaro:call(selfId, "setProperty", "ui.LabelStatus.value"," Schleifensignal verloren");
  fibaro:log("Status: Automower Schleifensignal verloren")
  fibaro:debug("Automower Schleifensignal verloren")
elseif (AM_Status == 16) then
  fibaro:call(selfId, "setProperty", "ui.LabelStatus.value"," Automower abgeschaltet");
  fibaro:log("Status: Automower abgeschaltet")
  fibaro:debug("Automower abgeschaltet")
elseif (AM_Status == 17) then
  fibaro:call(selfId, "setProperty", "ui.LabelStatus.value"," Automower schläft");
  fibaro:log("Status: Automower schläft")
  fibaro:debug("Automower schläft")
else
  fibaro:call(selfId, "setProperty", "ui.LabelState.value"," Error");
  fibaro:log("Status: Ladefehler")
  fibaro:debug("Ladefehler")
end
 
fibaro:setGlobal("AM_Status", AM_Status);


fibaro:sleep(100);


fibaro:debug("Mode Auswertung gestartet")

if (AM_Mode == 0) then
  fibaro:call(selfId, "setProperty", "ui.LabelMode.value"," Auto");
  fibaro:log("Mode: Auto")
  fibaro:debug("Auto")
elseif (AM_Mode == 1) then
  fibaro:call(selfId, "setProperty", "ui.LabelMode.value"," Manuell");
  fibaro:log("Mode: Manuell")
  fibaro:debug("Manuell")
elseif (AM_Mode == 2) then
  fibaro:call(selfId, "setProperty", "ui.LabelMode.value"," Home");
  fibaro:log("Mode: Home")
  fibaro:debug("Home")
elseif (AM_Mode == 3) then
  fibaro:call(selfId, "setProperty", "ui.LabelMode.value"," Demo");
  fibaro:log("Mode: Demo")
  fibaro:debug("Demo")
else
  fibaro:call(selfId, "setProperty", "ui.LabelMode.value"," Error");
  fibaro:log("Mode: Fehler")
  fibaro:debug("Fehler")
end

  fibaro:setGlobal("AM_Mode", AM_Mode);


fibaro:sleep(100);


fibaro:debug("Timer Auswertung gestartet")

if (AM_Timer == 0) then
  fibaro:call(selfId, "setProperty", "ui.LabelTimer.value"," Deaktiviert");
  fibaro:log("Timer: Deaktiviert")
  fibaro:debug("Deaktiviert")
elseif (AM_Timer == 1) then
  fibaro:call(selfId, "setProperty", "ui.LabelTimer.value"," Auto");
  fibaro:log("Timer: Auto")
  fibaro:debug("Auto")
elseif (AM_Timer == 2) then
  fibaro:call(selfId, "setProperty", "ui.LabelTimer.value"," Standby");
  fibaro:log("Timer: Standby")
  fibaro:debug("Standby")
else
  fibaro:call(selfId, "setProperty", "ui.LabelTimer.value"," Error");
  fibaro:log("Timer: Fehler")
  fibaro:debug("Fehler")

end

  fibaro:setGlobal("AM_Timer", AM_Timer);


-- Setze Icon

fibaro:debug('Starte PING')

local IP = '192.168.xx.xx'
local PORT = 80
local versuche = 3
local iconOFFLINE = "1002" -- ANPASSEN; Gerät ist offline
local iconONLINE = "1001" -- ANPASSEN; Gerät ist online
local iconCHECK = "1003" -- ANPASSEN; Gerät wird angepingt

local function _ping(retry)
  fibaro:call(fibaro:getSelfId(), "setProperty", "currentIcon", iconCHECK)
  retry = retry or 0
  local tcpSocket = Net.FTcpSocket(IP, PORT)
  tcpSocket:setReadTimeout(250)
  fibaro:debug('Suche..., versuche #' .. retry .. ' bitte warten...')
  fibaro:sleep(250)
  local bytes, errorCode = tcpSocket:write('ping')
    
  if errorCode == 0 then
    return true
  else
    if retry < versuche then
      fibaro:debug('Nicht gefunden, erneut versuchen, bitte warten...')
      fibaro:sleep(1000);
      return _ping(retry + 1)
    end
    return false
  end
end

local f, result = pcall(_ping)

if (f) then
  if (result == true) and (fibaro:getGlobalValue("Variable_AM_Timer") == "Aktiv" ) then
 fibaro:debug(IP.. ':' .. PORT .. ' wurde gefunden, der Timer Status des Automower ist Aktiv')
 fibaro:debug("Status wird abgefragt");
 fibaro:call(175, "setProperty", "currentIcon", iconONLINE);

 elseif (result == true) and (fibaro:getGlobalValue("Variable_AM_Timer") == "Standby" ) then
 fibaro:debug(IP.. ':' .. PORT .. ' wurde gefunden, der Timer Status des Automower ist Standby')
 fibaro:debug("Status wird abgefragt");
 fibaro:call(175, "setProperty", "currentIcon", iconONLINE);

 elseif (result == true) and (fibaro:getGlobalValue("Variable_AM_Timer") == "Deaktiviert" ) then
 fibaro:debug(IP.. ':' .. PORT .. ' wurde gefunden, der Timer Status des Automower ist Deaktiviert')
 fibaro:debug("Status wird abgefragt");
 fibaro:call(175, "setProperty", "currentIcon", iconONLINE);

 elseif (result == true) and (fibaro:getGlobalValue("Variable_AM_Timer") == "Manuell" ) then
 fibaro:debug(IP.. ':' .. PORT .. ' wurde gefunden, der Timer Status des Automower ist Manuell')
 fibaro:debug("Status wird abgefragt");
 fibaro:call(175, "setProperty", "currentIcon", iconONLINE);

 else
 fibaro:debug(IP.. ':' .. PORT .. ' wurde nicht gefunden.')
 fibaro:call(fibaro:getSelfId(), "setProperty", "currentIcon", iconOFFLINE)
 fibaro:call(175, "setProperty", "currentIcon", iconOFFLINE);
 fibaro:debug("Status des Automower wird aufgrund mangelnder Erreichbarkeit nicht abgefragt")
 end

 else
 fibaro:debug('Error: ' .. f)
 end

J'ai aussi bien remplacé chaque numéro 175 par l'ID de mon VD. J'ai remarqué des différences sur quelques lignes, certaines ont des apostrophes au lieu des guillemets, est-ce normal?

Comment fait-on pour ajouter d'autres infos du genre température, humidité, usure des lames ou même la position GPS qui doivent apparaître dans la trame json?

J'ai bien essayé d'ajouter une nouvelle étiquette et dupliquer des lignes du genre

fibaro:call(selfId, "setProperty", "ui.LabelHours.value"

en remplaçant par blades par exemple (pour l'info des lames). J'aimerais aussi ajouter une icône quand la tondeuse est en charge et une autre quand elle est en défaut.

Je cherche toujours un doc sur l'API du Robonect.

Merci pour votre aide.

 

VD_Automower_2019 Robonect.vfib

 

P.S: Je vous rajoute aussi une trame du json:
 

http://IP_mower/xml?cmd=status&blades&quality%7BAuthorization=Basic


<robonect>
<name>**********</name>
<id>******</id>
<status>
<status>17</status>
<distance>0</distance>
<stopped>false</stopped>
<duration>3417</duration>
<mode>0</mode>
<battery>100</battery>
<hours>2202</hours>
</status>
<timer>
<status>2</status>
<next>
<date>2020-11-21</date>
<time>17:00:00</time>
<unix>1605978000</unix>
</next>
</timer>
<blades>
<quality>73</quality>
<hours>3</hours>
<days>25</days>
</blades>
<wlan>
<signal>-73</signal>
</wlan>
<health>
<temperature>14</temperature>
<humidity>47</humidity>
</health>
<clock>
<date>2020-11-20</date>
<time>22:39:33</time>
<unix>1605911973</unix>
</clock>
<successful>true</successful>
</robonect>

 

 

  • Upvote 1

Partager ce message


Lien à poster
Partager sur d’autres sites

Top top Did !

Partager ce message


Lien à poster
Partager sur d’autres sites

×