Autor Thema: [70_DISCOVERGY.pm] - DISCOVERGY Stromzähler  (Gelesen 5204 mal)

asciidisco

  • Gast
[70_DISCOVERGY.pm] - DISCOVERGY Stromzähler
« am: 23 November 2016, 12:06:17 »
Hallo zusammen,

ich habe mein erstes FHEM Modul (und damit mein erstes Perl Projekt) fertig gestellt.
Da man leider (aufgrund der inkompatiblen Query & Datenstruktur) die DISCOVERGY Stromzähler nicht mit dem JSONMETER Modul nutzen kann,
habe ich ein Modul dafür entwickelt:

Der Code ist hier zu finden: https://github.com/asciidisco/fhem-discovergy

Das Device wird angelegt mit
define <name> DISCOVERGY <meterID> <user> <password> <interval>
Weitere Infos finden sich in der README und im CommandRef.

Über Anmerkungen und Verbesserungsvorschläge von den Perl und FHEM Spezialisten aus dem Forum wäre ich sehr dankbar ;)

Mit besten Wünschen
Sebastian

maximat0

  • Gast
Antw:[70_DISCOVERGY.pm] - DISCOVERGY Stromzähler
« Antwort #1 am: 05 Mai 2017, 23:18:20 »
Hallo Sebastian,
bin durch Zufall auf diese Möglichkeit gestoßen, es funktioniert prima.
Leider habe ich vom Programmieren des Moduls keine Ahnung. Was ich mir wünschen würde, sind weitere Werte des Zählers, besonders der Zählerstand. Da ich einen Zweirichtungszähler habe, fände ich die Readings für Gesamtbezug und -Einspeisung interessant. Wo könnte man die im Modul 70_DISCOVERGY.pm hinzufügen?
Falls du Modifikationen hast, würde ich die gerne ausprobieren.
Klaus

asciidisco

  • Gast
Antw:[70_DISCOVERGY.pm] - DISCOVERGY Stromzähler
« Antwort #2 am: 22 Mai 2017, 15:41:23 »
Hi Klaus,

sorry für die späte Antwort, ich war die letzten 2 Wochen unterwegs. Ich muss das Plugin eh noch mal anpassen, da Discovergy im September die Authentifizierung umstellen wird, dann versuch ich deine Anmerkungen mit rein zu nehmen.
Wird aber nicht vor August passieren, da ich grade ganz viele andere Sachen auf dem Tisch hab, die einfach ne höhere Prio haben.

maximat0

  • Gast
Antw:[70_DISCOVERGY.pm] - DISCOVERGY Stromzähler
« Antwort #3 am: 13 Oktober 2017, 21:35:13 »
Hallo Sebastian,
da mein Modul nicht mehr funktioniert (error gethostbyname my.discovergy.com failed) möchte ich mal nachfragen, ob du schon etwas mit der Modifizierung des Moduls machen konntest.
Vielen Dank
Herzlich Klaus

Offline Tueftler1983

  • Sr. Member
  • ****
  • Beiträge: 967
Antw:[70_DISCOVERGY.pm] - DISCOVERGY Stromzähler
« Antwort #4 am: 16 Oktober 2017, 16:43:44 »
Hallo würde das Modul gerne nutzen doch leider bekomme ich beim aufruf der URL

https://my.discovergy.com/json/Api.getMeters?user=xxxxxxxxxxxx@xxx.xx&password=xxxxxxxxxxx

Nur das als Antwort
{"status":"ok","result":[]}

Wenn ich mich einlogge auf discovergy kann ich meine Verbrauchsmaterial sehen auch in echtzeit.

Was kann ich tun?

Und noch ein Bild vom Modul

api_status
initialising
2017-10-16 18:30:54
connection
initialising
2017-10-16 18:30:54
error
Invalid permissions
2017-10-16 18:27:54
state
active
2017-10-16 16:02:20
« Letzte Änderung: 16 Oktober 2017, 18:32:48 von Tueftler1983 »

Offline Tueftler1983

  • Sr. Member
  • ****
  • Beiträge: 967
Antw:[70_DISCOVERGY.pm] - DISCOVERGY Stromzähler
« Antwort #5 am: 17 Oktober 2017, 19:08:38 »
Okay läuft bei mir jetzt, habe heute von Discovergy die richtige Smartmeter id bekommen.
Aber wieso kann ich den Intervall nicht auf 10 sek stellen?

