Bitte um Ergänzung in 00_CUL.pm für FS20V

Begonnen von Ralph, 17 Oktober 2018, 08:52:23

Vorheriges Thema - Nächstes Thema

Ralph

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....",

FHEM auf RaspberryPi3 mit Geekworm USV und SignalDUINO 433MHz und HM-MOD-RPI-PCB mit 3 HM-Sec-SD-2, 5 FHT, 2 RM 100-2 Uni S, 2 HMS100, 6 CUL_WS, 6 CUL_FHTTK, 11 FS20 und 7 FS20V Spannungsüberwachungen

rudolfkoenig

- ich finde kein *_FS20V.pm im FHEM Ordner.
- bist Du sicher, das die Codes [89a-f]. von USF1000 nicht verwendet werden?

Ralph

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 &lt;name&gt; FS20V &lt;housecode&gt; &lt;address&gt; &lt;bit&gt;</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>&lt;housecode&gt;</code> is a 4-digit hex number corresponding to the house code.</li>

   <li><code>&lt;address&gt;</code> is a 2-digit hex number corresponding to the value of the measurement of the module.</li>

   <li><code>&lt;bit&gt;</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 &lt;name&gt; &lt;value&gt</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&ouml;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 &lt;name&gt; FS20V &lt;housecode&gt; &lt;adresse&gt; &lt;bit&gt </code>
    <br><br>

   Die Werte housecode und Adresse, k&ouml;nnen hexadezimal
   eingegeben werden. Der Wert adresse, wird als 1. Messwertadresse des
   FS20S8M Modul verwendet.<br><br>

   <ul>
   <li><code>&lt;housecode&gt;</code> ist eine 4 stellige Hex Zahl,
   entsprechend der Hauscode Adresse.</li>
   
   <li><code>&lt;adresse&gt;</code> ist eine 2 stellige Hex Zahl,
   entsprechend der Messwertadresse des Moduls.</li>
   </ul>
   
   <ul>
   <li><code>&lt;bit&gt;</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 &lt;name&gt; &lt;value&gt</code>
    <br><br>
    Der Ganzzahlenwert wird zu einem FS20 Ger&auml;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&auml;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&ouml;rige notifys werden ausgef&uuml;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&auml;tes.  Nur das model
      "FS20Set" sendet zum Ger&auml;t, alle anderen Ger&auml;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

FHEM auf RaspberryPi3 mit Geekworm USV und SignalDUINO 433MHz und HM-MOD-RPI-PCB mit 3 HM-Sec-SD-2, 5 FHT, 2 RM 100-2 Uni S, 2 HMS100, 6 CUL_WS, 6 CUL_FHTTK, 11 FS20 und 7 FS20V Spannungsüberwachungen

rudolfkoenig

ZitatArtikel dazu: 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.

Ralph

FHEM auf RaspberryPi3 mit Geekworm USV und SignalDUINO 433MHz und HM-MOD-RPI-PCB mit 3 HM-Sec-SD-2, 5 FHT, 2 RM 100-2 Uni S, 2 HMS100, 6 CUL_WS, 6 CUL_FHTTK, 11 FS20 und 7 FS20V Spannungsüberwachungen

dev0

@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...

Ralph

#6
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)
FHEM auf RaspberryPi3 mit Geekworm USV und SignalDUINO 433MHz und HM-MOD-RPI-PCB mit 3 HM-Sec-SD-2, 5 FHT, 2 RM 100-2 Uni S, 2 HMS100, 6 CUL_WS, 6 CUL_FHTTK, 11 FS20 und 7 FS20V Spannungsüberwachungen

Noname

#7
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.


Ralph

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.
FHEM auf RaspberryPi3 mit Geekworm USV und SignalDUINO 433MHz und HM-MOD-RPI-PCB mit 3 HM-Sec-SD-2, 5 FHT, 2 RM 100-2 Uni S, 2 HMS100, 6 CUL_WS, 6 CUL_FHTTK, 11 FS20 und 7 FS20V Spannungsüberwachungen

Noname

Hallo Rudolf,

Ich habe gerade ein Update durchgeführt, FS20V funktioniert mit deinen Änderungen!
Sonnige Grüße aus Regensburg, danke.