How To: Westaflex WAC350 ModBus Binding

Für welche Projekte verwendet Ihr OpenHAB? Was habt Ihr automatisiert? Stellt eure Projekte hier vor.

Moderatoren: Cyrelian, seppy

Antworten
Benutzeravatar
PeterA
Beiträge: 1052
Registriert: 8. Feb 2019 12:12
Answers: 13

How To: Westaflex WAC350 ModBus Binding

Beitrag von PeterA »

Hallo zusammen,

Hier möchte ich nun mein Projekt vorstellen:
Anbindung einer Lüftungsanlage WAC350 von Westaflex via ModBus. Verwendete Hardware:
Raspi B3+ und ein ModBus Steckmodul: https://www.hwhardsoft.de/deutsch/proje ... 85-shield/
Sowie RJ11/RJ45 Adapter: https://www.kab24.de/kommunikation/kab2 ... 1553093850
image_80993.png
Ein großes Dankeschön geht in erste Linie an rossko57 vom Englischen OpenHab Forum. Er hat hier als "Ghostwriter" für mich fungiert.
Da ich zunächst alles über die PaperUI erstellt hatte, habe ich rossko57 meine Files aus der RestAPI zur Verfügung gestellt.
Den Original Thread findet Ihr übrigens hier: https://community.openhab.org/t/setup-m ... ac/70573/6
Des weiteren möchte ich Udo, Madmike, und PeterPan für die Unterstützung an vielen Stellen Danken!
Los gehts:

Here we describe how to use Modbus binding 2.x to allow openHAB to interact with a Westaflex WAC350 aircon, other models are probably similar.

WAC350 provides a serial port, so you’d probably use an RS485 USB dongle on your OH host, or an RS485 shield, then connect with twisted pair cable and RJ45 connector. For a long cable run, you may need to arrange a terminator resistor for your RS485 cable.

RJ45 Port 1 on the unit is reserved for the ‘FLEX’ controller panel, Port 2 is the one for external systems like openHAB, these are separate serial buses.

Follow the WAC manual to set up Port 2 serial parameters – typically 19200 baud, no parity, slave ID 1

We’ll also need to know the Modbus register map for this device, as found in the manual.
Screenshot_p19.jpeg
https://drive.google.com/open?id=1iU30j ... 50DvMpvutZ

The WAC350 has several read-only ‘coils’ for binary signals, some writeable coils for control,
read-only ‘input’ registers for numeric sensing, and writeable ‘holding’ registers for control.

That’s all we need to know to set up Modbus binding.

In this example we only use a few of the available registers.

We need to set up Things for the Modbus binding. A serial Bridge thing to define the basic slave, and poller Bridge things for each group of registers we want to access. Finally data Things that describe how to interpret each register.

You have a choice; you may add Things using PaperUI and edit parameters onscreen, for the OH system to save in its database.
Or you may add Things via a text file with your editor, say wac350.things. (You can also view these, but not edit, in PaperUI.)
Don’t try to mix these methods.

I’m going to list settings in the xxx.things style, as it’s more compact than providing a lot of PaperUI screenshots.

westaflex.things:

Code: Alles auswählen

// define the serial path to Westaflex
Bridge modbus:serial:wac350
     [ port="/dev/ttyS0", baud=19200, stopBits="1.0", parity="none", dataBits=8, encoding="rtu" ] {

     // define a block of coils to read
     Bridge poller wcoil [ start=17 length=1 refresh=10000 type="coil" ] {
              // selected coils of interest
              Thing data wc17 [ readStart="17", readValueType="bit", writeStart="17", writeType="coil" ]
     }

     // define block of inputs to read
     Bridge poller winputA [ start=0 length=10 refresh=5000 type="input" ] {
             // selected input reg
             Thing data wi00 [ readStart="0", readValueType="int16", readTransform="JS(divide10.js)" ]
             Thing data wi03 [ readStart="3", readValueType="int16", readTransform="JS(divide10.js)" ]
             Thing data wi06 [ readStart="6", readValueType="int16", readTransform="JS(divide10.js)" ]
             Thing data wi09 [ readStart="9", readValueType="int16", readTransform="JS(divide10.js)" ]
     }

     // define another block of inputs to read
     Bridge poller winputB [ start=12 length=5 refresh=5000 type="input" ] {
             Thing data wi13 [ readStart="13", readValueType="int16" ]
             Thing data wi14 [ readStart="14", readValueType="int16" ]
             Thing data wi15 [ readStart="15", readValueType="int16" ]
             Thing data wi16 [ readStart="16", readValueType="int16" ]
     }

     // define block of holdings to read/write
     Bridge poller wholdA [ start=0 length=2 refresh=10000 type="holding" ] {
             Thing data wh00 [ readStart="0", readValueType="int16", writeStart="0", writeValueType="int16", writeType="holding" ]
             Thing data wh01 [ readStart="1", readValueType="int16", writeStart="1", writeValueType="int16", writeType="holding" ]
     }

     // define another block of holdings to read/write
     Bridge poller wholdB [ start=300 length=10 refresh=10000 type="holding" ] {
              Thing data wh305 [ readStart="305", readValueType="uint16" ]
      }
}
Notice that some of the data Things use a read transform: some Westaflex registers contain e.g. 195 representing 19.5 degrees, so we tell the binding to use a little javascript to do the division as the binding updates the Item.
You will need to make sure the transformation service is installed in OH, and then create this file and put it in/conf/transform/

