Markisensteuerung mit Slider (geht auch für Rolladen)

Begonnen von Elektrolurch, 22 Juni 2014, 13:33:39

Vorheriges Thema - Nächstes Thema

HoTi

Hallo,

ok ich habe den Fehler gefunden. Es war die Division durch 0!

Und diese hatte ich weil cih volldepp erste das gemacht habe:

setreading Markise Ausfahrzeit 24.6
setreading Markise Einfahrzeit 25.3

und dann die Markise definiert habe.

Viele Grüße
Tim
Viele Grüße aus  Oberbayern
Tim (RettungsTim)

HoTi

Hallo zusammen,

erstmal vielen Dank, mitlerweile funktiobniert es bei mir.

Leider fehlt mir noch die Programmierkenntnis um den Code um folgende Funktionen zu erweitern.

- ich möchte 8 Rollos ansteuern können  :-)
- und ich möchte den Slider die Position anzeigen wenn ich den Motor manuell gefahren bin. Also wenn ich Relai 1 oder 2 anders angesteuert habe.
Eine Rückmeldung ob das Relai an oder aus ist habe ich ja und eine Zeit wie lange das Relai an war kann ich auch berechnen aber wie dann weiter?!

Kann mir jemand ein paar Tipps zu meinen problemen geben. Ich brauche keine fertige lösungen aber ein paar Tipps wie da vorgehen kann wäre toll.

hier mein Code mit den Dummys zum testen:

define Markise_ausfahren dummy
attr Markise_ausfahren event-on-change-reading .*
attr Markise_ausfahren eventMap /on:ein/off:aus/
attr Markise_ausfahren room Garten
attr Markise_ausfahren verbose 3
attr Markise_ausfahren webCmd on:off

define Markise_einfahren dummy
attr Markise_einfahren event-on-change-reading .*
attr Markise_einfahren eventMap /on:ein/off:aus/
attr Markise_einfahren room Garten
attr Markise_einfahren verbose 3
attr Markise_einfahren webCmd on:off

# notify für Schalter und dummy der Steuerung
define Ga_Schalter2_not notify (Markise):.* {Ga_Schalter2_not($NAME,$EVENT);;}

# der dummy mit slider für die Steuerung
define Markise dummy
attr Markise alias Markise
attr Markise group Markise
attr Markise room Garten
attr Markise setList Pos:slider,0,1,100
attr Markise verbose 3
attr Markise webCmd einfahren:Pos:ausfahren


setreading Markise Ausfahrzeit 20.0
setreading Markise Einfahrzeit 25.0
Viele Grüße aus  Oberbayern
Tim (RettungsTim)

2P4u

Hi Leute.
Ich sitzte nun auch vor dem Problem, dass ich gerne mit dem Slider und drei SM8 Karten 11 verschiedene Rollos ansteuern möchte.
Hat schon jemand den Code am laufen für mehrere Rollos? Wäre cool wenn hier noch was geht.

Danke und lieben Gruss

Daniel
1x Ubuntu Server
1x LaCrosse Gateway für PCA301 /1x HMLAN /1x HMLGW
2x HueBridge mit Devices/ 1x Logitech Harmony Ultimate

HoTi

#18
Hallo zusammen,

ich bin mal wieder mit den Code am Testen und Lernen. Ich habe jetzt das ganze schon mal auf zwei Rollos umgebaut.
Das geht bestimmt besser, also wäre ich dankbar wenn mir Leute da Tipps geben könnte auch gerne Literatur zum einlesen in Perl.
Aber jetz erstmal habe ich das Problem das die Rollos nicht aus gehen, in diesem Punkt habe ich die Programmierung nicht verstanden und nicht im griff.

Ich rufe die Funktion "Markise_Stop" an zwei Stellen im Programm auf.

An der ersten Stelle steht:
ZitatMarkise_Stop($hash,$device_down,$device_up);

und die andere:
ZitatInternalTimer(gettimeofday()+ $fahrzeit, "Markise_Stop", $hash, 0);

Wie übergebe ich an der zweiten Stelle die Variablen??

Hier mal mein ganzer Code alle mit Dummys leicht zum nachbauen:

99_MyUtils.pm
Zitat
##############################################
# $Id: myUtilsTemplate.pm 7570 2015-01-14 18:31:44Z rudolfkoenig $
#
# Save this file as 99_myUtils.pm, and create your own functions in the new
# file. They are then available in every Perl expression.

package main;

use strict;
use warnings;
use POSIX;

