Sonoff in FHEM einrichten

Begonnen von cyb_thommy, 03 Dezember 2016, 09:37:35

Vorheriges Thema - Nächstes Thema

cyb_thommy

Hallo,

könnte mir jemand einen Tipp geben, wie ich den Sonoff mit MQTT in FHEM einrichte. Benutze auf den Sonoffs arendst/Sonoff-MQTT-OTA-Arduino. Die anderen Beispiele hier im Forum und im Wiki laufen nicht. Wahrscheinlich, weil man den Status mit 1 & 0 setzen muss und nicht mit on/off. Mit der aktuellen Einstellung kann ich zwar in FHEM die Lampe ein/ausschalten, aber in der Homebridge steht der Schalter immer auf Ein und kann nicht bedient werden.
Schön wäre es auch, wenn wieder ne Birne mit on/off angezeigt würde.

___
Meine Config:

defmod Stehlampe MQTT_DEVICE
attr Stehlampe IODev mqtt
attr Stehlampe devStateIcon On:on:off Off:off:on
attr Stehlampe eventMap 1:on 0:off
attr Stehlampe publishSet 1 0 cmnd/sonoff-plug1/power
attr Stehlampe room Wohnung
attr Stehlampe stateFormat state
attr Stehlampe subscribeReading_state stat/sonoff-flur/POWER
____

Viele Grüße
Thommy

digiart

Hallo Thommy
Ich habe auch viel herumtesten müssen, bis Schalten und Rückmeldung funktioniert haben.
Meine Definition sieht so aus:
define SZ.Licht.Schrank MQTT_DEVICE
attr SZ.Licht.Schrank IODev mqtt
attr SZ.Licht.Schrank devStateIcon on:Lamp_on off:Lamp_off *.subscription.*:Lamp_set_off
attr SZ.Licht.Schrank eventMap ON:on OFF:off
attr SZ.Licht.Schrank publishSet ON OFF fhem_sub/sonoff_SZ/1/POWER/set
attr SZ.Licht.Schrank stateFormat {sprintf("%s",ReadingsVal("SZ.Licht.Schrank","state","OFF"))}
attr SZ.Licht.Schrank subscribeReading_Licht fhem/sonoff_SZ/1/LIGHT
attr SZ.Licht.Schrank subscribeReading_state fhem/sonoff_SZ/1/POWER/set
attr SZ.Licht.Schrank webCmd ON:OFF


Die Console im Webinterface hat mir da sehr geholfen.
Anfragen ausserhalb der Threads (PN, Mail o.ä.) werden ignoriert!

cyb_thommy

#2
Wenn ich bei der neusten Softwareversion von arendst/Sonoff-MQTT-OTA-Arduino folgendes mache, klappt es einwandfrei.

mosquitto_sub -h mqtt_server_name.com -t stat/sonoff_plug1/POWER -v    # listen for status
mosquitto_pub -h mqtt_server_name.com -t cmnd/sonoff_plug1/power -m 1  # turn on the light


Mit on/off usw. klappt es aber nicht.
Dem entsprechend klappt das aus deinem Listing leider auch nicht mehr. Auch das /SET scheint nicht angenommen zu werden. Hat es jemand am laufen und könnte hier aushelfen?


Mein Beispiel oben hat schonmal so funktioniert, dass man den Sonoff in FHEM ein/ausschalten konnte. Aber über die Homebridge stehen die Schalter immer auf Ein und man kann nicht schalten. Weiß da jemand, wie man das hin bekommt?

Reinhart

Zitat von: cyb_thommy am 03 Dezember 2016, 09:37:35
Hallo,
Die anderen Beispiele hier im Forum und im Wiki laufen nicht

Hallo Thommy!

kannst du mir sagen welches Beispiel aus dem Wiki nicht läuft?

Ich habe die Beispiele alle ausgetestet und auch produktiv im Einsatz. Da der Entwickler mehrmals pro Woche neue Versionen heraus bringt, komme ich mit der Korrektur im Wiki kaum nach. Wenn was nicht klappt, dann ist die häufigste Fehlerquelle eine falsch eingestellte Topic am Modul. Mit dem Befehl "mosquitto_sub -d -v -t \#" am Broker findest du das aber sehr schnell heraus. In einem zweiten Konsolenfenster ( Putty ) setze ich dann Befehle ab und kann alles live mit verfolgen. Die zweite Fehlerquelle kann auch eine falsch eingestellte "user_config.h" sein (zB: das falsche Modul gewählt oder keine MQTT Ausgaben bei den GPIOs aktiviert).

