2
0
mirror of https://github.com/fhem/fhem-mirror.git synced 2025-04-16 10:46:03 +00:00

Version 1.0

git-svn-id: https://svn.fhem.de/fhem/trunk@672 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
parix 2010-08-09 21:05:14 +00:00
parent 23ea81c825
commit 4255dcffc0

View File

@ -1,7 +1,23 @@
################################################################################
# 98_FHTCONF.pm
#
# Konfiguration von FHTs
# Version: 1.0
# Stand: 08/2010
# Autor: Axel Rieger
# a[PUNKT]r[BEI]oo2p[PUNKT]net
#
# Configure multiple FHT´s
# Usage: define <NAME> FHTCONF
# FHTConf-Name: FHTC01
# Assign FHTROOM...All FHT´s in this Room will be configured
# FHEM: define FHTC01 FHTCONF
# FHEM: attr FHTC01 FHTRoom R01
# Assign FHT-Device to FHTRoom
# FHEM: attr <FHT-Name> room R01
# Get a list of FHT-Devices in FHTRoom:
# FHEM: set FHTC01 A0_FHT_DEVICES
#
# Configuration
#
################################################################################
package main;
@ -9,6 +25,9 @@ package main;
use strict;
use warnings;
use Data::Dumper;
use vars qw(%data);
use vars qw(%cmds);
use vars qw(%attr);
# FHEM Command to Update FHTs
sub Commandfhtconf($);
################################################################################
@ -17,9 +36,8 @@ sub FHTCONF_Initialize($)
my ($hash) = @_;
$hash->{SetFn} = "FHTCONF_Set";
$hash->{StateFn} = "FHTCONF_SetState";
$hash->{DefFn} = "FHTCONF_Define";
$hash->{AttrList} = "loglevel:0,5 disable:0,1 SendIntervall";
$hash->{AttrList} = "loglevel:0,5 disable:0,1 FHTRoom";
# FHEM Command to Update FHTs
$cmds{fhtconf}{Fn} = "Commandfhtconf";
$cmds{fhtconf}{Hlp} = "FHTCONF[HELP]: fhtconf <FHTCONF-NAME>";
@ -30,49 +48,10 @@ sub FHTCONF_Initialize($)
sub FHTCONF_Define($)
{
my ($hash, @a) = @_;
Log 0, "FHTCONF|DEFINE|Anzahl ARG: " . int(@a);
return "Wrong syntax: use define <name> fht_conf" if(int(@a) !=1 );
# Default Room
my $room = "GRP.FHTCONF";
# INIT READINGs
# FHT's
$hash->{READINGS}{A0_FHT_DEVICES}{TIME} = TimeNow();
$hash->{READINGS}{A0_FHT_DEVICES}{VAL} = "";
#Mode
# Values auto, manual, holiday or holiday_short
$hash->{READINGS}{A1_mode}{TIME} = TimeNow();
$hash->{READINGS}{A1_mode}{VAL} = "auto";
# Temperaturen...defualt 5.5 = disable
$hash->{READINGS}{A2_day_temp}{TIME} = TimeNow();
$hash->{READINGS}{A2_day_temp}{VAL} = "5.5";
$hash->{READINGS}{A2_night_temp}{TIME} = TimeNow();
$hash->{READINGS}{A2_night_temp}{VAL} = "5.5";
$hash->{READINGS}{A2_windowopen_temp}{TIME} = TimeNow();
$hash->{READINGS}{A2_windowopen_temp}{VAL} = "5.5";
# LowTemp-Offest
$hash->{READINGS}{A2_lowtemp_offset}{TIME} = TimeNow();
$hash->{READINGS}{A2_lowtemp_offset}{VAL} = "2.0";
# Montag = Monday
$hash->{READINGS}{B0_MONTAG}{TIME} = TimeNow();
$hash->{READINGS}{B0_MONTAG}{VAL} = "24:00|24:00";
# Dienstag = Tuesday
$hash->{READINGS}{B1_DIENSTAG}{TIME} = TimeNow();
$hash->{READINGS}{B1_DIENSTAG}{VAL} = "24:00|24:00";
# Mittwoch = Wednesday
$hash->{READINGS}{B2_MITTWOCH}{TIME} = TimeNow();
$hash->{READINGS}{B2_MITTWOCH}{VAL} = "24:00|24:00";
# Donnerstag = Thursday
$hash->{READINGS}{B3_DONNERSTAG}{TIME} = TimeNow();
$hash->{READINGS}{B3_DONNERSTAG}{VAL} = "24:00|24:00";
# Freitag = Friday
$hash->{READINGS}{B4_FREITAG}{TIME} = TimeNow();
$hash->{READINGS}{B4_FREITAG}{VAL} = "24:00|24:00";
# Samstag = Saturday
$hash->{READINGS}{B5_SAMSTAG}{TIME} = TimeNow();
$hash->{READINGS}{B5_SAMSTAG}{VAL} = "24:00|24:00";
# Sonntag = Sunday
$hash->{READINGS}{B6_SONNTAG}{TIME} = TimeNow();
$hash->{READINGS}{B6_SONNTAG}{VAL} = "24:00|24:00";
my $name = $hash->{NAME};
#Room
$attr{$name}{room} = $room;
@ -81,38 +60,41 @@ sub FHTCONF_Define($)
return undef;
}
################################################################################
sub FHTCONF_SetState($)
{
my ($hash, $tim, $vt, $val) = @_;
Log 0,"FHTCONF SETSTATE: ". Dumper(@_);
return undef;
}
################################################################################
sub FHTCONF_Set($)
{
my ($hash, @a) = @_;
Log 0, "FHTCONF DEFINE Anzahl ARG: " . int(@a);
# 4 Argumente
# 1. Device Selbst als HASH
# $a[0] => Device Name als String
# $a[1] => Reading
# $a[2] => Value for READING
return "Unknown argument $a[1], choose one of ". join(" ",sort keys %{$hash->{READINGS}}) if($a[1] eq "?");
my $fields;
$fields = join(" ",sort keys %{$hash->{READINGS}});
$fields = "A1_mode A2_day_temp A2_night_temp ";
$fields .= "A2_windowopen_temp A2_lowtemp_offset ";
$fields .= "B0_MONTAG B1_DIENSTAG B2_MITTWOCH B3_DONNERSTAG B4_FREITAG B5_SAMSTAG B6_SONNTAG ";
return "Unknown argument $a[1], choose one of ". $fields if($a[1] eq "?");
# A0_FHT_DEVICES => List of FHT-Devices seperated by -------------------------
my ($name,$room);
$name = $hash->{NAME};
# LogLevel
my $ll = 0;
if(defined($attr{$name}{loglevel})) {$ll = $attr{$name}{loglevel};}
# INIT READINGS
if(!defined($defs{$name}{READINGS}{Z0_INIT})) {
&FHTCONF_init_READINGS($name);
}
# A0_FHT_DEVICES => List of FHT-Devices in Room <FHTRoom>
if($a[1] eq "A0_FHT_DEVICES") {
Log 0, "FHTCONF[SET] => FHT_DEVICES = $a[1]";
if($a[2] =~ /\|/) {
my @fht_devices = split(/\|/,$a[2]);
foreach my $device (@fht_devices){
if (!defined($defs{$device}) || $defs{$device}{TYPE} ne "FHT") {
return "FHTCONF[ERROR] => $device => Is Not defined or a FHT-DEVICE";}
}
}
else {
if (!defined($defs{$a[2]}) || $defs{$a[2]}{TYPE} ne "FHT") {
return "FHTCONF[ERROR] => $a[2] => Is Not defined or a FHT-DEVICE";}
if(defined($attr{$name}{FHTRoom})){
$room = $attr{$name}{FHTRoom};
my $fht_devices = GetDevType_Room($room);
Log 0, "FHTCONF[SET] => FHT_DEVICES Room:$room -> " . $fht_devices;
$a[2] = $fht_devices;
}
else {return "FHTCONF[ERROR] no FHTRoom defined";}
}
# A1_mode FHT Modes ----------------------------------------------------------
if($a[1] eq "A1_mode") {
@ -138,7 +120,7 @@ sub FHTCONF_Set($)
if($a[1] =~ /^B/) {
# Time Values
# Sort-Array @b = sort(@b)
# Values = 12:00;13:00 => mindestens 2 maximal 4; kein Wert über 24
# Values = 12:00;13:00 => mindestens 2 maximal 4; kein Wert über 24
my @times = split(/\|/,$a[2]);
Log 0, "FHT_TIMES[INFO] times = " . @times;
if (@times ne 2 && @times ne 4) {
@ -147,6 +129,9 @@ sub FHTCONF_Set($)
if (not ($time =~ /([01][0-9]:[0-4])|[0-5][0-9]/) ) {
return "FHT_TIMES[ERROR] $time => 00:00";}
}
# Allwas 4 Values 24:00|24:00|24:00|24:00
if(@times == 2) {push(@times,"24:00");}
if(@times == 3) {push(@times,"24:00");}
# Sort
@times = sort(@times);
$a[2] = join("|", @times);
@ -182,6 +167,18 @@ sub Commandfhtconf($)
$ll = $attr{$dn}{'loglevel'};
}
Log $ll, "FHTCONF-CMD: $dn";
# FHT_Devices
my ($room,$device_list_reading);
if(defined($attr{$dn}{FHTRoom})){
$room = $attr{$dn}{FHTRoom};
$device_list_reading = GetDevType_Room($room);
$defs{$dn}{READINGS}{A0_FHT_DEVICES}{VAL} = $device_list_reading;
$defs{$dn}{READINGS}{A0_FHT_DEVICES}{TIME} = TimeNow();
}
else {
Log 0,"FHTCONF[ERROR] no FHTRoom defined";
return undef;
}
#-----------------------------------------------------------------------------
# Building FHEM-Commands to send
# fhem "set <DAVEICE-NAME> params
@ -213,65 +210,114 @@ sub Commandfhtconf($)
}
# FHT-Devices ----------------------------------------------------------------
my (@fht_devices,$fht);
my $device_list_reading = $defs{$dn}{READINGS}{A0_FHT_DEVICES}{VAL};
Log $ll ,"FHTCONF $dn update FHT-DEVICES: $device_list_reading";
if($device_list_reading eq ""){
Log 0 ,"FHTCONF-CMD $dn: NO FHT-DEVICES";
Log $ll ,"FHTCONF-CMD $dn: NO FHT-DEVICES";
return undef;}
@fht_devices = split(/\|/,$device_list_reading);
# Send Commands via at-Jobs --------------------------------------------------
# SendIntervall = $sn Default 5 sec
my ($sn,$p,$old,$new,$at_time,$at_name,$tsecs,$i,$sec,$min,$hour,$mday,$month);
$sn = 5;
if(defined($attr{$dn}{SendIntervall})){
$sn = $attr{$dn}{SendIntervall};
}
$tsecs = time() + $sn;
my ($sec,$min,$hour,$mday,$month,$year,$wday,$yday,$isdst) = localtime(time());
my ($p,$old,$new,$at_time,$at_name,$tsecs);
# SendList
my $fhemcmd = "";
foreach $fht (@fht_devices){
$i = 1;
foreach $p (sort keys %params){
# Send only Changes
$old = $defs{$fht}{READINGS}{$p}{VAL};
$new = $params{$p};
Log $ll, "FHTCONF-CMD-OLD: $fht -> $p -> OLD:$old NEW:$new";
if($old ne $new){
($sec,$min,$hour) = (localtime($tsecs))[0..2];
$at_time = sprintf("%02d:%02d:%02d\n",$hour,$min,$sec);
$at_name = $fht . "_AT_" . sprintf("%02d",$i);
if(defined($defs{$at_name})){fhem "delete $at_name";}
fhem "define $at_name at $at_time set $fht $p $new";
fhem "attr $at_name room GRP.FHTCONF";
$tsecs = $tsecs + $sn;
$i++
# Commands to Send
$fhemcmd .= " $p $new";
}
}
# Report 1
$tsecs = $tsecs + $sn + 120;
($sec,$min,$hour) = (localtime($tsecs))[0..2];
$at_time = sprintf("%02d:%02d:%02d\n",$hour,$min,$sec);
$at_name = $fht . "_AT_REP1";
if(defined($defs{$at_name})){fhem "delete $at_name";}
fhem "define $at_name at $at_time set $fht report1 255";
fhem "attr $at_name room GRP.FHTCONF";
# Send Out
if($fhemcmd ne "") {
my $cmd = "set $fht" . $fhemcmd;
Log $ll, "FHTCONF-CMD-SEND: $fhemcmd";
fhem $cmd;
#Reset
$fhemcmd = "";
$cmd = "";
}
else {Log 0, "FHTCONF-CMD-SEND: No Changes";}
# Report 2
$tsecs = $tsecs + 120;
($sec,$min,$hour) = (localtime($tsecs))[0..2];
$at_time = sprintf("%02d:%02d:%02d\n",$hour,$min,$sec);
$at_name = $fht . "_AT_REP2";
if(defined($defs{$at_name})){fhem "delete $at_name";}
fhem "define $at_name at $at_time set $fht report2 255";
fhem "attr $at_name room GRP.FHTCONF";
fhem "set $fht report2 255";
# FHT Time
$tsecs = $tsecs + 120;
($sec,$min,$hour,$mday,$month) = (localtime($tsecs))[0..4];
$at_time = sprintf("%02d:%02d:%02d\n",$hour,$min,$sec);
$at_name = $fht . "_AT_FHTTIME";
if(defined($defs{$at_name})){fhem "delete $at_name";}
fhem "define $at_name at $at_time set $fht hour $hour day $mday month $month";
fhem "attr $at_name room GRP.FHTCONF";
fhem "set $fht hour $hour day $mday month $month";
}
# Set STATE
$defs{$dn}{STATE} = "LastUpdate ". TimeNow();
return undef;
}
################################################################################
sub GetDevType_Room($){
# Get All Dives By Type from Room
# Params: GetDevType_Room <ROOM>
# GetDevType_Room
# Return: List of Devices seperated by | <PIPE>
my ($room) = @_;
my $type = "FHT";
if(!defined($room)) {return "GetDevType_ROOM[ERROR]: No Room";}
if(!defined($type)) {return "GetDevType_ROOM[ERROR]: No Type";}
my (@devices);
foreach my $d (sort keys %attr) {
if($defs{$d}{TYPE} eq $type && $attr{$d}{room} =~ /$room/ ) {
push(@devices,$d);
}
}
return join("|",@devices);
}
################################################################################
sub FHTCONF_init_READINGS($) {
my ($name) = @_;
Log 0,"FHTCONF:$name ------INIT--------------";
# Set DEFAULT Values
# FHT's
$defs{$name}{READINGS}{A0_FHT_DEVICES}{TIME} = TimeNow();
$defs{$name}{READINGS}{A0_FHT_DEVICES}{VAL} = "";
#Mode
# Values auto, manual, holiday or holiday_short
$defs{$name}{READINGS}{A1_mode}{TIME} = TimeNow();
$defs{$name}{READINGS}{A1_mode}{VAL} = "auto";
# Temperaturen...defualt 5.5 = disable
$defs{$name}{READINGS}{A2_day_temp}{TIME} = TimeNow();
$defs{$name}{READINGS}{A2_day_temp}{VAL} = "5.5";
$defs{$name}{READINGS}{A2_night_temp}{TIME} = TimeNow();
$defs{$name}{READINGS}{A2_night_temp}{VAL} = "5.5";
$defs{$name}{READINGS}{A2_windowopen_temp}{TIME} = TimeNow();
$defs{$name}{READINGS}{A2_windowopen_temp}{VAL} = "5.5";
# LowTemp-Offest
$defs{$name}{READINGS}{A2_lowtemp_offset}{TIME} = TimeNow();
$defs{$name}{READINGS}{A2_lowtemp_offset}{VAL} = "2.0";
# Montag = Monday
$defs{$name}{READINGS}{B0_MONTAG}{TIME} = TimeNow();
$defs{$name}{READINGS}{B0_MONTAG}{VAL} = "24:00|24:00|24:00|24:00";
# Dienstag = Tuesday
$defs{$name}{READINGS}{B1_DIENSTAG}{TIME} = TimeNow();
$defs{$name}{READINGS}{B1_DIENSTAG}{VAL} = "24:00|24:00|24:00|24:00";
# Mittwoch = Wednesday
$defs{$name}{READINGS}{B2_MITTWOCH}{TIME} = TimeNow();
$defs{$name}{READINGS}{B2_MITTWOCH}{VAL} = "24:00|24:00|24:00|24:00";
# Donnerstag = Thursday
$defs{$name}{READINGS}{B3_DONNERSTAG}{TIME} = TimeNow();
$defs{$name}{READINGS}{B3_DONNERSTAG}{VAL} = "24:00|24:00|24:00|24:00";
# Freitag = Friday
$defs{$name}{READINGS}{B4_FREITAG}{TIME} = TimeNow();
$defs{$name}{READINGS}{B4_FREITAG}{VAL} = "24:00|24:00|24:00|24:00";
# Samstag = Saturday
$defs{$name}{READINGS}{B5_SAMSTAG}{TIME} = TimeNow();
$defs{$name}{READINGS}{B5_SAMSTAG}{VAL} = "24:00|24:00|24:00|24:00";
# Sonntag = Sunday
$defs{$name}{READINGS}{B6_SONNTAG}{TIME} = TimeNow();
$defs{$name}{READINGS}{B6_SONNTAG}{VAL} = "24:00|24:00|24:00|24:00";
# INIT done
$defs{$name}{READINGS}{Z0_INIT}{VAL} = 1;
$defs{$name}{READINGS}{Z0_INIT}{TIME} = TimeNow();
return undef;
}
1;