[v0.4.5] Homematic-Einbindung XML-Version

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

Moderator: Lampi

mrlee
sehr erfahrener Forum-Nutzer
Beiträge: 121
Registriert: Do 10. Mär 2016, 17:56
Mäher: Gardena R40Li
Firmware des Mähers (MSW): MSW 4.xx.xx
Herstellungsjahr: 2012
Robonect-Modul: Robonect H30x (Rev.0)
Robonect Firmware: 1.0b2

[v0.4.5] Homematic-Einbindung XML-Version

Beitrag von mrlee »

Moin!

Irgendwie wird der Ur-Thread langsam unübersichtlich.
Ich versuche hier mal "meine Version" kontinuierlich zu pflegen da sich die API ja doch noch etwas ab und an erweitert.

Die gesamte Version basiert auf der Version von Timberland.

aktuell basiert die Version auf:
  • system.exec
  • einem CuxD Ping-Device an dem die Variablen hängen
ToDo:
  • HM-Variablen deklarierbar

Jeweils anzupassen:
  • Variablennamen wenn geändert (suchen&ersetzen)
  • IP-Adresse !
Status des Mähers abfragen

Variablen:
variablen.PNG
variablen.PNG (24.48 KiB) 5419 mal betrachtet
Zusätzlich noch "Dolly-WLAN", Typ Zahl


Programm:
alle x minuten script ausführen

Script:

Code: Alles auswählen

! Orginal von timberland http://www.robonect.de/viewtopic.php?f=13&t=77
! Erweitert Mr.Lee
! v 0.1: 
! - Variablen nicht mehr als string sondern Zahl oder Werteliste
! - Anpassungen beim Erstellen substring
! v 0.2: (Firmware 0.5)
! - Erweiterung um Status Timer, nächster Timer
! v 0.3: (Firmware0.7)
! - Erweiterung um letzte Laufzeit "Duration"
! - umgestellt auf xml 
!v 0.4: (Firmware 0.8)
!- Bugfix Timer Date
!v 0.4.1: (Firmware 0.8)
!- Bugfix Timer Start
!v 0.4.2
! _Variablen angepasst
!v 0.4.4 Version 0.8RC5
!- Timer Ende korrigiert
!v 0.4.5
! - WLAN ergänzt


