[73_GardenaSmartBridge, 74_GardenaSmartDevice] - Module für Gardena Smart System

Begonnen von CoolTux, 05 August 2017, 23:17:06

Vorheriges Thema - Nächstes Thema

CoolTux

Zitat von: bigcheese am 24 März 2020, 14:46:24
Sileno Roboter: seit der neuen Firmware wird anscheinend der Timer anders berechnet - falls ich ihm den OverrideTimer mit wie bisher 1440 sende, fährt er nur noch 24 minuten :)
d.h. entweder müsste der slider angepasst werden in der max-Werte von 74_GardenaSmartDevice oder man schickt über einen anderen schalter eine höhere zeitspanne :)

gruss,
bigcheese

Ich habe jetzt nicht direkt geschaut was Du meinst. Aber 1440 Sekunden sind bei mir 24 Minuten.
Oder meintest Du etwas anderes?
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

m2th3o

Hallo zusammen,

ich habe (leider) auch eine Fehlfunktion mit der Smart Irrigation Control feststellen können.

bei

set xxx manualDurationValve 15

wird das gesendet:

2020.03.27 21:38:52 4: GardenaSmartBridge (myGardenaBridge) - Send with URL: https://sg-api.dss.husqvarnagroup.net/sg-1/devices/b48bfe44-442a-4568-8ad3-5f9484522dd6/abilities/watering/properties/watering_timer_3?locationId=284adba7-1ad9-4f6f-b9cc-fc38bf8eb512, HEADER: secret!, DATA: secret!, METHOD: PUT


Es kommt aber ein Fehler von Gardena (json) zurück. Über die App kann ich einen "Fehler im Masterkanal" abrufen.

Ist das auch auf die hier beschriebenen Fehler zurückzuführen?

Gruß
m2th3o

CoolTux

Zitat von: m2th3o am 27 März 2020, 21:57:31
Hallo zusammen,

ich habe (leider) auch eine Fehlfunktion mit der Smart Irrigation Control feststellen können.

bei

set xxx manualDurationValve 15

wird das gesendet:

2020.03.27 21:38:52 4: GardenaSmartBridge (myGardenaBridge) - Send with URL: https://sg-api.dss.husqvarnagroup.net/sg-1/devices/b48bfe44-442a-4568-8ad3-5f9484522dd6/abilities/watering/properties/watering_timer_3?locationId=284adba7-1ad9-4f6f-b9cc-fc38bf8eb512, HEADER: secret!, DATA: secret!, METHOD: PUT


Es kommt aber ein Fehler von Gardena (json) zurück. Über die App kann ich einen "Fehler im Masterkanal" abrufen.

Ist das auch auf die hier beschriebenen Fehler zurückzuführen?

Gruß
m2th3o

Leider sagt das Log nichts aus. Ich brauche das Data.
Du kannst die Stelle einmal suchen im Code und die Zeile darunter den Kommentar (#) davor löschen. neustart und dann noch mal testen bitte
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

m2th3o

Hilft das weiter?
Das wird gesendet:


Send with URL: https://sg-api.dss.husqvarnagroup.net/sg-1/devices/b48bfe44-442a-4568-8ad3-5f9484522dd6/abilities/watering/properties/watering_timer_1?locationId=284adba7-1ad9-4f6f-b9cc-fc38bf8eb512, HEADER: Content-Type: application/json
X-Session: 5d636661-8d2e-4ea4-b9b5-ee4285eb401d, DATA: {"properties":{"name":"watering_timer_1","value":{"state":"manual", "duration":5,"valve_id":1}}}, METHOD: PUT



CoolTux

Sieht sauber aus. Kann aber sein das die API auch hier geändert wurde.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

m2th3o

In den Reading heißen die Sachen "watering-watering_timer_1_duration" usw..
Kann es sein, dass der Name der Property nicht korrekt aufgerufen wird?

Kann ich sonst helfen, beim Testen zu unterstützen? Es wär echt super, wenn das wieder funktioniert!

Danke & Gruß
m2th3o

Det20

Für Bastler hier mein PHP-Code, mit dem ich meinen Gateway direkt ansteuere. Um rauszubekommen welche Nummer das Gerät bei Euch hat, muss $Debug auf true gesetzt werden. Der dafür relevante Teil steht unter "Locations lesen mit GET". Source ist nicht schön gemacht; aber klappt :)