Laut der API ist doch ein Intervall von 0 - 900 möglich

/json/Api.getLive

Returns the last measurements captured by the meter from the last numOfSeconds until now.
Returns {"status":"ok","result":[{"power":POWER,"time":TIME}]} or error. POWER is the drawn power in 10^-3 W, and TIME is the number in milliseconds since midnight, January 1, 1970 UTC.
Parameter Description
user User identification (e.g. user email)
password User password
meterId Id of the meter as provided by getMeters
numOfSeconds Number of seconds in the past from 0 to 900, used to obtain the data

LG Holger

Offline Rosco

  • Jr. Member
  • **
  • Beiträge: 66
Antw:[70_DISCOVERGY.pm] - DISCOVERGY Stromzähler
« Antwort #6 am: 27 März 2018, 14:35:59 »
Hallo Sebastian,

Discovergy hat den Zugriff auf Zählerwerte auf neue Beine gestellt.
https://api.discovergy.com/docs/

Das heißt wohl, dass das alte Modul nicht mehr funktionieren wird, da die alte Variante zum Januar 2018 eingestellt wurde.

Darf ich fragen, ob du das Modul für die neue API mit OAuth-Verfahren anpassen/neu entwickeln wirst. Und (ganz vermessen): Wann könnte dies der Fall sein?

Ein Auslesen per IR geht leider nicht, da sich auf dem Zähler ein Discovergy Meteroid Kommunikationsmodul befindet, was diese Schnittstelle bereits für sich beansprucht.
Alternativ befindet sich noch eine Modbus Schnittstelle am Kommunikationsmodul. Aber um diese mit dem Modbus-Modul für fhem auszulesen, bin ich nicht wissend genug.

Für jede Hilfe dankbar sende ich
beste Grüße ins Forum

Rosco
fhem 5.8 (Community Ware), CUL CC1101-USB-Lite 868MHz (3.4), HMLAN, Loxone Miniserver, Loxberry, HA Bridge
RSL 2-Draht Schalter
FS20 ST, DI
FHT80b, 8v, FHTTK
HM_PB_4DIS_WM, HM-LC-SW2-FM

Offline Tueftler1983

  • Sr. Member
  • ****
  • Beiträge: 967
Antw:[70_DISCOVERGY.pm] - DISCOVERGY Stromzähler
« Antwort #7 am: 21 Mai 2018, 01:54:07 »
Hallo an die Entwickler unter euch, ich bin bei ip-Symcon auf was gestoßen vielleicht hilft es beim entwickeln eines neuen Moduls:

<?php
define
('__ROOT__'dirname(dirname(__FILE__)));
require_once(
__ROOT__ '/libs/ModuleHelper.class.php');
/**
 * Class GetFresh
 * Driver to GetFresh API (inofficial)
 *
 * @version     0.1
 * @category    Symcon
 * @package     de.codeking.symcon
 * @author      Frank Herrmann <frank@codeking.de>
 * @link        https://codeking.de
 * @link        https://github.com/CodeKing/de.codeking.symcon
 *
 *
 * @ToDo: short interval for current settings
 * @ToDo: get relevant data:
 * @ToDo: current consumption (kWh)
 * @ToDo: current solar (kWh)
 * @ToDo: current grid (kWh)
 * @ToDo: consumption yesterday (kWh)
 * @ToDo: consumption devices (kWh / €)
 */
