Seite 1 von 1

Switch Item für numerisches Thing

Verfasst: 6. Nov 2023 10:41
von Hannes
Guten Tag,
ich habe ein Thing, welches einem Modbus Register entspricht, das ich sowohl lesen, als auch schreiben kann.
Diese Thing repräsentiert einen Schalter für das forcierte Laden meines Batteriespeichers aus dem Netz und kann die Werte 0 oder 1 einnehmen (0: forciertes Laden aus, 1: forciertes Laden ein).

Zur Repräsentation und Steuerung des Verhaltens (setzten des Modbus Werts) über die Sitemap möchte ich ein entsprechendes Switch Item verwenden, das aber die Werte ON und OFF verlangt.

Jetzt könnte ich natürlich hergehen und:
- Ein Number-Item anlegen, welches den Wert aus dem Thing als 0 oder 1 enthält (also dem Channel zugeordnet ist)
- Ein Dummy-Switch-Item anlegen, welches über eine Rule, in Abhängigkeit des Number-Items, gesetzt wird
- Eine weitere Rule anlegen, die das Number-Item bei Änderungen des Switch-Items entsprechend aktualisiert

Meine Frage wäre, ob ich das Verhalten auch einfacher bzw. eleganter erreichen könnte, idealerweise ohne zusätzliche Rules etc.

Danke,
Hannes

Re: Switch Item für numerisches Thing

Verfasst: 6. Nov 2023 10:57
von PeterA
Hallo Hannes,

m.E. müsste das direkt in der Sitemap mit dem Number Item über das "Mapping" funktionieren.
So ähnlich ist das hier mit den Stufen der Lüftung hier.
Das Item (Number) kennt nur 0,1,2,3 in der Ui nenne ich das aber
Aus, Klein, Mittel, Groß.
Und über das Mapping "Mappe" ich entsprechend Aus=0 usw.
Heute Abend suche ich den Entsprechenden Code aus der Sitemap.


Gruß Peter

Re: Switch Item für numerisches Thing

Verfasst: 6. Nov 2023 11:53
von Hannes
Hallo Peter,

danke für deine rasche Antwort.
Ich habe nun folgende Einstellung in der Sitemap hinterlegt:

Code: Alles auswählen

 Switch item=GoodWe1_SFCST label="Forciertes Laden" icon="switch" mappings=[0="AUS", 1="EIN"] 
...und konnte damit das gewünschte Verhalten steuern.

Allerdings wird mir damit dann nicht mehr der bekannte Switch "Schieber" angezeigt und die Farbe des Icons wechselt nicht zwischen rot (AUS) und grün (EIN).

Ist aber nicht tragisch, damit kann ich leben.

LG
Hannes

Re: Switch Item für numerisches Thing

Verfasst: 6. Nov 2023 13:04
von PeterA
Prima so.

Mit "valuecolor" und "labelcolor" kann man da noch schön spielen.

Gruß Peter

Re: Switch Item für numerisches Thing

Verfasst: 6. Nov 2023 15:15
von nw378
Der Punkt ist, wenn Du mit mapping (oder der MAP Tranformation) arbeitest, änderst Du nur die Anzeige; nicht den eigentlichen Wert des Items.

Wenn Du mit dem erreichten leben kannst, ist ja alles erledigt.

Falls Du doch einen "klassischen" Switch mit seinen Eigenschaften (inkl. Farbwechsel des Icons) willst, wirst Du um eine rule nicht herumkommen.
Der Aufwand ist aber auch überschaubar:

Das Number Item wirst Du ja eh schon haben (das Thing nimmt keinen Wert an, außer ON- / OFFLINE).
Zusätzlich benötigst du eben ein Switch Item.

Code: Alles auswählen

rule "Switch item GoodWe1_SFCST" 
when 
    Item  GoodWe1_SFCST changed
then
    if (newState == 0) Switch_GoodWe1_SFCST.sendCommand(OFF) 
else
    Switch_GoodWe1_SFCST.sendCommand(ON) 
end    

Re: Switch Item für numerisches Thing

Verfasst: 6. Nov 2023 16:49
von udo1toni
Ähm...

