Statusabfrage über Homematic per API

Einbindung von Robonect Hx und IO in Deine bereits bestehende Homematic-Anlage

Moderator: Lampi

Benutzeravatar
Nexo
Forum-Anfänger
Beiträge: 9
Registriert: So 2. Sep 2018, 17:48
Wohnort: Wien 1210
Mäher: Gardena R40Li
Herstellungsjahr: 2017
Robonect-Modul: Robonect Hx (Rev.5)
Robonect Firmware: V1.0 Beta 7a

Statusabfrage über Homematic per API

Beitrag von Nexo »

Hallo zusammen,

dürfte ich einen von Euch Profis bitten eine vollständige und aktuelle Version für FW V1.0 Beta 7a zu posten?
Also Skript für User und PW als nicht Cuxd Version inkl. Variablen.
Bitte, Bitte denn Egal welche Version ich mir aus dem Thread gezogen habe, funktioniert nur teilweise. Habe jetzt schon Stunden damit verbracht und ich komme einfach nicht weiter.

Danke Euch, schöne Grüße! Peter


-------------------------
Edit vom Moderator:
Der Übersichtlichkeit wegen abgetrennt. Die Diskussion stammt ursprünglich aus dem Thema Homematic - Einbindung.

Lampi
sehr erfahrener Forum-Nutzer
Beiträge: 344
Registriert: Di 14. Feb 2017, 17:07
Mäher: Husqvarna Automower 330X
Firmware des Mähers (MSW): MSW 7.xx.xx
Herstellungsjahr: 2014
Robonect-Modul: Robonect Hx (Rev.1)
Robonect Firmware: V1.2 (Final Release)
hat sich bedankt: 1 Mal
wurde gedankt: 1 Mal

Re: Homematic - Einbindung

Beitrag von Lampi »

Hallo Peter,

Code: Alles auswählen

! Robonect Statusabfrage per xml und system.Exec

! Verwendete Variablen:
!  vName + Betriebsart     - als Werteliste
!  vName + Distance        - als Zeichenkette
!  vName + Status          - als Werteliste
!  vName + Status seit     - als Zeichenkette


! ********************************************************
boolean vFehlersuche = true;    ! true: Ausgabe als WriteLine ohne Schreiben der Variablen
string vName = "Robotername";   ! Namen des Roboters für die Variablen
string vBenutzer = "";          ! Benutzername
string vPasswort = "";          ! Passwort für Benutzername
string vIP = "xxx.xxx.xxx.xxx"; ! IP des Mähers
! ********************************************************

! Entkommentieren der nächsten Zeilen schreibt die Werteliste in die Variablen
! anschließend wieder Auskommentieren

