Wenn dies dein erster Besuch hier ist, lies bitte zuerst die Hilfe - Häufig gestellte Fragen durch. Du musst dich vermutlich registrieren, bevor du Beiträge verfassen kannst. Klicke oben auf 'Registrieren', um den Registrierungsprozess zu starten. Du kannst auch jetzt schon Beiträge lesen. Suche dir einfach das Forum aus, das dich am meisten interessiert.
Danke Msinn
Das könnte vielleicht in der Doku ergänzt werden (oder habe ich es überlesen?).
Auch der Typ im Beispiel sollte wohl besser auf dict geändert werden.
Der Typ im Beispiel ist schon ok. Es ist ja nicht klar was das MQTT Device sendet. Der Daten-Inhalt der MQTT Messages ist nicht genormt. Das können Binärdaten, Texte (nur als ASCII), etc. sein. Genaugenommen ist das Datenelement einer MQTT Message immer ein Array of Byte. Das ändert sich erst mit der Protokoll Version 5.0 (für die es aber noch keine fertigen Implementierungen gibt).
Das Plugin unterstützt deshalb das Casteing in den Datentyp des Items. (siehe auch Release Notes im Support Thread)
Code:
MQTT Plugin v1.3.1 (2017-05-01)
Unterstützung aller drei QoS Modi für Nachrichten
Retained Flag Unterstützung für Nachrichten
MQTT Testamant Message (Last Will)
Birth Message
Je Plugin Instanz nur eine Client Session zum Broker
.
Smart Plugin
Multi-Instance fähig
Type-Casting (Umwandlung in die SmartHomeNG Datentypen) für ein- und ausgehende Nachrichten
Type-Casting (Umwandlung in die SmartHomeNG Datentypen) für Payloads in Logik-Triggern
Kann man mit einem eval die numerischen Werte 3er Items als str mit Kommatrennung schreiben?
Bislang mache ich das mit einer Logik:
Code:
r = sh.Licht.Wohnzimmer.Kanal1.rgb.r()
g = sh.Licht.Wohnzimmer.Kanal1.rgb.g()
b = sh.Licht.Wohnzimmer.Kanal1.rgb.b()
sh.Licht.Wohnzimmer.Kanal1.rgb([r,g,b])
2018-12-02 17:54:08 ERROR lib.item Item SONOFF.SONOFF_RGBW1.HSB: problem creating: 'list' object has no attribute 'find'
Traceback (most recent call last):
File "/usr/local/smarthome/lib/item.py", line 563, in __init__
child = Item(smarthome, self, child_path, value)
File "/usr/local/smarthome/lib/item.py", line 453, in __init__
self._process_eval(value)
File "/usr/local/smarthome/lib/item.py", line 776, in _process_eval
value = self.get_stringwithabsolutepathes(value, 'sh.', '(', KEY_EVAL)
File "/usr/local/smarthome/lib/item.py", line 1753, in get_stringwithabsolutepathes
if evalstr.find(begintag+'.') == -1:
AttributeError: 'list' object has no attribute 'find'
Wie bekommt am das hin?
War hier auch schon mal Thema, aber ohne "lesbare" Lösung.
Erster Schnellschuss: int() statt str() für die einzelnen Werte nehmen und das ganze in ein str() einbetten?
/tom
Nachtrag: Was ich meine - ich habe z.B. einen Haufen solcher (zugegebenermaßen unschönen, aber funktionierenden) evals, um das obligatorische Leerzeichen von der Einheit in der späteren Visu-Ausgabe zu umschiffen:
Code:
str(int(sh.mein_item())) + '%'
Du müsstest wahrscheinlich den String nur mit '+' weiterbasteln und dabei auch Kommata usw. setzen ...
Zuletzt geändert von Tom Bombadil; 02.12.2018, 18:08.
Item SONOFF.SONOFF_RGBW1.HSB: problem evaluating str(int(sh.SONOFF.SONOFF_RGBW1.Hue()), int(sh.SONOFF.SONOFF_RGBW1.Sat()), int(sh.SONOFF.SONOFF_RGBW1.Bright())): str() argument 2 must be str, not int
Vielleicht kannst Du das Beisiel in das Readme mit aufnehmen, da man es doch immer bei Farbbeleuchtung in den Items braucht (R+G+B --> R,G,B oder H+S+B --> H,S,B).
Wäre Super.
Schön, dass es klappt, Michael - ich bin mir sicher, die Python-Gurus können da mit Dicts / Listen / Arrays noch ganz andere elegante "Schweinereien" veranstalten, aber wie schon geschrieben: Nicht schön, aber funktional.
/tom
Wobei mir nicht klar ist, wofür man das braucht... und es passt nicht zu dem, was Du im RGB-Beispiel mit der Logik geschrieben hast! Da arbeitest Du nicht mit einem String, sonder mit einer Liste. Und auch das, was zwischendurch da stand
Was ich wollte: Für die Kommandos an RGB oder HSB Leuchtmitteln bzpw. im Milight Plugin oder auch für MQTT Payploads (Tasmota) braucht man eine Zeichenkette mit den Einzelwerten, die durch ein Komma getrennt sind. Dem Empfänger ist es glaube ich egal, ob String oder Liste. Im Prinzip müssen die 3 numerischen Werte aus den Items in eine Zeichenkette zusammengeführt werden, also R,G,B oder H,S,B.
Nein, ein String, der über .format gesteuert wird: Klick. Die fehlende explizite Umwandlung von int in str jagt mir jedesmal kalte Schauer über den Rücken, aber ich muss ja zum Glück seit 20 Jahren nicht mehr aktiv programmieren ...
(oder wie die Bauern in meiner alten Heimat sagen: "Dies'n niemodsche Kram hemm wie noch nie mokkt.")
ich bin durchaus für typysiertes und typgerechtes programmieren. Ich sehe es auch genau so, dass ein expliziter Cast besser ist als ein impliziter. Nur ist die .format-Funktion ja so definiert, dass sie ihre Argumente in einen String umwandelt, warum soll man es dann nochmal machen?
Nicht falsch verstehen, Waldemar - ich ziehe meinen Hut vor Deiner sauberen und eleganten Lösung (hatte ich ja eh schon vorhergesagt, dass da sicher noch was besseres kommen wird). Und mit der Definition von .format hast Du auch Recht.
Ist halt nur so ein Bauchgefühl - jemand, dem in frühen Tagen Maschinen- und Assemblercode eingebläut wurden, werden die Zeiten von 'try / except / egal_blas_das_kraftwerk_hoch' und 'DatentypIstMirDochWumpe' wohl immer ein wenig suspekt sein ...
ERROR:
while parsing a block mapping
in "<unicode string>", line 5, column 13:
type: str
^ (line: 5)
expected <block end>, but found '<scalar>'
in "<unicode string>", line 8, column 32:
eval: '{0},{1},{2}'.format(sh...Hue(), sh...Sat(), ...
^ (line: 8)
Wir verarbeiten personenbezogene Daten über die Nutzer unserer Website mithilfe von Cookies und anderen Technologien, um unsere Dienste bereitzustellen und die Websiteaktivitäten zu analysieren. Weitere Informationen findest Du in unserer Datenschutzerklärung.
Indem Du unten auf "ICH stimme zu" klickst, stimmst Du unserer Datenschutzerklärung und unseren persönlichen Datenverarbeitungs- und Cookie-Praktiken zu, wie darin beschrieben. Du erkennst außerdem an, dass dieses Forum möglicherweise außerhalb Deines Landes gehostet wird und bist damit einverstanden, dass Deine Daten in dem Land, in dem dieses Forum gehostet wird, gesammelt, gespeichert und verarbeitet werden.
Kommentar