divide10.js:

Code: Alles auswählen

// Wrap everything in a function (no global variable pollution)
(function(inputData) {
// on read: the polled number as string
return parseFloat(inputData) / 10;
})(input)
Creating the data Things automatically makes various channels available for your Items.
At this stage, you should be polling your Westaflex over Modbus error free.

To make the data available to openHAB rules and Uis, you must link Items to the Modbus channels.

westaflex.items:

Code: Alles auswählen

Group WAC350_Sensors "Westaflex sensors"

Number Zuluft "Zuluft [%.0f]" (WAC350_Sensors) { channel="modbus:data:winputA:wi00:number" }
Number Abluft "Abluft [%.0f]" (WAC350_Sensors) { channel="modbus:data:winputA:wi03:number" }
Number Fort_Luft "Fortluft [%.0f]" (WAC350_Sensors) { channel="modbus:data:winputA:wi06:number" }
Number Aussenluft "Aussenluft [%.0f]" (WAC350_Sensors) { channel="modbus:data:winputA:wi09:number" }
Number Abluftfeuchte "Abluftfeuchte [%.0f]" (WAC350_Sensors) { channel="modbus:data:winputB:wi13:number" }
Number Bypassklappe "Bypassklappe [%.0f]" (WAC350_Sensors) { channel="modbus:data:winputB:wi14:number" }
Number Luefter1 "Luefter1 [%.0f]" (WAC350_Sensors) { channel="modbus:data:winputB:wi15:number" }
Number Luefter2 "Luefter2 [%.0f]" (WAC350_Sensors) { channel="modbus:data:winputB:wi16:number" }
Number LuefterStufe "LuefterStufe [%.0f]" (WAC350_Sensors) { channel="modbus:data:wholdA:wh00:number" }
Number ZuluftTempSet "Solltemperatur [%.0f]" (WAC350_Sensors) { channel="modbus:data:wholdA:wh01:number" }
Number FilterTimer "Filter Timer [%.0f]" { channel="modbus:data:wholdB:wh305:number" }
Switch FanStandby_Switch "FanStandby_Switch" { channel="modbus:data:wcoil:wc17:switch" }
The following Items are not linked to Modbus, may be useful in rules

westaflexplus.items:

Code: Alles auswählen

// additional Items for rules

// for calculated efficiency
Number Wirkungsgrad "Wirkungsgrad" (WAC350_Sensors)

// set your outdoor temp limits and a control
Switch Lueftung_min_max_Temp "Lueftung_min_max_Temp"
Number:Temperature AussenGrenzMax_Set "AussenGrenzMax_Set"
Number:Temperature AussenGrenzMin_Set "AussenGrenzMin_Set"

// set your timer controls
Switch WAC350_Zeitschaltung_01
Switch WAC350_Zeitschaltung_02
// timer hours and mins controls
Number Deko_WECKER_H "Start Stunde [%s]"
Number Deko_WECKER_M "Start Minute [%s]"
Number Deko_WECKER_Ho "Start Stunde [%s]"
Number Deko_WECKER_Mo "Start Minute [%s]"
Some rule samples, to control your HVAC

westaflex.rules:

Code: Alles auswählen

