parrot flower power pflanzensensor

hallo zusammen, ich finde zur parrot-api nur ein python-skript-
kan mir jemand zur implementierung in ips helfen?
vielen dank

username = ‚YOURUSERNAME‘
password = ‚YOURPASSWORD‘
client_id = ‚YOURCLIENT_ID‘
client_secret = ‚h9cdBEsVuNzN09VyA3vXYkGvYOUR_SECRET‘

req = requests.get(‚https://apiflowerpower.parrot.com/user/v1/authenticate‘,
data={‚grant_type‘: ‚password‘,
‚username‘: username,
‚password‘: password,
‚client_id‘: client_id,
‚client_secret‘: client_secret,
})
response = req.json()
print(‚Server response: {0}‘.format(pformat(response)))

Get authorization token from response

access_token = response[‚access_token‘]
auth_header = {‚Authorization‘: ‚Bearer {token}‘.format(token=access_token)}

Get sync data

req = requests.get(‚https://apiflowerpower.parrot.com/sensor_data/v3/sync‘,
headers=auth_header)
response = req.json()
print(‚Server response: {0}‘.format(pformat(response)))

locations = response[‚locations‘]

Build a dict to link location_identifiers to plant name

loc2name = {l[‚location_identifier‘]: l[‚plant_nickname‘] for l in locations}

We will store samples here

samples = {}

Now we get sensor data for our sensors

for loc_id in loc2name.keys():
req = requests.get(‚https://apiflowerpower.parrot.com/sensor_data/v2‘ +
‚/sample/location/{loc_id}‘.format(loc_id=loc_id),
headers=auth_header)
response = req.json()
samp = response[‚samples‘]
samples[loc_id] = samp
print(’{size} samples for {name}’.format(size=len(samp),
name=loc2name[loc_id]))

Das würde mich auch interresieren :0)

Ich hatte das gefunden:

import requests

location_identifier = 'eg9dnEtyHy589153XXX'

# Set your own authentication token
req = requests.get('https://apiflowerpower.parrot.com/sensor_data/v2/sample/location/{loc_id}'.format(loc_id=location_identifier), 
                  headers={'Authorization': 'Bearer NV7bXVn7RAqepT2VClHnYnuvyLxt5vcnP2qXXXXXXXXXXXXX'},
                  params={'from_datetime_utc': '2014-03-01T14:42:42Z',
                          'to_datetime_utc': '2014-04-13T06:30:00Z'})

print(req.json())
# Dictionary built from server json (see Server response)


{
    "errors": [], 
    "server_identifier": "0.1.0aa-1(p) March 27th 2014", 
    "user_data_version": 195, 
    "samples": [
        {
            "capture_ts": "2014-04-09T16:13:00Z", 
            "vwc_percent": 25.4264940311023, 
            "par_umole_m2s": 1.79744679064319, 
            "air_temperature_celsius": 25.65417088
        }, 
        {
            "capture_ts": "2014-04-09T16:28:00Z", 
            "vwc_percent": 25.797794474538, 
            "par_umole_m2s": 2.11736677190602, 
            "air_temperature_celsius": 25.74426709792
        }, 
        {
            "capture_ts": "2014-04-09T16:43:00Z", 
            "vwc_percent": 25.5423621483772, 
            "par_umole_m2s": 2.36974218900852, 
            "air_temperature_celsius": 25.92424576864
        }, 
    ], 
    "fertilizer": [
        {
            "watering_cycle_end_date_time_utc": "2014-04-03T17:37:12Z", 
            "fertilizer_level": 0.0, 
            "id": 29242, 
            "watering_cycle_start_date_time_utc": "2014-04-03T15:37:13Z" 
        }, 
        {
            "watering_cycle_end_date_time_utc": "2014-04-06T16:12:09Z", 
            "fertilizer_level": 1.86557015103947, 
            "id": 29243, 
            "watering_cycle_start_date_time_utc": "2014-04-03T17:52:11Z" 
        }, 
    ], 
    "events": []
}


Hi@ all
Und wer hat es schon am laufen?

Hi,

Wie werden denn die Daten der Sensoren abgerufen? Braucht man da zwingend ein Smartphone, oder gibt es dazu noch so eine Art Bridge, die die Daten abruft und zum Parrotserver sendet?

Moin…

… ich hab da mal was vorbereitet. wuppi83 hatte mich gebeten mir mal die Api anzuschauen. Nach 3 Stunden google und weiteren 3 Stunden probieren habe ich es geschaft an die Daten zu kommen.
Alles nicht besonders schön… aber ein Anfang. Ich bin kein Fachmann… vielleicht gehts es einfacher und besser.

