skainz92 / wienernetze-smartmeter-php

PHP Class for reading energy-consumption from Wiener Netze Smart meters.
MIT License
4 stars 1 forks source link

Nur ein Zählpunkt? #9

Closed schulti closed 4 months ago

schulti commented 6 months ago

Hallo,

ich habe seit den letzten Anpassungen (weiterhin) nur die Möglichkeit einen Zählpunkt auszulesen.

Auch getMeterPoints() liefert bei mir ein Array mit nur einem Wert zurück. Ich habe 3 Zählpunkte an meinem Account und kann nur den ersten abfragen...

Ich hab' jetzt ein bißerl probiert, weil ihr ja geschrieben habt, dass es (wieder) geht, aber nun mach' ich doch ein Issue auf weil ich nicht weiterkomme...

Vielen Dank!

skainz92 commented 6 months ago

Hallo,

habs grade getestet - bei mir liefert die getMeterPoints mehrere Zählpunkte. Ich habe eigentlich nur einen Messpunkt, aber scheinbar werden auch kürzlich gekündigte Messpunkte noch aufgelistet.

Könntest du kurz den relevanten Code posten? Ich habe das ungute Gefühl dass WN schon wieder etwas geändert hat.

schulti commented 6 months ago

Hallo,

danke für deine rasche Antwort.

Ich habe gerade das Repo in ein neues Verzeichnis gecloned, um auszuschließen, dass irgendwo was Altes im Verzeichnis bei mir herumliegt.

Dann hab' ich einfach deine index.php genommen, Username & Passwort ausgefüllt und gestartet.

Es erscheint dann nur 1 Messpunkt beim - obwohl im Account 3 hinterlegt sind. Das gleiche habe ich auch bei einem anderen Account, bei dem 2 Zählpunkte/Standorte hinterlegt sind.

(die Zahlen / Accountnummern / Zählpunkt habe ich durch 1234... ersetzt)

scripts-test20231230/wienernetze-smartmeter-php$ php index.php 
PHP Warning:  Undefined property: stdClass::$error in /opt/smartmeter_wien/scripts-test20231230/wienernetze-smartmeter-php/smartmeter-vienna.class.php on line 120
stdClass Object
(
    [id] => 12345
    [salutation] => Herr
    [lastname] => Schultheis
    [firstname] => Stefan
    [email] => meine@email.at
    [defaultGeschaeftspartnerRegistration] => stdClass Object
        (
            [id] => 12345
            [registrationKey] => 123456788900
            [zaehlpunkt] => AT0010000000000000001000001234567
            [status] => CONFIRMED
            [geschaeftspartner] => 1234567890
            [completedAt] => 2023-02-13T16:31:20.639Z
        )

    [isZpsDonee] => 
    [registration] => stdClass Object
        (
            [zaehlpunkt] => AT0010000000000000001000001234567
        )

)
[...]

PHP Version:

$ php --version
PHP 8.1.2-1ubuntu2.14 (cli) (built: Aug 18 2023 11:41:11) (NTS)
Copyright (c) The PHP Group
Zend Engine v4.1.2, Copyright (c) Zend Technologies
    with Zend OPcache v8.1.2-1ubuntu2.14, Copyright (c), by Zend Technologies

Das Ganze läuft bei mir in einer VM unter

$ cat /etc/issue
Ubuntu 22.04.3 LTS

Danke!

skainz92 commented 6 months ago

Hallo,

in der default index.php fehlt aber die getMeterPoints(). Die getProfile liefert auch bei mir nur einen Zählpunkt.

Könntest du das mal ausführen?

$meterpoints = $sm->getMeterPoints(); print_r($meterpoints);

Hier müssten doch alle Zählpunkte angezeigt werden oder?

lg

schulti commented 6 months ago

Hi,

das ist aber spannend.

Ich habe drei Accounts zur Verfügung: s, k und m. Bei allen sind jeweils 3 aktive Zählpunkte hinterlegt und auch über https://smartmeter-web.wienernetze.at einsehbar. Im Webportal habe ich für jeden Account einen Zählpunkt jeweils als Favorit mit (*) markiert.

Das Ergebnis ist je Account immer das gleiche (reproduzierbar), auch wenn ich in beliebiger Reihenfolge die Accounts abfrage.

