insert meterssite and meterssolar
This commit is contained in:
parent
231bd195cb
commit
e34b5f8c07
@ -59,6 +59,7 @@ use warnings;
|
||||
use FHEM::Meta;
|
||||
use GPUtils qw(GP_Import GP_Export);
|
||||
use HttpUtils;
|
||||
use Data::Dumper;
|
||||
|
||||
# try to use JSON::MaybeXS wrapper
|
||||
# for chance of better performance + open code
|
||||
@ -170,6 +171,8 @@ GP_Export(
|
||||
my %paths = (
|
||||
'statussoe' => 'system_status/soe',
|
||||
'aggregates' => 'meters/aggregates',
|
||||
'meterssite' => 'meters/site',
|
||||
'meterssolar' => 'meters/solar',
|
||||
'siteinfo' => 'site_info',
|
||||
'sitemaster' => 'sitemaster',
|
||||
'powerwallsstop' => 'sitemaster/stop',
|
||||
@ -438,7 +441,22 @@ sub Write($) {
|
||||
1
|
||||
);
|
||||
|
||||
HttpUtils_NonblockingGet(
|
||||
#### temporär
|
||||
# HttpUtils_NonblockingGet(
|
||||
# {
|
||||
# url => 'http://' . $uri,
|
||||
# timeout => 5,
|
||||
# method => $method,
|
||||
# data => $data,
|
||||
# header => $header,
|
||||
# hash => $hash,
|
||||
# setCmd => $path,
|
||||
# doTrigger => 1,
|
||||
# callback => \&ErrorHandling,
|
||||
# }
|
||||
# );
|
||||
|
||||
ErrorHandling(
|
||||
{
|
||||
url => 'http://' . $uri,
|
||||
timeout => 5,
|
||||
@ -449,7 +467,9 @@ sub Write($) {
|
||||
setCmd => $path,
|
||||
doTrigger => 1,
|
||||
callback => \&ErrorHandling,
|
||||
}
|
||||
},
|
||||
undef,
|
||||
'{"none": "none"}'
|
||||
);
|
||||
|
||||
Log3 $name, 4, "TeslaPowerwall2AC ($name) - Send with URI: http://$uri";
|
||||
@ -459,6 +479,239 @@ sub ErrorHandling($$$) {
|
||||
my ( $param, $err, $data ) = @_;
|
||||
my $hash = $param->{hash};
|
||||
my $name = $hash->{NAME};
|
||||
my $path = $param->{setCmd}; # temporär
|
||||
|
||||
|
||||
#### temporär
|
||||
if ( $path eq 'statussoe' ) {
|
||||
$data = '{"percentage":69.1675560298826}';
|
||||
}
|
||||
elsif ( $path eq 'aggregates' ) {
|
||||
$data = '{
|
||||
"site":{
|
||||
"last_communication_time":"2018-04-02T16:11:41.885377469-07:00",
|
||||
"instant_power":-21.449996948242188,
|
||||
"instant_reactive_power":-138.8300018310547,
|
||||
"instant_apparent_power":140.47729986545957,
|
||||
"frequency":60.060001373291016,
|
||||
"energy_exported":1136916.6875890202,
|
||||
"energy_imported":3276432.6625890196,
|
||||
"instant_average_voltage":239.81999969482422,
|
||||
"instant_total_current":0,
|
||||
"i_a_current":0,
|
||||
"i_b_current":0,
|
||||
"i_c_current":0
|
||||
},
|
||||
"battery":{
|
||||
"last_communication_time":"2018-04-02T16:11:41.89022247-07:00",
|
||||
"instant_power":-2350,
|
||||
"instant_reactive_power":0,
|
||||
"instant_apparent_power":2350,
|
||||
"frequency":60.033,
|
||||
"energy_exported":1169030,
|
||||
"energy_imported":1638140,
|
||||
"instant_average_voltage":239.10000000000002,
|
||||
"instant_total_current":45.8,
|
||||
"i_a_current":0,
|
||||
"i_b_current":0,
|
||||
"i_c_current":0
|
||||
},
|
||||
"load":{
|
||||
"last_communication_time":"2018-04-02T16:11:41.885377469-07:00",
|
||||
"instant_power":1546.2712597712405,
|
||||
"instant_reactive_power":-71.43153973801415,
|
||||
"instant_apparent_power":1547.920305979569,
|
||||
"frequency":60.060001373291016,
|
||||
"energy_exported":0,
|
||||
"energy_imported":7191016.994444443,
|
||||
"instant_average_voltage":239.81999969482422,
|
||||
"instant_total_current":6.44763264839839,
|
||||
"i_a_current":0,
|
||||
"i_b_current":0,
|
||||
"i_c_current":0
|
||||
},
|
||||
"solar":{
|
||||
"last_communication_time":"2018-04-02T16:11:41.885541803-07:00",
|
||||
"instant_power":3906.1700439453125,
|
||||
"instant_reactive_power":53.26999855041504,
|
||||
"instant_apparent_power":3906.533259164868,
|
||||
"frequency":60.060001373291016,
|
||||
"energy_exported":5534272.949724403,
|
||||
"energy_imported":13661.930279959455,
|
||||
"instant_average_voltage":239.8699951171875,
|
||||
"instant_total_current":0,
|
||||
"i_a_current":0,
|
||||
"i_b_current":0,
|
||||
"i_c_current":0
|
||||
},
|
||||
"busway":{
|
||||
"last_communication_time":"0001-01-01T00:00:00Z",
|
||||
"instant_power":0,
|
||||
"instant_reactive_power":0,
|
||||
"instant_apparent_power":0,
|
||||
"frequency":0,
|
||||
"energy_exported":0,
|
||||
"energy_imported":0,
|
||||
"instant_average_voltage":0,
|
||||
"instant_total_current":0,
|
||||
"i_a_current":0,
|
||||
"i_b_current":0,
|
||||
"i_c_current":0
|
||||
},
|
||||
"frequency":{
|
||||
"last_communication_time":"0001-01-01T00:00:00Z",
|
||||
"instant_power":0,
|
||||
"instant_reactive_power":0,
|
||||
"instant_apparent_power":0,
|
||||
"frequency":0,
|
||||
"energy_exported":0,
|
||||
"energy_imported":0,
|
||||
"instant_average_voltage":0,
|
||||
"instant_total_current":0,
|
||||
"i_a_current":0,
|
||||
"i_b_current":0,
|
||||
"i_c_current":0
|
||||
},
|
||||
"generator":{
|
||||
"last_communication_time":"0001-01-01T00:00:00Z",
|
||||
"instant_power":0,
|
||||
"instant_reactive_power":0,
|
||||
"instant_apparent_power":0,
|
||||
"frequency":0,
|
||||
"energy_exported":0,
|
||||
"energy_imported":0,
|
||||
"instant_average_voltage":0,
|
||||
"instant_total_current":0,
|
||||
"i_a_current":0,
|
||||
"i_b_current":0,
|
||||
"i_c_current":0
|
||||
}
|
||||
}';
|
||||
}
|
||||
elsif ( $path eq 'siteinfo' ) {
|
||||
$data = '{"site":{"last_communication_time":"2019-09-22T00:21:15.389963162-07:00","instant_power":24.451171875,"instant_reactive_power":53.17060422897339,"instant_apparent_power":58.52326853598416,"frequency":49.99971389770508,"energy_exported":8317850.641600119,"energy_imported":3906677.3213223405,"instant_average_voltage":228.2313995361328,"instant_total_current":0,"i_a_current":0,"i_b_current":0,"i_c_current":0,"timeout":1500000000},"battery":{"last_communication_time":"2019-09-22T00:21:15.501660598-07:00","instant_power":1350,"instant_reactive_power":-30,"instant_apparent_power":1350.3332921912279,"frequency":49.994,"energy_exported":3816030,"energy_imported":4422670,"instant_average_voltage":235,"instant_total_current":-31.8,"i_a_current":0,"i_b_current":0,"i_c_current":0,"timeout":1500000000},"load":{"last_communication_time":"2019-09-22T00:21:15.389963162-07:00","instant_power":5728.583274805815,"instant_reactive_power":-175.17854151916174,"instant_apparent_power":5731.261105358374,"frequency":49.99971389770508,"energy_exported":0,"energy_imported":13885698.406388888,"instant_average_voltage":228.2313995361328,"instant_total_current":25.0998911037168,"i_a_current":0,"i_b_current":0,"i_c_current":0,"timeout":1500000000},"solar":{"last_communication_time":"2019-09-22T00:21:15.506420255-07:00","instant_power":4363.2269287109375,"instant_reactive_power":-196.4273910522461,"instant_apparent_power":4367.646156842822,"frequency":49.99971389770508,"energy_exported":18947820.8881397,"energy_imported":44309.16147303224,"instant_average_voltage":227.83099365234375,"instant_total_current":0,"i_a_current":0,"i_b_current":0,"i_c_current":0,"timeout":1500000000}}';
|
||||
}
|
||||
elsif ( $path eq 'sitemaster' ) {
|
||||
$data = '{"running":true,"uptime":"166594s,","connected_to_tesla":true}';
|
||||
}
|
||||
elsif ( $path eq 'powerwalls' ) {
|
||||
$data = '{"powerwalls":[{"PackagePartNumber":"1092170-03-E","PackageSerialNumber":"T1234567890"},{"PackagePartNumber":"1092170-03-E","PackageSerialNumber":"T1234567891"}],"has_sync":true}';
|
||||
}
|
||||
elsif ( $path eq 'status' ) {
|
||||
$data = '{"start_time":"2018-03-16 19:08:46 +0800","up_time_seconds":"402h8m19.937911668s","is_new":false,"version":"1.15.0\n","git_hash":"dc337851c6cad15a7e9c7223d60fff719eb8da4d\n"}';
|
||||
}
|
||||
elsif ( $path eq 'meterssite' ) {
|
||||
$data = '[
|
||||
{
|
||||
"id":0,
|
||||
"location":"site",
|
||||
"type":"neurio_tcp",
|
||||
"cts":[
|
||||
true,
|
||||
true,
|
||||
false,
|
||||
false
|
||||
],
|
||||
"inverted":[
|
||||
false,
|
||||
false,
|
||||
false,
|
||||
false
|
||||
],
|
||||
"connection":{
|
||||
"ip_address":"Neurio-39546",
|
||||
"port":443,
|
||||
"short_id":"39546",
|
||||
"device_serial":"OBB3364102752",
|
||||
"neurio_connected":true,
|
||||
"https_conf":{
|
||||
"client_cert":"/etc/site/certs/neurio/neurio.crt",
|
||||
"client_key":"/etc/site/certs/neurio/neurio.key",
|
||||
"server_ca_cert":"/etc/site/certs/neurio/neurio-ca-chain.cert.pem",
|
||||
"max_idle_conns_per_host":1
|
||||
}
|
||||
},
|
||||
"Cached_readings":{
|
||||
"last_communication_time":"2018-06-10T16:51:46.187715089+01:00",
|
||||
"instant_power":13.94000026769936,
|
||||
"instant_reactive_power":14.070000305771828,
|
||||
"instant_apparent_power":19.80627466405224,
|
||||
"frequency":49.95000076293945,
|
||||
"energy_exported":3724.253888912031,
|
||||
"energy_imported":26003.843888912033,
|
||||
"instant_average_voltage":247.52999755740166,
|
||||
"instant_total_current":0,
|
||||
"i_a_current":0,
|
||||
"i_b_current":0,
|
||||
"i_c_current":0,
|
||||
"v_l1n":247.3300018310547,
|
||||
"v_l2n":0.2199999988079071,
|
||||
"serial_number":"0x000004714B008720",
|
||||
"version":"Tesla-0.0.7"
|
||||
}
|
||||
}
|
||||
]';
|
||||
}
|
||||
elsif ( $path eq 'meterssolar' ) {
|
||||
$data = '[
|
||||
{
|
||||
"id":0,
|
||||
"location":"solar",
|
||||
"type":"neurio_tcp",
|
||||
"cts":[
|
||||
false,
|
||||
false,
|
||||
false,
|
||||
true
|
||||
],
|
||||
"inverted":[
|
||||
false,
|
||||
false,
|
||||
false,
|
||||
false
|
||||
],
|
||||
"connection":{
|
||||
"ip_address":"Neurio-39546",
|
||||
"port":443,
|
||||
"short_id":"39546",
|
||||
"device_serial":"OBB3364102752",
|
||||
"neurio_connected":true,
|
||||
"https_conf":{
|
||||
"client_cert":"/etc/site/certs/neurio/neurio.crt",
|
||||
"client_key":"/etc/site/certs/neurio/neurio.key",
|
||||
"server_ca_cert":"/etc/site/certs/neurio/neurio-ca-chain.cert.pem",
|
||||
"max_idle_conns_per_host":1
|
||||
}
|
||||
},
|
||||
"Cached_readings":{
|
||||
"last_communication_time":"2018-06-10T16:52:57.788560639+01:00",
|
||||
"instant_power":318.8599853515625,
|
||||
"instant_reactive_power":129.94000244140625,
|
||||
"instant_apparent_power":344.3197561756678,
|
||||
"frequency":49.95000076293945,
|
||||
"energy_exported":3.8174999999938235,
|
||||
"energy_imported":125317.00444444444,
|
||||
"instant_average_voltage":246.82000732421875,
|
||||
"instant_total_current":0,
|
||||
"i_a_current":0,
|
||||
"i_b_current":0,
|
||||
"i_c_current":0,
|
||||
"v_l1n":246.8800048828125,
|
||||
"serial_number":"0x000004714B008720",
|
||||
"version":"Tesla-0.0.7"
|
||||
}
|
||||
}
|
||||
]';
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
### Begin Error Handling
|
||||
|
||||
@ -545,15 +798,21 @@ sub ResponseProcessing($$$) {
|
||||
|
||||
if ( $path eq 'aggregates' ) {
|
||||
$readings = ReadingsProcessing_Aggregates( $hash, $decode_json );
|
||||
|
||||
}
|
||||
elsif ( $path eq 'powerwalls' ) {
|
||||
$readings = ReadingsProcessing_Powerwalls( $hash, $decode_json );
|
||||
|
||||
}
|
||||
elsif ( $path eq 'siteinfo' ) {
|
||||
$readings = ReadingsProcessing_Site_Info( $hash, $decode_json );
|
||||
}
|
||||
elsif ( $path eq 'login' ) {
|
||||
return $hash->{TOKEN} = $decode_json->{token};
|
||||
|
||||
}
|
||||
elsif ( $path eq 'meterssite' ) {
|
||||
$readings = ReadingsProcessing_Meters_Site( $hash, $decode_json );
|
||||
}
|
||||
elsif ( $path eq 'meterssolar' ) {
|
||||
$readings = ReadingsProcessing_Meters_Solar( $hash, $decode_json );
|
||||
}
|
||||
else {
|
||||
$readings = $decode_json;
|
||||
@ -614,7 +873,6 @@ sub ReadingsProcessing_Aggregates($$) {
|
||||
$readings{ $obj . '-' . $r } = $v;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
else {
|
||||
$readings{'error'} = 'aggregates response is not a Hash';
|
||||
@ -632,7 +890,6 @@ sub ReadingsProcessing_Powerwalls($$) {
|
||||
and scalar( @{ $decode_json->{powerwalls} } ) > 0 )
|
||||
{
|
||||
my $i = 0;
|
||||
|
||||
foreach my $powerwall ( @{ $decode_json->{powerwalls} } ) {
|
||||
if ( ref($powerwall) eq 'HASH' ) {
|
||||
|
||||
@ -645,7 +902,6 @@ sub ReadingsProcessing_Powerwalls($$) {
|
||||
}
|
||||
|
||||
$readings{'numberOfWalls'} = $i;
|
||||
|
||||
}
|
||||
else {
|
||||
$readings{'error'} = 'aggregates response is not a Array';
|
||||
@ -654,6 +910,125 @@ sub ReadingsProcessing_Powerwalls($$) {
|
||||
return \%readings;
|
||||
}
|
||||
|
||||
sub ReadingsProcessing_Site_Info($$) {
|
||||
my ( $hash, $decode_json ) = @_;
|
||||
my $name = $hash->{NAME};
|
||||
my %readings;
|
||||
|
||||
if ( ref($decode_json) eq 'HASH' ) {
|
||||
while ( my $obj = each %{$decode_json} ) {
|
||||
while ( my ( $r, $v ) = each %{ $decode_json->{$obj} } ) {
|
||||
$readings{ $obj . '-' . $r } = $v;
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
$readings{'error'} = 'siteinfo response is not a Hash';
|
||||
}
|
||||
|
||||
return \%readings;
|
||||
}
|
||||
|
||||
sub ReadingsProcessing_Meters_Site($$) {
|
||||
my ( $hash, $decode_json ) = @_;
|
||||
my $name = $hash->{NAME};
|
||||
my %readings;
|
||||
|
||||
# print('Ausgabe1: ' . Dumper $decode_json . "\n");
|
||||
|
||||
if ( ref( $decode_json ) eq 'ARRAY'
|
||||
and scalar( @{ $decode_json } ) > 0 )
|
||||
{
|
||||
if ( ref($decode_json->[0]) eq 'HASH' ) {
|
||||
while ( my $obj = each %{$decode_json->[0]} ) {
|
||||
# print('Ausgabe2: ' . Dumper $obj . "\n");
|
||||
if ( ref($decode_json->[0]->{$obj}) eq 'ARRAY'
|
||||
or ref($decode_json->[0]->{$obj}) eq 'HASH' )
|
||||
{
|
||||
if ( ref($decode_json->[0]->{$obj}) eq 'HASH' ) {
|
||||
# print('Ausgabe3: ' . Dumper $obj . "\n");
|
||||
while ( my ( $r, $v ) = each %{ $decode_json->[0]->{$obj} } ) {
|
||||
if ( ref($v) ne 'HASH' ) {
|
||||
# print('Ausgabe4: ' . $obj . '-' . $r . ' = ' . $v . "\n");
|
||||
$readings{ $obj . '-' . $r } = $v;
|
||||
}
|
||||
else {
|
||||
# print('Ausgabe5: ' . Dumper $decode_json->[0]->{$obj}->{$r} . "\n");
|
||||
while ( my ( $r2, $v2 ) = each %{ $decode_json->[0]->{$obj}->{$r} } ) {
|
||||
# print('Ausgabe6: ' . $obj . '-' . $r2 . ' = ' . $v2 . "\n");
|
||||
$readings{ $obj . '-' . $r . '-' . $r2 } = $v2;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
elsif ( ref($decode_json->[0]->{$obj}) eq 'ARRAY' ) {
|
||||
|
||||
}
|
||||
}
|
||||
else {
|
||||
# print('Ausgabe7: ' . Dumper $decode_json->[0]->{$obj} . "\n");
|
||||
$readings{ $obj } = $decode_json->[0]->{$obj};
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
# print('Ausgabe8: ' . "\n");
|
||||
$readings{'error'} = 'metes site response is not a Array';
|
||||
}
|
||||
|
||||
return \%readings;
|
||||
}
|
||||
|
||||
sub ReadingsProcessing_Meters_Solar($$) {
|
||||
my ( $hash, $decode_json ) = @_;
|
||||
my $name = $hash->{NAME};
|
||||
my %readings;
|
||||
|
||||
if ( ref( $decode_json ) eq 'ARRAY'
|
||||
and scalar( @{ $decode_json } ) > 0 )
|
||||
{
|
||||
if ( ref($decode_json->[0]) eq 'HASH' ) {
|
||||
while ( my $obj = each %{$decode_json->[0]} ) {
|
||||
# print('Ausgabe2: ' . Dumper $obj . "\n");
|
||||
if ( ref($decode_json->[0]->{$obj}) eq 'ARRAY'
|
||||
or ref($decode_json->[0]->{$obj}) eq 'HASH' )
|
||||
{
|
||||
if ( ref($decode_json->[0]->{$obj}) eq 'HASH' ) {
|
||||
# print('Ausgabe3: ' . Dumper $obj . "\n");
|
||||
while ( my ( $r, $v ) = each %{ $decode_json->[0]->{$obj} } ) {
|
||||
if ( ref($v) ne 'HASH' ) {
|
||||
# print('Ausgabe4: ' . $obj . '-' . $r . ' = ' . $v . "\n");
|
||||
$readings{ $obj . '-' . $r } = $v;
|
||||
}
|
||||
else {
|
||||
# print('Ausgabe5: ' . Dumper $decode_json->[0]->{$obj}->{$r} . "\n");
|
||||
while ( my ( $r2, $v2 ) = each %{ $decode_json->[0]->{$obj}->{$r} } ) {
|
||||
# print('Ausgabe6: ' . $obj . '-' . $r2 . ' = ' . $v2 . "\n");
|
||||
$readings{ $obj . '-' . $r . '-' . $r2 } = $v2;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
elsif ( ref($decode_json->[0]->{$obj}) eq 'ARRAY' ) {
|
||||
|
||||
}
|
||||
}
|
||||
else {
|
||||
# print('Ausgabe7: ' . Dumper $decode_json->[0]->{$obj} . "\n");
|
||||
$readings{ $obj } = $decode_json->[0]->{$obj};
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
# print('Ausgabe8: ' . "\n");
|
||||
$readings{'error'} = 'metes solar response is not a Array';
|
||||
}
|
||||
|
||||
return \%readings;
|
||||
}
|
||||
|
||||
sub CreateUri($$) {
|
||||
my ( $hash, $path ) = @_;
|
||||
my $host = $hash->{HOST};
|
||||
|
Loading…
x
Reference in New Issue
Block a user