Seite 1 von 4

openhab 3 Regel zum Daten senden an Wemos D1 Mini mit i2c Display 20x4

Verfasst: 18. Aug 2023 16:35
von Locke
Hi,
ich lasse mir von meinem 3D Drucker die Daten über Temperaturen, Druckfortschritt, Restzeit an opeHab senden/anzeigen über MQTT. Der Drucker ist mit einem Raspberry Pi 4 verbunden über octoPrint. In openHAB habe ich die Daten/Werte in einem Thing und den jeweiligen channels. Jetzt würde ich gern das ganze mir auf einem Display anzeigen lassen, weiß leider nicht wie ich es machen soll.
Der Wemos D1 Mini mit dem Display ist in openHAB auch als Thing. Als was muß ich den channel (String ? ) anlegen um die Daten an das Display zu senden ? Wie müßte die Rule mit Zeilenangabe für das Display aussehen, gern auch per Blockly (versuche mich gerade daran), finde aber nicht die Lösung.

Danke

Re: openhab 3 Regel zum Daten senden an Wemos D1 Mini mit i2c Display 20x4

Verfasst: 18. Aug 2023 17:21
von udo1toni
Na ja, wie Du das Display ansteuerst, weißt nur Du :) das ist ja vor allem abhängig von der verwendeten Software auf dem D1 Mini.
Grundsätzlich wirst Du sicher einen String senden müssen, evtl. als JSON verpackt. Aber das ist nichts openHAB-spezifisches, Du musst wissen, was Du senden musst, anschließend können wir dazu eine Rule bauen.

Re: openhab 3 Regel zum Daten senden an Wemos D1 Mini mit i2c Display 20x4

Verfasst: 18. Aug 2023 18:31
von Locke
udo1toni hat geschrieben: 18. Aug 2023 17:21
Hi Udo,
sorry vergessen zu sagen das auf dem Wemos D1 (nenne ihn mal 2) Tasmota läuft.
In meinem Druckerschrank ist auch ein Wemos D1 ( nenne ihn mal 1) mit Tasmota an dem ist ein DHT22 Sensor angeschloßen, die Werte habe ich in openHab.
Der Wemos 2 soll mit ins Wohnzimmer um die Übersicht zu behalten beim Drucken.
In Wemos 2 habe ich zwei Tasmota Regeln um mir die daten von Wemos 1 auf Wemos 2 zu holen.

Code: Alles auswählen

Rule1 ON mqtt#connected DO Subscribe DruckerTemp, tele/3D_Drucker_Temp_Luft/SENSOR, AM2301.Temperature ENDON ON Event#DruckerTemp DO DisplayText[l1c1]Temp    %value%~dfC ENDON

Rule2 ON mqtt#connected DO Subscribe DruckerHumi, tele/3D_Drucker_Temp_Luft/SENSOR, AM2301.Humidity ENDON ON Event#DruckerHumi DO DisplayText[l2c1]Feuchte %value% % ENDON
Das funktioniert auch super, allerdings schaffe ich es nicht über Subscribe mir die Daten von octoPrint zu holen, da dort keine tele/ gesendet wird.

MQTT FX liefert mir unter octoPrint/progress/printing folgendes:

Code: Alles auswählen

{"location": "local", "path": "BB1_Adapter LR44 zu LR41 passt.gcode", "progress": 58, "printer_data": {"state": {"text": "Printing", "flags": {"operational": true, "printing": true, "cancelling": false, "pausing": false, "resuming": false, "finishing": false, "closedOrError": false, "error": false, "paused": false, "ready": false, "sdReady": false}, "error": ""}, "job": {"file": {"name": "BB1_Adapter LR44 zu LR41 passt.gcode", "path": "BB1_Adapter LR44 zu LR41 passt.gcode", "display": "BB1_Adapter LR44 zu LR41 passt.gcode", "origin": "local", "size": 255558, "date": 1676819986}, "estimatedPrintTime": 309.90948992092274, "averagePrintTime": 549.6826381054452, "lastPrintTime": 582.7677503828891, "filament": {"tool0": {"length": 162.58849999999947, "volume": 0.0}}, "user": "Biqu"}, "currentZ": 1.8, "progress": {"completion": 58.09248781098616, "filepos": 148460, "printTime": 348, "printTimeLeft": 379, "printTimeLeftOrigin": "linear"}, "offsets": {}, "resends": {"count": 0, "transmitted": 4892, "ratio": 0}}, "_timestamp": 1692376009}
Die Topics in MQTT FX von octoPrint sind:

Code: Alles auswählen

