Ankündigung

Einklappen
Keine Ankündigung bisher.

JSON String zerlegen und verteilen

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • AxelH
    antwortet
    Erster Schuß.....
    visu_NEDAP.PNG

    Einen Kommentar schreiben:


  • AxelH
    antwortet
    I made it !!!!!!!LBSinlogik.PNGVielen lieben Dank für Eure Geduldigkeit, Ausdauer und auch Schmerzfreiheit .........
    Ich denke ich habe es jetzt kapiert mit den ARRAYS.
    Aber es lag noch ein ganz anderer Stolperstein.......
    Der Seite gab erst nach erweiterung der CURLOPT_USERAGENT,.... die Daten frei
    PHP-Code:
    curl_setopt($chCURLOPT_URL$url);
        
    curl_setopt($chCURLOPT_SSL_VERIFYPEER0);
        
    curl_setopt($chCURLOPT_SSL_VERIFYHOST0);
        
    curl_setopt($chCURLOPT_RETURNTRANSFER1);
        
    curl_setopt($chCURLOPT_VERBOSE1);
        
    curl_setopt($chCURLOPT_HTTPHEADER$headers);
        
    curl_setopt($chCURLOPT_USERPWD"$uid:$upw");
        
    curl_setopt($chCURLOPT_USERAGENT,'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.13) Gecko/20080311 Firefox/2.0.0.13'); 
    Jetzt arbeite ich noch an der Visu und stelle diese dann mal ein :-)
    Yipeeeihei !!!!

    Grüße aus dem sonnigen Süden

    Axel

    Einen Kommentar schreiben:


  • jonofe
    antwortet
    Ehrlich gesagt wäre mein dringender Vorschlag PHP zu lernen, denn so kommen wir hier nicht zum Erfolg.

    Letzter Hinweis:

    PHP-Code:
    if ($ch_error) {
                  
    // Error occucred
               
    } else {
                  if (
    $result) {
                     
    $json json_decode($result,true);
                     
    $log $result['last_log'];
               
                     
    //OUTPUT
                     
    logic_setOutput($id,1,$log['time_received']);
                  }
               }

    Zuletzt geändert von jonofe; 16.03.2019, 22:47.

    Einen Kommentar schreiben:


  • AxelH
    antwortet
    edomi_error.PNG
    PHP-Code:
     $result curl_exec($ch);
        
    $ch_error curl_error($ch);
        
    curl_close($ch);
        if (
    $ch_error) {
               
    // Error occucred
               
    } else {
               if(
    $result){
               
    // $json = (json_decode($result,true));   // Hier steht dein JSON String als ARRAY
               
    $json json_decode($result);           // Hier steht dein JSON String als Object
               
    $log $json->last_log;                 // Object
               
               //OUTPUT

               
    logic_setOutput($id,22,$log);                                    //GESAMTSTRING
               
    logic_setOutput($id,23,$ch_error);                               //JSON Error
               
    logic_SetOutput($id,24,$url);                                    //URL
               
               
    logic_setOutput($id,1,$log->time_received);
               
    logic_setOutput($id,2,$log->platform_grid_power);
               
    logic_setOutput($id,3,$log->solar_power); 
    Zuletzt geändert von AxelH; 16.03.2019, 22:43.

    Einen Kommentar schreiben:


  • jonofe
    antwortet
    Nimm $json->last_log nicht $result->last_log.

    Einen Kommentar schreiben:


  • AxelH
    antwortet
    Salü das ist einfach zu hoch....
    oder ich zu tief....
    Hab die dekodierung des ARRAYs abgedreht und auch das last_log eingefügt als referenz und dann im nachgang jede einzelnen AUsgang aufgesplittet...

    PHP-Code:
    if ($ch_error) {
               
    // Error occucred
               
    } else {
               if(
    $result){
               
    // $json = (json_decode($result,true));   // Hier steht dein JSON String als ARRAY
               
    $json json_decode($result);           // Hier steht dein JSON String als Object
               
    $log $result->last_log;                 // Object
               
               //OUTPUT

               
    logic_setOutput($id,22,$log);                                    //GESAMTSTRING
               
    logic_setOutput($id,23,$ch_error);                               //JSON Error
               
    logic_SetOutput($id,24,$url);                                    //URL
               
               
    logic_setOutput($id,1,$log->time_received);
               
    logic_setOutput($id,2,$log->platform_grid_power);
               
    logic_setOutput($id,3,$log->solar_power);
               
    logic_setOutput($id,4,$log->solar_power_input1);
               
    logic_setOutput($id,5,$log->solar_temperature_input1);
               
    logic_setOutput($id,6,$log->solar_voltage_input1);
               
    logic_setOutput($id,7,$log->solar_current_input1);
               
    logic_setOutput($id,8,$log->solar_power_input2);
               
    logic_setOutput($id,9,$log->solar_temperature_input2);
               
    logic_setOutput($id,10,$log->solar_voltage_input2);
               
    logic_setOutput($id,11,$log->solar_current_input2);
               
    logic_setOutput($id,12,$log->battery_state_of_charge);
               
    logic_setOutput($id,13,$log->battery_bus_power);
               
    logic_setOutput($id,14,$log->battery_voltage);
               
    logic_setOutput($id,15,$log->battery_current);
               
    logic_setOutput($id,16,$log->battery_pack_temperature);
               
    logic_setOutput($id,17,$log->dcac_grid_voltage);
               
    logic_setOutput($id,18,$log->dcac_frequency);
               
    logic_setOutput($id,19,$log->dcac_grid_power);
               
    logic_setOutput($id,20,$log->dcac_local_voltage);
               
    logic_setOutput($id,21,$log->dcac_local_power); 
    Ich komme aber auch nicht wirklich dahinter.....
    Muß ich das Objekt $log noch irgendwie definieren?
    edomi_error.PNG

    Einen Kommentar schreiben:


  • jonofe
    antwortet
    Wenn er statt des Versuchs ein Array oder ein Object an einem Ausgang auszugeben (was nicht geht), entweder die Ausgabe der Daten als Object- oder Array-Referenz über "last_log" machen würde, dann wäre er schon lange fertig.
    Zuletzt geändert von jonofe; 16.03.2019, 20:51.

    Einen Kommentar schreiben:


  • Glotzkowski
    antwortet
    Er hat ja das Ausgeben von Werten aus dem Array oder Objekt an die Ausgänge vorerst deaktiviert und bekommt schon einen Fehler.

    AxelH
    kommentiere die Zeile
    PHP-Code:
    $json = (json_decode($result,true));   // Hier steht dein JSON String" 
    doch auch mal aus und schau ob der Fehler immer noch auftaucht.

    Dann an A22 mal direkt das Ergebnis des cURL-Requests ausgeben, also
    PHP-Code:
    logic_setOutput($id,22,$result); 
    anstelle von
    PHP-Code:
    logic_setOutput($id,22,$json); 
    Dann die Ausgabe von A22 nochmal hier zeigen.

    Einen Kommentar schreiben:


  • EugenDo
    antwortet
    Du musst dich jetzt entscheiden, ob Du den JSON als Object oder als Array umwandeln willst ...

    Als Array:

    Code:
      $json = (json_decode($result,true));
    Als Object:

    Code:
      $json = json_decode($result);

    und dann kannst Du dann deine Werte aus dem Object "last_log" auslesen ...

    also als Object:

    Code:
      $json = json_decode($result);
      $log = $result->last_log;
    
      .
      .
      .
     logic_setOutput($id,1,[B]$log->time_received[/B]);

    Einen Kommentar schreiben:


  • AxelH
    antwortet
    Hallo Ihr Geduldsamen,
    hier nochmal der aktuelle Stand....

    php:
    PHP-Code:
    ###[DEF]###
    [name    = NEDAP v0.1]

    [e#1    = Trigger #init=1]
    [e#2    = Loglevel #init=8]
    [e#3    = UserID]
    [e#4    = Passwort]
    [e#5    = PR ID]

    [a#1    = time_received]
    [a#2    = platform_grid_power]
    [a#3    = solar_power]
    [a#4    = solar_power_input1]
    [a#5    = solar_temperature_input ]
    [a#6    = solar_voltage_input1]
    [a#7    = solar_current_input1]
    [a#8    = solar_power_input2]
    [a#9    = solar_temperature_input2 ]
    [a#10    = solar_voltage_input2 ]
    [a#11    = solar_current_input2 ]
    [a#12    = battery_state_of_charge ]
    [a#13    = battery_bus_power ]
    [a#14    = battery_voltage ]
    [a#15    = battery_current ]
    [a#16    = battery_pack_temperature ]
    [a#17    = dcac_grid_voltage ]
    [a#18    = dcac_frequency ]
    [a#19    = dcac_grid_power ]
    [a#20    = dcac_local_voltage ]
    [a#21    = dcac_local_power ]
    [a#22   = JSON complete ]
    [a#23   = JSON ERROR ]

    [v#100    = 0.0.1 ]        // Version
    [v#101    = 19009999 ]    // LBS ID
    [v#102    = NEDAP ]        // LBS name
    [v#103    = 0 ]            // Log level
    [v#104    = 1 ]            // One logfile per instance
    [v#105    = 0 ]            // log ID in each line

    ###[/DEF]###


    ###[HELP]###

    E1: if >=1 update will be triggered
    E2: Enable Logging (0-none|1-emerg|2-alert|3-crit|4-err|5-warning|6-notice|7-info|8-debug)
    E3: UserID of myPowerouter.com
    E4: Password of myPowerouter.com
    E5: PowerrouterID

    A01 - LastUpdateTime *
    A02 - Sensor Leistung [W] *
    A03 - Solar Leistung gesamt [W]*
    A04 - Leistung Eingang 1 [W] *
    A05 - Temperatur Eingang 1 [°C] *
    A06 - Spannung Eingang 1 [V] *
    A07 - Stromstärke Eingang 1 [A] *
    A08 - Leistung Eingang 2 [W] *
    A09 - Temperatur Eingang 2 [°C] *
    A10 - Spannung Eingang 2 [V] *
    A11 - Stromstärke Eingang 2 [A] *
    A12 - Ladezustand Batterie [%]
    A13 - Leistung Batterie [W] *
    A14 - Spannung Batterie [V] *
    A15 - Strom Batterie [A] *
    A16 - Batterie Temperatur [°C] *
    A17 - Netzspannung [V] *
    A18 - Netzfrequenz [Hz] *
    A19 - Netzleistung [W] *
    A20 - Spannung am Local Out [V] *
    A21 - Leistung am Local Out [W] *
    A22 - Gesamtstring von mypowerrouter *
    A23 - JSON ERROR CODE

    V1: Indicator whether daemon is running

    V100: Version
    V101: LBS Number
    V102: Log file name
    V103: Log level
    V104: One log file per LBS instance
    V105: log ID in each log entry

    Changelog:
    ==========
    v0.1: Initial version


    ###[/HELP]###


    ###[LBS]###
    <?




    function LB_LBSID($id=NULL)
    {
    $E = getLogicEingangDataAll($id);
    if ($E[1]['value'] != 0 && $E[1]['refresh'] == 1) {

    if (logic_getVar($id, 1) != 1) { // dieses Konstrukt stellt sicher, dass das EXEC-Script nur einmal gestartet wird
    logic_setVar($id, 1, 1);
    logic_callExec(LBSID, $id);
    }
    }
    }
    ?>
    ###[/LBS]###


    ###[EXEC]###
    <?
    require (dirname(__FILE__) . "/../../../../main/include/php/incl_lbsexec.php");
    set_time_limit(5);
    sql_connect();

    $version = getLogicElementVar($id, 100);
    $lbsNo = getLogicElementVar($id, 101);
    $logName = getLogicElementVar($id, 102) . "-LBS$lbsNo";
    $logName = preg_replace('/ /', '_', $logName);

    if ($E = logic_getInputs($id)) {
    $uid = $E[3]['value'];
    $upw = $E[4]['value'];
    $prid = $E[5]['value'];
    $url = 'https://mypowerrouter.com/power_routers/' . $prid . '/logs/1minutes.json?normalize_logs=true&include_last_log=true&solar_power=true&solar_power_input1=true&solar_voltage_input1=true&solar_current_input1=true&solar_temperature_input1=true&solar_power_input2=true&solar_voltage_input2=true&solar_current_input2=true&solar_temperature_input2=true&dcac_grid_power=true&dcac_grid_voltage=true&dcac_frequency=true&dcac_local_power=true&dcac_local_voltage=true&battery_state_of_charge=true&battery_bus_power=true&battery_voltage=true&battery_current=true&battery_pack_temperature=true&platform_grid_power=true&grid_sensor_power_l1=true&grid_sensor_voltage_l1=true&grid_sensor_current_l1=true&grid_sensor_power_l2=true&grid_sensor_voltage_l2=true&grid_sensor_current_l2=true&grid_sensor_power_l3=true&grid_sensor_voltage_l3=true&grid_sensor_current_l3=true&responseContentDataType=json';

    $headers = array(
                     'Accept: application/json',
                     'Content-Type: application/json'
    );

     $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_VERBOSE, 1);
        curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
        curl_setopt($ch, CURLOPT_USERPWD, "$uid:$upw");
        // curl_setopt($curl, CURLOPT_USERPWD, "$uid:$upw");
        $result = curl_exec($ch);
        $ch_error = curl_error($ch);
        curl_close($ch);
        if ($ch_error) {
               // Error occucred
               } else {
               if($result){
               $json = (json_decode($result,true));   // Hier steht dein JSON String

               //OUTPUT
               //  logic_setOutput($id,1,($json['time_received']));
               //  logic_setOutput($id,2,($json['platform_grid_power']));
               //  logic_setOutput($id,3,($json['solar_power']));
               //logic_setOutput($id,4,($json['solar_power_input1']));
            //
               logic_setOutput($id,22,$json);                                   //GESAMTSTRING
               logic_setOutput($id,23,$ch_error);                               //JSON Error
               logic_SetOutput($id,24,$url);                                    //URL
            //   logic_setOutput($id,1,($json->{'time_received'}));
            //   logic_setOutput($id,2,($json->{'platform_grid_power'}));
            //   logic_setOutput($id,3,($json->{'solar_power'}));
            //   logic_setOutput($id,4,($json->{'solar_power_input1'}));
            //   logic_setOutput($id,5,($json->{'solar_temperature_input1'}));
            //   logic_setOutput($id,6,($json->{'solar_voltage_input1'}));
            //   logic_setOutput($id,7,($json->{'solar_current_input1'}));
            //   logic_setOutput($id,8,($json->{'solar_power_input2'}));
            //   logic_setOutput($id,9,($json->{'solar_temperature_input2'}));
            //   logic_setOutput($id,10,($json->{'solar_voltage_input2'}));
            //   logic_setOutput($id,11,($json->{'solar_current_input2'}));
            //   logic_setOutput($id,12,($json->{'battery_state_of_charge'}));
            //   logic_setOutput($id,13,($json->{'battery_bus_power'}));
            //   logic_setOutput($id,14,($json->{'battery_voltage'}));
            //   logic_setOutput($id,15,($json->{'battery_current'}));
            //   logic_setOutput($id,16,($json->{'battery_pack_temperature'}));
            //   logic_setOutput($id,17,($json->{'dcac_grid_voltage'}));
            //   logic_setOutput($id,18,($json->{'dcac_frequency'}));
            //   logic_setOutput($id,19,($json->{'dcac_grid_power'}));
            //   logic_setOutput($id,20,($json->{'dcac_local_voltage'}));
            //   logic_setOutput($id,21,($json->{'dcac_local_power'}));



               

               }

        }
     }
    sql_disconnect();
    ?>
    ###[/EXEC]###
    EDOMI error log file :
    edomi_error.PNG


    LBS inkl. logik:
    InkedLBSinlogik_LI.jpg

    Return wenn ich den erzeugten link aus dem LBS in den Chrombrowser eingebe:
    JSON_string.PNG

    Einen Kommentar schreiben:


  • jonofe
    antwortet
    Das JSON steht ja im ersten Post.
    Demnach sollte es

    PHP-Code:
    $json['lastlog']['time_received']
    usw
    sein.

    Oder besser so:

    PHP-Code:
    $log $json['lastlog'];
    logic_setOutput($id,1,$log['time_received']);
    logic_setOutput($id,2,$log['platform_grid_power']);
    logic_setOutput($id,3,$log['solar_power']);
    logic_setOutput($id,4,$log['solar_power_input1']); 

    Einen Kommentar schreiben:


  • Glotzkowski
    antwortet
    Zitat von EugenDo Beitrag anzeigen
    wie sieht denn der JSON eigentlich wirklich aus?
    Das war auch meine Frage.

    Zitat von EugenDo Beitrag anzeigen
    kann man irgendwo den var_dump($json); machen?
    Ich wüsste nicht wie man die Ausgabe von var_dump in EDOMI sichtbar machen könnte.
    Die etwas schwierigere Variante wäre die Custom-Log-Funktionen von jonofe einzubauen und dann das komplette Objekt oder Array im Log auszugeben.

    Vielleicht sollte der LBS vorerst um zwei Ausgänge erweitert werden, wo noch der codierte JSON-String (also direkt die Variable $result) und wo evtl. ein cURL-Fehler ($ch_error) ausgegeben werden?!


    Einen Kommentar schreiben:


  • EugenDo
    antwortet
    Zitat von Glotzkowski Beitrag anzeigen
    Wie schön, dass sich alle einig sind auf welche Art er es machen soll.

    Laut den Meldungen sind die genannten Schlüssel nicht vorhanden, bist Du sicher, dass die Abfrage funktioniert und auch Daten zurückliefert?
    ... viele Wege führen nach Rom ...


    wie sieht denn der JSON eigentlich wirklich aus? ... kann man irgendwo den var_dump($json); machen?

    Einen Kommentar schreiben:


  • Glotzkowski
    antwortet
    Wie schön, dass sich alle einig sind auf welche Art er es machen soll.

    Laut den Meldungen sind die genannten Schlüssel nicht vorhanden, bist Du sicher, dass die Abfrage funktioniert und auch Daten zurückliefert?
    Zuletzt geändert von Glotzkowski; 15.03.2019, 17:47.

    Einen Kommentar schreiben:


  • AxelH
    antwortet
    Hi jonofe,
    log.PNGhier das dazugehörige php
    PHP-Code:
     $ch curl_init();
        
    curl_setopt($chCURLOPT_URL$url);
        
    curl_setopt($chCURLOPT_RETURNTRANSFER1);
        
    curl_setopt($chCURLOPT_VERBOSE1);
        
    curl_setopt($chCURLOPT_HTTPHEADER$headers);
        
    curl_setopt($chCURLOPT_USERPWD"$uid:$upw");
        
    // curl_setopt($curl, CURLOPT_USERPWD, "$uid:$upw");
        
    $result curl_exec($ch);
        
    $ch_error curl_error($ch);
        
    curl_close($ch);
        if (
    $ch_error) {
               
    // Error occucred
               
    } else {
               if(
    $result){
               
    $json = (json_decode($result,true));   // Hier steht dein JSON String

               //OUTPUT
               
    logic_setOutput($id,1,($json['time_received']));
               
    logic_setOutput($id,2,($json['platform_grid_power']));
               
    logic_setOutput($id,3,($json['solar_power']));
               
    logic_setOutput($id,4,($json['solar_power_input1'])); 
    was mache ich denn falsch?

    Einen Kommentar schreiben:

Lädt...
X