Hallo an alle,
als Anfänger habe ich es geschafft, mir alle 15 Minuten Readings ausgeben zu lassen, die mir den aktuellen Benzinpreis anzeigen (HTTPMOD).
Nun würde ich diese Werte gleichzeitig bei jeder Messung nach Thingspeak hochladen, um sie dort zu loggen.
Ich dachte an das Attribut "event-on-update-reading"?
Aber wie sieht dann der Befehl dazu aus?
Danke und viele Grüße!
Kenne Thingspeak nicht. Wie würdest Du (ausserhalb FHEM) einen Wert "hochladen"?
Ich lade dort Temperatur- und Luftfeuchtigkeitsdaten mit einem vorgefertigten Programm hoch (ohne FHEM).
Thingspeak gibt mir eine Adresse, mit der ich einzelne Werte hoch laden kann, das klappt auch, wenn ich die Adresse in
den Browser eingebe:
GET https://api.thingspeak.com/update?api_key=[ENTERAPI]&field1=0
Die "0" steht dann für den Wert, der hoch geladen werden soll.
Wie kann ich das nun in meine HTTPMOD einbauen und die "0" mit den jeweiligen Benzinpreisen ersetzen?
Hi,
dem httpmod String kannst du anstelle deiner "0" die Variablenzuweisung $val übergeben.
Schau mal hier: https://wiki.fhem.de/wiki/HTTPMOD (https://wiki.fhem.de/wiki/HTTPMOD) und dort nach "Advanced configuration to define a set command and send data to a device".
Das sollte genau das sein, was du benötigst.
Grüße,
Dirk
Ok, danke für den Tipp.
Aber wie wird dann $val automatisch durch das Reading ersetzt?
Vielleicht ist das ganze für den Anfang dann doch etwas zu kompliziert für mich :-\
In dem Du den Wert des Readings abfragst. Entweder mit ReadingsVal() oder als SetMagic mit set Device [DEVICE:READING]
Grüße
Ich denke, das ist genau das, was ich brauche!
Kann ich diese Befehle als Attribute direkt in meine HTTPMOD einbauen?
Mit dem Attribut "event-on-update-reading"?
Damit der $val mit jedem Update automatisch ersetzt wird?
Sorry, ich versuche mich gerade einzuarbeiten... :D
Vielen Dank!
Kenne mich mit HTTPMOD nicht so aus, aber würde einfach mal ja sagen. Probiere es aus. Im besten Fall gibt es eine saubere Fehlermeldung.
Ich habe nun als Attribut eingefügt (event-on-update-reading):
POST https://api.thingspeak.com/update?api_key=S1CI1DR793JTX7U2&field1=ReadingsVal(OUT.Spritpreis, SuperE10)
Out.Spritpreis ist der Name der HTTPMOD und SuperE10 das Reading.(?)
Danach ließ sich FHEM nicht mehr öffnen.
Hat jemand einen konkreten Tipp, wie ich vorgehen muss?
Irgendwie sprichst du in Rätseln. Ich glaube Deine Halbsätze haben mich verwirrt. Das Attribut event-on-change-reading hilft Dir nicht Deinen wert aus zu lesen.
Mach mal bitte ein list vom HTTPMOD Device.
list ist ein FHEM Befehl
Ok...
Ich habe eine HTTPMOD, die mir alle 15 Minuten den Benzinpreis ausgibt.
Diesen Wert will ich dann automatisch zum Loggen bei Thingspeak hochladen.
Dazu gibt mir Thingspeak folgenden Link an:
GET https://api.thingspeak.com/update?api_key=S1CI1DR793JTX7U2&field1=0
Ich möchte nun bei Vorgänge miteinander verbinden.
Dazu brauche ich einen Vorgang, der den Preis ausliest, in den Link einfügt und dann
den Link abschickt.
LG
Falls es weiterhilft, hier noch die list:
Internals:
BUSY 0
DEF http://www.clever-tanken.de/tankstelle_details/45725 900
Interval 900
LASTSEND 1499891059.50874
MainURL http://www.clever-tanken.de/tankstelle_details/45725
ModuleVersion 3.3.5 - 29.9.2016
NAME OUT.Spritpreis
NR 19
STATE E10: 1.49 €
TRIGGERTIME 1499891959.50824
TRIGGERTIME_FMT 2017-07-12 22:39:19
TYPE HTTPMOD
addr http://www.clever-tanken.de:80
buf HTTP/1.1 200 OK
Date: Wed, 12 Jul 2017 20:26:12 GMT
Server: Apache/2.2.22 (Ubuntu)
Vary: Accept-Encoding
Content-Type: text/html; charset=utf-8
Connection: close
Zitat von: Devender am 11 Juli 2017, 22:54:07
Hi,
dem httpmod String kannst du anstelle deiner "0" die Variablenzuweisung $val übergeben.
Schau mal hier: https://wiki.fhem.de/wiki/HTTPMOD (https://wiki.fhem.de/wiki/HTTPMOD) und dort nach "Advanced configuration to define a set command and send data to a device".
Das sollte genau das sein, was du benötigst.
Grüße,
Dirk
Ich kann nicht sehen das Du irgendwas davon eingebaut hast
Attributes:
readingsName_SuperE10 SuperE10
readingsRegex_SuperE10 <span>Super E10</span>[^0-9]+([0-9\.]+)
room Draußen
set01Name preissenden
set01URL https://api.thingspeak.com/update?api_key=S1CI1DR793JTX7U2&field1=$val
stateFormat E10: SuperE10 €
userattr readingsName_SuperE10 readingsRegex_SuperE readingsRegex_SuperE10 set01Name set01URL
Ich glaube, das macht so keinen Sinn. Ich kann mit allgemeinen Hinweisen nicht viel anfangen, weil ich von der Syntax
keine Ahnung hab. Dachte einfach nicht, dass es so kompliziert sein würde.
set01URL https://api.thingspeak.com/update?api_key=S1CI1DR793JTX7U2&field1=[OUT.Spritpreis:SuperE10]
Kann aber nicht versprechen das es so klappt.
Und bitte wenn Du Ausgaben wie Log oder Code oder Konfig hast immer hier in Codetags posten.
Danke, ich hätte es schon wieder falsch eingegeben.
Jetzt sieht es so aus:
Attributes:
event-on-update-reading set01URL
readingsName_SuperE10 SuperE10
readingsRegex_SuperE10 <span>Super E10</span>[^0-9]+([0-9\.]+)
room Draußen
set01URL https://api.thingspeak.com/update?api_key=S1CI1DR793JTX7U2&field1=[OUT.Spritpreis:SuperE10]
stateFormat E10: SuperE10 €
userattr readingsName_SuperE10 readingsRegex_SuperE readingsRegex_SuperE10 set01Name set01URL
Also du solltest wirklich ganz dringend bisschen Doku lesen.
event-on-update-reading hat damit nichts zu tun. Entferne das einfach mal.
Wenn das Reading SuperE10 einen Wert hat dann kannst du eigentlich ein set OUT.Spritpreis preissenden machen. Vorausgesetzt Du hast das Attribut set01Name noch
Du hast Recht, das mit dem even-on-update-reading war eine blöde Idee, hatte ich gerade selbst gemerkt ;)
Jetzt sieht es so aus:
Attributes:
readingsName_SuperE10 SuperE10
readingsRegex_SuperE10 <span>Super E10</span>[^0-9]+([0-9\.]+)
room Draußen
set01Name preissenden
set01URL https://api.thingspeak.com/update?api_key=S1CI1DR793JTX7U2&field1=[OUT.Spritpreis:SuperE10]
stateFormat E10: SuperE10 €
userattr readingsName_SuperE10 readingsRegex_SuperE readingsRegex_SuperE10 set01Name set01URL
Hmmm, der Wert wurde nicht gesendet.
Irgendwas stimmt wohl noch nicht.
"set OUT.Spritpreis preissenden" gibt die Fehlermeldung "set value is not numeric"
Guten Morgen
Jetzt habe ich auch kurz die Zeit gehabt mir mal das Wiki an zu schauen. Das ganze ist im Prinzip einfach. Du hättest nur die Infos zusammensetzen müssen.
set01Name preissenden
set01URL https://api.thingspeak.com/update?api_key=S1CI1DR793JTX7U2&field1=$val
So muß die Attributszeile aussehen. $val wird automatisch durch das Value ersetzt was Du ihm im set Befehl mit gibst.
Da Dein Set Befehl preissenden heißt, kommt also
set OUT.Spritpreis preissenden
So und jetzt fehlt uns nach preissenden nur noch das was wir senden wollen, und unser $val wird dann dadurch ersetzt. Also
set OUT.Spritpreis preissenden [OUT.Spritpreis:SuperE10]
Das wird also unser set Befehl. Dieser muß nun natürlich ausgeführt werden, immer wenn sich der Wert für SuperE10 ändert. Hierfür einfach ein Notify nehmen
[OUT.Spritpreis:SuperE10] ist ein so genannter SetMagic Befehl. Im Hintergrund macht er eigentlich ein auslesen des Readings SuperE10 vom Device OUT.Spritpreis.
Und noch mal kurz zum Thema ReadingsVal womit man Readings aus Perlebene raus auslesen kann. Die Funktion sieht dafür so aus
ReadingsVal($NAME,$READING,$DEFAULT);
ReadingsVal('OUT.Spritpreis','SuperE10',0);
Grüße
Hey, danke für die Hilfe und die Geduld!
Wenn ich nun in die Befehleszeile "set OUT.Spritpreis preissenden [OUT.Spritpreis:SuperE10]"
eingebe, wird der aktuelle Wert hoch geladen.
Kann ich das mit dem Notify automatisch fachen, sobald sich die HTTPMOD aktualiesiert?
Ich bräuchte jeden Messwert, nicht nur, falls er sich geändert hat.
Warum möchtest Du einen nicht geänderten Wert noch mal hochladen?
Hast Du mehrere HTTPMOD Devices? Oder andere Spritsorten mit in diesem Device?
Es wäre besser, wenn der Link automatisch gesenden wird, egal ob sich der Wert verändert hat.
Die Werte werden mit einem Zeitstempel verschickt und so könnte ich sie später besser auswerten.
Wäre der Vorgang mit FHEM so unterschiedlich?
Ich habe nur eine HTTPMOD im Moment und nur eine Spritsorte.
Also im einfachsten Fall erstelle ein at welches alle x min diesen set Befehl ausführt. So ganz ohne triggern
Daran hatte ich auch schon gedacht.
Ich dachte nur, es würde etwas eleganteres geben, und man könnte das
direkt als Attribut irgendwo eingeben.
Mit dem Attribut "event-on-update-reading" komme ich da also nicht irgendwie weiter?
Sorry, falls das wieder keinen Sinn ergeben sollte.
Nein kommst du nicht.
Wenn sich ein Reading eines Devices ändert, so kann es ein Event geben. Auf dieses Event muss getriggert/reagiert/angesprochen werden.
Das macht DOIF, Notify,watchdog und so. Und notify,DOIF und Co lösen dann einen Befehl aus. Bei Dir ist es nun ausnahmsweise ein und das selbe Device worauf getriggert wird und was gleichzeitig einen Set Befehl auslösen soll.
Also entweder at, oder notify erstellen und alle event-on- ATTRIBUTE vom Device entfernen. Dann wird immer Event ausgelöst wenn HTTPMOD seine Readings aktualisiert. Egal ob der Wert sich ändert oder nicht.
Jaaaaaaaaaa, das mit dem Hochladen alle 15 Minuten scheint zu funktionieren!!
Danke, das wäre so eigentlich schon ok für meine Zwecke.
Aber es interessiert mich schon noch, wie du das mit dem Entfernen der
"event-on- ATTRIBUTE" gemeint hat.
Du hattest ja den Sinn glaube nicht ganz verstanden wo für das event-on-* also in unserem Fall das event-on-change-reading da ist.
attr DEVICENAME event-on-change-reading .*
Das .* ist ein RegEx und springt bei allen Readings dieses Devices an. Dem zu folge wird nur ein Event ausgelöst wenn sich ein Reading ändert. Du wolltest aber das immer ein Event ausgelöst wird, egal ob Änderung oder nicht. Dann kann man auch einfach das Attribut löschen. Welche Events ausgelöst werden kannst Du ja im Eventmonitor sehen. Damit kann man auch komfortabel ein Notify auf ein bestimmtes Event bauen. Was Du im übrigen machen solltest. Ansonsten sendest Du ein und den selben Befehl 2-3 mal hintereinander im Millisekunden Takt.
Am besten das Notify auf das Reading SuperE10 beschränken.
Ich habe nun ein AT-Befehl eingebaut, der alle 15 Minuten die URL abschickt.
COMMAND set OUT.Spritpreis preissenden [OUT.Spritpreis:SuperE10]
DEF +*00:15:00 set OUT.Spritpreis preissenden [OUT.Spritpreis:SuperE10]
Die HTTPMOD aktualisiert sich jeweils 3 Minuten vorher.
Es sieht so aus, als würde es gut funktionieren.
Danke nochmal an alle, die geholfen haben, ich habe einiges dabei gelernt!!