Übrigens, die Befehle ON OFF funktionieren tadellos! Einfach in die Befehlszeile eingeben "set DeviceName ON" ( Devicename= sonoff_dht ) bzw. direkt am Broker:
mosquitto_pub -q 2 -t cmnd/sonoff_dht/1/light/set -m "ON"


cmnd/sonoff_dht/1/light/set ON
Received PUBLISH (d0, q0, r0, m0, 'stat/sonoff_dht/1/LIGHT', ... (2 bytes))
stat/sonoff_dht/1/LIGHT ON

in der Konsole sieht dann das so aus und im Webif des Device steht dann sofort "ON" (siehe Bild)

Meine Konfiguration dazu sieht so aus:
define Sonoff_dht MQTT_DEVICE
attr Sonoff_dht IODev myBroker
attr Sonoff_dht alias Raumtemperatur
attr Sonoff_dht group Thermostat
attr Sonoff_dht icon temperature_humidity
attr Sonoff_dht publishSet ON OFF cmnd/sonoff_dht/1/LIGHT/set
attr Sonoff_dht room Entwicklung
attr Sonoff_dht stateFormat {sprintf("Temperatur: %.1f Grad Feuchte: %.1f ", ReadingsVal($name,"TEMPERATURE",0), ReadingsVal($name,"HUMIDITY",0))}
attr Sonoff_dht subscribeReading_HUMIDITY tele/sonoff_dht/DHT/HUMIDITY
attr Sonoff_dht subscribeReading_TEMPERATURE tele/sonoff_dht/DHT/TEMPERATURE
attr Sonoff_dht subscribeReading_state cmnd/sonoff_dht/1/LIGHT/set


LG
Reinhart
FHEM auf Raspy4 mit Bullseye + SSD, Homematic, ESP8266, ESP32, Sonoff, eBus, NanoCUL, MapleCUL, , MQTT2, Alexa

Reinhart

hier nochmals eine Kurzzusammenfassung aus dem Wiki:

1. am Broker diesen Befehl eingeben, der lauscht dann auf alle Topic im Netzwerk: mosquitto_sub -d -v -t \#
2. am Webinterface des Sonoff Device eine beliebige Topic einstellen (sonoff3, Wohnzimmer, Kinderzimmer etc., was immer euch beliebt)
3. Im Webif auf die "Toggle" drücken und am Broker schauen was da für ein String ankommt.

Wenn am Broker die falsche Topic kommt oder euch der Name nicht gefällt entweder Punkt 2 wiederholen oder in der Fhem Konfiguration die "neue" Topic bei den "subscribeReading" und "publishSet" anpassen. Diese beiden Konfigurationen müssen immer mit der eingestellten Topic des Sonooff Modules übereinstimmen! MQTT ist ein sehr einfaches und übersichtliches Protokoll und sehr ausgereift.

Achtung: die Topic ist NICHT der Name des Device, sondern das was im Eingabefeld "Topic" steht (siehe Bild)!!!!
Der Name des Device steht im Tab "configure Wifi" unter Hostname und spielt für unsere Zwecke keine weitere Rolle!

LG
FHEM auf Raspy4 mit Bullseye + SSD, Homematic, ESP8266, ESP32, Sonoff, eBus, NanoCUL, MapleCUL, , MQTT2, Alexa

Axel74

Hallo Zusammen

Ich versuche gerade meinen Sonoff TH16 in FHEM einzubinden.
Klappt aber leider nicht komplett.
Die gemessene "Temperature" und "Humidity" erscheinen zwar als Reading, werden aber nicht im StateFormat angezeigt.

Hat jemand eine Idee, was ich falsch gemacht habe?

pink99panther

Hallo Axwel74
Zerleg mal dein JSON-Reading in sene Einzelteile.
Das geht mit expandJSON.
define ejSENSOR expandJSON Sonoff_SwitchTH01:SENSOR:.{.*}

Axel74

Hallo pink99panther

Danke für Deine Hilfe!!!

Es fehlte die genaue Bezeichnung "AM2301_..."

