Elektroda.pl
Elektroda.pl
X

Wyszukiwarki naszych partnerów

Wyszukaj w ofercie 200 tys. produktów TME
Kategoria: Kamery IP / Alarmy / Automatyka Bram
Montersi
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 1122 24
  • #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: bash
    Zaloguj się, aby zobaczyć kod


    Odbierane:
    Kod: bash
    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 34  

    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: bash
    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 34  

    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 :
    Kod: bash
    Zaloguj się, aby zobaczyć kod


    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
    Kod: bash
    Zaloguj się, aby zobaczyć kod

    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ż

    Kod: bash
    Zaloguj się, aby zobaczyć kod



    później każda próba wysłania kończy się:
    Kod: bash
    Zaloguj się, aby zobaczyć kod


    <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:
    Kod: bash
    Zaloguj się, aby zobaczyć kod


    tylko, że to też daje:
    Kod: bash
    Zaloguj się, aby zobaczyć kod

  • #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: bash
    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"
    Kod: bash
    Zaloguj się, aby zobaczyć kod

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

    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 34  

    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.

    Kod: bash
    Zaloguj się, aby zobaczyć kod


    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

  • #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.

  • #20 31 Maj 2017 15:54
    maximus22_kr
    Poziom 18  

    Witam
    Przerobiłem kod z poprzedniego posta, tak żeby w podprogramie reagował na to co przyjdzie z UART.
    Niestety "stoi" na początku, tzn. połączył się, ale próbuje to zrobić ponownie - nie przechodzi do kolejnego Case

    Kod: vbnet
    Zaloguj się, aby zobaczyć kod


    W terminalu mam:
    Kod: bash
    Zaloguj się, aby zobaczyć kod


    Założenie było takie, że wysłanie AT inicjuje wysłanie, a odpowiedź - OK powoduje połączenie i odpowiedź modułu - CONNECT, co powinno przenieść do następnego Case. Tego nie robi.

  • #21 31 Maj 2017 16:23
    ASMnauka_
    Poziom 14  

    Z tego co pamiętam z Bascom Select Case jest czymś podobnym do IF Else.
    Ty zamykasz Select Case po każdym porównaniu.
    Zagnieździłeś dwa SELECT CASE i zbyt wcześnie wychodzisz z wewnętrznego warunku.
    Z Select Case Com1_str powinieneś wyjść tylko raz na końcu porównania.
    Tak mi się wydaje.

  • #22 31 Maj 2017 21:40
    niveasoft
    Poziom 34  

    Nie pamiętam teraz czy ESP po znaku zachęty wystawia Enter (chyba nie, ale to można podejrzeć).
    Bez Entera ten kod nie wykryje znaku zachęty ">"
    Trzeba to napisać inaczej :D

  • #23 01 Cze 2017 00:26
    maximus22_kr
    Poziom 18  

    Ale kod Kolegi Niveasoft wysyłający dane do Thingspeak'a działa na podobnej zasadzie - wykrywa OK i SEND OK. Co prawda tam jest prościej, bo jest tylko jeden ciąg do wysłania - tutaj jest jest więcej, no chyba, żeby uprościć ( ale większa wartość zmiennej Domoticz_cmd ) i wysłać tak:

    Kod: vbnet
    Zaloguj się, aby zobaczyć kod

    ale to zapewne nic nie zmieni, jeśli będzie błąd logiczny w kodzie.

    natomiast być może faktycznie jest coś z tym zbyt szybkim wyjściem z wewnętrznego warunku - wygląda na to, że bardzo szybko odsyła drugie OK ( przynajmniej na terminalu to widać ) i program nie przechodzi do następnego Case tylko sprawdza i "zauważa" drugie OK będąc nadal w Case 0, czyli próbuje się znowu łączyć.

  • #24 01 Cze 2017 09:10
    niveasoft
    Poziom 34  

    Dlaczego po wysłaniu komendy "AT+CIPSTART=.." od razu nie zmienisz Domoticz_krok na wyższy i tam nie poczekasz na "CONNECT"?

    To się też łatwo debuguje. W każdym Select Case można na dole dopisać Case Else i kiedy nic nie pasuje do podanych możliwości to printować to sobie do jakiegoś wolnego portu COM.

    Kod: vbnet
    Zaloguj się, aby zobaczyć kod

  • #25 01 Cze 2017 14:58
    maximus22_kr
    Poziom 18  

    Cytat:
    Dlaczego po wysłaniu komendy "AT+CIPSTART=.." od razu nie zmienisz Domoticz_krok na wyższy i tam nie poczekasz na "CONNECT"?

    no i właśnie to jest pierwszy błąd logiczny.
    Drugi to wzięcie do porównania złe wyrażenia.
    Zmieniłem od na :
    Kod: vbnet
    Zaloguj się, aby zobaczyć kod


    W sumie działa, czasem mam:
    Kod: bash
    Zaloguj się, aby zobaczyć kod


    to pewnie przez brak połączenia ( tak się dzieje zaraz po wgraniu kodu, jak wyłączę i włączę zasilanie to OK )

    lub
    Kod: bash
    Zaloguj się, aby zobaczyć kod


    Pasowałoby jeszcze obsłużyć ERROR przy problemach z połączeniem i Bad Request, można by jakiś licznik prób, żeby się nie zapętlił.

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