// Beginn der Datei
// globale Variablen
var Long lLStufe
var Timer Deko = null


rule "Aussenluft manuell"
when
    Item AussenTemp changed // your outdoor temp sensor
then
   if(Lueftung_min_max_Temp.state != ON) return;  // wenn Schalter aus(nicht an) , keine Aktionen
   
   if(!(AussenTemp.state instanceof Number)) {
        logWarn("Lüftung manuell", "AussenTemp.state not a Number: {}",AussenTemp.state)  // numerisch ?
        return;
   }
   if (AussenTemp.state >= AussenGrenzMax_Set.state && FanStandby_Switch.state != OFF) {
       // above max limit
       FanStandby_Switch.sendCommand(ON)
       logInfo("Lüftung manuell", "LuefterStufe ist jetzt: {} AussenTemp beträgt {}",LuefterStufe.state,AussenTemp.state )
       
   }
   else if (AussenTemp.state <= AussenGrenzMin_Set.state && FanStandby_Switch.state != ON) { // below min limit
       FanStandby_Switch.sendCommand(OFF)
       logInfo("Lüftung manuell", "LuefterStufe ist jetzt: {} AussenTemp beträgt {}",LuefterStufe.state,AussenTemp.state)
       
   }
end


rule "luefter geändert"
when
    Item LuefterStufe changed
then
    lLStufe = now.millis
end

rule "berechne Wirkungsgrad"  // calculate efficiency
when
    Item Abluft changed or
    Item Zuluft changed or
    Item Aussenluft changed
then
    if(lLStufe + 15*60*1000 < now.millis && LuefterStufe.state.toString != "0"){
    //Lüfter läuft bereits mindestens 15 Minuten auf der aktuellen Stufe

       if(!(Abluft.state instanceof Number)) {
           logWarn("Wirkungsgrad", "Abluft.state not a Number: {}",Abluft.state)
           return;
       }
       if(!(Zuluft.state instanceof Number)) {
           logWarn("Wirkungsgrad", "Zuluft.state not a Number: {}",Zuluft.state)
           return;
       }
       if(!(Aussenluft.state instanceof Number)) {
           logWarn("Wirkungsgrad", "Aussenluft.state not a Number: {}", Aussenluft.state)
           return;
       }
       val Number Aussenluft = (Aussenluft.state as Number)
       val Number nDivisor = (Abluft.state as Number) - Aussenluft //Wert fuer Berechung gem. Westaflex
       val Number nFaktor = (Zuluft.state as Number) - Aussenluft //Wert fuer Berechung gem. Westaflex
       if(nDivisor == 0) {
           logWarn("Wirkungsgrad", "Aussentemperatur = Ablufttemperatur, Division durch 0!")
           Wirkungsgrad.postUpdate(NULL)
       } else
           Wirkungsgrad.postUpdate((100*nFaktor/nDivisor).intValue) //Berechung gem. Westaflex
          
 }
end


rule "Wecker Deko"
    when
        Time cron "0 * * * * ?" //Abfrage jede Minute
    then

    if(WAC350_Zeitschaltung_01.state == ON) {
        var sollMinute = (Deko_WECKER_M.state as DecimalType).intValue
        var sollStunde = (Deko_WECKER_H.state as DecimalType).intValue
        var sollMinuteo = (Deko_WECKER_Mo.state as DecimalType).intValue
        var sollStundeo = (Deko_WECKER_Ho.state as DecimalType).intValue

        if (sollMinute == now.getMinuteOfHour && sollStunde == now.getHourOfDay) {
            LuefterStufe.sendCommand(1)
        } else if (sollMinuteo == now.getMinuteOfHour && sollStundeo == now.getHourOfDay) {
            LuefterStufe.sendCommand(0)
        }
    }
    
    if(WAC350_Zeitschaltung_02.state == ON) {
        var sollMinute = (Deko_WECKER_Ma.state as DecimalType).intValue
        var sollStunde = (Deko_WECKER_Ha.state as DecimalType).intValue
        var sollMinuteo = (Deko_WECKER_Maa.state as DecimalType).intValue
        var sollStundeo = (Deko_WECKER_Haa.state as DecimalType).intValue

        if (sollMinute == now.getMinuteOfHour && sollStunde == now.getHourOfDay) {
            LuefterStufe.sendCommand(2)
        } else if (sollMinuteo == now.getMinuteOfHour && sollStundeo == now.getHourOfDay) {
            LuefterStufe.sendCommand(1)
        }    
    }
