Seite 2 von 3

Re: Robbie + Wetter + Zeit + Garagentor

Verfasst: Mi 11. Apr 2018, 11:55
von swat33333
So ich habe eine vorläufige Lösung die noch klappen soll. Danke an Kurt.
Die variablen Bzw Namen müssen natürlich angepasst werden.
A

Code: Alles auswählen

KURT-Status-Z	als Zahl 0-100
---------------------------------------
!********KURT Batterie abfragen***********
pos=0;
posStart = '"battery": ';
posEnd = ', "';
pos = stdout.Find(posStart) + posStart.Length();
!WriteLine("pos");
!WriteLine(pos);
!substring = stdout.Substr(pos, 10).StrValueByIndex(posEnd, 0) ;
substring = stdout.Substr(pos, 3).StrValueByIndex(posEnd, 0) ;
batt=substring;
substring = substring.ToInteger();
dom.GetObject('KURT-Battery-Z').State(substring.ToInteger() );
!WriteLine("KURT- Battery-Z: " # substring);
!batt=substring;
substring =substring + ' %';
if(stdout.Find(posStart)>0)
{
!WriteLine("Battery");
!WriteLine(substring);
dom.GetObject('KURT-Battery').State(substring.ToString(1));
dom.GetObject("CUxD.CUX2801002:1.LOGIT").State("KURT-Battery;"#batt.ToString(1));
!WriteLine("Batterie ende!");
}
else
{
dom.GetObject('KURT-Battery').State('Variable nicht gesetzt');
}
!********KURT Battery abfragen ENDE***********
Als weitere Info ich werde wahrscheinlich umsteigen auf eine Abfrage mittels io Broker. Hierzu werden ich wieder eine detaillierte Anleitung erstellen. Wenn es läuft.
Wieso?!
- wlan Modul war oft nicht erreichbar scheinbar wegen Abfrage der ccu
- Rechenleistung für Abfrage kann auf ccu eingespart werden.
- div. Weitere Projekte lassen sich einfacher verknüpfen.

Ihr hört von mir.

Re: Robbie + Wetter + Zeit + Garagentor

Verfasst: Do 12. Apr 2018, 13:25
von Rudi2017
Danke! Gute Lösung... Funktioniert ;)

Re: Robbie + Wetter + Zeit + Garagentor

Verfasst: Sa 14. Apr 2018, 12:10
von saschen79
Danke läuft wieder. :)

Re: Robbie + Wetter + Zeit + Garagentor

Verfasst: Fr 4. Mai 2018, 13:50
von opossum
Hallo, swat,

ich habe auch Homatic zu hause und würde meinen R40LI auch gern in diese Steuerung einbinden. Das Nachbauen hast Du schön übersichtlich dargestellt und ist auch nachvollziehbar. In Deinen Scripten verwendest Du die CUxD geräte CUxD.CUX2801002:2 und CUxD.CUX2800001:1.

Gehe ich richtig in der Annahme, dass CUxD.CUX2801002:2 der Switch bzw. Key ist und
CUxD.CUX2800001:1 der Timer?

Alles andere ist aus meiner Sicht super erklärt. Ich versuche mich gerade daran.

Danke für die Antwort.

Gruß
opossum

Re: Robbie + Wetter + Zeit + Garagentor

Verfasst: Fr 4. Mai 2018, 15:56
von opossum
Hallo, swat,

ich habe jetzt mal angefangen und das Script nebst Programm für die Statusabfrage zu bauen. Leider will das nicht so, wie ich denke.
Die Abfrage im Browser abgesetzt

Code: Alles auswählen

http://192.168.1.24/json?cmd=status
bringt folgendes Ergebnis

Code: Alles auswählen

{"name": "Karlchen", "id": "07802E", "status": {"status": 4, "stopped": false, "duration": 145, "mode": 0, "battery": 50, "hours": 2326}, "timer": {"status": 1}, "blades": {"quality": 92, "hours": 16, "days": 4}, "wlan": {"signal": -80}, "health": {"temperature": 27, "humidity": 40}, "error": {"error_code": 0, "error_message": "Unbekannter Fehlercode!", "date": "2018-05-04", "time": "14:36:45", "unix": 1525444605}, "clock": {"date": "2018-05-04", "time": "15:00:51", "unix": 1525446051}, "successful": true}
Teste ich das Script im Testfenster der CCU2, kommt folgende Ausgabe:

Antwort:
Karlchen_Status_Text: ausgeschaltet ?
Karlchen_Modus_Text: ???
Es scheint, als ob das Ergebnis der Abfrage nicht im CUxD abgelegt wird?

Im Abfragescript habe ich den Switch drin. Das beantwortet auch meine Frage aus dem vorherigen Post.
Aber es werden nicht alle Variablen gesetzt. Kann es sein, dass ich im Script noch Anpassungen vornehmen muss oder ist das CUxd-Gerät nicht das richtige? Habe ich so angelegt, wie Du es beschrieben hast, als Switch, hat aber die gleichen Parameter. Im CUxD sehe ich auch:

