############################################## # $Id$ # package FHEM::attrT_go_e_Utils; ## no critic 'Package declaration' use strict; use warnings; #use Time::HiRes qw( gettimeofday ); #use List::Util qw( min max ); use GPUtils qw(GP_Import); ## Import der FHEM Funktionen #-- Run before package compilation BEGIN { # Import from main context GP_Import( qw( AttrVal InternalVal ReadingsVal ReadingsNum ReadingsAge json2nameValue defs ) ); } sub ::attrT_go_e_Utils_Initialize { goto &Initialize } # initialize ################################################################## sub Initialize { my $hash = shift; return; } # Enter you functions below _this_ line. my %jsonmap = ( "alw" => "allow_charging", "amp" => "ampere", "tmp" => "temperature", "rbc" => "reboot_counter", "rbt" => "reboot_timer", "err" => "error", "ast" => "access_state", "stp" => "stop_state", "cbl" => "cable_code", "pha" => "phase", "dws" => "deca_watt_sec", "dwo" => "stop_energy", "adi" => "adapter_in", "uby" => "unlocked_by", "eto" => "energy_total", "wst" => "wifi_state", "nrg_1" => "voltage_l1", "nrg_2" => "voltage_l2", "nrg_3" => "voltage_l3", "nrg_4" => "voltage_n", "nrg_5" => "ampere_l1", "nrg_6" => "ampere_l2", "nrg_7" => "ampere_l3", "nrg_8" => "power_l1", "nrg_9" => "power_l2", "nrg_10" => "power_l3", "nrg_11" => "power_n", "nrg_12" => "power_total", "nrg_13" => "power_factor_l1", "nrg_14" => "power_factor_l2", "nrg_15" => "power_factor_l3", "nrg_16" => "power_factor_n", "fwv" => "firmware_version", "sse" => "serial_number", "wss" => "wifi_ssid", "wke" => "wifi_key", "wen" => "wifi_enabled", "tof" => "time_offset", "tds" => "daylight_saving_offset", "lbr" => "led_brightness", "aho" => "hours_charging", "afi" => "time_charging", "azo" => "awattar_zone", "ama" => "max_ampere", "al1" => "ampere_level1", "al2" => "ampere_level2", "al3" => "ampere_level3", "al4" => "ampere_level4", "al5" => "ampere_level5", "cid" => "color_idle", "cch" => "color_charging", "cfi" => "color_charging_done", "lse" => "led_save_energy", "ust" => "unlock_state", "wak" => "wifi_hotspot_key", "r1x" => "flags", "dto" => "remaining_time", "nmo" => "norway_mode", "eca" => "rfid1_energy", "ecr" => "rfid2_energy", "ecd" => "rfid3_energy", "ec4" => "rfid4_energy", "ec5" => "rfid5_energy", "ec6" => "rfid6_energy", "ec7" => "rfid7_energy", "ec8" => "rfid8_energy", "ec9" => "rfid9_energy", "ec1" => "rfid10_energy", "rca" => "rfid1_id", "rcr" => "rfid2_id", "rcd" => "rfid3_id", "rc4" => "rfid4_id", "rc5" => "rfid5_id", "rc6" => "rfid6_id", "rc7" => "rfid7_id", "rc8" => "rfid8_id", "rc9" => "rfid9_id", "rc1" => "rfid10_id", "rna" => "rfid1_name", "rnm" => "rfid2_name", "rne" => "rfid3_name", "rn4" => "rfid4_name", "rn5" => "rfid5_name", "rn6" => "rfid6_name", "rn7" => "rfid7_name", "rn8" => "rfid8_name", "rn9" => "rfid9_name", "rn1" => "rfid10_name", "tma_1" => "internal_temperature_sensor_1", "tma_2" => "internal_temperature_sensor_2", "tma_3" => "internal_temperature_sensor_3", "tma_4" => "internal_temperature_sensor_4", "amt" => "max_ampere_temperature", "tme" => "time", "sch" => "scheduler", "sdp" => "scheduler_double_press", "upd" => "update_available", "cdi" => "cloud_disabled", "loe" => "loadmanagement_enabled", "lot" => "loadmanagement_total_ampere", "lom" => "loadmanagement_min_ampere", "lop" => "loadmanagement_priority", "log" => "loadmanagement_group_id", "lon" => "loadmanagement_number_charger", "lof" => "loadmanagement_fallback_ampere", "loa" => "loadmanagement_ampere", "lch" => "loadmanagement_seconds_power", "mce" => "mqtt_enabled", "mcs" => "mqtt_server", "mcp" => "mqtt_port", "mcu" => "mqtt_username", "mck" => "mqtt_key", "mcc" => "mqtt_connected" ); my %stationStates = ( "none" => "-1", "1" => "Ready", "2" => "Charging", "3" => "waiting for car", "4" => "Charging finished" ); my %todelete = ( "always" => ["wifi_key","reboot_timer","loadmanagement_seconds_power","time"], "hourly" => ["mqtt_enabled","mqtt_server","mqtt_port","mqtt_username","mqtt_key","mqtt_connected"] ); sub j2rN_extended { my $name = shift; my $event = shift // return; my $useSNrs = shift // 0; my $aDiffV = shift; #absolute voltage difference for eocr my $rDiffV = shift; #relative voltage difference for eocr (in %) my $tDiffV = shift // 600; #max timespan for triggering next value w/o changes; (defaults to 10 minutes) my $aDiffA = shift; #absolute ampere difference for eocr my $rDiffA = shift; #relative ampere difference for eocr (in %) my $tDiffA = shift // $tDiffV; #max timespan, s.a. my $aDiffP = shift; #absolute kW difference for eocr my $rDiffP = shift; #relative kW difference for eocr (in %) my $tDiffP = shift // $tDiffA; #max timespan, s.a. my $aDiffwF = shift; #absolute Leistungsfaktor difference for eocr my $rDiffwF = shift; #relative Leistungsfaktor difference for eocr (in %) my $tDiffwF = shift // $tDiffA; #max timespan, s.a. #Array mit Werten des Strom- und Spannungssensors #nrg[0]​: Spannung auf L1 in Volt #nrg[1]​: Spannung auf L2 in Volt #nrg[2]​: Spannung auf L3 in Volt #nrg[3]​: Spannung auf N in Volt #nrg[4]​: Ampere auf L1 in 0.1A ​(123 entspricht 12,3A) #nrg[5]​: Ampere auf L2 in 0.1A #nrg[6]​: Ampere auf L3 in 0.1A #nrg[7]​: Leistung auf L1 in 0.1kW ​(36 entspricht 3,6kW) #nrg[8]​: Leistung auf L2 in 0.1kW #nrg[9]​: Leistung auf L3 in 0.1kW #nrg[10]​: Leistung auf N in 0.1kW #nrg[11]​: Leistung gesamt in 0.01kW ​(360 entspricht 3,6kW) #nrg[12]​: Leistungsfaktor auf L1 in % #nrg[13]​: Leistungsfaktor auf L2 in % #nrg[14]​: Leistungsfaktor auf L3 in % #nrg[15]​: Leistungsfaktor auf N in % my %toCompare = ( "Voltage" => { "a" => $aDiffV, "r" => $rDiffV, "t" => $tDiffV, "elements" => ["voltage_l1","voltage_l2","voltage_l3"] }, "Ampere" => { "a" => $aDiffA, "r" => $rDiffA, "t" => $tDiffA }, "Power" => { "a" => $aDiffP, "r" => $rDiffP, "t" => $tDiffP }, "PowerFactor" => { "a" => $aDiffwF, "r" => $rDiffwF, "t" => $tDiffwF } ); my $rets = json2nameValue($event); #get reference to a flat hash #renaming; adopted form fhem.pl, end of json2nameValue() my %ret2; for my $kname (keys %$rets) { my $oname = $kname; if(defined($jsonmap{$kname})) { next if(!$jsonmap{$kname}); $kname = $jsonmap{$kname}; } $ret2{$kname} = $rets->{$oname}; } #replace stationStates $ret2{car} = $stationStates{$ret2{car}} if !$useSNrs; for my $obsolete (@{$todelete{always}}) { delete $ret2{$obsolete}; } for my $kname (keys %ret2) { delete $ret2{$kname} if $ret2{$kname} eq ""; } my $firstelement = ${$todelete{hourly}}[0]; my $lastloop = ReadingsAge($name, $firstelement, 10000000); if ($lastloop < 3600) { for my $obsolete (@{$todelete{hourly}}) { delete $ret2{$obsolete}; } } else { for my $obsolete (@{$todelete{hourly}}) { delete $ret2{$obsolete} if ReadingsVal($name,$obsolete,"unknown") eq $ret2{$obsolete}; } } sub compAbs { my ($ret,$name,$val,$limit) = @_; my $actual = ReadingsNum($name,$ret,0); return 1 if $val >= $actual - $limit && $val <= $actual + $limit; return; } sub compRel { my ($ret,$name,$val,$limit) = @_; my $actual = ReadingsNum($name,$ret,0); return 1 if $val >= $actual*(1 - $limit) && $val <= $actual*( 1 + $limit); return; } $firstelement = ${$toCompare{Voltage}}{elements}[0]; $lastloop = ReadingsAge($name, $firstelement, 10000000); if ($firstelement && $lastloop < $toCompare{Voltage}{t}) { for my $obsolete (@{$toCompare{Voltage}{elements}}) { delete $ret2{$obsolete} if compAbs($obsolete, $name, $ret2{$obsolete}, $toCompare{Voltage}{a}) && compRel($obsolete, $name, $ret2{$obsolete}, $toCompare{Voltage}{r}) ; } } #main loop for comparisons for my $k (sort keys %ret2) { } return \%ret2; } 1; __END__ =pod =begin html

attrT_go_e_Utils

=end html =cut