end
Here comes a another rule for having a reminder to change the filters inside the unit:

Code: Alles auswählen

 // globale Variablen müssen zu Beginn der rules Datei deklariert werden!
var Timer tFilter = null

rule "Filterwarnung"

when
    Item FilterTimer changed
    
then
    if(tFilter === null && (FilterTimer.state >2000 )) {
        tFilter = createTimer(now.plusHours(12), [ |
            tFilter = null
        ])
        sendBroadcastNotification("Erinnerung !!  Filterwechsel bei 2160h! Aktueller Wert "+FilterTimer.state.toString+"h") //Allgemeine Warnung an alle 
        
        
    }
end
Und hier ein Auszug aus meiner Sitemap:

Code: Alles auswählen

 Switch item=FanStandby_Switch label="Lüftung Standby" icon="switch"
            Text label="Lüftung manuell" icon="flow" {
            Switch item=Lueftung_min_max_Temp label="Lüftung manuell" icon="switch"
            Text item=AussenTemp label="AussenTemp aktuell [%.1f °C]" icon="temperature" valuecolor=[>27="red",>20="orange",>10="purple",>5="green",<=5="blue"]
            Setpoint item=AussenGrenzMax_Set label="AussenTemp Lüftung Stop [%.1f °C]" icon="temperature" minValue=15 maxValue=24 step=0.5
            Setpoint item=AussenGrenzMin_Set label="AussenTemp Lüftung Start [%.1f °C]" icon="temperature" minValue=13 maxValue=20 step=0.5
        } 
            Text item=Lueftung_min_max_Temp label="Lüftung manuell ist Aktiv" icon="switch" visibility=[Lueftung_min_max_Temp==ON]
            Text label="Zeitschaltuhr" icon="time" {
            Switch item=WAC350_Zeitschaltung_01 label="Stufe: Stop/Klein" icon="time" mappings=[ON="Timer an", OFF="Timer aus"]
            Setpoint item=Deko_WECKER_H      minValue=0 maxValue=23 step=1
			Setpoint item=Deko_WECKER_M     minValue=0 maxValue=59 step=1 
            Setpoint item=Deko_WECKER_Ho      minValue=0 maxValue=23 step=1
			Setpoint item=Deko_WECKER_Mo     minValue=0 maxValue=59 step=1  
            Selection item=LuefterStufe label="Lüfterstufe" icon="fan" mappings=[0="Stopp", 1="Klein", 2="Mittel", 3="Hoch"]
            Switch item=WAC350_Zeitschaltung_02 label="Stufe: Mittel/Klein" icon="time" mappings=[ON="Timer an", OFF="Timer aus"]
            Setpoint item=Deko_WECKER_Ha      minValue=0 maxValue=23 step=1
			Setpoint item=Deko_WECKER_Ma     minValue=0 maxValue=59 step=1 
            Setpoint item=Deko_WECKER_Haa      minValue=0 maxValue=23 step=1
			Setpoint item=Deko_WECKER_Maa     minValue=0 maxValue=59 step=1     
        }  
        Text item=WAC350_Zeitschaltung_01 label="Zeitschaltuhr Stop-Klein ist AKTIV" icon="time" visibility=[WAC350_Zeitschaltung_01==ON]
        Text item=WAC350_Zeitschaltung_02 label="Zeitschaltuhr Mittel-Klein ist AKTIV" icon="time" visibility=[WAC350_Zeitschaltung_02==ON]
        Selection item=LuefterStufe label="Lüfterstufe" icon="fan" mappings=[0="Stopp", 1="Klein", 2="Mittel", 3="Hoch"]
        Setpoint item=ZuluftTempSet label="Solltemperatur [%.1f °C]" icon="temperature" minValue=15 maxValue=25 step=1
        Text item=Luefter1 label="Lüfter 1 Drehzahl [%s %%]" icon="fan"
        Text item=Luefter2 label="Lüfter 2 Drehzahl [%s %%]" icon="fan"    
        Text item=Abluft label="Abluft aktuell [%.1f °C]" icon="temperature" valuecolor=[>27="red",>20="orange",>10="purple",>5="green",<=5="blue"]
        Text item=Zuluft label="Zuluft aktuell [%.1f °C]" icon="temperature" valuecolor=[>27="red",>20="orange",>10="purple",>5="green",<=5="blue"]
        Text item=Aussenluft label="Aussenluft aktuell [%.1f °C]" icon="temperature" valuecolor=[>27="red",>20="orange",>10="purple",>5="green",<=5="blue"]
        Text item=Fort_Luft label="Fortluft aktuell [%.1f °C]" icon="temperature" valuecolor=[>27="red",>20="orange",>10="purple",>5="green",<=5="blue"]
        Text item=Abluftfeuchte label="Abluftfeuchte aktuell [%s %%]" icon="humidity" valuecolor=[>70="red",>60="orange",>50="purple",>35="green",<=25="blue"]
        Text item=Wirkungsgrad label="Wirkungsgrad aktuell [%s %%]" icon="qualityofservice"
        Text item=Bypassklappe label="Bypass: [MAP(de.map):%s]" icon="switch"
        Text item=FilterTimer label="Filtertimer [%s h]" icon="time" valuecolor=[>2159="red",>2000="orange",>0="green"]
        Text label="Filter tauschen bei 2160h!" icon="error" visibility=[FilterTimer>=2000]
        Switch item=FiltertimerReset label="Reset Filtertimer" icon="error" visibility=[FilterTimer>=2000,FilterTimer==0]