{sprintf("Temperatur: %.1f Grad Feuchte: %.1f ", ReadingsVal($name,"AM2301_Temperature",0), ReadingsVal($name,"AM2301_Humidity",0))}

Da wäre ich alleine nie drauf gekommen.

Gruß
Axel





Bernd-Steffen

Hallo zusammen,
das Thema war zwar schon lange nicht mehr aktiv, aber ich habe das gleiche Problem wie Axel74:
Ich habe einen DHT11 am Sonoff Basic. Im Reading werden die Temp. und Feuchtewerte angezeigt, aber im stateFormat nicht, obwohl ich jetzt "DHT11_" ergänzt habe. (S. Screenshot)
Hat jemand eine Idee, was da noch falsch ist?
Viele Grüße, Bernd-Steffen

hexenmeister

#9
Du versuchst Readings mit den Namen 'DHT11_Temperature' und 'DHT11_Humidity auszulesen, die es gar nicht gibt. Funktion ReadingsVal liest vorhandene Readings und dein REading heißt 'Sensor'. Den Wert musst Du natürlich entsprechend zerlegen.
Maintainer: MQTT_GENERIC_BRIDGE, SYSMON, SMARTMON, systemd_watchdog, MQTT, MQTT_DEVICE, MQTT_BRIDGE
Contrib: dev_proxy

Reinhart

#10
@Bernd-Steffen

Die Readings die du lesen willst werden normalerweise von expandJson automatisch angelegt. Ich nehme daher an, du hast expandJson noch nicht oder das Filter falsch konfiguriert. Such einfach hier im Forum nach "expandJson" und du findest viele Beispiele wie das funktioniert. Es ist ja nur eine Zeile! Wie der Name schon sagt wird dabei der Json String zerlegt und die Readings automatisch angelegt.

zB:
define ej3 expandJSON (Sonoff.*:.*:.{.*.*{.*.*}})

Der Rest des stateFormat passt dann schon!

LG
FHEM auf Raspy4 mit Bullseye + SSD, Homematic, ESP8266, ESP32, Sonoff, eBus, NanoCUL, MapleCUL, , MQTT2, Alexa

Bernd-Steffen

Hallo hexenmeister, hallo Reinhart,
danke für die Infos - ich verwende bereits expandJSON (so wie weiter oben beschrieben).
Die DEF dazu ist im 1. Screenshot zu sehen.
Das stateFormat von der Anzeige habe ich entsprechend korrigiert (Screenshot 2)
Leider ist immer noch ein Fehler drin, da es nichts an der Anzeige ändert.  >:(
Ich habe diverse Posts zu "expandJSON" gelesen, werde aber nicht schlauer - hab da nen Knoten im Kopf.  :'(
Für eure Hilfe dankt schon mal Bernd-Steffen

pink99panther

Groß-Kleinschreibung passt nicht!
SENSOR ist nicht gleich Sensor

Bernd-Steffen

Hallo pink99panther,
mit Groß-Klein-Schreibung hatte es nix zu tun. Es lag wohl daran, dass nach den ganzen Änderungen irgendwelche Parameter in FHEM nicht automatisch aktualisiert wurden. Erst nach Neustart des Raspi funktioniert jetzt alles.  :)
Die Konfiguration der Temp.anzeige sieht jetzt so aus:
defmod WZ_Sonoff_Temp MQTT_DEVICE
attr WZ_Sonoff_Temp IODev myBroker
attr WZ_Sonoff_Temp alias Wohnzimmer-Klima
attr WZ_Sonoff_Temp icon temperature_humidity
attr WZ_Sonoff_Temp room MQTT,Wohnzimmer
attr WZ_Sonoff_Temp stateFormat {sprintf("Temp: %.1f Grad / Feuchte: %.1f Proz.", ReadingsVal($name,"DHT11_Temperature",0), ReadingsVal($name,"DHT11_Humidity",0))}
attr WZ_Sonoff_Temp subscribeReading_Sensor tele/WZ_Sonoff1/SENSOR