class GetFresh extends ModuleHelper
{
    protected 
$prefix 'GF';
    private 
$email;
    private 
$password;
    private 
$token;
    private 
$position_offset 0;
    public 
$data = [];
    protected 
$archive_mappings = [ // archive: 0 = default, 1 = counter
        
'Base Price' => 0,
        
'Price per kWh' => 0,
        
'Current Price' => 0,
        
'Meter Reading' => 1,
        
'Power' => 0
    
];
    protected 
$profile_mappings = [
        
'Base Price' => 'Price',
        
'Price per kWh' => 'Price',
        
'Meter Reading' => 'kWh',
        
'Power' => 'Watt',
        
'Power L1' => 'Watt',
        
'Power L2' => 'Watt',
        
'Power L3' => 'Watt',
        
'Provider' => '~String'
    
];
    
/**
     * create instance
     */
    
public function Create()
    {
        
parent::Create();
        
// register public properties
        
$this->RegisterPropertyString('email''user@email.com');
        
$this->RegisterPropertyString('password''');
        
$this->RegisterPropertyInteger('interval'60); // in seconds
        // register timer
        
$this->RegisterTimer('UpdateData'0$this->prefix '_Update($_IPS[\'TARGET\']);');
        
$this->RegisterTimer('UpdateTariffData'60 1000$this->prefix '_UpdateTariff($_IPS[\'TARGET\']);');
    }
    
/**
     * execute, when kernel is ready
     */
    
protected function onKernelReady()
    {
        
// update timer
        
$this->SetTimerInterval('UpdateData'$this->ReadPropertyInteger('interval') * 1000);
        
// Update tariff details
        
$this->UpdateTariff();
        
// Update data
        
$this->Update();
    }
    
/**
     * Read config
     */
    
private function ReadConfig()
    {
        
// get settings
        
$this->email $this->ReadPropertyString('email');
        
$this->password $this->ReadPropertyString('password');
        
$this->token $this->GetBuffer('token');
        
// return if service or internet connection is not available
        
if (!Sys_Ping('getfresh.energy'1000)) {
            
$this->_log('GetFresh''Error: api or internet connection not available!');
            exit(-
1);
        }
        
// check if email and password are provided
        
if (!$this->email || !$this->password) {
            return 
false;
        }
        
// read access token
        
if (!$this->token) {
            
$this->token $this->GetBuffer('token');
        }
        
// login if no valid token was provided
        
if (!$this->token) {
            
$this->Login();
        }
        
// simple error handling
        
if (!$this->token) {
            
$this->SetStatus(201);
            
$this->_log('GetFresh''Error: The email address or password of your account is invalid!');
            exit(-
1);
        }
        
// everything looks ok, start
        
$this->SetStatus(102);
    }
    
/**
     * read & update tariff data
     */
    
public function UpdateTariff()
    {
        
// read config
        
$this->ReadConfig();
        
// get tariff provider name
        
if ($profile $this->Api('profile')) {
            
$this->data['Provider'] = $profile['brandName'];
        }
        
// get tariff
        
if ($tariff $this->Api('consumptionCurrentMonth')) {
            
$this->data['Base Price'] = $tariff['monthlyBasePrice']['value'];
            
$this->data['Price per kWh'] = $tariff['unitPrice']['value'];
        }
        
// log data
        
$this->_log('GetFresh Tariff Data'json_encode($this->data));
        
// save data
        
$this->position_offset 0;
        
$this->SaveData();
    }
    
/**
     * read & update consumption data
     */
    
public function Update()
    {
        
// read config
        
$this->ReadConfig();
        
// get current readings
        
if ($currentReadings $this->Api('currentReadings')) {
            
$cnt count($currentReadings['readings']) - 1;
            
$currentReading $currentReadings['readings'][$cnt];
            
$this->data['Meter Reading'] = $currentReading['energyReading'];
            
$this->data['Power'] = $currentReading['power'];
            
$this->data['Power L1'] = $currentReading['powerPhase1'];
            
$this->data['Power L2'] = $currentReading['powerPhase2'];
            
$this->data['Power L3'] = $currentReading['powerPhase3'];
        }
        
// log data
        
$this->_log('GetFresh Data'json_encode($this->data));
        
// save data
        
$this->position_offset 10;
        
$this->SaveData();
    }
    
/**
     * save data to variables
     */
    
private function SaveData()
    {
        
// loop data and save to variable
        
$position $this->position_offset;
        foreach (
$this->data AS $key => $value) {
            
$this->CreateVariableByIdentifier([
                
'parent_id' => $this->InstanceID,
                
'name' => $key,
                
'value' => $value,
                
'position' => $position
            
]);
            
$position++;
        }
        
// reset data
        
$this->data = [];
    }
    
/**
     * basic api to getfresh (inofficial)
     * @param string $request
     * @return array
     */
    
public function Api($request 'currentReadings')
    {
        
// build url
        
$url 'https://www.getfresh.energy/links';
        
// default data
        
$data = [];
        
// curl options
        
$curlOptions = [
            
CURLOPT_TIMEOUT => 10,
            
CURLOPT_RETURNTRANSFER => true,
            
CURLOPT_HTTPHEADER => [
                
'Authorization: Bearer ' $this->token,
                
'Content-Type: application/json',
                
'Connection: keep-alive',
                
'Accept-Encoding: gzip',
                
'User-Agent: okhttp/3.2.0'
            
]
        ];
        
// call api
        
$ch curl_init($url);
        
curl_setopt_array($ch$curlOptions);
        
$links curl_exec($ch);
        
// get links
        
if ($links json_decode($linkstrue)) {
            
#var_dump($links);
            #exit;
            
$links = [
                
'currentReadings' => $links['_links']['currentReadings']['href'],
                
'consumption' => $links['_links']['consumption']['href'],
                
'profile' => $links['_links']['profile']['href'],
                
'consumptionCurrentMonth' => $links['_links']['consumptionCurrentMonth']['href']
            ];
            if (isset(
$links[$request])) {
                
curl_setopt($chCURLOPT_URL$links[$request]);
                
$result curl_exec($ch);
                
$data json_decode($resulttrue);
            }
        }
        
// close curl
        
curl_close($ch);
        
// return data
        
return $data;
    }
    
/**
     * Login to getfresh
     */
    
public function Login()
    {
        
$this->_log('GetFresh'sprintf('Logging in to account of %s...'$this->email));
        
// login url
        
$url 'https://www.getfresh.energy/oauth/token';
        
// curl options
        
$curlOptions = [
            
CURLOPT_TIMEOUT => 10,
            
CURLOPT_RETURNTRANSFER => true,
            
CURLOPT_POST => true,
            
CURLOPT_POSTFIELDS => http_build_query([
                
'grant_type' => 'password',
                
'username' => $this->email,
                
'password' => $this->password
            
]),
            
CURLOPT_HTTPHEADER => [
                
'Content-Type: application/x-www-form-urlencoded',
                
'Accept-Encoding: gzip',
                
'Connection: keep-alive',
                
'User-Agent: okhttp/3.2.0'
            
],
            
CURLOPT_USERPWD => 'fresh-webclient:'
        
];
        
// login
        
$ch curl_init($url);
        
curl_setopt_array($ch$curlOptions);
        
$result curl_exec($ch);
        
curl_close($ch);
        
// extract token
        
$json json_decode($resulttrue);
        
$this->token = isset($json['access_token']) ? $json['access_token'] : false;
        
// save valid token
        
if ($this->token) {
            
$this->SetStatus(102);
            
$this->SetBuffer('token'$this->token);
        } 
// simple error handling
        
else {
            
$this->SetStatus(201);
            
$this->_log('GetFresh''Error: The email address or password of your account is invalid!');
            exit(-
1);
        }
        return 
true;
    }
    
/**
     * create custom variable profile
     * @param string $profile_id
     * @param string $name
     */
    
protected function CreateCustomVariableProfile(string $profile_idstring $name)
    {
        switch (
$name):
            case 
'Watt':
                
IPS_CreateVariableProfile($profile_id2); // float
                
IPS_SetVariableProfileDigits($profile_id0); // 0 decimals
                
IPS_SetVariableProfileText($profile_id''' W'); // Watt
                
IPS_SetVariableProfileIcon($profile_id'Electricity');
                break;
            case 
'kWh':
                
IPS_CreateVariableProfile($profile_id2); // float
                
IPS_SetVariableProfileDigits($profile_id2); // 2 decimals
                
IPS_SetVariableProfileText($profile_id''' kWh'); // Watt
                
IPS_SetVariableProfileIcon($profile_id'Electricity');
                break;
            case 
'Price':
                
IPS_CreateVariableProfile($profile_id2); // float
                
IPS_SetVariableProfileDigits($profile_id4); // 4 decimals
                
IPS_SetVariableProfileText($profile_id''' €'); // currency symbol
                
IPS_SetVariableProfileIcon($profile_id'Euro');
                break;
        endswitch;
    }

Offline Tueftler1983

  • Sr. Member
  • ****
  • Beiträge: 967
Antw:[70_DISCOVERGY.pm] - DISCOVERGY Stromzähler
« Antwort #8 am: 13 September 2018, 15:35:32 »
Hallo zusammen,

es ist zumindest möglich über Basic Auth Zugriff auf, Zählerstand, Gesamtlast, Last auf Phase 1, last auf Phase 2, last auf Phase 3 abzurufen.

Was mir noch fehlt ist der Verbrauch im aktuellen Monat diesen könnte ich zwar mit dem Zählerstand berechnen aber das wird denke ich zu ungenau.

Abrufen tue ich die Daten mit Httpmod

Definition:
https://emailAdresse:password@api.discovergy.com/public/v1/last_reading?meterId=EASYMETER_00000000 30
userReadings:
result_01_now {FmtDateTime(ReadingsVal("Discovergy2","time",0) / 1000)}, power {sprintf "%.1f",ReadingsVal("Discovergy2","values_power",0) / 1000}, power_ph1 {sprintf "%.1f",ReadingsVal("Discovergy2","values_power1",0) / 1000}, power_ph2 {sprintf "%.1f",ReadingsVal("Discovergy2","values_power2",0) / 1000}, power_ph3 {sprintf "%.1f",ReadingsVal("Discovergy2","values_power3",0) / 1000}, stand {sprintf "%.3f",ReadingsVal("Discovergy2","values_energy",0) * 0.0000000001}
stateFormat

Gesamt power W, PH1 power_ph1 W, PH2 power_ph2 W, PH3 power_ph3 W, Stand stand KwH

Offline FHEm2005

  • Sr. Member
  • ****
  • Beiträge: 669
    • Squeezebox mit RFID-Karten steuern
Antw:[70_DISCOVERGY.pm] - DISCOVERGY Stromzähler
« Antwort #9 am: 10 Januar 2019, 08:20:45 »
Seit Montag habe ich einen Zähler von shine. Dahinter steckt ja der Betreiber Discovergy. Ich habe mir das Modul aus der o.a. Url heruntergeladen.

Nach der Installation ist mir aufgefallen, dass das Modul meine ZählerID nicht nimmt. Mein Zähler beginnt nicht mit 'EASYMETER' sondern mit '1ESY11'. Außerdem bekomme ich die Fehlermeldung im Reading error:

Legacy API! Please use the new one found at: https://api.discovergy.com/docs/ !
Ich dachte das Modul würde die neue API bedienen können. Kann mir jemand weiterhelfen?

Gruß Eberhard
Raspi3: FHEM, CULV3 (V1.61), EnOcean Pi 868, nanoCUL433, HUE-Bridge und Tradfri-Bridge; Raspi4: Node-red, MQTT

Offline Tueftler1983

  • Sr. Member
  • ****
  • Beiträge: 967
Antw:[70_DISCOVERGY.pm] - DISCOVERGY Stromzähler
« Antwort #10 am: 10 Januar 2019, 08:51:52 »
Hallo das Modul funktioniert mit der neuen API nicht mehr, aber der Entwickler hat auch derzeit keinen Zähler zum testen versucht aber mit meinen Daten das Modul anzupassen.

Ich kann dir aber helfen ein httpmod zu definieren das dir:
Aktuellen Zählerstand in kWh
Verbrauch im laufenden Monat in kWh
Kosten für den laufenden Monat in € mit Grundgebühr
Momentane Gesamt Last in W
Momentane Last auf Phase 1 in W
Momentane Last auf Phase 2 in W
Momentane Last auf Phase 3 in W
Bereitstellt bei Interesse einfach melden
« Letzte Änderung: 10 Januar 2019, 14:23:42 von Tueftler1983 »

Offline FHEm2005

  • Sr. Member
  • ****
  • Beiträge: 669
    • Squeezebox mit RFID-Karten steuern
Antw:[70_DISCOVERGY.pm] - DISCOVERGY Stromzähler
« Antwort #11 am: 10 Januar 2019, 16:11:11 »
Vorweg:
Zitat
aber der Entwickler hat auch derzeit keinen Zähler zum testen versucht aber mit meinen Daten das Modul anzupassen.
Ich stelle mich gerne als "Versuchsobjekt zur Verfügung.
Für alle die an einem SmartMeter interessiert sind, aber die Montagekosten scheuen: Die Bundesregierung hat ein Topf, aus dem die Montagekosten bezahlt werden. Ich habe meinen SmartMeter von shine installieren lassen und nichts bezahlen müssen. Der bisherige Stromlieferant bleibt! Alle Formalitäten werden von denen erledigt. Kosten im Monat 5 €. Dafür gehen die Messstellenbetreibergebühren des bisherigen Betreibers (meistens der Stromlieferant) davon ab. Seit 2005 ist man in der Wahl des Zählerbetreibers frei.

Hallo Tüftler,
die HTTPMOD-Definition aus Beitrag vom 13.11.18 funktioniert bei mir. Egal welche Typenbezeichnung der Zähler hat, die ID setzt sich zusammen aus "EASYMETER_" und der bisher 8-stelligen Seriennummer. Der Aufruf über Firefox zeigt mir die Zeile mit den gewünschten Daten. Mir reichen momentan der aktuelle Strombezug und der aktuelle Zählerstand. Der nächste Schritt wird sein den bisherigen Tagesverbrauch und  den Verbrauch des Vortages ebenfalls anzeigen zu lassen. Das ist aber der zweite Schritt.

Danke nochmal für den HInweis. Meine Lösung für den Tagesverbrauch/Vortagverbrauch werde ich posten, dann kannst Du auch davon partizipieren.

Gruß Eberhard
Raspi3: FHEM, CULV3 (V1.61), EnOcean Pi 868, nanoCUL433, HUE-Bridge und Tradfri-Bridge; Raspi4: Node-red, MQTT

Offline Tueftler1983

  • Sr. Member
  • ****
  • Beiträge: 967
Antw:[70_DISCOVERGY.pm] - DISCOVERGY Stromzähler
« Antwort #12 am: 10 Januar 2019, 16:31:23 »
Das geht auch relativ einfach getriggert über ein doif den Zählerstand um 0:00:01 speichern und dann einfach nur die Differenz zwischen 2 tagen über ein userreading berechnen lassen.
So mache ich es ja im Prinzip für den Monatsverbrauch.

Online KölnSolar

  • Developer
  • Hero Member
  • ****
  • Beiträge: 5319
Antw:[70_DISCOVERGY.pm] - DISCOVERGY Stromzähler
« Antwort #13 am: 10 Januar 2019, 16:50:02 »
Nur kurz zur Klarstellung:
Zitat
Dafür gehen die Messstellenbetreibergebühren des bisherigen Betreibers (meistens der Stromlieferant) davon ab.
Das sind üblicherweise ca. 10 EUR. Meistens versteckt in der "Anschlussgebühr" oder dem kWh-Preis. Oft nur nachrichtlich erwähnt. Will heißen: Das wird nicht automatisch funktionieren. Nach meinen Erfahrungen führt das dann zu komplizierten Diskussionen.
Zitat
HTTPMOD-Definition
Ist nicht die Methode, um ALLE Daten in Fhem zu erhalten. Besser ist in der Regel die Kundenschnittstelle per IR-Lesekopf abzugreifen und mit dem OBIS-Modul zu verarbeiten. Vor allen Dingen kann man dann den Stecker für die Datenübertragung in die Cloud ziehen.  8)

Ich hab mich zum Jahreswechsel auch für einen dritten MSB entschieden. Hintergrund ist dabei gewesen, die Daten nach wie vor lokal abgreifen zu können, nach Lust u. Laune die Datenübertragung zu unterbinden, der zukünftigen Zwangsbeglückung von Solarstromanlagenbesitzern mit Leistung > 7 kWp zuvor zu kommen und 8 Jahre Bestandsschutz zu haben. Ich werde dazu demnächst mal einen ausführlicheren Bericht verfassen.
Grüße Markus
RPi3/2 buster/stretch-SamsungAV_E/N-RFXTRX-IT-RSL-NC5462-Oregon-CUL433-GT-TMBBQ-01e-CUL868-FS20-EMGZ-1W(GPIO)-DS18B20-CO2-USBRS232-USBRS422-Betty_Boop-EchoDot-OBIS(Easymeter-Q3/EMH-KW8)-PCA301(S'duino)-Deebot(mqtt2)-zigbee2mqtt

Offline FHEm2005

  • Sr. Member
  • ****
  • Beiträge: 669
    • Squeezebox mit RFID-Karten steuern
Antw:[70_DISCOVERGY.pm] - DISCOVERGY Stromzähler
« Antwort #14 am: 14 Januar 2019, 17:04:31 »
Mein Smartmeter läuft in Fhem. Hier für alle Interessierten.

Ich habe nun den Smartmeter von shine seit einer Woche in Betrieb und habe (noch) nichts Nachteiliges erlebt. Der Zugriff über die vereinfachte Abfrage
https://<email-Adresse>:<passwort>@api.discovergy.com/public/v1/last_reading?meterId=EASYMETER_<meine Zählernummer>führt zu der Antwort:
{"time":1547478707253,"values":{"energyOut":2092490000,"energy2":0,"energy1":894677521000,"voltage1":231500,"voltage2":231400,"voltage3":231500,"energyOut1":2092490000,"power":442830,"energyOut2":0,"power3":264170,"power1":135340,"energy":894677521000,"power2":43320}}Diese Antwort habe ich mit HTTPMOD (Gerätename: http_shine)  in Readings zerlegt und benutze ledilich den Zählerstand (energy), und die Uhrzeit (time). energy wird noch in einem zusätzlichen userReadings aufbereitet .
Zaehlerstand {sprintf "%.3f",ReadingsVal($name,"energy1",0) * 0.0000000001},Die Uhrzeit der letzten Messung wird mit
Messung_vom {FmtDateTime(ReadingsVal($name,"time",0) / 1000)}, aufgehübscht. Das ist ja schon Mal sehr schön von Tüftler beschrieben worden.
Diese Methode ist sicherlich nicht die hohe Schule, aber das Discovery-Modul ist für die neue API leider nicht mehr funktionstüchtig.

Abgesehen vom aktuellen Zählerstand möchte ich gerne den aktuellen bisherigen Tagesverbrauch und des des Vortages haben. Monats- und Jahreszusammenstellungen sind für mich noch nicht interessant.

Um die aktuellen und vorherigen Tageswerte zu bekommen habe ich mich des statistics-Modul  bedient. Hier die Definition:
defmod stat_shine statistics http_shine
attr stat_shine deltaReadings Zaehlerstand
attr stat_shine room System->SmartMeter
Im http_shine Modul werden zusätzliche Readings - bezogen auf das Reading Zaehlerstand - erzeugt.
statZaehlerstand               Hour: 0.253 Day: 5.827 Month: 5.827 Year: 5.827 (since: 2019-01-14 )        2019-01-14 16:34:06
statZaehlerstandLast               Hour: 0.381 Day: 2.305 Month: - Year: - (since: 2019-01-13_19:57:44 )       2019-01-14 15:59:55
aus diesem langen String wird mit folgenden userReadings der aktuelle bzw. der vorherige Tageswert erzeugt:
bezug {my $bezug = (ReadingsVal($name,"statZaehlerstand",0)); my ($num) = $bezug=~ m/Day: (\d+\.\d+)/; return ($num);},
bezugVortag {my $bezug= (ReadingsVal($name,"statZaehlerstandLast",0)); my ($num) = $bezug = m/Day: (\d+\.\d+)/; return ($num);}
Mit dem folgenden stateFormat lasse ich mir 1. Zählerstand  2.akt- Lestungsverbrauch 3. bisheriger Tagesbezug und schließlich noch 4.den Vortageswert.<div style= "text-align:left;"> Zählerstand: <b style="color:yellow";>Zaehlerstand </b>kWh <br/>akt.Leistung: Leistung W </br><br/>Bezug heute: bezug kWh <br/> Bezug Vortag: bezugVortag kWh</div>
Will ich mehr Informationen (aktuelle Spannung pro Phase, Leitung pro Phase uvam.) haben, kann ich ja im Portal mir die grafische Aufbereitung Tag/Monat/Jahr-bezogen  jederzeit ansehen.

@KölnSolar
Zitat
Das wird nicht automatisch funktionieren. Nach meinen Erfahrungen führt das dann zu komplizierten Diskussionen.
Hast Du versucht einen anderen Messstellenbetreiber durchzusetzen? Ich habe meinen Stromlieferanten angeschrieben, mir die monatlichen Messstellenbetreibergebühr (welch ein grottiges Wort) mitzuteilen. Ich bin ja mal gespannt. Such mal im Internet nach "$40 Energiewirtschaftsgesetz". Da stehtdrin, welche Kriterien eine Stromrechnung haben muss - sehr aufschlussreich. Mein Provider weist zwar '7,63 €' aus, verschweigt aber für welchen Zeitraum.  Dafür, dass das Ding da nur bei mir in Zählerkasten rumhing, eine ganze Menge Kohle. Alles sehr dubios.  ;) ;)

Gruß
Eberhard


Raspi3: FHEM, CULV3 (V1.61), EnOcean Pi 868, nanoCUL433, HUE-Bridge und Tradfri-Bridge; Raspi4: Node-red, MQTT

 

decade-submarginal