octoPrint/event/Alert
octoPrint/event/CaptureDone
octoPrint/event/CaptureStart
octoPrint/event/ChartMarked
octoPrint/event/ClientAuthed
octoPrint/event/ClientClosed
octoPrint/event/ClientOpened
octoPrint/event/CommandSuppressed
octoPrint/event/Connected
octoPrint/event/Connecting
octoPrint/event/ConnectionsAutorefreshed
octoPrint/event/Disconnected
octoPrint/event/Disconnecting
octoPrint/event/Dwelling
octoPrint/event/EStop
octoPrint/event/Error
octoPrint/event/FilamentChange
octoPrint/event/FileAdded
octoPrint/event/FileDeselected
octoPrint/event/FileRemoved
octoPrint/event/FileSelected
octoPrint/event/FirmwareData
octoPrint/event/GcodeScriptAfterPrintCancelledFinished
octoPrint/event/GcodeScriptAfterPrintCancelledRunning
octoPrint/event/GcodeScriptAfterPrintDoneFinished
octoPrint/event/GcodeScriptAfterPrintDoneRunning
octoPrint/event/GcodeScriptAfterPrintPausedFinished
octoPrint/event/GcodeScriptAfterPrintPausedRunning
octoPrint/event/GcodeScriptBeforePrintResumedFinished
octoPrint/event/GcodeScriptBeforePrintResumedRunning
octoPrint/event/GcodeScriptBeforePrintStartedFinished
octoPrint/event/GcodeScriptBeforePrintStartedRunning
octoPrint/event/Home
octoPrint/event/MetadataAnalysisFinished
octoPrint/event/MetadataAnalysisStarted
octoPrint/event/MetadataStatisticsUpdated
octoPrint/event/MovieDone
octoPrint/event/MovieRendering
octoPrint/event/PositionUpdate
octoPrint/event/PrintCancelled
octoPrint/event/PrintCancelling
octoPrint/event/PrintDone
octoPrint/event/PrintFailed
octoPrint/event/PrintPaused
octoPrint/event/PrintResumed
octoPrint/event/PrintStarted
octoPrint/event/PrinterProfileModified
octoPrint/event/PrinterStateChanged
octoPrint/event/SettingsUpdated
octoPrint/event/Shutdown
octoPrint/event/ToolChange
octoPrint/event/UpdatedFiles
octoPrint/event/Upload
octoPrint/event/UserLoggedIn
octoPrint/event/ZChange
octoPrint/event/plugin_backup_backup_created
octoPrint/event/plugin_firmware_check_warning
octoPrint/event/plugin_pi_support_throttle_state
octoPrint/event/plugin_pluginmanager_install_plugin
octoPrint/event/plugin_softwareupdate_update_succeeded
octoPrint/mqtt
octoPrint/plugins/mqttsubscribe/debug
octoPrint/progress/printing
octoPrint/progress/slicing
octoPrint/temperature/W
octoPrint/temperature/bed
octoPrint/temperature/tool0
octoPrint/temperature/tool1
octoprint/plugin/mqttpublish/pub
octoprint/plugin/tasmota
In opeHab ist der Fortschritt so angelegt und funktioniert auch:

Code: Alles auswählen

UID: mqtt:topic:Broker_163:Drucker_Fortschritt
label: 3D Drucker Fortschritt
thingTypeUID: mqtt:topic
configuration: {}
bridgeUID: mqtt:broker:Broker_163
channels:
  - id: Drucker_Fortschritt
    channelTypeUID: mqtt:number
    label: Drucker Fortschritt
    description: ""
    configuration:
      stateTopic: octoPrint/progress/printing
      transformationPattern: JSONPATH:$.progress
Ich dachte es müßte doch auch gehen mir die vorhandenen Dat von openHab an den Wemos 2 zu senden in den Zeilen 3 und 4

Ich hoffe es hilft Dir weiter.

Re: openhab 3 Regel zum Daten senden an Wemos D1 Mini mit i2c Display 20x4

Verfasst: 18. Aug 2023 19:26
von udo1toni
Ja, dann musst Du halt passende Topics abonnieren. :) Entweder ziehst Du die Informationen direkt aus octoPrint/progress/printing heraus (analog zu tele/3D_Drucker_Temp_Luft/SENSOR, das ist ja auch nur ein Topic wie jedes andere)
oder Du definierst ein Topic, an das openHAB sendet, dann kannst Du den Inhalt des auszugebenden Textes halt noch manipulieren.

Also z.B. als Rule auf dem Wemos:

Code: Alles auswählen

Rule3 ON mqtt#connected DO Subscribe DruckerProgress, octoPrint/progress/printing, progress ENDON ON Event#DruckerProgress DO DisplayText[l3c1]Fortschritt %value% % ENDON
Wobei ich das noch nie selbst ausprobiert habe, die Rule ist lediglich anhand Deiner schon funktionierenden Rules erstellt.
Wenn Du den Text über openHAB erstellen willst (weil Du hier vielleicht noch andere Sachen im Wechsel ausgeben willst), müsstest Du die Rule halt anders definieren:

Code: Alles auswählen

Rule3 ON mqtt#connected DO Subscribe DruckerProgress, openHAB/message, text ENDON ON Event#DruckerProgress DO DisplayText[l3c1]%value% ENDON
Nun musst Du in openHAB einen ausgehenden Channel definieren:

Code: Alles auswählen

