Buderus KM200 Kommunikationsmodul

Begonnen von Sailor, 21 Juli 2014, 12:39:47

Vorheriges Thema - Nächstes Thema

DLindner

ZitatDie Zeit wird in Version 0049 absteigend sortiert.

sie sind innerhalb der Kategorien bereits absteigend sortiert.

ZitatWas gibt die Konsole aus?
Was gibt das Log bei Level 5 aus?

Consolenausgabe bei Fhem start:
/opt/fhem/log# Obtaining value of                                     : /heatingCircuits/hc2/suWiThreshold
The following Service CANNOT be read                   : /heatingCircuits/hc2/suWiThreshold


Log-Datei:
2015.04.15 11:30:38 5: heizung : km200_ParseHttpResponseInit: Try to parse     : /heatingCircuits/hc2/suWiThreshold
2015.04.15 11:30:38 4: heizung : km200_ParseHttpResponseInit: /heatingCircuits/hc2/suWiThreshold NOT available
2015.04.15 11:32:14 4: heizung : km200_GetSingleService: /heatingCircuits/hc2/suWiThreshold NOT available
2015.04.15 11:32:45 4: heizung : km200_GetSingleService: /heatingCircuits/hc2/suWiThreshold NOT available


Das Gleiche gilt übrigens für roomInfluence, setPointOptimization und verschiedene andere eher unwichtige Readings der heatingCircuit/hc Pfade.

Starkstrombastler

Hallo,

hier meine Errors:

/notifications/Error-01 Time: 2015-04-05T06:31:00 -ErrorCode: 6C -AddCode: 228 -Category: L  2015-04-15 22:42:17
/notifications/Error-02 Time: 2014-11-04T15:58:00 -ErrorCode: 3Y -AddCode: 215 -Category: L  2015-04-15 22:42:17
/notifications/Error-03 Time: 2014-10-16T06:33:00 -ErrorCode: 3Y -AddCode: 215 -Category: L  2015-04-15 22:42:17
/notifications/Error-04 Time: 2014-03-24T05:30:00 -ErrorCode: 6C -AddCode: 306 -Category: L  2015-04-15 22:42:17
/notifications/Error-05 Time: 2014-03-23T07:00:00 -ErrorCode: 6C -AddCode: 306 -Category: L  2015-04-15 22:42:17
/notifications/Error-06 Time: 2012-10-23T17:07:00 -ErrorCode: 6A -AddCode: 227 -Category: L  2015-04-15 22:42:17
/notifications/Error-07 Time: 2012-10-23T17:03:00 -ErrorCode: 6A -AddCode: 227 -Category: L  2015-04-15 22:42:17
/notifications/Error-08 Time: 2012-10-22T21:05:00 -ErrorCode: 3Y -AddCode: 215 -Category: L  2015-04-15 22:42:17
/notifications/Error-09 Time: 2015-04-12T06:30:00 -ErrorCode: 6L -AddCode: 229 -Category: B  2015-04-15 22:42:17
/notifications/Error-10 Time: 2015-03-25T18:13:00 -ErrorCode: AA0 -AddCode: 800 -Category: A  2015-04-15 22:42:17
/notifications/Error-11 Time: 2015-03-25T18:12:00 -ErrorCode: AA1 -AddCode: 815 -Category: A  2015-04-15 22:42:17
/notifications/Error-12 Time: 2012-10-27T12:08:00 -ErrorCode: AA0 -AddCode: 809 -Category: A  2015-04-15 22:42:17
/notifications/Error-13 Time: 2012-08-18T12:22:00 -ErrorCode: AA0 -AddCode: 828 -Category: A  2015-04-15 22:42:17

Die "A"-Codes sind so nicht korrekt, der Error-Code müsste A01 oder A12 lauten.
Die Abfrage get KM200 /notifications json liefert aber auch:
{"id":"/notifications","type":"errorList","recordable":0,"writeable":0,"values":[
{"cat":"L","act":"H","dcd":"6C","ccd":228,"orig":"0","t":"2015-04-05T06:31:00"},
{"cat":"L","act":"H","dcd":"3Y","ccd":215,"orig":"0","t":"2014-11-04T15:58:00"},
{"cat":"L","act":"H","dcd":"3Y","ccd":215,"orig":"0","t":"2014-10-16T06:33:00"},
{"cat":"L","act":"H","dcd":"6C","ccd":306,"orig":"0","t":"2014-03-24T05:30:00"},
{"cat":"L","act":"H","dcd":"6C","ccd":306,"orig":"0","t":"2014-03-23T07:00:00"},
{"cat":"L","act":"H","dcd":"6A","ccd":227,"orig":"0","t":"2012-10-23T17:07:00"},
{"cat":"L","act":"H","dcd":"6A","ccd":227,"orig":"0","t":"2012-10-23T17:03:00"},
{"cat":"L","act":"H","dcd":"3Y","ccd":215,"orig":"0","t":"2012-10-22T21:05:00"},
{"cat":"B","act":"H","dcd":"6L","ccd":229,"orig":"0","t":"2015-04-12T06:30:00"},
{"cat":"A","act":"H","dcd":"AA0","ccd":800,"orig":"8","t":"2015-03-25T18:13:00"},
{"cat":"A","act":"H","dcd":"AA1","ccd":815,"orig":"17","t":"2015-03-25T18:12:00"},
{"cat":"A","act":"H","dcd":"AA0","ccd":809,"orig":"8","t":"2012-10-27T12:08:00"},
{"cat":"A","act":"H","dcd":"AA0","ccd":828,"orig":"8","t":"2012-08-18T12:22:00"}]}

Was bedeuten die "orig."-Werte, die sind nämlich immer 0, außer bei den A-Fehlern?
IPC\Ubuntu + Fhem, 1wire, Shellies, Siemens Logo!, Z-Wave, PhilipsTV, Vu+duo2, KM200

Sailor

Hallo DLindner

Zitat von: DLindner am 15 April 2015, 11:41:31
Consolenausgabe bei Fhem start:
Log-Datei:
Das Gleiche gilt übrigens für roomInfluence, setPointOptimization und verschiedene andere eher unwichtige Readings der heatingCircuit/hc Pfade.

Tja, dann sind wie Services wohl "vorgemerkt" aber scheinen nicht bedient zu werden...

Gruss
   Sailor
******************************
Man wird immer besser...

Sailor

#813
Hallo SSB

Zitat von: Starkstrombastler am 15 April 2015, 23:18:39
Die "A"-Codes sind so nicht korrekt, der Error-Code müsste A01 oder A12 lauten.

Ich kann nur in die Readings schreiben, was ich geliefert bekomme... Kriege ich Mist, wird Mist dargestellt.  8)

Zitat von: Starkstrombastler am 15 April 2015, 23:18:39
Was bedeuten die "orig."-Werte, die sind nämlich immer 0, außer bei den A-Fehlern?

Tja, wenn mir das die Fa. Bosch mal flüstern würde (wie so vieles Andere auch)...  ;D

Hier kann ich nur raten: "orig." als Abkürzung für "Origin" also Ursprung. Vielleicht ein Hinweis auf den ursprünglichen Ersteller der Fehlermessage.

Gruss
    Sailor
******************************
Man wird immer besser...

Starkstrombastler