Das Skript kann gerne erweitert, verbessert etc. werden. Ich möchte aber bitten dieses dann mit allen Usern hier im Forum zu teilen.

Ich mach den Anfang. Jetzt seid ihr dran!

Viel Spaß und erfolg damit.

Gruß,
Peter

Skript v.0.1 (08.07.2014) => 1. Entwurf
Skript v.0.2 (09.07.2014) => Abfrage „Obtain garden location statuses“ Mehr Daten zur Auswahl. Link zum parrot Flower Power Wiki


<?

/*


	Ersteller: peterchrisben
 	Forum-Link: http://www.ip-symcon.de/forum/threads/25035-parrot-flower-power-pflanzensensor
 	Datum: 09.07.2014
 	Version: 0.2


*/


// First we set our credentials
$username = 'HIER DEINEN USERNAMEN EINTRAGEN';
$password = 'HIER DEIN PASSWORD EINTRAGEN';

// Get your client credentials here: https://apiflowerpower.parrot.com/api_access/signup
// Anmelden, danach erhälst Du beides per email.

$client_id = 'HIER DEINE CLIENT-ID EINTRAGEN';
$client_secret = 'HIER DEINEN CLIENT-SECRET-KEY EINTRAGEN';


$clienttoken_post = array(
    "username" => $username,
    "password" => $password,
    "client_id" => $client_id,
    "client_secret" => $client_secret,
    "grant_type" => 'password'
    );


// access_token holen
$curl = curl_init( 'https://apiflowerpower.parrot.com/user/v1/authenticate' );
curl_setopt( $curl, CURLOPT_POST, true );
curl_setopt( $curl, CURLOPT_POSTFIELDS, $clienttoken_post);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);

$json_response = curl_exec($curl);
curl_close($curl);
$authObj = json_decode($json_response);
$access_key = $authObj->access_token;

//print_r($authObj);   // debug : zeigt access token etc. an.




// Sensor übersicht abholen

$curl = curl_init( 'https://apiflowerpower.parrot.com/sensor_data/v3/sync' );
curl_setopt( $curl, CURLOPT_HTTPHEADER, array( 'Authorization: Bearer ' . $access_key ) );
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
$response_sensors = curl_exec( $curl );
curl_close($curl);

$response_sensors = json_decode($response_sensors);
$response_sensors = $response_sensors ->{'locations'};


print_r($response_sensors); // debug : Zeigt eine Liste der Sensoren an.

// Sensor Nummer 1
$sensor1 = $response_sensors['0']->{'location_identifier'};
//$sensor2 = $response_sensors['1']->{'location_identifier'};


// Sensor Daten holen ( hier als Beispiel von Sensor #1 )
$curl = curl_init( 'https://apiflowerpower.parrot.com/sensor_data/v2/sample/location/'.$sensor1.'' );
curl_setopt( $curl, CURLOPT_HTTPHEADER, array( 'Authorization: Bearer ' . $access_key ) );
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
$response_data = curl_exec( $curl );
curl_close($curl);

$response_data = json_decode($response_data);
$response_data = $response_data ->{'samples'};
$response_data = array_reverse($response_data); // Dreht das array um und liefer die aktuellsten Werte zuerst.
$response_data = array_slice($response_data, 0, 10); // Holt die letzten 10 Werte ab.

//print_r($response_data); // debug : zeigt die letzten 10 Datensätze an.

// Ausgabe in Variablen

//SetValue(10824 /*[TEST\FLOWER POWER\Capture Time]*/, ($response_data['0']->{'capture_ts'})); // String Variable mit Capture Time
//SetValue(29396 /*[TEST\FLOWER POWER\Temperature]*/, round(($response_data['0']->{'air_temperature_celsius'}),1)); // Float Variable mit Air Temp.
//SetValue(30565 /*[TEST\FLOWER POWER\VWC Percent]*/, round(($response_data['0']->{'vwc_percent'}),2)); // Float Variable mit vwc_percent
//SetValue(48408 /*[TEST\FLOWER POWER\par_umole_m2s]*/, round(($response_data['0']->{'par_umole_m2s'}),5)); // Float Variable mit par_umole_m2s


// NEU v.0.2 

// Obtain garden location statuses
$curl = curl_init( 'https://apiflowerpower.parrot.com/sensor_data/v3/garden_locations_status' );
curl_setopt( $curl, CURLOPT_HTTPHEADER, array( 'Authorization: Bearer ' . $access_key ) );
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
$response_gardenstatus = curl_exec( $curl );
curl_close($curl);

$response_gardenstatus = json_decode($response_gardenstatus);

print_r($response_gardenstatus); // debug : Zeigt "garden location statuses" an.

?>

Hammer Peter !!!