Danke, LG!

skainz92 commented 6 months ago

Das ist wirklich komisch.

Also auf der Seite: https://smartmeter-web.wienernetze.at/#/anlagedaten sind die Zählpunkte sichtbar?

Ich hätte auf obiger Seite etwas interessantes gefunden:

Es wird einmal "zaehlpunkte" aufgerufen und einmal "getHiddenZaehlpunkte". Bei mir ist getHiddenZaehlpunkte zwar leer, ich könnte mir aber vorstellen dass es nicht bei jedem so ist.

Könntest du vielleicht mal schauen ob der getHiddenZaehlpunkte bei dir auch leer ist?

Also, einfach auf der Seite https://smartmeter-web.wienernetze.at/#/anlagedaten rechte Maustaste -> Inspizieren/Inspect Dann in der Sidebar auf Netzwerk/Network klicken und dann die Seite nochmal neu laden. Dann müssten ganz viele Einträge in der Liste sein. getHiddenZaehlpunkte müsste eher weiter unten in der Liste sein. Dann einfach auf den unteren ( es müssten zwei sein ) "getHiddenZaehlpunkte" klicken, und rechts davon dann auf Vorschau/Preview.

Bei mir zeigt er dann [], also ein leeres JSON an.

schulti commented 6 months ago

Hallo,

ich glaube, jetzt weiß ich, was es ist! Es hat nichts mit den hidden-Zählpunkten zu tun, sondern damit, ob mehrere Kundenobjekte mit Zählpunkten darunter im JSON enthalten sind.

https://service.wienernetze.at/sm/api/user/getHiddenZaehlpunkte gibt bei mir auch nur [] zurück.

In meinem User s wird mir nur der erste Zählpunkt gezeigt: image

In meinem User k wurden mir die ersten beiden gezeigt: image

Das Object selbst scheint also ein Array zu sein, das wir durchkraxeln müssen, weil dahinter unter anderen Kundennummern noch weitere Zählpunkte versteckt sind...

skainz92 commented 6 months ago

Sorry, das json ... ist das das Resultat von getMeterPoints? Ich kann das grade nicht richtig zuordnen. Oder meinst du dass getMeterPoints etwas zurückliefert das nicht alles beinhaltet?

Weil getMeterPoints retourniert $result = $result[0]->zaehlpunkte; Vielleicht ohne das ->zaehlpunkte?

lg

schulti commented 6 months ago

Hallo!

Das JSON war aus dem Firefox (Inspect) kopiert, der Ouput vom Webinterface der Wiener Netze.

Ich glaube, das Problem ist, dass getMeterPoints() wirklich nur den ersten (0) Eintrag aus dem $results-Array ausliest: $result = $result[0]->zaehlpunkte; Wenn aber im Account mehrere Kundennummern hinterlegt sind, dann holt er nur die SmartMeter zur ersten Kundennummer.

Ich hab' grad folgendes in der smartmeter-vienna.class.php geändert und dann liefert er mir die fehlenden Zählpunkte: $result = $result[1]->zaehlpunkte; und $result = $result[2]->zaehlpunkte;

Man müsste also das $result für alle Werte durchgehen.

Ich glaube, dass man das auch beim getConsumptionByDay() irgendwo beachten muss, weil ich da keine Daten von Zählpunkten krieg, außer von der ersten Kundennummer im Account (wie oben)...

Danke!

skainz92 commented 6 months ago

Wenn jetzt mehrere Kunden im Ergebnis sind, gebe ich das gesamte resultat zurück, sonst wie gehabt die zaehlpunkte vom ersten. Zwecks Rückwärtskomp.

Könntest du nochmal neu runterladen und testen?

skainz92 commented 6 months ago

Weils vielleicht ein wenig umständlich ist alle kunden und zaehlpunkte durchzugehen: Neue Funktion getMeterPointIds - liefert wirklich nur die Zählpunktnummern.

schulti commented 6 months ago

Servus & alles Gute im neuen Jahr!

Beide Funktionen liefern nun alle Zählpunkte zurück! die getMeterPoints() in einem Array mit der vollständigen Struktur, inkl. aller Kundennummern. Die getMeterPointIds() liefert ein Array mit eine Lister der vollständigen Zählpunkte!

