FHEM Forum

FHEM - Hausautomations-Systeme => MQTT => Thema gestartet von: bicmac am 19 Juni 2020, 16:50:38

Titel: OpenSprinkler Support
Beitrag von: bicmac am 19 Juni 2020, 16:50:38
Hi,
ich hätte interesse an einem Template für OpenSprinkler. Dieses unterstützt seid heute MQTT. Wäre schön wenn mir da jemand helfen könnte. Ich bin da DAU bei den Templates, unterstütze aber gern wenn mir jemand erklärt was ich da machen muss.
Momentan lässt sich über MQTT bei OpenSprinkler auch nur der Status der einzelnen Zonen/Sensoren darstellen und noch nichts steuern. Dies wird aber sicher in zukünftigen FW Versionen von Opensprinkler noch erweitert.
Daher ist es ggf Sinnvoll auch pro Zone ein eignenes Device anzulegen. Momentan würde aber ein normales anzeigen aller Topics reichen.

MQTT auf Opensprinkler ist bei OpenSprinkler momentan so beschrieben:

https://openthings.freshdesk.com/support/solutions/articles/5000859089-how-to-use-mqtt

Firmware 2.1.9(4) Topics:
At the moment of this writing, the OpenSprinkler firmware only supports publishing data to the broke. You can use a subscriber client (e.g. the mosquitto_sub command, or a mobile MQTT client, or a home automation hub that supports MQTT) to receive the data. A list of currently supported topics are detailed below:

The root topic name is always opensprinkler. In future firmware, we will allow users to customize the root topic, in order to provide better support for multiple OpenSprinkler devices you may have.
opensprinkler/system: this topic receives {"state":"started"} message when the controller boots.
opensprinkler/station/x: where x is the index (starting from 0) of the station/zone. For example, the first zone is 0, the second zone is 1 and so on. This topic receives {"state":1} message when station/zone x starts running, and {"state":0,"duration":ss} message when the zone finishes running, where ss is the number of seconds that it ran. To receive data for all stations, you can subscribe to wildcard topic opensprinkler/station/#
opensprinkler/sensor1: this topic receives {"state":1} when sensor 1 activates and {"state":0} when sensor 1 deactivates.
opensprinkler/sensor2: similar to above but for sensor 2.
opensprinkler/raindelay: similar to above but for rain delay.
opensprinkler/sensor/flow: this topic receives {"count":cc,"volume":vv} when the flow sensor generates data (usually when a zone finishes running), where cc is the flow count, and vv is the amount of volume.

Hier mal ein  raw vom angelegtem Device:


defmod Opensprinkler MQTT2_DEVICE OS_D8803963182F
attr Opensprinkler DbLogExclude .*
attr Opensprinkler IODev MQTT2_FHEM_Serverattr Opensprinkler room Aussen->Garten,MQTT2_DEVICE
Titel: Antw:OpenSprinkler Support
Beitrag von: bicmac am 19 Juni 2020, 17:03:23
So wäre glaub ich die ReadingList


