So, ich habe die letzten Stunden damit verbracht mich mit der Skriptsprache rumzuärgern
Daher ist das alles auch quick n dirty, da ich nicht wirklich programmieren gelernt habe und mir alles selber beigebracht (zusammengeklaut) habe. Aber immerhin verstehe ich schon mal was da so abläuft.
Es werden 4 Programme benötigt: 3 zum Schalten des Modus und eins zum auslesen der Statusmeldungen
- Bildschirmfoto 2016-03-12 um 19.46.54.png (59.87 KiB) 14339 mal betrachtet
Weiterhin müssen folgende Systemvariablen (alle Strings) angelegt werden:
- Bildschirmfoto 2016-03-12 um 19.43.01.png (81.96 KiB) 14339 mal betrachtet
EDIT: Ich habe die Variable R45Li-Mähzeit hier vergessen! Diese muss ebenfalls als Zeichenkette angelegt werden!
Im Programm wird eine periodische Wiederholung eingestellt, sodass die CCU die Systemvariable aller paar Sekunden aktualisiert.
@Admin: Gäbe es hier ein Problem mit einer Abfrage aller 30 Sekunden? Ich will das Modul nicht überlasten...
- Bildschirmfoto 2016-03-12 um 19.42.20.png (73.62 KiB) 14339 mal betrachtet
Als Aktivität wählt man "Skript" und fügt folgendes ein:
Code: Alles auswählen
string Url='http://192.168.0.67/json?cmd=status';
var stdout;
var posStart;
var posEnd;
var preis;
var substring;
var posValueStart;
var posValueEnd;
var posValue;
string stderr;
string stdout;
string pos;
string substring2;
WriteLine("strings gesetzt");
system.Exec("wget -q -O - "#Url, &stdout, &stderr);
WriteLine("Abrufen");
WriteLine(stdout);
posStart = '{"status": ';
posEnd = ', "mode';
pos = stdout.Find(posStart) + posStart.Length();
WriteLine("pos");
WriteLine(pos);
substring = stdout.Substr(pos, 10).StrValueByIndex(posEnd, 0) ;
WriteLine(substring);
if (substring == 0) {dom.GetObject('R45Li-Status').State("schläft");}
if (substring == 1) {dom.GetObject('R45Li-Status').State("parkt");}
if (substring == 2) {dom.GetObject('R45Li-Status').State("mäht");}
if (substring == 3) {dom.GetObject('R45Li-Status').State("sucht die Ladestation");}
if (substring == 4) {dom.GetObject('R45Li-Status').State("lädt auf");}
if (substring == 5) {dom.GetObject('R45Li-Status').State("sucht");}
if (substring == 7) {dom.GetObject('R45Li-Status').State("Fehler!");}
WriteLine("Status ende!");
posStart = '"mode": ';
posEnd = ', "batt';
pos = stdout.Find(posStart) + posStart.Length();
WriteLine("pos");
WriteLine(pos);
substring = stdout.Substr(pos, 10).StrValueByIndex(posEnd, 0) ;
WriteLine(substring);
if (substring == 0) {dom.GetObject('R45Li-Modus').State("Auto");}
if (substring == 1) {dom.GetObject('R45Li-Modus').State("Manu");}
if (substring == 2) {dom.GetObject('R45Li-Modus').State("Home");}
if (substring == 3) {dom.GetObject('R45Li-Modus').State("Demo");}
WriteLine("Modus ende!");
posStart = '"battery": ';
posEnd = ', "hours';
pos = stdout.Find(posStart) + posStart.Length();
WriteLine("pos");
WriteLine(pos);
substring = stdout.Substr(pos, 10).StrValueByIndex(posEnd, 0) ;
WriteLine(substring);
dom.GetObject('R45Li-Battery').State(substring.ToString(1));
WriteLine("Batterie ende!");
posStart = '"hours": ';
posEnd = '}:"timer';
pos = stdout.Find(posStart) + posStart.Length();
WriteLine("pos");
WriteLine(pos);
substring = stdout.Substr(pos, 10).StrValueByIndex(posEnd, 0) ;
WriteLine(substring);
dom.GetObject('R45Li-Laufzeit').State(substring.ToString(1));
WriteLine("Laufzeit ende!");
posStart = 'timer": {"status": ';
posEnd = '}}';
pos = stdout.Find(posStart) + posStart.Length();
WriteLine("pos");
WriteLine(pos);
substring = stdout.Substr(pos, 10).StrValueByIndex(posEnd, 0) ;
WriteLine(substring);
string SysMonat = system.Date("%d");
integer Tag = SysMonat.ToInteger();
if (substring == Tag) {dom.GetObject('R45Li-Mähtag').State("Heute");}
if (substring == Tag + 1) {dom.GetObject('R45Li-Mähtag').State("Morgen");}
if (substring == Tag + 2) {dom.GetObject('R45Li-Mähtag').State("Übermorgen");}
else {dom.GetObject('R45Li-Mähtag').State("Fehler!");}
WriteLine("Tag ende!");
posStart = '","time":"';
posEnd = '","unix';
pos = stdout.Find(posStart) + posStart.Length();
WriteLine("pos");
WriteLine(pos);
substring = stdout.Substr(pos, 10).StrValueByIndex(posEnd, 0) ;
WriteLine(substring);
dom.GetObject('R45Li-Mähzeit').State(substring.ToString(1));
WriteLine("Mähzeit ende!");
Die Programme zum setzen der Modi sind ebenfalls Skripte. Hier gibt man jedoch bei den Bedingungen nichts an und fügt nur bei Aktivität das folgende Skript hinzu:
Code: Alles auswählen
string stderr;
string stdout;
string url="http://192.168.0.67/xml?cmd=mode&mode=auto";
system.Exec("wget -q -O - "#url, &stdout, &stderr);
Wer mag kann hier als 2. Skript das o.a. zum Auslesen der Variablen noch hinzufügen. So werden die Systemvariablen nach dem Setzen des Modus wieder aktualisiert.
Für die weiteren Skript zum Setzen der Modi "Home" und MAN" muss lediglich das "auto" gegen "home" und "man" ersetzt werden!
Leider funktioniert bei mir das Auslesen des Timers nicht, daher habe ich zwar implementiert aber nicht testen können!
Ich bekomme nur diesen Status:
Code: Alles auswählen
{"successful": true:"status": {"status": 1, "mode": 0, "battery": 73, "hours": 0}:"timer": {"status": 2}}
Liegt vielleicht daran, dass Shawn nicht in der Ladestation sitzt?