LinkTap Bewässerungscomputer und Flow Meter via MQTT integrieren

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

Moderatoren: Cyrelian, seppy

brauni
Beiträge: 6
Registriert: 25. Jun 2022 19:49
Answers: 0

Re: LinkTap Bewässerungscomputer und Flow Meter via MQTT integrieren

Beitrag von brauni »

Erstmal vielen Dank für die Antwort. Das hat mir schon geholfen und ich habe wieder etwas dazugelernt :-)

Ich habe es damit tatsächlich hinbekommen die Öffnungszeit in Sekunde zu setzen. Damit öffnet das Ventil sofort bis zum Ablauf der angegebenen Zeit. Damit kann ich also diesen Wert auslesen und setzen.

Hier der Code dazu
code1.jpg

Den Status des Ventils kann ich auch auslesen.
Leider verstehe ich noch nicht wie ich es direkt öffnen/schließen kann bzw. wie das Publis dafür aussieht.
Das ging unter dem Host-Tpe "Home-Assistant" recht einfach. Setze ich das Ventil auf ON wurde es für eine vordefiniert Dauer aktiviert. Fertig.
Folgend mein Zwischenergebnis bzw. der Code für den 'Switch' (das formatBeforePublish war nur ein Versuch, funktioniert so leider nicht)
code2.jpg
In der Dokmentation von LinklTap ist leider nur das setzen der 'duration' under cmd 6 beschrieben. Was es da noch für Varianten gibt (z.B. vielleicht auch das Setzten der Sollwassermenge etc) erschließt sich mir aktuell nicht. Oder ich bin einfach nicht erfahren genug daraus andere Möglichkeiten abzuleiten ;-) Ich habe LinkTap mal angeschrieben. Mal sehen was die Antworten.


Viele Grüße,
Andreas
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

neuling10
Beiträge: 56
Registriert: 26. Mär 2022 18:15
Answers: 0

Re: LinkTap Bewässerungscomputer und Flow Meter via MQTT integrieren

Beitrag von neuling10 »

Hallo Andreas,

nach einem Jahr Betrieb hier ein paar Gedanken zu meiner Umsetzung:
- Für die Steuerung des Ventils (Switch "_water_switch") und für den Bewässerungsstatus ("_is_watering") nutze ich ebenso die MQTT Home Assistant vordefinierten Channels
- Die Status von Fall-, Broken-, Cutoff-, Leak- und Clog-Alarm hole ich mir mittels Generic MQTT Thing. Weitere Channels nutze ich derzeit nicht.
- Für die tägliche Bewässerung habe ich Bewässerungspläne mit 4 Intervallen direkt in der LinkTap App erstellt (Vorteil: Anpassung der Bewässerung auf Basis der Tages-Temperatur und Wettervorhersage einfach möglich). Natürlich wäre das auch über OpenHab programmierbar, war mir dann aber doch zu komplex.
- Ich habe Froggit Bodenfeuchtesensoren mittels FineoffsetWeather in Openhab integriert. Meldet einer eine Bodenfeuchte <x% 6h (6h ist der Forecast-Wert, den ich in der LinkTap App eingestellt habe) nach dem geplanten Bewässerungsintervall, starte ich über eine Rule für y Minuten die Bewässerung => Channel "_water_switch" geht für y Minuten auf ON => Sicherheitsebene, sollte die Wettervorhersage von Linktap doch mal nicht stimmen, kein/wenig Regen gekommen sein und ein Bewässerungszyklus übersprungen wurde
- Bewässerungshistorie sehe ich ebenso über die Linktap App ein (sehr übersichtlich aufgebaut, auch CSV-Export möglich)

Grüße
neuling10

brauni
Beiträge: 6
Registriert: 25. Jun 2022 19:49
Answers: 0

Re: LinkTap Bewässerungscomputer und Flow Meter via MQTT integrieren

Beitrag von brauni »

Hallo,

ich habe ein wenig Zeit gebraucht da ich in Urlaub war und die Familie Vorrang vor Openhab hat. :-)
Dank der Infos hier und auch von LinkTap (die Antworten wirklich schnell) bin ich nun an mein Ziel gekommen. Danke hier an alle.