attr Opensprinkler readingList OS_D8803963182F:opensprinkler/availability:.* availability\
OS_D8803963182F:opensprinkler/system:.* { json2nameValue( $EVENT, 'System_', $JSONMAP ) }\
OS_D8803963182F:opensprinkler/sensor1:.* { json2nameValue( $EVENT, 'Sensor1_', $JSONMAP ) }\
OS_D8803963182F:opensprinkler/sensor2:.* { json2nameValue( $EVENT, 'Sensor2_', $JSONMAP ) }\
OS_D8803963182F:opensprinkler/raindelay:.* { json2nameValue( $EVENT, 'raindelay_', $JSONMAP ) }\
OS_D8803963182F:opensprinkler/sensor/flow:.* { json2nameValue( $EVENT, 'flow_', $JSONMAP ) }\
OS_D8803963182F:opensprinkler/station/0:.* { json2nameValue( $EVENT, 'Station0_', $JSONMAP ) }\
OS_D8803963182F:opensprinkler/station/1:.* { json2nameValue( $EVENT, 'Station1_', $JSONMAP ) }\
OS_D8803963182F:opensprinkler/station/2:.* { json2nameValue( $EVENT, 'Station2_', $JSONMAP ) }\
OS_D8803963182F:opensprinkler/station/3:.* { json2nameValue( $EVENT, 'Station3_', $JSONMAP ) }\
OS_D8803963182F:opensprinkler/station/4:.* { json2nameValue( $EVENT, 'Station4_', $JSONMAP ) }\
OS_D8803963182F:opensprinkler/station/5:.* { json2nameValue( $EVENT, 'Station5_', $JSONMAP ) }\
OS_D8803963182F:opensprinkler/station/6:.* { json2nameValue( $EVENT, 'Station6_', $JSONMAP ) }\
OS_D8803963182F:opensprinkler/station/7:.* { json2nameValue( $EVENT, 'Station7_', $JSONMAP ) }\
OS_D8803963182F:opensprinkler/station/8:.* { json2nameValue( $EVENT, 'Station8_', $JSONMAP ) }\
OS_D8803963182F:opensprinkler/station/9:.* { json2nameValue( $EVENT, 'Station9_', $JSONMAP ) }\
OS_D8803963182F:opensprinkler/station/10:.* { json2nameValue( $EVENT, 'Station10_', $JSONMAP ) }\
OS_D8803963182F:opensprinkler/station/11:.* { json2nameValue( $EVENT, 'Station11_', $JSONMAP ) }\
OS_D8803963182F:opensprinkler/station/12:.* { json2nameValue( $EVENT, 'Station12_', $JSONMAP ) }\
OS_D8803963182F:opensprinkler/station/13:.* { json2nameValue( $EVENT, 'Station13_', $JSONMAP ) }\
OS_D8803963182F:opensprinkler/station/14:.* { json2nameValue( $EVENT, 'Station14_', $JSONMAP ) }\
OS_D8803963182F:opensprinkler/station/15:.* { json2nameValue( $EVENT, 'Station15_', $JSONMAP ) }\
OS_D8803963182F:opensprinkler/station/16:.* { json2nameValue( $EVENT, 'Station16_', $JSONMAP ) }


Wie mache ich da snun als Template?

Leider liefert OpenSprinkler nicht die Namen zu den Stationen dazu. Ich habe das aber schon requested. ggf kann man das ja schnell auf deren Seite einbauen. die müsste man sich irgendwie über einen API Call auf das Device abhlen einmalig und dann manuell setzen.
Titel: Antw:OpenSprinkler Support
Beitrag von: Beta-User am 19 Juni 2020, 17:10:41
Was mir nicht klar ist:
Macht es mit den langen Präfixen Sinn? Oder soll das sowieso umbenannt werden?
Wenn ja mit den langen: überall? Oder sind die Infos aus den ersten paar Zeilen sowieso eindeutig?

Wenn man sprechende Namen für die Zonen hat, könnte man auch gleich den Zonennamen als Topic-Teil benutzen (möglichst ohne Umlaute).

Bitte nicht nur den oberen Teil des RAW liefern, sondern möglichst auch die setstate-Angaben, dann sehe ich besser, was da rauskommt...

Bleibt die Frage, was mit der CID ist (OS_D8803963182F). Brauchen wir die, oder gibt es in einem Haushalt nie mehr wie eine opensprinkler-Installation? Kann man bei mehreren irgendwie den Topic-Präfix (opensprinkler) ändern (das wäre dann zu empfehlen, die CID ist dann unbrauchbar, wenn wir einen externen Broker haben)?


Titel: Antw:OpenSprinkler Support
Beitrag von: bicmac am 20 Juni 2020, 09:31:32
Also Opensprinkler hat halt (in meinem Falle) maximal 16 verschiedene Stationen (das sind die einzelnen Magnetventile) die es ansteuern kann. Für jedes dieser meildet es den Status. Nun sind die Zahlen nicht wirklich aussagekräftig. In der App von Opensprinkler selber kann man den Stationen auch nahmen (zum Beispiel: Rasen (unten) ) geben. Leider werden die Namen nicht mit gemeldet.
Ich hoffe das der Name der Station in einem nächsten FW update auch als Topic mit kommt.
Bis dahin würde sicher auch reichen für jede der Stationen einfach Nummer und dann die Readings (momentan wären das state und duration)
Das selbe gilt für die anderen topics wie Sensor usw.
Es kann in einem Haushalt auch mehrere Opensprinkler geben. Da man diese auch koppeln kann. Ich selber habe aber nur einen im Einsatz. Leider kann man den Topicnamen stand jetzt nicht anpassen. Aber es ist ja auch erst die erste FW Version von Opensprinkler die MQTT unterstützt.