Danke dafür … ohne dich hätte ich hier viel rumliegen was ich aber nicht nutzen könnte :smiley:

Hab dir gerade noch ne PN geschickt :wink:

VG

Andreas

Trotzdem brauch man ein iphone oder ipad als empfangsstation?! Eine Alternative wirds wohl nicht geben?!

Das ist ja nicht so toll. Das soll ja alles auch funzen, wenn man mal ein paar Tage nicht zu Hause ist.

Wuppi83 fragt die Sensoren mit einem verbauten Tablet ab wenn ich das richtig verstanden hab!?

Vielleicht kann er dazu noch mal was sagen?
Gruß,
Peter

Moin…

…hab das Skript erweitert. Jetzt können die Daten „Obtain garden location statuses“ abgefragt werden.

Hier der Link zum parrot wiki.

Das Skript habe ich im Post #5 angepasst.

Viel Spaß,
Peter

Wow … werde ich nachher gleich mal testen :0)

So nun aber nochmal kurz wie ich das ganze eingebunden habe.
Ich habe in jedem Raum als Interface ein Tab hängen … perfekt eignet sich dafür das Odys Pedi Plus für +/- 55 EUR.
Neu dazu gekommen ist jetzt ein Nexus 7 (2013), denn dieses hat BT 4.0. Von hier aus werden alle Flower Power Sensoren im Hintergrund im Zeitabstand von 2 Stunden abgefragt. Problem somit gelöst :0)