Und hier noch ein Screenshot meiner Sitemap:
Übersicht:
Bildschirmfoto 2019-03-19 um 20.39.40.png


Viel Spass damit!
- OpenHab 2.4
#PWRUP

Benutzeravatar
PeterA
Beiträge: 1052
Registriert: 8. Feb 2019 12:12
Answers: 13

Re: How To: Westaflex WAC350 ModBus Binding

Beitrag von PeterA »

Die Entwicklung bleibt ja nicht stehen.
Hier weitere Rules zur Steuerung der Lüftungsanlage:
Vielen Dank an Tokamak und Udo für den Input.

Hier geht es um einen Betrieb der Lüftung an Hand der Luftfeuchte im Gebäude.
Zusätzlich wird aber über die Mittagszeit "Zwangsgelüftet" um Küchengerüche aus dem Gebäude zu bekommen.

Code: Alles auswählen

rule "WACLuftfeuchtigkeit"
when
    Member of Durchschnitt_Feuchte_Haus changed // Durchschnitt Feuchte durch Lacrosse Sensoren
then
    if (WAC350_Durchschnitt_Feuchte_Haus.state != ON) { // wenn Schalter aus(nicht an) , keine Aktionen
        logInfo("Feuchtesteuerung:","Steuerung deaktiviert!")
    return;
    }
    // bestimme die durchschnittliche und maximale Luftfeuchte
    var int lfSumme=0
    var int lfMax=0
    var int lfCnt=0
    for (item: Durchschnitt_Feuchte_Haus.members) {
        if (item.state instanceof Number) {
            lfCnt+=1
            val int lf=(item.state as Number).intValue()
            lfSumme+=lf
            if (lf>lfMax) lfMax=lf
        }
    }
    // nur bei mindestens 2 Werten ist es sinnvoll, die Werte zu betrachten
    var int lfAvg
    if (lfCnt>=2) {
        lfAvg=lfSumme/lfCnt
    }
    else {
        lfAvg=0
        lfMax=0
    }
    // Bei mehr als max 55% pro Sensor oder avg 50% Luftfeuchtigkeit lüfte.
    if ((lfMax>=55 || lfAvg>=50) && FanStandby_Switch.state != OFF) {  // Standby ist ON und nicht OFF = Lüftung läuft nicht
        FanStandby_Switch.sendCommand(OFF)                             // Schalte Lüftung EIN
        logInfo("Feuchtesteuerung:","Lüftung EIN") 
        sendBroadcastNotification("Feuchtesteuerung: Lüftung EIN")     //Pushnachricht
    }
    else {
    // fällt die Luftfeuchte aller Sensoren unter 45%, wurde genug gelüftet. Lüftung Stop
    if ((lfMax<45) && FanStandby_Switch.state != ON) {                 // Standby ist OFF und nicht ON = Lüftung läuft
        FanStandby_Switch.sendCommand(ON)                              // Schalte Lüftung Standby
        logInfo("Feuchtesteuerung:","Lüftung Standby")
        sendBroadcastNotification("Feuchtesteuerung: Lüftung Standby") //Pushnachricht
        }
    }
