FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: Team-Menge am 07 Juli 2014, 11:24:39

Titel: Beschattungssteuerung ('mal wieder)
Beitrag von: Team-Menge am 07 Juli 2014, 11:24:39
Hallo zusammen!

Ich habe mich schon durch diverse Themen hier geklickt und mir eine Beschattungssteuerung gebastelt:

Aufgerufen wird sie in der fhem.cfg:

define Beschattung_RWZ_1 notify Wetter:temperature.* IF ($hms gt "06:00" and $hms lt "15:00")({Wetterregelung_Sonne("Wohnzimmer_Rolladen_1")})

In 99_myUtils.pm habe ich folgendes:

sub
Wetterregelung_Sonne($){

    my ($Aktorname) = @_;
    if (Value("Beschattung") eq "ein"){

        my $Level = ReadingsVal("$Aktorname","level","");
        my $Temp = ReadingsVal("Wetter","temperature","999");
        my $Sonne = ReadingsVal("Wetter","condition","kein Wert");

        if (($Temp >= 15) && (($Sonne =~ /sonnig/) || ($Sonne eq "teilweise wolkig")) && ($Level ne "40")){
           fhem("set $Aktorname pct 40");
           Log 1, "Beschattungsposition wird angefahren.";
        }

        elsif ((($Temp < 15) || ($Sonne !~ /sonnig/) || ($Sonne ne "teilweise wolkig")) && ($Level eq "40")){
           fhem ("set $Aktorname pct 100");
           Log 1,"Rolladen wird geöffnet, Beschattung nicht mehr nötig.";
        }

        elsif (($Temp == 999) || ($Sonne eq "kein Wert")){
           Log 1, "Wetter nicht erreichbar oder kein Wert geliefert, $Temp, $Sonne";
        }
    }
}

Der Rolladen soll bei >= 15°C hoch fahren, wenn es sonnig, meist sonnig oder teilweise wolkig ist. Des weiteren soll überprüft werden, ob die Beschattungssteuerung schon angefahren ist, damit nur geschaltet wird, wenn es nötig ist.
Wenn die Temperatur unter 15°C fällt, es nicht mehr sonnig, meist sonnig oder teilweise wolkig ist, soll der Rolladen wieder hoch fahren.

Beim Testen mit "set Wetter update" fährt der Rolladen auch herunter (>15°C und sonnig). Wenn ich jedoch kurz danach wieder "set Wetter update" ausführe, fährt der Rolladen wieder hoch.

Wo liegt der Fehler in meinem perl-Code?

Danke für Eure Hilfe,
Matthias
Titel: Antw:Beschattungssteuerung ('mal wieder)
Beitrag von: bugster_de am 07 Juli 2014, 12:16:17
der Bock liegt wohl hier:
elsif ((($Temp < 15) || ($Sonne !~ /sonnig/) || ($Sonne ne "teilweise wolkig")) && ($Level eq "40")){

wenn $Sonne auf "teilweise wolkig" steht, dann schlägt der hier zu:  ($Sonne !~ /sonnig/), denn "sonnig" kommt ja nicht vor. Und umgekehrt.
Du musst hier also an Stelle der ODER die gleiche UND Verknüpfung machen wie weiter oben.

Stichwort bei solch komplexen Auswertungen ist Logiktabelle / Wahrheitstabelle.

Übrigens Nebenbemerkung: wenn die Beschattungssteuerung an einer Terassentüre ist, dann solltest Du den Zustand der Türe überprüfen (offen / zu), sonst kann es leicht passieren, dass ihr auf der Terrasse sitzt und hinter euch die Rolläden zufahren. Dann steht ihr draußen. Und dur wärst nicht der Erste, dem das passiert.
Titel: Antw:Beschattungssteuerung ('mal wieder)
Beitrag von: Team-Menge am 07 Juli 2014, 13:53:18
Hallo bugster_de,

danke für die schnelle Anwort aber daran lag es nicht  :'(

Ich habe auf

if (($Temp >= 15) && (($Sonne eq "sonnig") || ($Sonne eq "Schauer")) && ($Level ne "40")){

bzw.

elsif ((($Temp < 15) || ($Sonne ne "sonnig") || ($Sonne ne "Schauer")) && ($Level eq "40")){

geändert, leider ohne Veränderung.

Titel: Antw:Beschattungssteuerung ('mal wieder)
Beitrag von: Team-Menge am 10 Juli 2014, 20:12:19
Es muss irgendwie an der Abfrage des Levels liegen. Wenn ich diese entferne, funktioniert die Beschattung. Allerdings wird bei jedem Wechsel im Notify ein Schaltvorgang ausgelöst, also selbst wenn die Rollladen auf 40% stehen, wird ein set pct 40 gesendet und es ist ein klicken im Aktor zu hören.

Hat jemand eine Idee, wie man den Status des HM-Rollladen-Aktors richtig ausliest?


Sent from my iPad using Tapatalk
Titel: Antw:Beschattungssteuerung ('mal wieder)
Beitrag von: P.A.Trick am 10 Juli 2014, 20:16:23
Also ich nutze dafür das state also mit Value("Rollo") dann klappt das mit dem Level!
Titel: Antw:Beschattungssteuerung ('mal wieder)
Beitrag von: Team-Menge am 11 Juli 2014, 06:42:34
Hallo P.A.Trick,

habe ich auch schon versucht ...Hast du zur Abfrage ne/eq , ==/!= oder =~/!~ benutzt?


Sent from my iPad using Tapatalk
Titel: Antw:Beschattungssteuerung ('mal wieder)
Beitrag von: AndreR am 11 Juli 2014, 10:08:56
Hier mal meine erste Lösung, das ist die Beschattungsmarkise eines Wintergartens an der Südseite des Hauses.
Diese FUnktion läuft bei mir erst seit 5 Tagen, ist also noch nicht komplett erprobt. Zudem man bestimmt noch das eine oder andere erweitern/verbessern kann. Eine Außen/Innenthemperatursteuerung z.B.

Info: $sunState ist ein Dummy, über den ich mir ziemlich ähnlich wie im oben genannten my $Sonne = ReadingsVal("Wetter","condition","kein Wert"); den Status "Sonnenschein" als on/off device zusammenbastle. $rainState das gleiche

Als Besonderheit übernehme ich aus dem Wettermodul die Windrichtung und Windgeschwindigkeit. Über die Seite http://googlecompass.com/ habe ich mir herausgesucht, aus welcher Windrichtung die Markise überhaupt betroffen ist. Zwischen 320° und 360° sowie 0° und 45° bricht das Hausdach nämlich den ankommenden Wind, so dass die Markise theorethisch auch bei Sturm ausgefahren bleiben könnte. Bei allen anderen fährt die Markise bei >40km/h ein.



sub Markisensteuerung() {
  my $markiseState = ReadingsVal("markise","state","off");
  my $sunState = ReadingsVal("Sonnenstatus","state","off"); 
  if(($sunState eq "off") && ($markiseState eq "off")){
     #Markise ist eingefahren und Sonne scheint nicht
     return "0";
  }
  if(($sunState eq "off") && ($markiseState eq "on")){
       # Sonne geht weg und Markise ist ausgefahren
       fhem("set pushmsg msg 'Sonnenuntergang' 'Die Markise wird eingefahren'");
       Log 3, "Markise fährt ein, keine Sonne mehr";
       fhem("set markise off");
  }else{     
    my $rainState = ReadingsVal("Regen","state","off");
    if($rainState eq "on") {
      fhem("set pushmsg msg 'Regen' 'Es regnet, Markise wird eingefahren'");
        Log 3, "Markise fährt ein, Regen)";
        fhem("set markise off");
    }else{
      my $windspeed = ReadingsVal("Wetter","wind","0");
      my $wind_direction = ReadingsVal("Wetter","wind_direction","0");
      my $windDirRelevant = "false";
      if($wind_direction >= 45){
        if($wind_direction <= 320){
          $windDirRelevant = "true";
        }
      }
      if(($windspeed > 40) && ($windDirRelevant eq "true")){
        if($markiseState eq "on"){
          fhem("set pushmsg msg 'Windstärke' 'Wind zu stark ($windspeed kmh), Markise wird eingefahren'");
          Log 3, "Markise fährt ein, zuviel Wind ($windspeed km aus Richtung $wind_direction)";
          fhem("set markise off");
        }
      }else{
          if($markiseState eq "off"){
            fhem("set pushmsg msg 'Schönes Wetter' 'Die Markise wird ausgefahren'");
            Log 3, "Markise fährt aus, schönes Wetter";
            fhem("set markise on");
          }else{
            Log 3, "Markise ist ausgefahren, keine Änderung";
          }   
      }
    }
  }
}
Titel: Antw:Beschattungssteuerung ('mal wieder)
Beitrag von: P.A.Trick am 11 Juli 2014, 17:26:51
Zitat von: Team-Menge am 11 Juli 2014, 06:42:34
Hallo P.A.Trick,

habe ich auch schon versucht ...Hast du zur Abfrage ne/eq , ==/!= oder =~/!~ benutzt?


Sent from my iPad using Tapatalk

Ne und eq funktioniert bei mir!