add support for wind data
This commit is contained in:
		| @@ -41,7 +41,7 @@ package main; | ||||
| use strict; | ||||
| use warnings; | ||||
|  | ||||
| my $version = '0.4.0.9-patchWind'; | ||||
| my $version = '0.4.0.10-patchWind'; | ||||
|  | ||||
| sub AutoShuttersControl_Initialize($) { | ||||
|     my ($hash) = @_; | ||||
| @@ -69,9 +69,6 @@ sub AutoShuttersControl_Initialize($) { | ||||
|       . 'ASC_rainSensorDevice ' | ||||
|       . 'ASC_rainSensorReading ' | ||||
|       . 'ASC_rainSensorShuttersClosedPos:0,10,20,30,40,50,60,70,80,90,100 ' | ||||
|       . 'ASC_windSensorDevice ' | ||||
|       . 'ASC_windSensorReading ' | ||||
|       . 'ASC_windSensorShuttersClosedPos:0,10,20,30,40,50,60,70,80,90,100 ' | ||||
|       . 'ASC_autoAstroModeMorning:REAL,CIVIL,NAUTIC,ASTRONOMIC,HORIZON ' | ||||
|       . 'ASC_autoAstroModeMorningHorizon:-9,-8,-7,-6,-5,-4,-3,-2,-1,0,1,2,3,4,5,6,7,8,9 ' | ||||
|       . 'ASC_autoAstroModeEvening:REAL,CIVIL,NAUTIC,ASTRONOMIC,HORIZON ' | ||||
| @@ -197,6 +194,10 @@ my %userAttrList = ( | ||||
|     'ASC_BrightnessMinVal'            => -1, | ||||
|     'ASC_BrightnessMaxVal'            => -1, | ||||
|     'ASC_WiggleValue'                 => 5, | ||||
|     'ASC_Wind_SensorDevice'           => 'none', | ||||
|     'ASC_Wind_SensorReading'          => 'wind', | ||||
|     'ASC_Wind_minMaxSpeed'            => '30:50', | ||||
|     'ASC_Wind_Pos'                    => [ '', 0,   100 ], | ||||
| ); | ||||
|  | ||||
| my %posSetCmds = ( | ||||
| @@ -374,7 +375,7 @@ sub Notify($$) { | ||||
|     { # Kommt ein globales Event und beinhaltet folgende Syntax wird die Funktion zur Verarbeitung aufgerufen | ||||
|         if ( | ||||
|             grep | ||||
| /^(ATTR|DELETEATTR)\s(.*ASC_Roommate_Device|.*ASC_WindowRec|.*ASC_residentsDevice|.*ASC_rainSensorDevice|.*ASC_windSensorDevice|.*ASC_Brightness_Sensor|.*ASC_twilightDevice)(\s.*|$)/, | ||||
| /^(ATTR|DELETEATTR)\s(.*ASC_Roommate_Device|.*ASC_WindowRec|.*ASC_residentsDevice|.*ASC_rainSensorDevice|.*ASC_Wind_SensorDevice|.*ASC_Brightness_Sensor|.*ASC_twilightDevice)(\s.*|$)/, | ||||
|             @{$events} | ||||
|           ) | ||||
|         { | ||||
| @@ -419,7 +420,7 @@ sub EventProcessingGeneral($$$) { | ||||
|             EventProcessingRain( $hash, $device, $events ) | ||||
|               if ( $deviceAttr eq 'ASC_rainSensorDevice' ); | ||||
|             EventProcessingWind( $hash, $device, $events ) | ||||
|               if ( $deviceAttr eq 'ASC_windSensorDevice' ); | ||||
|               if ( $deviceAttr eq 'ASC_Wind_SensorDevice' ); | ||||
|             EventProcessingTwilightDevice( $hash, $device, $events ) | ||||
|               if ( $deviceAttr eq 'ASC_twilightDevice' ); | ||||
|  | ||||
| @@ -441,7 +442,7 @@ sub EventProcessingGeneral($$$) { | ||||
|     } | ||||
|     else {    # alles was kein Devicenamen mit übergeben hat landet hier | ||||
|         if ( $events =~ | ||||
| m#^ATTR\s(.*)\s(ASC_Roommate_Device|ASC_WindowRec|ASC_residentsDevice|ASC_rainSensorDevice|ASC_windSensorDevice|ASC_Brightness_Sensor|ASC_twilightDevice)\s(.*)$# | ||||
| m#^ATTR\s(.*)\s(ASC_Roommate_Device|ASC_WindowRec|ASC_residentsDevice|ASC_rainSensorDevice|ASC_Wind_SensorDevice|ASC_Brightness_Sensor|ASC_twilightDevice)\s(.*)$# | ||||
|           ) | ||||
|         {     # wurde den Attributen unserer Rolläden ein Wert zugewiesen ? | ||||
|             AddNotifyDev( $hash, $3, $1, $2 ) if ( $3 ne 'none' ); | ||||
| @@ -449,7 +450,7 @@ m#^ATTR\s(.*)\s(ASC_Roommate_Device|ASC_WindowRec|ASC_residentsDevice|ASC_rainSe | ||||
|                 "AutoShuttersControl ($name) - EventProcessing: ATTR" ); | ||||
|         } | ||||
|         elsif ( $events =~ | ||||
| m#^DELETEATTR\s(.*)\s(ASC_Roommate_Device|ASC_WindowRec|ASC_residentsDevice|ASC_rainSensorDevice|ASC_windSensorDevice|ASC_Brightness_Sensor|ASC_twilightDevice)$# | ||||
| m#^DELETEATTR\s(.*)\s(ASC_Roommate_Device|ASC_WindowRec|ASC_residentsDevice|ASC_rainSensorDevice|ASC_Wind_SensorDevice|ASC_Brightness_Sensor|ASC_twilightDevice)$# | ||||
|           ) | ||||
|         {     # wurde das Attribut unserer Rolläden gelöscht ? | ||||
|             Log3( $name, 4, | ||||
| @@ -580,31 +581,10 @@ sub ShuttersDeviceScan($) { | ||||
|         push( @{ $hash->{helper}{shuttersList} }, $_ ) | ||||
|           ; ## einem Hash wird ein Array zugewiesen welches die Liste der erkannten Rollos beinhaltet | ||||
|  | ||||
|         delFromDevAttrList( $_, 'ASC_lock-out:soft,hard' ) | ||||
|           ;    # temporär muss später gelöscht werden ab Version 0.2.0.6 | ||||
|         delFromDevAttrList( $_, 'ASC_lock-outCmd:inhibit,blocked' ) | ||||
|           ;    # temporär muss später gelöscht werden ab Version 0.2.0.6 | ||||
|         delFromDevAttrList( $_, | ||||
|             'ASC_Pos_after_ComfortOpen:0,10,20,30,40,50,60,70,80,90,100' ) | ||||
|           ;    # temporär muss später gelöscht werden ab Version 0.2.0.6 | ||||
|  | ||||
|         delFromDevAttrList( $_, 'ASC_Antifreeze:off,on' ) | ||||
|           if ( AttrVal( $_, 'ASC_Antifreeze', 'on' ) eq 'on' | ||||
|             or AttrVal( $_, 'ASC_Antifreeze', 'on' ) eq 'off' ) | ||||
|           ;    # temporär muss später gelöscht werden ab Version 0.2.0.6 | ||||
|  | ||||
|         delFromDevAttrList( $_, | ||||
| 'ASC_AntifreezePos:5,10,15,20,25,30,35,40,45,50,55,60,65,70,75,80,85,90,95,100' | ||||
|         );     # temporär muss später gelöscht werden ab Version 0.2.0.7 | ||||
|  | ||||
|         delFromDevAttrList( $_, 'ASC_LockOut_Cmd:inhibit,blocked' ) | ||||
|           if ( AttrVal( $_, 'ASC_LockOut_Cmd', 'none' ) eq 'none' ) | ||||
|           ;    # temporär muss später gelöscht werden ab Version 0.2.0.10 | ||||
|  | ||||
|         delFromDevAttrList( $_, 'ASC_Shading_Brightness_Sensor' ) | ||||
|           ;    # temporär muss später gelöscht werden ab Version 0.2.0.12 | ||||
|         delFromDevAttrList( $_, 'ASC_Shading_Brightness_Reading' ) | ||||
|           ;    # temporär muss später gelöscht werden ab Version 0.2.0.12 | ||||
| #         delFromDevAttrList( $_, 'ASC_Shading_Brightness_Sensor' ) | ||||
| #           ;    # temporär muss später gelöscht werden ab Version 0.2.0.12 | ||||
| #         delFromDevAttrList( $_, 'ASC_Shading_Brightness_Reading' ) | ||||
| #           ;    # temporär muss später gelöscht werden ab Version 0.2.0.12 | ||||
|  | ||||
|         $shuttersList = $shuttersList . ',' . $_; | ||||
|         $shutters->setShuttersDev($_); | ||||
| @@ -1131,33 +1111,38 @@ sub EventProcessingRain($@) { | ||||
|  | ||||
| ######### Under Construction | ||||
| sub EventProcessingWind($@) { | ||||
|     my ( $hash, $device, $events ) = @_; | ||||
|     my $name    = $device; | ||||
|     my $reading = $ascDev->getWindSensorReading; | ||||
|     my $val; | ||||
|     my ( $hash, $shuttersDev, $events ) = @_; | ||||
|     my $name = $hash->{NAME}; | ||||
|     $shutters->setShuttersDev($shuttersDev); | ||||
|  | ||||
|     my $reading = $shutters->getWindSensorReading; | ||||
|     if ( $events =~ m#$reading:\s(\d+)# ) { | ||||
|      | ||||
|         foreach my $shuttersDev ( @{ $hash->{helper}{shuttersList} } ) { | ||||
|             $shutters->setShuttersDev($shuttersDev); | ||||
|             if (    $val > 100 | ||||
|              | ||||
|             next if (  CheckIfShuttersWindowRecOpen($shuttersDev) != 0 | ||||
|               and $shutters->getShuttersPlace eq 'terrace' ); | ||||
|  | ||||
|             if (  $1 > $shutters->getWindMax | ||||
|               and $shutters->getStatus != | ||||
|                 $ascDev->getRainSensorShuttersClosedPos ) | ||||
|                   $shutters->getWindPos ) | ||||
|             { | ||||
|                 $shutters->setLastDrive('rain protection'); | ||||
|                 $shutters->setLastDrive('wind protection'); | ||||
|                 $shutters->setDriveCmd( | ||||
|                     $ascDev->getRainSensorShuttersClosedPos ); | ||||
|                     $shutters->getWindPos ); | ||||
|             } | ||||
|             elsif ( $val == 0 | ||||
|             elsif ( $1 < $shutters->getWindMin | ||||
|                 and $shutters->getStatus == | ||||
|                 $ascDev->getRainSensorShuttersClosedPos ) | ||||
|                     $shutters->getWindPos ) | ||||
|             { | ||||
|                 $shutters->setLastDrive('rain un-protection'); | ||||
|                 $shutters->setLastDrive('wind un-protection'); | ||||
|                 $shutters->setDriveCmd( $shutters->getLastPos ); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| } | ||||
| ########## | ||||
|  | ||||
| sub EventProcessingBrightness($@) { | ||||
|     my ( $hash, $shuttersDev, $events ) = @_; | ||||
| @@ -1332,14 +1317,14 @@ sub EventProcessingTwilightDevice($@) { | ||||
|     # | ||||
|     #     Astro | ||||
|     #     SunAz = azimuth = Sonnenwinkel | ||||
|     #     SunAlt = evaluation = Sonnenhöhe | ||||
|     #     SunAlt = elevation = Sonnenhöhe | ||||
|  | ||||
|     if ( $events =~ m#(azimuth|evaluation|SunAz|SunAlt):\s(\d+.\d+)# ) { | ||||
|     if ( $events =~ m#(azimuth|elevation|SunAz|SunAlt):\s(\d+.\d+)# ) { | ||||
|         my $name = $device; | ||||
|         my ( $azimuth, $elevation ); | ||||
|  | ||||
|         $azimuth   = $2 if ( $1 eq 'azimuth'    or $1 eq 'SunAz' ); | ||||
|         $elevation = $2 if ( $1 eq 'evaluation' or $1 eq 'SunAlt' ); | ||||
|         $elevation = $2 if ( $1 eq 'elevation' or $1 eq 'SunAlt' ); | ||||
|  | ||||
|         $azimuth = $ascDev->getAzimuth | ||||
|           if ( not defined($azimuth) and not $azimuth ); | ||||
| @@ -1888,6 +1873,9 @@ sub CreateNewNotifyDev($) { | ||||
|         AddNotifyDev( $hash, AttrVal( $_, 'ASC_Brightness_Sensor', 'none' ), | ||||
|             $_, 'ASC_Brightness_Sensor' ) | ||||
|           if ( AttrVal( $_, 'ASC_Brightness_Sensor', 'none' ) ne 'none' ); | ||||
|         AddNotifyDev( $hash, AttrVal( $_, 'ASC_Wind_SensorDevice', 'none' ), | ||||
|             $_, 'ASC_Wind_SensorDevice' ) | ||||
|           if ( AttrVal( $_, 'ASC_Wind_SensorDevice', 'none' ) ne 'none' ); | ||||
|         $shuttersList = $shuttersList . ',' . $_; | ||||
|     } | ||||
|     AddNotifyDev( $hash, AttrVal( $name, 'ASC_residentsDevice', 'none' ), | ||||
| @@ -1896,9 +1884,6 @@ sub CreateNewNotifyDev($) { | ||||
|     AddNotifyDev( $hash, AttrVal( $name, 'ASC_rainSensorDevice', 'none' ), | ||||
|         $name, 'ASC_rainSensorDevice' ) | ||||
|       if ( AttrVal( $name, 'ASC_rainSensorDevice', 'none' ) ne 'none' ); | ||||
|     AddNotifyDev( $hash, AttrVal( $name, 'ASC_windSensorDevice', 'none' ), | ||||
|         $name, 'ASC_windSensorDevice' ) | ||||
|       if ( AttrVal( $name, 'ASC_windSensorDevice', 'none' ) ne 'none' ); | ||||
|     AddNotifyDev( $hash, AttrVal( $name, 'ASC_twilightDevice', 'none' ), | ||||
|         $name, 'ASC_twilightDevice' ) | ||||
|       if ( AttrVal( $name, 'ASC_twilightDevice', 'none' ) ne 'none' ); | ||||
| @@ -3170,6 +3155,45 @@ sub getRoommatesReading { | ||||
|     return AttrVal( $self->{shuttersDev}, 'ASC_Roommate_Reading', $default ); | ||||
| } | ||||
|  | ||||
| sub _getWindSensor { | ||||
|     my $self    = shift; | ||||
|     my $name    = $self->{name}; | ||||
|     my $default = $self->{defaultarg}; | ||||
|  | ||||
|     $default = 'none' if ( not defined($default) ); | ||||
|     return AttrVal( $self->{shuttersDev}, 'ASC_Wind_SensorDevice', $default ); | ||||
| } | ||||
|  | ||||
| sub getWindSensorReading { | ||||
|     my $self    = shift; | ||||
|     my $name    = $self->{name}; | ||||
|     my $default = $self->{defaultarg}; | ||||
|  | ||||
|     $default = 'wind' if ( not defined($default) ); | ||||
|     return AttrVal( $self->{shuttersDev}, 'ASC_Wind_SensorReading', $default ); | ||||
| } | ||||
|  | ||||
| sub getWindPos { | ||||
|     my $self = shift; | ||||
|     my $name = $self->{name}; | ||||
|  | ||||
|     return AttrVal( $self->{shuttersDev}, 'ASC_Wind_Pos', 0 ); | ||||
| } | ||||
|  | ||||
| sub getWindMax { | ||||
|     my $self = shift; | ||||
|     my $name = $self->{name}; | ||||
|  | ||||
|     return (split(':',AttrVal( $self->{shuttersDev}, 'ASC_Wind_minMaxSpeed', 30)))[1]; | ||||
| } | ||||
|  | ||||
| sub getWindMin { | ||||
|     my $self = shift; | ||||
|     my $name = $self->{name}; | ||||
|  | ||||
|     return (split(':',AttrVal( $self->{shuttersDev}, 'ASC_Wind_minMaxSpeed', 30)))[0]; | ||||
| } | ||||
|  | ||||
| sub getModeUp { | ||||
|     my $self = shift; | ||||
|  | ||||
| @@ -3307,10 +3331,17 @@ BEGIN { | ||||
| sub getBrightness { | ||||
|     my $self = shift; | ||||
|  | ||||
|     return ReadingsVal( $shutters->_getBrightnessSensor, | ||||
|     return ReadingsNum( $shutters->_getBrightnessSensor, | ||||
|         $shutters->getBrightnessReading, -1 ); | ||||
| } | ||||
|  | ||||
| sub getWindStatus { | ||||
|     my $self = shift; | ||||
|  | ||||
|     return ReadingsVal( $shutters->_getWindSensor, | ||||
|         $shutters->getWindSensorReading, -1 ); | ||||
| } | ||||
|  | ||||
| sub getStatus { | ||||
|     my $self = shift; | ||||
|  | ||||
| @@ -3768,31 +3799,6 @@ sub getRainSensorShuttersClosedPos { | ||||
|     return AttrVal( $name, 'ASC_rainSensorShuttersClosedPos', 50 ); | ||||
| } | ||||
|  | ||||
| sub getWindSensor { | ||||
|     my $self    = shift; | ||||
|     my $name    = $self->{name}; | ||||
|     my $default = $self->{defaultarg}; | ||||
|  | ||||
|     $default = 'none' if ( not defined($default) ); | ||||
|     return AttrVal( $name, 'ASC_windSensorDevice', $default ); | ||||
| } | ||||
|  | ||||
| sub getWindSensorReading { | ||||
|     my $self    = shift; | ||||
|     my $name    = $self->{name}; | ||||
|     my $default = $self->{defaultarg}; | ||||
|  | ||||
|     $default = 'state' if ( not defined($default) ); | ||||
|     return AttrVal( $name, 'ASC_windSensorReading', $default ); | ||||
| } | ||||
|  | ||||
| sub getWindSensorShuttersClosedPos { | ||||
|     my $self = shift; | ||||
|     my $name = $self->{name}; | ||||
|  | ||||
|     return AttrVal( $name, 'ASC_windSensorShuttersClosedPos', 50 ); | ||||
| } | ||||
|  | ||||
| 1; | ||||
|  | ||||
| =pod | ||||
| @@ -3932,6 +3938,9 @@ sub getWindSensorShuttersClosedPos { | ||||
|       <li>ASC_BrightnessMinVal - minimum brightness value to activate check of conditions / if the value -1 is not changed, the value of the module device is used.</li> | ||||
|       <li>ASC_BrightnessMaxVal - maximum brightness value to activate check of conditions / if the value -1 is not changed, the value of the module device is used.</li> | ||||
|       <li>ASC_ShuttersPlace - window/terrace, if this attribute is set to terrace and the residents device are in state "gone"and SelfDefence is active the shutter will be closed</li> | ||||
|       <li>ASC_Wind_SensorDevice - </li> | ||||
|       <li>ASC_Wind_SensorReading - </li> | ||||
|       <li>ASC_Wind_minMaxSpeed - </li> | ||||
|     </ul> | ||||
|   </ul> | ||||
| </ul> | ||||
| @@ -4088,6 +4097,9 @@ sub getWindSensorShuttersClosedPos { | ||||
|       <li>ASC_Shading_WaitingPeriod - wie viele Sekunden soll gewartet werden bevor eine weitere Auswertung der Sensordaten für die Beschattung statt finden soll</li> | ||||
|       <li>ASC_PrivacyDownTime_beforNightClose - wie viele Sekunden vor dem abendlichen schlie&zlig;en soll der Rollladen in die Sichtschutzposition fahren, -1 bedeutet das diese Funktion unbeachtet bleiben soll</li> | ||||
|       <li>ASC_PrivacyDown_Pos - Position den Rollladens für den Sichtschutz</li> | ||||
|       <li>ASC_Wind_SensorDevice - Name des FHEM Devices für die Windgeschwindigkeit</li> | ||||
|       <li>ASC_Wind_SensorReading - Name des Device Readings welches die Wind Informationen hält</li> | ||||
|       <li>ASC_Wind_minMaxSpeed - min:max / Angabe von Minamaler und Maximaler Windgeschwindigkeit, durch doppel Punkt getrennt. Bsp.: schließen bei über max Wert und wieder auf vorherige Position fahren bei min Wert.</li> | ||||
|     </ul> | ||||
|   </ul> | ||||
| </ul> | ||||
|   | ||||
		Reference in New Issue
	
	Block a user