setstate WZ_Sonoff_Temp Temp: 23.0 Grad / Feuchte: 14.0 Proz.
setstate WZ_Sonoff_Temp 2018-02-19 11:44:05 DHT11_Humidity 14
setstate WZ_Sonoff_Temp 2018-02-19 11:44:05 DHT11_Temperature 23
setstate WZ_Sonoff_Temp 2018-02-19 11:44:05 Sensor {"Time":"2018.02.19 11:44:05","DHT11":{"Temperature":23.0,"Humidity":14.0},"TempUnit":"C"}
setstate WZ_Sonoff_Temp 2018-02-19 11:44:05 TempUnit C
setstate WZ_Sonoff_Temp 2018-02-19 11:44:05 Time 2018.02.19 11:44:05
setstate WZ_Sonoff_Temp 2018-02-19 11:44:05 transmission-state incoming publish received

und das expandJSON so:
defmod ejSensor expandJSON WZ_Sonoff1:.*:.{.*}
Viele Grüße, Bernd-Steffen

pink99panther

Richtig!
Mit Groß-Kleinschreibung hat es nichtsmehr zu tun, wenn Du
beim expandJSON das reading Sensor außer acht lässt.

Bernd-Steffen

Ich hab es im expandJSON mit Sensor und SENSOR probiert und es hat nicht funktioniert. Dann hab ich es mit .* versucht und es ging trotzdem nicht. Erst nach Neustart funkte es. Dann war es vielleicht ein doppelter Fehler?
Viele Grüße Bernd-Steffen

Mikesch

#16
hallo,

ich komme mit expandJSON garnicht klar. (bin auch neu hier)
Das habe ich versucht damit komme ich nicht weiter.
define ejSENSOR expandJSON Sonoff_Temp:SENSOR:.{.*}

Das ist der String den der  TH10 mit einem SI7021 Sensor auf der Kommandozeile ausgibt sieht so aus:
Schalter01/tele/SENSOR {"Time":"2018.02.21 12:44:55","SI7021":{"Temperature":18.2,"Humidity":45.6},"TempUnit":"C"}

und unter Sensor steht das hier:   
{"Time":"2018.02.21 12:54:55","SI7021":{"Temperature":18.2,"Humidity":45.6},"TempUnit":"C"}


wie kann ich daraus ein stateFormat generieren?
Das müsste man für diese Hardware Kombination nur einmal machen?

Das habe ich versucht, leider ohne Erfolg:
{sprintf("Temperatur: %.1f Grad Feuchte: %.1f ", ReadingsVal($name,"SI7021_temperature",0), ReadingsVal($name,"SI7021_humidity",0))}

list Sonoff_Temp
Internals:
   IODev      myBroker
   NAME       Sonoff_Temp
   NR         48
   STATE      Temperatur: 0.0 Grad Feuchte: 0.0
   TYPE       MQTT_DEVICE
   READINGS:
     2018-02-21 12:54:55   Sensor          {"Time":"2018.02.21 12:54:55","SI7021":{"Temperature":18.2,"Humidity":45.6},"TempUnit":"C"}
     2018-02-21 12:54:55   transmission-state incoming publish received
   message_ids:
   sets:
   subscribe:
     tele/Schalter01/SENSOR
     Schalter01/tele/SENSOR
   subscribeExpr:
     ^tele\/Schalter01\/SENSOR$
     ^Schalter01\/tele\/SENSOR$
   subscribeReadings:
     Schalter01/tele/SENSOR:
       cmd       
       name       Sensor
     tele/Schalter01/SENSOR:
       cmd       
       name       Sensor
Attributes:
   IODev      myBroker
   icon       temperature_humidity
   room       MQTT
   stateFormat {sprintf("Temperatur: %.1f Grad Feuchte: %.1f ", ReadingsVal($name,"SI7021_temperature",0), ReadingsVal($name,"SI7021_humidity",0))}
   subscribeReading_Sensor Schalter01/tele/SENSOR




Wie kann man sich eigentlich anzeigen was das stateFormat gerade bewirkt also welche Daten vom Sensor genommen werden?

pink99panther

Dein Reading heißt Sensor, dann musst Du bei expandJSON auch Sensor und nicht SENSOR schreiben.
Oder die Eingrenzung auf Sensor gleich ganz weg lassen
expandJSON Sonoff_Temp:.*:.{.*}

Mikesch

#18
Soll das dann so aussehen?

define ejSENSOR expandJSON Sonoff_Temp::.{.*}
Ist Sonoff_Temp der Selbst vergebene Name oder der Name vom Schalter? Der heißt ja Schalter01/tele/SENSOR.

Gibt es kein Muster nachdem man dieses Reading in ein state Format beschreiben kann?

