javascript in PHP

Hallo zusammen,

kann mir jemand sagen ob es möglich ist dieses javascript in PHP umzuwandeln bzw. diese Werte die da abgefragt werden in IP-Symcon zu bekommen.

var url = "http://192.168.178.XX/volkszaehler.org/htdocs/middleware.php/data.json?from=Yesterday&to=today&uuid[]=b6ae8c20-683c-01e5-XXXXXX&uuid[]=c40cdd80-259XXXXX";
var pfad = "Volkszaehler.";
var idWASSERVERBRAUCH_GESTERN = pfad + "WASSERVERBRAUCH_GESTERN";
var idSTROMVERBRAUCH_GESTERN = pfad + "STROMVERBRAUCH_GESTERN";

// Vorgegebene Funktion, die nur dazu dient, das JSON einzulesen
// Angelehnt an: http://www.iobroker.net/docu/?page_id=3691
var request = require("request");
function readJson(url, callback) {
    request(url, function(err, state, body) {
        if (body) {
            var json = {};
            if (body !== "") {
                try {
                    json = JSON.parse(body);
                } catch (ex) {
                    json = {};
                }
                if (!json) {
                    json = {};
                }
            }
            callback(null, json);
        } else {
            var error = "(" + err + ") ERROR bei Abfrage von: " + url;
            log(error, "warn");
            callback(error, null);
        }
    });
}

// Erzeugen der Objekte in ioBroker
createState(idWASSERVERBRAUCH_GESTERN, 0, {
    name: 'Wasserverbrauch gestern',
    desc: 'Wasserverbrauch gestern',
    type: 'number',
    role: 'value',
    unit: 'L'
});
createState(idSTROMVERBRAUCH_GESTERN, 0, {
    name: 'Stromverbrauch gestern',
    desc: 'Stromverbrauch gestern',
    type: 'number',
    role: 'value',
    unit: 'W'
});

// Startet das Skript alle 2 Sekunden neu
schedule("*/60 * * * * *", function() {
    readJson(url, function(err, json) {
        if (!err) {
            var wert1 = json.data[0].consumption;
            var wert2 = json.data[1].consumption;
            // Setzen der Werte in ioBroker
            // Man füllt die oben erzeugten Objekte jetzt mit den Werten
            setState(idWASSERVERBRAUCH_GESTERN, wert1);
            setState(idSTROMVERBRAUCH_GESTERN, wert2);
        } else {
            log("Fehler beim Auslesen des JSON fuer Volkszaehler. Keine Daten erhalten.", "warn");
        }
    });
});



Als Antwort kommt jetzt bestimmt JA. :smiley:

Ich habe vom programmieren keine Ahnung und klau mir immer alles so zusammen und passe es an.

Wenn mir jemand einen Tipp geben könnte wie ich das anstellen kann währe ich dankbar.

Viele Grüße
Thomas

Hi Thomas!

Klar geht das :wink: :smiley:

Und das bekommst du auch quasi ohne PHP Kenntnisse hin :slight_smile:
>> Hier im Forum gibt es eine Menge Beispiel-Skripte wie man eine URL aufruft und Daten aus dem zurückgegebenen Json in eine IPS-Variable schreibt.

Stichworte zur Suche:

  • curl
  • json_decode

Viel Erfolg bei deinem ersten kleinen, zum Einstieg perfekten, Projekt :slight_smile:

Beste Grüße,
Chris

Du must nur die Daten von der url abholen und dann in Variablen schreiben. Das ist nicht so schwer, Du kannst ja mal schauen ob Du das hin bekommst, wenn Fragen bei der Umsetzung sind einfach konkret fragen.

Um die Daten abzurufen kannst Du
Sys_GetURLContent
nutzten.

Also


$data = Sys_GetURLContent("http://192.168.178.XX/volkszaehler.org/htdocs/middleware.php/data.json?from=Yesterday&to=today&uuid[]=b6ae8c20-683c-01e5-XXXXXX&uuid[]=c40cdd80-259XXXXX");
var_dump($data);

Als Antwort bekommst Du wahrscheinlich ein JSON.

Das kannst Du wie unter JSON Daten von einer Webseite auslesen und auswerten beschrieben auswerten und die Variablen die Du benötigst dann in Variablen in IP-Symcon schreiben.

Fonzo: Kau doch nicht jedem alles vor :slight_smile: 2 Minuten im Forum suchen und ein wenig Copy&Paste sollte jedem zuzumuten sein. Kein Wunder schreien alle um Hilfe, wenn sie zB nur eine Variable setzen wollen, wenn „Mami“ brav immer alles schön vorkaut und sie füttert :wink:

Schönen Abend allerseits,
Chris