<?php
  
// Stoppen:  gardena.php?duration=0
  // 1 Minute: gardena.php?duration=1
  // Status:   gardena.php?status=99
  
  
$Username '...';
  
$Password '...';
  
$RootURL  'https://smart.gardena.com/v1';
  
$ClientID 'smartgarden-jwt-client';
  
$Debug    false;
  
  
// Damit GET Variablen sichtbar sind
  
if (! ini_get('register_globals'))
  {
    
extract($_GET);
    
extract($_POST);
    
ini_set('register_globals'true);
  };
  
  
// ***
  // Anmelden mit POST, um Bearer zu bekommen
  // ***
  
$payload '{"data":{"type":"token","attributes":{"username":"'.$Username.'","password":"'.$Password.'","client_id":"'.$ClientID.'"}}}'// 
  
$url     $RootURL.'/auth/token'
  
  
$ch curl_init($url);
  
curl_setopt($chCURLOPT_POSTFIELDS$payload);
  
curl_setopt($chCURLOPT_HTTPHEADER, array('Content-Type: application/json; charset=utf-8'));
  
curl_setopt($chCURLOPT_RETURNTRANSFERtrue);
  
$result curl_exec($ch);
  
$code   curl_getinfo($chCURLINFO_HTTP_CODE);
  
curl_close($ch);
  if(
$Debug==true) { var_dump($result); };

  
$data        json_decode($resulttrue);
  
$Bearer      $data['data']['id'];
  
$Bearer_Prov $data['data']['attributes']['provider'];
  
$userID      $data['data']['attributes']['user_id'];
  
//
  
if($Bearer=="") { Die("Error while Login: Bearer empty"); }
  else if(
$Bearer_Prov=="") { Die("Error while Login: Bearer-Provider empty"); }
  else if(
$userID=="") { Die("Error while Login: UserID empty"); };
  
  
  
// ***
  // User-Daten auslesen
  // Nicht benötigt
  // ***
  /*
  $url = $RootURL.'/auth/users/'.$userID; 
  $ch  = curl_init($url);
  curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json',
                                             'Authorization: Bearer '.$Bearer,
                                             'Authorization-Provider: '.$Bearer_Prov));
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  $result = curl_exec($ch);
  $code   = curl_getinfo($ch, CURLINFO_HTTP_CODE);
  curl_close($ch);
  if($Debug==true)
  { 
    echo '<br><br>';
    var_dump($result);
  };
  
  $data      = json_decode($result, true);
  $FirstName = $data['data']['attributes']['first_name']; 
  $LastName  = $data['data']['attributes']['last_name']; 
  $RegProv   = $data['data']['attributes']['registration_provider'];
  */
  
  
  // ***
  // Locations lesen mit GET
  // ***
  
$url $RootURL.'/locations?locationId=null&user_id='.$userID
  
$ch  curl_init($url);
  
curl_setopt($chCURLOPT_HTTPHEADER, array('Content-Type: application/json',
                                             
'Authorization: Bearer '.$Bearer,
                                             
'Authorization-Provider: '.$Bearer_Prov));
  
curl_setopt($chCURLOPT_RETURNTRANSFERtrue);
  
$result curl_exec($ch);
  
$code   curl_getinfo($chCURLINFO_HTTP_CODE);
  
curl_close($ch);
  if(
$Debug==true)
  { 
    echo 
'<br><br>';
    
var_dump($result);
  };

  
$data       json_decode($resulttrue);
  
$LocationID $data['locations']['0']['id'];
  
$Gateway    $data['locations']['0']['devices'][0]; // GW
  
$WaterCtl   $data['locations']['0']['devices'][1]; // WaterCtrl
  
$Pumpe      $data['locations']['0']['devices'][2]; // Pumpe

  // WaterCtl
  
if($LocationID=="") { Die("Error while Locations: Location-ID empty"); }
  else if(
$Gateway=="") { Die("Error while Locations: Gateway-ID empty"); }
  else if(
$WaterCtl=="") { Die("Error while Locations: WaterControl-ID empty"); }
  else if(
$Pumpe=="") { Die("Error while Locations: Pumpe-ID empty"); };
  
//
  
  // Verfügbare Geräte und Status
  