Ich hab's noch nicht endgültig probiert/verstanden, weil die Zeit grad nicht reicht, aber ich habe das Gefühl, dass für die anderen Funktionen weiterhin nur der erste Zählpunkt abfragbar ist. bzw. angezeigt wird. Liegt das daran, dass über ->defaultGeschaeftspartnerRegistration-> dort nur das Objekt vom "ersten Kunden" betrachtet wird? Betrifft aus meiner Sicht:

Vielen Dank!

skainz92 commented 6 months ago

Hallo,

vielen Dank! Ebenso!

hab mir die getProfile & getMeasurements angesehen:

1) getProfile() lieftert generell nur den zählpunkt vom defaultgeschaeftspartner, verwendet wird der nirgends. 2) geMeasurements() - stimmt, da war noch $profile drinnen.

Hab das jetzt geändert. getMeasurements nimmt jetzt statt $profile - $meterpoint & $customerid.

Damit müsste es jetzt funktionieren.

lg

schulti commented 6 months ago

Hallo, danke für die rasche Umsetzung von dir, wie immer - ich wollte mich nur schnell melden; ich komme im Moment wg. Arbeit + Famile nicht zum Testen, erst vmtl. Mitte der Woche. Wollte nur ein kurzes Lebenszeichen hinterlassen. LG

skainz92 commented 6 months ago

kein Stress :)

danke!

schulti commented 5 months ago

Hallo,

ich komme leider nicht zum Ziel... Liegt aber vmtl. an meinen Programmierkenntnissen.

  1. Bei getConsumptionByDay() funktioniert das Abrufen vom $me->defaultGeschaeftspartnerRegistration->geschaeftspartner, aber ich weiß nicht, wie ich von einer zweiten Kundennummer die Zählpunkte abfragen kann.
  2. Bei getMeasurements() bekomme ich jetzt überhaupt nur leere Objekte zurück, es werden scheinbar diese Parameter erwartet: public function getMeasurements($meterpoint, $customerid, $start, $end, $type)
    • wie komme ich auf meine $customerid, wenn ich nicht defaultGeschaeftspartnerRegistration nehme. Mit registration komme ich nicht weiter, wenn ich versuche den String/Integer direkt einzugeben, geht's auch nicht.
    • was soll ich bei $type angeben, wobei es auch keinen Fehler gibt, wenn ich $type auslasse...

Fazit:

Danke!

skainz92 commented 5 months ago

Hallo,

Werden die Zählpunkte ( also auch die von der zweiten Kundennummer ) mit getMeterPoints() oder getMeterPointIds() zurückgeliefert? Sieht man die Zählpunkte der zweiten Kundennummer im Web-gui von WE?

$type kann eines von diesen sein: //Type: QUARTER_HOUR, DAY, METER_READ

Der return von getMeasurements ist wahrscheinlich deshalb leer. Ich würds mal mit QUARTER_HOUR versuchen - obwohl das aktiviert sein muss. ( Viertelstunden-intervall )

schulti commented 4 months ago

Hallo,

sorry für die lange Wartezeit.

Für mich funktioniert es nun für meine Anwendung (per Script die Zähler auslesen mit getConsumptionByDay()).

Allerdings muss ich meinen $zaehlpunkt und die $customerid hardcoded angeben, die müssen ja zusammenpassen. Das automatische Ermitteln über getProfile() funktioniert nicht. (Ist für mich aber nicht wichtig, ich starte das Script einfach für jeden Zählpunkt separat und gebe im Cronjob den Zählpunkt und die entsprechende Kundennummer als Argument dazu, no problem).

Dennoch liefert getMeterPointIds() alle Zählpunkte (hinter allen Kundennummern) in meinem Account zurück.

Danke für die Arbeit!

Wenn ich noch was testen soll, lass' es mich bitte wissen!

LG!

skainz92 commented 4 months ago

ok, vielen Dank!

Ich hätte leider nirgends ( ausser im getProfile ) gesehen dass man zu allen Kundennummern + deren Zählpunkten kommt. Leider nur im Format von getMeterPointIds(), ohne die dazugehörige customerid.

Gut, lassen wirs mal so, muss in naher Zukunft sowieso nochmal die GUI von denen ansehen und eventuell die Aufrufe aktualisieren. Vielleicht finde ich da was.

vielen Dank! :)))