Aufgrund derzeit hohem Spamaufkommens werden neue Nutzer sehr restriktiv behandelt. Nach kurzer "Bewährungszeit" hat man als normaler Nutzer weitreichende Rechte und benötigt auch kein Captcha mehr.
.
Nutzer, die sich danach dennoch als Spammer oder Trolle erweisen, können jederzeit wieder auf diesen Status zurückgesetzt oder gebannt werden.
Dasselbe gilt für Versuche, politische Überzeugungen kund zu tun, egal aus welcher Richtung diese kommen.
.
.:!: Achtung! Derzeit ist Robonect (noch) nicht mit dem Automower 305 ab Baujahr 2020 zusammen mit der neuen Mäher-FW MSW 41.4.0 kompatibel!
Aber: Im DailyBuild ist ein Patch enthalten, der getestet werden kann! (Stand 15.02.2024)
.
.Du hast Deinen Gardena-Mäher auf die Gardena-Firmware von 2023 aktualisiert?
.:arrow: Testmöglichkeit für das Daily Build.

Das FW-Update am Mäher wird dennoch nicht empfohlen, da das Daily Build nach aktuellen Berichten von Beta-Testern noch keine vollständige Kompatibilität gewährleisten kann! (Stand: 15.02.2024)
Wir empfehlen, das Gardena-Update noch nicht durchzuführen!

.
.

Homematic für Dummies

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

Moderator: Lampi

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
hat sich bedankt: 2 Male

Re: Homematic für Dummies

Beitrag von PaulMerkelbach »

meinst du die Minuten Mähzeit innerhalb des eingestellten Timer-Intervalls ?

du kannst ja alle 15 Minuten abrufen (so mach ich es) und die "duration" auswerten.

Entweder er mäht noch
oder er lädt schon wieder
oder ist geladen

Als Ungenauigkeit bleiben dann nur die "Such"-Minuten (bei mir 1-4 Minuten)
Wenn man jedoch über den Webbrowser abruft, wird die duration mit jedem Aufruf wieder auf null gesetzt

meine typische Mähdauer ist etwa 90 Minuten, Ladezeit etwa 60 Minuten

Mit niedriger Mähzeit anfangen. Nur wenn einzelne Büschel stehen bleiben: Mähzeit etwas erhöhen
"Schäfchen" Gleitteller, FTA-Heckrad, Hütte
API-Steuerung mit Homematic

Benutzeravatar
joe1313
Forum-Nutzer
Beiträge: 13
Registriert: Mo 14. Nov 2016, 21:08
Mäher: Gardena R40Li
Firmware des Mähers (MSW): MSW 2.xx.xx
Herstellungsjahr: 2011
Robonect-Modul: Robonect Hx (Rev.2)
Robonect Firmware: -V1.1b

Re: Homematic für Dummies

Beitrag von joe1313 »

Hallo,
ich habe es erstmal wie folgt gelöst:

Fensterkontakt an der Ladestation gibt mir Auskunft , ob er in der Station steht. - wenn NEIN - dann Statusabfrage
alle 1 min.
Bei Status "maeht", Zeit gespeichert und wenn Status "maeht" nicht mehr vorhanden Endzeit - Differenz ist Maehzeit.
Automatische Statusabfrage beendet.

Homematic-Fan
Forum-Anfänger
Beiträge: 1
Registriert: Di 20. Sep 2016, 11:32

Re: Homematic für Dummies

Beitrag von Homematic-Fan »

HMROHAJUE hat geschrieben:
So 2. Apr 2017, 21:13
Hallo Paul,

nachdem mir die Sache keine Ruhe gelassen habe, bin ich die Punkte nochmals Stück für Stück durchgegangen. Ergebnis ist Dein erster Script mit 2 Änderungen. In Zeile 3 des nachfolgenden Ausschnitt Deines Scripts habe ich das LEER (posEnd = ',';)vor dem Komma entfernt. In Zeile 6 die Anzahl der Stellen von 1 auf 2 (substring = stdout.Substr(pos, 2).....)erhöht. Wobei es keine Rolle spielt, ob 2 oder mehr! Die Auswertung erfolgt jetzt genau bis zum Komma.