Mach ich ja nicht ;), lesen muss er noch selber. Aber vielleicht hat er so ja schneller sein erstes Erfolgserlebnis beim „Code zusammenklauen“. Besser ist es immer man versteht dann auch was man da macht Anhand von einfachen Schritten. Dann kann man sich danach an schwierigere Sachen heran trauen.

Thomas ist seit 2017 hier im Forum und ist sicher schon mal ausversehen im „Wie kann ich… 2.0“ Thread oder der Suchfunktion vom Forum gelandet :wink: :smiley:

-Chris-

Hallo

erstmal vielen Dank euch beiden für die schnelle Antwort. Ich sehe mir die Sache morgen etwas genauer an. Nachdem ich diesen

Thread eröffnet hatte musste ich nochmal weg.

Ich hatte hier im Forum schon gesucht nur mit dem falschen Stichwort „Volkszähler“ hier beschreiben viele wie sie mit dem Zähler

umgehen aber ich nutze von Volkszähler nur den Server, bzw. mein M-Bus Zähler und S0 Wasserzähler laufen in einem Gerät

zusammen und da ist ein Völkszähler Server aufgesetzt. Nur mal soviel zu den Eckpunkten.

@Fronzo: Danke für Deine genaue Beschreibung.

@Bayaro: Also Chris ich dachte Du machst mir das Script fertig und nicht mit Copy&Paste oder so sondern Du pflegst es per

Teamviewer bei mir ein;):smiley:

Es werden sicherlich noch fragen auftauchen aber da sehe ich kein Problem, es sind ja Profis hier.

Wünsche eine gute Nacht

Per Teamviewer einbauen…hmmm… Gab Zeiten da hab ich sowas gemacht :smiley:

Aber die Bereitschaft der Leute hier im Forum auch nur eine minimale Eigenleistung zu erbringen ist so extrem gesunken…da mangelt es dann an Motivation zu helfen :wink: Thema „vorkauen“ :wink:

Bei konkreten Fragen bzgl. eines Problems, wo man auch nach einer eigenständigen Recherche nicht weiter kommt, da helfe ich nach wie vor gerne auch mit konkreten Lösungen/Skripten :slight_smile:

Ich bin mir in diesem Fall aber sicher, dass du mit den bereits genannten Hilfestellungen selbst zur finalen Lösung kommst :cool:

Viele Grüße,
Chris

Oh je,

das klappt mal noch nicht.

Ich habe es versucht aber es ist so als ob jemand sagt ich solle einen Satz ins chinesische übersetzen.

Vielleicht könnte mir nochmal jemand helfen zumindest eine Variable zu füllen. Ich möchte den Wert „Consumtion“ also die 203 haben.

Eine Variable mit dem Namen „neuer logg“ habe ich in Symcon angelegt aber ich denke ich bin da absolut auf dem Holzweg.

Da fehlt ein „json_decode“ … Du hast ja nur den String von der Webseite geholt und musst den mit „json_decode“ noch einfach verwendbar machen :wink:

Hast du wohl das von Fonzo verlinkte Beispiel nicht gut genug angeschaut :stuck_out_tongue:

Grüße,
Chris

Ach da fehlt ein „json_decode“ ich dummchen:banghead:

und wo kann ich den kaufen:D

Kaufen? Gar nicht! Ist nur zum Leihen :smiley:

Leihen kannste das hier :wink:
>> IP-Symcon - Wie kann ich… 2.0

Sinnvoller weise solltest du nach der neuen Zeile mit „json_decode“ mal ein „print_r“ einbauen…dann siehste wie das json aufgebaut ist und kannst es dann ganz einfach in eine Variable schreiben. Das Leben kann so einfach sein :slight_smile:

Grüße,
Chris

Hellsehen können nur wenige ;), daher musst Du schon die Ausgabe von var_dump hier in einem Code Block posten wenn man Dir irgendeinen Hinweis geben soll.

Ich weiß jetzt nicht was Du meinst.

Jetzt versuch ich es mal so

<?

$data = Sys_GetURLContent("http://192.168.178.48/volkszaehler.org/htdocs/middleware.php/data.json?from=Yesterday&to=today&uuid[]=b6ae8c20-683c-01e5-000XXXXX"); 
var_dump($data);   //Start writing your scripts between the brackets

echo "neuer logg".$json->list[0]->consumption."L"."
";

?>