if($status<>"")
  {
    
$url     $RootURL.'/devices?locationId='.$LocationID;
    
$ch  curl_init($url);
    
curl_setopt($chCURLOPT_HTTPHEADER, array('Content-Type: application/json',
                                               
'Authorization: Bearer '.$Bearer,
                                               
'Authorization-Provider: '.$Bearer_Prov));
    
curl_setopt($chCURLOPT_RETURNTRANSFERtrue);
    
$result curl_exec($ch);
    
$code   curl_getinfo($chCURLINFO_HTTP_CODE);
    
curl_close($ch);
    if(
$Debug==true)
    { 
      echo 
'<br><br>';
      
var_dump($result);
    };
    
// manual
    // idle
    
$data     json_decode($resulttrue);
    
$Status   $data['devices'][1]['abilities']['5']['properties'][0]['value']['state'];
    
$ToGo     $data['devices'][1]['abilities']['5']['properties'][0]['value']['duration'];
    
//
    
$Status2  $data['devices'][2]['abilities']['3']['properties'][1]['value']; // Status
    
$Pressure $data['devices'][2]['abilities']['4']['properties'][0]['value']; // Akt Druck
    
$Liter    $data['devices'][2]['abilities']['5']['properties'][2]['value']; // m³ Seit Start
    
$Liter    $Liter 0.0010000;                                              // In Liter
    
$FlowRate $data['devices'][2]['abilities']['5']['properties'][0]['value']; // l/Std
    
    // WC
    
if($status==1) { die($Status); }
    else if(
$status==2) { die($ToGo); }
    
// Pumpe
    
else if($status==10) { die(trim(" ".$Status2)); }
    else if(
$status==11) { die(trim(" ".$Pressure)); }
    else if(
$status==12) { die(trim(" ".$Liter)); }
    else if(
$status==13) { die(trim(" ".$FlowRate)); }
    
// Alle INI
    
else if($status==98)
    {
      Echo 
"State_1=".$Status."\n";
      Echo 
"State_2=".$ToGo."\n";
       
      Echo 
"State_10=".$Status2."\n";
      Echo 
"State_11=".$Pressure."\n";
      Echo 
"State_12=".$Liter."\n";
      Echo 
"State_13=".$FlowRate."\n";

      die();
    }
    else if(
$status==99)
    {
      Echo 
"Status WaterControl (Device 1)<HR>";
      Echo 
"Status (1): ".$Status."<br>";
      Echo 
"Time to Go (2): ".$ToGo."<br><br>";
       
      Echo 
"<hr>Status Pumpe (Device 2)<HR>";
      Echo 
"Status (10): ".$Status2."<br>";
      Echo 
"Pressure (11): ".$Pressure."<br>";
      Echo 
"Liter (12): ".$Liter."<br>";
      Echo 
"Flowrate l/h (13): ".$FlowRate."<br>";

      die();
    } else { die(
'Error'); };
  };
  
  
  
  
  
// Beispiel WaterCtrl: Steuerung an/aus
  
if ($duration<>"")
  {
    if(
$duration<=0) { $payload '{"properties":{"name":"watering_timer_1","value":{"duration":0,"state":"idle","valve_id":1}}}'; }
    else if(
$duration>0)
    {
      
$duration $duration*60;
      
$payload '{"properties":{"name":"watering_timer_1","value":{"duration":'.$duration.',"state":"manual","valve_id":1}}}';
    };
  
    
$url $RootURL.'/devices/'.$WaterCtl.'/abilities/watering/properties/watering_timer_1?locationId='.$LocationID;
   
    
$ch curl_init($url);
    
curl_setopt($chCURLOPT_POST1);
    
curl_setopt($chCURLOPT_POSTFIELDS$payload);
    
//curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_2_0);
    
curl_setopt($chCURLOPT_CUSTOMREQUEST"PUT");
    
curl_setopt($chCURLOPT_HTTPHEADER, array('Content-Type: application/json',
                                               
'Authorization: Bearer '.$Bearer,
                                               
'Authorization-Provider: '.$Bearer_Prov));
    
curl_setopt($chCURLOPT_RETURNTRANSFERtrue);
    
$result curl_exec($ch);
    
$code   curl_getinfo($chCURLINFO_HTTP_CODE);
    
curl_close($ch);
    if(
$Debug==true)
    { 
      echo 
'<br><br>';
      
var_dump('Set-Command-Info HTTP-Code '.$code.' : '.$result);
    };
  
    if(
$code==204) { Echo "OK"; }
    else { Echo 
"Error while send command: HTTP ".$code; };
  };
  
  
  
