Langsamer FHEM-Aufruf innerhalb eigenem Modul

Begonnen von hal2001, 09 November 2013, 10:56:03

Vorheriges Thema - Nächstes Thema

hal2001

Hallo zusammen,

ich habe ein eigenes Modul zum Regeln eines Mischers für meine Zentralheizung geschrieben. Als Aktor setze ich ein 8-fach 1-Wire-Modul ein. Die Regelschleife setzt alle 30 Sekunden ein. Leider braucht FHEM beim Aufführen des Befehls:

fhem sprintf("set %s output %s off", $mischer->{actor}, $mischer->{powerChannel});


jeweils knapp eine 1 Sekunde aus. Da in jeder Regelschleife vier dieser FHEM-Aufrufe passieren, wird FHEM erheblich ausgebremst. Leider möchte ich vier dieser Regler einsetzen. Momentan bekomme ich bei Aktivierung der vier Regler immer wieder Disconnects meiner HMLANs; vermutlich weil FHEM voll mit der Abarbeitung der 12 FHEM-Aufrufe alle 30 Sekunden beschäftigt ist. Die Plattform, auf der FHEM läuft, ist zu 98% nicht ausgelastet.

Kann man die FHEM-Aufrufe ggf. im Multiprocessing-Modus durchführen, oder gibt es noch einen anderen Workaround?

Danke und Gruß, Jan

justme1968

es gibt von den owx modulen eine asynchrone version: http://forum.fhem.de/index.php/topic,13580.0.html. schau dir mal an ob die das hilft. OWServer/OWDdevice kann das noch nicht.

gruss
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

hal2001

Danke. Aber der Aufruf dauert ähnlich lange.

Joachim

Moin hal2001,

Mangels richtiger Aussagen musste ich meinen Job als Hellseher aufgeben.
Von daher ist es schwierig Dir zu helfen, ich bin mir allerdings sicher, es hängt mit dem aktuellen Sonnensturm zusammen.

So, und jetzt Spass beiseite, füttere uns mit den relevanten Informationen.

Gruß Joachim
FHEM aktuellste Version auf FB 7570 und 7390 mit Zebradem Toolbox Freetz
FHEM auf Raspberry
1-Wire mit LinkUSBi und Rs-Pi ds2482-800  1-Wire-9 Board; Max mit Cube, HMLAN
div. 1-Wire Sensoren; MAX-Thermostaten; Homematic-Komponenten, Zehnder KWL über RS-232

hal2001

Innerhalb des Moduls aktiviere ich meinen Aktor (8-fach 1-wire Modul von eservice, angebunden über OWX mit OWSWITCH) über den Befehl:

fhem sprintf("set %s output %s off", $mischer->{actor}, $mischer->{powerChannel});

Dieser Aufruf dauert in der Abarbeitung ca. 1 Sekunde. Da ich in der Funktion 4 mal einen solchen Aufruf starte, wird FHEM also für ca. 4 Sekunden geblockt. Die Eingabe des gleichen Befehls im FHEM-Frontend kostet ebenfalls die 1 Sekunde. Die Frage ist also, ob ich den Aufruf parallel zu dem sonstigen FHEM starten kann.

Anbei auch das Modul, das ich dazu hemdsärmlich zusammengeschrieben habe.

Danke und Gruß, Jan

###################################
# $Id: 98_myMischer.pm 2013-10-03 $

package main;
use strict;
use warnings;

sub myMischer_Move($);
sub myMischer_PowerOn($);
sub myMischer_ClearPower($);

##########################
sub
myMischer_Initialize($)
{
  my ($hash) = @_;
  $hash->{DefFn}   = "myMischer_Define";
  $hash->{SetFn}   = "myMischer_Set";
  $hash->{AttrList} = "disable:0,1 loglevel:0,1,2,3,4,5,6 setList ". $readingFnAttributes;
}


##########################
sub
myMischer_Define($$$)
{
  my ($mischer, $def) = @_;
  my @a = split("[ \t][ \t]*", $def);
  my $n = $a[0];

  if(@a != 4) {
    my $msg = "wrong syntax: define <name> myMischer " .
                "<actor>:powerChannel:toggleChannel <uptime>:<downtime>";
    Log 2, $msg;
    return $msg;
  }

  ###################
  # Actor
  my ($actor, $powerChannel, $toggleChannel) = split(":", $a[2], 3);
  if(!$defs{$actor}) {
    my $msg = "$n: Unknown sensor device $actor specified";
    Log 2, $msg;
    return $msg;
  }
  if($powerChannel eq $toggleChannel) {
    my $msg = "$n: Identical powerChannel and toggleChannel";
    Log 2, $msg;
    return $msg;
  }

  $mischer->{actor} = $actor;
  $mischer->{powerChannel} = $powerChannel;
  $mischer->{toggleChannel} = $toggleChannel;

  ###################
  # Time
  my ($uptime,$downtime) = split(":", $a[3], 2);

  $mischer->{uptime} = $uptime;
  $mischer->{downtime} = $downtime;
  $mischer->{pct}     = 0;
  $mischer->{target_pct} = 0;
  $mischer->{timestamp} = 0;
  $mischer->{direction} = -1;
  $mischer->{STATE} = 'initialized';

  return undef;
}

