Wie bereits schon gesagt und auch von Udo mit einigen Beispielen unterlegt, gibt es Möglichkeiten die von dir gewünschten Werte zu ermitteln. Dazu brauchst du natürlich ein Thing mit den entsprechenden Channels und die passenden Items dazu. Und zu guter Letzt noch eine Rule, die dir die Werte aus deinem "Device herauskitzelt".
Ich kann dir "nur" zeigen, wie ich das mache. Es gibt natürlich auch noch andere, wahrscheinlich auch bessere Möglichkeiten, aber ich versuch's mal mit meinem SetUp, am Beispiel einer Schaltsteckdose mit Verbrauchszähler.
.things (für dich interessant, die letzten 3 Channels)
Code: Alles auswählen
Thing mqtt:topic:danny:sp11104 "Gosund SP111 04" (mqtt:broker:danny ) @ "MQTT2" [
availabilityTopic="tele/gosundsp111_04/LWT",
payloadNotAvailable="Offline",
payloadAvailable= "Online"
]{
Channels:
Type switch : power "Power " [ stateTopic="stat/gosundsp111_04/POWER", commandTopic="cmnd/gosundsp111_04/POWER" ]
Type number : rssi "WiFi Signal Strength" [ stateTopic="tele/gosundsp111_04/STATE", transformationPattern="JSONPATH:$.Wifi.RSSI"]
Type string : version "Firmware Version " [ stateTopic="stat/gosundsp111_04/STATUS2", transformationPattern="JSONPATH:$.StatusFWR.Version"]
Type switch : reachable "Reachable" [ stateTopic="tele/gosundsp111_04/LWT", on="Online", off="Offline" ]
Type string : hardware "Chip Set " [ stateTopic="stat/gosundsp111_04/STATUS2", transformationPattern="JSONPATH:$.StatusFWR.Hardware"]
Type string : ipaddress "IP Address " [ stateTopic="stat/gosundsp111_04/STATUS5", transformationPattern="JSONPATH:$.StatusNET.IPAddress"]
Type number : powerload "Power load" [ stateTopic="tele/gosundsp111_04/SENSOR", transformationPattern="JSONPATH:$.ENERGY.Power"]
Type number : voltage "Line voltage" [ stateTopic="tele/gosundsp111_04/SENSOR", transformationPattern="JSONPATH:$.ENERGY.Voltage"]
Type number : current "Line current" [ stateTopic="tele/gosundsp111_04/SENSOR", transformationPattern="JSONPATH:$.ENERGY.Current"]
Type number : total "Total energy " [ stateTopic="tele/gosundsp111_04/SENSOR", transformationPattern="JSONPATH:$.ENERGY.Total"]
Type number : totalday "Total energy today" [ stateTopic="tele/gosundsp111_04/SENSOR", transformationPattern="JSONPATH:$.ENERGY.Today"]
Type number : totalyest "Total energy yesterday" [ stateTopic="tele/gosundsp111_04/SENSOR", transformationPattern="JSONPATH:$.ENERGY.Yesterday"]
Type string : ssid "WiFi" [ stateTopic="tele/gosundsp111_04/STATE", transformationPattern="JSONPATH:$.Wifi.SSId"]
Type datetime : time "Time" [ stateTopic="tele/gosundsp111_04/STATE", transformationPattern="JSONPATH:$.Time"]
Type string : grouptop "Group Topic" [ stateTopic="stat/gosundsp111_04/STATUS1", transformationPattern="JSONPATH:$.StatusPRM.GroupTopic"]
Type string : devicename "Device Name" [ stateTopic="stat/gosundsp111_04/STATUS", transformationPattern="JSONPATH:$.Status.DeviceName"]
Type string : friendly "Friendly Name 0" [ stateTopic="stat/gosundsp111_04/STATUS", transformationPattern="JSONPATH:$.Status.FriendlyName[0]"]
Type string : topic "topic" [ stateTopic="stat/gosundsp111_04/STATUS", transformationPattern="JSONPATH:$.Status.Topic"]
}
.items (wieder die letzten drei Items)
Code: Alles auswählen
//192.168.178.xx GoS_04
Group gSP111_04 "GoS_04 EchoP" <gosundsp111> (gEG_Essen) ["PowerOutlet"]
Switch SP111_04 "GoS 04 Switch EchoP [MAP(de.map):%s]" <light> (gSP111_04,gT_OnOff) ["Switch"] { channel="mqtt:topic:danny:sp11104:power"}
Number:Dimensionless SP111_04_RSSI "GoS 04 Switch EchoP RSSI [%.1f]" <qualityofservice> (gSP111_04,gRSSI) ["Point"] { channel="mqtt:topic:danny:sp11104:rssi" }
String SP111_04_Version "GoS 04 Switch EchoP Version 70[%s]" <gosundsp111> (gSP111_04,gVer) ["Point"] { channel="mqtt:topic:danny:sp11104:version" }
Switch SP111_04_Unreach "GoS 04 Switch EchoP Erreichbarkeit [%s]" <siren1> (gSP111_04,gLWT) ["Point"] { channel="mqtt:topic:danny:sp11104:reachable" }
String SP111_04_Hardware "GoS 04 Switch EchoP Hardware 70[%s]" <gosundsp111> (gSP111_04,gHard) ["Point"] { channel="mqtt:topic:danny:sp11104:hardware" }
String SP111_04_IPAddress "GoS 04 Switch EchoP IP-Address [%s]" <gosundsp111> (gSP111_04,gIpAd) ["Point"] { channel="mqtt:topic:danny:sp11104:ipaddress" }
Number:Energy SP111_04_Verb "GoS 04 Verbrauch Total EchoP[%.2f kWh]" <gosundsp111> (gSP111_04) ["Power"] { channel="mqtt:topic:danny:sp11104:total" }
Number:Energy SP111_04_VerbHeute "GoS 04 Verbrauch Heute EchoP[%.2f kWh]" <gosundsp111> (gSP111_04) ["Power"] { channel="mqtt:topic:danny:sp11104:totalday" }
Number:Energy SP111_04_VerbGestern "GoS 04 Verbrauch Gestern EchoP[%.2f kWh]" <gosundsp111> (gSP111_04) ["Power"] { channel="mqtt:topic:danny:sp11104:totalyest" }
Number:ElectricCurrent SP111_04_Strom "GoS 04 Stromaufnahme EchoP [%.2f A]" <gosundsp111> (gSP111_04) ["Current"] { channel="mqtt:topic:danny:sp11104:current" }
Number:ElectricPotential SP111_04_Spannung "GoS 04 Spannung EchoP[%.1f V]" <gosundsp111> (gSP111_04) ["Voltage"] { channel="mqtt:topic:danny:sp11104:voltage" }
Number:Power SP111_04_Leistung "GoS 04 Leistung EchoP[%.2f W]" <gosundsp111> (gSP111_04) ["Power"] { channel="mqtt:topic:danny:sp11104:powerload" }
String SP111_04_SSID "GoS 04 Wlan EchoP [%s]" <gosundsp111> (gSP111_04,gSSId) ["Status"] { channel="mqtt:topic:danny:sp11104:ssid" }
DateTime SP111_04_Date "GoS 04 Refresh EchoP [%1$tH:%1$tM]" <gosundsp111> (gSP111_04) ["Status","Timestamp"] { channel="mqtt:topic:danny:sp11104:time" }
String SP111_04_GroupTopic "GoS 04 Group Topic EchoP [%s]" <gosundsp111> (gSP111_04,gGrTop) ["Point"] { channel="mqtt:topic:danny:sp11104:grouptop" }
String SP111_04_DeviceName "GoS 04 Device Name [%s]" <gosundsp111> (gSP111_04) ["Point"] { channel="mqtt:topic:danny:sp11104:devicename" }
String SP111_04_Friendly "GoS 04 Friendly Name 0 [%s]" <gosundsp111> (gSP111_04) ["Point"] { channel="mqtt:topic:danny:sp11104:friendly" }
String SP111_04_Topic "GoS 04 Topic Name [%s]" <gosundsp111> (gSP111_04) ["Point"] { channel="mqtt:topic:danny:sp11104:topic" }
Jetzt brauchst du noch eine Regel, mit der die nicht automatisch per "Telemetrie" ausgegrabenen Werte in die entsprechenden Items gebracht werden.
.rules (nicht erschrecken
)
Code: Alles auswählen
// ++++++++++++++++++ Globale Variablen/Konstaten +++++++++++++++++++++++++++++++++++
val tasmota_device_ids = newArrayList("sonoffs", "tasmotas", "tasmosens", "tasmoesp32")
// val tasmota_device_ids = newArrayList("sonoffs")
val rulename = "Tasmota_Info"
var Timer tSonoffFirmware = null
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
rule "Tasmota_info"
when
Item Tasmota_State_Refresh changed to ON
or Channel 'astro:sun:local:night#event' triggered START
then
var String firmware = (Current_FW_Available.state.toString).replace("v","")
logInfo(rulename, "Tasmota Refresh static Values : " + firmware )
// is it an event based Trigger?
if (triggeringItemName !== null) {
// now you can do your stuff like logInfo
logInfo(rulename, "Rule fired manually by : " + triggeringItemName + " previousState: " + previousState)
// or this :
if (tSonoffFirmware !== null) {
logInfo(rulename,"Timer wird gecancelled: " + tSonoffFirmware)
tSonoffFirmware.cancel
}
logInfo(rulename,"Timer wird initialisiert")
tSonoffFirmware = createTimer(now.plusSeconds(15), [ |
Tasmota_State_Refresh.postUpdate(OFF)
if (Tasmota_State_Refresh.state == ON) {
logInfo(rulename,"Switch ausgeschaltet " + Tasmota_State_Refresh.state.toString)
// or whatever stuff you want ;)
}
tSonoffFirmware = null
])
}
// is it a channel based Trigger ?
else if (receivedEvent !== null) {
// now you can do stuff like logInfo
logInfo(rulename, "Rule fired by Channel: {} {}", receivedEvent.toString, triggeringChannel )
// and of course a lot of other stuff if you/I want ;)
}
val actionsBroker = getActions("mqtt","mqtt:broker:danny")
for (String device_id : tasmota_device_ids) {
actionsBroker.publishMQTT( "cmnd/" + device_id + "/status", "0") // alle
// actionsBroker.publishMQTT( "cmnd/" + device_id + "/status", "2") // status 2
// actionsBroker.publishMQTT( "cmnd/" + device_id + "/timezone", "99") // timezone 99
// actionsBroker.publishMQTT( "cmnd/" + device_id + "/altitude", "502") // altitude 502 meter
// actionsBroker.publishMQTT( "cmnd/" + device_id + "/MqttHost", "oh3ssd") // mqtt2 - Ändern des Mqtt-Host per Name ("oh3ssd") oder IP-Adresse ("192.168.178.xx")
logInfo(rulename, "Tasmota Maintenance: {} - actionsBroker -Konstnate : {} - tasmota_device_ids : {}",device_id, actionsBroker, tasmota_device_ids)
}
logInfo(rulename, "Tasmota Refresh Items static Informations : end")
end
Es sind einige Erläuterungen und auch Beispiele für weitere Verwendungsmöglichkeiten beschrieben, die kannst du ja rauslöschen. Als "Device Array" verwende ich meine "Group-Topics". Dadurch werden alle Geräte der Gruppe auf einen Rutsch angesprochen und die entsprechen Informationen an die Geräte bzw. Items weitergeleitet; je nachdem was du in deinen Things/Items definiert hast. Der Publish erfolgt dann mit dem PayLoad "status 0".
Getriggert wird die Rule entweder durch das Astro-Binding (bei mir) oder wahlweise per Dummy-Schalter.
Dummy -Switch
Code: Alles auswählen
Switch Tasmota_State_Refresh "manueller Tasmota Item-Status Aktualisierung [MAP(div.map):%s]" (gTasmo)
Screenshot Steckdose:
2024-04-12_232233.jpg
Beispiel-Widget für manuellen Schalter
manueller Start.jpg
Yaml-Code Widget
Code: Alles auswählen
component: oh-label-card
config:
action: toggle
actionCommand: ON
actionCommandAlt: OFF
actionItem: Tasmota_State_Refresh
background: linear-gradient(to top right,#B0E0E6 20%,#1E90FF 30%,#FFC0CB 60%)
icon: oh:arendst
iconSize: 50
item: Tasmota_State_Refresh
label: "='MQTT-Status aktualisieren.: ' + items.Tasmota_State_Refresh.displayState"
Ich hoffe, das hilft dir weiter.