@Neuling10: Ich habe einen ähnlichen Ansatz wie Du. Die ausführlicher Einrichtung/Parametrierung mache ich auch in der LinkTap-App. Das geht dort sehr gut und ich wollte das Rad in OpenHab nicht neu erfinden.

Falls irgendwer mal über das gleiche Thema stolpert, hier mein Lösungsansatz ohne den Weg über Homeassistant. Ich hoffe es hilft bei Bedarf den Ein oder Anderen ein wenig weiter. Der Code hat mit Sicherheit Verbesserungspotential (bin kein Openhab Programmier-Experte)

Ich habe ein LinkTap D1. Das hat zwei Ventile mit Durchflussmessung. Bei meiner Parametrierung stellt jedes Ventil ein Device dar.
Gateway und Device haben eine eindeutige ID. Diese habe ich hier mal mit xxxxxxxxxx für die Gateway-ID und yyyyyyyyyy_1 für die Device-ID des ersten Ventils dargestellt (yyyyyyyyyy_2 wäre die des zweiten Ventils). Diese Angaben müssen natürlich bei jedem angepasst werden. Hier lohnt es sich ein MQTT-Explorer zu verwenden. Damit bekommt man die ID's einfach raus.

Folgend der Code für ein Device...

So sieht meine Sitemap am Ende aus:
openhab.jpg
Das LinKTab-Gateway ist in meinem Fall als MQTT-Client eingerichtet (ich gehe hier aber nicht auf die Einrichtung des MQTT-Brokers ein. Das sprengt den Rahmen)
gateway-settings.jpg
Für jedes Device habe ich in Openhab dann ein 'Generic MQTT Thing' angelegt. Für das erste Device/Ventil habe ich folgende Channels angelegt:

Code: Alles auswählen

channels:
  - id: LinkTap01_1_battery
    channelTypeUID: mqtt:number
    label: LinkTap01_1_battery
    description: ""
    configuration:
      stateTopic: /linktap/up_cmd/yyyyyyyyyy_1
      transformationPattern: JSONPATH:$.dev_stat.battery
      unit: "%"
  - id: LinkTap01_1_signal
    channelTypeUID: mqtt:number
    label: LinkTap01_1_signal
    description: ""
    configuration:
      stateTopic: /linktap/up_cmd/yyyyyyyyyy_1
      transformationPattern: JSONPATH:$.dev_stat.signal
      unit: "%"
  - id: LinkTap01_1_remain_duration
    channelTypeUID: mqtt:number
    label: LinkTap01_1_remain_duration
    description: ""
    configuration:
      stateTopic: /linktap/up_cmd/yyyyyyyyyy_1
      transformationPattern: JSONPATH:$.dev_stat.remain_duration
      unit: s
  - id: LinkTap01_1_volume
    channelTypeUID: mqtt:number
    label: LinkTap01_1_volume
    description: null
    configuration:
      stateTopic: /linktap/up_cmd/yyyyyyyyyy_1
      transformationPattern: JSONPATH:$.dev_stat.volume
      unit: l
  - id: LinkTap01_1_flowrate
    channelTypeUID: mqtt:number
    label: LinkTap01_1_flowrate
    description: null
    configuration:
      stateTopic: /linktap/up_cmd/yyyyyyyyyy_1
      transformationPattern: JSONPATH:$.dev_stat.speed
      unit: l
  - id: LinkTap01_1_iswatering
    channelTypeUID: mqtt:switch
    label: LinkTap01_1_iswatering
    description: null
    configuration:
      stateTopic: /linktap/up_cmd/yyyyyyyyyy_1
      transformationPattern: JSONPATH:$.dev_stat.is_watering
      off: "false"
      on: "true"
  - id: LinkTap01_1_startwartering_flowrate
    channelTypeUID: mqtt:number
    label: LinkTap01_1_startwartering_flowrate
    description: null
    configuration:
      commandTopic: /linktap/down_cmd
      formatBeforePublish: '{"cmd" : 6,"gw_id" : "xxxxxxxxxx","dev_id" :
        "yyyyyyyyyy_1","duration":%d}'
      stateTopic: /linktap/up_cmd/yyyyyyyyyy_1
      transformationPattern: JSONPATH:$.dev_stat.total_duration
  - id: LinkTap01_1_stopwartering
    channelTypeUID: mqtt:switch
    label: LinkTap01_1_stopwatering
    description: null
    configuration:
      formatBeforePublish: '{"cmd" : 7,"gw_id" : "xxxxxxxxxx","dev_id" :
        "yyyyyyyyyy_1"}'
      commandTopic: /linktap/down_cmd
