Neues Modul für Geräte mit Modbus Schnittstelle über RS232 bzw. RS485

Begonnen von StefanStrobel, 12 Juli 2014, 14:50:22

Vorheriges Thema - Nächstes Thema

Roger

Hi privat58,
der Dank gehört Stefan, da er die Basis-Module geschrieben hat.
Aller 10s ist sehr oft. Innerhalb dieser Zeit kann der SDM630 nicht alle seine Registerwerte liefern.
Stefan will hier noch etwas einbauen, damit man die BUS-Auslastung sehen kann.

Aber Du hast ja eine Lösung gefunden  :). Freut mich, dass Du Dich dank der Dokumentation in dem 98_ModbusSDM630M.pm von mir zurechtgefunden hast.

Roger
Zotac, BBB, RPIs mit 10*FHEM
2*HM-LAN, 2*JeeLink, 2*RS485, SignalESP
HomeMatic, PCA301 Komponenten, ModBus: Stromzähler, Fronius WR, Shelly

pejonp

Hallo,

ich möchte meinen SolarEdge Wechselrichter auslesen. RS485 ist angeschlossen und mit dem Prog (http://www.modbusdriver.com/modpoll.html).
Aufruf : ./modpoll -b 115200 -d 8 -p none  -r 40001 -t 4:hex  -c 45  /dev/ttyS0 bekomme ich auch Werte.

Jetzt wollte ich diese Werte in fhem einlesen. Habe das Modul 98_ModbusSDM220M.pm in 98_ModbusSolarEdge.pm umbenannt und auch ein Paar Register eingetragen. Im fhem-Log wird mir etwas angezeigt.

2015.04.16 22:11:05 5: PWP: GetUpdate called
2015.04.16 22:11:05 5: PWP: GetUpdate objects from attributes: h262145
2015.04.16 22:11:05 5: PWP: GetUpdate full object list: h262145
2015.04.16 22:11:05 5: PWP: GetUpdate check h262145 => C_SunSpec_ID, poll = 2, last = 0
2015.04.16 22:11:05 5: PWP: GetUpdate will request C_SunSpec_ID
2015.04.16 22:11:05 5: PWP: GetUpdate tries to combine read commands
2015.04.16 22:11:05 5: PWP: GetUpdate: combine for h is 1
2015.04.16 22:11:05 5: SolarWR: Send adds fcode 3 for C_SunSpec_ID to queue: 010300010001d5ca pdu 0300010001
2015.04.16 22:11:05 4: SolarWR: handle queue sends 010300010001d5ca (fcode 3 to 1 for C_SunSpec_ID, len 1)
2015.04.16 22:11:05 5: SW: 010300010001d5ca
2015.04.16 22:11:05 5: SolarWR1: GetUpdate called
2015.04.16 22:11:05 5: SolarWR1: GetUpdate objects from attributes:
2015.04.16 22:11:05 5: SolarWR1: GetUpdate full object list: h262145 h262149 h262278
2015.04.16 22:11:05 5: SolarWR1: GetUpdate check h262145 => ID, poll = 0, last = 0
2015.04.16 22:11:05 5: SolarWR1: GetUpdate check h262149 => Hersteller, poll = 0, last = 0
2015.04.16 22:11:05 5: SolarWR1: GetUpdate check h262278 => AC_Frequenz, poll = 0, last = 0
2015.04.16 22:11:05 5: SolarWR1: GetUpdate tries to combine read commands
2015.04.16 22:11:07 4: SolarWR: timeout waiting for 3 from 1, Request was 010300010001d5ca, last Buffer:
2015.04.16 22:11:25 5: PWP: UpdateGetSetList full object list: h262145
2015.04.16 22:11:25 5: PWP: UpdateSetList: setList=
2015.04.16 22:11:25 5: PWP: UpdateSetList: getList=
2015.04.16 22:11:25 5: SolarWR1: UpdateGetSetList full object list: h262149 h262145 h262278
2015.04.16 22:11:25 5: SolarWR1: UpdateSetList: setList=
2015.04.16 22:11:25 5: SolarWR1: UpdateSetList: getList=ID Hersteller AC_Frequenz
2015.04.16 22:11:28 5: SolarWR1: Get: key for AC_Frequenz = h262278
2015.04.16 22:11:28 5: SolarWR1: Get: Requesting AC_Frequenz (h 262278)
2015.04.16 22:11:28 5: SolarWR: Send adds fcode 3 for AC_Frequenz to queue: 01030086000225e2 pdu 0300860002, force send
2015.04.16 22:11:28 4: SolarWR: handle queue sends 01030086000225e2 (fcode 3 to 1 for AC_Frequenz, len 2)
2015.04.16 22:11:28 5: SW: 01030086000225e2
2015.04.16 22:11:28 5: SolarWR1: ReadAnswer called and remaining timeout is 1.99834203720093 requested reading is AC_Frequenz
2015.04.16 22:11:30 3: SolarWR1: Timeout2 in ReadAnswer for AC_Frequenz
2015.04.16 22:11:30 4: SolarWR: timeout waiting for 3 from 1, Request was 01030086000225e2, last Buffer:

Wie muß ich die auszulesenden Register definieren ? Zahl, String usw.  Da habe ich noch keinen Plan. Ich hänge mal die SolarEdge Beschreibung und das fhem_modul an. Vielleicht kann mir jemand einen Tip geben. Vielen Dank.

Jörg
LaCrossGW 868MHz:WT470+TFA+TX37-IT+EMT7110+W136+WH25A HP1003+WH2621
SignalD(CC1101):Bresser+WS-0101(868MHz WH1080)+Velux KLF200+MAX!+HM-MOD-UART:Smoke HM-SEC-SD+VITOSOLIC 200 RESOL VBUS-LAN+SolarEdge SE5K(Modbus)+Sonnen!eco8(10kWh)+TD3511+DRT710M(Modbus)+ZigBee+Z-Wave+MQTT+vitoconnect

StefanStrobel

Hallo pejonp,

Im Log sieht man, dass Dein Gerät auf die Anfragen nicht antwortet. Das liegt vermutlich an falschen Adressen.

Am Beispiel des Readings ID fällt mir folgendes auf:

Die Adresse Deines ID Objekts ist 40001 dezimal. Für das Protokoll ist das vermutlich 40000 (beginnt bei 0). Im Modul müsste daher vermutlich h40000 stehen. Wenn das Gerät darauf nicht antwortet, würde ich auch 40001 ausprobieren. 262145 ist auf jeden Fall zu groß.

Wenn es aber gar keine Holding Register sondern Input Register sind, dann musst du ein i statt dem h verwenden.

Da die ID 2 Register belegt (32 Bit Wert) fehlt der Key len => 2.
Um den Datentyp auf uint32 festzulegen würde ich dann noch ein unpack => "L>" (Big endian format) oder auch nur "L" einfügen (small endian) ausprobieren.

Die Formattierung als Float mit einer Nachkommastelle ist vermutlich nicht sinnvoll. Den Key format=> würde ich daher weglassen.

Im Wiki habe ich eine Beschreibung des Basismoduls abgelegt. da steht etwas ausführlicher wie man eigene Gerätemodule für Modbus schreibt: http://www.fhemwiki.de/wiki/Modbus

Ich hoffe das hilft Dir weiter.

Gruß
    Stefan


pejonp

Hallo Stefan,

dank deiner Hilfe habe ich schon etwas hinbekommen, aber leider werden die Daten falsch zugeordnet.

Einträge in fhem.cfg:

define SolarWR Modbus /dev/ttyS0@115200
define PWP ModbusAttr 1 10
attr PWP IODev SolarWR
attr PWP dev-h-defPoll 1
attr PWP obj-h72-reading I_AC_Strom_h72
attr PWP obj-h73-expr $val
attr PWP obj-h73-reading I_AC_StromL1_h73
attr PWP obj-h74-expr $val
attr PWP obj-h74-reading I_AC_StromL2_h74
attr PWP obj-h75-expr $val
attr PWP obj-h75-reading I_AC_StromL3_h75

Angezeigt wird:
I_AC_Strom_h72     63
I_AC_StromL1_h73 63
I_AC_StromL2_h74 63
I_AC_StromL3_h75 65534

wenn ich über das modpoll-Tool die Daten Abfrage erhalte ich folgendes:
[72]: 190
[73]: 63
[74]: 63
[75]: 63

Es sieht so aus, das die Zuordnung zu den einzelnen Registern nicht stimmt. Wo muß/kann  ich noch etwas einstellen ? Ich hänge mal den Log an. Vieleicht kann du ja daran gleich etwas erkennen. Vielen Dank.

Jörg

Ergänzung:
Beim ändern der Pollzeit über die Oberfläche, beendet sich fhem auf dem Server mit dem Hinweis:
Can't use string ("SolarWR") as a HASH ref while "strict refs" in use at ./FHEM/98_Modbus.pm line 782.

es ist dieser Eintrag in der fhem.cfg gemeint: define PWP ModbusAttr 1 10

im 98_Modbus.pm steht dort:
Log3 $name, 5, "$name: SetIODev is using $ioDev->{NAME} given in attribute";
LaCrossGW 868MHz:WT470+TFA+TX37-IT+EMT7110+W136+WH25A HP1003+WH2621
SignalD(CC1101):Bresser+WS-0101(868MHz WH1080)+Velux KLF200+MAX!+HM-MOD-UART:Smoke HM-SEC-SD+VITOSOLIC 200 RESOL VBUS-LAN+SolarEdge SE5K(Modbus)+Sonnen!eco8(10kWh)+TD3511+DRT710M(Modbus)+ZigBee+Z-Wave+MQTT+vitoconnect

pejonp

Hallo,

habe einen Fehler bei mir gefunden. Wenn der Regiester bei Adresse H40072 liegt, muß zum auslesen einer abgezogen werden, also h71. Jetzt kommen auch die richtigen Werte.

attr PWP obj-h71-reading I_AC_Strom_h72

Angezeigt wird:
I_AC_Strom_h72     190

Jörg
LaCrossGW 868MHz:WT470+TFA+TX37-IT+EMT7110+W136+WH25A HP1003+WH2621
SignalD(CC1101):Bresser+WS-0101(868MHz WH1080)+Velux KLF200+MAX!+HM-MOD-UART:Smoke HM-SEC-SD+VITOSOLIC 200 RESOL VBUS-LAN+SolarEdge SE5K(Modbus)+Sonnen!eco8(10kWh)+TD3511+DRT710M(Modbus)+ZigBee+Z-Wave+MQTT+vitoconnect

satprofi

Hallo.
Habe SDM220M wie oben angesprochen angelegt. Bekomme auch sämtl. Readings angezeigt, aber alle mit 0.
Wie muss man den SDM220M configurieren?
gruss
gruss
-----------------------------------------------------------------------
beelink miniPC - Fhem 6.x CUL 868, FS20, NetIO230 CUL 433
HMLAN, HM-CC-RT-DN,Homematic Actoren,LD382A,Telegram

frankbatzen

Hallo,

ursprünglich hatte ich mich in diesem Thread
http://forum.fhem.de/index.php/topic,35487.0.html
nach einer Möglichkeit erkundigt, viele Arduino als Sensorknoten an FHEM zu hängen. Am Ende habe ich mich dafür entschieden, das ganze per Modbus RTU umzusetzen, weil es dieses feine Modul für FHEM gibt.

Seit gestern läuft jetzt der erste Arduino nano
http://www.ebay.de/itm/Arduino-Nano-V3-kompatibles-Board-ATmega328P-16MHz-mit-CH340-USB-RS232-Chip-/291415212095?pt=LH_DefaultDomain_77&hash=item43d9b3403f

mit einem RS485-Shield
http://www.ebay.de/itm/331359788902?ru=http%3A%2F%2Fwww.ebay.de%2Fsch%2Fi.html%3F_from%3DR40%26_sacat%3D0%26_nkw%3D331359788902%26_rdc%3D1

an einem USB-RS485-Adapter
http://www.digitus.info/mx/produkte/zubehoer/adapter-und-konverter/r-usb-seriell-adapter-usb-20-da-70157/

am Raspberry pi.
Ich musste hierfür die Biasing-Widerstände im RS-485-Netzwerk anpassen, weil die auf dem RS485-Shield verbauten viel zu hochohmig sind, siehe:
http://arduino-experience.blogspot.de/2015/02/the-library-compiles-with-arduino-ide.html )

Auf dem Arduino läuft die folgende library:
https://github.com/smarmengol/Modbus-Master-Slave-for-Arduino

mit folgendem Sketch (Dies ist das Beispielsketch "simple_slave", das in der Library enthalten ist in leicht modifizierter Form - andere Baudrate, anderer Inhalt des Arrays, Pin2 ist Txenable-Pin für RS485):

/**
*  Modbus slave example 1:
*  The purpose of this example is to link a data array
*  from the Arduino to an external device.
*
*  Recommended Modbus Master: QModbus
*  http://qmodbus.sourceforge.net/
*/

#include <ModbusRtu.h>

// data array for modbus network sharing
uint16_t au16data[16] = {
  0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 };

/**
*  Modbus object declaration
*  u8id : node id = 0 for master, = 1..247 for slave
*  u8serno : serial port (use 0 for Serial)
*  u8txenpin : 0 for RS-232 and USB-FTDI
*               or any pin number > 1 for RS-485
*/
Modbus slave(1,0,2); // this is slave @1 and RS-485

void setup() {
  slave.begin( 9600 ); // baud-rate at 9600
}

void loop() {
  slave.poll( au16data, 16 );
}


Mit den FHEM-Modulen Modbus und MottbusAttr kann ich nun die Werte, die im Arduino in dem Array au16data gespeichert sind, per Modbus über RS485 abrufen. Meine FHEM Definitionen in der fhem.cfg:

define ModbusRS485 Modbus /dev/ttyUSB1@9600
#attr ModbusRS485 verbose 5

define Klappe1 ModbusAttr 1 10
#attr Klappe1 verbose 5
attr Klappe1 room Keller
attr Klappe1 obj-h1-reading Winkel
attr Klappe1 obj-h1-expr $val/10
attr Klappe1 obj-h1-set
attr Klappe1 stateFormat {sprintf("%.1f°", ReadingsVal($name,"Winkel",0))}
attr Klappe1 dev-h-defPoll 1
attr Klappe1 dev-h-defShowGet 1

Damit holt sich FHEM jetzt alle 10 Sekunden den ZWEITEN Wert aus dem Array au16data auf dem Arduino ab. Hier also den Wert "1". Den ersten Wert (hier also die "0") kann ich nicht auslesen, weil das in ModbusAttr h0 wäre, was in ModbusAttr unzulässig zu sein scheint. Ist aber völlig egal, da man das Array beliebig groß machen kann, muss man die erste Position nicht benutzen. Jetzt muss man das Arduino-Sketch nur noch so erweitern, dass der Arduino beliebige Werte von Sensoren ins Array schreibt oder man schreibt über set-Befehle von FHEM aus ins Array, was dann von Aktoren am Arduino als Stellwert genutzt wird.

Warum schreibe ich das alles: Weil ich finde, dass diese Kombination eine unglaublich mächtige Erweiterung von FHEM darstellt. Arduinos lassen sich extrem günstig mit allen möglichen Sensoren und Aktoren bestücken (I2C, SPI, etc.) und genauso günstig können Arduinos natürlich auch Aktoren (Motoren, Dimmer, Relais, etc.) steuern, was dann von FHEM verarbeitet bzw. kontrolliert werden kann.

Danke für das Modul!

Gruß
frank

Flobo

HI Zusammen,

ich versuche gerade eine Wago SPS mit Modbus TCP abzufragen ( Input Registers )

Ich habe in der fhem.cfg folgendes stehen :

define PWP ModbusAttr 1 30 10.10.10.25:502 TCP

.. bekomme aber folgende Meldung wenn ich versuche FHEM zu starten :

root@OMD:/opt/fhem# Undefined subroutine &main::DevIo_OpenDev called at ./FHEM/98_Modbus.pm line 823, <$fh> line 12.

Hat jemand eine Idee wie ich das Lösen kann ?

StefanStrobel

Hallo Flobo,

das ist ein Bug im Modul, der nur dann auftritt, wenn man keine anderen Module verwendet, die bereits DevIO benötigen. Ich hab gerade eine neue Version eingecheckt, die den Fehler beheben sollte. Mach morgen einfach mal ein update, dann sollte es funktionieren.

Gruss
    Stefan

Flobo

Hallo Stefan,

vielen Dank für den Fix, hat geklappt es kommt nun keine Fehlermeldung mehr.
Ich bin leider noch nicht so geübt im Umgang mit FHEM und habe noch ein weiteres Problem mit dem Modul.

Und zwar : Wenn ich in die fhem.cfg folgendes eintrage :


define Test ModbusAttr 1 30 10.10.10.25:502 TCP
attr Test userattr obj-i14296-reading
attr Test obj-i14296-reading Aussentemperatur


Die SPS hat die Modbus ID 1, und die IP Adresse 10.10.10.25 auf Port 502 .. also das sollte soweit stimmen.
Die Wago spricht direkt Modbus TCP, Dann versuche ich das InputRegister mit der Adresse 14296 abzufragen.

Bekomme allerding im Log nur folgendes :

2015.05.12 19:23:01 5: Test: GetUpdate called
2015.05.12 19:23:01 5: Test: GetUpdate objects from attributes: i14296
2015.05.12 19:23:01 5: Test: GetUpdate full object list: i14296
2015.05.12 19:23:01 5: Test: GetUpdate check i14296 => Aussentemperatur, poll = 0, last = 0
2015.05.12 19:23:01 5: Test: GetUpdate tries to combine read commands


Mache ich noch irgendwas falsch ?

StefanStrobel

Hallo Flobo,

Falsch ist nichts, aber wenn Du möchtest, dass das Objekt alle 30 Sekunden abgefragt wird, musst Du das entweder beim Objekt oder als Default für alle definierten Input Register angeben.
Dafür gibt es die Attribute obj-[cdih][1-9][0-9]*-poll oder dev-([cdih]-)*defPoll

Gruß
   Stefan

Flobo

Hi Stefan,

vielen Dank für deine Antwort, aber leider hats bei mir immer noch nicht *klick* gemacht.

define Test ModbusAttr 1 30 10.10.10.25:502 TCP
attr Test obj-i14296-poll Aussentemperatur


Ich will einen Float Wert abfragen ( Temperatur z.b. 20,0 Grad )
Ich habe einen Real32 Signed Wert mit der Registeradresse 14296.

könntest du mir ein kleines Beispiel aufzeigen .. das wär lieb.

Das ganze sieht im Webinterface so aus bei mir :

(//)

StefanStrobel

Halo Flobo,

Das -Poll Attribut setzt man auf 1 damit ein vorher definiertes Objekt / Reading regelmäßig abgefragt wird.
Ein 32 Bit Real passt nicht in ein Input- oder Holding-Register. Das wird also in zwei aufeinanderfolgenden Registern gespeichert sein.
Wichtig wäre zunächst mal zu wissen ob es ein Input- oder ein Holding-Register ist. Entsprechend musst Du im Attribut dann i4296 oder h4296 schreiben. Für das 32-Bit Objekt brauchst Du dann ein -len mit 2 und einen passenden unpack code für die Kodierung als Real. Da kommt es darauf an, wie es im Wago kodiert ist. Die Attribute sind in der Kommandoreferenz ausführlicher erläutert.

Probiers mal ungefähr so:


define Test ModbusAttr 1 30 10.10.10.25:502 TCP
attr Test obj-i14296-reading Aussentemperatur
attr Test obj-i14296-len 2
attr Test obj-i14296-unpack f>
attr Test dev-i-defPoll 1


Gruss
    Stefan

StefanStrobel

Hallo,

Ich habe gerade ein Update des Modbus Basis-Moduls eingecheckt, das einen Bug behebt, der beim Ändern der Definition zu einem Crash geführt hat.
Danke an Satprofi für den Hinweis.

Gruß
    Stefan

Ppunk

hallo an alle

kann mir jemand sagen wie ich das mit dem Modbus Zähler hin bekomme lese sei einigen tagen durch das Forum.
Hardware: Raspberry,  usb zu Rs485 fti chip, zwei  ECS3-63 cp Modbus Zähler




2015-05-18 21:27:50 Modbus ModBusLine DISCONNECTED
2015-05-18 21:27:50 Modbus HA_Modbus_1 DISCONNECTED
2015-05-18 21:27:50 Modbus ModbusRS485 DISCONNECTED
2015-05-18 21:27:55 Modbus ModBusLine CONNECTED
2015-05-18 21:27:55 Modbus HA_Modbus_1 CONNECTED
2015-05-18 21:27:55 Modbus ModbusRS485 CONNECTED
2015-05-18 21:28:08 ROOMMATE rr_Father durTimerAbsence_cr: 657001
2015-05-18 21:28:08 ROOMMATE rr_Father durTimerAbsence: 10950:01:16
2015-05-18 21:28:08 ROOMMATE rr_Mother durTimerPresence_cr: 657012
2015-05-18 21:28:08 ROOMMATE rr_Mother durTimerPresence: 10950:11:51
2015-05-18 21:28:08 ROOMMATE rr_Daughter durTimerAbsence_cr: 656970
2015-05-18 21:28:08 ROOMMATE rr_Daughter durTimerAbsence: 10949:30:09
2015-05-18 21:28:08 ROOMMATE rr_Son durTimerAbsence_cr: 656970


fehm.cfg


attr global userattr devStateIcon devStateStyle icon lightSceneParamsToSave lightSceneRestoreOnlyIfChanged:1,0 sortby structexclude webCmd widgetOverride
attr global autoload_undefined_devices 1
attr global backup_before_update 0
attr global logfile -
attr global modpath .
attr global motd SecurityCheck:\
\
WEB,WEBphone,WEBtablet has no basicAuth attribute.\
telnetPort has no password/globalpassword attribute.\
\
Restart FHEM for a new check if the problem is fixed,\
or set the global attribute motd to none to supress this message.\

attr global room System
attr global sendStatistics never
attr global statefile ./demolog/fhem.save
attr global updateInBackground 1
attr global verbose 3

define telnetPort telnet 7072 global
attr telnetPort room System

define WEB FHEMWEB 8083 global
attr WEB JavaScripts codemirror/fhem_codemirror.js
attr WEB defaultRoom Light
attr WEB hiddenroom DashboardRoom
attr WEB iconPath openautomation:fhemSVG:default
attr WEB room System
attr WEB sortRooms Light Cinema Residents Sensors System

define WEBphone FHEMWEB 8084 global
attr WEBphone hiddenroom DashboardRoom
attr WEBphone iconPath openautomation:fhemSVG
attr WEBphone plotEmbed 0
attr WEBphone room System
attr WEBphone sortRooms Light Cinema Residents Sensors System
attr WEBphone stylesheetPrefix smallscreen

define WEBtablet FHEMWEB 8085 global
attr WEBtablet hiddenroom DashboardRoom
attr WEBtablet iconPath openautomation:fhemSVG
attr WEBtablet plotEmbed 0
attr WEBtablet room System
attr WEBtablet sortRooms Light Cinema Residents Sensors System
attr WEBtablet stylesheetPrefix ios7touchpad

# Fake FileLog entry, to access the fhem log from FHEMWEB
define Logfile FileLog ./log/fhem-%Y-%m.log fakelog
attr Logfile room System

define autocreate autocreate
attr autocreate room System
define eventTypes eventTypes demolog/eventTypes.txt
attr eventTypes room System

define CUL_0 CUL none 0000
attr CUL_0 dummy 1
attr CUL_0 room System
define Outdoor FS20 1234 11
attr Outdoor userattr Light Light_map structexclude
attr Outdoor IODev CUL_0
attr Outdoor Light AllLights
attr Outdoor group Single Lights
attr Outdoor icon light_outdoor
attr Outdoor room Light
define Office FS20 1234 12
attr Office userattr Light Light_map structexclude
attr Office IODev CUL_0
attr Office Light AllLights
attr Office group Single Lights
attr Office icon light_office
attr Office model fs20st
attr Office room Light
define Livingroom FS20 1234 13
attr Livingroom userattr Light Light_map structexclude
attr Livingroom IODev CUL_0
attr Livingroom Light AllLights
attr Livingroom eventMap off:dim0% on:dim100%
attr Livingroom group Single Lights
attr Livingroom icon light_pendant_light
attr Livingroom model fs20di
attr Livingroom room Light
attr Livingroom webCmd dim
define AllLights structure Light Alarm Livingroom Office Outdoor CT RGB
attr AllLights devStateIcon undefined:light_question
attr AllLights group Structure
attr AllLights icon light_light
attr AllLights room Light
define Alarm FS20 1234 14
attr Alarm userattr Light Light_map structexclude
attr Alarm IODev CUL_0
attr Alarm Light AllLights
attr Alarm follow-on-for-timer 1
attr Alarm group Single Lights
attr Alarm icon light_wall_2
attr Alarm room Light
attr Alarm webCmd blink 5 1
define Garden KS300 1234
attr Garden IODev CUL_0
attr Garden group Sensors
attr Garden room Sensors
define Log.Garden FileLog demolog/garden.log Sens.Out:T:.*
attr Log.Garden room Sensors
define Log.Predicted FileLog demolog/predicted.log predicted:T:.*
attr Log.Predicted room Sensors
define Cellar CUL_WS 1 -1 -3.5
attr Cellar group Sensors
attr Cellar room Sensors
define SVG_01_Garden SVG Log.Garden:SVG_01_Garden:CURRENT
attr SVG_01_Garden label "Temp: Min $data{min1}, Max $data{max1}, Last $data{currval1}"
attr SVG_01_Garden room Sensors
attr SVG_01_Garden startDate 2013-08-13
define Log.Cellar FileLog demolog/cellar.log Cellar:T:.*
attr Log.Cellar room Sensors
define SVG_02_Cellar SVG Log.Cellar:SVG_02_Cellar:CURRENT
attr SVG_02_Cellar label "Temp: Min $data{min1}, Max $data{max1}, Last $data{currval1}"
attr SVG_02_Cellar room Sensors
attr SVG_02_Cellar startDate 2013-08-13
define Log.Dewpoint FileLog demolog/dewpoint.log .*dewpoint.*
attr Log.Dewpoint room Sensors
define dew_all dewpoint dewpoint .*
attr dew_all group Helper
attr dew_all room Sensors
define SVG_03_Dewpoint SVG Log.Dewpoint:SVG_03_Dewpoint:CURRENT
attr SVG_03_Dewpoint room Sensors
attr SVG_03_Dewpoint startDate 2013-08-13
define logProxy logProxy
attr logProxy room System
define SVG_04_Sun SVG logProxy:SVG_04_Sun:CURRENT
attr SVG_04_Sun fixedrange year
attr SVG_04_Sun room Sensors
attr SVG_04_Sun title {"".logProxy_dec2hms($data{min1})." - ".logProxy_dec2hms($data{max1})." - ".logProxy_dec2hms($data{min2})." - ".logProxy_dec2hms($data{max2})}
define SVG_05_Polar SVG logProxy:SVG_05_Polar:CURRENT
attr SVG_05_Polar plotsize 340,300
attr SVG_05_Polar room Sensors

define sunRise at *{sunrise()} set Office on
attr sunRise group Timer
attr sunRise icon weather_sunrise
attr sunRise room Light
define sunSet at *{sunset()} set Office off
attr sunSet group Timer
attr sunSet icon weather_sunset
attr sunSet room Light
define outdoorNotifier notify Outdoor:.* set Office $EVENT
attr outdoorNotifier group Notify
attr outdoorNotifier icon light_ceiling_light
attr outdoorNotifier room Light

define Projector dummy
attr Projector userattr lightSceneParamsToSave lightSceneRestoreOnlyIfChanged:1,0
attr Projector devStateIcon on:control_on_off:off off:control_home:on
attr Projector group AV
attr Projector room Cinema
attr Projector setList on:noArg off:noArg
attr Projector webCmd on:off
define TV dummy
attr TV userattr lightSceneParamsToSave lightSceneRestoreOnlyIfChanged:1,0
attr TV devStateIcon on:control_on_off:off off:control_home:on
attr TV group AV
attr TV room Cinema
attr TV setList on:noArg off:noArg
attr TV webCmd on:off
define Screen dummy
attr Screen userattr lightSceneParamsToSave lightSceneRestoreOnlyIfChanged:1,0
attr Screen devStateIcon down:fts_garage_door_100:up up:fts_garage_door_10:down
attr Screen group AV
attr Screen room Cinema
attr Screen setList up:noArg down:noArg
attr Screen webCmd down:up
define CeilingLight FS20 0001 01
attr CeilingLight userattr lightSceneParamsToSave lightSceneRestoreOnlyIfChanged:1,0
attr CeilingLight IODev CUL_0
attr CeilingLight eventMap off:dim0% on:dim100%
attr CeilingLight group Light
attr CeilingLight icon light_ceiling_light
attr CeilingLight model dummyDimmer
attr CeilingLight room Cinema
attr CeilingLight webCmd on:off:dim
define ReadingLight FS20 0001 02
attr ReadingLight userattr lightSceneParamsToSave lightSceneRestoreOnlyIfChanged:1,0
attr ReadingLight IODev CUL_0
attr ReadingLight eventMap off:dim0% on:dim100%
attr ReadingLight group Light
attr ReadingLight icon light_floor_lamp
attr ReadingLight room Cinema
attr ReadingLight webCmd on:off:dim:dim 50
define wlCinema weblink htmlCode {LightScene_2html("lcCinema")}
attr wlCinema room Cinema
define lcCinema LightScene Projector Screen TV CeilingLight ReadingLight
attr lcCinema alias Scenes
attr lcCinema devStateIcon AllOff:control_home Break:rc_PAUSE Cinema:scene_cinema WatchTV:it_television
attr lcCinema group Control
attr lcCinema icon scene_scene
attr lcCinema room Cinema
attr lcCinema webCmd scene

define anyViews Dashboard
attr anyViews dashboard_colcount 2
attr anyViews dashboard_row top-center
attr anyViews dashboard_rowcentercolwidth 400
attr anyViews dashboard_rowtopheight 205
attr anyViews dashboard_tab1groups Home State,Light,AV,Single Lights
attr anyViews dashboard_tab1name Dashboard Demo
attr anyViews dashboard_tab1sorting t0c100,Light,true,518,129:t0c100,Home State,true,496,204:t0c0,Single Lights,true,522,209:t0c0,AV,true,221,170:
attr anyViews dashboard_tabcount 1
attr anyViews dashboard_width 80%
attr anyViews room hidden

define anyViews_weblink weblink htmlCode {DashboardAsHtml("anyViews")}
attr anyViews_weblink room DashboardRoom

define rgr_Residents RESIDENTS
attr rgr_Residents alias Residents
attr rgr_Residents devStateIcon .*home:status_available:absent .*absent:status_away_1:home .*gone:status_standby:home .*none:control_building_empty .*gotosleep:status_night:asleep .*asleep:status_night:awoken .*awoken:status_available:home
attr rgr_Residents group Home State
attr rgr_Residents icon control_building_filled
attr rgr_Residents room Residents
attr rgr_Residents sortby 2
attr rgr_Residents webCmd state
define rgr_Parents RESIDENTS
attr rgr_Parents alias Parents
attr rgr_Parents devStateIcon .*home:status_available:absent .*absent:status_away_1:home .*gone:status_standby:home .*none:control_building_empty .*gotosleep:status_night:asleep .*asleep:status_night:awoken .*awoken:status_available:home
attr rgr_Parents group Home State
attr rgr_Parents icon control_building_filled
attr rgr_Parents room Residents
attr rgr_Parents sortby 2
attr rgr_Parents webCmd state
define rgr_Children RESIDENTS
attr rgr_Children alias Children
attr rgr_Children devStateIcon .*home:status_available:absent .*absent:status_away_1:home .*gone:status_standby:home .*none:control_building_empty .*gotosleep:status_night:asleep .*asleep:status_night:awoken .*awoken:status_available:home
attr rgr_Children group Home State
attr rgr_Children icon control_building_filled
attr rgr_Children room Residents
attr rgr_Children sortby 3
attr rgr_Children webCmd state
define rgr_Guests RESIDENTS
attr rgr_Guests alias Guests
attr rgr_Guests devStateIcon .*home:status_available:absent .*absent:status_away_1:home .*gone:status_standby:home .*none:control_building_empty .*gotosleep:status_night:asleep .*asleep:status_night:awoken .*awoken:status_available:home
attr rgr_Guests group Home State
attr rgr_Guests icon control_building_filled
attr rgr_Guests room Residents
attr rgr_Guests sortby 4
attr rgr_Guests webCmd state
define rg_Guest1 GUEST rgr_Residents,rgr_Guests
attr rg_Guest1 alias Guest1
attr rg_Guest1 devStateIcon .*home:user_available:absent .*absent:user_away:home .*none:control_building_empty:home .*gotosleep:scene_toilet:asleep .*asleep:scene_sleeping:awoken .*awoken:scene_sleeping_alternat:home .*:user_unknown
attr rg_Guest1 group Guests
attr rg_Guest1 icon scene_visit_guests
attr rg_Guest1 rg_autoGoneAfter 0.01
attr rg_Guest1 rg_realname alias
attr rg_Guest1 room Residents
attr rg_Guest1 sortby 1
attr rg_Guest1 webCmd state
define rg_Guest2 GUEST rgr_Residents,rgr_Guests
attr rg_Guest2 alias Guest2
attr rg_Guest2 devStateIcon .*home:user_available:absent .*absent:user_away:home .*none:control_building_empty:home .*gotosleep:scene_toilet:asleep .*asleep:scene_sleeping:awoken .*awoken:scene_sleeping_alternat:home .*:user_unknown
attr rg_Guest2 group Guests
attr rg_Guest2 icon scene_visit_guests
attr rg_Guest2 rg_autoGoneAfter 0.01
attr rg_Guest2 rg_realname alias
attr rg_Guest2 room Residents
attr rg_Guest2 sortby 1
attr rg_Guest2 webCmd state
define rr_Father ROOMMATE rgr_Residents,rgr_Parents
attr rr_Father alias Status
attr rr_Father devStateIcon .*home:user_available:absent .*absent:user_away:home .*gone:user_ext_away:home .*gotosleep:scene_toilet:asleep .*asleep:scene_sleeping:awoken .*awoken:scene_sleeping_alternat:home .*:user_unknown
attr rr_Father group Father
attr rr_Father icon status_available
attr rr_Father room Residents
attr rr_Father rr_autoGoneAfter 0.1
attr rr_Father sortby 0
attr rr_Father webCmd state
define rr_Mother ROOMMATE rgr_Residents,rgr_Parents
attr rr_Mother alias Status
attr rr_Mother devStateIcon .*home:user_available:absent .*absent:user_away:home .*gone:user_ext_away:home .*gotosleep:scene_toilet:asleep .*asleep:scene_sleeping:awoken .*awoken:scene_sleeping_alternat:home .*:user_unknown
attr rr_Mother group Mother
attr rr_Mother icon status_available
attr rr_Mother room Residents
attr rr_Mother rr_autoGoneAfter 0.1
attr rr_Mother rr_passPresenceTo rr_Baby
attr rr_Mother sortby 0
attr rr_Mother webCmd state
define rr_Daughter ROOMMATE rgr_Residents,rgr_Children
attr rr_Daughter alias Status
attr rr_Daughter devStateIcon .*home:user_available:absent .*absent:user_away:home .*gone:user_ext_away:home .*gotosleep:scene_toilet:asleep .*asleep:scene_sleeping:awoken .*awoken:scene_sleeping_alternat:home .*:user_unknown
attr rr_Daughter group Daughter
attr rr_Daughter icon status_available
attr rr_Daughter room Residents
attr rr_Daughter sortby 0
attr rr_Daughter webCmd state
define rr_Son ROOMMATE rgr_Residents,rgr_Children
attr rr_Son alias Status
attr rr_Son devStateIcon .*home:user_available:absent .*absent:user_away:home .*gone:user_ext_away:home .*gotosleep:scene_toilet:asleep .*asleep:scene_sleeping:awoken .*awoken:scene_sleeping_alternat:home .*:user_unknown
attr rr_Son group Son
attr rr_Son icon status_available
attr rr_Son room Residents
attr rr_Son sortby 0
attr rr_Son webCmd state
define AllResidentsAway notify rgr_Residents:(absent|gone) set AllLights off;;set lcCinema scene AllOff
attr AllResidentsAway room Residents
define ResidentsComeHome notify rgr_Residents:home set Outdoor on
attr ResidentsComeHome room Residents
define rr_Baby ROOMMATE rgr_Residents,rgr_Children
attr rr_Baby alias Status
attr rr_Baby devStateIcon .*home:user_available:absent .*absent:user_away:home .*gone:user_ext_away:home .*gotosleep:scene_toilet:asleep .*asleep:scene_sleeping:awoken .*awoken:scene_sleeping_alternat:home .*:user_unknown
attr rr_Baby group Baby
attr rr_Baby icon status_available
attr rr_Baby room Residents
attr rr_Baby sortby 0
attr rr_Baby webCmd state
define RGB readingsProxy RGB
attr RGB userattr Light Light_map structexclude
attr RGB Light AllLights
attr RGB alias RGB Light
attr RGB comment light with the ability to change RGB color
attr RGB devStateIcon {Color::devStateIcon("RGB","rgb","rgb","state")}
attr RGB group Color Lights
attr RGB room Light
attr RGB setFn {if( $CMD =~ m/on|off/ ) { $ARGS=$CMD;;$CMD = "state" } else {fhem ("setreading $DEVICE state on");;} if( $CMD =~ m/hue/ ) {my ($r,$g,$b) = Color::hsv2rgb($ARGS/360,1,1);; my $rgb = Color::rgb2hex( $r*255, $g*255, $b*255 );; fhem ("setreading $DEVICE rgb $rgb");;} if( $CMD =~ m/rgb/ && $ARGS =~ m/^(..)(..)(..)/ ) {my( $r, $g, $b ) = (hex($1)/255.0, hex($2)/255.0, hex($3)/255.0);; my ($h,$s,$v) = Color::rgb2hsv($r,$g,$b);; my $hue = int($h*359);;  fhem ("setreading $DEVICE hue $hue");;} fhem ("setreading $DEVICE $CMD $ARGS");;return undef;;}
attr RGB setList on:noArg off:noArg rgb:colorpicker,RGB hue:colorpicker,HUE,0,1,359
attr RGB webCmd hue:rgb:rgb ff0000:rgb 00ff00:rgb 0000ff:rgb ffffff:on:off
define colorInit notify global:INITIALIZED {use Color;;Color_Initialize()}
attr colorInit room hidden
define CT readingsProxy CT
attr CT userattr Light Light_map structexclude
attr CT Light AllLights
attr CT alias CT Light
attr CT comment light with the ability to change the color temperature
attr CT devStateIcon {Color::devStateIcon("CT","rgb","rgb","state")}
attr CT getFn { my ($r,$g,$b) = Color::ct2rgb( ReadingsVal($DEVICE,"ct",333) );; return (Color::rgb2hex($r,$g,$b), 1);; }
attr CT getList rgb:noArg
attr CT group Color Lights
attr CT room Light
attr CT setFn {if( $CMD =~ m/on|off/ ) { $ARGS=$CMD;;$CMD = "state" } else {fhem ("setreading $DEVICE state on");;}  fhem ("setreading $DEVICE $CMD $ARGS");;return undef;;}
attr CT setList on:noArg off:noArg ct:colorpicker,CT,2000,1,6500
attr CT webCmd ct::ct 2040:ct 2630:ct 3703:ct 6250:on:off

define Weather Weather 673513 1800 de
attr Weather group Weather
attr Weather room Weather

define Weather.weblink weblink htmlCode { WeatherAsHtmlH("Weather") }
attr Weather.weblink alias Weather Forecast
attr Weather.weblink room Weather

define ModbusRS485 Modbus /dev/ttyUSB0@9600
define HA_Modbus_1 Modbus /dev/ttyUSB0@9600 define HA_SDM630M_1 ModbusSDM630M 1 5
define ModBusLine Modbus /dev/ttyUSB0@9600    HA_SDM630M_2 ModbusSDM630M 1 60
define SVG_Log.Cellar_1 SVG Log.Cellar:SVG_Log.Cellar_1:CURRENT