sub
myUtils_Initialize($$)
{
  my ($hash) = @_;
}
# zum Unterdrücken von Events, wenn zwei Funkempfänger installiert sind

sub LastEvent($)
{
my ($d) = @_;
my $rhash = $defs{$d}{READINGS};
my ($s, $ms) = gettimeofday();

my $t = $s + ($ms / 1000000); # 10 msec
my $t1 = 0;
$t1 = $rhash->{'LastEvent'}{VAL} if(exists($rhash->{'LastEvent'} ));
$rhash->{'LastEvent'}{VAL}  = $t;
my $dt = sprintf("%.2f",$t - $t1);
Log(3,"Lastevent: d: $d diff $dt");
return $dt;
} # end sub LastEvent
##########################


sub Markise_Stop($$$)
{
my ($hash,$device_down,$device_up) = @_;
my $name = $hash->{NAME};
my $mup = Value($device_up);
my $mdown = Value($device_down);
my $dt = 0;
my $aktpos = ReadingsVal($name,'Pos',0);
my $newpos;
Log3($name,3,"ACHTUNG 3: mup $mup mdown $mdown");
if($mup =~m/(ein|on).*/)
{
$dt = time() - time_str2num(ReadingsTimestamp($device_up,'state',0));
fhem("set $device_up aus");
$newpos = $aktpos - (100 * $dt / ReadingsVal($name,'Einfahrzeit',0));
} # Die Markiese fährt bereis
elsif($mdown =~m/(ein|on).*/)
{
$dt = time() - time_str2num(ReadingsTimestamp($device_down,'state',0));
fhem("set $device_down aus");
$newpos = $aktpos + (100 * $dt / ReadingsVal($name,'Ausfahrzeit',0));
} # Die Markiese fährt bereis

$newpos = sprintf("%d",$newpos); # runden
$newpos = 0 if($newpos < 0);
$newpos = 100 if($newpos > 100);
Log3($name,3,"$name _stop: dt $dt newpos $newpos");
readingsSingleUpdate($hash,'Pos',$newpos,0);
readingsSingleUpdate($hash,'state',"Pos $newpos",0);
# alle timer löschen
RemoveInternalTimer($hash);   
return undef;
} # end sub Markise_Stop
###########################



sub Ga_Schalter2_not($$$$)
{
my ($name,$event,$device_down,$device_up) = @_;
my $hash = $defs{$name};

my $t = LastEvent($name);
Log3($name,3,$name."_not: event $event lastevent $t");
return undef if($t < 1);
my ($rd,$newpos) = split(' ',$event);
($rd) = split(':',$rd);
my $ausfahrzeit = ReadingsVal($name,'Ausfahrzeit',23.6);
my $einfahrzeit = ReadingsVal($name,'Einfahrzeit',24.7);
my $aktpos = ReadingsVal($name,'Pos',0);
my $fahrzeit = 0;
Log3($name,3,"ACHTUNG 1: device_up $device_up device_down $device_down");
my $mup = Value($device_up);
my $mdown = Value($device_down);
Log3($name,3,"ACHTUNG 2: mup $mup down $mdown");
if(($mup =~m/(ein|on).*/) || ($mdown =~m/(ein|on).*/))
{
Markise_Stop($hash,$device_down,$device_up);
Log3($name,3,"Markisenfahrt ein/aus fahren gestoppt über Schalter");
return undef;
} # Die Markiese fährt bereis

# Markise fahren
if($event eq 'einfahren')
{
$newpos = 0;
$rd = 'Pos';
} # Die Markiese wird eingefahren
elsif($event eq 'ausfahren')
{
my $p1 = ReadingsVal($name,'Pos1',40);
my $p2 = ReadingsVal($name,'Pos2',60);

$newpos = $p1 if($aktpos < $p1);
$newpos = $p2 if(($aktpos >= $p1) && ($aktpos < $p2));
$newpos = 90 if($aktpos >= $p2);
$rd = 'Pos';
} # Die Markiese wird ausgefahren

# Sicherheitsabfragen

return "Markise: newpos nicht definiert" if(!defined($newpos));
return "Markise: Falsche Position $newpos 0...100" if(($newpos < 0) || ($newpos > 100));
return "Markise: gleiche Position $newpos" if(($aktpos > 0) && ($aktpos == $newpos));
return "Markise: $rd nicht implementiert" if($rd ne 'Pos');

if($newpos > $aktpos) # ausfahren
{
my $fz = ($newpos - $aktpos) * $ausfahrzeit / 100;
$fahrzeit = sprintf("%d",$fz);
Log3($name,3,"Markisenfahrt ausfahren gestartet Aktpos $aktpos newpos $newpos Fahrzeit: $fahrzeit");
return "Fahrtzeit 0"  if ($fahrzeit == 0);
return "Markise Fahrtzeit $fahrzeit falsch" if($fahrzeit > 25);
fhem("set $device_down on-for-timer 32");
}
else # einfahren
{
my $fz = ($aktpos - $newpos) * $einfahrzeit / 100;
$fz = 10 if($fz == 0);
# falls Kalibirierung auf Grund von Handbetrieb nicht stimmt, trotzdem einfahren.

$fahrzeit = sprintf("%d",$fz  );
Log3($name,3,"Markisenfahrt einfahren gestartet aktpos $aktpos newpos $newpos Fahrzeit: $fahrzeit");
return "Fahrzeit 0"  if ($fahrzeit == 0);
return "Markise: Fahrzeit $fahrzeit falsch" if($fahrzeit > 25);
fhem("set $device_up on-for-timer 32");
} # end else
InternalTimer(gettimeofday()+ $fahrzeit, "Markise_Stop", $hash, 0);

# Zeit aktualisieren, um Doppelklick zu vermeiden
LastEvent($name);
return undef;
} # end sub Ga_Schalter2_not
#######################################


