Autor Thema: weekprofile für Homematic- Templates (über HMinfo-Heizungstemplates) nutzen  (Gelesen 771 mal)

Offline JoeALLb

  • Hero Member
  • *****
  • Beiträge: 1102
Für Homematic-Heizungsaktoren gibt es über HMinfo die Möglichkeit, einfach Templates zu nutzen.
Leider müssen diese als etxtdateien definiert werden.

weekprofile wurde hauptsächlich für MAX-Geräte entwickelt, es bietet jedoch auch für Homematic-Geräte eine "send-to" funktion.

Wer jedoch lieber die Templates nutzt, um auch Funktraffik zu sparen, konnte weekprofile  bisher nicht nutzen.

Anbei nun ein Codeschnipsel, mit welchem man über ein Userreading eine Templatedatei schreiben kann.

Edit: Habe den Code entfernt, da weiter unten eine verbesserte Variante gepostet wurde.

Ebentuell möchte man dies noch um ein

set hm tempListG restoreergänzen, um jede Änderung direkt automatischh an die Thermostate zu schicken.
Wenn jemand den Perl-Code effizienter hin bekommt, freue ich mich über Rückmeldungen!

Viel Spaß!
« Letzte Änderung: 09 Oktober 2017, 10:38:06 von JoeALLb »
FHEM-Server auf IntelAtom+Debian (12 Watt),
RasPi-2 Sonos-FHEM per FHEM2FHEM,RasPi-3 Versuchs-RasPi für WLAN-Tests
Gateways: DuoFern Stick, CUL866 PCA301, CUL HM, HMLan, JeeLink, LaCrosse,VCO2
Synology. Ardurino UNO für 1-Wire Tests, FB7270
Hilfreich Hilfreich x 1 Liste anzeigen

Offline HeikoE

  • Jr. Member
  • **
  • Beiträge: 61
Hallo JoeALLb,

Danke für das Skript. Mit zwei for-Schleifen sieht es so aus:
HM_Info {
  my $confFile = "./FHEM/wochenplan-tempList.cfg";
  my $entit = fhem("get $name profile_names");
  my $ret="\#               bis   Soll bis   Soll bis   Soll bis   Soll\n";
  my @lines = split /,/, $entit;
  my @D = ("Sat","Sun","Mon","Tue","Wed","Thu","Fri");
  my ($text,$tmp)="";
  foreach my $Raum (@lines)  {
      $tmp = fhem("get $name profile_data $Raum");
      $text = decode_json($tmp);
      $ret.="entities:".$Raum."\n";
      for my $i (0..6) {
          $ret.="R_".$i."_tempList".$D[$i].">";
          for my $j (0..7) {
              $ret.=$text->{$D[$i]}{'time'}[$j]." ".$text->{$D[$i]}{'temp'}[$j]." ";
              }
      $ret.="\n";
      }
  }
  open IMGFILE, '>'.$confFile;
  print IMGFILE $ret;
  close IMGFILE;
  return "HMinfo configTempFile written to $confFile"   
}

Meine templist.cfg sieht so aus:
entities:Bad_Unten
R_0_tempListSat>07:30 17.0 22:00 21.0 24:00 17.0
R_1_tempListSun>07:30 17.0 22:00 21.0 24:00 17.0
R_2_tempListMon>06:30 17.0 08:30 21.0 12:00 18.0 22:00 21.0 24:00 17.0
R_3_tempListTue>06:30 17.0 08:30 21.0 12:00 18.0 22:00 21.0 24:00 17.0
R_4_tempListWed>06:30 17.0 08:30 21.0 12:00 18.0 22:00 21.0 24:00 17.0
R_5_tempListThu>06:30 17.0 08:30 21.0 12:00 18.0 22:00 21.0 24:00 17.0
R_6_tempListFri>06:30 17.0 08:30 21.0 11:30 18.0 22:00 21.0 24:00 17.0

Ich habe also die Reihenfolge der Tage geändert und das "R_[0..6]_" am Anfang hinzugefügt.
Das entspricht den Namen der Readings im <..>_Clima. Ob das nötig ist, weiss ich nicht.