pos=0;
posStart = '{"Status": ';
posEnd = ' ,';
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);
WriteLine("M_status: " # substring);

Mit diesen Änderungen erfolgt jetzt die Befüllung der Systemvariablen wie gewünscht. Ich hoffe das es so bleib!

Wünsche noch einen schönen Abend!
Habe noch einen Fehler gefunden, in der 6. Zeile fehlt {

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

Mit dieser Änderung läuft das Script dann einwandfrei.
Meine auf meine Bedürfnisse geändertes Script:

Code: Alles auswählen

!RoboDolly Statusabfrage V17 mit CUxD 2017-05-13

! Basis Zeilen für CUxD Abfrage (Projekt Rasenboter): Tobias78 2016-09-18
! http://homematic-forum.de/forum/viewtopic.php?f=19&t=32555&p=309715#p309715 

! Basis  überwiegend Auswertung (Homematic - Einbindung): czierl 2016-05-27
! http://robonect.de/viewtopic.php?f=13&t=77&p=2299#p2299
!als Systemvariablen sind in Homematic angelegt:
!RoboDolly_Modus
!RoboDolly_Modus_Text
!RoboDolly_Stop
!RoboDolly_Batterie
!RoboDolly_Zeit_in_Status
!RoboDolly_Laufzeit
!RoboDolly_Status
!RoboDolly_Status_Text
!RoboDolly_Timer_Status
!RoboDolly_Timer_Datum
!RoboDolly_Timer_Zeit
!RoboDolly_Fehler
!RoboDolly_LastSync
!RoboDolly_Wlan

string url='http://192.168.xxx.yyy/json?cmd=status';

!löscht vorherige Abfrage
var stdout="";
var posStart;
var posEnd;
var substring;
var batt;
var temp;
string stderr;
string stdout;
string pos;

dom.GetObject("CUxD.CUX2801001:7.CMD_SETS").State("wget -q -O - '"#url#"'");
dom.GetObject("CUxD.CUX2801001:7.CMD_QUERY_RET").State(1);
string stdout= dom.GetObject("CUxD.CUX2801001:7.CMD_RETS").State();
WriteLine("Antwort: " # stdout);

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

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

if (substring == 0) {dom.GetObject('RoboDolly_Status_Text').State("Status wird ermittelt");}
if (substring == 1) {dom.GetObject('RoboDolly_Status_Text').State("parkt");}
if (substring == 2) {dom.GetObject('RoboDolly_Status_Text').State("mäht");}
if (substring == 3) {dom.GetObject('RoboDolly_Status_Text').State("sucht die Ladestation");}
if (substring == 4) {dom.GetObject('RoboDolly_Status_Text').State("lädt auf");}
if (substring == 5) {dom.GetObject('RoboDolly_Status_Text').State("sucht");}
if (substring == 8) {dom.GetObject('RoboDolly_Status_Text').State("Schleifensignal verloren");}
if (substring == 16) {dom.GetObject('RoboDolly_Status_Text').State("abgeschaltet");}
if (substring == 17) {dom.GetObject('RoboDolly_Status_Text').State("schläft");}
}
else
{
dom.GetObject('RoboDolly_Status_Text').State("ausgeschaltet ?");
}

string temp = dom.GetObject('RoboDolly_Status_Text').Value();
WriteLine("RoboDolly_Status_Text: " # temp);

pos=0;
posStart = '"stopped": ';
posEnd = '", duration"';
pos = stdout.Find(posStart) + posStart.Length();
if(stdout.Find(posStart)>0)
{
substring = stdout.Substr(pos, 5).StrValueByIndex(posEnd, 0) ; 
!dom.GetObject('RoboDolly_Stop').State(substring);
if (substring == "true") {dom.GetObject('RoboDolly_Stop').State("true");}
if (substring == "false") {dom.GetObject('RoboDolly_Stop').State("false");};
WriteLine("Stop: " # substring);
}
else
{
dom.GetObject('RoboDolly_Stop').State('-');
}

pos=0;
posStart = '"duration":';
posEnd = ',';
pos = stdout.Find(posStart) + posStart.Length();
if(stdout.Find(posStart)>0)
{
substring = stdout.Substr(pos, 10).StrValueByIndex(posEnd, 0) ; 
!substring ist hier vom Typ nicht String !!!
substring = substring.ToInteger()/60;  
WriteLine(substring # " Minuten RoboDolly_Zeit_in_Status");
var zahl = substring.ToInteger();
WriteLine("zahl 0:" # zahl);
var h = (zahl / 60).ToInteger();
WriteLine("zahl h Gesamtstunden: " # h);
var d = (h / 24).ToInteger();
WriteLine("zahl d Tage:" # d);
zahl = (substring - (d * 24 * 60)).ToInteger();
WriteLine("zahl restl.Minuten: " # zahl);
h = (zahl / 60).ToInteger();
zahl = (zahl - (h * 60).ToInteger() );
WriteLine("zahl Minuten:" # zahl);

string substring = (d # " Tage " # h # " Std. " # zahl #" Min.");

WriteLine("RoboDolly_Zeit_in_Status: " # substring);

dom.GetObject("RoboDolly_Zeit_in_Status").State(substring);
}
else
{
dom.GetObject('RoboDolly_Zeit_in_Status').State('-');
}

pos=0;
posStart = '"mode": ';
posEnd = ', "batt';
pos = stdout.Find(posStart) + posStart.Length();
if(stdout.Find(posStart)>0)
{
substring = stdout.Substr(pos, 3).StrValueByIndex(posEnd, 0) ; 
substring = substring.ToInteger();
dom.GetObject('RoboDolly_Modus').State(substring.ToInteger() );
WriteLine("RoboDolly_Modus: " # substring);
if (substring == 0) {dom.GetObject('RoboDolly_Modus_Text').State("Auto");}
if (substring == 1) {dom.GetObject('RoboDolly_Modus_Text').State("Manuell");}
if (substring == 2) {dom.GetObject('RoboDolly_Modus_Text').State("Home");}
if (substring == 3) {dom.GetObject('RoboDolly_Modus_Text').State("Demo");}
}
else
{
dom.GetObject('RoboDolly_Modus').State('-');
}

var temp = dom.GetObject('RoboDolly_Modus_Text').Value();
WriteLine("RoboDolly_Modus_Text: " # temp);

pos=0;
posStart = '"battery": ';
posEnd = ', "';
pos = stdout.Find(posStart) + posStart.Length();
substring = stdout.Substr(pos, 10).StrValueByIndex(posEnd, 0) ;   
var temp = substring;
substring = substring + '%';
if(stdout.Find(posStart)>0)
{
WriteLine("Battery " # substring);
dom.GetObject('RoboDolly_Batterie').State(substring.ToString(1));
!schreibt log in CUxD
dom.GetObject("CUxD.CUX2801001:7.LOGIT").State("RoboDolly_Batterie;"#temp.ToString(1));
}
else
{
dom.GetObject('RoboDolly_Batterie').State(' ');
}

pos=0;
posStart = '"hours": ';
posEnd = '}';
pos = stdout.Find(posStart) + posStart.Length();
if(stdout.Find(posStart)>0)
{
substring = stdout.Substr(pos, 10).StrValueByIndex(posEnd, 0) ;   
substring =substring + 'h';
dom.GetObject('RoboDolly_Laufzeit').State(substring.ToString(1));
}
else
{
dom.GetObject('RoboDolly_Laufzeit').State(' ');
}

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

if (substring == 0) {dom.GetObject('RoboDolly_Timer_Status').State("Deaktiviert");}
if (substring == 1) {dom.GetObject('RoboDolly_Timer_Status').State("Aktiv");}
if (substring == 2) {dom.GetObject('RoboDolly_Timer_Status').State("Standby");}
}
else
{
dom.GetObject('RoboDolly_Timer_Status').State(' ');
}

var temp = dom.GetObject('RoboDolly_Timer_Status').Value();
WriteLine("RoboDolly_Timer_Status: " # temp);

pos=0;
posStart = '"next": {"date": "';
posEnd = '", "time":';
pos = stdout.Find(posStart) + posStart.Length();
if(stdout.Find(posStart)>0)
{
substring = stdout.Substr(pos, 10).StrValueByIndex(posEnd, 0) ;   
dom.GetObject('RoboDolly_Timer_Datum').State(substring.ToString(1));
}
else
{
dom.GetObject('RoboDolly_Timer_Datum').State('-');
}

pos=0;
posStart = '"time": "';
posEnd = '", "unix":';
pos = stdout.Find(posStart) + posStart.Length();
if(stdout.Find(posStart)>0)
{
substring = stdout.Substr(pos, 8).StrValueByIndex(posEnd, 0) ;
dom.GetObject('RoboDolly_Timer_Zeit').State(substring.ToString(1) );
}
else
{
dom.GetObject('RoboDolly_Timer_Zeit').State('-');
}

pos=0;
posStart = '"error_message": "';
posEnd = '", "date"';
pos = stdout.Find(posStart) + posStart.Length();
if(stdout.Find(posStart)>0)
{
substring = stdout.Substr(pos, 8).StrValueByIndex(posEnd, 0) ;
dom.GetObject('RoboDolly_Fehler').State(substring.ToString(1));
}
else
{
dom.GetObject('RoboDolly_Fehler').State('---');
}

pos=0;
posStart = 'wlan": {"signal":';
posEnd = '}';
pos = stdout.Find(posStart) + posStart.Length();
if(stdout.Find(posStart)>0)
{
substring = stdout.Substr(pos, 10).StrValueByIndex(posEnd, 0) ;   
dom.GetObject('RoboDolly_Wlan').State(substring.ToString() );
}
else
{
dom.GetObject('RoboDolly_Wlan').State(' ');
}

var temp = system.Date("%d.%m.%Y %H:%M:%S");
dom.GetObject('RoboDolly_LastSync').State(temp.ToString() );
WriteLine("lastsync " # temp);

Gruß Andi

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
hat sich bedankt: 2 Male

Re: Homematic für Dummies

Beitrag von PaulMerkelbach »

Ich habe das Skript zur Statusabfrage überarbeitet.

wesentliche Änderungen:

1. M_status #7 fehlte und 2-stellige Werte wurden nicht korrekt ausgewertet
2. stopped wurde nicht korrekt ausgewertet
3. error message wurde nicht korrekt ausgewertet

Code: Alles auswählen


var posEnd;
var substring;
var batt;
var temp;
string stderr;
string stdout;
string pos;

dom.GetObject("CUxD.CUX2801001:1.CMD_SETS").State("wget -q -O - '"#url#"'");
dom.GetObject("CUxD.CUX2801001:1.CMD_QUERY_RET").State(1);
string stdout= dom.GetObject("CUxD.CUX2801001:1.CMD_RETS").State();
WriteLine("Antwort: " # stdout);

pos=0;
posStart = '{"status": ';
posEnd = ' ,';
pos = stdout.Find(posStart) + posStart.Length();
if(stdout.Find(posStart)>0)
{
substring = stdout.Substr(pos, 1).StrValueByIndex(posEnd, 0) ; 
!substring = stdout.Substr(pos, 2).StrValueByIndex(posEnd, 0) ; 
dom.GetObject('M_status').State(substring);
WriteLine("M_status: " # 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 == 7) {dom.GetObject('M_status_string').State("befindet sich im Fehlerstatus");}
if (substring == 8) {dom.GetObject('M_status_string').State("Schleifensignal verloren");}

substring = stdout.Substr(pos, 2).StrValueByIndex(posEnd, 0) ; 

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_string').State("ausgeschaltet ?");
}

string temp = dom.GetObject('M_status_string').Value();
WriteLine("M_status_string: " # temp);

pos=0;
posStart = '"stopped": ';
posEnd = '", duration"';
pos = stdout.Find(posStart) + posStart.Length();
if(stdout.Find(posStart)>0)
{
substring = stdout.Substr(pos, 4).StrValueByIndex(posEnd, 0) ; 
!dom.GetObject('M_stop j/n').State(substring);
if (substring == "true") {dom.GetObject('M_stop j/n').State("true");}
if (substring == "fals") {dom.GetObject('M_stop j/n').State("false");};
WriteLine("Stop: " # substring);
}
else
{
dom.GetObject('M_stop j/n').State('-');
}

pos=0;
posStart = '"duration":';
posEnd = ',';
pos = stdout.Find(posStart) + posStart.Length();
if(stdout.Find(posStart)>0)
{
substring = stdout.Substr(pos, 10).StrValueByIndex(posEnd, 0) ; 
!substring ist hier vom Typ nicht String !!!
substring = substring.ToInteger()/60;  
WriteLine(substring # " Minuten M_duration");
var zahl = substring.ToInteger();
WriteLine("zahl 0:" # zahl);
var h = (zahl / 60).ToInteger();
WriteLine("zahl h Gesamtstunden: " # h);
var d = (h / 24).ToInteger();
WriteLine("zahl d Tage:" # d);
zahl = (substring - (d * 24 * 60)).ToInteger();
WriteLine("zahl restl.Minuten: " # zahl);
h = (zahl / 60).ToInteger();
zahl = (zahl - (h * 60).ToInteger() );
WriteLine("zahl Minuten:" # zahl);

string substring = (d # " Tage " # h # " Stunden " # zahl #" Minuten");

WriteLine("M_duration: " # substring);

dom.GetObject("M_duration").State(substring);
}
else
{
dom.GetObject('M_duration').State('-');
}

pos=0;
posStart = '"mode": ';
posEnd = ', "batt';
pos = stdout.Find(posStart) + posStart.Length();
if(stdout.Find(posStart)>0)
{
substring = stdout.Substr(pos, 3).StrValueByIndex(posEnd, 0) ; 
substring = substring.ToInteger();
dom.GetObject('M_mode').State(substring.ToInteger() );
WriteLine("M_mode: " # substring);
if (substring == 0) {dom.GetObject('M_mode_string').State("Modus Auto");}
if (substring == 1) {dom.GetObject('M_mode_string').State("Modus Manuell");}
if (substring == 2) {dom.GetObject('M_mode_string').State("Modus Home");}
if (substring == 3) {dom.GetObject('M_mode_string').State("Modus Demo");}
}
else
{
dom.GetObject('M_mode').State('-');
}

var temp = dom.GetObject('M_mode_string').Value();
WriteLine("M_mode_string: " # temp);

pos=0;
posStart = '"battery": ';
posEnd = ', "';
pos = stdout.Find(posStart) + posStart.Length();
substring = stdout.Substr(pos, 10).StrValueByIndex(posEnd, 0) ;   
var temp = substring;
substring = substring + '%';
if(stdout.Find(posStart)>0)
{
WriteLine("Battery: " # substring);
dom.GetObject('M_battery').State(substring.ToString(1));
!schreibt log in CUxD
dom.GetObject("CUxD.CUX2801001:1.LOGIT").State("M_battery;"#temp.ToString(1));
}
else
{
dom.GetObject('M_battery').State(' ');
}

pos=0;
posStart = '"hours": ';
posEnd = '}';
pos = stdout.Find(posStart) + posStart.Length();
if(stdout.Find(posStart)>0)
{
substring = stdout.Substr(pos, 10).StrValueByIndex(posEnd, 0) ;   
substring =substring + 'h';
dom.GetObject('M_laufzeit').State(substring.ToString(1));
}
else
{
dom.GetObject('M_laufzeit').State(' ');
}

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

if (substring == 0) {dom.GetObject('M_timer').State("Deaktiviert");}
if (substring == 1) {dom.GetObject('M_timer').State("Aktiv");}
if (substring == 2) {dom.GetObject('M_timer').State("Standby");}
}
else
{
dom.GetObject('M_timer').State(' ');
}

var temp = dom.GetObject('M_timer').Value();
WriteLine("M_timer: " # temp);

pos=0;
posStart = '"next": {"date": "';
posEnd = '", "time":';
pos = stdout.Find(posStart) + posStart.Length();
if(stdout.Find(posStart)>0)
{
substring = stdout.Substr(pos, 10).StrValueByIndex(posEnd, 0) ;   
dom.GetObject('M_timer_date').State(substring.ToString(1));
}
else
{
dom.GetObject('M_timer_date').State('-');
}

pos=0;
posStart = '"time": "';
posEnd = '", "unix":';
pos = stdout.Find(posStart) + posStart.Length();
if(stdout.Find(posStart)>0)
{
substring = stdout.Substr(pos, 8).StrValueByIndex(posEnd, 0) ;
dom.GetObject('M_timer_time').State(substring.ToString(1) );
}
else
{
dom.GetObject('M_timer_time').State('-');
}

WriteLine("M_timer_time: " # substring);

pos=0;
posStart = '"error_message": "';
posEnd = '", "date"';
pos = stdout.Find(posStart) + posStart.Length();
if(stdout.Find(posStart)>0)
{
substring = stdout.Substr(pos, 43).StrValueByIndex(posEnd, 0) ;
dom.GetObject('M_error').State(substring.ToString(1));
}
else
{
dom.GetObject('M_error').State('keine Fehlermeldung');
}

WriteLine("M_error: " # substring);

pos=0;
posStart = 'wlan": {"signal":';
posEnd = '}';
pos = stdout.Find(posStart) + posStart.Length();
if(stdout.Find(posStart)>0)
{
substring = stdout.Substr(pos, 10).StrValueByIndex(posEnd, 0) ;   
dom.GetObject('M_wlan').State(substring.ToString() );
}
else
{
dom.GetObject('M_wlan').State(' ');
}

WriteLine("M_wlan: " # substring);

var temp = system.Date("%d.%m.%Y %H:%M:%S");
dom.GetObject('M_lastsync').State(temp.ToString() );
WriteLine("lastsync " # temp);

WriteLine("Hallo Welt");
"Schäfchen" Gleitteller, FTA-Heckrad, Hütte
API-Steuerung mit Homematic

Manuel79
Forum-Nutzer
Beiträge: 21
Registriert: Di 13. Jun 2017, 23:03
Mäher: Husqvarna Automower 305
Firmware des Mähers (MSW): MSW 5.xx.xx
Herstellungsjahr: 2013
Robonect-Modul: Robonect Hx (Rev.4)
Robonect Firmware: 1.0 Beta 7

Re: Homematic für Dummies

Beitrag von Manuel79 »

Hat jemand eine Idee warum mein Mäher bei jeder Statusabfrage per Skript in den "Stop"-Modus geht? Ich verwende folgendes Skript:

Code: Alles auswählen

string url='http://192.168.2.10/json?cmd=status';

!löscht vorherige Abfrage
var stdout="";
var posStart;
var posEnd;
var substring;
var batt;
var temp;
string stderr;
string stdout;
string pos;

dom.GetObject("CUxD.CUX2801001:7.CMD_SETS").State("wget -q -O - '"#url#"'");
dom.GetObject("CUxD.CUX2801001:7.CMD_QUERY_RET").State(1);
string stdout= dom.GetObject("CUxD.CUX2801001:7.CMD_RETS").State();
WriteLine("Antwort: " # stdout);

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

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

if (substring == 0) {dom.GetObject('Shawn_Status_Text').State("Status wird ermittelt");}
if (substring == 1) {dom.GetObject('Shawn_Status_Text').State("parkt");}
if (substring == 2) {dom.GetObject('Shawn_Status_Text').State("mäht");}
if (substring == 3) {dom.GetObject('Shawn_Status_Text').State("sucht die Ladestation");}
if (substring == 4) {dom.GetObject('Shawn_Status_Text').State("lädt auf");}
if (substring == 5) {dom.GetObject('Shawn_Status_Text').State("sucht");}
if (substring == 7) {dom.GetObject('Shawn_Status_Text').State("befindet sich im Fehlerstatus");}
if (substring == 8) {dom.GetObject('Shawn_Status_Text').State("Schleifensignal verloren");}

substring = stdout.Substr(pos, 2).StrValueByIndex(posEnd, 0) ; 

if (substring == 16) {dom.GetObject('Shawn_Status_Text').State("abgeschaltet");}
if (substring == 17) {dom.GetObject('Shawn_Status_Text').State("schläft");}
}
else
{
dom.GetObject('Shawn_Status_Text').State("ausgeschaltet ?");
}

string temp = dom.GetObject('Shawn_Status_Text').Value();
WriteLine("Shawn_Status_Text: " # temp);

pos=0;
posStart = '"stopped": ';
posEnd = '", duration"';
pos = stdout.Find(posStart) + posStart.Length();
if(stdout.Find(posStart)>0)
{
substring = stdout.Substr(pos, 5).StrValueByIndex(posEnd, 0) ; 
!dom.GetObject('Shawn_Stop').State(substring);
if (substring == "true") {dom.GetObject('Shawn_Stop').State("true");}
if (substring == "false") {dom.GetObject('Shawn_Stop').State("false");};
WriteLine("Stop: " # substring);
}
else
{
dom.GetObject('Shawn_Stop').State('-');
}

pos=0;
posStart = '"duration":';
posEnd = ',';
pos = stdout.Find(posStart) + posStart.Length();
if(stdout.Find(posStart)>0)
{
substring = stdout.Substr(pos, 10).StrValueByIndex(posEnd, 0) ; 
!substring ist hier vom Typ nicht String !!!
substring = substring.ToInteger()/60;  
WriteLine(substring # " Minuten Shawn_Zeit_in_Status");
var zahl = substring.ToInteger();
WriteLine("zahl 0:" # zahl);
var h = (zahl / 60).ToInteger();
WriteLine("zahl h Gesamtstunden: " # h);
var d = (h / 24).ToInteger();
WriteLine("zahl d Tage:" # d);
zahl = (substring - (d * 24 * 60)).ToInteger();
WriteLine("zahl restl.Minuten: " # zahl);
h = (zahl / 60).ToInteger();
zahl = (zahl - (h * 60).ToInteger() );
WriteLine("zahl Minuten:" # zahl);

string substring = (d # " Tage " # h # " Std. " # zahl #" Min.");

WriteLine("Shawn_Zeit_in_Status: " # substring);

dom.GetObject("Shawn_Zeit_in_Status").State(substring);
}
else
{
dom.GetObject('Shawn_Zeit_in_Status').State('-');
}

pos=0;
posStart = '"mode": ';
posEnd = ', "batt';
pos = stdout.Find(posStart) + posStart.Length();
if(stdout.Find(posStart)>0)
{
substring = stdout.Substr(pos, 3).StrValueByIndex(posEnd, 0) ; 
substring = substring.ToInteger();
dom.GetObject('Shawn_Modus').State(substring.ToInteger() );
WriteLine("Shawn_Modus: " # substring);
if (substring == 0) {dom.GetObject('Shawn_Modus_Text').State("Auto");}
if (substring == 1) {dom.GetObject('Shawn_Modus_Text').State("Manuell");}
if (substring == 2) {dom.GetObject('Shawn_Modus_Text').State("Home");}
if (substring == 3) {dom.GetObject('Shawn_Modus_Text').State("Demo");}
}
else
{
dom.GetObject('Shawn_Modus').State('-');
}

var temp = dom.GetObject('Shawn_Modus_Text').Value();
WriteLine("Shawn_Modus_Text: " # temp);

pos=0;
posStart = '"battery": ';
posEnd = ', "';
pos = stdout.Find(posStart) + posStart.Length();
substring = stdout.Substr(pos, 10).StrValueByIndex(posEnd, 0) ;   
var temp = substring;
substring = substring + '%';
if(stdout.Find(posStart)>0)
{
WriteLine("Battery " # substring);
dom.GetObject('Shawn_Batterie').State(substring.ToString(1));
!schreibt log in CUxD
dom.GetObject("CUxD.CUX2801001:7.LOGIT").State("Shawn_Batterie;"#temp.ToString(1));
}
else
{
dom.GetObject('Shawn_Batterie').State(' ');
}

pos=0;
posStart = '"hours": ';
posEnd = '}';
pos = stdout.Find(posStart) + posStart.Length();
if(stdout.Find(posStart)>0)
{
substring = stdout.Substr(pos, 10).StrValueByIndex(posEnd, 0) ;   
substring =substring + 'h';
dom.GetObject('Shawn_Laufzeit').State(substring.ToString(1));
}
else
{
dom.GetObject('Shawn_Laufzeit').State(' ');
}

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

if (substring == 0) {dom.GetObject('Shawn_Timer_Status').State("Deaktiviert");}
if (substring == 1) {dom.GetObject('Shawn_Timer_Status').State("Aktiv");}
if (substring == 2) {dom.GetObject('Shawn_Timer_Status').State("Standby");}
}
else
{
dom.GetObject('Shawn_Timer_Status').State(' ');
}

var temp = dom.GetObject('Shawn_Timer_Status').Value();
WriteLine("Shawn_Timer_Status: " # temp);

pos=0;
posStart = '"next": {"date": "';
posEnd = '", "time":';
pos = stdout.Find(posStart) + posStart.Length();
if(stdout.Find(posStart)>0)
{
substring = stdout.Substr(pos, 10).StrValueByIndex(posEnd, 0) ;   
dom.GetObject('Shawn_Timer_Datum').State(substring.ToString(1));
}
else
{
dom.GetObject('Shawn_Timer_Datum').State('-');
}

pos=0;
posStart = '"time": "';
posEnd = '", "unix":';
pos = stdout.Find(posStart) + posStart.Length();
if(stdout.Find(posStart)>0)
{
substring = stdout.Substr(pos, 8).StrValueByIndex(posEnd, 0) ;
dom.GetObject('Shawn_Timer_Zeit').State(substring.ToString(1) );
}
else
{
dom.GetObject('Shawn_Timer_Zeit').State('-');
}

pos=0;
posStart = '"error_message": "';
posEnd = '", "date"';
pos = stdout.Find(posStart) + posStart.Length();
if(stdout.Find(posStart)>0)
{
substring = stdout.Substr(pos, 43).StrValueByIndex(posEnd, 0) ;
dom.GetObject('Shawn_Fehler').State(substring.ToString(1));
}
else
{
dom.GetObject('Shawn_Fehler').State('keine Fehlermeldung');
}

WriteLine("Shawn_Fehler: " # substring);

pos=0;
posStart = 'wlan": {"signal":';
posEnd = '}';
pos = stdout.Find(posStart) + posStart.Length();
if(stdout.Find(posStart)>0)
{
substring = stdout.Substr(pos, 10).StrValueByIndex(posEnd, 0) ;   
dom.GetObject('Shawn_Wlan').State(substring.ToString() );
}
else
{
dom.GetObject('Shawn_Wlan').State(' ');
}

var temp = system.Date("%d.%m.%Y %H:%M:%S");
dom.GetObject('Shawn_LastSync').State(temp.ToString() );
WriteLine("lastsync " # temp);

Timberland
erfahrener Forum-Nutzer
Beiträge: 99
Registriert: Fr 4. Mär 2016, 21:56
Wohnort: Dessau-Roßlau
Mäher: Gardena R45Li
Firmware des Mähers (MSW): MSW 5.xx.xx
Herstellungsjahr: 2013
Robonect-Modul: Robonect H30x (Rev.1)
Robonect Firmware: 1.0beta

Re: Homematic für Dummies

Beitrag von Timberland »

vielleicht wegen

Code: Alles auswählen

if (substring == "true") {dom.GetObject('Shawn_Stop').State("true");}


?

Manuel79
Forum-Nutzer
Beiträge: 21
Registriert: Di 13. Jun 2017, 23:03
Mäher: Husqvarna Automower 305
Firmware des Mähers (MSW): MSW 5.xx.xx
Herstellungsjahr: 2013
Robonect-Modul: Robonect Hx (Rev.4)
Robonect Firmware: 1.0 Beta 7

Re: Homematic für Dummies

Beitrag von Manuel79 »

Hm, dazu bin ich selbst nicht tief genug in der Materie. Einen Unterschied zum Skript von PaulMerkelbach habe ich noch gefunden, er interpretiert an dieser Stelle Pos 4, ich habe Pos 5 im Skript. Ich ändere das noch mal oder entferne den Block einfach komplett.

Manuel79
Forum-Nutzer
Beiträge: 21
Registriert: Di 13. Jun 2017, 23:03
Mäher: Husqvarna Automower 305
Firmware des Mähers (MSW): MSW 5.xx.xx
Herstellungsjahr: 2013
Robonect-Modul: Robonect Hx (Rev.4)
Robonect Firmware: 1.0 Beta 7

Re: Homematic für Dummies

Beitrag von Manuel79 »

Timberland hat geschrieben:
Do 22. Jun 2017, 07:56
vielleicht wegen

Code: Alles auswählen

if (substring == "true") {dom.GetObject('Shawn_Stop').State("true");}
Der Tipp war richtig, vielen Dank. Ich habe die gesamte Passage aus der Abfrage entfernt, danach funktioniert alles wie gewünscht.

Rudi2017
Forum-Anfänger
Beiträge: 7
Registriert: So 18. Jun 2017, 15:56
Mäher: Husqvarna Automower 105
Firmware des Mähers (MSW): MSW 6.xx.xx
Herstellungsjahr: 2016
Robonect-Modul: Robonect Hx (Rev.5)
Robonect Firmware: V1.0 Beta7

Re: Homematic für Dummies

Beitrag von Rudi2017 »

Hallo zusammen, ich habe gestern Abend eine Ewigkeit damit verbracht meinen Mähroboter in die homematic ein zu binden, mit mäßigem Erfolg. Das Script am Anfang dieses Thread habe ich zum laufen bekommen, bis mit aufgefallen ist, das zB der Status nicht richtig übermittelt wird. Dann habe ich weitergelesen und das mit der nr 17 entdeckt. Nun habe ich neue systemvariablen angelegt und das Skript der letzten Seite genutzt, aber nun bekomme ich gar keine Werte mehr in die systemvariablen mehr. Heute Mogen habe ich CuxD installiert. bringt mir das irgendwas, muss hier noch irgendwas auf der Oberfläche von CuxD eingestellt werden?

Marck
Forum-Nutzer
Beiträge: 13
Registriert: Fr 12. Mai 2017, 06:28
Mäher: Gardena R40Li
Firmware des Mähers (MSW): MSW 5.xx.xx
Herstellungsjahr: 2012
Robonect-Modul: Robonect Hx (Rev.4)
Robonect Firmware: 0.9e

Re: Homematic für Dummies

Beitrag von Marck »

Du musst auf alle Fälle zunächst unter der CUxD-Oberfläche ein neues virtuelles Gerät erzeugen:
Typ 28 (System)
Funktion: Exec
Seriennummer: 1
Dann auf "Gerät in der CCU erzeugen" klicken. Bei den Geräten unter der Homematic-Oberfläche zur Sicherheit nochmal schauen, ob da dann eine Funk-Fernbedienung mit der Adresse CUX2801001:1 - irgendwas vorhanden ist.
Wenn Du dann im Script von PaulMerkelbach (vielen Dank an der Stelle) die richtige String-URL deines Robonects und alle Variablen richtig angelegt hast, sollte alles einwandfrei funktionieren.

Was ich gerne bei dem Script wissen würde: Geht das irgendwie auch mit gesetztem Username und Passwort? Ich traue mich da nicht zu experimentieren, da ich diesbezüglich von abschmierenden CCU's gelesen habe....

Antworten

Zurück zu „Homematic-Nutzer“