! dom.GetObject(vName # " Status").ValueList("Status wird ermittelt;parkt;mäht;sucht die Ladestation;lädt;wartet auf Umsetzen;6;Fehlerstatus;Schleifensignal verloren;9;10;11;12;13;14;15;abgeschaltet;schläft;wartet bis Tor auf");
! dom.GetObject(vName # " Betriebsart").ValueList("Auto;Manuell;Home;Demo");


! ToDo
! 


boolean vPing = false;
string stderr = "";
string stdout = "";
string vStart = "";
string vEnde = "";
string vIndex = "";
string vUrl = "'http://" # vIP # "/xml?user=" # vBenutzer # "&pass=" # vPasswort # "&cmd=status'";
integer vTempo = 0;


system.Exec("ping -c 1 " # vIP,&stdout, &stderr);
if (stdout.Contains("ms")) {
  vPing = true;
  if (vFehlersuche) {
    vStart = "time=";
    vEnde = " ms";
    vStart = stdout.Find(vStart) + vStart.Length();
    vIndex = stdout.Substr(vStart, stdout.Find(vEnde) - vStart).ToInteger();
    WriteLine("Der Ping dauerte " # vIndex # " Millisekunden.");
  }
} else {
  if (vFehlersuche) {
    WriteLine(vName # " ist Momentan nicht erreichbar.");
  }
}

if (vPing) {
  vPing = false;
  system.Exec("wget -q -O - " # vUrl, &stdout, &stderr);
  ! Erfolgreich ausgelesen?
  if (stdout.Contains("successful>true</successful")) {
    vPing = true;
    if (vFehlersuche) {
      WriteLine("API Antwort = " # stdout);
    }
  } else {
    if (vFehlersuche) {
      WriteLine(vName # " antwortet trotz erfolgreichem Ping nicht.");
    }
  }
}

if (vPing) {

  ! Status
  vStart = "<status><status>";
  vEnde = "</status>";
  vStart = stdout.Find(vStart) + vStart.Length();
  vIndex = (stdout.Substr(vStart, stdout.Find(vEnde) - vStart)).ToInteger();
  vTempo = vIndex;
  if (vFehlersuche){
    ! vIndex = dom.GetObject(vName # " Status").ValueList().StrValueByIndex(";",vIndex);
    WriteLine("Status = " # vIndex);
  } else {
    dom.GetObject(vName # " Status").State(vIndex);
  }

  ! Status seit
  vStart = "<duration>";
  vEnde = "</duration>";
  vStart = stdout.Find(vStart) + vStart.Length();
  vIndex = stdout.Substr(vStart, stdout.Find(vEnde) - vStart);
  if (vFehlersuche){
    WriteLine("Status seit " # vIndex # " Sekunden");
  } else {
    dom.GetObject(vName # " Status seit").State(vIndex);
  }

  ! Start nach
  vStart = "<distance>";
  vEnde = "</distance>";
  vStart = stdout.Find(vStart) + vStart.Length();
  vIndex = stdout.Substr(vStart, stdout.Find(vEnde) - vStart);
  if (vFehlersuche){
    WriteLine("Start nach " # vIndex # " Meter");
  } else {
    dom.GetObject(vName # " Distance").State(vIndex);
  }

  ! Betriebsart
  vStart = "</mode>";
  vEnde = "</mode>";
  vStart = stdout.Find(vStart) + vStart.Length();
  vIndex = (stdout.Substr(vStart, stdout.Find(vEnde) - vStart)).ToInteger();
  if (vFehlersuche){
    ! vIndex = dom.GetObject(vName # " Betriebsart").ValueList().StrValueByIndex(";",vIndex);
    WriteLine("Betriebsart = " # vIndex);
  } else {
    dom.GetObject(vName # " Betriebsart").State(vIndex);
  }
}
Etwa so in der Art?
Ist jetzt mal nur so aus der Hüfte. Ich selber nutze dieses in der Form nicht mehr. Daher mal nur ein paar Variablen als Beispiel. Wenn du nicht weiterkommst, melde dich bitte noch mal.

Gruß
Jörg
Fragen? Fragen!

Benutzeravatar
Nexo
Forum-Anfänger
Beiträge: 9
Registriert: So 2. Sep 2018, 17:48
Wohnort: Wien 1210
Mäher: Gardena R40Li
Herstellungsjahr: 2017
Robonect-Modul: Robonect Hx (Rev.5)
Robonect Firmware: V1.0 Beta 7a

Re: Homematic - Einbindung

Beitrag von Nexo »

Hi Jörg,

vielen Dank, ja sowas habe ich gemeint :) . Leider stehen bei "Distance" und "Status seit" nur drei Fragezeichen also "???"
und bei "Status" bleibt der Wert auf "Status wird ermittelt" und verändert sich nicht. Wenn das funktionieren würde und noch die anderen Werte wie Batterie, Laufzeit, Wlan etc. kannst mir Dein Paypal Konto schicken. :mrgreen:

Danke und schönen Ostersonntag! Grüße, Peter

P.S. Weil Du schreibst: Ich selber nutze dieses in der Form nicht mehr. Interessehalber, wie nutzt Du es jetzt?

Lampi
sehr erfahrener Forum-Nutzer
Beiträge: 344
Registriert: Di 14. Feb 2017, 17:07
Mäher: Husqvarna Automower 330X
Firmware des Mähers (MSW): MSW 7.xx.xx
Herstellungsjahr: 2014
Robonect-Modul: Robonect Hx (Rev.1)
Robonect Firmware: V1.2 (Final Release)
hat sich bedankt: 1 Mal
wurde gedankt: 1 Mal

Re: Homematic - Einbindung

Beitrag von Lampi »

Okay
bevor wir mit den restlichen Variablen weitermachen, versuchen wir erst mal diese hin zu bekommen.

Bitte folgendes Skript unter Skript testen ausführen. Einmal mit
boolean vTestlauf = true;
und dann mit
boolean vTestlauf = false;

Code: Alles auswählen

! Robonect Statusabfrage per xml und system.Exec

! Verwendete Variablen:
!  vName + Betriebsart     - als Werteliste
!  vName + Distance        - als Zeichenkette
!  vName + Status          - als Werteliste
!  vName + Status seit     - als Zeichenkette


! ********************************************************
boolean vTestlauf = true;       ! true: Ausgabe als WriteLine ohne Schreiben der Variablen; false: schreiben der Variablen ohne Ausgabe als WriteLine
string vName = "Robotername";   ! Namen des Roboters für die Variablen
string vBenutzer = "";          ! Benutzername
string vPasswort = "";          ! Passwort für Benutzername
string vIP = "xxx.xxx.xxx.xxx"; ! IP des Mähers
! ********************************************************

! Entkommentieren der nächsten Zeilen schreibt die Werteliste in die Variablen
! anschließend wieder Auskommentieren

! dom.GetObject(vName # " Status").ValueList("Status wird ermittelt;parkt;mäht;sucht die Ladestation;lädt;wartet auf Umsetzen;6;Fehlerstatus;Schleifensignal verloren;9;10;11;12;13;14;15;abgeschaltet;schläft;wartet bis Tor auf");
! dom.GetObject(vName # " Betriebsart").ValueList("Auto;Manuell;Home;Demo");


! ToDo
! 


boolean vPing = false;
string stderr = "";
string stdout = "";
string vStart = "";
string vEnde = "";
string vIndex = "";
string vUrl = "'http://" # vIP # "/xml?user=" # vBenutzer # "&pass=" # vPasswort # "&cmd=status'";


system.Exec("ping -c 1 " # vIP,&stdout, &stderr);
if (stdout.Contains("ms")) {
  vPing = true;
  if (vTestlauf) {
    vStart = "time=";
    vEnde = " ms";
    vStart = stdout.Find(vStart) + vStart.Length();
    vIndex = stdout.Substr(vStart, stdout.Find(vEnde) - vStart).ToInteger();
    WriteLine("Der Ping dauerte " # vIndex # " Millisekunden.");
  }
} else {
  if (vTestlauf) {
    WriteLine(vName # " ist Momentan nicht erreichbar.");
  }
}

if (vPing) {
  vPing = false;
  system.Exec("wget -q -O - " # vUrl, &stdout, &stderr);
  ! Erfolgreich ausgelesen?
  if (stdout.Contains("successful>true</successful")) {
    vPing = true;
    if (vTestlauf) {
      WriteLine("API Antwort = " # stdout);
    }
  } else {
    if (vTestlauf) {
      WriteLine(vName # " antwortet trotz erfolgreichem Ping nicht.");
    }
  }
}

if (vPing) {

  ! Status
  vStart = "<status><status>";
  vEnde = "</status>";
  vStart = stdout.Find(vStart) + vStart.Length();
  vIndex = (stdout.Substr(vStart, stdout.Find(vEnde) - vStart)).ToInteger();
  if (vTestlauf){
    ! vIndex = dom.GetObject(vName # " Status").ValueList().StrValueByIndex(";",vIndex);
    WriteLine("Status = " # vIndex);
  } else {
    if (dom.GetObject(vName # " Status")) {
      dom.GetObject(vName # " Status").State(vIndex);
    } else {
      WriteLine("Variable -" # vName # " Status- existiert nicht");
    }
  }

  ! Status seit
  vStart = "<duration>";
  vEnde = "</duration>";
  vStart = stdout.Find(vStart) + vStart.Length();
  vIndex = stdout.Substr(vStart, stdout.Find(vEnde) - vStart);
  if (vTestlauf){
    WriteLine("Status seit " # vIndex # " Sekunden");
  } else {
    if (dom.GetObject(vName # " Status seit")) {
      dom.GetObject(vName # " Status seit").State(vIndex);
    } else {
      WriteLine("Variable -" # vName # " Status seit- existiert nicht");
    }
  }

  ! Start nach
  vStart = "<distance>";
  vEnde = "</distance>";
  vStart = stdout.Find(vStart) + vStart.Length();
  vIndex = stdout.Substr(vStart, stdout.Find(vEnde) - vStart);
  if (vTestlauf){
    WriteLine("Start nach " # vIndex # " Meter");
  } else {
    if (dom.GetObject(vName # " Distance")) {
      dom.GetObject(vName # " Distance").State(vIndex);
    } else {
      WriteLine("Variable -" # vName # " Distance- existiert nicht");
    }
  }

  ! Betriebsart
  vStart = "<mode>";
  vEnde = "</mode>";
  vStart = stdout.Find(vStart) + vStart.Length();
  vIndex = (stdout.Substr(vStart, stdout.Find(vEnde) - vStart)).ToInteger();
  if (vTestlauf){
    ! vIndex = dom.GetObject(vName # " Betriebsart").ValueList().StrValueByIndex(";",vIndex);
    WriteLine("Betriebsart = " # vIndex);
  } else {
    if (dom.GetObject(vName # " Betriebsart")) {
      dom.GetObject(vName # " Betriebsart").State(vIndex);
    } else {
      WriteLine("Variable -" # vName # " Betriebsart- existiert nicht");
    }
  }
}
WriteLine("Habe fertig")
Bei true werden die Daten erst mal nur ausgegeben ohne das Werte in die Variablen geschrieben werden.
Bei false wird überprüft ob die Variablen existieren.
Wenn ja, werden die Werte in die Variablen geschrieben ohne eine WriteLine-Ausgabe. Also nicht wundern, wenn scheinbar nichts passiert.
Wenn nein, werden die fehlenden bzw. anders benannten Variablen per WriteLine ausgegeben.

Falls es nicht hinhaut, bräuchte ich die jeweilige WriteLine-Ausgabe für eine weitere Fehlersuche. Die kannst du mir dann auch gerne per PN zusenden.

Wenns läuft kommt dann der Rest. :)


P.S. Weil Du schreibst: Ich selber nutze dieses in der Form nicht mehr. Interessehalber, wie nutzt Du es jetzt?
Ich nutze mqtt und hole mir über API die Werte nur bei Bedarf (über mqtt kommt (noch) nicht alles) z.B. bei einer Störung die Fehlermeldung und die aktuelle Position um mir beides per E-Mail zusenden zu lassen.


Frohe Ostern
Jörg
Fragen? Fragen!

Benutzeravatar
Nexo
Forum-Anfänger
Beiträge: 9
Registriert: So 2. Sep 2018, 17:48
Wohnort: Wien 1210
Mäher: Gardena R40Li
Herstellungsjahr: 2017
Robonect-Modul: Robonect Hx (Rev.5)
Robonect Firmware: V1.0 Beta 7a

Re: Homematic - Einbindung

Beitrag von Nexo »

Servus Jörg,

super, Variante zwei funktioniert mit "boolean vTestlauf = false" steht dann im Skriptester nur mehr "habe fertig" und die Variablen sind geschrieben. Cool, cool, cool :lol: Danke!!

Benutzeravatar
Sprite01
Forum-Nutzer
Beiträge: 30
Registriert: Do 17. Mär 2016, 14:09
Wohnort: Sachsen-Anhalt
Mäher: Gardena R40Li
Firmware des Mähers (MSW): MSW 5.xx.xx
Herstellungsjahr: 2015
Robonect-Modul: Robonect H30x (Rev.2)
Robonect Firmware: 1.0
Kontaktdaten:

Re: Homematic - Einbindung

Beitrag von Sprite01 »

Aber piept er dann auch mit diesem Script nicht laufend bei Abfrage in "Bereitschaft" ?
--------
Gruß
Dirk

Gardena R40Li; MSW: 5.01.00 (10-10-2014); SUB: 5.00.00; MMI: 5.05.00

Lampi
sehr erfahrener Forum-Nutzer
Beiträge: 344
Registriert: Di 14. Feb 2017, 17:07
Mäher: Husqvarna Automower 330X
Firmware des Mähers (MSW): MSW 7.xx.xx
Herstellungsjahr: 2014
Robonect-Modul: Robonect Hx (Rev.1)
Robonect Firmware: V1.2 (Final Release)
hat sich bedankt: 1 Mal
wurde gedankt: 1 Mal

Re: Homematic - Einbindung

Beitrag von Lampi »

Super! :D

Ich denke, dass ich morgen im laufe des Tages Zeit finde mich um die restlichen Variable zu kümmern. Wird dann noch mal eine Version mit Testlauf um sicher zu gehen und anschließend dann eine Final ohne das ganze WriteLine gedöns.

Gruß
Jörg
Fragen? Fragen!

Lampi
sehr erfahrener Forum-Nutzer
Beiträge: 344
Registriert: Di 14. Feb 2017, 17:07
Mäher: Husqvarna Automower 330X
Firmware des Mähers (MSW): MSW 7.xx.xx
Herstellungsjahr: 2014
Robonect-Modul: Robonect Hx (Rev.1)
Robonect Firmware: V1.2 (Final Release)
hat sich bedankt: 1 Mal
wurde gedankt: 1 Mal

Re: Homematic - Einbindung

Beitrag von Lampi »

Sprite01 hat geschrieben:
So 21. Apr 2019, 20:39
Aber piept er dann auch mit diesem Script nicht laufend bei Abfrage in "Bereitschaft" ?

Nein, weder der Ping noch die Anfrage per cmd=status weckt den Mäher auf. Erst Anfragen, die sich Robonect vom Mäher holen muss weckt diesen auf. Und dann piept es.

Gruß
Jörg
Fragen? Fragen!

Lampi
sehr erfahrener Forum-Nutzer
Beiträge: 344
Registriert: Di 14. Feb 2017, 17:07
Mäher: Husqvarna Automower 330X
Firmware des Mähers (MSW): MSW 7.xx.xx
Herstellungsjahr: 2014
Robonect-Modul: Robonect Hx (Rev.1)
Robonect Firmware: V1.2 (Final Release)
hat sich bedankt: 1 Mal
wurde gedankt: 1 Mal

Re: Homematic - Einbindung

Beitrag von Lampi »

Hallo,

So, im Anhang nun als .txt das Skript mit weiteren Variablen. Konnte jetzt nicht bis ins letzte testen ob alles geht. Fehler daher bitte melden.
Was noch fehlt ist der Zustand der Messer. Es kommt quality, hours und days. Bin mir nicht sicher ob und wenn, welche du davon brauchst bzw. haben möchtest. Wäre dann auch dankbar für Vorschläge zur Benennung der Variable.

Für "Status seit" könnte man auch die Sekunden umrechnen in ein lesbareres Format. z.B. 87753 Sekunden als "01:22:33" oder auch "1 Stunde, 22 Minuten und 33 Sekunden". Letzteres wird aber eventuell etwas zu lang sein.

Gruß
Jörg
Dateianhänge
Robonect Statusabfrage.zip
(2.01 KiB) 116-mal heruntergeladen
Fragen? Fragen!

Benutzeravatar
Nexo
Forum-Anfänger
Beiträge: 9
Registriert: So 2. Sep 2018, 17:48
Wohnort: Wien 1210
Mäher: Gardena R40Li
Herstellungsjahr: 2017
Robonect-Modul: Robonect Hx (Rev.5)
Robonect Firmware: V1.0 Beta 7a

Re: Homematic - Einbindung

Beitrag von Nexo »

Hi Jörg,

vielen Dank, schaut schon super aus!

Im Anhang was das Skript in die Variablen schreibt. Der Roboter steht gerade in der Station und lädt. Folgende Werte zeigt er noch nicht an:

"Timer Startzeit" hier sind noch drei Fragezeichen "???" (Habe nur Timer 1 gesetzt von Mo-Fr 08:00 - 18:00 Uhr, die anderen stehen Leer)
"Timerstatus" hier zeigt er "Wert 2" (Welche Werte müsste ich da in der Werteliste eintragen?)
Was noch fehlt ist der Zustand der Messer. Es kommt quality, hours und days. Bin mir nicht sicher ob und wenn, welche du davon brauchst bzw. haben möchtest. Wäre dann auch dankbar für Vorschläge zur Benennung der Variable.
Ich finde die Benennungen in Robonect eh nicht schlecht, z.B "Messerqualität":93% etc.
Für "Status seit" könnte man auch die Sekunden umrechnen in ein lesbareres Format. z.B. 87753 Sekunden als "01:22:33"
Das klingt doch super, kann man das übers Skript lösen oder muss man das irgendwie in der CCU umrechnen?

Danke, viele Grüße! Peter
Dateianhänge
Mähschwein.PNG

Antworten

Zurück zu „Homematic-Nutzer“