{Error} || defined $result->{AuthorizationRequired}) {
@@ -7437,7 +8292,7 @@ sub FRITZBOX_Set_Wlan_Log_Ext_OnOff($)
FRITZBOX_Log $hash, 4, "data.lua: \n" . join(" ", @webCmdArray);
- $result = FRITZBOX_read_LuaData($hash, "data", \@webCmdArray) ;
+ $result = FRITZBOX_call_LuaData($hash, "data", \@webCmdArray) ;
# Abbruch wenn Fehler beim Lesen der Fritzbox-Antwort
if ( defined $result->{Error} || defined $result->{AuthorizationRequired}) {
@@ -7483,7 +8338,7 @@ sub FRITZBOX_Set_Wlan_Guest_Params($)
FRITZBOX_Log $hash, 4, "data.lua status: \n" . join(" ", @webCmdArray);
- $result = FRITZBOX_read_LuaData($hash, "data", \@webCmdArray) ;
+ $result = FRITZBOX_call_LuaData($hash, "data", \@webCmdArray) ;
# Abbruch wenn Fehler beim Lesen der Fritzbox-Antwort
if ( defined $result->{Error} || defined $result->{AuthorizationRequired}) {
@@ -7583,7 +8438,7 @@ sub FRITZBOX_Set_Wlan_Guest_Params($)
FRITZBOX_Log $hash, 4, "data.lua change: \n" . join(" ", @webCmdArray);
- $result = FRITZBOX_read_LuaData($hash, "data", \@webCmdArray);
+ $result = FRITZBOX_call_LuaData($hash, "data", \@webCmdArray);
# Abbruch wenn Fehler beim Lesen der Fritzbox-Antwort
if ( defined $result->{Error} || defined $result->{AuthorizationRequired}) {
@@ -7646,6 +8501,8 @@ sub FRITZBOX_Set_macFilter_OnOff($)
my $currMACFilter = ReadingsVal($name, "box_macFilter_active", "ERROR");
+ FRITZBOX_Log $hash, 3, "set $name $cmd (Fritz!OS: $hash->{fhem}{fwVersionStr})";
+
$queryStr = "&box_macFilter_active=wlan:settings/is_macfilter_active";
$result = FRITZBOX_call_Lua_Query( $hash, $queryStr) ;
@@ -7667,56 +8524,108 @@ sub FRITZBOX_Set_macFilter_OnOff($)
FRITZBOX_Readout_Add_Reading $hash, \@roReadings, "retStat_macFilter", "macFilter->INFO: change necessary";
} else {
- push @webCmdArray, "xhr" => "1";
+ if ($hash->{fhem}{fwVersion} >= 800) {
+
+ push @webCmdArray, "xhr" => "1";
+ push @webCmdArray, "xhrId" => "all";
+ push @webCmdArray, "lang" => "de";
+ push @webCmdArray, "page" => "wKey";
- push @webCmdArray, "MACFilter" => $switch;
- push @webCmdArray, "currMACFilter" => $switch == 1? 0 : 1;
+ FRITZBOX_Log $hash, 4, "set $name $cmd " . join(" ", @webCmdArray);
- push @webCmdArray, "apply" => "";
- push @webCmdArray, "lang" => "de";
- push @webCmdArray, "page" => "wKey";
+ $result = FRITZBOX_call_LuaData($hash, "data", \@webCmdArray) ;
- FRITZBOX_Log $hash, 4, "set $name $cmd (Fritz!OS: $hash->{fhem}{fwVersionStr})";
+ # Abbruch wenn Fehler beim Lesen der Fritzbox-Antwort
+ if ( defined $result->{Error} || defined $result->{AuthorizationRequired}) {
+ FRITZBOX_Log $hash, 2, "macFilter -> " . $result->{Error};
+ FRITZBOX_Readout_Add_Reading $hash, \@roReadings, "retStat_macFilter", "macFilter->ERROR: " . $result->{Error};
+ return FRITZBOX_Readout_Response($hash, $result, \@roReadings, 2);
+ }
- FRITZBOX_Log $hash, 4, "set $name $cmd " . join(" ", @webCmdArray);
+ $sidNew += $result->{sidNew} if defined $result->{sidNew};
- $result = FRITZBOX_read_LuaData($hash, "data", \@webCmdArray) ;
+ @webCmdArray = ();
- # Abbruch wenn Fehler beim Lesen der Fritzbox-Antwort
- if ( defined $result->{Error} || defined $result->{AuthorizationRequired}) {
- FRITZBOX_Log $hash, 2, "macFilter -> " . $result->{Error};
- FRITZBOX_Readout_Add_Reading $hash, \@roReadings, "retStat_macFilter", "macFilter->ERROR: " . $result->{Error};
- return FRITZBOX_Readout_Response($hash, $result, \@roReadings, 2);
- }
+ push @webCmdArray, "xhr" => "1";
+ push @webCmdArray, "wpaEncrypted" => "wpaEncrypted";
+ push @webCmdArray, "wpaType" => $result->{data}->{wlan}->{wpaType};
+ push @webCmdArray, "psk" => $result->{data}->{wlan}->{psk};
+ push @webCmdArray, "stickAndSurf" => $result->{data}->{wlan}->{stickAndSurf};
+ push @webCmdArray, "pmfMode" => $result->{data}->{wlan}->{pmfMode};
+ push @webCmdArray, "encInterop" => "0";
+ push @webCmdArray, "isolation" => $result->{data}->{wlan}->{isolation};
+ push @webCmdArray, "wlanAccountVisible" => $result->{data}->{wlan}->{wlanAccountVisible};
+ push @webCmdArray, "MACFilter" => $switch;
+ push @webCmdArray, "currMACFilter" => "";
+ push @webCmdArray, "activeMACFilter" => $switch;
+ push @webCmdArray, "isEncInterop" => $result->{data}->{wlan}->{isEncInterop};
+ push @webCmdArray, "hasWlanAccountOption" => $result->{data}->{wlan}->{hasWlanAccountOption} == 1 ? "true" : "false";
+ push @webCmdArray, "apply" => "";
+ push @webCmdArray, "lang" => "de";
+ push @webCmdArray, "page" => "wKey";
- $sidNew += $result->{sidNew} if defined $result->{sidNew};
+ FRITZBOX_Log $hash, 4, "set $name $cmd " . join(" ", @webCmdArray);
- $queryStr = "&box_macFilter_active=wlan:settings/is_macfilter_active";
+ $result = FRITZBOX_call_LuaData($hash, "data", \@webCmdArray) ;
- $result = FRITZBOX_call_Lua_Query( $hash, $queryStr) ;
+ # Abbruch wenn Fehler beim Lesen der Fritzbox-Antwort
+ if ( defined $result->{Error} || defined $result->{AuthorizationRequired}) {
+ FRITZBOX_Log $hash, 2, "macFilter -> " . $result->{Error};
+ FRITZBOX_Readout_Add_Reading $hash, \@roReadings, "retStat_macFilter", "macFilter->ERROR: " . $result->{Error};
+ return FRITZBOX_Readout_Response($hash, $result, \@roReadings, 2);
+ }
- # Abbruch wenn Fehler beim Lesen der Fritzbox-Antwort
- if ( defined $result->{Error} || defined $result->{AuthorizationRequired}) {
- FRITZBOX_Log $hash, 2, "macFilter -> " . $result->{Error};
- FRITZBOX_Readout_Add_Reading $hash, \@roReadings, "retStat_macFilter", "macFilter->ERROR: " . $result->{Error};
- return FRITZBOX_Readout_Response($hash, $result, \@roReadings, 2);
- }
+ $sidNew += $result->{sidNew} if defined $result->{sidNew};
- $sidNew += $result->{sidNew} if defined $result->{sidNew};
+ } else {
- if( !defined ($result->{box_macFilter_active}) ) {
- FRITZBOX_Log $hash, 2, "MAC Filter not available";
- FRITZBOX_Readout_Add_Reading $hash, \@roReadings, "retStat_macFilter", "macFilter->ERROR: MAC Filter not available";
- } elsif ( $switch != $result->{box_macFilter_active} ) {
- FRITZBOX_Log $hash, 4, "no macFilter change necessary";
- FRITZBOX_Readout_Add_Reading $hash, \@roReadings, "retStat_macFilter", "macFilter->INFO: change necessary";
- } else {
+ push @webCmdArray, "xhr" => "1";
+ push @webCmdArray, "MACFilter" => $switch;
+ push @webCmdArray, "currMACFilter" => $switch == 1? 0 : 1;
+ push @webCmdArray, "apply" => "";
+ push @webCmdArray, "lang" => "de";
+ push @webCmdArray, "page" => "wKey";
- FRITZBOX_Readout_Add_Reading $hash, \@roReadings, "box_macFilter_active", $val[0];
+ FRITZBOX_Log $hash, 4, "set $name $cmd " . join(" ", @webCmdArray);
- FRITZBOX_Log $hash, 4, "macFilter set to " . $val[0];
- FRITZBOX_Readout_Add_Reading $hash, \@roReadings, "retStat_macFilter", "macFilter->set to " . $val[0];
- }
+ $result = FRITZBOX_call_LuaData($hash, "data", \@webCmdArray) ;
+
+ # Abbruch wenn Fehler beim Lesen der Fritzbox-Antwort
+ if ( defined $result->{Error} || defined $result->{AuthorizationRequired}) {
+ FRITZBOX_Log $hash, 2, "macFilter -> " . $result->{Error};
+ FRITZBOX_Readout_Add_Reading $hash, \@roReadings, "retStat_macFilter", "macFilter->ERROR: " . $result->{Error};
+ return FRITZBOX_Readout_Response($hash, $result, \@roReadings, 2);
+ }
+
+ $sidNew += $result->{sidNew} if defined $result->{sidNew};
+ }
+
+ $queryStr = "&box_macFilter_active=wlan:settings/is_macfilter_active";
+
+ $result = FRITZBOX_call_Lua_Query( $hash, $queryStr) ;
+
+ # Abbruch wenn Fehler beim Lesen der Fritzbox-Antwort
+ if ( defined $result->{Error} || defined $result->{AuthorizationRequired}) {
+ FRITZBOX_Log $hash, 2, "macFilter -> " . $result->{Error};
+ FRITZBOX_Readout_Add_Reading $hash, \@roReadings, "retStat_macFilter", "macFilter->ERROR: " . $result->{Error};
+ return FRITZBOX_Readout_Response($hash, $result, \@roReadings, 2);
+ }
+
+ $sidNew += $result->{sidNew} if defined $result->{sidNew};
+
+ if( !defined ($result->{box_macFilter_active}) ) {
+ FRITZBOX_Log $hash, 2, "MAC Filter not available";
+ FRITZBOX_Readout_Add_Reading $hash, \@roReadings, "retStat_macFilter", "macFilter->ERROR: MAC Filter not available";
+ } elsif ( $switch != $result->{box_macFilter_active} ) {
+ FRITZBOX_Log $hash, 4, "no macFilter change necessary";
+ FRITZBOX_Readout_Add_Reading $hash, \@roReadings, "retStat_macFilter", "macFilter->INFO: change necessary";
+ } else {
+
+ FRITZBOX_Readout_Add_Reading $hash, \@roReadings, "box_macFilter_active", $val[0];
+
+ FRITZBOX_Log $hash, 4, "macFilter set to " . $val[0];
+ FRITZBOX_Readout_Add_Reading $hash, \@roReadings, "retStat_macFilter", "macFilter->set to " . $val[0];
+ }
}
# Ende und Rückkehr zum Hauptprozess
@@ -7751,7 +8660,7 @@ sub FRITZBOX_Set_rescan_Neighborhood($)
FRITZBOX_Log $hash, 4, "data.lua: \n" . join(" ", @webCmdArray);
- $result = FRITZBOX_read_LuaData($hash, "data", \@webCmdArray) ;
+ $result = FRITZBOX_call_LuaData($hash, "data", \@webCmdArray) ;
# Abbruch wenn Fehler beim Lesen der Fritzbox-Antwort
if ( defined $result->{Error} || defined $result->{AuthorizationRequired}) {
@@ -7834,7 +8743,7 @@ sub FRITZBOX_Set_change_Profile($)
FRITZBOX_Log $hash, 4, "get $name $cmd " . join(" ", @webCmdArrayP);
- $result = FRITZBOX_read_LuaData($hash, "data", \@webCmdArrayP) ;
+ $result = FRITZBOX_call_LuaData($hash, "data", \@webCmdArrayP) ;
# Abbruch wenn Fehler beim Lesen der Fritzbox-Antwort
if ( defined $result->{Error} || defined $result->{AuthorizationRequired}) {
@@ -7876,7 +8785,7 @@ sub FRITZBOX_Set_change_Profile($)
$sidNew += $lanDevice_Info->{sidNew} if defined $lanDevice_Info->{sidNew};
- FRITZBOX_Log $hash, 5, "\n" . Dumper $lanDevice_Info;
+ FRITZBOX_Log $hash, 5, "\n" . Dumper($lanDevice_Info);
if($lanDevice_Info->{data}->{vars}->{dev}->{UID} eq $val[0]) {
@@ -7948,7 +8857,7 @@ sub FRITZBOX_Set_change_Profile($)
FRITZBOX_Log $hash, 4, "get $name $cmd " . join(" ", @webCmdArray);
- $result = FRITZBOX_read_LuaData($hash, "data", \@webCmdArray) ;
+ $result = FRITZBOX_call_LuaData($hash, "data", \@webCmdArray) ;
# Abbruch wenn Fehler beim Lesen der Fritzbox-Antwort
if ( defined $result->{Error} || defined $result->{AuthorizationRequired}) {
@@ -8041,7 +8950,7 @@ sub FRITZBOX_Set_enable_VPNshare_OnOff($)
FRITZBOX_Log $hash, 4, "data.lua: \n" . join(" ", @webCmdArray);
- $result = FRITZBOX_read_LuaData($hash, "data", \@webCmdArray) ;
+ $result = FRITZBOX_call_LuaData($hash, "data", \@webCmdArray) ;
# Abbruch wenn Fehler beim Lesen der Fritzbox-Antwort
if ( defined $result->{Error} || defined $result->{AuthorizationRequired}) {
@@ -8053,7 +8962,7 @@ sub FRITZBOX_Set_enable_VPNshare_OnOff($)
$queryStr = "&vpn_info=vpn:settings/connection$vpnShare/activated";
my $vpnState = FRITZBOX_call_Lua_Query( $hash, $queryStr) ;
- FRITZBOX_Log $hash, 5, "$vpnState->{vpn_info} \n" . Dumper $vpnState;
+ FRITZBOX_Log $hash, 5, "$vpnState->{vpn_info} \n" . Dumper($vpnState);
# Abbruch wenn Fehler beim Lesen der Fritzbox-Antwort
if ( defined $result->{Error} || defined $result->{AuthorizationRequired}) {
@@ -8077,6 +8986,227 @@ sub FRITZBOX_Set_enable_VPNshare_OnOff($)
} # end FRITZBOX_Set_enable_VPNshare_OnOff
+#######################################################################
+# {FRITZBOX_write_javaScript($defs{FritzBox},"user/user", '{"filter_profile_UID":"filtprof1","landeviceUID":"landevice1805","disallowed":"1","type":"1"}', "post")}
+#
+# {FRITZBOX_write_javaScript($defs{FritzBox},"trafficprio/user", '{"ip":"192.168.0.37", "mac":"88:71:E5:0E:38:98","type":"1"}', "post")}
+#
+# {FRITZBOX_write_javaScript($defs{FritzBox},"landevice/landevice/landevice1805", '{"device_class_user":"Generic","friendly_name":"amazon-echo","rrd":"0"}', "put")}
+# {FRITZBOX_write_javaScript($defs{FritzBox},"user/user/user8564", '{"filter_profile_UID":"filtprof1","disallowed:"0"}', "put")}
+#######################################################################
+
+sub FRITZBOX_Set_lock_Landevice_OnOffRt_8($)
+{
+ my ($string) = @_;
+ my ($name, $cmd, @val) = split "\\|", $string;
+ my $hash = $defs{$name};
+ my $result;
+ my $sidNew = 0;
+ my @webCmdArray;
+ my @roReadings;
+ my $jsonMsgId;
+ my $startTime = time();
+
+ my $returnStr;
+
+ my $dev_name = $hash->{fhem}->{landevice}->{$val[0]}; # friendly name
+
+ FRITZBOX_Log $hash, 3, "set $name $cmd $val[0] $val[1] $dev_name (Fritz!OS: $hash->{fhem}{fwVersionStr})";
+
+ my $nbViews = 0;
+ my $views;
+ my $user;
+ my $user_ctrl;
+ my $dc_user;
+ my $fp_uid;
+ my $mac;
+ my $ip;
+ my $friendlyName;
+ my $i;
+
+# { Dumper (FRITZBOX_call_javaScript($defs{FritzBox}, "landevice"))}
+
+ $result = FRITZBOX_call_javaScript($hash, "landevice");
+
+ if (defined $result->{data}->{landevice}) {
+ $views = $result->{data}->{landevice};
+ $nbViews = scalar @$views;
+ }
+
+ for($i = 0; $i <= $nbViews - 1; $i++) {
+ if ($result->{data}->{landevice}->[$i]->{UID} eq $val[0]) {
+ $user = $result->{data}->{landevice}->[$i]->{user_UIDs};
+ $dc_user = $result->{data}->{landevice}->[$i]->{device_class_user};
+ $mac = $result->{data}->{landevice}->[$i]->{mac};
+ $ip = $result->{data}->{landevice}->[$i]->{ip};
+ $friendlyName = $result->{data}->{landevice}->[$i]->{name};
+ FRITZBOX_Log $hash, 2, "locklandevice: $i " . $dev_name . " $user $mac $friendlyName";
+ last;
+ }
+ }
+
+ $result = FRITZBOX_call_javaScript($hash, "user");
+
+ if (defined $result->{data}->{user}) {
+ $views = $result->{data}->{user};
+ $nbViews = scalar @$views;
+ }
+
+ for($i = 0; $i <= $nbViews - 1; $i++) {
+ if ($result->{data}->{user}->[$i]->{landeviceUID} eq $val[0]) {
+ $user_ctrl = $result->{data}->{user}->[$i]->{UID};
+ $fp_uid = $result->{data}->{user}->[$i]->{filter_profile_UID};
+ FRITZBOX_Log $hash, 2, "locklandevice: $i " . $fp_uid . " $user $mac $friendlyName";
+ last;
+ }
+ }
+
+ if ($i >= $nbViews) {
+ $fp_uid = "filtprof1";
+ }
+
+ if ($val[1] eq "off") {
+
+ if ($user) {
+
+ FRITZBOX_Log $hash, 4, "locklandevice: last change user: " . $user . " defined for changing";
+
+ $result = FRITZBOX_write_javaScript($hash, "landevice/landevice/" . $val[0], '{"device_class_user":"' . $dc_user . '","friendly_name":"' . $friendlyName . '","rrd":"0"}', "put");
+ # Abbruch wenn Fehler beim Lesen der Fritzbox-Antwort
+ if ( defined $result->{Error} || defined $result->{AuthorizationRequired}) {
+ FRITZBOX_Log $hash, 2, "locklandevice: $dev_name " . $result->{Error};
+ FRITZBOX_Readout_Add_Reading $hash, \@roReadings, "retStat_lockLandevice", $val[1] . "->ERROR: $dev_name " . $result->{Error};
+ FRITZBOX_Readout_Response($hash, $result, \@roReadings, 2);
+ }
+
+ $sidNew += $result->{sidNew} if defined $result->{sidNew};
+
+ $result = FRITZBOX_write_javaScript($hash, "user/user/" . $user, '{"filter_profile_UID":"' . $fp_uid . '","disallowed":"0"}', "put");
+ # Abbruch wenn Fehler beim Lesen der Fritzbox-Antwort
+ if ( defined $result->{Error} || defined $result->{AuthorizationRequired}) {
+ FRITZBOX_Log $hash, 2, "locklandevice: $friendlyName " . $result->{Error};
+ FRITZBOX_Readout_Add_Reading $hash, \@roReadings, "retStat_lockLandevice", $val[1] . "->ERROR: $friendlyName " . $result->{Error};
+ FRITZBOX_Readout_Response($hash, $result, \@roReadings, 2);
+ }
+
+ $sidNew += $result->{sidNew} if defined $result->{sidNew};
+
+ FRITZBOX_Log $hash, 4, "locklandevice: " . $friendlyName . " disallowed canceld";
+ FRITZBOX_Readout_Add_Reading $hash, \@roReadings, "retStat_lockLandevice", $friendlyName . " disallowed canceld";
+
+ } else {
+
+ FRITZBOX_Log $hash, 4, "locklandevice: " . $dev_name . " no change possible for " . $friendlyName;
+ FRITZBOX_Readout_Add_Reading $hash, \@roReadings, "retStat_lockLandevice", $val[1] . "->ERROR: no change possible for " . $friendlyName;
+
+ }
+
+ } elsif ($val[1] eq "rtoff") {
+
+# { Dumper (FRITZBOX_call_javaScript($defs{FritzBox}, "trafficprio"))}
+
+ FRITZBOX_Log $hash, 4, "locklandevice: no last change user defined for changing. Trying for traffic prio.";
+
+ my $trafficPrio = FRITZBOX_call_javaScript($hash, "trafficprio");
+ my $nbViewsTr = 0;
+ my $viewsTr;
+
+ if (defined $trafficPrio->{data}->{user}) {
+ $viewsTr = $trafficPrio->{data}->{user};
+ $nbViewsTr = scalar @$viewsTr;
+ }
+
+ my $j;
+
+ for($j = 0; $j <= $nbViewsTr - 1; $j++) {
+ if ($trafficPrio->{data}->{user}->[$j]->{mac} eq $mac) {
+ $user = $trafficPrio->{data}->{user}->[$j]->{UID};
+
+ if ($user) {
+
+ $sidNew += $result->{sidNew} if defined $result->{sidNew};
+
+ FRITZBOX_write_javaScript($hash, "trafficprio/user/" . $user, "", "delete");
+ # Abbruch wenn Fehler beim Lesen der Fritzbox-Antwort
+ if ( defined $result->{Error} || defined $result->{AuthorizationRequired}) {
+ FRITZBOX_Log $hash, 2, "locklandevice: $friendlyName " . $result->{Error};
+ FRITZBOX_Readout_Add_Reading $hash, \@roReadings, "retStat_lockLandevice", $val[1] . "->ERROR: $friendlyName " . $result->{Error};
+ FRITZBOX_Readout_Response($hash, $result, \@roReadings, 2);
+ }
+
+ $sidNew += $result->{sidNew} if defined $result->{sidNew};
+
+ FRITZBOX_Log $hash, 4, "locklandevice: " . $friendlyName . " Priority deactivated";
+ FRITZBOX_Readout_Add_Reading $hash, \@roReadings, "retStat_lockLandevice", $val[1] . "Priority deactivated";
+
+ } else {
+
+ FRITZBOX_Log $hash, 4, "locklandevice: " . $dev_name . " no Prio Change possible for " . $friendlyName;
+ FRITZBOX_Readout_Add_Reading $hash, \@roReadings, "retStat_lockLandevice", $val[1] . "->ERROR: no Prio Change possible for " . $friendlyName;
+
+ }
+ last;
+ }
+ }
+
+ if ($j >= $nbViewsTr) {
+ FRITZBOX_Log $hash, 2, "locklandevice: " . $dev_name . " no Prio Change possible for " . $friendlyName;
+ FRITZBOX_Readout_Add_Reading $hash, \@roReadings, "retStat_lockLandevice", $val[1] . "->ERROR: no Prio Change possible for " . $friendlyName;
+ }
+
+ } elsif ( $val[1] eq "on") {
+
+ if ($user_ctrl) {
+ FRITZBOX_Log $hash, 3, "locklandevice: $friendlyName : $fp_uid : $val[0] : $user_ctrl : $dc_user";
+
+ $result = FRITZBOX_write_javaScript($hash, "landevice/landevice/" . $val[0], '{"device_class_user":"' . $dc_user . '","friendly_name":"' . $friendlyName . '","rrd":"0"}', "put");
+ # Abbruch wenn Fehler beim Lesen der Fritzbox-Antwort
+ if ( defined $result->{Error} || defined $result->{AuthorizationRequired}) {
+ FRITZBOX_Log $hash, 2, "locklandevice: $dev_name " . $result->{Error};
+ FRITZBOX_Readout_Add_Reading $hash, \@roReadings, "retStat_lockLandevice", $val[1] . "->ERROR: $dev_name " . $result->{Error};
+ FRITZBOX_Readout_Response($hash, $result, \@roReadings, 2);
+ }
+
+ FRITZBOX_write_javaScript($defs{FritzBox},"user/user/" . $user_ctrl, '{"disallowed":"1"}', "put");
+ } else {
+ FRITZBOX_write_javaScript($defs{FritzBox},"user/user", '{"filter_profile_UID":"' . $fp_uid . '","landeviceUID":"' . $val[0] . '","disallowed":"1","type":"1"}', "post");
+ }
+ # Abbruch wenn Fehler beim Lesen der Fritzbox-Antwort
+ if ( defined $result->{Error} || defined $result->{AuthorizationRequired}) {
+ FRITZBOX_Log $hash, 2, "locklandevice: $friendlyName " . $result->{Error};
+ FRITZBOX_Readout_Add_Reading $hash, \@roReadings, "retStat_lockLandevice", $val[1] . "->ERROR: $friendlyName " . $result->{Error};
+ FRITZBOX_Readout_Response($hash, $result, \@roReadings, 2);
+ }
+
+ $sidNew += $result->{sidNew} if defined $result->{sidNew};
+
+ FRITZBOX_Log $hash, 4, "locklandevice: " . $friendlyName . " disallowed activated";
+ FRITZBOX_Readout_Add_Reading $hash, \@roReadings, "retStat_lockLandevice", $friendlyName . " disallowed activated";
+
+ } elsif ( $val[1] eq "rt") {
+
+ #FRITZBOX_write_javaScript($defs{FritzBox},"user/user", '{"filter_profile_UID":"' . $fp_uid .'","landeviceUID":"' . $val[0] . '","disallowed":"0","type":"1"}', "post");
+
+ FRITZBOX_write_javaScript($defs{FritzBox},"trafficprio/user", '{"ip":"' . $ip . '", "mac":"' . $mac . '","type":"1"}', "post");
+ # Abbruch wenn Fehler beim Lesen der Fritzbox-Antwort
+ if ( defined $result->{Error} || defined $result->{AuthorizationRequired}) {
+ FRITZBOX_Log $hash, 2, "locklandevice: $friendlyName " . $result->{Error};
+ FRITZBOX_Readout_Add_Reading $hash, \@roReadings, "retStat_lockLandevice", $val[1] . "->ERROR: $friendlyName " . $result->{Error};
+ FRITZBOX_Readout_Response($hash, $result, \@roReadings, 2);
+ }
+
+ $sidNew += $result->{sidNew} if defined $result->{sidNew};
+
+ FRITZBOX_Log $hash, 4, "locklandevice: " . $friendlyName . " priority activated";
+ FRITZBOX_Readout_Add_Reading $hash, \@roReadings, "retStat_lockLandevice", $friendlyName . " priority activated";
+
+ }
+
+ FRITZBOX_Readout_Add_Reading $hash, \@roReadings, "readoutTime", sprintf( "%.2f", time()-$startTime);
+ return FRITZBOX_Readout_Response($hash, $result, \@roReadings, 2, $sidNew);
+
+} # end FRITZBOX_Set_lock_Landevice_OnOffRt_8
+
#######################################################################
sub FRITZBOX_Set_lock_Landevice_OnOffRt($)
{
@@ -8139,7 +9269,7 @@ sub FRITZBOX_Set_lock_Landevice_OnOffRt($)
$sidNew += $lock_res->{sidNew} if defined $lock_res->{sidNew};
- FRITZBOX_Log $hash, 5, "\n" . Dumper $lock_res;
+ FRITZBOX_Log $hash, 5, "\n" . Dumper($lock_res);
unless ($lock_res->{data}->{vars}->{dev}->{netAccess}->{kisi}->{selectedRights}->{msgid}) {
@@ -8156,7 +9286,7 @@ sub FRITZBOX_Set_lock_Landevice_OnOffRt($)
FRITZBOX_Log $hash, 4, "get $name $cmd " . join(" ", @webCmdArray);
# Anforderung umsetzen
- my $result = FRITZBOX_read_LuaData($hash, "data", \@webCmdArray);
+ my $result = FRITZBOX_call_LuaData($hash, "data", \@webCmdArray);
# Abbruch wenn Fehler beim Lesen der Fritzbox-Antwort
if ( defined $result->{Error} || defined $result->{AuthorizationRequired}) {
@@ -8191,7 +9321,7 @@ sub FRITZBOX_Set_lock_Landevice_OnOffRt($)
$sidNew += $lock_res->{sidNew} if defined $lock_res->{sidNew};
- FRITZBOX_Log $hash, 5, "\n" . Dumper $lock_res;
+ FRITZBOX_Log $hash, 5, "\n" . Dumper($lock_res);
unless ($lock_res->{data}->{vars}->{dev}->{netAccess}->{kisi}->{selectedRights}->{msgid}) {
@@ -8218,7 +9348,7 @@ sub FRITZBOX_Set_lock_Landevice_OnOffRt($)
}
FRITZBOX_Readout_Add_Reading $hash, \@roReadings, "readoutTime", sprintf( "%.2f", time()-$startTime);
- return FRITZBOX_Readout_Response($hash, $result, \@roReadings, 2);
+ return FRITZBOX_Readout_Response($hash, $result, \@roReadings, 2, $sidNew);
} # end FRITZBOX_Set_lock_Landevice_OnOffRt
@@ -8259,7 +9389,7 @@ sub FRITZBOX_Set_call_Phone($)
else {
my $msg = "ERROR (set call): TR064 SECPORT not available for calling ";
FRITZBOX_Log $hash, 2, $msg;
- return $name . "|0|" . $msg
+ return $name . "|0|" . $msg;
}
FRITZBOX_Log $hash, 4, "waiting";
@@ -8564,7 +9694,7 @@ sub FRITZBOX_Get_MobileInfo($) {
push @webCmdArray, "page" => "mobile";
push @webCmdArray, "xhrId" => "all";
- my $result = FRITZBOX_read_LuaData($hash, "data", \@webCmdArray) ;
+ my $result = FRITZBOX_call_LuaData($hash, "data", \@webCmdArray) ;
return $result if($hash->{helper}{gFilters});
@@ -8876,7 +10006,7 @@ sub FRITZBOX_Get_WLAN_globalFilters($) {
my $returnStr;
- my $result = FRITZBOX_read_LuaData($hash, "data", \@webCmdArray) ;
+ my $result = FRITZBOX_call_LuaData($hash, "data", \@webCmdArray) ;
return $result if($hash->{helper}{gFilters});
@@ -8958,7 +10088,7 @@ sub FRITZBOX_Get_LED_Settings($) {
my $returnStr;
- my $result = FRITZBOX_read_LuaData($hash, "data", \@webCmdArray) ;
+ my $result = FRITZBOX_call_LuaData($hash, "data", \@webCmdArray) ;
return $result if($hash->{helper}{ledSet});
@@ -9048,7 +10178,7 @@ sub FRITZBOX_Get_VPN_Shares_List($) {
my $returnStr;
- my $result = FRITZBOX_read_LuaData($hash, "data", \@webCmdArray) ;
+ my $result = FRITZBOX_call_LuaData($hash, "data", \@webCmdArray) ;
my $analyse = FRITZBOX_Helper_analyse_Lua_Result($hash, $result);
@@ -9159,7 +10289,7 @@ sub FRITZBOX_Get_VPN_Shares_List($) {
push @webCmdArray, "page" => "shareWireguard";
push @webCmdArray, "xhrId" => "all";
- $result = FRITZBOX_read_LuaData($hash, "data", \@webCmdArray) ;
+ $result = FRITZBOX_call_LuaData($hash, "data", \@webCmdArray) ;
$analyse = FRITZBOX_Helper_analyse_Lua_Result($hash, $result);
@@ -9217,7 +10347,7 @@ sub FRITZBOX_Get_DOCSIS_Informations($) {
my $returnStr;
- my $result = FRITZBOX_read_LuaData($hash, "data", \@webCmdArray) ;
+ my $result = FRITZBOX_call_LuaData($hash, "data", \@webCmdArray) ;
my $analyse = FRITZBOX_Helper_analyse_Lua_Result($hash, $result);
@@ -9411,7 +10541,7 @@ sub FRITZBOX_Get_WLAN_Environment($) {
my $returnStr;
- my $result = FRITZBOX_read_LuaData($hash, "data", \@webCmdArray) ;
+ my $result = FRITZBOX_call_LuaData($hash, "data", \@webCmdArray) ;
my $analyse = FRITZBOX_Helper_analyse_Lua_Result($hash, $result);
@@ -9466,10 +10596,22 @@ sub FRITZBOX_Get_WLAN_Environment($) {
# get list of SmartHome Devices
############################################
+# Test: { Dumper FRITZBOX_Get_SmartHome_Devices_List($defs{"FritzBox"}, "17", "test")}
+# Save: { FRITZBOX_Get_SmartHome_Devices_List($defs{"FritzBox"}, "17", "save")}
+# Read: { FRITZBOX_Get_SmartHome_Devices_List($defs{"FritzBox"}, "17", "read")}
+#
+# Test: { FRITZBOX_Get_SmartHome_Devices_List($defs{"FB6660"}, "16", "test")}
+#
+# xhr 1 lang de page sh_dev xhrId all
+# { FRITZBOX_Get_SmartHome_Devices_List($defs{"FritzBox"}, "17")}
+
sub FRITZBOX_Get_SmartHome_Devices_List($@) {
- my ($hash, $devID, $table) = @_;
+ my ($hash, $devID, $command, $preName) = @_;
+
my $name = $hash->{NAME};
+ $command ||= "read";
+ $preName ||= "default";
my $returnStr;
my $views;
@@ -9478,20 +10620,22 @@ sub FRITZBOX_Get_SmartHome_Devices_List($@) {
FRITZBOX_Log $hash, 4, "FRITZBOX_SmartHome_Device_List (Fritz!OS: $hash->{fhem}{fwVersionStr}) ";
my @webCmdArray;
- # "xhr 1 lang de page sh_dev xhrId all;
+ # xhr 1 lang de page sh_dev xhrId all
+ # xhr 1 master 17 device 17 page home_auto_edit_view
+
push @webCmdArray, "xhr" => "1";
push @webCmdArray, "lang" => "de";
push @webCmdArray, "page" => "sh_dev";
push @webCmdArray, "xhrId" => "all";
- my $result = FRITZBOX_read_LuaData($hash, "data", \@webCmdArray) ;
+ my $result = FRITZBOX_call_LuaData($hash, "data", \@webCmdArray) ;
my $analyse = FRITZBOX_Helper_analyse_Lua_Result($hash, $result);
- if ($devID) {
+ if ($devID && $command =~ /read|save|test/) {
if ( $analyse =~ /ERROR/) {
- FRITZBOX_Log $hash, 2, "evaluating user info -> " . $analyse;
+ FRITZBOX_Log $hash, 2, "getting smart home info -> " . $analyse;
my %retHash = ("Error" => $returnStr, "Info" => $analyse);
return \%retHash;
}
@@ -9503,36 +10647,120 @@ sub FRITZBOX_Get_SmartHome_Devices_List($@) {
my $skills;
my $allTimeSchedules;
my $timeSchedule;
- my $debug = "";
my %ret;
+ my %ret1;
# find entry for requested devID
for my $i (0 .. @{$devData} - 1) {
if( $devData->[$i]{'id'} eq $devID ) {
- $ret{device} = $devID;
- $ret{ule_device_name} = $devData->[$i]{'displayName'};
+ $ret{device_name_category} = $devData->[$i]{'category'}; # if $command =~ /test/;
+ $ret{device_web_site} = "GENERAL";
+ $ret{device} = $devID;
+
+ my $isSocket = $devData->[$i]{'category'} eq "SOCKET";
+
+ unless ( $isSocket) {
+
+ $ret{ule_device_name} = $devData->[$i]{'displayName'};
+
+ if( $devData->[$i]{'pushService'}{'isEnabled'} ) {
+ $ret{enabled} = "on";
+ $ret{mailto} = $devData->[$i]{'pushService'}{'mailAddress'};
+ $ret{mail_type} = $ret{mailto} eq "default" ? "custom" : "";
+ }
+
+ } else {
+
+ @webCmdArray = ();
+ # xhr 1 lang de page sh_dev xhrId all
+ # xhr 1 master 17 device 17 page home_auto_edit_view
+
+ push @webCmdArray, "xhr" => "1";
+ push @webCmdArray, "lang" => "de";
+ push @webCmdArray, "master" => $devID;
+ push @webCmdArray, "device" => $devID;
+ push @webCmdArray, "page" => "home_auto_edit_view";
+
+ my $result1 = FRITZBOX_call_LuaData($hash, "data", \@webCmdArray) ;
+
+ FRITZBOX_Log $hash, 5, "getting smart home info -> " . Dumper($result1);
+
+ my $analyse1 = FRITZBOX_Helper_analyse_Lua_Result($hash, $result);
+
+ if ( $analyse1 =~ /ERROR/) {
+ FRITZBOX_Log $hash, 2, "getting smart home info -> " . $analyse1;
+ my %retHash = ("Error" => $returnStr, "Info" => $analyse1);
+ return \%retHash;
+ }
+
+ foreach (keys %{ $result1->{'data'}{'smartoptions'} }) {
+ $ret1{$_} = $result1->{'data'}{'smartoptions'}{$_};
+ }
+
+ $ret1{device_name_category} = "SOCKET";
+ $ret1{device_web_site} = "GENERAL";
+
+# $ret1{ule_device_name} = $result1->{'data'}{'smartoptions'}{'ule_device_name'};
+# $ret1{led_active} = $result1->{'data'}{'smartoptions'}{'led_active'};
+# $ret1{ule_device_acdc_rate} = $result1->{'data'}{'smartoptions'}{'ule_device_acdc_rate'};
+# $ret1{ule_device_co2_emission} = $result1->{'data'}{'smartoptions'}{'ule_device_co2_emission'};
+# $ret1{ShowEnergyStat} = $result1->{'data'}{'smartoptions'}{'ShowEnergyStat'};
+# $ret1{switch_default_state} = $result1->{'data'}{'smartoptions'}{'switch_default_state'};
+# $ret1{manuell_switch_active_local} = $result1->{'data'}{'smartoptions'}{'manuell_switch_active_local'};
+# $ret1{manuell_switch_active_uiapp} = $result1->{'data'}{'smartoptions'}{'manuell_switch_active_uiapp'};
+# $ret1{mail_type} = $result1->{'data'}{'smartoptions'}{'mail_type'};
+# $ret1{interval} = $result1->{'data'}{'smartoptions'}{'interval'};
+
+# $ret1{Offset} = $result1->{'data'}{'smartoptions'}{'Offset'} if exists $result1->{'data'}{'smartoptions'}{'Offset'};
+
+# if( exists $result1->{'data'}{'smartoptions'}{'enabled'} && $result1->{'data'}{'smartoptions'}{'enabled'} ) {
+# $ret1{enabled} = "on";
+# $ret1{mailto} = $result1->{'data'}{'smartoptions'}{'mailto'};
+# $ret1{ShowEnergyStat} = $result1->{'data'}{'smartoptions'}{'ShowEnergyStat'};
+# $ret1{periodic} = $result1->{'data'}{'smartoptions'}{'periodic'};
+# $ret1{TriggerSwitchChange} = $result1->{'data'}{'smartoptions'}{'TriggerSwitchChange'} if $result1->{'data'}{'smartoptions'}{'TriggerSwitchChange'};
+# }
- if( $devData->[$i]{'pushService'}{'isEnabled'} ) {
- $ret{enabled} = "on";
- $ret{mailto} = $devData->[$i]{'pushService'}{'mailAddress'};
}
# find needed unit
$unitData = $devData->[$i]{'units'};
+
for my $j (0 .. scalar @{$unitData} - 1) {
my $unitData = $unitData->[$j];
- if( $unitData->{'type'} eq 'THERMOSTAT' ) {
+ # Steckdosen
+ if( $unitData->{'type'} eq 'THERMOSTAT' && $isSocket ) {
+
+ my $interactionControls = $unitData->{'interactionControls'};
+ for my $i ( 0 .. 1 ) {
+ if( $interactionControls->[$i]{'isLocked'} ) {
+ $ret1{manuell_switch_active_local} = $interactionControls->[$i]{'isLocked'} if( $interactionControls->[$i]{'devControlName'} eq 'BUTTON' );
+ $ret1{manuell_switch_active_uiapp} = $interactionControls->[$i]{'isLocked'} if( $interactionControls->[$i]{'devControlName'} eq 'EXTERNAL' );
+ }
+ }
+
+ $skills = $unitData->{'skills'}[1];
+ $ret1{'led_active'} = $skills->{ledState} eq "ON" ? 1 : 0;
+ $ret1{'switch_default_state'} = 0 if $skills->{powerLossOption} eq "OFF";
+ $ret1{'switch_default_state'} = 1 if $skills->{powerLossOption} eq "ON";
+ $ret1{'switch_default_state'} = 2 if $skills->{powerLossOption} eq "LAST";
+
+ # Heizkörperthermostate
+ } elsif( $unitData->{'type'} eq 'THERMOSTAT' && !$isSocket ) {
+
$skills = $unitData->{'skills'}[0];
+
# parse preset temperatures ...
my $presets = $skills->{'presets'};
+
# ... and lock status
my $interactionControls = $unitData->{'interactionControls'};
for my $i ( 0 .. 1 ) {
- $ret{Absenktemp} = $presets->[$i]{'temperature'} if( $presets->[$i]{'name'} eq 'LOWER_TEMPERATURE' );
- $ret{Heiztemp} = $presets->[$i]{'temperature'} if( $presets->[$i]{'name'} eq 'UPPER_TEMPERATURE' );
+ $ret{Absenktemp} = $presets->[$i]{'temperature'} if( $presets->[$i]{'name'} eq 'LOWER_TEMPERATURE' );
+ $ret{Heiztemp} = $presets->[$i]{'temperature'} if( $presets->[$i]{'name'} eq 'UPPER_TEMPERATURE' );
if( $interactionControls->[$i]{'isLocked'} ) {
$ret{locklocal} = "on" if( $interactionControls->[$i]{'devControlName'} eq 'BUTTON' );
@@ -9540,10 +10768,10 @@ sub FRITZBOX_Get_SmartHome_Devices_List($@) {
}
}
- $ret{hkr_adaptheat} = ( ( $skills->{'adaptivHeating'}{'isEnabled'} ) ? 1 : 0 );
- $ret{ExtTempsensorID} = $skills->{'usedTempSensor'}{'id'};
+ $ret{hkr_adaptheat} = ( ( $skills->{'adaptivHeating'}{'isEnabled'} ) ? 1 : 0 );
+ $ret{ExtTempsensorID} = $skills->{'usedTempSensor'}{'id'};
$ret{WindowOpenTrigger} = $skills->{'temperatureDropDetection'}{'sensitivity'};
- $ret{WindowOpenTimer} = $skills->{'temperatureDropDetection'}{'doNotHeatOffsetInMinutes'};
+ $ret{WindowOpenTimer} = $skills->{'temperatureDropDetection'}{'doNotHeatOffsetInMinutes'};
# find needed time schedule
$allTimeSchedules = $skills->{'timeControl'}{'timeSchedules'};
@@ -9562,8 +10790,6 @@ sub FRITZBOX_Get_SmartHome_Devices_List($@) {
my %timerItem;
my $newItem = 1;
- $debug = "$debug $i $startTime $temperature $dayOfWeek => ";
-
$startTime =~ s/([0-9]{2}):([0-9]{2}):([0-9]{2})/$1$2/;
$temperature = ( ( $temperature eq $ret{Heiztemp} ) ? 1 : 0 );
$dayOfWeek = $dayOfWeekMap->{$dayOfWeek};
@@ -9584,13 +10810,12 @@ sub FRITZBOX_Get_SmartHome_Devices_List($@) {
push( @timerItems, \%timerItem );
}
- $debug = "$debug $startTime;$temperature;$dayOfWeek \n";
}
my $j = 0;
+
foreach (@timerItems) {
$ret{"timer_item_$j"} = $_->{'startTime'}.';'.$_->{'temperature'}.';'.$_->{'dayOfWeek'};
- $debug = "$debug $_->{'startTime'};;$_->{'temperature'};;$_->{'dayOfWeek'} \n";
$j ++;
}
@@ -9650,20 +10875,446 @@ sub FRITZBOX_Get_SmartHome_Devices_List($@) {
}
}
- } elsif ( $unitData->{'type'} eq 'TEMPERATURE_SENSOR' ) {
- $skills = $unitData->{'skills'}[0];
+ # Temperatursensor
+ } elsif ( $unitData->{'type'} eq 'TEMPERATURE_SENSOR' && !$isSocket ) {
+
+ $skills = $unitData->{'skills'}[0];
$ret{Offset} = $skills->{'offset'};
$ret{Roomtemp} = $skills->{'currentInCelsius'};
$ret{tempsensor} = $ret{Roomtemp} - $ret{Offset};
+
+ # Luftfeuchtesensor
+ } elsif ( $unitData->{'type'} eq 'HUMIDITY_SENSOR' && !$isSocket ) {
+
+ $skills = $unitData->{'skills'}[0];
+ $ret{Roomhum} = $skills->{'currentInPercent'};
+
+ # Mikrofon in Smart-Steckdose
+ } elsif( $unitData->{'type'} eq 'MICROPHONE' ) {
+
+ $ret{device_web_site} = "AUTOMATION";
+ $skills = $unitData->{'skills'}[0];
+
+ if ($skills->{'isEnabled'}) {
+ $ret{"soundswitch"} = $skills->{'isEnabled'} ? "on" : "off";
+
+ # find needed time schedule
+ $allTimeSchedules = $skills->{'timeControl'}{'timeSchedules'};
+
+ Log3 $name, 4, "allTimeSchedules:\n" . Dumper($allTimeSchedules);
+
+ for my $ts (0 .. scalar @{$allTimeSchedules} - 1) {
+ Log3 $name, 3, "kind[$ts]: " . $allTimeSchedules->[$ts]{'kind'};
+
+ if( $allTimeSchedules->[$ts]{'kind'} eq 'COUNTDOWN' ) {
+
+ $ret{"soundswitchstate"} = $allTimeSchedules->[$ts]{'isEnabled'} ? "custom" : "permanent";
+ $ret{"soundswitch_actionresettime"} = $allTimeSchedules->[$ts]{'actions'}[0]{'timeSetting'}{'durationInSeconds'} / 60;
+
+ } elsif( $allTimeSchedules->[$ts]{'kind'} eq 'REPETITIVE' ) {
+
+ if ($allTimeSchedules->[$ts]{'isEnabled'}) {
+ $ret{"soundswitch_date_enabled"} = $allTimeSchedules->[$ts]{'isEnabled'} == 1 ? "on" : "off";
+
+ $ret{"soundswitch_start_day"} = $allTimeSchedules->[$ts]{'actions'}[0]{'timeSetting'}{'startDate'};
+ $ret{"soundswitch_start_day"} =~ s/([0-9]{4})-([0-9]{2})-([0-9]{2})/$3/;
+ $ret{"soundswitch_start_month"} = $allTimeSchedules->[$ts]{'actions'}[0]{'timeSetting'}{'startDate'};
+ $ret{"soundswitch_start_month"} =~ s/([0-9]{4})-([0-9]{2})-([0-9]{2})/$2/;
+ $ret{"soundswitch_start_year"} = $allTimeSchedules->[$ts]{'actions'}[0]{'timeSetting'}{'startDate'};
+ $ret{"soundswitch_start_year"} =~ s/([0-9]{4})-([0-9]{2})-([0-9]{2})/$1/;
+
+ $ret{"soundswitch_start_hh"} = $allTimeSchedules->[$ts]{'actions'}[0]{'timeSetting'}{'startTime'};
+ $ret{"soundswitch_start_hh"} =~ s/([0-9]{2}):([0-9]{2}):([0-9]{2})/$1/;
+ $ret{"soundswitch_start_mm"} = $allTimeSchedules->[$ts]{'actions'}[0]{'timeSetting'}{'startTime'};
+ $ret{"soundswitch_start_mm"} =~ s/([0-9]{2}):([0-9]{2}):([0-9]{2})/$2/;
+
+ $ret{"soundswitch_end_day"} = $allTimeSchedules->[$ts]{'actions'}[0]{'timeSetting'}{'endDate'};
+ $ret{"soundswitch_end_day"} =~ s/([0-9]{4})-([0-9]{2})-([0-9]{2})/$3/;
+ $ret{"soundswitch_end_month"} = $allTimeSchedules->[$ts]{'actions'}[0]{'timeSetting'}{'endDate'};
+ $ret{"soundswitch_end_month"} =~ s/([0-9]{4})-([0-9]{2})-([0-9]{2})/$2/;
+ $ret{"soundswitch_end_year"} = $allTimeSchedules->[$ts]{'actions'}[0]{'timeSetting'}{'endDate'};
+ $ret{"soundswitch_end_year"} =~ s/([0-9]{4})-([0-9]{2})-([0-9]{2})/$1/;
+
+ $ret{"soundswitch_end_hh"} = $allTimeSchedules->[$ts]{'actions'}[0]{'timeSetting'}{'endTime'};
+ $ret{"soundswitch_end_hh"} =~ s/([0-9]{2}):([0-9]{2}):([0-9]{2})/$1/;
+ $ret{"soundswitch_end_mm"} = $allTimeSchedules->[$ts]{'actions'}[0]{'timeSetting'}{'endTime'};
+ $ret{"soundswitch_end_mm"} =~ s/([0-9]{2}):([0-9]{2}):([0-9]{2})/$2/;
+ }
+ }
+
+ }
+
+ if ($skills->{'event'}) {
+ $ret{"soundswitchaction"} = 0 if $skills->{'event'}{'description'}{'action'} eq "SET_OFF";
+ $ret{"soundswitchaction"} = 1 if $skills->{'event'}{'description'}{'action'} eq "SET_ON";
+ $ret{"soundswitchaction"} = 2 if $skills->{'event'}{'description'}{'action'} eq "TOGGLE";
+ }
+
+ if ($skills->{'trigger'}) {
+ $ret{"soundswitchrule"} = "clap" if $skills->{'trigger'}{'details'}{'type'} eq "SmartHomeClapping";
+ $ret{"soundswitchrule"} = "free" if $skills->{'trigger'}{'details'}{'type'} eq "SmartHomeSound";
+ $ret{"soundswitch_intensity"} = $skills->{'trigger'}{'details'}{'intensity'};
+
+ $ret{"soundswitchrule_free_freq-min"} = ($skills->{'trigger'}{'details'}{'lowerFrequencyBoundInHz'} - 125) / 62.5;
+ $ret{"soundswitchrule_free_freq-max"} = ($skills->{'trigger'}{'details'}{'higherFrequencyBoundInHz'} - 125) / 62.5;
+
+ my $milliseconds = $skills->{'trigger'}{'details'}{'signalDurationInMilliseconds'};
+ my $seconds = int($milliseconds / 1000);
+ my $minutes = int($seconds / 60);
+
+ $seconds = $seconds % 60;
+ $milliseconds = $milliseconds % 1000;
+
+ $ret{"soundswitch_signal_duration_min"} = $minutes;
+ $ret{"soundswitch_signal_duration_sec"} = $seconds;
+ $ret{"soundswitch_signal_duration_millisec"} = $milliseconds;
+ $ret{"soundswitchrulefreetype"} = $skills->{'trigger'}{'details'}{'event'} eq "SILENCE" ? 0 : 1;
+
+ }
+ }
+
+ # Socket
+ } elsif( $unitData->{'type'} eq 'SOCKET' ) {
+
+ $ret{device_web_site} = "AUTOMATION";
+ $skills = $unitData->{'skills'}[1];
+
+ if ( $skills->{'standby'} ) {
+
+ if ($skills->{'standby'}{'isEnabled'}) {
+ $ret{"standby"} = $skills->{'standby'}{'isEnabled'} ? "on" : "off";
+ $ret{"stand_by_duration"} = $skills->{'standby'}{'seconds'} / 60;
+ $ret{"stand_by_power"} = $skills->{'standby'}{'powerInWatt'} * 10;
+ } else {
+ $ret{"stand_by_power"} = "";
+ $ret{"stand_by_duration"} = "";
+ }
+
+ }
+
+ $skills = $unitData->{'skills'}[2];
+
+ Log3 $name, 4, "unitData->displayName: " . $unitData->{'displayName'};
+ Log3 $name, 4, "skills->type: " . $skills->{'type'};
+
+ $ret{"switchautomatic"} = "on" if $skills->{'timeControl'}{'isEnabled'}; # ? "on" : "off";
+ $ret{"graphState"} = 1;
+
+ $ret{"countdown_off_hh"} = 0;
+ $ret{"countdown_off_mm"} = 0;
+ $ret{"countdown_onoff"} = 0;
+
+ $ret{"timer_item_0"} = "0730;1;127";
+ $ret{"timer_item_1"} = "1830;0;127";
+ $ret{"switchtimer"} = "weekly";
+
+ # find needed time schedule
+ $allTimeSchedules = $skills->{'timeControl'}{'timeSchedules'};
+
+ Log3 $name, 4, "allTimeSchedules:\n" . Dumper($allTimeSchedules);
+
+
+
+ for my $ts (0 .. scalar @{$allTimeSchedules} - 1) {
+
+ Log3 $name, 4, "kind[$ts]: " . $allTimeSchedules->[$ts]{'kind'};
+
+ # parse weekly timetable
+ if( $allTimeSchedules->[$ts]{'kind'} eq 'WEEKLY_TIMETABLE') {
+
+ $ret{"switchtimer"} = "weekly" if $allTimeSchedules->[$ts]{'isEnabled'};
+
+ $timeSchedule = $allTimeSchedules->[$ts]{'actions'};
+ my $NumEntries = scalar @{$timeSchedule};
+ my @timerItems = ();
+
+ for my $i (0 .. $NumEntries - 1) {
+ my $startTime = $timeSchedule->[$i]{'timeSetting'}{'startTime'};
+ my $dayOfWeek = $timeSchedule->[$i]{'timeSetting'}{'dayOfWeek'};
+ my $action = $timeSchedule->[$i]{'description'}{'action'};
+ my $isEnabled = $timeSchedule->[$i]{'isEnabled'};
+ my %timerItem;
+ my $newItem = 1;
+
+ $startTime =~ s/([0-9]{2}):([0-9]{2}):([0-9]{2})/$1$2/;
+ $dayOfWeek = $dayOfWeekMap->{$dayOfWeek};
+
+ foreach (@timerItems) {
+ if ($_->{'startTime'} == $startTime && $_->{'action'} eq $action) {
+ $_->{'dayOfWeek'} += $dayOfWeek;
+ $newItem = 0;
+ last;
+ }
+ }
+
+ if( $newItem ) {
+ $timerItem{'startTime'} = $startTime;
+ $timerItem{'dayOfWeek'} = $dayOfWeek;
+ $timerItem{'action'} = $action;
+ $timerItem{'isEnabled'} = $isEnabled;
+ push( @timerItems, \%timerItem );
+ }
+
+ }
+
+ if (@timerItems > 0) {
+ my $j = 0;
+ foreach (@timerItems) {
+ $ret{"timer_item_$j"} = $_->{'startTime'}.';' . ($_->{'action'} eq "SET_ON" ? 1 : 0) . ';' . $_->{'dayOfWeek'};
+ $j ++;
+ }
+ } else {
+ $ret{"timer_item_0"} = "0730;1;127";
+ $ret{"timer_item_1"} = "1830;0;127";
+ }
+
+ } elsif( $allTimeSchedules->[$ts]{'kind'} eq 'REPETITIVE') {
+
+ $ret{"switchtimer"} = "weekly" if $allTimeSchedules->[$ts]{'isEnabled'};
+
+ my $startTime = $allTimeSchedules->[$ts]{'actions'}[0]{'timeSetting'}{'startTime'};
+ my $endTime = $allTimeSchedules->[$ts]{'actions'}[1]{'timeSetting'}{'startTime'};
+
+ $ret{"daily_from_hh"} = $startTime;
+ $ret{"daily_from_hh"} =~ s/([0-9]{2}):([0-9]{2}):([0-9]{2})/$1/;
+ $ret{"daily_from_mm"} = $startTime;
+ $ret{"daily_from_mm"} =~ s/([0-9]{2}):([0-9]{2}):([0-9]{2})/$2/;
+
+ $ret{"daily_on"} = $allTimeSchedules->[$ts]{'actions'}[0]{'description'}{action} eq 'SET_ON' ? 1 : 0;
+
+ $ret{"daily_to_hh"} = $endTime;
+ $ret{"daily_to_hh"} =~ s/([0-9]{2}):([0-9]{2}):([0-9]{2})/$1/;
+ $ret{"daily_to_mm"} = $endTime;
+ $ret{"daily_to_mm"} =~ s/([0-9]{2}):([0-9]{2}):([0-9]{2})/$2/;
+
+ $ret{"daily_off"} = $allTimeSchedules->[$ts]{'actions'}[1]{'description'}{action} eq 'SET_OFF' ? 1 : 0;
+
+ } elsif( $allTimeSchedules->[$ts]{'kind'} eq 'RANDOM' ) {
+
+ $ret{"switchtimer"} = "zufall" if $allTimeSchedules->[$ts]{'isEnabled'};
+
+ my $startDate = $allTimeSchedules->[$ts]{'actions'}[0]{'timeSetting'}{'startDate'};
+ my $startTime = $allTimeSchedules->[$ts]{'actions'}[0]{'timeSetting'}{'startTime'};
+ my $endDate = $allTimeSchedules->[$ts]{'actions'}[0]{'timeSetting'}{'endDate'};
+ my $endTime = $allTimeSchedules->[$ts]{'actions'}[0]{'timeSetting'}{'endTime'};
+ my $duration = $allTimeSchedules->[$ts]{'actions'}[0]{'timeSetting'}{'durationInSeconds'} / 60;
+
+ $ret{"zufall_from_day"} = $startDate;
+ $ret{"zufall_from_day"} =~ s/([0-9]{4})-([0-9]{2})-([0-9]{2})/$3/;
+ $ret{"zufall_from_month"} = $startDate;
+ $ret{"zufall_from_month"} =~ s/([0-9]{4})-([0-9]{2})-([0-9]{2})/$2/;
+ $ret{"zufall_from_year"} = $startDate;
+ $ret{"zufall_from_year"} =~ s/([0-9]{4})-([0-9]{2})-([0-9]{2})/$1/;
+
+ $ret{"zufall_to_day"} = $endDate;
+ $ret{"zufall_to_day"} =~ s/([0-9]{4})-([0-9]{2})-([0-9]{2})/$3/;
+ $ret{"zufall_to_month"} = $endDate;
+ $ret{"zufall_to_month"} =~ s/([0-9]{4})-([0-9]{2})-([0-9]{2})/$2/;
+ $ret{"zufall_to_year"} = $endDate;
+ $ret{"zufall_to_year"} =~ s/([0-9]{4})-([0-9]{2})-([0-9]{2})/$1/;
+
+ $ret{"zufall_from_hh"} = $startTime;
+ $ret{"zufall_from_hh"} =~ s/([0-9]{2}):([0-9]{2}):([0-9]{2})/$1/;
+ $ret{"zufall_from_mm"} = $startTime;
+ $ret{"zufall_from_mm"} =~ s/([0-9]{2}):([0-9]{2}):([0-9]{2})/$2/;
+
+ $ret{"zufall_to_hh"} = $endTime;
+ $ret{"zufall_to_hh"} =~ s/([0-9]{2}):([0-9]{2}):([0-9]{2})/$1/;
+ $ret{"zufall_to_mm"} = $endTime;
+ $ret{"zufall_to_mm"} =~ s/([0-9]{2}):([0-9]{2}):([0-9]{2})/$2/;
+
+ $ret{"zufall_duration"} = $duration;
+
+ } elsif( $allTimeSchedules->[$ts]{'kind'} eq 'COUNTDOWN' ) {
+
+ $ret{"switchtimer"} = "countdown" if $allTimeSchedules->[$ts]{'isEnabled'};
+
+ my $hms = strftime('%T', gmtime($allTimeSchedules->[$ts]{'actions'}[0]{'timeSetting'}{'durationInSeconds'}));
+
+ if ( $allTimeSchedules->[$ts]{'actions'}[0]{'description'}{'action'} eq "SET_OFF") {
+
+ $ret{"countdown_off_hh"} = $hms;
+ $ret{"countdown_off_hh"} =~ s/([0-9]{2}):([0-9]{2}):([0-9]{2})/$1/;
+ $ret{"countdown_off_mm"} = $hms;
+ $ret{"countdown_off_mm"} =~ s/([0-9]{2}):([0-9]{2}):([0-9]{2})/$2/;
+ $ret{"countdown_onoff"} = 0;
+
+ } else {
+
+ $ret{"countdown_on_hh"} = $hms;
+ $ret{"countdown_on_hh"} =~ s/([0-9]{2}):([0-9]{2}):([0-9]{2})/$1/;
+ $ret{"countdown_on_mm"} = $hms;
+ $ret{"countdown_on_mm"} =~ s/([0-9]{2}):([0-9]{2}):([0-9]{2})/$2/;
+ $ret{"countdown_onoff"} = 1;
+
+ }
+
+ } elsif( $allTimeSchedules->[$ts]{'kind'} eq 'PATTERN_REPETITION' ) {
+
+ $ret{"switchtimer"} = "rythmisch" if $allTimeSchedules->[$ts]{'isEnabled'};
+
+ $ret{"rythmisch_off"} = $allTimeSchedules->[$ts]{'actions'}[1]{'timeSetting'}{'durationInSeconds'} / 60;
+ $ret{"rythmisch_on"} = $allTimeSchedules->[$ts]{'actions'}[0]{'timeSetting'}{'durationInSeconds'} / 60;
+
+ } elsif( $allTimeSchedules->[$ts]{'kind'} eq 'ONCE' ) {
+
+ $ret{"switchtimer"} = "single" if $allTimeSchedules->[$ts]{'isEnabled'};
+
+ my $startDate = $allTimeSchedules->[$ts]{'actions'}[0]{'timeSetting'}{'startDate'};
+ my $startTime = $allTimeSchedules->[$ts]{'actions'}[0]{'timeSetting'}{'startTime'};
+ my $duration = -1;
+
+ $duration = $allTimeSchedules->[$ts]{'actions'}[0]{'timeSetting'}{'durationInSeconds'} / 60 if $allTimeSchedules->[$ts]{'actions'}[0]{'timeSetting'}{'durationInSeconds'};
+
+ $ret{"single_onoff"} = $allTimeSchedules->[$ts]{'actions'}[0]{'description'}{'action'} eq 'SET_ON' ? 1 : 0;
+ $ret{"single_day"} = $startDate;
+ $ret{"single_day"} =~ s/([0-9]{4})-([0-9]{2})-([0-9]{2})/$3/;
+ $ret{"single_month"} = $startDate;
+ $ret{"single_month"} =~ s/([0-9]{4})-([0-9]{2})-([0-9]{2})/$2/;
+ $ret{"single_year"} = $startDate;
+ $ret{"single_year"} =~ s/([0-9]{4})-([0-9]{2})-([0-9]{2})/$1/;
+ $ret{"single_hh"} = $startTime;
+ $ret{"single_hh"} =~ s/([0-9]{2}):([0-9]{2}):([0-9]{2})/$1/;
+ $ret{"single_mm"} = $startTime;
+ $ret{"single_mm"} =~ s/([0-9]{2}):([0-9]{2}):([0-9]{2})/$2/;
+ $ret{"single_duration"} = $duration;
+
+ } elsif( $allTimeSchedules->[$ts]{'kind'} eq 'ASTRONOMICAL_CALENDAR' ) {
+
+ $ret{"switchtimer"} = "sun_calendar" if $allTimeSchedules->[$ts]{'isEnabled'};
+
+ $ret{"longitude"} = $allTimeSchedules->[$ts]{'actions'}[0]{'timeSetting'}{'location'}{'longitude'};
+ $ret{"latitude"} = $allTimeSchedules->[$ts]{'actions'}[0]{'timeSetting'}{'location'}{'latitude'};
+
+ my $posofsun = lc($allTimeSchedules->[$ts]{'name'});
+
+ if (!$allTimeSchedules->[$ts]{'isEnabled'}) {
+
+ $ret{$posofsun."_on_relative"} = "00:00";
+ $ret{$posofsun."_off_relative"} = "00:00";
+ $ret{$posofsun."_off_duration"} = "00:00";
+
+ } else {
+
+ $ret{$posofsun} = $allTimeSchedules->[$ts]{'isEnabled'} == 0 ? "off" : "on"; #: on
+
+ # xhr 1 lang de page sh_dev xhrId all
+ # { Dumper FRITZBOX_Get_SmartHome_Devices_List($defs{"FritzBox"}, "31", "test")}
+
+ if( $allTimeSchedules->[$ts]{'actions'}[0]{'timeSetting'}{'astronomicalEvent'} =~ /SUNRISE|SUNSET/ ) {
+
+ my $hms = strftime('%T', gmtime(abs($allTimeSchedules->[$ts]{'actions'}[0]{'timeSetting'}{'timeOffsetInMinutes'}) * 60));
+
+ $ret{$posofsun."_on_option"} = "relative";
+ $ret{$posofsun."_on_relative0"} = $hms;
+ $ret{$posofsun."_on_relative0"} =~ s/([0-9]{2}):([0-9]{2}):([0-9]{2})/$1/;
+ $ret{$posofsun."_on_relative1"} = $hms;
+ $ret{$posofsun."_on_relative1"} =~ s/([0-9]{2}):([0-9]{2}):([0-9]{2})/$2/;
+ $ret{$posofsun."_on_relative"} = $hms;
+ $ret{$posofsun."_on_relative"} =~ s/([0-9]{2}):([0-9]{2}):([0-9]{2})/$1:$2/;
+ $ret{$posofsun."_on_relative_negative"} = $allTimeSchedules->[$ts]{'actions'}[0]{'timeSetting'}{'timeOffsetInMinutes'} >= 0 ? "false" : "true";
+
+ my $astroEvent = $allTimeSchedules->[$ts]{'actions'}[1]{'timeSetting'}{'astronomicalEvent'};
+
+ if( ($astroEvent =~ /SUNRISE|SUNSET/) && ($astroEvent ne $allTimeSchedules->[$ts]{'name'}) ) {
+
+ $ret{$posofsun."_off_option"} = lc($astroEvent);
+ $ret{$posofsun."_off_relative"} = "00:00";
+ $ret{$posofsun."_off_relative_negative"} = "false";
+ $ret{$posofsun."_off_duration"} = "00:00";
+
+ } elsif( $astroEvent =~ /MANUALLY/ ) {
+
+ if ($allTimeSchedules->[$ts]{'actions'}[1]{'timeSetting'}{'endTime'}) {
+
+ $ret{$posofsun."_off_option"} = "absolute";
+ $ret{$posofsun."_off_absolute"} = $allTimeSchedules->[$ts]{'actions'}[1]{'timeSetting'}{'endTime'};
+ $ret{$posofsun."_off_absolute"} =~ s/([0-9]{2}):([0-9]{2}):([0-9]{2})/$1:$2/;
+ $ret{$posofsun."_off_relative"} = "00:00";
+ $ret{$posofsun."_off_relative_negative"} = "false";
+ $ret{$posofsun."_off_duration"} = "00:00";
+
+ } else {
+
+ $ret{$posofsun."_off_option"} = lc($astroEvent);
+ $ret{$posofsun."_off_relative"} = "00:00";
+ $ret{$posofsun."_off_relative_negative"} = "false";
+ $ret{$posofsun."_off_duration"} = "00:00";
+
+ }
+
+ } elsif( $astroEvent =~ /SUNRISE|SUNSET/ && $astroEvent eq $allTimeSchedules->[$ts]{'name'} ) {
+
+ $hms = strftime('%T', gmtime(
+ ( $allTimeSchedules->[$ts]{'actions'}[1]{'timeSetting'}{'timeOffsetInMinutes'}
+ -
+ $allTimeSchedules->[$ts]{'actions'}[0]{'timeSetting'}{'timeOffsetInMinutes'}
+ ) * 60 ));
+
+ $ret{$posofsun."_off_relative"} = "00:00";
+ $ret{$posofsun."_off_relative_negative"} = "false";
+ $ret{$posofsun."_off_option"} = "duration";
+
+ $ret{$posofsun."_off_duration0"} = $hms;
+ $ret{$posofsun."_off_duration0"} =~ s/([0-9]{2}):([0-9]{2}):([0-9]{2})/$1/;
+ $ret{$posofsun."_off_duration1"} = $hms;
+ $ret{$posofsun."_off_duration1"} =~ s/([0-9]{2}):([0-9]{2}):([0-9]{2})/$2/;
+ $ret{$posofsun."_off_duration"} = $hms;
+ $ret{$posofsun."_off_duration"} =~ s/([0-9]{2}):([0-9]{2}):([0-9]{2})/$1:$2/;
+ }
+
+
+ } elsif( $allTimeSchedules->[$ts]{'actions'}[0]{'timeSetting'}{'astronomicalEvent'} eq "MANUALLY" ) {
+
+ $ret{$posofsun."_on_relative"} = "00:00";
+ $ret{$posofsun."_on_relative_negative"} = "false";
+ $ret{$posofsun."_on_option"} = "absolute";
+ $ret{$posofsun."_on_absolute"} = $allTimeSchedules->[$ts]{'actions'}[0]{'timeSetting'}{'startTime'};
+ $ret{$posofsun."_on_absolute"} =~ s/([0-9]{2}):([0-9]{2}):([0-9]{2})/$1:$2/;
+
+ my $hms = strftime('%T', gmtime(abs($allTimeSchedules->[$ts]{'actions'}[1]{'timeSetting'}{'timeOffsetInMinutes'}) * 60));
+
+ $ret{$posofsun."_off_option"} = "relativ";
+ $ret{$posofsun."_off_relative0"} = $hms;
+ $ret{$posofsun."_off_relative0"} =~ s/([0-9]{2}):([0-9]{2}):([0-9]{2})/$1/;
+ $ret{$posofsun."_off_relative1"} = $hms;
+ $ret{$posofsun."_off_relative1"} =~ s/([0-9]{2}):([0-9]{2}):([0-9]{2})/$2/;
+ $ret{$posofsun."_off_relative"} = $hms;
+ $ret{$posofsun."_off_relative"} =~ s/([0-9]{2}):([0-9]{2}):([0-9]{2})/$1:$2/;
+ $ret{$posofsun."_off_relative_negative"} = $allTimeSchedules->[$ts]{'actions'}[1]{'timeSetting'}{'timeOffsetInMinutes'} >= 0 ? "false" : "true"; #: false
+ $ret{$posofsun."_off_duration"} = "00:00";
+
+ }
+ }
+
+ } elsif( $allTimeSchedules->[$ts]{'kind'} eq 'CALENDAR' ) {
+
+ $ret{"switchtimer"} = "calendar" if $allTimeSchedules->[$ts]{'isEnabled'};
+
+ $ret{"calendarname"} = $allTimeSchedules->[$ts]{'calendar'}{'name'}; #: https://calendar.google.com/calendar/u/0/r?pli=1
+
+ }
+
+ }
+
}
}
last;
}
}
- FRITZBOX_Log $hash, 5, "SmartHome Device info -> ". $debug . "\n" . Dumper(\%ret) if keys(%ret);
- if ($table) {
+ if( keys(%ret) ) {
+
+ FRITZBOX_Log $hash, 5, "SmartHome Device info\n" . Dumper(\%ret) if keys(%ret);
+
+ } else {
+ FRITZBOX_Log $hash, 2, "getting SmartHome Device info -> ID:$devID not found";
+ my %retHash = ("Error" => "SmartHome Device", "Info" => "ID:$devID not found");
+ return \%retHash;
+ }
+
+ if ($command eq "table") {
my $tableFormat = AttrVal($name, "disableTableFormat", "undef");
@@ -9689,20 +11340,262 @@ sub FRITZBOX_Get_SmartHome_Devices_List($@) {
return $returnStr;
- } else {
- if( keys(%ret) ) {
- return \%ret;
- } else {
- FRITZBOX_Log $hash, 2, "getting SmartHome Device info -> ID:$devID not found";
- my %retHash = ("Error" => "SmartHome Device", "Info" => "ID:$devID not found");
+ } elsif ($command eq "save") {
+ # { FRITZBOX_Get_SmartHome_Devices_List($defs{"FritzBox"}, "17", "save")}
+ # setKeyValue
+
+ my $categrory = $ret{device_name_category};
+
+ if ( !$categrory || ($categrory !~ /[THERMOSTAT|SOCKET]/) ) {
+ FRITZBOX_Log $hash, 2, "getting SmartHome Device info -> saving for " . $categrory . " not implemented yet.";
+ my %retHash = ("Error" => "SmartHome Device", "Info" => "saving for " . $categrory . " not implemented yet.");
return \%retHash;
}
+
+ my $smh_pre_path = $attr{global}{modpath} . "/FHEM/FhemUtils/smart_home_predefs.txt";
+
+ my ($err, @old) = FileRead($smh_pre_path);
+
+ my @new;
+ if($err) {
+ push(@new, "# This file is auto generated.",
+ "# Please do not modify, move or delete it.",
+ "");
+ @old = ();
+ }
+
+ my $jsonStr = "";
+ my $saveStr = "";
+ my $retStr = "";
+
+ my @sortRet = ();
+ if ($categrory eq "THERMOSTAT") {
+ @sortRet = sort (keys %ret);
+ $retStr = "";
+
+ foreach my $key (@sortRet) {
+ $retStr .= $key . ": " . $ret{$key} . "\n";
+ }
+
+ $jsonStr = encode_json(\%ret);
+ $saveStr = encode_base64($jsonStr,"");
+
+ } elsif ($categrory eq "SOCKET") {
+
+ @sortRet = sort (keys %ret);
+ $retStr = "";
+
+ foreach my $key (@sortRet) {
+ $retStr .= $key . ": " . $ret{$key} . "\n";
+ }
+
+ @sortRet = sort (keys %ret1);
+
+ $retStr .= "\n";
+ foreach my $key (@sortRet) {
+ $retStr .= $key . ": " . $ret1{$key} . "\n";
+ }
+
+ $jsonStr = encode_json(\%ret);
+ $saveStr = encode_base64($jsonStr,"");
+
+ $jsonStr = encode_json(\%ret1);
+ $saveStr = encode_base64($jsonStr,"") . "|" . $saveStr;
+
+ } else {
+ FRITZBOX_Log $hash, 2, "getting SmartHome Device info -> saving for " . $categrory . " not implemented yet.";
+ my %retHash = ("Error" => "SmartHome Device", "Info" => "saving for " . $categrory . " not implemented yet.");
+ return \%retHash;
+ }
+
+ $saveStr = "|" . $categrory . "|" . $saveStr;
+
+ my $fnd;
+ foreach my $l (@old) {
+ if($l =~ m/^$name:$devID:$preName/) {
+ $fnd = 1;
+ push @new, "$name:$devID:$preName:$saveStr" if defined($saveStr);
+ } else {
+ push @new, $l;
+ }
+ }
+ push @new, "$name:$devID:$preName:$saveStr" if(!$fnd && defined($saveStr));
+
+ my $errSave = FileWrite($smh_pre_path, @new);
+
+ if(defined($errSave)) {
+ FRITZBOX_Log $hash, 2, "getting SmartHome Device info -> saving the $smh_pre_path - $errSave";
+ my %retHash = ("Error" => "SmartHome Device", "Info" => "saving the $smh_pre_path - $errSave");
+ return \%retHash;
+
+ } else {
+
+ $retStr =~ s/\\n//;
+ FRITZBOX_Log $hash, 4, "saved smart home predef for device:$devID and predef:$preName\n" . $retStr;
+ return \%ret;
+
+ }
+
+ } elsif ($command eq "test") {
+
+ my $categrory = $ret{device_name_category};
+ my @sortRet = sort (keys %ret);
+ my $retStr = "";
+
+ if ($categrory =~ /SOCKET/) {
+
+ my @sortRet1 = sort (keys %ret1);
+
+ $retStr .= "Allgemein\n";
+ foreach my $key (@sortRet1) {
+ $retStr .= $key . ": " . $ret1{$key} . "\n";
+ }
+
+ $retStr .= "\nAutomatisch Schalten\n";
+ foreach my $key (@sortRet) {
+ $retStr .= $key . ": " . $ret{$key} . "\n";
+ }
+
+ } else {
+
+ $retStr .= "Allgemein\n";
+ foreach my $key (@sortRet) {
+ $retStr .= $key . ": " . $ret{$key} . "\n";
+ }
+
+ }
+
+ return $retStr;
+
+ } else {
+
+ my @sortRet = sort (keys %ret);
+ my $retStr = "";
+
+ foreach my $key (@sortRet) {
+ $retStr .= $key . ": " . $ret{$key} . "|";
+ }
+
+ FRITZBOX_Log $hash, 4, "return smart home infos for device:$devID and predef:$preName\n" . $retStr;
+ return \%ret;
+ }
+
+ # end only for one device
+
+ } elsif ($devID && $command =~ /delete/) {
+
+ my @new;
+ my $smh_pre_path = $attr{global}{modpath} . "/FHEM/FhemUtils/smart_home_predefs.txt";
+
+ my ($err, @old) = FileRead($smh_pre_path);
+
+ if ($err) {
+ FRITZBOX_Log $hash, 2, "getting SmartHome Device info -> reading the $smh_pre_path - $err";
+ my %retHash = ("Error" => "SmartHome Device", "Info" => "reading the $smh_pre_path - $err");
+ return \%retHash;
+ }
+
+ my $fnd;
+ foreach my $l (@old) {
+ if($l !~ m/^$name:$devID:$preName/) {
+ push @new, $l;
+ } else {
+ $fnd = 1;
+ }
+ }
+
+ my $errSave = FileWrite($smh_pre_path, @new) if $fnd;
+
+ if(defined($errSave)) {
+ FRITZBOX_Log $hash, 2, "deleting SmartHome preDef -> saving the $smh_pre_path - $errSave";
+ my %retHash = ("Error" => "deleting SmartHome preDef", "Info" => "saving the $smh_pre_path - $errSave");
+ return \%retHash;
+
+ } else {
+ if ($fnd) {
+ FRITZBOX_Log $hash, 4, "deleting SmartHome preDef -> deleted preDef for device:$devID and predef:$preName";
+ my %retHash = ( "apply" => "ok", "Info" => "deleted preDef for device:$devID and predef:$preName");
+ return \%retHash;
+ } else {
+ FRITZBOX_Log $hash, 4, "deleting SmartHome preDef -> preDef for device:$devID and predef:$preName not found";
+ my %retHash = ( "Error" => "deleting SmartHome preDef", "Info" => "for device:$devID and predef:$preName not found");
+ return \%retHash;
+ }
+ }
+
+ # { FRITZBOX_Get_SmartHome_Devices_List($defs{"FritzBox"}, "17", "load")}
+ } elsif ($devID && $command =~ /load/) {
+
+ my $codedStr = "";
+
+ my $smh_pre_path = $attr{global}{modpath} . "/FHEM/FhemUtils/smart_home_predefs.txt";
+ my ($err, @l) = FileRead($smh_pre_path);
+
+ if ($err) {
+ FRITZBOX_Log $hash, 2, "getting SmartHome Device info -> reading the $smh_pre_path - $err";
+ my %retHash = ("Error" => "SmartHome Device", "Info" => "reading the $smh_pre_path - $err");
+ return \%retHash;
+ }
+
+ for my $l (@l) {
+ if($l =~ m/^$name:$devID:$preName:(.*)/) {
+ $codedStr = $1;
+ last;
+ }
+ }
+
+ if ( $codedStr eq "" ) {
+ FRITZBOX_Log $hash, 2, "getting SmartHome Device info -> no predef found for device:$devID and predef:$preName\n" . $codedStr;
+ my %retHash = ("Error" => "SmartHome Device", "Info" => "no predef found for device:$devID and predef:$preName");
+ return \%retHash;
+ }
+ #{ Dumper FRITZBOX_Get_SmartHome_Devices_List($defs{"FritzBox"}, "17", "load", "SH17Neu")}
+ #{ Dumper FRITZBOX_Get_SmartHome_Devices_List($defs{"FritzBox"}, "16", "load", "TH16Neu")}
+
+ my @preDefs = split('\|', $codedStr);
+
+ if (@preDefs && int(@preDefs) >= 2) {
+
+ my $aut = $preDefs[2];
+ my $gen = $preDefs[3] if $preDefs[3];
+
+ my $msg = $codedStr . "\nautomation :" . $aut . "\ngeneral:";
+ $msg .= $gen ? $gen : "leer";
+ $msg .= "\ncnt: " . int(@preDefs);
+
+ FRITZBOX_Log $hash, 5, $msg;
+
+ if ($command =~ /loads/) {
+ $codedStr = $aut;
+ } else {
+ $codedStr = $gen ? $gen : $aut;
+ }
+
+ $codedStr =~ s/\|//;
+
+ my $jsonStr = decode_base64($codedStr);
+ my %valueHash = %{ decode_json($jsonStr) };
+
+ my @sortRet = sort (keys %valueHash);
+ my $retStr = "";
+
+ foreach my $key (@sortRet) {
+ $retStr .= $key . ": " . $valueHash{$key} . "\n";
+ }
+
+ FRITZBOX_Log $hash, 5, "read smart home predef for device:$devID and predef:$preName\n" . $retStr;
+ return \%valueHash;
+
+ } else {
+ FRITZBOX_Log $hash, 2, "getting SmartHome Device info -> no predef found for device:$devID and predef:$preName\n" . $codedStr;
+ my %retHash = ("Error" => "SmartHome Device", "Info" => "no predef found for device:$devID and predef:$preName");
+ return \%retHash;
}
} else {
if ( $analyse =~ /ERROR/) {
- FRITZBOX_Log $hash, 2, "evaluating user info -> " . $analyse;
+ FRITZBOX_Log $hash, 4, "getting smart home info -> " . $analyse;
$returnStr = "SmartHome Devices: Active\n";
$returnStr .= "------------------\n";
return $returnStr . $analyse;
@@ -9752,8 +11645,8 @@ sub FRITZBOX_Get_SmartHome_Devices_List($@) {
for my $mem (0 .. scalar @{$members} - 1) {
$returnStr .= " | ";
$returnStr .= " | ";
- $returnStr .= "" . $members->[$i]->{id} . " | ";
- $returnStr .= "" . $members->[$i]->{displayName} . " | ";
+ $returnStr .= "" . $members->[$mem]->{id} . " | ";
+ $returnStr .= "" . $members->[$mem]->{displayName} . " | ";
$returnStr .= "\n";
}
}
@@ -9770,7 +11663,7 @@ sub FRITZBOX_Get_SmartHome_Devices_List($@) {
$returnStr .= 'SmartHome Devices | Skills | ';
$returnStr .= "\n";
$returnStr .= "\n";
- $returnStr .= "ID | TYPE | Name | Status | Category | Manufacturer | Model | Firmware | Temp | Offset | "
+ $returnStr .= "ID | TYPE | Name | Status | Category | Manufacturer | Model | Firmware | Temp | Offset | Humidity | "
. "Battery | Volt | Power | Current | Consumption | ledState | State | \n";
$returnStr .= "
\n";
@@ -9795,7 +11688,7 @@ sub FRITZBOX_Get_SmartHome_Devices_List($@) {
$returnStr .= "" . $result->{data}->{devices}->[$i]->{firmwareVersion}->{current} . " | ";
if ( $result->{data}->{devices}->[$i]->{units} ) {
- my @skillInfo = (" | "," | "," | "," | "," | "," | "," | "," | "," | ");
+ my @skillInfo = (" | "," | "," | "," | "," | "," | "," | "," | "," | "," | ");
my $units = $result->{data}->{devices}->[$i]->{units};
for my $unit (0 .. scalar @{$units} - 1) {
if( $units->[$unit]->{'type'} eq 'THERMOSTAT' ) {
@@ -9806,18 +11699,21 @@ sub FRITZBOX_Get_SmartHome_Devices_List($@) {
$skillInfo[0] = "" . $units->[$unit]->{skills}->[0]->{currentInCelsius} . "°C | ";
$skillInfo[1] = "" . $units->[$unit]->{skills}->[0]->{offset} . "°C | ";
+ } elsif ( $units->[$unit]->{'type'} eq 'HUMIDITY_SENSOR' ) {
+ $skillInfo[2] = "" . $units->[$unit]->{skills}->[0]->{currentInPercent} . "% | ";
+
} elsif ( $units->[$unit]->{'type'} eq 'BATTERY' ) {
- $skillInfo[2] = "" . $units->[$unit]->{skills}->[0]->{chargeLevelInPercent} . "% | ";
+ $skillInfo[3] = "" . $units->[$unit]->{skills}->[0]->{chargeLevelInPercent} . "% | ";
} elsif ( $units->[$unit]->{'type'} eq 'SOCKET' ) {
if($units->[$unit]->{skills}->[0]->{voltageInVolt}) {
- $skillInfo[3] = "" . $units->[$unit]->{skills}->[0]->{voltageInVolt} . " V | ";
- $skillInfo[4] = "" . $units->[$unit]->{skills}->[0]->{powerPerHour} . " w/h | ";
- $skillInfo[5] = "" . $units->[$unit]->{skills}->[0]->{electricCurrentInAmpere} . " A | ";
- $skillInfo[6] = "" . $units->[$unit]->{skills}->[0]->{powerConsumptionInWatt} . " W | ";
+ $skillInfo[4] = "" . $units->[$unit]->{skills}->[0]->{voltageInVolt} . " V | ";
+ $skillInfo[5] = "" . $units->[$unit]->{skills}->[0]->{powerPerHour} . " w/h | ";
+ $skillInfo[6] = "" . $units->[$unit]->{skills}->[0]->{electricCurrentInAmpere} . " A | ";
+ $skillInfo[7] = "" . $units->[$unit]->{skills}->[0]->{powerConsumptionInWatt} . " W | ";
}
- $skillInfo[7] = "" . $units->[$unit]->{skills}->[1]->{ledState};
- $skillInfo[8] = " | " . $units->[$unit]->{skills}->[2]->{state};
+ $skillInfo[8] = " | " . $units->[$unit]->{skills}->[1]->{ledState};
+ $skillInfo[9] = " | " . $units->[$unit]->{skills}->[2]->{state};
}
}
@@ -9827,6 +11723,37 @@ sub FRITZBOX_Get_SmartHome_Devices_List($@) {
$returnStr .= "\n";
}
}
+
+ my $smh_pre_path = $attr{global}{modpath} . "/FHEM/FhemUtils/smart_home_predefs.txt";
+ my ($err, @l) = FileRead($smh_pre_path);
+
+ $returnStr .= '";
+ $returnStr .= "" . $2 . " | ";
+ }
+ }
+ }
+ $returnStr .= "\n";
+
$returnStr .= " \n";
}
@@ -9852,7 +11779,7 @@ sub FRITZBOX_Get_Lan_Devices_List($) {
my $returnStr;
- my $result = FRITZBOX_read_LuaData($hash, "data", \@webCmdArray) ;
+ my $result = FRITZBOX_call_LuaData($hash, "data", \@webCmdArray) ;
my $analyse = FRITZBOX_Helper_analyse_Lua_Result($hash, $result);
@@ -9985,7 +11912,7 @@ sub FRITZBOX_Get_User_Info_List($) {
}
eval {
- FRITZBOX_Log $hash, 5, "evaluating user info: \n" . Dumper $result->{user_info};
+ FRITZBOX_Log $hash, 5, "evaluating user info: \n" . Dumper($result->{user_info});
};
my $views = $result->{user_info};
@@ -10043,7 +11970,7 @@ sub FRITZBOX_Get_Kid_Profiles_List($) {
my $returnStr;
- my $result = FRITZBOX_read_LuaData($hash, "data", \@webCmdArray) ;
+ my $result = FRITZBOX_call_LuaData($hash, "data", \@webCmdArray) ;
my $analyse = FRITZBOX_Helper_analyse_Lua_Result($hash, $result);
@@ -10158,7 +12085,7 @@ sub FRITZBOX_Get_Fritz_Log_Info_nonBlk($)
if ($hash->{fhem}{fwVersion} >= 683) {
FRITZBOX_Log $hash, 4, "data.lua: \n" . join(" ", @webCmdArray);
- $result = FRITZBOX_read_LuaData($hash, "data", \@webCmdArray) ;
+ $result = FRITZBOX_call_LuaData($hash, "data", \@webCmdArray) ;
# Abbruch wenn Fehler beim Lesen der Fritzbox-Antwort
return FRITZBOX_Readout_Response($hash, $result, \@roReadings) if ( defined $result->{Error} || defined $result->{AuthorizationRequired});
@@ -10246,7 +12173,7 @@ sub FRITZBOX_Get_Fritz_Log_Info_Std($$$) {
FRITZBOX_Log $hash, 3, "set $name $logInfo " . join(" ", @webCmdArray);
- my $result = FRITZBOX_read_LuaData($hash, "data", \@webCmdArray) ;
+ my $result = FRITZBOX_call_LuaData($hash, "data", \@webCmdArray) ;
if(defined $result->{Error}) {
$returnStr .= "FritzLog Filter:$logInfo\n";
@@ -10346,7 +12273,7 @@ sub FRITZBOX_Get_Lan_Device_Info($$$) {
FRITZBOX_Log $hash, 4, "set $name $action " . join(" ", @webCmdArray);
- my $result = FRITZBOX_read_LuaData($hash, "data", \@webCmdArray) ;
+ my $result = FRITZBOX_call_LuaData($hash, "data", \@webCmdArray) ;
if ($action =~ /chgProf|lockLandevice/) {
return $result;
@@ -10457,7 +12384,7 @@ sub FRITZBOX_Get_Lua_Kids($$@)
}
if ( ref ($jsonResult) ne "HASH" ) {
- chop $jsonText;
+ chop($jsonText);
FRITZBOX_Log $hash, 4, "no json string returned (" . $jsonText . ")";
my %retHash = ("Error" => "no json string returned (" . $jsonText . ")", "ResetSID" => "1");
return \%retHash;
@@ -10592,7 +12519,7 @@ sub FRITZBOX_SOAP_Test_Request($$$$)
use Data::Dumper;
- return Dumper FRITZBOX_SOAP_Request($hash, $control_url, $service_type, $service_command);
+ return Dumper (FRITZBOX_SOAP_Request($hash, $control_url, $service_type, $service_command));
} # end of FRITZBOX_SOAP_Test_Request
@@ -10890,8 +12817,8 @@ sub FRITZBOX_open_Web_Connection ($)
my $p = Net::Ping->new;
my $isAlive = $p->ping($host);
$p->close;
-
- unless ($isAlive) {
+
+ if (!$isAlive) {
FRITZBOX_Log $hash, 4, "Host $host not available";
%retHash = ( "Error" => "Device is offline", "ResetSID" => "1" ) ;
return \%retHash if !AttrVal($name, "disableHostIPv4check", 0);
@@ -11018,15 +12945,16 @@ sub FRITZBOX_call_Lua_Query($$@)
} # end FRITZBOX_call_Lua_Query
-# Read box values via the web connection
+# Read/write box values via the web connection
############################################
-sub FRITZBOX_read_LuaData($$$@)
+sub FRITZBOX_call_LuaData($$$@)
{
- my ($hash, $luaFunction, $queryStr, $charSet) = @_;
+ my ($hash, $luaFunction, $queryArray, $charSet) = @_;
$charSet = "" unless defined $charSet;
my $name = $hash->{NAME};
my $sidNew = 0;
+ my $queryStr = join (' ', @$queryArray);
if ($hash->{LUADATA} <= 0) {
my %retHash = ( "Error" => "data.lua not supportet", "Info" => "Fritz!Box or Fritz!OS outdated" ) ;
@@ -11047,9 +12975,9 @@ sub FRITZBOX_read_LuaData($$$@)
FRITZBOX_Log $hash, 4, "URL: $url";
my $agent = LWP::UserAgent->new( env_proxy => 1, keep_alive => 1, protocols_allowed => ['http'], timeout => $hash->{AGENTTMOUT});
- my $response = $agent->post ( $url, $queryStr );
+ my $response = $agent->post ( $url, $queryArray );
- FRITZBOX_Log $hash, 5, "Response: " . $response->status_line . "\n" . $response->content;
+ FRITZBOX_Log $hash, 4, "Response: " . $response->status_line . "\n" . $response->content;
unless ($response->is_success) {
my %retHash = ("Error" => $response->status_line, "ResetSID" => "1");
@@ -11091,6 +13019,87 @@ sub FRITZBOX_read_LuaData($$$@)
}
+ # handling for Smart Home Devices:
+ ########### HTML #################################
+ # xhr 1 lang de page sh_dev xhrId all
+ # xhr 1 master 17 device 17 page home_auto_edit_view
+
+ if ($queryStr =~ /home_auto_edit_view/) {
+
+ my $profile_content;
+
+ if ( $data =~ m/\Smart-Home.*?\<\/h4\>\(.*?)\ |