##########################
sub
myMischer_Set($@)
{
  my ($mischer, @a) = @_;
  my $n = $mischer->{NAME};

  return "Need a parameter for set" if(@a < 2);
  my $arg = $a[1];

  if($arg eq "open" || $arg eq "close" || $arg eq "pct") {
     RemoveInternalTimer($mischer);
#     Log GetLogLevel($n,3), "myMischer set $n $a";
     myMischer_ClearPower($mischer);

     if ($arg eq "open") {
       $mischer->{movetime}=$mischer->{uptime};
     } elsif ($arg eq "close") {
       $mischer->{movetime}=-$mischer->{downtime};
     } elsif ($arg eq "pct") {

      $mischer->{target_pct} = $a[2];
      $mischer->{movetime}=($a[2]-$mischer->{pct})/100;
      if ($a[2]>=100) {
  $mischer->{movetime}=$mischer->{uptime};
      }
      if ($a[2]<=0) {
  $mischer->{movetime}=-$mischer->{downtime};
      }
      if ($mischer->{movetime}>0) {
          $mischer->{movetime} *= $mischer->{uptime};
       } else {
          $mischer->{movetime} *= $mischer->{downtime};
       }
     }
     if (abs($mischer->{movetime})>0) {
       myMischer_Move($mischer);
     }

  } elsif($arg eq "stop" ) {
     return "Pure down command needed"
        if(@a != 2);
     Log GetLogLevel($n,3), "myMischer set $n $arg";
     myMischer_ClearPower($mischer);

  } else {
    return "Unknown argument $a[1], choose one of actor runtime"

  }
  return "";
}


##########################
sub
myMischer_Move($)
{
  my ($mischer) = @_;
  my $onoff = $mischer->{movetime}>0 ? "on" : "off";

  fhem sprintf("set %s output %s %s", $mischer->{actor}, $mischer->{toggleChannel}, $onoff);

  $mischer->{STATE} = "moving $onoff ($mischer->{STATE} -> $mischer->{target_pct}%)";

  myMischer_PowerOn($mischer);

  return;
}

sub
myMischer_PowerOn($)
{
  my ($mischer) = @_;

  RemoveInternalTimer($mischer);
  fhem sprintf("set %s output %s on", $mischer->{actor}, $mischer->{powerChannel});
  $mischer->{timestamp} = time();
  InternalTimer(gettimeofday()+abs($mischer->{movetime}), "myMischer_ClearPower", $mischer, 1);

  return;
}

sub
myMischer_ClearPower($)
{
  my ($mischer) = @_;

  fhem sprintf("set %s output %s off", $mischer->{actor}, $mischer->{powerChannel});
  fhem sprintf("set %s output %s off", $mischer->{actor}, $mischer->{toggleChannel});
  my $direction = $mischer->{movetime} <=> 0;
  my $delta = $direction*(time()-$mischer->{timestamp})*100;
  if ($mischer->{movetime} > 0) {
    $delta /= $mischer->{uptime};
  } else {
    $delta /= $mischer->{downtime};
  }

  $mischer->{pct} += $delta;
  if ($mischer->{pct}>100) {
    $mischer->{pct}=100;
  }
  if ($mischer->{pct}<0) {
    $mischer->{pct}=0;
  }

  $mischer->{STATE} = sprintf("%u%%", $mischer->{pct});
  $mischer->{movetime} = 0;

  return;
}

1;


Joachim

Moin Jan,

dann gehen wir mal auf die Suche.

Füge mal folgenden Eintrag in deiner fhem.cfg hinzu:

attr global mseclog 1
attr global verbose 5

milisecunden log einschalten, und FHEM gesprächig machen.
Dann ändere mal in der 00_OWX.pm die Zeile 100 den debugmode auf 3
my $owx_debug=3;
jetzt das Log analysieren, um zu sehen, wo es hakt., ggf als Anhang posten

Gruß Joachim
FHEM aktuellste Version auf FB 7570 und 7390 mit Zebradem Toolbox Freetz
FHEM auf Raspberry
1-Wire mit LinkUSBi und Rs-Pi ds2482-800  1-Wire-9 Board; Max mit Cube, HMLAN
div. 1-Wire Sensoren; MAX-Thermostaten; Homematic-Komponenten, Zehnder KWL über RS-232