Eine Frage noch zu Deinem Code:
Die Entity-Liste holst Du mit
fhem("get HeizungWochenplan profile_names")aus dem Device "HeizungWochenplan". Das UserReading gehört zun Device "weekplan", aus dem Du über $name die Profildaten holst.
Das scheint mir nicht ganz zu passen. Ich habe beide Male $name verwendet.

Gruß Heiko

PS. Ich habe den Code aus dem Web-Interface kopiert, dann entallen die ganzen Maskierungen

Offline HeikoE

  • Jr. Member
  • **
  • Beiträge: 61
Leider steht im Log jedes Mal
2017.10.07 13:02:53 1: PERL WARNING: Use of uninitialized value in concatenation (.) or string at (eval 71090) line 15.
Es gibt also noch Optimierungspotential...  ;)

Offline JoeALLb

  • Hero Member
  • *****
  • Beiträge: 1102
Hallo Heiko,

danke :D

Hm, ein if defined um die Variable sollte helfen,

mit

M_Info {
  my $confFile = "./FHEM/wochenplan-tempList.cfg";
  my $entit = fhem("get $name profile_names");
  my $ret="\#               bis   Soll bis   Soll bis   Soll bis   Soll\n";
  my @lines = split /,/, $entit;
  my @D = ("Sat","Sun","Mon","Tue","Wed","Thu","Fri");
  my ($text,$tmp)="";
  foreach my $Raum (@lines)  {
      $tmp = fhem("get $name profile_data $Raum");
      $text = decode_json($tmp);
      $ret.="entities:".$Raum."\n";
      for my $i (0..6) {
          $ret.="R_".$i."_tempList".$D[$i].">";
          for my $j (0..7) {
              if (defined $text->{$D[$i]}{'time'}[$j]) {
              $ret.=$text->{$D[$i]}{'time'}[$j]." ".$text->{$D[$i]}{'temp'}[$j]." ";
              } }
      $ret.="\n";
      }
  }
  open IMGFILE, '>'.$confFile;
  print IMGFILE $ret;
  close IMGFILE;
  return "HMinfo configTempFile written to $confFile"   
}

konnte ich jetzt mal kein Warning mehr produzieren.
FHEM-Server auf IntelAtom+Debian (12 Watt),
RasPi-2 Sonos-FHEM per FHEM2FHEM,RasPi-3 Versuchs-RasPi für WLAN-Tests
Gateways: DuoFern Stick, CUL866 PCA301, CUL HM, HMLan, JeeLink, LaCrosse,VCO2
Synology. Ardurino UNO für 1-Wire Tests, FB7270

Offline HeikoE

  • Jr. Member
  • **
  • Beiträge: 61
Bingo!
wieder was gelernt.
Schöne Grüße

Offline HeikoE

  • Jr. Member
  • **
  • Beiträge: 61
Hallo,

ich habe noch etwas gebastelt, um  Profile vorhandener Thermostate in den Profileditor zu übernehmen:
Der Profileditor ist angelegt mittels
define KG.HZ.Profile weekprofileZusätzlich habe ich eine Instanz mit Mastergerät angelegt:
define test1 weekprofile OG.SZ.Heizung_Clima
Um die Profildaten in den Profileditor zu kopieren, dient folgendes Script in der "99_myUtils.pm".
Der Name der Entity wird aus dem Reading "tempListTmpl" des zu kopierenden Thermostaten geholt. Dieser wird indirekt über das Internal DEF der Masterinstanz ermittelt:
#############################
###  Thermostat kopieren  ###
#############################

sub kopieren () {
    #Templatenamen aus dem Thermostat holen
    my $Name = AttrVal(InternalVal("test1","DEF",0),"tempListTmpl",1);
    #Profil aus dem Thermostat
    my $daten = fhem("get test1 profile_data master");
   
    #Profil zum Editor hinzufügen
    fhem("set KG.HZ.Profile profile_data ".$Name." ".$daten);
}


Dann einfach
{kopieren()}
ausführen. Die Masterinstanz dann nacheinander mit allen vorhandenen Thermostaten verlinken (Klick auf DEF und Gerätenamen anpassen) und jeweils kopieren.

Gruß Heiko