1;

fhem.cfg
Zitat
define OG_kz_RO_runter dummy
attr OG_kz_RO_runter event-on-change-reading .*
attr OG_kz_RO_runter eventMap /on:ein/off:aus/
attr OG_kz_RO_runter room 0_Übersicht
attr OG_kz_RO_runter verbose 3
attr OG_kz_RO_runter webCmd on:off

define OG_kz_RO_hoch dummy
attr OG_kz_RO_hoch event-on-change-reading .*
attr OG_kz_RO_hoch eventMap /on:ein/off:aus/
attr OG_kz_RO_hoch room 0_Übersicht
attr OG_kz_RO_hoch verbose 3
attr OG_kz_RO_hoch webCmd on:off



define OG_sz_RO_runter dummy
attr OG_sz_RO_runter event-on-change-reading .*
attr OG_sz_RO_runter room 0_Übersicht
attr OG_sz_RO_runter verbose 3
attr OG_sz_RO_runter webCmd on:off

define OG_sz_RO_hoch dummy
attr OG_sz_RO_hoch event-on-change-reading .*
attr OG_sz_RO_hoch room 0_Übersicht
attr OG_sz_RO_hoch verbose 3
attr OG_sz_RO_hoch webCmd on:off


# der dummy mit slider für die Steuerung
define OG_kz_RO_dummy dummy
attr OG_kz_RO_dummy alias Kinderzimmer
attr OG_kz_RO_dummy group Rollos
attr OG_kz_RO_dummy room 0_Übersicht
attr OG_kz_RO_dummy setList Pos:slider,0,1,100
attr OG_kz_RO_dummy verbose 3
attr OG_kz_RO_dummy webCmd einfahren:Pos:ausfahren


define OG_sz_RO_dummy dummy
attr OG_sz_RO_dummy alias Schlafzimmer
attr OG_sz_RO_dummy group Rollos
attr OG_sz_RO_dummy room 0_Übersicht
attr OG_sz_RO_dummy setList Pos:slider,0,1,100
attr OG_sz_RO_dummy verbose 3
attr OG_sz_RO_dummy webCmd einfahren:Pos:ausfahren

# notify für Schalter und dummy der Steuerung
define OG_kz_RO_notify notify (OG_kz_RO_dummy):.* {Ga_Schalter2_not($NAME,$EVENT,"OG_kz_RO_runter","OG_kz_RO_hoch");;}
define OG_sz_RO_notify notify (OG_sz_RO_dummy):.* {Ga_Schalter2_not($NAME,$EVENT,"OG_sz_RO_runter","OG_sz_RO_hoch");;}



setreading OG_kz_RO_dummy Ausfahrzeit 20.0
setreading OG_kz_RO_dummy Einfahrzeit 25.0

setreading OG_sz_RO_dummy Ausfahrzeit 20.0
setreading OG_sz_RO_dummy Einfahrzeit 25.0
Viele Grüße aus  Oberbayern
Tim (RettungsTim)

HoTi

So, mal zwischendurch der Code. Er funktioniert aber ist nicht schön.

Viele Grüße aus  Oberbayern
Tim (RettungsTim)