Zitat von: Sailor am 16 April 2015, 05:59:03
Hier kann ich nur raten: "orig." als Abkürzung für "Origin" also Ursprung. Vielleicht ein Hinweis auf den ursprünglichen Ersteller der Fehlermessage.
An meiner RC30 kann ich unter Monitordaten - BusStatus die Teilnehmer am EMS-Bus auslesen. Sie werden wie folgt angezeigt:
8   UBA3
9   BC10
13  MODEM
16  RC30
17  HYDR WEICHE

Das passt gut zu den gemeldeten Anlagenfehlern,
{"cat":"A","act":"H","dcd":"AA1","ccd":815,"orig":"17","t":"2015-03-25T18:12:00"}
da 815 = Weichenfühler defekt 
und die Weiche die Bus-Nr. 17 hat.

Kann jemand diesen Zusammenhang bestätigen? (Zum Provozieren dieses Fehlers einfach den Sensor abklemmen)
IPC\Ubuntu + Fhem, 1wire, Shellies, Siemens Logo!, Z-Wave, PhilipsTV, Vu+duo2, KM200

Sailor

Hallo SSB

Zitat von: Starkstrombastler am 16 April 2015, 21:13:27
Kann jemand diesen Zusammenhang bestätigen? (Zum Provozieren dieses Fehlers einfach den Sensor abklemmen)

Das wird ja immer besser. Scheinbar ist die RC30 gesprächiger als meine RC300.
Die hat so gut wie keine dieser Werte... Oder ich habe den "Installateurmodus" noch nicht gefunden...

Gruss
   Sailor
******************************
Man wird immer besser...

Klaus Rubik

Zitat von: Sailor am 17 April 2015, 06:07:38
Oder ich habe den "Installateurmodus" noch nicht gefunden...

Hallo Sailor,

Installateurmodus bei der RC300 bekommst Du, wenn Du die "Menü" Taste mehrere Sekunden drückst.

Viele Grüße und danke für das hervorragende Modul!

Klaus
FHEM 6.0 auf RPI4 mit CUL868, AEOTEC, RFXTRX 433
CUL_WS  : S300TH              FHT         : FHT80B, FHT80TF
HMS        : HMS100-TF         FBDECT   : DECT!200, FRITZ!Powerline 546E
FS20       : FS20DI10, FS20ST, FS20WS1, FS20DU-2, FS20 FMS

DLindner

#817
Mein Reading für die Heizprogramme ist fertig.  Ich habe das Ganze so gebaut, dass:

  • alle dummy devices d_climaControl 1 -n automatisch aufgebaut werden
  • die eigentliche ReadingsGroup dynamisch gestaltet wird, abhängig von der Anzahl der Ein-/Ausschaltzeiten
  • die Heizkreis- und Heizprogrammdaten vorher ermittelt werden und damit das Dummy devices d_climaSelect aufgebaut wird
  • Plausibilitätsprüfungen der Schaltzeiten durchgeführtwerden
  • bis zu 6 Ein-/Ausschaltzeiten eingegeben werden können (theoretisch unbegrenzt, aber praktisch von der Bildschirmdiagonale begrenzt)
  • die ReadingsGroup initial über den Befehl aus der 99_myUtils {InitHzDef(<Name der Km200 Definition>,<Name der ReadingsGroup>,<Anzahl Spalten>)}  aufgebaut werden kann.
  • notify-Definitionen automatisch angelegt werden.

Der Code aus der myUtils.pm:
################################## Initialisierung dummy Definitionen ###############################
sub SetListSelect($$) {
  my ($climaSelect,$Prog) = @_;
  if(!(defined($defs{$climaSelect}))){
      fhem("define $climaSelect dummy");
  } else {
      return;
  }
  my $Liste = "Heizkreis:hc1,hc2,dhw1 Heizprogramm:$Prog Spalten:1,2,3,4,5,6";
  fhem("attr $climaSelect setList $Liste");
  fhem("setreading $climaSelect Heizkreis hc1");
  fhem("setreading $climaSelect Heizprogramm Eigen1");
  fhem("setreading $climaSelect Spalten 1");
  fhem("save");
}

sub SetClimaControl($$$) {
  my ($climaControl,$TimeStep,$Number) = @_;
  ####### Zeitraster in Minuten ####################

  $climaControl .= $Number;
  if(!(defined($defs{$climaControl}))){
       fhem("define $climaControl dummy");
  } else {
     return;
  }
  ####### Zeitwerte für setList ####################
  my $timeValues ="";
  for ( my $h = 0; $h <= 23 ; $h++) {
      for ( my $s = 0; $s <= 59; $s += $TimeStep) {
          $timeValues .= ($h < 10?"0" . $h:$h) . ":" . ($s < 10?"0" . $s:$s) . ",";
      }
  }
  $timeValues = left($timeValues, (length($timeValues) - 1));

  fhem("deletereading $climaControl [A-Za-z0-9].*");
  my $Reading = "";
      $Reading = "1-Mo" . $Number . "_start";
      fhem("setreading $climaControl $Reading undef");
      $Reading = "1-Mo" . $Number . "_stop";
      fhem("setreading $climaControl $Reading undef");
      $Reading = "2-Tu" . $Number . "_start";
      fhem("setreading $climaControl $Reading undef");
      $Reading = "2-Tu" . $Number . "_stop";
      fhem("setreading $climaControl $Reading undef");
      $Reading = "3-We" . $Number . "_start";
      fhem("setreading $climaControl $Reading undef");
      $Reading = "3-We" . $Number . "_stop";
      fhem("setreading $climaControl $Reading undef");
      $Reading = "4-Th" . $Number . "_start";
      fhem("setreading $climaControl $Reading undef");
      $Reading = "4-Th" . $Number . "_stop";
      fhem("setreading $climaControl $Reading undef");
      $Reading = "5-Fr" . $Number . "_start";
      fhem("setreading $climaControl $Reading undef");
      $Reading = "5-Fr" . $Number . "_stop";
      fhem("setreading $climaControl $Reading undef");
      $Reading = "6-Sa" . $Number . "_start";
      fhem("setreading $climaControl $Reading undef");
      $Reading = "6-Sa" . $Number . "_stop";
      fhem("setreading $climaControl $Reading undef");
      $Reading = "7-Su" . $Number . "_start";
      fhem("setreading $climaControl $Reading undef");
      $Reading = "7-Su" . $Number . "_stop";
      fhem("setreading $climaControl $Reading undef");

      my $Liste = " 1-Mo" . $Number . "_start:$timeValues 1-Mo" . $Number . "_stop:$timeValues 2-Tu" . $Number . "_start:$timeValues 2-Tu" . $Number . "_stop:$timeValues 3-We" . $Number . "_start:$timeValues 3-We" . $Number . "_stop:$timeValues 4-Th" . $Number . "_start:$timeValues 4-Th" . $Number . "_stop:$timeValues 5-Fr" . $Number . "_start:$timeValues 5-Fr" . $Number . "_stop:$timeValues 6-Sa" . $Number . "_start:$timeValues 6-Sa" . $Number . "_stop:$timeValues 7-Su" . $Number . "_start:$timeValues 7-Su" . $Number . "_stop:$timeValues";

  fhem("attr $climaControl setList $Liste");
  fhem("save");
  return();
}
####################################### Ende Initialisierung dummy #############################################