pink99panther

Dein expandJSON muß einfach nur wissen, bei welchem Device es welche Readings zelegen soll,
oder ob bei dem Device alle Readings zelegt werden sollen.

Bernd-Steffen

#20
Hallo Mikesch,
Bin selber neu und am Suchen, aber ich meine, dass die Antwort auf deine Frage lautet:
defmod ejSENSOR expandJSON Schalter01.*:.*:.{.*}
Dann wird alles, was bei Schalter01* als Nachricht kommt durch die Funktion in seine Einzelteile zerlegt. Probier das mal. Unter dem Device-Overview von Schalter01 müsste dann unter den Readings nicht nur das Ergebnis von tele/Schalter01/SENSOR sondern auch die aus dem JSON-String expandierten Werte von Temperatur und Luftfeuchte stehen (SI7021_Temperature und SI7021_Humidity) sowie Zeit als auch Temp-Einheit.
Ich glaube, hier im Forum sind die meisten schon so lange dabei, dass sie bei diesen Anfängerfragen nicht auf solche Trivilitäten kommen, die wir noobs als totale ko-Punkte erleben. 8)
Viele Grüße von Bernd-Steffen

Reinhart

Zitat von: pink99panther am 21 Februar 2018, 14:11:12
Dein expandJSON muß einfach nur wissen, bei welchem Device es welche Readings zelegen soll,
oder ob bei dem Device alle Readings zelegt werden sollen.

ja genau um das geht beim Filter.

(Sonoff.*|ebus.*:.*:.{.*.*{.*.*}})
Der Filter Sonoff.* oder ebus.* sind die Anfangsbuchstaben des Device, daher sollten die Devices sinnvolle Namen haben die alle gleich beginnen. Hier im angehängten Bild werden alle Readings automatisch angelegt deren Devicename mit "ebus" beginnt. Man könnte jetzt dahinter noch zusätzlich nach "SENSOR" oder irgendwas anderes filtern, so wie hier unten.

define ej3 expandJSON Sonoff.*:(ENERGY.*|SENSOR.*):.{.*} (Power|Current|Voltage|Yesterday|Today|AnalogInput0)
das wäre schon ein ziemliches genaues Filter

LG
FHEM auf Raspy4 mit Bullseye + SSD, Homematic, ESP8266, ESP32, Sonoff, eBus, NanoCUL, MapleCUL, , MQTT2, Alexa

Bernd-Steffen

Hallo Reinhart, danke für die Erläuterung! Eine Frage zur Definition: hat es was zu sagen, dass die Funktion in euren Beispielen immer ej3 heißt? Oder kann man den Namen frei wählen?
Viele Grüße von Bernd-Steffen

Reinhart

#23
das ist völlig egal wie du den nennst!

LG
FHEM auf Raspy4 mit Bullseye + SSD, Homematic, ESP8266, ESP32, Sonoff, eBus, NanoCUL, MapleCUL, , MQTT2, Alexa

dev0

Yep. Wichtig ist beim Einsatz von expandJSON oder einem Notify nur, dass die regex für das Source Reading möglichst eng gefasst ist, sonst belastet man das System nur unnötig. Das Beispiel von Reinhard ist ideal.

Mikesch

#25
Ich hab leider noch immer Fragezeichen im Gesicht.
wenn ich das ej3 Device anlege.
defmod ej3 expandJSON Sonoff.*:(ENERGY.*|SENSOR.*):.{.*} (Power|Current|Voltage|Yesterday|Today|AnalogInput0)
setstate ej3 active
setstate ej3 2018-02-22 14:51:41 state active


Muss ich nicht dann trotzdem unter dem MQTT_Device das stateFormat definieren?
da steht ja im Moment {sprintf("Temperatur: %.1f Grad Feuchte: %.1f ", ReadingsVal($name,"SI7021_temperature",0), ReadingsVal($name,"SI7021_humidity",0))}
Und wenn ich das stateFormat  kennen würde, bräuchte ich das ej3 Device nicht?

Mikesch

@Bernd-Steffen

ich habe den Befehl defmod ejSENSOR expandJSON Schalter01.*:.*:.{.*} abgesetzt.

Ich sehe nichts neues? Oder schaue ich an der falschen Stelle? Siehe Bild.  :-\

pink99panther

