Compare commits
	
		
			179 Commits
		
	
	
		
			v0.10.15-R
			...
			testing
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 81489d5246 | |||
| 833a370347 | |||
| fb50355d39 | |||
| d41615c90f | |||
| be5e721c43 | |||
| 2351e5b9db | |||
| d4626a068b | |||
| 0571adccc5 | |||
| 8ec3bcde54 | |||
| bd97e399bf | |||
| d409662969 | |||
| c1c3e2cbdf | |||
| 72298746ab | |||
| 787114040c | |||
| b517e032cf | |||
| 30cf6f41d7 | |||
|  | eef3dc7b21 | ||
|  | cfe3963f32 | ||
|  | b654481df1 | ||
| e19c902780 | |||
| 757a19bdb5 | |||
| 52930d9a07 | |||
| e1592b8b7d | |||
| 7eb1079458 | |||
| ceecbb063a | |||
| 49b0ff17fa | |||
| ae5057fbc5 | |||
| 9cd0d364b4 | |||
| f216e1b308 | |||
| 6f137256e0 | |||
| cc5ef41e21 | |||
| 587d4e4316 | |||
|  | 3542e51375 | ||
| f517b72f23 | |||
|  | ad5cbaac12 | ||
| 8da3b13bcc | |||
| c09edf5496 | |||
| cd1c2c104a | |||
| 51256c1ed9 | |||
| c0a7bfa6df | |||
| 403936fe73 | |||
| 5095c65d80 | |||
| 0bd8d6273f | |||
| c3b61def25 | |||
| 9c096902e8 | |||
| 6dfc92c35e | |||
| 9994af6ca2 | |||
| eb85a74a07 | |||
| 358c760b45 | |||
| 34a6a88401 | |||
| bb80fb5d3a | |||
| 2907e19d3b | |||
| ae86468077 | |||
| 7cba141447 | |||
| f67d56e1cc | |||
| 527d72dd57 | |||
| 459b8508ec | |||
| ac87015478 | |||
| 26105fa434 | |||
| 15be0a6885 | |||
| cca6e90303 | |||
| de5d6cbc6a | |||
| 4925e654ec | |||
| 97caf64308 | |||
| 6bf2b17d6f | |||
| fb27bedf48 | |||
| f52187ad35 | |||
| 103697184e | |||
| c9894453bb | |||
| 14eee0e6dd | |||
| 9545dda125 | |||
| 3135a27c63 | |||
| 13689963f1 | |||
| d8881ff6d1 | |||
| 12f48e98b5 | |||
| a1d19a797d | |||
| f1f265b89a | |||
| ca99e2bd0c | |||
| 29e3a1a8d7 | |||
| e02395a82f | |||
| 663ce748e2 | |||
| d35dda835a | |||
| 47be49617d | |||
| 0dc0a9c6e4 | |||
| 79d369b9f5 | |||
| 8109cd7ebe | |||
| 842e41e3dc | |||
| 35a4f60a53 | |||
| ef650b2d4b | |||
| bf773ca2d7 | |||
| ae88630277 | |||
| f811cfd87f | |||
| 1a71c63652 | |||
| 7d3d11d1e2 | |||
| 1eeeb85eaf | |||
| 397f949a21 | |||
| 4ea1db3aa0 | |||
| 004a15ea42 | |||
| 9a1b6acad3 | |||
| 4aa24587a5 | |||
| c76280639f | |||
| a3c023711c | |||
| c6e88f2d45 | |||
| f0f5cbde4b | |||
| 5928276b74 | |||
| 32a3ac9d13 | |||
| ef590e002e | |||
| 427018ab46 | |||
| 89431a2af3 | |||
| 39c7ec3dc5 | |||
| 37044b2316 | |||
| a44fffe94e | |||
| 870f2be5d8 | |||
| 36669f1405 | |||
| a61458cfc2 | |||
| 8c17eb5f6a | |||
| d87ddb146c | |||
| 58b2f20f19 | |||
| 301fd32048 | |||
| 0255be94b5 | |||
| 4773fd0ea0 | |||
| 1ce3805427 | |||
| 5f00d33fa9 | |||
|  | da79e25929 | ||
|  | 0b22ac9e12 | ||
| e6a01cdb18 | |||
| fb44ff9f1a | |||
| 9663b2dd43 | |||
| d6cb059eaf | |||
| 6774e3a918 | |||
| e28fad13d7 | |||
| 1c1ac77851 | |||
| 1ac38a7216 | |||
| 8d6044c404 | |||
| fcce22b102 | |||
| 4b5b03a8fc | |||
| f412e88325 | |||
| 0dca852ad0 | |||
| 8ea4101747 | |||
| b9a7328661 | |||
| f03a7d690f | |||
| 5ccceaba16 | |||
| 54450962ac | |||
| 9409c60400 | |||
| 75f5b6bf01 | |||
| 98edf0c5f6 | |||
| a9a47f9e70 | |||
| f2b7e8490f | |||
| 3d7f9fcf92 | |||
| e037a12879 | |||
| 096e4ab815 | |||
| feba24bf99 | |||
| e5a6bbdbe5 | |||
| a66daa7d5a | |||
| 617b7a7531 | |||
| f498829347 | |||
| 4cc3ecc40a | |||
| 95446cc91e | |||
| 63393b4cd4 | |||
| 6a62226a39 | |||
| cbd058773d | |||
| 1016b7d087 | |||
| 649d21f19b | |||
| 93bd0cd22e | |||
| 62a4a249b4 | |||
| e66aa0cb4d | |||
| 34afd51a11 | |||
| a2c878e333 | |||
| bb1d139ed7 | |||
|  | ef5b9a982e | ||
| 4c1d6c7885 | |||
| 2b12b9ed10 | |||
| 6babb451c9 | |||
| 9afc3ccf97 | |||
|  | bee5ff33ae | ||
|  | 9ba046452a | ||
|  | 5e60229c7a | ||
|  | 8009a27869 | ||
|  | 0b048e7dc0 | 
							
								
								
									
										8496
									
								
								CHANGELOG.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8496
									
								
								CHANGELOG.md
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -1,15 +1,16 @@ | ||||
| UPD 2021-05-27_08:55:22 97974 FHEM/73_AutoShuttersControl.pm | ||||
| UPD 2021-05-27_08:51:20 74350 lib/FHEM/Automation/ShuttersControl.pm | ||||
| UPD 2021-02-18_11:11:24 2657 lib/FHEM/Automation/ShuttersControl/Dev.pm | ||||
| UPD 2021-02-18_11:11:24 2496 lib/FHEM/Automation/ShuttersControl/Roommate.pm | ||||
| UPD 2021-05-27_08:51:20 31896 lib/FHEM/Automation/ShuttersControl/Shutters.pm | ||||
| UPD 2021-04-30_18:20:51 25329 lib/FHEM/Automation/ShuttersControl/Shading.pm | ||||
| UPD 2021-05-27_08:51:20 109039 lib/FHEM/Automation/ShuttersControl/EventProcessingFunctions.pm | ||||
| UPD 2021-02-18_11:11:24 40628 lib/FHEM/Automation/ShuttersControl/Helper.pm | ||||
| UPD 2021-02-18_11:11:24 2175 lib/FHEM/Automation/ShuttersControl/Window.pm | ||||
| UPD 2021-05-27_08:51:20 11741 lib/FHEM/Automation/ShuttersControl/Dev/Attr.pm | ||||
| UPD 2021-02-18_11:11:24 7251 lib/FHEM/Automation/ShuttersControl/Dev/Readings.pm | ||||
| UPD 2021-02-18_11:11:24 52525 lib/FHEM/Automation/ShuttersControl/Shutters/Attr.pm | ||||
| UPD 2021-02-18_11:11:24 2903 lib/FHEM/Automation/ShuttersControl/Shutters/Readings.pm | ||||
| UPD 2021-02-18_11:11:24 3980 lib/FHEM/Automation/ShuttersControl/Window/Attr.pm | ||||
| UPD 2021-02-18_11:11:24 2288 lib/FHEM/Automation/ShuttersControl/Window/Readings.pm | ||||
| UPD 2025-01-21_18:19:08 116536 FHEM/73_AutoShuttersControl.pm | ||||
| UPD 2025-01-21_17:56:42 76570 lib/FHEM/Automation/ShuttersControl.pm | ||||
| UPD 2024-10-12_09:12:30 2691 lib/FHEM/Automation/ShuttersControl/Dev.pm | ||||
| UPD 2024-10-12_09:12:30 2675 lib/FHEM/Automation/ShuttersControl/Roommate.pm | ||||
| UPD 2024-10-12_09:12:30 31828 lib/FHEM/Automation/ShuttersControl/Shutters.pm | ||||
| UPD 2024-10-12_09:12:30 25541 lib/FHEM/Automation/ShuttersControl/Shading.pm | ||||
| UPD 2024-10-12_09:12:30 112297 lib/FHEM/Automation/ShuttersControl/EventProcessingFunctions.pm | ||||
| UPD 2024-10-12_09:12:30 40681 lib/FHEM/Automation/ShuttersControl/Helper.pm | ||||
| UPD 2024-10-12_09:12:30 2209 lib/FHEM/Automation/ShuttersControl/Window.pm | ||||
| UPD 2024-10-12_09:12:30 11857 lib/FHEM/Automation/ShuttersControl/Dev/Attr.pm | ||||
| UPD 2024-10-12_09:12:30 7265 lib/FHEM/Automation/ShuttersControl/Dev/Readings.pm | ||||
| UPD 2024-10-12_09:12:30 52751 lib/FHEM/Automation/ShuttersControl/Shutters/Attr.pm | ||||
| UPD 2024-10-12_09:12:30 2799 lib/FHEM/Automation/ShuttersControl/Shutters/Readings.pm | ||||
| UPD 2024-10-12_09:12:30 3887 lib/FHEM/Automation/ShuttersControl/Window/Attr.pm | ||||
| UPD 2024-10-12_09:12:30 2200 lib/FHEM/Automation/ShuttersControl/Window/Readings.pm | ||||
| UPD 2024-10-12_09:12:30 7394 lib/FHEM/Automation/ShuttersControl/Rainprotection.pm | ||||
|   | ||||
							
								
								
									
										36
									
								
								hooks/commit-msg
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										36
									
								
								hooks/commit-msg
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,36 @@ | ||||
| #!/bin/sh | ||||
| # | ||||
| # An example hook script to check the commit log message. | ||||
| # Called by "git commit" with one argument, the name of the file | ||||
| # that has the commit message.  The hook should exit with non-zero | ||||
| # status after issuing an appropriate message if it wants to stop the | ||||
| # commit.  The hook is allowed to edit the commit message file. | ||||
| # | ||||
| # To enable this hook, rename this file to "commit-msg". | ||||
|  | ||||
| # Uncomment the below to add a Signed-off-by line to the message. | ||||
| # Doing this in a hook is a bad idea in general, but the prepare-commit-msg | ||||
| # hook is more suited to it. | ||||
| # | ||||
| # SOB=$(git var GIT_AUTHOR_IDENT | sed -n 's/^\(.*>\).*$/Signed-off-by: \1/p') | ||||
| # grep -qs "^$SOB" "$1" || echo "$SOB" >> "$1" | ||||
|  | ||||
| # This example catches duplicate Signed-off-by lines. | ||||
|  | ||||
| commit_msg=$(cat "${1:?Missing commit message file}") | ||||
|  | ||||
| test "" = "$(grep '^Signed-off-by: ' "$1" | | ||||
| 	 sort | uniq -c | sed -e '/^[ 	]*1[ 	]/d')" || { | ||||
| 	echo >&2 Duplicate Signed-off-by lines. | ||||
| 	exit 1 | ||||
| } | ||||
|  | ||||
| if ! echo "$commit_msg" | grep -Eq "^(build|chore|ci|docs|feat|feat!|fix|perf|refactor|revert|style|test)(\(.+\))?: .*$" ; then  | ||||
|  | ||||
|   echo "Invalid commit message"  | ||||
|  | ||||
|     exit 1  | ||||
|  | ||||
| fi  | ||||
|  | ||||
| echo "Commit message is valid!" | ||||
							
								
								
									
										18
									
								
								hooks/post-commit
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										18
									
								
								hooks/post-commit
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,18 @@ | ||||
| #!/bin/bash | ||||
| set -eu | ||||
|  | ||||
| # destination of the final changelog file | ||||
| OUTPUT_FILE=CHANGELOG.md | ||||
|  | ||||
| # generate the changelog | ||||
| git --no-pager log --no-merges --format="### %s%d%n>%aD%n%n>Author: %aN (%aE)%n%n>Commiter: %cN (%cE)%n%n%b%n%N%n" > $OUTPUT_FILE | ||||
|  | ||||
| # prevent recursion! | ||||
| # since a 'commit --amend' will trigger the post-commit script again | ||||
| # we have to check if the changelog file has changed or not | ||||
| res=$(git status --porcelain | grep -c ".\$OUTPUT_FILE$") | ||||
| if [ "$res" -gt 0 ]; then | ||||
|   git add $OUTPUT_FILE | ||||
|   git commit --amend | ||||
|   echo "Populated Changelog in $OUTPUT_FILE" | ||||
| fi | ||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -1,8 +1,8 @@ | ||||
| ############################################################################### | ||||
| # | ||||
| # Developed with Kate | ||||
| # Developed with VSCodium and richterger perl plugin | ||||
| # | ||||
| #  (c) 2018-2020 Copyright: Marko Oldenburg (leongaultier at gmail dot com) | ||||
| #  (c) 2018-2025 Copyright: Marko Oldenburg (fhemdevelopment at cooltux dot net) | ||||
| #  All rights reserved | ||||
| # | ||||
| #   Special thanks goes to: | ||||
| @@ -43,7 +43,7 @@ package FHEM::Automation::ShuttersControl::Dev; | ||||
| use FHEM::Automation::ShuttersControl::Dev::Readings; | ||||
| use FHEM::Automation::ShuttersControl::Dev::Attr; | ||||
|  | ||||
| our @ISA = | ||||
| use base | ||||
|   qw(FHEM::Automation::ShuttersControl::Dev::Readings FHEM::Automation::ShuttersControl::Dev::Attr); | ||||
|  | ||||
| use strict; | ||||
|   | ||||
| @@ -1,8 +1,8 @@ | ||||
| ############################################################################### | ||||
| # | ||||
| # Developed with Kate | ||||
| # Developed with VSCodium and richterger perl plugin | ||||
| # | ||||
| #  (c) 2018-2020 Copyright: Marko Oldenburg (leongaultier at gmail dot com) | ||||
| #  (c) 2018-2025 Copyright: Marko Oldenburg (fhemdevelopment at cooltux dot net) | ||||
| #  All rights reserved | ||||
| # | ||||
| #   Special thanks goes to: | ||||
| @@ -44,23 +44,12 @@ use strict; | ||||
| use warnings; | ||||
| use utf8; | ||||
|  | ||||
| use GPUtils qw(GP_Import); | ||||
|  | ||||
| ## Import der FHEM Funktionen | ||||
| BEGIN { | ||||
|     GP_Import( | ||||
|         qw( | ||||
|           AttrVal | ||||
|           gettimeofday) | ||||
|     ); | ||||
| } | ||||
|  | ||||
| sub getShuttersOffset { | ||||
|     my $self = shift; | ||||
|  | ||||
|     my $name = $self->{name}; | ||||
|  | ||||
|     return AttrVal( $name, 'ASC_shuttersDriveDelay', -1 ); | ||||
|     return ::AttrVal( $name, 'ASC_shuttersDriveDelay', -1 ); | ||||
| } | ||||
|  | ||||
| sub getBrightnessMinVal { | ||||
| @@ -70,7 +59,7 @@ sub getBrightnessMinVal { | ||||
|  | ||||
|     return $self->{ASC_brightness}->{triggermin} | ||||
|       if ( exists( $self->{ASC_brightness}->{LASTGETTIME} ) | ||||
|         && ( gettimeofday() - $self->{ASC_brightness}->{LASTGETTIME} ) < 2 ); | ||||
|         && ( ::gettimeofday() - $self->{ASC_brightness}->{LASTGETTIME} ) < 2 ); | ||||
|     $FHEM::Automation::ShuttersControl::ascDev->getBrightnessMaxVal; | ||||
|  | ||||
|     return $self->{ASC_brightness}->{triggermin}; | ||||
| @@ -83,8 +72,8 @@ sub getBrightnessMaxVal { | ||||
|  | ||||
|     return $self->{ASC_brightness}->{triggermax} | ||||
|       if ( exists( $self->{ASC_brightness}->{LASTGETTIME} ) | ||||
|         && ( gettimeofday() - $self->{ASC_brightness}->{LASTGETTIME} ) < 2 ); | ||||
|     $self->{ASC_brightness}->{LASTGETTIME} = int( gettimeofday() ); | ||||
|         && ( ::gettimeofday() - $self->{ASC_brightness}->{LASTGETTIME} ) < 2 ); | ||||
|     $self->{ASC_brightness}->{LASTGETTIME} = int( ::gettimeofday() ); | ||||
|  | ||||
|     my ( $triggermax, $triggermin ) = | ||||
|       FHEM::Automation::ShuttersControl::Helper::GetAttrValues( $name, | ||||
| @@ -104,7 +93,7 @@ sub _getTwilightDevice { | ||||
|  | ||||
|     my $name = $self->{name}; | ||||
|  | ||||
|     return AttrVal( $name, 'ASC_twilightDevice', 'none' ); | ||||
|     return ::AttrVal( $name, 'ASC_twilightDevice', 'none' ); | ||||
| } | ||||
|  | ||||
| sub getAutoAstroModeEvening { | ||||
| @@ -112,7 +101,7 @@ sub getAutoAstroModeEvening { | ||||
|  | ||||
|     my $name = $self->{name}; | ||||
|  | ||||
|     return AttrVal( $name, 'ASC_autoAstroModeEvening', 'REAL' ); | ||||
|     return ::AttrVal( $name, 'ASC_autoAstroModeEvening', 'REAL' ); | ||||
| } | ||||
|  | ||||
| sub getAutoAstroModeEveningHorizon { | ||||
| @@ -120,7 +109,7 @@ sub getAutoAstroModeEveningHorizon { | ||||
|  | ||||
|     my $name = $self->{name}; | ||||
|  | ||||
|     return AttrVal( $name, 'ASC_autoAstroModeEveningHorizon', 0 ); | ||||
|     return ::AttrVal( $name, 'ASC_autoAstroModeEveningHorizon', 0 ); | ||||
| } | ||||
|  | ||||
| sub getAutoAstroModeMorning { | ||||
| @@ -128,7 +117,7 @@ sub getAutoAstroModeMorning { | ||||
|  | ||||
|     my $name = $self->{name}; | ||||
|  | ||||
|     return AttrVal( $name, 'ASC_autoAstroModeMorning', 'REAL' ); | ||||
|     return ::AttrVal( $name, 'ASC_autoAstroModeMorning', 'REAL' ); | ||||
| } | ||||
|  | ||||
| sub getAutoAstroModeMorningHorizon { | ||||
| @@ -136,7 +125,7 @@ sub getAutoAstroModeMorningHorizon { | ||||
|  | ||||
|     my $name = $self->{name}; | ||||
|  | ||||
|     return AttrVal( $name, 'ASC_autoAstroModeMorningHorizon', 0 ); | ||||
|     return ::AttrVal( $name, 'ASC_autoAstroModeMorningHorizon', 0 ); | ||||
| } | ||||
|  | ||||
| sub getAutoShuttersControlMorning { | ||||
| @@ -144,7 +133,7 @@ sub getAutoShuttersControlMorning { | ||||
|  | ||||
|     my $name = $self->{name}; | ||||
|  | ||||
|     return AttrVal( $name, 'ASC_autoShuttersControlMorning', 'on' ); | ||||
|     return ::AttrVal( $name, 'ASC_autoShuttersControlMorning', 'on' ); | ||||
| } | ||||
|  | ||||
| sub getAutoShuttersControlEvening { | ||||
| @@ -152,7 +141,7 @@ sub getAutoShuttersControlEvening { | ||||
|  | ||||
|     my $name = $self->{name}; | ||||
|  | ||||
|     return AttrVal( $name, 'ASC_autoShuttersControlEvening', 'on' ); | ||||
|     return ::AttrVal( $name, 'ASC_autoShuttersControlEvening', 'on' ); | ||||
| } | ||||
|  | ||||
| sub getAutoShuttersControlComfort { | ||||
| @@ -160,7 +149,7 @@ sub getAutoShuttersControlComfort { | ||||
|  | ||||
|     my $name = $self->{name}; | ||||
|  | ||||
|     return AttrVal( $name, 'ASC_autoShuttersControlComfort', 'off' ); | ||||
|     return ::AttrVal( $name, 'ASC_autoShuttersControlComfort', 'off' ); | ||||
| } | ||||
|  | ||||
| sub getFreezeTemp { | ||||
| @@ -168,7 +157,7 @@ sub getFreezeTemp { | ||||
|  | ||||
|     my $name = $self->{name}; | ||||
|  | ||||
|     return AttrVal( $name, 'ASC_freezeTemp', 3 ); | ||||
|     return ::AttrVal( $name, 'ASC_freezeTemp', 3 ); | ||||
| } | ||||
|  | ||||
| sub getSlatDriveCmdInverse { | ||||
| @@ -176,7 +165,7 @@ sub getSlatDriveCmdInverse { | ||||
|  | ||||
|     my $name = $self->{name}; | ||||
|  | ||||
|     return AttrVal( $name, 'ASC_slatDriveCmdInverse', 0 ); | ||||
|     return ::AttrVal( $name, 'ASC_slatDriveCmdInverse', 0 ); | ||||
| } | ||||
|  | ||||
| sub _getTempSensor { | ||||
| @@ -186,11 +175,11 @@ sub _getTempSensor { | ||||
|  | ||||
|     return $self->{ASC_tempSensor}->{device} | ||||
|       if ( exists( $self->{ASC_tempSensor}->{LASTGETTIME} ) | ||||
|         && ( gettimeofday() - $self->{ASC_tempSensor}->{LASTGETTIME} ) < 2 ); | ||||
|     $self->{ASC_tempSensor}->{LASTGETTIME} = int( gettimeofday() ); | ||||
|         && ( ::gettimeofday() - $self->{ASC_tempSensor}->{LASTGETTIME} ) < 2 ); | ||||
|     $self->{ASC_tempSensor}->{LASTGETTIME} = int( ::gettimeofday() ); | ||||
|     my ( $device, $reading ) = | ||||
|       FHEM::Automation::ShuttersControl::Helper::GetAttrValues( $name, 'ASC_tempSensor', | ||||
|         'none' ); | ||||
|       FHEM::Automation::ShuttersControl::Helper::GetAttrValues( $name, | ||||
|         'ASC_tempSensor', 'none' ); | ||||
|  | ||||
|     ## erwartetes Ergebnis | ||||
|     # DEVICE:READING | ||||
| @@ -208,7 +197,7 @@ sub getTempSensorReading { | ||||
|  | ||||
|     return $self->{ASC_tempSensor}->{reading} | ||||
|       if ( exists( $self->{ASC_tempSensor}->{LASTGETTIME} ) | ||||
|         && ( gettimeofday() - $self->{ASC_tempSensor}->{LASTGETTIME} ) < 2 ); | ||||
|         && ( ::gettimeofday() - $self->{ASC_tempSensor}->{LASTGETTIME} ) < 2 ); | ||||
|     $FHEM::Automation::ShuttersControl::ascDev->_getTempSensor; | ||||
|     return $self->{ASC_tempSensor}->{reading}; | ||||
| } | ||||
| @@ -220,8 +209,9 @@ sub _getResidentsDev { | ||||
|  | ||||
|     return $self->{ASC_residentsDev}->{device} | ||||
|       if ( exists( $self->{ASC_residentsDev}->{LASTGETTIME} ) | ||||
|         && ( gettimeofday() - $self->{ASC_residentsDev}->{LASTGETTIME} ) < 2 ); | ||||
|     $self->{ASC_residentsDev}->{LASTGETTIME} = int( gettimeofday() ); | ||||
|         && ( ::gettimeofday() - $self->{ASC_residentsDev}->{LASTGETTIME} ) < | ||||
|         2 ); | ||||
|     $self->{ASC_residentsDev}->{LASTGETTIME} = int( ::gettimeofday() ); | ||||
|     my ( $device, $reading ) = | ||||
|       FHEM::Automation::ShuttersControl::Helper::GetAttrValues( $name, | ||||
|         'ASC_residentsDev', 'none' ); | ||||
| @@ -240,7 +230,8 @@ sub getResidentsReading { | ||||
|  | ||||
|     return $self->{ASC_residentsDev}->{reading} | ||||
|       if ( exists( $self->{ASC_residentsDev}->{LASTGETTIME} ) | ||||
|         && ( gettimeofday() - $self->{ASC_residentsDev}->{LASTGETTIME} ) < 2 ); | ||||
|         && ( ::gettimeofday() - $self->{ASC_residentsDev}->{LASTGETTIME} ) < | ||||
|         2 ); | ||||
|     $FHEM::Automation::ShuttersControl::ascDev->_getResidentsDev; | ||||
|     return $self->{ASC_residentsDev}->{reading}; | ||||
| } | ||||
| @@ -252,11 +243,11 @@ sub _getRainSensor { | ||||
|  | ||||
|     return $self->{ASC_rainSensor}->{device} | ||||
|       if ( exists( $self->{ASC_rainSensor}->{LASTGETTIME} ) | ||||
|         && ( gettimeofday() - $self->{ASC_rainSensor}->{LASTGETTIME} ) < 2 ); | ||||
|     $self->{ASC_rainSensor}->{LASTGETTIME} = int( gettimeofday() ); | ||||
|         && ( ::gettimeofday() - $self->{ASC_rainSensor}->{LASTGETTIME} ) < 2 ); | ||||
|     $self->{ASC_rainSensor}->{LASTGETTIME} = int( ::gettimeofday() ); | ||||
|     my ( $device, $reading, $max, $hyst, $pos, $wait ) = | ||||
|       FHEM::Automation::ShuttersControl::Helper::GetAttrValues( $name, 'ASC_rainSensor', | ||||
|         'none' ); | ||||
|       FHEM::Automation::ShuttersControl::Helper::GetAttrValues( $name, | ||||
|         'ASC_rainSensor', 'none' ); | ||||
|  | ||||
|     ## erwartetes Ergebnis | ||||
|     # DEVICE:READING MAX:HYST | ||||
| @@ -266,10 +257,10 @@ sub _getRainSensor { | ||||
|     $self->{ASC_rainSensor}->{reading} = | ||||
|       ( $reading ne 'none' ? $reading : 'rain' ); | ||||
|     $self->{ASC_rainSensor}->{triggermax} = ( | ||||
|          (   $max ne 'none' | ||||
|           && $max =~ m{\A(-?\d+(\.\d+)?)\z}xms ) | ||||
|         ( $max ne 'none' && $max =~ m{\A(-?\d+(\.\d+)?)\z}xms ) | ||||
|         ? $max | ||||
|         : 1000 ); | ||||
|         : 1000 | ||||
|     ); | ||||
|  | ||||
|     $self->{ASC_rainSensor}->{triggerhyst} = ( | ||||
|           $hyst ne 'none' | ||||
| @@ -277,10 +268,11 @@ sub _getRainSensor { | ||||
|         : ( $self->{ASC_rainSensor}->{triggermax} * 0 ) | ||||
|     ); | ||||
|  | ||||
|     $self->{ASC_rainSensor}->{shuttersClosedPos} = | ||||
|       (   $pos ne 'none' | ||||
|     $self->{ASC_rainSensor}->{shuttersClosedPos} = ( | ||||
|           $pos ne 'none' | ||||
|         ? $pos | ||||
|         : $FHEM::Automation::ShuttersControl::shutters->getClosedPos ); | ||||
|         : $FHEM::Automation::ShuttersControl::shutters->getClosedPos | ||||
|     ); | ||||
|     $self->{ASC_rainSensor}->{waitingTime} = | ||||
|       ( $wait ne 'none' ? $wait : 0 ); | ||||
|  | ||||
| @@ -294,7 +286,7 @@ sub getRainSensorReading { | ||||
|  | ||||
|     return $self->{ASC_rainSensor}->{reading} | ||||
|       if ( exists( $self->{ASC_rainSensor}->{LASTGETTIME} ) | ||||
|         && ( gettimeofday() - $self->{ASC_rainSensor}->{LASTGETTIME} ) < 2 ); | ||||
|         && ( ::gettimeofday() - $self->{ASC_rainSensor}->{LASTGETTIME} ) < 2 ); | ||||
|     $FHEM::Automation::ShuttersControl::ascDev->_getRainSensor; | ||||
|     return $self->{ASC_rainSensor}->{reading}; | ||||
| } | ||||
| @@ -306,7 +298,7 @@ sub getRainTriggerMax { | ||||
|  | ||||
|     return $self->{ASC_rainSensor}->{triggermax} | ||||
|       if ( exists( $self->{ASC_rainSensor}->{LASTGETTIME} ) | ||||
|         && ( gettimeofday() - $self->{ASC_rainSensor}->{LASTGETTIME} ) < 2 ); | ||||
|         && ( ::gettimeofday() - $self->{ASC_rainSensor}->{LASTGETTIME} ) < 2 ); | ||||
|     $FHEM::Automation::ShuttersControl::ascDev->_getRainSensor; | ||||
|     return $self->{ASC_rainSensor}->{triggermax}; | ||||
| } | ||||
| @@ -318,7 +310,7 @@ sub getRainTriggerMin { | ||||
|  | ||||
|     return $self->{ASC_rainSensor}->{triggerhyst} | ||||
|       if ( exists( $self->{ASC_rainSensor}->{LASTGETTIME} ) | ||||
|         && ( gettimeofday() - $self->{ASC_rainSensor}->{LASTGETTIME} ) < 2 ); | ||||
|         && ( ::gettimeofday() - $self->{ASC_rainSensor}->{LASTGETTIME} ) < 2 ); | ||||
|     $FHEM::Automation::ShuttersControl::ascDev->_getRainSensor; | ||||
|     return $self->{ASC_rainSensor}->{triggerhyst}; | ||||
| } | ||||
| @@ -330,7 +322,7 @@ sub getRainSensorShuttersClosedPos { | ||||
|  | ||||
|     return $self->{ASC_rainSensor}->{shuttersClosedPos} | ||||
|       if ( exists( $self->{ASC_rainSensor}->{LASTGETTIME} ) | ||||
|         && ( gettimeofday() - $self->{ASC_rainSensor}->{LASTGETTIME} ) < 2 ); | ||||
|         && ( ::gettimeofday() - $self->{ASC_rainSensor}->{LASTGETTIME} ) < 2 ); | ||||
|     $FHEM::Automation::ShuttersControl::ascDev->_getRainSensor; | ||||
|     return $self->{ASC_rainSensor}->{shuttersClosedPos}; | ||||
| } | ||||
| @@ -342,7 +334,7 @@ sub getRainWaitingTime { | ||||
|  | ||||
|     return $self->{ASC_rainSensor}->{waitingTime} | ||||
|       if ( exists( $self->{ASC_rainSensor}->{LASTGETTIME} ) | ||||
|         && ( gettimeofday() - $self->{ASC_rainSensor}->{LASTGETTIME} ) < 2 ); | ||||
|         && ( ::gettimeofday() - $self->{ASC_rainSensor}->{LASTGETTIME} ) < 2 ); | ||||
|     $FHEM::Automation::ShuttersControl::ascDev->_getRainSensor; | ||||
|     return $self->{ASC_rainSensor}->{waitingTime}; | ||||
| } | ||||
| @@ -354,11 +346,11 @@ sub _getWindSensor { | ||||
|  | ||||
|     return $self->{ASC_windSensor}->{device} | ||||
|       if ( exists( $self->{ASC_windSensor}->{LASTGETTIME} ) | ||||
|         && ( gettimeofday() - $self->{ASC_windSensor}->{LASTGETTIME} ) < 2 ); | ||||
|     $self->{ASC_windSensor}->{LASTGETTIME} = int( gettimeofday() ); | ||||
|         && ( ::gettimeofday() - $self->{ASC_windSensor}->{LASTGETTIME} ) < 2 ); | ||||
|     $self->{ASC_windSensor}->{LASTGETTIME} = int( ::gettimeofday() ); | ||||
|     my ( $device, $reading ) = | ||||
|       FHEM::Automation::ShuttersControl::Helper::GetAttrValues( $name, 'ASC_windSensor', | ||||
|         'none' ); | ||||
|       FHEM::Automation::ShuttersControl::Helper::GetAttrValues( $name, | ||||
|         'ASC_windSensor', 'none' ); | ||||
|  | ||||
|     return $device if ( $device eq 'none' ); | ||||
|     $self->{ASC_windSensor}->{device} = $device; | ||||
| @@ -375,7 +367,7 @@ sub getWindSensorReading { | ||||
|  | ||||
|     return $self->{ASC_windSensor}->{reading} | ||||
|       if ( exists( $self->{ASC_windSensor}->{LASTGETTIME} ) | ||||
|         && ( gettimeofday() - $self->{ASC_windSensor}->{LASTGETTIME} ) < 2 ); | ||||
|         && ( ::gettimeofday() - $self->{ASC_windSensor}->{LASTGETTIME} ) < 2 ); | ||||
|     $FHEM::Automation::ShuttersControl::ascDev->_getWindSensor; | ||||
|     return ( | ||||
|         defined( $self->{ASC_windSensor}->{reading} ) | ||||
| @@ -389,18 +381,23 @@ sub getBlockAscDrivesAfterManual { | ||||
|  | ||||
|     my $name = $self->{name}; | ||||
|  | ||||
|     return AttrVal( $name, 'ASC_blockAscDrivesAfterManual', 0 ); | ||||
|     return ::AttrVal( $name, 'ASC_blockAscDrivesAfterManual', 0 ); | ||||
| } | ||||
|  | ||||
| sub getAdvDate { | ||||
| sub getAdvStartDate { | ||||
|     my $self = shift; | ||||
|  | ||||
|     my $name = $self->{name}; | ||||
|  | ||||
|     return AttrVal( $name, 'ASC_advDate', 'FirstAdvent' ); | ||||
|     return ::AttrVal( $name, 'ASC_advStartDate', 'FirstAdvent' ); | ||||
| } | ||||
|  | ||||
| sub getAdvEndDate { | ||||
|     my $self = shift; | ||||
|  | ||||
|     my $name = $self->{name}; | ||||
|  | ||||
|     return ::AttrVal( $name, 'ASC_advEndDate', 'EpiphanyDay' ); | ||||
| } | ||||
|  | ||||
| 1; | ||||
|   | ||||
| @@ -1,8 +1,8 @@ | ||||
| ############################################################################### | ||||
| # | ||||
| # Developed with Kate | ||||
| # Developed with VSCodium and richterger perl plugin | ||||
| # | ||||
| #  (c) 2018-2020 Copyright: Marko Oldenburg (leongaultier at gmail dot com) | ||||
| #  (c) 2018-2025 Copyright: Marko Oldenburg (fhemdevelopment at cooltux dot net) | ||||
| #  All rights reserved | ||||
| # | ||||
| #   Special thanks goes to: | ||||
| @@ -48,12 +48,7 @@ use GPUtils qw(GP_Import); | ||||
|  | ||||
| ## Import der FHEM Funktionen | ||||
| BEGIN { | ||||
|     GP_Import( | ||||
|         qw( | ||||
|           readingsSingleUpdate | ||||
|           ReadingsVal | ||||
|           defs) | ||||
|     ); | ||||
|     GP_Import(qw(defs)); | ||||
| } | ||||
|  | ||||
| sub setDelayCmdReading { | ||||
| @@ -62,7 +57,7 @@ sub setDelayCmdReading { | ||||
|     my $name = $self->{name}; | ||||
|     my $hash = $defs{$name}; | ||||
|  | ||||
|     readingsSingleUpdate( | ||||
|     ::readingsSingleUpdate( | ||||
|         $hash, | ||||
|         $FHEM::Automation::ShuttersControl::shutters->getShuttersDev | ||||
|           . '_lastDelayPosValue', | ||||
| @@ -79,7 +74,7 @@ sub setStateReading { | ||||
|     my $name = $self->{name}; | ||||
|     my $hash = $defs{$name}; | ||||
|  | ||||
|     readingsSingleUpdate( | ||||
|     ::readingsSingleUpdate( | ||||
|         $hash, 'state', | ||||
|         ( | ||||
|             defined($value) | ||||
| @@ -97,7 +92,7 @@ sub setPosReading { | ||||
|     my $name = $self->{name}; | ||||
|     my $hash = $defs{$name}; | ||||
|  | ||||
|     readingsSingleUpdate( | ||||
|     ::readingsSingleUpdate( | ||||
|         $hash, | ||||
|         $FHEM::Automation::ShuttersControl::shutters->getShuttersDev | ||||
|           . '_PosValue', | ||||
| @@ -113,7 +108,7 @@ sub setLastPosReading { | ||||
|     my $name = $self->{name}; | ||||
|     my $hash = $defs{$name}; | ||||
|  | ||||
|     readingsSingleUpdate( | ||||
|     ::readingsSingleUpdate( | ||||
|         $hash, | ||||
|         $FHEM::Automation::ShuttersControl::shutters->getShuttersDev | ||||
|           . '_lastPosValue', | ||||
| @@ -128,7 +123,7 @@ sub getPartyMode { | ||||
|  | ||||
|     my $name = $self->{name}; | ||||
|  | ||||
|     return ReadingsVal( $name, 'partyMode', 'off' ); | ||||
|     return ::ReadingsVal( $name, 'partyMode', 'off' ); | ||||
| } | ||||
|  | ||||
| sub getHardLockOut { | ||||
| @@ -136,7 +131,7 @@ sub getHardLockOut { | ||||
|  | ||||
|     my $name = $self->{name}; | ||||
|  | ||||
|     return ReadingsVal( $name, 'hardLockOut', 'none' ); | ||||
|     return ::ReadingsVal( $name, 'hardLockOut', 'none' ); | ||||
| } | ||||
|  | ||||
| sub getSunriseTimeWeHoliday { | ||||
| @@ -144,7 +139,7 @@ sub getSunriseTimeWeHoliday { | ||||
|  | ||||
|     my $name = $self->{name}; | ||||
|  | ||||
|     return ReadingsVal( $name, 'sunriseTimeWeHoliday', 'none' ); | ||||
|     return ::ReadingsVal( $name, 'sunriseTimeWeHoliday', 'none' ); | ||||
| } | ||||
|  | ||||
| sub getMonitoredDevs { | ||||
| @@ -152,14 +147,14 @@ sub getMonitoredDevs { | ||||
|  | ||||
|     my $name = $self->{name}; | ||||
|  | ||||
|     $self->{monitoredDevs} = ReadingsVal( $name, '.monitoredDevs', 'none' ); | ||||
|     $self->{monitoredDevs} = ::ReadingsVal( $name, '.monitoredDevs', 'none' ); | ||||
|     return $self->{monitoredDevs}; | ||||
| } | ||||
|  | ||||
| sub getOutTemp { | ||||
|     my $self = shift; | ||||
|  | ||||
|     return ReadingsVal( | ||||
|     return ::ReadingsVal( | ||||
|         $FHEM::Automation::ShuttersControl::ascDev->_getTempSensor, | ||||
|         $FHEM::Automation::ShuttersControl::ascDev->getTempSensorReading, | ||||
|         -100 ); | ||||
| @@ -169,7 +164,8 @@ sub getResidentsStatus { | ||||
|     my $self = shift; | ||||
|  | ||||
|     my $val = | ||||
|       ReadingsVal( $FHEM::Automation::ShuttersControl::ascDev->_getResidentsDev, | ||||
|       ::ReadingsVal( | ||||
|         $FHEM::Automation::ShuttersControl::ascDev->_getResidentsDev, | ||||
|         $FHEM::Automation::ShuttersControl::ascDev->getResidentsReading, | ||||
|         'none' ); | ||||
|  | ||||
| @@ -178,7 +174,7 @@ sub getResidentsStatus { | ||||
|         return $1 && $1 eq 'pet' ? 'absent' : $2; | ||||
|     } | ||||
|     elsif ( | ||||
|         ReadingsVal( | ||||
|         ::ReadingsVal( | ||||
|             $FHEM::Automation::ShuttersControl::ascDev->_getResidentsDev, | ||||
|             'homealoneType', '-' ) eq 'PET' | ||||
|       ) | ||||
| @@ -196,7 +192,8 @@ sub getResidentsLastStatus { | ||||
|     my $self = shift; | ||||
|  | ||||
|     my $val = | ||||
|       ReadingsVal( $FHEM::Automation::ShuttersControl::ascDev->_getResidentsDev, | ||||
|       ::ReadingsVal( | ||||
|         $FHEM::Automation::ShuttersControl::ascDev->_getResidentsDev, | ||||
|         'lastState', 'none' ); | ||||
|  | ||||
|     if ( $val =~ m{^(?:(.+)_)?(.+)$}xms ) { | ||||
| @@ -204,7 +201,7 @@ sub getResidentsLastStatus { | ||||
|         return $1 && $1 eq 'pet' ? 'absent' : $2; | ||||
|     } | ||||
|     elsif ( | ||||
|         ReadingsVal( | ||||
|         ::ReadingsVal( | ||||
|             $FHEM::Automation::ShuttersControl::ascDev->_getResidentsDev, | ||||
|             'lastHomealoneType', '-' ) eq 'PET' | ||||
|       ) | ||||
| @@ -223,7 +220,7 @@ sub getAutoShuttersControlShading { | ||||
|  | ||||
|     my $name = $self->{name}; | ||||
|  | ||||
|     return ReadingsVal( $name, 'controlShading', 'none' ); | ||||
|     return ::ReadingsVal( $name, 'controlShading', 'none' ); | ||||
| } | ||||
|  | ||||
| sub getSelfDefense { | ||||
| @@ -231,7 +228,7 @@ sub getSelfDefense { | ||||
|  | ||||
|     my $name = $self->{name}; | ||||
|  | ||||
|     return ReadingsVal( $name, 'selfDefense', 'none' ); | ||||
|     return ::ReadingsVal( $name, 'selfDefense', 'none' ); | ||||
| } | ||||
|  | ||||
| sub getAzimuth { | ||||
| @@ -239,13 +236,13 @@ sub getAzimuth { | ||||
|  | ||||
|     my $azimuth; | ||||
|  | ||||
|     $azimuth = ReadingsVal( | ||||
|     $azimuth = ::ReadingsVal( | ||||
|         $FHEM::Automation::ShuttersControl::ascDev->_getTwilightDevice, | ||||
|         'azimuth', -1 ) | ||||
|       if ( | ||||
|         $defs{ $FHEM::Automation::ShuttersControl::ascDev->_getTwilightDevice } | ||||
|         ->{TYPE} eq 'Twilight' ); | ||||
|     $azimuth = ReadingsVal( | ||||
|     $azimuth = ::ReadingsVal( | ||||
|         $FHEM::Automation::ShuttersControl::ascDev->_getTwilightDevice, | ||||
|         'SunAz', -1 ) | ||||
|       if ( | ||||
| @@ -260,13 +257,13 @@ sub getElevation { | ||||
|  | ||||
|     my $elevation; | ||||
|  | ||||
|     $elevation = ReadingsVal( | ||||
|     $elevation = ::ReadingsVal( | ||||
|         $FHEM::Automation::ShuttersControl::ascDev->_getTwilightDevice, | ||||
|         'elevation', -1 ) | ||||
|       if ( | ||||
|         $defs{ $FHEM::Automation::ShuttersControl::ascDev->_getTwilightDevice } | ||||
|         ->{TYPE} eq 'Twilight' ); | ||||
|     $elevation = ReadingsVal( | ||||
|     $elevation = ::ReadingsVal( | ||||
|         $FHEM::Automation::ShuttersControl::ascDev->_getTwilightDevice, | ||||
|         'SunAlt', -1 ) | ||||
|       if ( | ||||
| @@ -281,7 +278,7 @@ sub getASCenable { | ||||
|  | ||||
|     my $name = $self->{name}; | ||||
|  | ||||
|     return ReadingsVal( $name, 'ascEnable', 'none' ); | ||||
|     return ::ReadingsVal( $name, 'ascEnable', 'none' ); | ||||
| } | ||||
|  | ||||
| 1; | ||||
|   | ||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -1,8 +1,8 @@ | ||||
| ############################################################################### | ||||
| # | ||||
| # Developed with Kate | ||||
| # Developed with VSCodium and richterger perl plugin | ||||
| # | ||||
| #  (c) 2018-2020 Copyright: Marko Oldenburg (fhemsupport@cooltux.net) | ||||
| #  (c) 2018-2025 Copyright: Marko Oldenburg (fhemdevelopment at cooltux dot net) | ||||
| #  All rights reserved | ||||
| # | ||||
| #   Special thanks goes to: | ||||
| @@ -46,7 +46,9 @@ use POSIX qw(strftime); | ||||
| use utf8; | ||||
|  | ||||
| require Exporter; | ||||
| our @ISA       = qw(Exporter); | ||||
| use base qw(Exporter); | ||||
|  | ||||
| # our @ISA       = qw(Exporter); | ||||
| our @EXPORT_OK = qw( | ||||
|   PositionValueWindowRec | ||||
|   AutoSearchTwilightDev | ||||
| @@ -82,28 +84,14 @@ our %EXPORT_TAGS = ( | ||||
|           PerlCodeCheck | ||||
|           IsAdv | ||||
|           IsInTime | ||||
|           ) | ||||
|         ) | ||||
|     ], | ||||
| ); | ||||
|  | ||||
| use GPUtils qw(GP_Import); | ||||
| ## Import der FHEM Funktionen | ||||
| BEGIN { | ||||
|     GP_Import( | ||||
|         qw( | ||||
|           devspec2array | ||||
|           CommandAttr | ||||
|           AttrVal | ||||
|           Log3 | ||||
|           computeAlignTime | ||||
|           gettimeofday | ||||
|           sunset | ||||
|           sunset_abs | ||||
|           sunrise | ||||
|           sunrise_abs | ||||
|           cmdFromAnalyze | ||||
|           ) | ||||
|     ); | ||||
|     GP_Import(qw(cmdFromAnalyze)); | ||||
| } | ||||
|  | ||||
| sub PositionValueWindowRec { | ||||
| @@ -156,12 +144,12 @@ sub AutoSearchTwilightDev { | ||||
|  | ||||
|     my $name = $hash->{NAME}; | ||||
|  | ||||
|     if ( devspec2array('TYPE=(Astro|Twilight)') > 0 ) { | ||||
|         CommandAttr( undef, | ||||
|     if ( ::devspec2array('TYPE=(Astro|Twilight)') > 0 ) { | ||||
|         ::CommandAttr( undef, | ||||
|                 $name | ||||
|               . ' ASC_twilightDevice ' | ||||
|               . ( devspec2array('TYPE=(Astro|Twilight)') )[0] ) | ||||
|           if ( AttrVal( $name, 'ASC_twilightDevice', 'none' ) eq 'none' ); | ||||
|               . ( ::devspec2array('TYPE=(Astro|Twilight)') )[0] ) | ||||
|           if ( ::AttrVal( $name, 'ASC_twilightDevice', 'none' ) eq 'none' ); | ||||
|     } | ||||
|  | ||||
|     return; | ||||
| @@ -172,8 +160,10 @@ sub GetAttrValues { | ||||
|     my $attribut = shift; | ||||
|     my $default  = shift; | ||||
|  | ||||
|     my @values = split( ' ', | ||||
|         AttrVal( $dev, $attribut, ( defined($default) ? $default : 'none' ) ) ); | ||||
|     my @values = split( | ||||
|         ' ', | ||||
|         ::AttrVal( $dev, $attribut, ( defined($default) ? $default : 'none' ) ) | ||||
|     ); | ||||
|     my ( $value1, $value2 ) = split( ':', $values[0] ); | ||||
|  | ||||
|     my ( $value3, $value4, $value5, $value6, $value7, $value8 ); | ||||
| @@ -217,7 +207,7 @@ sub CheckIfShuttersWindowRecOpen { | ||||
|         m{[Cc]lose|true}xms ) | ||||
|     { | ||||
|         return 0; | ||||
|     }                            # CK: covers: close|closed | ||||
|     }    # CK: covers: close|closed | ||||
| } | ||||
|  | ||||
| sub ExtractNotifyDevFromEvent { | ||||
| @@ -227,10 +217,10 @@ sub ExtractNotifyDevFromEvent { | ||||
|  | ||||
|     my %notifyDevs; | ||||
|     while ( my $notifyDev = each %{ $hash->{monitoredDevs} } ) { | ||||
|         Log3( $hash->{NAME}, 4, | ||||
|         ::Log3( $hash->{NAME}, 4, | ||||
| "AutoShuttersControl ($hash->{NAME}) - ExtractNotifyDevFromEvent - NotifyDev: " | ||||
|               . $notifyDev ); | ||||
|         Log3( $hash->{NAME}, 5, | ||||
|         ::Log3( $hash->{NAME}, 5, | ||||
| "AutoShuttersControl ($hash->{NAME}) - ExtractNotifyDevFromEvent - ShuttersDev: " | ||||
|               . $shuttersDev ); | ||||
|  | ||||
| @@ -238,10 +228,10 @@ sub ExtractNotifyDevFromEvent { | ||||
|             && $hash->{monitoredDevs}{$notifyDev}{$shuttersDev} eq | ||||
|             $shuttersAttr ) | ||||
|         { | ||||
|             Log3( $hash->{NAME}, 4, | ||||
|             ::Log3( $hash->{NAME}, 4, | ||||
| "AutoShuttersControl ($hash->{NAME}) - ExtractNotifyDevFromEvent - ShuttersDevHash: " | ||||
|                   . $hash->{monitoredDevs}{$notifyDev}{$shuttersDev} ); | ||||
|             Log3( $hash->{NAME}, 5, | ||||
|             ::Log3( $hash->{NAME}, 5, | ||||
| "AutoShuttersControl ($hash->{NAME}) - ExtractNotifyDevFromEvent - return ShuttersDev: " | ||||
|                   . $notifyDev ); | ||||
|             $notifyDevs{$notifyDev} = $shuttersDev; | ||||
| @@ -279,24 +269,27 @@ sub _IsDay { | ||||
|         ( | ||||
|             ( | ||||
|                 ( | ||||
|                     int( gettimeofday() / 86400 ) != int( | ||||
|                         computeAlignTime( '24:00', | ||||
|                     int( ::gettimeofday() / 86400 ) != int( | ||||
|                         ::computeAlignTime( | ||||
|                             '24:00', | ||||
|                             $FHEM::Automation::ShuttersControl::shutters | ||||
|                               ->getTimeUpEarly ) / 86400 | ||||
|                               ->getTimeUpEarly | ||||
|                         ) / 86400 | ||||
|                     ) | ||||
|                     && ( !IsWe() | ||||
|                       || ( IsWe() | ||||
|                         && ( $FHEM::Automation::ShuttersControl::ascDev | ||||
|                           ->getSunriseTimeWeHoliday eq 'off' | ||||
|                           || $FHEM::Automation::ShuttersControl::shutters | ||||
|                             ->getTimeUpWeHoliday eq '01:25' | ||||
|                            ) | ||||
|                          ) | ||||
|                     && ( | ||||
|                         !IsWe() | ||||
|                         || ( | ||||
|                             IsWe() | ||||
|                             && ( $FHEM::Automation::ShuttersControl::ascDev | ||||
|                                 ->getSunriseTimeWeHoliday eq 'off' | ||||
|                                 || $FHEM::Automation::ShuttersControl::shutters | ||||
|                                 ->getTimeUpWeHoliday eq '01:25' ) | ||||
|                         ) | ||||
|                     ) | ||||
|                 ) | ||||
|                 || ( | ||||
|                     int( gettimeofday() / 86400 ) != int( | ||||
|                         computeAlignTime( | ||||
|                     int( ::gettimeofday() / 86400 ) != int( | ||||
|                         ::computeAlignTime( | ||||
|                             '24:00', | ||||
|                             $FHEM::Automation::ShuttersControl::shutters | ||||
|                               ->getTimeUpWeHoliday | ||||
| @@ -309,23 +302,23 @@ sub _IsDay { | ||||
|                     ->getTimeUpWeHoliday ne '01:25' | ||||
|                 ) | ||||
|             ) | ||||
|             && int( gettimeofday() / 86400 ) == int( | ||||
|                 computeAlignTime( | ||||
|             && int( ::gettimeofday() / 86400 ) == int( | ||||
|                 ::computeAlignTime( | ||||
|                     '24:00', | ||||
|                     $FHEM::Automation::ShuttersControl::shutters->getTimeUpLate | ||||
|                 ) / 86400 | ||||
|             ) | ||||
|         ) | ||||
|         || ( | ||||
|             int( gettimeofday() / 86400 ) != int( | ||||
|                 computeAlignTime( | ||||
|             int( ::gettimeofday() / 86400 ) != int( | ||||
|                 ::computeAlignTime( | ||||
|                     '24:00', | ||||
|                     $FHEM::Automation::ShuttersControl::shutters | ||||
|                       ->getTimeDownEarly | ||||
|                 ) / 86400 | ||||
|             ) | ||||
|             && int( gettimeofday() / 86400 ) == int( | ||||
|                 computeAlignTime( | ||||
|             && int( ::gettimeofday() / 86400 ) == int( | ||||
|                 ::computeAlignTime( | ||||
|                     '24:00', | ||||
|                     $FHEM::Automation::ShuttersControl::shutters | ||||
|                       ->getTimeDownLate | ||||
| @@ -390,25 +383,32 @@ sub _IsDay { | ||||
|               . $FHEM::Automation::ShuttersControl::shutters->getSunrise ); | ||||
|     } | ||||
|  | ||||
|      | ||||
|     $respIsDay = 1 | ||||
|       if ( | ||||
|            (  $FHEM::Automation::ShuttersControl::shutters->getDown eq 'roommate' | ||||
|              and ( $FHEM::Automation::ShuttersControl::shutters->getRoommates ne 'asleep' | ||||
|                 or $FHEM::Automation::ShuttersControl::shutters->getRoommates ne 'gotosleep' ) | ||||
|            )  | ||||
|         or (  $FHEM::Automation::ShuttersControl::shutters->getUp eq 'roommate' | ||||
|              and ( $FHEM::Automation::ShuttersControl::shutters->getRoommates ne 'asleep' | ||||
|                 or $FHEM::Automation::ShuttersControl::shutters->getRoommates ne 'gotosleep' ) | ||||
|            ) | ||||
|         ( | ||||
|             $FHEM::Automation::ShuttersControl::shutters->getDown eq 'roommate' | ||||
|             and ( $FHEM::Automation::ShuttersControl::shutters->getRoommates ne | ||||
|                 'asleep' | ||||
|                 or $FHEM::Automation::ShuttersControl::shutters->getRoommates | ||||
|                 ne 'gotosleep' ) | ||||
|         ) | ||||
|         or ( | ||||
|             $FHEM::Automation::ShuttersControl::shutters->getUp eq 'roommate' | ||||
|             and ( $FHEM::Automation::ShuttersControl::shutters->getRoommates ne | ||||
|                 'asleep' | ||||
|                 or $FHEM::Automation::ShuttersControl::shutters->getRoommates | ||||
|                 ne 'gotosleep' ) | ||||
|         ) | ||||
|         or ( $FHEM::Automation::ShuttersControl::shutters->getShuttersPlace eq | ||||
|             'awning' ) | ||||
|       ); | ||||
|      | ||||
|  | ||||
|     return $respIsDay; | ||||
| } | ||||
|  | ||||
| sub ShuttersSunrise { | ||||
|     my $shuttersDev = shift; | ||||
|     my $tm = shift; # Tm steht für Timemode und bedeutet Realzeit oder Unixzeit | ||||
|     my $tm = shift;  # Tm steht für Timemode und bedeutet Realzeit oder Unixzeit | ||||
|  | ||||
|     my $autoAstroMode; | ||||
|     $FHEM::Automation::ShuttersControl::shutters->setShuttersDev($shuttersDev); | ||||
| @@ -436,7 +436,7 @@ sub ShuttersSunrise { | ||||
|     my $oldFuncHash = | ||||
|       $FHEM::Automation::ShuttersControl::shutters->getInTimerFuncHash; | ||||
|     my $shuttersSunriseUnixtime = | ||||
|       computeAlignTime( '24:00', sunrise( 'REAL', 0, '4:30', '8:30' ) ); | ||||
|       ::computeAlignTime( '24:00', ::sunrise( 'REAL', 0, '4:30', '8:30' ) ); | ||||
|  | ||||
|     if ( $tm eq 'unix' ) { | ||||
|         if ( $FHEM::Automation::ShuttersControl::shutters->getUp eq 'astro' ) { | ||||
| @@ -449,11 +449,11 @@ sub ShuttersSunrise { | ||||
|                 if ( !IsWe('tomorrow') ) { | ||||
|                     if ( | ||||
|                         IsWe() | ||||
|                         && int( gettimeofday() / 86400 ) == int( | ||||
|                         && int( ::gettimeofday() / 86400 ) == int( | ||||
|                             ( | ||||
|                                 computeAlignTime( | ||||
|                                 ::computeAlignTime( | ||||
|                                     '24:00', | ||||
|                                     sunrise_abs( | ||||
|                                     ::sunrise_abs( | ||||
|                                         $autoAstroMode, | ||||
|                                         0, | ||||
|                                         $FHEM::Automation::ShuttersControl::shutters | ||||
| @@ -465,9 +465,9 @@ sub ShuttersSunrise { | ||||
|                       ) | ||||
|                     { | ||||
|                         $shuttersSunriseUnixtime = ( | ||||
|                             computeAlignTime( | ||||
|                             ::computeAlignTime( | ||||
|                                 '24:00', | ||||
|                                 sunrise_abs( | ||||
|                                 ::sunrise_abs( | ||||
|                                     $autoAstroMode, | ||||
|                                     0, | ||||
|                                     $FHEM::Automation::ShuttersControl::shutters | ||||
| @@ -477,11 +477,11 @@ sub ShuttersSunrise { | ||||
|                         ); | ||||
|                     } | ||||
|                     elsif ( | ||||
|                         int( gettimeofday() / 86400 ) == int( | ||||
|                         int( ::gettimeofday() / 86400 ) == int( | ||||
|                             ( | ||||
|                                 computeAlignTime( | ||||
|                                 ::computeAlignTime( | ||||
|                                     '24:00', | ||||
|                                     sunrise_abs( | ||||
|                                     ::sunrise_abs( | ||||
|                                         $autoAstroMode, | ||||
|                                         0, | ||||
|                                         $FHEM::Automation::ShuttersControl::shutters | ||||
| @@ -495,9 +495,9 @@ sub ShuttersSunrise { | ||||
|                       ) | ||||
|                     { | ||||
|                         $shuttersSunriseUnixtime = ( | ||||
|                             computeAlignTime( | ||||
|                             ::computeAlignTime( | ||||
|                                 '24:00', | ||||
|                                 sunrise_abs( | ||||
|                                 ::sunrise_abs( | ||||
|                                     $autoAstroMode, | ||||
|                                     0, | ||||
|                                     $FHEM::Automation::ShuttersControl::shutters | ||||
| @@ -508,9 +508,9 @@ sub ShuttersSunrise { | ||||
|                     } | ||||
|                     else { | ||||
|                         $shuttersSunriseUnixtime = ( | ||||
|                             computeAlignTime( | ||||
|                             ::computeAlignTime( | ||||
|                                 '24:00', | ||||
|                                 sunrise_abs( | ||||
|                                 ::sunrise_abs( | ||||
|                                     $autoAstroMode, | ||||
|                                     0, | ||||
|                                     $FHEM::Automation::ShuttersControl::shutters | ||||
| @@ -526,11 +526,11 @@ sub ShuttersSunrise { | ||||
|                     if ( | ||||
|                         IsWe() | ||||
|                         && ( | ||||
|                             int( gettimeofday() / 86400 ) == int( | ||||
|                             int( ::gettimeofday() / 86400 ) == int( | ||||
|                                 ( | ||||
|                                     computeAlignTime( | ||||
|                                     ::computeAlignTime( | ||||
|                                         '24:00', | ||||
|                                         sunrise_abs( | ||||
|                                         ::sunrise_abs( | ||||
|                                             $autoAstroMode, | ||||
|                                             0, | ||||
|                                             $FHEM::Automation::ShuttersControl::shutters | ||||
| @@ -539,11 +539,11 @@ sub ShuttersSunrise { | ||||
|                                     ) + 1 | ||||
|                                 ) / 86400 | ||||
|                             ) | ||||
|                             || int( gettimeofday() / 86400 ) != int( | ||||
|                             || int( ::gettimeofday() / 86400 ) != int( | ||||
|                                 ( | ||||
|                                     computeAlignTime( | ||||
|                                     ::computeAlignTime( | ||||
|                                         '24:00', | ||||
|                                         sunrise_abs( | ||||
|                                         ::sunrise_abs( | ||||
|                                             $autoAstroMode, | ||||
|                                             0, | ||||
|                                             $FHEM::Automation::ShuttersControl::shutters | ||||
| @@ -556,9 +556,9 @@ sub ShuttersSunrise { | ||||
|                       ) | ||||
|                     { | ||||
|                         $shuttersSunriseUnixtime = ( | ||||
|                             computeAlignTime( | ||||
|                             ::computeAlignTime( | ||||
|                                 '24:00', | ||||
|                                 sunrise_abs( | ||||
|                                 ::sunrise_abs( | ||||
|                                     $autoAstroMode, | ||||
|                                     0, | ||||
|                                     $FHEM::Automation::ShuttersControl::shutters | ||||
| @@ -568,11 +568,11 @@ sub ShuttersSunrise { | ||||
|                         ); | ||||
|                     } | ||||
|                     elsif ( | ||||
|                         int( gettimeofday() / 86400 ) == int( | ||||
|                         int( ::gettimeofday() / 86400 ) == int( | ||||
|                             ( | ||||
|                                 computeAlignTime( | ||||
|                                 ::computeAlignTime( | ||||
|                                     '24:00', | ||||
|                                     sunrise_abs( | ||||
|                                     ::sunrise_abs( | ||||
|                                         $autoAstroMode, | ||||
|                                         0, | ||||
|                                         $FHEM::Automation::ShuttersControl::shutters | ||||
| @@ -586,9 +586,9 @@ sub ShuttersSunrise { | ||||
|                       ) | ||||
|                     { | ||||
|                         $shuttersSunriseUnixtime = ( | ||||
|                             computeAlignTime( | ||||
|                             ::computeAlignTime( | ||||
|                                 '24:00', | ||||
|                                 sunrise_abs( | ||||
|                                 ::sunrise_abs( | ||||
|                                     $autoAstroMode, | ||||
|                                     0, | ||||
|                                     $FHEM::Automation::ShuttersControl::shutters | ||||
| @@ -601,11 +601,11 @@ sub ShuttersSunrise { | ||||
|                     } | ||||
|                     else { | ||||
|                         if ( | ||||
|                             int( gettimeofday() / 86400 ) == int( | ||||
|                             int( ::gettimeofday() / 86400 ) == int( | ||||
|                                 ( | ||||
|                                     computeAlignTime( | ||||
|                                     ::computeAlignTime( | ||||
|                                         '24:00', | ||||
|                                         sunrise_abs( | ||||
|                                         ::sunrise_abs( | ||||
|                                             $autoAstroMode, | ||||
|                                             0, | ||||
|                                             $FHEM::Automation::ShuttersControl::shutters | ||||
| @@ -617,9 +617,9 @@ sub ShuttersSunrise { | ||||
|                           ) | ||||
|                         { | ||||
|                             $shuttersSunriseUnixtime = ( | ||||
|                                 computeAlignTime( | ||||
|                                 ::computeAlignTime( | ||||
|                                     '24:00', | ||||
|                                     sunrise_abs( | ||||
|                                     ::sunrise_abs( | ||||
|                                         $autoAstroMode, | ||||
|                                         0, | ||||
|                                         $FHEM::Automation::ShuttersControl::shutters | ||||
| @@ -630,9 +630,9 @@ sub ShuttersSunrise { | ||||
|                         } | ||||
|                         else { | ||||
|                             $shuttersSunriseUnixtime = ( | ||||
|                                 computeAlignTime( | ||||
|                                 ::computeAlignTime( | ||||
|                                     '24:00', | ||||
|                                     sunrise_abs( | ||||
|                                     ::sunrise_abs( | ||||
|                                         $autoAstroMode, | ||||
|                                         0, | ||||
|                                         $FHEM::Automation::ShuttersControl::shutters | ||||
| @@ -646,9 +646,9 @@ sub ShuttersSunrise { | ||||
|             } | ||||
|             else { | ||||
|                 $shuttersSunriseUnixtime = ( | ||||
|                     computeAlignTime( | ||||
|                     ::computeAlignTime( | ||||
|                         '24:00', | ||||
|                         sunrise_abs( | ||||
|                         ::sunrise_abs( | ||||
|                             $autoAstroMode, | ||||
|                             0, | ||||
|                             $FHEM::Automation::ShuttersControl::shutters | ||||
| @@ -669,11 +669,11 @@ sub ShuttersSunrise { | ||||
|             { | ||||
|                 if ( !IsWe('tomorrow') ) { | ||||
|                     if ( | ||||
|                         int( gettimeofday() / 86400 ) == int( | ||||
|                         int( ::gettimeofday() / 86400 ) == int( | ||||
|                             ( | ||||
|                                 computeAlignTime( | ||||
|                                 ::computeAlignTime( | ||||
|                                     '24:00', | ||||
|                                     sunrise_abs( | ||||
|                                     ::sunrise_abs( | ||||
|                                         $autoAstroMode, | ||||
|                                         0, | ||||
|                                         $FHEM::Automation::ShuttersControl::shutters | ||||
| @@ -690,7 +690,7 @@ sub ShuttersSunrise { | ||||
|                           ( $shuttersSunriseUnixtime + 86400 ) | ||||
|                           if ( $shuttersSunriseUnixtime < | ||||
|                             ( $oldFuncHash->{sunrisetime} + 180 ) | ||||
|                             && $oldFuncHash->{sunrisetime} < gettimeofday() ); | ||||
|                             && $oldFuncHash->{sunrisetime} < ::gettimeofday() ); | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
| @@ -698,7 +698,7 @@ sub ShuttersSunrise { | ||||
|                 $shuttersSunriseUnixtime = ( $shuttersSunriseUnixtime + 86400 ) | ||||
|                   if ( $shuttersSunriseUnixtime < | ||||
|                     ( $oldFuncHash->{sunrisetime} + 180 ) | ||||
|                     && $oldFuncHash->{sunrisetime} < gettimeofday() ); | ||||
|                     && $oldFuncHash->{sunrisetime} < ::gettimeofday() ); | ||||
|             } | ||||
|         } | ||||
|         elsif ( $FHEM::Automation::ShuttersControl::shutters->getUp eq 'time' ) | ||||
| @@ -711,8 +711,8 @@ sub ShuttersSunrise { | ||||
|             { | ||||
|                 if ( !IsWe('tomorrow') ) { | ||||
|                     if ( | ||||
|                         int( gettimeofday() / 86400 ) == int( | ||||
|                             computeAlignTime( | ||||
|                         int( ::gettimeofday() / 86400 ) == int( | ||||
|                             ::computeAlignTime( | ||||
|                                 '24:00', | ||||
|                                 $FHEM::Automation::ShuttersControl::shutters | ||||
|                                   ->getTimeUpWeHoliday | ||||
| @@ -720,13 +720,13 @@ sub ShuttersSunrise { | ||||
|                         ) | ||||
|                       ) | ||||
|                     { | ||||
|                         $shuttersSunriseUnixtime = computeAlignTime( '24:00', | ||||
|                         $shuttersSunriseUnixtime = ::computeAlignTime( '24:00', | ||||
|                             $FHEM::Automation::ShuttersControl::shutters | ||||
|                               ->getTimeUpWeHoliday ); | ||||
|                     } | ||||
|                     elsif ( | ||||
|                         int( gettimeofday() / 86400 ) == int( | ||||
|                             computeAlignTime( | ||||
|                         int( ::gettimeofday() / 86400 ) == int( | ||||
|                             ::computeAlignTime( | ||||
|                                 '24:00', | ||||
|                                 $FHEM::Automation::ShuttersControl::shutters | ||||
|                                   ->getTimeUpEarly | ||||
| @@ -736,12 +736,12 @@ sub ShuttersSunrise { | ||||
|                         ->getSunrise | ||||
|                       ) | ||||
|                     { | ||||
|                         $shuttersSunriseUnixtime = computeAlignTime( '24:00', | ||||
|                         $shuttersSunriseUnixtime = ::computeAlignTime( '24:00', | ||||
|                             $FHEM::Automation::ShuttersControl::shutters | ||||
|                               ->getTimeUpEarly ) + 86400; | ||||
|                     } | ||||
|                     else { | ||||
|                         $shuttersSunriseUnixtime = computeAlignTime( '24:00', | ||||
|                         $shuttersSunriseUnixtime = ::computeAlignTime( '24:00', | ||||
|                             $FHEM::Automation::ShuttersControl::shutters | ||||
|                               ->getTimeUpEarly ); | ||||
|                     } | ||||
| @@ -749,8 +749,8 @@ sub ShuttersSunrise { | ||||
|                 else { | ||||
|                     if ( | ||||
|                         IsWe() | ||||
|                         && int( gettimeofday() / 86400 ) == int( | ||||
|                             computeAlignTime( | ||||
|                         && int( ::gettimeofday() / 86400 ) == int( | ||||
|                             ::computeAlignTime( | ||||
|                                 '24:00', | ||||
|                                 $FHEM::Automation::ShuttersControl::shutters | ||||
|                                   ->getTimeUpWeHoliday | ||||
| @@ -758,13 +758,13 @@ sub ShuttersSunrise { | ||||
|                         ) | ||||
|                       ) | ||||
|                     { | ||||
|                         $shuttersSunriseUnixtime = computeAlignTime( '24:00', | ||||
|                         $shuttersSunriseUnixtime = ::computeAlignTime( '24:00', | ||||
|                             $FHEM::Automation::ShuttersControl::shutters | ||||
|                               ->getTimeUpWeHoliday ); | ||||
|                     } | ||||
|                     elsif ( | ||||
|                         int( gettimeofday() / 86400 ) == int( | ||||
|                             computeAlignTime( | ||||
|                         int( ::gettimeofday() / 86400 ) == int( | ||||
|                             ::computeAlignTime( | ||||
|                                 '24:00', | ||||
|                                 $FHEM::Automation::ShuttersControl::shutters | ||||
|                                   ->getTimeUpEarly | ||||
| @@ -772,13 +772,13 @@ sub ShuttersSunrise { | ||||
|                         ) | ||||
|                       ) | ||||
|                     { | ||||
|                         $shuttersSunriseUnixtime = computeAlignTime( '24:00', | ||||
|                         $shuttersSunriseUnixtime = ::computeAlignTime( '24:00', | ||||
|                             $FHEM::Automation::ShuttersControl::shutters | ||||
|                               ->getTimeUpEarly ); | ||||
|                     } | ||||
|                     elsif ( | ||||
|                         int( gettimeofday() / 86400 ) != int( | ||||
|                             computeAlignTime( | ||||
|                         int( ::gettimeofday() / 86400 ) != int( | ||||
|                             ::computeAlignTime( | ||||
|                                 '24:00', | ||||
|                                 $FHEM::Automation::ShuttersControl::shutters | ||||
|                                   ->getTimeUpWeHoliday | ||||
| @@ -786,19 +786,19 @@ sub ShuttersSunrise { | ||||
|                         ) | ||||
|                       ) | ||||
|                     { | ||||
|                         $shuttersSunriseUnixtime = computeAlignTime( '24:00', | ||||
|                         $shuttersSunriseUnixtime = ::computeAlignTime( '24:00', | ||||
|                             $FHEM::Automation::ShuttersControl::shutters | ||||
|                               ->getTimeUpWeHoliday ); | ||||
|                     } | ||||
|                     else { | ||||
|                         $shuttersSunriseUnixtime = computeAlignTime( '24:00', | ||||
|                         $shuttersSunriseUnixtime = ::computeAlignTime( '24:00', | ||||
|                             $FHEM::Automation::ShuttersControl::shutters | ||||
|                               ->getTimeUpWeHoliday ) + 86400; | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|             else { | ||||
|                 $shuttersSunriseUnixtime = computeAlignTime( '24:00', | ||||
|                 $shuttersSunriseUnixtime = ::computeAlignTime( '24:00', | ||||
|                     $FHEM::Automation::ShuttersControl::shutters | ||||
|                       ->getTimeUpEarly ); | ||||
|             } | ||||
| @@ -806,15 +806,14 @@ sub ShuttersSunrise { | ||||
|         elsif ( $FHEM::Automation::ShuttersControl::shutters->getUp eq | ||||
|             'brightness' ) | ||||
|         { | ||||
|             $shuttersSunriseUnixtime = computeAlignTime( '24:00', | ||||
|                 $FHEM::Automation::ShuttersControl::shutters->getTimeUpLate | ||||
|             ); | ||||
|             $shuttersSunriseUnixtime = ::computeAlignTime( '24:00', | ||||
|                 $FHEM::Automation::ShuttersControl::shutters->getTimeUpLate ); | ||||
|         } | ||||
|  | ||||
|         return $shuttersSunriseUnixtime; | ||||
|     } | ||||
|     elsif ( $tm eq 'real' ) { | ||||
|         return sunrise_abs( | ||||
|         return ::sunrise_abs( | ||||
|             $autoAstroMode, | ||||
|             0, | ||||
|             $FHEM::Automation::ShuttersControl::shutters->getTimeUpEarly, | ||||
| @@ -830,7 +829,7 @@ sub ShuttersSunrise { | ||||
|  | ||||
| sub ShuttersSunset { | ||||
|     my $shuttersDev = shift; | ||||
|     my $tm = shift; # Tm steht für Timemode und bedeutet Realzeit oder Unixzeit | ||||
|     my $tm = shift;  # Tm steht für Timemode und bedeutet Realzeit oder Unixzeit | ||||
|  | ||||
|     my $autoAstroMode; | ||||
|     $FHEM::Automation::ShuttersControl::shutters->setShuttersDev($shuttersDev); | ||||
| @@ -858,15 +857,15 @@ sub ShuttersSunset { | ||||
|     my $oldFuncHash = | ||||
|       $FHEM::Automation::ShuttersControl::shutters->getInTimerFuncHash; | ||||
|     my $shuttersSunsetUnixtime = | ||||
|       computeAlignTime( '24:00', sunset( 'REAL', 0, '15:30', '21:30' ) ); | ||||
|       ::computeAlignTime( '24:00', ::sunset( 'REAL', 0, '15:30', '21:30' ) ); | ||||
|  | ||||
|     if ( $tm eq 'unix' ) { | ||||
|         if ( $FHEM::Automation::ShuttersControl::shutters->getDown eq 'astro' ) | ||||
|         { | ||||
|             $shuttersSunsetUnixtime = ( | ||||
|                 computeAlignTime( | ||||
|                 ::computeAlignTime( | ||||
|                     '24:00', | ||||
|                     sunset_abs( | ||||
|                     ::sunset_abs( | ||||
|                         $autoAstroMode, | ||||
|                         0, | ||||
|                         $FHEM::Automation::ShuttersControl::shutters | ||||
| @@ -880,13 +879,13 @@ sub ShuttersSunset { | ||||
|                 $shuttersSunsetUnixtime += 86400 | ||||
|                   if ( $shuttersSunsetUnixtime < | ||||
|                     ( $oldFuncHash->{sunsettime} + 180 ) | ||||
|                     && $oldFuncHash->{sunsettime} < gettimeofday() ); | ||||
|                     && $oldFuncHash->{sunsettime} < ::gettimeofday() ); | ||||
|             } | ||||
|         } | ||||
|         elsif ( | ||||
|             $FHEM::Automation::ShuttersControl::shutters->getDown eq 'time' ) | ||||
|         { | ||||
|             $shuttersSunsetUnixtime = computeAlignTime( '24:00', | ||||
|             $shuttersSunsetUnixtime = ::computeAlignTime( '24:00', | ||||
|                 $FHEM::Automation::ShuttersControl::shutters->getTimeDownEarly | ||||
|             ); | ||||
|         } | ||||
| @@ -894,13 +893,13 @@ sub ShuttersSunset { | ||||
|             'brightness' ) | ||||
|         { | ||||
|             $shuttersSunsetUnixtime = | ||||
|               computeAlignTime( '24:00', | ||||
|               ::computeAlignTime( '24:00', | ||||
|                 $FHEM::Automation::ShuttersControl::shutters->getTimeDownLate ); | ||||
|         } | ||||
|         return $shuttersSunsetUnixtime; | ||||
|     } | ||||
|     elsif ( $tm eq 'real' ) { | ||||
|         return sunset_abs( | ||||
|         return ::sunset_abs( | ||||
|             $autoAstroMode, | ||||
|             0, | ||||
|             $FHEM::Automation::ShuttersControl::shutters->getTimeDownEarly, | ||||
| @@ -923,7 +922,7 @@ sub IsAfterShuttersTimeBlocking { | ||||
|  | ||||
|     if ( | ||||
|         ( | ||||
|             int( gettimeofday() ) - | ||||
|             int( ::gettimeofday() ) - | ||||
|             $FHEM::Automation::ShuttersControl::shutters->getLastManPosTimestamp | ||||
|         ) < | ||||
|         $FHEM::Automation::ShuttersControl::shutters->getBlockingTimeAfterManual | ||||
| @@ -933,7 +932,7 @@ sub IsAfterShuttersTimeBlocking { | ||||
|                 $FHEM::Automation::ShuttersControl::shutters->getSunriseUnixTime | ||||
|             ) | ||||
|             && $FHEM::Automation::ShuttersControl::shutters->getSunriseUnixTime | ||||
|             - ( int( gettimeofday() ) ) < | ||||
|             - ( int( ::gettimeofday() ) ) < | ||||
|             $FHEM::Automation::ShuttersControl::shutters | ||||
|             ->getBlockingTimeBeforDayOpen | ||||
|         ) | ||||
| @@ -943,7 +942,7 @@ sub IsAfterShuttersTimeBlocking { | ||||
|                 $FHEM::Automation::ShuttersControl::shutters->getSunriseUnixTime | ||||
|             ) | ||||
|             && $FHEM::Automation::ShuttersControl::shutters->getSunsetUnixTime | ||||
|             - ( int( gettimeofday() ) ) < | ||||
|             - ( int( ::gettimeofday() ) ) < | ||||
|             $FHEM::Automation::ShuttersControl::shutters | ||||
|             ->getBlockingTimeBeforNightClose | ||||
|         ) | ||||
| @@ -982,7 +981,7 @@ sub IsAfterShuttersManualBlocking { | ||||
|     } | ||||
|     elsif ( | ||||
|         ( | ||||
|             int( gettimeofday() ) - | ||||
|             int( ::gettimeofday() ) - | ||||
|             $FHEM::Automation::ShuttersControl::shutters->getLastManPosTimestamp | ||||
|         ) < | ||||
|         $FHEM::Automation::ShuttersControl::shutters->getBlockingTimeAfterManual | ||||
| @@ -994,25 +993,6 @@ sub IsAfterShuttersManualBlocking { | ||||
|     else { return 1 } | ||||
| } | ||||
|  | ||||
| sub makeReadingName { | ||||
|     my ($rname) = shift; | ||||
|     my %charHash = ( | ||||
|         chr(0xe4) => "ae",    # ä | ||||
|         chr(0xc4) => "Ae",    # Ä | ||||
|         chr(0xfc) => "ue",    # ü | ||||
|         chr(0xdc) => "Ue",    # Ü | ||||
|         chr(0xf6) => "oe",    # ö | ||||
|         chr(0xd6) => "Oe",    # Ö | ||||
|         chr(0xdf) => "ss"     # ß | ||||
|     ); | ||||
|     my $charHashkeys = join( "", keys(%charHash) ); | ||||
|  | ||||
|     return $rname if ( $rname =~ m{^\./}xms ); | ||||
|     $rname =~ s/([$charHashkeys])/$charHash{$1}/xgi; | ||||
|     $rname =~ s/[^a-z0-9._\-\/]/_/xgi; | ||||
|     return $rname; | ||||
| } | ||||
|  | ||||
| sub IsWe { | ||||
|     return main::IsWe( shift, shift ); | ||||
| } | ||||
| @@ -1038,24 +1018,32 @@ sub PerlCodeCheck { | ||||
| sub IsAdv { | ||||
|     use HTTP::Date; | ||||
|     my ( undef, undef, undef, $monthday, $month, $year, undef, undef, undef ) = | ||||
|       localtime( gettimeofday() ); | ||||
|       localtime( ::gettimeofday() ); | ||||
|     my $adv = 0; | ||||
|     $year += 1900; | ||||
|  | ||||
|     if ( $month < 1 ) { | ||||
|         if ( $monthday < 7 ) { | ||||
|             $adv = 1; | ||||
|         } | ||||
|     if (   $month < 1 | ||||
|         && $FHEM::Automation::ShuttersControl::ascDev->getAdvEndDate eq | ||||
|         'EpiphanyDay' ) | ||||
|     { | ||||
|         $adv = $monthday < 7 ? 1 : 0; | ||||
|     } | ||||
|     elsif ($month < 2 | ||||
|         && $FHEM::Automation::ShuttersControl::ascDev->getAdvEndDate eq | ||||
|         'CandlemasDay' ) | ||||
|     { | ||||
|         $adv = $month = 1 || ( $month = 2 && $monthday < 3 ) ? 1 : 0; | ||||
|     } | ||||
|     else { | ||||
|         my $time = str2time( $year . '-12-25' ); | ||||
|         my $wday = ( localtime($time) )[6]; | ||||
|         $wday = $wday ? $wday : 7; | ||||
|         $time -= ( $FHEM::Automation::ShuttersControl::ascDev | ||||
|             ->getAdvDate eq 'DeadSunday' | ||||
|               ? ($wday + 27) * 86400 | ||||
|               : ($wday + 21) * 86400 | ||||
|           ); | ||||
|         $time -= ( | ||||
|             $FHEM::Automation::ShuttersControl::ascDev->getAdvStartDate eq | ||||
|               'DeadSunday' | ||||
|             ? ( $wday + 27 ) * 86400 | ||||
|             : ( $wday + 21 ) * 86400 | ||||
|         ); | ||||
|         $adv = 1 if ( $time < time ); | ||||
|     } | ||||
|  | ||||
| @@ -1065,18 +1053,19 @@ sub IsAdv { | ||||
| sub IsInTime { | ||||
|     my $dfi = shift; | ||||
|  | ||||
|     $dfi =~ s/{([^\x7d]*)}/$cmdFromAnalyze=$1; eval $1/ge; # Forum #69787 | ||||
|     my ($sec,$min,$hour,$mday,$month,$year,$wday,$yday,$isdst) = localtime(gettimeofday()); | ||||
|     my $dhms = sprintf("%s\@%02d:%02d:%02d", $wday, $hour, $min, $sec); | ||||
|     foreach my $ft (split(" ", $dfi)) { | ||||
|         my ($from, $to) = split("-", $ft); | ||||
|         if(defined($from) && defined($to)) { | ||||
|             $from = "$wday\@$from" if(index($from,"@") < 0); | ||||
|             $to   = "$wday\@$to"   if(index($to,  "@") < 0); | ||||
|             return 1 if($from le $dhms && $dhms le $to); | ||||
|     $dfi =~ s/{([^\x7d]*)}/$cmdFromAnalyze=$1; eval $1/ge;    # Forum #69787 | ||||
|     my ( $sec, $min, $hour, $mday, $month, $year, $wday, $yday, $isdst ) = | ||||
|       localtime( ::gettimeofday() ); | ||||
|     my $dhms = sprintf( "%s\@%02d:%02d:%02d", $wday, $hour, $min, $sec ); | ||||
|     foreach my $ft ( split( " ", $dfi ) ) { | ||||
|         my ( $from, $to ) = split( "-", $ft ); | ||||
|         if ( defined($from) && defined($to) ) { | ||||
|             $from = "$wday\@$from" if ( index( $from, "@" ) < 0 ); | ||||
|             $to   = "$wday\@$to"   if ( index( $to,   "@" ) < 0 ); | ||||
|             return 1 if ( $from le $dhms && $dhms le $to ); | ||||
|         } | ||||
|     } | ||||
|      | ||||
|  | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -1,8 +1,8 @@ | ||||
| ############################################################################### | ||||
| # | ||||
| # Developed with Kate | ||||
| # Developed with VSCodium and richterger perl plugin | ||||
| # | ||||
| #  (c) 2018-2021 Copyright: Marko Oldenburg (fhemdevelopment@cooltux.net) | ||||
| #  (c) 2018-2025 Copyright: Marko Oldenburg (fhemdevelopment at cooltux dot net) | ||||
| #  All rights reserved | ||||
| # | ||||
| #   Special thanks goes to: | ||||
| @@ -47,7 +47,9 @@ use utf8; | ||||
| use FHEM::Automation::ShuttersControl::Helper qw (:ALL); | ||||
|  | ||||
| require Exporter; | ||||
| our @ISA       = qw(Exporter); | ||||
| use base qw(Exporter); | ||||
|  | ||||
| # our @ISA       = qw(Exporter); | ||||
| our @EXPORT_OK = qw( | ||||
|   RainProcessing | ||||
| ); | ||||
| @@ -55,16 +57,15 @@ our %EXPORT_TAGS = ( | ||||
|     ALL => [ | ||||
|         qw( | ||||
|           RainProcessing | ||||
|           ) | ||||
|         ) | ||||
|     ], | ||||
| ); | ||||
|  | ||||
|  | ||||
| sub RainProcessing { | ||||
|     my ( $hash, $val, $triggerMax, $triggerMin ) = @_; | ||||
|      | ||||
|  | ||||
|     my $rainClosedPos = $FHEM::Automation::ShuttersControl::ascDev | ||||
|           ->getRainSensorShuttersClosedPos; | ||||
|       ->getRainSensorShuttersClosedPos; | ||||
|  | ||||
|     for my $shuttersDev ( @{ $hash->{helper}{shuttersList} } ) { | ||||
|         $FHEM::Automation::ShuttersControl::shutters->setShuttersDev( | ||||
| @@ -75,37 +76,53 @@ sub RainProcessing { | ||||
|             $FHEM::Automation::ShuttersControl::shutters->getRainProtection eq | ||||
|             'off' ); | ||||
|  | ||||
|         if (   $val > $triggerMax | ||||
|         if ( | ||||
|                $val > $triggerMax | ||||
|             && $FHEM::Automation::ShuttersControl::shutters->getStatus != | ||||
|             $rainClosedPos | ||||
|             && $FHEM::Automation::ShuttersControl::shutters | ||||
|                  ->getRainProtectionStatus eq 'unprotected' | ||||
|             ->getRainProtectionStatus eq 'unprotected' | ||||
|             || ( $FHEM::Automation::ShuttersControl::shutters | ||||
|                    ->getRainProtectionStatus eq 'unprotected' | ||||
|               && $FHEM::Automation::ShuttersControl::shutters | ||||
|                    ->getRainUnprotectionDelayObj ne 'none') | ||||
|                 ->getRainProtectionStatus eq 'unprotected' | ||||
|                 && $FHEM::Automation::ShuttersControl::shutters | ||||
|                 ->getRainUnprotectionDelayObj ne 'none' ) | ||||
|           ) | ||||
|         { | ||||
|             _RainProtected(); | ||||
|         } | ||||
|         elsif ( ( $val == 0 || $val < $triggerMin ) | ||||
|             && $FHEM::Automation::ShuttersControl::shutters->getStatus == | ||||
|               $rainClosedPos | ||||
|             $rainClosedPos | ||||
|             && IsAfterShuttersManualBlocking($shuttersDev) | ||||
|             && $FHEM::Automation::ShuttersControl::shutters | ||||
|                  ->getRainProtectionStatus eq 'protected' ) | ||||
|             ->getRainProtectionStatus eq 'protected' ) | ||||
|         { | ||||
|             my %funcHash = ( | ||||
|                 shuttersdevice => $shuttersDev, | ||||
|             my %funcHash = ( shuttersdevice => $shuttersDev, ); | ||||
|  | ||||
|             $FHEM::Automation::ShuttersControl::shutters | ||||
|               ->setRainUnprotectionDelayObj( \%funcHash ); | ||||
|             ::InternalTimer( | ||||
|                 ::gettimeofday() + | ||||
|                   $FHEM::Automation::ShuttersControl::ascDev | ||||
|                   ->getRainWaitingTime, | ||||
|                 \&_RainUnprotected, \%funcHash | ||||
|             ); | ||||
|  | ||||
|             $FHEM::Automation::ShuttersControl::shutters->setRainUnprotectionDelayObj(\%funcHash); | ||||
|             ::InternalTimer( ::gettimeofday() + $FHEM::Automation::ShuttersControl::ascDev->getRainWaitingTime | ||||
|                 , \&_RainUnprotected | ||||
|                 , \%funcHash ); | ||||
|              | ||||
|             $FHEM::Automation::ShuttersControl::shutters | ||||
|                 ->setRainProtectionStatus('unprotected'); | ||||
|               ->setRainProtectionStatus('unprotected'); | ||||
|         } | ||||
|         else { | ||||
|             if ( $FHEM::Automation::ShuttersControl::shutters->getStatus != | ||||
|                 $rainClosedPos | ||||
|                 && ( $val == 0 || $val < $triggerMin ) ) | ||||
|             { | ||||
|                 $FHEM::Automation::ShuttersControl::shutters | ||||
|                   ->setRainProtectionStatus('unprotected'); | ||||
|             } | ||||
|             elsif ( $val > $triggerMax ) { | ||||
|                 $FHEM::Automation::ShuttersControl::shutters | ||||
|                   ->setRainProtectionStatus('protected'); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
| @@ -114,55 +131,76 @@ sub RainProcessing { | ||||
|  | ||||
| ### es muss noch beobachtet werden ob die Auswahl des Rollos welches bearbeitet werden soll bestehen bleibt oder mit in die neuen Funktionen übergeben werden muss | ||||
| sub _RainProtected { | ||||
|     ::RemoveInternalTimer($FHEM::Automation::ShuttersControl::shutters->getRainUnprotectionDelayObj) | ||||
|         if($FHEM::Automation::ShuttersControl::shutters->getRainUnprotectionDelayObj ne 'none'); | ||||
|          | ||||
|     $FHEM::Automation::ShuttersControl::shutters->setRainUnprotectionDelayObj('none'); | ||||
|     ::RemoveInternalTimer( $FHEM::Automation::ShuttersControl::shutters | ||||
|           ->getRainUnprotectionDelayObj ) | ||||
|       if ( $FHEM::Automation::ShuttersControl::shutters | ||||
|         ->getRainUnprotectionDelayObj ne 'none' ); | ||||
|  | ||||
|     $FHEM::Automation::ShuttersControl::shutters->setRainUnprotectionDelayObj( | ||||
|         'none'); | ||||
|  | ||||
|     $FHEM::Automation::ShuttersControl::shutters->setLastDrive( | ||||
|             'rain protected'); | ||||
|         $FHEM::Automation::ShuttersControl::shutters->setDriveCmd( | ||||
|             $FHEM::Automation::ShuttersControl::ascDev | ||||
|           ->getRainSensorShuttersClosedPos); | ||||
|         $FHEM::Automation::ShuttersControl::shutters | ||||
|             ->setRainProtectionStatus('protected'); | ||||
|         'rain protected'); | ||||
|  | ||||
|     $FHEM::Automation::ShuttersControl::shutters->setDriveCmd( | ||||
|         $FHEM::Automation::ShuttersControl::ascDev | ||||
|           ->getRainSensorShuttersClosedPos ); | ||||
|  | ||||
|     $FHEM::Automation::ShuttersControl::shutters->setRainProtectionStatus( | ||||
|         'protected'); | ||||
|  | ||||
|     return; | ||||
| } | ||||
|  | ||||
| sub _RainUnprotected { | ||||
|     my $h = shift; | ||||
|      | ||||
|     my $h         = shift; | ||||
|     my $targetPos = $FHEM::Automation::ShuttersControl::shutters->getLastPos; | ||||
|  | ||||
|     my $shuttersDev = $h->{shuttersdevice}; | ||||
|     $FHEM::Automation::ShuttersControl::shutters->setShuttersDev( | ||||
|             $shuttersDev); | ||||
|     $FHEM::Automation::ShuttersControl::shutters->setShuttersDev($shuttersDev); | ||||
|  | ||||
|     $FHEM::Automation::ShuttersControl::shutters->setLastDrive( | ||||
|             'rain un-protected'); | ||||
|         'rain un-protected'); | ||||
|  | ||||
|     if ( $FHEM::Automation::ShuttersControl::shutters->getRainUnprotectionDelayObj ne 'none' ) { | ||||
|         ::RemoveInternalTimer($FHEM::Automation::ShuttersControl::shutters->getRainUnprotectionDelayObj); | ||||
|         $FHEM::Automation::ShuttersControl::shutters->setRainUnprotectionDelayObj('none'); | ||||
|     if ( $FHEM::Automation::ShuttersControl::shutters | ||||
|         ->getRainUnprotectionDelayObj ne 'none' ) | ||||
|     { | ||||
|         ::RemoveInternalTimer( $FHEM::Automation::ShuttersControl::shutters | ||||
|               ->getRainUnprotectionDelayObj ); | ||||
|         $FHEM::Automation::ShuttersControl::shutters | ||||
|           ->setRainUnprotectionDelayObj('none'); | ||||
|     } | ||||
|  | ||||
|     $FHEM::Automation::ShuttersControl::shutters->setDriveCmd( | ||||
|         ( | ||||
|                 $FHEM::Automation::ShuttersControl::shutters->getIsDay | ||||
|             ? $FHEM::Automation::ShuttersControl::shutters->getLastPos | ||||
|             : ( | ||||
|                 $FHEM::Automation::ShuttersControl::shutters | ||||
|                     ->getPrivacyDownStatus == 2 | ||||
|                 ? $FHEM::Automation::ShuttersControl::shutters | ||||
|                     ->getPrivacyDownPos | ||||
|                 : $FHEM::Automation::ShuttersControl::shutters | ||||
|                     ->getClosedPos | ||||
|             ) | ||||
|         ) | ||||
|     ); | ||||
|     if (   $FHEM::Automation::ShuttersControl::shutters->getIsDay | ||||
|         && !$FHEM::Automation::ShuttersControl::shutters->getIfInShading | ||||
|         && $FHEM::Automation::ShuttersControl::shutters->getLastPos == | ||||
|         $FHEM::Automation::ShuttersControl::shutters->getShadingPos ) | ||||
|     { | ||||
|         $targetPos = $FHEM::Automation::ShuttersControl::shutters->getOpenPos; | ||||
|     } | ||||
|     else { | ||||
|         $targetPos = $FHEM::Automation::ShuttersControl::shutters->getLastPos; | ||||
|     } | ||||
|  | ||||
|         $FHEM::Automation::ShuttersControl::shutters | ||||
|             ->setRainProtectionStatus('unprotected'); | ||||
|     if (  !$FHEM::Automation::ShuttersControl::shutters->getIsDay | ||||
|         && $FHEM::Automation::ShuttersControl::shutters->getShuttersPlace ne | ||||
|         'awning' ) | ||||
|     { | ||||
|         $targetPos = ( | ||||
|             $FHEM::Automation::ShuttersControl::shutters->getPrivacyDownStatus | ||||
|               == 2 | ||||
|             ? $FHEM::Automation::ShuttersControl::shutters->getPrivacyDownPos | ||||
|             : $FHEM::Automation::ShuttersControl::shutters->getClosedPos | ||||
|         ); | ||||
|     } | ||||
|  | ||||
|     $FHEM::Automation::ShuttersControl::shutters->setRainProtectionStatus( | ||||
|         'unprotected'); | ||||
|  | ||||
|     $FHEM::Automation::ShuttersControl::shutters->setDriveCmd($targetPos) | ||||
|       if ( IsAfterShuttersTimeBlocking($shuttersDev) ); | ||||
|  | ||||
|     return; | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| 1; | ||||
|   | ||||
| @@ -1,8 +1,8 @@ | ||||
| ############################################################################### | ||||
| # | ||||
| # Developed with Kate | ||||
| # Developed with VSCodium and richterger perl plugin | ||||
| # | ||||
| #  (c) 2018-2020 Copyright: Marko Oldenburg (leongaultier at gmail dot com) | ||||
| #  (c) 2018-2025 Copyright: Marko Oldenburg (fhemdevelopment at cooltux dot net) | ||||
| #  All rights reserved | ||||
| # | ||||
| #   Special thanks goes to: | ||||
| @@ -44,37 +44,41 @@ use strict; | ||||
| use warnings; | ||||
| use utf8; | ||||
|  | ||||
| use GPUtils qw(GP_Import); | ||||
| require Exporter; | ||||
| use base qw(Exporter); | ||||
|  | ||||
| ## Import der FHEM Funktionen | ||||
| BEGIN { | ||||
|     GP_Import( | ||||
| # our @ISA       = qw(Exporter); | ||||
| our @EXPORT_OK = qw( | ||||
|   getRoommateStatus | ||||
|   getRoommateLastStatus | ||||
| ); | ||||
| our %EXPORT_TAGS = ( | ||||
|     ALL => [ | ||||
|         qw( | ||||
|           ReadingsVal) | ||||
|     ); | ||||
| } | ||||
|           getRoommateStatus | ||||
|           getRoommateLastStatus | ||||
|         ) | ||||
|     ], | ||||
| ); | ||||
|  | ||||
| sub _getRoommateStatus { | ||||
| sub getRoommateStatus { | ||||
|     my $self = shift; | ||||
|  | ||||
|     my $roommate = $self->{roommate}; | ||||
|  | ||||
|     return ReadingsVal( $roommate, | ||||
|     return ::ReadingsVal( $roommate, | ||||
|         $FHEM::Automation::ShuttersControl::shutters->getRoommatesReading, | ||||
|         'none' ); | ||||
| } | ||||
|  | ||||
| sub _getRoommateLastStatus { | ||||
| sub getRoommateLastStatus { | ||||
|     my $self = shift; | ||||
|  | ||||
|     my $roommate = $self->{roommate}; | ||||
|     my $default  = $self->{defaultarg}; | ||||
|  | ||||
|     $default = 'none' if ( !defined($default) ); | ||||
|     return ReadingsVal( $roommate, 'lastState', $default ); | ||||
|     return ::ReadingsVal( $roommate, 'lastState', $default ); | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| 1; | ||||
|   | ||||
| @@ -1,8 +1,8 @@ | ||||
| ############################################################################### | ||||
| # | ||||
| # Developed with Kate | ||||
| # Developed with VSCodium and richterger perl plugin | ||||
| # | ||||
| #  (c) 2018-2020 Copyright: Marko Oldenburg (fhemsupport@cooltux.net) | ||||
| #  (c) 2018-2025 Copyright: Marko Oldenburg (fhemdevelopment at cooltux dot net) | ||||
| #  All rights reserved | ||||
| # | ||||
| #   Special thanks goes to: | ||||
| @@ -48,7 +48,9 @@ use utf8; | ||||
| use FHEM::Automation::ShuttersControl::Helper qw (IsInTime); | ||||
|  | ||||
| require Exporter; | ||||
| our @ISA       = qw(Exporter); | ||||
| use base qw(Exporter); | ||||
|  | ||||
| # our @ISA       = qw(Exporter); | ||||
| our @EXPORT_OK = qw( | ||||
|   CheckASC_ConditionsForShadingFn | ||||
|   ShadingProcessing | ||||
| @@ -60,31 +62,13 @@ our %EXPORT_TAGS = ( | ||||
|           CheckASC_ConditionsForShadingFn | ||||
|           ShadingProcessing | ||||
|           ShadingProcessingDriveCommand | ||||
|           ) | ||||
|         ) | ||||
|     ], | ||||
| ); | ||||
|  | ||||
| use GPUtils qw(GP_Import); | ||||
| ## Import der FHEM Funktionen | ||||
| BEGIN { | ||||
|     GP_Import( | ||||
|         qw( | ||||
|           Log3 | ||||
|           gettimeofday | ||||
|           InternalTimer | ||||
|           ReadingsVal | ||||
|           readingsBeginUpdate | ||||
|           readingsBulkUpdate | ||||
|           readingsBulkUpdateIfChanged | ||||
|           readingsEndUpdate | ||||
|           defs | ||||
|           ) | ||||
|     ); | ||||
| } | ||||
|  | ||||
| sub CheckASC_ConditionsForShadingFn { | ||||
|     my $hash    = shift; | ||||
|     my $value   = shift; | ||||
|     my $hash  = shift; | ||||
|     my $value = shift; | ||||
|  | ||||
|     my $error; | ||||
|  | ||||
| @@ -98,14 +82,14 @@ sub CheckASC_ConditionsForShadingFn { | ||||
|     my $count = 1; | ||||
|     for my $shuttersDev ( @{ $hash->{helper}{shuttersList} } ) { | ||||
|         my %funcHash = ( | ||||
|             hash            => $hash, | ||||
|             shuttersdevice  => $shuttersDev, | ||||
|             value           => $value, | ||||
|             attrEvent       => 0, | ||||
|             hash           => $hash, | ||||
|             shuttersdevice => $shuttersDev, | ||||
|             value          => $value, | ||||
|             attrEvent      => 0, | ||||
|         ); | ||||
|  | ||||
|         InternalTimer( | ||||
|             gettimeofday() + $count, | ||||
|         ::InternalTimer( | ||||
|             ::gettimeofday() + $count, | ||||
| 'FHEM::Automation::ShuttersControl::Shading::_CheckShuttersConditionsForShadingFn', | ||||
|             \%funcHash | ||||
|         ); | ||||
| @@ -121,86 +105,93 @@ sub CheckASC_ConditionsForShadingFn { | ||||
| } | ||||
|  | ||||
| sub _CheckShuttersConditionsForShadingFn { | ||||
|     my $funcHash    = shift; | ||||
|      | ||||
|     my $funcHash = shift; | ||||
|  | ||||
|     my $hash        = $funcHash->{hash}; | ||||
|     my $shuttersDev = $funcHash->{shuttersdevice}; | ||||
|     my $value       = $funcHash->{value}; | ||||
|  | ||||
|     $FHEM::Automation::ShuttersControl::shutters->setShuttersDev($shuttersDev); | ||||
|     my $shuttersDevHash = $defs{$shuttersDev}; | ||||
|     my $shuttersDevHash = $::defs{$shuttersDev}; | ||||
|     my $message         = ''; | ||||
|     my $errorMessage; | ||||
|     my $warnMessage; | ||||
|     my $infoMessage; | ||||
|      | ||||
|  | ||||
|     if ( $value eq 'off' ) { | ||||
|         $FHEM::Automation::ShuttersControl::shutters->setShadingStatus('out'); | ||||
|         $infoMessage    .= ' shading was deactivated ' . ($funcHash->{attrEvent} ? 'in the device' : 'globally'); | ||||
|         $errorMessage   .= ''; | ||||
|         $infoMessage .= ' shading was deactivated ' | ||||
|           . ( $funcHash->{attrEvent} ? 'in the device' : 'globally' ); | ||||
|         $errorMessage .= ''; | ||||
|         ShadingProcessingDriveCommand( $hash, $shuttersDev ); | ||||
|     } | ||||
|     else { | ||||
|         $infoMessage .= ( | ||||
|             $FHEM::Automation::ShuttersControl::shutters->getShadingMode ne 'off' | ||||
|             && $FHEM::Automation::ShuttersControl::ascDev | ||||
|             ->getAutoShuttersControlShading eq 'on' | ||||
|             && $FHEM::Automation::ShuttersControl::shutters->getOutTemp == -100 | ||||
|             $FHEM::Automation::ShuttersControl::shutters->getShadingMode ne | ||||
|               'off' | ||||
|               && $FHEM::Automation::ShuttersControl::ascDev | ||||
|               ->getAutoShuttersControlShading eq 'on' | ||||
|               && $FHEM::Automation::ShuttersControl::shutters->getOutTemp == | ||||
|               -100 | ||||
|             ? ' shading active, global temp sensor is set, but shutters temperature sensor is not set' | ||||
|             : '' | ||||
|         ); | ||||
|  | ||||
|         $warnMessage .= ( | ||||
|             $FHEM::Automation::ShuttersControl::shutters->getShadingMode eq 'off' | ||||
|             && $FHEM::Automation::ShuttersControl::ascDev | ||||
|             ->getAutoShuttersControlShading eq 'on' | ||||
|             $FHEM::Automation::ShuttersControl::shutters->getShadingMode eq | ||||
|               'off' | ||||
|               && $FHEM::Automation::ShuttersControl::ascDev | ||||
|               ->getAutoShuttersControlShading eq 'on' | ||||
|             ? ' global shading active but ASC_Shading_Mode attribut is not set or off' | ||||
|             : '' | ||||
|         ); | ||||
|  | ||||
|         $errorMessage .= ( | ||||
|             $FHEM::Automation::ShuttersControl::shutters->getShadingMode ne 'off' | ||||
|             && $FHEM::Automation::ShuttersControl::ascDev | ||||
|             ->getAutoShuttersControlShading ne 'on' | ||||
|             && $FHEM::Automation::ShuttersControl::ascDev | ||||
|             ->getAutoShuttersControlShading ne 'off' | ||||
|             $FHEM::Automation::ShuttersControl::shutters->getShadingMode ne | ||||
|               'off' | ||||
|               && $FHEM::Automation::ShuttersControl::ascDev | ||||
|               ->getAutoShuttersControlShading ne 'on' | ||||
|               && $FHEM::Automation::ShuttersControl::ascDev | ||||
|               ->getAutoShuttersControlShading ne 'off' | ||||
|             ? ' ASC_Shading_Mode attribut is set but global shading has errors, look at ASC device ' | ||||
|             . '<a href="' | ||||
|             . '/fhem?detail=' | ||||
|             . ReadingsVal( $shuttersDev, 'associatedWith', 'ASC device' ) | ||||
|             . $::FW_CSRF . '">' | ||||
|             . ReadingsVal( $shuttersDev, 'associatedWith', 'ASC device' ) | ||||
|             . '</a>' | ||||
|               . '<a href="' | ||||
|               . '/fhem?detail=' | ||||
|               . ::ReadingsVal( $shuttersDev, 'associatedWith', 'ASC device' ) | ||||
|               . $::FW_CSRF . '">' | ||||
|               . ::ReadingsVal( $shuttersDev, 'associatedWith', 'ASC device' ) | ||||
|               . '</a>' | ||||
|             : '' | ||||
|         ); | ||||
|  | ||||
|         $errorMessage .= ( | ||||
|             $FHEM::Automation::ShuttersControl::shutters->getBrightness == -1 | ||||
|             && $FHEM::Automation::ShuttersControl::shutters->getShadingMode ne | ||||
|             'off' | ||||
|               && $FHEM::Automation::ShuttersControl::shutters->getShadingMode | ||||
|               ne 'off' | ||||
|             ? ' no brightness sensor found, please set ASC_BrightnessSensor attribut' | ||||
|             : '' | ||||
|         ); | ||||
|     } | ||||
|  | ||||
|     $message .= ' ERROR: ' . $errorMessage | ||||
|     if ( defined($errorMessage) | ||||
|       if ( defined($errorMessage) | ||||
|         && $errorMessage ne '' ); | ||||
|  | ||||
|     $message .= ' WARN: ' . $warnMessage | ||||
|     if ( defined($warnMessage) | ||||
|       if ( defined($warnMessage) | ||||
|         && $warnMessage ne '' | ||||
|         && $errorMessage eq '' ); | ||||
|  | ||||
|     $message .= ' INFO: ' . $infoMessage | ||||
|     if ( defined($infoMessage) | ||||
|       if ( defined($infoMessage) | ||||
|         && $infoMessage ne '' | ||||
|         && $errorMessage eq '' ); | ||||
|  | ||||
|     readingsBeginUpdate($shuttersDevHash); | ||||
|     readingsBulkUpdateIfChanged( $shuttersDevHash, 'ASC_ShadingMessage', | ||||
|     ::readingsBeginUpdate($shuttersDevHash); | ||||
|     ::readingsBulkUpdateIfChanged( $shuttersDevHash, 'ASC_ShadingMessage', | ||||
|         '<html>' . $message . ' </html>' ); | ||||
|     readingsEndUpdate( $shuttersDevHash, 1 ); | ||||
|     ::readingsEndUpdate( $shuttersDevHash, 1 ); | ||||
|  | ||||
|     return; | ||||
| } | ||||
|  | ||||
| sub ShadingProcessing { | ||||
| @@ -215,12 +206,18 @@ sub ShadingProcessing { | ||||
|     $FHEM::Automation::ShuttersControl::shutters->setShuttersDev($shuttersDev); | ||||
|     my $brightness = | ||||
|       $FHEM::Automation::ShuttersControl::shutters->getBrightnessAverage; | ||||
|        | ||||
|     $FHEM::Automation::ShuttersControl::shutters->setShadingBetweenTheTimeSuspend( | ||||
|           ( IsInTime($FHEM::Automation::ShuttersControl::shutters->getShadingBetweenTheTime) | ||||
|         ? 0 | ||||
|         : 1 ) | ||||
|     ); | ||||
|  | ||||
|     $FHEM::Automation::ShuttersControl::shutters | ||||
|       ->setShadingBetweenTheTimeSuspend( | ||||
|         ( | ||||
|             IsInTime( | ||||
|                 $FHEM::Automation::ShuttersControl::shutters | ||||
|                   ->getShadingBetweenTheTime | ||||
|               ) | ||||
|             ? 0 | ||||
|             : 1 | ||||
|         ) | ||||
|       ); | ||||
|  | ||||
|     FHEM::Automation::ShuttersControl::ASC_Debug( | ||||
|             'ShadingProcessing: ' | ||||
| @@ -250,7 +247,7 @@ sub ShadingProcessing { | ||||
|           . ', Ist es nach der Hälfte der Beschattungswartezeit: ' | ||||
|           . ( | ||||
|             ( | ||||
|                 int( gettimeofday() ) - | ||||
|                 int( ::gettimeofday() ) - | ||||
|                   $FHEM::Automation::ShuttersControl::shutters | ||||
|                   ->getShadingStatusTimestamp | ||||
|             ) < ( | ||||
| @@ -260,7 +257,7 @@ sub ShadingProcessing { | ||||
|           ) | ||||
|     ); | ||||
|  | ||||
|     Log3( $name, 4, | ||||
|     ::Log3( $name, 4, | ||||
|             "AutoShuttersControl ($name) - Shading Processing, Rollladen: " | ||||
|           . $shuttersDev | ||||
|           . " Azimuth: " | ||||
| @@ -279,18 +276,22 @@ sub ShadingProcessing { | ||||
|         || $brightness == -1 | ||||
|         || $outTemp == -100 | ||||
|         || ( | ||||
|             int( gettimeofday() ) - | ||||
|             int( ::gettimeofday() ) - | ||||
|             $FHEM::Automation::ShuttersControl::shutters | ||||
|             ->getShadingStatusTimestamp ) < ( | ||||
|             $FHEM::Automation::ShuttersControl::shutters | ||||
|               ->getShadingWaitingPeriod / 2 | ||||
|             ) | ||||
|         || $FHEM::Automation::ShuttersControl::shutters | ||||
|         ->getExternalTriggerStatus | ||||
|         || $FHEM::Automation::ShuttersControl::shutters->getShadingMode eq 'off' | ||||
|         || $FHEM::Automation::ShuttersControl::ascDev | ||||
|               ->getAutoShuttersControlShading eq 'off' | ||||
|         ->getAutoShuttersControlShading eq 'off' | ||||
|         || $FHEM::Automation::ShuttersControl::shutters | ||||
|         ->getExternalTriggerStatus | ||||
|       ); | ||||
|  | ||||
|     Log3( $name, 4, | ||||
|     ::Log3( $name, 4, | ||||
|             "AutoShuttersControl ($name) - Shading Processing, Rollladen: " | ||||
|           . $shuttersDev | ||||
|           . " Nach dem return" ); | ||||
| @@ -300,7 +301,7 @@ sub ShadingProcessing { | ||||
|     my $getStatus = $FHEM::Automation::ShuttersControl::shutters->getStatus; | ||||
|     my $oldShadingStatus = | ||||
|       $FHEM::Automation::ShuttersControl::shutters->getShadingStatus; | ||||
|     my $shuttersDevHash = $defs{$shuttersDev}; | ||||
|     my $shuttersDevHash = $::defs{$shuttersDev}; | ||||
|  | ||||
|     my $getModeUp = $FHEM::Automation::ShuttersControl::shutters->getModeUp; | ||||
|     my $homemode  = $FHEM::Automation::ShuttersControl::shutters->getHomemode; | ||||
| @@ -316,9 +317,9 @@ sub ShadingProcessing { | ||||
|             ->getShadingMinOutsideTemperature - 4 | ||||
|             || $azimuth < $azimuthLeft | ||||
|             || $azimuth > $azimuthRight | ||||
|             || (   !$FHEM::Automation::ShuttersControl::shutters->getIsDay | ||||
|                 && $FHEM::Automation::ShuttersControl::shutters->getSunriseUnixTime | ||||
|                   - ( int( gettimeofday() ) ) > 7200 ) | ||||
|             || (  !$FHEM::Automation::ShuttersControl::shutters->getIsDay | ||||
|                 && $FHEM::Automation::ShuttersControl::shutters | ||||
|                 ->getSunriseUnixTime - ( int( ::gettimeofday() ) ) > 7200 ) | ||||
|         ) | ||||
|         && $FHEM::Automation::ShuttersControl::shutters->getShadingStatus ne | ||||
|         'out' | ||||
| @@ -331,7 +332,7 @@ sub ShadingProcessing { | ||||
|               . ' - Es ist Nacht oder die Aussentemperatur unterhalb der Shading Temperatur. Die Beschattung wird Zwangsbeendet' | ||||
|         ); | ||||
|  | ||||
|         Log3( $name, 4, | ||||
|         ::Log3( $name, 4, | ||||
| "AutoShuttersControl ($name) - Shading Processing - Der Sonnenstand ist ausserhalb der Winkelangaben oder die Aussentemperatur unterhalb der Shading Temperatur " | ||||
|         ); | ||||
|     } | ||||
| @@ -358,7 +359,7 @@ sub ShadingProcessing { | ||||
|                 $FHEM::Automation::ShuttersControl::shutters->getShadingStatus | ||||
|                 eq 'out reserved' | ||||
|                 and ( | ||||
|                     int( gettimeofday() ) - | ||||
|                     int( ::gettimeofday() ) - | ||||
|                     $FHEM::Automation::ShuttersControl::shutters | ||||
|                     ->getShadingStatusTimestamp ) | ||||
|             ) > $FHEM::Automation::ShuttersControl::shutters | ||||
| @@ -369,7 +370,7 @@ sub ShadingProcessing { | ||||
|                 'out'); | ||||
|         } | ||||
|  | ||||
|         Log3( $name, 4, | ||||
|         ::Log3( $name, 4, | ||||
|                 "AutoShuttersControl ($name) - Shading Processing, Rollladen: " | ||||
|               . $shuttersDev | ||||
|               . " In der Out Abfrage, Shadingwert: " | ||||
| @@ -411,7 +412,7 @@ sub ShadingProcessing { | ||||
|             $FHEM::Automation::ShuttersControl::shutters->getShadingStatus eq | ||||
|             'in reserved' | ||||
|             and ( | ||||
|                 int( gettimeofday() ) - | ||||
|                 int( ::gettimeofday() ) - | ||||
|                 $FHEM::Automation::ShuttersControl::shutters | ||||
|                 ->getShadingStatusTimestamp ) > ( | ||||
|                 $FHEM::Automation::ShuttersControl::shutters | ||||
| @@ -423,7 +424,7 @@ sub ShadingProcessing { | ||||
|                 'in'); | ||||
|         } | ||||
|  | ||||
|         Log3( $name, 4, | ||||
|         ::Log3( $name, 4, | ||||
|                 "AutoShuttersControl ($name) - Shading Processing, Rollladen: " | ||||
|               . $shuttersDev | ||||
|               . " In der In Abfrage, Shadingwert: " | ||||
| @@ -468,22 +469,18 @@ sub ShadingProcessing { | ||||
|             || $FHEM::Automation::ShuttersControl::shutters->getShadingMode eq | ||||
|             $homemode ) | ||||
|         && ( | ||||
|             $getModeUp eq 'always' | ||||
|             || $getModeUp eq | ||||
|             $homemode | ||||
|                $getModeUp eq 'always' | ||||
|             || $getModeUp eq $homemode | ||||
|             || $getModeUp eq 'off' | ||||
|             || $getModeUp eq | ||||
|             'absent' | ||||
|             || $getModeUp eq | ||||
|             'gone' | ||||
|             || ( $getModeUp eq | ||||
|                 'home' | ||||
|             || $getModeUp eq 'absent' | ||||
|             || $getModeUp eq 'gone' | ||||
|             || (   $getModeUp eq 'home' | ||||
|                 && $homemode ne 'asleep' ) | ||||
|         ) | ||||
|         && ( | ||||
|             ( | ||||
|                 ( | ||||
|                     int( gettimeofday() ) - | ||||
|                     int( ::gettimeofday() ) - | ||||
|                     $FHEM::Automation::ShuttersControl::shutters | ||||
|                     ->getShadingStatusTimestamp | ||||
|                 ) < 2 | ||||
| @@ -497,18 +494,18 @@ sub ShadingProcessing { | ||||
|                 ) | ||||
|                 && $FHEM::Automation::ShuttersControl::shutters->getIfInShading | ||||
|             ) | ||||
|             || (   !$FHEM::Automation::ShuttersControl::shutters->getIfInShading | ||||
|             || (  !$FHEM::Automation::ShuttersControl::shutters->getIfInShading | ||||
|                 && $FHEM::Automation::ShuttersControl::shutters->getStatus == | ||||
|                 $FHEM::Automation::ShuttersControl::shutters->getShadingPos | ||||
|             ) | ||||
|             || (   !$FHEM::Automation::ShuttersControl::shutters->getShadingBetweenTheTimeSuspend | ||||
|                 $FHEM::Automation::ShuttersControl::shutters->getShadingPos ) | ||||
|             || ( !$FHEM::Automation::ShuttersControl::shutters | ||||
|                 ->getShadingBetweenTheTimeSuspend | ||||
|                 && $FHEM::Automation::ShuttersControl::shutters->getStatus != | ||||
|                 $FHEM::Automation::ShuttersControl::shutters->getShadingPos ) | ||||
|         ) | ||||
|       ); | ||||
|  | ||||
|     readingsBeginUpdate($shuttersDevHash); | ||||
|     readingsBulkUpdate( | ||||
|     ::readingsBeginUpdate($shuttersDevHash); | ||||
|     ::readingsBulkUpdate( | ||||
|         $shuttersDevHash, | ||||
|         'ASC_ShadingMessage', | ||||
|         'INFO: current shading status is \'' | ||||
| @@ -531,7 +528,7 @@ sub ShadingProcessing { | ||||
|           ) / 60 | ||||
|           . 'm' | ||||
|     ); | ||||
|     readingsEndUpdate( $shuttersDevHash, 1 ); | ||||
|     ::readingsEndUpdate( $shuttersDevHash, 1 ); | ||||
|  | ||||
|     return; | ||||
| } | ||||
| @@ -551,19 +548,28 @@ sub ShadingProcessingDriveCommand { | ||||
|     $FHEM::Automation::ShuttersControl::shutters->setShadingStatus( | ||||
|         $FHEM::Automation::ShuttersControl::shutters->getShadingStatus ); | ||||
|  | ||||
|     if (   IsInTime($FHEM::Automation::ShuttersControl::shutters->getShadingBetweenTheTime) | ||||
|         && $FHEM::Automation::ShuttersControl::shutters->getShadingStatus eq 'in' | ||||
|     if ( | ||||
|         IsInTime( | ||||
|             $FHEM::Automation::ShuttersControl::shutters | ||||
|               ->getShadingBetweenTheTime | ||||
|         ) | ||||
|         && $FHEM::Automation::ShuttersControl::shutters->getShadingStatus eq | ||||
|         'in' | ||||
|         && $getShadingPos != $getStatus | ||||
|         && ( $getStatus != $FHEM::Automation::ShuttersControl::shutters->getClosedPos | ||||
|           || ( $getStatus == $FHEM::Automation::ShuttersControl::shutters->getClosedPos | ||||
|             && $marker | ||||
|             ) | ||||
|           ) | ||||
|         && ( $getStatus != $FHEM::Automation::ShuttersControl::shutters->getSleepPos | ||||
|           || ( $getStatus == $FHEM::Automation::ShuttersControl::shutters->getSleepPos | ||||
|             && $marker | ||||
|             ) | ||||
|           ) | ||||
|         && ( | ||||
|             $getStatus != | ||||
|             $FHEM::Automation::ShuttersControl::shutters->getClosedPos | ||||
|             || ( $getStatus == | ||||
|                    $FHEM::Automation::ShuttersControl::shutters->getClosedPos | ||||
|                 && $marker ) | ||||
|         ) | ||||
|         && ( | ||||
|             $getStatus != | ||||
|             $FHEM::Automation::ShuttersControl::shutters->getSleepPos | ||||
|             || ( $getStatus == | ||||
|                    $FHEM::Automation::ShuttersControl::shutters->getSleepPos | ||||
|                 && $marker ) | ||||
|         ) | ||||
|         && ( | ||||
|             FHEM::Automation::ShuttersControl::CheckIfShuttersWindowRecOpen( | ||||
|                 $shuttersDev) != 2 | ||||
| @@ -602,10 +608,10 @@ sub ShadingProcessingDriveCommand { | ||||
|             ( | ||||
|                 ( | ||||
|                     $getShadingPos == | ||||
|                          $FHEM::Automation::ShuttersControl::shutters->getLastPos | ||||
|                       $FHEM::Automation::ShuttersControl::shutters->getLastPos | ||||
|                       || $getShadingPos == | ||||
|                          $FHEM::Automation::ShuttersControl::shutters | ||||
|                          ->getShadingLastPos | ||||
|                       $FHEM::Automation::ShuttersControl::shutters | ||||
|                       ->getShadingLastPos | ||||
|                 ) | ||||
|                 ? $FHEM::Automation::ShuttersControl::shutters->getOpenPos | ||||
|                 : ( | ||||
| @@ -626,8 +632,10 @@ sub ShadingProcessingDriveCommand { | ||||
|                     : $FHEM::Automation::ShuttersControl::shutters->getOpenPos | ||||
|                 ) | ||||
|             ) | ||||
|         ) if (    $FHEM::Automation::ShuttersControl::shutters->getIsDay | ||||
|                || $FHEM::Automation::ShuttersControl::shutters->getShuttersPlace eq 'awning' ); | ||||
|           ) | ||||
|           if ( $FHEM::Automation::ShuttersControl::shutters->getIsDay | ||||
|             || $FHEM::Automation::ShuttersControl::shutters->getShuttersPlace | ||||
|             eq 'awning' ); | ||||
|  | ||||
|         FHEM::Automation::ShuttersControl::ASC_Debug( | ||||
|                 'ShadingProcessingDriveCommand: ' | ||||
| @@ -639,7 +647,7 @@ sub ShadingProcessingDriveCommand { | ||||
|               . ' zum beenden der Beschattung gefahren' ); | ||||
|     } | ||||
|  | ||||
|     Log3( $name, 4, | ||||
|     ::Log3( $name, 4, | ||||
| "AutoShuttersControl ($name) - Shading Processing - In der Routine zum fahren der Rollläden, Shading Wert: " | ||||
|           . $FHEM::Automation::ShuttersControl::shutters->getShadingStatus ); | ||||
|  | ||||
|   | ||||
| @@ -1,8 +1,8 @@ | ||||
| ############################################################################### | ||||
| # | ||||
| # Developed with Kate | ||||
| # Developed with VSCodium and richterger perl plugin | ||||
| # | ||||
| #  (c) 2018-2020 Copyright: Marko Oldenburg (leongaultier at gmail dot com) | ||||
| #  (c) 2018-2025 Copyright: Marko Oldenburg (fhemdevelopment at cooltux dot net) | ||||
| #  All rights reserved | ||||
| # | ||||
| #   Special thanks goes to: | ||||
| @@ -45,18 +45,18 @@ | ||||
|  | ||||
| package FHEM::Automation::ShuttersControl::Shutters; | ||||
|  | ||||
| use FHEM::Automation::ShuttersControl::Shutters::Readings; | ||||
| use FHEM::Automation::ShuttersControl::Shutters::Attr; | ||||
| use FHEM::Automation::ShuttersControl::Roommate; | ||||
| use FHEM::Automation::ShuttersControl::Window; | ||||
|  | ||||
| our @ISA = | ||||
|   qw(FHEM::Automation::ShuttersControl::Shutters::Readings FHEM::Automation::ShuttersControl::Shutters::Attr FHEM::Automation::ShuttersControl::Roommate FHEM::Automation::ShuttersControl::Window); | ||||
|  | ||||
| use strict; | ||||
| use warnings; | ||||
| use utf8; | ||||
|  | ||||
| use FHEM::Automation::ShuttersControl::Shutters::Readings; | ||||
| use FHEM::Automation::ShuttersControl::Shutters::Attr; | ||||
| use FHEM::Automation::ShuttersControl::Roommate qw (:ALL); | ||||
| use FHEM::Automation::ShuttersControl::Window; | ||||
|  | ||||
| use base | ||||
|   qw(FHEM::Automation::ShuttersControl::Shutters::Readings FHEM::Automation::ShuttersControl::Shutters::Attr FHEM::Automation::ShuttersControl::Roommate FHEM::Automation::ShuttersControl::Window); | ||||
|  | ||||
| sub new { | ||||
|     my $class = shift; | ||||
|     my $self  = { | ||||
| @@ -161,9 +161,6 @@ sub setDriveCmd { | ||||
|         $FHEM::Automation::ShuttersControl::shutters->setDelayCmd($posValue); | ||||
|         $FHEM::Automation::ShuttersControl::ascDev->setDelayCmdReading; | ||||
|         $FHEM::Automation::ShuttersControl::shutters->setNoDelay(0); | ||||
|         $FHEM::Automation::ShuttersControl::shutters->setExternalTriggerStatus(0) | ||||
|           if ( $FHEM::Automation::ShuttersControl::shutters | ||||
|             ->getExternalTriggerStatus ); | ||||
|  | ||||
|         FHEM::Automation::ShuttersControl::ASC_Debug( 'setDriveCmd: ' | ||||
|               . $FHEM::Automation::ShuttersControl::shutters->getShuttersDev | ||||
| @@ -177,7 +174,8 @@ sub setDriveCmd { | ||||
|           if ( $FHEM::Automation::ShuttersControl::shutters->getDelayCmd ne | ||||
|             'none' ) | ||||
|           ; # setzt den Wert auf none da der Rolladen nun gesteuert werden kann. | ||||
|         $FHEM::Automation::ShuttersControl::shutters->setExternalTriggerStatus(0) | ||||
|         $FHEM::Automation::ShuttersControl::shutters->setExternalTriggerStatus( | ||||
|             0) | ||||
|           if ( $FHEM::Automation::ShuttersControl::shutters | ||||
|             ->getExternalTriggerStatus ); | ||||
|  | ||||
| @@ -233,7 +231,7 @@ sub setDriveCmd { | ||||
|                 ::gettimeofday() + | ||||
|                   $FHEM::Automation::ShuttersControl::shutters | ||||
|                   ->getSelfDefenseAbsentDelay, | ||||
|                 \&FHEM::Automation::ShuttersControl::_SetCmdFn, \%h | ||||
|                 \&FHEM::Automation::ShuttersControl::SetCmdFn, \%h | ||||
|             ); | ||||
|             $FHEM::Automation::ShuttersControl::shutters->setSelfDefenseAbsent( | ||||
|                 1, 0, \%h ); | ||||
| @@ -247,7 +245,7 @@ sub setDriveCmd { | ||||
|                       $FHEM::Automation::ShuttersControl::shutters | ||||
|                       ->getDelayStart | ||||
|                 ), | ||||
|                 \&FHEM::Automation::ShuttersControl::_SetCmdFn, | ||||
|                 \&FHEM::Automation::ShuttersControl::SetCmdFn, | ||||
|                 \%h | ||||
|             ); | ||||
|  | ||||
| @@ -258,7 +256,7 @@ sub setDriveCmd { | ||||
|         elsif ($offSetStart < 1 | ||||
|             || $FHEM::Automation::ShuttersControl::shutters->getNoDelay ) | ||||
|         { | ||||
|             FHEM::Automation::ShuttersControl::_SetCmdFn( \%h ); | ||||
|             FHEM::Automation::ShuttersControl::SetCmdFn( \%h ); | ||||
|             FHEM::Automation::ShuttersControl::ASC_Debug( 'FnSetDriveCmd: ' | ||||
|                   . $FHEM::Automation::ShuttersControl::shutters->getShuttersDev | ||||
|                   . ' - NICHT versetztes fahren' ); | ||||
| @@ -346,8 +344,7 @@ sub setLastDriveReading { | ||||
|     ); | ||||
|  | ||||
|     ::InternalTimer( ::gettimeofday() + 0.1, | ||||
|         \&FHEM::Automation::ShuttersControl::_setShuttersLastDriveDelayed, | ||||
|         \%h ); | ||||
|         \&FHEM::Automation::ShuttersControl::setShuttersLastDriveDelayed, \%h ); | ||||
|     return; | ||||
| } | ||||
|  | ||||
| @@ -460,7 +457,8 @@ sub setRainUnprotectionDelayObj { | ||||
|     my $self  = shift; | ||||
|     my $value = shift; | ||||
|  | ||||
|     $self->{ $self->{shuttersDev} }->{RainProtection}->{UNPROTECTIONDELAYOBJVAL} = $value | ||||
|     $self->{ $self->{shuttersDev} }->{RainProtection}->{UNPROTECTIONDELAYOBJVAL} | ||||
|       = $value | ||||
|       if ( defined($value) ); | ||||
|     return; | ||||
| } | ||||
| @@ -545,12 +543,13 @@ sub getAttrUpdateChanges { | ||||
| sub getIsDay { | ||||
|     my $self = shift; | ||||
|  | ||||
|     return FHEM::Automation::ShuttersControl::Helper::_IsDay( $self->{shuttersDev} ); | ||||
|     return FHEM::Automation::ShuttersControl::Helper::_IsDay( | ||||
|         $self->{shuttersDev} ); | ||||
| } | ||||
|  | ||||
| sub getAntiFreezeStatus { | ||||
|     use POSIX qw(strftime); | ||||
|     my $self = shift; | ||||
|     my $self    = shift; | ||||
|     my $daytime = strftime( "%P", localtime() ); | ||||
|     $daytime = ( | ||||
|         defined($daytime) && $daytime | ||||
| @@ -595,7 +594,7 @@ sub getShuttersPosCmdValueNegate { | ||||
| sub getQueryShuttersPos | ||||
| { # Es wird geschaut ob die aktuelle Position des Rollos unterhalb der Zielposition ist | ||||
|     my $self     = shift; | ||||
|     my $posValue = shift; #   wenn dem so ist wird 1 zurück gegeben ansonsten 0 | ||||
|     my $posValue = shift;  #   wenn dem so ist wird 1 zurück gegeben ansonsten 0 | ||||
|  | ||||
|     return ( | ||||
|         $FHEM::Automation::ShuttersControl::shutters | ||||
| @@ -756,10 +755,12 @@ sub getRainUnprotectionDelayObj { | ||||
|         ( | ||||
|             defined( $self->{ $self->{shuttersDev} }->{RainProtection} ) | ||||
|               && defined( | ||||
|                 $self->{ $self->{shuttersDev} }->{RainProtection}->{UNPROTECTIONDELAYOBJVAL} | ||||
|                 $self->{ $self->{shuttersDev} }->{RainProtection} | ||||
|                   ->{UNPROTECTIONDELAYOBJVAL} | ||||
|               ) | ||||
|         ) | ||||
|         ? $self->{ $self->{shuttersDev} }->{RainProtection}->{UNPROTECTIONDELAYOBJVAL} | ||||
|         ? $self->{ $self->{shuttersDev} }->{RainProtection} | ||||
|           ->{UNPROTECTIONDELAYOBJVAL} | ||||
|         : 'none' | ||||
|     ); | ||||
| } | ||||
| @@ -821,7 +822,7 @@ sub getRoommatesStatus { | ||||
|         $FHEM::Automation::ShuttersControl::shutters->setRoommate($ro); | ||||
|         my $currentPrio = | ||||
|           $statePrio{ $FHEM::Automation::ShuttersControl::shutters | ||||
|               ->_getRoommateStatus }; | ||||
|               ->getRoommateStatus }; | ||||
|         $minPrio = $currentPrio if ( $minPrio > $currentPrio ); | ||||
|     } | ||||
|  | ||||
| @@ -854,7 +855,7 @@ sub getRoommatesLastStatus { | ||||
|         $FHEM::Automation::ShuttersControl::shutters->setRoommate($ro); | ||||
|         my $currentPrio = | ||||
|           $statePrio{ $FHEM::Automation::ShuttersControl::shutters | ||||
|               ->_getRoommateLastStatus }; | ||||
|               ->getRoommateLastStatus }; | ||||
|         $minPrio = $currentPrio if ( $minPrio > $currentPrio ); | ||||
|     } | ||||
|  | ||||
| @@ -884,7 +885,7 @@ sub getIdleDetection { | ||||
| ### Begin Beschattung Objekt mit Daten befüllen | ||||
| sub setShadingStatus { | ||||
|     my $self  = shift; | ||||
|     my $value = shift; ### Werte für value = in, out, in reserved, out reserved | ||||
|     my $value = shift;  ### Werte für value = in, out, in reserved, out reserved | ||||
|  | ||||
| # Es wird durch das return die ShadingWaitingTime nicht mehr beachtet, Bugmeldung von Bernd Griemsmann | ||||
| #     return | ||||
| @@ -899,7 +900,8 @@ sub setShadingStatus { | ||||
|  | ||||
|     $self->{ $self->{shuttersDev} }{ShadingStatus}{VAL} = $value | ||||
|       if ( defined($value) ); | ||||
|     $self->{ $self->{shuttersDev} }{ShadingStatus}{TIME} = int( ::gettimeofday() ) | ||||
|     $self->{ $self->{shuttersDev} }{ShadingStatus}{TIME} = | ||||
|       int( ::gettimeofday() ) | ||||
|       if ( defined( $self->{ $self->{shuttersDev} }{ShadingStatus} ) ); | ||||
|  | ||||
|     return; | ||||
| @@ -945,7 +947,7 @@ sub setShadingLastPos { | ||||
|     return; | ||||
| } | ||||
|  | ||||
| sub setShadingBetweenTheTimeSuspend {       # Werte für value = 0, 1 | ||||
| sub setShadingBetweenTheTimeSuspend {    # Werte für value = 0, 1 | ||||
|     my $self  = shift; | ||||
|     my $value = shift; | ||||
|  | ||||
| @@ -996,7 +998,7 @@ sub getBrightnessAverage { | ||||
|     return; | ||||
| } | ||||
|  | ||||
| sub getShadingStatus {   # Werte für value = in, out, in reserved, out reserved | ||||
| sub getShadingStatus {    # Werte für value = in, out, in reserved, out reserved | ||||
|     my $self = shift; | ||||
|  | ||||
|     return ( | ||||
| @@ -1007,12 +1009,16 @@ sub getShadingStatus {   # Werte für value = in, out, in reserved, out reserved | ||||
|     ); | ||||
| } | ||||
|  | ||||
| sub getShadingBetweenTheTimeSuspend {   # Werte für value = 0, 1 | ||||
| sub getShadingBetweenTheTimeSuspend {    # Werte für value = 0, 1 | ||||
|     my $self = shift; | ||||
|  | ||||
|     return ( | ||||
|         defined( $self->{ $self->{shuttersDev} }{ShadingBetweenTheTimeSuspend} ) | ||||
|           && defined( $self->{ $self->{shuttersDev} }{ShadingBetweenTheTimeSuspend}{VAL} ) | ||||
|         defined( | ||||
|             $self->{ $self->{shuttersDev} }{ShadingBetweenTheTimeSuspend} | ||||
|           ) | ||||
|           && defined( | ||||
|             $self->{ $self->{shuttersDev} }{ShadingBetweenTheTimeSuspend}{VAL} | ||||
|           ) | ||||
|         ? $self->{ $self->{shuttersDev} }{ShadingBetweenTheTimeSuspend}{VAL} | ||||
|         : 0 | ||||
|     ); | ||||
| @@ -1084,9 +1090,7 @@ sub getShadingLastPos { | ||||
|  | ||||
|     return ( | ||||
|         defined( $self->{ $self->{shuttersDev} }{ShadingLastPos} ) | ||||
|           && defined( | ||||
|             $self->{ $self->{shuttersDev} }{ShadingLastPos}{VAL} | ||||
|           ) | ||||
|           && defined( $self->{ $self->{shuttersDev} }{ShadingLastPos}{VAL} ) | ||||
|         ? $self->{ $self->{shuttersDev} }{ShadingLastPos}{VAL} | ||||
|         : $FHEM::Automation::ShuttersControl::shutters->getShadingPos | ||||
|     ); | ||||
| @@ -1094,7 +1098,4 @@ sub getShadingLastPos { | ||||
|  | ||||
| ### Ende Beschattung | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| 1; | ||||
|   | ||||
| @@ -1,8 +1,8 @@ | ||||
| ############################################################################### | ||||
| # | ||||
| # Developed with Kate | ||||
| # Developed with VSCodium and richterger perl plugin | ||||
| # | ||||
| #  (c) 2018-2020 Copyright: Marko Oldenburg (leongaultier at gmail dot com) | ||||
| #  (c) 2018-2025 Copyright: Marko Oldenburg (fhemdevelopment at cooltux dot net) | ||||
| #  All rights reserved | ||||
| # | ||||
| #   Special thanks goes to: | ||||
| @@ -46,24 +46,12 @@ use utf8; | ||||
|  | ||||
| use FHEM::Automation::ShuttersControl::Helper qw (IsAdv PerlCodeCheck); | ||||
|  | ||||
| use GPUtils qw(GP_Import); | ||||
|  | ||||
| ## Import der FHEM Funktionen | ||||
| BEGIN { | ||||
|     GP_Import( | ||||
|         qw( | ||||
|           AttrVal | ||||
|           CommandAttr | ||||
|           gettimeofday) | ||||
|     ); | ||||
| } | ||||
|  | ||||
| sub _setAttributs { | ||||
|     my $shuttersDev = shift; | ||||
|     my $attr        = shift; | ||||
|     my $attrVal     = shift; | ||||
|  | ||||
|     CommandAttr( undef, $shuttersDev . ' ' . $attr . ' ' . $attrVal ); | ||||
|     ::CommandAttr( undef, $shuttersDev . ' ' . $attr . ' ' . $attrVal ); | ||||
|  | ||||
|     return; | ||||
| } | ||||
| @@ -77,28 +65,28 @@ sub _getPosition { | ||||
|     return $self->{ $self->{shuttersDev} }->{$attr}->{position} | ||||
|       if ( | ||||
|         exists( $self->{ $self->{shuttersDev} }->{$attr}->{LASTGETTIME} ) | ||||
|         && ( gettimeofday() - | ||||
|         && ( ::gettimeofday() - | ||||
|             $self->{ $self->{shuttersDev} }->{$attr}->{LASTGETTIME} ) < 2 | ||||
|       ); | ||||
|     $self->{ $self->{shuttersDev} }->{$attr}->{LASTGETTIME} = | ||||
|       int( gettimeofday() ); | ||||
|       int( ::gettimeofday() ); | ||||
|  | ||||
|     my $position; | ||||
|     my $posAssignment; | ||||
|  | ||||
|     if ( | ||||
|         AttrVal( $self->{shuttersDev}, $attr, | ||||
|         ::AttrVal( $self->{shuttersDev}, $attr, | ||||
|             $FHEM::Automation::ShuttersControl::userAttrList{$userAttrList} | ||||
|               [ AttrVal( $self->{shuttersDev}, 'ASC', 2 ) ] ) =~ | ||||
|               [ ::AttrVal( $self->{shuttersDev}, 'ASC', 2 ) ] ) =~ | ||||
|         m{\A\{.+\}\z}xms | ||||
|       ) | ||||
|     { | ||||
|         my $response = PerlCodeCheck( | ||||
|             AttrVal( | ||||
|             ::AttrVal( | ||||
|                 $self->{shuttersDev}, | ||||
|                 $attr, | ||||
|                 $FHEM::Automation::ShuttersControl::userAttrList{$userAttrList} | ||||
|                   [ AttrVal( $self->{shuttersDev}, 'ASC', 2 ) ] | ||||
|                   [ ::AttrVal( $self->{shuttersDev}, 'ASC', 2 ) ] | ||||
|             ) | ||||
|         ); | ||||
|  | ||||
| @@ -108,14 +96,14 @@ sub _getPosition { | ||||
|               $position =~ m{\A\d+(\.\d+)?\z}xms | ||||
|             ? $position | ||||
|             : $FHEM::Automation::ShuttersControl::userAttrList{$userAttrList} | ||||
|               [ AttrVal( $self->{shuttersDev}, 'ASC', 2 ) ] | ||||
|               [ ::AttrVal( $self->{shuttersDev}, 'ASC', 2 ) ] | ||||
|         ); | ||||
|  | ||||
|         $posAssignment = ( | ||||
|                 defined($posAssignment) | ||||
|             &&  $posAssignment =~ m{\A\d+(\.\d+)?\z}xms | ||||
|               ? $posAssignment | ||||
|               : 'none' | ||||
|             defined($posAssignment) | ||||
|               && $posAssignment =~ m{\A\d+(\.\d+)?\z}xms | ||||
|             ? $posAssignment | ||||
|             : 'none' | ||||
|         ); | ||||
|     } | ||||
|     else { | ||||
| @@ -124,7 +112,7 @@ sub _getPosition { | ||||
|             $self->{shuttersDev}, | ||||
|             $attr, | ||||
|             $FHEM::Automation::ShuttersControl::userAttrList{$userAttrList} | ||||
|               [ AttrVal( $self->{shuttersDev}, 'ASC', 2 ) ] | ||||
|               [ ::AttrVal( $self->{shuttersDev}, 'ASC', 2 ) ] | ||||
|           ); | ||||
|     } | ||||
|  | ||||
| @@ -145,8 +133,7 @@ sub _getPosition { | ||||
|       ) | ||||
|     { | ||||
|         $self->{ $self->{shuttersDev} }->{$attr}->{position} = | ||||
|           PerlCodeCheck( | ||||
|             $self->{ $self->{shuttersDev} }->{$attr}->{position} ); | ||||
|           PerlCodeCheck( $self->{ $self->{shuttersDev} }->{$attr}->{position} ); | ||||
|     } | ||||
|  | ||||
|     return ( | ||||
| @@ -154,7 +141,7 @@ sub _getPosition { | ||||
|           m{^\d+(\.\d+)?$}xms | ||||
|         ? $self->{ $self->{shuttersDev} }->{$attr}->{position} | ||||
|         : $FHEM::Automation::ShuttersControl::userAttrList{$userAttrList} | ||||
|           [ AttrVal( $self->{shuttersDev}, 'ASC', 2 ) ] | ||||
|           [ ::AttrVal( $self->{shuttersDev}, 'ASC', 2 ) ] | ||||
|     ); | ||||
| } | ||||
|  | ||||
| @@ -167,7 +154,7 @@ sub _getPositionAssignment { | ||||
|     return $self->{ $self->{shuttersDev} }->{$attr}->{posAssignment} | ||||
|       if ( | ||||
|         exists( $self->{ $self->{shuttersDev} }->{$attr}->{LASTGETTIME} ) | ||||
|         && ( gettimeofday() - | ||||
|         && ( ::gettimeofday() - | ||||
|             $self->{ $self->{shuttersDev} }->{$attr}->{LASTGETTIME} ) < 2 | ||||
|       ); | ||||
|     $FHEM::Automation::ShuttersControl::shutters->$getFn; | ||||
| @@ -213,7 +200,7 @@ sub setShuttersPlace { | ||||
| sub getShuttersPlace { | ||||
|     my $self = shift; | ||||
|  | ||||
|     return AttrVal( $self->{shuttersDev}, 'ASC_ShuttersPlace', 'window' ); | ||||
|     return ::AttrVal( $self->{shuttersDev}, 'ASC_ShuttersPlace', 'window' ); | ||||
| } | ||||
|  | ||||
| sub setSlatPosCmd { | ||||
| @@ -236,15 +223,15 @@ sub getSlatPosCmd { | ||||
|             $self->{ $self->{shuttersDev} }->{ASC_SlatPosCmd_SlatDevice} | ||||
|               ->{LASTGETTIME} | ||||
|         ) | ||||
|         && ( gettimeofday() - | ||||
|         && ( ::gettimeofday() - | ||||
|             $self->{ $self->{shuttersDev} }->{ASC_SlatPosCmd_SlatDevice} | ||||
|             ->{LASTGETTIME} ) < 2 | ||||
|       ); | ||||
|     $self->{ $self->{shuttersDev} }->{ASC_SlatPosCmd_SlatDevice}->{LASTGETTIME} | ||||
|       = int( gettimeofday() ); | ||||
|       = int( ::gettimeofday() ); | ||||
|     my ( $slatPosCmd, $slatDevice ) = | ||||
|       FHEM::Automation::ShuttersControl::Helper::GetAttrValues( $self->{shuttersDev}, | ||||
|         'ASC_SlatPosCmd_SlatDevice', 'none:none' ); | ||||
|       FHEM::Automation::ShuttersControl::Helper::GetAttrValues( | ||||
|         $self->{shuttersDev}, 'ASC_SlatPosCmd_SlatDevice', 'none:none' ); | ||||
|  | ||||
|     ## Erwartetes Ergebnis | ||||
|     # upTime:upBrightnessVal | ||||
| @@ -268,7 +255,7 @@ sub getSlatDevice { | ||||
|             $self->{ $self->{shuttersDev} }->{ASC_SlatPosCmd_SlatDevice} | ||||
|               ->{LASTGETTIME} | ||||
|         ) | ||||
|         && ( gettimeofday() - | ||||
|         && ( ::gettimeofday() - | ||||
|             $self->{ $self->{shuttersDev} }->{ASC_SlatPosCmd_SlatDevice} | ||||
|             ->{LASTGETTIME} ) < 2 | ||||
|       ); | ||||
| @@ -299,15 +286,15 @@ sub getPrivacyUpTime { | ||||
|             $self->{ $self->{shuttersDev} }->{ASC_PrivacyUpValue_beforeDayOpen} | ||||
|               ->{LASTGETTIME} | ||||
|         ) | ||||
|         && ( gettimeofday() - | ||||
|         && ( ::gettimeofday() - | ||||
|             $self->{ $self->{shuttersDev} }->{ASC_PrivacyUpValue_beforeDayOpen} | ||||
|             ->{LASTGETTIME} ) < 2 | ||||
|       ); | ||||
|     $self->{ $self->{shuttersDev} }->{ASC_PrivacyUpValue_beforeDayOpen} | ||||
|       ->{LASTGETTIME} = int( gettimeofday() ); | ||||
|       ->{LASTGETTIME} = int( ::gettimeofday() ); | ||||
|     my ( $upTime, $upBrightnessVal ) = | ||||
|       FHEM::Automation::ShuttersControl::Helper::GetAttrValues( $self->{shuttersDev}, | ||||
|         'ASC_PrivacyUpValue_beforeDayOpen', '-1:-1' ); | ||||
|       FHEM::Automation::ShuttersControl::Helper::GetAttrValues( | ||||
|         $self->{shuttersDev}, 'ASC_PrivacyUpValue_beforeDayOpen', '-1:-1' ); | ||||
|  | ||||
|     ## Erwartetes Ergebnis | ||||
|     # upTime:upBrightnessVal | ||||
| @@ -341,7 +328,7 @@ sub getPrivacyUpBrightnessVal { | ||||
|             $self->{ $self->{shuttersDev} }->{ASC_PrivacyUpValue_beforeDayOpen} | ||||
|               ->{LASTGETTIME} | ||||
|         ) | ||||
|         && ( gettimeofday() - | ||||
|         && ( ::gettimeofday() - | ||||
|             $self->{ $self->{shuttersDev} }->{ASC_PrivacyUpValue_beforeDayOpen} | ||||
|             ->{LASTGETTIME} ) < 2 | ||||
|       ); | ||||
| @@ -378,14 +365,15 @@ sub getPrivacyDownTime { | ||||
|             $self->{ $self->{shuttersDev} } | ||||
|               ->{ASC_PrivacyDownValue_beforeNightClose}->{LASTGETTIME} | ||||
|         ) | ||||
|         && ( gettimeofday() - | ||||
|         && ( ::gettimeofday() - | ||||
|             $self->{ $self->{shuttersDev} } | ||||
|             ->{ASC_PrivacyDownValue_beforeNightClose}->{LASTGETTIME} ) < 2 | ||||
|       ); | ||||
|     $self->{ $self->{shuttersDev} }->{ASC_PrivacyDownValue_beforeNightClose} | ||||
|       ->{LASTGETTIME} = int( gettimeofday() ); | ||||
|       ->{LASTGETTIME} = int( ::gettimeofday() ); | ||||
|     my ( $downTime, $downBrightnessVal ) = | ||||
|       FHEM::Automation::ShuttersControl::Helper::GetAttrValues( $self->{shuttersDev}, | ||||
|       FHEM::Automation::ShuttersControl::Helper::GetAttrValues( | ||||
|         $self->{shuttersDev}, | ||||
|         'ASC_PrivacyDownValue_beforeNightClose', '-1:-1' ); | ||||
|  | ||||
|     ## Erwartetes Ergebnis | ||||
| @@ -420,7 +408,7 @@ sub getPrivacyDownBrightnessVal { | ||||
|             $self->{ $self->{shuttersDev} } | ||||
|               ->{ASC_PrivacyDownValue_beforeNightClose}->{LASTGETTIME} | ||||
|         ) | ||||
|         && ( gettimeofday() - | ||||
|         && ( ::gettimeofday() - | ||||
|             $self->{ $self->{shuttersDev} } | ||||
|             ->{ASC_PrivacyDownValue_beforeNightClose}->{LASTGETTIME} ) < 2 | ||||
|       ); | ||||
| @@ -497,7 +485,7 @@ sub setSelfDefenseMode { | ||||
| sub getSelfDefenseMode { | ||||
|     my $self = shift; | ||||
|  | ||||
|     return AttrVal( $self->{shuttersDev}, 'ASC_Self_Defense_Mode', 'gone' ); | ||||
|     return ::AttrVal( $self->{shuttersDev}, 'ASC_Self_Defense_Mode', 'gone' ); | ||||
| } | ||||
|  | ||||
| sub setSelfDefenseAbsentDelay { | ||||
| @@ -513,7 +501,14 @@ sub setSelfDefenseAbsentDelay { | ||||
| sub getSelfDefenseAbsentDelay { | ||||
|     my $self = shift; | ||||
|  | ||||
|     return AttrVal( $self->{shuttersDev}, 'ASC_Self_Defense_AbsentDelay', 300 ); | ||||
|     return ::AttrVal( $self->{shuttersDev}, 'ASC_Self_Defense_AbsentDelay', | ||||
|         300 ); | ||||
| } | ||||
|  | ||||
| sub getCommandTemplate { | ||||
|     my $self = shift; | ||||
|  | ||||
|     return ::AttrVal( $self->{shuttersDev}, 'ASC_CommandTemplate', 'none' ); | ||||
| } | ||||
|  | ||||
| sub setWiggleValue { | ||||
| @@ -528,7 +523,7 @@ sub setWiggleValue { | ||||
| sub getWiggleValue { | ||||
|     my $self = shift; | ||||
|  | ||||
|     return AttrVal( $self->{shuttersDev}, 'ASC_WiggleValue', 5 ); | ||||
|     return ::AttrVal( $self->{shuttersDev}, 'ASC_WiggleValue', 5 ); | ||||
| } | ||||
|  | ||||
| sub setAdv { | ||||
| @@ -544,7 +539,7 @@ sub getAdv { | ||||
|     my $self = shift; | ||||
|  | ||||
|     return ( | ||||
|         AttrVal( $self->{shuttersDev}, 'ASC_Adv', 'off' ) eq 'on' | ||||
|         ::AttrVal( $self->{shuttersDev}, 'ASC_Adv', 'off' ) eq 'on' | ||||
|         ? ( IsAdv == 1 ? 1 : 0 ) | ||||
|         : 0 | ||||
|     ); | ||||
| @@ -587,7 +582,7 @@ sub setShadingMode { | ||||
| sub getShadingMode { | ||||
|     my $self = shift; | ||||
|  | ||||
|     return AttrVal( $self->{shuttersDev}, 'ASC_Shading_Mode', 'off' ); | ||||
|     return ::AttrVal( $self->{shuttersDev}, 'ASC_Shading_Mode', 'off' ); | ||||
| } | ||||
|  | ||||
| sub _getTempSensor { | ||||
| @@ -598,15 +593,15 @@ sub _getTempSensor { | ||||
|         exists( | ||||
|             $self->{ $self->{shuttersDev} }->{ASC_TempSensor}->{LASTGETTIME} | ||||
|         ) | ||||
|         && ( gettimeofday() - | ||||
|         && ( ::gettimeofday() - | ||||
|             $self->{ $self->{shuttersDev} }->{ASC_TempSensor}->{LASTGETTIME} ) | ||||
|         < 2 | ||||
|       ); | ||||
|     $self->{ $self->{shuttersDev} }->{ASC_TempSensor}->{LASTGETTIME} = | ||||
|       int( gettimeofday() ); | ||||
|       int( ::gettimeofday() ); | ||||
|     my ( $device, $reading ) = | ||||
|       FHEM::Automation::ShuttersControl::Helper::GetAttrValues( $self->{shuttersDev}, | ||||
|         'ASC_TempSensor', 'none' ); | ||||
|       FHEM::Automation::ShuttersControl::Helper::GetAttrValues( | ||||
|         $self->{shuttersDev}, 'ASC_TempSensor', 'none' ); | ||||
|  | ||||
|     ### erwartetes Ergebnis | ||||
|     # DEVICE:READING | ||||
| @@ -625,7 +620,7 @@ sub getTempSensorReading { | ||||
|         exists( | ||||
|             $self->{ $self->{shuttersDev} }->{ASC_TempSensor}->{LASTGETTIME} | ||||
|         ) | ||||
|         && ( gettimeofday() - | ||||
|         && ( ::gettimeofday() - | ||||
|             $self->{ $self->{shuttersDev} }->{ASC_TempSensor}->{LASTGETTIME} ) | ||||
|         < 2 | ||||
|       ); | ||||
| @@ -658,15 +653,15 @@ sub _getIdleDetectionReading { | ||||
|             $self->{ $self->{shuttersDev} }->{ASC_Shutter_IdleDetection} | ||||
|               ->{LASTGETTIME} | ||||
|         ) | ||||
|         && ( gettimeofday() - | ||||
|         && ( ::gettimeofday() - | ||||
|             $self->{ $self->{shuttersDev} }->{ASC_Shutter_IdleDetection} | ||||
|             ->{LASTGETTIME} ) < 2 | ||||
|       ); | ||||
|     $self->{ $self->{shuttersDev} }->{ASC_Shutter_IdleDetection}->{LASTGETTIME} | ||||
|       = int( gettimeofday() ); | ||||
|       = int( ::gettimeofday() ); | ||||
|     my ( $reading, $value ) = | ||||
|       FHEM::Automation::ShuttersControl::Helper::GetAttrValues( $self->{shuttersDev}, | ||||
|         'ASC_Shutter_IdleDetection', 'none' ); | ||||
|       FHEM::Automation::ShuttersControl::Helper::GetAttrValues( | ||||
|         $self->{shuttersDev}, 'ASC_Shutter_IdleDetection', 'none' ); | ||||
|  | ||||
|     ### erwartetes Ergebnis | ||||
|     # READING:VALUE | ||||
| @@ -688,7 +683,7 @@ sub getIdleDetectionValue { | ||||
|             $self->{ $self->{shuttersDev} }->{ASC_Shutter_IdleDetection} | ||||
|               ->{LASTGETTIME} | ||||
|         ) | ||||
|         && ( gettimeofday() - | ||||
|         && ( ::gettimeofday() - | ||||
|             $self->{ $self->{shuttersDev} }->{ASC_Shutter_IdleDetection} | ||||
|             ->{LASTGETTIME} ) < 2 | ||||
|       ); | ||||
| @@ -722,15 +717,15 @@ sub _getBrightnessSensor { | ||||
|             $self->{ $self->{shuttersDev} }->{ASC_BrightnessSensor} | ||||
|               ->{LASTGETTIME} | ||||
|         ) | ||||
|         && ( gettimeofday() - | ||||
|         && ( ::gettimeofday() - | ||||
|             $self->{ $self->{shuttersDev} }->{ASC_BrightnessSensor} | ||||
|             ->{LASTGETTIME} ) < 2 | ||||
|       ); | ||||
|     $self->{ $self->{shuttersDev} }->{ASC_BrightnessSensor}->{LASTGETTIME} = | ||||
|       int( gettimeofday() ); | ||||
|       int( ::gettimeofday() ); | ||||
|     my ( $device, $reading, $max, $min ) = | ||||
|       FHEM::Automation::ShuttersControl::Helper::GetAttrValues( $self->{shuttersDev}, | ||||
|         'ASC_BrightnessSensor', 'none' ); | ||||
|       FHEM::Automation::ShuttersControl::Helper::GetAttrValues( | ||||
|         $self->{shuttersDev}, 'ASC_BrightnessSensor', 'none' ); | ||||
|  | ||||
|     ### erwartetes Ergebnis | ||||
|     # DEVICE:READING MAX:MIN | ||||
| @@ -754,7 +749,7 @@ sub getBrightnessReading { | ||||
|             $self->{ $self->{shuttersDev} }->{ASC_BrightnessSensor} | ||||
|               ->{LASTGETTIME} | ||||
|         ) | ||||
|         && ( gettimeofday() - | ||||
|         && ( ::gettimeofday() - | ||||
|             $self->{ $self->{shuttersDev} }->{ASC_BrightnessSensor} | ||||
|             ->{LASTGETTIME} ) < 2 | ||||
|       ); | ||||
| @@ -779,7 +774,7 @@ sub getShadingAzimuthLeft { | ||||
|             $self->{ $self->{shuttersDev} }->{ASC_Shading_InOutAzimuth} | ||||
|               ->{LASTGETTIME} | ||||
|         ) | ||||
|         && ( gettimeofday() - | ||||
|         && ( ::gettimeofday() - | ||||
|             $self->{ $self->{shuttersDev} }->{ASC_Shading_InOutAzimuth} | ||||
|             ->{LASTGETTIME} ) < 2 | ||||
|       ); | ||||
| @@ -808,15 +803,15 @@ sub getShadingAzimuthRight { | ||||
|             $self->{ $self->{shuttersDev} }->{ASC_Shading_InOutAzimuth} | ||||
|               ->{LASTGETTIME} | ||||
|         ) | ||||
|         && ( gettimeofday() - | ||||
|         && ( ::gettimeofday() - | ||||
|             $self->{ $self->{shuttersDev} }->{ASC_Shading_InOutAzimuth} | ||||
|             ->{LASTGETTIME} ) < 2 | ||||
|       ); | ||||
|     $self->{ $self->{shuttersDev} }->{ASC_Shading_InOutAzimuth}->{LASTGETTIME} | ||||
|       = int( gettimeofday() ); | ||||
|       = int( ::gettimeofday() ); | ||||
|     my ( $left, $right ) = | ||||
|       FHEM::Automation::ShuttersControl::Helper::GetAttrValues( $self->{shuttersDev}, | ||||
|         'ASC_Shading_InOutAzimuth', '95:265' ); | ||||
|       FHEM::Automation::ShuttersControl::Helper::GetAttrValues( | ||||
|         $self->{shuttersDev}, 'ASC_Shading_InOutAzimuth', '95:265' ); | ||||
|  | ||||
|     ### erwartetes Ergebnis | ||||
|     # MIN:MAX | ||||
| @@ -843,8 +838,8 @@ sub setShadingMinOutsideTemperature { | ||||
| sub getShadingMinOutsideTemperature { | ||||
|     my $self = shift; | ||||
|  | ||||
|     return AttrVal( $self->{shuttersDev}, 'ASC_Shading_Min_OutsideTemperature', | ||||
|         18 ); | ||||
|     return ::AttrVal( $self->{shuttersDev}, | ||||
|         'ASC_Shading_Min_OutsideTemperature', 18 ); | ||||
| } | ||||
|  | ||||
| sub setShadingMinMaxElevation { | ||||
| @@ -867,15 +862,15 @@ sub getShadingMinElevation { | ||||
|             $self->{ $self->{shuttersDev} }->{ASC_Shading_MinMax_Elevation} | ||||
|               ->{LASTGETTIME} | ||||
|         ) | ||||
|         && ( gettimeofday() - | ||||
|         && ( ::gettimeofday() - | ||||
|             $self->{ $self->{shuttersDev} }->{ASC_Shading_MinMax_Elevation} | ||||
|             ->{LASTGETTIME} ) < 2 | ||||
|       ); | ||||
|     $self->{ $self->{shuttersDev} }->{ASC_Shading_MinMax_Elevation} | ||||
|       ->{LASTGETTIME} = int( gettimeofday() ); | ||||
|       ->{LASTGETTIME} = int( ::gettimeofday() ); | ||||
|     my ( $min, $max ) = | ||||
|       FHEM::Automation::ShuttersControl::Helper::GetAttrValues( $self->{shuttersDev}, | ||||
|         'ASC_Shading_MinMax_Elevation', '25.0:100.0' ); | ||||
|       FHEM::Automation::ShuttersControl::Helper::GetAttrValues( | ||||
|         $self->{shuttersDev}, 'ASC_Shading_MinMax_Elevation', '25.0:100.0' ); | ||||
|  | ||||
|     ### erwartetes Ergebnis | ||||
|     # MIN:MAX | ||||
| @@ -899,7 +894,7 @@ sub getShadingMaxElevation { | ||||
|             $self->{ $self->{shuttersDev} }->{ASC_Shading_MinMax_Elevation} | ||||
|               ->{LASTGETTIME} | ||||
|         ) | ||||
|         && ( gettimeofday() - | ||||
|         && ( ::gettimeofday() - | ||||
|             $self->{ $self->{shuttersDev} }->{ASC_Shading_MinMax_Elevation} | ||||
|             ->{LASTGETTIME} ) < 2 | ||||
|       ); | ||||
| @@ -937,15 +932,15 @@ sub getShadingStateChangeSunny { | ||||
|             $self->{ $self->{shuttersDev} } | ||||
|               ->{ASC_Shading_StateChange_SunnyCloudy}->{LASTGETTIME} | ||||
|         ) | ||||
|         && ( gettimeofday() - | ||||
|         && ( ::gettimeofday() - | ||||
|             $self->{ $self->{shuttersDev} } | ||||
|             ->{ASC_Shading_StateChange_SunnyCloudy}->{LASTGETTIME} ) < 2 | ||||
|       ); | ||||
|     $self->{ $self->{shuttersDev} }->{ASC_Shading_StateChange_SunnyCloudy} | ||||
|       ->{LASTGETTIME} = int( gettimeofday() ); | ||||
|       ->{LASTGETTIME} = int( ::gettimeofday() ); | ||||
|     my ( $sunny, $cloudy, $maxBrightnessAverageArrayObjects ) = | ||||
|       FHEM::Automation::ShuttersControl::Helper::GetAttrValues( $self->{shuttersDev}, | ||||
|         'ASC_Shading_StateChange_SunnyCloudy', | ||||
|       FHEM::Automation::ShuttersControl::Helper::GetAttrValues( | ||||
|         $self->{shuttersDev}, 'ASC_Shading_StateChange_SunnyCloudy', | ||||
|         '35000:20000' ); | ||||
|  | ||||
|     ### erwartetes Ergebnis | ||||
| @@ -976,7 +971,7 @@ sub getShadingStateChangeCloudy { | ||||
|             $self->{ $self->{shuttersDev} } | ||||
|               ->{ASC_Shading_StateChange_SunnyCloudy}->{LASTGETTIME} | ||||
|         ) | ||||
|         && ( gettimeofday() - | ||||
|         && ( ::gettimeofday() - | ||||
|             $self->{ $self->{shuttersDev} } | ||||
|             ->{ASC_Shading_StateChange_SunnyCloudy}->{LASTGETTIME} ) < 2 | ||||
|       ); | ||||
| @@ -996,7 +991,7 @@ sub getMaxBrightnessAverageArrayObjects { | ||||
|             $self->{ $self->{shuttersDev} } | ||||
|               ->{ASC_Shading_StateChange_SunnyCloudy}->{LASTGETTIME} | ||||
|         ) | ||||
|         && ( gettimeofday() - | ||||
|         && ( ::gettimeofday() - | ||||
|             $self->{ $self->{shuttersDev} } | ||||
|             ->{ASC_Shading_StateChange_SunnyCloudy}->{LASTGETTIME} ) < 2 | ||||
|       ); | ||||
| @@ -1019,7 +1014,7 @@ sub setShadingWaitingPeriod { | ||||
| sub getShadingWaitingPeriod { | ||||
|     my $self = shift; | ||||
|  | ||||
|     return AttrVal( $self->{shuttersDev}, 'ASC_Shading_WaitingPeriod', 1200 ); | ||||
|     return ::AttrVal( $self->{shuttersDev}, 'ASC_Shading_WaitingPeriod', 1200 ); | ||||
| } | ||||
| ### Ende Beschattung | ||||
| sub setExternalTrigger { | ||||
| @@ -1040,16 +1035,16 @@ sub getExternalTriggerDevice { | ||||
|             $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger} | ||||
|               ->{LASTGETTIME} | ||||
|         ) | ||||
|         && ( gettimeofday() - | ||||
|         && ( ::gettimeofday() - | ||||
|             $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger} | ||||
|             ->{LASTGETTIME} ) < 2 | ||||
|       ); | ||||
|     $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}->{LASTGETTIME} = | ||||
|       int( gettimeofday() ); | ||||
|       int( ::gettimeofday() ); | ||||
|     my ( $device, $reading, $valueActive, $valueInactive, $posActive, | ||||
|         $posInactive, $valueActive2, $posActive2 ) | ||||
|       = FHEM::Automation::ShuttersControl::Helper::GetAttrValues( $self->{shuttersDev}, | ||||
|         'ASC_ExternalTrigger', 'none' ); | ||||
|       = FHEM::Automation::ShuttersControl::Helper::GetAttrValues( | ||||
|         $self->{shuttersDev}, 'ASC_ExternalTrigger', 'none' ); | ||||
|  | ||||
|     ### erwartetes Ergebnis | ||||
| # DEVICE:READING VALUEACTIVE:VALUEINACTIVE POSACTIVE:POSINACTIVE VALUEACTIVE2:POSACTIVE2 | ||||
| @@ -1064,10 +1059,11 @@ sub getExternalTriggerDevice { | ||||
|       $valueInactive; | ||||
|     $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}->{posactive} = | ||||
|       $posActive; | ||||
|     $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}->{posinactive} = | ||||
|       (   $posInactive ne 'none' | ||||
|     $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}->{posinactive} = ( | ||||
|           $posInactive ne 'none' | ||||
|         ? $posInactive | ||||
|         : $FHEM::Automation::ShuttersControl::shutters->getLastPos ); | ||||
|         : $FHEM::Automation::ShuttersControl::shutters->getLastPos | ||||
|     ); | ||||
|     $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}->{valueactive2} = | ||||
|       $valueActive2; | ||||
|     $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}->{posactive2} = | ||||
| @@ -1086,7 +1082,7 @@ sub getExternalTriggerReading { | ||||
|             $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger} | ||||
|               ->{LASTGETTIME} | ||||
|         ) | ||||
|         && ( gettimeofday() - | ||||
|         && ( ::gettimeofday() - | ||||
|             $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger} | ||||
|             ->{LASTGETTIME} ) < 2 | ||||
|       ); | ||||
| @@ -1104,7 +1100,7 @@ sub getExternalTriggerValueActive { | ||||
|             $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger} | ||||
|               ->{LASTGETTIME} | ||||
|         ) | ||||
|         && ( gettimeofday() - | ||||
|         && ( ::gettimeofday() - | ||||
|             $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger} | ||||
|             ->{LASTGETTIME} ) < 2 | ||||
|       ); | ||||
| @@ -1124,7 +1120,7 @@ sub getExternalTriggerValueActive2 { | ||||
|             $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger} | ||||
|               ->{LASTGETTIME} | ||||
|         ) | ||||
|         && ( gettimeofday() - | ||||
|         && ( ::gettimeofday() - | ||||
|             $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger} | ||||
|             ->{LASTGETTIME} ) < 2 | ||||
|       ); | ||||
| @@ -1144,7 +1140,7 @@ sub getExternalTriggerValueInactive { | ||||
|             $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger} | ||||
|               ->{LASTGETTIME} | ||||
|         ) | ||||
|         && ( gettimeofday() - | ||||
|         && ( ::gettimeofday() - | ||||
|             $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger} | ||||
|             ->{LASTGETTIME} ) < 2 | ||||
|       ); | ||||
| @@ -1163,7 +1159,7 @@ sub getExternalTriggerPosActive { | ||||
|             $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger} | ||||
|               ->{LASTGETTIME} | ||||
|         ) | ||||
|         && ( gettimeofday() - | ||||
|         && ( ::gettimeofday() - | ||||
|             $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger} | ||||
|             ->{LASTGETTIME} ) < 2 | ||||
|       ); | ||||
| @@ -1181,7 +1177,7 @@ sub getExternalTriggerPosActive2 { | ||||
|             $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger} | ||||
|               ->{LASTGETTIME} | ||||
|         ) | ||||
|         && ( gettimeofday() - | ||||
|         && ( ::gettimeofday() - | ||||
|             $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger} | ||||
|             ->{LASTGETTIME} ) < 2 | ||||
|       ); | ||||
| @@ -1199,7 +1195,7 @@ sub getExternalTriggerPosInactive { | ||||
|             $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger} | ||||
|               ->{LASTGETTIME} | ||||
|         ) | ||||
|         && ( gettimeofday() - | ||||
|         && ( ::gettimeofday() - | ||||
|             $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger} | ||||
|             ->{LASTGETTIME} ) < 2 | ||||
|       ); | ||||
| @@ -1221,7 +1217,7 @@ sub setDelay { | ||||
| sub getDelay { | ||||
|     my $self = shift; | ||||
|  | ||||
|     my $val = AttrVal( $self->{shuttersDev}, 'ASC_Drive_Delay', -1 ); | ||||
|     my $val = ::AttrVal( $self->{shuttersDev}, 'ASC_Drive_Delay', -1 ); | ||||
|     return ( $val =~ m{^\d+$}xms ? $val : -1 ); | ||||
| } | ||||
|  | ||||
| @@ -1237,7 +1233,7 @@ sub setDelayStart { | ||||
| sub getDelayStart { | ||||
|     my $self = shift; | ||||
|  | ||||
|     my $val = AttrVal( $self->{shuttersDev}, 'ASC_Drive_DelayStart', -1 ); | ||||
|     my $val = ::AttrVal( $self->{shuttersDev}, 'ASC_Drive_DelayStart', -1 ); | ||||
|     return ( ( $val > 0 && $val =~ m{^\d+$}xms ) ? $val : -1 ); | ||||
| } | ||||
|  | ||||
| @@ -1254,7 +1250,7 @@ sub setBlockingTimeAfterManual { | ||||
| sub getBlockingTimeAfterManual { | ||||
|     my $self = shift; | ||||
|  | ||||
|     return AttrVal( $self->{shuttersDev}, 'ASC_BlockingTime_afterManual', | ||||
|     return ::AttrVal( $self->{shuttersDev}, 'ASC_BlockingTime_afterManual', | ||||
|         1200 ); | ||||
| } | ||||
|  | ||||
| @@ -1271,7 +1267,7 @@ sub setBlockingTimeBeforNightClose { | ||||
| sub getBlockingTimeBeforNightClose { | ||||
|     my $self = shift; | ||||
|  | ||||
|     return AttrVal( $self->{shuttersDev}, 'ASC_BlockingTime_beforNightClose', | ||||
|     return ::AttrVal( $self->{shuttersDev}, 'ASC_BlockingTime_beforNightClose', | ||||
|         3600 ); | ||||
| } | ||||
|  | ||||
| @@ -1288,7 +1284,7 @@ sub setBlockingTimeBeforDayOpen { | ||||
| sub getBlockingTimeBeforDayOpen { | ||||
|     my $self = shift; | ||||
|  | ||||
|     return AttrVal( $self->{shuttersDev}, 'ASC_BlockingTime_beforDayOpen', | ||||
|     return ::AttrVal( $self->{shuttersDev}, 'ASC_BlockingTime_beforDayOpen', | ||||
|         3600 ); | ||||
| } | ||||
|  | ||||
| @@ -1304,9 +1300,9 @@ sub setPosCmd { | ||||
| sub getPosCmd { | ||||
|     my $self = shift; | ||||
|  | ||||
|     return AttrVal( $self->{shuttersDev}, 'ASC_Pos_Reading', | ||||
|     return ::AttrVal( $self->{shuttersDev}, 'ASC_Pos_Reading', | ||||
|         $FHEM::Automation::ShuttersControl::userAttrList{'ASC_Pos_Reading'} | ||||
|           [ AttrVal( $self->{shuttersDev}, 'ASC', 1 ) ] ); | ||||
|           [ ::AttrVal( $self->{shuttersDev}, 'ASC', 1 ) ] ); | ||||
| } | ||||
|  | ||||
| sub setOpenPos { | ||||
| @@ -1371,7 +1367,7 @@ sub setVentilatePosAfterDayClosed { | ||||
| sub getVentilatePosAfterDayClosed { | ||||
|     my $self = shift; | ||||
|  | ||||
|     return AttrVal( $self->{shuttersDev}, 'ASC_WindowRec_PosAfterDayClosed', | ||||
|     return ::AttrVal( $self->{shuttersDev}, 'ASC_WindowRec_PosAfterDayClosed', | ||||
|         'open' ); | ||||
| } | ||||
|  | ||||
| @@ -1436,7 +1432,7 @@ sub setVentilateOpen { | ||||
| sub getVentilateOpen { | ||||
|     my $self = shift; | ||||
|  | ||||
|     return AttrVal( $self->{shuttersDev}, 'ASC_Ventilate_Window_Open', 'on' ); | ||||
|     return ::AttrVal( $self->{shuttersDev}, 'ASC_Ventilate_Window_Open', 'on' ); | ||||
| } | ||||
|  | ||||
| sub setComfortOpenPos { | ||||
| @@ -1476,7 +1472,7 @@ sub setPartyMode { | ||||
| sub getPartyMode { | ||||
|     my $self = shift; | ||||
|  | ||||
|     return AttrVal( $self->{shuttersDev}, 'ASC_Partymode', 'off' ); | ||||
|     return ::AttrVal( $self->{shuttersDev}, 'ASC_Partymode', 'off' ); | ||||
| } | ||||
|  | ||||
| sub setRoommates { | ||||
| @@ -1491,7 +1487,7 @@ sub setRoommates { | ||||
| sub getRoommates { | ||||
|     my $self = shift; | ||||
|  | ||||
|     return AttrVal( $self->{shuttersDev}, 'ASC_Roommate_Device', 'none' ); | ||||
|     return ::AttrVal( $self->{shuttersDev}, 'ASC_Roommate_Device', 'none' ); | ||||
| } | ||||
|  | ||||
| sub setRoommatesReading { | ||||
| @@ -1506,7 +1502,7 @@ sub setRoommatesReading { | ||||
| sub getRoommatesReading { | ||||
|     my $self = shift; | ||||
|  | ||||
|     return AttrVal( $self->{shuttersDev}, 'ASC_Roommate_Reading', 'state' ); | ||||
|     return ::AttrVal( $self->{shuttersDev}, 'ASC_Roommate_Reading', 'state' ); | ||||
| } | ||||
|  | ||||
| sub getWindPos { | ||||
| @@ -1519,7 +1515,7 @@ sub getWindPos { | ||||
|         exists( | ||||
|             $self->{ $self->{shuttersDev} }->{ASC_WindParameters}->{LASTGETTIME} | ||||
|         ) | ||||
|         && ( gettimeofday() - | ||||
|         && ( ::gettimeofday() - | ||||
|             $self->{ $self->{shuttersDev} }->{ASC_WindParameters}->{LASTGETTIME} | ||||
|         ) < 2 | ||||
|       ); | ||||
| @@ -1538,15 +1534,15 @@ sub getWindMax { | ||||
|         exists( | ||||
|             $self->{ $self->{shuttersDev} }->{ASC_WindParameters}->{LASTGETTIME} | ||||
|         ) | ||||
|         && ( gettimeofday() - | ||||
|         && ( ::gettimeofday() - | ||||
|             $self->{ $self->{shuttersDev} }->{ASC_WindParameters}->{LASTGETTIME} | ||||
|         ) < 2 | ||||
|       ); | ||||
|     $self->{ $self->{shuttersDev} }->{ASC_WindParameters}->{LASTGETTIME} = | ||||
|       int( gettimeofday() ); | ||||
|       int( ::gettimeofday() ); | ||||
|     my ( $max, $hyst, $pos ) = | ||||
|       FHEM::Automation::ShuttersControl::Helper::GetAttrValues( $self->{shuttersDev}, | ||||
|         'ASC_WindParameters', '50:20' ); | ||||
|       FHEM::Automation::ShuttersControl::Helper::GetAttrValues( | ||||
|         $self->{shuttersDev}, 'ASC_WindParameters', '50:20' ); | ||||
|  | ||||
|     ## Erwartetes Ergebnis | ||||
|     # max:hyst pos | ||||
| @@ -1554,10 +1550,11 @@ sub getWindMax { | ||||
|     $self->{ $self->{shuttersDev} }->{ASC_WindParameters}->{triggermax} = $max; | ||||
|     $self->{ $self->{shuttersDev} }->{ASC_WindParameters}->{triggerhyst} = | ||||
|       ( $hyst ne 'none' ? $max - $hyst : $max - 20 ); | ||||
|     $self->{ $self->{shuttersDev} }->{ASC_WindParameters}->{closedPos} = | ||||
|       (   $pos ne 'none' | ||||
|     $self->{ $self->{shuttersDev} }->{ASC_WindParameters}->{closedPos} = ( | ||||
|           $pos ne 'none' | ||||
|         ? $pos | ||||
|         : $FHEM::Automation::ShuttersControl::shutters->getOpenPos ); | ||||
|         : $FHEM::Automation::ShuttersControl::shutters->getOpenPos | ||||
|     ); | ||||
|  | ||||
|     return $self->{ $self->{shuttersDev} }->{ASC_WindParameters}->{triggermax}; | ||||
| } | ||||
| @@ -1581,7 +1578,7 @@ sub getWindMin { | ||||
|         exists( | ||||
|             $self->{ $self->{shuttersDev} }->{ASC_WindParameters}->{LASTGETTIME} | ||||
|         ) | ||||
|         && ( gettimeofday() - | ||||
|         && ( ::gettimeofday() - | ||||
|             $self->{ $self->{shuttersDev} }->{ASC_WindParameters}->{LASTGETTIME} | ||||
|         ) < 2 | ||||
|       ); | ||||
| @@ -1602,7 +1599,7 @@ sub setWindProtection { | ||||
| sub getWindProtection { | ||||
|     my $self = shift; | ||||
|  | ||||
|     return AttrVal( $self->{shuttersDev}, 'ASC_WindProtection', 'off' ); | ||||
|     return ::AttrVal( $self->{shuttersDev}, 'ASC_WindProtection', 'off' ); | ||||
| } | ||||
|  | ||||
| sub setRainProtection { | ||||
| @@ -1617,7 +1614,7 @@ sub setRainProtection { | ||||
| sub getRainProtection { | ||||
|     my $self = shift; | ||||
|  | ||||
|     return AttrVal( $self->{shuttersDev}, 'ASC_RainProtection', 'off' ); | ||||
|     return ::AttrVal( $self->{shuttersDev}, 'ASC_RainProtection', 'off' ); | ||||
| } | ||||
|  | ||||
| sub setModeUp { | ||||
| @@ -1632,7 +1629,7 @@ sub setModeUp { | ||||
| sub getModeUp { | ||||
|     my $self = shift; | ||||
|  | ||||
|     return AttrVal( $self->{shuttersDev}, 'ASC_Mode_Up', 'always' ); | ||||
|     return ::AttrVal( $self->{shuttersDev}, 'ASC_Mode_Up', 'always' ); | ||||
| } | ||||
|  | ||||
| sub setModeDown { | ||||
| @@ -1647,7 +1644,7 @@ sub setModeDown { | ||||
| sub getModeDown { | ||||
|     my $self = shift; | ||||
|  | ||||
|     return AttrVal( $self->{shuttersDev}, 'ASC_Mode_Down', 'always' ); | ||||
|     return ::AttrVal( $self->{shuttersDev}, 'ASC_Mode_Down', 'always' ); | ||||
| } | ||||
|  | ||||
| sub setLockOut { | ||||
| @@ -1662,7 +1659,7 @@ sub setLockOut { | ||||
| sub getLockOut { | ||||
|     my $self = shift; | ||||
|  | ||||
|     return AttrVal( $self->{shuttersDev}, 'ASC_LockOut', 'off' ); | ||||
|     return ::AttrVal( $self->{shuttersDev}, 'ASC_LockOut', 'off' ); | ||||
| } | ||||
|  | ||||
| sub setLockOutCmd { | ||||
| @@ -1677,7 +1674,7 @@ sub setLockOutCmd { | ||||
| sub getLockOutCmd { | ||||
|     my $self = shift; | ||||
|  | ||||
|     return AttrVal( $self->{shuttersDev}, 'ASC_LockOut_Cmd', 'none' ); | ||||
|     return ::AttrVal( $self->{shuttersDev}, 'ASC_LockOut_Cmd', 'none' ); | ||||
| } | ||||
|  | ||||
| sub setAntiFreeze { | ||||
| @@ -1692,7 +1689,7 @@ sub setAntiFreeze { | ||||
| sub getAntiFreeze { | ||||
|     my $self = shift; | ||||
|  | ||||
|     return AttrVal( $self->{shuttersDev}, 'ASC_Antifreeze', 'off' ); | ||||
|     return ::AttrVal( $self->{shuttersDev}, 'ASC_Antifreeze', 'off' ); | ||||
| } | ||||
|  | ||||
| sub setAutoAstroModeMorning { | ||||
| @@ -1707,7 +1704,8 @@ sub setAutoAstroModeMorning { | ||||
| sub getAutoAstroModeMorning { | ||||
|     my $self = shift; | ||||
|  | ||||
|     return AttrVal( $self->{shuttersDev}, 'ASC_AutoAstroModeMorning', 'none' ); | ||||
|     return ::AttrVal( $self->{shuttersDev}, 'ASC_AutoAstroModeMorning', | ||||
|         'none' ); | ||||
| } | ||||
|  | ||||
| sub setAutoAstroModeEvening { | ||||
| @@ -1722,7 +1720,8 @@ sub setAutoAstroModeEvening { | ||||
| sub getAutoAstroModeEvening { | ||||
|     my $self = shift; | ||||
|  | ||||
|     return AttrVal( $self->{shuttersDev}, 'ASC_AutoAstroModeEvening', 'none' ); | ||||
|     return ::AttrVal( $self->{shuttersDev}, 'ASC_AutoAstroModeEvening', | ||||
|         'none' ); | ||||
| } | ||||
|  | ||||
| sub setAutoAstroModeMorningHorizon { | ||||
| @@ -1738,7 +1737,7 @@ sub setAutoAstroModeMorningHorizon { | ||||
| sub getAutoAstroModeMorningHorizon { | ||||
|     my $self = shift; | ||||
|  | ||||
|     return AttrVal( $self->{shuttersDev}, 'ASC_AutoAstroModeMorningHorizon', | ||||
|     return ::AttrVal( $self->{shuttersDev}, 'ASC_AutoAstroModeMorningHorizon', | ||||
|         0 ); | ||||
| } | ||||
|  | ||||
| @@ -1755,7 +1754,7 @@ sub setAutoAstroModeEveningHorizon { | ||||
| sub getAutoAstroModeEveningHorizon { | ||||
|     my $self = shift; | ||||
|  | ||||
|     return AttrVal( $self->{shuttersDev}, 'ASC_AutoAstroModeEveningHorizon', | ||||
|     return ::AttrVal( $self->{shuttersDev}, 'ASC_AutoAstroModeEveningHorizon', | ||||
|         0 ); | ||||
| } | ||||
|  | ||||
| @@ -1771,7 +1770,7 @@ sub setUp { | ||||
| sub getUp { | ||||
|     my $self = shift; | ||||
|  | ||||
|     return AttrVal( $self->{shuttersDev}, 'ASC_Up', 'astro' ); | ||||
|     return ::AttrVal( $self->{shuttersDev}, 'ASC_Up', 'astro' ); | ||||
| } | ||||
|  | ||||
| sub setDown { | ||||
| @@ -1786,14 +1785,15 @@ sub setDown { | ||||
| sub getDown { | ||||
|     my $self = shift; | ||||
|  | ||||
|     return AttrVal( $self->{shuttersDev}, 'ASC_Down', 'astro' ); | ||||
|     return ::AttrVal( $self->{shuttersDev}, 'ASC_Down', 'astro' ); | ||||
| } | ||||
|  | ||||
| sub setShadingBetweenTheTime { | ||||
|     my $self    = shift; | ||||
|     my $attrVal = shift; | ||||
|  | ||||
|     _setAttributs( $self->{shuttersDev}, 'ASC_Shading_BetweenTheTime', $attrVal ); | ||||
|     _setAttributs( $self->{shuttersDev}, 'ASC_Shading_BetweenTheTime', | ||||
|         $attrVal ); | ||||
|  | ||||
|     return; | ||||
| } | ||||
| @@ -1801,7 +1801,8 @@ sub setShadingBetweenTheTime { | ||||
| sub getShadingBetweenTheTime { | ||||
|     my $self = shift; | ||||
|  | ||||
|     return AttrVal( $self->{shuttersDev}, 'ASC_Shading_BetweenTheTime', '00:00-24:00' ); | ||||
|     return ::AttrVal( $self->{shuttersDev}, 'ASC_Shading_BetweenTheTime', | ||||
|         '00:00-24:00' ); | ||||
| } | ||||
|  | ||||
| sub setTimeUpEarly { | ||||
| @@ -1816,7 +1817,7 @@ sub setTimeUpEarly { | ||||
| sub getTimeUpEarly { | ||||
|     my $self = shift; | ||||
|  | ||||
|     my $val = AttrVal( $self->{shuttersDev}, 'ASC_Time_Up_Early', '05:00' ); | ||||
|     my $val = ::AttrVal( $self->{shuttersDev}, 'ASC_Time_Up_Early', '05:00' ); | ||||
|  | ||||
|     if ( defined( PerlCodeCheck($val) ) ) { | ||||
|         $val = PerlCodeCheck($val); | ||||
| @@ -1841,7 +1842,7 @@ sub setTimeUpLate { | ||||
| sub getTimeUpLate { | ||||
|     my $self = shift; | ||||
|  | ||||
|     my $val = AttrVal( $self->{shuttersDev}, 'ASC_Time_Up_Late', '08:30' ); | ||||
|     my $val = ::AttrVal( $self->{shuttersDev}, 'ASC_Time_Up_Late', '08:30' ); | ||||
|  | ||||
|     if ( defined( PerlCodeCheck($val) ) ) { | ||||
|         $val = PerlCodeCheck($val); | ||||
| @@ -1866,7 +1867,7 @@ sub setTimeDownEarly { | ||||
| sub getTimeDownEarly { | ||||
|     my $self = shift; | ||||
|  | ||||
|     my $val = AttrVal( $self->{shuttersDev}, 'ASC_Time_Down_Early', '16:00' ); | ||||
|     my $val = ::AttrVal( $self->{shuttersDev}, 'ASC_Time_Down_Early', '16:00' ); | ||||
|  | ||||
|     if ( defined( PerlCodeCheck($val) ) ) { | ||||
|         $val = PerlCodeCheck($val); | ||||
| @@ -1891,7 +1892,7 @@ sub setTimeDownLate { | ||||
| sub getTimeDownLate { | ||||
|     my $self = shift; | ||||
|  | ||||
|     my $val = AttrVal( $self->{shuttersDev}, 'ASC_Time_Down_Late', '22:00' ); | ||||
|     my $val = ::AttrVal( $self->{shuttersDev}, 'ASC_Time_Down_Late', '22:00' ); | ||||
|  | ||||
|     if ( defined( PerlCodeCheck($val) ) ) { | ||||
|         $val = PerlCodeCheck($val); | ||||
| @@ -1917,7 +1918,7 @@ sub getTimeUpWeHoliday { | ||||
|     my $self = shift; | ||||
|  | ||||
|     my $val = | ||||
|       AttrVal( $self->{shuttersDev}, 'ASC_Time_Up_WE_Holiday', '01:25' ); | ||||
|       ::AttrVal( $self->{shuttersDev}, 'ASC_Time_Up_WE_Holiday', '01:25' ); | ||||
|  | ||||
|     if ( defined( PerlCodeCheck($val) ) ) { | ||||
|         $val = PerlCodeCheck($val); | ||||
| @@ -1939,7 +1940,7 @@ sub getBrightnessMinVal { | ||||
|             $self->{ $self->{shuttersDev} }->{ASC_BrightnessSensor} | ||||
|               ->{LASTGETTIME} | ||||
|         ) | ||||
|         && ( gettimeofday() - | ||||
|         && ( ::gettimeofday() - | ||||
|             $self->{ $self->{shuttersDev} }->{ASC_BrightnessSensor} | ||||
|             ->{LASTGETTIME} ) < 2 | ||||
|       ); | ||||
| @@ -1958,7 +1959,7 @@ sub getBrightnessMaxVal { | ||||
|             $self->{ $self->{shuttersDev} }->{ASC_BrightnessSensor} | ||||
|               ->{LASTGETTIME} | ||||
|         ) | ||||
|         && ( gettimeofday() - | ||||
|         && ( ::gettimeofday() - | ||||
|             $self->{ $self->{shuttersDev} }->{ASC_BrightnessSensor} | ||||
|             ->{LASTGETTIME} ) < 2 | ||||
|       ); | ||||
| @@ -1980,7 +1981,7 @@ sub setDriveUpMaxDuration { | ||||
| sub getDriveUpMaxDuration { | ||||
|     my $self = shift; | ||||
|  | ||||
|     return AttrVal( $self->{shuttersDev}, 'ASC_DriveUpMaxDuration', 60 ); | ||||
|     return ::AttrVal( $self->{shuttersDev}, 'ASC_DriveUpMaxDuration', 60 ); | ||||
| } | ||||
|  | ||||
| 1; | ||||
|   | ||||
| @@ -1,8 +1,8 @@ | ||||
| ############################################################################### | ||||
| # | ||||
| # Developed with Kate | ||||
| # Developed with VSCodium and richterger perl plugin | ||||
| # | ||||
| #  (c) 2018-2020 Copyright: Marko Oldenburg (leongaultier at gmail dot com) | ||||
| #  (c) 2018-2025 Copyright: Marko Oldenburg (fhemdevelopment at cooltux dot net) | ||||
| #  All rights reserved | ||||
| # | ||||
| #   Special thanks goes to: | ||||
| @@ -44,21 +44,10 @@ use strict; | ||||
| use warnings; | ||||
| use utf8; | ||||
|  | ||||
| use GPUtils qw(GP_Import); | ||||
|  | ||||
| ## Import der FHEM Funktionen | ||||
| BEGIN { | ||||
|     GP_Import( | ||||
|         qw( | ||||
|           ReadingsVal | ||||
|           ReadingsNum) | ||||
|     ); | ||||
| } | ||||
|  | ||||
| sub getBrightness { | ||||
|     my $self = shift; | ||||
|  | ||||
|     return ReadingsNum( | ||||
|     return ::ReadingsNum( | ||||
|         $FHEM::Automation::ShuttersControl::shutters->_getBrightnessSensor, | ||||
|         $FHEM::Automation::ShuttersControl::shutters->getBrightnessReading, | ||||
|         -1 ); | ||||
| @@ -67,7 +56,7 @@ sub getBrightness { | ||||
| sub getWindStatus { | ||||
|     my $self = shift; | ||||
|  | ||||
|     return ReadingsVal( | ||||
|     return ::ReadingsVal( | ||||
|         $FHEM::Automation::ShuttersControl::ascDev->_getWindSensor, | ||||
|         $FHEM::Automation::ShuttersControl::ascDev->getWindSensorReading, -1 ); | ||||
| } | ||||
| @@ -75,7 +64,7 @@ sub getWindStatus { | ||||
| sub getStatus { | ||||
|     my $self = shift; | ||||
|  | ||||
|     return ReadingsNum( $self->{shuttersDev}, | ||||
|     return ::ReadingsNum( $self->{shuttersDev}, | ||||
|         $FHEM::Automation::ShuttersControl::shutters->getPosCmd, 0 ); | ||||
| } | ||||
|  | ||||
| @@ -88,7 +77,7 @@ sub getDelayCmd { | ||||
| sub getASCenable { | ||||
|     my $self = shift; | ||||
|  | ||||
|     return ReadingsVal( $self->{shuttersDev}, 'ASC_Enable', 'on' ); | ||||
|     return ::ReadingsVal( $self->{shuttersDev}, 'ASC_Enable', 'on' ); | ||||
| } | ||||
|  | ||||
| 1; | ||||
|   | ||||
| @@ -1,8 +1,8 @@ | ||||
| ############################################################################### | ||||
| # | ||||
| # Developed with Kate | ||||
| # Developed with VSCodium and richterger perl plugin | ||||
| # | ||||
| #  (c) 2018-2020 Copyright: Marko Oldenburg (leongaultier at gmail dot com) | ||||
| #  (c) 2018-2025 Copyright: Marko Oldenburg (fhemdevelopment at cooltux dot net) | ||||
| #  All rights reserved | ||||
| # | ||||
| #   Special thanks goes to: | ||||
| @@ -47,7 +47,7 @@ use utf8; | ||||
| use FHEM::Automation::ShuttersControl::Window::Attr; | ||||
| use FHEM::Automation::ShuttersControl::Window::Readings; | ||||
|  | ||||
| our @ISA = | ||||
| use base | ||||
|   qw(FHEM::Automation::ShuttersControl::Window::Attr FHEM::Automation::ShuttersControl::Window::Readings); | ||||
|  | ||||
| 1; | ||||
|   | ||||
| @@ -1,8 +1,8 @@ | ||||
| ############################################################################### | ||||
| # | ||||
| # Developed with Kate | ||||
| # Developed with VSCodium and richterger perl plugin | ||||
| # | ||||
| #  (c) 2018-2020 Copyright: Marko Oldenburg (leongaultier at gmail dot com) | ||||
| #  (c) 2018-2025 Copyright: Marko Oldenburg (fhemdevelopment at cooltux dot net) | ||||
| #  All rights reserved | ||||
| # | ||||
| #   Special thanks goes to: | ||||
| @@ -44,17 +44,6 @@ use strict; | ||||
| use warnings; | ||||
| use utf8; | ||||
|  | ||||
| use GPUtils qw(GP_Import); | ||||
|  | ||||
| ## Import der FHEM Funktionen | ||||
| BEGIN { | ||||
|     GP_Import( | ||||
|         qw( | ||||
|           AttrVal | ||||
|           gettimeofday) | ||||
|     ); | ||||
| } | ||||
|  | ||||
| sub setSubTyp { | ||||
|     my $self    = shift; | ||||
|     my $attrVal = shift; | ||||
| @@ -67,7 +56,8 @@ sub setSubTyp { | ||||
| sub getSubTyp { | ||||
|     my $self = shift; | ||||
|  | ||||
|     return AttrVal( $self->{shuttersDev}, 'ASC_WindowRec_subType', 'twostate' ); | ||||
|     return ::AttrVal( $self->{shuttersDev}, 'ASC_WindowRec_subType', | ||||
|         'twostate' ); | ||||
| } | ||||
|  | ||||
| sub setWinDev { | ||||
| @@ -87,15 +77,15 @@ sub _getWinDev { | ||||
|         exists( | ||||
|             $self->{ $self->{shuttersDev} }->{ASC_WindowRec}->{LASTGETTIME} | ||||
|         ) | ||||
|         && ( gettimeofday() - | ||||
|         && ( ::gettimeofday() - | ||||
|             $self->{ $self->{shuttersDev} }->{ASC_WindowRec}->{LASTGETTIME} ) < | ||||
|         2 | ||||
|       ); | ||||
|     $self->{ $self->{shuttersDev} }->{ASC_WindowRec}->{LASTGETTIME} = | ||||
|       int( gettimeofday() ); | ||||
|       int( ::gettimeofday() ); | ||||
|     my ( $device, $reading ) = | ||||
|       FHEM::Automation::ShuttersControl::Helper::GetAttrValues( $self->{shuttersDev}, | ||||
|         'ASC_WindowRec', 'none' ); | ||||
|       FHEM::Automation::ShuttersControl::Helper::GetAttrValues( | ||||
|         $self->{shuttersDev}, 'ASC_WindowRec', 'none' ); | ||||
|  | ||||
|     ### erwartetes Ergebnis | ||||
|     # DEVICE:READING VALUEACTIVE:VALUEINACTIVE POSACTIVE:POSINACTIVE | ||||
| @@ -116,7 +106,7 @@ sub getWinDevReading { | ||||
|         exists( | ||||
|             $self->{ $self->{shuttersDev} }->{ASC_WindowRec}->{LASTGETTIME} | ||||
|         ) | ||||
|         && ( gettimeofday() - | ||||
|         && ( ::gettimeofday() - | ||||
|             $self->{ $self->{shuttersDev} }->{ASC_WindowRec}->{LASTGETTIME} ) < | ||||
|         2 | ||||
|       ); | ||||
|   | ||||
| @@ -1,8 +1,8 @@ | ||||
| ############################################################################### | ||||
| # | ||||
| # Developed with Kate | ||||
| # Developed with VSCodium and richterger perl plugin | ||||
| # | ||||
| #  (c) 2018-2020 Copyright: Marko Oldenburg (leongaultier at gmail dot com) | ||||
| #  (c) 2018-2025 Copyright: Marko Oldenburg (fhemdevelopment at cooltux dot net) | ||||
| #  All rights reserved | ||||
| # | ||||
| #   Special thanks goes to: | ||||
| @@ -44,20 +44,10 @@ use strict; | ||||
| use warnings; | ||||
| use utf8; | ||||
|  | ||||
| use GPUtils qw(GP_Import); | ||||
|  | ||||
| ## Import der FHEM Funktionen | ||||
| BEGIN { | ||||
|     GP_Import( | ||||
|         qw( | ||||
|           ReadingsVal) | ||||
|     ); | ||||
| } | ||||
|  | ||||
| sub getWinStatus { | ||||
|     my $self = shift; | ||||
|  | ||||
|     return ReadingsVal( | ||||
|     return ::ReadingsVal( | ||||
|         $FHEM::Automation::ShuttersControl::shutters->_getWinDev, | ||||
|         $FHEM::Automation::ShuttersControl::shutters->getWinDevReading, | ||||
|         'closed' ); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user