Nun die Items (Sorry, ich lege Items noch immer in einer Text-Datei an)

Code: Alles auswählen

String	LinkTap01_1_action           "Wasser Start/Stop"                  <faucet>          

Switch	LinkTap01_1_iswatering       "Bewässerung"                             <faucet>    { channel="mqtt:topic:a64cwfwefw:LinkTap01_1_iswatering" }
Number  LinkTap01_1_target_time      "Vorgabzeit [JS(sec2hms.js):%s]"          <time>      { channel="mqtt:topic:a64cwfwefw:LinkTap01_1_startwartering_flowrate" }
Number  LinkTap01_1_remain_duration  "Restlaufzeit [JS(sec2hms.js):%s]"        <time>      { channel="mqtt:topic:a64cwfwefw:LinkTap01_1_remain_duration"}
Number  LinkTap01_1_volume           "Gesamtabgabe [%.1f Ltr]"                 <bottle>    { channel="mqtt:topic:a64cwfwefw:LinkTap01_1_volume"}
Number  LinkTap01_1_speed            "Durchfluss [%.1f Ltr/min]"               <flow>      { channel="mqtt:topic:a64cwfwefw:LinkTap01_1_flowrate"}

Number  LinkTap01_1_battery "Batterie [%d %%]"                                 <battery>   {channel="mqtt:topic:a64cwfwefw:LinkTap01_1_battery"}
Number  LinkTap01_1_signal  "Signal [%d %%]"                                   <network>   {channel="mqtt:topic:a64cwfwefw:LinkTap01_1_signal"}
dazu habe ich folgende Rule:

Code: Alles auswählen

//==========================================================================
//  Aktionsknopf zurücksetzten
//==========================================================================
rule "Action 1 zuruecksetzen"
when 
  Item LinkTap01_1_iswatering changed
then
  LinkTap01_1_action.sendCommand("")
end



//==========================================================================
//  Entsprechend der gewählten Aktion Ventil oeffnen bzw. schließen
//==========================================================================

rule "Wasser Links Ein/Aus"
when
  Item LinkTap01_1_action changed 
then  
  
  // Ventil oeffnen fuer n Sekunden
  if (LinkTap01_1_action.state == "START")
  {
    LinkTap01_1_target_time.sendCommand(3600)
  }

  // Ventil schließen
  if (LinkTap01_1_action.state == "STOP")
  {
    val mqttActions = getActions("mqtt","mqtt:broker:579z6dc338")
    mqttActions.publishMQTT("/linktap/down_cmd", '{"cmd":7,"gw_id":"xxxxxxxxxx","dev_id":"yyyyyyyyyy_1"}');
  }
end
So, ich hoffe ich hab nix übersehen und viel Spaß beim Bewässern mit LinkTap :-)
Viele Grüße,
Andreas
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

Benutzeravatar
udo1toni
Beiträge: 13989
Registriert: 11. Apr 2018 18:05
Answers: 222
Wohnort: Darmstadt

Re: LinkTap Bewässerungscomputer und Flow Meter via MQTT integrieren

Beitrag von udo1toni »

Die Rules sind in der Form unnötig kompliziert.

Das String Item LinkTap01_1_action ist ein ungebundenes Item. Es dient also nur dazu, Vorgänge in openHAB zu steuern. Die UI löst jedes Mal, wenn dort ein Item beeinflusst wird, ein Command aus. Auf dem Bus tritt dann also das Event received command auf. Entsprechend reicht eine Rule:

Code: Alles auswählen

//==========================================================================
//  Entsprechend der gewählten Aktion Ventil oeffnen bzw. schließen
//==========================================================================

rule "Wasser Links Ein/Aus"
when
  Item LinkTap01_1_action received command
