Hallo
gibt es eine möglichkeit das Gardena Smart System in Fhem einzubinden ? Habe bisher nicht gefunden.
Hier hat sich jemand mit der Api beschäftig. Ist auf json aufgebaut
http://www.roboter-forum.com/showthread.php?16777-Gardena-Smart-System-Analyse
Würde mich auch brennend interessieren.
Gibt es ja im Prinzip als PHP schon fertig.
Beschäftigt sich schon jemand damit? Oder gibt es da für FHEM schon was Fertiges?
Ich weiss nicht ob schon jemand daran arbeitet, aber generell sollte mit den Infos aus obigem Link auch eine Realisierung per HTTPMod möglich sein
Kann denn HTTPMOD mit Arrays im JSON was anfangen?
@CoolTux: Ja soweit ich das verstehe, denn das Array wird flachgeklopft um eine Art Pfad zu erzeugen und dann ein fortlaufend Nummer hinzugefügt. ExtractAllJson würde diese Pfade zeigen.
Aber ja, die Anmerkung ist gerechtfertigt, ausprobiert habe ich es nicht ???
Auf jedenfall ließe sich Recht simpel ein Modul damit basteln. ;D
@CoolTux
Na dann mal los! Büddeeee! :)
Glaube mir, ich sage echt nicht schnell nein. Aber im Moment bin ich voll ausgebucht. Man kann es gerne auf später verschieben.
Was hast Du denn für Geräte?
Von Gardena habe ich das Smart Set bestehend aus dem Gateway, Smart Sensor, smart Water Control und natürlich den Sileno Rasenmähroboter.
Wobei bei mir der Smart Water Control nicht so wichtig ist, da ich dies mit Homematic (8 Fach Aktor + Netzteil) und Gardena 24v Ventilen schon realisiert habe.
Bloß aktuell habe ich keine Möglichkeit meine FHEM Umgebung wirklich Smart mit dem Roboter zu verbinden. Kann natürlich die Bewässerung mit den Zeitplänen des Rasenmähers abgleichen aber andere Wetterdaten kann ich nicht einfließen lassen. Würde auch gerne den Mäher spontan per Knopfdruck (z.B. Dash Button) in seine Garage schicken, wenn z.B. die Kinder im Garten spielen wollen o.ä....
Sinnvoll wäre es natürlich dann auch den Smart Sensor (Bodenfeuchtigkeit) für die Bewässerung über FHEM zu nutzen zu können.
Machen wir es so. Ich behalte es im Hinterkopf und Du erinnerst mit alle 4 Wochen daran sollte ich mich nicht melden.
Grüße
Alle 4 Stunden? Ok... :P
Vielleicht gibt es hier ja aber auch noch andere die Ahnung und bissl Zeit haben sich das mal anzuschauen?
Ich hätte ja Lust und habe mir das System auch angeschaut. Aber eine Investition von 1500€ wäre jetzt doch ein wenig heftig, insbesondere da das System ja doch in einigen Bewertung nicht sehr gut wegkommt.
Kommt es mir nur so vor oder bist Du vielleicht etwas pushy bei diesem Thema?
Es gibt ja wohl die Möglichkeit einiges mit HTTPMod abzudecken, also bist Du ja in der Lage selber auch etwas zu tun.
Lag bei dem Paket bei ca. 900 €.
Aber habe verstanden.
Habe mich mal gerad so durch deren Telefonsystem gekämpft um einen Ansprechpartner zu bekommen was FHEM Gardena Smart Modulentwicklung an geht. Leider heute keiner mehr da und morgen Feiertag.
Habe durch schummeln nun erstmal einen Marketingkontakt den ich am Freitag mal anrufen werde. Kleiner Trick, es gibt so viele Müllers das egal welche Nummer Du wählst Du garantiert beim 3 mal bei einem Müller raus kommst. Klingt seriös wenn der Gegenüber denkt man kennt sich ;D
Grüße
Sehr gut! :)
Wenn es Neuigkeiten gibt oder ich was testen soll, dann stehe ich gerne zur Verfügung!
Gibt es hier schon Neuigkeiten?
Es gibt eventuell über einen Forenuser einen direkten Kontakt. Dieser Kontakt ist aber noch im Urlaub. Also bitte etwas Geduld.
sehr nettes Thema..
hab seit 1,5 Monaten einen Sileno incl. Smart Gateway und die Bewässerung .. eine Einbindung in FHEM wär der Knaller ^^
Hier ein LINK (https://www.symcon.de/forum/threads/32055-Gardena-Husqvarna-Smart-Sileno-M%C3%A4hroboter-einbinden) wo sich schon jemand große Mühe gegeben hat, evtl. könnt ihr ja mit dem PHP-Code etwas anfangen.. wurde auch sogar schon mal von PEPITO82 in einem anderem Beitrag (https://forum.fhem.de/index.php?topic=52439.0) erwähnt
vg
Hallo
ich habe nun seit einem Jahr einen Sileno Smart R130 LIC. Bin super zufrieden damit und kann die Probleme vieler nicht verstehen. Meist ist der Fehler dort zwischen den Ohren. Bin auch fleissig am Lesen im Roboterforum, wo es wohl am meisten Infos über die kleinen Helfer gibt.
Beim Programmieren kann ich euch nicht wirklich bei helfen, aber wenn es ums testen und debuggen geht würde ich mich gerne anbieten.
Eine Anbindung an FHEM wär schon toll. Vor allem, weil es doch so einige Daten mehr gibt, als man über App oder Mäher auslesen kann. Akkuzustand wär toll.
Gruß Michael
Gibt es hier schon Neuigkeiten? :)
Ein erster Kontakt wurde hergestellt. Nun bereite ich eine Anforderungsmail vor welche mein Kontakt an die Entwicklungsabteilung weiter geben wird.
Grüße
Um mal Schwung in die Bude zu bekommen... kann jetzt Mähen und Parken per FHEM (leider fehlt es am Können und Wissen um ein Modul draus zu basteln... Status und so müsste man sich auch noch parsen...): (update: notify in ein DOIF geändert, da sonst zuviele aufrufe der Funktion)
fhem.cfg:
define Sileno dummy
attr Sileno genericDeviceType switch
attr Sileno room Garten,Roboter
attr Sileno webCmd maehen:parken
define DI_SilenoCmd DOIF ([Sileno:"maehen"]) ({sileno_cmd("maehen")}) DOELSEIF ([Sileno:"parken"]) ({sileno_cmd("parken")})
attr DI_SilenoCmd room Garten,Roboter
#ALT:
#define SilenoCommand notify Sileno:* {sileno_cmd(ReadingsVal("Sileno","state",0))}
#attr SilenoCommand room Garten,Roboter
99_myUtils.pm (beispielhaft, beachte den backslash in der email adresse vor dem Klammeraffen):
no strict;
use LWP::Simple;
use JSON qw( decode_json );
sub sileno_cmd {
my $command = $_[0];
my $device_id = "9944b2e3-1d64-4d2f-b43f-9b150db6d2ed";
my $location_id = "847fbc05-2f1a-4447-a334-a15e23424af4";
my $gardena_email = "bigcheese.fhem\@superserver.de";
my $gardena_password = "meinsicherespasswort";
my $curl = `curl --data '{"sessions":{"email":"$gardena_email","password":"$gardena_password"}}' --header "Content-Type:application/json" https://sg-api.dss.husqvarnagroup.net/sg-1/sessions`;
my $decoded_json = decode_json( $curl );
my $session_id = $decoded_json->{'sessions'}{'token'};
print $session_id;
if ($command eq "maehen") {
my $payload ='"name":"start_override_timer","parameters":{"duration":1440}';
my $exec = `curl --data '{$payload}' --header "Content-Type:application/json" --header "X-Session:$session_id" https://sg-api.dss.husqvarnagroup.net/sg-1/devices/$device_id/abilities/mower/command?locationId=$location_id`;
}
elsif ($command eq "parken") {
my $payload ='"name":"park_until_further_notice"';
my $exec = `curl --data '{$payload}' --header "Content-Type:application/json" --header "X-Session:$session_id" https://sg-api.dss.husqvarnagroup.net/sg-1/devices/$device_id/abilities/mower/command?locationId=$location_id`;
}
Woher bekommt man die device_id und location_id?
Das wurde ja http://www.roboter-forum.com/showthread.php?16777-Gardena-Smart-System-Analyse (http://www.roboter-forum.com/showthread.php?16777-Gardena-Smart-System-Analyse) super erklärt:
1) User ID einmalig holen (hier im commandline die email adresse ohne backslash verwenden):
curl --data '{"sessions":{"email":"DEINE GARDENA EMAIL ADRESSE","password":"DEIN PASSWORT"}}' --header "Content-Type:application/json" https://sg-api.dss.husqvarnagroup.net/sg-1/sessions
2)aus dem Return den TOKEN und user_id in nächsten request einbauen:
curl --header "Content-Type:application/json" --header "X-Session:TOKEN" https://sg-api.dss.husqvarnagroup.net/sg-1/locations/?user_id=DEINE USER ID
Hier aus dem Return siehst du die location ID und die Device ID (nicht die vom Gateway nehmen ;) )
grüsse,
Bigcheese
sehr geil bigchees funzt!
Hab mir das ganze mal noch erweitert da mir nur "24Std mähen" und "parken bis auf weiteres" nicht reicht.
99_myUtils.pm
Zitatif ($command eq "maehen_24Std") {
my $payload ='"name":"start_override_timer","parameters":{"duration":1440}';
my $exec = `curl --data '{$payload}' --header "Content-Type:application/json" --header "X-Session:$session_id" https://sg-api.dss.husqvarnagroup.net/sg-1/devices/$device_id/abilities/mower/command?locationId=$location_id`;
}
elsif ($command eq "maehen_zeitplan") {
my $payload ='"name":"start_resume_schedule"';
my $exec = `curl --data '{$payload}' --header "Content-Type:application/json" --header "X-Session:$session_id" https://sg-api.dss.husqvarnagroup.net/sg-1/devices/$device_id/abilities/mower/command?locationId=$location_id`;
}
elsif ($command eq "parken") {
my $payload ='"name":"park_until_further_notice"';
my $exec = `curl --data '{$payload}' --header "Content-Type:application/json" --header "X-Session:$session_id" https://sg-api.dss.husqvarnagroup.net/sg-1/devices/$device_id/abilities/mower/command?locationId=$location_id`;
}
elsif ($command eq "parken_zeitplan") {
my $payload ='"name":"park_until_next_timer"';
my $exec = `curl --data '{$payload}' --header "Content-Type:application/json" --header "X-Session:$session_id" https://sg-api.dss.husqvarnagroup.net/sg-1/devices/$device_id/abilities/mower/command?locationId=$location_id`;
}
CFG:
define Sileno dummy
attr Sileno genericDeviceType switch
attr Sileno room Outdoor
attr Sileno webCmd maehen_24Std:maehen_zeitplan:parken:parken_zeitplan
Ich habe heute eine Mail an meinen Gardena Kontakt geschrieben wo eine kleine Anforderungsliste drin steht. Im Grunde geht es nur um API Doku und eventuell ein Starterkit als Muster. Mal schauen was wird. Derweil werde ich die nächsten Wochen mal erste Schritte unter nehmen für ein IO Devicemodul.
Geil, mit der Anleitung von bigcheese ging es total schnell meinen Sileno einzubinden, super Basis zum weitermachen.
Danke
Super!
Auch soeben mal eingebaut. Sieht ja soweit schon ganz cool aus! :D
sooo, kleine Erweiterung: zyklischer Status Poll von Batterie, ob geladen wird, Status vom Sileno, errormessage, next start:
(ich hoffe das durch die Polls nicht irgendwann der Account als Missbrauch geflaggt wird :D ) ... ggf braucht man die session ja nicht jedes mal zu holen und so...
und ich glaub das mit dem NOTIFY muss ich nochmal überdenken... da passieren jetzt vermehrt aufrufe bei einem Kommando...ggf auf DOIF switchen, mal gucken...
in der 99_myUtils.pm neue Funktion hinzufügen (wieder backslash bei email beachten):
sub sileno_status {
my $device_id = "1111-123123-4123123f-b48f-9b111111c";
my $location_id = "83333335-2f1a-433337-a337-a333334";
my $gardena_email = "bigcheese.fhem\@deinserver.de";
my $gardena_password = "deinpasswort";
my $curl = `curl --data '{"sessions":{"email":"$gardena_email","password":"$gardena_password"}}' --header "Content-Type:application/json" https://sg-api.dss.husqvarnagroup.net/sg-1/sessions`;
my $decoded_json = decode_json( $curl );
my $session_id = $decoded_json->{'sessions'}{'token'};
my $stats = `curl --header "Content-Type:application/json" --header "X-Session:$session_id" https://sg-api.dss.husqvarnagroup.net/sg-1/devices?locationId=$location_id`;
my $decoded_stats = decode_json( $stats );
# sileno battery bat level bat charging
#devices [1] abilities [1] properties [0] value und [2] value
# [5] properties [1] value
my $batt_value = $decoded_stats->{'devices'}[1]{'abilities'}[1]{'properties'}[0]{'value'};
my $batt_is_charging = $decoded_stats->{'devices'}[1]{'abilities'}[1]{'properties'}[2]{'value'};
my $sileno_status = $decoded_stats->{'devices'}[1]{'abilities'}[4]{'properties'}[1]{'value'};
my $sileno_error = $decoded_stats->{'devices'}[1]{'abilities'}[4]{'properties'}[2]{'value'};
my $sileno_source_next_start = $decoded_stats->{'devices'}[1]{'abilities'}[4]{'properties'}[3]{'value'};
my $sileno_timestamp_next_start = $decoded_stats->{'devices'}[1]{'abilities'}[4]{'properties'}[4]{'value'};
fhem("setreading Sileno battery_value $batt_value");
fhem("setreading Sileno battery_is_charging $batt_is_charging");
fhem("setreading Sileno status $sileno_status");
fhem("setreading Sileno error $sileno_error");
fhem("setreading Sileno source_next_start $sileno_source_next_start");
fhem("setreading Sileno next_start $sileno_timestamp_next_start");
}
und in der fhem.cfg den alle Minute Timer aufziehen und ggf noch den Status aufhübschen:
define SilenoStatusCall at +*00:01:00 {sileno_status}
attr SilenoStatusCall room Garten,Roboter
attr Sileno stateFormat status batt: battery_value
Zitat von: CoolTux am 11 Juli 2017, 16:02:51
Ich habe heute eine Mail an meinen Gardena Kontakt geschrieben wo eine kleine Anforderungsliste drin steht. Im Grunde geht es nur um API Doku und eventuell ein Starterkit als Muster. Mal schauen was wird.
Habe Antwort von einem Techniker bekommen
Zitat
herzlichen Dank für Ihre Nachricht an Joachim Müller und Ihr Interesse an unserem GARDENA smart system. Ich bedauere, dass ich Ihnen aktuell leider keine öffentlich zugängliche API anbieten kann, halte Sie jedoch sehr gerne über Entwicklungen in diesem Bereich auf dem Laufenden. Bis dahin viel Erfolg mit Ihrem Smart Home Framework.
hab in meinem ersten post noch das NOTIFY gegen ein DOIF getauscht, glaub das ist wesentlich besser, da sich sonst zu oft der State wechselt im notify und jedesmal die _cmd Funktion aufgerufen wurde...
:)
Hi
Wollte gerade die Erweiterung: zyklischer Status Poll von Batterie... einbauen dann bekomm ich aber diese Fehlermeldung, liegt es an mir ?
2017.07.19 20:27:47 3: SilenoStatusCall: Usage: setreading <name> <reading> <value>
where <name> is a single device name, a list separated by komma (,) or a regexp. See the devspec section in the commandref.html for details.
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0
100 228 100 165 100 63 485 185 --:--:-- --:--:-- --:--:-- 486
2017.07.19 20:28:47 3: setreading Sileno battery_value : Usage: setreading <name> <reading> <value>
where <name> is a single device name, a list separated by komma (,) or a regexp. See the devspec section in the commandref.html for details.
2017.07.19 20:28:47 3: setreading Sileno battery_is_charging : Usage: setreading <name> <reading> <value>
where <name> is a single device name, a list separated by komma (,) or a regexp. See the devspec section in the commandref.html for details.
2017.07.19 20:28:47 3: setreading Sileno status : Usage: setreading <name> <reading> <value>
where <name> is a single device name, a list separated by komma (,) or a regexp. See the devspec section in the commandref.html for details.
2017.07.19 20:28:47 3: setreading Sileno error : Usage: setreading <name> <reading> <value>
where <name> is a single device name, a list separated by komma (,) or a regexp. See the devspec section in the commandref.html for details.
2017.07.19 20:28:47 3: setreading Sileno source_next_start : Usage: setreading <name> <reading> <value>
where <name> is a single device name, a list separated by komma (,) or a regexp. See the devspec section in the commandref.html for details.
2017.07.19 20:28:47 3: setreading Sileno next_start : Usage: setreading <name> <reading> <value>
where <name> is a single device name, a list separated by komma (,) or a regexp. See the devspec section in the commandref.html for details.
2017.07.19 20:28:47 3: SilenoStatusCall: Usage: setreading <name> <reading> <value>
where <name> is a single device name, a list separated by komma (,) or a regexp. See the devspec section in the commandref.html for details.
Zitat von: SebastianN am 19 Juli 2017, 20:42:49
Hi
Wollte gerade die Erweiterung: zyklischer Status Poll von Batterie... einbauen dann bekomm ich aber diese Fehlermeldung, liegt es an mir ?
2017.07.19 20:27:47 3: SilenoStatusCall: Usage: setreading <name> <reading> <value>
where <name> is a single device name, a list separated by komma (,) or a regexp. See the devspec section in the commandref.html for details.
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0
100 228 100 165 100 63 485 185 --:--:-- --:--:-- --:--:-- 486
2017.07.19 20:28:47 3: setreading Sileno battery_value : Usage: setreading <name> <reading> <value>
where <name> is a single device name, a list separated by komma (,) or a regexp. See the devspec section in the commandref.html for details.
2017.07.19 20:28:47 3: setreading Sileno battery_is_charging : Usage: setreading <name> <reading> <value>
where <name> is a single device name, a list separated by komma (,) or a regexp. See the devspec section in the commandref.html for details.
2017.07.19 20:28:47 3: setreading Sileno status : Usage: setreading <name> <reading> <value>
where <name> is a single device name, a list separated by komma (,) or a regexp. See the devspec section in the commandref.html for details.
2017.07.19 20:28:47 3: setreading Sileno error : Usage: setreading <name> <reading> <value>
where <name> is a single device name, a list separated by komma (,) or a regexp. See the devspec section in the commandref.html for details.
2017.07.19 20:28:47 3: setreading Sileno source_next_start : Usage: setreading <name> <reading> <value>
where <name> is a single device name, a list separated by komma (,) or a regexp. See the devspec section in the commandref.html for details.
2017.07.19 20:28:47 3: setreading Sileno next_start : Usage: setreading <name> <reading> <value>
where <name> is a single device name, a list separated by komma (,) or a regexp. See the devspec section in the commandref.html for details.
2017.07.19 20:28:47 3: SilenoStatusCall: Usage: setreading <name> <reading> <value>
where <name> is a single device name, a list separated by komma (,) or a regexp. See the devspec section in the commandref.html for details.
Und wie genau hast Du es versucht ein zu bauen?
Hab den Code unter mein bestehendes 99_myUtils.pm gehängt.
sub sileno_status {
my $device_id = "1111-123123-4123123f-b48f-9b111111c";
my $location_id = "83333335-2f1a-433337-a337-a333334";
my $gardena_email = "bigcheese.fhem\@deinserver.de";
my $gardena_password = "deinpasswort";
my $curl = `curl --data '{"sessions":{"email":"$gardena_email","password":"$gardena_password"}}' --header "Content-Type:application/json" https://sg-api.dss.husqvarnagroup.net/sg-1/sessions`;
my $decoded_json = decode_json( $curl );
my $session_id = $decoded_json->{'sessions'}{'token'};
my $stats = `curl --header "Content-Type:application/json" --header "X-Session:$session_id" https://sg-api.dss.husqvarnagroup.net/sg-1/devices?locationId=$location_id`;
my $decoded_stats = decode_json( $stats );
# sileno battery bat level bat charging
#devices [1] abilities [1] properties [0] value und [2] value
# [5] properties [1] value
my $batt_value = $decoded_stats->{'devices'}[1]{'abilities'}[1]{'properties'}[0]{'value'};
my $batt_is_charging = $decoded_stats->{'devices'}[1]{'abilities'}[1]{'properties'}[2]{'value'};
my $sileno_status = $decoded_stats->{'devices'}[1]{'abilities'}[4]{'properties'}[1]{'value'};
my $sileno_error = $decoded_stats->{'devices'}[1]{'abilities'}[4]{'properties'}[2]{'value'};
my $sileno_source_next_start = $decoded_stats->{'devices'}[1]{'abilities'}[4]{'properties'}[3]{'value'};
my $sileno_timestamp_next_start = $decoded_stats->{'devices'}[1]{'abilities'}[4]{'properties'}[4]{'value'};
fhem("setreading Sileno battery_value $batt_value");
fhem("setreading Sileno battery_is_charging $batt_is_charging");
fhem("setreading Sileno status $sileno_status");
fhem("setreading Sileno error $sileno_error");
fhem("setreading Sileno source_next_start $sileno_source_next_start");
fhem("setreading Sileno next_start $sileno_timestamp_next_start");
}
Ist eventuell Deine Variable battery_value leer?
Hab die manuell mit setreading Sileno battery_value 100
gesetzt aber eigentlich sollte er die doch selber anlegen.
Das ist das Problem wenn man kopiert ohne sich damit zu beschäftigen
my $batt_value = $decoded_stats->{'devices'}[1]{'abilities'}[1]{'properties'}[0]{'value'};
Hier erfolgt die das Zuweisen des Wertes für die Variable batt_value. Eventuell gibt es hier schon Probleme. Du müsst hier Debuggen um zu schauen welcher Wert tatsächlich hier
$decoded_stats->{'devices'}[1]{'abilities'}[1]{'properties'}[0]{'value'};
drin steckt.
Hallo
Habe meinen Sileno heute auch mal einbinden wollen.
bekommen im LOG diese Meldungen zyklisch jede Minute:
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0
100 112 100 55 100 57 185 191 --:--:-- --:--:-- --:--:-- 192
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0
2017.07.19 21:14:52 1: ERROR evaluating {sileno_status}: malformed JSON string, neither tag, array, object, number, string or atom, at character offset 0 (before "(end of string)") at ./FHEM/99_myUtils.pm line 108.
2017.07.19 21:14:52 3: SilenoStatusCall: malformed JSON string, neither tag, array, object, number, string or atom, at character offset 0 (before "(end of string)") at ./FHEM/99_myUtils.pm line 108.
Hier die routine aus der 99_myUtils.pm
###################################################
### Gardena Sileno Status ###
###################################################
sub sileno_status {
my $device_id = "832xxx2f-f99e-484c-9380-7faxxxfb1b6f";
my $location_id = "21xxxb6b-3bfb-46a8-905d-818xxx3bf999";
my $gardena_email = "xx\@xxxxxt";
my $gardena_password = "yyyyyyyyyy";
my $curl = `curl --data '{"sessions":{"email":"$gardena_email","password":"$gardena_password"}}' --header "Content-Type:application/json" https://sg-api.dss.husqvarnagroup.net/sg-1/sessions`;
my $decoded_json = decode_json( $curl );
my $session_id = $decoded_json->{'sessions'}{'token'};
my $stats = `curl --header "Content-Type:application/json" --header "X-Session:$session_id" https://sg-api.dss.husqvarnagroup.net/sg-1/devices?locationId=$location_id`;
my $decoded_stats = decode_json( $stats );
# sileno battery bat level bat charging
#devices [1] abilities [1] properties [0] value und [2] value
# [5] properties [1] value
my $batt_value = $decoded_stats->{'devices'}[1]{'abilities'}[1]{'properties'}[0]{'value'};
my $batt_is_charging = $decoded_stats->{'devices'}[1]{'abilities'}[1]{'properties'}[2]{'value'};
my $sileno_status = $decoded_stats->{'devices'}[1]{'abilities'}[4]{'properties'}[1]{'value'};
my $sileno_error = $decoded_stats->{'devices'}[1]{'abilities'}[4]{'properties'}[2]{'value'};
my $sileno_source_next_start = $decoded_stats->{'devices'}[1]{'abilities'}[4]{'properties'}[3]{'value'};
my $sileno_timestamp_next_start = $decoded_stats->{'devices'}[1]{'abilities'}[4]{'properties'}[4]{'value'};
fhem("setreading Sileno battery_value $batt_value");
fhem("setreading Sileno battery_is_charging $batt_is_charging");
fhem("setreading Sileno status $sileno_status");
fhem("setreading Sileno error $sileno_error");
fhem("setreading Sileno source_next_start $sileno_source_next_start");
fhem("setreading Sileno next_start $sileno_timestamp_next_start");
}
Fehlt mir da noch ein Perl modul? oder was könnte die ursache sein?
leider ist das roboter forum derzeit offline. ich bekomme 2 device id zurück. welche muss ich nehmen? die erste oder zweite? welche ist das gateway?
Danke und Gruß Michael
also die zyklischen tabellen sind normal mbrak, die bekommst wegen curl (das ist die status ausgabe... kannst z.b. mal auf commandline ohne FHEM aufrufen dann siehst was ich meine...
zu den werten: ich hab z.b. nur den Sileno... kann mir gut vorstellen wenn jemand noch zusätzlich den smart sensor oder den watercontrol hat, ist die reihenfolge anders im JSON und man muss in andere elemente reinspringen...
wenn man es generisch macht könnte man nat. alle elemente vorher abfragen wie sie heissen und nur in die relevanten reinspringen und die stelle im json merken :)
ich habs so gemacht: den curl wo alle devices zurückkommen per commandline ausgeführt, dann das riesen json in den jsonlint (website) geworfen, dann bekommt man es schön strukturiert... (oder benutzt den Dumper in perl)...
und dann muss man einfach durchzählen... json beinhaltet arrays... und je nachdem welche stell die muss da in die klammern rein quasi :)
anbei ein perl file mit dem man ggf leichter debuggen kann... Dumper is mit drin und am ende kommen 3 werte... (bei mir) :)
UPDATE: wenn man in dem perl file noch vor dem print Dumper folgende Zeile einfügt:
$Data::Dumper::Indent = 3;
Dann schreibt er in den Output auch die Zahlen schon rein... d.h. nur noch zu der Zeile / Objekt gehen die man will und man sieht die Zahl die man braucht :)
Vielleicht erbarmt sich ja jemand und schreibt es so um das es auf die Namen bzw. devices geht die wichtig sind... :) ich bin ne Niete in Perl :)
Grad nochmal geguckt: 0. Device ist bei mir das Gateway, das willst ja nicht, 1. Device ist Sileno, drum die 1 bei der ersten Klammer... Vielleicht isses das auch schon, ggf kommen die anderen in der gleichen Reihenfolge... musst also die geschweiften Klammern zählen an welcher Stelle im Array der Sileno steht :)
Hi
glaube einen Teil hab ich schonmal gefunden.
In meinem Gardena Passwort kommt zweimal das "@" Zeichen vor. Habe hier nun jeweils ein"\" voran gestellt und ich bekomme andere Werte ohne Meckerei....
Mal schauen was fhem jetzt sagt.
EDIT
Jetzt geht es !!!! Danke !!!
kann man die Ausgabe von curl im log unterdrücken oder umleiten? Das macht es sehr unübersichtlich.....
Zitat von: mbrak am 19 Juli 2017, 23:05:40
kann man die Ausgabe von curl im log unterdrücken oder umleiten? Das macht es sehr unübersichtlich.....
gute idee ;) dazu einfach bei "curl" ein "-s" für silent anhängen... schon is nix mehr im log davon :)... also aufruf:
curl -s --data ....
Klasse !!!!!! Vielen Dank [emoji4]
Hallo
ich wollte mal die Statusanzeige gemäß der deutschen Schreibweise abändern. Dazu wollte ich eine Variable abfragen und ummappen
if ( $sileno_status eq 'parked_autotimer') {
my $sileno_status_D = 'Geparkt durch SensorControl'
}
elseif ( $sileno_status eq 'paused') {
my $sileno_status_D = 'Pausiert'
}
elseif ( $sileno_status eq 'ok_cutting') {
my $sileno_status_D = 'Mähen'
}
elseif ( $sileno_status eq 'ok_searching') {
my $sileno_status_D = 'Suche Ladestation'
}
elseif ( $sileno_status eq 'ok_charging') {
my $sileno_status_D = 'Lädt'
}
elseif ( $sileno_status eq 'ok_leaving') {
my $sileno_status_D = 'Mähen'
}
elseif ( $sileno_status eq 'parked_timer') {
my $sileno_status_D = 'Geparkt nach Zeitplan'
}
elseif ( $sileno_status eq 'off_disabled') {
my $sileno_status_D = 'Der Mäher ist ausgeschaltet'
}
elseif ( $sileno_status eq 'parked_park_selected') {
my $sileno_status_D = 'Geparkt'
}
elseif ( $sileno_status eq 'off_hatch_open') {
my $sileno_status_D = 'Deaktiviert. Abdeckung ist offen oder PIN-Code erforderlich'
}
elseif ( $sileno_status eq 'error') {
my $sileno_status_D = 'Fehler'
}
elseif ( $sileno_status eq 'error_at_power_up') {
my $sileno_status_D = 'Neustart ...'
}
elseif ( $sileno_status eq 'off_hatch_closed') {
my $sileno_status_D = 'Deaktiviert. Manueller Start erforderlich'
}
elseif ( $sileno_status eq 'ok_cutting_timer_overridden') {
my $sileno_status_D = 'Manuelles Mähen'
}
else ( $sileno_status eq 'parked_daily_limit_reached') {
my $sileno_status_D = 'Abgeschlossen'
}
Bekomme dabei aber eine Fehlermeldung nach dem speichern.....
Kann ein PERL Guru da mal schauen warum?
Ich habe die Mapping Liste aus dem Roboter Forum
Funkempfang
=================================
1=Schlecht
2=Gut
3=Exzellent
undefined=Undefiniert
poor=Schlecht
good=Gut
excellent=Exzellent
Status
=================================
paused=Pausiert
ok_cutting=Mähen
ok_searching=Suche Ladestation
ok_charging=Lädt
ok_leaving=Mähen
wait_updating=Wird aktualisiert ...
wait_power_up=Wird eingeschaltet ...
parked_timer=Geparkt nach Zeitplan
parked_park_selected=Geparkt
off_disabled=Der Mäher ist ausgeschaltet
off_hatch_open=Deaktiviert. Abdeckung ist offen oder PIN-Code erforderlich
unknown=Unbekannter Status
error=Fehler
error_at_power_up=Neustart ...
off_hatch_closed=Deaktiviert. Manueller Start erforderlich
ok_cutting_timer_overridden=Manuelles Mähen
parked_autotimer=Geparkt durch SensorControl
parked_daily_limit_reached=Abgeschlossen
Fehlermeldungen
=================================
no_message=Kein Fehler
outside_working_area=Außerhalb des Arbeitsbereichs
no_loop_signal=Kein Schleifensignal
wrong_loop_signal=Falsches Schleifensignal
loop_sensor_problem_front=Problem Schleifensensor, vorne
loop_sensor_problem_rear=Problem Schleifensensor, hinten
trapped=Eingeschlossen
upside_down=Steht auf dem Kopf
low_battery=Niedriger Batteriestand
empty_battery=empty_battery
no_drive=no_drive
lifted=Angehoben
stuck_in_charging_station=Eingeklemmt in Ladestation
charging_station_blocked=Ladestation blockiert
collision_sensor_problem_rear=Problem Stoßsensor hinten
collision_sensor_problem_front=Problem Stoßsensor vorne
wheel_motor_blocked_right=Radmotor rechts blockiert
wheel_motor_blocked_left=Radmotor links blockiert
wheel_drive_problem_right=Problem Antrieb, rechts
wheel_drive_problem_left=Problem Antrieb, links
cutting_system_blocked=Schneidsystem blockiert
invalid_sub_device_combination=Fehlerhafte Verbindung
settings_restored=Standardeinstellungen
electronic_problem=Elektronisches Problem
charging_system_problem=Problem Ladesystem
tilt_sensor_problem=Kippsensorproblem
wheel_motor_overloaded_right=Rechter Radmotor überlastet
wheel_motor_overloaded_left=Linker Radmotor überlastet
charging_current_too_high=Ladestrom zu hoch
temporary_problem=Vorübergehendes Problem
guide_1_not_found=SK 1 nicht gefunden
guide_2_not_found=SK 2 nicht gefunden
guide_3_not_found=SK 3 nicht gefunden
difficult_finding_home=Problem die Ladestation zu finden
guide_calibration_accomplished=Kalibration des Suchkabels beendet
guide_calibration_failed=Kalibration des Suchkabels fehlgeschlagen
temporary_battery_problem=Kurzzeitiges Batterieproblem
battery_problem=Batterieproblem
alarm_mower_switched_off=Alarm! Mäher ausgeschalten
alarm_mower_stopped=Alarm! Mäher gestoppt
alarm_mower_lifted=Alarm! Mäher angehoben
alarm_mower_tilted=Alarm! Mäher gekippt
connection_changed=Verbindung geändert
connection_not_changed=Verbindung nicht geändert
com_board_not_available=COM board nicht verfügbar
slipped=Rutscht
?????
=================================
out_of_operation=Ausser Betrieb
replace_now=Kritischer Batteriestand, wechseln Sie jetzt
low=Niedrig
ok=OK
Semikolon am Ende der Zuweisungszeile
Falls immer noch Fehlermeldungen kommen wären sie ein wenig hilfreich um weiter helfen zu können.
Hi
Sorry vergass die Meldung :)
syntax error at ./FHEM/99_myUtils.pm line 128, near ") {" syntax error at ./FHEM/99_myUtils.pm line 131, near ") {" syntax error at ./FHEM/99_myUtils.pm line 181, near "}" Can't use global @_ in "my" at ./FHEM/99_myUtils.pm line 188, near "= @_" syntax error at ./FHEM/99_myUtils.pm line 191, near "}" syntax error at ./FHEM/99_myUtils.pm line 247, near "}"
Hast Du die Semikolons gesetzt?
if ( $sileno_status eq 'parked_autotimer') {
my $sileno_status_D = 'Geparkt durch SensorControl';
}
elseif ( $sileno_status eq 'paused') {
my $sileno_status_D = 'Pausiert';
}
elseif ( $sileno_status eq 'ok_cutting') {
my $sileno_status_D = 'Mähen';
Meinst Du so hier?
Ja hab ich. Keine Änderung
Wann nehme ich Anführungszeichen "" und wann das Hochkomma ' ' ??
Sorry mit PERL hab ich es nicht so :)
In ' ' eingeschlossen ist es immer ein String. Du kannst also auch ' $test ' schreiben und er macht definitiv ein String $test. Wird also nicht als Variable behandelt.
In " " wird sofern eine Variable abgefragt wird auch der Inhalt der Variable und nicht die Variable selber eingesetzt.
my $sileno_status_D;
if ( $sileno_status eq 'parked_autotimer') {
$sileno_status_D = 'Geparkt durch SensorControl';
}
elseif ( $sileno_status eq 'paused') {
$sileno_status_D = 'Pausiert';
}
elseif ( $sileno_status eq 'ok_cutting') {
$sileno_status_D = 'Mähen';
}
Sehe aktuell kein Problem. Dieser Code sollte eigentlich klappen. Kann es aber gerade nicht checken.
SO! Das Mapping läuft!
Wer gerne deutschsprachige Meldetexte haben möchte für Status und Error der möge bitte folgendes tun:
Oben hinter der Subroutine die beiden neuen Variablen definieren:
my $sileno_status_D;
my $sileno_error_D;
Den nachfolgenden Code vor den letzten Zeilen mit fhem("setreading Sileno ....... einfügen.
if ( $sileno_status eq "parked_autotimer") {
$sileno_status_D = "Geparkt durch SensorControl";
}
elsif ( $sileno_status eq "paused") {
$sileno_status_D = "Pausiert";
}
elsif ( $sileno_status eq "ok_cutting") {
$sileno_status_D = "Mähen";
}
elsif ( $sileno_status eq "ok_searching") {
$sileno_status_D = "Suche Ladestation";
}
elsif ( $sileno_status eq "ok_charging") {
$sileno_status_D = "Lädt";
}
elsif ( $sileno_status eq "ok_leaving") {
$sileno_status_D = "Mähen";
}
elsif ( $sileno_status eq "parked_timer") {
$sileno_status_D = "Geparkt nach Zeitplan";
}
elsif ( $sileno_status eq "off_disabled") {
$sileno_status_D = "Der Mäher ist ausgeschaltet";
}
elsif ( $sileno_status eq "parked_park_selected") {
$sileno_status_D = "Geparkt";
}
elsif ( $sileno_status eq "off_hatch_open") {
$sileno_status_D = "Deaktiviert. Abdeckung ist offen oder PIN-Code erforderlich";
}
elsif ( $sileno_status eq "error") {
$sileno_status_D = "Fehler";
}
elsif ( $sileno_status eq "error_at_power_up") {
$sileno_status_D = "Neustart ...";
}
elsif ( $sileno_status eq "off_hatch_closed") {
$sileno_status_D = "Deaktiviert. Manueller Start erforderlich";
}
elsif ( $sileno_status eq "ok_cutting_timer_overridden") {
$sileno_status_D = "Manuelles Mähen";
}
elsif ( $sileno_status eq "parked_daily_limit_reached") {
$sileno_status_D = "Abgeschlossen";
}
if ( $sileno_error eq "no_message") {
$sileno_error_D = "Kein Fehler";
}
elsif ( $sileno_error eq "outside_working_area") {
$sileno_error_D = "Außerhalb des Arbeitsbereichs";
}
elsif ( $sileno_error eq "no_loop_signal") {
$sileno_error_D = "Kein Schleifensignal";
}
elsif ( $sileno_error eq "wrong_loop_signal") {
$sileno_error_D = "Falsches Schleifensignal";
}
elsif ( $sileno_error eq "loop_sensor_problem_front") {
$sileno_error_D = "Problem Schleifensensor, vorne";
}
elsif ( $sileno_error eq "loop_sensor_problem_rear") {
$sileno_error_D = "Problem Schleifensensor, hinten";
}
elsif ( $sileno_error eq "trapped") {
$sileno_error_D = "Eingeschlossen";
}
elsif ( $sileno_error eq "upside_down") {
$sileno_error_D = "Steht auf dem Kopf";
}
elsif ( $sileno_error eq "low_battery") {
$sileno_error_D = "Niedriger Batteriestand";
}
elsif ( $sileno_error eq "empty_battery") {
$sileno_error_D = "Batterie ist leer";
}
elsif ( $sileno_error eq "no_drive") {
$sileno_error_D = "Kein Antrieb";
}
elsif ( $sileno_error eq "lifted") {
$sileno_error_D = "Angehoben";
}
elsif ( $sileno_error eq "stuck_in_charging_station") {
$sileno_error_D = "Eingeklemmt in Ladestation";
}
elsif ( $sileno_error eq "charging_station_blocked") {
$sileno_error_D = "Ladestation blockiert";
}
elsif ( $sileno_error eq "collision_sensor_problem_rear") {
$sileno_error_D = "Problem Stoßsensor hinten";
}
elsif ( $sileno_error eq "collision_sensor_problem_front") {
$sileno_error_D = "Problem Stoßsensor vorne";
}
elsif ( $sileno_error eq "wheel_motor_blocked_right") {
$sileno_error_D = "Radmotor rechts blockiert";
}
elsif ( $sileno_error eq "wheel_motor_blocked_left") {
$sileno_error_D = "Radmotor links blockiert";
}
elsif ( $sileno_error eq "wheel_drive_problem_right") {
$sileno_error_D = "Problem Antrieb, rechts";
}
elsif ( $sileno_error eq "wheel_drive_problem_left") {
$sileno_error_D = "Problem Antrieb, links";
}
elsif ( $sileno_error eq "cutting_system_blocked") {
$sileno_error_D = "Schneidsystem blockiert";
}
elsif ( $sileno_error eq "invalid_sub_device_combination") {
$sileno_error_D = "Fehlerhafte Verbindung";
}
elsif ( $sileno_error eq "settings_restored") {
$sileno_error_D = "Standardeinstellungen";
}
elsif ( $sileno_error eq "electronic_problem") {
$sileno_error_D = "Elektronisches Problem";
}
elsif ( $sileno_error eq "charging_system_problem") {
$sileno_error_D = "Problem Ladesystem";
}
elsif ( $sileno_error eq "tilt_sensor_problem") {
$sileno_error_D = "Kippsensorproblem";
}
elsif ( $sileno_error eq "wheel_motor_overloaded_right") {
$sileno_error_D = "Rechter Radmotor überlastet";
}
elsif ( $sileno_error eq "wheel_motor_overloaded_left") {
$sileno_error_D = "Linker Radmotor überlastet";
}
elsif ( $sileno_error eq "charging_current_too_high") {
$sileno_error_D = "Ladestrom zu hoch";
}
elsif ( $sileno_error eq "temporary_problem") {
$sileno_error_D = "Vorübergehendes Problem";
}
elsif ( $sileno_error eq "guide_1_not_found") {
$sileno_error_D = "SK 1 nicht gefunden";
}
elsif ( $sileno_error eq "guide_2_not_found") {
$sileno_error_D = "SK 2 nicht gefunden";
}
elsif ( $sileno_error eq "guide_3_not_found") {
$sileno_error_D = "SK 3 nicht gefunden";
}
elsif ( $sileno_error eq "difficult_finding_home") {
$sileno_error_D = "Problem die Ladestation zu finden";
}
elsif ( $sileno_error eq "guide_calibration_accomplished") {
$sileno_error_D = "Kalibration des Suchkabels beendet";
}
elsif ( $sileno_error eq "guide_calibration_failed") {
$sileno_error_D = "Kalibration des Suchkabels fehlgeschlagen";
}
elsif ( $sileno_error eq "temporary_battery_problem") {
$sileno_error_D = "Kurzzeitiges Batterieproblem";
}
elsif ( $sileno_error eq "battery_problem") {
$sileno_error_D = "Batterieproblem";
}
elsif ( $sileno_error eq "alarm_mower_switched_off") {
$sileno_error_D = "Alarm! Mäher ausgeschalten";
}
elsif ( $sileno_error eq "alarm_mower_stopped") {
$sileno_error_D = "Alarm! Mäher gestoppt";
}
elsif ( $sileno_error eq "alarm_mower_lifted") {
$sileno_error_D = "Alarm! Mäher angehoben";
}
elsif ( $sileno_error eq "alarm_mower_tilted") {
$sileno_error_D = "Alarm! Mäher gekippt";
}
elsif ( $sileno_error eq "connection_changed") {
$sileno_error_D = "Verbindung geändert";
}
elsif ( $sileno_error eq "connection_not_changed") {
$sileno_error_D = "Verbindung nicht geändert";
}
elsif ( $sileno_error eq "com_board_not_available") {
$sileno_error_D = "COM board nicht verfügbar";
}
elsif ( $sileno_error eq "slipped") {
$sileno_error_D = "Rutscht";
}
Dann noch die beiden Variablen unten anpassen:
fhem("setreading Sileno status $sileno_status_D");
fhem("setreading Sileno error $sileno_error_D");
Für dem Rest muss ich noch sammeln und übersetzen.
So wie der Code da jetzt steht wird er eventuell nicht gehen.
Wird an einer früheren Stelle
$sileno_status_D
Initialisiert?
Bis jetzt geht's ohne....
Wo an welcher Stelle in der 99_myUtils.pm muss man das machen?
Eine Variable deklariert man immer bevor man sie das erste mal verwendet.
Immer diese Hochsprachen [emoji23][emoji23][emoji23][emoji23]
Ich werde es gleich machen
Hallo Gardena Sileno Freunde
ich habe mich mal durch das JSON Array gewühlt und bekomme mittlerweile diese Readings.
Zitat von: mbrak am 24 Juli 2017, 18:41:52
Hallo Gardena Sileno Freunde
ich habe mich mal durch das JSON Array gewühlt und bekomme mittlerweile diese Readings.
Hast Du mehr wie ein Gardena Smart Device?
Ich suche jemanden der wenigsten 2-3 unterschiedliche Devices hat und Interesse an der Modulentwicklung mit zu machen.
Hi
leider nur den Mäher. Regnen tut es ja von alleine.
Nein Spass beiseite. Wenn ich dir trotzdem helfen kann dann sehr gerne!
Die paar Infos die es gibt muss man sich mühsam zusammen tragen. Da helfe ich wo ich kann!
Gruß Michael
Also ich komme gerne auf Dein Angebot zurück wenn ich niemanden finde.
Wäre aber schon schön wenn wir hier jemanden hätten mit 2-3 Geräten um das automatische anlegen der unterschiedlichen Modelle zu testen und der damit einhergehenden automatischen Set Liste.
Hi,
ich hätte einen Mäher und WaterControl im Angebot zusätzlich könnte aber noch einen Regensensor am Gateway anlernen ..
ergo ständen 3 Geräte zur Verfügung.
Grüße
Gesendet von iPhone mit Tapatalk
Zitat von: Kenneth am 25 Juli 2017, 10:30:22
Hi,
ich hätte einen Mäher und WaterControl im Angebot zusätzlich könnte aber noch einen Regensensor am Gateway anlernen ..
ergo ständen 3 Geräte zur Verfügung.
Grüße
Gesendet von iPhone mit Tapatalk
Das wäre genau das was ich bräuchte. Hättest Lust und Zeit mir bei der Entwicklung zu helfen? Keine Angst, das ganze dauert noch ein klein wenig. Allerdings bräuchte ich dann Deinen Zugang wenn das möglich wäre.
Grüße
Hi,
Zeit würde sich finden lassen sollte also kein Problem sein. Zugang [emoji15]. mhhh ok wenn du alles sauber und ordentlich hinterlässt [emoji12]..
Gesendet von iPhone mit Tapatalk
Zitat von: Kenneth am 25 Juli 2017, 10:45:22
Hi,
Zeit würde sich finden lassen sollte also kein Problem sein. Zugang [emoji15]. mhhh ok wenn du alles sauber und ordentlich hinterlässt [emoji12]..
Gesendet von iPhone mit Tapatalk
Hihi, keine Sorge. Ich habe nicht vor da irgendwas um zu stellen oder so. Ich benötige nur die Daten für den Token und die global_id. Danach muß ich mir anschauen wie der JSON aufgebaut ist und wie ich daraus am besten automatisch alle gefundenen Devices anlegen lasse. Mehr nicht.
Grüße
hi cooltux
den json kann ich dir schicken. den habe ich gestern mal komplett in eine datei umgeleitet.
hab allerdings nur meinen "robert" da drinne....
gruß michael
nur Spaß und wahrscheinlich würdest eh ne Menge an Optimierungsmöglichkeiten finden ^^
Meld dich einfach wenn es soweit ist, evtl. schreibst du mir schon mal vorher via PM was du alles an Zugängen benötigst SFTP oder nur FHEM-WEB...
Grüße
Matthias
Zitat von: mbrak am 25 Juli 2017, 11:04:54
hi cooltux
den json kann ich dir schicken. den habe ich gestern mal komplett in eine datei umgeleitet.
hab allerdings nur meinen "robert" da drinne....
gruß michael
Danke das ist nett. Ein JSON an sich habe ich ja auch im Netz gefunden, ich brauche das alles live. Also wenn ich den direkt mir vom account hole.
Zitat von: Kenneth am 25 Juli 2017, 11:05:55
nur Spaß und wahrscheinlich würdest eh ne Menge an Optimierungsmöglichkeiten finden ^^
Meld dich einfach wenn es soweit ist, evtl. schreibst du mir schon mal vorher via PM was du alles an Zugängen benötigst SFTP oder nur FHEM-WEB...
Grüße
Matthias
Ich brauche ja nicht Deine FHEM Daten sondern die vom Gardena Account. Oder ich habe es absolut falsch verstanden. Aber das was ich bis jetzt gefunden habe geht alles über die Cloud API von Gardena.
natürlich nur die Daten für den Gardena ACC .. ::) da hatte ich dich missverstanden ^^
Supi. Dann melde ich mich wenn ich soweit bin per PN.
Du bist dann natürlich auch der erste der die Module testen darf ;D
mbrak
ist das bei dir eigentlich auch so das die Zeit für den nächsten Start (next_start) immer auf "1969-12-31T22:00Z" steht wenn er gerade mäht..
hi
die time_next_start passt soweit wenn man +2h für die zeitzone hinzurechnet. da gibt es noch ein feld mit einer override_end_time. die steht bei mir auf 1969..... hab aber im moment keinen schimmer was die mir sagen will... :)
logge die daten seit gestern mit. sieht schon recht nett aus im svg :D
Zitat von: mbrak am 25 Juli 2017, 11:58:34
die time_next_start passt soweit wenn man +2h für die zeitzone hinzurechnet. da gibt es noch ein feld mit einer override_end_time. die steht bei mir auf 1969..... hab aber im moment keinen schimmer was die mir sagen will... :)
wie gesagt nur wenn er mäht, wenn er läd passt sie .. wenn man von den 2Std mal absieht. ..stimmt sehr net der Plot.
Zitat von: mbrak am 24 Juli 2017, 18:41:52
Hallo Gardena Sileno Freunde
ich habe mich mal durch das JSON Array gewühlt und bekomme mittlerweile diese Readings.
könntest du deine sub dafür mal posten, wär super
Danke & Grüße
Matthias
ja klar. mach ich nachher wenn ich zuhause bin. hab allerdings die abfrageintervalle auf 5 min. hochgedreht weil mir das ein wenig viel traffic und logfile produzierte. reicht mir aber von der auflösung.
Gruß Michael
Hallo
hier nun meine finale subroutine bis es ein fertiges modul geben wird ;D
sub sileno_status {
my $device_id = "DEINE DEVICE ID";
my $location_id = "DEINE LOCATION ID";
my $gardena_email = "DEINE\@EMAIL.ADRESSE";
my $gardena_password = "DEIN GARDENA PASSWORT";
my $sileno_status_D;
my $sileno_error_D;
my $sileno_source_next_start_D;
my $curl = `curl -s --data '{"sessions":{"email":"$gardena_email","password":"$gardena_password"}}' --header "Content-Type:application/json" https://sg-api.dss.husqvarnagroup.net/sg-1/sessions`;
my $decoded_json = decode_json( $curl );
my $session_id = $decoded_json->{'sessions'}{'token'};
my $stats = `curl -s --header "Content-Type:application/json" --header "X-Session:$session_id" https://sg-api.dss.husqvarnagroup.net/sg-1/devices?locationId=$location_id`;
my $decoded_stats = decode_json( $stats );
my $sileno_manufacturer = $decoded_stats->{'devices'}[1]{'abilities'}[0]{'properties'}[0]{'value'};
my $sileno_product = $decoded_stats->{'devices'}[1]{'abilities'}[0]{'properties'}[1]{'value'};
my $sileno_serial_number = $decoded_stats->{'devices'}[1]{'abilities'}[0]{'properties'}[2]{'value'};
my $sileno_version = $decoded_stats->{'devices'}[1]{'abilities'}[0]{'properties'}[3]{'value'};
my $sileno_category = $decoded_stats->{'devices'}[1]{'abilities'}[0]{'properties'}[4]{'value'};
my $sileno_last_time_online = $decoded_stats->{'devices'}[1]{'abilities'}[0]{'properties'}[5]{'value'};
my $sileno_sgtin = $decoded_stats->{'devices'}[1]{'abilities'}[0]{'properties'}[6]{'value'};
my $batterie_value = $decoded_stats->{'devices'}[1]{'abilities'}[1]{'properties'}[0]{'value'};
my $batterie_status = $decoded_stats->{'devices'}[1]{'abilities'}[1]{'properties'}[1]{'value'};
my $batterie_is_charging = $decoded_stats->{'devices'}[1]{'abilities'}[1]{'properties'}[2]{'value'};
my $sileno_quality = $decoded_stats->{'devices'}[1]{'abilities'}[2]{'properties'}[0]{'value'};
my $sileno_connection_status = $decoded_stats->{'devices'}[1]{'abilities'}[2]{'properties'}[1]{'value'};
my $sileno_state = $decoded_stats->{'devices'}[1]{'abilities'}[2]{'properties'}[2]{'value'};
my $sileno_temparture = $decoded_stats->{'devices'}[1]{'abilities'}[3]{'properties'}[0]{'value'};
my $sileno_manual_operation = $decoded_stats->{'devices'}[1]{'abilities'}[4]{'properties'}[0]{'value'};
my $sileno_status = $decoded_stats->{'devices'}[1]{'abilities'}[4]{'properties'}[1]{'value'};
my $sileno_error = $decoded_stats->{'devices'}[1]{'abilities'}[4]{'properties'}[2]{'value'};
my $sileno_source_next_start = $decoded_stats->{'devices'}[1]{'abilities'}[4]{'properties'}[3]{'value'};
my $sileno_timestamp_next_start = $decoded_stats->{'devices'}[1]{'abilities'}[4]{'properties'}[4]{'value'};
my $sileno_override_end_time = $decoded_stats->{'devices'}[1]{'abilities'}[4]{'properties'}[5]{'value'};
my $sileno_firmware_status = $decoded_stats->{'devices'}[1]{'abilities'}[5]{'properties'}[0]{'value'};
my $sileno_firmware_upload_progress = $decoded_stats->{'devices'}[1]{'abilities'}[5]{'properties'}[1]{'value'};
my $sileno_firmware_available_version = $decoded_stats->{'devices'}[1]{'abilities'}[5]{'properties'}[2]{'value'};
my $sileno_inclusion_status = $decoded_stats->{'devices'}[1]{'abilities'}[5]{'properties'}[3]{'value'};
my $sileno_firmware_update_start = $decoded_stats->{'devices'}[1]{'abilities'}[5]{'properties'}[4]{'value'};
my $sileno_firmware_command = $decoded_stats->{'devices'}[1]{'abilities'}[5]{'properties'}[5]{'value'};
if ( $sileno_status eq "parked_autotimer") {
$sileno_status_D = "Geparkt durch SensorControl";
}
elsif ( $sileno_status eq "paused") {
$sileno_status_D = "Pausiert";
}
elsif ( $sileno_status eq "ok_cutting") {
$sileno_status_D = "Mähen";
}
elsif ( $sileno_status eq "ok_searching") {
$sileno_status_D = "Suche Ladestation";
}
elsif ( $sileno_status eq "ok_charging") {
$sileno_status_D = "Lädt";
}
elsif ( $sileno_status eq "ok_leaving") {
$sileno_status_D = "Mähen";
}
elsif ( $sileno_status eq "parked_timer") {
$sileno_status_D = "Geparkt nach Zeitplan";
}
elsif ( $sileno_status eq "off_disabled") {
$sileno_status_D = "Der Mäher ist ausgeschaltet";
}
elsif ( $sileno_status eq "parked_park_selected") {
$sileno_status_D = "Geparkt";
}
elsif ( $sileno_status eq "off_hatch_open") {
$sileno_status_D = "Deaktiviert. Abdeckung ist offen oder PIN-Code erforderlich";
}
elsif ( $sileno_status eq "error") {
$sileno_status_D = "Fehler";
}
elsif ( $sileno_status eq "error_at_power_up") {
$sileno_status_D = "Neustart ...";
}
elsif ( $sileno_status eq "off_hatch_closed") {
$sileno_status_D = "Deaktiviert. Manueller Start erforderlich";
}
elsif ( $sileno_status eq "ok_cutting_timer_overridden") {
$sileno_status_D = "Manuelles Mähen";
}
elsif ( $sileno_status eq "parked_daily_limit_reached") {
$sileno_status_D = "Abgeschlossen";
}
if ( $sileno_error eq "no_message") {
$sileno_error_D = "Kein Fehler";
}
elsif ( $sileno_error eq "outside_working_area") {
$sileno_error_D = "Außerhalb des Arbeitsbereichs";
}
elsif ( $sileno_error eq "no_loop_signal") {
$sileno_error_D = "Kein Schleifensignal";
}
elsif ( $sileno_error eq "wrong_loop_signal") {
$sileno_error_D = "Falsches Schleifensignal";
}
elsif ( $sileno_error eq "loop_sensor_problem_front") {
$sileno_error_D = "Problem Schleifensensor, vorne";
}
elsif ( $sileno_error eq "loop_sensor_problem_rear") {
$sileno_error_D = "Problem Schleifensensor, hinten";
}
elsif ( $sileno_error eq "trapped") {
$sileno_error_D = "Eingeschlossen";
}
elsif ( $sileno_error eq "upside_down") {
$sileno_error_D = "Steht auf dem Kopf";
}
elsif ( $sileno_error eq "low_battery") {
$sileno_error_D = "Niedriger Batteriestand";
}
elsif ( $sileno_error eq "empty_battery") {
$sileno_error_D = "Batterie ist leer";
}
elsif ( $sileno_error eq "no_drive") {
$sileno_error_D = "Kein Antrieb";
}
elsif ( $sileno_error eq "lifted") {
$sileno_error_D = "Angehoben";
}
elsif ( $sileno_error eq "stuck_in_charging_station") {
$sileno_error_D = "Eingeklemmt in Ladestation";
}
elsif ( $sileno_error eq "charging_station_blocked") {
$sileno_error_D = "Ladestation blockiert";
}
elsif ( $sileno_error eq "collision_sensor_problem_rear") {
$sileno_error_D = "Problem Stoßsensor hinten";
}
elsif ( $sileno_error eq "collision_sensor_problem_front") {
$sileno_error_D = "Problem Stoßsensor vorne";
}
elsif ( $sileno_error eq "wheel_motor_blocked_right") {
$sileno_error_D = "Radmotor rechts blockiert";
}
elsif ( $sileno_error eq "wheel_motor_blocked_left") {
$sileno_error_D = "Radmotor links blockiert";
}
elsif ( $sileno_error eq "wheel_drive_problem_right") {
$sileno_error_D = "Problem Antrieb, rechts";
}
elsif ( $sileno_error eq "wheel_drive_problem_left") {
$sileno_error_D = "Problem Antrieb, links";
}
elsif ( $sileno_error eq "cutting_system_blocked") {
$sileno_error_D = "Schneidsystem blockiert";
}
elsif ( $sileno_error eq "invalid_sub_device_combination") {
$sileno_error_D = "Fehlerhafte Verbindung";
}
elsif ( $sileno_error eq "settings_restored") {
$sileno_error_D = "Standardeinstellungen";
}
elsif ( $sileno_error eq "electronic_problem") {
$sileno_error_D = "Elektronisches Problem";
}
elsif ( $sileno_error eq "charging_system_problem") {
$sileno_error_D = "Problem Ladesystem";
}
elsif ( $sileno_error eq "tilt_sensor_problem") {
$sileno_error_D = "Kippsensorproblem";
}
elsif ( $sileno_error eq "wheel_motor_overloaded_right") {
$sileno_error_D = "Rechter Radmotor überlastet";
}
elsif ( $sileno_error eq "wheel_motor_overloaded_left") {
$sileno_error_D = "Linker Radmotor überlastet";
}
elsif ( $sileno_error eq "charging_current_too_high") {
$sileno_error_D = "Ladestrom zu hoch";
}
elsif ( $sileno_error eq "temporary_problem") {
$sileno_error_D = "Vorübergehendes Problem";
}
elsif ( $sileno_error eq "guide_1_not_found") {
$sileno_error_D = "SK 1 nicht gefunden";
}
elsif ( $sileno_error eq "guide_2_not_found") {
$sileno_error_D = "SK 2 nicht gefunden";
}
elsif ( $sileno_error eq "guide_3_not_found") {
$sileno_error_D = "SK 3 nicht gefunden";
}
elsif ( $sileno_error eq "difficult_finding_home") {
$sileno_error_D = "Problem die Ladestation zu finden";
}
elsif ( $sileno_error eq "guide_calibration_accomplished") {
$sileno_error_D = "Kalibration des Suchkabels beendet";
}
elsif ( $sileno_error eq "guide_calibration_failed") {
$sileno_error_D = "Kalibration des Suchkabels fehlgeschlagen";
}
elsif ( $sileno_error eq "temporary_battery_problem") {
$sileno_error_D = "Kurzzeitiges Batterieproblem";
}
elsif ( $sileno_error eq "battery_problem") {
$sileno_error_D = "Batterieproblem";
}
elsif ( $sileno_error eq "alarm_mower_switched_off") {
$sileno_error_D = "Alarm! Mäher ausgeschalten";
}
elsif ( $sileno_error eq "alarm_mower_stopped") {
$sileno_error_D = "Alarm! Mäher gestoppt";
}
elsif ( $sileno_error eq "alarm_mower_lifted") {
$sileno_error_D = "Alarm! Mäher angehoben";
}
elsif ( $sileno_error eq "alarm_mower_tilted") {
$sileno_error_D = "Alarm! Mäher gekippt";
}
elsif ( $sileno_error eq "connection_changed") {
$sileno_error_D = "Verbindung geändert";
}
elsif ( $sileno_error eq "connection_not_changed") {
$sileno_error_D = "Verbindung nicht geändert";
}
elsif ( $sileno_error eq "com_board_not_available") {
$sileno_error_D = "COM board nicht verfügbar";
}
elsif ( $sileno_error eq "slipped") {
$sileno_error_D = "Rutscht";
}
if ( $sileno_source_next_start eq "no_source") {
$sileno_source_next_start_D = "OK";
}
elsif ( $sileno_source_next_start eq "mower_charging") {
$sileno_source_next_start_D = "Mäher wurde geladen";
}
elsif ( $sileno_source_next_start eq "completed_cutting_autotimer") {
$sileno_source_next_start_D = "SensorControl erreicht";
}
elsif ( $sileno_source_next_start eq "week_timer") {
$sileno_source_next_start_D = "Wochentimer erreicht";
}
elsif ( $sileno_source_next_start eq "countdown_timer") {
$sileno_source_next_start_D = "Stoppuhr Timer";
}
elsif ( $sileno_source_next_start eq "undefined") {
$sileno_source_next_start_D = "Unklar";
}
fhem("setreading Sileno signal_quality $sileno_quality");
fhem("setreading Sileno connection_status $sileno_connection_status");
fhem("setreading Sileno signal_strength $sileno_state");
fhem("setreading Sileno Temperatur $sileno_temparture");
fhem("setreading Sileno batterie_value $batterie_value");
fhem("setreading Sileno batterie_status $batterie_status");
fhem("setreading Sileno batterie_is_charging $batterie_is_charging");
fhem("setreading Sileno status $sileno_status_D");
fhem("setreading Sileno error $sileno_error_D");
fhem("setreading Sileno source_next_start $sileno_source_next_start_D");
fhem("setreading Sileno next_start $sileno_timestamp_next_start");
fhem("setreading Sileno Hersteller $sileno_manufacturer");
fhem("setreading Sileno Produkt $sileno_product");
fhem("setreading Sileno Seriennummer $sileno_serial_number");
fhem("setreading Sileno Version $sileno_version");
fhem("setreading Sileno Modell $sileno_category");
fhem("setreading Sileno Letzte_Uebertragung $sileno_last_time_online");
fhem("setreading Sileno Sgtin $sileno_sgtin");
fhem("setreading Sileno firmware_status $sileno_firmware_status");
fhem("setreading Sileno firmware_upload_progress $sileno_firmware_upload_progress");
fhem("setreading Sileno inclusion_status $sileno_inclusion_status");
fhem("setreading Sileno firmware_update_start $sileno_firmware_update_start");
fhem("setreading Sileno firmware_command $sileno_firmware_command");
}
Hier noch die Einstellungen für den SVG Plot.
coool Danke.
mehr Readings und ich kann mein eventMap löschen :)
den Plot kopier ich mir auch gleich mal .. ;-)
Hallo,
wie bekomme ich das Reading angezeigt? Stehe im Moment auf dem Schlauch. :'(
Volker
Zitat von: VolkerL am 28 Juli 2017, 23:22:55
Hallo,
wie bekomme ich das Reading angezeigt? Stehe im Moment auf dem Schlauch. :'(
Volker
Hi Volker,
als Erstes den Anleitungen hier (https://forum.fhem.de/index.php/topic,70657.msg658142.html#msg658142) & hier (https://forum.fhem.de/index.php/topic,70657.msg658142.html#msg659268) von Bigchees folgen. Wenn du dann eine deutsche Übersetzung und mehr Readings
haben möchtest verwendest und die sub "sileno_status" von mbrak (https://forum.fhem.de/index.php/topic,70657.msg664232.html#msg664232) statt der von bigchees.
Grüße
Matthias
Hallo Kenneth,
Ich habe alles in fhem.cfg und myUtils eingetragen.
Bekomme aber nach dem Start folgende Fehlermeldung, aber es funktioniert trotzdem.
Messages collected while initializing FHEM:
configfile: Sileno: unknown attribute genericDeviceType. Type 'attr Sileno ?' for a detailed list.
Dankeschön
Volker
Hi. Kannst du mal posten was du genau in der fhem.cfg eingetragen hast? Hast du das mit einem Editor oder über das Web Interface gemacht? Letzteres sollte man immer verwenden!
Ist sicherlich ein typo :)
Gesendet von iPhone mit Tapatalk Pro
Hallo mbrak,
in der fhem.cfg steht folgendes:
define Sileno dummy
attr Sileno room Außen,Garten
attr Sileno stateFormat status batt: battery_value
attr Sileno webCmd maehen_24Std:maehen_zeitplan:parken:parken_zeitplan
define DI_SilenoCmd DOIF ([Sileno:"maehen"]) ({sileno_cmd("maehen")}) DOELSEIF ([Sileno:"parken"]) ({sileno_cmd("parken")})
attr DI_SilenoCmd room Außen,Garten,Roboter
define SilenoStatusCall at +*00:01:00 {sileno_status}
attr SilenoStatusCall room Außen,Garten,Roboter
Die Sachen auf habe ich rein kopiert, da auch das attr "genericDeviceType" bei dem dummy nicht vorhanden ist.
Hier noch der Eintrag in die "99_myUtils.pm":
sub sileno_status {
my $device_id = "device-id";
my $location_id = "location-id";
my $gardena_email = "xxxx\@xxx.de";
my $gardena_password = "xxx";
my $sileno_status_D;
my $sileno_error_D;
my $sileno_source_next_start_D;
my $curl = `curl -s --data '{"sessions":{"email":"$gardena_email","password":"$gardena_password"}}' --header "Content-Type:application/json" https://sg-api.dss.husqvarnagroup.net/sg-1/sessions`;
my $decoded_json = decode_json( $curl );
my $session_id = $decoded_json->{'sessions'}{'token'};
my $stats = `curl -s --header "Content-Type:application/json" --header "X-Session:$session_id" https://sg-api.dss.husqvarnagroup.net/sg-1/devices?locationId=$location_id`;
my $decoded_stats = decode_json( $stats );
my $sileno_manufacturer = $decoded_stats->{'devices'}[1]{'abilities'}[0]{'properties'}[0]{'value'};
my $sileno_product = $decoded_stats->{'devices'}[1]{'abilities'}[0]{'properties'}[1]{'value'};
my $sileno_serial_number = $decoded_stats->{'devices'}[1]{'abilities'}[0]{'properties'}[2]{'value'};
my $sileno_version = $decoded_stats->{'devices'}[1]{'abilities'}[0]{'properties'}[3]{'value'};
my $sileno_category = $decoded_stats->{'devices'}[1]{'abilities'}[0]{'properties'}[4]{'value'};
my $sileno_last_time_online = $decoded_stats->{'devices'}[1]{'abilities'}[0]{'properties'}[5]{'value'};
my $sileno_sgtin = $decoded_stats->{'devices'}[1]{'abilities'}[0]{'properties'}[6]{'value'};
my $batterie_value = $decoded_stats->{'devices'}[1]{'abilities'}[1]{'properties'}[0]{'value'};
my $batterie_status = $decoded_stats->{'devices'}[1]{'abilities'}[1]{'properties'}[1]{'value'};
my $batterie_is_charging = $decoded_stats->{'devices'}[1]{'abilities'}[1]{'properties'}[2]{'value'};
my $sileno_quality = $decoded_stats->{'devices'}[1]{'abilities'}[2]{'properties'}[0]{'value'};
my $sileno_connection_status = $decoded_stats->{'devices'}[1]{'abilities'}[2]{'properties'}[1]{'value'};
my $sileno_state = $decoded_stats->{'devices'}[1]{'abilities'}[2]{'properties'}[2]{'value'};
my $sileno_temparture = $decoded_stats->{'devices'}[1]{'abilities'}[3]{'properties'}[0]{'value'};
my $sileno_manual_operation = $decoded_stats->{'devices'}[1]{'abilities'}[4]{'properties'}[0]{'value'};
my $sileno_status = $decoded_stats->{'devices'}[1]{'abilities'}[4]{'properties'}[1]{'value'};
my $sileno_error = $decoded_stats->{'devices'}[1]{'abilities'}[4]{'properties'}[2]{'value'};
my $sileno_source_next_start = $decoded_stats->{'devices'}[1]{'abilities'}[4]{'properties'}[3]{'value'};
my $sileno_timestamp_next_start = $decoded_stats->{'devices'}[1]{'abilities'}[4]{'properties'}[4]{'value'};
my $sileno_override_end_time = $decoded_stats->{'devices'}[1]{'abilities'}[4]{'properties'}[5]{'value'};
my $sileno_firmware_status = $decoded_stats->{'devices'}[1]{'abilities'}[5]{'properties'}[0]{'value'};
my $sileno_firmware_upload_progress = $decoded_stats->{'devices'}[1]{'abilities'}[5]{'properties'}[1]{'value'};
my $sileno_firmware_available_version = $decoded_stats->{'devices'}[1]{'abilities'}[5]{'properties'}[2]{'value'};
my $sileno_inclusion_status = $decoded_stats->{'devices'}[1]{'abilities'}[5]{'properties'}[3]{'value'};
my $sileno_firmware_update_start = $decoded_stats->{'devices'}[1]{'abilities'}[5]{'properties'}[4]{'value'};
my $sileno_firmware_command = $decoded_stats->{'devices'}[1]{'abilities'}[5]{'properties'}[5]{'value'};
if ( $sileno_status eq "parked_autotimer") {
$sileno_status_D = "Geparkt durch SensorControl";
}
elsif ( $sileno_status eq "paused") {
$sileno_status_D = "Pausiert";
}
elsif ( $sileno_status eq "ok_cutting") {
$sileno_status_D = "Mähen";
}
elsif ( $sileno_status eq "ok_searching") {
$sileno_status_D = "Suche Ladestation";
}
elsif ( $sileno_status eq "ok_charging") {
$sileno_status_D = "Lädt";
}
elsif ( $sileno_status eq "ok_leaving") {
$sileno_status_D = "Mähen";
}
elsif ( $sileno_status eq "parked_timer") {
$sileno_status_D = "Geparkt nach Zeitplan";
}
elsif ( $sileno_status eq "off_disabled") {
$sileno_status_D = "Der Mäher ist ausgeschaltet";
}
elsif ( $sileno_status eq "parked_park_selected") {
$sileno_status_D = "Geparkt";
}
elsif ( $sileno_status eq "off_hatch_open") {
$sileno_status_D = "Deaktiviert. Abdeckung ist offen oder PIN-Code erforderlich";
}
elsif ( $sileno_status eq "error") {
$sileno_status_D = "Fehler";
}
elsif ( $sileno_status eq "error_at_power_up") {
$sileno_status_D = "Neustart ...";
}
elsif ( $sileno_status eq "off_hatch_closed") {
$sileno_status_D = "Deaktiviert. Manueller Start erforderlich";
}
elsif ( $sileno_status eq "ok_cutting_timer_overridden") {
$sileno_status_D = "Manuelles Mähen";
}
elsif ( $sileno_status eq "parked_daily_limit_reached") {
$sileno_status_D = "Abgeschlossen";
}
if ( $sileno_error eq "no_message") {
$sileno_error_D = "Kein Fehler";
}
elsif ( $sileno_error eq "outside_working_area") {
$sileno_error_D = "Außerhalb des Arbeitsbereichs";
}
elsif ( $sileno_error eq "no_loop_signal") {
$sileno_error_D = "Kein Schleifensignal";
}
elsif ( $sileno_error eq "wrong_loop_signal") {
$sileno_error_D = "Falsches Schleifensignal";
}
elsif ( $sileno_error eq "loop_sensor_problem_front") {
$sileno_error_D = "Problem Schleifensensor, vorne";
}
elsif ( $sileno_error eq "loop_sensor_problem_rear") {
$sileno_error_D = "Problem Schleifensensor, hinten";
}
elsif ( $sileno_error eq "trapped") {
$sileno_error_D = "Eingeschlossen";
}
elsif ( $sileno_error eq "upside_down") {
$sileno_error_D = "Steht auf dem Kopf";
}
elsif ( $sileno_error eq "low_battery") {
$sileno_error_D = "Niedriger Batteriestand";
}
elsif ( $sileno_error eq "empty_battery") {
$sileno_error_D = "Batterie ist leer";
}
elsif ( $sileno_error eq "no_drive") {
$sileno_error_D = "Kein Antrieb";
}
elsif ( $sileno_error eq "lifted") {
$sileno_error_D = "Angehoben";
}
elsif ( $sileno_error eq "stuck_in_charging_station") {
$sileno_error_D = "Eingeklemmt in Ladestation";
}
elsif ( $sileno_error eq "charging_station_blocked") {
$sileno_error_D = "Ladestation blockiert";
}
elsif ( $sileno_error eq "collision_sensor_problem_rear") {
$sileno_error_D = "Problem Stoßsensor hinten";
}
elsif ( $sileno_error eq "collision_sensor_problem_front") {
$sileno_error_D = "Problem Stoßsensor vorne";
}
elsif ( $sileno_error eq "wheel_motor_blocked_right") {
$sileno_error_D = "Radmotor rechts blockiert";
}
elsif ( $sileno_error eq "wheel_motor_blocked_left") {
$sileno_error_D = "Radmotor links blockiert";
}
elsif ( $sileno_error eq "wheel_drive_problem_right") {
$sileno_error_D = "Problem Antrieb, rechts";
}
elsif ( $sileno_error eq "wheel_drive_problem_left") {
$sileno_error_D = "Problem Antrieb, links";
}
elsif ( $sileno_error eq "cutting_system_blocked") {
$sileno_error_D = "Schneidsystem blockiert";
}
elsif ( $sileno_error eq "invalid_sub_device_combination") {
$sileno_error_D = "Fehlerhafte Verbindung";
}
elsif ( $sileno_error eq "settings_restored") {
$sileno_error_D = "Standardeinstellungen";
}
elsif ( $sileno_error eq "electronic_problem") {
$sileno_error_D = "Elektronisches Problem";
}
elsif ( $sileno_error eq "charging_system_problem") {
$sileno_error_D = "Problem Ladesystem";
}
elsif ( $sileno_error eq "tilt_sensor_problem") {
$sileno_error_D = "Kippsensorproblem";
}
elsif ( $sileno_error eq "wheel_motor_overloaded_right") {
$sileno_error_D = "Rechter Radmotor überlastet";
}
elsif ( $sileno_error eq "wheel_motor_overloaded_left") {
$sileno_error_D = "Linker Radmotor überlastet";
}
elsif ( $sileno_error eq "charging_current_too_high") {
$sileno_error_D = "Ladestrom zu hoch";
}
elsif ( $sileno_error eq "temporary_problem") {
$sileno_error_D = "Vorübergehendes Problem";
}
elsif ( $sileno_error eq "guide_1_not_found") {
$sileno_error_D = "SK 1 nicht gefunden";
}
elsif ( $sileno_error eq "guide_2_not_found") {
$sileno_error_D = "SK 2 nicht gefunden";
}
elsif ( $sileno_error eq "guide_3_not_found") {
$sileno_error_D = "SK 3 nicht gefunden";
}
elsif ( $sileno_error eq "difficult_finding_home") {
$sileno_error_D = "Problem die Ladestation zu finden";
}
elsif ( $sileno_error eq "guide_calibration_accomplished") {
$sileno_error_D = "Kalibration des Suchkabels beendet";
}
elsif ( $sileno_error eq "guide_calibration_failed") {
$sileno_error_D = "Kalibration des Suchkabels fehlgeschlagen";
}
elsif ( $sileno_error eq "temporary_battery_problem") {
$sileno_error_D = "Kurzzeitiges Batterieproblem";
}
elsif ( $sileno_error eq "battery_problem") {
$sileno_error_D = "Batterieproblem";
}
elsif ( $sileno_error eq "alarm_mower_switched_off") {
$sileno_error_D = "Alarm! Mäher ausgeschalten";
}
elsif ( $sileno_error eq "alarm_mower_stopped") {
$sileno_error_D = "Alarm! Mäher gestoppt";
}
elsif ( $sileno_error eq "alarm_mower_lifted") {
$sileno_error_D = "Alarm! Mäher angehoben";
}
elsif ( $sileno_error eq "alarm_mower_tilted") {
$sileno_error_D = "Alarm! Mäher gekippt";
}
elsif ( $sileno_error eq "connection_changed") {
$sileno_error_D = "Verbindung geändert";
}
elsif ( $sileno_error eq "connection_not_changed") {
$sileno_error_D = "Verbindung nicht geändert";
}
elsif ( $sileno_error eq "com_board_not_available") {
$sileno_error_D = "COM board nicht verfügbar";
}
elsif ( $sileno_error eq "slipped") {
$sileno_error_D = "Rutscht";
}
if ( $sileno_source_next_start eq "no_source") {
$sileno_source_next_start_D = "OK";
}
elsif ( $sileno_source_next_start eq "mower_charging") {
$sileno_source_next_start_D = "Mäher wurde geladen";
}
elsif ( $sileno_source_next_start eq "completed_cutting_autotimer") {
$sileno_source_next_start_D = "SensorControl erreicht";
}
elsif ( $sileno_source_next_start eq "week_timer") {
$sileno_source_next_start_D = "Wochentimer erreicht";
}
elsif ( $sileno_source_next_start eq "countdown_timer") {
$sileno_source_next_start_D = "Stoppuhr Timer";
}
elsif ( $sileno_source_next_start eq "undefined") {
$sileno_source_next_start_D = "Unklar";
}
fhem("setreading Sileno signal_quality $sileno_quality");
fhem("setreading Sileno connection_status $sileno_connection_status");
fhem("setreading Sileno signal_strength $sileno_state");
fhem("setreading Sileno Temperatur $sileno_temparture");
fhem("setreading Sileno batterie_value $batterie_value");
fhem("setreading Sileno batterie_status $batterie_status");
fhem("setreading Sileno batterie_is_charging $batterie_is_charging");
fhem("setreading Sileno status $sileno_status_D");
fhem("setreading Sileno error $sileno_error_D");
fhem("setreading Sileno source_next_start $sileno_source_next_start_D");
fhem("setreading Sileno next_start $sileno_timestamp_next_start");
fhem("setreading Sileno Hersteller $sileno_manufacturer");
fhem("setreading Sileno Produkt $sileno_product");
fhem("setreading Sileno Seriennummer $sileno_serial_number");
fhem("setreading Sileno Version $sileno_version");
fhem("setreading Sileno Modell $sileno_category");
fhem("setreading Sileno Letzte_Uebertragung $sileno_last_time_online");
fhem("setreading Sileno Sgtin $sileno_sgtin");
fhem("setreading Sileno firmware_status $sileno_firmware_status");
fhem("setreading Sileno firmware_upload_progress $sileno_firmware_upload_progress");
fhem("setreading Sileno inclusion_status $sileno_inclusion_status");
fhem("setreading Sileno firmware_update_start $sileno_firmware_update_start");
fhem("setreading Sileno firmware_command $sileno_firmware_command");
}
Und die Readings als Bild(da schein auch noch was nicht zu passen):
Danke
Volker
Moin Volker,
das
attr Sileno webCmd maehen_24Std:maehen_zeitplan:parken:parken_zeitplan
passt nicht zu dem
define DI_SilenoCmd DOIF ([Sileno:"maehen"]) ({sileno_cmd("maehen")}) DOELSEIF ([Sileno:"parken"]) ({sileno_cmd("parken")})
du scheinst meine Sachen mit denen von Bigchees gemischt zu haben.
der DIOF müsste dann ehr so ausssehen:
([Sileno:"maehen 24STD"]) ({sileno_cmd("maehen_24Std")}) DOELSEIF ([Sileno:"maehen Zeitplan"]) ({sileno_cmd("maehen_zeitplan")}) DOELSEIF ([Sileno:"parken"]) ({sileno_cmd("parken")}) DOELSEIF ([Sileno:"parken Zeitplan"]) ({sileno_cmd("parken_zeitplan")})
natürlich muss deine sub "sileno_cmd" auch dazu passen
Achso.. deine persönlichen Daten (Passwort etc) solltest du evtl. das nächste mal vor dem Posten entfernen :o
sub sileno_cmd {
my $command = $_[0];
my $device_id = "78f69110-5c61-4196-a195-774455c91646";
my $location_id = "fd81c964-9d74-40ac-9d02-b4650395ff17";
my $gardena_email = "volker_lorenz\@t-online.de";
my $gardena_password = "Dein_hoffentlich_geändertes_Passwort";
my $curl = `curl -s --data '{"sessions":{"email":"$gardena_email","password":"$gardena_password"}}' --header "Content-Type:application/json" https://sg-api.dss.husqvarnagroup.net/sg-1/sessions`;
my $decoded_json = decode_json( $curl );
my $session_id = $decoded_json->{'sessions'}{'token'};
print $session_id;
if ($command eq "maehen_24Std") {
my $payload ='"name":"start_override_timer","parameters":{"duration":1440}';
my $exec = `curl --data '{$payload}' --header "Content-Type:application/json" --header "X-Session:$session_id" https://sg-api.dss.husqvarnagroup.net/sg-1/devices/$device_id/abilities/mower/command?locationId=$location_id`;
}
elsif ($command eq "maehen_zeitplan") {
my $payload ='"name":"start_resume_schedule"';
my $exec = `curl --data '{$payload}' --header "Content-Type:application/json" --header "X-Session:$session_id" https://sg-api.dss.husqvarnagroup.net/sg-1/devices/$device_id/abilities/mower/command?locationId=$location_id`;
}
elsif ($command eq "parken") {
my $payload ='"name":"park_until_further_notice"';
my $exec = `curl --data '{$payload}' --header "Content-Type:application/json" --header "X-Session:$session_id" https://sg-api.dss.husqvarnagroup.net/sg-1/devices/$device_id/abilities/mower/command?locationId=$location_id`;
}
elsif ($command eq "parken_zeitplan") {
my $payload ='"name":"park_until_next_timer"';
my $exec = `curl --data '{$payload}' --header "Content-Type:application/json" --header "X-Session:$session_id" https://sg-api.dss.husqvarnagroup.net/sg-1/devices/$device_id/abilities/mower/command?locationId=$location_id`;
}
Hallo,
hab alles so eingetragen wie angegeben, der Status wird auch abgerufen und angezeigt. Was ich nicht hin bekomme ist, dass ich den Mäher über fhem starten oder parken kann. Da macht er keine Reaktion. Hier nochmals meine myUtil und Auszug aus der fhem.cfg
99_myUtils.pm:
######Gardena smart auslesen ###############
sub sileno_status {
my $device_id = "78f69110-5c61-4196-a195-774455c91646";
my $location_id = "fd81c964-9d74-40ac-9d02-b4650395ff17";
my $gardena_email = "volker_lorenz\@t-online.de";
my $gardena_password = "NeuesPasswort";
my $sileno_status_D;
my $sileno_error_D;
my $sileno_source_next_start_D;
my $curl = `curl -s --data '{"sessions":{"email":"$gardena_email","password":"$gardena_password"}}' --header "Content-Type:application/json" https://sg-api.dss.husqvarnagroup.net/sg-1/sessions`;
my $decoded_json = decode_json( $curl );
my $session_id = $decoded_json->{'sessions'}{'token'};
my $stats = `curl -s --header "Content-Type:application/json" --header "X-Session:$session_id" https://sg-api.dss.husqvarnagroup.net/sg-1/devices?locationId=$location_id`;
my $decoded_stats = decode_json( $stats );
my $sileno_manufacturer = $decoded_stats->{'devices'}[1]{'abilities'}[0]{'properties'}[0]{'value'};
my $sileno_product = $decoded_stats->{'devices'}[1]{'abilities'}[0]{'properties'}[1]{'value'};
my $sileno_serial_number = $decoded_stats->{'devices'}[1]{'abilities'}[0]{'properties'}[2]{'value'};
my $sileno_version = $decoded_stats->{'devices'}[1]{'abilities'}[0]{'properties'}[3]{'value'};
my $sileno_category = $decoded_stats->{'devices'}[1]{'abilities'}[0]{'properties'}[4]{'value'};
my $sileno_last_time_online = $decoded_stats->{'devices'}[1]{'abilities'}[0]{'properties'}[5]{'value'};
my $sileno_sgtin = $decoded_stats->{'devices'}[1]{'abilities'}[0]{'properties'}[6]{'value'};
my $batterie_value = $decoded_stats->{'devices'}[1]{'abilities'}[1]{'properties'}[0]{'value'};
my $batterie_status = $decoded_stats->{'devices'}[1]{'abilities'}[1]{'properties'}[1]{'value'};
my $batterie_is_charging = $decoded_stats->{'devices'}[1]{'abilities'}[1]{'properties'}[2]{'value'};
my $sileno_quality = $decoded_stats->{'devices'}[1]{'abilities'}[2]{'properties'}[0]{'value'};
my $sileno_connection_status = $decoded_stats->{'devices'}[1]{'abilities'}[2]{'properties'}[1]{'value'};
my $sileno_state = $decoded_stats->{'devices'}[1]{'abilities'}[2]{'properties'}[2]{'value'};
my $sileno_temparture = $decoded_stats->{'devices'}[1]{'abilities'}[3]{'properties'}[0]{'value'};
my $sileno_manual_operation = $decoded_stats->{'devices'}[1]{'abilities'}[4]{'properties'}[0]{'value'};
my $sileno_status = $decoded_stats->{'devices'}[1]{'abilities'}[4]{'properties'}[1]{'value'};
my $sileno_error = $decoded_stats->{'devices'}[1]{'abilities'}[4]{'properties'}[2]{'value'};
my $sileno_source_next_start = $decoded_stats->{'devices'}[1]{'abilities'}[4]{'properties'}[3]{'value'};
my $sileno_timestamp_next_start = $decoded_stats->{'devices'}[1]{'abilities'}[4]{'properties'}[4]{'value'};
my $sileno_override_end_time = $decoded_stats->{'devices'}[1]{'abilities'}[4]{'properties'}[5]{'value'};
my $sileno_firmware_status = $decoded_stats->{'devices'}[1]{'abilities'}[5]{'properties'}[0]{'value'};
my $sileno_firmware_upload_progress = $decoded_stats->{'devices'}[1]{'abilities'}[5]{'properties'}[1]{'value'};
my $sileno_firmware_available_version = $decoded_stats->{'devices'}[1]{'abilities'}[5]{'properties'}[2]{'value'};
my $sileno_inclusion_status = $decoded_stats->{'devices'}[1]{'abilities'}[5]{'properties'}[3]{'value'};
my $sileno_firmware_update_start = $decoded_stats->{'devices'}[1]{'abilities'}[5]{'properties'}[4]{'value'};
my $sileno_firmware_command = $decoded_stats->{'devices'}[1]{'abilities'}[5]{'properties'}[5]{'value'};
if ( $sileno_status eq "parked_autotimer") {
$sileno_status_D = "Geparkt durch SensorControl";
}
elsif ( $sileno_status eq "paused") {
$sileno_status_D = "Pausiert";
}
elsif ( $sileno_status eq "ok_cutting") {
$sileno_status_D = "Mähen";
}
elsif ( $sileno_status eq "ok_searching") {
$sileno_status_D = "Suche Ladestation";
}
elsif ( $sileno_status eq "ok_charging") {
$sileno_status_D = "Lädt";
}
elsif ( $sileno_status eq "ok_leaving") {
$sileno_status_D = "Mähen";
}
elsif ( $sileno_status eq "parked_timer") {
$sileno_status_D = "Geparkt nach Zeitplan";
}
elsif ( $sileno_status eq "off_disabled") {
$sileno_status_D = "Der Mäher ist ausgeschaltet";
}
elsif ( $sileno_status eq "parked_park_selected") {
$sileno_status_D = "Geparkt";
}
elsif ( $sileno_status eq "off_hatch_open") {
$sileno_status_D = "Deaktiviert. Abdeckung ist offen oder PIN-Code erforderlich";
}
elsif ( $sileno_status eq "error") {
$sileno_status_D = "Fehler";
}
elsif ( $sileno_status eq "error_at_power_up") {
$sileno_status_D = "Neustart ...";
}
elsif ( $sileno_status eq "off_hatch_closed") {
$sileno_status_D = "Deaktiviert. Manueller Start erforderlich";
}
elsif ( $sileno_status eq "ok_cutting_timer_overridden") {
$sileno_status_D = "Manuelles Mähen";
}
elsif ( $sileno_status eq "parked_daily_limit_reached") {
$sileno_status_D = "Abgeschlossen";
}
if ( $sileno_error eq "no_message") {
$sileno_error_D = "Kein Fehler";
}
elsif ( $sileno_error eq "outside_working_area") {
$sileno_error_D = "Außerhalb des Arbeitsbereichs";
}
elsif ( $sileno_error eq "no_loop_signal") {
$sileno_error_D = "Kein Schleifensignal";
}
elsif ( $sileno_error eq "wrong_loop_signal") {
$sileno_error_D = "Falsches Schleifensignal";
}
elsif ( $sileno_error eq "loop_sensor_problem_front") {
$sileno_error_D = "Problem Schleifensensor, vorne";
}
elsif ( $sileno_error eq "loop_sensor_problem_rear") {
$sileno_error_D = "Problem Schleifensensor, hinten";
}
elsif ( $sileno_error eq "trapped") {
$sileno_error_D = "Eingeschlossen";
}
elsif ( $sileno_error eq "upside_down") {
$sileno_error_D = "Steht auf dem Kopf";
}
elsif ( $sileno_error eq "low_battery") {
$sileno_error_D = "Niedriger Batteriestand";
}
elsif ( $sileno_error eq "empty_battery") {
$sileno_error_D = "Batterie ist leer";
}
elsif ( $sileno_error eq "no_drive") {
$sileno_error_D = "Kein Antrieb";
}
elsif ( $sileno_error eq "lifted") {
$sileno_error_D = "Angehoben";
}
elsif ( $sileno_error eq "stuck_in_charging_station") {
$sileno_error_D = "Eingeklemmt in Ladestation";
}
elsif ( $sileno_error eq "charging_station_blocked") {
$sileno_error_D = "Ladestation blockiert";
}
elsif ( $sileno_error eq "collision_sensor_problem_rear") {
$sileno_error_D = "Problem Stoßsensor hinten";
}
elsif ( $sileno_error eq "collision_sensor_problem_front") {
$sileno_error_D = "Problem Stoßsensor vorne";
}
elsif ( $sileno_error eq "wheel_motor_blocked_right") {
$sileno_error_D = "Radmotor rechts blockiert";
}
elsif ( $sileno_error eq "wheel_motor_blocked_left") {
$sileno_error_D = "Radmotor links blockiert";
}
elsif ( $sileno_error eq "wheel_drive_problem_right") {
$sileno_error_D = "Problem Antrieb, rechts";
}
elsif ( $sileno_error eq "wheel_drive_problem_left") {
$sileno_error_D = "Problem Antrieb, links";
}
elsif ( $sileno_error eq "cutting_system_blocked") {
$sileno_error_D = "Schneidsystem blockiert";
}
elsif ( $sileno_error eq "invalid_sub_device_combination") {
$sileno_error_D = "Fehlerhafte Verbindung";
}
elsif ( $sileno_error eq "settings_restored") {
$sileno_error_D = "Standardeinstellungen";
}
elsif ( $sileno_error eq "electronic_problem") {
$sileno_error_D = "Elektronisches Problem";
}
elsif ( $sileno_error eq "charging_system_problem") {
$sileno_error_D = "Problem Ladesystem";
}
elsif ( $sileno_error eq "tilt_sensor_problem") {
$sileno_error_D = "Kippsensorproblem";
}
elsif ( $sileno_error eq "wheel_motor_overloaded_right") {
$sileno_error_D = "Rechter Radmotor überlastet";
}
elsif ( $sileno_error eq "wheel_motor_overloaded_left") {
$sileno_error_D = "Linker Radmotor überlastet";
}
elsif ( $sileno_error eq "charging_current_too_high") {
$sileno_error_D = "Ladestrom zu hoch";
}
elsif ( $sileno_error eq "temporary_problem") {
$sileno_error_D = "Vorübergehendes Problem";
}
elsif ( $sileno_error eq "guide_1_not_found") {
$sileno_error_D = "SK 1 nicht gefunden";
}
elsif ( $sileno_error eq "guide_2_not_found") {
$sileno_error_D = "SK 2 nicht gefunden";
}
elsif ( $sileno_error eq "guide_3_not_found") {
$sileno_error_D = "SK 3 nicht gefunden";
}
elsif ( $sileno_error eq "difficult_finding_home") {
$sileno_error_D = "Problem die Ladestation zu finden";
}
elsif ( $sileno_error eq "guide_calibration_accomplished") {
$sileno_error_D = "Kalibration des Suchkabels beendet";
}
elsif ( $sileno_error eq "guide_calibration_failed") {
$sileno_error_D = "Kalibration des Suchkabels fehlgeschlagen";
}
elsif ( $sileno_error eq "temporary_battery_problem") {
$sileno_error_D = "Kurzzeitiges Batterieproblem";
}
elsif ( $sileno_error eq "battery_problem") {
$sileno_error_D = "Batterieproblem";
}
elsif ( $sileno_error eq "alarm_mower_switched_off") {
$sileno_error_D = "Alarm! Mäher ausgeschalten";
}
elsif ( $sileno_error eq "alarm_mower_stopped") {
$sileno_error_D = "Alarm! Mäher gestoppt";
}
elsif ( $sileno_error eq "alarm_mower_lifted") {
$sileno_error_D = "Alarm! Mäher angehoben";
}
elsif ( $sileno_error eq "alarm_mower_tilted") {
$sileno_error_D = "Alarm! Mäher gekippt";
}
elsif ( $sileno_error eq "connection_changed") {
$sileno_error_D = "Verbindung geändert";
}
elsif ( $sileno_error eq "connection_not_changed") {
$sileno_error_D = "Verbindung nicht geändert";
}
elsif ( $sileno_error eq "com_board_not_available") {
$sileno_error_D = "COM board nicht verfügbar";
}
elsif ( $sileno_error eq "slipped") {
$sileno_error_D = "Rutscht";
}
if ( $sileno_source_next_start eq "no_source") {
$sileno_source_next_start_D = "OK";
}
elsif ( $sileno_source_next_start eq "mower_charging") {
$sileno_source_next_start_D = "Mäher wurde geladen";
}
elsif ( $sileno_source_next_start eq "completed_cutting_autotimer") {
$sileno_source_next_start_D = "SensorControl erreicht";
}
elsif ( $sileno_source_next_start eq "week_timer") {
$sileno_source_next_start_D = "Wochentimer erreicht";
}
elsif ( $sileno_source_next_start eq "countdown_timer") {
$sileno_source_next_start_D = "Stoppuhr Timer";
}
elsif ( $sileno_source_next_start eq "undefined") {
$sileno_source_next_start_D = "Unklar";
}
fhem("setreading Sileno signal_quality $sileno_quality");
fhem("setreading Sileno connection_status $sileno_connection_status");
fhem("setreading Sileno signal_strength $sileno_state");
fhem("setreading Sileno Temperatur $sileno_temparture");
fhem("setreading Sileno batterie_value $batterie_value");
fhem("setreading Sileno batterie_status $batterie_status");
fhem("setreading Sileno batterie_is_charging $batterie_is_charging");
fhem("setreading Sileno status $sileno_status_D");
fhem("setreading Sileno error $sileno_error_D");
fhem("setreading Sileno source_next_start $sileno_source_next_start_D");
fhem("setreading Sileno next_start $sileno_timestamp_next_start");
fhem("setreading Sileno Hersteller $sileno_manufacturer");
fhem("setreading Sileno Produkt $sileno_product");
fhem("setreading Sileno Seriennummer $sileno_serial_number");
fhem("setreading Sileno Version $sileno_version");
fhem("setreading Sileno Modell $sileno_category");
fhem("setreading Sileno Letzte_Uebertragung $sileno_last_time_online");
fhem("setreading Sileno Sgtin $sileno_sgtin");
fhem("setreading Sileno firmware_status $sileno_firmware_status");
fhem("setreading Sileno firmware_upload_progress $sileno_firmware_upload_progress");
fhem("setreading Sileno inclusion_status $sileno_inclusion_status");
fhem("setreading Sileno firmware_update_start $sileno_firmware_update_start");
fhem("setreading Sileno firmware_command $sileno_firmware_command");
}
####Sileno_CMD
sub sileno_cmd {
my $command = $_[0];
my $device_id = "78f69110-5c61-4196-a195-774455c91646";
my $location_id = "fd81c964-9d74-40ac-9d02-b4650395ff17";
my $gardena_email = "volker_lorenz\@t-online.de";
my $gardena_password = "NeuesPasswort";
my $curl = `curl -s --data '{"sessions":{"email":"$gardena_email","password":"$gardena_password"}}' --header "Content-Type:application/json" https://sg-api.dss.husqvarnagroup.net/sg-1/sessions`;
my $decoded_json = decode_json( $curl );
my $session_id = $decoded_json->{'sessions'}{'token'};
print $session_id;
if ($command eq "maehen_24Std") {
my $payload ='"name":"start_override_timer","parameters":{"duration":1440}';
my $exec = `curl --data '{$payload}' --header "Content-Type:application/json" --header "X-Session:$session_id" https://sg-api.dss.husqvarnagroup.net/sg-1/devices/$device_id/abilities/mower/command?locationId=$location_id`;
}
elsif ($command eq "maehen_zeitplan") {
my $payload ='"name":"start_resume_schedule"';
my $exec = `curl --data '{$payload}' --header "Content-Type:application/json" --header "X-Session:$session_id" https://sg-api.dss.husqvarnagroup.net/sg-1/devices/$device_id/abilities/mower/command?locationId=$location_id`;
}
elsif ($command eq "parken") {
my $payload ='"name":"park_until_further_notice"';
my $exec = `curl --data '{$payload}' --header "Content-Type:application/json" --header "X-Session:$session_id" https://sg-api.dss.husqvarnagroup.net/sg-1/devices/$device_id/abilities/mower/command?locationId=$location_id`;
}
elsif ($command eq "parken_zeitplan") {
my $payload ='"name":"park_until_next_timer"';
my $exec = `curl --data '{$payload}' --header "Content-Type:application/json" --header "X-Session:$session_id" https://sg-api.dss.husqvarnagroup.net/sg-1/devices/$device_id/abilities/mower/command?locationId=$location_id`;
}
my $curl = `curl --data '{"sessions":{"email":"$gardena_email","password":"$gardena_password"}}' --header "Content-Type:application/json" https://sg-api.dss.husqvarnagroup.net/sg-1/sessions`;
my $decoded_json = decode_json( $curl );
my $session_id = $decoded_json->{'sessions'}{'token'};
print $session_id;
if ($command eq "maehen") {
my $payload ='"name":"start_override_timer","parameters":{"duration":1440}';
my $exec = `curl --data '{$payload}' --header "Content-Type:application/json" --header "X-Session:$session_id" https://sg-api.dss.husqvarnagroup.net/sg-1/devices/$device_id/abilities/mower/command?locationId=$location_id`;
}
elsif ($command eq "parken") {
my $payload ='"name":"park_until_further_notice"';
my $exec = `curl --data '{$payload}' --header "Content-Type:application/json" --header "X-Session:$session_id" https://sg-api.dss.husqvarnagroup.net/sg-1/devices/$device_id/abilities/mower/command?locationId=$location_id`;
}}
fhem.cfg:
define Sileno dummy
attr Sileno room Außen,Garten
attr Sileno webCmd maehen_24Std:maehen_zeitplan:parken:parken_zeitplan
define DI_SilenoCmd DOIF ([Sileno:"maehen 24STD"]) ({sileno_cmd("maehen_24Std")}) DOELSEIF ([Sileno:"maehen Zeitplan"]) ({sileno_cmd("maehen_zeitplan")}) DOELSEIF ([Sileno:"parken"]) ({sileno_cmd("parken")}) DOELSEIF ([Sileno:"parken Zeitplan"]) ({sileno_cmd("parken_zeitplan")})
attr DI_SilenoCmd room Außen,Garten
define SilenoStatusCall at +*00:01:00 {sileno_status}
attr SilenoStatusCall room Außen,Garten
define FL_Sileno FileLog /opt/fhem/Sileno_%Y_%m.log Sileno:Temperatur|Sileno:batterie_is_charging|Sileno:batterie_value|Sileno:error:.*|Sileno:signal_quality|Sileno:status:.*
define SVG_FL_Sileno_2 SVG FL_Sileno:SVG_FL_Sileno_2:CURRENT
attr SVG_FL_Sileno_2 room Garten
In dem Plot wird auch der Ladevorgang nicht angezeigt, da der Status nur false oder true und nicht 0 oder 1 ist. Mit eventMap hatte ich kein Erfolg.
Danke
Volker
Hi
Hast du nur die eine sub (sileno status) in deine 98_myUtils.pm geschrieben ?
das mit dem Status ist wohl einer neueren Firmware des Mähers zu schulden. meiner sagt 0 oder 1. die neueren Mäher false und true.
Matthias hat das bei sich schon geändert. kannst du auch in dem Mapping in der sub eintragen und der Status wird angepasst. vielleicht meldet sich matthias noch dazu.
ich werde jetzt erstmal nicht weiter basteln, da ich auf das modul von cooltux warte. für die zeit bis dahin habe ich genug infos :)
Zitat von: VolkerL am 01 August 2017, 00:20:20
In dem Plot wird auch der Ladevorgang nicht angezeigt, da der Status nur false oder true und nicht 0 oder 1 ist. Mit eventMap hatte ich kein Erfolg.
Danke
Volker
Hi,
so wie Michael schon geschrieben liegt es an der FW.
Folgende Änderungen in der sub "sileno_status" sind nötig:
- neu Variabel definieren
- mappen von true auf "1" und false auf "0"
- Nachricht an den Dummy mit der neuen gemappten Variable versehen
und im SVG den RegEx ändern auf
$fld[3]*20
Variable:
my $batterie_is_charging_SVG;
Mappen:
if ( $batterie_is_charging eq "true") {
$batterie_is_charging_SVG = "1";
}
elsif ( $batterie_is_charging eq "false") {
$batterie_is_charging_SVG = "0";
}
fhem("setreading Sileno batterie_is_charging $batterie_is_charging_SVG");
[/CODE]
Falls du die komplette Sub sehen möchtest sag bescheid.
An der Sileno_CMD seh ich erst mal keinen Fehler.
Ich hab der Übersichtshalber einen Dummy für den Status und einen für die CMDs. Aber daran sollte die Funktion dahinter nicht scheitern.
Gesendet von iPhone mit Tapatalk
Zitat von: VolkerL am 01 August 2017, 00:20:20
Hallo,
hab alles so eingetragen wie angegeben, der Status wird auch abgerufen und angezeigt. Was ich nicht hin bekomme ist, dass ich den Mäher über fhem starten oder parken kann. Da macht er keine Reaktion. Hier nochmals meine myUtil und Auszug aus der fhem.cfg
99_myUtils.pm:
####Sileno_CMD
sub sileno_cmd {
my $command = $_[0];
my $device_id = "78f69110-5c61-4196-a195-774455c91646";
my $location_id = "fd81c964-9d74-40ac-9d02-b4650395ff17";
my $gardena_email = "volker_lorenz\@t-online.de";
my $gardena_password = "NeuesPasswort";
my $curl = `curl -s --data '{"sessions":{"email":"$gardena_email","password":"$gardena_password"}}' --header "Content-Type:application/json" https://sg-api.dss.husqvarnagroup.net/sg-1/sessions`;
my $decoded_json = decode_json( $curl );
my $session_id = $decoded_json->{'sessions'}{'token'};
print $session_id;
if ($command eq "maehen_24Std") {
my $payload ='"name":"start_override_timer","parameters":{"duration":1440}';
my $exec = `curl --data '{$payload}' --header "Content-Type:application/json" --header "X-Session:$session_id" https://sg-api.dss.husqvarnagroup.net/sg-1/devices/$device_id/abilities/mower/command?locationId=$location_id`;
}
elsif ($command eq "maehen_zeitplan") {
my $payload ='"name":"start_resume_schedule"';
my $exec = `curl --data '{$payload}' --header "Content-Type:application/json" --header "X-Session:$session_id" https://sg-api.dss.husqvarnagroup.net/sg-1/devices/$device_id/abilities/mower/command?locationId=$location_id`;
}
elsif ($command eq "parken") {
my $payload ='"name":"park_until_further_notice"';
my $exec = `curl --data '{$payload}' --header "Content-Type:application/json" --header "X-Session:$session_id" https://sg-api.dss.husqvarnagroup.net/sg-1/devices/$device_id/abilities/mower/command?locationId=$location_id`;
}
elsif ($command eq "parken_zeitplan") {
my $payload ='"name":"park_until_next_timer"';
my $exec = `curl --data '{$payload}' --header "Content-Type:application/json" --header "X-Session:$session_id" https://sg-api.dss.husqvarnagroup.net/sg-1/devices/$device_id/abilities/mower/command?locationId=$location_id`;
}
my $curl = `curl --data '{"sessions":{"email":"$gardena_email","password":"$gardena_password"}}' --header "Content-Type:application/json" https://sg-api.dss.husqvarnagroup.net/sg-1/sessions`;
my $decoded_json = decode_json( $curl );
my $session_id = $decoded_json->{'sessions'}{'token'};
print $session_id;
if ($command eq "maehen") {
my $payload ='"name":"start_override_timer","parameters":{"duration":1440}';
my $exec = `curl --data '{$payload}' --header "Content-Type:application/json" --header "X-Session:$session_id" https://sg-api.dss.husqvarnagroup.net/sg-1/devices/$device_id/abilities/mower/command?locationId=$location_id`;
}
elsif ($command eq "parken") {
my $payload ='"name":"park_until_further_notice"';
my $exec = `curl --data '{$payload}' --header "Content-Type:application/json" --header "X-Session:$session_id" https://sg-api.dss.husqvarnagroup.net/sg-1/devices/$device_id/abilities/mower/command?locationId=$location_id`;
}}
Danke
Volker
Hi,
deine Sub "sileno_cmd" ist doch falsch
(hab ich vorhin auf dem Handy nicht gesehen)du hast da ein bissel zu viel drin:
my $curl = `curl --data '{"sessions":{"email":"$gardena_email","password":"$gardena_password"}}' --header "Content-Type:application/json" https://sg-api.dss.husqvarnagroup.net/sg-1/sessions`;
my $decoded_json = decode_json( $curl );
my $session_id = $decoded_json->{'sessions'}{'token'};
print $session_id;
if ($command eq "maehen") {
my $payload ='"name":"start_override_timer","parameters":{"duration":1440}';
my $exec = `curl --data '{$payload}' --header "Content-Type:application/json" --header "X-Session:$session_id" https://sg-api.dss.husqvarnagroup.net/sg-1/devices/$device_id/abilities/mower/command?locationId=$location_id`;
}
elsif ($command eq "parken") {
my $payload ='"name":"park_until_further_notice"';
my $exec = `curl --data '{$payload}' --header "Content-Type:application/json" --header "X-Session:$session_id" https://sg-api.dss.husqvarnagroup.net/sg-1/devices/$device_id/abilities/mower/command?locationId=$location_id`;
}}
es sollte wie folgt aussehen:
####Sileno_CMD
sub sileno_cmd {
my $command = $_[0];
my $device_id = "78f69110-5c61-4196-a195-774455c91646";
my $location_id = "fd81c964-9d74-40ac-9d02-b4650395ff17";
my $gardena_email = "volker_lorenz\@t-online.de";
my $gardena_password = "NeuesPasswort";
my $curl = `curl -s --data '{"sessions":{"email":"$gardena_email","password":"$gardena_password"}}' --header "Content-Type:application/json" https://sg-api.dss.husqvarnagroup.net/sg-1/sessions`;
my $decoded_json = decode_json( $curl );
my $session_id = $decoded_json->{'sessions'}{'token'};
print $session_id;
if ($command eq "maehen_24Std") {
my $payload ='"name":"start_override_timer","parameters":{"duration":1440}';
my $exec = `curl --data '{$payload}' --header "Content-Type:application/json" --header "X-Session:$session_id" https://sg-api.dss.husqvarnagroup.net/sg-1/devices/$device_id/abilities/mower/command?locationId=$location_id`;
}
elsif ($command eq "maehen_zeitplan") {
my $payload ='"name":"start_resume_schedule"';
my $exec = `curl --data '{$payload}' --header "Content-Type:application/json" --header "X-Session:$session_id" https://sg-api.dss.husqvarnagroup.net/sg-1/devices/$device_id/abilities/mower/command?locationId=$location_id`;
}
elsif ($command eq "parken") {
my $payload ='"name":"park_until_further_notice"';
my $exec = `curl --data '{$payload}' --header "Content-Type:application/json" --header "X-Session:$session_id" https://sg-api.dss.husqvarnagroup.net/sg-1/devices/$device_id/abilities/mower/command?locationId=$location_id`;
}
elsif ($command eq "parken_zeitplan") {
my $payload ='"name":"park_until_next_timer"';
my $exec = `curl --data '{$payload}' --header "Content-Type:application/json" --header "X-Session:$session_id" https://sg-api.dss.husqvarnagroup.net/sg-1/devices/$device_id/abilities/mower/command?locationId=$location_id`;
}
Grüße
Matthias
Danke,
ich werde das alles später mal ausprobieren.
Danke und viele Grüße
Volker
Abend schön
Ich wollte einen kurzen Statusreport abgeben. Dank Kenneth's Zugangsdaten bekommt das Bridge Modul nach einem define nun session_id (Token), user_id und locations_id. Ausserdem bekomme ich eine Liste der Devices.
Die nächsten Schritte sind nun die Liste der Devices aus zu werten und die Devices entsprechend von autocreate anlegen zu lassen.
Es gibt also noch viel zu tun. Aber die Sache mit den tokens hatte mich leider länger aufgehalten.
Grüße
Leon
Zitat von: VolkerL am 01 August 2017, 12:35:58
Danke,
ich werde das alles später mal ausprobieren.
Danke und viele Grüße
Volker
Hi Volker,
wie schauts aus, passt alles?
Zitat von: CoolTux am 02 August 2017, 21:30:17
Abend schön
Ich wollte einen kurzen Statusreport abgeben. Dank Kenneth's Zugangsdaten bekommt das Bridge Modul nach einem define nun session_id (Token), user_id und locations_id. Ausserdem bekomme ich eine Liste der Devices.
Die nächsten Schritte sind nun die Liste der Devices aus zu werten und die Devices entsprechend von autocreate anlegen zu lassen.
Es gibt also noch viel zu tun. Aber die Sache mit den tokens hatte mich leider länger aufgehalten.
Grüße
Leon
klingt ja schon mal super :)
Grüße
Matthias
Hier mal ein Screen von einer Bridge. Später wird man auch mehrere Bridges automatisch anlegen können.
Aber im Moment denke ich das eine reicht.
Aktueller Stand. Definition der Bridge mit
define <name> GardenaSmartBridge <email> <password>
Danach werden automatisch alle nötigen id's und der token geholt und ein DeviceList gemacht.
Und wieder einen Schritt weiter.
Aktuell wird die Bridge angelegt und mit Readings gefüllt. Ausserdem werden gefundene Devices angelegt.
Jetzt brauche ichmal bitte Eure Mithilfe,
Ich möchte sofern möglich den aktuellen Status einen jeden Gerätes einzeln abrufen. Dazu muß es einen Statusaufruf geben wo die Device_ID mitgegeben wird. Wenn jemand Zeit hat zum Schauen wäre das wirklich toll.
Grüße
Hey Leon,
Was soll ich machen?
Grüße
Matthias
Gesendet von iPhone mit Tapatalk
Zitat von: Kenneth am 04 August 2017, 11:19:41
Hey Leon,
Was soll ich machen?
Grüße
Matthias
Gesendet von iPhone mit Tapatalk
Im Netz nach Informationen suchen ob man auch einzelne Geräte abfragen kann nach dem Status.
Ich denke ich habe einen Ansatz gefunden. Wenn Du magst stelle ich Dir mal einen payload String zusammen den Du mal bitte testen kannst.
`curl -s --data '{"name":"device_info"}' --header "Content-Type:application/json" https://sg-api.dss.husqvarnagroup.net/sg-1/sessions`;
Müsstest auf die schnelle ein kleines perl oder bash script schreiben
Schau mal bitte ob Du hierüber etwas zurück bekommst
hi
ich kenn dazu nur den curl aufruf, welcher alle geräte abfragt. kommt ein mächtige json string zurück als antwort.
kann dir meinen nachher schicken wenn ich zuhause bin. habe aber nur einen mäher.
Zitat
Müsstest auf die schnelle ein kleines perl oder bash script schreiben
Schau mal bitte ob Du hierüber etwas zurück bekommst
ein perl script kann ich leider nicht schreiben sry..
Zitat
Im Netz nach Informationen suchen ob man auch einzelne Geräte abfragen kann nach dem Status.
schau mal hier evtl. hilft das
const CMDURL = "https://sg-api.dss.husqvarnagroup.net/sg-1/devices/|DEVICEID|/abilities/sensor/command?locationId=";
Quelle LINK (http://www.roboter-forum.com/showthread.php?16777-Gardena-Smart-System-Analyse/page2)
https://sg-api.dss.husqvarnagroup.net/sg-1/devices/|DEVICEID|/abilities/mower/command?locationId=";
Zitat von: mbrak am 04 August 2017, 12:32:48
hi
ich kenn dazu nur den curl aufruf, welcher alle geräte abfragt. kommt ein mächtige json string zurück als antwort.
kann dir meinen nachher schicken wenn ich zuhause bin. habe aber nur einen mäher.
Deswegen soll ja auch bitte dieser Aufruf hier mal gemacht werden
`curl -s --data '{"name":"device_info"}' --header "Content-Type:application/json" https://sg-api.dss.husqvarnagroup.net/sg-1/sessions`;
Aber bitte so das auch eine Variable damit gefüllt wird und diese dann ausgeben lassen
Sowas in der Art wie
my $resp = `curl -s --data '{"name":"device_info"}' --header "Content-Type:application/json" https://sg-api.dss.husqvarnagroup.net/sg-1/sessions`;
Zitat von: Kenneth am 04 August 2017, 12:51:13
ein perl script kann ich leider nicht schreiben sry..
schau mal hier evtl. hilft das
const CMDURL = "https://sg-api.dss.husqvarnagroup.net/sg-1/devices/|DEVICEID|/abilities/sensor/command?locationId=";
Quelle LINK (http://www.roboter-forum.com/showthread.php?16777-Gardena-Smart-System-Analyse/page2)
Iht habet doch schon eine 99_myUtils.
Einfach die relevanten aufrufe in eine neue sub und ergänzen mit meinem anliegen und dann die sub aufrufen.
Ansonsten mache ich das heute Abend kurz.
bekommst du nachher... bin noch unterwegs :)
Ganz in Ruhe. Reicht auch die Tage. Aber so muß ich mich nicht bemühen und kann am Kern weiter machen.
Sieht alles ziemlich gut aus. Aber ich will versuchen die Geräte einzeln ab zu rufen.
Wem es interessiert.
Im JSON String den man erhält wenn man nach DEVICES fragt sind Werte drin welche darauf deuten was man schreibend als Command schicken kann.
Bsp:
name":"rechargeable_battery_status","timestamp":"2017-08-03T05:07:24Z","value":"ok","writeable":false,"supported_values":["weak","ok","undefined"]}
Der Command Name wäre hier rechargeable_battery_status und man könnte ihn als POST Command senden wenn nicht "writeable":false" stehen würde. Aber wir können sehen welche values er Name annehmen kann.
"supported_values":["weak","ok","undefined"]
Das zieht sich so durch den ganzen JSON String. Habe da schon so einiges gefunden. Danke noch mal an Kenneth für sein Beispielloses Vertrauen und der Mithilfe.
"name":"firmware_update_start","value":false,"writeable":true
Anscheinend kann man hier für das Device das Firmwareupdate starten.
Hier kann man Firmware Kommands mitgeben. Mit Werten als Zusatz
"name":"firmware_command","value":"unsupported","writeable":true,"supported_values":["idle","firmware_cancel","firmware_flash","firmware_upload","unsupported"
Mögliche Commands wären also
idle","firmware_cancel","firmware_flash","firmware_upload","unsupported
Der data JSON String könnte dann so aussehen
{'"name":"firmware_command","parameters":{"unsupported"}}'
Ist aber nur schlecht geraten
Grüße
Leon
hey,
wie gesagt sehr gern.
Das mit den Updates wäre nur logisch da die hauseigene APP, zumindest beim Sensor, den Hinweis bzgl. FW update ausgibt und man ihn auch anstossen kann.
(schon gemacht nach der IBN des Sensors)
Beim Mäher musste ich mich via USB verbinden, eine Info in der APP gab es da noch nicht.
Wie schaut es bei Dir aus. Ich müsste mal ein Commando testen und würde gerne etwas nehmen was bei Dir auf jeden Fall klappt. Das wäre ja wohl erstmal nur die Sachen für den Mäher. Hast Lust und Zeit?
ach schade bin leider übers WE nicht z.H.
und hab keinen Lapi dabei
Gesendet von iPhone mit Tapatalk
Kein Problem. Das macht nichts. Habe noch genug anderes zu tun am Modul :)
so bin zuhause. gibt gleich daten :D
mäher über die app updaten geht nicht. nur über usb!!
supi. Bin gespannt. Denke aber mal nicht das es geht. Habe auf jeden Fall vorsorglich schon mal eine Routine eingebaut das das Gateway die Daten kontinuierlich ab holt. Ist natürlich doof, gerade weil man vom Mäher beim mähen ja recht häufig Daten haben will. Muss mal schauen das ich das flexibel mache.
Grüße
ZitatIm Netz nach Informationen suchen ob man auch einzelne Geräte abfragen kann nach dem Status.
Ich denke ich habe einen Ansatz gefunden. Wenn Du magst stelle ich Dir mal einen payload String zusammen den Du mal bitte testen kannst.
Code: [Auswählen]
`curl -s --data '{"name":"device_info"}' --header "Content-Type:application/json" https://sg-api.dss.husqvarnagroup.net/sg-1/sessions`;
Müsstest auf die schnelle ein kleines perl oder bash script schreiben
Schau mal bitte ob Du hierüber etwas zurück bekommst
hab das eben mal gemacht und bekomme nichts sinnvolles zurück. device_info sollte doch sicherlich die device_id sein oder?
und name??
kommt nen error zurück
Dachte ich mir. Nicht schlimm, habe ja die Alternative fertig.
Übers We werde ich die Readings für die Geräte fertig machen und dann den Code gerade ziehen. Denke mal Ende nächster Woche können wir die ersten Alpha Tests fahren.
Grüße
@Kenneth
Hallo,
ich wollte mich auch noch mal melden mit meinem Stand der Dinge. Hat leider etwas gedauert, da ich anderweitig beschäftigt war.
Ich habe Deine Tipps befolgt und das SVG_plot zum laufen bekommen. Aber den Mäher über fhem zu steuern klappt immer noch nicht. Ist aber auch nicht dringend.
Danke für die bisherige Unterstützung.
Gruß
Volker
Es war ein hartes Stück Arbeit aber ich habe es geschafft. Der JSON String wird nun vernünftig geparst und die entsprechenden Readings werden gesetzt. Habe ich doch glatt 2 Tage für gebraucht. War mein erster JSON String mit verschachtelten Arrays.
Das Bridge Modul ist soweit auch schon sauber. Die Tage noch das Device Modul bisschen schick gemacht und dann geht es zu den ersten richtigen Tests mit schalten.
Der weil öffne ich nun einen Thread für unsere Module
Grüße
Leon
Hier ist nun der Modulthread
https://forum.fhem.de/index.php/topic,75098.0.html
Grüße
Hier bekommt man nun eine erste Version eines Modules
https://forum.fhem.de/index.php/topic,75098.msg668625.html#msg668625
Zitat von: mbrak am 23 Juli 2017, 16:01:16Bekomme dabei aber eine Fehlermeldung nach dem speichern.....
Weil es noch nicht aufgelöst wurde:
In der letzten Abfrage fehlte das
if!
Zitat von: mbrak am 23 Juli 2017, 16:01:16else ( $sileno_status eq 'parked_daily_limit_reached') {
my $sileno_status_D = 'Abgeschlossen'
}
Wobei ich aus optischen Gründen eher
select-
case (also
given-
when) probiert hätte.