####################################### Initialisierung Definition Heizprogramme ###############################
sub InitHzDef($$$) {
   my ($DEVICE,$Definition,$Number) = @_;
 
   fhem("setreading d_climaSelect DEVICE $DEVICE");
   fhem("setreading d_climaSelect DEFINITION $Definition");

   my $Def1=':<%time_note@yellow>,<Heizkreis>,<Progamm>,<Speichern>,<>,<Spalten>';
   my $Def2='Heizkreis@d_climaSelect,Heizprogramm@d_climaSelect,<%Update>,<>,Spalten@d_climaSelect';

   my $Def3='<kopieren<br>löschen>,<%edit_expand@copy1>,<%message_garbage@del1>';
   my $Def4='<>,<von>,<bis>';
   my $Def5='<Montag>,1-Mo1_start@d_climaControl1,1-Mo1_stop@d_climaControl1';
   my $Def6='<Dienstag>,2-Tu1_start@d_climaControl1,2-Tu1_stop@d_climaControl1';
   my $Def7='<Mittwoch>,3-We1_start@d_climaControl1,3-We1_stop@d_climaControl1';
   my $Def8='<Donnerstag>,4-Th1_start@d_climaControl1,4-Th1_stop@d_climaControl1';
   my $Def9='<Freitag>,5-Fr1_start@d_climaControl1,5-Fr1_stop@d_climaControl1';
   my $Def10='<Samstag>,6-Sa1_start@d_climaControl1,6-Sa1_stop@d_climaControl1';
   my $Def11='<Sonntag>,7-Su1_start@d_climaControl1,7-Su1_stop@d_climaControl1';

   my $AttrCmd1="'Heizkreis' => 'Heizkreis:','Heizprogramm' => 'Heizprogramm:','Spalten' => 'Spalten:','$Definition.Update'=>'trigger ntfy_rg $DEVICE updateTable'";

   my $AttrCmd2='\''.$Definition.'.edit_expand@copy1\'=>\'trigger ntfy_rg $DEVICE copy|1\'';
   my $AttrCmd3='\''.$Definition.'.message_garbage@del1\'=>\'trigger ntfy_rg $DEVICE delete|1\'';
   my $AttrCmd4="'1-Mo1_start' => '1-Mo1_start:','1-Mo1_stop' => '1-Mo1_stop:'";
   my $AttrCmd5="'2-Tu1_start' => '2-Tu1_start:','2-Tu1_stop' => '2-Tu1_stop:'";
   my $AttrCmd6="'3-We1_start' => '3-We1_start:','3-We1_stop' => '3-We1_stop:'";
   my $AttrCmd7="'4-Th1_start' => '4-Th1_start:','4-Th1_stop' => '4-Th1_stop:'";
   my $AttrCmd8="'5-Fr1_start' => '5-Fr1_start:','5-Fr1_stop' => '5-Fr1_stop:'";
   my $AttrCmd9="'6-Sa1_start' => '6-Sa1_start:','6-Sa1_stop' => '6-Sa1_stop:'";
   my $AttrCmd10="'7-Su1_start' => '7-Su1_start:','7-Su1_stop' => '7-Su1_stop:'";

   $Number = ($Number > 6 ? 6 : $Number);
   for ( my $index = 2; $index <= $Number; $index++ ) {
      SetClimaControl("d_climaControl",10,$index);
      $Def3 .= ',<|>,<%edit_expand@copy'.$index.'>,<%message_garbage@del'.$index.'>';
      $Def4 .= ',<|>,<von>,<bis>';
      $Def5 .= ',<|>,1-Mo'.$index.'_start@d_climaControl'.$index.',1-Mo'.$index.'_stop@d_climaControl'.$index;
      $Def6 .= ',<|>,2-Tu'.$index.'_start@d_climaControl'.$index.',2-Tu'.$index.'_stop@d_climaControl'.$index;
      $Def7 .= ',<|>,3-We'.$index.'_start@d_climaControl'.$index.',3-We'.$index.'_stop@d_climaControl'.$index;
      $Def8 .= ',<|>,4-Th'.$index.'_start@d_climaControl'.$index.',4-Th'.$index.'_stop@d_climaControl'.$index;
      $Def9 .= ',<|>,5-Fr'.$index.'_start@d_climaControl'.$index.',5-Fr'.$index.'_stop@d_climaControl'.$index;
      $Def10 .= ',<|>,6-Sa'.$index.'_start@d_climaControl'.$index.',6-Sa'.$index.'_stop@d_climaControl'.$index;
      $Def11 .= ',<|>,7-Su'.$index.'_start@d_climaControl'.$index.',7-Su'.$index.'_stop@d_climaControl'.$index;

      $AttrCmd2 .= ',\''.$Definition.'.edit_expand@copy'.$index.'\'=>\'trigger ntfy_rg $DEVICE copy|'.$index.'\'';
      $AttrCmd3 .= ',\''.$Definition.'.message_garbage@del'.$index.'\'=>\'trigger ntfy_rg $DEVICE delete|'.$index.'\'';
      $AttrCmd4 .= ",'1-Mo".$index."_start' => '1-Mo".$index."_start:','1-Mo".$index."_stop' => '1-Mo".$index."_stop:'";
      $AttrCmd5 .= ",'2-Tu".$index."_start' => '2-Tu".$index."_start:','2-Tu".$index."_stop' => '2-Tu".$index."_stop:'";
      $AttrCmd6 .= ",'3-We".$index."_start' => '3-We".$index."_start:','3-We".$index."_stop' => '3-We".$index."_stop:'";
      $AttrCmd7 .= ",'4-Th".$index."_start' => '4-Th".$index."_start:','4-Th".$index."_stop' => '4-Th".$index."_stop:'";
      $AttrCmd8 .= ",'5-Fr".$index."_start' => '5-Fr".$index."_start:','5-Fr".$index."_stop' => '5-Fr".$index."_stop:'";
      $AttrCmd9 .= ",'6-Sa".$index."_start' => '6-Sa".$index."_start:','6-Sa".$index."_stop' => '6-Sa".$index."_stop:'";
      $AttrCmd10 .= ",'7-Su".$index."_start' => '7-Su".$index."_start:','7-Su".$index."_stop' => '7-Su".$index."_stop:'";
   }
   my $blank = ($Number eq 1  ? ",<>,<>" : "");
   if ( $Number > 1 ) {
       for ( my $j = 1; $j <= (($Number * 2) + ($Number - 5)); $j++) {
           $Def1 .= ',<>';
           $Def2 .= ',<>';
       }
   }   

   my $Def = $Def1.',<br>,'.$Def2.',<br>,'.$Def3.$blank.',<br>,'.$Def4.$blank.',<br>,'.$Def5.$blank.',<br>,'.$Def6.$blank.',<br>,'.$Def7.$blank.',<br>,'.$Def8.$blank.',<br>,'.$Def9.$blank.',<br>,'.$Def10.$blank.',<br>,'.$Def11.$blank;
   my $Commands = '{ '.$AttrCmd1.','.$AttrCmd2.','.$AttrCmd3.','.$AttrCmd4.','.$AttrCmd5.','.$AttrCmd6.','.$AttrCmd7.','.$AttrCmd8.','.$AttrCmd9.','.$AttrCmd10.' }';

   fhem("delete $Definition");

  if(!(defined($defs{$Definition}))){
     CommandDefine(undef,"$Definition readingsGroup $DEVICE$Def" );
   
     fhem("attr $Definition alias $Definition");
     fhem("attr $Definition room Einstellungen");
     fhem("attr $Definition cellStyle {\'r:4\'=>\'style=\"text-align:center;;\"\',\'r:3\'=>\'style=\"text-align:center;;\"\'}");
     fhem("attr $Definition nameStyle style=\'color:white;;text-align:left\'");
     fhem("attr $Definition nonames 1");
     fhem("attr $Definition style style=\'font-weight:bold;;color:white;;text-align:left;;font-size:15px\'");
     fhem("attr $Definition commands $Commands");
  } else {
     fhem("modify $Definition $Def");
     fhem("attr $Definition commands $Commands");
     fhem("quit");
  }
  fhem("setreading d_climaSelect Heizkreis hc1");

  if(!(defined($defs{"ntfy_rg"}))){
      CommandDefine(undef,'ntfy_rg notify d_.*|ntfy_rg:.* '.'{rg($EVENT)}' );
  }
  if(!(defined($defs{"ntfy_setreading"}))){
      CommandDefine(undef,'ntfy_setreading notify d_.*: '.'{ if( ($EVENT =~ / /) and ($EVENT !~ /: /) ) {fhem("setreading $NAME $EVENT")};;{checkVal($NAME,$EVENT)};; }' );
  }
  fhem("save");
  Refresh("WEB");


}
####################################### HeizProgramme der einzelnen Heizkreise #################################
sub getHzProgs($$$) {
  my ($name, $Circuits, $Device) = @_;                                                                     
  my $Programs = fhem("get $Device /$Circuits/$name/switchPrograms false");
  my @Arr = split(/\n/,$Programs);
  my $ProgList = "";
  for ( my $l = 0; $l <= $#Arr; $l++ ) {
       if ( ReadingsVal($Device, $Arr[$l] . "/1-Mo", "false") ne "false" ) {
          my @List = split(/\//,$Arr[$l]);
          $ProgList .= $List[$#List] . ",";
       }
  }
  $ProgList = left($ProgList, length($ProgList)-1);
  return ($ProgList);
}
###################################### Ende HeizProgramme #######################################################

Ich hoffe, dass Sailor die Befehle für das Schreiben noch knacken kann.

HarryHase

Dein Ein1 sieht super interessant aus, kannst Du bitte mal die Code einstellen.
Grüße hh

-----------------------

DLindner

Hi Harry,


#package main;

use strict;
use warnings;
use POSIX;
use POSIX qw(strftime);

sub Initialize($$)
{
  my ($hash) = @_;
}

sub InitwwReading($$) {
  my ($device,$Definition) = @_;

  my $Def = ":<%sani_water_hot\@yellow>,<Ist>,<>,<aktuell>\n heizung:<SchaltProgr.>,<>,<>,<switch>\n heizung:<Max.-Temp.>,/dhwCircuits/dhw1/actualTemp,<>,<sollsetz>\n <aktuell>,<Auto>,<Manuell>,<Aus>\n heizung:/dhwCircuits/dhw1/operationMode,<%time_automatic\@lightgreen>,<%time_manual_mode\@yellow>,<%general_aus\@red>";

  if(!(defined($defs{$Definition}))){
     CommandDefine(undef,"$Definition readingsGroup $device$Def" );

     fhem("attr $Definition alias Warmwasser");

     fhem("attr $Definition cellStyle { \'r:1\'=>\'style=\"font-weight:bold;;font-size:18px\"\',\'r:2,c:1\'=>\'style=\"color:white;;font-weight:bold;;font-size:14px;;\"\',\'r:4\'=>\'style=\"color:white;;font-weight:bold;;font-size:14px;;\"\'}");

     fhem("attr $Definition commands { \"$Definition.switch\"=>\"/dhwCircuits/dhw1/activeSwitchProgram:Eigen1\",\'$Definition.sollsetz\'=>\'/dhwCircuits/dhw1/setTemperature:50,55,60,65,70,75,80\',\'$Definition.time_automatic\@lightgreen\'=>\'set %DEVICE /dhwCircuits/dhw1/operationMode auto\',\'$Definition.time_manual_mode\@yellow\'=>\'set %DEVICE /dhwCircuits/dhw1/operationMode on\',\'$Definition.general_aus\@red\'=>\'set %DEVICE /dhwCircuits/dhw1/operationMode off\'}");

     fhem("attr $Definition group Ein1");
     fhem("attr $Definition nameStyle style=\"color:white;;text-align:left\"");
     fhem("attr $Definition nonames 1");
     fhem("attr $Definition room Einstellungen");
     fhem("attr $Definition style style=\"border:0px\"");

     fhem("attr $Definition valueFormat { \'/dhwCircuits/dhw1/setTemperature\'=>\'%.1f &deg;;C\',\'/dhwCircuits/dhw1/actualTemp\'=>\'%.1f &deg;;C\'}");
     fhem("attr $Definition valueIcon {\'/dhwCircuits/dhw1/operationMode.on\' => \'time_manual_mode\@yellow\',\'/dhwCircuits/dhw1/operationMode.auto\' => \'time_automatic\@lightgreen\',\'/dhwCircuits/dhw1/operationMode.off\' => \'general_aus\@red\'}");

     fhem("attr $Definition valueStyle {if(\$READING eq \"/dhwCircuits/dhw1/actualTemp\"){my \$t=\$VALUE;;my \$d=ReadingsVal(\$DEVICE,\'/dhwCircuits/dhw1/setTemperature\',0);;if(\$d-\$t>=30){\'style=\"color:royalblue;;text-align:left;;font-weight:bold;;\"\'}elsif(\$t-\$d>=1){\'style=\"color:yellow;;text-align:left;;font-weight:bold;;\"\'}else{\'style=\"color:lightgreen;;text-align:left;;font-weight:bold;;\"\'}}else{\'style=\"color:white;;text-align:left\";;\'}}");

     fhem("save");
  }
}


kopiere dir den Code in deine FHEM/99_myUtils.pm.  Dann brauchst Du nur noch in die Commando Zeile {InitwwReading("heizung","96_Warmwasser")} eingeben.
Ersetze "heizung" durch my_km200 oder den Definitionsnamen den du verwendest.
Ersatze  96_Warmwasser durch einen Definitionsnamen deiner Wahl.
Du findest das Reading dann links unter Einstellungen.

Klaus Rubik

Zitat von: DLindner am 19 April 2015, 11:45:12
Mein Reading für die Heizprogramme ist fertig.  Ich habe das Ganze so gebaut, dass:

  • alle dummy devices d_climaControl 1 -n automatisch aufgebaut werden
  • die eigentliche ReadingsGroup dynamisch gestaltet wird, abhängig von der Anzahl der Ein-/Ausschaltzeiten
  • die Heizkreis- und Heizprogrammdaten vorher ermittelt werden und damit das Dummy devices d_climaSelect aufgebaut wird
  • Plausibilitätsprüfungen der Schaltzeiten durchgeführtwerden
  • bis zu 6 Ein-/Ausschaltzeiten eingegeben werden können (theoretisch unbegrenzt, aber praktisch von der Bildschirmdiagonale begrenzt)
  • die ReadingsGroup initial über den Befehl aus der 99_myUtils {InitHzDef(<Name der Km200 Definition>,<Name der ReadingsGroup>,<Anzahl Spalten>)}  aufgebaut werden kann.
  • notify-Definitionen automatisch angelegt werden.

Hallo DLindner,

ich bekomme deine Lösung nicht ans laufen. Folgende Fhelermeldungen werden in FHEM.log geschrieben:

2015.04.21 14:09:21 3: setreading d_climaSelect DEVICE Heizkessel : Please define d_climaSelect first
2015.04.21 14:09:21 3: setreading d_climaSelect DEFINITION Heizprogramme : Please define d_climaSelect first
2015.04.21 14:09:55 3: save : configDB saved.
2015.04.21 14:09:55 3: delete Heizprogramme : Please define Heizprogramme first
2015.04.21 14:09:55 3: setreading d_climaSelect Heizkreis hc1 : Please define d_climaSelect first
2015.04.21 14:10:18 3: save : configDB saved.


Das km200 Modul liefert bei mir einen Heizkreis (/heatingCircuits/hc1/) und einen Warmwasserkreis (/dhwCircuits/dhw1/).
Was mache ich falsch?

Viele Grüße

klaus
FHEM 6.0 auf RPI4 mit CUL868, AEOTEC, RFXTRX 433
CUL_WS  : S300TH              FHT         : FHT80B, FHT80TF
HMS        : HMS100-TF         FBDECT   : DECT!200, FRITZ!Powerline 546E
FS20       : FS20DI10, FS20ST, FS20WS1, FS20DU-2, FS20 FMS

DLindner

Habe jetzt mal alle Subs angehängt. Bitte mal alles vorherige löschen und den Code unten einfügen. Da war d_climaSelect nocht nicht definiert. daher der Fehler.

################################## Initialisierung dummy Definitionen ###############################
sub InitListSelect($) {
  my ($device) = @_;
  if(!(defined($defs{"d_climaSelect"}))){
      fhem("define d_climaSelect dummy");
      my $Circuits = getHzCircuits($device);
      my @FirstCircuit = split(/,/,$Circuits);
      foreach my $val (@FirstCircuit) {
         my $Kreis = "heatingCircuits";
         if ( left($val,2) ne "hc" ) {
            $Kreis = "dhwCircuits";
         }
         my $Prog = getHzProgs($val,$Kreis,$device);
         fhem("set d_climaSelect $val $Prog");
      }
      my $Prog = getHzProgs($FirstCircuit[0],"heatingCircuits",$device);
      my @FirstProg = split(/,/,$Prog);
      my $Liste = "Heizkreis:$Circuits Heizprogramm:$Prog Spalten:1,2,3,4,5,6";
      fhem("attr d_climaSelect setList $Liste");
      fhem("set d_climaSelect HzK $Circuits");
      fhem("set d_climaSelect Heizkreis $FirstCircuit[0]");
      fhem("set d_climaSelect Heizprogramm &FirstProg[0]");
      fhem("save"); 
  }
  return;
}

sub SetListSelect($$) {
  my ($Prog,$device) = @_;
  my $Circuits = getHzCircuits($device);
  my $Liste = "Heizkreis:$Circuits Heizprogramm:$Prog Spalten:1,2,3,4,5,6";
  fhem("attr d_climaSelect setList $Liste");
  fhem("save");
  return;
}

sub SetClimaControl($$$) {
  my ($climaControl,$TimeStep,$Number) = @_;
  ####### Zeitraster in Minuten ####################

  $climaControl .= $Number;
  if(!(defined($defs{$climaControl}))){
       fhem("define $climaControl dummy");
  } else {
     return;
  }
  ####### Zeitwerte für setList ####################
  my $timeValues ="";
  for ( my $h = 0; $h <= 23 ; $h++) {
      for ( my $s = 0; $s <= 59; $s += $TimeStep) {
          $timeValues .= ($h < 10?"0" . $h:$h) . ":" . ($s < 10?"0" . $s:$s) . ",";
      }
  }
  $timeValues = left($timeValues, (length($timeValues) - 1));

  fhem("deletereading $climaControl [A-Za-z0-9].*");
  my $Reading = "";
      $Reading = "1-Mo" . $Number . "_start";
      fhem("setreading $climaControl $Reading undef");
      $Reading = "1-Mo" . $Number . "_stop";
      fhem("setreading $climaControl $Reading undef");
      $Reading = "2-Tu" . $Number . "_start";
      fhem("setreading $climaControl $Reading undef");
      $Reading = "2-Tu" . $Number . "_stop";
      fhem("setreading $climaControl $Reading undef");
      $Reading = "3-We" . $Number . "_start";
      fhem("setreading $climaControl $Reading undef");
      $Reading = "3-We" . $Number . "_stop";
      fhem("setreading $climaControl $Reading undef");
      $Reading = "4-Th" . $Number . "_start";
      fhem("setreading $climaControl $Reading undef");
      $Reading = "4-Th" . $Number . "_stop";
      fhem("setreading $climaControl $Reading undef");
      $Reading = "5-Fr" . $Number . "_start";
      fhem("setreading $climaControl $Reading undef");
      $Reading = "5-Fr" . $Number . "_stop";
      fhem("setreading $climaControl $Reading undef");
      $Reading = "6-Sa" . $Number . "_start";
      fhem("setreading $climaControl $Reading undef");
      $Reading = "6-Sa" . $Number . "_stop";
      fhem("setreading $climaControl $Reading undef");
      $Reading = "7-Su" . $Number . "_start";
      fhem("setreading $climaControl $Reading undef");
      $Reading = "7-Su" . $Number . "_stop";
      fhem("setreading $climaControl $Reading undef");

      my $Liste = " 1-Mo" . $Number . "_start:$timeValues 1-Mo" . $Number . "_stop:$timeValues 2-Tu" . $Number . "_start:$timeValues 2-Tu" . $Number . "_stop:$timeValues 3-We" . $Number . "_start:$timeValues 3-We" . $Number . "_stop:$timeValues 4-Th" . $Number . "_start:$timeValues 4-Th" . $Number . "_stop:$timeValues 5-Fr" . $Number . "_start:$timeValues 5-Fr" . $Number . "_stop:$timeValues 6-Sa" . $Number . "_start:$timeValues 6-Sa" . $Number . "_stop:$timeValues 7-Su" . $Number . "_start:$timeValues 7-Su" . $Number . "_stop:$timeValues";

  fhem("attr $climaControl setList $Liste");
  fhem("save");
  return();
}
####################################### Ende Initialisierung dummy #############################################
####################################### Initialisierung Definition Heizprogramme ###############################
sub InitHzDef($$$) {
   my ($DEVICE,$Definition,$Number) = @_;

   InitListSelect($DEVICE); 

   if(!(defined($defs{"ntfy_rg"}))){
       CommandDefine(undef,'ntfy_rg notify d_.*|ntfy_rg:.* '.'{rg($EVENT)}' );
   }
   
   if(!(defined($defs{"ntfy_setreading"}))){
       CommandDefine(undef,'ntfy_setreading notify d_.*:|ntfy_setreading:.* '.'{ if( ($EVENT =~ / /) and ($EVENT !~ /: /) ) {fhem("setreading $NAME $EVENT")};;{checkVal($NAME,$EVENT)};; }' );
   }

   fhem("setreading d_climaSelect DEVICE $DEVICE");
   fhem("setreading d_climaSelect DEFINITION $Definition");

   my $Def1=':<%time_note@yellow>,<Heizkreis>,<Progamm>,<Speichern>,<>,<Anz.<br>Schaltpkt.>';
   my $Def2='Heizkreis@d_climaSelect,Heizprogramm@d_climaSelect,<%Update>,<>,Spalten@d_climaSelect';
   my $Def3='<kopieren<br>löschen>,<%edit_expand@copy1>,<%message_garbage@del1>';
   my $Def4='<>,<von>,<bis>';
   my $Def5='<Montag>,1-Mo1_start@d_climaControl1,1-Mo1_stop@d_climaControl1';
   my $Def6='<Dienstag>,2-Tu1_start@d_climaControl1,2-Tu1_stop@d_climaControl1';
   my $Def7='<Mittwoch>,3-We1_start@d_climaControl1,3-We1_stop@d_climaControl1';
   my $Def8='<Donnerstag>,4-Th1_start@d_climaControl1,4-Th1_stop@d_climaControl1';
   my $Def9='<Freitag>,5-Fr1_start@d_climaControl1,5-Fr1_stop@d_climaControl1';
   my $Def10='<Samstag>,6-Sa1_start@d_climaControl1,6-Sa1_stop@d_climaControl1';
   my $Def11='<Sonntag>,7-Su1_start@d_climaControl1,7-Su1_stop@d_climaControl1';

   my $AttrCmd1="'Heizkreis' => 'Heizkreis:','Heizprogramm' => 'Heizprogramm:','Spalten' => 'Spalten:','$Definition.Update'=>'trigger ntfy_rg $DEVICE updateTable'";
   my $AttrCmd2='\''.$Definition.'.edit_expand@copy1\'=>\'trigger ntfy_rg $DEVICE copy|1\'';
   my $AttrCmd3='\''.$Definition.'.message_garbage@del1\'=>\'trigger ntfy_rg $DEVICE delete|1\'';
   my $AttrCmd4="'1-Mo1_start' => '1-Mo1_start:','1-Mo1_stop' => '1-Mo1_stop:'";
   my $AttrCmd5="'2-Tu1_start' => '2-Tu1_start:','2-Tu1_stop' => '2-Tu1_stop:'";
   my $AttrCmd6="'3-We1_start' => '3-We1_start:','3-We1_stop' => '3-We1_stop:'";
   my $AttrCmd7="'4-Th1_start' => '4-Th1_start:','4-Th1_stop' => '4-Th1_stop:'";
   my $AttrCmd8="'5-Fr1_start' => '5-Fr1_start:','5-Fr1_stop' => '5-Fr1_stop:'";
   my $AttrCmd9="'6-Sa1_start' => '6-Sa1_start:','6-Sa1_stop' => '6-Sa1_stop:'";
   my $AttrCmd10="'7-Su1_start' => '7-Su1_start:','7-Su1_stop' => '7-Su1_stop:'";

   $Number = ($Number > 6 ? 6 : $Number);
   for ( my $index = 2; $index <= $Number; $index++ ) {
      SetClimaControl("d_climaControl",10,$index);
      $Def3 .= ',<|>,<%edit_expand@copy'.$index.'>,<%message_garbage@del'.$index.'>';
      $Def4 .= ',<|>,<von>,<bis>';
      $Def5 .= ',<|>,1-Mo'.$index.'_start@d_climaControl'.$index.',1-Mo'.$index.'_stop@d_climaControl'.$index;
      $Def6 .= ',<|>,2-Tu'.$index.'_start@d_climaControl'.$index.',2-Tu'.$index.'_stop@d_climaControl'.$index;
      $Def7 .= ',<|>,3-We'.$index.'_start@d_climaControl'.$index.',3-We'.$index.'_stop@d_climaControl'.$index;
      $Def8 .= ',<|>,4-Th'.$index.'_start@d_climaControl'.$index.',4-Th'.$index.'_stop@d_climaControl'.$index;
      $Def9 .= ',<|>,5-Fr'.$index.'_start@d_climaControl'.$index.',5-Fr'.$index.'_stop@d_climaControl'.$index;
      $Def10 .= ',<|>,6-Sa'.$index.'_start@d_climaControl'.$index.',6-Sa'.$index.'_stop@d_climaControl'.$index;
      $Def11 .= ',<|>,7-Su'.$index.'_start@d_climaControl'.$index.',7-Su'.$index.'_stop@d_climaControl'.$index;

      $AttrCmd2 .= ',\''.$Definition.'.edit_expand@copy'.$index.'\'=>\'trigger ntfy_rg $DEVICE copy|'.$index.'\'';
      $AttrCmd3 .= ',\''.$Definition.'.message_garbage@del'.$index.'\'=>\'trigger ntfy_rg $DEVICE delete|'.$index.'\'';
      $AttrCmd4 .= ",'1-Mo".$index."_start' => '1-Mo".$index."_start:','1-Mo".$index."_stop' => '1-Mo".$index."_stop:'";
      $AttrCmd5 .= ",'2-Tu".$index."_start' => '2-Tu".$index."_start:','2-Tu".$index."_stop' => '2-Tu".$index."_stop:'";
      $AttrCmd6 .= ",'3-We".$index."_start' => '3-We".$index."_start:','3-We".$index."_stop' => '3-We".$index."_stop:'";
      $AttrCmd7 .= ",'4-Th".$index."_start' => '4-Th".$index."_start:','4-Th".$index."_stop' => '4-Th".$index."_stop:'";
      $AttrCmd8 .= ",'5-Fr".$index."_start' => '5-Fr".$index."_start:','5-Fr".$index."_stop' => '5-Fr".$index."_stop:'";
      $AttrCmd9 .= ",'6-Sa".$index."_start' => '6-Sa".$index."_start:','6-Sa".$index."_stop' => '6-Sa".$index."_stop:'";
      $AttrCmd10 .= ",'7-Su".$index."_start' => '7-Su".$index."_start:','7-Su".$index."_stop' => '7-Su".$index."_stop:'";
   }
   my $blank = ($Number eq 1  ? ",<>,<>" : "");
   if ( $Number > 1 ) {
       for ( my $j = 1; $j <= (($Number * 2) + ($Number - 5)); $j++) {
           $Def1 .= ',<>';
           $Def2 .= ',<>';
       }
   }   

   my $Def = $Def1.',<br>,'.$Def2.',<br>,'.$Def3.$blank.',<br>,'.$Def4.$blank.',<br>,'.$Def5.$blank.',<br>,'.$Def6.$blank.',<br>,'.$Def7.$blank.',<br>,'.$Def8.$blank.',<br>,'.$Def9.$blank.',<br>,'.$Def10.$blank.',<br>,'.$Def11.$blank;
   my $Commands = '{ '.$AttrCmd1.','.$AttrCmd2.','.$AttrCmd3.','.$AttrCmd4.','.$AttrCmd5.','.$AttrCmd6.','.$AttrCmd7.','.$AttrCmd8.','.$AttrCmd9.','.$AttrCmd10.' }';

  if(!(defined($defs{$Definition}))){
     CommandDefine(undef,"$Definition readingsGroup $DEVICE$Def" );
     fhem("attr $Definition alias $Definition");
     fhem("attr $Definition room Einstellungen");
     fhem("attr $Definition cellStyle {\'r:1\'=>\'style=\"text-align:center;;color:yellow;;\"\',\'c:1\'=>\'style=\"text-align:left;;color:yellow;;\"\',\'r:2\'=>\'style=\"text-align:center;;\"\',\'r:3\'=>\'style=\"text-align:center;;\"\',\'r:3,c:1\'=>\'style=\"text-align:left;;color:lightgreen;;\"\',\'r:4\'=>\'style=\"text-align:center;;color:white;;\"\'}");
     fhem("attr $Definition nonames 1");
     fhem("attr $Definition style style=\'font-weight:bold;;color:white;;text-align:left;;font-size:15px\'");
  } else {
# open (DATEI, ">>/opt/fhem/privat/debug.txt");
# print DATEI "else-zweig\n";
# close (DATEI);

     fhem("modify $Definition $DEVICE$Def");
     fhem("quit");

  }
  fhem("attr $Definition commands $Commands");

  fhem("save");
  Refresh("WEB");


}
####################################### HeizProgramme der einzelnen Heizkreise #################################
sub getHzProgs($$$) {
  my ($name, $Circuits, $Device) = @_;                                                                     
  my $Programs = fhem("get $Device /$Circuits/$name/switchPrograms false");
  my @Arr = split(/\n/,$Programs);
  my $ProgList = "";
  for ( my $l = 0; $l <= $#Arr; $l++ ) {
       if ( ReadingsVal($Device, $Arr[$l] . "/1-Mo", "false") ne "false" ) {
          my @List = split(/\//,$Arr[$l]);
          $ProgList .= $List[$#List] . ",";
       }
  }
  $ProgList = left($ProgList, length($ProgList)-1);
  return ($ProgList);
}

sub getHzCircuits($) {
  my ($Device) = @_;                                                                     
  my $HeatingCircuits = fhem("get $Device /heatingCircuits false");
  my $WwCircuits = fhem("get $Device /dhwCircuits false");
  my @HcArr = split(/\n/,$HeatingCircuits);
  my @WwArr = split(/\n/,$WwCircuits);
  my $CircuitList = "";

  for ( my $l = 0; $l <= $#HcArr; $l++ ) {
       if ( ReadingsVal($Device, $HcArr[$l] . "/operationMode", "false") ne "false" ) {
          my @List = split(/\//,$HcArr[$l]);
          $CircuitList .= $List[$#List] . ",";
       }
  }
  for ( my $l = 0; $l <= $#WwArr; $l++ ) {
       if ( ReadingsVal($Device, $WwArr[$l] . "/operationMode", "false") ne "false" ) {
          my @List = split(/\//,$WwArr[$l]);
          $CircuitList .= $List[$#List] . ",";
       }
  }

  $CircuitList = left($CircuitList, length($CircuitList)-1);
# open (DATEI, ">>/opt/fhem/privat/debug.txt");
# print DATEI "$CircuitList\n";
# close (DATEI);
  return ($CircuitList);
}

############################################# DropBoxen mit Werten setzen #######################################
sub setValue($$$$) {
  my ($Device,$Definition,$HzKreis,$HzProg) = @_;
  my @Arr = (" ","-Mo","-Tu","-We","-Th","-Fr","-Sa","-Su");
  my $Circuits = "heatingCircuits";
  if ( left($HzKreis,2) ne "hc" ) {
     $Circuits = "dhwCircuits";
  }

  my $index = 0;
  my $Max = 0;
  my $Cmd = "/$Circuits/" . $HzKreis . "/switchPrograms/" . $HzProg . "/";
  for ( my $i = 1; $i <= 7; $i++) {
     my $Day = $i . $Arr[$i];
     my $Reading = $Cmd . $Day;
     $index = (($Max = heatingVal(ReadingsVal($Device, $Reading, ""), -1, "an")) >= $index ? $Max : $index);
  }
  $index+=1;
  my $Spalten = ReadingsVal("d_climaSelect", "Spalten", 2);
  if ( $index ne $Spalten ) {
     InitHzDef($Device,$Definition,$index);
     fhem("setreading d_climaSelect Spalten $index");
  }     
  for ( my $i = 1; $i <= 7; $i++) {
     my $Day = $i . $Arr[$i];
     my $Reading = $Cmd . $Day;
     my $index = heatingVal(ReadingsVal($Device, $Reading, ""), -1, "an");

     for ( my $j = 0; $j <= 5; $j++) {
         my $climaControl = "d_climaControl".($j+1);
         if ( $j <= $index ) {
            my $An = heatingVal(ReadingsVal($Device, $Reading, ""), $j, "an");
            my $Aus = heatingVal(ReadingsVal($Device, $Reading, ""), $j, "aus");
            my $Setting = $Day . ($j+1) . "_start";
            fhem("setreading $climaControl $Setting $An");
            $Setting = $Day . ($j+1) . "_stop";
            fhem("setreading $climaControl $Setting $Aus");
         } else {
            my $Setting = $Day . ($j+1) . "_start";
            fhem("setreading $climaControl $Setting undef");
            $Setting = $Day . ($j+1) . "_stop";
            fhem("setreading $climaControl $Setting undef");                     
         }
     }
  }
  Refresh("WEB");
  return();
}
####################################################################################################################

############################################# DropBoxen Werte löschen/kopieren #######################################
sub ChangeValue($$) {
  my ($CMD,$COLUMN) = @_;
  my $An = "undef";
  my $Aus = "undef";
  my $Index = 1;
  my @Arr = (" ","-Mo","-Tu","-We","-Th","-Fr","-Sa","-Su");
  my $Day = "1" . $Arr[1] . $COLUMN . "_start";
  my $climaControl = "d_climaControl".$COLUMN;

  if ( $CMD eq "copy" ) {
      for ( $Index; $Index <= 7; $Index++ ) {
          $Day = $Index . $Arr[$Index] . $COLUMN . "_start";
          $An = ReadingsVal( $climaControl, $Day, "undef");
          if ( $An eq "undef" ) {
              last;
          }
      }
      $Day = ($Index - 1) . $Arr[$Index-1] . $COLUMN . "_start";
      $An = ReadingsVal( $climaControl, $Day, "undef");
      $Day = ($Index - 1) . $Arr[$Index-1] . $COLUMN . "_stop";
      $Aus = ReadingsVal( $climaControl, $Day, "undef");
  }

  for ( my $i = $Index; $i <= 7; $i++) {
     $Day = $i . $Arr[$i];
     if ( $CMD eq "delete" ) {
        my $Setting = $Day . $COLUMN . "_start";
        fhem("set $climaControl $Setting undef");
        $Setting = $Day . $COLUMN . "_stop";
        fhem("set $climaControl $Setting undef");
     } else {
        my $Setting = $Day . $COLUMN . "_start";
        fhem("set $climaControl $Setting $An");
        $Setting = $Day . $COLUMN . "_stop";
        fhem("set $climaControl $Setting $Aus");
     }
  }
  Refresh("WEB");
  return;
}
####################################################################################################################

######################################### Notifications Heizprogramme  #############################################
sub rg($){
  my ($function) = @_;
  my @Arr = split(/\|/,$function);
  my $value = "";
  my $device = ReadingsVal( "d_climaSelect", "DEVICE", "heizung" );
  my $definition = ReadingsVal( "d_climaSelect", "DEFINITION", "Heizprogramme" );
  if ( $#Arr > 0 ) {
     $function = $Arr[0];
     $function =~ s/$device //g;
     $value = $Arr[1];
  }
  if($function eq "updateTable") {
     # Update
  } elsif($function eq "copy") {
     ####### kopiere Mo-Werte ##########
     ChangeValue($function, $value);
  } elsif($function eq "delete") {
     ####### löschen Spaltenwerte ######
     ChangeValue($function, $value);
  } else {
     ####### Ändern der Heizkreis- oder Heizprog-Werte ########
    my @Cmd = split(/ /,$function);
    my $Definition = $Cmd[0];
    my $value = $Cmd[1];
    my $HzProg = ReadingsVal( "d_climaSelect", "Heizprogramm", "Eigen1");
    my $HzKreis = ReadingsVal( "d_climaSelect", "Heizkreis", "hc2");

    if ( $Definition eq "Heizkreis" || $Definition eq "Heizprogramm" ) {
       if ( $Definition eq "Heizkreis" ) {
          $HzKreis = $value;
          my $Prog = ReadingsVal("c_climaSelect", $HzKreis, "false");
          if ( $Prog eq "false" ) {
              my $Circuits = "heatingCircuits";
              if ( left($value,2) ne "hc" ) {
                 $Circuits = "dhwCircuits";
              }
              $Prog = getHzProgs($value, $Circuits, $device);
          }
          SetListSelect($Prog,$device);       
          my @FirstProg = split(/,/,$Prog);
          $HzProg = $FirstProg[0];
          fhem("set d_climaSelect Heizprogramm $HzProg");
       } else {
          $HzProg = $value;
          fhem("set d_climaSelect Heizprogramm $value");
       }
#    open (DATEI, ">>/opt/fhem/privat/debug.txt");
#    print DATEI "$device $definition  $HzKreis  $HzProg\n";
#    close (DATEI);

       setValue($device,$definition,$HzKreis,$HzProg);
    } elsif ( $Definition eq "Spalten" ) {
       InitHzDef($device,$definition,$value);       
    }
    return();
  }
}

sub checkVal($$) {
  my ($device,$function) = @_;
  if ( left($device,14) ne "d_climaControl" ) {
      return;
  }
  my @function = split(/ /,$function);
  my @tmp = split(/_/,$function[0]);
  my $StartStop = $tmp[1];
  my $Col = right($tmp[0],1);
  if ( $Col eq "1" && $StartStop eq "start") {
      return;
  }

  my $Day = left($tmp[0],4);
  return if ( $function[1] eq "undef" );
  my $Val = (left($function[1],2)*60) + (right($function[1],2)*1);
  my $Val1 = ReadingsVal( ( $StartStop eq "stop" ? $device : left($device,14).($Col-1) ), ( $StartStop eq "stop" ? $Day.$Col."_start" : $Day.($Col-1)."_stop" ), "undef");
  $Val1 = ( $Val1 eq "undef" ? 1440 : (left($Val1,2)*60) + (right($Val1,2)*1));
  my $Val2 = ReadingsVal( ( $StartStop eq "stop" ? left($device,14).($Col+1) : $device ), ( $StartStop eq "stop" ? $Day.($Col+1)."_start" : $Day.$Col."_stop" ), "undef");
  $Val2 = ( $Val2 eq "undef" ? -1 : (left($Val2,2)*60) + (right($Val2,2)*1));
  if ( $Val <= $Val1 || ( $Val >= $Val2 && $Val2 != -1) ) {
     fhem("setreading $device $function[0] undef");
     Refresh("WEB");
  }
  return;
}

######################################## Hilfsfunktionen #########################################################
sub right{
    my ($string,$nr) = @_;
    return substr $string, -$nr, $nr;
}

sub left{
    my ($string,$nr) = @_;
    return substr $string, 0, $nr;
}

sub mid{
    my ($string,$begin,$nr) = @_;
    return substr $string, $begin, $nr;
}
##################################################################################################################

########################################### Auslesen von Heizzeitpunkten #########################################
sub heatingVal($$$) {
  my ($VALUE,$INDEX_TP,$INDEX_SE) = @_;
  if ( $INDEX_SE eq "an" ) {
     $INDEX_SE = 0;
  } elsif ( $INDEX_SE eq "aus" ) {
     $INDEX_SE = 1;
  }
  $VALUE =~ s/ //g;
  $VALUE =~ s/day/:/g;
  $VALUE =~ s/on/:/g;
  $VALUE =~ s/night/-/g;
  $VALUE =~ s/off/-/g;
  $VALUE = left($VALUE, (length($VALUE)-1));

  my @ArrTP1 = split(/-/,$VALUE);
  if ($INDEX_TP gt $#ArrTP1 || $INDEX_TP < 0 ) {
     return $#ArrTP1;
  }
  my @ArrSE = split(/:/,$ArrTP1[$INDEX_TP]);
  return sprintf("%s:%s", left($ArrSE[$INDEX_SE],2), right($ArrSE[$INDEX_SE],2));
}
############################### Ende HeizProgramme #######################################################

sub Refresh($)                                                                     
{                                                                                       
  my ($name) = @_;                                                                     
                                                                                       
  FW_directNotify("#FHEMWEB:$name", "location.reload(true);","" );
}

############################################ Format Values #######################################################
sub ValueFormat($$) {
  my ($READING,$VALUE) = @_;
  SWITCH: {
      $READING eq "/heatSources/actualCHPower" && do { my $Value=(0.25*$VALUE); return (sprintf("%.1f KW<br>(%d %%)", $Value, $VALUE)); last SWITCH; };
      $READING eq "/system/appliance/powerSetpoint"  && do { my $Value=(0.25*$VALUE); return (sprintf("%.1f KW<br>(%d %%)", $Value, $VALUE)); last SWITCH; };
  }
}
##################################################################################################################



Sailor

Hallo zusammen

ich empfehle der Lesbarkeit und Implementierbarkeit wegen ein wenig Formalismus beizubehalten.

Wenn Ihr Code veröffentlich, dann schreibt doch bitte den Namen/Pfad der Datei entsprechend darüber.

Zum Beispiel:

"/FHEM/99_myUtils.pm":

Sub Rabarbar ($Blubber, $Lutsch)
{
}


"/fhem.cfg":

define myQuatsch Soße A B C
attr myQuatsch room Papierkorb


Gruß
    Sailor
******************************
Man wird immer besser...

Jens_B

@Dlindner : Das sieht ja richtig cool aus....
Ich habe hier einen Raum in FHEM für meine Heizung definiert. Meine Buderus hat ein RC35 und ein KM200. Wo füge ich jetzt was wie in FHEM ein, damit das letztlich so aussieht wie bei Dir?


Ich glaube ich muß mich mal wieder etwas mit FHEM befassen und mit dem KM200 Modul... Aber ich habe soviel andere Baustellen...

Gruß
Jens
RaspberryPi 4 (Raspian Buster)FHEM+Homebridge
HMLAN für Homematic
Z-Wave USB Stick
Shelly Devices
Fritz!Box 7590Ax

DLindner

Hallo Jens, ganz so trivial ist das nicht. Die Einstiegsdroge ist das http://www.fhemwiki.de/wiki/Buderus_Web_Gateway#Aktivierung_und_Definition_in_FHEM%20Link. Erst einmal müssen die Grunddefinitionen erstellt werden. alles andere später.
Eine weitere gute Lektüre ist http://www.fhemwiki.de/wiki/ReadingsGroup.

Und zu guter letzt dieses Forum.