then  
    val strStop = '{"cmd":7,"gw_id":"xxxxxxxxxx","dev_id":"yyyyyyyyyy_1"}'  // Stopp-Befehl
    switch(receivedCommand.toString) {
        case "START" :                                                      // Ventil öffnen 
            LinkTap01_1_target_time.sendCommand(3600)                       // für eine Stunde
        case "STOP"  : {                                                    // Ventil schließen
            val mqttActions = getActions("mqtt","mqtt:broker:579z6dc338")   // Handle holen
            mqttActions.publishMQTT("/linktap/down_cmd", strStop)           // Befehl senden
        }
    }
    LinkTap01_1_action.postUpdate("")                                       // Item leeren
end
Das Rücksetzen des Knopfes kann also direkt erfolgen, und dabei wird die Rule nicht nochmal getriggert (im Gegensatz zur Variante über changed)

Was mich etwas irritiert: Wenn Du schon einen Channel für den STOPP-Befehl angelegt hast, warum nutzt Du den denn nicht?
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

brauni
Beiträge: 6
Registriert: 25. Jun 2022 19:49
Answers: 0

Re: LinkTap Bewässerungscomputer und Flow Meter via MQTT integrieren

Beitrag von brauni »

Hallo,
Die Rules sind in der Form unnötig kompliziert.
Das String Item LinkTap01_1_action ist ein ungebundenes Item. Es dient also nur dazu, Vorgänge in openHAB zu steuern. Die UI löst jedes Mal, wenn dort ein Item beeinflusst wird, ein Command aus. Auf dem Bus tritt dann also das Event received command auf. Entsprechend reicht eine Rule:
Danke für den wertvollen Hinweis. Habe ich gleich umgesetzt. :)
Das Rücksetzen des Knopfes über das Item kann also direkt erfolgen, und dabei wird die Rule nicht nochmal getriggert (im Gegensatz zur Variante über changed)
Ich habe trotzdem die Rule für das Rücksetzen des 'Item LinkTap01_1_iswatering' belassen, da LinkTap nicht sofort das Ventil öffnet bzw. schließt. Es braucht immer ein paar Sekunden (scheint so gewollt, ist in deren App auch so). Erst dann wird natürlich auch der Status 'iswatering' von LinkTap gesendet. Somit hat man eine Response, dass die Bewässerung dann auch wirklich begonnen bzw. gestoppt hat.

>Was mich etwas irritiert: Wenn Du schon einen Channel für den STOPP-Befehl angelegt hast, warum nutzt Du den denn nicht?
Das war ein überbleibsel auf einem ersten Versuch, den ich so nicht mehr benötige.

Vielen Dank,
Andreas

Benutzeravatar
udo1toni
Beiträge: 13989
Registriert: 11. Apr 2018 18:05
Answers: 222
Wohnort: Darmstadt

Re: LinkTap Bewässerungscomputer und Flow Meter via MQTT integrieren

Beitrag von udo1toni »

brauni hat geschrieben: 22. Jul 2023 19:17 Ich habe trotzdem die Rule für das Rücksetzen des 'Item LinkTap01_1_iswatering' belassen, da LinkTap nicht sofort das Ventil öffnet bzw. schließt.
Ja, aber nein. Das ist der falsche Weg. Der Knopf ist nur ein Knopf und sagt nichts über den echten Zustand aus.
Da Du ja ein Item hast, welches den Zustand ändert, zeige lieber dieses Item zusätzlich an. Wenn Du das in der Sitemap in einem Widget abbilden willst, gibt es verschiedene Optionen dazu, z.B. kannst Du über die visibility gehen:

Code: Alles auswählen

Switch item=LinkTap01_1_action label="Bewässern AKTIV!" mappings=[START="Start",STOP="Stop"] visibility=[LinkTap01_1_iswatering==ON]
 Switch item=LinkTap01_1_action label="Bewässern inaktiv" mappings=[START="Start",STOP="Stop"] visibility=[LinkTap01_1_iswatering!=ON]
Je nachdem, ob der Status von LinkTap01_1_iswatering ON ist oder nicht, wird das Widget mit dem Label "Bewässern AKTIV!" oder "Bewässern inaktiv" angezeigt. Man kann auf ähnlichem Weg auch das Label einfärben, der Witz dabei ist, dass die Anzeige nicht zwingend abhängig vom Status des verknüpften Items ist.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

Antworten