Erst mal denke ich, ist die Rule die falsche Richtung, es geht ja darum, mit einem Switch Item einen Befehl 0 oder 1 zu senden. Andererseits braucht es natürlich auch die Empfangsrichtung, mit Rules umgesetzt wären das also zwei Rules, nicht eine:

Code: Alles auswählen

rule "kommend"
when
    Item dasNumberItem changed   // Modbus empfängt einen Wert
then
    dasSwitchItem.postUpdate(if(newState == 0) OFF else ON)
end

rule "gehend"
when
    Item dasSwitchItem received command  // Das Switch Item empfängt einen Befehl (z.B. über die UI geschaltet)
then
    dasNumberItem.sendCommand(if(receivedCommand == ON) 1 else 0)
end
Ganz wichtig: die kommende Rule triggert auf ein changed Ereignis, die gehende Rule triggert auf received command.
Die kommende Rule sendet den Wert unbedingt mittels postUpdate(), die gehende Rule verwendet unbedingt sendCommand().

Allerdings verstehe ich den ganzen Aufriss nicht.
Zum einen sollte es möglich sein, den number Channel über ein Profile an ein Switch Item zu binden (z.B. unter OH4 mit dem Profile SCRIPT Rule DSL (v1), es gibt dann zwei Felder für die beiden Richtungen.
Code kommend (vom Thing zum Item):

Code: Alles auswählen

|if(Integer.parseInt(input)== 0) OFF else ON
Code gehend (vom Item zum Thing):

Code: Alles auswählen

|if(input.toString == "OFF") 0 else 1
Wahlweise könnte man die beiden Scripte (ohne die Pipe zu Beginn) auch als Transformation Scripte anlegen, allerdings, bei jeweils einer Zeile...

(Ich habe das mit dem Profile mit mqtt erfolgreich getestet)

Modbus kann aber auch Switch Channel erstellen, die dann ON und OFF ausgeben bzw. auf diese Befehle reagieren.
Ich selbst nutze kein Modbus, weshalb ich keine Ahnung habe, wie man das konfigurieren muss, aber ich kann mir irgendwie nicht vorstellen, dass das nicht direkt im Thing möglich sein soll.

Re: Switch Item für numerisches Thing

Verfasst: 6. Nov 2023 18:10
von Hannes
Hallo udo1toni,

danke für deine Antwort!
Ich habe mir den Ansatz "...den number Channel über ein Profile an ein Switch Item zu binden..." angeschaut, allerdings finde ich diese Option nur über die UI.
Ich habe generell meine Things in der UI, die Items in einem File definiert (textbasierte Konfiguration).
Kannst du mir da evt. ein kurzes Beispiel geben, wie das über die textbasierte Konfiguration aussehen würde?

Danke,
Hannes

Re: Switch Item für numerisches Thing

Verfasst: 6. Nov 2023 19:25
von udo1toni
Ja, gerne

Code: Alles auswählen

Switch meinSwitch "Der Switch" {channel="..."[profile="transform:DSL", toItemScript="|if(Integer.parseInt(input)== 0) OFF else ON", toHandlerScript="|if(input.toString == \"OFF\") 0 else 1"]}
So sollte das funktionieren. :)
Weil das Script jeweils inline angegeben ist, müssen die Anführungszeichen escaped werden. Eventuell könnte man innerhalb der Definition auch einfache Anführungszeichen verwenden, also so:

Code: Alles auswählen

Switch meinSwitch "Der Switch" {channel="..."[profile="transform:DSL", toItemScript="|if(Integer.parseInt(input)== 0) OFF else ON", toHandlerScript="|if(input.toString == 'OFF') 0 else 1"]}
Hab ich aber nicht ausprobiert...

Re: Switch Item für numerisches Thing

Verfasst: 6. Nov 2023 19:42
von Hannes
Vielen Dank für das Beispiel, schon cool, was da alles möglich ist, wenn man weiß, wie es geht :-).

Re: Switch Item für numerisches Thing

Verfasst: 7. Nov 2023 10:19
von udo1toni
Ich finde besonders toll, dass letztlich so gut wie alles weiter über Textdateien konfiguriert werden kann, obwohl ein Gutteil davon erst eingeführt wurde, nachdem die UI schon da und als "der Weg" der Konfiguration etabliert war.