weekprofile für Homematic- Templates (über HMinfo-Heizungstemplates) nutzen

Begonnen von JoeALLb, 13 April 2017, 12:09:28

Vorheriges Thema - Nächstes Thema

JoeALLb

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 restore
ergä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ß!
FHEM-Server auf IntelAtom+Debian (8.1 Watt), KNX,
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

HeikoE

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

HeikoE

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...  ;)

JoeALLb

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 (8.1 Watt), KNX,
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

HeikoE


HeikoE

Hallo,

ich habe noch etwas gebastelt, um  Profile vorhandener Thermostate in den Profileditor zu übernehmen:
Der Profileditor ist angelegt mittels
define KG.HZ.Profile weekprofile
Zusä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

Beta-User

Hallo zusammen,

sorry, wenn ich diese Leiche hier wiederbelebe...

Habe den Code hier gefunden, weil ich auch auf weekprofile umstellen wollte.
Danke erst mal für die klasse Vorarbeit!

Habe dann das ganze noch etwas erweitert, Details sind hier zu finden: https://forum.fhem.de/index.php/topic,97430.msg1100788.html#msg1100788

Ergänzend evtl. der Hinweis: weekprofile bietet für CUL_HM-Thermostate auch die Möglichkeit, direkt das gerade laufende Wochenprofil zu importieren (aber eben nur das laufende, jedenfalls, wenn ich das richtig verstanden habe); anschließend kann man das beliebig kopieren oder umbenennen.

Grüße, Beta-User
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files