Code: Alles auswählen

CUX2801001:4	rmax(65535) t(3600s) p(0)
			SWITCH-FALSE CMD_SHORT(wget -q -O - 'http://192.168.1.24/json?cmd=status')
			SWITCH-TRUE CMD_LONG()
Danke für die Hilfe.

Gruß
opossum

Re: Robbie + Wetter + Zeit + Garagentor

Verfasst: Fr 4. Mai 2018, 20:26
von opossum
Hallo, swat,

es war die Übermittlung User und Passwort. Habe das Script nun Step by Step getestet und gebaut. Nun läuft es bei mir.
Nachfolgend das Script:

Code: Alles auswählen

string Url='http://192.168.XXX.XXX/json?user=Mein User&pass=Mein Passwort&cmd=status';
var stdout="";
var posStart;
var posEnd;
var substring;
var batt;
var temp;
string stderr;
string stdout;
string pos;

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

WriteLine("Antwort: " # stdout);
!xxxxxxxxxxxxxxxxKarlchen_Fehlerxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
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('Karlchen_Fehler').State(substring.ToString(1));
}
else
{
dom.GetObject('Karlchen_Fehler').State('keine Fehlermeldung');
}
WriteLine("Karlchen_Fehler: " # substring);

!xxxxxxxxxxxxxxxxKarlchen_LastSyncxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

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

!xxxxxxxxxxxxxxxxKarlchen_Wlanxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

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('Karlchen_Wlan').State(substring.ToString() );
}
else
{
dom.GetObject('Karlchen_Wlan').State(' ');
}
WriteLine("Karlchen_Wlan: " # substring);

!xxxxxxxxxxxxxxxxKarlchen_Timer_Zeitxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

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('Karlchen_Timer_Zeit').State(substring.ToString(1) );
}
else
{
dom.GetObject('Karlchen_Timer_Zeit').State('-');
}
WriteLine("Karlchen_Timer_Zeit: " # substring);

!xxxxxxxxxxxxxxxxKarlchen_Time_Datumxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

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('Karlchen_Timer_Datum').State(substring.ToString(1));
}
else
{
dom.GetObject('Karlchen_Timer_Datum').State('-');
}
WriteLine("Karlchen_Timer_Datum: " # substring);

!xxxxxxxxxxxxxxxxKarlchen_Timer_Statusxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

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('Karlchen_Timer_Status').State("Deaktiviert");}
if (substring == 1) {dom.GetObject('Karlchen_Timer_Status').State("Aktiv");}
if (substring == 2) {dom.GetObject('Karlchen_Timer_Status').State("Standby");}
}
else
{
dom.GetObject('Karlchen_Timer_Status').State(' ');
}

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