defmod Opensprinkler MQTT2_DEVICE OS_D8803963182F
attr Opensprinkler DbLogExclude .*
attr Opensprinkler IODev MQTT2_FHEM_Server
attr Opensprinkler readingList OS_D8803963182F:opensprinkler/availability:.* availability\
OS_D8803963182F:opensprinkler/system:.* { json2nameValue( $EVENT, 'System_', $JSONMAP ) }\
OS_D8803963182F:opensprinkler/sensor1:.* { json2nameValue( $EVENT, 'Sensor1_', $JSONMAP ) }\
OS_D8803963182F:opensprinkler/sensor2:.* { json2nameValue( $EVENT, 'Sensor2_', $JSONMAP ) }\
OS_D8803963182F:opensprinkler/raindelay:.* { json2nameValue( $EVENT, 'raindelay_', $JSONMAP ) }\
OS_D8803963182F:opensprinkler/sensor/flow:.* { json2nameValue( $EVENT, 'flow_', $JSONMAP ) }\
OS_D8803963182F:opensprinkler/station/0:.* { json2nameValue( $EVENT, 'Station0_', $JSONMAP ) }\
OS_D8803963182F:opensprinkler/station/1:.* { json2nameValue( $EVENT, 'Station1_', $JSONMAP ) }\
OS_D8803963182F:opensprinkler/station/2:.* { json2nameValue( $EVENT, 'Station2_', $JSONMAP ) }\
OS_D8803963182F:opensprinkler/station/3:.* { json2nameValue( $EVENT, 'Station3_', $JSONMAP ) }\
OS_D8803963182F:opensprinkler/station/4:.* { json2nameValue( $EVENT, 'Station4_', $JSONMAP ) }\
OS_D8803963182F:opensprinkler/station/5:.* { json2nameValue( $EVENT, 'Station5_', $JSONMAP ) }\
OS_D8803963182F:opensprinkler/station/6:.* { json2nameValue( $EVENT, 'Station6_', $JSONMAP ) }\
OS_D8803963182F:opensprinkler/station/7:.* { json2nameValue( $EVENT, 'Station7_', $JSONMAP ) }\
OS_D8803963182F:opensprinkler/station/8:.* { json2nameValue( $EVENT, 'Station8_', $JSONMAP ) }\
OS_D8803963182F:opensprinkler/station/9:.* { json2nameValue( $EVENT, 'Station9_', $JSONMAP ) }\
OS_D8803963182F:opensprinkler/station/10:.* { json2nameValue( $EVENT, 'Station10_', $JSONMAP ) }\
OS_D8803963182F:opensprinkler/station/11:.* { json2nameValue( $EVENT, 'Station11_', $JSONMAP ) }\
OS_D8803963182F:opensprinkler/station/12:.* { json2nameValue( $EVENT, 'Station12_', $JSONMAP ) }\
OS_D8803963182F:opensprinkler/station/13:.* { json2nameValue( $EVENT, 'Station13_', $JSONMAP ) }\
OS_D8803963182F:opensprinkler/station/14:.* { json2nameValue( $EVENT, 'Station14_', $JSONMAP ) }\
OS_D8803963182F:opensprinkler/station/15:.* { json2nameValue( $EVENT, 'Station15_', $JSONMAP ) }\
OS_D8803963182F:opensprinkler/station/16:.* { json2nameValue( $EVENT, 'Station16_', $JSONMAP ) }
attr Opensprinkler room Aussen->Garten,MQTT2_DEVICE

setstate Opensprinkler 0
setstate Opensprinkler 2020-06-20 09:34:35 Sensor1_state 1
setstate Opensprinkler 2020-06-20 09:30:00 Station0_duration 5
setstate Opensprinkler 2020-06-20 09:30:00 Station0_state 0
setstate Opensprinkler 2020-06-19 16:58:01 Station3_duration 6
setstate Opensprinkler 2020-06-19 16:58:01 Station3_state 0
setstate Opensprinkler 2020-06-20 09:30:10 Station5_duration 6
setstate Opensprinkler 2020-06-20 09:30:10 Station5_state 0
setstate Opensprinkler 2020-06-20 09:29:50 Station7_duration 3
setstate Opensprinkler 2020-06-20 09:29:50 Station7_state 0
setstate Opensprinkler 2020-06-19 17:10:12 availability online


Titel: Antw:OpenSprinkler Support
Beitrag von: Beta-User am 22 Juni 2020, 14:36:45
Na ja, du kannst das mit den Namen ja auch via jsonMap machen:

In der readingList z.B. einfach (kürzer...):
[...]
opensprinkler/station/0:.* { json2nameValue( $EVENT, 'St0_', $JSONMAP ) }\
[...]

und dann passendes jsonMap:
attr Opensprinkler jsonMap St0_duration:Rasen_oben_Dauer St0_state:Rasen_oben_Status