// Beispiel: startpressure 1, 2, 3 (2.0, 2.4, 2.8)
  
if ($startpressure<>"")
  {
    if (
$startpressure==1) { $duration "2.0"; }
    else if (
$startpressure==2) { $duration "2.4"; }
    else { 
$duration "2.8"; };
    
$payload '{"settings":{"name":"turn_on_pressure","value":'.$duration.',"device":"'.$Pumpe.'"}}';
  
    
$url $RootURL.'/devices/'.$Pumpe.'/settings/3dcda24e-3320-4ba4-888d-89b5746bfd1f?locationId='.$LocationID;
   
    
$ch curl_init($url);
    
curl_setopt($chCURLOPT_POST1);
    
curl_setopt($chCURLOPT_POSTFIELDS$payload);
    
//curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_2_0);
    
curl_setopt($chCURLOPT_CUSTOMREQUEST"PUT");
    
curl_setopt($chCURLOPT_HTTPHEADER, array('Content-Type: application/json',
                                               
'Authorization: Bearer '.$Bearer,
                                               
'Authorization-Provider: '.$Bearer_Prov));
    
curl_setopt($chCURLOPT_RETURNTRANSFERtrue);
    
$result curl_exec($ch);
    
$code   curl_getinfo($chCURLINFO_HTTP_CODE);
    
curl_close($ch);
    if(
$Debug==true)
    { 
      echo 
'<br><br>';
      
var_dump('Set-Command-Info HTTP-Code '.$code.' : '.$result);
    };
  
    if(
$code==204) { Echo "OK"; }
    else { Echo 
"Error while send command: HTTP ".$code; };
  };
  
?>


m2th3o

Hallo Det20,

wie kann man das Skript benutzen? Ich habe es per XAMPP ausgeführt, aber beim Aufruf wirft es div. Fehler... Bin leider kein php-experte.

Gruß
m2th3o

Tommy_84

Erst mal Danke für das tolle Modul.
Auch hier stimmt seit dem Update die Zeit des Manuellen Mähens nicht mehr.

Ist es ggf. möglich mir einem nächsten Update auch den Status "unterwegs zum Startpunkt" als State zu bekommen?

Gruß
Tommy

CoolTux

Ich kann nur das wiedergeben was die API liefert. Ich gehe davon aus das sie API das nicht liefert.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

Tommy_84

Zitat von: CoolTux am 01 April 2020, 20:42:24
Ich kann nur das wiedergeben was die API liefert. Ich gehe davon aus das sie API das nicht liefert.

Ich hab leider absolut keine Ahnung davon. Ich kann nur sagen, das mir die Gardena App diesen Status liefert. :)

CoolTux

Zitat von: Tommy_84 am 01 April 2020, 20:45:37
Ich hab leider absolut keine Ahnung davon. Ich kann nur sagen, das mir die Gardena App diesen Status liefert. :)

Ich schaue morgen noch mal. Bin mir aber sicher daß ich alles verarbeite was mir geliefert wird.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

Tommy_84

Zitat von: CoolTux am 01 April 2020, 20:47:47
Ich schaue morgen noch mal. Bin mir aber sicher daß ich alles verarbeite was mir geliefert wird.

Das wäre echt super. Danke für die schnelle Reaktion und weiter so. ;)

stera

Hallo,

ich habe mein Mower aus den Winterschlaf geholt. Nun muss ich dazu sagen, dass mein Akku defekt war und die Verbindung zur App danach fehlerhaft war. Ich musste also den Mower neu in die App einbinden. In Fhem war dann keine Verbindung mehr zum GardenaSmartDevice (Mower). Die Cloud Connection funktioniert aber.
Anschließend habe ich in Fhem alles gelöscht, ein Update von Fhem gemacht, Neustart und GardenaSmartBridge neu hinzugefügt. Er legt mir aber nicht mehr den Mower (GardenaSmartDevice ) automatisch an. Woran kann das liegen?
Hat sich bei Gardena in der Abfrage vllt. was verändert?

Danke für Eure Hilfe

Gruß,
Stefan

stera

Update: Jetzt nach einiger Zeit hat das doch angelegt.. Morgen werde ich dann weiter testen.