!xxxxxxxxxxxxxxxxKarlchen_Status_Textxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

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('Karlchen_Status').State(substring);
WriteLine("Karlchen_Status: " # substring);

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

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

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

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

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

!xxxxxxxxxxxxxxxxKarlchen_Stopxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

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('Karlchen_Stop').State(substring);
if (substring == "true") {dom.GetObject('Karlchen_Stop').State("true");}
if (substring == "fals") {dom.GetObject('Karlchen_Stop').State("false");};
WriteLine("Karlchen_Stop: " # substring);
}
else
{
dom.GetObject('Karlchen_Stop').State('-');
}

!xxxxxxxxxxxxxxxxKarlchen_Zeit_in_Statusxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

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("Karlchen_Zeit_in_Status: " # substring);

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

!xxxxxxxxxxxxxxxxKarlchen_Modus_Textxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

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('Karlchen_Modus').State(substring.ToInteger() );
WriteLine("Karlchen_Modus: " # substring);
if (substring == 0) {dom.GetObject('Karlchen_Modus_Text').State("Modus Auto");}
if (substring == 1) {dom.GetObject('Karlchen_Modus_Text').State("Modus Manuell");}
if (substring == 2) {dom.GetObject('Karlchen_Modus_Text').State("Modus Home");}
if (substring == 3) {dom.GetObject('Karlchen_Modus_Text').State("Modus Demo");}
}
else
{
dom.GetObject('Karlchen_Modus').State('-');
}

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

!xxxxxxxxxxxxxxxxKarlchen_Laufzeitxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx


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('Karlchen_Laufzeit').State(substring.ToString(1));
}
else
{
dom.GetObject('Karlchen_Laufzeit').State(' ');
}

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

!xxxxxxxxxxxxxxxxKarlchen_Batteriexxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

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("Karlchen_Batterie: " # substring);
dom.GetObject('Karlchen_Batterie').State(substring.ToString(1));
!schreibt log in CUxD
!dom.GetObject("CUxD.CUX2801001:1.LOGIT").State("Karlchen_Batterie;"#temp.ToString(1));
}
else
{
dom.GetObject('Karlchen_Batterie').State(' ');
}
Werde nun noch alle WriteLine inaktiv setzen und dann geht es erst einmal.

Bei "stopped" = true lasse ich mir zusätzlich eine Pushnachricht auf das Mobilphone senden.

Gruß und Danke.

opossum

Re: Robbie + Wetter + Zeit + Garagentor

Verfasst: Fr 21. Sep 2018, 17:59
von KURT-17
Hallo in die RUNDE
habe seit Tagen das Problem, das HM Prg. wird NICHT bearbeitet, Zyklus alle 30 sec - Mähzeit jeweils im Minuten Takt. Seit 1 Woche mit CCU3 aber auch mit der CCU2 war schon das gleiche Problem. Es Geht mal 2 Wochen SUPER, dann VERZÖGERT sich die EINGABE aller Taster auch um ca. 10-25 min. Habe bei eQ-3 das Verhalten ANGEMECKERT - Antwort hier: unsere Prüfung ergab, dass Sie Software von Drittanbietern verwenden, die nicht von unserer Seite getestet wird und daher auch kein Support zu dieser erfolgt. Wir vermuten, dass genanntes Verhalten mit der von Ihnen verwendeten Software zusammenhängt. Wenn diese nicht regelmäßig aktualisiert wird, kommt es hier zu Fehlern, falschen Statusmelden, keine Statusmeldungen uvm.
Dazu noch mal ein BILD (12min Stillstand)das Prg. ist seid März auf KURT, Mähzeit je nach Wetter 1 Mähzeit 80min und 2 Mähzeit 60min, WER KANN HELFEN .....

Re: Robbie + Wetter + Zeit + Garagentor

Verfasst: Sa 22. Sep 2018, 11:55
von Lampi
Hallo Kurt-17,

wenn ich mal ein paar Vermutungen machen darf.

Setzt Du eventuell CUxD mit System.Exec ein?
Wenn ja, könnte es sein das die Verbindung über W-Lan nicht stabil ist und CUxD keine Verbindung zu Robonect zwecks Statusabfrage aufbauen kann. Dann schau doch bitte mal unter Einstellungen -> Geräte bei dem im Skript verwendetem Kanal wie der Parameter EXEC_TIMEOUT eingestellt ist. Soweit ich weiß ist er standartmäßig mit 60 Minuten vorbelegt. Wenn Du den auf 1 Minuten runter nimmst, sollten die "Hänger" nicht mehr so lange dauern, aber immer wieder auftreten solange bis die Verbindung wieder da ist.
Falls dass das Problem sein sollte, kann man von CUxD das Gerät Ping verwenden um die Statusabfrage erst gar nicht zu starten.

Gruß Jörg

Re: Robbie + Wetter + Zeit + Garagentor

Verfasst: Di 25. Sep 2018, 14:22
von KURT-17
Hallo Lampi,
Danke für den TIP, habe die Zeit von 60 auf 1 gesetzt, TESTE jetzt, gestern dauernd REGEN, heute NEUE PROBLEME! CCU3 erst mal keine AUSSETZER, aber laufend fallen 2 Rolladenaktor aus, bin noch am SUCHEN.
Nach CCU Neustart gehen Aktoren AN und auch Rolladen RUNTER (ich glaube zu früh gekauft?). Dann letzte Woche auf Beta 6 gewechselt - NEUES Problem nach 7min Mäht -> Feierabend und kein Befehl von der CCU.... wechsel jetzt zurück auf die ALTE SOFT. Melde mich wenn die FEHLER weg sind ODER NICHT. Wenn ich von CUxD das Gerät Ping verwenden will hast Du da evt. einen Vorschlag?
Gruß KURT-17

Re: Robbie + Wetter + Zeit + Garagentor

Verfasst: Fr 28. Sep 2018, 22:40
von Lampi
Da gibt es mehrere Möglichkeiten. Aber erstmal muss das Gerät eingerichtet werden.
Auskunft zu den einzelnen Parameter gibt die Anleitung zu CUxD.
Ping1.png


Eine Möglichkeit ist im Programm eine Abfrage auf UND z.B. ...
Ping2.png


oder im Skript

Code: Alles auswählen

boolean vPing = dom.GetObject("Ping_Shirley").DPByHssDP("STATE").Value(); ! Wenn true besteht Verbindung

if (vPing){
  ! Hier die Anweisungen zum Afragen des Status

} else {
  ! Hier eventuel Anweisungen die ausgeführt werden sollen wenn keine Verbindung

}
es ginge auch das Skript vorzeitig zu beenden wenn die weitere Abarbeitung keinen Sinn macht.

Code: Alles auswählen

boolean vPing = dom.GetObject("Ping_Shirley").DPByHssDP("STATE").Value(); ! Wenn true besteht Verbindung

if (!vPing){
  quit;
}
Gruß
Jörg