Wo ist Dein Reading
subscribeReading_Sensor Schalter01/tele/SENSOR
geblieben?
Immer nur an einem Schräubchen gleichzeitig drehen, sonst erkennst Du die Zusammenhänge nie!

Bernd-Steffen

#28
@Mikesch:
Hab jetzt erst gesehen, dass du das subscribeReading_Sensor und das stateFormat mit der Ausgabe von Temp. und Feuchte unter dem Device Sonoff_Temp angelegt hast. Schau mal dort, ob da die Readings vom Sensor enthalten sind. Bei mir sieht das Device zur Temp.anzeige so aus (s. Screenshot)
Viele Grüße, Bernd-Steffen

Frank_Huber

Zitat von: Bernd-Steffen am 22 Februar 2018, 16:34:13
@Mikesch:
Hab jetzt erst gesehen, dass du das subscribeReading_Sensor und das stateFormat mit der Ausgabe von Temp. und Feuchte unter dem Device Sonoff_Temp angelegt hast. Schau mal dort, ob da die Readings vom Sensor enthalten sind. Bei mir sieht das Device zur Temp.anzeige so aus (s. Screenshot)
Viele Grüße, Bernd-Steffen

btw: arg trocken dein Wohnzimmer.
oder ein defekter DHT?

Bernd-Steffen

#30
@Frank_Huber:
Der Sensor liegt auf dem Boden hinter dem Fernseher und vor einem Fenster, wo gerade die Sonne drauf scheint - natürlich nicht direkt auf den Sensor! Aber da ist wahrscheinlich die Feuchtigkeit grad voll verdunstet. Allerdings hab ich ihn noch nicht mit einem richtigen Hygrometer abgeglichen. Demnächst bekomme ich noch einen DHT22 - mal sehen, was der im Vergleich liefert.
Viele Grüße, Bernd-Steffen

Mikesch

#31
Ne da ist auch nix.
Das ist ein TH16 mit einem SI7021 Sensor. Deswegen zwei Devices. Ein Schalter und ein Sensor.

Ich verstehe es schon richtig dass das stateFormat definiert wie die Werte unter Sensor: zerlegt werden?

Der Unterschied ist doch nur das du den DHT11 hast und ich den SI7021.
{sprintf("Temperatur: %.1f Grad Feuchte: %.1f ", ReadingsVal($name,"SI7021_temperature",0), ReadingsVal($name,"SI7021_humidity",0))}
{sprintf("Temperatur: %.1f Grad Feuchte: %.1f ", ReadingsVal($name,"DHT11_temperature",0), ReadingsVal($name,"DHT11_humidity",0))}


Vielleicht ist ja etwas anderes falsch kann man mit irgendeinen Befehl sich die Informationen unter Schalter01/tele/SENSOR ansehen oder nur über Kommandozeile am MQTT. Meine Ausgabe an der Kommerzielle sieht so aus. wie sieht es bei dir aus?

Schalter01/tele/SENSOR {"Time":"2018.02.21 12:49:55","SI7021":{"Temperature":18.2,"Humidity":45.6},"TempUnit":"C"}

Bernd-Steffen

ZitatIch verstehe es schon richtig dass das stateFormat definiert wie die Werte unter Sensor: zerlegt werden?

Nein, die Zerlegung erfolgt mit expandJSON - in stateFormat wird definiert welche Werte wie angezeigt werden sollen. Wenn du im Reading des Devices, wo du subscribeReading_Sensor definiert hast, keine separaten Readings der Temperatur und Feuchte erhälst, dann funktioniert dein expandJSON nicht (richtig). Dann stimmt vielleicht der Filter nicht.

Zitatkann man mit irgendeinen Befehl sich die Informationen unter Schalter01/tele/SENSOR ansehen
Was der Sensor sendet, siehst du im Reading "Sensor".
Versuch doch mal die Vorgehensweise, die Reinhart am Anfang des Posts beschrieben hat - über: mosquitto_sub -d -v -t \# und die Aktionen mit dem Web-Interface des Sonoff-Schalters.

Viele Grüße, Bernd-Steffen



Mikesch

#33
Hallo Bend, vielen Dank das du mir hilfst (ich stehe echt auf dem Schlauch)

ich bin etwas weitergekommen.  Habe noch zwei Fragen.
Die Sonoff TH10 heißen bei mir Schalter01, Schalter02 usw.
Schalter01/stat/POWER,  Schalter02/stat/POWER
Die Sensoren dann:
Schalter01/tele/SENSOR,  Schalter02/tele/SENSOR