end

rule "Zwangslüftung EIN"
when 
    Time cron "0 30 11 1/1 * ? *" // 11:30 Uhr 
then
    if (WAC350_Durchschnitt_Feuchte_Haus_Zwang.state != ON) {          // wenn Schalter aus(nicht an) , keine Aktionen
        logInfo("Zwangslüftung:","Einschaltzeit erreicht aber Deaktiviert")
        sendBroadcastNotification("Zwangslüftung: Einschaltzeit erreicht aber Deaktiviert") //Pushnachricht
    return;
    }
    // wenn Uhrzeit erreicht ist deaktiviere Feuchte Steuerung und deaktiviere Lüftung Standby (schalte Lüftung ein)
        WAC350_Durchschnitt_Feuchte_Haus.postUpdate(OFF)               // deaktiviere Feuchte Steuerung
        FanStandby_Switch.sendCommand(OFF)                             // Schalte Lüftung EIN
        logInfo("Zwangslüftung:","Zwangslüftung eingeschaltet") 
        sendBroadcastNotification("Zwangslüftung eingeschaltet")        //Pushnachricht
    
end

rule "Zwangslüftung AUS"
when 
    Time cron "0 30 13 1/1 * ? *" // 13:30 Uhr 
then
    if (WAC350_Durchschnitt_Feuchte_Haus_Zwang.state != ON) {          // wenn Schalter aus(nicht an) , keine Aktionen
        logInfo("Zwangslüftung:","Ausschaltzeit erreicht aber Deaktiviert")
        sendBroadcastNotification("Zwangslüftung: Ausschaltzeit erreicht aber Deaktiviert") //Pushnachricht
    return;
    }
    // wenn Uhrzeit erreicht ist aktiviere Feuchte Steuerung          // und aktiviere Lüftung Standby (schalte Lüftung aus)
        WAC350_Durchschnitt_Feuchte_Haus.postUpdate(ON)               // deaktiviere Feuchte Steuerung
        //FanStandby_Switch.sendCommand(ON)                           // Schalte Lüftung AUS
        logInfo("Zwangslüftung:","Zwangslüftung Ausgeschaltet") 
        sendBroadcastNotification("Zwangslüftung Ausgeschaltet")        //Pushnachricht
    
end
- OpenHab 2.4
#PWRUP

Benutzeravatar
PeterA
Beiträge: 1052
Registriert: 8. Feb 2019 12:12
Answers: 13

Re: How To: Westaflex WAC350 ModBus Binding

Beitrag von PeterA »

A long time ago in the deep flieds of the OpenHab Universum ..... :-)

Hatte gerade mal Zeit und habe die textuelle Konfig noch mal überarbeitet und ins reine Geschrieben.
Wahrscheinlich brauch das eh niemand. Aber dann isses auch mal Veröffentlicht.

modbus.things:

Code: Alles auswählen

