Merge pull request 'merge des aktuellen devel in testing' (#34) from devel into testing

Reviewed-on: #34
Reviewed-by: Sebastian Schwaz <sebastianschwarz@noreply@cooltux.net>
This commit is contained in:
Sebastian Schwaz 2021-06-09 13:53:43 +02:00
commit 0aa3e543a8
3 changed files with 126 additions and 19 deletions

View File

@ -63,6 +63,8 @@ use warnings;
use POSIX;
use FHEM::Meta;
#use Data::Dumper;
use HttpUtils;
my $missingModul = '';
@ -352,6 +354,7 @@ sub Notify {
@{$events} or grep /^DEFINED.$name$/,
@{$events} or grep /^MODIFIED.$name$/,
@{$events} or grep /^ATTR.$name.gardenaAccountEmail.+/,
@{$events} or grep /^DELETEATTR.$name.disable$/,
@{$events}
)
)
@ -369,8 +372,7 @@ sub Notify {
if (
$devtype eq 'Global'
&& (
grep /^DELETEATTR.$name.disable$/,
@{$events} or grep /^ATTR.$name.disable.0$/,
grep /^ATTR.$name.disable.0$/,
@{$events} or grep /^DELETEATTR.$name.interval$/,
@{$events} or grep /^ATTR.$name.interval.[0-9]+/,
@{$events}
@ -731,6 +733,18 @@ sub ErrorHandling {
$output .= "value: $dev_settings->{value} \n";
}
}
$output .= '\n=== Abilities \n';
$i = 0;
for my $dev_settings ( @ { $devJson->{abilities} } ) {
$output .= "[".$i++."]id: $dev_settings->{id} \n";
$output .= "name: $dev_settings->{name} ";
if (ref ($dev_settings->{value}) eq 'ARRAY'
|| ref ($dev_settings->{value}) eq 'HASH'){
$output .= 'N/A \n';
} else {
$output .= "value: $dev_settings->{value} \n";
}
}
$hash->{helper}{debug_device_output} = $output;
asyncOutput($param->{cl}, $hash->{helper}{debug_device_output});
return;
@ -1207,7 +1221,6 @@ sub createHttpValueStrings {
&& !defined( $hash->{helper}{locations_id} ) );
readingsSingleUpdate( $hash, 'state', 'fetch locationId', 1 )
if ( !defined( $hash->{helper}{locations_id} ) );
$uri .= '/auth/token' if ( !defined( $hash->{helper}{session_id} ) );
$uri .= '/devices'
if (!defined($abilities)
&& defined( $hash->{helper}{locations_id} ) );
@ -1215,7 +1228,6 @@ sub createHttpValueStrings {
$uri = '/devices/'.InternalVal($hash->{helper}{debug_device}, 'DEVICEID', 0 ) if ( exists ($hash->{helper}{debug_device}));
$uri = '/auth/token' if ( !defined( $hash->{helper}{session_id} ) );
if ( defined( $hash->{helper}{locations_id} ) ) {
if ( defined($abilities) && $abilities =~ /.*_settings/ ) {
@ -1279,6 +1291,19 @@ sub createHttpValueStrings {
. $abilities
. '/properties/manual_watering_timer';
}
elsif (defined($abilities)
&& defined($payload)
&& $abilities eq 'watering_button_config' )
{
$method = 'PUT';
$uri .=
'/devices/'
. $deviceId
. '/abilities/watering'
. '/properties/button_config_time';
}
elsif (defined($abilities)
&& defined($payload)
@ -1463,7 +1488,7 @@ sub DeletePassword {
],
"release_status": "stable",
"license": "GPL_2",
"version": "v2.4.0",
"version": "v2.4.2",
"author": [
"Marko Oldenburg <leongaultier@gmail.com>"
],

View File

@ -209,6 +209,10 @@ sub Define {
$hash->{helper}{STARTINGPOINTID} = '';
$hash->{helper}{schedules_paused_until_id} = '';
$hash->{helper}{eco_mode_id} = '';
$hash->{helper}{button_config_time_id} = '';
$hash->{helper}{winter_mode_id} = '';
$hash->{helper}{_id} = '';
# IrrigationControl valve control max 6
$hash->{helper}{schedules_paused_until_1_id} = '';
$hash->{helper}{schedules_paused_until_2_id} = '';
@ -306,7 +310,7 @@ sub Set {
if ( lc $cmd eq 'parkuntilfurthernotice' ) {
$payload = '"name":"park_until_further_notice"';
if ( $mainboard_version > 10.30 ) {
$payload = ' "settings":{"name":"schedules_paused_until","value":"2040-12-31T22:00:00.000Z","device":"'.$hash->{DEVICEID}.'"}';
$payload = ' "settings":{"name":"schedules_paused_until","value":"2038-01-18T00:00:00.000Z","device":"'.$hash->{DEVICEID}.'"}';
$abilities = 'mower_settings' ;
$service_id = $hash->{helper}{schedules_paused_until_id};
}
@ -361,6 +365,18 @@ sub Set {
. $aArg->[0] * 60
. ',"valve_id":1}}';
}
elsif ( lc $cmd eq 'manualbuttontime'){
$service_id = $hash->{helper}{button_config_time_id};
$payload=
'"properties":{"name":"button_config_time",'
.'"value":'
. $aArg->[0] * 60
. ',"timestamp":"2021-05-26T19:06:23.680Z"'
. ',"at_bound":null,"unit":"seconds","ability":"'
. $service_id
.'"}';
$abilities = 'watering_button_config';
}
elsif ( $cmd =~ m{\AcancelOverride}xms ) {
my $valve_id = 1;
@ -377,6 +393,18 @@ sub Set {
. ',"valve_id":'
. $valve_id . '}}';
}
elsif ( $cmd =~ /.*Schedule/ ){
my $duration = (( defined($aArg->[0]) ? ( ((Time::Piece->new)+(ONE_HOUR * $aArg->[0]) - (Time::Piece->new)->tzoffset )->datetime ).'.000Z' : '2038-01-18T00:00:00.000Z'));
$abilities = 'wateringcomputer_settings';
$service_id = $hash->{helper}->{'schedules_paused_until_id'};
$payload = '"settings":{"name":"schedules_paused_until"'
. ', "value":"'
. ($cmd eq 'resumeSchedule' ? '' : $duration )
. '","device":"'
. $hash->{DEVICEID}
. '"}';
}
elsif ( lc $cmd eq 'on' || lc $cmd eq 'off' || lc $cmd eq 'on-for-timer' ) {
my $val = (
defined($aArg) && ref($aArg) eq 'ARRAY'
@ -407,8 +435,8 @@ sub Set {
}
elsif ( $cmd =~ /.*ScheduleValve/ ){
my $valve_id = $aArg->[0];
my $duration = (( defined($aArg->[1]) ? ( ((Time::Piece->new)+(ONE_HOUR * $aArg->[1]) - (Time::Piece->new)->tzoffset )->datetime ).'.000Z' : '2040-12-31T22:00:00.000Z'));
my $duration = (( defined($aArg->[1]) ? ( ((Time::Piece->new)+(ONE_HOUR * $aArg->[1]) - (Time::Piece->new)->tzoffset )->datetime ).'.000Z' : '2038-01-18T00:00:00.000Z'));
$abilities = 'irrigation_settings';
$service_id = $hash->{helper}->{'schedules_paused_until_'.$valve_id.'_id'};
$payload = '"settings":{"name":"schedules_paused_until_'
@ -441,8 +469,16 @@ sub Set {
$payload = '"name":"measure_soil_humidity"';
$abilities = 'humidity';
}
}
## winter sleep
elsif ( lc $cmd eq 'winter_mode') {
$payload = '"settings":{"name":"winter_mode","value":"'
. $aArg->[0]
.'","device":"'
. $hash->{DEVICEID}
.'"}';
$abilities = 'winter_settings';
$service_id = $hash->{helper}->{'winter_mode_id'};
}
else {
@ -452,7 +488,7 @@ sub Set {
'parkUntilFurtherNotice:noArg parkUntilNextTimer:noArg startResumeSchedule:noArg startOverrideTimer:slider,0,1,240 startpoint'
if ( AttrVal( $name, 'model', 'unknown' ) eq 'mower' );
$list .= 'manualOverride:slider,1,1,59 cancelOverride:noArg'
$list .= 'manualOverride:slider,1,1,59 cancelOverride:noArg resumeSchedule:noArg stopSchedule manualButtonTime:slider,0,2,100'
if ( AttrVal( $name, 'model', 'unknown' ) eq 'watering_computer' );
$list .=
@ -468,7 +504,8 @@ sub Set {
$list .= 'on:noArg off:noArg on-for-timer:slider,0,1,60'
if ( AttrVal( $name, 'model', 'unknown' ) eq 'power' );
# all devices has abilitie to fall a sleep
$list .= ' winter_mode:awake,hibernate';
return "Unknown argument $cmd, choose one of $list";
}
@ -547,6 +584,27 @@ sub WriteReadings {
for my $propertie (
@{ $decode_json->{abilities}[$abilities]{properties} } )
{
if ( exists($decode_json->{abilities}[$abilities]{name})
&& (
$decode_json->{abilities}[$abilities]{name} eq 'watering' )
) {
if ( $propertie->{name} eq 'button_config_time' )
{
if ( $hash->{helper}{$propertie->{name}.'_id'} ne
$decode_json->{abilities}[$abilities]{id} )
{
$hash->{helper}{$propertie->{name}.'_id'} =
$decode_json->{abilities}[$abilities]{id};
}
readingsBulkUpdateIfChanged(
$hash,
'manualButtonTime',
(RigReadingsValue( $hash, $propertie->{value} / 60) )
);
next;
}
}
readingsBulkUpdateIfChanged(
$hash,
$decode_json->{abilities}[$abilities]{name} . '-'
@ -641,7 +699,8 @@ sub WriteReadings {
if ( exists($decode_json->{settings}[$settings]{name})
&& (
$decode_json->{settings}[$settings]{name} =~ /schedules_paused_until_?\d?$/
|| $decode_json->{settings}[$settings]{name} eq 'eco_mode' )
|| $decode_json->{settings}[$settings]{name} eq 'eco_mode'
|| $decode_json->{settings}[$settings]{name} eq 'winter_mode' )
)
{
if ( $hash->{helper}{$decode_json->{settings}[$settings]{name}.'_id'} ne
@ -650,6 +709,12 @@ sub WriteReadings {
$hash->{helper}{$decode_json->{settings}[$settings]{name}.'_id'} =
$decode_json->{settings}[$settings]{id};
}
# save winter mode as reading
readingsBulkUpdateIfChanged(
$hash,
'winter_mode',
$decode_json->{settings}[$settings]{value}
) if ($decode_json->{settings}[$settings]{name} eq 'winter_mode');
}
if ( ref( $decode_json->{settings}[$settings]{value} ) eq "ARRAY"
@ -1125,6 +1190,10 @@ sub SetPredefinedStartPoints {
<a name="GardenaSmartDeviceset"></a>
<b>set</b>
<ul>
<li>winter_mode - awake | hibernate</li>
</ul>
<ul>
<h3>mower</h3>
<li>parkUntilFurtherNotice</li>
<li>parkUntilNextTimer</li>
<li>startOverrideTimer - (in minutes, 60 = 1h, 1440 = 24h, 4320 = 72h)</li>
@ -1134,10 +1203,14 @@ sub SetPredefinedStartPoints {
<li>set NAME startpoint enable 1</li>
<li>set NAME startpoint disable 3 enable 1</li>
</ul>
<h3>irrigation control</h3>
<li>resumeScheduleValve - start schedule irrigation on valve n</li>
<li>stopScheduleValve - stop schedule irrigation on valve n (Default: 2040-12-31T22:00:00.000Z) | optional params hours (now + hours)</li>
<li>stopScheduleValve - stop schedule irrigation on valve n (Default: 2038-01-18T00:00:00.000Z) | optional params hours (now + hours)</li>
<li>closeAllValves - close all valves</li>
<h3>water control</h3>
<li>manualButtonTime - set manual time for button press (in minutes) 0 disable button</li>
<li>stopSchedule - stop schedule for now + n hours (Default: 2038-01-18T00:00:00.000Z)</li>
<li>resumeSchedule - resume schedule</li>
</ul>
</ul>
@ -1273,6 +1346,10 @@ sub SetPredefinedStartPoints {
<a name="GardenaSmartDeviceset"></a>
<b>set</b>
<ul>
<li>winter_mode - aufw&auml;cken (awake)| winterschlaf (hibernate)</li>
</ul>
<ul>
<h3>m&auml;her</h3>
<li>parkUntilFurtherNotice - Parken des M&auml;hers unter Umgehung des Zeitplans</li>
<li>parkUntilNextTimer - Parken bis zum n&auml;chsten Zeitplan</li>
<li>startOverrideTimer - Manuelles m&auml;hen (in Minuten, 60 = 1h, 1440 = 24h, 4320 = 72h)</li>
@ -1282,9 +1359,14 @@ sub SetPredefinedStartPoints {
<li>set NAME startpoint enable 1</li>
<li>set NAME startpoint disable 3 enable 1</li>
</ul>
<h3>irrigation control</h3>
<li>resumeScheduleValve - Startet Bew&aauml;sserung am Ventil n nach Zeitplan</li>
<li>stopScheduleValve - Setzt Bew&aauml;sserung am Ventil n aus (Default: 2040-12-31T22:00:00.000Z) | Optionaler Parameter Stunden (Jetzt + Stunden)</li>
<li>stopScheduleValve - Setzt Bew&aauml;sserung am Ventil n aus (Default: 2038-01-18T00:00:00.000Z) | Optionaler Parameter Stunden (Jetzt + Stunden)</li>
<li>closeAllValves - Stopt Bew&aauml;sserung an allen Ventilen </li>
<h3>water control</h3>
<li>manualButtonTime - setzt die Dauer f&uuml;r den manuellen Knopf (in Minuten) 0 Schaltet den Knopf aus</li>
<li>stopSchedule - Halte Zeitplan an für x Stunden - (Default: 2038-01-18T00:00:00.000Z)</li>
<li>resumeSchedule - Weiterf&uuml;hrung des Zeitplans</li>
</ul>
</ul>
@ -1307,7 +1389,7 @@ sub SetPredefinedStartPoints {
],
"release_status": "stable",
"license": "GPL_2",
"version": "v2.4.0",
"version": "v2.4.2",
"author": [
"Marko Oldenburg <leongaultier@gmail.com>"
],

View File

@ -1,2 +1,2 @@
UPD 2021-05-22_04:53:56 46135 FHEM/73_GardenaSmartBridge.pm
UPD 2021-05-22_04:54:14 51644 FHEM/74_GardenaSmartDevice.pm
UPD 2021-06-05_18:47:30 46871 FHEM/73_GardenaSmartBridge.pm
UPD 2021-06-05_09:32:03 55505 FHEM/74_GardenaSmartDevice.pm