Mit dem defmod ej3test expandJSON Schalter01:.*:.{.*}
Bekomme ich immerhin am Device: Schalter01_Sensor unter Readings eine Anzeige. Siehe Bild 1.

Ich bekomme es nicht hin ej3test so zu gestalten damit auch die Werte vom Schlater02 zerlegt werden. Ich hab Kombinationen aus . und * versucht leider ohne Erfolg. Hast du da eine Idee?

Und das zweite Problem ist dass zwar die Werte unter Readings: auftauchen aber nicht unter STATE.
Sieht man auch auf dem Bild. Das sollte doch am stateFormat liegen, oder?


das liefert mosquitto_sub -d -v -t \#
Schalter02/tele/SENSOR {"Time":"2018.02.23 10:41:26","SI7021":{"Temperature":22.5,"Humidity":41.6},"TempUnit":"C"}
Schalter01/tele/SENSOR {"Time":"2018.02.23 10:42:02","SI7021":{"Temperature":20.9,"Humidity":44.1},"TempUnit":"C"}

Bernd-Steffen

#34
Hallo Mikesch:
da bist du doch schon ein großes Stück weiter gekommen. Du musst aber noch die Bezeichnung im stateFormat korrigieren. Die abgefragten Werte müssen genauso heißen, wie sie im Reading angezeigt werden: also "SI7021_Temperature" und "SI7021_Humidity"!
Wenn du dann deinen Rechner (PC, FB, Raspberry...) auf dem FHEM und MQTT läuft, neu startest, dann müsstest du zumindest für Schalter01 die richtigen Werte in der Anzeige haben, da das expandJSON ja funktioniert, wie die Readings da zeigen.
Für den Schalter2 musst du ein 2. expandJSON für das Device anlegen. z.B. so:
defmod ej3test2 expandJSON Schalter02:.*:.{.*}
Dabei muss der Name (hier: Schalter02) jener vom Device sein muss, wo es angezeigt werden soll.

Ich hab das gerade so gemacht, da ich heute die DHT22-Sensoren bekommen habe. (s. Screenshot)
Jetzt sind auch die Temp. und Feuchtewerte für das Wohnzimmer plausibler.  :)
Viele Grüße, Bernd-Steffen

Reinhart

#35
nein, bitte nicht ein 2. expandJson anelgen, das ist ja der Sinn des Filters!
Es genügt eine Definition für expandJson, damit können bei geschickter Wahl der Regexp tausende Devices erfasst werden.
Schau doch noch einmal beim Beispiel oben mit den "ebus_".

defmod ej3test2 expandJSON Schalter.*:.*:.{.*}

alle Devices die mit Schalter..... beginnen werden dabei erfasst! D.h. es funktioniert Schalter01, Schalter02, SchalterWohnzimmer, etc. Aber Nicht schaltertest und auch nicht Switch01.

LG
Reinhart
FHEM auf Raspy4 mit Bullseye + SSD, Homematic, ESP8266, ESP32, Sonoff, eBus, NanoCUL, MapleCUL, , MQTT2, Alexa

Bernd-Steffen

Ich hatte aus dem post von dev0 verstanden, dass der filter möglichst eng gefasst wird.
ZitatYep. Wichtig ist beim Einsatz von expandJSON oder einem Notify nur, dass die regex für das Source Reading möglichst eng gefasst ist, sonst belastet man das System nur unnötig. Das Beispiel von Reinhard ist ideal.

Deshalb dachte ich, dass für jede Anzeige ein separates expandJSON angelegt werden sollte.  :-\ ???
Viele Grüße, Bernd-Steffen

Bernd-Steffen

So, ich glaube jetzt hab ich es. Ich hab die beiden expandJSON in eine Definition gepackt, die jetzt auch funktioniert:
defmod ej3 expandJSON WZ_Sonoff_Temp.*:.{.*}|WZ_Temp.*:.{.*}

So hat es nicht funktioniert:
defmod ej3 expandJSON WZ_Sonoff_Temp.*|WZ_Temp.*:.{.*}

Ich hoffe, das ist jetzt auch von den "FHEM-/MQTT-Rules" richtig so.

Viele Grüße, Bernd-Steffen