string Url='http://192.168.1.98/xml?cmd=status';
var posStart;
var posEnd;
var substring;
var posValueStart;
var posValueEnd;
string stderr;
var stdout;
system.Exec("wget -q -O - "#Url, &stdout, &stderr);
WriteLine("Abrufen");
WriteLine(stdout);

!Status auslesen
posStart = '<status><status>';
posEnd = '/status';
posValueStart = stdout.Find(posStart) + posStart.Length();
posValueEnd = stdout.Find(posEnd)-posValueStart+1;
substring = stdout.Substr(posValueStart, posValueEnd) ;   
dom.GetObject('Dolly-Status').State(substring);
WriteLine('Status: ' # substring);

!Laufzeit auslesen
posStart = '<duration>';
posEnd = '/duration';
posValueStart = stdout.Find(posStart) + posStart.Length();
posValueEnd = stdout.Find(posEnd)-posValueStart+1;
substring = stdout.Substr(posValueStart, posValueEnd);
substring = substring.ToInteger()/60;
dom.GetObject('Dolly-aktuelle Zeit').State(substring);
WriteLine('Laufzeit: '#substring);

!Modus auslesen
posStart = '<mode>';
posEnd = '/mode';
posValueStart = stdout.Find(posStart) + posStart.Length();
posValueEnd = stdout.Find(posEnd)-posValueStart+1;
substring = stdout.Substr(posValueStart, posValueEnd) ;     
dom.GetObject('Dolly-Modus').State(substring);
WriteLine('Modus: ' # substring);

!Battery auslesen
posStart = '<battery>';
posEnd = '/battery';
posValueStart = stdout.Find(posStart) + posStart.Length();
posValueEnd = stdout.Find(posEnd)-posValueStart+1;
substring = stdout.Substr(posValueStart, posValueEnd) ;   
dom.GetObject('Dolly-Battery').State(substring);
WriteLine('Battery: '# substring);


!Betriebszeit auslesen
posStart = '<hours>';
posEnd = '/hours';
posValueStart = stdout.Find(posStart) + posStart.Length();
posValueEnd = stdout.Find(posEnd)-posValueStart+1;
substring = stdout.Substr(posValueStart, posValueEnd) ;    
dom.GetObject('Dolly-Betriebsstunden').State(substring.ToString(1));
WriteLine('Betriebsstunden' # substring);

!Timerstatatus auslesen
posStart = '<timer><status>';
posValueStart = stdout.Find(posStart) + posStart.Length();
substring = stdout.Substr(posValueStart, 1) ;    
dom.GetObject('Dolly-Timer').State(substring);

if (substring.ToInteger()==2) {
	posStart = '<next><date>';
	posEnd = '/date';
	posValueStart = stdout.Find(posStart) + posStart.Length();
	posValueEnd = stdout.Find(posEnd)-posValueStart+1;
	substring = stdout.Substr(posValueStart, posValueEnd) ; 
	dom.GetObject('Dolly-Timer_Date').State(substring);
        WriteLine('Timer_Date: '# substring);

	posStart = '<time>';
	posEnd = '/time';
	posValueStart = stdout.Find(posStart) + posStart.Length();
	posValueEnd = stdout.Find(posEnd)-posValueStart+1;
	substring = stdout.Substr(posValueStart, posValueEnd) ; 
	dom.GetObject('Dolly-Timer_Time').State(substring);
    WriteLine('Timer_Time: '# substring);
} else {
	if (substring.ToInteger()==0) {
		dom.GetObject('Dolly-Timer_Date').State("deaktiviert");
		dom.GetObject('Dolly-Timer_Time').State("deaktiviert"); 
	} else {
		dom.GetObject('Dolly-Timer_Date').State("aktiv");
		dom.GetObject('Dolly-Timer_Time').State("aktiv"); 
	}
}
!WLANauslesen
posStart = '<signal>';
posEnd = '/signal';
posValueStart = stdout.Find(posStart) + posStart.Length();
posValueEnd = stdout.Find(posEnd)-posValueStart+1;
substring = stdout.Substr(posValueStart, posValueEnd) ;     
dom.GetObject('Dolly-WLAN').State(substring);
WriteLine('WLAN: ' # substring);

Visualisierung:
viewtopic.php?f=13&t=362&p=2656#p2655

Modus des Mähers setzen
Je Modus eine Virtuelle Taste als auslösen (oder halt Events...Terrassentür auf löst Modus Feierabend aus etc...)

Code: Alles auswählen

string stderr;
string stdout;
string url="http://192.168.1.98/xml?cmd=mode&mode=auto";
system.Exec("wget -q -O - "#url, &stdout, &stderr);
Jeweiligen Modus findet man in der API-Doku.


Auto-Home bei manuellem Betrieb
viewtopic.php?f=13&t=185

Jobs definieren und starten
viewtopic.php?f=13&t=141&p=855#p855

Fehler abfragen und mail senden
..noch nicht umgesetzt..

bis denne
Mr.Lee
Zuletzt geändert von mrlee am Di 21. Jun 2016, 09:48, insgesamt 9-mal geändert.

michael
erfahrener Forum-Nutzer
Beiträge: 62
Registriert: Do 12. Mai 2016, 20:28

Re: Homematic-Einbindung XML-Version

Beitrag von michael »

Hallo Mr. Lee,

eine brauchbare Script version hier zentral zu pflegen finde eine tolle und Unterstützenswerte Idee von Dir!

Ich gehe mal davon aus, das Du den ersten Beitrag immer aktualisierst, oder? :roll:

Könntest Du im Script den Namen Dolly durch eine Variable ersetzen, die oben gesetzt wird?

Den Namen anzupassen ist zwar keine Unmöglichkeit, wäre aber irgendwie toll, wenn das nur einmal oben passierte.

Sollte ja mit dem hässlichen # als String concat operator problemlos gehen...

Gruß
Michael

PS: Ich freue mich auf den Update von dem Beitrag, denn ich bin mir nicht sicher Welchen Typ die Systemvariablen haben.
Robonect H30x Firmware V0.9 (Final)
Automower: R40Li MSW-Version: 5.01.00 SUB-Version: 5.00.00 Software: OpenHab 2.0

mrlee
sehr erfahrener Forum-Nutzer
Beiträge: 121
Registriert: Do 10. Mär 2016, 17:56
Mäher: Gardena R40Li
Firmware des Mähers (MSW): MSW 4.xx.xx
Herstellungsjahr: 2012
Robonect-Modul: Robonect H30x (Rev.0)
Robonect Firmware: 1.0b2

Re: Homematic-Einbindung XML-Version

Beitrag von mrlee »

Moin!

Ja, das ist das Ziel, wir sollten pro Script einen Thret haben ...oben mache ich morgen erstmal fertig :-)

Variablen kommen noch und Namen kann ich immerhin sauber markieren :-)

bis denne
Mr.Lee

michael
erfahrener Forum-Nutzer
Beiträge: 62
Registriert: Do 12. Mai 2016, 20:28

Re: Homematic-Einbindung XML-Version

Beitrag von michael »

Falls ich mich blöd ausgedrückt habe; ich meinte sowas:

Code: Alles auswählen

! Orginal von timberland http://www.robonect.de/viewtopic.php?f=13&t=77
! Erweitert Mr.Lee
! v 0.1: 
! - Variablen nicht mehr als string sondern Zahl oder Werteliste
! - Anpassungen beim Erstellen substring
! v 0.2: (Firmware 0.5)
! - Erweiterung um Status Timer, nächster Timer
! v 0.3: (Firmware0.7)
! - Erweiterung um letzte Laufzeit "Duration"
! - umgestellt auf xml 
!v 0.4: (Firmware 0.8)
!- Bugfix Timer Duration



string Url='http://Rasi.local/xml?cmd=status';
string NamePrefix='Rasi'; 


var stdout;
var posStart;
var posEnd;
var substring;
var posValueStart;
var posValueEnd;
var posValue;
string stderr;
string stdout;
string pos;
string substring2;
system.Exec("wget -q -O - "#Url, &stdout, &stderr);
WriteLine("Abrufen");
WriteLine(stdout);

!Status auslesen
posStart = '<status><status>';
posEnd = '/status';
posValueStart = stdout.Find(posStart) + posStart.Length();
posValueEnd = stdout.Find(posEnd)-posValueStart+1;
substring = stdout.Substr(posValueStart, posValueEnd) ;   
dom.GetObject(NamePrefix#'-Status').State(substring);
WriteLine(NamePrefix#'-Status');
WriteLine(posValueStart);
WriteLine(posValueEnd);
WriteLine(substring);

!Laufzeit auslesen
posStart = '<duration>';
posEnd = '/duration';
posValueStart = stdout.Find(posStart) + posStart.Length();
posValueEnd = stdout.Find(posEnd)-posValueStart+1;
substring = stdout.Substr(posValueStart, posValueEnd);
substring = substring.ToInteger()/60;
dom.GetObject(NamePrefix#'-letzte Zeit').State(substring);
WriteLine(posValueStart);
WriteLine(posValueEnd);
WriteLine(substring);

!Modus auslesen
posStart = '<mode>';
posEnd = '/mode';
posValueStart = stdout.Find(posStart) + posStart.Length();
posValueEnd = stdout.Find(posEnd)-posValueStart+1;
substring = stdout.Substr(posValueStart, posValueEnd) ;     
dom.GetObject(NamePrefix#'-Modus').State(substring);
WriteLine(posValueStart);
WriteLine(posValueEnd);
WriteLine(substring);

!Battery auslesen
posStart = '<battery>';
posEnd = '/battery';
posValueStart = stdout.Find(posStart) + posStart.Length();
posValueEnd = stdout.Find(posEnd)-posValueStart+1;
substring = stdout.Substr(posValueStart, posValueEnd) ;   
dom.GetObject(NamePrefix#'-Battery').State(substring);
WriteLine(posValueStart);
WriteLine(posValueEnd);
WriteLine(substring);


!Betriebszeit auslesen
posStart = '<hours>';
posEnd = '/hours';
posValueStart = stdout.Find(posStart) + posStart.Length();
posValueEnd = stdout.Find(posEnd)-posValueStart+1;
substring = stdout.Substr(posValueStart, posValueEnd) ;    
dom.GetObject(NamePrefix#'-Laufzeit').State(substring.ToString(1));
WriteLine(posValueStart);
WriteLine(posValueEnd);
WriteLine(substring);

!Timerstatatus auslesen
posStart = '<timer><status>';
posValueStart = stdout.Find(posStart) + posStart.Length();
substring = stdout.Substr(posValueStart, 1) ;    
dom.GetObject(NamePrefix#'-Timer').State(substring);

if (substring.ToInteger()==2) {
   posStart = '<next><date>';
   posEnd = '\date';
   pos = stdout.Find(posStart) + posStart.Length();
!oben +1 entfernt
   substring = stdout.Substr(pos, 10).StrValueByIndex(posEnd, 0) ;  
   dom.GetObject(NamePrefix#'-Timer_Date').State(substring);

   posStart = '<time>';
   posEnd = '\time';
   pos = stdout.Find(posStart) + posStart.Length()+1;
   substring = stdout.Substr(pos, 10).StrValueByIndex(posEnd, 0) ;  
   dom.GetObject(NamePrefix#'-Timer_Time').State(substring);
} else {
   if (substring.ToInteger()==0) {
      dom.GetObject(NamePrefix#'-Timer_Date').State("deaktiviert");
      dom.GetObject(NamePrefix#'-Timer_Time').State("deaktiviert"); 
   } else {
      dom.GetObject(NamePrefix#'-Timer_Date').State("aktiv");
      dom.GetObject(NamePrefix#'-Timer_Time').State("aktiv"); 
   }
}
Robonect H30x Firmware V0.9 (Final)
Automower: R40Li MSW-Version: 5.01.00 SUB-Version: 5.00.00 Software: OpenHab 2.0

mrlee
sehr erfahrener Forum-Nutzer
Beiträge: 121
Registriert: Do 10. Mär 2016, 17:56
Mäher: Gardena R40Li
Firmware des Mähers (MSW): MSW 4.xx.xx
Herstellungsjahr: 2012
Robonect-Modul: Robonect H30x (Rev.0)
Robonect Firmware: 1.0b2

Re: Homematic-Einbindung XML-Version

Beitrag von mrlee »

Moin!

technisch cool, aber...da man sich die Variablen ja eh anlegen muß und vermutlich jeder gerne die eigenen variablenbezeichnungen haben möchte macht das glaube ich wenig Sinn...

Ich mache erstmal die DOku hier fertig und dann sehen wir weiter, ok?

bis denne
Mr.Lee

Cool-Mann
Forum-Nutzer
Beiträge: 13
Registriert: So 9. Okt 2016, 21:35

Re: [v0.4.5] Homematic-Einbindung XML-Version

Beitrag von Cool-Mann »

Hallo
Danke für das Skript. Bei mir wird der Status nicht angezeigt.

Gruss aus Asbach
Jürgen
Husquana 330x, MSW-Software: 430X, MSW-Version: 7.04.00, SUB-Version: 6.00.00
Robonect Hx Rev.2, Firmware Release V0.9 RC2

Benutzeravatar
PaulMerkelbach
Forum-Nutzer
Beiträge: 20
Registriert: Di 20. Sep 2016, 15:42
Mäher: Gardena R40Li
Firmware des Mähers (MSW): MSW 6.xx.xx
Herstellungsjahr: 2016
Robonect-Modul: Robonect Hx (Rev.1)
Robonect Firmware: V 1.2

Re: [v0.4.5] Homematic-Einbindung XML-Version

Beitrag von PaulMerkelbach »

kommt denn bei der Eingabe im Browser eine sinnvolle Antwort ?

also:
http://DEINE_IP/xml?cmd=status

Paul
"Schäfchen" Gleitteller, FTA-Heckrad, Hütte
API-Steuerung mit Homematic

Cool-Mann
Forum-Nutzer
Beiträge: 13
Registriert: So 9. Okt 2016, 21:35

Re: [v0.4.5] Homematic-Einbindung XML-Version

Beitrag von Cool-Mann »

Der Status wird korrekt ausgegeben.
Die Variablen werden bis auf "Status" auch richtig gefüllt.

Gruss aus Asbach
Jürgen
Husquana 330x, MSW-Software: 430X, MSW-Version: 7.04.00, SUB-Version: 6.00.00
Robonect Hx Rev.2, Firmware Release V0.9 RC2

Benutzeravatar
PaulMerkelbach
Forum-Nutzer
Beiträge: 20
Registriert: Di 20. Sep 2016, 15:42
Mäher: Gardena R40Li
Firmware des Mähers (MSW): MSW 6.xx.xx
Herstellungsjahr: 2016
Robonect-Modul: Robonect Hx (Rev.1)
Robonect Firmware: V 1.2

Re: [v0.4.5] Homematic-Einbindung XML-Version

Beitrag von PaulMerkelbach »

ich arbeite mit einer json-Abfrage und CUxD
nachstehend der Teil meines Scripts, die Status-Variable habe ich als M_status definiert und den Text-Umsetzung als M_status_string, im Bedarfsfall also anpassen

Quellen:
überwiegend Auswertung (Homematic - Einbindung): czierl 2016-05-27
viewtopic.php?f=13&t=77&p=2299#p2299


die Variable stout ist die Antwort vom Mäher

Code: Alles auswählen

pos=0;
posStart = '{"status": ';
posEnd = ', "mode';
pos = stdout.Find(posStart) + posStart.Length();
if(stdout.Find(posStart)>0)
{
substring = stdout.Substr(pos, 1).StrValueByIndex(posEnd, 0) ; 
dom.GetObject('M_status').State(substring);

! nur für Chart CUxD 
dom.GetObject("CUxD.CUX2801001:1.LOGIT").State("M_status;"#substring.ToInteger());

if (substring == 0) {dom.GetObject('M_status_string').State("Status wird ermittelt");}
if (substring == 1) {dom.GetObject('M_status_string').State("parkt");}
if (substring == 2) {dom.GetObject('M_status_string').State("mäht");}
if (substring == 3) {dom.GetObject('M_status_string').State("sucht die Ladestation");}
if (substring == 4) {dom.GetObject('M_status_string').State("lädt auf");}
if (substring == 5) {dom.GetObject('M_status_string').State("sucht");}
if (substring == 8) {dom.GetObject('M_status_string').State("Schleifensignal verloren");}
if (substring == 16) {dom.GetObject('M_status_string').State("abgeschaltet");}
if (substring == 17) {dom.GetObject('M_status_string').State("schläft");}
}
else
{
dom.GetObject('M_status').State('Variable nicht gesetzt');
}
viel Spass beim tüfteln

Paul
"Schäfchen" Gleitteller, FTA-Heckrad, Hütte
API-Steuerung mit Homematic

Cool-Mann
Forum-Nutzer
Beiträge: 13
Registriert: So 9. Okt 2016, 21:35

Re: [v0.4.5] Homematic-Einbindung XML-Version

Beitrag von Cool-Mann »

Die Ausgabe lautet:
<robonect><successful>true</successful><name>Husky</name><status><status>17</status><stopped>false</stopped><duration>723</duration><mode>2</mode><battery>100</battery><hours>1412</hours></status><timer><status>0</status></timer><wlan><signal>-75</signal></wlan></robonect>

Die Werteliste in derVariabel lautet:
Status wird ermittelt; parkt; mäht; sucht die Ladestation; lädt; sucht (wartet auf das Umsetzen im manuellen Modus); Fehlerstatus; Schleifensignal verloren; ; ; ; ; ; ; ; abgeschaltet; schläft

Ich vermute das in dem Skript zweistellige Zahlen nicht aufgelösst werden.

Gruss aus Asbach
Jürgen
Husquana 330x, MSW-Software: 430X, MSW-Version: 7.04.00, SUB-Version: 6.00.00
Robonect Hx Rev.2, Firmware Release V0.9 RC2

Antworten

Zurück zu „Homematic-Nutzer“