// define the serial path to Westaflex
Bridge modbus:serial:wac350
     [ port="/dev/ttyS0", baud=19200, stopBits="1.0", parity="none", dataBits=8, encoding="rtu" ] {

     // define a block of coils to read // Regular poll Fanstandby
     Bridge poller wcoil [ start=9, length=35, refresh=10000, type="coil" ] {
              // selected coils of interest
              Thing data wc09 [ readStart="9",  readValueType="bit", writeStart="9",  writeType="coil" ] //Geringe_Feuchte_Alarm
              Thing data wc16 [ readStart="16", readValueType="bit", writeStart="16", writeType="coil" ] //FilterTimeReset
              Thing data wc17 [ readStart="17", readValueType="bit", writeStart="17", writeType="coil" ] //FanStandby_Switch
              Thing data wc18 [ readStart="18", readValueType="bit", writeStart="18", writeType="coil" ] //System_Reset
              Thing data wc42 [ readStart="42", readValueType="bit", writeStart="42", writeType="coil" ] //Bypass Active
     } 

     // define block of inputs to read // Regular poll 0-10
     Bridge poller winputA [ start=0, length=10, refresh=60000, type="input" ] {
             // selected input reg
             Thing data wi00 [ readStart="0", readValueType="int16", readTransform="JS(divide10.js)" ] //Zuluft
             Thing data wi03 [ readStart="3", readValueType="int16", readTransform="JS(divide10.js)" ] //Abluft
             Thing data wi06 [ readStart="6", readValueType="int16", readTransform="JS(divide10.js)" ] //Fort_Luft
             Thing data wi09 [ readStart="9", readValueType="int16", readTransform="JS(divide10.js)" ] //Aussenluft
     }

     // define another block of inputs to read // Regular poll 12-16
     Bridge poller winputB [ start=12, length=5, refresh=60000, type="input" ] {
             Thing data wi13 [ readStart="13", readValueType="int16" ] //Abluftfeuchte
             Thing data wi14 [ readStart="14", readValueType="int16" ] //Bypassklappe
             Thing data wi15 [ readStart="15", readValueType="int16" ] //Luefter1
             Thing data wi16 [ readStart="16", readValueType="int16" ] //Luefter2
     }

     // define block of holdings to read/write // Regular poll fanspeed
     Bridge poller wholdA [ start=0, length=2, refresh=10000, type="holding" ] {
             Thing data wh00 [ readStart="0", readValueType="int16", writeStart="0", writeValueType="int16", writeType="holding" ] //LuefterStufe
             Thing data wh01 [ readStart="1", readValueType="int16", writeStart="1", writeValueType="int16", writeType="holding" ] //ZuluftTempSet
     }

     // define another block of holdings to read/write // Regular poll
     Bridge poller wholdB [ start=300, length=10, refresh=600000, type="holding" ] {
              Thing data wh305 [ readStart="305", readValueType="uint16" ] //FilterTimer
      }
}
Und die passenden Items dazu:

Code: Alles auswählen

Group     WAC350_Sensors           "Westaflex Sensors"

Number    Zuluft                   "Zuluft [%.0f]"                  (WAC350_Sensors)    {channel="modbus:data:wac350:winputA:wi00:number"}
Number    Abluft                   "Abluft [%.0f]"                  (WAC350_Sensors)    {channel="modbus:data:wac350:winputA:wi03:number"}
Number    Fort_Luft                "Fortluft [%.0f]"                (WAC350_Sensors)    {channel="modbus:data:wac350:winputA:wi06:number"}
Number    Aussenluft               "Aussenluft [%.0f]"              (WAC350_Sensors)    {channel="modbus:data:wac350:winputA:wi09:number"}
Number    Abluftfeuchte            "Abluftfeuchte [%.0f]"           (WAC350_Sensors)    {channel="modbus:data:wac350:winputB:wi13:number"}
Number    Bypassklappe             "Bypassklappe"                   (WAC350_Sensors)    {channel="modbus:data:wac350:winputB:wi14:number"}
Number    Luefter1                 "Luefter1 [%s %%]"               (WAC350_Sensors)    {channel="modbus:data:wac350:winputB:wi15:number"}
Number    Luefter2                 "Luefter2 [%s %%]"               (WAC350_Sensors)    {channel="modbus:data:wac350:winputB:wi16:number"}
Number    LuefterStufe             "LuefterStufe"                   (WAC350_Sensors)    {channel="modbus:data:wac350:wholdA:wh00:number"}
Number    ZuluftTempSet            "Solltemperatur"                 (WAC350_Sensors)    {channel="modbus:data:wac350:wholdA:wh01:number"}
Number    FilterTimer              "Filtertimer [%s h]"                                 {channel="modbus:data:wac350:wholdB:wh305:number"}
Number    Geringe_Feuchte_Alarm    "Alarm geringe Abluftfeuchte"                        {channel="modbus:data:wac350:wcoil:wc09:number"}
Switch    FanStandby_Switch        "FanStandby_Switch"                                  {channel="modbus:data:wac350:wcoil:wc17:switch"}
Switch    FiltertimerReset         "Reset Filtertimer"                                  {channel="modbus:data:wac350:wcoil:wc16:switch"}
Switch    System_Reset             "Reset Alarme"                                       {channel="modbus:data:wac350:wcoil:wc18:switch"}
Number    BypassActive             "Bypass Aktiv"                                       {channel="modbus:data:wac350:wcoil:wc42:number"}
Gruß Peter
- OpenHab 2.4
#PWRUP

Antworten