Hallo, ich benutze FS20V (die analoge Messung der Hardware FS20S8M)
und bitte höflichst um folgende Ergänzungen in der 00_CUL.pm:
my $clientsSlowRF = ":FS20V:FS20:FHT.*:KS300:USF1000:BS:HMS: ".
...
my %matchListSlowRF = (
"0:FS20V" => "^81..(04|0c)..0101a001......00(8|9|a|b|c|d|e|f)...",
"1:USF1000" => "^81..(04|0c)..0101a001a5ceaa00....",
- ich finde kein *_FS20V.pm im FHEM Ordner.
- bist Du sicher, das die Codes [89a-f]. von USF1000 nicht verwendet werden?
Artikel dazu: https://forum.fhem.de/index.php/topic,24204.msg173444.html#msg173444
FS20V
Das FS20 Protokoll wird mit diesem Modul erweitert und für die Auswertung eines 15 Bit Messwert verwendet (Bef >= h80 + Erw.). Das Modul wurde für das FS20S8M mit Spezialfirmware (siehe fhem Forum) geschrieben, kann aber auch fuer andere Mikrocontroller Projekte mit FS20 Protokoll verwendet werden. Die Nachrichten (868.35 MHz) können mit einem FHZ oder einem CUL empfangen werden. Dieses muss daher zuerst definiert werden.
FS20 Telegrammaufbau:
Synchr;HC1;Parity;HC2;Parity;Adresse;Parity;Befehl;Parity;Erweiterung;Parity;Quersumme;Parity;EOT
13 bit;8 bit;1 bit;8 bit;1 bit;8 bit;1 bit;8 bit;1 bit;8 bit;1 bit;8 bit;1 bit;1 bit
Kennung fuer Messwert:
Im Byte Befehl steht Codiert der Typ des Befehls z.B on, off, toggle usw.
Der Messwert (15Bit 0-32767) befindet sich im Byte Befehl (Highbyte 7 Bit) und Erweiterung (Lowbyte 8 Bit)
Das höchstwertige Bit im Befehl wird als Kennung für die Messswertübertragung gesetzt.
Define
define <name> FS20V <housecode> <adresse> <bit>
Die Werte housecode und Adresse, können hexadezimal eingegeben werden. Der Wert adresse, wird als 1. Messwertadresse des FS20S8M Modul verwendet.
<housecode> ist eine 4 stellige Hex Zahl, entsprechend der Hauscode Adresse.
<adresse> ist eine 2 stellige Hex Zahl, entsprechend der Messwertadresse des Moduls.
<bit> ist eine 4 stellige Hex Zahl, entsprechend der Adresse der Bitauswertung on und off.
Beispiele:
define FS20S8M_0 FS20V 1234 01 ,Wertanzeige
define FS20S8M_1 FS20V 1234 01 0001 ,Bitauswertung Bit0 TA1 on off
define FS20S8M_2 FS20V 1234 01 0002 ,Bitauswertung Bit1 TA2 on off
define FS20S8M_3 FS20V 1234 01 8002 ,Bitauswertung Bit1 TA2 invertiert off on
define FS20S8M_4 FS20V 1234 01 0003 ,Bitauswertung Bit2 TA3 on off
usw.
Set
set <name> <value>
Der Ganzzahlenwert wird zu einem FS20 Gerät gesendet z.B. zu einem Display. Der zulaessige Bereich ist 0-32767, es erfolgt "keine" interne Berechnung. Attribut model FS20Set).
Bei Zählwerten (Attribut ValCounter > 0), kann der internen Zaehlerstand gesetzt werden. z.B. bei S0.
Beispiele:
set sendstate 123
Get
N/A
Attribute
IODev
Setzt das IO oder das physische Device welches zum Senden der Signale an dieses logische Device verwendet werden soll (Beispielsweise FHZ oder CUL). Hinweis: Beim Start weist FHEM jedem logischen Device das letzte physische Device zu, das Daten von diesem Typ empfangen kann. Das Attribut IODev muss nur gesetzt werden wenn mehr als ein physisches Device fähig ist Signale von diesem logischen Device zu empfangen.
dummy
Setzt das Attribut dummy um Devices zu definieren, die keine Funksignale absetzen. Zugehörige notifys werden ausgeführt wenn das Signal empfangen wird. Wird beispielsweise genutzt um auf Code eines Sender zu reagieren, dennoch wird es auch dann kein Signal senden wenn es im Web Frontend getriggert wird.
model
Das "model" Attribut bezeichnet den Modelltyp des Gerätes. Nur das model "FS20Set" sendet zum Gerät, alle anderen Geräte aktualisierung nur den Wert "state". Das Attribut kann zusätzlich von externen Programmen oder Webinterfaces genutzt werden.
Beispiel:
attr FS20S8M model FS20Value
attr FS20S8M model FS20Count
attr FS20S8M model FS20Set (sendet aktiv, Ganzzahlenwerte 0-32767)
FS20V_Resistor
Skalierung des Messwertes als Widerstandsgeber. Der Wert dieses Attributes wird beim FS20S8M Modul auf 220000 gesetzt (Interner Widerstand 220KOhm auf der Platine des Moduls). Der errechnete Wert ist der gemessene Widerstand am AD Port in Ohm. Die Aenderung des Messwertes sollte sich im KOhm Bereich befinden z.B. Poti 100-470 KOhm. Liegt der Wert ausserhalb den Bereichen, dann wird die Messung zu ungenau.
Beispiel:
attr FS20S8M FS20V_Resistor 220000
FS20V_Counter
Summierung eines Messwertes als Zaehler z.B. S0. Der Wert dieses Attributes wird beim FS20S8M Modul auf 30000 gesetzt (Zaehlerueberlauf bei 30000). Der errechnete Wert ist die Gesamtsumme aller Impulse. Um Fehler bei Zaehlerueberlaefen zu verhindern, wird der empfangene Wert "0" nicht gewertet (z.B. beim Neustart des FS20S8M Modul).
Beispiel:
attr FS20S8M FS20V_Counter 30000 (bei ValueDPoint 0)
attr FS20S8M FS20V_Counter 3000 (bei ValueDPoint 1)
attr FS20S8M FS20V_Counter 300 (bei ValueDPoint 2)
attr FS20S8M FS20V_Counter 30 (bei ValueDpoint 3)
FS20V_Tab
Die Messwertskalierung erfolgt ueber eine Liniarisierungstabelle. Der Wert dieses Attributes gibt die Datei an, in der sich die Liniarisierungsstützpunkte befinden. Die Datei muss sich im selben Verzeichnis wie die *.cfg Datei befinden. Der errechnete Wert wird aus den Liniariesierungs Stuetzpunkten der Tabelle errechnet. Die Tabelle kann aus mehreren Zeilen bestehen (mindesten 2) mit jeweil 2 Werten in einer Zeile. Die Werte werden mit Leerzeichen getrennt. Links befindet sich der Rohwert und rechts das Ergebnis fuer die Berechnung. Befindet sich der Rohwert zwischen zwei Stützpunkten, dann wird der Wert zwischen den Stützpunkten liniar berechnet. Der Dateiname muss die Endung .tab besitzen. Es können verschiedene Tabellen erstellt und verwendet werden. Z.B. pt100.tab, LDR_LUX.tab usw.
tabelle.tab 0-3V = -30 bis +40
0 -30
300 -15
512 0
700 20
1023 40
usw.
Beispiel:
attr FS20S8M FS20V_LinearTab tabelle.tab
FS20V_Offset
Der Wert Offset wird vom Messwert Subtrahiert. Bei Angabe eines negativen Vorzeichen, wird der Wert zum Messwert Addiert.
Beispiel:
attr FS20S8M FS20V_Offset 20.5
attr FS20S8M FS20V_Offset -10.2 (- x - = Addition)
FS20V_Factor
Der Wert Factor wird mit dem errechneten Messwert Multipliziert. Bei Angabe eines negativen Vorzeichen, wird der Wert ins Negative gerechnet.
Beispiel:
attr FS20S8M FS20V_Offset 123.4
attr FS20S8M FS20V_Offset -10 (Berechnung ins Negative, Wert 0=100 Wert 10=0)
FS20V_Min
Der errechnete Messwert wird auf Unterschreitung ueberprueft und begrenzt.
Beispiel:
attr FS20S8M FS20V_Min 100.0
attr FS20S8M FS20V_Min -100.0
FS20V_Max
Der errechnete Messwert wird auf Ueberschreitung ueberprueft und begrenzt.
Beispiel:
attr FS20S8M FS20V_Max 100.0
attr FS20S8M FS20V_Max -100.0
FS20V_Dpoint
Der errechnete Messwert wird mit Dezimalstellen ausgegeben.
Beispiel:
attr FS20S8M FS20V_Dpoint 1
attr FS20S8M FS20V_Dpoint 3
FS20V_Key
Dem errechnete Messwert wird eine Kennung vorangestellt.
Beispiel:
attr FS20S8M FS20V_Key L:
attr FS20S8M FS20V_Key T:
FS20V_Unit
Der errechnete Messwert wird mit der Einheit ausgegeben.
Beispiel:
attr FS20S8M FS20V_Unit KWh
attr FS20S8M FS20V_Unit %
attr FS20S8M FS20V_Unit m
FS20V_Reading
Erzeugt ein zusätzliches Reading "dbvalue" im Format für DBLog. (dbvalue: 98: W/m²) define DBLOG DbLog ./db.conf (.*:temperature.*|.*:humidity.*|.*:wind.*|.*:*.rain.*|.*:dbvalue.*) Erzeugt ein zusätzliches Reading "beliebige Bezeichnung" es wird nur der Wert ausgegeben.
Beispiel:
attr FS20S8M FS20V_Reading dbvalue
attr FS20S8M FS20V_Reading Wind
------------------------------------------------------------------------------------------------------------------------------------
##########################################################
# $Id: 09_FS20V.pm 0016 2016-02-22 00:00:00Z M.Braun $
# Module for FHEM to send and receive FS20 Message via CUL
#
# { `perl contrib/commandref_join.pl` }
# /opt/fhem perl contrib/commandref_join.pl
#
################################################################
package main;
use strict;
use warnings;
use SetExtensions;
use vars qw(%fs20_c2b);
##########################################################
sub
FS20V_Initialize($)
{
my ($hash) = @_;
$hash->{Match} = "^81..(04|0c)..0101a001......00(8|9|a|b|c|d|e|f)...";
$hash->{SetFn} = "FS20V_Set";
$hash->{DefFn} = "FS20V_Define";
$hash->{UndefFn} = "FS20V_Undef";
$hash->{ParseFn} = "FS20V_Parse";
$hash->{AttrList} = "IODev do_not_notify:1,0 ignore:1,0 dummy:1,0 $readingFnAttributes ".
"FS20V_Resistor FS20V_Counter FS20V_LinearTab FS20V_Offset FS20V_Key FS20V_Factor ".
"FS20V_Min FS20V_Max FS20V_Dpoint FS20V_Unit FS20V_Reading ".
"model:FS20Value,FS20Count,FS20Set";
}
##########################################################
sub
FS20V_Define($$)
{
my ($hash, $def) = @_;
my @a = split("[ \t][ \t]*", $def);
my $u = "wrong syntax: define <name> FS20V housecode adr";
return $u if(int(@a) < 4);
$u = "Define $a[0]: wrong housecode format: specify a 4 digit hex value";
return $u if($a[2] !~ m/^[a-f0-9]{4}$/i);
$u = "Define $a[0]: wrong btn format: specify a 2 digit hex value";
return $u if($a[3] !~ m/^[a-f0-9]{2}$/i);
$hash->{XMIT} = lc($a[2]);
$hash->{BTN} = lc($a[3]);
# Bitauswertung aktiv
if($a[4]) {
$u = "Define $a[0]: wrong bit format: specify a 4 digit hex value";
return $u if($a[4] !~ m/^[a-f0-9]{4}$/i);
$hash->{BIT} = lc($a[4]);
}
my $code = lc("$a[2] $a[3]");
my $ncode = 1;
my $name = $a[0];
$hash->{CODE}{$ncode++} = $code;
$modules{FS20V}{defptr}{$code}{$name} = $hash;
AssignIoPort($hash);
#Log 1, "FS20V_Define";
}
##########################################################
sub
FS20V_Undef($$)
{
my ($hash, $name) = @_;
delete($modules{FS20V}{defptr}{$hash->{DEF}});
return undef;
#Log 1, "FS20V_Undef";
}
##########################################################
sub
FS20V_Parse($$)
{
my ($hash, $msg) = @_;
my $dev = substr($msg, 16, 4);
my $btn = substr($msg, 20, 2);
my $bef = substr($msg, 24, 2);
my $erw = substr($msg, 26, 2);
my $def = $modules{FS20V}{defptr}{"$dev $btn"};
if($def) {
my @list;
foreach my $n (keys %{ $def }) {
my $lh = $def->{$n};
$n = $lh->{NAME};
return "" if(IsIgnored($n));
my $valresistor = AttrVal($n, "FS20V_Resistor", 0);
my $valcounter = AttrVal($n, "FS20V_Counter", 0);
my $valtab = AttrVal($n, "FS20V_LinearTab", "");
my $valoffset = AttrVal($n, "FS20V_Offset", 0);
my $valfactor = AttrVal($n, "FS20V_Factor", 1);
my $valmin = AttrVal($n, "FS20V_Min", "");
my $valmax = AttrVal($n, "FS20V_Max", "");
my $valdpont = AttrVal($n, "FS20V_Dpoint", 0);
my $valkey = AttrVal($n, "FS20V_Key", "");
my $valunit = AttrVal($n, "FS20V_Unit", "");
my $valraw = AttrVal($n, "FS20V_Reading", "");
# Rohwert berechnen
my $v = (hex($bef) - 0x80) * 0x100 + hex($erw);
readingsBeginUpdate($lh);
readingsBulkUpdate($lh, "raw", $v);
#readingsSingleUpdate($lh, "raw", $v, 0);
# Widerstandsmessung aktiv
if($valresistor > 0 && $v < 1024) {
$v = $v/((1024-$v)/$valresistor);
}
# Skalierung über Tabelle aktiv
if(-e $valtab && index($valtab,".tab") > 0 ) {
open (DATEI, $valtab) or die $!;
my @tabelle = <DATEI>;
close (DATEI);
for my $i (1..$#tabelle) {
my @scale_0=split(/ /,$tabelle[$i-1]);
my @scale_1=split(/ /,$tabelle[$i]);
($scale_0[0]) = $scale_0[0] =~ /(\-?\d+(?:\.\d+)?)/;
($scale_0[1]) = $scale_0[1] =~ /(\-?\d+(?:\.\d+)?)/;
($scale_1[0]) = $scale_1[0] =~ /(\-?\d+(?:\.\d+)?)/;
($scale_1[1]) = $scale_1[1] =~ /(\-?\d+(?:\.\d+)?)/;
if (($i == 1 && $v < $scale_0[0])||
($v >= $scale_0[0] && $v < $scale_1[0])||
($i == $#tabelle && $v >= $scale_1[0])) {
my $div_0 = $scale_1[1] - $scale_0[1];
if ($div_0 != 0) {
my $div_1 = ($scale_1[0] - $scale_0[0]) / $div_0;
if ($div_1 != 0) {
$v = ($v - $scale_0[0]) / $div_1 + $scale_0[1];
}
}
last;
}
}
}
# Offset, Faktor und Dezimalstellen berechnen
$v = ($v-$valoffset)*$valfactor;
$v = sprintf("%.".int($valdpont)."f", $v);
# Begrenzung Minimaler Wert
if($valmin =~ /(\-?\d+(?:\.\d+)?)/ && $valcounter == 0) {
if($v < $valmin) {
$v = $valmin;
}
}
# Begrenzung Maximaler Wert
if($valmax =~ /(\-?\d+(?:\.\d+)?)/ && $valcounter == 0) {
if($v > $valmax) {
$v = $valmax;
}
}
# S0 Zähler aktiv
if($valcounter > 0) {
my $valcnt_akt = ReadingsVal($n, "state", 0);
($valcnt_akt) = $valcnt_akt =~ /(\-?\d+(?:\.\d+)?)/;
my $valcnt_old = ReadingsVal($n, "cnt", 0);
($valcnt_old) = $valcnt_old =~ /(\-?\d+(?:\.\d+)?)/;
my $valcnt_new = $v - $valcnt_old;
readingsBulkUpdate($lh, "cnt", $v);
# Zählwert Summieren
if($v > 0) {
if($valcnt_new < 0) {
# Zählerüberlauf
$v = $valcounter + $valcnt_new;
} else {
# kein Zählerüberlauf
$v = $valcnt_new;
}
# Gültigkeitsprüfung Maximale Wertänderung
if($valmax =~ /(\-?\d+(?:\.\d+)?)/) {
if($v > $valmax) {
$v = 0;
}
}
$v = $v + $valcnt_akt;
} else {
$v = $valcnt_akt;
}
}
# Wert ohne Key und Einheit
my $value = $v;
# Bitauswertung aktiv
my $bit = $lh->{BIT};
if($bit) {
my $v1 = "on";
my $v2 = "off";
# Bit Ivertierung
if(hex($bit) >= 0x8000) {
$v1 = "off";
$v2 = "on";
}
# Bit filtern
if(($v & (2** ((hex($bit) & 0x7FFF) -1))) > 0) {
$v = $v1;
} else {
$v = $v2;
}
# Value
if($v eq "on") {
$value = 1;
} else {
$value = 0;
}
}
# Key anzeigen
if($valkey ne "") {
$v = $valkey." ".$v;
}
# Einheit anzeigen
if($valunit ne "") {
$v = $v." ".$valunit;
if($valraw eq "dbvalue") {
$value = $value.": ".$valunit;
}
}
# Werte ausgeben
#readingsBeginUpdate($lh);
if($valraw ne "") {
readingsBulkUpdate($lh, $valraw, $value);
}
readingsBulkUpdate($lh, "state", $v);
readingsEndUpdate($lh, 1);
Log3 $n, 4, "FS20 $n $v";
#Log 1, "FS20V_Parse";
push(@list, $n);
}
return @list;
} else {
Log3 $hash, 3, "FS20V Unknown device $dev, " .
"Adr $btn Code $bef ($erw), please define it";
return "UNDEFINED FS20V_$dev$btn FS20V $dev $btn";
}
}
##########################################################
sub
FS20V_Set($@)
{
my ($hash, @a) = @_;
my $ret = undef;
my $na = int(@a);
return "no set value specified" if($na < 2);
#return "Readonly value $a[1]" if(defined($readonly{$a[1]}));
my $c = $fs20_c2b{$a[1]};
my $name = $a[0];
if(!defined($c)) {
# Model specific set arguments
my $list = "sendstate";
return SetExtensions($hash, $list, @a);
}
my $v = join(" ", @a);
Log3 $name, 3, "FS20V set $v";
(undef, $v) = split(" ", $v, 2); # Not interested in the name...
#state
$v = $a[2];
# Bei model FS20Set Zahlenformat prüfen und Wert senden
my $Attrmodel = AttrVal($name, "model", "");
if($Attrmodel eq "FS20Set") {
$v = int($v);
return "value range 0-32767" if($v < 0 || $v > 32767);
my $i = ($v / 0x100) + 0x80;
my $j = $v & 0xFF;
$c = sprintf("%02X%02X", $i, $j);
IOWrite($hash, "04", "010101" . $hash->{XMIT} . $hash->{BTN} . $c);
}
# Einheit anzeigen
my $valunit = AttrVal($name, "FS20V_Unit", "");
if($valunit ne "") {
$v = $v." ".$valunit;
}
# Look for all devices with the same code, and set state
my $code = "$hash->{XMIT} $hash->{BTN}";
my $defptr = $modules{FS20V}{defptr}{$code};
foreach my $n (keys %{ $defptr }) {
readingsSingleUpdate($defptr->{$n}, "state", $v, 1);
}
# Log 1, "FS20V_Set";
return $ret;
}
1;
=pod
=begin html
<a name="FS20V"></a>
<h3>FS20V</h3>
<ul>
This module extends the FS20 protocol which is used for the interpretation of a
15 Bit measurement (Command >= h80 + Extension). The module was written for the FS20 S8M
with a special firmware (see <a href="http://forum.fhem.de/index.php?topic=24204.0">FHEM forum thread</a>) but could also be used with other
projects with the FS20 protocol.
The messages (868.35 Mhz) are received using a <a href="#FHZ">FHZ</a> or <a href="#CUL">CUL</a>
which needs to be defined first.
FS20 Telegramm definition:<br>
Synchr;HC1;Parity;HC2;Parity;Adress;Parity;Command;Parity;Extension;Parity;Digit Sum;Parity;EOT<br>
13 bit;8 bit;1 bit;8 bit;1 bit;8 bit;1 bit;8 bit;1 bit;8 bit;1 bit;8 bit;1 bit;1 bit<br><br>
Label for measurement:<br>
In the Byte command the type of the command is coded, e.g. on, off, toggle and so on.<br>
The measurement (15Bit 0-32767) is located int the byte command (Highbyte 7 Bit) and extension (Lowbyte 8 Bit)<br>
The bit with the highest value in the command is used as label for the transmission of the value of the measurement.<br><br>
<a name="FS20Valuedefine"></a>
<b>Define</b>
<ul>
<code>define <name> FS20V <housecode> <address> <bit></code>
<br><br>
The values housecode and address, can be entered as hexadecimal. The value
address is used as first address for the measurement of a FS20 S8M module<br><br>
<ul>
<li><code><housecode></code> is a 4-digit hex number corresponding to the house code.</li>
<li><code><address></code> is a 2-digit hex number corresponding to the value of the measurement of the module.</li>
<li><code><bit></code> is a 4-digit hex number corresponding to the address of the bit setting on and off</li>
</ul>
</ul>
<br>
Examples:<br>
define FS20S8M_0 FS20V 1234 01 # Display of Values<br>
define FS20S8M_1 FS20V 1234 01 0001 #Bit setting Bit0 TA1 on off<br>
define FS20S8M_2 FS20V 1234 01 0002 #Bit setting Bit1 TA2 on off<br>
define FS20S8M_3 FS20V 1234 01 8002 #Bit setting Bit1 TA2 inverted off on<br>
define FS20S8M_4 FS20V 1234 01 0003 #Bit setting Bit2 TA3 on off <br>
</ul><br>
<a name="FS20V_set"></a>
<b>Set </b>
<ul>
<code>set <name> <value></code>
<br><br>
The integer value will be sent to a FS20 device, e.g. a display. The possible values are
0-32767, there is no internal calculation.
Attribut model FS20Set).<br>
When values are counted (Attribut ValCounter > 0) the internal kann der internen count can be set, e.g. with S0.<br><br>
Examples:<br>
set sendstate 123<br>
</ul><br>
<b>Get</b> <ul>N/A</ul><br>
<a name="FS20V_attr"></a>
<b>Attributes</b>
<ul>
<a name="IODev"></a>
<li>IODev<br>
Sets the IO or physical device which should be used for sending to the
logical device (For example FHZ or CUL). Hint: During start FHEM assigns
every logical the last physical device that is able to receive data of this
type. the attribute IODev is only required to be set if more than one device
is capable of receiving signals from this logical device.
</li><br>
<a name="attrdummy"></a>
<li>dummy<br>
This is set on devices that are not transmitting radio signals. Assigned
notifys are executed when a signal is received. For example this can be
used to react to the code of a sender but it will not send any signals when
triggered using the web frontend.
</li><br>
<a name="model"></a>
<li>model<br>
This attribute denotes the model of the device. Only the model "FS20Set"
sends to the device, all other devices update only the value "state".
The attribute can additionally be used by external programs or web interfaces.<br><br>
Examples:<br>
attr FS20S8M model FS20Value<br>
attr FS20S8M model FS20Count<br>
attr FS20S8M model FS20Set (sends actively, integert values 0-32767)<br>
</li><br>
<a name="FS20V_Resistor"></a>
<li>FS20V_Resistor<br>
Scaling of the measurement as resistor. With the FS S8M the value of this
attribute is set to 220000 (Internal resistor of 220 KOhm on the circuit
board of the module). The calculated value is the measured resistance at the
AD port on Ohm. The change of the measurement should be withing the range of
kOhm, e.g. using a potentiomenter with 100-470 KOhm. is the value outside of
this range the measurement could be too inaccurate.<br><br>
Example:<br>
attr FS20S8M FS20V_Resistor 220000<br>
</li><br>
<a name="FS20V_Counter"></a>
<li>FS20V_Counter<br>
Sum of a measurement as counter, e.g. S0. The value of the attribute is set
to 30000 with the FS S8M module (Counter reset at 30000). The calculated
value is the sum of all impulses. To prevent issues during the counter reset
the value 0 is not taken into account (e.g. during the restart of the FS20 S8M).<br><br>
Example:<br>
attr FS20S8M FS20V_Counter 30000 (with FS20V_DPoint 0)<br>
attr FS20S8M FS20V_Counter 3000 (with FS20V_DPoint 1)<br>
attr FS20S8M FS20V_Counter 300 (with FS20V_DPoint 2)<br>
attr FS20S8M FS20V_Counter 30 (with FS20V_Dpoint 3)<br>
</li><br>
<a name="FS20V_LinearTab"></a>
<li>FS20V_Tab<br>
The scaling of a measurement is done via a linearization table.
The value of this attribute denotes a file in which the bases for the
linearization are stored. The file needs to be in the same directory as
the *.cfg file. The value is calculated with the linearization support
points of the table. The table can consist of multiple lines (at least 2)
with each 2 values in one line. The values are seperated by whitespace.
On the left there is the raw value and on the right the result for the
calculation. Is the value between two support points, a linear calculation
for the value is being applied. The filename needs to end with .tab and
multiple tables can be created and used, e.g. pt100.tab, LDR_LUX.tab usw.
<br><br>
table.tab 0-3V = -30 bis +40<br>
0 -30<br>
300 -15<br>
512 0<br>
700 20<br>
1023 40<br>
usw.<br><br>
Example:<br>
attr FS20S8M FS20V_LinearTab tabelle.tab<br>
</li><br>
<a name="FS20V_Offset"></a>
<li>FS20V_Offset<br>
The offset is subtracted from the measurement. If a negative value is given,
is added to the measurement.<br><br>
Examples:<br>
attr FS20S8M FS20V_Offset 20.5<br>
attr FS20S8M FS20V_Offset -10.2 (- x - = Addition)<br>
</li><br>
<a name="FS20V_Factor"></a>
<li>FS20V_Factor<br>
The value facros is multiplied with the calculated measurement. If a negative
sign is set, the value is calculated as negative.<br><br>
Examples:<br>
attr FS20S8M FS20V_Offset 123.4<br>
attr FS20S8M FS20V_Offset -10 (Calculation a negative value, Value 0=100 Value 10=0) <br>
</li><br>
<a name="FS20V_Min"></a>
<li>FS20V_Min<br>
The calculated measurement is checked for the lower deviation
and limited if required.<br><br>
Examples:<br>
attr FS20S8M FS20V_Min 100.0<br>
attr FS20S8M FS20V_Min -100.0<br>
</li><br>
<a name="FS20V_Max"></a>
<li>FS20V_Max<br>
The calculated measurement is checked for the upper deviation
and limited if required.<br><br>
Examples:<br>
attr FS20S8M FS20V_Max 100.0<br>
attr FS20S8M FS20V_Max -100.0<br>
</li><br>
<a name="FS20V_Dpoint"></a>
<li>FS20V_Dpoint<br>
The calculated measurement is displayed with decimal places.<br><br>
Examples:<br>
attr FS20S8M FS20V_Dpoint 1<br>
attr FS20S8M FS20V_Dpoint 3<br>
</li><br>
<a name="FS20V_Key"></a>
<li>FS20V_Unit<br>
The calculated measurement is prefixed with the defined value.<br><br>
Examples:<br>
attr FS20S8M FS20V_Key L:<br>
attr FS20S8M FS20V_Key T:<br>
</li><br>
<a name="FS20V_Unit"></a>
<li>FS20V_Unit<br>
The calculated measurement is suffixed with the defined value.<br><br>
Examples:<br>
attr FS20S8M FS20V_Unit KWh<br>
attr FS20S8M FS20V_Unit %<br>
attr FS20S8M FS20V_Unit m<br>
</li><br>
<a name="FS20V_Reading"></a>
<li>FS20V_Reading<br>
Creates an additional Reading "value" in the format for DBLog. (dbvalue: 98: W/m²)
define DBLOG DbLog ./db.conf (.*:temperature.*|.*:humidity.*|.*:wind.*|.*:*.rain.*|.*:dbvalue.*)
Creates an additional Reading "any name" it is only the value of output.<br><br>
Examples:<br>
attr FS20S8M FS20V_Reading dbvalue<br>
attr FS20S8M FS20V_Reading Wind<br>
</li><br>
</ul>
<br>
</ul>
=end html
=begin html_DE
<a name="FS20V"></a>
<h3>FS20V</h3>
<ul>
Das FS20 Protokoll wird mit diesem Modul erweitert und für
die Auswertung eines 15 Bit Messwert verwendet (Bef >= h80 + Erw.). Das Modul
wurde für das FS20S8M mit Spezialfirmware (siehe fhem Forum) geschrieben, kann
aber auch fuer andere Mikrocontroller Projekte mit FS20 Protokoll verwendet werden.
Die Nachrichten (868.35 MHz) können mit einem <a href="#FHZ">FHZ</a> oder
einem <a href="#CUL">CUL</a> empfangen werden.
Dieses muss daher zuerst definiert werden.<br><br>
FS20 Telegrammaufbau:<br>
Synchr;HC1;Parity;HC2;Parity;Adresse;Parity;Befehl;Parity;Erweiterung;Parity;Quersumme;Parity;EOT<br>
13 bit;8 bit;1 bit;8 bit;1 bit;8 bit;1 bit;8 bit;1 bit;8 bit;1 bit;8 bit;1 bit;1 bit<br><br>
Kennung fuer Messwert:<br>
Im Byte Befehl steht Codiert der Typ des Befehls z.B on, off, toggle usw.<br>
Der Messwert (15Bit 0-32767) befindet sich im Byte Befehl (Highbyte 7 Bit) und Erweiterung (Lowbyte 8 Bit)<br>
Das höchstwertige Bit im Befehl wird als Kennung für die Messswertübertragung gesetzt.<br><br>
<a name="FS20Vdefine"></a>
<b>Define</b>
<ul>
<code>define <name> FS20V <housecode> <adresse> <bit> </code>
<br><br>
Die Werte housecode und Adresse, können hexadezimal
eingegeben werden. Der Wert adresse, wird als 1. Messwertadresse des
FS20S8M Modul verwendet.<br><br>
<ul>
<li><code><housecode></code> ist eine 4 stellige Hex Zahl,
entsprechend der Hauscode Adresse.</li>
<li><code><adresse></code> ist eine 2 stellige Hex Zahl,
entsprechend der Messwertadresse des Moduls.</li>
</ul>
<ul>
<li><code><bit></code> ist eine 4 stellige Hex Zahl,
entsprechend der Adresse der Bitauswertung on und off.</li>
<br>
Beispiele:<br>
define FS20S8M_0 FS20V 1234 01 ,Wertanzeige<br>
define FS20S8M_1 FS20V 1234 01 0001 ,Bitauswertung Bit0 TA1 on off<br>
define FS20S8M_2 FS20V 1234 01 0002 ,Bitauswertung Bit1 TA2 on off<br>
define FS20S8M_3 FS20V 1234 01 8002 ,Bitauswertung Bit1 TA2 invertiert off on<br>
define FS20S8M_4 FS20V 1234 01 0003 ,Bitauswertung Bit2 TA3 on off <br>
usw. <br>
</ul>
</ul><br>
<a name="FS20Vset"></a>
<b>Set </b>
<ul>
<code>set <name> <value></code>
<br><br>
Der Ganzzahlenwert wird zu einem FS20 Gerät gesendet z.B. zu einem Display.
Der zulaessige Bereich ist 0-32767, es erfolgt "keine" interne Berechnung.
Attribut model FS20Set).<br>
Bei Zählwerten (Attribut ValCounter > 0), kann der internen Zaehlerstand gesetzt werden. z.B. bei S0.<br><br>
Beispiele:<br>
set sendstate 123<br>
</ul><br>
<b>Get</b> <ul>N/A</ul><br>
<a name="FS20Vattr"></a>
<b>Attribute</b>
<ul>
<a name="IODev"></a>
<li>IODev<br>
Setzt das IO oder das physische Device welches zum Senden der Signale an
dieses logische Device verwendet werden soll (Beispielsweise FHZ oder
CUL). Hinweis: Beim Start weist FHEM jedem logischen Device das letzte
physische Device zu, das Daten von diesem Typ empfangen kann. Das
Attribut IODev muss nur gesetzt werden wenn mehr als ein physisches
Device fähig ist Signale von diesem logischen Device zu empfangen.
</li><br>
<a name="attrdummy"></a>
<li>dummy<br>
Setzt das Attribut dummy um Devices zu definieren, die keine Funksignale
absetzen. Zugehörige notifys werden ausgeführt wenn das Signal
empfangen wird. Wird beispielsweise genutzt um auf Code eines Sender zu
reagieren, dennoch wird es auch dann kein Signal senden wenn es im Web
Frontend getriggert wird.
</li><br>
<a name="model"></a>
<li>model<br>
Das "model" Attribut bezeichnet den Modelltyp des Gerätes. Nur das model
"FS20Set" sendet zum Gerät, alle anderen Geräte aktualisierung nur den
Wert "state". Das Attribut kann zusätzlich von externen Programmen oder Webinterfaces genutzt werden.<br><br>
Beispiel:<br>
attr FS20S8M model FS20Value<br>
attr FS20S8M model FS20Count<br>
attr FS20S8M model FS20Set (sendet aktiv, Ganzzahlenwerte 0-32767)<br>
</li><br>
<a name="FS20V_Resistor"></a>
<li>FS20V_Resistor<br>
Skalierung des Messwertes als Widerstandsgeber. Der Wert dieses Attributes
wird beim FS20S8M Modul auf 220000 gesetzt (Interner Widerstand 220KOhm auf
der Platine des Moduls). Der errechnete Wert ist der gemessene Widerstand
am AD Port in Ohm. Die Aenderung des Messwertes sollte sich im KOhm Bereich
befinden z.B. Poti 100-470 KOhm. Liegt der Wert ausserhalb den Bereichen, dann
wird die Messung zu ungenau.<br><br>
Beispiel:<br>
attr FS20S8M FS20V_Resistor 220000<br>
</li><br>
<a name="FS20V_Counter"></a>
<li>FS20V_Counter<br>
Summierung eines Messwertes als Zaehler z.B. S0. Der Wert dieses Attributes wird beim
FS20S8M Modul auf 30000 gesetzt (Zaehlerueberlauf bei 30000). Der errechnete Wert
ist die Gesamtsumme aller Impulse. Um Fehler bei Zaehlerueberlaefen zu verhindern,
wird der empfangene Wert "0" nicht gewertet (z.B. beim Neustart des FS20S8M Modul).<br><br>
Beispiel:<br>
attr FS20S8M FS20V_Counter 30000 (bei ValueDPoint 0)<br>
attr FS20S8M FS20V_Counter 3000 (bei ValueDPoint 1)<br>
attr FS20S8M FS20V_Counter 300 (bei ValueDPoint 2)<br>
attr FS20S8M FS20V_Counter 30 (bei ValueDpoint 3)<br>
</li><br>
<a name="FS20V_LinearTab"></a>
<li>FS20V_Tab<br>
Die Messwertskalierung erfolgt ueber eine Liniarisierungstabelle.
Der Wert dieses Attributes gibt die Datei an, in der sich die
Liniarisierungsstützpunkte befinden. Die Datei muss sich im selben
Verzeichnis wie die *.cfg Datei befinden. Der errechnete Wert wird aus
den Liniariesierungs Stuetzpunkten der Tabelle errechnet. Die Tabelle
kann aus mehreren Zeilen bestehen (mindesten 2) mit jeweil 2 Werten in
einer Zeile. Die Werte werden mit Leerzeichen getrennt. Links befindet sich
der Rohwert und rechts das Ergebnis fuer die Berechnung.
Befindet sich der Rohwert zwischen zwei Stützpunkten, dann wird der
Wert zwischen den Stützpunkten liniar berechnet. Der Dateiname muss die
Endung .tab besitzen. Es können verschiedene Tabellen erstellt
und verwendet werden. Z.B. pt100.tab, LDR_LUX.tab usw.<br><br>
tabelle.tab 0-3V = -30 bis +40<br>
0 -30<br>
300 -15<br>
512 0<br>
700 20<br>
1023 40<br>
usw.<br><br>
Beispiel:<br>
attr FS20S8M FS20V_LinearTab tabelle.tab<br>
</li><br>
<a name="FS20V_Offset"></a>
<li>FS20V_Offset<br>
Der Wert Offset wird vom Messwert Subtrahiert. Bei Angabe eines negativen
Vorzeichen, wird der Wert zum Messwert Addiert.<br><br>
Beispiel:<br>
attr FS20S8M FS20V_Offset 20.5<br>
attr FS20S8M FS20V_Offset -10.2 (- x - = Addition)<br>
</li><br>
<a name="FS20V_Factor"></a>
<li>FS20V_Factor<br>
Der Wert Factor wird mit dem errechneten Messwert Multipliziert. Bei Angabe eines negativen
Vorzeichen, wird der Wert ins Negative gerechnet.<br><br>
Beispiel:<br>
attr FS20S8M FS20V_Offset 123.4<br>
attr FS20S8M FS20V_Offset -10 (Berechnung ins Negative, Wert 0=100 Wert 10=0) <br>
</li><br>
<a name="FS20V_Min"></a>
<li>FS20V_Min<br>
Der errechnete Messwert wird auf Unterschreitung ueberprueft
und begrenzt.<br><br>
Beispiel:<br>
attr FS20S8M FS20V_Min 100.0<br>
attr FS20S8M FS20V_Min -100.0<br>
</li><br>
<a name="FS20V_Max"></a>
<li>FS20V_Max<br>
Der errechnete Messwert wird auf Ueberschreitung ueberprueft
und begrenzt.<br><br>
Beispiel:<br>
attr FS20S8M FS20V_Max 100.0<br>
attr FS20S8M FS20V_Max -100.0<br>
</li><br>
<a name="FS20V_Dpoint"></a>
<li>FS20V_Dpoint<br>
Der errechnete Messwert wird mit Dezimalstellen ausgegeben.<br><br>
Beispiel:<br>
attr FS20S8M FS20V_Dpoint 1<br>
attr FS20S8M FS20V_Dpoint 3<br>
</li><br>
<a name="FS20V_Key"></a>
<li>FS20V_Key<br>
Dem errechnete Messwert wird eine Kennung vorangestellt.<br><br>
Beispiel:<br>
attr FS20S8M FS20V_Key L:<br>
attr FS20S8M FS20V_Key T:<br>
</li><br>
<a name="FS20V_Unit"></a>
<li>FS20V_Unit<br>
Der errechnete Messwert wird mit der Einheit ausgegeben.<br><br>
Beispiel:<br>
attr FS20S8M FS20V_Unit KWh<br>
attr FS20S8M FS20V_Unit %<br>
attr FS20S8M FS20V_Unit m<br>
</li><br>
<a name="FS20V_Reading"></a>
<li>FS20V_Reading<br>
Erzeugt ein zusätzliches Reading "dbvalue" im Format für DBLog. (dbvalue: 98: W/m²)
define DBLOG DbLog ./db.conf (.*:temperature.*|.*:humidity.*|.*:wind.*|.*:*.rain.*|.*:dbvalue.*)
Erzeugt ein zusätzliches Reading "beliebige Bezeichnung" es wird nur der Wert ausgegeben.<br><br>
Beispiel:<br>
attr FS20S8M FS20V_Reading dbvalue<br>
attr FS20S8M FS20V_Reading Wind<br>
</li><br>
</ul>
<br>
</ul>
=end html_DE
=cut
ZitatArtikel dazu: https://forum.fhem.de/index.php/topic,24204.msg173444.html#msg173444 (https://forum.fhem.de/index.php/topic,24204.msg173444.html#msg173444)
Das ist schoen, ist aber trotzdem nirgendwo eingecheckt.
Da ich aber leider schon mit den TS* Modulen eine Ausnahme gemacht habe, kann ich schwer nein sagen. Lehre fuer mich: nicht mit Ausnahmen anfangen.
Habe die gewuenschten Aenderungen leicht modifiziert eingecheckt.
:-) Danke, dass Du nicht Nein sagtest.
@Ralph: Magst Du den Entwickler nicht davon überzeugen, dass er/sie das Modul eincheckt? Ich habe gerade mal einen Blick in den Modulcode geworfen und das sieht, für mich auf den ersten Blick, ganz ok aus. Selbst die Doku ist in en und de vorhanden.
Wenn es den Entwickler nicht mehr (im Forum) geben würde, dann könnte ich mir vorstellen das Modul auch kommissarisch einzuchecken, aber ohne CUL und FS20V ist das nicht die beste Wahl, schon gar nicht, wenn der Entwickler selbst noch aktiv ist...
keine Ahnung, ob ich soviel Überzeugungskraft aufbringe, aber immerhin, versuchen kann ich es ja mal. :-)
(Habe keinen Plan, wie sowas gehen könnte und wieviel Aufwand das ist)
Hallo Ralph,
hier ist der aktuelle Stand des FS20V Moduls.
Siehe Internals Version 0020 2018-07-25
Leider gibt es das FS20s8m nicht mehr, deshalb
verwende ich teilweise Arduino Module mit 3V mit dem RFM12 Empfänger.
Vorteil er kann senden und Empfangen, FS20V Kompatibel.
Ich habe eine Spezialfirmware für das FS20 WUE Modul entwickelt.
Mit diesem Modul + eine IR Sendediode mit Vorwiderstand kann ich jetzt
meine LG Artcool Stylist Klimaanalage mit allen Funktionen inkl. LED Beleuchtung
über IR Steuern, mit 5V USB Netzteil ca. 20.-€.
Prinzipiell kann man diesen FS20 Empfänger mit passender Firmware für alles
mögliche verwenden. Wer Interesse hat einfach bei mir melden!
Es gab noch Probleme beim Senden von FS20V Codes, das trat dann auf,
wenn keine FS20 Devices angelegt waren.
Das Attribut model: ... habe ich richtigerweise von FS20... auf FS20V... umbenannt.
Das fs20s8m Modul ist nicht mehr lieferbar und FS20 ist am Aussterben deshalb habe ich
keine Zeit mehr damit verbracht herauszufinden wie ich das Modul einchecken kann.
Wenn es die Zeit erlaubt stehe ich aber für Fragen zur Verfügung.
Es wäre natürlich super wenn Rudolf König die Änderungen in seinem Modul einpflegen
könnte, dann bliebe mir / uns bei zukünftigen Updates die Änderungen in seinem Modul erspart.
Danke, Mr Noname, für Deine Antwort, vielleicht mag ja dev0 beim einchecken helfen.
Da habe ich Glück gehabt und mir ja noch einige von den vergriffenen gesichert, die haben sich wirklich bewährt. Das von Dir erwähnte schaue ich mir mal an. Danke alle miteinand für Eure Mühe.
Hallo Rudolf,
Ich habe gerade ein Update durchgeführt, FS20V funktioniert mit deinen Änderungen!
Sonnige Grüße aus Regensburg, danke.