hal2001

Hier also ein Stellvorgang des PID-Reglers für den Mischer:

2013.11.09 18:04:58.491 5: T: 40.06 °C ▾
2013.11.09 18:04:58.469 5: Notify loop for mischer_eg pct 87
2013.11.09 18:04:58.463 5: Triggering mischer_eg (1 changes)
2013.11.09 18:04:58.462 4: OWSWITCH: Set ow_con_h1 output 223
2013.11.09 18:04:58.461 5: A: ON☇ B: ON☇ C: ON☇ D: ON☇ E: ON☇ F: ON G: ON☇ H: ON☇
2013.11.09 18:04:58.441 5: Notify loop for ow_con_h1 A: ON☇
2013.11.09 18:04:58.437 5: Triggering ow_con_h1 (9 changes)
2013.11.09 18:04:58.414 3: OWX: Receiving in loop no. 1 0xcd
2013.11.09 18:04:58.390 3: Schleifendurchlauf 1
2013.11.09 18:04:58.325 3: OWX: Sending out        0xe3 0xc5
2013.11.09 18:04:58.317 3: OWX_Complex_SER: Receiving   0x55 0x29 0x22 0xb1 0x10 0x00 0x00 0x00 0x41 0xf0 0x88 0x00 0x00 0xdf 0x00 0x00 0x00 0x88 0xff 0xff 0xd5 0xa9
2013.11.09 18:04:58.303 3: OWX: Receiving in loop no. 1 0x55 0x29 0x22 0xb1 0x10 0x00 0x00 0x00 0x41 0xf0 0x88 0x00 0x00 0xdf 0x00 0x00 0x00 0x88 0xff 0xff 0xd5 0xa9
2013.11.09 18:04:58.279 3: Schleifendurchlauf 1
2013.11.09 18:04:58.214 3: OWX: Sending out        0xe1 0x55 0x29 0x22 0xb1 0x10 0x00 0x00 0x00 0x41 0xf0 0x88 0x00 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff
2013.11.09 18:04:58.205 3: OWX_Complex_SER: Sending out 0x55 0x29 0x22 0xb1 0x10 0x00 0x00 0x00 0x41 0xf0 0x88 0x00 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff
2013.11.09 18:04:58.190 3: OWX: Receiving in loop no. 1 0xcd
2013.11.09 18:04:58.167 3: Schleifendurchlauf 1
2013.11.09 18:04:58.104 3: OWX: Sending out        0xe3 0xc5
2013.11.09 18:04:58.071 3: OWX: Receiving in loop no. 1 0xcd
2013.11.09 18:04:58.050 3: Schleifendurchlauf 1
2013.11.09 18:04:57.989 3: OWX: Sending out        0xe3 0xc5
2013.11.09 18:04:57.986 3: OWX_Complex_SER: Receiving   0x55 0x29 0x22 0xb1 0x10 0x00 0x00 0x00 0x41 0x5a 0xdf 0x20 0xaa
2013.11.09 18:04:57.975 3: OWX: Receiving in loop no. 1 0x55 0x29 0x22 0xb1 0x10 0x00 0x00 0x00 0x41 0x5a 0xdf 0x20 0xaa
2013.11.09 18:04:57.954 3: Schleifendurchlauf 1
2013.11.09 18:04:57.879 3: OWX: Sending out        0xe1 0x55 0x29 0x22 0xb1 0x10 0x00 0x00 0x00 0x41 0x5a 0xdf 0x20 0xff
2013.11.09 18:04:57.869 3: OWX_Complex_SER: Sending out 0x55 0x29 0x22 0xb1 0x10 0x00 0x00 0x00 0x41 0x5a 0xdf 0x20 0xff
2013.11.09 18:04:57.854 3: OWX: Receiving in loop no. 1 0xcd
2013.11.09 18:04:57.821 3: Schleifendurchlauf 1
2013.11.09 18:04:57.756 3: OWX: Sending out        0xe3 0xc5
2013.11.09 18:04:57.734 3: OWX: Receiving in loop no. 1 0xcd
2013.11.09 18:04:57.711 3: Schleifendurchlauf 1
2013.11.09 18:04:57.649 3: OWX: Sending out        0xe3 0xc5
2013.11.09 18:04:57.644 3: OWX_Complex_SER: Receiving   0x55 0x29 0x22 0xb1 0x10 0x00 0x00 0x00 0x41 0xf0 0x88 0x00 0x00 0xff 0x00 0x00 0x00 0x88 0xff 0xff 0xf4 0x6b
2013.11.09 18:04:57.614 3: OWX: Receiving in loop no. 1 0x55 0x29 0x22 0xb1 0x10 0x00 0x00 0x00 0x41 0xf0 0x88 0x00 0x00 0xff 0x00 0x00 0x00 0x88 0xff 0xff 0xf4 0x6b
2013.11.09 18:04:57.590 3: Schleifendurchlauf 1
2013.11.09 18:04:57.528 3: OWX: Sending out        0xe1 0x55 0x29 0x22 0xb1 0x10 0x00 0x00 0x00 0x41 0xf0 0x88 0x00 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff
2013.11.09 18:04:57.525 3: OWX_Complex_SER: Sending out 0x55 0x29 0x22 0xb1 0x10 0x00 0x00 0x00 0x41 0xf0 0x88 0x00 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff
2013.11.09 18:04:57.514 3: OWX: Receiving in loop no. 1 0xcd
2013.11.09 18:04:57.493 3: Schleifendurchlauf 1
2013.11.09 18:04:57.423 3: OWX: Sending out        0xe3 0xc5
2013.11.09 18:04:57.419 5: Cmd: >set ow_con_h1 output F on<
2013.11.09 18:04:57.418 4: OWSWITCH: Set ow_con_h1 output 255
2013.11.09 18:04:57.417 5: A: ON☇ B: ON☇ C: ON☇ D: ON☇ E: ON☇ F: ON☇ G: ON☇ H: ON☇
2013.11.09 18:04:57.397 5: Notify loop for ow_con_h1 A: ON☇
2013.11.09 18:04:57.393 5: Triggering ow_con_h1 (9 changes)
2013.11.09 18:04:57.365 3: OWX: Receiving in loop no. 1 0xcd
2013.11.09 18:04:57.343 3: Schleifendurchlauf 1
2013.11.09 18:04:57.279 3: OWX: Sending out        0xe3 0xc5
2013.11.09 18:04:57.270 3: OWX_Complex_SER: Receiving   0x55 0x29 0x22 0xb1 0x10 0x00 0x00 0x00 0x41 0xf0 0x88 0x00 0x00 0xff 0x00 0x00 0x00 0x88 0xff 0xff 0xf4 0x6b
2013.11.09 18:04:57.256 3: OWX: Receiving in loop no. 1 0x55 0x29 0x22 0xb1 0x10 0x00 0x00 0x00 0x41 0xf0 0x88 0x00 0x00 0xff 0x00 0x00 0x00 0x88 0xff 0xff 0xf4 0x6b
2013.11.09 18:04:57.232 3: Schleifendurchlauf 1
2013.11.09 18:04:57.169 3: OWX: Sending out        0xe1 0x55 0x29 0x22 0xb1 0x10 0x00 0x00 0x00 0x41 0xf0 0x88 0x00 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff
2013.11.09 18:04:57.151 3: OWX_Complex_SER: Sending out 0x55 0x29 0x22 0xb1 0x10 0x00 0x00 0x00 0x41 0xf0 0x88 0x00 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff
2013.11.09 18:04:57.137 3: OWX: Receiving in loop no. 1 0xcd
2013.11.09 18:04:57.114 3: Schleifendurchlauf 1
2013.11.09 18:04:57.051 3: OWX: Sending out        0xe3 0xc5
2013.11.09 18:04:57.037 3: OWX: Receiving in loop no. 1 0xcd
2013.11.09 18:04:57.015 3: Schleifendurchlauf 1
2013.11.09 18:04:56.941 3: OWX: Sending out        0xe3 0xc5
2013.11.09 18:04:56.932 3: OWX_Complex_SER: Receiving   0x55 0x29 0x22 0xb1 0x10 0x00 0x00 0x00 0x41 0x5a 0xff 0x00 0xaa
2013.11.09 18:04:56.919 3: OWX: Receiving in loop no. 1 0x55 0x29 0x22 0xb1 0x10 0x00 0x00 0x00 0x41 0x5a 0xff 0x00 0xaa
2013.11.09 18:04:56.895 3: Schleifendurchlauf 1
2013.11.09 18:04:56.831 3: OWX: Sending out        0xe1 0x55 0x29 0x22 0xb1 0x10 0x00 0x00 0x00 0x41 0x5a 0xff 0x00 0xff
2013.11.09 18:04:56.817 3: OWX_Complex_SER: Sending out 0x55 0x29 0x22 0xb1 0x10 0x00 0x00 0x00 0x41 0x5a 0xff 0x00 0xff
2013.11.09 18:04:56.803 3: OWX: Receiving in loop no. 1 0xcd
2013.11.09 18:04:56.780 3: Schleifendurchlauf 1
2013.11.09 18:04:56.716 3: OWX: Sending out        0xe3 0xc5
2013.11.09 18:04:56.694 3: OWX: Receiving in loop no. 1 0xcd
2013.11.09 18:04:56.670 3: Schleifendurchlauf 1
2013.11.09 18:04:56.608 3: OWX: Sending out        0xe3 0xc5
2013.11.09 18:04:56.605 3: OWX_Complex_SER: Receiving   0x55 0x29 0x22 0xb1 0x10 0x00 0x00 0x00 0x41 0xf0 0x88 0x00 0x00 0xff 0x00 0x00 0x00 0x88 0xff 0xff 0xf4 0x6b
2013.11.09 18:04:56.594 3: OWX: Receiving in loop no. 1 0x55 0x29 0x22 0xb1 0x10 0x00 0x00 0x00 0x41 0xf0 0x88 0x00 0x00 0xff 0x00 0x00 0x00 0x88 0xff 0xff 0xf4 0x6b
2013.11.09 18:04:56.559 3: Schleifendurchlauf 1
2013.11.09 18:04:56.494 3: OWX: Sending out        0xe1 0x55 0x29 0x22 0xb1 0x10 0x00 0x00 0x00 0x41 0xf0 0x88 0x00 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff
2013.11.09 18:04:56.483 3: OWX_Complex_SER: Sending out 0x55 0x29 0x22 0xb1 0x10 0x00 0x00 0x00 0x41 0xf0 0x88 0x00 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff
2013.11.09 18:04:56.467 3: OWX: Receiving in loop no. 1 0xcd
2013.11.09 18:04:56.445 3: Schleifendurchlauf 1
2013.11.09 18:04:56.382 3: OWX: Sending out        0xe3 0xc5
2013.11.09 18:04:56.378 5: Cmd: >set ow_con_h1 output E off<
2013.11.09 18:04:56.377 4: OWSWITCH: Set ow_con_h1 output 255
2013.11.09 18:04:56.376 5: A: ON☇ B: ON☇ C: ON☇ D: ON☇ E: ON☇ F: ON☇ G: ON☇ H: ON☇
2013.11.09 18:04:56.356 5: Notify loop for ow_con_h1 A: ON☇
2013.11.09 18:04:56.350 5: Triggering ow_con_h1 (9 changes)
2013.11.09 18:04:56.321 3: OWX: Receiving in loop no. 1 0xcd
2013.11.09 18:04:56.299 3: Schleifendurchlauf 1
2013.11.09 18:04:56.235 3: OWX: Sending out        0xe3 0xc5
2013.11.09 18:04:56.226 3: OWX_Complex_SER: Receiving   0x55 0x29 0x22 0xb1 0x10 0x00 0x00 0x00 0x41 0xf0 0x88 0x00 0x00 0xff 0x00 0x00 0x00 0x88 0xff 0xff 0xf4 0x6b
2013.11.09 18:04:56.212 3: OWX: Receiving in loop no. 1 0x55 0x29 0x22 0xb1 0x10 0x00 0x00 0x00 0x41 0xf0 0x88 0x00 0x00 0xff 0x00 0x00 0x00 0x88 0xff 0xff 0xf4 0x6b
2013.11.09 18:04:56.188 3: Schleifendurchlauf 1
2013.11.09 18:04:56.126 3: OWX: Sending out        0xe1 0x55 0x29 0x22 0xb1 0x10 0x00 0x00 0x00 0x41 0xf0 0x88 0x00 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff
2013.11.09 18:04:56.123 3: OWX_Complex_SER: Sending out 0x55 0x29 0x22 0xb1 0x10 0x00 0x00 0x00 0x41 0xf0 0x88 0x00 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff
2013.11.09 18:04:56.092 3: OWX: Receiving in loop no. 1 0xcd
2013.11.09 18:04:56.070 3: Schleifendurchlauf 1
2013.11.09 18:04:56.005 3: OWX: Sending out        0xe3 0xc5
2013.11.09 18:04:55.982 3: OWX: Receiving in loop no. 1 0xcd
2013.11.09 18:04:55.960 3: Schleifendurchlauf 1
2013.11.09 18:04:55.893 3: OWX: Sending out        0xe3 0xc5
2013.11.09 18:04:55.883 3: OWX_Complex_SER: Receiving   0x55 0x29 0x22 0xb1 0x10 0x00 0x00 0x00 0x41 0x5a 0xff 0x00 0xaa
2013.11.09 18:04:55.869 3: OWX: Receiving in loop no. 1 0x55 0x29 0x22 0xb1 0x10 0x00 0x00 0x00 0x41 0x5a 0xff 0x00 0xaa
2013.11.09 18:04:55.846 3: Schleifendurchlauf 1
2013.11.09 18:04:55.771 3: OWX: Sending out        0xe1 0x55 0x29 0x22 0xb1 0x10 0x00 0x00 0x00 0x41 0x5a 0xff 0x00 0xff
2013.11.09 18:04:55.761 3: OWX_Complex_SER: Sending out 0x55 0x29 0x22 0xb1 0x10 0x00 0x00 0x00 0x41 0x5a 0xff 0x00 0xff
2013.11.09 18:04:55.747 3: OWX: Receiving in loop no. 1 0xcd
2013.11.09 18:04:55.725 3: Schleifendurchlauf 1
2013.11.09 18:04:55.660 3: OWX: Sending out        0xe3 0xc5
2013.11.09 18:04:55.635 3: OWX: Receiving in loop no. 1 0xcd
2013.11.09 18:04:55.610 3: Schleifendurchlauf 1
2013.11.09 18:04:55.545 3: OWX: Sending out        0xe3 0xc5
2013.11.09 18:04:55.536 3: OWX_Complex_SER: Receiving   0x55 0x29 0x22 0xb1 0x10 0x00 0x00 0x00 0x41 0xf0 0x88 0x00 0x00 0xff 0x00 0x00 0x00 0x88 0xff 0xff 0xf4 0x6b
2013.11.09 18:04:55.522 3: OWX: Receiving in loop no. 1 0x55 0x29 0x22 0xb1 0x10 0x00 0x00 0x00 0x41 0xf0 0x88 0x00 0x00 0xff 0x00 0x00 0x00 0x88 0xff 0xff 0xf4 0x6b
2013.11.09 18:04:55.498 3: Schleifendurchlauf 1
2013.11.09 18:04:55.434 3: OWX: Sending out        0xe1 0x55 0x29 0x22 0xb1 0x10 0x00 0x00 0x00 0x41 0xf0 0x88 0x00 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff
2013.11.09 18:04:55.422 3: OWX_Complex_SER: Sending out 0x55 0x29 0x22 0xb1 0x10 0x00 0x00 0x00 0x41 0xf0 0x88 0x00 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff
2013.11.09 18:04:55.407 3: OWX: Receiving in loop no. 1 0xcd
2013.11.09 18:04:55.384 3: Schleifendurchlauf 1
2013.11.09 18:04:55.322 3: OWX: Sending out        0xe3 0xc5
2013.11.09 18:04:55.318 5: Cmd: >set ow_con_h1 output E off<
2013.11.09 18:04:55.317 4: OWSWITCH: Set ow_con_h1 output 255
2013.11.09 18:04:55.316 5: A: ON☇ B: ON☇ C: ON☇ D: ON☇ E: ON☇ F: ON☇ G: ON☇ H: ON☇
2013.11.09 18:04:55.287 5: Notify loop for ow_con_h1 A: ON☇
2013.11.09 18:04:55.283 5: Triggering ow_con_h1 (9 changes)
2013.11.09 18:04:55.254 3: OWX: Receiving in loop no. 1 0xcd
2013.11.09 18:04:55.231 3: Schleifendurchlauf 1
2013.11.09 18:04:55.169 3: OWX: Sending out        0xe3 0xc5
2013.11.09 18:04:55.164 3: OWX_Complex_SER: Receiving   0x55 0x29 0x22 0xb1 0x10 0x00 0x00 0x00 0x41 0xf0 0x88 0x00 0x00 0xff 0x00 0x00 0x00 0x88 0xff 0xff 0xf4 0x6b
2013.11.09 18:04:55.140 3: OWX: Receiving in loop no. 1 0x55 0x29 0x22 0xb1 0x10 0x00 0x00 0x00 0x41 0xf0 0x88 0x00 0x00 0xff 0x00 0x00 0x00 0x88 0xff 0xff 0xf4 0x6b
2013.11.09 18:04:55.116 3: Schleifendurchlauf 1
2013.11.09 18:04:55.054 3: OWX: Sending out        0xe1 0x55 0x29 0x22 0xb1 0x10 0x00 0x00 0x00 0x41 0xf0 0x88 0x00 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff
2013.11.09 18:04:55.044 3: OWX_Complex_SER: Sending out 0x55 0x29 0x22 0xb1 0x10 0x00 0x00 0x00 0x41 0xf0 0x88 0x00 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff
2013.11.09 18:04:55.029 3: OWX: Receiving in loop no. 1 0xcd
2013.11.09 18:04:55.007 3: Schleifendurchlauf 1
2013.11.09 18:04:54.936 3: OWX: Sending out        0xe3 0xc5
2013.11.09 18:04:54.912 3: OWX: Receiving in loop no. 1 0xcd
2013.11.09 18:04:54.890 3: Schleifendurchlauf 1
2013.11.09 18:04:54.825 3: OWX: Sending out        0xe3 0xc5
2013.11.09 18:04:54.816 3: OWX_Complex_SER: Receiving   0x55 0x29 0x22 0xb1 0x10 0x00 0x00 0x00 0x41 0x5a 0xff 0x00 0xaa
2013.11.09 18:04:54.803 3: OWX: Receiving in loop no. 1 0x55 0x29 0x22 0xb1 0x10 0x00 0x00 0x00 0x41 0x5a 0xff 0x00 0xaa
2013.11.09 18:04:54.779 3: Schleifendurchlauf 1
2013.11.09 18:04:54.711 3: OWX: Sending out        0xe1 0x55 0x29 0x22 0xb1 0x10 0x00 0x00 0x00 0x41 0x5a 0xff 0x00 0xff
2013.11.09 18:04:54.700 3: OWX_Complex_SER: Sending out 0x55 0x29 0x22 0xb1 0x10 0x00 0x00 0x00 0x41 0x5a 0xff 0x00 0xff
2013.11.09 18:04:54.686 3: OWX: Receiving in loop no. 1 0xcd
2013.11.09 18:04:54.664 3: Schleifendurchlauf 1
2013.11.09 18:04:54.599 3: OWX: Sending out        0xe3 0xc5
2013.11.09 18:04:54.571 3: OWX: Receiving in loop no. 1 0xcd
2013.11.09 18:04:54.547 3: Schleifendurchlauf 1
2013.11.09 18:04:54.483 3: OWX: Sending out        0xe3 0xc5
2013.11.09 18:04:54.473 3: OWX_Complex_SER: Receiving   0x55 0x29 0x22 0xb1 0x10 0x00 0x00 0x00 0x41 0xf0 0x88 0x00 0x00 0xff 0x00 0x00 0x00 0x88 0xff 0xff 0xf4 0x6b
2013.11.09 18:04:54.459 3: OWX: Receiving in loop no. 1 0x55 0x29 0x22 0xb1 0x10 0x00 0x00 0x00 0x41 0xf0 0x88 0x00 0x00 0xff 0x00 0x00 0x00 0x88 0xff 0xff 0xf4 0x6b
2013.11.09 18:04:54.435 3: Schleifendurchlauf 1
2013.11.09 18:04:54.371 3: OWX: Sending out        0xe1 0x55 0x29 0x22 0xb1 0x10 0x00 0x00 0x00 0x41 0xf0 0x88 0x00 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff
2013.11.09 18:04:54.359 3: OWX_Complex_SER: Sending out 0x55 0x29 0x22 0xb1 0x10 0x00 0x00 0x00 0x41 0xf0 0x88 0x00 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff
2013.11.09 18:04:54.344 3: OWX: Receiving in loop no. 1 0xcd
2013.11.09 18:04:54.321 3: Schleifendurchlauf 1
2013.11.09 18:04:54.259 3: OWX: Sending out        0xe3 0xc5
2013.11.09 18:04:54.252 5: Cmd: >set ow_con_h1 output F off<
2013.11.09 18:04:54.248 5: Cmd: >set mischer_eg pct 87<
2013.11.09 18:04:54.246 4: PID PID_eg: p:-0.31 i:87.50 d:-0.00
2013.11.09 18:04:54.236 5: Notify loop for te_vl_eg temperature: 40.0625
2013.11.09 18:04:54.224 5: Triggering te_vl_eg (2 changes)