Brauche doch nochmal hilfe :0(

Wie muss die Zeile aussehen wenn ich diese Werte in ne Variable schreiben will. Ein Beispiel genügt !
(die rot markierten)

stdClass Object
(
    [locations] => Array
        (
            [0] => stdClass Object
                (
                    [location_identifier] => SWWknP4zGK4165972653
                    [last_processed_upload_timedate_utc] => 2014-07-09T18:04:00Z
                    [total_sample_count] => 671
                    [last_sample_upload] => 2014-07-09T18:04:00Z
                    [first_sample_utc] => 2014-07-02T18:24:00Z
                    [last_sample_utc] => 2014-07-09T17:54:00Z
                    [global_validity_timedate_utc] => 2014-07-11T17:54:00Z
                    [air_temperature] => stdClass Object
                        (
                            [status_key] => status_ok
                            [instruction_key] => air_temperature_good
                            [next_analysis_timedate_utc] => 
                            [predicted_action_timedate_utc] => 
                            [done_action_timedate_utc] => 
                            [gauge_values] => stdClass Object
                                (
                                    [min_threshold] => -23.3
                                    [max_threshold] => 41.7
                                    [current_value] => 25.630757737516
                                )

                        )

                    [light] => stdClass Object
                        (
                            [b][status_key] => status_ok[/b]
                            [instruction_key] => light_good
                            [next_analysis_timedate_utc] => 
                            [predicted_action_timedate_utc] => 
                            [done_action_timedate_utc] => 
                            [gauge_values] => stdClass Object
                                (
                                    [min_threshold] => 0.3
                                    [max_threshold] => 99
                                    [current_value] => 1.754471973278
                                )

                        )

                    [soil_moisture] => stdClass Object
                        (
                            [status_key] => status_critical
                            [instruction_key] => soil_moisture_too_low
                            [next_analysis_timedate_utc] => 
                            [predicted_action_timedate_utc] => 
                            [done_action_timedate_utc] => 
                            [gauge_values] => stdClass Object
                                (
                                    [min_threshold] => 10
                                    [max_threshold] => 
                                    [current_value] => 9.2205849060515
                                )

                        )

                    [fertilizer] => stdClass Object
                        (
                            [status_key] => status_ok
                            [instruction_key] => fertilizer_good
                            [next_analysis_timedate_utc] => 
                            [predicted_action_timedate_utc] => 
                            [done_action_timedate_utc] => 
                            [gauge_values] => stdClass Object
                                (
                                    [min_threshold] => 0.5
                                    [max_threshold] => 3
                                    [b][current_value] => 2.3302904788135[/b]
                                )

                        )

                    [user_sharing] => stdClass Object
                        (
                            [first_all_green] => stdClass Object
                                (
                                    [event_datetime_utc] => 2014-07-03T17:19:00Z
                                    [remind_datetime_utc] => 
                                    [picture_shared] => false
                                )

                        )

                )

        )

    [sensors] => Array
        (
            [0] => stdClass Object
                (
                    [sensor_serial] => 
                    [current_history_index] => 672
                    [last_upload_datetime_utc] => 2014-07-09T17:54:00Z
                    [total_uploaded_samples] => 671
                    [battery_level] => stdClass Object
                        (
                            [b][battery_end_of_life_date_utc] => 2015-03-26T18:25:49Z
                            [level_percent] => 100[/b]
                        )

                )

        )

    [user_config_version] => 7
    [garden_status_version] => 22
    [errors] => Array
        (
        )

    [server_identifier] => 0.1.0ad-1B(p) June 12th 2014

Danke !

Kein Ding. Schau Dir aber mal das gesamte Array an und dann wie die Abfrage gemacht wird. Ist immer das Gleiche.


$curl = curl_init( 'https://apiflowerpower.parrot.com/sensor_data/v3/garden_locations_status' );
curl_setopt( $curl, CURLOPT_HTTPHEADER, array( 'Authorization: Bearer ' . $access_key ) );
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
$response_gardenstatus = curl_exec( $curl );
curl_close($curl);

$response_statuskey_light = json_decode($response_gardenstatus);
$response_statuskey_light = $response_statuskey_light ->{'locations'};
$response_statuskey_light = $response_statuskey_light['0']->{'light'};
$response_statuskey_light = $response_statuskey_light ->{'status_key'};

print_r($response_statuskey_light); // debug : Zeigt "status_key" in "lights" an.

Fertilizer Current Value


$curl = curl_init( 'https://apiflowerpower.parrot.com/sensor_data/v3/garden_locations_status' );
curl_setopt( $curl, CURLOPT_HTTPHEADER, array( 'Authorization: Bearer ' . $access_key ) );
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
$response_gardenstatus = curl_exec( $curl );
curl_close($curl);

$response_fertilizer_current = json_decode($response_gardenstatus);
$response_fertilizer_current = $response_fertilizer_current ->{'locations'};
$response_fertilizer_current = $response_fertilizer_current['0']->{'fertilizer'};
$response_fertilizer_current = $response_fertilizer_current ->{'gauge_values'};
$response_fertilizer_current = $response_fertilizer_current ->{'current_value'};

print_r($response_fertilizer_current); // debug : Zeigt "current value" in "fertilizer" an.

Sensors bekommst selber hin. Versuch es einfach mal. Wenn nicht sag bescheid.

Gruß,
Peter

Läuft :smiley:

Jetzt hab ich das glaube ich verstanden :wink:

Danke !

Sehr schön!

Es ginge auch etwas kürzer… aber so wie oben beschrieben ist der Lerneffekt ( war zumindest bei mir so ) größer!

Kurzform als Beispiel:


$response_fertilizer_current = json_decode($response_gardenstatus);
$response_fertilizer_current = $response_fertilizer_current['0']->{'fertilizer'}->{'gauge_values'}->{'current_value'};

Gruß,
Peter

Hallo zusammen,

leider funktioniert bei mir das Script nicht. Beim Aufrufen dieses Teils des Scrips:

// Sensor Daten holen ( hier als Beispiel von Sensor #1 )
$curl = curl_init( 'https://apiflowerpower.parrot.com/sensor_data/v2/sample/location/'.$sensor1.'');
curl_setopt( $curl, CURLOPT_HTTPHEADER, array( 'Authorization: Bearer ' . $access_key ) );
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
$response_data = curl_exec( $curl );
curl_close($curl);

bekomme ich „error_code“:9048,„error_message“:„The requested date span is too large“ als Rückmeldung für die Variable $response_data

Entsprechend ist es mir auch nicht möglich, die ‚samples‘ abzurufen. Vermutlich würde es schon helfen, wenn man das Datum eingrenzt, für welches Daten zurückgeliefert werden sollen. Die Dokumentation des Power Plant hält hierfür extra den Parameter ‚from_datetime_utc‘ bereit (vgl. Flower Power API Reference).

Leider bin ich jedoch blutiger php-Anfänger und hab keine Idee mehr, wie ich die Parameter einbinden bzw. das Script zum laufen bringen kann. Hat jemand von Euch eine Idee?

Gruß
Jörn

Hallo zusammen,

habe das Skript bei mir eingefügt und mit den passenden Login Daten versehen.

Muss man zusätzlich noch was machen?

Von Hand Vars. einfügen oder diese im Skript anpassen?

Komme da nicht ganz weiter mit den Anweisungen ;-(

Danke für Hilfe

glg

Manuela

Werden nicht fünf Werte übermittelt?

Dünger fehlt in den Vars. oder?

glg

Habe Flower Power am laufen.

Mit dem IPS Skript für Cloud Daten Export sowie die Bridge Flower Power für Daten sync…

Alles mit dem neuen Raspberry 3 und Jessy.

huhuiiiii

Hi scanix,
poste dein Skript doch einfach mal hier, dann können alle daran teilhaben! :wink:
Grüße,
Peter

Gesendet von iPhone mit Tapatalk