Mikesch

#38
Oh mein Gott es funktioniert endlich. Ich glaube es nicht.
Also danke euch!!! vielmals.
defmod ej3test2 expandJSON Schalter.*:.*:.{.*} funktioniert.
Ich habe es eigenltlich damit auch schon versucht also mit .* und *. als Platzhalter wolle vorher nicht, jetzt geht's.
Und bei dem stateFormat lag es daran dass ich temperature und humidity so wie im wiki hatte also klein geschrieben. Mit Großbuchstaben am Anfang geht das jetzt auch.  :D

Also falls noch eine andere arme Sau ein TH10 mit einem ITEAD SI7021 sich anschaffen sollte hier die Befehle.


### mosquitto_sub -d -v -t \# ###
Schalter01/tele/SENSOR {"Time":"2018.02.23 10:42:02","SI7021":{"Temperature":20.9,"Humidity":44.1},"TempUnit":"C"}
Schalter02/tele/SENSOR {"Time":"2018.02.23 10:41:26","SI7021":{"Temperature":22.5,"Humidity":41.6},"TempUnit":"C"}

### expandJSON definieren ###
defmod ej3 expandJSON Schalter.*:.*:.{.*}

### Temperatur und Luftfeuchte vom Sonoff TH10 und SI7021 ###
define Sonoff_Temp01 MQTT_DEVICE
attr Schalter01_Sensor IODev myBroker
attr Schalter01_Sensor room MQTT
attr Schalter01_Sensor stateFormat {sprintf("Temperatur: %.1f Grad Feuchte: %.1f ", ReadingsVal($name,"SI7021_Temperature",0), ReadingsVal($name,"SI7021_Humidity",0))}
attr Schalter01_Sensor subscribeReading_Sensor Schalter01/tele/SENSOR

### Schalterfunktion vom Sonoff TH10 ###
defmod Schalter01 MQTT_DEVICE
attr Schalter01 IODev myBroker
attr Schalter01 alias Schalter01
attr Schalter01 event-on-change-reading state
attr Schalter01 eventMap ON:on OFF:off
attr Schalter01 publishSet on off toggle Schalter01/cmnd/POWER
attr Schalter01 stateFormat state
attr Schalter01 subscribeReading_state Schalter01/stat/POWER
attr Schalter01 webCmd on:off:toggle


Ich wollte noch eine Logdatei erstellen, ist das richtig das ich eine Datenbank installieren muss?

Bekomme nämlich bei dem nachfolgendem Befehl "No Logdevice myDbLog"
define SVG_FileLog_Schalter01_Sensor SVG myDbLog:SVG_FileLog_Schalter01_Sensor:HISTORY
attr SVG_FileLog_Schalter01_Sensor room MQTT



######  UPDATE   ######

ich habe es mit einem File Probiert:
defmod FileLog_Schalter01_Sensor FileLog ./log/Schalter01_Sensor-%Y.log Schalter01_Sensor
attr FileLog_Schalter01_Sensor logtype text
attr FileLog_Schalter01_Sensor room MQTT



Nur noch zwei Tipps, die Werte kommen alle 5 Minuten und hier noch ein Screenshot vom Konfiguration des Schalters selbst (Tasmota)
Ich hoffe mit der Zusammenfassung schafft es der Nächste auch  ;)

Reinhart

Zitat von: Bernd-Steffen am 23 Februar 2018, 12:34:50
Ich hatte aus dem post von dev0 verstanden, dass der filter möglichst eng gefasst wird.
Deshalb dachte ich, dass für jede Anzeige ein separates expandJSON angelegt werden sollte.  :-\ ???
Viele Grüße, Bernd-Steffen

ja, dev0 hat das so gemeint, dass du auch hinten (rechst) filterst und nicht nur auf den Namen, denn das könnten ja dann sehr viele sein. Wenn du 20 Schalter hast und 3 davon sind MQTT, dann würde expandJson 17 mal umsonst das System belasten.

LG
FHEM auf Raspy4 mit Bullseye + SSD, Homematic, ESP8266, ESP32, Sonoff, eBus, NanoCUL, MapleCUL, , MQTT2, Alexa

dev0

Man sollte auch das/die Readings angeben, die den JSON Strings enthalten. Das gilt auch für Notifies im Allgemeinen. In der commandref gibt's auch weitere Beispiele dazu.