Der Vorgang dauert also knapp 4 Sekunden; Der PID-Regler heißt PID_eg und steuert nach der Temperatur te_vl_eg. Der Aktor sind die beiden Kanäle E und F des 8fach-1-Wire-Switch von eService mit dem Namen ow_con_h1. Dieser Aktor wird über mein Modul "mischer_eg" gesteuert. Zunächst werden beide Kanäle (E/F) auf "off" gestellt. Danach entweder einer oder beide auf "on" aktiviert -- je nach dem, ob auf oder zu gedreht werden soll.

Vorab herzlichen Dank für die Unterstützung.

Jan

Joachim

Moin Jan,

OWX selbst, und Dein Modul lafen sauber durch, leider blockiert OWX aus technischen Gründen FHEM.
Das Timing für 1-Wire wird im OWX-Modul gemacht.
Was Du versuchen kannst ist
a) in OWX die sleep Zeiten zu reduzieren, bis OWX anfängt instabil zu werden, und das für Dein System beste Timing zu finden, also z.B. hier:

sub OWX_Query_2480 ($$$) {

  my ($hash,$cmd,$retlen) = @_;
  my ($i,$j,$k,$l,$m,$n);
  my $string_in = "";
  my $string_part;
 
  #-- get hardware device
  my $owx_hwdevice = $hash->{HWDEVICE};
 
  $owx_hwdevice->baudrate($owx_baud);
  $owx_hwdevice->write_settings;

  if( $owx_debug > 2){
    my $res = "OWX: Sending out        ";
    for($i=0;$i<length($cmd);$i++){ 
      $j=int(ord(substr($cmd,$i,1))/16);
      $k=ord(substr($cmd,$i,1))%16;
     $res.=sprintf "0x%1x%1x ",$j,$k;
    }
    Log 3, $res;
  }
 
  my $count_out = $owx_hwdevice->write($cmd);
 
  if( !($count_out)){
    Log 3,"OWX_Query_2480: No return value after writing" if( $owx_debug > 0);
  } else {
    Log 3, "OWX_Query_2480: Write incomplete $count_out ne ".(length($cmd))."" if ( ($count_out != length($cmd)) & ($owx_debug > 0));
  }
  #-- sleeping for some time
  select(undef,undef,undef,0.04);

Dabei interessieren Dich nur die Bereiche, die allgemein gelten und die für  DS2480.
das kann ein wenig Geschwindigkeit bringen.
b) auf das OWX Modul warten, was nonblocking implementiert hat (das kann aber noch dauern)
http://forum.fhem.de/index.php/topic,13580.0.html
c) versuchsweise mal OWServer / OWDevice probieren, da dort das Timing in OWFS gemacht wird
http://www.fischer-net.de/hausautomation/haustechnik/1-wire/40-1-wire-software-unter-linux-teil-2.html