string(29239) "722a
{"version":"0.3","data":[{"uuid":"b6ae8c20-683c-01e5-0000-","from":1548716280000,"to":1548802920000,"min":[1548716340000,0],"max":[1548789960000,600],"average":8.435,"consumption":203,"rows":1445,"tuples":[[1548716340000,0,1],[1548716400000,0,1],[1548716460000,0,1],[1548716520000,0,1],[1548716580000,0,1],[1548716640000,0,1],[1548716700000,0,1],[1548716760000,0,1],[1548716820000,180,1],[1548716880000,0,1],[1548716940000,0,1],[1548717000000,0,1],[1548717060000,0,1],[1548717120000,0,1],[1548717180000,0,1],[1548717240000,0,1],[1548717300000,0,1],[1548717360000,0,1],[1548717420000,180,1],[1548717480000,0,1],[1548717540000,0,

"

Notice:  Undefined variable: json in D:\Anwendungen langsam\Ip Symcon\IP-Symcon\scripts\55328.ips.php on line 6

Notice:  Trying to get property 'list' of non-object in D:\Anwendungen langsam\Ip Symcon\IP-Symcon\scripts\55328.ips.php on line 6

Notice:  Trying to get property 'consumption' of non-object in D:\Anwendungen langsam\Ip Symcon\IP-Symcon\scripts\55328.ips.php on line 6
neuer loggL

Sowas kommt da raus. Chris meinte ich soll ein print r einbauen ?

Chinesische Schriftzeichen kann ich einen ganzen Tag ansehen und trotzdem versteh ich Sie nicht. Ich hab wirklich keine Ahnung von

PHP aber jetzt kommt der Clou, ich habe einen Kurs bei Udemy gebucht damit ich zumindest die Grundlagen verstehe.

Nur bis ich den durch bin währe es klasse wenn ihr etwas zur Hand gehen könntet.

Vergiss was Fonzo sagte :slight_smile:

Ich sehe da noch immer kein „json_decode“…

Und außerdem kannst du mir sicher (nicht) erklären, wie eine Variable $data von ganz allein zu einer Variable $json werden soll?! :smiley:

Du musst nur mein OpenWeatherMap Beispiel nehmen, die URL austauschen und dann unten deine Variablen mit deinen Daten eintragen. Das schafft auch jemand der noch nie vorher PHP gesehen hat und nicht schon seit 2017 im IPS Forum ist :wink:

Grüße,
Chris

Ich hab jetzt mal sowas -$json = json_decode($content);- noch mit reingeklopft aber das bewirkte nichts

Da ich das Spiel nicht die nächsten Tage machen will :smiley:

…hier ein kleiner Tipp :wink:

<?

$data = Sys_GetURLContent("http://192.168.178.48/volkszaehler.org/htdocs/middleware.php/data.json?from=Yesterday&to=today&uuid[]=b6ae8c20-683c-01e5-000XXXXX");   // Daten von der URL abrufen und in die Variable $data schreiben (als String)
$json = json_decode($data);  // den eben geholten String, der in $data steht, "als json behandeln" und in der Variable $json ablegen
print_r($json);  // das was jetzt in der Variable $json steht anzeigen lassen

echo "WERT = ".$json->list[0]->consumption."L"."
";  // auf einen json-Teil der in der Variable $json steht zugreifen und diesen anzeigen lassen

?>

Einen PHP-Kurs braucht es für ein wenig IPS wirklich nicht. Einfach mal ein wenig LESEN und PROBIEREN und vor allem SELBST mal was machen :wink:

Grüße,
Chris

Ich hatte oben nur das Beispiel nochmal rein weil ich glaubte man könne es nicht richtig lesen

huhu, ich schon wieder

Die Zeile 7 also „echo“ klemmt noch etwas, ich bekomme das Angezeigt:

[b]Notice: Trying to get property ‚list‘ of non-object in D:\Anwendungen langsam\Ip Symcon\IP-Symcon\scripts\55328.ips.php on line 7

Notice: Trying to get property ‚consumption‘ of non-object in D:\Anwendungen langsam\Ip Symcon\IP-Symcon\scripts\55328.ips.php on line 7
WERT = L[/b]

Ich habe mir dein Beispiel von openweathermap genau angesehen aber ich verstehe die Zeile mit dem „echo“ nicht.

echo "WERT = „.$json->list[0]->consumption.„L“.“
";

Eigentlich sollte er doch den Wert consumption aus der Liste holen und schreiben und wenn er den Wert einmal hat muss ich dann „WERT =“ ersetzen durch meine erstellte Variable ?

Sorry aber wir werden jetzt doch noch die eine verf… Zeile hinbekommen:banghead:

Du musst dir die Ausgabe vom print_r anschauen - da siehst du dann welche Elemente es in dem Json gibt und wie du darauf zugreifen kannst.
Wenn du nicht die komplette Ausgabe postest…kann man nur raten…

Ich rate einmal :slight_smile:

echo "WERT = ".$json->data[0]->consumption;

…von „list“ sehe ich weder im Json-String noch im Javascript etwas. Du kannst nicht einfach alles blind kopieren und nichts anpassen :wink:

Steht hinter einem „Teil“ in der Ausgabe „=> stdClass Object“ … dann greift man mit „->blabla“ darauf zu. Steht hinter einem „Teil“ in der Ausgabe „Array“, dann greift man mit „blabla[irgendwas]“ darauf zu.

Grüße,
Chris