UID: mqtt:topic:Broker_163:Drucker_Fortschritt
label: 3D Drucker Fortschritt
thingTypeUID: mqtt:topic
configuration: {}
bridgeUID: mqtt:broker:Broker_163
channels:
  - id: Drucker_Fortschritt
    channelTypeUID: mqtt:number
    label: Drucker Fortschritt
    description: ""
    configuration:
      stateTopic: octoPrint/progress/printing
      transformationPattern: JSONPATH:$.progress
  - id: Drucker_Message
    channelTypeUID: mqtt:string
    label: Nachricht
    description: ""
    configuration:
      commandTopic: openHAB/message
      formatBeforePublish: {"text":%s}
Der Befehl auf dem Wemos liest in diesem Fall also aus dem Topic openHAB/message, nimmt die Payload und verwendet den Wert im Feld "text" und gibt ihn einfach so aus wie er ist.
in openHAB musst Du entsprechend über den Channel Drucker_Message den String senden, wobei formatBeforePublish dafür sorgt, dass der String in ein passendes JSON Objekt eingebaut wird.

Re: openhab 3 Regel zum Daten senden an Wemos D1 Mini mit i2c Display 20x4

Verfasst: 18. Aug 2023 20:23
von Locke
ich werde es später noch testen, Regierung hat jetzt Hunger :D

Danke schon mal

Re: openhab 3 Regel zum Daten senden an Wemos D1 Mini mit i2c Display 20x4

Verfasst: 18. Aug 2023 23:29
von Locke
habe es mal getestet, leider kein erfolg egal wie ich es versuche.
Ist es richtig das nach dem speichern die beiden letzten Zeilen sich immer austauschen ?

Code: Alles auswählen

      commandTopic: openHAB/message
      formatBeforePublish: {"text":%s}
      
     
     
nach dem speichern steht es so im code:
      
      formatBeforePublish: {"text":%s}
      commandTopic: openHAB/message

Re: openhab 3 Regel zum Daten senden an Wemos D1 Mini mit i2c Display 20x4

Verfasst: 19. Aug 2023 00:02
von udo1toni
Die Reihenfolge spielt keine Rolle.

Schau mal mit einem mqtt Sniffer (z.B. MQTT Explorer), ob das Topic überhaupt funktioniert.
Kommt der Befehl von openHAB in MQTT Explorer an?
Wenn Du ein passendes JSON Objekt über MQTT Explorer abschickst, kommt es im Wemos an?

Re: openhab 3 Regel zum Daten senden an Wemos D1 Mini mit i2c Display 20x4

Verfasst: 19. Aug 2023 00:38
von Locke
in MQTT FX und MQTT Explorer ist nichts zu sehen.
Wenn Du ein passendes JSON Objekt über MQTT Explorer abschickst, kommt es im Wemos an?
wie ich das machen muß weiß ich leider nicht sorry, nutze MQTT FX nur um die Topics auszulesen.

Re: openhab 3 Regel zum Daten senden an Wemos D1 Mini mit i2c Display 20x4

Verfasst: 19. Aug 2023 00:43
von Locke
Auszug aus dem Log

Code: Alles auswählen

2023-08-19 00:41:13.608 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'Display20x4_Text' changed from {"Rule3":{"State":"ON","Once":"OFF","StopOnError":"OFF","Length":134,"Free":377,"Rules":"ON mqtt#connected DO Subscribe DruckerProgress, openHAB/message, text ENDON ON Event#DruckerProgress DO DisplayText[l3c1]%value% ENDON"}} to {"DisplayText":"[l1c1]Temp    32.5~dfC"}

Code: Alles auswählen

2023-08-19 00:39:53.559 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'Display20x4_Text' changed from {"DisplayText":"[l2c1]Feuchte 59.4 %"} to {"DisplayText":"[l1c1]Temp    32.3~dfC"}

2023-08-19 00:39:53.608 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'Display20x4_Text' changed from {"DisplayText":"[l1c1]Temp    32.3~dfC"} to {"DisplayText":"[l2c1]Feuchte 59.4 %"}

Re: openhab 3 Regel zum Daten senden an Wemos D1 Mini mit i2c Display 20x4

Verfasst: 19. Aug 2023 09:05
von udo1toni
MQTT.fx kann auch Payloads senden. Das gehört schon zu den Grundlagen und ist nicht weiter schwer. Ein passender JSON String z.B.:

Code: Alles auswählen

{"text":"Hallo Welt!"}
Und den musst Du mit MQTT.fx an das Topic openHAB/message senden.

Die erste Logzeile aus openHAB enthält ja die komplette Tasmota Rule, so kann das nicht funktionieren.
Du musst die Tasmota Rule über Tasmota im Wemos D1 speichern, so wie Du die beiden anderen Rules auch dort gespeichert hast, damit Luftfeuchte und Temperatur angezeigt werden. Der Wemos muss die Daten hier aktiv abonnieren (das ist jeweils der erste Teil der Rule) und im weiteren Verlauf empfangene Daten auf das Display bringen (das ist jeweils der zweite Teil der Rule)