Elektroda.pl
Elektroda.pl
X

Wyszukiwarki naszych partnerów

Wyszukaj w ofercie 200 tys. produktów TME
Proszę, dodaj wyjątek elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Bascom - Atmega1284p + ESP8266 - wysyłanie danych do Domoticz

maximus22_kr 04 Maj 2017 13:07 735 18
  • #1 04 Maj 2017 13:07
    maximus22_kr
    Poziom 18  

    Witam
    Walczę z wysyłaniem danych do Domoticz. Domoticz zainstalowany na Orange Pi Zero działa poprawnie.

    Wykorzystałem sposób wysyłania do ESP8266 Kolegi Niveasoft. Co prawda wysłał on dane do Thingspeak'a, ale nieco go przerobiłem.

    Kod: vbnet
    Zaloguj się, aby zobaczyć kod


    Teraz logi z terminala
    Wysyłane:
    Kod: text
    Zaloguj się, aby zobaczyć kod


    Odbierane:
    Kod: text
    Zaloguj się, aby zobaczyć kod


    Niby przesyła, ale Domoticz tego nie widzi.
    Gdy zrobię to przez stronę, czyli
    http://192.168.0.101:8080/json.htm?type=command¶m=udevice&idx=11&nvalue=0&svalue=16.8

    to wtedy dodaje bez problemu i wysyła odpowiedź
    "status" : "OK",
    "title" : "Update Device"

    Może to kwestia ustawień samego Domoticz

  • #2 04 Maj 2017 14:41
    niveasoft
    Poziom 33  

    Muszę kiedyś znaleźć czas by wrzucić update na stronę bo dużo rzeczy robię już inaczej/czytaj lepiej :D

    Nie znam się na Domoticzu, ale szybko można coś wywnioskowac jak wpsze się w Google "ESP to domoticz"

    Pierwszy link już chyba wiele wyjaśnia :D Link

  • #3 04 Maj 2017 14:58
    maximus22_kr
    Poziom 18  

    widziałem ten link

    Kod: c
    Zaloguj się, aby zobaczyć kod


    początek wynika ze składni, jaką trzeba wysłać do Domoticz, czyli
    Kod: text
    Zaloguj się, aby zobaczyć kod


    zrobiłem to nieco inaczej i terminal podaje
    Kod: text
    Zaloguj się, aby zobaczyć kod



    Znalazłem jeszcze coś takiego w języku LUA
    Kod: lua
    Zaloguj się, aby zobaczyć kod

  • #4 04 Maj 2017 22:15
    niveasoft
    Poziom 33  

    To nie jest takie skomplikowane. Byś trochę poczytał co to jest i po co te HTTP/1.1 to by Ci się od razu rozjaśniło :D
    Też czytałem jak pisałem sobie ten serwer na M2560.

    Wygląda na to że trzeba trochę zmienić szyk/kolejność

    Te Arduinowe i inne kody cechują się tym że predzej gdzieś sie definiuje co, na przykład, znaczy "domoticz_server"

    Ktoś to sobie mógł wcześniej zdefiniować jako adres 192.168.0.x gdzieś w kodzie i teraz używa nazwy "domoticz_server"

    To niegłupie bo zmieniasz u góry a nie szukasz potem po całym kodzie.

    Czytanie tych Arduinowych i C-podobnych nie jest trudne.

    Dodatkowo wszędzie gdzie widzisz \r\n to po prostu najlepiej skończyć wysyłanie tego ciągu w Bascom bo Bascom doda te r\n\ i zaraz zacząć w następnej linii nowy Print :D

    Kiedy widzisz taki zapis "przykład\r\n\r\n" to w Bascom piszesz:

    Print "przykład"
    Print - drugi print doda te drugie \r\n

    Zwróć też uwagę na jedną spację pomiędzy końcem danych a wpisem HTTP.

  • #5 04 Maj 2017 23:49
    maximus22_kr
    Poziom 18  

    Czyli trzeba zmienić podejście w podprogramie. Z tym definiowaniem też się staram tak robić, np. w przypadku adresu IP, czy haseł do routera

    Ale w takim razie trzeba to rozdzielić na kilka "Print"ów.
    czyli coś takiego ?

    Kod: vbnet
    Zaloguj się, aby zobaczyć kod

    oczywiście w uproszczeniu, bo trzeba by sprawdzać, czy nie ma błędów przy wysyłaniu

    Coś o HTTP/1.1
    Żądanie wysłane przez przeglądarkę w celu pobrania wskazanej strony wygląda (po drobnych skrótach) w sposób następujący (Inspectors, Raw):

    GET /lesson01/index.php HTTP/1.1
    Accept: image/gif, image/jpeg, (...)
    Accept-Language: en-US,pl;q=0.5
    User-Agent: Mozilla/4.0 (compatible; ...)
    Accept-Encoding: gzip, deflate
    Connection: Keep-Alive
    Host: bootcamp.threats.pl

    W pierwszej linii znajduje się kolejno metoda (GET) adres pobieranego zasobu (bez nazwy hosta), wersja protokołu HTTP (HTTP/1.1). Kolejne linie żądania to tak zwane nagłówki. Ich struktura jest prosta - nazwa i po dwukropku wartość. W tym wypadku przeglądarka informuje serwer o akceptowanych przez siebie typach plików (Accept), języku (Accept-Language), swojej wersji (User-Agent), akceptowanych kodowaniach (Accept-Encoding). Nagłówek Host mówi o hoście, z którym się przeglądarka łączy oraz o tym, że z powodów wydajnościowych przeglądarka chce utrzymać otwarte połączenie z serwerem (Connection: Keep-Alive).

  • #6 05 Maj 2017 07:39
    starob
    Poziom 25  

    maximus22_kr napisał:
    /json.htm?type=command¶m=udevice&idx=

    czy tak samo masz w programie? czy command & param

  • #7 05 Maj 2017 10:21
    maximus22_kr
    Poziom 18  

    W kodzie programu jest prawidłowo - to edytor Elektrody to zmienia

  • #8 08 Maj 2017 16:04
    maximus22_kr
    Poziom 18  

    "Wydaje" mi się, że coś takiego powinno działać:

    Kod: vbnet
    Zaloguj się, aby zobaczyć kod

    ale terminal pokazuje to :
    Code:

    AT+CIPSTART="TCP","192.168.0.101",8080

    busy p...

    OK
    AT+CIPSEND=64

    link is not valid

    ERROR
    GET /json.htm?type=command¶m=udevice&idx=12&nvalue=0&svalue=

    ERROR
    AT+CIPSEND=4

    link is not valid

    ERROR
    15.2

    ERROR
    AT+CIPSEND=9

    link is not valid

    ERROR
    HTTP/1.1

    ERROR
    AT+CIPSEND=17

    link is not valid

    ERROR
    Connection: close

    ERROR

    ERROR


    Oczywiście ten dziwny znaczek po "command" to nadal sprawka edytora Elektrody.
    Nie wiem, czy to wina tych wait'ów pomiędzy printami? - tak na "pałę" bez sprawdzania

  • #9 08 Maj 2017 18:42
    starob
    Poziom 25  

    Jakiego typu jest device o idx=12?
    Większość, jak nie wszystkie operują tylko na svalue, a u Ciebie jest puste (svalue=co?)

    Wróć do programu z pierwszego postu i wyświetl co zwraca json (93 bytes rec?).
    Po czym wnioskujesz, że nie działa skoro zwraca OK? Może trzeba odświeżyć stronę?

  • #10 08 Maj 2017 20:40
    maximus22_kr
    Poziom 18  

    Idx=12 to Temp

    svalue nie jest raczej puste
    Kod:

    Kod: vbnet
    Zaloguj się, aby zobaczyć kod


    powoduje wysłanie
    OK
    AT+CIPSTART="TCP","192.168.0.154",8080

    CONNECT

    OK
    AT+CIPSEND=93


    OK
    > GET http://192.168.0.154:8080/json.htm?type=command¶m=udevice&idx=12&nvalue=0&svalue=16.9

    busy s...

    Recv 93 bytes

    SEND OK
    AT+CIPCLOSE

    CLOSED

    OK

    No znowu ten znaczek po command

    Nic się nie dodaje do bazy - nadal stan z 04.05.17 kiedy "ręcznie" przez przeglądarkę poszło bez problemu

  • #11 08 Maj 2017 21:46
    starob
    Poziom 25  

    Rozumiem Twoje samozaparcie, też nie lubię jak mnie "maszyna" wodzi za nos.
    Wygląda, że wszystko robisz dobrze - w dziedzinie AT comand nie mogę ci pomóc.
    Jeśli ważniejszy dla Ciebie jest cel niż droga, to rozważ przejście na MySensors.
    Mam podobny układ - ESP po RS gada z kotłem gazowy Viessmann, zbiera informacje z sensorów kotła i wysyła stan wszystkich czujników przez Wifi do domoticza. Jedyne co trzeba zrobić to dodać bramkę w urządzeniach Bascom - Atmega1284p + ESP8266 - wysyłanie danych do Domoticz

    Następnie po połączeniu bramka "prezentuje" wszystkie swoje czujniki do domoticza z automatu. Jedynie co trzeba zrobić to je ponazywać.
    Bascom - Atmega1284p + ESP8266 - wysyłanie danych do Domoticz

    Kilka linijek kodu i wszystko się aktualizuje. Potrzeba znać w stopniu minimalnym aruinoIDE i C arduino. Wszystko działa zgodnie z oczekiwaniami bez grzebania się w json i sqlite.

  • #12 08 Maj 2017 22:41
    maximus22_kr
    Poziom 18  

    No to mam "zagwozdkę".
    Ja zrobiłem to według jednego z opisów:
    Utworzyłem Dummy (Does nothing, use for virtual switches only)
    Kliknąłem Utwórz Wirtualne czujniki
    Pododawałem czujniki temperatury, ciśnienia, które mają swoje IDX
    Bascom - Atmega1284p + ESP8266 - wysyłanie danych do Domoticz

    Terminal pokazuje wysyłany ciąg
    > GET http://192.168.0.154:8080/json.htm?type=command¶m=udevice&idx=12&nvalue=0&svalue=16.9

    Wpisanie w przeglądarce
    http://192.168.0.154:8080/json.htm?type=command¶m=udevice&idx=12&nvalue=0&svalue=16.9
    powoduje aktualizację
    no i na tym utknąłem

  • #13 11 Maj 2017 16:40
    maximus22_kr
    Poziom 18  

    Witam ponownie
    Gdy aktualizuję przez przeglądarkę to mam po chwili odpowiedź
    status "OK"
    title "Update Device"
    Gdy wejdę w nagłówki to mam coś takiego:
    Bascom - Atmega1284p + ESP8266 - wysyłanie danych do Domoticz

    ogólnie mam problem żeby wysłać coś więcej niż
    AT+CIPSEND=77
    GET /json.htm?type=command¶m=udevice&idx=12&nvalue=0&svalue=16.8 HTTP/1.1
    lub
    AT+CIPSEND=102
    GET http://192.168.0.101:8080/json.htm?type=comma...evice&idx=12&nvalue=0&svalue=16.8 HTTP/1.1
    lub
    AT+CIPSEND=68
    GET /json.htm?type=command¶m=udevice&idx=12&nvalue=0&svalue=16.8
    AT+CIPSEND=9
    HTTP/1.1

    później każda próba wysłania kończy się:
    +IPD,162:HTTP/1.1 400 Bad Request
    Content-Length: 89
    Content-Type: text/html

    <html><head><title>Bad Request</title></head><body><h1>400 Bad Request</h1></body></html>CLOSED
    Bascom - Atmega1284p + ESP8266 - wysyłanie danych do Domoticz

    Może problemem jest ilość znaków ?
    Odpowiedź ze strony:
    Content-Length 53

    Odpowiedź z modułu:
    Content-Length: 89
    Dodano po 2 [godziny] 47 [minuty]:
    Znalazłem podobny wątek na Elektrodzie, tylko tam Link autor miał problem z aktualizacją danych w sieci wewnętrznej ( czyli tak jak ja ), natomiast gdy serwer był na zewnątrz to nie było problemu.
    Na podstawie informacji z tego wątku powinienem wysyłać tak:

    Code:

    AT+CIPSTART="TCP","192.168.0.100",8080
    AT+CIPSEND=128
    GET http://192.168.0.100/json.htm?type=command&param=udevice&idx=12&nvalue=0&svalue=16.8 HTTP/1.1\r\nHost: 192.168.0.100\r\n\r\n


    tylko, że to też daje:
    Code:

    AT+CIPSTART="TCP","192.168.0.100",8080

    CONNECT

    OK
    AT+CIPSEND=108


    OK
    > GET /json.htm?type=command&param=udevice&idx=12&nvalue=0&svalue=16.8 HTTP/1.0\r\nHost: 192.168.0.100\r\n\r\n
    busy s...

    SEND OK

    +IPD,162:HTTP/1.1 400 Bad Request
    Content-Length: 89
    Content-Type: text/html

    <html><head><title>Bad Request</title></head><body><h1>400 Bad Request</h1></body></html>CLOSED

  • #14 13 Maj 2017 22:50
    maximus22_kr
    Poziom 18  

    Witam
    Niestety dalej mi się nie aktualizuje.

    Pewnie zanudzam Kolegów.
    Mam pytanie, czy wysyłać mam tak:

    Kod: vbnet
    Zaloguj się, aby zobaczyć kod

    czy
    Kod: vbnet
    Zaloguj się, aby zobaczyć kod


    Niestety opisów podobnego problemu jest sporo ( wszystkie w Arduino ) i rozwiązań też, że powinno się wysyłać np.
    GET /path/to/page.html HTTP/1.1
    Host: localhost
    User-Agent: wget/1.12
    "\r\n" -dodatkowy print

    lub

    GET /raw/1nmeKaux HTTP/1.1
    Host: domena.com
    Connection: close
    Accept-Charset: ISO-8859-1,UTF-8;q=0.7,*;q=0.7
    Cache-Control: no-cache
    Accept-Language: de,en;q=0.7,en-us;q=0.3
    "\r\n" -dodatkowy print

    lub

    Accept text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
    Accept-Encoding gzip, deflate
    Accept-Language pl,en-US;q=0.7,en;q=0.3
    Connection keep-alive
    Cookie AffiliatedA=1
    Host 192.168.0.154:8080
    Upgrade-Insecure-Requests 1
    User-Agent Mozilla/5.0 (Windows NT 6.1; rv:53.0) Gecko/20100101 Firefox/53.0
    "\r\n" -dodatkowy print

    lub GET /girls HTTP/1.1
    Host: domena.com
    User-Agent: ESP8266_HTTP_Client
    Connection: keep-alive
    "\r\n" -dodatkowy print


    Próbowałem też "ręcznie" przez terminal - idzie dobrze do momentu wysłania " HTTP/1.1"
    Code:

    AT+CIPSTART="TCP","192.168.0.154",8080

    CONNECT

    OK
    AT+CIPSEND=45


    OK
    > GET /json.htm?type=command&param=udevice&idx=
    busy s...

    SEND OK
    AT+CIPSEND=2


    OK
    > 13
    busy s...

    SEND OK
    AT+CIPSEND=17


    OK
    > &nvalue=0&svalue=
    busy s...

    SEND OK
    AT+CIPSEND=4


    OK
    > 16.9
    busy s...

    SEND OK
    AT+CIPSEND=9


    OK
    >  HTTP/1.1
    busy s...

    SEND OK
    AT+CIPSEND=5


    OK
    > Host:
    busy s...

    SEND OK

    +IPD,162:HTTP/1.1 400 Bad Request
    Content-Length: 89
    Content-Type: text/html

    <html><head><title>Bad Request</title></head><body><h1>400 Bad Request</h1></body></html>CLOSED

  • #15 14 Maj 2017 01:39
    niveasoft
    Poziom 33  

    Tak obserwuję te zmagania i się zastanawiam tylko czy Ty te "\r\n" zamieniasz na "{013}{010}" ?
    Żeby jeszcze uściślić gdybyś się pogubił to Bascom dokłada swoje {013}{010} na końcu wysyłania, chyba że na końcu postawisz średnik.
    Kiedy więc masz na końcu dać dwa takie "\r\n" to możesz to zapisać na dwa sposoby:

    Kod: vbnet
    Zaloguj się, aby zobaczyć kod

  • #16 14 Maj 2017 20:12
    maximus22_kr
    Poziom 18  

    No zgadza się trochę zaczynam się gubić.
    Znalazłem coś takiego w arduino ( heh, jeszcze trochę i chyba się tym bardziej zacznę zajmować ):

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Znaki "{013}{010}" są liczone do długości ciągu
    czyli uwzględniając te znaki 10 i 13 w Bascom, to powinno być tak ( port chyba też powinien być ) :
    Kod: vbnet
    Zaloguj się, aby zobaczyć kod

  • #17 14 Maj 2017 23:48
    niveasoft
    Poziom 33  

    Jak ktoś pisze, że mu to na Arduino działa to kompilujesz sobie taki najprostszy szkic z Twoimi ustawieniami IP itd i jak już zacznie uaktualniać wpisy w tym Domoticzu to podejrzyj transmisje Real Termem i każ to samo wysłać swojemu programowi.Cudów się tam nie spodziewam.
    RealTerm dlatego, że pokazuje też CR i LF.

  • #18 17 Maj 2017 16:46
    maximus22_kr
    Poziom 18  

    Znowu nieco ponudzę, ale
    na razie udało mi się ręcznie przez terminal zaktualizować dane - program terminal ( Terminal v.1.9b ) ma zaznaczone dodawanie znaków końca linii.

    Code:

    AT+CIPSTART="TCP","192.168.0.100",8080

    CONNECT

    OK
    AT+CIPSEND=79


    OK
    >
    Recv 79 bytes

    SEND OK
    AT+CIPSEND=26


    OK
    >
    Recv 26 bytes

    SEND OK
    AT+CIPSEND=19


    OK
    >
    Recv 19 bytes

    SEND OK
    AT+CIPSEND=13


    OK
    >
    Recv 13 bytes

    SEND OK
    AT+CIPSEND=69


    OK
    >
    Recv 69 bytes

    SEND OK
    AT+CIPSEND=2


    OK
    >
    Recv 2 bytes

    SEND OK

    +IPD,213:HTTP/1.1 200 OK
    Content-Length: 53
    Content-Type: application/json;charset=UTF-8
    Cache-Control: no-cache
    Pragma: no-cache
    Access-Control-Allow-Origin: *

    { "status" : "OK", "title" : "Update Device"}CLOSED


    Problem jest z tymi znakami 13 i 10, jak doliczyłem do rozmiaru wysyłanego ciągu dwa znaki to poszło bez problemu.

    Z Realterm próbuję ale coś nie pokazuje znaków końca, tylko
    GET /json.htm?type=command¶m=udevice&idx=13&nvalue=0&svalue=24.6 HTTP/1.1
    Host: 192.168.0.100:8080
    Connection: close
    Accept: */*
    User-Agent: Atmega-Client (compatible; esp8266 Lua; Windows NT 5.1)
    może coś źle zaznaczyłem w opcjach.

    Teraz mam głupie pytanie, czy doliczać do AT+CIPSEND te 2 dodatkowe znaki, czy zdać się na Bascom i zostawić tak:
    Kod: vbnet
    Zaloguj się, aby zobaczyć kod

    (18 Maj 2017 16:50) Polecenie moderatora: dondu

    Do wklejania komend AT używaj proszę SYNTAX wybierając np Bash.

  • #19 18 Maj 2017 16:02
    maximus22_kr
    Poziom 18  

    No i wreszcie działa. Sprawdzałem na temperaturze, wilgotności i ciśnieniu z BME280.
    Na razie to "półautomat", bo nie sprawdza odpowiedzi , tylko co 1 sekundę wysyła kolejną paczkę danych do ESP8266

    Kod: vbnet
    Zaloguj się, aby zobaczyć kod


    Czyli tak, jak pisał Kolega Niveasoft, trochę mi się namieszało ze znakami CR LF.

    Teraz tylko pasuje dodać jakąś kontrolę odbieranych znaków - coś podobnego jak Kolega Niveasoft na swojej stronie odnośnie wysyłania danych do Thingspeak'a. Czyli "zagnieździć" Case w Case.

Szybka odpowiedź lub zadaj pytanie
Dziękuję Ci. Ta wiadomość oczekuje na moderatora.
 Szukaj w ofercie
Wyszukaj w ofercie 200 tys. produktów TME