Ich lasse mir das ganze auch noch mal auf der Zunge zergehen, und melde mich, wenn mir was einfällt.

Gruß Joachim
FHEM aktuellste Version auf FB 7570 und 7390 mit Zebradem Toolbox Freetz
FHEM auf Raspberry
1-Wire mit LinkUSBi und Rs-Pi ds2482-800  1-Wire-9 Board; Max mit Cube, HMLAN
div. 1-Wire Sensoren; MAX-Thermostaten; Homematic-Komponenten, Zehnder KWL über RS-232

hal2001

Hallo Joachim,

schon einmal vielen Dank. Leider ist OWX bereits bei 0.04s-Sleep-Time recht instabil (alle 24h ein Ausfall). Ich habe jetzt einen ersten Workaround geschaffen, indem ich zwei Instanzen von FHEM auf dem gleichen Server laufen lasse (Prozessorkapazität habe ich ja noch genug), die über FHEM2FHEM verbunden sind. Auf der zweiten Instanz laufen jetzt nur die Regler mit OWX. Damit behindern sich die beiden Welten erst einmal nicht. Dennoch ist die zweite Instanz (Regler + OWX) schon bereits sehr stark ausgelastet.

Jan

ntruchsess

ein paar Worte zur asynchronen Version:

Die macht nur das Hintergrundpollen der Devices asynchron, explizite set und get-Aufrufe werden wie gehabt synchron abgewicket. Soll ich das ändern? Set hätte dann ein 'fire & forget' Verhalten - die eigentliche Aktion würde ja asynchron und damit eben irgendwann später ausgeführt. Beim get bekäme man nur gecachte Werte zu sehen. Kein Problem das zu implementieren, jetzt da die Grundlagen eh schon fertig sind - ich würde nur gerne wissen, ob bzw. wie das so gewünscht wäre?

- Norbert
while (!asleep()) {sheep++};

hal2001

Hi Norbert,

für meine Anwendung wären die asynchronen Set-Befehle nicht sinnvoll, da ich einen Timer für den Linearmotor des Mischers verwende.

Danke und Gruß, Jan

Joachim

Moin Jan,

wenn Du mit Deinem Workaround ersteinmal leben kannst, ist der Tread für mich ersteinmal gelöst.

Gruß Joachim
FHEM aktuellste Version auf FB 7570 und 7390 mit Zebradem Toolbox Freetz
FHEM auf Raspberry
1-Wire mit LinkUSBi und Rs-Pi ds2482-800  1-Wire-9 Board; Max mit Cube, HMLAN
div. 1-Wire Sensoren; MAX-Thermostaten; Homematic-Komponenten, Zehnder KWL über RS-232

hal2001

Hi Joachim,

ich funktioniert soweit jetzt ganz gut mit dem Workaround. Vielen Dank für die Hilfestellung an alle.

Jan